2010-06-23(Wed)
■ Gyazo を自分のサーバで運用する方法
Gyazo というスクリーンショット共有サービスがあります。
クライアントソフトウェアを起動して自分の画面の一部分を指定してあげると、サーバに指定されたエリアのスクリーンショットがアップロードされ、共有できるというサービスです。
さて、このサービスは非常に強力なのですが、通常は gyazo.com のサーバにアップロードされ、インターネット上にパブリックになってしまい、会社や大学などの内部情報を気軽に扱うことができません。
ですが、実は Gyazo はサーバスクリプトを公開している *1 ので、httpd が動いている環境ではどこにでも Gyazo サーバを置くことができるのです。
これで、リリース前の秘密のシステムの動作画面やミーティング議事録のツッコミ所などをみんなにシェアすることができますよ。やりましたね。
Gyazo のしくみ
たぶんこんな感じ。簡単ですね。
-----------------
|o---('-'o)イェイ! |
-----------------
↓
[Gyazo Client] (Gyazo.app)
↓
POST({ imagedata:... , id:... })
↓
[Gyazo Server]
upload.cgi
↓
-----------------
|o---('-'o)イェイ! |
-----------------
要するに、クライアント側で imagedata を HTTP の POST メソッドでサーバに送り、サーバ側の upload.cgi が受け取り処理しています。
ソースコードの入手
GitHub に上がっているので、 clone します。
% git clone http://github.com/gyazo/Gyazo.git
サーバサイドの設定
動作条件は Ruby で CGI が使える、といった程度です。
例えば、以下のようなディレクトリ構成にします。それぞれ適切なパーミションを設定し、data ディレクトリと bin ディレクトリについては HTTP でアクセスできるようにします。
mygyazo - db # データベースが格納される - data # 画像データが格納される - bin # スクリプトが格納される (CGI が実行できるように設定する) - upload.cgi # アップロード用 CGI
サーバスクリプトは Server/upload.cgi ですが、コメント込みで24行とかなりシンプルです。
実際やっていることは以下に挙げられることのようです。
- POST でやってきたデータを受け取る
- 画像データを MD5 でハッシュ化
- ハッシュを DB に登録する
- 画像データを ${ハッシュ}.png という名前で所定のディレクトリに書き込む
- 画像ファイルの URL を返す
以下のコメントにあるようにスクリプトを自分の設定に合うように書き換える必要があります。
Digest::MD5 周りについては、最近の Ruby 処理系では使えないメソッドだったので、同じ意味の処理ができるように書き換えます。
#!/usr/bin/env ruby require 'cgi' require 'digest/md5' require 'sdbm' cgi = CGI.new("html3") id = cgi.params['id'][0].read imagedata = cgi.params['imagedata'][0].read # Digest::MD5.new は最近の Ruby では引数を取らないので hexdigest に書き換える # hash = Digest::MD5.new(imagedata).to_s hash = Digest::MD5.hexdigest(imagedata) dbm = SDBM.open('${PATH_TO_DB}/id',0644) # db ディレクトリの位置を指定 dbm[hash] = id dbm.close # data ディレクトリの位置を指定 File.open("${PATH_TO_DATA}/#{hash}.png","w").print(imagedata) # data ディレクトリにアクセスできる URI を指定 cgi.out { "${GYAZO_DATA_URI}/#{hash}.png" }
クライアントサイドの設定
次にクライアント側の設定です。
GitHub で公開されている Gyazo のレポジトリには画像を切り取る部分についてはバイナリで提供されていますが、データを送信するロジックは Ruby で実装されたスクリプトが担当しているようです。
Gyazo.app/Contents/Resources/script がそれです。これを編集することで送信先のサーバを指定することができます。
ここで、編集するべきは43行目と44行目の HOST と CGI という2つの定数です。HOST にはその名の通り Gyazo のサーバを置くホスト名 (eg. makimoto.tsuyabu.in )、CGI は upload.cgi までのパス (eg. /path/to/gyazo/bin/upload.cgi ) を指定します。
これで設定は完了です。
いつもの通り、 Gyazo.app を起動させ画面の一部を指定すると、うまく行ったらウェブブラウザで画像の URI が開かれます。
もし、開いたページがエラーページだったり、そもそもブラウザが画像ページを開こうとしなかった場合は設定ミスの可能性があります。サーバのエラーログなどを参照のうえ処理してください。
まとめ
Gyazo を自分のサーバで運用する方法について紹介しました。
イントラネット上の計算機などに Gyazo サーバを置けばイントラに入れる人たちだけで画面共有をすることができます。
また、画像アップロードは意外とシンプルな仕組みなので、アップロードした画像の一覧ページを作ったり RSS フィードを提供したりなども簡単に実現できそうです。夢が広がります。
購入: 1人 クリック: 17回
2010-04-13(Tue)
■ Yahoo! 検索プラグイン開発ツールで遊んでみた話
半年ぶりくらいの更新ですが、特に大きな前置きもなく本題に入ります。
今日、Yahoo! デベロッパーネットワークから Yahoo! 検索プラグイン開発ツールが公開されたので、さっそくみんな大好きふぁぼったーをネタに遊んでみました。
これは何?
こんな感じで Yahoo! 検索の結果ページに favotter.com/user/* が来たらアイコン出してみたり、新し目のポストを出してみたりしています。
作り方
ドキュメントが驚く程充実しているので、そっちを読んでいただくのが速いです。
簡単に言うと、YST のインデクスや任意のページを XLST で変換して構造化したデータサービスと呼ばれるものからデータを引っ張ってきて、PHP でフロントエンドの表現を記述するといった感じです。ということで、コードはデータサービスを定義する XLST のものと外側の表現を定義する PHP のものの2つだけです。
一応これらも GitHub に上げておいたので、こちらも関心があれば。
まとめ
2009-09-14(Mon)
■ NLP 若手の会 第4回シンポジウムのお知らせ
牧本もプログラム委員の末席にこっそり載っている*1、 NLP 若手の会 第4回シンポジウムが9月30日・10月1日に京都大学で開催されますので宣伝をば。
NLP若手の会 第4回シンポジウム
The 4th NLP Symposium for Young Researchers
http://yans.anlp.jp/modules/menu/main/90
主催: 言語処理学会
趣旨: NLP若手の会は、自然言語処理および関連分野の若手研究者の交流を促進
し、若手のアクティビティを高めることを目指して、シンポジウムを開催しま
す。これから始まる、または始まったばかりの研究の発表を歓迎し、活発な議
論を行う場を実現したいと考えています。今回のシンポジウムは、一般発表の
他に、招待講演や国際会議の参加報告などの特別セッションおよび懇親会も予
定しており、多くの研究者との交流、深い議論、新たな発見などが生まれるこ
とが期待されます。多くの方のご参加をお待ちしています。
主催: 言語処理学会
日時: 2009年9月30日(水)〜10月1日(木)
場所: 京都大学 百周年時計台記念館 国際交流ホールIII
(京都市左京区吉田本町)
参加費: 無料 (懇親会費は別途)
3年前から毎年開催されて今年で4回目となるこのシンポジウムですが、今年は37件のポスター発表に加え、国際会議の参加報告や東京大学の田中久美子先生の招待講演など盛り沢山の内容になっています。
近隣にお住いの方で興味のおありの方は是非お越しください。ぼくも参加する方向で調整中です。秋の京都でのんびりしたいところです。
この前日・前々日は情報処理学会 第193回自然言語処理研究会が開催され、若手シンポとの連続開催という形になっています。こちらもどうぞ。
あと、30日・1日には京都大学メディア情報処理専修コース自然言語処理技術講座も開催されているようです。自然言語処理関係の研究や開発をこれから始めようという方むけの講習会で、ぼくも2年前に NAIST の講義の TA として参加していたいしています。去年までは形態素解析器や構文解析器の話が中心だったのですが、今年からはマイニング関係の講義も追加されたようです。なにぶん若手シンポと日程がまる被りなので、両方参加というのは難しいと思いますが、まさにこれから自然言語処理を始めるという方にはこちらもお勧めです。
2009-07-25(Sat)
■ RubyKaigi 2009 の資料まとめ
ちょっと前の話になりますが、日本 Ruby 会議 2009 に参加しました。
プログラミング言語関係の大きなカンファに参加したのは初めてでしたが楽しかったです。何より制作意欲をかきたてられました。
ぼく個人の行動は当時の Twitter を辿っていただくとして *1、某所で RubyKaigi の参加報告的なことをやることになったので、復習の意味を含め、各講演ごとの資料や動画などをまとめることにしました。*2
いずれ RubyKaigi から正式な動画などが公開されると思われますが、それまでのつなぎになるかと思います。
今回、まとめるにあたって、様々な方の様々な記述を参考にしました。特に、id:wayaguchi さんの RubyKaigi 2009 の 不完全ustリンク集 と、takeshinoda さん の 日本Ruby会議2009資料あつめ はとても役に立ちました。
(以下敬称略)
2009年07月17日金曜日 (1日目)
一橋記念講堂 / 13:30 - 14:30
一橋記念講堂 / 14:40 - 16:10
- Pragmatic Patterns of Ruby on Rails - 現場で役立つRuby on Railsパターン / 大場 寧子
- 『エンタープライズRails』に学ぶ企業ユーザのためのRails活用の極意 / 高井 直人
- http://www.slideshare.net/Naoto.Takai/railsrails
中会議場 / 14:40 - 16:10
- Railsエコシステムの研究 / 松田 明
- Ustream (細切れになっています)
- http://www.ustream.tv/recorded/1821403
- http://www.ustream.tv/recorded/1821408
- http://www.ustream.tv/recorded/1821429
- http://www.ustream.tv/recorded/1821442
- http://www.ustream.tv/recorded/1821445
- http://www.ustream.tv/recorded/1821446
- http://www.ustream.tv/recorded/1821461
- http://www.ustream.tv/recorded/1821466
- http://www.ustream.tv/recorded/1821467
- http://www.ustream.tv/recorded/1821472
- http://www.ustream.tv/recorded/1821475
- http://www.ustream.tv/recorded/1821495
- http://www.ustream.tv/recorded/1821503
- http://www.slideshare.net/a_matsuda/rails-1736906
- Ustream (細切れになっています)
- Using Adhearsion to Voice Enable your Ruby Applications / Jason Goecke
特別会議室 / 14:40 - 16:10
- Rubyの数 / 後藤 謙太郎
- Ruby の標準乱数生成器とその改良案 / 村田 賢太
- Rubyで楽しむBDD,ZDD / 倉井 龍太郎
一橋記念講堂 / 16:40 - 17:40
特別会議室 / 16:40 - 17:40
2009年07月18日金曜日 (2日目)
一橋記念講堂 / 10:00 - 12:00
- Ruby 1.8 のゆくえ / 卜部 昌平
- Ruby 1.9.2ロードマップ / Yugui - 園田 裕貴
- Ruby リファレンスマニュアル刷新計画 2009 夏 / okkez
- Rubyist Magazine が出来るまで / ささだこういち
中会議場 / 10:00 - 12:00
- The innate beauty of Ramaze / Michael Fellinger and Tadahiko Uehara
- Sequel: SQL in Ruby / Jeremy Evans
- Sinatra: The Framework Within / Aaron Quint
特別会議室 / 10:00 - 12:00
- 1/60秒でRuby -Rubyでゲームを作ったら- / kumaryu
- Rubyにおける生産性を高めるための開発環境を考察する / ujihisa 氏久 達博
- 静的コード解析統合環境の試作 / 勝間 友久
一橋記念講堂 / 13:30 - 14:30
一橋記念講堂 / 16:00 - 18:30
- ビジネスユースでのRuby導入のポイントと解決策 / 小島 克俊
- Ruby,Railsによる「ケータイ」ポータルの作り方! / 成田 智也、浜中 慶
- 実戦投入Rails - RubyKaigiEdition / 吉見 和也
- Railsサイト安定運用の心構え ~8つのサービスから学ぶ / 大井 宏友
- CとRubyとその間 / 須藤 功平
- オープンソース開発を始めよう〜扉を開けば奇跡が起きる〜 / 松村 章弘、黒田 雄一
- Ruby による楽天の大規模サービスと基盤技術 (デモあり) / 後藤 幸生 、大城 学 、西澤 無我
中会議場 / 16:00 - 18:30
- Ruby C10K challenge: High Performance Networking / Ilya Grigorik
- NeverBlock and I/O Concurrency in Ruby / Mohammad A. Ali and Ehab El-Badry
- JRuby Update 2009 / Thomas Enebo, Nick Sieger
特別会議室 / 16:00 - 18:30
- 分散並列処理フレームワークfairyと分散オブジェクトシステムDeepConnect / 石塚 圭樹、増田 創
- 偉大なBigTableとぼくのおもちゃ / 関 将俊
- concov: 時系列に注目したテストカバレッジビューア / 遠藤 侑介
- RubyのGC改善による私のエコライフ 〜レジ袋は結構ですよ(2009夏)〜 / nari
2009年07月19日日曜日
一橋記念講堂 / 09:30 - 12:00
- Edo Cabinet / メトロー ジョン
- Checking Interactively-Developed Code / Andriy Hnativ
- To the Edge of Web Performance and Beyond / Joshua Hull
中会議場 / 09:30 - 12:00
特別会議室 / 09:30 - 12:00
- Regional RubyKaigiのご報告 / 角谷 信太郎
- 上海のRailsコミュニティー! 日本がぼやぼやしている間に、上海はアツイ! / 天狗こと増満 工将 Koz Masumitsu
- Hello World From The Other Side Of Earth / Daniel Bovensiepen
一橋記念講堂 / 13:30 - 15:30
- How Lazy Americans Monitor Servers / James Edward Gray II
- Journey through a pointy forest: XML parsing in Ruby. / Aaron Patterson
中会議場 / 13:30 - 15:30
- RubyならMacでしょう / Vincent Isambart -ヴァンサン・イザンバル-
- RubyCocoa/HotCocoa(RHC) 〜RubyではじめるMac OS Xデスクトップアプリケーション開発〜 / 高尾 宏治
- RubyをつかったiPhoneアプリケーション開発 / 森 琢磨
特別会議室 / 13:30 - 15:30
- Ruby製アプリケーションを配布するn個の方法 / 原 悠
- tDiary の Ruby 1.9 対応の過程と今後のロードマップ / 柴田 博志
- Haml and Sass: Solution for you who get tired of ugly markup / 浦嶌 啓太
一橋記念講堂 / 16:00 - 17:00
中会議場 / 16:00 - 17:00
特別会議室 / 16:00 - 17:00
一橋記念講堂 / 17:10 - 18:10
*1:Twitter / Search - #rubykaigi makimoto とか (思ったより書き込んでいない)
*2:ライトニングトークについては割愛します。余力があるときにまとめるかも。RejectKaigi のものも含め、ライトニングトーク関係の資料を公開されている方が多く、 slideshare の rubykaigi2009 タグなどから辿ることができます。
2009-05-25(Mon)
■ 更にもう一つのカロリー計算API
YACA - Yet Another Calorie API なるものを公開しました。適当な入力に対し、ウェブ文書中からカロリーを調べて教えてくれるというサービスです。
企画的アイディアはカロリーAPI ダイエット2.0、技術的アイディアは有名人身長推定サイト SETAKEを参考にしました。そういう意味で yet another です。
普通の食べ物ではそこそこ妥当な結果を出すのは勿論のこと、明らかに食べ物ではないものについても結果を返してくれます。何が嬉しいかは謎です。
中で何をやっているのかというと、入力されたもののカロリーが載っているサイトを、Yahoo!デベロッパーネットワークのウェブ検索APIで検索し、複数のウェブページから得たカロリーの中央値・平均値をもとめて提示しています。極端に低かったり高かったりする値は誤取得として一定の閾値を設けてリジェクトしています。つまり、適当に調べているということなので、信頼性はそこまで高くありません。センシティブな用途に利用しないでください。*1
ウェブAPIを数回叩くので動作が重いのが難点ですが、memcached を使ったりして少し処理速度を向上させています。
API と名が付いているので、ウェブAPIな部分も公開しました。food パラメタに適当な文字列を入れて POST 乃至 GET で所定の URI に投げたら結果を JSON で返してくれます。*2 自由に使っていただいて結構です。ただ、サーバが崩壊するほど叩く可能性がある場合は一言連絡いただければと。
id:tohae の作った Twitter bot @tohae_call に採用されているようです。あと、negipo さんが書いたクックパッドのレシピにカロリーを付与するグリモンに採用してくださってますが、こちらは API 公開前のサービスページからのスクレイピングでカロリーを得ているので、もしかしたらちょっと HTML を弄った今は動かないかも。
*1:サービスのページにもある通り、アンサイクロペディアの免責事項を適用します。
2009-04-05(Sun)
■ どんなアカウント名が幸せか
某氏と恵比寿のアメリカンなカフェで食事を取っている最中、 Rob Pike 氏の話が出ました。
『プログラミング作法』*1を Kernighan と一緒に書いたり、ベル研で Unix や Plan 9 を書いてた Rob Pike 氏ですが、今は Googler になっているそうです。で、氏の現在のメールアドレスが r@ぐーぐるどっとこむ*2だそうです。
r。もし社内での全アカウントが r だとすると、ssh する時とかも ssh r@server_name で解決です。羨しい。自分も m@org_name.jp みたいなアカウントが欲しいものです。
計算機を扱う人間としては、自分のアカウントがどうなるのかは結構仕事のモチベーションにかかわっていく重大な問題です。
これまでのアカウントたち
まず、ぼくがこれまで貰ったアカウント名を振り返ってみます。
- 学部時代: u1445110@univ_name.ac.jp (学籍番号)
- 大学院時代: shimpei-m@grad_school.institute_name.jp (名全てと姓の頭文字。サブドメインとして所属研究科略称)
- インターン: shimpei.makimoto@org_name.jp (「名.姓」というスタイル)
- 会社、は一応非公開。姓ベースで頭に名のイニシャルが付くスタイル。
ということで、機関によって色々なアカウント命名規則がありました。
学部時代のアカウント名は学籍番号だったのですが、これがなかなかの曲者で、良く間違えられたし、自分でも結構間違えていました。ユーザを判別するのに、数値の羅列だけを割り当てるのは現代においてはナンセンスです。
大学院時代のアカウント名は個人的に気に入っています。この名をベースにアカウント名を決定する方法は結構妥当な手段で、名にバリエーションが多い日本人の場合は結構な確率でコンフリクトなしでアカウント名を割り振れます。ぼくが入る前年度まではアカウント名が8文字までという制限があったそうですが、ぼくの入学した年度からその制限が外れて無事9文字のアカウント名を手にすることができました。危うく shimpe-m となるところでした。
インターン先のアカウント名は完全なフルネームでした。これだとかなりの曖昧性解消が望めますが、如何せん長過ぎました。あと、このタイプだと同姓同名問題が更に大きくなります。自分の周りでは幸い同姓同名の人がいなかったのですが、もし、存在していた場合、どのような措置を取っていたのでしょう。
会社では姓ベースのアカウント名です。日本人の場合、名ベースよりも曖昧性が高くなりますが、日本の会社なのでファーストネームよりもファミリーネームが表に出ていた方がそれっぽいのかな、という気もします。ただ、弊社の場合8文字制限があるので、多くの人が名前を削られてしまっています。
では、どんなアカウントが良いのか
こんな感じで考えて行った結果、以下の3つが幸せなアカウントの条件になるのではないかと思います。
そういう意味で、ぼくのはてなIDである makimoto は条件1から3までをクリアしています。条件4についてはちょっと微妙ですが、実はまきもとという苗字はそうそうメジャーなものではないので、あんまり困らないんじゃないかなあと思います。ちなみに、ぼくのプライベートな計算機でのアカウント名は makimoto が多いです。
曖昧性除去の意味ではファーストネームを使った shimpei も良いかも知れません。しかし、しんぺいの場合、 shinpei と表記するケースがあり*3、氏名から復号の点でちょっと劣ります。
最初の例に戻って、Pike 氏のr@ぐーぐるの場合は、曖昧性の低さでは最低かも知れませんが、氏名から復号でき、覚えやすさや短さで他者を圧倒していると言えます。
結論
ということで、ぼくに {m,s}@org_name というアカウントをくれる機関で将来的に働きたいものですね。
*1:
- 作者: ブライアンカーニハン,ロブパイク,Brian Kernighan,Rob Pike,福崎俊博
- 出版社/メーカー: アスキー
- 発売日: 2000/11
- メディア: 単行本
- 購入: 42人 クリック: 799回
- この商品を含むブログ (190件) を見る
*2:一応、直書きしないように配慮
*3:ぼく個人としてはこちらの表記は全然使いませんが
2009-04-04(Sat)
■ Twitter のアイコンをランダマイズする Bookmarklet
ちょっとした JavaScript の練習に Twitter のアイコンをランダム表示させる Bookmarklet を書きました。
それが以下です。行全体を選択してブックマークバーに持って行けば登録できると思います *1。
javascript:a=$('.fn');b=$.makeArray(a.map(function(){return this.src}));a.each(function(){this.src=b.splice(Math.random()*b.length,1)});void 0
これを Twitter のページ上で使用すると以下のようになります。ちょっと分かりづらいかも知れませんが、ちゃんとアイコンがバラバラになっているのが分かると思います。
コードをもっと human-readable にすると、以下のような感じになります。Twitter は jQuery を使ているので比較的楽に記述することができます。
a=$('.fn'); b=$.makeArray(a.map( function(){ return this.src } )); a.each(function(){ this.src=b.splice(Math.random()*b.length,1) }); void 0
反省点としては、この Bookmarklet は143文字だったので、そのまま Twitter にポストすることができなかったことがあります。
たとえば、配列からランダムに要素を取り出す部分は、anArray.splice(Math.random()*b.length,1) とやっていますが、もっと短く書く記述がありそうな気がしています。




