Backbone.jsガイドブック いただきました

Backbone.jsガイドブック id:yuku_t 先生にいただきました! ありがとうございます。

Backbone.jsガイドブック

Backbone.jsガイドブック

日本語のBackbone.js情報を探していてBackbone.js Advent Calendar 2011 - Qiitaに行きあたったことのある方も多いと思うのですが、この本はAdventCalendarの記事を整理し最新化、充実したものだそうです。

Backbone.jsは結構自由度が高くて、一般的な使い方を知るには、http://backbonejs.org/ のサンプルのプロジェクトをがんばって読みたいなことをする必要があるので、このように一通りの使い方とベストプラクティスがまとめられていると結構捗るのではないかと思います。

僕もこれから読もうというところですが、Backbone.jsを中心にモダンなJavaScriptによるWebアプリケーション作成を一通り体験してみることができそうで、楽しみにしています。「Backbone.jsガイドブック」サポートページ には目次やサンプルコードが公開されているので、気になったひとは見てみると良いんじゃないでしょうか。

なるほどUnixプロセス読んだ - デーモン化のためのdouble fork

なるほどUnixプロセス ― Rubyで学ぶUnixの基礎を読みました。UNIXプロセスの話、特に実用的なforkの利用方法についての話がコンパクトにまとまっていてわかりやすかったです。あまり詳細に踏みこんでいるという感じではないけど、とっかかりにこの本にあるような知識があるのは良いと思いました。(シェルスクリプトから"foreman start"したときにCtrl-Cで終了できない現象の解説 - HAKOBE blog ♨ではまる前に読んでおいたら、もっとはやく問題解決できたと思います。)

第18章 デーモンプロセスに関係して二回目のforkについていろいろ調べたので、せっかくなのでメモを残しておきます。*1

第18章 デーモンプロセス では、プロセスをデーモン化するために必要な手順が丁寧に説明されています。その中で、プロセスを制御端末から切り離す手順として以下のようなコードが紹介されていました。

# プロセスグループリーダーでない子プロセスを生成(親プロセスは死ぬ)
exit if fork
# 子プロセスが制御端末のない新セッションに属するようにする
Process.setsid
# セッションリーダーではない孫プロセスを生成(子プロセスは死ぬ)
exit if fork
# ... 残りのデーモン化手順へ

特に最後のforkについては、このプロセスに制御端末が設定されないことをより確実にするために行うと説明されています。(制御端末の設定はセッションリーダーに対してしか行えないため)

なるほどなーという感じなのですが、逆に最後のforkを行わなかった場合(以下のコード)に、どのようにしたら制御端末を設定することができるのでしょうか。

exit if fork
Process.setsid
# !! さらに fork はしない !!

このプログラムに続けて制御端末を設定するコードを書くことはできるようで、不完全なデーモンプロセスに制御端末を割り当てる方法を教えてく.. - 人力検索はてなで解説されています。Rubyの場合は端末デバイスをopenしてioctlでTIOCSCTTYコマンドを実行すると良いようです。

ioctlで実行できるTIOCSCTTYはtty_ioctl(4)に解説があります。そこには、"The calling process must be a session leader and not have a controlling terminal already."とあって、セッションリーダーが自分自身にしか制御端末が設定できないようになっています。最後のforkを行わなければ、セッションリーダーが自分自身に制御端末を再度設定する余地が残っている、わけですね。

しかし、わざわざ制御端末を設定できないようにしたあとで、自分から制御端末を再度設定するようなことってあるのでしょうか。

同じような疑問を抱かれている人もいるみたいで、親プロセスは2度死ぬ - デーモン化に使うダブルforkの謎 - 睡眠不足?!に解説が載っていました。つまるところ、端末デバイスをopenすると自動的に制御端末が設定されてしまうような環境もあるので、誤って制御端末が設定されないように念のためforkしておこう、というような理由のようです。

いくらデーモン化のためにいろいろやっても、プログラムのうしろのほうで気が狂ってsetsidしなおして制御端末を開けば、プロセスに制御端末を設定することはできように思います。よく言われているデーモン化の手順は、すべて必要というわけではなく、よくあるミスをだいたい回避しながらデーモン化してくれる、ベストプラクティスの集まりという感じなのですかね。


なるほどUnixプロセス ― Rubyで学ぶUnixの基礎
Jesse Storimer, 島田浩二(翻訳), 角谷信太郎(翻訳)
達人出版会
発行日: 2013-04-25
対応フォーマット: EPUB, PDF, ZIP

詳解UNIXプログラミング

詳解UNIXプログラミング

  • 作者: W.リチャードスティーヴンス,W.Richard Stevens,大木敦雄
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/12
  • メディア: 単行本
  • 購入: 8人 クリック: 103回
  • この商品を含むブログ (37件) を見る

*1:この二回目のforkはかなりFAQな感じみたいですね

頻繁に更新されてるhomebrewのFormula

頻繁にバージョンアップしたりメンテされている感じのFormulaをならべたら何かおもしろいかなと思ってやってみた。

結果、プロジェクトの性質や方針によってバージョンアップの頻度がちがったりするんだろうなーというのが朧げながら見えてくるという感じで、それほど役にはたたなかった。

おもってもみないソフトウェアがめっちゃメンテナンスされてるみたいなのがわかるのはおもしろいかもしれない。メンテ頻度が高いFormulaは熱心にやってる人がいるのだろうから、見る価値がありそうだとかいう判断にも使えるかもしれない。

以下は、2013/1/1から2013/4/2までの間に /usr/local/Library/Formula/*.rb が変更された回数をファイルごとに集計したものです。

  29 vim
  22 node
  16 git
  15 youtube-dl
  14 ruby-build
  12 uwsgi
  12 opam
  12 mongodb
  12 ffmpeg
  11 exiftool
  10 wine
  10 ruby
  10 mysql
  10 boost
   9 lilypond
   8 rethinkdb
   8 python
   8 pngcrush
   8 opencv
   8 jenkins
   8 git-flow-avh
   8 dart
   7 squid
   7 shocco
   7 rbenv-default-gems
   7 rbenv
   7 plenv
   7 notmuch
   7 leiningen
   7 elixir
   7 elasticsearch
   6 vips
   6 v8
   6 unac
   6 sqlite
   6 sbcl
   6 rbenv-bundler
   6 qt5
   6 qemu
   6 pygtk
   6 play
   6 phantomjs
   6 libuv
   6 libffi
   6 imagemagick
   6 gtk+
   6 gst-plugins-ugly
   6 groonga
   6 git-tf
   6 erlang
   6 cpanminus
   6 arangodb
   5 vowpal-wabbit
   5 tbb
   5 scm-manager
   5 sbt
   5 rhash
   5 redis
   5 postgres-xc
   5 pango
   5 nginx
   5 mpfr
   5 mosquitto
   5 mercurial
   5 mapnik
   5 libslax
   5 libmagic
   5 lftp
   5 gst-plugins-bad
   5 gst-libav
   5 gource
   5 gnutls
   5 ghc
   5 geoserver
   5 gcutil
   5 doxygen
   5 couchdb
   5 cmake
   5 cdrtools
   5 cassandra
   5 casperjs
   4 z
   4 xmp
   4 vtk
   4 ufraw
   4 svtplay-dl
   4 subversion
   4 solr
   4 solfege
   4 signing-party
   4 selenium-server-standalone
   4 rtmpdump
   4 rbenv-gemset
   4 rabbitmq-c
   4 rabbitmq
   4 python3
   4 povray
   4 postgresql
   4 pngquant
   4 pdf2svg

かっこいいワンライナー書きたい!

$ cd /usr/local/Library/Formula;
$ git log --since=2013-1-1 --numstat --format='format:ignoreme' . | grep -v 'ignoreme' | grep -v '^$' | ruby -ane 'puts (%r{^Library/Formula/(.*)\.rb$}.match($F[2]))[1]' | sort | uniq -c | sort -r | head -n100

読み込みのタイミングによっては外部 script のdocument.writeは無視される

外部サイトの事情やら歴史的経緯やらで、document.writeを直接行なうような、JavaScriptを<script src >を使って動的に読み込まなくてはいけないことがあります。この時、誤ってscript要素をappendChildしたりして非同期に読み込みすると、スクリプト内のdocument.writeが無視されることがあります。

例えば以下の例のように、script要素をつくってappendChildすると、外部scriptは非同期に実行されます。この実行タイミングによっては、document.writeを実行しても何も起こらないように見えます。

https://gist.github.com/hakobe/5243675

これは、"HTML 構文解析器が HTML 文書の末尾まで来たタイミングより後で <script src> で指定されたスクリプト経由で実行されると、document.write は黙って無視される" *1という仕様によるものです 。

仕様については、 http://www.whatwg.org/specs/web-apps/current-work/#ignore-destructive-writes-counter 周辺をご確認ください。id:nobuoka さんの 外部 script の document.write が何もしない条件などについて - ひだまりソケットは壊れない の解説が詳しい!

HTML 構文解析器が HTML 文書の末尾まで来て document.writeの書き込み先がなくなってしまったあとで、document.writeすると、documentを再openして画面全体を書き換えてしまいます。いかにもdocument.write要因ぽい症状なのですぐに原因はわかりますが、<script src>経由で同様のことをしてしまうと、エラーも何もでないので、原因を理解しづらい感じですね。

*1:wakabatan に教えてもらいました!

関西2013年春アニメ 放送時間まとめ

毎度おなじみの関西における今期のアニメの放送状況を表にまとめました。今回もWebService-SyoboiCalendarしょぼいカレンダーのデータを抽出し、整形しました。予約設定時の確認などにお役立てください。*1

今季の関西最速は以下の5作品でした。

今季はなんと5作品です! なんといっても話題作の進撃の巨人が最速なのはうれしいところですね。個人的には銀河機攻隊 マジェスティックプリンスや革命機ヴァルヴレイヴなどのロボットアニメに期待です。カーニヴァルは宮野さんがナレーションをしているCMが印象的で気になりますね。DEVIL SURVIVOR 2 the ANIMATIONは未チェックなのですが、中二病っぽい雰囲気がかなりします!

春アニメは期のはじめということもあって気合のはいった作品も多そうで楽しめそうです! それでは、関西の皆さん、今期もがんばりましょう。

  • 注意
    • チャンネルが違う場合、別番組として扱うため、一部重複があります
    • 全国で放送開始が同じ番組(NHK,BSなど)は、関西最速としては扱っていません
放送日時 放送局 作品タイトル
4月3日 (水) 24時30分〜 サンテレビジョン 断裁分離のクライムエッジ
4月3日 (水) 25時0分〜 KBS京都 断裁分離のクライムエッジ
4月3日 (水) 26時0分〜 サンテレビジョン RDG レッドデータガール
4月3日 (水) 26時43分〜 ABCテレビ カーニヴァル
4月4日 (木) 22時30分〜 KBS京都 銀河機攻隊 マジェスティックプリンス
4月4日 (木) 24時30分〜 サンテレビジョン 銀河機攻隊 マジェスティックプリンス
4月4日 (木) 25時0分〜 KBS京都 はたらく魔王さま!
4月4日 (木) 26時0分〜 サンテレビジョン はたらく魔王さま!
4月4日 (木) 26時5分〜 MBS毎日放送 DEVIL SURVIVOR 2 the ANIMATION
4月4日 (木) 26時35分〜 MBS毎日放送 うたの☆プリンスさまっ♪ マジLOVE2000%
4月5日 (金) 26時10分〜 テレビ大阪 DD北斗の拳
4月6日 (土) 9時30分〜 NHK総合 団地ともお
4月6日 (土) 17時30分〜 NHK Eテレ バクマン。(第3シリーズ)
4月6日 (土) 23時30分〜 テレビ大阪 絶対防衛レヴィアタン
4月6日 (土) 25時58分〜 MBS毎日放送 進撃の巨人
4月6日 (土) 27時28分〜 MBS毎日放送 よんでますよ、アザゼルさん。Z
4月6日 (土) 27時43分〜 MBS毎日放送 波打際のむろみさん
4月7日 (日) 17時0分〜 MBS毎日放送 宇宙戦艦ヤマト2199
4月7日 (日) 17時30分〜 NHK Eテレ ファイ・ブレイン 神のパズル(第2シリーズ)
4月7日 (日) 24時30分〜 サンテレビジョン デート・ア・ライブ
4月8日 (月) 18時0分〜 テレビ大阪 ムシブギョー
4月8日 (月) 23時30分〜 サンテレビジョン 非公認戦隊アキバレンジャー シーズン痛
4月8日 (月) 24時30分〜 サンテレビジョン 惡の華
4月8日 (月) 25時0分〜 KBS京都 惡の華
4月8日 (月) 25時15分〜 テレビ大阪 牙狼〈GARO〉~闇を照らす者~
4月8日 (月) 25時58分〜 読売テレビ 翠星のガルガンティア
4月8日 (月) 26時20分〜 MBS毎日放送 やはり俺の青春ラブコメはまちがっている。
4月8日 (月) 26時55分〜 MBS毎日放送 フォトカノ
4月9日 (火) 24時30分〜 サンテレビジョン ゆゆ式
4月9日 (火) 25時0分〜 KBS京都 ゆゆ式
4月9日 (火) 25時30分〜 サンテレビジョン 百花繚乱 サムライブライド
4月9日 (火) 25時30分〜 KBS京都 スパロウズホテル
4月9日 (火) 25時35分〜 テレビ大阪 ハヤテのごとく! Cuties
4月10日 (水) 26時13分〜 ABCテレビ 俺の妹がこんなに可愛いわけがない。(2期)
4月11日 (木) 25時35分〜 MBS毎日放送 革命機ヴァルヴレイヴ
4月12日 (金) 26時40分〜 テレビ大阪 アラタカンガタリ~革神語~
4月13日 (土) 26時28分〜 MBS毎日放送 変態王子と笑わない猫。
4月13日 (土) 26時30分〜 テレビ大阪 這いよれ!ニャル子さんW
4月13日 (土) 26時58分〜 MBS毎日放送 とある科学の超電磁砲S

*1:今回はスクリプトを整理しました: https://github.com/hakobe/WebService-SyoboiCalendar/blob/master/example/search_saisoku.pl

クライアントサイドMVCには何が必須?

最近何度かクライアントサイドMVCフレームワークであるところの、Backbone.jsを使ってコードをかいたりしていたので、その時に感じたことをまとめて Kyoto.js で話してみました。

発表資料 "何がMVCをつなげているのか"

Backbone.jsではMVCの各層をつなげるために、Backbone.Eventsというオブジェクトが用意されています。Backbone.jsのModelとViewのインタラクションは、ベースになっているBackbone.EventsによるObserverパターンによって実現されています。実際にBackbone.jsでコードを書いてみると、便利な機能はいろいろあるもののBackbone.Eventsの存在がMVCを実現するのに重要であることがわかります。

そこつきつめると、Backbone.EventsのようなObserverパターンを簡単に実現できるようなライブラリがあれば、クライアントサイドMVCを実現するには十分で、必要以上にライブラリに依存することを避けれるのではないかと考えてみたりしています。

ただHTMLをViewとしている以上、実際に表示したいものをViewに反映するにはどうしてもDOM操作が必要になります。これは、既存のMVCパターンでは取り扱っていななかったWebアプリケーション固有の性質です。Angular.jsKnockout.jsはUIバインディングなどでDOM操作を隠蔽してこのへんを取り扱おうとしようとしているみたいです。

クライアントサイドMVCJavaScriptの設計に採用するのは、コードが整理されてよさそうですが、大きすぎるフレームワークへの依存は保守性を悪化させます。クライアントサイドMVCに要求される最低限の要素だけを自分なりに実装して使っていくのが良いんですかね。

Kyoto.js #7 を開催します

いつのまにやら7回目になる Kyoto.js の meetupを開催します。発表は調整中ですが、LTSVやdocument.writeやWebRTCのはなしが聞けるかもしれません! 参加は以下のURLからどうぞ。

http://kyotojs.doorkeeper.jp/events/3064

いつも平日にやってるんですが、休日にやってくれたら参加したいっていう人はどれくらいいるんでしょうか? 気になります! (もしご意見あったら コメントとか#kyotojsハッシュタグでぽろっとつぶやいていただけると見ます)