@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Backbone.View の submit form イベントとイベントハンドラのテストを書くときの注意点

スタブ/モックに sinon.js を使っているとする。

  • "events" のテストをしたいときは View.prototype.handlerName を stub して stub のコールバック関数で (ev) -> ev.preventDefault() を呼ぶこと。でないとテストが走ったとき実際に form submit されてしまい、ブラウザ上でテストページを開くと延々フォーム送信し続けてしまう
  • イベントハンドラのテストをしたいときは↑の stub が有効なスコープ内だと当然 stub されててイベントハンドラは実際には呼ばれないので注意すること(よく忘れて悩むので)
  • あと view.$el.find('form').trigger('submit') なり .submit() なりでフォーム送信イベントを発火させる前に view.render() を呼んでおかないとフォームの HTML が DOM に存在せずフォーム送信されないので忘れずに

入門 React

React は昨年末ごろ仕事で少し使ったことがあるが、全貌を知らないままヘルプでちょっと書いた程度だったので、ちゃんと体系的に学びたいと思っていた。ウェブのチュートリアルやドキュメントも読んだが英語なこともありよくわからなかったので日本語訳された本を買った。

付録を含めても 250 ページほどの薄い本だが、内容はコンパクトながら充実している。必要なことが的確に説明されていると感じた。文章の構成もよくて、読み進めるにつれて深く知りたいと思うことが期待通りに次の節で掘り下げられていたりして、あちこち説明が飛ぶこともなくストレスを感じない。

ゼロから手取り足取り教えるタイプの本ではないので全くの初心者だとこの本だけではとっつきづらいかもしれない。自発的に React に関心を持つような人なら Starter Kit をダウンロードして Hello World アプリケーションを表示するくらいまでは自力でできると思うので問題なさそう。

第一部、第二部で React の使い方はほぼ網羅されている。本文中のサンプルコードも無駄なくわかりやすいので、読んですぐ自分で書いて試していくことができる。サーバーサイドレンダリングや Flux アーキテクチャなど、噂話で耳にするだけではよくわからない概念も利点や必然性まで含めてしっかり押さえている。

入門 React は、 React に興味がある人全員におすすめできる一冊だ。読んでいるときっと自分でも React を使ってアプリケーションを書きたくなると思う。

一つだけ注文をつけるならば、オライリーの本ではおなじみの「表紙の動物」の紹介文がないこと。せっかく突っ込みどころ満載の面白い表紙絵なのにもったいない。そこで紹介文を書いてみた。

表紙の動物はサムライです。サムライは中世の日本に生息していました。チョンマゲという独特の髪型が特徴です。ニンジャとは異なりジュツを使うことはありませんが、カタナで敵を斬りつけて攻撃します。サムライはハラキリという風習のためその数を減らし、19世紀後半に絶滅しました。

入門 React ―コンポーネントベースのWebフロントエンド開発

入門 React ―コンポーネントベースのWebフロントエンド開発

  • 作者: Frankie Bagnardi,Jonathan Beebe,Richard Feldman,Tom Hallett,Simon HØjberg,Karl Mikkelsen,宮崎空
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2015/04/03
  • メディア: 大型本
  • この商品を含むブログ (2件) を見る

SNS 見るのやめたその後

blog.kyanny.me

ブログに書いてから三ヶ月経った。ブログを書いたのが SNS 見るのやめた一ヶ月後だったことをすっかり忘れていた。つまり四ヶ月くらい経ったことになる。この三ヶ月を振り返る。

全く見ない、という状態は維持できていない。 Twitter は週に二、三回くらい、 Facebook は一、二日に一回くらいのペースでアクセスしてしまっている。 Facebook のほうがアクセス頻度が多く、滞在時間も長い。もともと辞めたいと思っていたのは Twitter のほうなのでそこは問題ない。 Twitter は何か用があって見たあとログアウトするのを忘れてしまい、次にアクセスしたとき未読通知を見てしまう、というパターンが多いので気をつけたい。自分の場合 Twitter のほうがノイズ(ゴシップ)が多く、 Facebook は割と無害(楽しめるレベル)なので、たぶん普通の人っぽい付き合い方に近づいてきているのだと思う。

目下一番困っているのがはてなの通知で、はてなブログの iPhone アプリから見えてしまうのでついつい気になってしまう。はてなブログの iPhone アプリは素敵なデザインでブログも書きやすくとても気に入っているが、通知をオフにできないのが残念だ。アプリに限らずはてなの通知は全体的にオフにしたい。通知を見たくないがためにブログを引っ越しすべきだろうかと何度か考えた。

浮いた時間はそれなりにましな使い方ができている。隙間時間にアプリで英語の勉強をできているし、就寝前などは Kindle で本を読む時間も増えた。いずれもたいした成果が出ている活動ではないが、マイナスにはなってないのでよしとする。それよりもゴシップ情報で情緒不安定になることが非常に少なくなったことのほうが大事で、精神的には三ヶ月前と比べてさらに安定し、ムラが少なくなった実感がある。不機嫌になって奥さんに八つ当たりし夫婦喧嘩する、ということも少なくなり家庭円満がはかどった。

孤独感については、もともと「ぼっち力」が非常に高く、独りでいることに寂しさを感じないたちだったので、割とすぐに慣れた。おそらく自分が恐れていたのは孤独そのものではなく、「毎晩仲間と寿司食って酒飲んで楽しく過ごしてる人たち」とそうでないみじめな自分を比べてしまうこと、だったのだと思う。そういう様子が自分の目に入らないようにし、そういう生活を維持した結果、そんなもののことは考えなくなり、比べようともしなくなった。

総じていい感じなので、 Zenfone 2 が届いても Twitter Facebook Google+ などのアプリはインストールしないでおこうと思う。

Duolingo と iKnow!

一ヶ月くらい Duolingo と iKnow! を毎日ちょっとずつやって英語の勉強をしてみた。継続して使うことでそれぞれのサービスの特徴が少しわかった。

Duolingo

f:id:a666666:20150510022013p:plain

四月のマニラ出張中、夜ホテルに戻るとやることがなくて暇だった。持参した Windows Phone 8.1 でアプリを探して、 Duolingo があったのでインストールしてやってみたのがきっかけ。以前 iPhone アプリを少し使ったことがあるがすぐやめてしまった。帰国してからは iPhone アプリのみで勉強している(PC 版もちらっと見たがモバイルのほうが圧倒的に触れている時間が長いので)

連続継続日数がカウントされる、毎日の勉強量がグラフで見える、とささやかなゲーム要素しかないが、見事にはまってしまい毎日やり続けている。ヘンに凝らなくてもちゃんとモチベートされるんだなぁ、と思った。一回のセッションが短くて隙間時間に少しこなすだけでノルマを達成できるのも継続日数を稼げている一因。

「弱点」という概念があって面白い。いちどマスターしたトピックでも時間経過で脳が忘れていくのを「弱まって進捗バーが満タンから少し減った」状態として可視化しており、満タンを保ちましょう、という形で復習を促している。これもささやかなゲーム要素といえて、減ってたら満タンにしたくなるし、復習時の出題内容は前回と全く同じとは限らないので、取り組むたびにちゃんと練習になる。

学習機能については、センテンスを読み上げて合ってるか採点される問題があるのが良い。ふつうの単語帳とかだと声に出して読む必然性がないのでスピーキングを練習する機会が無いが、これならわずかでも口を動かす練習になる。単語は簡単なものばかりだが文章の組み立て問題とかもあまり教材がたくさんあるものではないのでいい練習になっている。

読み上げ問題は騒音に弱いのが難点だ。通勤電車内やレストラン程度の騒音でもダメで、静かな自宅などではほぼ正解できるものが外出先ではほぼ毎回不正解という感じになってしまう。あと英文和訳問題はけっこう幅広い解答パターンを網羅できていると思うものの(どういう判定ロジックなのか興味ある)まだまだ「なんでこれが不正解なんだよ」と思うこともけっこうある。モバイルからだと正答候補をリクエストできないのが不便。

出題解答方式がバラエティに富んでいて飽きないし、英作文やスピーキングなども含めて総合的な英語の勉強ができるサービスになっていると思う。復習に取り組むインセンティブの作り方もうまいし、ちゃんと使ってみてようやくすごいと褒められてる理由がわかった気がする。あくまで基礎トレーニング向けっぽいので語彙を増やす単語の勉強とかは別途やらないといけないけど、これは今後も継続したいしできそうだと思った。

iKnow!

f:id:a666666:20150510023009p:plain f:id:a666666:20150510023023p:plain

無料の Duolingo を続けられているのなら有料プランを契約してるのに放置してしまっている iKnow! をやらないのはもったいない、と思い一緒にやることに。こちらは過去に何度も三日坊主を繰り返してきている。

複数コースをまとめて学習する機能があることをつい最近知人のブログ経由で知り、さっそく複数のコースをとってほぼこの機能だけ使って勉強している。これも iPhone アプリだけで勉強している。

いろいろな学習形態が選べるようだがひとまず単語帳アプリの iKnow! だけしかやっていない。三コースで「まとめて学習」を一回通すと十分弱くらい。これも通勤中か昼食中にやることが多かった。やる時間がなかったり、もっとやる気があるときは帰宅後自宅でもやった。

単語帳アプリの宿命だと思うが、同じ意味の単語が複数あるけどこの問題では特定のほうしか正答扱いにならない、みたいなのはちょっとストレスを感じることがある。 set aside と put aside とか、文字数も全く同じなのでよく間違える(そしてニュアンスの違いやどう使い分けるか、などは iKnow! は教えてくれないのが残念)

「学習できるコースがあります」というリマインダーメールがしょっちゅう届くが、一日十分くらいしか勉強していないとあれが途切れることなくずっと届き続けるので、なんかプレッシャーかけられてるようでちょっといやだ。というか「学習できるコースがない」という状態になることがほぼない。 iKnow! は隙間時間でちょいちょいやることは想定しておらず、毎日数時間みっちりやるべきものなのかもしれない。

復習の時期などをインテリジェントに判断してくれる学習エンジンが売りの一つっぽいが、自分の学習スタイルでは正直いってその恩恵がどのへんに現れているのかよくわからない。コンテンツが豊富なので Duolingo だけでは難しそうな語彙の強化に向いていそうだけど、ちょっとリッチな単語帳として使うなら他にも類似のアプリはありそう(しかも無料か買い切りで)なので、いま契約中の有料プランの期間が終わっても継続するかどうかはちょっと未定。

MongoMapper の abbr

stackoverflow.com

  • 別名のアトリビュートメソッドが定義される(エイリアス)
  • データベースのコレクションには abbr で指定したフィールド名で保存される
    • データマイグレーションが必要なフィールド名の変更を無停止でやる、みたいなときに便利かもしれない
    • 自分のユースケースでは、 ActiveSupport::Concern を使った mixin で定義されるメソッドの中から参照するフィールド名が違う、みたいなときうまい具合に使えた
require 'mongo_mapper'

MongoMapper.database = 'testing'

class Person
  include MongoMapper::Document
  key :given_name, String, abbr: :first_name
  key :sur_name, String, abbr: :last_name
end

john = Person.create(first_name: 'John', last_name: 'Doe')
john.first_name #=> "John"
john.given_name #=> "John"
Person.create(given_name: "Melody", sur_name: "Nelson")
Person.all
[#<Person _id: BSON::ObjectId('554e3e7c421cdc660c000002'), given_name: "John", sur_name: "Doe">,
 #<Person _id: BSON::ObjectId('554e3eba421cdc660c000003'), given_name: "Melody", sur_name: "Nelson">]

Mongo Shell

> db.people.find()
{ "_id" : ObjectId("554e3e7c421cdc660c000002"), "last_name" : "Doe", "first_name" : "John" }
{ "_id" : ObjectId("554e3eba421cdc660c000003"), "last_name" : "Nelson", "first_name" : "Melody" }