κeenのHappy Hacκing Blog | Lispエイリアンの狂想曲

ここ1ヶ月くらいの近況

#isucon 参戦記がフォロワーの多い@tagomorisさんとか@nitro_idiotさんとかにツイートされて普段の数十倍のアクセスが来てテンション上がったので近況書きますね。

isuconの勉強

件の記事でも書いてますけどMySQLとNginXとCapistranoの勉強しました。SQLって書けると案外楽しいですね。あとN+1問題を学んだり、IF EXISTS TRRIGER的な文がなくて殺そうかと思ったり。

NginXはキャッシュとかですね。キャッシュキーに$cookie_isucon_sessionとか入れてログインしてるユーザーが来ても対応できたので良かったです(小並感

Capistranoはどうせだからと3.0を使ったのですが調べても2.x時代の情報ばっかり引っ掛かって苦労しました。その代わり、isucon本戦では複数サーバーへのデプロイ機能を存分に使わせて頂きました。ほぼログインしなくても問題ないですね。

例えば

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
set :application, 'my app'
set :repo_url, 'git@bitbucket.org:me/myrepo.git'
set :deploy_to, '/home/me/app'
set :scm, :git
set :deploy_via, :remote_cache


namespace :nginx do
 task :reload do
 on roles(:web) do
 execute :sudo, 'service nginx reload'
 end
 end

 task :restart do
 on roles(:web) do
 execute :sudo, 'service nginx restart'
 end
 end

 task :start do
 on roles(:web) do
 execute :sudo, 'service nginx start'
 end
 end
end

こんな感じです。で、もう一つ

1
2
3
4
5
6
7
8
9
set :stage, :production
server '123.4.5.67', user: 'me', roles: 'web'
server '123.4.5.68', user: 'me', roles: 'web'
server '123.4.5.69', user: 'me', roles: 'web'
set :ssh_options, {
 keys: %w(~/.ssh/id_rsa),
 forward_agent: true,
 auth_methods: %w(publickey)
}

を書いておけばこの3台のサーバーに一斉にデプロイしてくれます。(上の例だとnginxですが、まあいいでしょう。)

Shibuya.lisp

Lisp Meet Up #10で発表してきました。内容はfluentdをCommon Lispから使う話。
スライド

Common Lisp でビッグデータを作ろう from blackenedgold

Ustreamは見つかりませんでした。てへペロ

恐らく、Log4CLはやりたいことと目的が違いますね。全く別のロギングフレームワークを作るのが良さげな気がします。isuconの懇親会で開発者の@tagomorisさんにアドバイスも頂きましたし作るかもしれません。

mpd

以前、mplayer2が正常に動作しないとかぼやいてましたが、結局あきらめました。で、代わりに Music Player Daemon(MPD)なるものを見付けて、しかもRaspberry Piで動き、iPod/Androidから操作できるとのことで、導入しました。

MPDはまさしくRaspberry Piのような機器向で、音楽を鳴らすサーバーと操作するクライアントが完全に分かれてます。

$ sudo apg-get install mpd mpc

とかでRSPiに入れた気がします。クライアントはAndroidはMPDroid、iPodはMPoDっていうアプリです。

scpで手元の曲をRSPiコピーし、iPodから繋ぐも曲が見えない。色々試した結果、scpでコピーしたときにパーミッションの問題が出てたようなのでそこを解決したらちゃんと動きました。

動画(iPod)

黒ばっかで見づらくて申し訳ありません。iPodからではなくスピーカから音が出てるのが分かりますかね?思ったより音が入ってないので分りづらいですね(汗

CIM

Shellyを使って Common Lispスクリプトをexecutableにしようってのをやってましたが少しshellyが求めているのと違うようだったので「シェルスクリプトでshelly的な物を実装しよう!ついでにrvmみたいにバージョン管理できたら嬉しいな!!」って思い付きで Common Lisp Implementation Manager(CIM)を作り始めました。まだCLISP, ECL, GCLのインストールぐらいしかできてません。

初めてシェルスクリプトを書き、初めてBourne Shellを触り(普段はzsh)、早くも挫折しそうです。今めっちゃシェルスクリプトの勉強してます。目的はImplementationの管理じゃなくて統一インターフェースのclコマンドなのにそこが全然進んでないですね。qlに至っては1行も書いてない。まあ、clを使って書くつもりなのでclが出来ないことにはどうしようもないんですが。

sysetとかネーミングセンスが無かったり(発音しずらい。シセット…サイセットって読もうかな)ダウンロードしたアーカイブのチェックサムとか全く見てなかったり色々ツッコみたくなりますが温かい目で見て下さい。気に入ったらpull-reqとかして下さい。

Octomacs

Octomacsに一回pull-req送ってからコミッタ気取りのκeenですが、octomacs-previewoctomacs-deployを実装しました。C-uをつけるとgenerateが付いてきます。テストをしてない(できない?)+サーバーを殺す(octomacs-preview-quitとかの名前かなあ。現状は*octomacs preview*バッファをkill-bufferすればいい)コマンドを実装してないのでpull-reqは投げてませんが使ってみたい方は こちらをどうぞ。まあ、今からpushするんですがね。ちゃんとこの記事もoctomacs-new-postから始まり、octomacs-previewで確認しつつoctomacs-deployでデプロイしました。あとは過去の記事を編集するoctomacs-editを実装すれば完璧ですね。

こんなかんじです。CIMがんばります。

Written by κeen