PyCon JP 2012(App Engine Conference 2012)でパネルディスカッションのモデレータしてきました

PyCon JP 2012に参加してきました。初めてパネルディスカッションのモデレータをつとめる事になりドキドキしていたのですが、Google App Engineに詳しいスペシャルなパネラーさんのおかげでなんとか終わりました。


当日どれくらいの人が来てくれるのか不安だったのですが、蓋を開けてみればほぼ満席になっててほっとしました。これもひとえにパネラーさんの力だったと思います。内容はいかがだったでしょうか。

  • こんなステキなイベントを企画・運営して頂けたスタッフに感謝!
  • 一言返事で力を貸してくれたパネラーのみんなに感謝!
  • パネルディスカッションのモデレータという機会をくれたGoogle 松尾さんに感謝!

パネルディスカッション:Google App Engine を選ぶ理由

  • お題
    • なぜGoogle App Engineを選択したか
    • Google App Engineによって開発がどう変わったか
    • 向いてる/向いてないアプリケーションとは?
    • 価格について(でもお高いんでしょう?)
  • パネラー
    • @najeira
    • @tmatsuo
    • @knj77
    • @shin1ogawa

テスト駆動JavaScriptの第2章をメモ

Node塾 講義その6に行くのでメモった


Node塾で下記の読書会をする。

テスト駆動JavaScript

テスト駆動JavaScript


以下は第2章を抜粋したメモ。これを読んで頂ければわかるがテスト駆動JavaScriptJavaScriptでTDDをするにはどうすればいいかだけに答えるものではなく、TDD未経験者でもTDDとは何なのか?どうやってTDDを身に付けるのかを記載した本になっている。興味があれば買うといいよ。そしてNode塾に参加すればいいと思いますよ。

第2章 テスト駆動開発プロセス

  • テストから仕様へ
  • テストは本番コードを書く前に、仕様として書かれる
    • 利点
      • テストがしやすくなる
      • インターフェースがクリーンになる
      • デベロッパーが自信を持てるようになる
  • 開発の上下をひっくり返す
    • テスト駆動開発では、問題を解決するためにどのようなコードが必要なのかを考えるのではなく、まず目標を定義するところから始める
    • 単体テストはどのような動作がサポートされ、計算にはいっているかを示す仕様書になる。
  • テスト駆動開発における設計
    • TDDは、何もないところから優れた設計を自動的に生み出すわけではなく、作業の進展とともに設計を進化させやすくするのである
    • TDDは、単体テストに強く依存しているため、他の部分から切り離して単独のコンポーネントに力を注ぐ開発スタイルになる。
      • そのため、コードの疎結合を保ち、単一責任の原則を守り、不必要にコードが水ぶくれすることを防ぐ
    • テスト駆動開発のもとでは、設計のことをじっくりと考えないわけにはいかなくなる
      • いつでもまず単体テストという形で妥当なユースケースを組み立てるところから仕事を始める
      • 単体テストを書くためには、思考実験が必要
        • 解決しようとしている問題を記述しなければならない
        • それが終わらなければ、実際にコーディングをスタートさせる事ができない
      • TDDはソリューションを提供する前に、結果について考えなければならない
  • プロセス
    • 4つのステップ
      • テストを書く。
      • テストを実施する。新しいテストが不合格になるのを確認する。
      • テストに合格するようにコードを書く。
      • リファクタリングして重複を取り除く。
    • テストを書くことこそが設計になる
    • テストを書くということは
    • TDDのイテレーション
      • 今どの段階にいるのかを意識し、よく考える事
    • TODOリスト
      • 例)引数が足りないときはエラーを投げる
  • Step1.テストを書く
    • 優れたテストは短く
    • 関数/メソッドの単一のふるまいだけを対象に
      • 1つのふるまいだけのテストを作るための目安
        • できる限りすくないコードでテストを不合格にすることを考えるとよい
        • 新しいテストは、すでに動作することがわかっているアサーションを重複させないように
    • 単体テスト
      • 既知の入力を渡し、
      • 出力が想定通りになっていることを
      • アサートして
      • コードが想定通りに動くことをチェックする
    • ※入力
      • 関数の引数だけではない
      • グローバルスコープ
      • 特定のオブジェクトが特定の状態になっていること
      • など
    • ※出力
      • 戻り値だけではなく
      • グローバルスコープや
      • 所属オブジェクトの変化も含む
  • Step2.テストが不合格になるのを確認する
    • 合格するコードを書く前にテストを実行する
      • 理由
        • コードの現在の状態について、私たちの理論の正しさを確かめること
        • テストがどのように不合格になるのかについて明確に想定できていなければならない
        • 単体テストにもバグがある)
  • Step3.テストを合格させる
    • テスト駆動開発プロセスにはあるリズムがあり、作られたソリューションがその時点では完璧でなくても、イテレーションを完結させたというパワーを過小評価すべきではない
    • 自明の実装
    • テストを合格させるために必要なだけのコードを追加する
    • コードを追加させるということはふるまいを追加すること
      • 追加されたふるまいは、追加された要件によって表現されなければならない
      • 明確な要件を背後に持たないようなコードがあるとすれば、それは水ぶくれに過ぎない
    • YAGNI「you ain't gonna need it」
      • それが必要になることはない
      • 必要になるまで機能を追加してはならないという原則
      • いつかいいことをしてくれるという前提のもとでコードを追加すると、その部分の必要性を具体的に示すユースケースがないのに、コードベースに水ぶくれの無駄なコードを追加することになる
      • YAGNI違反の一つは、メソッド引数を過度に柔軟にすること
      • 追加したコードの妥当な使い方を具体的に示すテストが作れるようになるまでは、そのコードを追加してはならない
    • 足場
      • ハードコードでもかまわない
      • 何も手がかりがないのに一般的なソリューションを探さなければ先に進めないようにすると、時間を使いすぎてしまう
      • 開発ペースを保つために、中間的なソリューションとしてハードコードを認めている
  • Step4.重複を取り除くためにリファクタリングする
    • 重複を取り除き、設計を改良する
    • ルールはテストはグリーンのまま維持するということ
    • 同時に複数の作業をしてはならない
    • リファクタリングとは、インターフェースを変えないようにしながら実装を書き換えることだ
    • 重複は、テストでも本番コードと同じように望ましくない
      • テストとシステムが密結合になりすぎていることを表している
      • 密結合になりすぎている場合は、(ヘルパー)メソッドの抽出などのリファクタリング技法を使って重複を取り除く
      • テストもコードなので、メンテナンスが必要
  • シャンプー、リンスの繰り返し
    • 1歩の大きさを大きくしたくなるかもしれないが、ひんぱんにフィードバックをもらえる状態に保つために、サイクルは短くした方がよい
    • 一歩を大きくしすぎると、追跡しにくいバグや手作業のデバッグなど、このプロセスで避けようとしている多くの問題に直面することになり、このプロセスを採用した意味がなくなる
  • テスト駆動開発を円滑に進めるために
    • 自動テストを実行すること
      • ファイルが保存されるたびにテストが実行されるようにするということ
      • テストの実行は環境のほうの仕事
  • テスト駆動開発の利点
    • 動作するコードが手に入る
    • 単一責任の原則を尊重できる
    • 意識的な開発が強制される
      • ふるまいを記述するテストを書くことから始まるので、書く前にコードについて考えなければならなくなる
      • 解こうとする前に問題について考えると、しっかりとしたソリューションを作れる可能性が大幅に上がる
      • 代表的なユースケースを通じて各機能を記述することから始めると
      • コードを小さく保てることが多い
      • コードの実際の使用例から書き始めるので誰も必要としない機能を導入する可能性は下がる。YAGNI原則
    • 生産性が向上する
      • 以前よりもテスト、コードの入力のためにエディタで使う時間は少し長くなるだろう
      • しかし、ブラウザでF5キーをたたきまくる時間は大幅に短縮される
      • テストによってカバーされているコード
      • リファクタリングはもう怖くなくなるだろう
      • ストレスは減り、以前よりも幸せな気分で素早く仕事がこなせるようになる
  • まとめ
    • イテレーション
      • 新しいふるまいをテストに書き
      • テストを実行して想定通りに不合格になる
      • テストに合格するために必要な最小限のコードを書き
      • 最後に重複を取り除き
      • 設計を改良するために、積極的にリファクタリングをかける

2011年も今日でおわり

毎年、年末年始にみんなblog書いてるので私も何か書こうかなと思うのだが、特に書くことない。今年は、特別何かの技術に特化して調査したりすることもなく淡々と自分のいま持っている技術でモノを作るというのをしていた気がする。

Google App Engine

2009, 2010はGoogle App Engineの年だったけど、今年はもうただ使うというだけで特に目新しく調査したりする事もなく普通に使えるインフラになっている。なのであんまりどうこうした記憶もない。今年やったことと言えばデブサミでLT大会に参加して賞状を頂いたくらい(あとajnのLT一回)。今後も淡々と使う。来年くらいはwebsocketが正式に対応されそうな予感。

earthquake Notify

3.11に東日本大震災があって作ったchrome拡張の緊急地震速報。作る時間は2~3時間くらいだったけど今でも役に立ってる。(すぐに作れたのはatnd notifyという2010年のMA6用のアプリがあったから)
http://nanapi.jp/25687/

Help Me Tutor

クックパッドの開発コンテスト24に急遽参加しようと思って @jishiha さんと @monoooki さんを誘って参加。
課題が発表されて24時間以内にその課題を解決するアプリを作るというコンテストで今回の課題は「(普段の生活で)半径3m以内にいる人が困っていることを解決する」でした。私たちはハンズオン形式の研修などで分からないけど講師に質問できない人がいるよね。それって「わかりません」を気軽に講師に通知できればいいんじゃないのという事でHelp Me TutorというChrome 拡張を使ったアプリを作った。しかし、受賞できず。


詳細は @jishiha さんのblogに委譲するとして


私はここで得られた知見は結構あって、24時間でもそこそこのモノができるという事とやっぱり複数人で作業分担ができるといいねって事とデザイナーがいることによって予想以上に開発スピードは速くなるという事でした。


開発はまーこれくらいだったら数時間でできるだろうという目論見通りでしたが、複数人というのがいいなぁ〜と改めて思った。信頼できる二人と一緒だったからというのもあるとは思います(一緒に開発したの初めてだったけど)。複数人がいいのはどんなアプリかをブレストして構想を固めるのはもちろん、作業分担で私がこれを終わらせないと二人は進まないとか思うとそこまでは猛スピードで作れるんですよね。お互いがそれの繰り返しだった。そしてお互いが想定通りもしくはそれ以上の結果を常に返してくれるから開発してて気持ちいいんですよね。私がUIのモックを汚いHTMLで作って、@monoookiさんがかっこいいhtmlに書き換えてくれて、UIと裏側ができたら@jishiha さんiPhoneアプリの実装お願いしますみたいな。誰かが作業待ちの場合はコンセプトを見直してこの仕様でいいかなとお互いが考える時間があって充実した24時間だった記憶があります。その後の飲み会で24時間でプロトタイプを作るサービスを会社としてやろうぜみたいな話もした。実現はしなかったけどなかなか面白い気がします。

まちみえーる

構想は三年くらい前からあったものをやっと形にしたのが順番待ちシステムの「まちみえーる」これはひょんな事から @yamada_ken1 さんが手伝ってくれてリリースまでこぎつけた。@yamada_ken1 さんのおかげでリリースできた。デザインは@monoookiさんに発注した。これもHelp Me Tutorと同じ三人というメンバー構成で@yamada_ken1 さんのブレストを私が実装して(または逆)、@monoookiさんがデザインするという形だった。いままでは自分を複数人欲しいと思っていたけど、間違いだった。同じスキルセットを持つ人で開発するよりも得意分野が微妙に異なるメンバーで開発した方があれはまかせた、こっちは待っているというのが相互にいい影響を与えて気持ちよく開発できる。


また、「まちみーえる」はリクルートMashup Awards7で受賞することができた。Mashup AwardsはMA6でatnd notifyを出したけど受賞することはできなかったのでリベンジできて良かった。
http://www.machimie-ru.com/

2012年

技術で一番注目しているのはnode.js。ノンブロッキングI/Oによる低リソースぷりは衝撃的なので押さえておきたい。気楽にwebsocketが使えるというのもいい。node.js単体でwebアプリを作るというよりも保管関係になるかもしれない。あとは、ruby on railsを使うことになりそうなのでrails勉強会とかに4、5年ぶりに参加すると思います。あと、来年こそは位置情報系のiPhoneアプリを作りたいなーと。


おっと忘れてた。いまRFIDに注目しています。なぜ今頃RFIDかと思うかも知れませんが早ければ来年、遅くても再来年にはNFCがブレークするんじゃないかなと思ってます。最近になってNFCに対応した携帯電話がではじめてきています。いままではRFIDといえば在庫だったりモノのトレーサビリティーに関するものが多かったように思いますが、携帯電話に入るという事はネットワークとRFIDがシームレスにつながると言うことなんです。これは画期的だと私は思っています。何かしらRFIDを用いた生活を豊かにするサービスを提供したいと思います。


ではでは。来年もよろしくお願いします。

Chrome Web Storeに公開しているChrome拡張のレビューコメントを取得する方法

こんな感じで取れた。Review Notifyでも作ろうかな。Reviewをメールで配信してくれたりすると嬉しいだけどないよね?

function getReviews(extensionId, callback) {
  var entities = [{'url' : 'http://chrome.google.com/extensions/permalink?id=' + extensionId}];
  var param = {'searchSpecs': [{'entities': entities, 'groups': ['public_comment'], 'matchExtraGroups': true, 'startIndex': 0, 'numResults': 10, 'includeNickNames': true}], 'applicationId': 94 };
  $.ajax({
    type: 'POST',
    url: 'https://chrome.google.com/reviews/json/search',
    contentType: 'application/xml',
    dataType: 'json',
    data: 'req=' + JSON.stringify(param) + '&requestSource=widget'
  }).success(callback);
}

getReviews('bcepdinmmfbpheociaalfkhbcpekbdbc', function(reviews) {
  console.log(reviews);
});

緊急地震速報をしてくれるChrome拡張を作りました。

3月11日(金)午後2時46分頃にマグニチュード 9.0を記録する「東北地方太平洋沖地震」が発生し今も余震が続いています。仕事に集中できないくらい余震が発生しています。この状況をエンジニアとして何か出来ないかと思いChrome拡張を作りました。


この拡張機能をインストールすると震度3以上の地震が発生した場合に通知してくれるようになります。良かったらお使いください。

最後に東北地方太平洋沖地震で、亡くなられた方のご冥福をお祈りするとともに、今もなお行方不明となられている方の一刻も早い救助、被災地の復興を心よりお祈りいたします。

Chrome拡張ATND NotifyでGoogleカレンダーに参加予定イベントを追加する機能を入れた話。または、ATNDの予定をiPhoneのカレンダーに入れる方法

ATND Notifyってこれです。

機能追加の話


という事だったので



しますた。


という訳でGoogleカレンダーに追加したい人はATND Notifyをインストールしてください。インストールはここから

インストールするとイベントカレンダーにこんなボタンが追加されてます。クリックすると参加予定のATNDイベントがGoogleカレンダーに取り込まれます。

実装の話

この機能って実はボタンを一個付けただけなんです。ATND APIはiCalendar形式で出力するAPIがあるので、下記のようなURLを用意してそれをGoogleカレンダーに追加させるだけなんですね。

http://api.atnd.org/events/?user_id=6485&count=1000&format=ics


Googleカレンダーに追加する方法はここを見ればわかります

ATNDの予定をiPhoneのカレンダーに入れる方法

それから、iPhoneでもATND予定を見たいなって人はこのATND APIを使って簡単に設定できます。





サーバには下記の値を入れてください。user_idは自分のIDに変えてください。

http://api.atnd.org/events/?user_id=6485&count=1000&format=ics

user_idはATNDのユーザページのURLから


ここまでで設定終わりです。あとは、カレンダーを見ると下記のようになってます。



開催場所の情報とかものってますね。

Developers Summit 2011 松尾さんのGoogle App Engine発表資料

Javaで全部書き直したコードを書こうと思ったけど力尽きた。誰かいい感じで頼む。