2012-01-04(水)
開発者向けリアルタイムチャットアプリケーション『AsakusaSatellite』 0.7をリリースしました
Ruby, codefirst, rails, リリース |
前回のバージョンアップからだいぶ時間が空いてしまいましたが、AsakusaSatelliteの新バージョンのリリースを行ないました。
前回まではSkypeで相談しながら開発するというスタイルでした。しかし、今回のバージョンアップで機能が多数追加されたことによりAsakusaSatelliteで相談しながらAsakusaSatelliteを開発するというドッグフードスタイルによる開発が可能となりました。
AsakusaSatelliteの特徴
AsakusaSatelliteは以下のような機能をもった開発者向けチャットアプリケーションです。
今回のバージョンアップにより追加された機能
v0.7 のバージョンアップのキーワードは「AsakusaSatellite as a Service」であり、PaaS対応を意識しています。
その結果、従来よりもプラガブルな構成になっています。
PaaS(heroku)対応
今回のバージョンアップの最大の変化点は、herokuに対応したことです。 これにより自前でサーバを持たずにAsakusaSateliteを利用できるようになりました。
もちろん、今まで通りローカルのサーバで動作させることもできます。
これにともないDBがGroongaからMongoDBに変更されました。
WebSocketサーバの外部サービス対応
PaaS対応の一環で、WebSocketサーバを切り替えられるようになりました。
現在は以下の3つの WebSocket サーバを利用できます。
内部にリソースを持ちたくない場合には、Pusher を利用し、内部で閉じた形で利用したい場合には、Socky ベースの WebSocket サーバを利用する、といった使い分けが可能です。
また合せてChrome16への対応も行なっています。
部屋の非公開設定
部屋を特定メンバのみに公開することができるようになりました。この機能により、herokuのようなpublicなサーバに設置した場合でもプライベートな情報を守れます。
部屋ごとの設定となっているため、一般用の部屋を公開し、身内用の部屋を非公開にするといった併用も可能です。
QuoteIt対応
プラグイン機能によりQuoteItと連携できるようになりました。これによりAsakusaSatellite上でTwitter、Slideshare、Gistなどを簡単に引用することができます。
また、QuoteIt は世界中の開発者が自由にプラグインを追加できるので、利用しているうちに機能が追加されている、ということも起こりえます。
ただし、すべてのURLをQuoteItに送るため、セキュリティの観点からデフォルトでは無効になっています。
周辺ツールの充実
AsausaSatelliteを日常的に用いるようになったため、周辺ツールが整備されました。
AsakusaSatellite Plugin for JenkinsをJenkinsにインストールすることで、ビルド結果をAsakusaSatelliteに通知できるようになります。Redmineチケットリンクプラグインによって、コミットメッセージに埋めこまれたチケット番号が展開されるので、非常に分かりやすい通知になります。
ダウンロード・インストール方法
公開ページからパッケージを取得し、適当なディレクトリに展開します。
$ bundle install --path vendor/bundle
環境に応じてMongoDBの起動を行ないます。
$ mongod --dbpath <dir_name>
WebSocketサーバであるSockyを起動します。
$ bundle exec thin -R socky/config.ru -p3002 start
AsakusaSatellite本体を起動します。
$ bundle exec rails server
http://localhost:3000/ でAsakusaSatelliteが利用できます。
また詳細なマニュアルも公開しています。
謝辞
以下の方からいただいたパッチを取り込んでいます。ありがとうございます。(敬称略)
- Twitter / @mzp
- Twitter / @suer
- Twitter / @notogawa
- Twitter / @yamaz
- Twitter / @xuwei_k
- Twitter / @nishikawasasaki
- Twitter / @eitoball
- Twitter / @fukata
- Twitter / @finalfusion
- Twitter / @hirocell
- Twitter / @mayonezudaiou
- Twitter / @bleis
- Twitter / @Ajiro_s
- Twitter / @h0k0r0bi
- Twitter / @kimukou_26
- Twitter / @vvakame
- Twitter / @gab_km
- Twitter / @shogo__i
- Twitter / @maeda_
- Twitter / @kabayan
- Twitter / @ch_iii
- Twitter / @naocchi_tsumo
- Twitter / @koi_zoom1
- Twitter / @bleis
- Twitter / @FmtWeisszwerg
- Twitter / @Wingd_Dragon
- Twitter / @mincemaker
- Twitter / @mrxptn
- Twitter / @beckorz
- Twitter / @mzp
- Twitter / @soundTricker318
- Twitter / @kk6
- Twitter / @shishi4tw
- Twitter / @pasela
- Twitter / @sandinist
- Twitter / @hosopy
- 山梨出会い攻略らぶらぶ探偵団
- Twitter / @atsu_kaya
- Twitter / @rane_hs
- Twitter / @fate_fox
- kinneko@転職先募集中の日記 - 開発者向けリアルタイムチャットア...
- 予定は未定Blog版 - 質問に答えてみる
- Twitter / @kaminogi
2011-12-31(土)
2011年の振り替えり
もう2011年も終わりなので、参加したイベントを中心に、今年を振り替えってみたいと思います。
今年もいろんなことがありました。
1月: /usr/bin消失
年明け早々、/usr/binを消しました。 そして、iMacが壊れて、SnowLeopardのディスクを飲み込まれました。
新年を新マシンとともに始めることができた、と前向きにとらえたいと思います。
2月: 名古屋Ruby会議 02
2011年最初のビッグイベントでした。仕事の都合で前日まで東京に居たので、移動が大変だった記憶があります。
裏イベントで名古屋Reject会議02を企画したら、いろんな人が応募してきてくれて嬉しかったです。
ただ、Reject会議にずっと居たので、本会にほとんど参加できなかったのがちょっと残念です。
2月: AsakusaSatelliteリリース
@suerさんと@mallowlabsさんとSkypeで話しながら作ってたチャットアプリAsakusaSatelliteをこのあたりでリリースしました。codefirst名義でいろいろなソフトウェアをリリースするようになったのも、このあたりな気がします。
3月: リリカル合宿
「えっ、@wof_moriguchiさん、リリカルなのは見たことないんですか? それは一度、お泊まり会をやってみないといけないですね」という訳のわからない理由で合宿イベントをやりました。結局、日程が合わず@wof_moriguchiさんは来れなかったし。
ホントは温泉でやりたくて熱海の宿とかを調べてたんですが、移動の都合とかも考えて名古屋市内になりました。いつかは温泉イベントもやりたいです。
合宿中は、@lgfuserさんがが徹夜でAndroidで動くソースコードビューワを書いてたのが、すごく印象に残ってます。鼻血も出してた気がします。
3月: TDDBC福岡
suer「TDDのリズムが今ひとつわかんないんだよね」mzp「それはTDDBCに行くしかないですね。次は福岡でありますよ」というわけで福岡まで行ってきました。
TDDBC中に@ukstudioさんにrspecのすごさについて教えてもらいました。「うーん、このテストの出力、文法的にちょっと…」という言葉がすごく印象に残ってます。
福岡駅でかったおみやげを福岡駅に忘れてきたのも、今ではよい思いでです。
4月: 第3回MessagePackハッカソン(春)
2010年の末ごろからこそこそ作ってたMessagePack for OCamlをたずさえてMessagePackハッカソンに参加しました。参加してる人たちがみんなすごいひとたちばかりでビクビクしてましたけが、たのしかったです。
この時、始めて夜行バスを使って東京に行ってみました。そして、これ以降は使ってません。
4月: ActionScriptを使わないFlash勉強会
Reject会議で@yoyaさんと「swf生成たのしいですよね」という感じでもりあがったので、東京で勉強会をやりました。 「今アツいのはJavascriptによるFlashプレイヤーの再実装ですよね」という頭がおかしいとしか思えない会話がそこかしこで聞こえて、とても楽しかったです。
あとFlashの勉強会には女性が多いというウワサを聞いてましたが、完全にデマでした。
5月: Boost.勉強会 名古屋
C++とかよく分からないのにBoost.勉強会で発表したりしました。 とりあえず「エラーメッセージが多すぎて読めない」というジョークが鉄板ネタだということだけは把握しました。
発表はFrama-Cネタをしたんですが、やっぱりCを検証するのはいろいろと難しいので、素直にCoqを使ったほうがいい気が最近はしています。
6月: 開発環境勉強会
つくばのほうでやってた開発環境勉強会に影響されて名古屋でも開催しました。
そろそろ第二回をやってもいい時期な気がします。
7月: Codefirst合宿
2月にリリースしたAsakusaSatelliteを大幅にリファインしました。あまりに変更しすぎて、まだ新バージョンをリリースできてまん(>_<)。 年明けには出す予定です..。
このとき使った京屋旅館 http://kyoya.to/ は駅から近い、WiFi完備、コーヒー飲み放題、プリンタ完備という謎の充実っぷりだったので、クリスマスソンでも再利用しました。
9月: 品川駅に閉じ込められた
台風直撃と東京出張が被って、品川駅に6時間ほど閉じこめられました。 品川駅にはたいぶ詳しくなりました。
9月 函数型プログラミングの集い・Proof Summit
いろんな話が聞けて、すんごい楽しかったです! みんなすごかった!!
あとLtGのキャラは、とてもかわいくてよいです。ボクはCopyくんがすきです。
10月 芋煮会
よんたさんこと @keita44_f4 が「冬になったのに芋煮会をやらないとかないわー」と行って主催してまいた。
飲みすぎたので、乾杯をしたあたりからの記憶が非常に断片的でよく分かりません。とりあえず、芋煮はおいしかったことは覚えています。
11月: 証明コンペ
競技プログラミングにも始めて参加しました。 48時間ぶっとうしで同じ問題を考えつづけるのはとてもエキサイティングで楽しかったです。
11月: LL名古屋
夏の間は輪番休日せいで勉強会の主催も参加もあまりできなかったので、そのうっぷんをはらすようなめちゃくちゃなイベントでした。
勝手にプログラムに組み込んでから、発表交渉を始めるという新境地に至りました。
12月: クリスマスソン
bleis「今年のクリスマスは土日とかぶってしまったせいで、リア充どもが活気づいてて、非常に不愉快だ」mzp「だったら、ハッカソンでもやろうぜ」と適当なことを言っていたら、いつのまにかやる事になってました。
まあ、レッドブルを48本買いこんだり、クリスマスケーキを予約したりと、わりとクリスマスを楽しんでいた気がします。東京からの参加者がわりと居たのは今だに謎です。
当日はCoq for iPadをひたすらつくったので、ほかの事はよくわかりません。
まとめ
2011-12-24(土)
Webサービスの埋め込み用HTMLを手軽に取得するためのWebAPI『QuoteIt』を作りました
# この記事は名古屋クリスマスハッカソン2011で書いてます。メリークリスマス!
GistとかTwitterとかの最近のWebサービスは他のページに埋め込めるようになっていますね。ただ、サービスごとに埋め込むためのHTMLコードが違うので、いちいち調べるのが面倒ですよね。
そこで各種Webサービスの埋め込み用HTMLを統一的に取得できるWebAPI『QuoteIt』を作りました。しかも、誰でも引用元を簡単に追加することができます。
使い方
例えば、
http://twitpic.com/73wiod
を埋め込みたい場合は、
http://quoteit.heroku.com/clip.html?u=http%3A%2F%2Ftwitpic.com%2F73wiod
対応サービスの増やし方
埋め込み用のHTMLを取得するためのメタデータはwedataで管理しています。 そのため、OpenIDを持つ方ならば誰でも対応サービスを増やすことが可能です。
例えばTwitter引用は、下記のコードだけで対応できます。
wedataの定義方法についてはドキュメント を参照してください。
対応サービス
それ以外の対応サービスはプラグイン一覧で確認できます。
ソースコード
ソースコードはgithubで管理しています。MITライセンスですので、ご自由にお使いください。
- Twitter / @mzp
- Twitter / @YkYKyk_mk
- Twitter / @douzan_toniok
- Twitter / @mallowlabs
- Twitter / @xuwei_k
- Twitter / @eitoball
- Twitter / @ikenyal
- Twitter / @oh_tsu
- Twitter / @KAZ_NOIR
- Twitter / @amano225
- Twitter / @mozuBlack
- Twitter / @crampon
- Twitter / @d6rkaiz
- すえひろがりっっっっ! - 2011年を振り返る
- すえひろがりっっっっ! - 2011年を振り返る
- みずぴー日記 - 開発者向けリアルタイムチャットアプリケーション『...
- みずぴー日記 - 開発者向けリアルタイムチャットアプリケーション『...
2011-12-16(金)
ちょっと便利な関数の紹介
F# |
(* この記事は、F# Advent Calendar 2011の16日目の記事です。 *)
こんにちは、mzpです。 クリスマスたのしみですね。
さて、関数型プログラマは自分だけの関数を持っていることが多いものです。 ライブラリ化にするほどの規模でないので、コピペによって各プロジェクトを移動しながら、洗練されたり新しいオペレータが追加されれたりします。
というわけで今日はOCamlハカーのosiireさんのオペレータを紹介していきます。
ネタ元
F#標準
まずはF#だと不要な関数です。
let id x = x let (@@) f x = f x let (+>) f g = g f let (+$) f g x = f (g x)
それぞれid, (<|), (|>),(<<)に対応してます。「え、こんなのもデフォルトで定義されてないんですか(笑)」と言うと効率的にOCamlerをdisれるのでおすすめです。
Haskellからの輸入
let curry f x y = f (x, y) let uncurry f (x, y) = f x y let flip f x y = f y x
順番を入れ替えたりできるので、引数の形を変更するだけの無名関数を書くのを避けれます。
> List.map (fun (x,y) -> x + y) [(1,2); (3,4)] val it : int list = [3; 7] > List.map (uncurry (+)) [(1,2); (3,4)] val it : int list = [3; 7]
無限ループ
let rec forever f x = let v = f x in forever f v
同じ処理を繰り返すプログラムの本体部分で使ったりします。
let _ = forever read_eval_print ()
例外とOption型の変換
let maybe f x = try Some (f x) with e -> None let may x f = match x with None -> None | Some v -> Some (f v) let may_default d f = function Some v -> f v | None -> d let default d = function Some v -> v | None -> d
option型を返さずに例外を投げてくる関数を扱うための関数です。
maybe List.hd xs |> may do_something_for_head |> default 0
(* List.tryFind相当 *) maybe (List.find x) xs
デバッグ用
let tee f x = ignore (f x); x
Unixのteeコマンドのように処理を挟みこんだりするときに便利です。
do_A () |> do_B |> tee printfn |> do_C
みたいにすれば、パイプライン中の値を覗けます。
最後に
人のコード読むのはたのしいですね。
2011-12-05(月)
Show Scriptコマンドによる証明の整形
Coq |
(* この記事はTheorem Proving Advent Calendar 2011の5日目の記事です。 *)
Coqはタクティックを使って対話的に証明を構築していけます。その反面、注意して書かないと、読みにくい証明になってしまいます。
そんなときは、Show Scriptコマンドで整形すると楽になります。
例: 読みにくい証明
例として次のようなリストに関する補題を証明するときのことを考えてみます。
Require Import List. Lemma rev_app_distr : forall A (x y:list A), rev (x ++ y) = rev y ++ rev x.
Focusを使ってサブゴールを移動しながら証明したり、インデントなしで場合分けの証明したりすると、こんな感じの読みづらい証明になってしまいます。
Proof. induction x as [| a l IHl]. destruct y as [| a l]. Focus 2. simpl. rewrite app_nil_r. auto. Show. simpl. auto. intro y. simpl. rewrite (IHl y). rewrite app_assoc. trivial. Qed.
Show Scriptコマンドによる証明の整形
そんなときは、Qedの直前にShow Scriptコマンドを使うと、次のような整形した証明を出力できます。
induction x as [| a l IHl]. destruct y as [| a l]. simpl. auto. simpl. rewrite app_nil_r. auto. intro y. simpl. rewrite (IHl y). rewrite app_assoc. trivial.
Focusによるサブゴールの入れ替えを元に戻して、場合分けごとにインデントしてくれます。
ただ、"現在の証明"に対してしか使えないのでQedする前でないと使えませんし、コメントはすべて消えてしまいます。
おまけ: そのほかのShow XXXコマンド
ちなみに、Show Script以外にも、証明木を表示するShow Treeコマンドもおもしろいです。
先ほどの証明をShow Treeすると、次のような証明木を出力できます。
BY induction x as [| a l IHl] A : Type ============================ forall y : list A, rev (nil ++ y) = rev y ++ rev nil BY Evar change ============================ forall y : list A, rev (nil ++ y) = rev y ++ rev nil BY destruct y as [| a l] ============================ rev (nil ++ nil) = rev nil ++ rev nil BY Evar change ============================ rev (nil ++ nil) = rev nil ++ rev nil ….
まとめ
2011-11-15(火)
LL名古屋 開催経緯
11/5にLL名古屋というイベントを開催されました。
プログラムを見てもらえば分かりますが、いわゆるLLではなく「Lが2個はいっていれば、それはLLです」がテーマのLT大会でした。
開催経緯
発端
OSC Nagoya 2011とLL Planetの開催日が同日だったせいでLL Planetに行けなかったし、輪番休日のせいで休日が分断されて勉強会が開催しづらくてムカつく、という話をミスドでしていたらいつのまにか決まっていました。反省はしていません。
「Lが2個あれば何でもOK」ルールは、いわゆるLLのみにテーマをしぼってしまうとCoqの話ができなくなりそうだったからです:D。 あと発表者が集めにくそうだったというのもあります。
発表者が多い理由
- #llnagoya ハッシュタグでつぶやいている人を勝手に発表者リストに追加する。
- 追加された人が、別の発表者を連れてきて勝手に追加する。
- 以下ループ
というねずみ算方式です。
ロゴが多い理由
しらない。
当日の様子
- LL名古屋 #llnagoya - Togetter
- Ustream.tv: ユーザー akuraru: ll名古屋 Section1, Recorded on 2011/11/05. 技術
- Ustream.tv: ユーザー akuraru: ll名古屋 Section2, Recorded on 2011/11/05. 技術
- Ustream.tv: ユーザー akuraru: ll名古屋 Section3, Recorded on 2011/11/05. 技術
- Ustream.tv: ユーザー akuraru: ll名古屋 Section4, Recorded on 2011/11/05. 技術
- Ustream.tv: ユーザー akuraru: ll名古屋 Section5, Recorded on 2011/11/05. 技術
- 座席表
感想
2011-11-11(金)
VSTTE Competition参加記録
id:yoshihiro503さんに誘われて、VSTTE Competitionというソフトウェア検証コンテストに参加しました。
「検証ツールに特に制限はないぜ」と書かれていたのでCoqを使いました。
競技プログラミンングに初めて参加しましたが、48時間ぶっとうしで同じ課題に取り組むのはとてもエキサイティングで楽しかったです。
参加メンバー
- @yoshihiro503さん
- @pirapiraさん
- @hirose_golfさん
- ボク(@mzp)
一日目
開始直前
- yoshihiro503さんから"uiro,tebasaki,miso,..."と列挙された謎のメールが届く。 どうやらチーム名の候補だったらしいです。
- yoshihiro503さんとSkypeで話しながらbitbucketの準備をしたりする。
- 0:00からの開催に備えて仮眠をとる。
0:00ごろ
- 問題が公開される。 https://sites.google.com/site/vstte2012/compet/problems
- ざっと見た感じだとProblem2,Problem4,Problem5が関数型ぽっかったので、Problem2をボクが、Problem4をpirapiraさん、Problem5をyoshihro503さんが担当することにする。
- 簡単かと思ったProblem2をよく読むと「停止性のない関数を定義しろ」と書いてあって、散々苦しむ。
3:00ごろ
5:00ごろ
二日目
9:00ごろ
- 起床。Problem3の続きにとりかかる。
- 「FIFOであることを示せ」と言われて頭をかかえる。
- Skypeで@keigoiさんに相談して「FIFOの公理を定義して、それを満すことを示せばいいんじゃね?」というアイデアをもらう。
13:00ごろ
- Problem3がだいたい解ける。あとは細かい補題を示すだけ。
- 五十嵐先生の講義を聞くために大学への移動する。
16:00ごろ
- 五十嵐先生の講義終了。 @keigoiさんとyoshihiro503と合流する。
- @keigoiさんがProblem2について「OCamlで記述してCFMLで証明すればいいんじゃない?」と意味のわからないことを言っていた 。
- Problem3の証明が終わったので、@yoshihiro503さんと一緒にProblem5にとりかかる。
19:00ごろ
- 問題にある疑似コードをそのままCoqに落すのは無理だね、という結論に至る。
- 眠気が限界なのでラーメンを食べて帰宅。
- ちょっと休憩してProblem1に取りかかる。
- 疑似コードをそのまま扱うのは諦めているので、ループ+破壊的代入の疑似コードを再帰に書き直してCoqで定義する。
22:00ごろ
- 翌日に備えて、早めに就寝。
三日目
8:00ごろ
13:00ごろ
- Problem1証明終了。
- メールチェックをするとpirapiraさんがProblem4をhirose_golfさんがProblem2を解き終わっていた。このひとたちすごい。
- 残っているProblem5にとりかかる。
18:00ごろ
- 何もすすまないまま夕方になる。
- 名古屋F#ディナーミーティング 20111110 - [PARTAKE] のために名駅に移動する。
20:00ごろ
- @bleisさんと@maeda_さん、@wof_moriguchiさんとご飯と食べる。
- 「お前のやっているのは競技証明であって、競技プログラミングではない」との中傷を受ける。 必死になってカリーハワード対応について説明したけど、理解してもらえなかった。
22:00ごろ
- 帰宅。 Problem5を解くのを完全にあきらめる。
- yoshihiro503さんと現状を確認して、投稿の準備を始める。
23:00
感想
- めちゃくちゃ楽しかった。次もぜひやりたい。
- 他のメンバーの証明能力がハンパなくてびびる。
- 夜って意外と短かい。
2011-09-28(水)
ProofSummit 2011 で『CoqによるMsgPackシリアライザの証明と実装』という話をしました。
ProofSummit2011でMsgPackを証明したときの話をしてきました。内容は名古屋Reject会議で話したことを膨らませた感じになっています。
話の趣旨としては「バグって怖いじゃん → じゃあ証明しようぜ → やってみた」みたいな感じです。
スライド
ustream
http://www.ustream.tv/recorded/17493318
感想
- 新宿ダンジョンこわい
- @ikegami__さんと@masahiro_sakaiさんにAgdaを教えてもらえたので、とてもよかった
- Software Foundationsの和訳プロジェクト、気になります
2011-08-06(土)
gitとRedmineと連携させるgitサブコマンド: git-ticket
git + Redmineで開発する場合、Redmineのチケットごとにトピックブランチを切ることが多いですが、ちょいちょいチケットの内容を忘れてしまいます。 そういうときに、いちいちブラウザでチケットを見にいくのがダルいので、チケットのサマリを表示するgitのサブコマンドを作りました。
なお、本コマンドはbleis-hooksと併用することを想定しています。
インストール方法
git ticket subcommand — Gist からダウンロードし、パスの通ったディレクトリに配置してください。
$ wget https://raw.github.com/gist/014371584dbf85d053ed/f8ade6f7fc36a4c8f49f72a538a6322bfb726bf8/git-ticket $ mv git-ticket /path/to/some/dir $ chmod a+x /path/to/some/dir/git-ticket
Ruby1.8の場合は、json gemのインストールしてください。
$ gem install json $ export RUBYOPT=rubygems
初期設定
$ git config --global redmine.url https://example.com/redmine/ $ git config --global redmine.apikey some_api_key
使用例
登録されているチケット
1) git ticket <チケット番号>
id/<チケット番号>というトピックブランチを作成し、チケットのサマリを表示します。
$ git ticket 701 Switched to a new branch 'id/701' Author: Ban Jun Date: 2011/08/06 21:51:13 +0900 iPhoneアプリに戻るボタンとリロードボタンをつける #693 関連
2) git ticket
トピックブランチにいる場合、対応するチケットのサマリを表示します。
$ git ticket Author: Ban Jun Date: 2011/08/06 21:51:13 +0900 iPhoneアプリに戻るボタンとリロードボタンをつける #693 関連
似ているもの
パクッテナイヨ
- Twitter / @mzp
- Twitter / @gabu
- Twitter / @gab_km
- Twitter / @shinyaa31
- Twitter / @suer
- Twitter / @gakusyokumabo
- Twitter / @s_azumano
- kinneko@転職先募集中の日記 - gitとRedmineと連携させるgitサブコ...
- Twitter / @cimadai
- Twitter / @sk_attack
- Twitter / @tky2a
- Twitter / @sa_ya0
- より良い環境を求めて - GitとRedmineの連携
- Twitter / @mandel59
- Twitter / @rubyist_bot
- Twitter / @yoshihiro503
- Twitter / @mandel59
- Twitter / @LLing_Fang
- Twitter / @OKU_K
2011-06-12(日)
Jenkinsのビルド結果をリアルタイム通知するプラグイン『Jenkins Websocket Notifier』を作りました
追記: 公式プラグインになりました。Websocket Plugin - Jenkins - Jenkins Wiki
「pollingが許されるのは小学生までだよねー キモーイ キャハハハハハハ」というわけでビルド結果をpush通知するJenkinsプラグインを書きました。
特徴
- Jenkinsのビルド結果をWebsocketを使って通知します。
- モダンなブラウザはWebsocketに対応しているので、Javascriptで簡単に通知を受け取れます。
- Websocketはプラットフォームに依存しないプロトコルなので、Javascript以外でも通知を受け取れます。
インストール方法
-
https://github.com/mzp/unageel/archives/master からwsnotifier.hpiをダウンロードする。 -
wsnotifier.hpiをJenkins の管理 > プラグインの管理 > 高度な設定 > プラグインのアップロード からアップロードする。 - Jenkins の管理 > プラグインの管理からWebsocket Pluginをインストールする。
- Jenkinsを再起動する。
設定方法
Jenkins の管理 > システムの設定 > Websocket Notifier で Websocketサーバを起動するポート番号を指定します。
(プロジェクト名) > 設定 > ビルド後の処理 でWebsocket Notifierのチェックボックスをオンにします。
利用例 その1: Chromeエクステンション
Jenkins のビルド結果を通知する Chrome エクステンション作った - mallowlabsの備忘録 を改造して、Websocket Notifierに対応させました。 使い方・機能は変っていませんが、通知速度が格段にあがっています。
パッチはすでに本体に取り込まれているので、インストール方法等はリンク先を参照してください。
利用例 その2: iPad/iPhoneのXFD化
WebsocketはJavascriptで簡単に扱えるので、ビルド結果によって背景色を切り替えるWebページも簡単に作れます。これをiPad/iPhoneで表示すれば、iPad/iPhoneテスト結果を通知するXFD(eXtream Feedback Device)として利用できます。
<html> <body bgcolor="red" id="bg"> <script> var elem = document.getElementById('bg'); var ws = new WebSocket('ws://localhost:8081/jenkins'); ws.onmessage = function(msg) { eval('var obj = ' + msg.data); if(obj.result == 'SUCCESS'){ elem.bgColor = 'green'; }else{ elem.bgColor = 'red'; } }; </script> </body> </html>
http://github.com/mzp/unageel/blob/master/xfd.html
利用例 その3:ダンボーのXFD化
上記の応用でビルド結果に応じてダンボーの目の色を変えることができます。
ダンボー本体はよつばとリボルテック リボルテックダンボーを、目の色の制御にはArduinoをはじめようキットを使っています。 目には大須で買ってきたフルカラーLEDを仕込んでいます。
技術的な話
- ws://localhost:8081/jenkins に接続するとJSON形式でビルド結果が飛んできます。
- ポート番号は設定によって変更可能です。
- ビルド結果は{ "name" : "test", "result" : "success", "number" : 1 }のような形式です。
お礼
- Jenkins起動時にWebsocketサーバを起動する方法はid:kyon_mmさん、川口さんにいろいろと教えていただきました。 ありがとうございます。 参考: Jenkins勉強会、DevLOVEに参加してきました - うさぎ組
- ダンボーをXFD化するアイデアは 自動テストの通知にも一工夫 « TriAx Lab にインパイアされています。また制御回路はblog.8-p.info を参考にしました。 ありがとうございます。
kkawa
これは素晴らしい!
ぜひJenkinsコミュニティのリポジトリでホストして、公式アップデートセンターに公開しませんか?お手伝いさせていただきます。

















http://d.hatena.ne.jp/mclh46/20111216/1323986621
F#の標準のライブラリは、1つの関数、クラスの利用範囲が広く、また弱点のある道具は不採用になっていると思われます。
maybeやteeの考え方はとても参考になりました。