js-test-driverの使い方メモ

js-test-driverはGoogleが作った、JavaScriptをコンソールでテストするプログラム。試したのでメモを。環境はMountain Lion搭載のMacBookAir。

ダウンロード:
http://code.google.com/p/js-test-driver/downloads/list

使い方:
http://code.google.com/p/js-test-driver/wiki/GettingStarted

参考になる日本語記事:
http://0-9.tumblr.com/post/15614207218/js-jstestdriver
http://everyday-eachday.blogspot.jp/2011/12/jstestdriver.html

ダウンロードページで JsTestDriver-x.x.x.jar ってやつを落とす。ダウンロードしたファイルを ~/bin/JsTestDriver.jar みたいなパスに置く。コンソールから以下のコマンドでサーバーを起動。

$ java -jar ~/bin/JsTestDriver.jar --port 4224

ポート番号は適当でいいらしい。コマンド成功したら、適当なブラウザで http://localhost:4224/ を開く。そうすると

  • Capture This Browser
  • Capture This Browser in strict mode

ってテキストリンクが並んでる画面になるので好きな方をクリック。(普通は Capture This Browser でいいと思われ)そうするとそのブラウザをウォッチしているような状態になる。で、そのブラウザのエンジンでテストが実行される。

実際にテストしたいプロジェクトのディレクトリを作る。例えば以下のような構造にする。

|- jsTestDriver.conf
|- src
|--- hoge.js
|- test
|--- hoge_test.js

hoge.js が書きたいJavaScript。hoge_test.js がhoge.jsに対するテストを書くファイル。jsTestDriver.conf がjs-test-driverのためのファイル。テキストエディタで開き、以下のように記述。

server: http://localhost:4224
load:
- src/*.js
- test/*.js

コンソールに戻る。さっきサーバーを起動したプロセスウィンドウはそのままにしといて、新しいプロセスを起動。そっちで

$ cd プロジェクトのディレクトリへ
$ java -jar ~/bin/JsTestDriver.jar --tests all

するとテストが走って hoge_test.js に書いたテスト結果が表示される…予定なんだけど、この時点で hoge_test.js には何も書いてないのでエラーになるはず。
というわけで簡単なコードを書いてみる。

### src/hoge.js function jsdriversample() { return true; }
### test/hoge_test.js TestCase(‘jsdriversampletest’, { ‘test should return true’: function () { var result = jsdriversample(); assertTrue(result); } });

で、コンソールでコマンドを叩いてテストする。

$ java -jar ~/bin/JsTestDriver.jar --tests all

ちなみにここで'test should return true'っていうのは各テスト単位の名前で、エラー時にコンソールに出力される。ちなみに文字列だからってマルチバイトは使えない。

assertなんちゃらって関数でテストを実行してるんだけど、使えるassertionの一覧は以下に載ってる。
http://code.google.com/p/js-test-driver/wiki/Assertions
例えば assertTrue だったら、引数の値が true だったらテスト合格になる。

まだちょっと使ってみただけなので、もうちょい勉強して実務に生かしたい。

### 2012-12-06 追記 テストケースのメソッド名(上記の例では 'test should return true' となっているところ)は必ず**test**で始まらないと、認識されないようです。

Mobile Safari、フルスクリーンモード、UIWebView、どれからのアクセスか判別する

apple-mobile-web-app-capableというめmetaタグの値をyesにするとiOS Safariでそのページを「ホーム画面に追加」し、ホーム画面からアクセスした際にページをフルスクリーンモードで開くことができる。

<meta name="apple-mobile-web-app-capable" content="yes" />

出典:Safari HTML Reference – Supported Meta Tags

フルスクリーンモードで開いた場合、navigator.userAgentの値に「Safari」の文字列が現れなくなる。

Moble SafariでのuserAgent(iOS 5.1.1):

userAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3 

フルスクリーンモードでのuserAgent(iOS 5.1.1):

userAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 

ところで、FacebookアプリやTwitterアプリなど、投稿内容のURLを踏むと、そのアプリの中でWebページが展開されるものがある。UIWebViewというやつ。この場合のuserAgentにも、やはり「Safari」の文字列は現れない。

FacebookアプリのuserAgent(iOS 5.1.1):

userAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 [FBAN/FBIOS;FBAV/5.1;FBBV/68414;FBDV/iPhone4,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/5.1.1;FBSS/2; FBCR/KDDI;FBID/phone;FBLC/ja_JP] 

TwitterアプリのuserAgent(iOS 5.1.1):

userAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 

というわけでSafariという文字列があるかないかを頼りに、フルスクリーンモード、ないしはUIWebViewからのアクセスを判別しようとすると失敗する。 しかし上記出典のSafari HTML Referenceによると、フルスクリーンモードではwindow.navigator.standaloneというプロパティがtrueになるらしいので試した。

デモ

iPhone/iPadのどちらでも、フルスクリーンモードのみでwindow.navigator.standalonetrueになるのを確認できた。

userAgent文字列からiPhone/iPadであることを判定した上で、

  • userAgentにSafariの文字列あり → Mobile Safari
  • userAgentにSafariの文字列なし、かつwindow.navigator.standalone === true → フルスクリーンモード
  • userAgentにSafariの文字列なし、かつwindow.navigator.standalone === false → UIWebView

という判定をすることができる。

必要な情報収集って何だろう?

昨日、今日と、livedoor Readerに登録しているフィードの見直しをした。そんなことをしていたら、久々にブログを書きたくなった。

登録してたのは140フィードくらい。未読は6000を超えていた。全部見ることは到底叶わず、現時点で未読3000くらいまで減らしたんだけど、フィード購読してもロクに見ることすらしなかったものがたくさんあったことに気付いた。

今年は夜間に学校に通ったりして情報収集の時間がより減ったことは事実だけど、特に積極的に情報収集しなくてもどうにかやっていけるもんだ、と思ったり。

その理由として、iPhoneのプッシュ機能で、FacebookやTwitterなどの更新がプッシュ通知されるようになったことで、情報が向こうから自ずとやってくる環境になったこと。逆に言えば、情報がどんどん押し付けられてくる時代になっちゃったと言えるのかもしれない。でもそれって本当に必要な情報なの?

ソーシャルって名の付くものに警鐘を鳴らしている人はたくさんいるけど、僕もどちらかというと、一も二もなくソーシャルサービスマンセーっていう風潮には違和感を感じている方。人との繋がりは確かに大事。でも何かを犠牲にしてまでそれは取り組むべきことなんだろうか。特にモノヅクリを生業とする人にとっては、作ってる時間が何より大切な時間のはず。作ってる時間っていうのは、言って見れば孤独な時間ですよ。誰にも邪魔されず、作業に集中できる時間、これがなければモノヅクリなんてできない。

Facebookについて言えば、いまやなくてはならないインフラに成長したと思うよ。僕もこれがなくなると困ると思う。現にこの記事もFacebookに自動投稿していることだし(笑)
でも昔の知人や、十数年会ったこともない小・中学校時代の同級生の近況が知りたいかっていうと、正直興味がない。むしろ知りたくない。だからそういう人から友達申請があっても、承諾しないことがある。どうだろう、こんな考えを持っている人間は少数なんだろうか。

ああ、情報収集の話だったけど話がそれた。

Web業界の話で言えば、HTML5だなんだとどんどん新しい技術が使えるようになって、さも移り変わりが激しい業界と思われていることと思うけど、ここ2年くらいのフィード見てみると、意外と大して話題は変わっていないことに気付く。HTML5、jQuery、JavaScript、CSS3、Sass、MT、WordPress、git…というようなキーワード。技術について言えば、必要な知識はそんなに短期間に変わるものではない。ニュースを追うより、どれだけきちんと身につけられるかの方が大事。

こんな偉そうなこと書いておいて、数年後に食いっぱぐれてたりしてね。油断は禁物。

夏期休暇中にしたこと

先週は一週間まるごと休暇を取得。その間に何をしていたかでもなんとなく書いておく。

  • 友人と西伊豆に一泊二日旅行に

    毎年、友人と山でキャンプしているんだけど「今年は海に行こうぜ」ということで海に。土肥というところに宿を取り、レンタカーで徒然なるままに。堂ヶ島の小さな砂浜では久しぶりに海水浴ができ、良い思い出になった。

  • 学校に行った

    会社は休んだけど学校は通常通りに行った。ギター・ゼミでは「Aマイナー・ペンタトニックスケールでアドリブソロを弾く」という試験のようなものがあった。結構練習していったので「兄貴、うまくなった」と先生に褒められた。(クラスの中で僕が最年長なので先生からは「兄貴/お兄ちゃん」と呼ばれている)まだダメな部分はたくさんあると思うんだが、褒められるのは素直に嬉しかった。

  • 会社の定期健康診断へ

    身長173cm、体重56kg。あれ、身長1cmくらい伸びてね?

  • 会社の人と飲み会

  • 知人のロックバンドのライブを観に行った

    お笑い芸人とのコラボイベント。お笑いのステージを観たのは初めてだった。え、なにこれ、楽しい!

  • ツタヤでDVD借りて映画観た

    • 「ダーク・ナイト」
    • 「シャーロック・ホームズ」(ロバート・ダウニー・Jrが主人公のやつ)
    • 「アイアンマン」
  • 読書 村上春樹「1Q84」

    今BOOK3(前編)の途中

  • 読書 徳丸浩「安全なWebアプリケーションの作り方」

    まだ読んだの3分の1くらい。。分かりやすい内容です。素晴らしい。

  • 近所をウォーキング(ジョギング)。朝でも相当に暑い。汗の量やばい。

  • ギターの練習。練習。練習。(試験があったので)

    • 普段サボってたので、全然思うように指が動かない…。やっぱり継続は力なり、ね。
    • 音作りのために一人で近所のスタジオに行って個人練習もしてみた。でも1時間なんてあっという間。
  • オリンピックとか

    • 昨日は録画しといたオリンピック開会式を観てた。ミスター・ビーンが出て話題になってたやつ。英国の歴史を表現した演出はすごい良かったけど、全体としてはやっぱ長すぎ。。Torneだと1.5倍速再生ができるので時間の節約になっていい。
    • 中継は本当に見たいので見て、それ以外はニュースなどでハイライトだけ見る派。
    • アスリートのドキュメンタリー風の特集番組っていつも「またこういう構成か、はいはい」って思うけど、でも大概は感動してしまう。浪花節が好きだよ僕は。

友人と旅行に行った以外は大きなイベントもなくのんびり気ままに過ごした感じ。なんかギターすごい弾いた気がする。 しかし7月末でこの暑さ。先が思いやられる。体力持つかなー…。

仕事をしながら音楽学校に3ヶ月通ってみて

2月に書いた前回のエントリーで

そして今年は…意識的にやることは増やしてあります。

と書いていたけれど、その答えがタイトルの通りです。 2012年4月から1年間、都内のとある音楽学校に夜間に通うことにしました。とはいえ「夜間コース」と銘打っているカリキュラムではなく1年制というだけで、通常の2年制の生徒さん達に混じってレッスンを受講しています。

なんでこんなことをしているか…という問いに答えるならば「できるうちに一番やりたいことをやっておくべき」ということに尽きます。

30歳。人並みに貯金は有り、配偶者なし。

これは今しかできない、と思ったわけです。去年の被災地ボランティアのエントリーにも書いたけれど、

If you live each day as if it was your last, someday you’ll most certainly be right.”(邦訳:「毎日を人生最後の日だと思って生きてみなさい。そうすればいつかあなたが正しいとわかるはずです。」)

というスティーブ・ジョブスの言葉が自分の中に深く刺さっていて、それもきっかけの一つであったと言えます。

…一応前提として説明しておきますが、僕の趣味はエレキギターです。今もプライベートでロックバンドをやっています。学生の頃は「バンドでデビューする」ことを将来の夢として活動していたりしました。それが夢破れて、今はしがないエンジニアをしているわけです(笑)

音楽学校に通おうというのは、去年の冬、被災地ボランティアに参加したその頃から構想がありました。年末にはいくつかの学校の資料を取り寄せたり、説明会や体験レッスンに参加したりして学校選びを始めていました。そして割とすんなり行きたい学校は決定。年明けには入学手続きも済ませ、4月からめでたく入学となりました。

4月

週2日で「セオリー・ゼミ(音楽理論)」のレッスンと、「ギター・ゼミ(実技)」のレッスンに通います。その2日は会社の業務を夕方で切り上げ、学校に行き、会社に戻るという生活が基本になりました。ギターを背負って会社に行くというとかなり「変わった人」扱いされそうなものですが、弊社の自由な社風(?)に助けられ、それが苦になることはなかったです。始まったばかりということもあり、レッスンのペースも遅め。

5月からは学校で第3のレッスンが始まります。バンドアンサンブルというレッスンで、文字通り生徒同士でバンドを組み、それを先生に見てもらい、アドバイスをもらうという内容です。このレッスンのクラス分けのため、4月頭にはオーディション(?)が行われました。通常、2年制の生徒さんたちはレベル1から始まって、1年後の成果を見て2年目のレッスンのレベルが決まる、という訳ですが、1年制の生徒の場合、レベル1から始めることが適切か分からないためレベルの測定を行う必要があり、そのためのオーディションなのです。

オーディションというものを生まれて初めて体験したわけですが、これが刺激的でした。同時にオーディションを受けたのは僕含め、4名。本番30分前くらいに集合し、各自楽譜が渡されます。楽譜にはある曲の構成が書いてあり、セクション1〜4くらいに分かれています。そして「セクション1はこういう演奏で、セクション2はこれこれで、セクション3はアドリブで、セクション4は楽譜のままに演奏してください」という具合に指示が書いてあるわけです。アドリブのセクションには、コード進行が書いてあるだけで、弾くべきメロディは書いてありません。 本番までの約30分の間は、各自練習時間です。その間にスタッフの人が演奏例の音源を、3回だけ流して聴かせてくれます。僕はロクに楽譜が読めないため、これを耳コピするしかありませんでした。(耳で音程を取るのは慣れている) そして本番。試験官が3人並んでいる前でおもむろにオケが流れて、それに合わせて演奏。頭は真っ白になりました(笑) 試験官の先生による総評は「みんな緊張しているのは分かるけど、リズムがハシりすぎ」。これはもう、全くもってその通りだと思いました。

この月…会社の業務は忙しさを極めていました。この4月からタイミングを同じくしてマネージャーに昇進をしたことをきっかけに、自分自身とチームのタスクを自らが管理しなければいけないという慣れない境遇に置かれ、うまく立ち回れず自分で仕事を抱えすぎてしまいました。身体的にも精神的にも無理があったせいか体調を崩す、という結果になってしまいました。

5月

まずはゴールデンウィーク。これは割ときっちり休むことができました。ここで立ち止まって冷静になって初めて、自分が体調を崩していることに気づきます。残念なことですが、通院生活のスタートです。週1で通院しつつ週3で仕事後に学校に行くという、今思うとむちゃくちゃな生活でした。

新しく始まったバンドアンサンブルのレッスンでは、曲を決め、楽譜を手配して、どのパートを誰が担当するか決め…ということに始まり、メンバー間でのコミュニケーションに重点が置かれる内容となっていました。レッスン時間以外の練習の呼びかけを行ってくれたりと、クラスメイトの中にはかなり熱心に取り組んでくれるメンバーもいました。しかし、働きながらレッスンを受講する僕にとってはこれは負担以外の何物でもありませんでした。 僕がレッスンでやったらおもしろいのではないか、と提案したものもありました。しかし、それを実際にやってみるとなるとまた別の次元の苦労があったのです。バンドは人が集まってやるものです。会社での仕事も同じ。メンバー全てが自分の思う通りにプレイしてくれるわけはありません。

月末には、4月にオーディションを一緒に受け、同じギター・ゼミを受講していたクラスメイト(年上で、自分と同じで社会人でありつつ学校に通っていた兄貴的存在)が、関西に転勤するため退学することになりました。同じクラスの中で唯一、自分と同じ社会人組のクラスメイトだということもあり、かなり寂しく感じました。最後のレッスンの後では、クラスメイト全員に声をかけ「兄貴を送る最後の晩餐」を催しました。兄貴、関西に行っても元気でね。

6月

1ヶ月の通院のおかげもあり、体調も落ち着いてきました。

ふと気づくとバンドアンサンブルのレッスンの練習にばかり腐心しており、4月から受講しているギター・ゼミのレッスン内容を全くもって消化できていないことに気づきます。バンドアンサンブルはメンバーとやるもの、自分が練習していかなかったらメンバー全員に迷惑がかかる。なので優先度はどうしても上がってしまいます。しかしよく考えてみると、ギター・ゼミのレッスン内容は非の打ち所が無い程に素晴らしい内容であり(講師が本当に素晴らしいミュージシャンであり、先生なのです)、それを全力で吸収しないと本当にもったいことになってしまう、ということに気づきます。

そう思った次の日、会社に行く前に学校のオフィスに行き、バンドアンサンブルレッスンの辞退を申し込みました。バンドアンサンブルのクラスメイト、及び先生には申し訳ないことをしました(来週、詫びを入れて来ます)。これで学校通いは週2日ということになります。週3日通っていたときよりは、本当に気が楽だし、打ち込むべきテーマも明確になりました。

これから

まだ学校に通って3ヶ月、という気もしますし、もう3ヶ月、という気もします。この3ヶ月間、いろいろなことを学んだし、吸収したし、失ったし、体験しました。学校に行く、人から教えてもらうという体験を通じて、本当に貴重な経験をしているという実感があります。これは一度社会に出てみないと分からないものだろうと思います。 実際、社会に出る前の学生の自分では、この感動は全く味わえなかったに違いないと思っています。人からものを教わるという尊さ、有り難さは、自分が教える立場にならないと、分からないのです。

余談ですが、自分の父は高校教諭をしていました(今は定年退職済み)。そのことを学生時代の恩師に話したときの一言が、今でも忘れられません。

「学校の先生?最高のクリエイターじゃん。(次の世代をクリエイトする職業だろう?)」