テスト駆動Javascriptでテスト駆動開発を学ぶ

中級者向けのJavascript開発の本として読んでもいいし、テスト駆動開発の入門書として読んでも良い感じ。名著だと思う。

ProductName テスト駆動JavaScript
Christian Johansen
アスキー・メディアワークス / 3780円 ( 2011-11-25 )


自分はプログラマーの集団的な組織に属したことがないため、開発の色々(特にペアプロ)なイメージが良くわからんし、TDDもイマイチ理解していない感があったので、本書のように丁寧に書いてある本はありがたかったりする。

第三部の「Javascriptテスト駆動開発の実際」のパートが面白いが、その中でも特にNode.jsによるサーバーサイドのテスト(14章)とクライアントサイドのテスト(15章)が非常に良かった。この2章だけで90ページくらいあるし、じっくり写経したら2日を費やしてしまったが、得るものは多かった。特に実際のコードとテストコードが絡み遭いながら完成に向かって進んでいく感を味わえたのはなかなか素晴らしい体験だった。

ちなみに14章ではNodeunitを使ってたけど、実際に自分が使うならVowsかなぁと(CoffeeScriptでも使えるしね)

エディタに関しては、Emacsの場合、縦分割して左にコード、右にテスト出して交互に切り替えながら進めていくのが調子良かった。

一部がテスト駆動開発の一般論で、二部がJavascriptの概論だけど、第4章の「学ぶためのテスト」というパートが面白かったかな。他の人が書いたライブラリを観察するために、テストの形で評価した内容を記述しておくという方法論は斬新だった。 まぁ、よく考えてみると、自分も新しいモジュールを理解したい場合はまずテストを眺めて、よく分からない場合は、対応する部分のソースコードを読んでふるまいを理解したりするので、結局そういったやりかたの形を変えて、積極的に観察とその記録を取っていく手法って考えればいいのかと思った。

おまけ

ラディッシュ収穫

息子が抜きたいとうるさいので収穫した。まぁまぁのサイズ

1327831649

ところで、今月の「やさいの時間」のコンテンツが良い感じ。緑肥の話と種とりのコツという家庭菜園系には非常にためになる内容なので買ったほうがいいです。素敵すぎ。

だんごのたむらと野村食堂

HTML5読書会お疲れ様でした。

おやつはたむらで買ってみた。

1327798586

全八種類のだんご

1327798589

1327798592

@motimuneの台湾みやげ。台湾でもくもく会やりたいっすね。

1327798591

懇親会は富士駅に移って野村食堂。17:30の吉原中央駅初のバスに乗れば18:00ちょい前に駅に着くので、時間的にはちょうどいい。

1327798594

野村食堂は雰囲気がいいですね。

1327798596

1327798597

1327798599

次回か次々回あたりで終了っぽいのでそろそろ次の本を選びはじめないといけないですね。HTML5とかjavascript系の勉強会が幾つか立ち上がっているので、もうちょいコアな本を読んでいってもいいのかなぁと思うが。あと問題がついている方がいいかなぁと思う。

新しい言語だったらscheme手習いかなぁ。

ProductName Scheme手習い
Daniel P. Friedman
オーム社 / 2940円 ( 2010-10-22 )


プログラミングコンテストチャレンジブックを自分の得意な言語で書いていって言語の違いを見せ合ったりベンチマークを取るっていうのも面白そうだと思うけどね。

サークルグラフをフジテレビ風ソースでCanvasに添えて

波線で棒グラフの印象操作をするのは既に古典中の古典だが、斬新すぎる円グラフの表現方法をみつけたのでCanvasでやりたくなった。ちょうどHTML5読書会でCanvasいじっているので黙々してみた。

タイトルは、懇親会がフレンチの店なので合わせてみた。

circle graph ftv

センターずらすメソッドかなぁと思いながら作ってみたら、アークじたいが嘘っぱちだったという、、、

もはやグラフですらなかった。斬新すぎ。たぶん司会者の人は「サイレントマジョリティを考慮してます」とか言っていたんじゃないかなぁ。

コードはGitHubです。

openbabel-2.3.1が出てますね。

2.3.1がリリースされたようです。

個人的に興味があるのは

  • PNG files from Open Babel contain molecular information and can be read to give the MDL Molfile.
  • Pybel now uses the built-in 2D depiction, and no longer needs OASA.

とABINITのフォーマットに対応したあたりかな。

あと、openbabel-python.iをいじってたので、ここをいじった場合のコンパイルのオプションをメモっておく。swigが有効になるようにしないといけないのに気付かなくてハマった。

cmake ../openbabel-2.3.1 -DPYTHON_BINDINGS=ON -DEIGEN2_INCLUDE_DIR=/usr/local/tmp/eigen-eigen-2.0.12 -DRUN_SWIG=ON

OBGenericからOBOrbitalDataへのキャストをできるようにして、vectorの設定もしたので、手元のpythonバインディングでは

orb = toOrbitalData(mol.GetData(openbabel.ElectronicData))
orb.GetAlphaOrbitals()[orb.GetAlphaHOMO()-1].GetEnergy()

とやるとHOMOのエネルギー(eV)を得られるようになっている。

追記12.01.28

homebrewでいれたpythonで使いたい場合optionで指示する

$ cmake ../openbabel-2.3.1 -DPYTHON_BINDINGS=ON \
  -DPYTHON_LIBRARY=/usr/local/lib/libpython2.7.dylib -DPYTHON_EXECUTABLE=/usr/local/bin/python \
  -DEIGEN2_INCLUDE_DIR=/Users/kzfm/openbabel/eigen-eigen-2.0.17 -DRUN_SWIG=ON

html2jadeでHTMLを読みやすくする

HTML5ベースのスライドつくる場合はJadeみたいなインデントでブロックを表現するような形式のほうが見やすいし書きやすい。

html2jadeを使えば、逆にhtmlをjadeに変換して読みやすく出来るのでオススメです。

impress.jsのindex.htmlをjadeに変換してみた。読みやすい。

impress

      #bored.step.slide(data-x='-1000', data-y='-1500')
        q
          | Aren't you just
          b bored
          | with all those slides-based presentations?

      .step.slide(data-x='0', data-y='-1500')
        q
          | Don't you think that presentations given strong in modern browsers
          | shouldn't strong copy the limits
          | of 'classic' slide decks?

      .step.slide(data-x='1000', data-y='-1500')
        q
          | Would you like to strong impress your audience
          | with strong stunning visualization
          | of your talk?

      #title.step(data-x='0', data-y='0', data-scale='4')
        span.try then you should try
        h1
          | impress.js
          sup *
        span.footnote
          sup *
          | no rhyme intended

      #its.step(data-x='850', data-y='3000', data-rotate='90', data-scale='5')
        p
          | It's a
          strong presentation tool
          br
          | inspired by the idea behind
          a(href='http://prezi.com') prezi.com
          br
          | and based on the
          strong power of CSS3 transforms and transitions
          | in modern browsers.

      #big.step(data-x='3500', data-y='2100', data-rotate='180', data-scale='6')
        p
          | visualize your
          b big
          span.thoughts thoughts

      #tiny.step(data-x='2825', data-y='2325', data-z='-3000', data-rotate='300', data-scale='1')
        p
          | and
          b tiny
          | ideas

幸せな未来は「ゲーム」が創る

これは非常に興味深い本だと思う。モチベーション3.0とかゲーミフィケーションなんかはこういったことを暗に示唆しているような気がする。

ProductName 幸せな未来は「ゲーム」が創る
ジェイン・マクゴニガル
早川書房 / 2940円 ( 2011-10-07 )


「高度に発達した遊びは仕事と区別がつかない」は名言だと思っていて、僕自信はライフサイエンスの最先端の技術を社会に還元するという、いわゆる製薬業界にいるのだけど、まさにこの言葉があてはまるわけです。実際トップサイエンティストは「傍から見ていると仕事してるのか遊んでいるのかよく分からない」し、サイエンスをエンジョイしているので、こういった仕事は単なる頭脳労働ではないよなぁと思うことが多かった。

全てのゲームに共通する4つの特徴

  • ゴール
  • ルール
  • フィードバックシステム
  • 自発的な参加

ゲームをプレイするとは、取り組む必要のない障壁を、自発的に超えようとする取り組みである。

特に4番目が重要なんだと思う。

ゲームとはやりがいのあるハードな仕事

「フロー」とはチクセントミハイによって名付けられた「何かを創造的に達成することや高度な能力を発揮して満足した、爽快な感覚」のこと。

ゲームは明らかにフロー感の源であり、遊びは最高のフロー体験

内発的報酬に閑する重要な知見

人が潜在的に求めているもの

  • 満足の行く仕事
  • 成功体験、あるいは少なくとも成功への希望
  • 社会的なつながり
  • 「意味」や自分自身よりもなにか大きなものの一部になる機会

sofなんかはいい例だと思うね。さらにsofクローンをイントラに入れる事自体もハードな仕事で、安定したコミュニティを生成するというゲームになるので、あれあこれやとトライアンドエラーを繰り返しながら進めることが結構楽しかったりする(今やってる最中)。

支援者の誇り

「ナヘツ」とはイディッシュ語の単語で、自分が何かを教えたり、アドバイスしたりした相手が成功を収めたときに感じる誇らしい感情を意味する言葉です

これもsofで得られますね

第二部は現実を作り変えるという題で、代替現実(ARG)の話題だった。

  • アンビエントなアバターのフィードバックは効果が高い
  • 「フォースクエア」の前提は、より多く外出し、より多くの時間を友人と直接会って過ごしたら私たちはより幸せになれるというシンプルなもの
  • 「地元選出議員の経費を調べよう」というプレイ
  • オンラインゲームや、フェイスブックのような「遊び心のある」ソーシャルネットワークは外発的報酬をもっとも安定的に与えてくれます
  • ウィキペディアはMMORPG

仙禽と鳳凰美田

年末に飲んだ酒

1327663244

鳳凰美田のひやがかなり良かった。

1327663251

仙禽はちょっと飲み飽きたかな。今回のはちょい華やかすぎた。

1327663253

恋する非同期プログラム

去年、恋するプログラムをJavascriptで書いていこうとしたんだけど、Canvasとかわからなくて4章くらいで放置してた。

その間にHTML Canvas読んだり、Node.jsもわかってきたので再開しようかなと。vowsも使ってみたいし。

で、このやつをCoffeeScriptに書きなおした

class Responder
 constructor: (@name) ->
 response: (input) -> input + 'ってなに?'

class Unmo
 constructor: (@name) ->
   @responder = new Responder('what')
   @responder_name = @responder.name
 dialogue: (input) -> @responder.response(input)

u = new Unmo('proto')
console.log(u.dialogue('マックロシーベルト'))

動かしてみる

$ coffee test.coffee 
マックロシーベルトってなに?

ProductName 恋するプログラム―Rubyでつくる人工無脳
秋山 智俊
毎日コミュニケーションズ / ?円 ( 2005-04 )


vowsはCoffeeScriptでテストができる

CoffeeScriptでテストをできるライブラリを探していたらvowsで出来ることを知った。

vows = require 'vows'
assert = require 'assert'

vows
  .describe('Division by zero')
  .addBatch
    'when dividing a number by zero':
      topic: -> 42/ 0

      'we get Infinity': (topic) ->
        assert.equal topic, Infinity

    'but when dividing zero by zero':
      topic: -> 0 / 0

      'we get a value which':
        'is not a number': (topic) ->
          assert.isNaN topic

        'is not equal to itself': (topic) -> 
          assert.notEqual topic, topic

  .export(module)

これをvows --specすると

vows

かなり良い感じですね。