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

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

2017年1月22日日曜日

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

スタートアップサービスを動かすサーバを立てなければならなくなったが、サーバ負荷の予測が現時点でまったくできない(まあ、もともと正確な負荷見積り技術もないのだが、これから増やしていくからわからないんだと自分を納得させる。)。

“ここは、後でスケールアップが容易と聞いているIAASを選んでおくしかない(汗)…”(心の中のつぶやき。)

といっても、クラウドには完全に乗り遅れているので、藁をもつかむ思いで、タイミングよく開催されていたGunma Webさんの勉強会に飛び込む。会場はMacを開いてカタカタやっている若者で一杯だ。超アウェーだ。いい年したおっさんがひとりで来るところではない。

私もいつもお世話になっている「さくらインターネット」の、企画業務をされているという横田さんがDockerというなにやらコンテナ関連の技術の話をしている。その他にも、勉強会のメンバーがユニークな発表をしている、若さって素晴らしい…(と、歳のせいにしてごまかす)。

とりあえず、いつも「GUNMA GIS GEEK」でネタをもらっている清水さんに挨拶して、救いを求める。先ほどの横田さんを紹介してもらい、初心者を必死でアピールしたところ、「新米サーバ/インフラ担当者のための 仮想サーバ/クラウド技術の常識」という本をもらった(もちろん、さくらインターネットの会員登録から説明してある本だ)。なお、参加者全員に「さくらのクラウド」の20,000円クーポンを配っているので、ここは、まんまと「さくらインターネット」さんの術中にはまって、もう「さくらのクラウド」で行くしかない!と、二次会も参加せずに帰って本を一気に読み終える。

「なんだか簡単そうだ…」

さっそく、クーポンを使って「さくらのクラウド」でサーバを構築する。

コントロールパネルから、ポチっとサーバを作る。(簡単だ…)
yum -y update でOSを最新の状態にする。(順調だ…)
reboot で一応リブートしておくんだ。(念のためだ…)

Apache、MySQL、PHPのインストールも yum を使って簡単に行えます…か。

yum install httpd php mysql-server php-mysql

あれ…なんかエラーが出てる。

一つづつやってみるか…。

yum install httpd

うん、大丈夫そうだから起動!
service httpd start

あれ、Redirect...?
CentOS 7 からは systemctl start httpd だそうだ(…)。
しかし何のメッセージもでないので起動に成功したのかどうかわからない。

systemctl status httpd

active (running)...

Webページが見えるか確認する。
表示されない…。

次に、yum install mysql
Conflict...?
何、CentOS7には mariaDB が入っているから消せだと…。

yum remove mariadb-libs
rm -rf /var/lib/mysql/

MySQLのリポジトリを追加
yum localinstall http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
続けてインストール
yum -y install mysql-community-server

何だかエラーが出ている。
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.

インストールすればいいみたい。
yum install deltarpm

再度インストール
またエラー。
Downloading packages:
No Presto metadata available for base ...

うーん。
yum clean metadata

再再度インストール
入った…。
mysqld --version でも確認。

次に、yum install php php-mysql

php 5.4が入っちゃったよ…。

yum remove php-*
yum install epel-release
yum install --enablerepo=remi,remi-php56 php php-mysqlnd php-devel php-mbstring php-pdo php-gd

php --version
PHP 5.6.30 (cli) (built: Jan 19 2017 07:57:06)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

Webページが見えないので、
systemctl stop firewalld

Apatche 2.4のテストページにようやくご対面。

間髪入れずに、phpの動作確認。
cd /etc
php.iniに date.timezone = "Asia/Tokyo" を追加。

cd /var/www.html に <?php phpinfo() ?>と書いたindex.phpを設置。

Web表示を確認。
<?php phpinfo() ?>

ノー!!

cd /etc/httpd/conf
httpd.conf に以下を追加

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

httpd を再起動してWebページでPHPの動作を確認。

やっぱり前途多難だ。