はじめに
開発的お仕事が捗るらしいと聞いて,最近になってようやくIRCというものの利用頻度が上昇し始めた issm です.
IRC関連の各種ツールを使って,外部のサーバが自動的に私の手元に通知を届けるための環境づくりについて少し試してみたので,そのあたりの簡単な記録を残しておきます.
なお,まだまだ不勉強のため,「with SSL」な接続については,本エントリでは触れていません.
目次
こんな感じの構成です:
- IRCクライアント 〜 LimeChat
- オレオレIRCサーバを立てる 〜 ngIRCd
- IRCサーバにつなぎっぱなしにする 〜 Tiarra
- HTTP経由でIRCへ投げる 〜 ikachan
- ikachanサーバへPOSTするためのスクリプト
IRCクライアント 〜 LimeChat
まずはメッセージを受け取るための環境から.
私は LimeChat を使ってます.よく知りませんが,定番のひとつっぽいです.まぁ他のクライアントを使ったことないのですが><
Windows向けだけでなく,for Mac,for iOS もあるので,シーンを選ばずにメッセージを受け取れますね!
- LimeChat
- LimeChat – IRC Client
(iTunes / App Store)
オレオレIRCサーバを立てる 〜 ngIRCd
お仕事なメッセージなど,オープンなサーバで行うのがはばかられる場合には,自分の持っているマシン(自宅サーバとかそういうの)にIRCサーバを立てるのがよいと思います.
「IRC サーバ」とかでググってみたところ,ngIRCd というのがモダンっぽい(?)ので,これを使ってみてます.
Ubuntu の場合,apt で簡単に入れられるので便利です:
% sudo apt-get install ngircd
設定ファイルは /etc/ngircd/ngircd.conf にあります.
[Global]
...
Name = irc.example.com
...
;Password = hogehoge
...
;Ports = 6667
...Name はもちろんのこと,Password を設定したり Ports を変更したり(デフォルトは 6667)もしておくとよさげかも.
で,変更後,サーバを再起動:
% sudo /etc/init.d/ngircd restart
これで,クライアントからオレオレIRCサーバに接続できる感じです.
IRCサーバにつなぎっぱなしにする 〜 Tiarra
はじめに
2011年11月26日(土),株式会社 はてなさんにて,Kansai.pm 第14回ミーティングが開催されました.日本酒を呑んだくれながら前日にATNDに登録し,おジャマさせていだたいてきました.
以下,簡単に書き出してみます.
キーワードとか
恒例,その場じゃ理解しきれないので,持ち帰るためのキーワードどかメモとか.
STF
- プロレスの技由来.
- MogileFSライクなオブジェクトストレージ.
- そろそろオープンソース化予定!
お仕事で扱っている画像データがけっこう増えてきたので(とはいえ10数万規模だけど><),「オブジェクトストレージ」なるものについてちょっと勉強しておいた方がよさげ.
CloudForecast
- グラフ大好き!(kazeburoさんが)
- RRDTool についても要調査&勉強.
APNS
- Hatena::Notify
- AnyEvent::MPRPC
- AnyEvent::APNS
「APNS」でググったら,2010年の Advent Calendar のエントリが出てきたのでここに:
Perl入学式
初心者集まれ.
KyTea
読みは「きゅーてぃー」,新しいテキスト解析器.
Perl Email Project
- 無知でした.
- Email::*
qpsmtpd
- 従来のMTAの完全な代替ではない
Plack::Middleware::ServerStatus::Lite
Plack::Middleware::ServerStatus も使ったことなかったので,どちらも試してみよう.
- Plack::Middleware::ServerStatus::Lite – search.cpan.org
- cho45/Plack-Middleware-ServerStatus – GitHub
GrowthForecast
データをHTTP経由でサーバに投げてデータを蓄え,そのグラフを描画する.
複合グラフにも対応.
HTML::ValidationRules
フォームHTMLに入力のルールを書けるのだから,それを利用しようよ → フォームなHTMLをparseしてバリデーションルールを生成.
DBIx::DataFactory
先日の Yokohama.pm でも言及されていた気がする.
スイーツ
LTでは,これらをつまみながらスタンディング状態で行われました.こういった感じでの進行は初めてでおもしろかったです.
懇親会
Perl歴自体は浅かったり,ニコニコ技術部だったり,FreeBSD Users Groupだったりと,多岐に渡る分野の方々とごあいさつさせていただきました.(呑んでエンジンかけました><)
ロボットの作用点(?)の座標計算方法,awkでできること,3Dプリンタについてなど,Perl以外の話題が多かった感じです.Perlの話題といえば,旧国名.pm とかやってみたらおもしろいかも,といったものがありました.Owari.pmってかっこよくね?とけっこう推されてましたw @kazeburo さんにも「Log::Minimal 愛用してます」ごあいさつができてよかったです.ikachanサーバの置き方(?)についても少し聞けたので,設置方法を試してみます.
スピーカさんのスライド
@__papix__ さんがまとめてくださっているので,そちらをご参照:
写真いくつか
おわりに
以上,Kansai.pm #14 に参加して,個人的に持ち帰ったものを書き出してみました.
今後,Kyoto.pm や Osaka.pm が立ち上がり,Kansai.pm はどうなっていくの? みたいなお話もありましたが,メンバーが分離するというよりはただ,拠点が増えることで集まる機会も増える,といった感じで,京都寄りの方・大阪寄りの方いずれにもメリットがあるのかな,くらいに解釈しています.(東京方面と比べると)関西方面は近いので,また日程が合えば,おジャマさせていただきたいと思います.
それでは,スピーカ・参加者のみなさま,おジャマさせていただいたはてなさん,ありがとうございました! Nagoya.pm もがんばっていきます!
あと,「烏丸御池」ですが,「〜おいけ」って読むんですね.これも1つ勉強になりましたw
おまけ
バッグに入れていたらレンズのネジが緩んでいたみたいで,部品が一部バラけてしまってました.
持っている精密ドライバが使えたので,とりあえず復旧はしました.
ちなみにこのカメラ,ふだんはMF(マニュアルフォーカス)で使っているんですが,そのせいなのかなんなのか,モードを「AF(オートフォーカス)」に切り替えても,オートにならなくなっちゃってました.モニタの表示も「MF」のままだし,シャッタボタンを半押ししても何も起こらないし,といった感じです.どうしたものか...w
はじめに
1週間経過してしまいましが!
2011年11月20日(日),Nagoya.pm の第2回目が開催されました.以下,主観的に簡単にざっと書いてみます.
私の発表分
今回は,最近使い始めたWebアプリケーションフレームワーク Amon2 をベースに簡単なWebアプリを作ることのほんのさわりの部分について,グダグダっとお話させていただきました.
@jihei さんによる動画です:
スライド見返したら,「OSC 2011 Nagoya 展示アプリ」の挙動とかについて全然触れていなかったですね><
興味のある方,万が一見えましたら,私とか @clairvy さんに聞いてくださいw もしくは,GitHubにも上がっているので,そちらをご参考いただければ幸いです.
拾ったキーワードとか
- Data::Recursive::Encode.便利ですよねー.
- App::Ack.ぜひ使い慣れたい!
- Node.jsを使った「物理的な」ツマミでブラウザの背景色を変更するデモ.ツマミを使った配色系ツールとかあると便利そう,とか思った.XS版に期待w
- リモートなスライド切り換えツール,けっこう安価に手に入るのね.キーボードとかと同様「インプットデバイス」な感じ.
- AN HTTPD.Windowsでちょっとした開発とかの場合,コンパクトでよさげ.サイト見たところ,ちょっと古め?
スイーツ
@trinityCRZ さんによる,シュークリームと◯◯◯入りのゼリー.おいしくいただきました.
おわりに
以上,Nagoya.pm の第2回目を,あくまで主観的にざっと書いてみました.
今回は,参加登録11人に始まり, 本編, 懇親会がすべてが11人という,「キャンセル率0%・懇親会率100%」とまさかの数字がでてしまいましたw
主催の @clairvy さん,会場を提供いただいたニューキャストさん,動画撮影していただいた @jihei さん,スイーツを準備いただいた @trinityCRZ さん,そして発表者&参加者のみなさま,ありがとうございました!
次回の日程は今のところ決まっていませんが,@clairvy さん曰く「まずは3回」なので,そんなに遠くない時期に開催されることと思います.
はじめに
ちょっとハマったので,アドホックな対策といっしょにメモ.あんまりよろしくなさげな方法かもです.
ことのはじまり
次に示すのは,Filesys::Notify::Simple でとあるディレクトリを監視し,ここに入ってくるファイルのうち特定の名前のものがきた場合に,その中身を読んでごにょごにょする,といった,用途のよく分からないスクリプトです.
ディレクトリに入ってくるファイルの内容は Data::MessagePack で pack されたもの(必ず何らかの内容があることを前提)で,その名前が特定のものだった場合,それを読んで unpack して...とかすれば少しは具体的ですかね:
use Filesys::Notify::Simple; use Data::MessagePack; use File::Basename; use File::Slurp; use Try::Tiny; my $file_target = 'この名前のファイル'; # full path my $w = Filesys::Notify::Simple->new([qw/ 監視対象ディレクトリ /]); $w->wait(sub { for my $ev ( @_ ) { my $f = $ev->{path}; next if basename($f) ne $file_target; # 目的のファイルに関する処理 try { my $mp = Data::MessagePack->new; my $data = $mp->unpack( read_file($f) ) or die $!; ... } catch { my $msg = shift; warn $msg; }; last; } });
MacBookPro(OSX 10.6.8)で動いたのでこれでよさげかな,と思って,公開相当な環境(OS: CentOS 5.5)へ持っていってみたところ,ときどき warn される現象に見舞われました.
デバッグしてみる〜原因模索
とりあえず,dieしたあたりを,次の順で少し細かく見てみました:
$mp->unpack()に失敗しているときがあるFile::Slurp::read_file自体は失敗していない.-f $fも必ず真なはずFile::Slurp::read_file($f)の結果をダンプしてみる → 空(not undef)のときがある.!-s $fの結果をダンプしてみる →0のときがある.!
これらのことから,ファイルができて,内容が書き込まれるまで,の間に,コールバック関数が呼び出されている(イベントが発火している)んじゃないか,という考えに至りました.
アドホックな対策
ファイルへの書き込みにかかる時間の考え方とかよくわかっていないので,とにかく「待つ」処理を追加することにしてみました.
use Time::HiRes; $w->wait(sub { for my $ev ( @_ ) { my $f = $ev->{path}; next if basename($f) ne $file_target; # 中身がまだだったらちょっと待つ my $i = 20; while ( ! -s $f && --$i ) { Time::HiRes::sleep .05; } die 'timeout.' unless -s $f; # 目的のファイルに関する処理 try { my $mp = Data::MessagePack->new; my $data = $mp->unpack( read_file($f) ) or die $!; ... } catch { my $msg = shift; warn $msg; }; last; } });
対象のファイルサイズが 0 の間は(同期的に)待ち続ける,といったことをしてます.
ひとまずこれで,$mp->unpack() に失敗することはなくなりました,私の環境(CentOS側)での私の確認の範囲では><
ソースコードをちょこっとだけ見てみる
Filesys::Notify::Simple のソースコードをちょこっとだけ見てみます.バージョンは 0.08 のものです.
init.初期化を行うメソッドの一部:
35 36 37 38 39 40 41 42 43 | if ($^O eq 'linux' && !NO_OPT && eval { require Linux::Inotify2; 1 }) { $self->{watcher_cb} = \&wait_inotify2; } elsif ($^O eq 'darwin' && !NO_OPT && eval { require Mac::FSEvents; 1 }) { $self->{watcher_cb} = \&wait_fsevents; } elsif ($^O eq 'freebsd' && !NO_OPT && eval { require Filesys::Notify::KQueue; 1 }) { $self->{watcher_cb} = \&wait_kqueue; } else { $self->{watcher_cb} = \&wait_timer; } |
Linux系では Linux::Inotify2,MacOS では Mac::FSEvents,FreeBSD では Filesys::Notify::KQueue,がそれぞれ利用可能であればそれを使う,といった感じに,OSの環境やモジュールの状態に合った処理が選ばれるみたいです.ただ,環境変数 PERL_FNS_NO_OPT が真に設定されていれば, その辺はスルーされるようです.
wait_inotify2.wait メソッドの Linux::Inotify2 利用バージョン.
49 50 51 52 53 54 55 | Linux::Inotify2->import; my $inotify = Linux::Inotify2->new; my $fs = _full_scan(@path); for my $path (keys %$fs) { $inotify->watch($path, &IN_MODIFY|&IN_CREATE|&IN_DELETE|&IN_DELETE_SELF|&IN_MOVE_SELF); } |
IN_CREATE を監視イベント対象にしていることから,ファイルが「作られた」ことに対してイベントが発火することもうなづけそうです.
まとめ
ディレクトリを監視して,そこへ入ってきたファイルの内容を確認する際には,「ファイルが作られた」「内容が書き込まれた」が同時ではないことに気をつけろ!といった感じですかね.
個人的に良い勉強になりました.
おわりに
以上,Filesys::Notify::Simple で監視しているディレクトリに入ってきたファイルの内容を読む際に,ちょっとハマったことと,そのアドホックな対策について書いてみました.
今回「ハマった」のが明確化したのは,CentOS という Linux 環境(そして Linux::Inotify2 使用時)ですが,一度も現象を確認できていない環境においても,同様の考え方はもっておいた方がよさげですね.
あと,マルチプラットフォームを目指すのでなければ,先で触れた各種OS向けなモジュールを利用してもう少し掘り下げていく方が,目的によってはよいかもです.
何かよさげな対策がありましたら,ぜひご教授ください><
はじめに
YAPC::Asia 2011 のために東京行ったときの,その他の写真いくつかです.
洗足駅〜長原駅を徒歩
YAPC::Asia 2011 前夜祭の帰り,乗る電車を間違えて,次の駅(洗足駅)で下車.地図見たら,本ルートの長原駅までそんなに遠くなさそうだったので,歩いてみました.
「環七」ってところを初めて通りました.
長原駅前の商店街的なところ.
Osteria Senti
YAPC::Asia 2011 前夜祭の帰り,宿最寄りの千鳥町駅を下りて,まだ明かりがついていたので寄ってみたお店.そういえば,夕食まだでした.
大学の同じ研究室出身の後輩(年齢的な意味で.卒業は私のが後w)がここの隣町くらいに住んでいたようで,勝手につぶやいていた ForSquare とか Twitter に反応してやってきてくれました.
モレッティ.イタリアのビール.あとはヒューガルデン・ホワイトってのもいただきました.
続きを読む »













