2017年03月25日

FuelPHP で Orm\Model クラスのリレーション定義しても cascade がうまく動作しない

PHP Framework: FuelPHP
Version: 1.8

FuelPHP の ORM モデルクラスに $_has_many プロパティを定義してリレーションを定義すると、JOIN が楽になるほか save() や delete() 実行時に関連テーブルのデータも自動的に save()、delete() させるように設定が可能となる。
https://fuelphp.com/docs/packages/orm/relations/intro.html

ところが、この $_has_many プロパティのキーの選び方には注意が必要であることがわかった。

$_has_many のキーに、テーブルのフィールド名と同じ名前を選んではいけない!

つまり、上記 Document ページでいうと
protected static $_has_many = array('comments' => array(
'model_to' => 'Model_Fancy_Comment',
'key_from' => 'article_id',
'key_to' => 'parent_article_id',
'cascade_save' => true,
'cascade_delete' => false,
// there are some more options for specific relation types
));

'comments' が、$_properties に含まれていると、動作がおかしくなる。。。

たとえば \Orm\Model クラスの delete() メソッドがどうなっているかを見てみると、

foreach($this->relations() as $rel_name => $rel) {
:
$rel->delete($this, $this->{$rel_name}, true, $should_cascade);
}

としている。
$rel_name は $_has_many プロパティのキー、$rel は \Orm\HasMany オブジェクトが代入されるのだが、$this->{$rel_name} がモデルクラスのフィールド参照とモロかぶりなのである。

これがわかるまで、丸1日かかってしまった。。。
タグ:FuelPHP PHP
posted by K/I at 14:51 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2015年05月10日

PHP で NW-7 バーコード画像を生成する

PHP の Pear には、バーコードを生成するライブラリー Image_Barcode2 クラスが提供されているけれど、なぜか NW7 が含まれていないので作ってみた。

(1) Barcode2.php ファイルを探し (通常は /usr/share/pear/Image/Barcode2.php など)、Image_Barcode2 のクラス内定数に BARCODE_NW7 を追加:

const BARCODE_NW7 = 'nw7';

(2) Barcode2 の Driver ディレクトリーに、今回作成した NW-7 用のドライバーファイル Nw7.php を追加。

設置は以上で完了。

使い方は、たとえば:
<?php
require 'Image/Barcode2.php';                                                    
$code = new Image_Barcode2();                                                    
$code->draw('a01234567b', 'nw7');                      
などとすれば、バーコード画像が表示される。
posted by K/I at 22:43 | 東京 ☁ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2014年09月28日

Fedora 16以前のバージョン "End of Life" !!!

Fedoraは 17 以降から、fedup というツールでお手軽にアップグレードができるようになっていたらしい。

それが理由なのか、あるいは Systemd 導入が理由なのかわからないが、Fedora 16 までのバージョンは "End Of Life" になっていた。
しかもかなり以前に:
https://bugzilla.redhat.com/show_bug.cgi?id=834795

EOF になると、アップグレードすらできなくなるのか。
Fedora 13 で運営しているサーバーがあるのだが、こいつは完全に世間から取り残された。。。
posted by K/I at 21:34 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2014年06月30日

Apache組み込まれている静的モジュール/動的モジュールの一覧取得方法

いつも忘れてしまうので、メモ。

Apache2 で、組み込まれている Static Module の一覧は、
# httpd -l

ロードされている Dynamic Module の一覧は、
# apachectl -M

で調べられる。
タグ:Apache
posted by K/I at 20:15 | 東京 ☁ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2014年06月13日

CentOS 6.5 への MongoDB のインストール

CentOS 6.5 に MongoDB サーバーをインストールしようとしたら、パッケージは存在しているのにレポジトリからダウンロードできずインストールできないと言われた。
CentOS 6.4 はうまくいくのに。。。

やむなく、MongoDB 本家のレポジトリを追加してインストールすることに。
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/
基本的には上記URLのとおりにやればOK。

ただ、既存の YUM レポジトリーの MongoDB 関連パッケージとかち合うのが気になるので、enabled=0 のほうがよいかも。
posted by K/I at 22:16 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2014年03月16日

Subversion の Secure connection truncated エラー

Subversion で巨大なレポジトリーをチェックアウトしようとすると、Secure connection truncated エラーが出ていっぺんにダウンロードできない場合がある。

ssh でレポジトリーにアクセスできるなら、そちらを使えばエラーを回避できるようだ。

SSH で接続する場合のレポジトリーの URL は、

svn+ssh://(ホスト名)/(レポジトリーのパス)
タグ:SVN subversion
posted by K/I at 21:23 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

Subversionで無視ファイルを探すには?

Subversion の「無視リスト」はなにかと便利ではあるけれど、作業ディレクトリーを一時的に削除しようと思った時に「はて?すべてあっさり消してしまってよかったのだっけ?それとも作業環境依存の設定ファイルを無視リストに設定してあるのだっけ?」と悩むことがある。
svn コマンドで
$ svn stat --no-ignore
というのがあるけれど、これだとあらかじめ無視パターンに設定したファイルも表示されてしまう。
明示的に svn:ignore プロパティーに設定したファイルだけ探し出したいのだが。

結局わからず、上記コマンドで表示された大量のファイルを点検。
めんどくさ。。。
タグ:SVN subversion
posted by K/I at 18:01 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2014年02月02日

Postfix で POP before SMTP

POP before SMTP を実現するにはどうすればいいのか、調べてみた。
意外と簡単。

手元の環境は:
OS: CentOS release 6.4 (Final)
MTA: Postfix 2.6.6
POP/IMAP: Dovecot 2.0.9

Pop-before-smtp パッケージは yum ではインストールできないようなので、Pop-before-smtp プロジェクトのサイト (http://popbsmtp.sourceforge.net/) からダウンロードしてインストールする。
Quickstart Guide が用意されているので、基本的にはそれを元に作業すればOK。

1. Pop-before-smtp のインストールと起動

まずは、必要なパッケージのインストール:
# yum install perl-TimeDate perl-Net-Netmask perl-DB_File

Pop-before-smtp のファイル一式をダウンロードして展開したら、ファイルをコピーする (なんと手作業インストール!)。
# cp pop-before-smtp.init /etc/rc.d/init.d/pop-before-smtp # cp pop-before-smtp /usr/sbin/ # cp pop-before-smtp-conf.pl /etc

設定ファイル /etc/pop-before-smtp-conf.pl を編集する。
  1. 以下の行を探し、必要に応じて設定:
    # Set the log file we will watch for pop3d/imapd records. #$file_tail{'name'} = '/var/log/maillog';
  2. $patを定義していると箇所を探し出し、システムの設定に合ったものをコメントアウト。
    今回は Dovecot + syslog なので、以下の部分をコメントアウトした:
    # For Dovecot POP3/IMAP when using syslog. $pat = '^[LOGTIME] \S+ (?:dovecot: )?(?:imap|pop3)-login: ' . 'Login: .*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]'; $out_pat = '^[LOGTIME] \S+ (?:dovecot: )?(?:imap|pop3)-login: ' . 'Disconnected.*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';
設定は、とりあえずこれで完了。
$pat の設定が正しいかどうかは、以下のコマンドでテストできる。
# pop-before-smtp --debug --nowrite --reproces Feb 2 17:21:32 starting up (v1.42) Feb 2 17:21:32 Using 2 values for pre-authorized networks: `XX.XX.XX.XX/32', `127.0.0.0/8' Feb 2 03:14:02 startup log-scan complete Feb 2 03:14:02 ignoring local-net ip=XX.XX.XX.XX : Feb 2 15:34:02 ignoring local-net ip=XX.XX.XX.XX Feb 2 15:44:05 ignoring local-net ip=XX.XX.XX.XX Feb 2 15:44:41 found ip=XX.XX.XX.XX (-1) Feb 2 15:54:09 ignoring local-net ip=XX.XX.XX.XX :
こんな感じに表示されれば問題無し。

デーモンをスタートしてみる:
# chkconfig --add pop-before-smtp # chkconfig --list | grep -i pop pop-before-smtp 0:off 1:off 2:on 3:on 4:on 5:on 6:off # service pop-before-smtp start Starting pop-before-smtp: done

正常に動作すれば、データベースファイルが作られる:
# ls -l /etc/postfix/pop-before-smtp* -rw-r--r-- 1 root root 12288 Feb 2 18:00 /etc/postfix/pop-before-smtp.db

2. Postfix の設定

設定ファイル /etc/postfix/main.cf を開き、どこかに:
check_client_access = hash:/etc/postfix/pop-before-smtp
の1行を追記する。
ついでに、説明書のアドバイスに従って以下の設定も追加:
smtpd_recipient_restrictions = permit_mynetworks,reject_non_fqdn_recipient, check_client_access hash:/etc/postfix/pop-before-smtp, reject_unauth_destination
Postfix の設定再読み込み。
# service postfix reload

3. 動作の確認

まず、Pop-before-smtp に登録されている IP アドレスのリストを確認してみる。
# pop-before-smtp --list The database holds 0 IPs.
となっていれば、まだ登録されていない状態。
この状態で、メール送信を試してみると、メールーサーバのログに:
Feb 2 19:25:58 localhost postfix/smtpd[3537]: connect from xxx.yyy.zzz[XX.XX.XX.XX]
Feb 2 19:25:58 localhost postfix/smtpd[3537]: NOQUEUE: reject: RCPT from xxx.yyy.zzz[XX.XX.XX.XX]: 554 5.7.1 <aaa@bbb.ccc.ddd>: Relay access denied; from=<k-ishik@ll.mm.nn> to=<aaa@bbb.ccc.ddd> proto=ESMTP helo=<[192.168.0.10]>
Feb 2 19:25:58 localhost postfix/smtpd[3537]: disconnect from xxx.yyy.zzz[XX.XX.XX.XX]
といったエラーが出力される。
(メール転送が許可されない)

次に、POP 受信した後に試してみる。
# pop-before-smtp --list The database holds 1 IP: XX.XX.XX.XX
と表示されれば、Pop-before-smtp は正常に動作している。
メール送信も正常に行われる (はず)。
posted by K/I at 18:47 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2013年12月31日

Postfix+Cyrus SASL で SMTP 認証

SMTPサーバーの認証をやらざるをえなくなり、SASL を導入した。
Cyrus SASL はこれまでにも何度か試したけれど、いつも何やら難しそうで途中で放棄していた。
今回は、なんとかやりおおせた。。。

使用した環境は以下のとおり:
OS: CentOS release 6.4 (Final)

1. Cyrus SASL のインストールと設定

SASL ではさまざまな認証機構を選択できるが、あまり複雑なことをやるとハマりそうなので Linux のパスワードファイル /etc/shadow での認証を採用した。
/etc/shadow での認証は、saslauthd で実現できる。
saslauthd は、CentOS の RPM パッケージ cyrus-sasl に含まれている。

PLAIN 認証機構のパッケージ cyrus-sasl-plain もインストールが必要。
# yum install cyrus-sasl cyrus-sasl-plain
saslauthd を実行する前に、/etc/sysconfig/saslauthd ファイルの起動オプションを設定して /etc/shadow での認証を行うようにする。
MECH=shadow
起動してみる。
# service saslauthd start
saslauthd での認証がうまくいくかどうかは、testsaslauthd コマンドで確認できる。
# testsaslauthd -u ユーザ名 -p パスワード
0: OK "Success." と表示されれば成功。

Postfix の SMTP 認証のために saslauthd は起動させておく必要がある。
chkconfig で on に設定しておこう。
# chkconfig saslauthd on

2. Postfix の設定

Postfix の SASL 認証は、SASL ライブラリーを経由して行っている。
SASL ライブラリーの設定ファイル /etc/sasl2/smtpd.conf を以下のように設定する。
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

Postfix 本体の設定を以下のようにする。
(設定項目が存在しなければ追加)
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = cyrus
smtpd_sasl_path = smtpd
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
最後の設定は、リレーを許可するためのもの。
なお、Cyrus SASL ライブラリーは設定ファイルの検索パスから「smtpd_sasl_path の設定値+.conf」というファイル名のファイルを探し出してそれを読み込むので、認証がうまくいかない場合は前述の /etc/sasl2/smtpd.conf ファイルのファイル名と smtpd_sasl_path の設定値が一致しているかどうか確認するとよい。

/etc/postfix/master.cfg ファイルで、-o smtpd_sasl_auth_enable=yes-o smtpd_client_restrictions=permit_sasl_authenticated,reject オプションを有効にする。
smtp inet n - n - - smtpd
#submission inet n - n - - smtpd
# -o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING

Postfix の設定リロードを行って完了。
# service postfix reload
posted by K/I at 18:13 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

SETI@home/BOINC をコマンドラインで実行する (Linux)・改

しばらく貢献を怠っていた SETI@home に久しぶりに参加しようと思い、以前書いた記事「SETI@home/BOINC をコマンドラインで実行する (Linux)」を読み返したものの、さすがに古すぎてほとんど役に立たず。
改めて調べてみた。

使用したOSは CentOS release 6.4 (Final)。
現在は RPM パッケージが用意されており、rc ファイルも完備されているので操作が楽になっている。

1. BOINCクライアントのインストール

rpm パッケージが用意されているので、yum 等でインストールする。
# yum install boinc-client
インストールが完了したら boinc-client を起動する。
# service boinc-client start

2. SETI@home のプロジェクト登録

まずは、SETI@home のアカウントキーを取得する必要がある。
SETI@home にアカウントを持っている場合には、次のコマンドでアカウントキーを取得できる。
# boinccmd --lookup_account http://setiathome.berkeley.edu/ \
メールアドレス パスワード
まだアカウントを作っていない場合は、次のコマンドを実行する。
# boinccmd --create_account http://setiathome.berkeley.edu/ \
メールアドレス パスワード アカウント名
アカウントキーを取得したら、BOINC デーモンに SETI@home を登録する。
# boinccmd --project_attach http://setiathome.berkeley.edu/ アカウントキー
ステータスは、
# boinccmd --get_results
で確認できる。
posted by K/I at 12:14 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2013年10月28日

Perl で連想配列の順序をキープする

Perl の連想配列のキーを keys で取得すると、通常は設定順序と異なる順序で返される。
連想配列の順序を保持したい場合は、Tie::IxHash モジュールを使用する。

Tie::IxHash モジュールには TIEHASH インターフェイスが用意されているので、tie 関数と組み合わせて使えば連想配列をあたかも設定順にデータが格納されるかのように扱うことができる。

以下、サンプルコード:
#!/usr/bin/perl
use strict;
use warnings;
use Tie::IxHash;
tie my %hashval, 'Tie::IxHash';
$hashval{ data1 } = 10;
$hashval{ data2 } = 20;
$hashval{ data3 } = 30;
$hashval{ data4 } = 40;
foreach my $k (keys %hashval) {
print "$k = $hashval{$k}\n";
}
これを実行すると、
$ perl ~/tmp/test2.pl data1 = 10 data2 = 20 data3 = 30 data4 = 40
となる。

ためしに7行目を
my %hashval;
に差し替えてみると
$ perl ~/tmp/test2.pl data4 = 40 data2 = 20 data3 = 30 data1 = 10
のようになり、Tie::IxHash の効果が確認できる。
posted by K/I at 16:43 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2013年06月10日

コマンドラインでのANDROIDアプリのコンパイルと署名

ANDROID アプリは Eclipse を使わずにコマンドラインでコンパイルと署名ができる。
できるのならやってみよう、というわけ。

試した環境は:
CentOS release 6.4
Android SDK Tools r22.0.1

以下、あらかじめ Eclipse で作成したプロジェクトがあることが前提。
プロジェクト名は HelloWorld とする。

1. 作業環境の整備

1.1 Android SDK Tools
まずは、Android Developers のサイトから SDK Tools をダウンロードしてインストールする。
Android Developers
http://developer.android.com/index.html
Develop > Tools > Download のページで、[DOWNLOAD FOR OTHER PLATFORMS] のところにある "SDK Tools Only" から、"Linux 32 & 64-bit" のファイルをダウンロード。
今回は "android-sdk_r22.0.1-linux.tgz" だった。

これを適当なところに展開する。
ここでは /opt ディレクトリの下に展開した。
toolsplatform-tools にパスを通しておいたほうが便利かもしれない。
$ export PATH=$PATH:/opt/android-sdk-linux/tools $ export PATH=$PATH:/opt/android-sdk-linux/platform-tools

設置したら、SDK を更新しておく。
# /opt/android-sdk-linux/tools/android update sdk --no-ui
1.2 Ant
使用した Android SDK Tools の r22.0.1 は、Ant 1.8.0 以上が必要なので、本家サイトからダウンロードしてくる。
Apache Ant
http://ant.apache.org/
Apache Antのサイトの "Binary Distributions" からダウンロードし、適当なディレクトリーに展開する。
ここでは /opt/apache-ant に解凍した。
そして、ANT_HOME に Ant のパスを設定し、ついでにパスも通しておく。
$ export ANT_HOME=/opt/apache-ant $ export PATH=$PATH:$ANT_HOME/bin

2. Android アプリのコンパイル

まずは、Eclipse で作成した Android アプリのパスに移動し、プロジェクトを update する。
$ android update project --target android-16 --path .
ターゲットは project.properties に書かれているものに合わせるといいかも。
local.propertiesbuild.xml の2ファイルが作られ、コンパイルできるようになる。
サブプロジェクトに関するコメントが表示されるがとりあえず無視。

コンパイルしてみる。
$ ant release
そうしたら以下のようなエラーが。。。:
BUILD FAILED /opt/android-sdk-linux/tools/ant/build.xml:650: The following error occurred while executing this line: /opt/android-sdk-linux/tools/ant/build.xml:691: Execute failed: java.io.IOEx ception: Cannot run program "/opt/android-sdk-linux/build-tools/17.0.0/aapt": error=2, そのようなファイルやディレクトリはありません ...
試しに /opt/android-sdk-linux/build-tools/17.0.0/aapt を実行してみると、/lib/ld-linux.so.2 が存在しない、というエラー。
linux.so.2 ファイルは、調べてみると glibc.i686 というパッケージに含まれるらしい。
$ yum provides ld-linux.so.2 Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile * base: www.ftp.ne.jp * epel: ftp.iij.ad.jp * extras: www.ftp.ne.jp * updates: www.ftp.ne.jp glibc-2.12-1.107.el6.i686 : The GNU libc libraries Repo : base Matched from: Other : ld-linux.so.2
へぇ、glibc.i686glibc.x86_64 とは別なのか。。。
glibc.i686 をインストールして /opt/android-sdk-linux/build-tools/17.0.0/aapt を実行すると、今度はまた別のライブラリーが存在しないというエラーが。
ひとつひとつつぶしていくと、結局3つのパッケージの追加インストールが必要だった:
# yum install glibc.i686 # yum install zlib.i686 # yum install libstdc++.i686
コンパイルが成功すると bin ディレクトリの中に .apk ファイルが作られる。

3. 署名

3.1 鍵ペアーの生成
Android アプリに署名するための鍵ペアーは、keytool コマンドで生成できる。
keytool は JDK に含まれている。
$ keytool -genkey -v -keystore tan9.keystore -alias HelloWorld \ -dname "CN=Hello World, O=Tan9, L=Shinjuku, ST=Tokyo, C=JP" -keyalg RSA \ -keysize 2048 -validity 10000 -keypass 123456 -storepass 123456 $ keytool -list -keystore tan9.keystore
キーストアーファイルのファイル名 (上記 tan9.keystore)、パスワード (123456 2カ所)、識別名 (CN=Hello World, O=Tan9, L=Shinjuku, ST=Tokyo, C=JP) 等は適当に。
3.2 アプリへのデジタル署名
jarsigner コマンドを使ってアプリにデジタル署名する。
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 \ -keystore tan9.keystore -storepass 123456 -keypass 123456 \ bin/HelloWorld-release-unsigned.apk HelloWorld 追加中: META-INF/MANIFEST.MF 追加中: META-INF/HELOWORL.SF 追加中: META-INF/HELOWORL.RSA 署名中: res/layout/main.xml 署名中: AndroidManifest.xml 署名中: resources.arsc 署名中: res/drawable-hdpi/ic_launcher.png 署名中: res/drawable-ldpi/ic_launcher.png 署名中: res/drawable-mdpi/ic_launcher.png 署名中: res/drawable-xhdpi/ic_launcher.png 署名中: classes.dex
これで bin/HelloWorld-release-unsigned.apk に署名が施される。
タグ:android Ant
posted by K/I at 00:52 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2013年05月12日

Cygwin での OpenSSH サーバーの設定

(1) 管理者権限で Cygwin Terminal を開く。
(2) ssh-host-config を実行。
このとき、-y オプションをつけておくと質問に勝手に答えて進んでくれる。
$ ssh-host-config -y
途中、cyg_server ユーザーを作成する箇所でパスワードを聞かれるので入力する。
(3) cygrunsrv コマンドでサービス開始する:
$ cygrunsrv -S sshd
タグ:cygwin OpenSSH
posted by K/I at 18:11 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2013年01月03日

完全分散モードの Hadoop 導入手順 (CDH3)

Cloudera's Distrubution for Hadoop (CDH) を利用して、完全分散モードの Hadoop を導入したメモ。
今回は以下の構成とした。
マスターノード (CentOS 5.7)
ホスト名: master
Hadoop の NameNode/JobTracker
スレーブノード (Fedora 14)
ホスト名: slave
Hadoop の DataNode/TaskTracker
SecondaryNameNode は無し。
また、NameNode と JobTracker は分けたほうがよいようだが、今回はとりあえずこれで。
【参考】
  • http://codezine.jp/article/detail/2485
  • http://oss.nttdata.co.jp/hadoop/cdh.html
  • https://ccp.cloudera.com/display/FREE4DOC
  • http://wiki.apache.org/hadoop/
インストール前に、「Supported Operating Systems for CDH3」で CDH3 がサポートする OS かどうか確認しておく。
バージョンにも気をつける必要がある。
衣か、Hadoop のインストールまでは、マスターノード、スレーブノードほぼ共通。

1. Java Development Kit インストール

Java Development Kit (1.6 以上) をインストールする。
今回は、OpenJDK をインストールした。
【RedHat系】
# yum install java-1.6.0-openjdk java-1.6.0-openjdk-devel
【Debian系】
# apt-get install openjdk-6-jdk

2. CDH3 インストール

CDH3 を「CDH3 Installation」の手順に従ってインストールする。
【RedHat系】
# yum --nogpgcheck install http://archive.cloudera.com/redhat/cdh/cdh3-repository-1.0-1.noarch.rpm
# rpm --import http://archive.cloudera.com/redhat/cdh/RPM-GPG-KEY-cloudera
マスターノードの場合:
[root@master]# yum install hadoop-0.20 hadoop-0.20-native \
hadoop-0.20-namenode hadoop-0.20-jobtracker

スレーブノードの場合:
[root@slave]# yum install hadoop-0.20 hadoop-0.20-native \
hadoop-0.20-datanode hadoop-0.20-tasktracker

【Debian系】
# wget http://archive.cloudera.com/one-click-install/squeeze/cdh3-repository_1.0_all.deb
# dpkg -i cdh3-repository_1.0_all.deb
# apt-get update

マスターノードの場合:
[root@master]# apt-get install hadoop-0.20 hadoop-0.20-native \
hadoop-0.20-namenode hadoop-0.20-jobtracker

スレーブノードの場合:
[root@master]# apt-get install hadoop-0.20 hadoop-0.20-native \
hadoop-0.20-datanode hadoop-0.20-tasktracker

3. SSH 設定

マスターノードとスレードノードとは SSH でやり取りするので、パスワード無しで SSH ログインできるようにしておく (秘密鍵をパスワード無しにするか、ssh-agent などを使う)。
hdfs アカウントのホームディレクトリは /usr/lib/hadoop-0.20 に設定されているので、/usr/lib/hadoop-0.20 の下に .ssh ディレクトリを作成し、そこに鍵ペアを作る。
# mkdir /usr/lib/hadoop-0.20/.ssh
# chmod 02775 /usr/lib/hadoop-0.20/.ssh
# chgrp hadoop /usr/lib/hadoop-0.20/.ssh
# ssh-keygen -t rsa -N "" -f /usr/lib/hadoop-0.20/.ssh/id_rsa
# chmod 0660 /usr/lib/hadoop-0.20/.ssh/id_rsa
# chmod 0664 /usr/lib/hadoop-0.20/.ssh/id_rsa.pub
# touch /usr/lib/hadoop-0.20/.ssh/known_hosts
# chmod 0664 /usr/lib/hadoop-0.20/.ssh/known_hosts
# chmod 0755 /usr/lib/hadoop-0.20/.ssh
公開鍵を互いの /usr/lib/hadoop-0.20/.ssh 内に authorized_keys ファイルを作成して書き込み、互いに hdfs アカウントでパスワード無しにログインできることを確認する。
[root@master]# su - hdfs
[hdfs@master]$ ssh slave
[hdfs@slave]$ ssh master
[hdfs@master]$ exit
[hdfs@slave]$ exit
[hdfs@master]$ exit

4. Hadoop 設定

インストールした時点では empy の設定ファイルが設定されているので、これを別のディレクトリ (ここでは conf.cluster とした) にコピーして設定していく。

設定ディレクトリは、alternatives コマンドを使って切り替える。
【RedHat系】
# cp -dpR /etc/hadoop/conf.empty /etc/hadoop/conf.cluster
# alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf \
/etc/hadoop-0.20/conf.cluster 50

# alternatives --display hadoop-0.20-conf
【Debian系】
# cp -dpR /etc/hadoop/conf.empty /etc/hadoop/conf.cluster
# update-alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf \
/etc/hadoop-0.20/conf.cluster 50

# update-alternatives --display hadoop-0.20-conf

マスターノード、スレーブノードの両方の /etc/hadoop/conf.cluster 内の設定ファイルを、たとえば以下のように書き換える:

設定ファイル: core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:54310</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop/tmp</value>
</property>
</configuration>

設定ファイル: hdfs-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/var/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/var/hadoop/dfs/data</value>
</property>
</configuration>

設定ファイル: mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:54311</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/var/hadoop/mapred</value>
</property>
</configuration>

設定ファイル: masters
master

設定ファイル: slaves
slave

環境変数設定ファイル: hadoop-env.sh
# 【RedHat系】
export JAVA_HOME=/usr/lib/jvm/java
# 【Debian系】
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk

対応するディレクトリを作成する。
# mkdir -p /var/hadoop/tmp \
/var/hadoop/dfs/name \
/var/hadoop/dfs/data \
/var/hadoop/mapred

# chown hdfs:hadoop /var/hadoop/tmp \
/var/hadoop/dfs/name \
/var/hadoop/dfs/data

# chown mapred:hadoop /var/hadoop/mapred
# chmod 0777 /var/hadoop/tmp
# chmod 0700 /var/hadoop/dfs/name
# chmod 0755 /var/hadoop/dfs/data \
/var/hadoop/mapred

5. ポートの開放

Hadoop がデフォルトで使用するポート番号が「Hadoop Default Ports Quick Reference」にあるので、必要に応じてルーターやファイアウォール等の設定を変更する。

6. NameNode / DataNode の起動

マスターノードで、NameNode をフォーマットする。
[root@master]# su - hdfs
[hdfs@master]$ hadoop namenode -format
[hdfs@master]$ exit

ここで以下のようなエラーが出る場合は、環境変数 JAVA_HOME が正しく設定されていない可能性がある:
+======================================================================+
|      Error: JAVA_HOME is not set and Java could not be found         |
+----------------------------------------------------------------------+
| Please download the latest Sun JDK from the Sun Java web site        |
|       > http://java.sun.com/javase/downloads/ <                      |
|                                                                      |
| Hadoop requires Java 1.6 or later.                                   |
| NOTE: This script will find Sun Java whether you install using the   |
|       binary or the RPM based installer.                             |
+======================================================================+

マスターノードの NameNode、スレーブノードの DataNode を起動する。
マスターノード:
[root@master]# service hadoop-0.20-namenode start
スレーブノード:
[root@slave]# service hadoop-0.20-datanode start
NameNode、DataNode が稼働しているかどうかは、ブラウザーで以下の URL にアクセスすることで確認できる。
http://master:50070/
"Live Nodes" の数値が稼働している DataNode の数。

7. JobTracker / TaskTracker の起動

マスターノードの HDFS 上に /mapred/system ディレクトリを作成する。
[root@master]# su - hdfs
[hdfs@master]$ hadoop fs -mkdir /mapred/system
[hdfs@master]$ hadoop fs -chown -R mapred:supergroup /
[hdfs@master]$ hadoop fs -chmod -R 0700 /mapred
[hdfs@master]$ exit
マスターノードの JobTracker、スレーブノードの TaskTracker を起動する。
マスターノード:
[root@master]# service hadoop-0.20-jobtracker start
スレーブノード:
[root@slave]# service hadoop-0.20-tasktracker start
JobTracker、TaskTracker が稼働しているかどうかは、ブラウザーで以下の URL にアクセスすることで確認できる。
http://master:50030/
Cluster Summary の "Nodes" の数値が稼働している TaskTracker の数。

8. サンプルコードの実行

パッケージにはサンプルコードが添えられているので試しに実行してみる。
[root@master]# su - mapred
[mapred@master]$ cd /usr/lib/hadoop
[mapred@master]$ hadoop jar hadoop-examples.jar pi 1 10 【変更履歴】 2013-01-22 記述全体を手直し
タグ:Hadoop CDH
posted by K/I at 01:06 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2012年10月04日

Flash Media Serverでの動画ライブ配信

先日の記事で Flash Media Server をインストールしたが、それだけでは動画のライブ配信はできない。
今回は、Flash Media Live Encoder を使ってライブ配信を試してみたい。
【関連記事】

※動画ストリーミング配信には Flash Player 10.1 以上が必要なので、もしインストールしていなければインストールしておく。

1. Flash Media Live Encoderのインストール

まず、AdobeのホームページからFlash Media Live Encoderを探し、ダウンロード&インストールする。

Flash Media Live Encoder #01

必要であれば、認証アドオンもダウンロード&インストールする (今回は行わなかった)。
Flash Media Live Encoder #02

Flash Media Live Encoder #03

Flash Media Live Encoder #04

Flash Media Live Encoder #05

Flash Media Live Encoder #06
※キャプチャー画像は Mac OS X のものだが、Windows でも手順は同じ。

2. Flash Media Encoderの設定

以下の設定手順は HTTP 経由でシングルストリームのライブ配信する場合のもの。
Flash Media Server のホスト名は test.jp とする。
  1. Flash Media Live Encoder は閉じておく。
  2. Flash Media Live Encoder の設定ファイル
    (インストール先)\conf\config.xml
    をテキストエディタで開き、タグ
    //flashmedialiveencoder_config/mbrconfig/streamsynchronization/enable
    true にして保存する。
  3. Flash Media Live Encoder を起動する。
  4. "Encoding Options" パネルの [Preset] プルダウンから "High Bandwidth (800 Kbps) - H.264" を選ぶ。
  5. [Audio]-[Format] は "AAC" を選ぶ。
    ※と、Adobe のサイトには書かれているが、"Mp3" でもうまくいくみたい。
    Windows 版で "AAC" 使うには別途エンコーダー (有料) が必要。
  6. [Video]-[Format] の右にあるレンチアイコンをクリックして "Advanced Encoder Settings" ダイアログを開き、[Keyframe Frequency] を "4 seconds" とする (この値は、applications/livepkgr/events/_definst_/liveevent/Event.xml の <FragmentDuration> の値 (デフォルト値 4000 ミリ秒) の整数倍にする)。
  7. [Stream to Flash Media Server]-[FMS URL] に "rtmp://test.jp/livepkgr" と入力する。
  8. [Stream to Flash Media Server]-[Stream] に "livestream?adbe-record-mode=record&adbe-live-event=liveevent" と入力する。
  9. [Stream to Flash Media Server]-[Save to File] のチェックをはずす。
  10. [Start] ボタンをクリックする。
Flash Media Server の Administartion Console の View Applications の Streams にストリームが表示されれば準備完了。
Flash Media Live Encoder #07

3. 埋め込み用コードの作成

Flash Media Server のインストール先にある samples/videoPlayer ディレクトリを Web 経由で見られるところにコピーする (ここでは http://test.jp/fms/samples/videoPlayer とする)。
そして、Web ブラウザーで
http://test.jp/fms/samples/videoPlayer/videoplayer.html
にアクセスする。
Flash Media Live Encoder #08
動画エリアの下の "STREAM YOUR OWN VIDEO" の [STREAM URL] に
http://test.jp:8134/hds-live/livepkgr/_definst_/liveevent/livestream.f4m
と入力し、[LIVE] にチェックを入れて [PLAY STREAM] ボタンをクリックする。
正常に設定できていれば動画エリアにライブ映像が表示される。

表示されない場合は、[STREAM URL] に入力した URL を直接 Web ブラウザーで表示させてみる。
正しければ、XML 形式のマニフェストファイルが表示されるはずである。

ページ下部に埋め込み用コードが表示されるので、それをコピーして任意のページにペーストすれば、ライブ配信ページが作れる。
Flash Media Live Encoder #09

コードを見ればわかるとおり、
swfs/StrobeMediaPlayback.swf
が必要なので、このファイルを適当な場所に設置して使う。

なお、サーバーが Development Server の場合は映像は30分で切断される (10分という記述を見かけたが、試したら30分だった)。

4. トラブルシューティング

4.1. Flash Media Playback Setup でエラーとなる
上記の例では Flash Media Server 同梱のサンプルコードを使って埋め込みコードを生成したが、Flash Media Playback Setup ( http://www.osmf.org/configurator/fmp/ ) も利用できる。
Flash Media Playback Setup で "We are having problems with..." というエラーが出る場合は、クロスドメインポリシーを疑ってみる必要がある。
【参考】
さわいじり
クロスドメインポリシーファイル(crossdomain.xml)設定について
クロスドメインポリシーは、Flash Media Server の (インストール先)/webroot/crossdomain.xml というファイルで設定される (デフォルト設定の場合)。
このファイルで、www.osmf.org からのアクセスが許可されているか確認する。
もしファイル自体が存在しなければ自前で作成する。
内容は以下のようなもの。
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM
"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
上記の例では、あらゆるドメインからのアクセスを許可している。
4.2. Buffering... と表示されたまま映像が表示されない
原因はいろいろあるらしいが、一度ハマると解決しにくいのが以下の例。

Flash Media Live Encoder の [Stream] の 値を livestream?adbe-live-event=liveevent (これが Adobe の解説に書かれている設定値) としている場合、配信時間が 30 分を超えると Flash Media Server のログ (logs/core.00.log) に:
Failed to record livestream (disk quota exceeded).
というエラーが出て動画配信ができなくなる。

こうなった場合は、
applications/livepkgr/streams/_definst_/livestream
内のファイルをすべて削除してサーバーを再起動すれば、また配信できるようになる。

[Stream] の値を "livestream?adbe-record-mode=record&adbe-live-event=liveevent" に変更して配信しなおしても解消する。
posted by K/I at 23:34 | 東京 ☁ | Comment(12) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2012年10月03日

Adobe Flash Media Server をレンタルサーバー (Linux) にインストールする

先日は Windows 7 で Flash Media Server を試したが、使った Windows 7 マシンが遅すぎてたまらないのでレンタルサーバーにインストールすることにした。
【関連記事】
Adobe Flash Media Server のインストール (Windows 7)
今回使用したサーバーはさくらインターネットの VPS で、OS は CentOS 5.7。
インストールした Flash Media Server のバージョンは 4.5.0。
インストーラーの入手方法は Windows 7 のときと同じなので割愛する。

インストール

インストーラーの ZIP ファイルを解凍すると linux というディレクトリがあり、その中に FlashMediaServer4.5_x64.tar.gz があるのでそれを解凍する。
# unzip -d FlashMediaDevServer_4_5_all FlashMediaDevServer_4_5_all.zip
# cd FlashMediaDevServer_4_5_all/linux
# tar zxvf FlashMediaServer4.5_x64.tar.gz
# cd FMS_4_5_0_r297
FMS_4_5_0_r297 ディレクトリ内の installFMS を実行して インストールする。
インストールの際、以下の2点に注意:
  • 試用版としてインストールする場合は、シリアル番号は入力不要
  • レンタルサーバーの場合すでに Web サーバーが 80 番を使用している場合が多いと思うので、Apache は別のポートを指定する (ここでは 8080 とした)。
# ./installFMS

Copyright(C) 1993-2011 Adobe Systems Incorporated. All rights reserved.

Adobe Flash Media Server 4.5 for Linux

Adobe Flash Media Server 4.5 will be installed on this machine.

You will be asked a series of questions during the install
process and will be presented with the defaults for these questions.

Support is available at http://www.adobe.com/go/flashmediaserver_en

To install Adobe Flash Media Server now, press ENTER.

To cancel the installation at any time, press Control-C.

(<ENTER> キー)
ADOBE FLASH MEDIA SERVER

End User License Agreement

NOTICE TO USER: THIS END USER LICENSE AGREEMENT (?AGREEMENT?) GOVERNS INSTALLATION AND USE BY LICENSEES OF THE ADOBE SOFTWARE DESCRIBED HEREIN...

Do you agree with the license agreement? (y/n): y

Please enter your Adobe Flash Media Server 4.5 serial number.

(<ENTER> キー)
You have not entered a serial number. Falling back to
the Adobe Flash Media Development Server!

Would you like to try again? y/n: Default [n]: (<ENTER> キー)

Adobe Flash Media Server 4.5 requires approximately 200MB of
disk space.

The installer will install Adobe Flash Media Server 4.5 in the
following directory
Default [/opt/adobe/fms]: (<ENTER> キー)


The Adobe Flash Media Server communicates on the IANA-assigned
port of 1935, which is the port most Flash applications expect,
and can also communicate on port 80
over RTMPT, HTTP webserver proxy, and for HTTP Dynamic Streaming origin services.

Please enter the Adobe Flash Media Server port(s), comma-separated
Default [1935,80]: 1935,8080

Please enter the port to use for the Admin service. You can only specify one
admin port.
Default [1111]: (<ENTER> キー)


The administrative user name and password you provide here is required to use
the Adobe Flash Media Server Management Console for
administration, monitoring, and debugging.

Please enter the administrative username: admin

For increased security, enter a password of at least 8 characters.
Please enter the administrative password: (パスワード入力)
Confirm password: (再入力)


When the Adobe Flash Media Server service is started, the service
can be run as a user other than "root". The server would change to this user
when the server is started and has acquired its ports.

Please enter the user that the Adobe Flash Media Server service will run as
Default user [fms]: (<ENTER> キー)

Please enter a valid user group for the "fms" user: Default group [fms]: (<ENTER> キー)


Do you want to install apache? (y/n)
Default [y]: (<ENTER> キー)



Apache is started as root but once it has acquired its port it starts the worker
processes as a non-priviledged user.

Please enter the user that Apache will eventually run as.
Default user [fms]: (<ENTER> キー)


Do you want the Adobe Flash Media Server service to run as a
daemon? (y/n)
Default [y]: (<ENTER> キー)


Do you want to start the Adobe Flash Media Server
after the installation is done? (y/n)
Default [y]: (<ENTER> キー)
  :
うまくインストールされていれば、http://(サーバー名):8134/ で Start Screen を表示できる。
(なぜ 8080 ではなく 8134 なのかは不明)
インストール #25

動画が再生されれば正常インストールされている。
posted by K/I at 19:52 | 東京 ☁ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2012年09月11日

Adobe Flash Media Server のインストール (Windows 7)

Adobe Flash Media Server をインストールしてみた。
これを使用すれば、保存してある動画をオンデマンド配信したりライブ映像を配信したりすることができる。

今回インストールしたバージョンは Flash Media Development Server 4.5。
このバージョンは機能に制約がある無料バージョン (トライアルという位置づけ) である。

必要なスペックは、
Windows
  • 3.2GHz Intel® Pentium® 4 processor (dual Intel Xeon® or faster recommended)
  • Microsoft® Windows Server® 2008 R2 (64 bit) or Windows® 7 (32 bit; for Adobe® Flash® Media Development Server only)
  • 64-bit operating systems: 4GB of RAM (8GB recommended)
  • 1Gb Ethernet card recommended (multiple network cards and 10Gb also supported)
Linux
  • 3.2GHz Intel Pentium 4 processor (dual Intel Xeon or faster recommended)
  • Red Hat® Enterprise Linux® Server 5.5 (64 bit) or Linux CentOS 5.5 (64 bit)
  • 64-bit operating systems: 4GB of RAM (8GB recommended)
  • 1Gb Ethernet card recommended (multiple network cards and 10Gb also supported)
64bit OS が手元に無かったので、今回は必然的に Windows 7 に Development Servrer をインストールする選択肢となった。

1. インストーラーのダウンロード

まず、Adobeサイトから、インストーラーをダウンロードする。
インストール #1

インストール #2

インストール #3

インストール #4

インストール #5

2. インストールの実行

ダウンロードしたZIPファイルを開くと以下のように展開される。
インストール #6

Windowsフォルダー内の FlashMediaServer4.5.exe が32bit版のインストーラーらしい。
インストール #7

インストール #8

インストール #9

シリアル番号の入力を求められるが、何も入力しなければ Adobe Flash Media Develpment Server がインストールされる。
インストール #10

インストール #11

インストール #12

RTMP 経由ではなく、HTTP 経由でストリーミング配信したい場合は Apache 2.2 もインストールする (モジュール f4fhttp_module, jithttp_module, hlshttp_module がインストールされる)。
インストール #13

インストール #14

管理者のユーザー名とパスワードを入力。
Administration Console でログインするときに使うもの。
インストール #15

インストール #16

すでにポート 80 が使われている場合は、使われていないポート番号を指定する。
これが RTMPT と HTTP で使うポートになるらしい。
ポート 1935 のほうは変更するとたいへんだと書かれているので、たとえば 80 → 8080 に変更するなら 1935,8080。
インストール #17

インストール #18

インストール #19

ファイアウォールの設定ダイアログが表示された。
インストール #20

インストール #21

インストール完了するとブラウザーが開き、Server Start Screen と Administration Console が表示される。
インストール #22

インストール #23

Administration Console で、[Server Address] に "localhost"、[Username] と [Password] にインストール時に設定したユーザー名とパスワードを入力して [Login] するとコンソールに入れる。
インストール #24

3. インストールの確認

次のいずれかの方法で Start Screen を起動して正常にインストールできたかどうか確認できる。
  • Windows スタートメニューから「Adobe Flash Media Server Start Screen」起動
  • Webブラウザーで (インストール先ディレクトリ)/webroot/index.html を開く (実質、前項と同じ)
  • Apache をインストールした場合は Web ブラウザーで http://localhost にアクセス
Flash Media Server の画面が表示され、動画の再生がはじまる。
動画がはじまらない場合は、右側の "STREAMING" パネルの三角矢印ボタンのどれかをクリックしてみる。
インストール #25

今回はここまで。
posted by K/I at 19:54 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2012年09月06日

Redmineのインストール (Ver.2.x)

以前、Redmine 1.1.2 のインストールメモを書いたけれど、2.x のインストールはあちこち様子が違うのであらためて書いておく。

インストールした環境は、CentOS release 5.7 (Final)
インストールした Redmine のバージョンは 2.0.3

Redmine.JP に掲載されているインストール手順を参考に作業した。
http://redmine.jp/guide/RedmineInstall/

(1) 必要なツール類のインストール

今回は、Ruby をソースからコンパイルすることにした。
Rubyの前に libyaml をインストールしておかないと、Ruby 実行時に YAML ファイルが出力できないという警告がたびたび出てうるさい。
YAML
http://www.yaml.org/
から libyaml を選んでソースをダウンロードし、解凍&インストール。
# wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
# tar zxvf yaml-0.1.4.tar.gz
# cd yaml-0.1.4
# ./configure
# make
# make test
# make install
# cd ..
次に Ruby。
Rubyのサイト:
http://www.ruby-lang.org/ja/
からソースをダウンロードし、解凍&インストール。
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p194.tar.bz2
# tar jxvf ruby-1.9.3-p194.tar.bz2
# cd ruby-1.9.3-p194
# ./configure
# make
# make test
# make install
# cd ..
そして Ruby on Rails と Bundler をインストールする。
# gem install rails
# gem install bundler
※あとで必要パッケージ一を括インストールするので、ここで rails インストールしなくても OK だったかも。

(2) Redmine 用アカウント作成

Redmine 用アカウント redmine を作成。
# useradd redmine

(3) データベースの準備

データベースは今回は MySQL を使用した。
これはめんどうなので yum でインストール。
# yum install mysql-server mysql mysql-devel
Redmine 用のデータベースとユーザーを作成。
# mysql -u root -p
Enter password: XXXXX
mysql> create database redmine character set utf8;
mysql> create user 'redmine'@'localhost' identified by 'XXXXX';
mysql> grant all privileges on redmine.* to 'redmine'@'localhost';

(4) Redmine のインストール

ソースファイルのダウンロードまたはSVNレポジトリからチェックアウトし、インストール先に設置する。
今回は /usr/local/redmine にした。
# svn checkout http://redmine.rubyforge.org/svn/branches/2.0-stable /user/local/redmine
/usr/local/redmine ディレクトリに移り、Bundler で必要な gem を一括インストール。
# cd /usr/local/redmine
# bundle install --without development test postgresql sqlite
必要なバージョンの ImageMagick がインストールされていないと rmagick に関するエラーが表示される。
その場合は、
# bundle install --without development test postgresql sqlite rmagick
とする。

(5) セッションストア秘密鍵の生成

redmine アカウントでログインし、セッションストア秘密鍵を生成する。
# rake generate_secret_token
これにより、config/initializers/secret_token.rb が作られる。

(6) テーブル作成

config/database.yml.example を config/database.yml にコピーし、production: のところの内容を変更する。
production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: redmine のパスワード
encoding: utf8
そして、以下のコマンドを実行:
# cd /usr/local/redmine
# RAILS_ENV=production rake db:migrate
redmine データベース内にテーブル等が作られる。

もし、openssl が load できない、というエラーが出たら、Ruby ソース内の openssl 拡張をインストールする。
# cd ruby-1.9.3-p194/ext/openssl
# ruby extconf.rb
# make
# make install
(参考サイト: CentOS 5.2 に rails 環境を構築する)

(7) 動作確認

以下のディレクトリは redmine アカウントが読み書き可能にしておく。
# cd /usr/local/redmine
# mkdir tmp public/plugin_assets
# sudo chown -R redmine:redmine files log tmp public/plugin_assets
# sudo chmod -R 755 files log tmp public/plugin_assets

以下のコマンドを実行してWebサーバーを起動:
# ruby script/rails server webrick -e production
http://localhost:3000/ にアクセスして Welcome 画面が表示されるか確認する。

(8) Passenger (mod_rails) を導入

Redmin.JP サイトに webrick は「開発用」なので「動作確認以外には使用するな」という脅し文句が書かれているので、Passenger をインストールしてみる。
まずは、必要なパッケージをインストール。
# gem install fastthread daemons passenger
場合によってはほかのパッケージが必要かもしれない。
Passenger Apache 2モジュールのインストーラーを実行。
# passenger-install-apache2-module
もし足りないライブラリーやツールがあると、インストール方法を丁寧に教えてくれるのがありがたい。
提示されたコマンドを実行した後に再度実行。
いろいろ表示されるが、最後に Apache の設定ファイルに追加する設定を示してくれる。
ほんと、ありがたい。
たとえばこんな感じ:
LoadModule passenger_module /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.17/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.17
PassengerRuby /usr/local/bin/ruby
これで、Apache に Passenger モジュールがインストールされ、Rails アプリが実行できるようになる。
Redmine を実行させるには、たとえば、
RailsBaseURI /redmine
RailsEnv production
という設定を追加し、DocumentRoot に Redmine の public ディレクトリをシンボリックリンクしてあげる。
たとえば:
# ln -s /usr/local/redmine/public /var/www/html/redmine
そして、Redmine ディレクトリのオーナーを apache:apache に変更。
# chown -R apache: /usr/local/redmine
これで http://(ホスト名)/redmine で Redmine にアクセスできるようになる。
posted by K/I at 23:16 | 東京 ☁ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2012年02月12日

Movable Typeでのログイン機能実装

MovableTypeでログイン機能を実装する方法を考える。
ブログ記事管理を通常の MT 管理画面上でいつもどおりに行えるようにしたい。
つまり、MT 管理画面上での:
  • ブログ記事の投稿や変更
  • テンプレートの改変
が公開される記事に反映されるようにしたい。

いろいろな方法があると思うが、以下のような仕組みを考えた:
  • ログインが必要なコンテンツは、別ブログに分ける。
  • ブログ記事、ウェブページはウェブ上に公開されない場所に保存させる。
  • ブログ記事は PHP スクリプトから読み出して表示させる。
     (PHP スクリプト上でユーザー認証を行うことで、ログイン機能を実現)
  • PHP 用のテンプレートはウェブページで作成する。
     (ウェブページのデザインテンプレートでデザインを変更できる)

以下、具体的な方法を説明する。

使用した MT バージョンは 5.12-ja。

ブログの作成

ログインを必要とするコンテンツ用のブログを作成する。
その際、[ブログパス] は [絶対パス] にチェックを入れ、ウェブ上に公開されないパスを指定する。

ブログの設定で、
「全般設定」
  • 「アーカイブ設定」-> [ファイルの拡張子] を "tpl" に変更 (これは好みに応じて)
「投稿設定」
  • 「作成の既定値」-> [テキストフォーマット] を "なし" に変更
とする。

デザインテンプレート整備

デザインの「ブログテンプレートの管理」画面で、以下のような設定を行う。
ウェブページテンプレート改変
アーカイブテンプレートの「ウェブページ」テンプレートを改変する。

ウェブページは PHP のデザインテンプレートとして使用するため、ところどころ PHP コードに置き換える必要がある。
ページタイトル
<title><$mt:PageTitle encode_html="1"$> - <$mt:BlogName encode_html="1"$></title>
の部分は記事ごとに変える必要があるので、たとえば
<title><?php echo htmlspecialchars($page_title); ?> - <$mt:BlogName encode_html="1"$></title>
のようにする。

PHP のデザインテンプレートは「ブログ記事」「カテゴリページ」など複数用意することになるので、「ウェブページ」テンプレートはそれらに共通して使えるようにする。
ブログ記事テンプレート改変
アーカイブテンプレートの「ブログ記事」テンプレートを改変する。

ブログ記事は PHP スクリプトから読み出される記事データベース的役割をする。
そのため、読み出しに適した単純な書式で各記事詳細を書き込むようにする。
たとえば:
<$mt:CategoryLabel$>
<$mt:EntryTitle$>
<$mt:EntryDate$>
<$mt:EntryBody$>
など。
今回は議論しないがコメントとタグもブログ記事に書き出すようにする。

また、ブログ記事の URL から記事 ID がわかるように、アーカイブマッピングで [パス] のファイル名部分を %-f から <$MTEntryID$>.html に変更する。
ブログ記事リストテンプレート改変
カテゴリ別や月別のブログ記事リストのテンプレートを改変する。

ブログ記事リストも PHP から読み出されるので、読み出しに適した書式にする。
たとえば:
<mt:Entries limit="$limit">
<$MTEntryDate format="%Y/%m"$>/<$MTEntryID$>:<$MTEntryTitle$>
</mt:Entries>
などとする。

また、アーカイブマッピングの [パス] で、
  • %iindex.html に、
  • %-c%c に、
  • 拡張子を .tpl から .html に、
変更する。
カテゴリリストテンプレート追加
アーカイブテンプレートに、カテゴリリストを出力する「ブログ記事リスト」を追加する。

たとえば、
<MTCategories>
<$MTCategoryBasename$>:<$MTCategoryLabel$>
</MTCategories>
など。

これは、メインインデックスを出力する際に使用する。
インデックステンプレート変更
メインインデックスは直接アクセスしないので削除する。
JavaScript、CSS は [パス] に絶対パスを指定する。
ほか、不要な物は削除。

ウェブページで PHP テンプレート作成

たとえば、以下のようなテンプレートをウェブページとして作成する。
ログイン画面用テンプレート
ファイル名: login.tpl
<h2>ログイン</h2>
<form name="form1" action="/members/index.html" method="post">
<table>
<tr>
<td>メールアドレス</td>
<td><input type="text" name="li_mail" value="<?php echo htmlspecialchars($mail); ?>"/></td>
</tr>
<tr>
<td>パスワード</td>
<td><input type="password" name="li_passwd" value=""/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="ログイン" /></td>
</tr>
</table>
</form>
メインインデックス用テンプレート
ファイル名: index.tpl
<h2>会員用ページ</h2>
<div class="members">
<?php
foreach ($categories as $category) {
?>
<div><a href="<?php echo htmlspecialchars($category['basename']); ?>/"><?php echo htmlspecialchars($category['label']); ?></a></div>
<?php
}
?>
</div>
カテゴリ別ブログ記事リスト用テンプレート
ファイル名: category.tpl
<h2><?php echo htmlspecialchars($category_label); ?></h2>
<div class="members">
<?php
foreach ($entries as $entry) {
?>
<div><a href="<?php echo htmlspecialchars($entry['path']); ?>.html"><?php echo htmlspecialchars($entry['title']); ?></a></div>
<?php
}
?>
</div>

PHPスクリプトの作成

ページを表示するための PHP スクリプトを用意する。
PHP スクリプトは、記事IDまたはカテゴリIDからブログ記事ファイルのパスを決定し、ファイルの内容を読み出し、デザインテンプレートを選んで表示する処理を行う。

以下の PHP コードはその一例で、view.php というファイル名で対象パス (DocumentRoot/members など) に置く。
<?php
/**
* ページ表示
*
* 入力パラメータ
* c -- 'index' / カテゴリのベースネーム
* y -- 記事年
* m -- 記事月
* e -- 記事番号
* 組み合わせは以下のいずれか
* view.php?c=index
* view.php?c=cat
* view.php?y=2012&m=01&e=00123
*/
// ブログの [ブログパス] で設定したパスを指定
define('MEMBERS_BASEDIR', '/var/www/members');
if (!auth()) {
require MEMBERS_BASEDIR . '/login.tpl';
exit;
}
// 表示ページの決定
if (isset($_REQUEST['c']) && $_REQUEST['c'] != '') {
$category_basename = $_REQUEST['c'];
}
if (isset($_REQUEST['e']) && $_REQUEST['e'] != ''
&& isset($_REQUEST['m']) && $_REQUEST['m'] != ''
&& isset($_REQUEST['y']) && $_REQUEST['y'] != '') {
$entry_year = $_REQUEST['y'];
$entry_month = $_REQUEST['m'];
$entry_id = $_REQUEST['e'];
if (!preg_match('/^\d{4}$/', $entry_year)) {
echo "ERR(1)";
exit;
}
if (!preg_match('/^\d{2}$/', $entry_month)) {
echo "ERR(1)";
exit;
}
} else {
$entry_year = '';
$entry_month = '';
$entry_id = '';
}
} else {
echo "ERR(2)";
exit;
}
// 記事の内容
if ($entry_id != '') {
// 個別の記事
$entry_fname
= MEMBERS_BASEDIR . "/$entry_year/$entry_month/$entry_id.html";
if (!file_exists($entry_fname)) {
echo "ERR(3)";
exit;
}
if (($fh = fopen($entry_fname, 'r')) === FALSE) {
echo "ERR(4)";
exit;
}
flock($fh, LOCK_SH);
$category_label = trim(fgets($fh));
$entry_title = trim(fgets($fh));
$entry_date = trim(fgets($fh));
$entry_contents = '';
while ($row = fgets($fh)) {
$entry_contents .= $row;
}
fclose($fh);
$page_title = $entry_title;
} else if ($category_basename == 'index') {
// インデックス
$categireis = array();
if (($fh = fopen(MEMBERS_BASEDIR . '/categories', 'r')) === FALSE) {
echo "ERR(5)";
exit;
}
flock($fh, LOCK_SH);
while ($row = fgets($fh)) {
$row = trim($row);
if ($row != '') {
list($cbn, $cl) = explode(':', $row, 2);
$categories[] = array('basename' => $cbn,
'label' => $cl);
}
}
fclose($fh);
$page_title = '会員用ページ';
} else {
// カテゴリ
$categirey_label = '';
if (($fh = fopen(MEMBERS_BASEDIR . '/categories', 'r')) === FALSE) {
echo "ERR(5)";
exit;
}
flock($fh, LOCK_SH);
while ($row = fgets($fh)) {
if (preg_match("/^$category_basename:(.+)$/", $row, $matches)) {
$category_label = $matches[1];
break;
}
}
fclose($fh);
if ($category_label == '') {
echo "ERR(6)";
exit;
}
$entries = array();
if (($fh = fopen(MEMBERS_BASEDIR . "/$category_basename/entries", 'r'))
=== FALSE) {
echo "ERR(7)";
exit;
}
flock($fh, LOCK_SH);
while ($row = fgets($fh)) {
$row = trim($row);
if ($row != '') {
list($p, $t) = explode(':', $row, 2);
$entries[] = array('path' => $p,
'title' => $t);
}
}
fclose($fh);
$page_title = $category_label;
}
if ($entry_id != '') {
require MEMBERS_BASEDIR . '/entry.tpl';
} else if ($category_basename == 'index') {
require MEMBERS_BASEDIR . '/index.tpl';
} else {
require MEMBERS_BASEDIR . '/category.tpl';
}
function auth()
{
// ここで認証処理行う
return TRUE;
}
?>

Rewrite設定

Apache の Rewrite エンジンを利用して、ブログ記事や記事リストへのアクセスを view.php にパラメータをつけて転送する。

設定例:
RewriteEngine On
RewriteRule ^index\.html view.php?c=index [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)\.html view.php?y=$1&m=$2&e=$3 [L]
RewriteRule ^([^/]+)/index\.html view.php?c=$1 [L]

以上で設定は完了。
タグ:MovableType PHP
posted by K/I at 08:55 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2011年12月03日

ApacheのログをMySQLにはき出す

Apacheのログファイルからアクセス解析するツールを作っていたのだが、アクセス数が多いサイトなのでログファイルのファイルサイズが大きく、読み出してデータベースに書き出すだけで一苦労。
何かよい工夫は無いものか。。。
と思っていたら、こんなものがあった。

mod_log_sql
http://www.outoforder.cc/projects/apache/mod_log_sql/

Apache ログを直接 MySQL に書き出してくれるらしいので、導入してみた。
環境は以下のとおり:

OS: CentOS 5.6
Apache: 2.2.3
MySQL: Ver 14.12 Distrib 5.0.77
mod_log_sql: 1.101

1. インストール


ファイルをダウンロード&解凍して configure
で、いきなりつまずいた。

$ ./configure --with-apxs=/usr/sbin/apxs
configure: creating config.nice
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking for Apache 2.0 version >= 2.0.40... yes
checking for floor in -lm... yes
checking for gzclose in -lz... yes
checking for mysql_init in -lmysqlclient... no
configure: error: libmysqlclient is needed for MySQL support


libmysqlclient が見つからないなら、パスを指定して:
$ ./configure --with-apxs=/usr/sbin/apxs --with-mysql=/usr/lib64/mysql
とすればいい、と思ったが状況改善しない。

調べてみたらこんな記事が:
configure: error: libmysqlclient is needed for MySQL support
http://www.webhostingtalk.com/showthread.php?t=519406

言われるままに:
$ ln -s /usr/lib64/mysql /usr/lib/mysql
$ ./configure --with-apxs=/usr/sbin/apxs

としたらうまくいった。

あとはお決まりの:
$ make
# make install

でインストール完了。

2. MySQLデータベースの準備


ログの格納先データベースを準備する。

$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6781031
Server version: 5.0.77-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database apachelogs;
Query OK, 1 row affected (0.09 sec)

mysql> \u apachelogs
Database changed
mysql> \. mod_log_sql-1.101/contrib/create_tables.sql
Query OK, 0 rows affected (0.12 sec)

Query OK, 0 rows affected (0.05 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.10 sec)

Query OK, 0 rows affected (0.01 sec)

mysql> SHOW TABLES;
+----------------------+
| Tables_in_apachelogs |
+----------------------+
| access_log |
| cookies |
| headers_in |
| headers_out |
| notes |
+----------------------+
5 rows in set (0.00 sec)

mysql> CREATE USER apachelogs_user IDENTIFIED BY 'XXXXXXXXXX';
Query OK, 0 rows affected (0.60 sec)

mysql> GRANT INSERT ON apachelogs.* TO 'apachelogs_user'@'localhost'
Query OK, 0 rows affected (0.45 sec)


3. Apache の設定


データベースの準備ができたら、次は Apache の設定。

LoadModule log_sql_module modules/mod_log_sql.so
LoadModule log_sql_mysql_module modules/mod_log_sql_mysql.so
LogSQLLoginInfo mysql://apachelogs_user:XXXXXXXXXX@localhost/apachelogs

<VirtualHost aaa.bbb.ccc.ddd:80>
ServerName www.xxx.yyy
LogSQLTransferLogTable access_log
CustomLog logs/access_log combined
ErrorLog logs/error_log
</VirtualHost>


バーチャルホストごとに書出し先テーブルを指定できるようになっている。

Apache を再起動。

# service httpd graceful

設定が反映される。
ログは、ログファイルとデータベースの両方にはき出される。
posted by K/I at 20:31 | 東京 ☁ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする