Hatena::ブログ(Diary)

まきもと (仮) このページをアンテナに追加 RSSフィード

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

サーバサイドの設定

動作条件は RubyCGI が使える、といった程度です。

例えば、以下のようなディレクトリ構成にします。それぞれ適切なパーミションを設定し、data ディレクトリと bin ディレクトリについては HTTPアクセスできるようにします。

mygyazo
 - db   # データベースが格納される
 - data # 画像データが格納される
 - bin  # スクリプトが格納される (CGI が実行できるように設定する)
    - upload.cgi # アップロードCGI

サーバスクリプトServer/upload.cgi ですが、コメント込みで24行とかなりシンプルです。

実際やっていることは以下に挙げられることのようです。

以下のコメントにあるようにスクリプト自分の設定に合うように書き換える必要があります。

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キャプチャ画像を生成する部分のみバイナリ提供されており、画像データの送信・受信は Ruby スクリプトで実装されている

2010-04-13(Tue)

Yahoo! 検索プラグイン開発ツールで遊んでみた話

半年ぶりくらいの更新ですが、特に大きな前置きもなく本題に入ります。

今日Yahoo! デベロッパーネットワークから Yahoo! 検索プラグイン開発ツールが公開されたので、さっそくみんな大好きふぁぼったーをネタに遊んでみました。

これは何?

こんな感じで Yahoo! 検索の結果ページに favotter.com/user/* が来たらアイコン出してみたり、新し目のポストを出してみたりしています。

f:id:makimoto:20100414015927p:image

作り方

ドキュメントが驚く程充実しているので、そっちを読んでいただくのが速いです。

簡単に言うと、YST のインデクスや任意のページを XLST で変換して構造化したデータサービスと呼ばれるものからデータを引っ張ってきて、PHPフロントエンド表現記述するといった感じです。ということで、コードデータサービス定義する XLST のものと外側の表現定義する PHP のものの2つだけです。

一応これらも GitHub に上げておいたので、こちらも関心があれば。

まとめ

2009-09-14(Mon)

NLP 若手の会 第4回シンポジウムのお知らせ

牧本もプログラム委員の末席にこっそり載っている*1NLP 若手の会 第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 として参加していたいしています。去年までは形態素解析器や構文解析器の話が中心だったのですが、今年からはマイニング関係の講義も追加されたようです。なにぶん若手シンポと日程がまる被りなので、両方参加というのは難しいと思いますが、まさにこれから自然言語処理を始めるという方にはこちらもお勧めです。

ということで、秋の京都で薄暗い大学の部屋に閉じ籠って自然言語処理に戯れましょう。

*1:何故そうなったかというと、前回のシンポジウムの (飲み会の) 際に某氏にうっかり名刺を渡してしまったからです

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
会議場 / 14:40 - 16:10
特別会議室 / 14:40 - 16:10
一橋記念講堂 / 16:40 - 17:40
特別会議室 / 16:40 - 17:40

2009年07月18日金曜日 (2日目)

一橋記念講堂 / 10:00 - 12:00
会議場 / 10:00 - 12:00
特別会議室 / 10:00 - 12:00
一橋記念講堂 / 13:30 - 14:30
一橋記念講堂 / 16:00 - 18:30
会議場 / 16:00 - 18:30
特別会議室 / 16:00 - 18:30

2009年07月19日日曜日

一橋記念講堂 / 09:30 - 12:00
会議場 / 09:30 - 12:00
特別会議室 / 09:30 - 12:00
一橋記念講堂 / 13:30 - 15:30
会議場 / 13:30 - 15:30
特別会議室 / 13:30 - 15:30
一橋記念講堂 / 16:00 - 17:00
会議場 / 16:00 - 17:00
特別会議室 / 16:00 - 17:00
一橋記念講堂 / 17:10 - 18:10

*1Twitter / 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サービスのページにもある通り、アンサイクロペディアの免責事項を適用します。

*2こんな感じ

2009-04-05(Sun)

どんなアカウント名が幸せ

某氏恵比寿アメリカンカフェで食事を取っている最中、 Rob Pike 氏の話が出ました。

プログラミング作法』*1を Kernighan と一緒に書いたり、ベル研UnixPlan 9 を書いてた Rob Pike 氏ですが、今は Googler になっているそうです。で、氏の現在メールアドレスr@ぐーぐるどっとこむ*2だそうです。

r。もし社内での全アカウントが r だとすると、ssh する時とかも ssh r@server_name で解決です。羨しい。自分も m@org_name.jp みたいなアカウントが欲しいものです。

計算機を扱う人間としては、自分アカウントがどうなるのかは結構仕事モチベーションにかかわっていく重大な問題です。

そんな訳で、理想的なアカウント名を考えて行こうと思います。

これまでのアカウントたち

まず、ぼくがこれまで貰ったアカウント名を振り返ってみます。

  1. 学部時代: u1445110@univ_name.ac.jp (学籍番号)
  2. 大学院時代: shimpei-m@grad_school.institute_name.jp (名全てと姓の頭文字。サブドメインとして所属研究科略称)
  3. インターン: shimpei.makimoto@org_name.jp (「名.姓」というスタイル)
  4. 会社、は一応非公開。姓ベースで頭に名のイニシャルが付くスタイル

ということで、機関によって色々なアカウント命名規則がありました。

学部時代のアカウント名は学籍番号だったのですが、これがなかなかの曲者で、良く間違えられたし、自分でも結構間違えていました。ユーザを判別するのに、数値の羅列だけを割り当てるのは現代においてはナンセンスです。

大学院時代のアカウント名は個人的に気に入っています。この名をベースアカウント名を決定する方法は結構妥当な手段で、名にバリエーションが多い日本人の場合は結構な確率コンフリクトなしでアカウント名を割り振れます。ぼくが入る前年度まではアカウント名が8文字までという制限があったそうですが、ぼくの入学した年度からその制限が外れて無事9文字のアカウント名を手にすることができました。危うく shimpe-m となるところでした。

インターン先のアカウント名は完全なフルネームでした。これだとかなりの曖昧性解消が望めますが、如何せん長過ぎました。あと、このタイプだと同姓同名問題が更に大きくなります。自分の周りでは幸い同姓同名の人がいなかったのですが、もし、存在していた場合、どのような措置を取っていたのでしょう。

会社では姓ベースアカウント名です。日本人の場合、名ベースよりも曖昧性が高くなりますが、日本会社なのでファーストネームよりもファミリーネームが表に出ていた方がそれっぽいのかな、という気もします。ただ、弊社の場合8文字制限があるので、多くの人が名前を削られてしまっています。

では、どんなアカウントが良いのか

こんな感じで考えて行った結果、以下の3つが幸せアカウントの条件になるのではないかと思います。

  1. 氏名から復号できる
  2. 短い
  3. 覚えやすい
  4. 曖昧性が低い (アカウントコンフリクトが少ない)

そういう意味で、ぼくのはてなIDである makimoto は条件1から3までをクリアしています。条件4についてはちょっと微妙ですが、実はまきもとという苗字はそうそうメジャーなものではないので、あんまり困らないんじゃないかなあと思います。ちなみに、ぼくのプライベート計算機でのアカウント名は makimoto が多いです。

曖昧性除去の意味ではファーストネームを使った shimpei も良いかも知れません。しかし、しんぺいの場合、 shinpei と表記するケースがあり*3、氏名から復号の点でちょっと劣ります。

最初の例に戻って、Pike 氏のr@ぐーぐるの場合は、曖昧性の低さでは最低かも知れませんが、氏名から復号でき、覚えやすさや短さで他者を圧倒していると言えます。

結論

ということで、ぼくに {m,s}@org_name というアカウントをくれる機関で将来的に働きたいものですね。

*1

プログラミング作法

プログラミング作法

*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 のページ上で使用すると以下のようになります。ちょっと分かりづらいかも知れませんが、ちゃんとアイコンがバラバラになっているのが分かると思います。

f:id:makimoto:20090405011824p:image

コードをもっと human-readable にすると、以下のような感じになります。TwitterjQuery を使ているので比較的楽に記述することができます。

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) とやっていますが、もっと短く書く記述がありそうな気がしています。

*1:大抵の環境ではみ出ていると思いますがご了承を。