2020年5月13日水曜日

PHPで$_POSTが消える

PHPで組まれたあるシステムのPOSTした先のページで、特定条件でエラーが発生するという報告を受けました。

発生しているエラー内容は、本来数値であるべきところに数値以外の値が入力されたというような内容です。
エラーが発生しない場合もあるので、単純な書き間違いではないことは明らかです。

エラーが発生している箇所に係るPOST変数の内容を確認したところ、emptyでした。
数値が入っているべき変数がemptyだったために発生しているということです。

特定条件でemptyになるということは、どこかで上書きしてるとか…。
しかしながら、そのような箇所は存在しませんでした。

次に、エラーが発生しているページで$_POSTをvar_dumpしてみました。
確かに、当該POST変数がなくなっています。
$_POSTのダンプをみていたら、配列の次元が1000になっていることに気づきました。
「これは怪しい」
調べたところ、POST変数の数に上限を設定できる機能があり、php.ini等に設定できるようです。
このディレクティブを使うと、ハッシュの衝突を悪用したサービス不能攻撃を受ける可能性を軽減できます。
とのことで、phpinfo()で現在の値を確認すると、1000ということで、どうやら間違いなさそう。

当該ディレクティブ本来の意義から、最低限の設定値を見積もって再設定したところ、無事すべてのPOST変数を受信できました。

2020年5月8日金曜日

VS Codeのターミナルでconda activate my_envが反映されない

GeoJsonファイルからShapeファイルを作成する必要があったので、以下の投稿を参考にさせてもらった。


ところが、geopandasのインストールがconflictしまくってできない。
以下の Creating a new environment を参考に、別環境を作ってやっとインストールできた。


しかしながら、VS Codeで実行しようとするとインポートできないというエラーが発生する。

VS Codeのターミナルで、どの環境で実行しているのかを確認する。

>conda info -e

案の定、geopandasをインストールした環境ではない。環境を選択するには、

>conda activate my_env

再度、確認しても変更されていない!

コマンドラインからは実行できたので、VS Codeの設定の問題かと試行錯誤した結果、よくよく考えるとVS CodeのターミナルはPowerShellだった。
VS Codeとは別に、PowerShell単体で確認したところ同じ現象が確認された。

調査対象をPowerShellに切り替えたところ、以下の情報にたどり着いた。


conda init powershell

この後、PowerShellでも、環境の選択が可能になった。

2020年4月28日火曜日

TypeScriptでGoogle Maps

さて、VS CodeでTypeScriptをかけるようになったら、次はGoogle MapsをTypeScriptでかきたい。

課題としてはGoogle Mapsにお絵描きだ。
はて?TypeScriptソース内にGoogle Maps JavaScript APIをどうやって導入すればいいんだろう、と思っていたら、AngularでGoogle Maps JavaScript APIを使っている投稿があるので参考にさせてもらう。

  1. Install Google Maps types for typescript support

    npm install --save @types/googlemaps
  2. Import the Google Maps types into component

    import {} from 'googlemaps';
  3. 以下の1行を記載した新規TSファイル「index.d.ts」を設置

    declare module 'googlemaps';

これで、TypeScript内で「google.maps」が使えるようになった。

2020年4月25日土曜日

VS CodeのTypeScript動作確認でいきなりつまずく

今更ながら、VS CodeでTypeScriptでもやっちゃおうかなー、などと軽い気持ちでVS CodeのTerminalをたたく…
> npm install -g typescript
 動作確認は…か、
> tsc --version
tsc : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\hogehoge\AppData\Roaming\npm\tsc.ps1 を読み
込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参
照してください。
発生場所 行:1 文字:1
+ tsc --version
+ ~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess 
なになに、デフォルトではWindowsのPowerShellスクリプト実行ポリシーによって実行が許可されていない…

https://attakei.net/blog/2019/windows-vscode-venv/index.html
ふーん、settings.jsonで、ターミナル起動時にPowerShellの実行ポリシーを変更できるのか…
{
  "terminal.integrated.env.windows": {
    "PSExecutionPolicyPreference": "RemoteSigned"
  }
}


2017年12月20日水曜日

メール文字化け対策

今更知ったのだが、PHPでメールを送信する際に 'ISO-2022-JP' でエンコードするのではなくて、'ISO-2022-JP-MS' でエンコードすると幸せになれるそうだ。

参考サイト:PHPでJIS以外の文字を文字化けせずに日本語メールを送る方法

2017年9月5日火曜日

PHPからGeographicLibを使う

回転楕円体面上(地球表面上)の正多角形を見て、SWIGを使ってPHPからGeographicLibを使おうと企図。
動作環境:エックスサーバ

SWIGのインストール

~/tmpにダウンロード・展開して、~/localにインストールする。

$ cd tmp
$ wget http://prdownloads.sourceforge.net/swig/swig-3.0.12.tar.gz
$ tar xzf swig-3.0.12.tar.gz
$ cd swig-3.0.12
$ ./configure --prefix=$HOME/local
$ make
$ make install

~/local/binにPATHを通すために、.bashrcに以下を追加

export PATH=/home/user/local/bin:$PATH
export CPLUS_INCLUDE_PATH=/home/user/local/include:$CPLUS_INCLUDE_PATH

※userは、それぞれの環境に合わせて変更

.bashrcを再読込
$ source ~/.bashrc

コマンドの実行を確認
$ swig -version

SWIG Version 3.0.12
(省略)

GeographicLibのインストール

$ wget https://sourceforge.net/projects/geographiclib/files/distrib/GeographicLib-1.48.tar.gz
$ tar xzf GeographicLib-1.48.tar.gz
$ cd GeographicLib-1.48
$ ./configure --prefix=$HOME/local
$ make
$ make install

PHPの実行モジュール作成

インターフェースファイル [myproject.i] を準備したら、以下を実行
$ swig -c++ -php myproject.i
php7の場合:$ swig -c++ -php7 myproject.i

さらに、C++のプログラム [myproject.cpp] を準備して、以下を実行
$ g++ -fpic -c myproject.cpp
$ g++ `/opt/php-7.0.18/bin/php-config --includes` -fpic -c myproject_wrap.cxx
$ g++ -shared *.o -o myproject.so -Wl,-rpath=/home/user/local/lib -L/home/user/local/lib -lGeographic

実行モジュール [myproject.so] ができていることを確認。

php.ini に、実行モジュールの配置場所を設定
extension = /home/user/local/lib/php/7.0.18/extensions/myproject.so

使用例

require_once "Geodesic.php";
$lat2 = new_doublep();
$lon2 = new_doublep();
$poly=[];
for($i=0; $i<$nVertices; $i++) {
    $dir = 90 - $i*360 / $nVertices;
    Geodesic::circle($center[0], $center[1], $radius, $dir, $lat2, $lon2);
    $poly[] = sprintf("%f %f", doublep_value($lon2), doublep_value($lat2));
}

2017年1月24日火曜日

さくらのクラウドを使ってみる(2)

次の日サーバを起動してWebページを確認する。
表示されない…。

firewalld が自動起動している。
systemctl is-enabled firewalld
enabled

firewallを止めてしまうのはまずいので、ポート80 (http) と 443 (https)を開けておく。
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

firewalld が起動しているのを確認して…
systemctl status firewalld
active (running)
Webページが表示されることを確認。

WordPressで動作確認


wget https://ja.wordpress.org/latest-ja.tar.gz
-bash: wget: command not found

何から何まで自分でやらなければならない、それが root ってことだ。
yum -y install wget

tar zxf latest-ja.tar.gz
chown -R apache:apache wordpress

WordPressにアクセスしてみる。
「お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです。」

あれ、php-mysql 入れるの忘れてた。しかも php-mysqlnd に変わってる。

yum --enablerepo=remi,remi-php56 install php-mysqlnd

後で必要になるかもしれないので以下もインストール。
php-pear php-xmlrpc php-soap

php-mcrypt を入れようとしてエラー。
Error: Package: php-mcrypt-5.6.30-1.el7.remi.x86_64 (remi-php56)
Requires: libmcrypt.so.4()(64bit)

libmcrypt-devel を入れて…
yum --enablerepo=epel install libmcrypt-devel

再チャレンジ
yum --enablerepo=remi,remi-php56 install php-mcrypt

入った。

MySQLデータベース作成


MySQL の root ユーザを作成してパスワードを設定
/usr/bin/mysqladmin -u root password 'PASSWORD'

error: 'Access denied for user 'root'@'localhost' (using password: NO)'


以下で root の初期パスワードがわかるらしい。
http://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html

grep 'temporary password' /var/log/mysqld.log

それらしい文字列が釣れたので、さっそく試してみる。
mysql -u root -p

入れた。
すぐパスワードを変更しておけ…か。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPASSWORD';

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
ポリシーね…。
https://dev.mysql.com/doc/refman/5.6/ja/validate-password-plugin.html

あれ、mysql_secure_installation を「必ず実行して MySQL インストールをセキュアにしてください。」だそうだ。これでも root のパスワードを設定できるみたいだけど、最初のパスワードはやっぱり必要みたいだな。

データベースとユーザを作って早速WordPressをインストールっと…
ysql> create database wpdb;
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on wpdb.* to wpuser@localhost identified by 'hogehoge';
Query OK, 0 rows affected, 1 warning (0.01 sec)

※ waning を表示するには、以下を参照。
https://dev.mysql.com/doc/refman/5.6/ja/show-warnings.html

wordpressインストールディレクトリにアクセスして、「さあ、始めましょう!」をクリック。
データベース情報を入力して、「インストール実行」。

WordPressサイト情報を入力して、「WordPressをインストール」をクリック。

無事ログイン画面が表示され、ログインできました。

htaccessを許可するための設定


/etc/httpd/conf.modules.d/00-base.conf 内にて以下の記述を確認
LoadModule rewrite_module modules/mod_rewrite.so

/etc/httpd/conf/httpd.conf 内にて、以下の設定をする。
<Directory /var/www/html>
    AllowOverride All
</Directory>

apache再起動
systemctl restart httpd

【参考】
https://devops.profitbricks.com/tutorials/install-and-configure-mod_rewrite-for-apache-on-centos-7/

phpMyAdminのインストール


yum install --enablerepo=remi,remi-php56 phpMyAdmin

Error: Package: php-tidy-5.6.30-1.el7.remi.x86_64 (remi-php56)
Requires: libtidy-0.99.so.0()(64bit)

libtidy-devel を入れて…
yum --enablerepo=epel install libtidy-devel

再チャレンジ
yum install --enablerepo=remi,remi-php56 phpMyAdmin
Complete!

apacheを再起動して、/phpmyadmin/ にアクセス…

Forbidden
You don't have permission to access /phpmyadmin/ on this server.

/etc/httpd/conf.d/phpMyAdmin.conf に

<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8

   <IfModule mod_authz_core.c>
     # Apache 2.4
     Require local
     ...

とあり、リモートからのアクセスは受け付けていない。
とりあえず、開発中だけリモートから受け付けることにする。

     Require all granted

apacheを再起動して、/phpmyadmin/ にアクセス…

見慣れたログイン画面が表示された。(「phpMyAdmin へようこそ」なんて書いてあったんだ…)

さすがに root でログインはないだろうということで、ユーザを作っておく。

GRANT SELECT, INSERT, DELETE, UPDATE, ALTER ON `wp`.* TO 'pma'@localhost IDENTIFIED BY 'PASSWORD';

FTPサーバを立てる


yum -y install vsftpd

vi /etc/vsftpd/vsftpd.conf

以下を有効にする。

anonymous_enable=NO
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
local_root=/var/www/html/
use_localtime=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf

firewalld に FTPを許可する。

firewall-cmd --add-service=ftp --permanent
firewall-cmd --reload

FTPユーザを作成する。
adduser ftpuser
passwd hoge

mkdir /etc/vsftpd/vsftpd_user_conf
vi vsftpd_user_conf/ftpuser

中に以下を記述
local_root=/var/www/html/

chroot_list にユーザ追加
ftpuser

vsftpdを再起動
systemctl restart vsftpd

上位ディレクトリへアクセスできないことを確認

書き込み、削除ができない…パーミッションを変更する。
chown -R apache:apache /var/www/html
usermod -G apache ftpuser

/etc/vsftpd/vsftpd.conf に以下を追加。
allow_writeable_chroot=YES

アップロード及び削除できた。