iPod touchでBPMを測るツールを作りました

デモ動画(約 10 秒)

先日、Leopard 旋風の吹き荒れる中、iPod touch を購入したので習作しました。


使い方は簡単で、以下の URL にアクセスして数字の上あたりをとんとんタップすると BPM が表示されます。電子式のメトロノームによく付いている機能です。ブラウザからも見れます。


http://lab.satoship.org/pocket/bpm/


内部的にタップした時間を保持しておいて、連続した 4 回のタップの間隔の平均値を表示しています。注意点としては、指で触れるタイミングではなく、指を上げるタイミングの時間を保持しているので、数字の切り替わりが予想したタイミングと違うかもしれません。裏でリズムをとるような感じでタップするとそこそこ予想通り使えるのではないかと思います。また、あまり速すぎると測りきれませんでした。だいたい 180 を越えると処理速度か何かが付いていってないような感じがします。


ちなみに、BPM とは Beats per Minute の略です(ウィキペディア)。曲の速さを表す単位で、数値は 4 分音符が 1 分間に刻まれる回数になります。使い道があるのかどうかはよく分かりませんね。暇な時に目をつむって 120 BPM を刻むゲームをするとか、緊張している時に 120 BPM を刻んでいるつもりが 300 BPM で「やっぱり緊張してる!!」と感じる遊びをするなんていうところでしょうか。


以下、技術的な話。


本当は、指で触れるタイミングで測定したかったのですが、JavaScript で onclick、onmousedown のどちらのイベントを拾っても指を上げるタイミングで測定されたので、そういう仕様なのだと思い諦めました。初めは JavaScript の処理が追いつかずに更新が遅れているのかと思い、id:amachangこれ を試したりしたのですが、何も変わってるようには思えずだめだなこりゃと諦めた後、タイミングが違うことに気づきました。コツをつかむとそれなりに正確な値が表示されてると思います。(もちろん JavaScript で高速化する余地は多分にあると思います。)


それから、値を更新する度に画面がちらつきます。再描画する範囲を狭くしたりしてみたのですがこれまた何も変わらず、なんだろうなと思いながら何度か試してみると選択範囲が薄暗くなることに気づきました。なのでタップする範囲を狭くすればちらつく範囲も狭くなるのでしょうが、親指でさっさっと隅の方をタップしたかったのでこのままにしました。iPodSafari は指を触れた時に選択範囲が薄暗くなって離した時にイベントが発生するという仕様なんですね。


iPod touch 用 Web アプリケーションについて


このツールは、以下のサイトを見ながら作りました。


iPod touch 上で動くアプリケーションには、「Web アプリケーション」と「ネイティブアプリケーション」があります。「ネイティブアプリケーション」はまだ開発できないので、勝手に作れるのは「Web アプリケーション」だけになります。このツールは HTML と JavaScript だけで作られているのでツールと書きましたが、「Web アプリケーション」と呼んだ方が分かりやすいのかもしれませんね。うーん、でもそれはやっぱりおかしいかな。まいいや。


上記の Apple のサイトでは、画面サイズから推奨される各項目のサイズや文字の色などが書かれているので、とても作り易かったです。また、Wi-Fi なので動作確認が携帯用サイトよりも楽でした。


ところで、小さい画面でサイズや色などの指示をされたら表現の範囲が狭まじゃないかとも考えられますが、Twitter では限られた文字数だからこそおもしろい発言が飛び出すように、制限にはそれなりのおもしろさがあるのではないかと思います。


最後になりますが、本体を傾けると画面が横になる機能は結構やっかいでした

Award on Rails で協賛企業賞を頂きました

今日は Award on Rails の表彰式に行ってきました。そこでなんと hightime.jp が、協賛企業賞のクックパッド賞を受賞しましたクックパッドさんありがとうございました。


表彰式の後の懇親会で、クックパッドのかたとお話したのですが、サービスのアイデアを褒めてもらえたのが嬉しかったです。iPod touch にも対応してと言われたので、まずは明日 iPod touch を買いに行こうかと思います。


副賞ということで、料理本を 4 冊とトートバックをもらいました。パスタ好きなのでこれは嬉しい賞品です。ありがとうございます。


審査結果はこちら。大賞は http://fooo.name/ かと思っていたのですこし驚きました。残念ながらまつもとゆきひろさんは来れず、ムービーでのコメントだったのですが、プログラミングできるツールに惹かれるということで、アドベンチャーゲーム共有サイトを選んでいたのが印象的でした。


懇親会では他の応募者のかたなどといろいろ話せて楽しかった。みんないい人でしたね。懇親会中にGigazinize Toolsnoriaki さんよいさいとkoress.jp さんhakatter作者のかた がデモしてました。koress.jp さんの発表がおもしろかった。

ひとり Award on Rails 反省会 / 他の人の応募作を見た

今週末に表彰式が行われる Award on Rails ですが、他の人の応募作を全部見てみました。

感想

当たり前なことも多々ありますが、好き勝手な感想です。たくさんのサービスを試してみるという行為ならではの感想もあるかもしれません。

  • サービス名は分かりやすい方がいい
    • 日本語の方がいいかどうかは微妙
  • 審査・投票画面のサムネイル写真は重要
  • 作品紹介の最初の 1 行は重要
    • それだけで「おもしろそうなサービスだな」というのもあった
  • デモユーザ(ゲストユーザ)があると試しやすい
    • 目立つところに情報があるとさらによい
    • ログイン画面にテスト用のユーザ名とパスワードが書いてあるのはさらによさげ
    • 作品紹介の所にも書いてあるのもよい
    • ログインの必要がないとさらに試しやすい
  • ユーザ登録に email の必要がないと試しやすい
  • ユーザ登録後はログイン状態になっていると使いやすい
    • 流行っているサービスには当てはまらないだろうけども
  • URL は www から始まらないほうが目立つ、というか URL から思い出しやすい
    • サービス名と似た URL というのも思い出しやすい
  • ブックマークレットが用意されているとなんか格好いい
  • Comet 賞があるのに Comet を使ったサービスがあまりなかった
  • テキストボックスのフォントとかを大きくして、最近のサービス風(?)というのはあまりなかった
  • マッシュアップは地図を使うのが多かった
  • 携帯連携は位置情報を使うのが多かった
  • 何かのテーマについて投稿しあうようなサービスがいくつかあった
  • 日々記録してグラフにするサービスがいくつかあった
  • はてなlivedoor の認証を利用したサービスが結構あった
    • OpenID はあまりなかった。fooo.name だけ?
  • 異様に本格的でたまげたサービスがいくつかあった
  • 「新規登録」リンクが右上だけというのは分かりにくいかもしれない
  • 開発ブログがサイドに表示されているのはいいかもしれない
  • サービス自体のソーシャルブックマークの登録数や登録リンクを表示するのもいいかもしれない
  • トップページで盛り上がってる感が分かるといい
    • 「最近登録された〜」など

気になった作品

なんか気になったサービスをいくつか列挙します。僕の作っているサービスも取り入れられるものは取り入れたいと思ってます。

僕の応募したサービスの反省

  • 作品紹介ページにモバイル版の URL も明記しておけばよかった
  • トップページにサービスの簡単な紹介を書いておけばよかった
    • ゲストユーザも
  • ロゴ

などなど

ひとり Award on Rails 反省会 / デザイン本を読もう

Award on Rails一般投票が受付中です。


作品がここで一覧になっています。
http://mala.nowa.jp/entry/3f2e8e7000


ここでは、はてなブックマークと一緒に一覧になっています。
http://polog.org/files/aor_hatena.html


僕の作ったサービスは、1 user となっていますが、僕自身です。やらせっぽいけど、そんなつもりはありませんでした。


他の人のサービスを見て思ったのは、ソーシャル的なサービスが多かったことです。僕は俗にいう LifeHacks に分類されるような、サービスを作ったつもりなのですが、そういうのはあまりなさそうでした。それから、もう一つ感じたのは、デザインのかっこいいサービスが多かったこと。みんなすごいですね。


そんなわけで、Web サイトのデザインに役立ちそうで、かつデザインを学んだことがない人向けの本を 2 冊読み始めました。


これらの本は、いつか読みたいと思っていたのですが、そう思わされたレビューは以下。

「Shibuya Perl Mongers テクニカルトーク #8」に行ってきました

10/1(月)に開催された Shibuya Perl Mongers テクニカルトーク #8 に行ってきました。早めに着いたので前の方にいたら、隣に座った人が id:swdyh さんだったので「AutoPagerize いつも使ってます」とわけの分からない挨拶をしていまいました。Perl を始めたのは今年に入ってからなのですが、YAPCの時よりはついていけたような気がしました。


当日、otsune さんと Yappo さんによって ustream で配信された動画を録画したものがここにあります。
http://ustream.tv/search/recorded/tag/shibuya.pm


スライドはここに上がるようです。
http://www.slideshare.net/group/shibuya-perl-mongers


インターネット便利すぎる。
ということで、各発表の感想を一言ずつ、復習とメモ代わりに書いておきます。

Main Talks

Gungho, Swarmage, POE::Component::MDBAによるデータ収集 - 牧さん


作成中の以下のモジュールのお話。


細かいところは、ほとんど理解できませんでしたが、名前がかっこいいなと思いました。

MogileFSのplugin拡張 - ZIGOROuさん

分散ファイルシステムのお話。またしてもよく分からなかったが、plugin、hook というキーワードが並んでいておもしろそうだったので、時間を掛けて資料を読んでみようと思いました。


Software Design の 2006年 9,10,11 月号で記事を書いているとのことなので、そっちも見てみよう。

Class::Component - Yappoさん

クラスの拡張をプラガブルに行えるモジュールのお話。かっこいい。id:amachang のプレゼンツールを使っているんですね。gihyo.jp で連載が始まったとのこと。

Guest Talks

JavaScript::Writer - gugodさん

PerlJavaScript のコードを出力するモジュールのお話のようでしたが、英語での発表のため、ほとんど分かりませんでした。

Practical Web Scraping with Web::Scraper - miyagawaさん

先頭の文字を見て XPathCSS Selector を切り替える所と、自動でコードを生成する所がかっこよかった。

Lightning Talks

Twiki - 今津英世さん

Perl で書かれている wiki なのに、あまり使われていないとのこと。Perl の学習用にもよさそう。

僕の夏休み? - Emerson Millsさん

スクラムや S3 のお話。

Perlで入門テキストマイニング - Tatsuwoさん

検索エンジンの結果で関連指数というものを出していました。なるほど。自分が書いたブログを解析するというのがおもしろいと思いました。

6年前に作ったプログラムにテストコードを書きました ^^); 〜〜 テスト駆動開発の薦め - Yuumiさん

テストコードを活用して、アプリケーションのコア部分を書き換えたというお話。

Plagger。みんなで使えば恐くない。 - makotokagaさん

Plagger は便利だが、インストールとかレシピとか技術が必要なので、もっと広く使われるために、サーバで一括管理し、みんなで触って初心者でも使えるようにしようという話。CGS(Contents Generated Service)というのがおもしろいですね。サービスをみんなで生成していくからCGS。

Gungho と Web::Scraper で mashup - Keiichi Okabeさん

クライアントアプリケーションがネットワークを飛び回るという話が気になったが、ちょっとよく分かりませんでした。

Flash with perl - typesterさん

Flash おもしろいよ!というお話。僕はいまだに Flashブラックボックスで憧れています。話に出てきた http://ttyshare.com/ という typ を録画したものを共有するサービスは初めて知りました。

Pushmi の話 - mizzyさん

Subversionレプリケーションツール Pushmi のお話。SVK がベースらしい。mizzy さんの利用例として、東京と福岡にいるチームの話をしていました。作業の自動化などのコードは共通なので、1 つのレポジトリで管理したいが、ネットワーク障害等によりアクセスできなくなると困る、コミットはいいとしても参照はしたいので Pushmi を使用しているとのこと。

イメージファイト - TAKESAKOさん

凄かった。以下のアドレスにアクセスすると、使用しているブラウザの画像が表示されるのだが、JavaScript を使ってるのではなく、ブラウザごとの画像表示のバグとか実装の違いを利用しているらしい。
http://wafful.org/~takesako/html20hacks/browser-detect3.html


各ブラウザのソースコードを読みながら作ったのかな。凄すぎる。

Jifty::DBI in five minutes - charsbarさん

Jifty::DBI のお話。

なぜ人はGopherに飽きるのか - tokuhiromさん

Gopher とは「インターネットに接続されたコンピュータにどのような情報があるかを検索するシステム」。古くて新しいプロトコルかと思ったら、古いだけだったと言ってました。

リビドー駆動開発によるPlaggerCatalystを使った(Mashup)サイト開発 - yusukebe

締めは、CDTubeエロサイトで有名な yusukebe さん。いつの時代もエロのニーズは一定量あるので、とっかかりとしてエロ便利サイトを作っているのかなと思っていましたが、エロを前面に出した発表でした。凄く勢いのある発表でかっこよかった。

higitime.jpについて


先日のエントリの通り、ドリコムAward on Rails への応募作品として作成しました。
僕が前から欲しかったものでもあるので、自分で使ってみてそこそこ便利なアプリケーションになったと思います。(僕と同じように、この種のアプリケーションを使いたいという人がいるかどうかはかなり疑問ですが。)

URL

PC: http://hightime.jp/
携帯: http://hightime.jp/mobile/login/


携帯からのユーザ登録はできません。携帯版は、PC でユーザ登録してから利用可能になります。

サンプルユーザ

ユーザ名: testing
パスワード: testing


上記のユーザ名、パスワードでログインすれば、ユーザ登録なしに、どのようなアプリケーションか試すことができます。是非お使い下さい。


ログインはこちらから
http://hightime.jp/login

どういうアプリケーション?

ストップウォッチで計った時間を記録していく、というシンプルなアプリケーションです。
(この計った時間を、以下「ベル」と呼びます。)


画面構成は、twitter のようにユーザごとのホームで「ベル」の一覧が表示され、「ベル」ごとに個別のページがあります。タイムラインはありません。
サンプル: http://hightime.jp/satoship

何ができるの?

例えば、

  • 本を 1 冊読むのにどのくらいの時間が掛かるかを計ることができる
  • ブログを読んでいる時間を計っておいて、「へー、自分で感じているよりも時間を割いていないんだな」と新たな発見があるかもしれない
  • やりたくないこと(風呂掃除とか)の時間を毎回計っておいて、「今日は前回よりも早く終わらせてやる」とつまらないことを少しだけ楽しくやれるようになるかもしれない
  • お茶の水-新宿間などで、「みんな快速に乗ってるけど、実際どれだけ違うんだろうか」という疑問の答えが簡単に出る(もちろん、実際に計ってみれば分かることですが、快速で計って、次に各駅に乗った時には快速の時の時間を忘れているという事態にも対応可能)
  • 会社から自宅までの時間を計ることができる
  • 朝起きて携帯から「スタート」し、会社について PC から「ストップ」し、ベッドからデスクまでの時間を計れるかもしれない
  • 帰省時間を記録しておいて、毎回「ええと、実家までどれくらい掛かるんだったかな」という記憶の呼び出しをしなくてよくなるかもしれない
  • ブログを書く時間を計っておいて、「ブログを書くと時間がかかるから今日はやめよう」と考えるところ、なんとなく時間が掛かるというのではなく、前回はどのくらい掛かったか、というのを元に判断することができるかもしれない

などなど

注意すること

  • プライベート機能がないため、誰かに見られて困る情報は書き込まないようにして下さい。
  • 携帯のURLは、利便性のため、毎回ログインの必要ない「非公開 URL」を使用しています。よって、誰にも教えないように気をつけて下さい。また、「非公開 URL」は、アクセス不可能な URL ではないので、他の誰かにアクセスされる可能性があります。

その他の機能

タグ機能

タグによる絞り込みができます。


複数タグによる絞り込みは、ディレクトリ構造ではなく、以下のようにアンダースコア("_")で繋げて使用します。

http://hightime.jp/satoship/reading_feed
http://hightime.jp/satoship/from_company_to_home

AutoPagerize に対応

class に指定しただけですが、いい感じの位置に挿入されるように、フッターとページネーションを調整しました。
参考: http://d.hatena.ne.jp/swdyh/20070701/1183239979

作成の動機

僕は記憶力が悪い上に面倒くさがりです。


なので、例えばブログを書こうとか家計簿を書こうとか思った時に、「待てよ、今それをやったら今日は終わってしまうんじゃないだろうか」という考えが脳裏に浮かび、そんなことを考えている内に、無駄な時間を過ごしてしまうというようなことが多々あります。


そこで、そういう時間を毎回計っておいて、平均値を出しておけば、予定も立てやすくなるんじゃないかなと思いました。また、「何ができるの?」で箇条書きにしたことを実際にやりたい、というのも動機になりました。


とはいうものの、単純に何をするのにどのくらい時間が掛かるか、という情報を記録するのもおもしろいんじゃないかなと思ったのが 1 番の動機です。

技術的な話

使用したプラグインやサービス

レンタルサーバ

初めさくらインターネットを予定していましたが、rails アプリは CGI になってしまい、あまり早くなかったので、ここにしました。当然、レンタルサーバなので、TextDrive もそれほど早くはありませんでした。ただ、ActionMailer をほぼ設定なしで使えるというメリットがあります。

rails プラグイン

タグ機能を追加するプラグインです。
Railsレシピ には、acts_as_taggable が説明されていましたが、acts_as_taggable_on_steroids の方がいいよと書いてあったので、こちらを使いました。

携帯電話関連のプラグインです。
全角カタカナを半角にし、文字コードShift_JIS に変換する処理にしか使用していませんが、他にもたくさん便利な機能があります。

画像生成サービス

今後

Award on Rails の審査中はアップデートできないと思いますが、その後の予定。

  • プライベート機能
  • タグで絞り込んだ一覧の、合計時間や平均時間を表示したい
  • 「ベル」同士の時間を計算して次のようなことが分かる表示をしたい
    • いつも 3 ヶ月おきに髪を切ってるから、そろそろ髪を切るころだな

Ruby on Rails で開発した感想

  • rails 自体が徹底した DRY かつ富豪プログラミングなので*1、実装方法には迷わず富豪的な方を選ぶようにした。
  • rails の使い方は、書籍等で学習できるが、もちろん自分がやりたいことができないという局面が多々あるため、railsソースコードを素早く調べながら開発できる環境を揃えた方がよいと思った。
  • まずは、プラグインとして開発して、ビジネスロジックをアプリケーション側に移動するという流れもよいかもしれないと思った。
    • そうすることで、別の視点でロジックを分割しやすい
    • 例えば、このアプリケーションでは、「非公開 URL」を、アカウントの有効化、パスワードの再設定、携帯の 3 つで使っているので、あとから抽象化したが、さらにプラグイン化したくなった。だったら、共通部分をプラグイン化するよりも、ビジネスロジック部分を非プラグイン化した方が、多分楽だし、構造的に考えやすいのではないかと思った。

*1:例えば http://d.hatena.ne.jp/elm200/20070724/1185282738 から引用 > "get post put delete head と5種類しかリクエストがないのだから普通に def でメソッド定義してもよさそうなものだが、潔癖なまでに繰り返しを嫌う Rails の特徴がよく現れている"

ドリコムの Award on Rails にエントリーしました。

エントリーは参加表明で、完成したら応募するという流れのようなので、とりあえずエントリーだけ。とはいっても、締め切りは 9/25 なので、あと少しいじって応募するつもりです。


ちなみに作ってるのはこれす。
http://hightime.jp/


ストップウォッチの結果を記録して行くというシンプルなサービスです。