こんにちは。イッシーですʕ→ᴥ←ʔ キュンキュン!世の中ドキュメントはHTMLという流れですね。オフィスで残すのも管理が大変なので、ちゃっかりブログに載せちゃえ主義を貫こうと思います。

さて、プラスアールではクラウドを利用してサービスを運営しています。そこで本日はAWSでサーバをたてます。硬派なインストール方法(ソースからビルド)をせず、yumしまくってますがご了承ください。m(__)m

※Amazon Linuxの32bitを使用しております。

■Apache

いわゆるWebサーバです。

sudo yum install httpd
sudo chkconfig httpd on

インストール及びマシン起動時の設定が完了しました。特にサーバーとしては問題なく動作するのですがセキュリティ上望ましくない部分もありますので設定を変更します。

設定

以下のコマンドで設定ファイルを編集します。

sudo vi /etc/httpd/conf/httpd.conf
HTTPヘッダ内のApacheのバージョン

特定のバージョンに存在する未知の脆弱性というものも存在するかもしれません。以下の部分を

ServerTokens OS

以下のように編集しバージョンを隠すようにしましょう。

ServerTokens ProductOnly
サーバーネームの変更
#ServerName www.example.com:80

以下のように変更する。

ServerName hogehoge.com:80
ディレクトリの一覧表示を禁止

ディレクトリの中身が見えてしまうというのはセキュリティ上好ましくありません。以下の部分を

Options Indexes FollowSymLinks

以下のように変更して一覧を表示させないようにしましょう。

Options -Indexes FollowSymLinks
htaccessの使用を許可

これは用途によりますが大概のWebアプリケーションはhtaccessファイルを使用しているのではないかと思います。<Directory “/”>内の以下の部分を

AllowOverride None

以下のように変更します。

AllowOverride All

.htaccessファイルは外から見られるとセキュリティリスクになります。以下の記述が見つからない場合は追記しましょう。

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
</Files>
エラーページにおけるサーバ情報の表示禁止

これは一番最初の設定項目と同様の理由です。不要な情報は極力表示させないようにしましょう。以下の部分を

#ServerSignature On

以下のように変更します。

ServerSignature Off

起動

以下のコマンドで起動します。

sudo /etc/init.d/httpd start

ちなみに初期設定の場合は以下のディレクトリのファイルが参照されます。

/var/www/html/

従ってそこにindex.htmlを設置すれば参照できますね。Webサーバーσ°▽°)σ ゲッツ!

■MySQL

いわゆるDBです。Amazon RDSを使用しても良いのですが今回は同マシン内でMySQLも動かしてみます。

sudo yum install mysql mysql-server mysql-devel
sudo chkconfig mysqld on

設定

以下のコマンドで設定ファイルを編集します。

sudo vi /etc/my.cnf
文字コード

MySQLのデフォルトの文字コードはコンパイルオプションで指定しないとlatin1です。試しに以下のコマンドで確認します。

mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

マルチバイト圏に生まれて凹みますね。でも大丈夫。以下の記述を設定ファイルに加えましょう。

[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8

以下のように生まれ変わります!

mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

僕はunicode以外の文字コードは嫌いです(●´⌓`●)

パスワード

インストール直後のMySQLはrootのパスワードがありません。セキュリティを考えて必ず設定しておきましょう。

myql -u root

以下のSQLを実行します。

SET PASSWORD FOR root@localhost=PASSWORD('fugafuga');
exit;

実はもっと沢山の設定項目がありますが本題から外れてしまいそうなのでサクっと終わらせます。

起動

以下のコマンドで起動します。

sudo /etc/init.d/mysqld start

MySQLサーバーσ°▽°)σ ゲッツ!

■PHP

みんな大好き”ゆとり言語”PHPです!必要に応じてパッケージは追加してください。

sudo yum install php php-devel php-pdo php-pear php-mcrypt php-mysql php-mbstring

Amazon LinuxリポジトリのPHPバージョンは5.3.6。キュンキュンするバージョンですね。ʕ→ᴥ←ʔ キュンキュン!

PHP設定

以下のコマンドを実行し設定ファイルを編集します。

sudo vi /etc/php.ini
文字コード

以下の項目を探して下記を例に変更しましょう。

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_output = UTF-8

※携帯サイトの場合はSJISかもしれません。

PHPのバージョン表示

PHPには特定のバージョンに存在する脆弱性が存在します。以下の部分を

expose_php = On

以下のように変更し

expose_php = Off

バージョン情報をクライアントに送信しないようにしましょう。

タイムゾーンの設定

以下の部分を

;date.timezone =

以下のように書き換えましょう。

date.timezone = Asia/Tokyo

動作確認

sudo /var/www/html/index.php

以下のように記述します。

<?php
phpinfo();

キタ━━━━。゚+.ヽ(´∀`*)ノ ゚+.゚━━━━!!ドキュメント化に30分くらいかかってしまいましたが、上述の作業だけだったら10分でできるかと思います。自分で書いたタイトルですが「普通のウェブアプリケーション」って何をもってして普通なんでしょうね・・・

こんにちは!イッシーです。最近はnode.jsにキュンキュンしてますʕ→ᴥ←ʔ キュンキュン!

最近、空メールの処理をする機会がありました。以前、やったことがあったんですがすっかり忘れてしまっていたのでちゃんとメモっておくことにします。特にキュンキュンするようなトピックスでもないので、サクっと片付けて皆でnodeにキュンキュンする時間を作りましょう!

では、本題に入りますが、メールサーバに何を使用しているかによって設定ファイルの場所と方法が若干違います。

■qmail

以下のコマンドを実行し設定ファイルを編集します。

vi /var/qmail/mailnames/[domain]/[mailaddress]/.qmail

以下のように記述されていると思います。

| true
| /usr/bin/deliverquota ./Maildir

以下のように記述する事でプログラム(スクリプト)に処理を渡すことができます。

| /usr/bin/php /var/www/vhosts/[domain]/subdomains/[sub]/register.php
| true
| /usr/bin/deliverquota ./Maildir

register.phpの内容については後述します。

■postfix

以下のコマンドを実行し設定ファイルを編集します。

vi /etc/aliases

以下の記述を最後尾に加えます。

user: "| /usr/bin/php /var/www/vhosts/[domain]/subdomains/[sub]/register.php"

以下のコマンドを実行し設定を反映させます。

postalias /etc/aliases

以上でメールサーバの設定が完了しました。register.phpでメールの処理をする準備が整いました。

■register.php

まず、以下のコマンドでログファイルを準備します。

touch /var/www/vhosts/[domain]/subdomains/[sub]/log.txt
chmod 0777 /var/www/vhosts/[domain]/subdomains/[sub]/log.txt

ブラウザでデバッグできないので、まず以下のようにログファイルにエラーを出力するように設定しましょう。

$file = '/var/www/vhosts/[domain]/subdomains/[sub]/log.txt';
$date = date('Y-m-d H:i:s');
file_put_contents($file, "\nreceived - {$date}", FILE_APPEND);

ini_set('log_errors', 'On');
ini_set('error_log', $file);

次にメールの文言を取得します。面倒なのでPEARを使いましょう。パスは環境に応じて置き換えてください。

require_once('/usr/share/PEAR/Mail/mimeDecode.php');

$source = file_get_contents("php://stdin");//標準入力からメールデータをゲットだぜ!
if(!$source){
    echo "fail!\n";
    exit();
}

// メールデータをパースする
$decoder   = new Mail_mimeDecode($source);
$structure = $decoder->decode(array(
    'include_bodies' => true,
    'decode_bodies'  => true,
    'decode_headers' => true,
));
$from = mb_convert_encoding(
    mb_decode_mimeheader(
        $structure->headers['from']
    ),
    'UTF-8'
);
if(preg_match('/<([^>]+)>$/', $from, $regs)){
    $from = $regs[1];
}

$from    = strtolower($from);
$title   = mb_convert_encoding($structure->headers['subject'], 'UTF-8', 'ISO-2022-JP');
$context = ($structure->body)? $structure->body : $structure->parts[0]->body;
$context = mb_convert_encoding($context, 'UTF-8', 'ISO-2022-JP');

この後で取得したデータをDBに格納したりします。ログを確認できるようにすることがいかなる場合も大切ですね。(●´ω`●)

みなさんこんにちはこんばんは。イッシーですʕ→ᴥ←ʔ。前回はSubversionでのバージョン管理でしたが世はすっかりGitムードです。プラスアールでも使い方を学びつつ四苦八苦しながらGitに移行してます。そこで今回はGitでの環境構築の部分をまとめてみました。

  • 解説は、プロジェクト名:sample.plusr.biz、ユーザ名:ishimotoとしてます
  • ルート権限で作業します

■サーバ側

【step1】グループを作る

プロジェクト名と同じ名前のグループを作りましょう。重複を防ぐためにもドメイン名が良いかと思います。

/usr/sbin/groupadd sample.plusr.biz

【step2】グループにユーザを追加

グループにプロジェクトユーザを加えます。

gpasswd -a ishimoto sample.plusr.biz

以下のコマンドでも同様の操作が可能ですが、今まで追加したグループを列挙しなければなりません。

/usr/sbin/usermod -G sample.plusr.biz,hoge.plusr.biz,fuga.plusr.biz ishimoto

【step3】新規リポジトリの作成

以下のコマンドで新規リポジトリをサーバー上に作成します。

mkdir sample.plusr.biz
cd sample.plusr.biz

【step4】リポジトリの作成

以下のコマンドで新規リポジトリをサーバー上に作成します。

git --bare init

※bareとは作業ファイルがないからのリポジトリです。

vi description

以下のように任意のプロジェクト名を記述します。

sample.plusr.biz.repository

※リポジトリ名を記述しなかった場合、push時に以下のエラーが発生します。

*** Project description file hasn't been set
error: hooks/update exited with error code 1
error: hook declined to update refs/heads/master

【step5】権限設定

グループのユーザに書き込み権限を与えます。

chmod -R 0775 /usr/local/development/repos/sample.plusr.biz
chmod -R g+s /usr/local/development/repos/sample.plusr.biz    #(1)
chgrp -R sample.plusr.biz /usr/local/development/repos/sample.plusr.biz

※上述の(1)がない場合、pushをしたときに以下のエラーが発生する。

error: failed to push some refs to 'ssh://ishimoto@123.123.123.123:1234/usr/local/development/repos/sample.plusr.biz'

■クライアント側

まず、環境に合わせて以下をインストールします。

Mac
Git for Mac OS X
Win
msysgit

【step1】準備

プロジェクト用のディレクトリを作り、配下で以下ののコマンドを実行します。

mkdir sample.plusr.biz
cd sample.plusr.biz
git init

【step2】初期状態を準備

フレームワークなどのファイルを配置した後に以下のコマンドを実行します。

git add .
git commit -m “import :)
git remote add origin ssh://ishimoto@123.123.123.123:1234/usr/local/development/repos/sample.plusr.biz
git push origin master

※ちなみに間違えてリモートをセットしたときは以下のコマンドで再設定できます。

git remote set-url origin ssh://ishimoto@123.123.123.123:1234/usr/local/development/repos/sample.plusr.biz

リモートを確認するには以下のコマンドを使用します。

git remote -v

※さらにちなみにですが僕はコメントに顔文字を入れたりします。(。・ω・)ノ゙

【参考】

いかがでしょうか?率直なところ、まだ僕はSubversionからGitに乗り換えた恩恵を授かっていません。しかし、開発人数が増加すれば分散リポジトリの恩恵を授かれるはずです。次回は、実際のGit環境での開発について書いてみたいと思います。。。あ、WinのGit環境がわからないな・・・(●´⌓`●)

こんにちは。先日のブログで以下のような発言をしたイッシーです。(●´ω`●)

僕は生産設備を持っていませんので食料をはじめとした物流における支援は難しいのかもしれません。しかしながらシステムエンジニアとして間接的な支援や情報における支援はできます。僕は、天災における「破壊」を修復するのは人々の「生産」と考えるとともに、その「生産」の一部分を担う者として頑張っていきたいと思います。

有言実行ということで緊急地震速報をお知らせするChrome用の拡張機能を作ってみました。そこで今回は技術的な部分をまとめておきます。

■仕様

クライアント側

Web Notifications

お知らせを表示する小窓です。一番はじめのブログの題材にしました。

WebSocket

双方向通信の規格。これを使うとサーバ側から情報をプッシュできます。

Audio API

お知らせ音を鳴らす際に使用しました。

サーバ側

node.js

サーバサイドJavaScript。一言では表せない存在。同時接続ユーザ数が増えた場合のパフォーマンスがapacheと比べて非常に良いと思います。

■困ったこと1

node-websocket-serverの接続数が1024以上にならない。

解決策

node serverを立ち上げる前に以下のコマンドを実行することで解決しました。

ulimit -n 2048

デフォルトでファイルディスクリプタの数が1024になっているので、1プロセスあたり1024個の接続がリミットになっていたわけです。twitterで教えてくださった方に感謝です!

■困ったこと2

30分以上のスリープ状態から復帰すると接続が切れているが、イベントが発火せずプロパティにも特に変化がない。

解決策

以下のようなコードを使用することで回避しました。

var reload  = 600000;
var before = new Date();
setInterval(function(){
    var current = new Date();
    if((current - before) > (reload + 15000)){
        connect();// 再接続
    }
    before = current;
},reload);

タイマーを利用してスリープを検知しています。通常はcurrentとbeforeの差は殆どreloadと等しくなりますが、スリープした場合に差が大きくなります。それを利用して再接続をしているわけです。ヒラメキに感謝!

コードが美しくないのでhtml5-developers-jpに質問してみたところ、「NATやFireWallがあり通信が一定期間無い場合、リソース節約のためにそのセッションテーブルを切ってしまうため、readyStateなどは変化しない」とアドバイスを頂きました。教えてくださった方ありがとうございます!

■困ったこと3

千人くらい使ってくれるかなと考えていましたので、一万人を超えた時は正直焦りました。急激にトラフィックが制限に近づいてます。ソーシャルゲームとは違いユーザ間でデータの共有はしてませんので、サーバさえあれば分散は容易になってます。また、協力してくださる方もいますので協力してくださる方に感謝です!

■まとめ

当初、不具合がありまして多くの皆様に迷惑をかけたにもかかわらず、温かい言葉をかけてくださいまして大変励みになりました。また、個人で制作したものではありますが、サーバーなど会社のバックアップがあってこそ運営できているものです。改めて周囲の皆様に感謝し今後も頑張っていきたいと思うとともに、震災にあわれた地域のいち早い復興を願っております。

こんにちは!イッシーです(。・ω・)ノ゙


この度の東日本大地震により、被災されました方々に心よりお見舞い申し上げます。

株式会社プラスアールではささやかながら東日本大地震チャリティとして「禁煙なう」ダウンロード数に応じ上限20万円(1万DL)を日本赤十字社に寄付させていただきます。


僕は生産設備を持っていませんので食料をはじめとした物流における支援は難しいのかもしれません。しかしながらシステムエンジニアとして間接的な支援や情報における支援はできます。僕は、天災における「破壊」を修復するのは人々の「生産」と考えるとともに、その「生産」の一部分を担う者として頑張っていきたいと思います。

さて、突然ですが皆さんはバージョン管理に何を使ってますか?プラスアールではGitでバージョン管理をしてます。大抵の方はGitを使っている、もしくはSubversionからGitへの乗り換えを希望しているのではないでしょうか?

そこで今回はGit!といきたいところですが、Subversionもまだまだ現役だと思いますので、Subversionでバージョン管理する方法をまとめておきたいと思います。

  • 開発サーバーにターミナルでログインしての作業になります
  • 分からない人は分かる人に補助してもらってください
  • 解説は、プロジェクト名:sample.plusr.biz、ユーザ名:ishimotoとしてます
  • ルート権限で作業します

■サーバー側

Subversionは中央集権的に管理するシステムです。大概はサーバーが必要になります。

【step1】グループを作る

プロジェクト名と同じ名前のグループを作りましょう。重複を防ぐためにもドメイン名が最適です。

/usr/sbin/groupadd sample.plusr.biz

【step2】グループにユーザを追加

グループにプロジェクトユーザを加えます。

gpasswd -a ishimoto sample.plusr.biz

以下のコマンドでも同様の操作が可能ですが、今まで追加したグループを列挙しなければなりません。

/usr/sbin/usermod -G sample.plusr.biz,hoge.plusr.biz,fuga.plusr.biz ishimoto

【step3】リポジトリ作成

以下のコマンドを実行しリポジトリを作成します。

svnadmin create --fs-type fsfs /usr/local/development/repos/sample.plusr.biz
mkdir /usr/local/development/repos/sample.plusr.biz/trunk
mkdir /usr/local/development/repos/sample.plusr.biz/tags
mkdir /usr/local/development/repos/sample.plusr.biz/branches

【step4】権限設定

グループのユーザに書き込み権限を与えます。

chmod -R 0775 /usr/local/development/repos/sample.plusr.biz/
chgrp -R sample.plusr.biz /usr/local/development/repos/sample.plusr.biz/

【step5】インポート

デフォルトの初期状態の雛形がある場合は以下のコマンドでインポートします。

svn import /user/local/development/repos/skeleton file:///usr/local/development/repos/sample.plusr.biz/trunk -m

svn import A B でAをBにインポートします。

【参考】

■Windowsクライアント側

クライアント側も基本的にはコマンドで操作可能ですが、TortoiseSVNなどを利用すると非常に作業が楽になります。

【step1】TortoiseSVNのインストール

サイトからダウンロードしてきてインストールします。

サーバのSSHのポートを変更している場合

C:\Users\[your name]\AppData\Roaming\Subversion\configの[tunnels]セクションに以下を追記します。

sshdev = "C:/Program Files/TortoiseSVN/bin/TortoisePlink.exe" -ssh -l [username] -P 1234

【step2】puttyのインストール

step2までの手順で使用することはできますが、接続の度に煩雑なパスワード入力が必要になりまし、SSHで接続する際に鍵を使用している方はputtyを使用した方が断然に楽に作業できますので、サイトからダウンロードします。

次にダウンロードしたファイル内の「plink.exe」を「C:\WINDOWS\system32」にコピーしてください。

【step3】puttyの設定ファイルの編集

コマンドプロンプトで以下のコマンドを実行し、svnのconfigファイルのパスを探しconfigファイルを編集します。

echo %APPDATA%

出力したフォルダの中の「Subversion\config」ファイルを編集します。以下の記述を

#ssh=$SVN_SSH ssh

以下のように記述します。

ssh=plink
#ssh=$SVN_SSH ssh

【step4】秘密鍵の登録

puttyフォルダのpageant.exeを起動し、タスクトレイから右クリックで「AddKey」を選択しパスワードを入力します。

【使用方法】

リポジトリの追加
エクスプローラ上の何も無い部分で右クリック > チェックアウト
コミット等の操作
編集したファイル・ディレクトリで右クリック > コミット

【参考】

■Macクライアント側

Macはデフォルトでsvnコマンドが使用できます。しかし、TortoiseSVNが存在しませんので個人的な趣味によりEclipseのプラグイン(Subversive)を使用します。Windows版のEclipseでも同様に使えるので好みに応じて使い分けると良いかもしれません。

【使用方法】

リポジトリの追加(SVNリポジトリのビュー上)
新規 > リポジトリ・ロケーション > 必要項目の入力 > 右クリックしてチェックアウト
コミット等の操作(プロジェクト・エクスプローラのビュー上)
右クリック > チーム > コミット

※コミットをはじめロックの取得など操作が可能

サーバのSSHのポートを変更している場合

Subversiveを使用するときには問題ありませんが、コマンドラインから操作する場合にはポートの指定で上手くいかないかと思います。以下のコマンドを実行して設定ファイルを編集します。

vi ~/.subversion/config

[tunnels]セクションに以下を追記します。

sshdev = ssh -p 1234 -l ishimoto

すると以下のコマンドでチェックアウトなどの操作ができるようになると思います。

svn checkout svn+sshdev://123.123.123.123/usr/local/development/repos/sample.plusr.biz

いかがでしょうか?多少粗雑な部分もあったかと思いますが参考にしていただければと思います。実は自分のプロジェクトでは諸事情によりまして1プロジェクトだけSubversionを使用してますが、今後はGitに統一します。次回はGitでのバージョン管理を解説できればと思います。