Browse Month: November 2011

Growl 1.3 を無料でインストールする方法

Growl 1.3 になってから、有料(現在日本円だと 170 円)になって App Store から購入することができるわけですが、Growl 1.3をビルドしてインストールする – DiaryExceptionに書かれているとおり、なんと自分でビルドすると無料でインストールすることができるらしいので、さっそくやってみました。

まずは、hg をインストールします。

$ brew install python
$ easy_install Mercurial

Grow のソースコードを入手します。

$ hg clone https://code.google.com/p/growl/

Grow のビルドの準備を開始します。

$ cd growl
$ export BUILT_PRODUCTS_DIR=`pwd`
$ ./generateHgRevision.sh

GrowlVersion.h を、次のように変更します。

7c7
< #include "hgRevision.h" --- > #include "include/hgRevision.h"

そうすると、include/hgRevision.h が生成されて、次のような内容になります。

#define HG_REVISION 5809
#define HG_REVISION_STRING "5809"

あとは、XCode を開いて、次の手順でビルドするだけです。

  1. Xcode 4.2 で Growl.xcodeproj を開く
  2. ビルドターゲット を Growl.app にセットする
  3. Project: Growl と Targets:Growl.app の「Code Signing Identity」を「Don’t Code Sign」に設定する

ビルドしたら、Products にある Growl.app をアプリケーションディレクトリにコピーするだけです。念のため、前のバージョンがインストールされているときは、Release/Uninstall Growl.app を実行してアンインストールしておくといいでしょう。

 

Growl のバージョン情報を見ると 1.3 になっているわけですが、App Store にある Grow のバージョンは 1.3.1 となっています。一瞬古いバージョンなのかなと思ったんですが、hg のバージョンを埋め込むようにしたあと変更されたようです。興味のあるの人は、GrowlVersion.sh の変更履歴を参照するといいと思います。

この方法なら、Growl のソースコードが公開されている限り、自分でビルドすればいいですね!

 

RRDtool ハッカソン #1(案)

ふと思いつきなのですが、みんな大好き RRDtool ハッカソン的なものをやろうかなと模索中しています。

今のところ、各自あるいはペア・グループ単位で、次のようなことをやろうかなと思っています。ようは RRDtool についてみんなで勉強しましょうね的な会です。

かなりマニアックなハッカソンというか、勉強会チックなものなので、数人希望がいるようであれば、次の予定ぐらいでゆるく開催したいと思います。

  • 時期:2012年1月下旬〜2月くらいの予定、土日祝の午後半日程度予定(平日の夜でもいいかもしれないけれど、時間が短くなるので)
  • 場所:東京都内(たぶん、渋谷・新宿近郊あたりになるかと思いますが、有料の場所を使う可能性がありますがそのときは会場費がかかってしまいます、参加者の皆さんと相談したいと思います)
  • 内容:RRDtool に関して自分の好きなことを各自あるいはペア・グループ単位で、上の内容でもよいし、好きなことをやる

ちなみに僕は RRDtool に関してまったくの初心者なので、安心してくださいw。RRDtool を使っているグラフツールを使っている 1 ユーザですので^^。

今までなかなか RRDtool 参加希望したいという方は、ブクマ・ツイッターなどでゆるく表明していただければと思います。5人ぐらいいたら開催しようと思います。

CDH2 から CDH3u2 にアップデートしてみた

CDH2 から CDH3 Update 2 からのアップデートしてみましたので、簡単にその方法を紹介します。本番環境でアップデートするのに要した時間は、約 1 時間くらいです。

公式ドキュメントはここにあります。

まず、CDH3 ではユーザまわりの変更が入っています。

CDH3 でのユーザアカウントの変更

  •  hdfs: NameNode, DataNodes, Secondary NameNode(従来の hadoop ユーザにあたります、CDH3 にアップデートすると自動的に hadoop ユーザが hdfs ユーザに変更されるので注意してください)
  • mapred: JobTracker and TaskTrackers(JobTracker と TaskTracker 用に追加された新しいユーザになります)

ローカルファイルシステムのディレクトリオーナー

  • dfs.name.dir: hdfs:hadoop 700
  • dfs.data.dir: hdfs:hadoop 700
  • mapred.local.dir: mapred:hadoop 755
  • HADOOP_LOG_DIR: anyuser:hadoop 775

HDFS 上のディレクトリオーナーの変更

  • mapred.system.dir: mapred:hadoop 700
  • / (root directory): hdfs:hadoop 755

Step1: アップグレードする前の準備
1. すべての Hadoop サービスをシャットダウンします

$ sudo -u hadoop /usr/lib/hadoop-0.20/bin/stop-all.sh

2. hadoop ユーザのプロセスがないことを動いていないことを確認します

$ sudo su hadoop -s /bin/bash -c "jps"

3. NameNode マシン上の HDFS メタデータをバックアップします
SecondaryNode がある場合は、NameNode のおメタデータをバックアップしているためスキップしても大丈夫だと思います
メタデータをバックアップするために、dfs.name.dir の場所を確認します

$ grep -C1 dfs.name.dir /etc/hadoop/conf/hdfs-site.xml

dfs.name.dir
/var/lib/hadoop-0.20/cache/hadoop/dfs/name
$ cd /var/lib/hadoop-0.20/cache/hadoop/dfs/name
$ sudo tar -cvf /root/nn_backup_data.tar .

Step2: Hadoop のコアパッケージ hadoop-0.20 のアップグレード

1. local yum repostiory 設定で、CDH2 から CDH3 に切り替えます

2. すべての Hadoop クラスターのホストにおいて、パッケージのアップグレードする

$ sudo yum upgrade hadoop-0.20*
Hadoop version 0.20.1+169.127-1 -> 0.20.2+923.142-1 になる(2011/11/15 時点)

その他必要なパッケージを、それぞれのホストにインストールします

  • NameNode: hadoop-0.20-namenode, hadoop-0.20-jobtracker
  • Secondary NameNode: hadoop-0.20-secondarynamenode
  • Slave: hadoop-0.20-datanode, hadoop-0.20-tasktracker

3. hadoop-env.sh の HADOOP_MASTER 環境変数を確認します(僕の環境の場合、設定がなかったのでスキップしました)

4. Hadoop システムアカウントを確認します

$ id hdfs
$ id mapred

hadoop ユーザは削除されるので注意します

5. HDFS データのオーナーを確認します
hdfs-site.xml の dfs.name.dir, dfs.data.dir の設定を確認します
dfs.data.dir の設定がない場合は、hdfs-site.xml に追加します

hdfs-site.xml の設定が変わるので注意しましょう。hadoop-0.20-conf-pseudo をインストールして、その設定ファイルをベースに設定するといいと思います。また、hadoop-0.20-dfs.data.dir の設定が hdfs-site.xml に存在しないと CDH3 はシャットダウンしてしまうらしいので注意しましょう


$ ls -ld /var/lib/hadoop-0.20/cache/hadoop/dfs/name
drwxr-xr-x 4 hdfs hadoop 4096 Nov 6 16:49 /var/lib/hadoop-0.20/cache/hadoop/dfs/name/

もし、オーナーがおかしければ変更します

$ sudo chown -R hdfs:hadoop /var/lib/hadoop-0.20/cache/hadoop/dfs/name

6. MapReduce のローカルディレクトリのオーナーとパーミッションを変更します

$ ls -ld /var/lib/hadoop-0.20/cache/hadoop/mapred/local
drwxr-xr-x 4 hdfs hadoop 4096 Nov 6 16:38 /var/lib/hadoop-0.20/cache/hadoop/mapred/local/
$ sudo chown -R mapred /var/lib/hadoop-0.20/cache/hadoop/mapred/local

7. すべてのホストのログディレクトリのオーナーとパーミッションを変更します

$ sudo chgrp hadoop /var/log/hadoop-0.20
$ sudo chmod g+w /var/log/hadoop-0.20
$ sudo chown mapred /var/log/hadoop-0.20/userlogs

8. HDFS メタデータをアップグレードします
別のターミナル画面で、NameNode のログを確認しておきます

namenode$ sudo tail -f /var/log/hadoop-0.20/hadoop-hadoop-namenode*

メタデータをアップグレードします

namenode$ sudo /etc/init.d/hadoop-0.20-namenode upgrade

ログで、次のメッセージが表示されると成功したということになります
2011-11-06 17:15:27,390 INFO org.apache.hadoop.hdfs.server.common.Storage: Upgrade of /var/lib/hadoop-0.20/cache/hadoop/dfs/name is complete.
NameNode は、DataNode に接続するまでの間、セーフモードになっているため、注意しましょう(このあと DataNode を開始すると、自動的にセーフモードが解除されます)

9. HDFS を開始します
それぞれのスレーブホストにて、HDFS を開始します

slaveX$ sudo /etc/init.d/hadoop-0.20-datanode start

すこし待って、DataNode のアップグレードが完了すると、次のメッセージが NameNode のログに出力されます

Safe mode will be turned off automatically in X seconds.

DataNode のアップグレードプロスが完了すると、NameNode は自動的にセーフモードを終了して、HDFS は通常のフルオペレーションが可能になります。そのときは、NameNode のログに、次のような内容が出力されます

...
The reported blocks 8 has reached the threshold 0.9990 of total blocks 8. Safe mode will be turned off automatically in X seconds.
...
2011-11-07 18:33:28,009 INFO org.apache.hadoop.hdfs.StateChange: STATE* Leaving safe mode after 137 secs.
...
2011-11-07 18:33:28,009 INFO org.apache.hadoop.hdfs.StateChange: STATE* Safe mode is OFF.
...

Safe Mode 中かどうかは、次のコマンドで確認することができます

namenode$ sudo hadoop dfsadmin -safemode get
Safe mode is OFF

10. HDFS 上の mapred.system.dir ディレクトリのオーナーを変更します
NamaNode に mapred.system.dir の設定がない場合は、hdfs://namenode/var/lib/hadoop-0.20/cache/hadoop/mapred/system になるため、なければ作成します。

namenode$ sudo -u hdfs hadoop fs -chown -R mapred hdfs://namenode/var/lib/hadoop-0.20/cache/hadoop/mapred/system

11. それぞれのホストで、SecondaryNameNode と MapReduce を開始します

secodarynamenode$ sudo /etc/init.d/hadoop-0.20-secondarynamenode start
slaveX$ sudo /etc/init.d/hadoop-0.20-jobtracker start
slaveX$ sudo /etc/init.d/hadoop-0.20-tasktracker start

念のため、プロセスを確認します

$ ps eaf | grep -i job
$ ps eaf | grep -i task

12. 基本的なクラスター操作を確認します
適当なディレクトリを作成します

namenode$ sudo -u hdfs hadoop fs -mkdir /test

HDFS のユーザディレクトリのオーナーを変更してみます

$ sudo -u hdfs hadoop fs -chown joe /user/joe

通常ユーザで計算ジョブを走らせてみます

$ hadoop-0.20 jar /usr/lib/hadoop-0.20/hadoop-0.20.2*examples.jar pi 10 10000

Job Finished in 61.474 seconds
Estimated value of Pi is 3.14120000000000000000

13. HDFS アップグレードを終了させます

namenode$ sudo -u hdfs hadoop dfsadmin -finalizeUpgrade

http://:50070/ の Upgrades 欄を確認して「There are no upgrades in progress.」と表示されていることを確認します。このメッセージが表示されていれば、無事成功したことになります。

その他、実際の運用面では、Hadoop のジョブは、mapred ユーザで実行したほうが楽です。(他のユーザで実行するには、HADOOP_LOG_DIR やその他 Hadoop のディレクトリのパーミッションを変更する必要があります)

すこしだけ、ジョブの実行スピードが速くなったような気がします。

Webサーバ勉強会 #4

Webサーバ勉強会 #4 で、Nginx のコンフィグレーション 1 行目から 24 行目までの説明を話してきました。その他にも当日キャンセルになった fastcgi_conf と mime_types もかなり手抜きですが、取り急ぎまとめて slideshare へアップしておきました。

Nginx は、今まで本番環境では使ったことがないので、かなり設定ファイルが分かりやすいし、かなりの実戦投入している話を聞けたので、とても勉強になりました。

Webサーバ勉強会は、参加者すべて発表しないといけないため、参加人数は少ないですが、発表している中でも、みんなでわいわいとそれぞれの情報を出しあって、わいわいと勉強できるとても緩い勉強会だと思うので、皆さんも機会がありましたら参加してみてください。

postfix on OSX で、gmail 経由でメールを送信する方法

Lion OSX 上で、ウェブアプリケーションを行っていると、メールを送信する機能を作ることがあります。OSX には、すでに postfix が入っているので、MacPorts でインストールする必要はありませんが、最近のプロバイダだと 25 番ポートが閉じられていることが多いので、メールの機能を確認できないことが多いです。

そこで、gmail を利用して、ローカルの OSX からメールを送信する方法を紹介したいと思います。

まず、/etc/postfix/main.cf に、次の設定を追加します。

# gmail
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/Users/naoya/etc/sasl_passwd
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_tls_security_level = secure
smtp_tls_CApath = /Users/naoya/etc/ssl/certs

gmail の 587 番ポート経由でメールを送信する設定になります。

/Users/naoya/etc/sals_password には、次のような感じで gmail アカウント情報を書いておきます。

[smtp.gmail.com]:587 <gmail account>@gmail.com:<password>

gmail アカウント情報を書いたら、postmap コマンドでデータベースを作成します。


$ postmap /Users/naoya/etc/sasl_passwd

次に gmail 経由で認証する場合、次のような認証警告が表示されるので、これを対策します。

Oct 28 18:36:17 localhost postfix/smtp[12237]: certificate verification failed for smtp.gmail.com[74.125.127.108]:587: untrusted issuer /C=US/O=Equifax/OU=Equifax Secure Certificate Authority

gmail の SSL 証明書を確認します。

$ openssl s_client -connect pop.gmail.com:995 -showcerts

上のコマンドを実行すると、SSL 証明書が 2 種類出力されます。CN=Google Internet Authority の方は、/Users/naoya/etc/ssl/certs/gmail.pem、OU=Equifax Secure Certificate Authority の方は /Users/naoya/etc/ssl/certs/equifax.pem として保存します。
そのあと、次のコマンドを実行します。

$ c_rehash /Users/naoya/etc/ssl/certs

最後に、postfix はオンデマンドで起動するようになっているため、常駐起動に切り替える必要があります。
/System/Library/LaunchDaemons/org.postfix.master.plist を編集します。
次の内容を削除します。

<string>-e</string>

<string>60</string>

そして、次の行を追加します。

<key>KeepAlive</key>
<true/>

あとは、postfix を再起動します。

$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.postfix.master.plist
$ sudo launchctl load -w /System/Library/LaunchDaemons/org.postfix.master.plist

これで、mail コマンドで実際のウェブアプリケーションでメールを送信することができるかを確認します。
ログは、/var/log/mail.log に出力されています。

参考ページ