Entries in 2008/11

指定のWebページに含まれる単語の出現回数をカウントする

HTML を Nokogiri に渡してテキストノードの内容だけを切り出して文字列にする.あとは文字列の中から単語っぽいものを見つけて計上する.文の解析はしていないから日本語とかは無理だ.

Example

ranking = count_word("http://infolab.stanford.edu/~backrub/google.html")

ranking.each do |word|
  puts "#{word[0]}\t#{word[1]}"
end

とすると

the		601
of		397
a		303
to		284
and		230
is		189
in		173
search	141
web		128
that		107
for		103
we		103
this		96
are		96
it		82
be		72
google	70
on		65
by		55
which	54
with		51
as		49
text		49
page		48
engine	48
results	47
pages	46
engines	46
have		46
from		45
can		44

(以下略...)

な感じです.

MOO.comのビジネスカードが届いた!

MOO.com の紹介エントリなんてすでに数え切れないほどあるけど,それでも書くよ!そういうテンション!

MOO.com | We love to print

MOOカードが届いた!

MOO カードが届いた!(ロケ地: ベランダ)

初のビジネスカード

MOO カードが届くのは今回で3回目かな.1回目は Flickr にアップした写真から100枚を選んで,ミニカードを頼んだ.

届いた!

並べてみる

Flikcr ミニカード100枚 (2006/11/02)

このとき,確か Skype のミニカードをお試しで作れるキャンペーンをやっていて,それも一緒にお願いした.

Skype版も届いた

Skype Me !

Skype ミニカード10枚 (2006/11/02)

2回目はアバウトミーのキャンペーンで,抽選で当たったときだ!ボクはちょー喜んだんだけど「私も当たったよ」って人が異常に多かった.応募者が少なかったのか,応募者全員が当選したのか,どっちでもいいや.とにかく届いた!

アバウトミーのmooカード

アバウトミーのmooカード

アバウトミー ミニカード100枚 (2007/08/15)

アバウトミーのデザイン1種類,選んだ写真3種類,合計4種類が25枚ずつだった.

そして3回目が今日でした!Flickr から写真を選ぶときは,MOO 用に Set を作って,そこにカードにする候補を放り込んでおくとよいですね.下のスクリーンショットのような感じで,Set から写真を取り出せます.

MOO.com | Choose your images

「よーし張り切って100枚選ぶぞー」と思ったら137枚も選んじゃって,「あちゃー この中から37枚も脱落させられないよー」とか思っていたら,ミニカードと違ってビジネスカードは50枚だったという…

そんなこんなありましたが,無事に50枚のビジネスカードが届きましたよー!調子に乗ってケースも一緒にポチった.次回のクレジットカードの請求こわい.

カードケースも一緒に買いました。

ビジネスカードとレザーケース (ロケ地: ベランダ)

あちらとこちらを行き来するのは楽しい!

ボクはあんまり「Web とリアル」とか,「ネト充とリア充」とか,分けて捉えていなくて,境界線なんてないものだと思っている.だけど一方で,この世界にあるものと Web にしかないものは,なんだか上手くつながっていないようにも感じる.

日々,この目で見るこの世界を,デジタルカメラで記録する.それを Web にアップロードする.アップロードした写真が,ロンドンからボクの家に送られてくる.これって当たり前のことかなぁ.とってもステキな体験のような気がして,MOO カードを頼んで,手元に届く度にテンションが上がるよ.

ボクは,写真の他にも多くを Web に預けている.日々の一部に Web がある.そうして蓄えられた日々がほんの少しでも,この手で触ることができるものになって,郵便受けに届けばいいな.MOO.com のサービスはそんな風に想わせてくれる.

届いたカードは…!

まずは今週,会社に新しく入ってくる人に渡そうと思う.週末には高専カンファレンスがあるから,そのときに配りたい!MOO カードの最大の欠点は,愛着が沸きすぎて配るのが惜しくなってしまうところだねぃ…

今回の50枚

世界に1枚ずつのカードをあなたに!june29 でした.

もういくつ寝ると高専カンファレンス

カンファレンスでは発表を聞いてー
ピザとビールで乾杯だー!

さーて自分の発表資料を作るか…

ポスターできました

高専カンファレンスポスター

製作: @psycho_mato さん

@psycho_mato さんは札幌高専出身の方です.札幌高専と言えば,残念なことにもうなくなってしまうのですが,全国でも珍しいデザイン系の学科を持つ高専です.さっすが本職の方は違いますね…!北海道開催のときにボクがなんとなく作らせていただいたものとはレベルが違う!

2008年12月6日(土)、高専カンファレンス 2008 Winter in 東京 開催です!

2008WinterTokyo – 高専カンファレンス Wiki

ものしりじいさん

ボクが小学校のときに夢中になった FINAL FANTASY V には,ものしりじいさんっていうキャラクタがいた.第三世界にいるものしりじいさんに話しかけると,それまでの戦闘回数や,宝箱の回収率などを教えてくれる.

ボクはなんとなく,自分の人生が終わるときには,ものしりじいさんみたいな人に会って(実際はじいさんじゃなくて,美女かもしれないな),生きていた間のすべてのデータを好きなように見ることができて,「食べたパンの枚数」とか「○○年の△△月は爪の伸びが早かった」とか,そういうのが全部分かるもんだと思っている.面白そうだよねー.

そんな想いもあって,Last.fm とか,Wakoopa とか,LDR candle とか Outputz みたいなサービスに魅力を感じて,楽しく利用させてもらっている.

人生の大きな目標のひとつは,自分を知ることだ.きっと,生のある時間は短すぎて,すべてを知ることはできない.ものしりじいさんに会って,何から何まで教えてもらったときに,「生きている間に知りたかったなぁ.辿り着きたかったなぁ」と,ほんの少しだけ愚痴をこぼしたあと,じいさんに一礼して,その場を去りたいな.じいさんも,長生きしてね.

CouchDBに触れてみた

聞くところによると,CouchDB の魅力ってのは,ドキュメント指向であったり,Map/Reduce であったり,その辺りにあるらしいのですが,ボクはまだよく分かっていません.このエントリでは,後述の目的を果たすために,CouchDB をサーバにインストールして動かしてみて,永続化ハッシュとして利用するために,値の格納と取得をやってみた,ってところまで扱います.その先の話はエントリを改めてまた今度.

目的

よく,cron なんかで定期実行させるスクリプトの中で,前回実行時の情報をファイルに保持させたりしている.これだとスクリプトを実行させるマシンが変わったときにそのファイルも忘れずに移動させなきゃいけないし,複数マシンで実行させるスクリプトともなると,協調が大変.そこで,情報を保持する箇所をひとつにし,かつ,どのマシンからでも情報を読み書きできる仕組みを用意し,ファイルに保持させないようにする.

CouchDB のインストール

Debian 機にインストールした.参考にしたのは以下のエントリ.ありがとうございました.

インストールしたサーバに設定したポート(デフォルトは5984)


http://my.server.jp:5984/

でアクセスすると

{"couchdb":"Welcome","version":"0.8.0-incubating"}

が返ってくる.ここがすでに JSON だ.楽しい.

ご丁寧にブラウザから中身を操作できる管理画面がついてくる.ここからデータベースを作成したり,レコードの値を書き換えたりできる.


http://my.server.jp:5984/_utils/

Screenshot of CouchDB Futon

couchdb.rb

今回使いたい get と put だけを実装した.公式のサンプルでは JSON 文字列を受け渡ししているんだけど,Ruby のハッシュをそのまま与えるようにしてみた.

photoshare2twitter.rb

ボクが iPhone で撮った写真をアップしている Big Canvas PhotoShare から,新着があれば Twitter に流すっていうサンプル.

Pit で CouchDB のホストとポートを取ってきて,photoshare ってデータベースの latest_processed_photo っていうドキュメントを get する.最後に処理した id より新しい id を持つ写真があれば put でデータを更新する.まさに Java の Map#get,Map#put と変わらない感じで書ける.ただし _rev ってのはリビジョン番号を表していて,これを正しく渡してやらないと

412: Precondition Failed (前提条件で失敗した)

が返ってくる.複数のトランザクションが同じドキュメントにアクセスするとき,整合性を保つために必要なのだろう.REST について勉強したときも感じたけど,HTTP メソッドとかステータスコードとか,すでにあるものをきちんと理解して,正しく使うってのは大事だなぁ.勉強になります.

今回のサンプルは,データベースもドキュメントもすでに存在することを前提としているから,本当は存在しなかったら作成するとか,そういう処理が必要だ.エラーメッセージも JSON に格納されて返ってくる.

まとめ

ひとまず目的は達成できました.最低限の機能でよければ CouchDB のラッパーは簡単に書けてしまう(中身は HTTP のリクエストを呼んでいるだけ) し,とても手軽に使える.

せっかくインストールしたんだから,もうちょっと凝った使い方もしてみたい.次に触ってみたいのは Map/Reduce です.