はじめに
開発的お仕事が捗るらしいと聞いて,最近になってようやく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
クライアントとサーバが整ったので,これだけでもメッセージ交換はできてしまいます.
しかし,オフラインの場合,もちろんIRCサーバとの接続は切れてしまいます.もしその間に,何らかの重要なメッセージ交換があったとしても,オフラインなクライアントには届きません.再度オンラインになったときには時既に遅し,です.(IRCサーバの設定によっては,最近のログが得られると思いますが,まだよく設定方法を知りません><)
そこで,いわゆる「IRCプロキシ」ってヤツが捗ります.Perl界隈では「Tiarra」というのが定番っぽいです.(Perl界隈以外でも?)
IRCプロキシがIRCサーバに接続し,かつ,IRCクライアントからの接続を待ち受けます.IRCクライアントはこれに接続することで,IRCプロキシを仲介した形でIRCサーバに接続し,表向きはクライアント・サーバ間でやりとりしているかのようにメッセージ交換を行えます.IRCプロキシが実行中であれば,IRCサーバ間との接続は保たれるので,IRCクライアントとIRCプロキシ間の接続が切れたとしても,メッセージはIRCプロキシに入ってきます.IRCプロキシがそのログを保存するようにしておけば,いろいろ幸せになれそうですね.
セットアップ
次を参考に行いました:
まずはソースコードをチェックアウト:
% svn co http://svn.coderepos.org/share/lang/perl/tiarra/trunk/ /path/to/tiarra
設定を調整します.ファイルは /path/to/tiarra/tiarra.conf
です.
general { ... nick: issm user: issm name: issm ... tiarra-port: 6667 ... } networks { ... name: freenode ... name: oreore # ^ こんな感じのを追加 ... } # v 追加した "name" に相当する接続先の設定 oreore { server: irc.example.com 6667 password: ******** } ... + Channel::Join::Connect { ... channel: #nagoya.pm@freenode ... channel: #server-status@oreore # ^ こんな感じのを追加 ... } ... + Log::Channel { ... } + Log::Recent { ... Line: 15 ... } ... + User::Nick::Detached { ... detached: issm_away }
先でも触れましたが,後々幸せになるために,ログ関連の「プラグイン」は有効にしておくべきでしょう.
そして,Tiarra を起動します.
% /path/to/tiarra/tiarra >> /path/to/tiarra/log/tiarra.log 2>&1 &
クライアントの設定
接続先を,直接指定していたIRCサーバ(ここでは irc.example.com
)から,tiarra を実行しているサーバに置き換えればきっとOKです.(必要であればポート指定もね.)
HTTP経由でIRCへ投げる 〜 ikachan
IRC環境について勉強するモチベーションを跳ね上げてくれたのが,IRCへのメッセージ通知をHTTP経由で行うことのできるツール「ikachan」の登場です.
セットアップ
「App::Ikachan」としてCPANに上がっているので,そこからインストールします:
% cpanm App::Ikachan
すると ikachan
コマンドを利用できるようになるので,各種オプションを与えて実行します:
% ikachan -S irc.example.com -P 6667 -K ******** -N ika
-S
は接続先のIRCサーバ名,-P
はそのポート番号,-K
はサーバパスワード(必要であれば),-N
はニックネーム,となります.
使用方法いくつか
ikachanサーバに対してHTTPリクエストを送ることで各種操作を行います.ポート番号はデフォルトで 4979
です.(起動時に -p
オプションで変更することもできます.)
http://localhost:4979/join
channel
パラメータとともにPOSTすると,接続先のIRCサーバの指定したチャネルにjoinします.
http://localhost:4979/notice
channel
パラメータ,message
パラメータとともにPOSTすると,指定のチャネルにメッセージを投げます.
http://localhost:4979/channel_list
GETすると,その時点でjoinしているチャネルのリストが返ってきます.
詳しくは
中の人 yappo さんののエントリを読んでおきましょう:
ikachanを利用した各ホストからの通知環境の構想
ikachanサーバが立っているホスト自身からの通知自体は動かせています.ikachanサーバへリバースプロキシするようなWebサーバをフロントに立てておけば,他のホストからのメッセージの受け口にも利用できそうですね.
ikachanサーバへPOSTするためのスクリプト
複数行のメッセージの投げ方がよくわからないので,1行ごとに分割して順に ikachan に投げるようなPerlスクリプトをこさえてみました.localhostにしか対応していませんが.
#!/usr/bin/env perl use strict; use warnings; use utf8; use Getopt::Long; my $CURL = "curl -s"; my ($channel); my $parser = Getopt::Long::Parser->new; my %options; $parser->getoptions( 'channel=s' => \$channel, 'h|help' => \$options{help}, ); die 'Missing mandatory parameter: channel' unless defined $channel; $channel = '#' . $channel unless $channel =~ /^\#/; my $buff; { local $/; $buff = <STDIN>; }; my $cmd_join = "$CURL -F channel=$channel http://localhost:4979/join"; `$cmd_join`; for my $l ( split /\n/, $buff ) { my $message = $l; my $cmd_notice = "$CURL -F channel=$channel -F message=\"${message}\" http://localhost:4979/notice"; `$cmd_notice`; }
次のような感じで使います.
% uptime | perl post-ikachan.pl --channel=\#server-status
結果はこんな感じ:
まとめ
ちょうど名言ぽいツイートが流れていたので,こちらに掲げさせていただきますw
IRCは開発ツールです。チャットツールではありません。そんなのはインターネット企業では誰もが知っている常識です。
Twitter / @Yappo: IRCは開発ツールです。チャットツールではありません …
おわりに
以上,IRC関連の各種ツールを使って,外部のサーバが自動的に私の手元に通知を届けるための環境づくりについて,個人的に試してみた記録でした.
まずはこんな感じの環境でいろいろサーバ内の情報を流してみた上で,また方針を検討してみたいと思ってます.あと,SSLな接続についても,ですね.
ネタバレ:イカちゃんかわいい,だけでなくて便利.
amazonさん
-
侵略!イカ娘 イメージソングアルバム IKA LOVEposted with amazlet at 11.12.06TVサントラ アツミサオリ イカ娘(金元寿子) ULTRA-PRISM 宮内タカユキ ヒャダイン 美郷あき marble 伊藤真澄 妖精帝國 でんぱ組inc.
ランティス (2011-12-07)
売り上げランキング: 899 -
侵略!?イカ娘 ミニイカ娘トレーディングフィギュア BOX (ノンスケール PVC塗装済み完成品)posted with amazlet at 11.12.06ファットカンパニー (2012-04-30)
売り上げランキング: 19
こちらもあわせてどうぞ
- 「Hoya」っていうPlackPerlなWeb(サイト|アプリケーション)フレームワークを作ってます
- [perl][cpan] Authen::Htpasswd をかじってみた
- [perl] use LWP::Protocol::Net::Curl してオレオレ証明書なサイトへ HTTPS リクエストすると「Peer certificate cannot be authenticated with known CA certificates」が出るのでなんとかしたい
- [perl][shellscript] carton 管理なアプリケーション下の CPAN モジュールについてもいろいろ確認したい
- 「Webを支える技術」を読んで
最近の閲覧数
- Mario & Luigiを召喚するアレをHaxeに移行してみた
- [mac] Alfred から iOSシミュレータを直接起動したり呼び出したりしたい
- [perl] オレオレモジュール PDF::API2::Koromo でテキストの折り返し処理
- [amon2][perl] 1スクリプト内で環境変数 PLACK_ENV を切り替える際の注意
- [amon2][perl] 同一アプリケーション下の特定のパスだけ CSRF チェックを外したい
- [perl] 「範囲表記な整数」を要素とした配列を扱う Array::RangedInt というモジュールを書いてみた
- [perl][amon2] クエリ状態を保持した画面遷移のためのリンク生成と Amon2 プラグイン「Web::QueryString」
- 標準出力をdiffに通す
- [perl] use LWP::Protocol::Net::Curl してオレオレ証明書なサイトへ HTTPS リクエストすると「Peer certificate cannot be authenticated with known CA certificates」が出るのでなんとかしたい
- [perl][shellscript] carton 管理なアプリケーション下の CPAN モジュールについてもいろいろ確認したい
最近のエントリ
- [mac] Alfred 経由で「辞書.app」を引く
- [coffeescript][javascript] オレオレルータクラスの紹介というか晒しあげ
- [perl][amon2] Amon2 アプリケーションにおけるパジネーションの個人的実装例
- [git] 今いるところ以外のブランチを別のコミットに移動させる
- [redmine][perl][irc] Redmine::Chan をいじって 「#.」で「現在の issue」を参照するようにしてみた
- [scss] @import のベースパスを指定する
- [redmine][perl][irc] Redmine::Chan をヒアドキュメントに対応,複数行のテキストを Note に追加できるようにしてみた
- [redmine][perl][irc] Redmine::Chan をいじって IRC 経由で作業時間を記録できるようにしてみた
- [perl][amon2] Amon2::Plugin::Model というのを書いて使っているので公開してみた
- パンク修理パッチを20ケース注文したった
カテゴリー
タグ
-
amon2
announce
bicycle
bookmarklet
cooking
cpan
della.js
dqwindowmanager
eating
elisp
emacs
event
git
gps
gtd
html
http
image
iphone
javascript
lifelog
linux
mac
mono
music
mylifehacks
mysql
mywebservice
nicograph
onomichi
pc
perl
photo
plack
redmine
shellscript
study
svn
tool
travel
twitomonitor
twitter
wcan
webapp
wordpress
最近のコメント
-
No Responses.
最近のトラックバック
-
No Responses.