第50回PHP勉強会@関東

今回は株式会社コンテンツワンにて開催されました。(多謝
とってもご近所。なので参加。

テーマはOpenSocialで、第50回という記念もあってか、錚々たるメンバーが集ってました。

内容は

  • mixiアプリケーションについて@mixiアプリ(モバイル)の中の人
  • PHPでつくるソーシャルアプリ@今回のテーマの言い出しっぺな人っぽい人
  • ソーシャルアプリを運用してみての感想やら体験談@ウノウの人

非公開的な内容もあったので、おそらくメインであろうmixiの中の人の話はust配信されませんでしたが、結構充実した内容でした。
良い刺激になったので、資料をまとめて会社の人にもちょっとだけでも刺激を与えればいいなぁ。

次もコンテンツワンさんであれば、会社からも近いので社内の人を誘っていければいいなぁと思ったり。

kumofsのインストール

大体はkumofsを使う(さくらインターネット創業日記)を参考にしながら進めればOK

インストールに必要な情報は公式ドキュメントに記載されているので、そちらを参考にする

必要なライブラリのインストール

CentOSの場合
sudo yum install libtool openssl-devel bzip2-devel
Ubuntuの場合
sudo aptitude install libtool libssl-dev libbzip-dev

Rubyの準備

配布元

tar zxf ruby-1.8.7-p249.tar.gz
cd ruby-1.8.7-p249
./configure --prefix=/usr/local/ruby/1.8.7-p249
make
sudo make install
cd /usr/local/ruby
sudo ln -s 1.8.7-p249 default

MessagePack for Rubyをgemから入れる

tar zxf rubygems-1.3.5.tgz
cd rubygems-1.3.5
/usr/local/ruby/default/bin/ruby setup.rb
sudo /usr/local/ruby/default/bin/gem install messagepack

MessagePack for C++のインストール

配布元

tar zxf msgpack-0.4.1.tar.gz
cd msgpack-0.4.1
./configure --prefix=/usr/local/msgpack/0.4.1
make
sudo make install
cd /usr/local/msgpack
sudo ln -s 0.4.1 default

TokyoCabinetのインストール

配布元

tar zxf tokyocabinet-1.4.42.tar.gz
cd tokyocabinet-1.4.42
./configure --prefix=/usr/local/tokyocabinet/1.4.42
make
make check
sudo make install
cd /usr/local/tokyocabinet
sudo ln -s 1.4.42 default

kumofsのインストール

配布元

tar zxf kumofs-0.3.1.tar.gz
cd kumofs-0.3.1
./configure --prefix=/usr/local/kumofs/0.3.1 \
--with-msgpack=/usr/local/msgpack/default \
--with-tokyocabinet=/usr/local/tokyocabinet/default
make
sudo make install
cd /usr/local/kumofs
ln -s 0.3.1 default

kumofsの起動

公式ドキュメントチュートリアルの項があるのでそこを参考にすれば大丈夫だが、起動の際に「libtokyocabinet.so.9がない」と怒られることがある。
その時はTCのライブラリへのパスをLD_LIBRARY_PATHに設定する必要がある。*1

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/tokyocabinet/default/lib

毎回は面倒なので.bashrcや.zshenvなどに入れておく

*1:今回の例の場合は必須

Synergyクライアントの自動起動

KDMの各起動スクリプトの末尾に下記の記述を加える。

# /etc/kde4/kdm/Xsetup
SYNERGYC='/usr/bin/synergyc'
if [ -x $SYNERGYC ]; then
  /usr/bin/killall synergyc
  sleep 1
  $SYNERGYC <synergy server ip>
fi

# /etc/kde4/kdm/Xstartup
SYNERGYC='/usr/bin/synergyc'
if [ -x $SYNERGYC ]; then
  /usr/bin/killall synergyc
  sleep 1
fi

# /etc/kde4/kdm/Xsession
SYNERGYC='/usr/bin/synergyc'
if [ -x $SYNERGYC ]; then
  /usr/bin/killall synergyc
  sleep 1
  $SYNERGYC <synergy server ip>
fi

Twitterをmixiボイスに同期する

iPhoneからついったーを利用するほうが多いし、わざわざmixiボイスだけにポストすることはないので、同時にできないものかと思った。

やっぱりみんなやっているようで

とりあえずそのまま利用していたんだけど、どうやらこの前のDNS攻撃のときにハングしたみたいで、そしたら同じつぶやきを毎回ポストするようになってしまった。
原因はポストしたやつを記録しておくファイルがデッドロック状態になって、最新のものがずっと更新されないという状態になってしまったこと。

そこでスクリプトを読んでみたら、危なっかしい記述が多かったので作り直してみた。


t2m.rb 直

# vim:set encoding=utf-8 et ts=2 sts=2 sw=2:
#
#= ついったーとmixiボイスを同期する
#
require "rubygems"
require "mechanize"
require "rubytter"

# mixiのログイン情報
mixi_id     = "mixi"
mixi_passwd = "password"

# ついったーのログイン情報
twitter_id     = "twitter"
twitter_passwd = "password"

# mixiにログイン
agent = WWW::Mechanize.new
page = agent.get("http://mixi.jp/")
form = page.forms.first
form["email"] = mixi_id
form["password"] = mixi_passwd
form.submit

# mixiボイスの投稿フォームを取得
page = agent.get("http://mixi.jp/recent_echo.pl")
form = nil
page.forms.each do |f|
  if f.action =~ %r!/add_echo.pl$!
    form = f
    break
  end
end

# ついったーから最新の発言を取得
tweets = []
Rubytter.new(twitter_id,twitter_passwd).user_timeline(twitter_id).each do |t|
  tweets << t.text.tr("\n"," ")
end

# ポスト済のログファイルを読み込んで書き込み済のものを排除
posted_log_file = File.expand_path("posted.log", File.dirname(__FILE__))
posted = []
if File.exist?(posted_log_file)
  open(posted_log_file, "r"){|f| posted = f.readlines}
end

posts = tweets.dup
posted.each do |p|
  posts.delete(p.chop)
end

exit if posts.empty?

# ログファイルを更新
open(posted_log_file, "w"){|f| f.puts tweets.join("\n")}

# mixiボイスへの投稿
posts.reverse.each do |p|
 form["body"] = p
 form.submit
end

Sambaで絶対にマスターにしたくないときの設定

SambaはデフォルトでWindowsよりも優位に立って、マスタになろうとする設定になっているので、こっそり自分のPCで使うときは気をつけよう。

そこで、絶対にマスタにしたくないときの設定は、Samba HOWTO集 - Chapter10. Network Browsing - Configure WORKGROUP BrowsingのExample 10.3. smb.conf for not being a Master Browserになる。

[global]
domain master = no
local master = no
preferred master = no
os level = 0

Gnome-RDPを使う

rdesktopだけだと、ホストを管理するのがめんどうだったので、GUIツールを探してみた。
grdesktopはバグで設定が保存されなくて、grdpはフルスクリーンとか、キーマップの変更に対応してなかったので、gnome-rdpを選択した。

sudo aptitude install gnome-rdp

クライアントをUSマップにしている場合、en-usだと日本語モードがなくなり、jaだとマップがおかしくなるので、rdesktopのキーバインド - 狐の王国を参考にして、以下の3行を追加

# /usr/share/rdesktop/keymaps/ja-us
map 0xe0010411
Kanji 0x29
Alt_R 0x38

しかしGnome-RDPはキーマップを標準のものからしか選択できないので、設定値を無理矢理変更する。

sqlite3 ~/.gnome-rdp.db
sqlite> update session set keyboardlang = 'ja-us';
sqlite> .quit

Viewで使える特殊変数のまとめ

編集名 説明
$sf_context sfContextのインスタンス
$sf_request sfRequestのインスタンス
$sf_params sfRequest->getParameterHolder()で得られるオブジェクト
$sf_user sfUserのインスタンス
$sf_data テンプレートに渡した編集をエスケープしたり、そのまま出力したりするオブジェクト
$sf_data->get('foo') escape
$sf_data->getRaw('foo') non escape