Sencha Touch パーフェクトガイドをいただきました

とあるつながりから『Sencha Touch パーフェクトガイド』(大谷弘喜, 稲垣龍一, 川野忍, 土江拓郎, 森本恭平, 高岡大介/共著, 株式会社アスキー・メディアワークス) をいただきました. かなり遅くなってしまいましたが, その恩返しとして感想など書いてみようと思います.

全体の内容

目次を眺めてみると, 次のような 3 部構成になっていることが分かります.

  • 第1部
    • Sencha Touch というフレームワークの位置付け
    • 基本的な道具や概念の説明
  • 第2部
    • Sencha Touch の基礎
  • 第3部
    • 実際にアプリを作る課程を説明
    • 本物の動くコードが載っている

パラパラめくってみると, 全体を通してソースコードがかなりの量載っていることが目に付きます.

ソースコードをどれくらい載せるのか? というのは, 技術書ではよく悩むところです. 載せ過ぎると煩雑になりがちですし, かと言って細かいところを省略してしまうと, そのせいで読者が実装しても上手く動かない危険性が出てきます.

この本では「ソースコードを全て載せる」という方針を採用したようですが, 実際の動作画面の画像や, Google Chrome の開発者コンソールの出力例を載せることで, 読んでいても煩雑と感じたり飽きてくるようなことはありません. ここは著者の方々が気を遣って, 工夫されたのだろうなぁ (そして, 編集者さんの発破掛けがあったのだろうなぁ) と想像しています.

少し話は変わりますが, 実は Sencha Touch には公式のかなり手厚いドキュメントがあります. → http://docs.sencha.com/touch/2.2.0/ このページには, API ドキュメント, 開発およびテストの方法論, 動画による解説, サンプル集があります. このドキュメント自体も Sencha Ext JS (Sencha Touch の非モバイル版) で作ってあります. API ドキュメントは Javadoc のようにソースコードコメントから生成されており, 見た範囲では全ての class, config, property, method, event, CSS 変数に解説が付いています.

これだけ聞くと「この本を読まなくてもいいんじゃないの?」と思うかもしれませんが, そうとはならない理由があります. ドキュメントは確かに豊富なのですが, 全体として散発的な感があり, 内容が豊富過ぎてかえってどれを読んでいいのか迷ったりします. そこをこの本では, 取捨選択し, 1つの流れに整理してあります. ComponentQuery が特にそうなのですが, 必要であれば説明のための例も付け足されています. また Web サーバの準備の仕方や Sass の解説など周辺の情報についても載っています. こういうところにこの本の価値があるのだと思います.

第1部

ここを一通り読んで, 指示の通りに作業すると, なんとアプリが1つ作れてしまいます. この部で開発の準備からアプリ作成の流れが分かるようになっています. sencha コマンド (Play framework の play コマンドのようなやつ) の使い方から, nginx のインストール方法, ブラウザの開発者コンソールの活用の仕方, 実際のアプリのソースコードとその解説まで載っています. 環境構築のところは Homebrew で nginx 入れててちょっと驚きましたが, 本を通しての解説である以上, 環境は揃えておきたいのだと思います.

この部を読んでいてふと気付いたのは, 書いてすぐに動かせる画面が出るのはやっぱり楽しいのだろうな, ということです. Sencha Touch が最低限の設定でそこそこ動くようになっているのがすごいところです. もちろん見栄えも悪くないです.

余談ですが「2.1.5 テキストエディタ」のところで, どんなエディタがオススメされているのか気になりましたが, 特にオススメのものは提示されていませんでした. アリエルさんの社員の方が多いので, きっとこの短い小節に落ち着くまでに血みどろの宗教戦争があったのでしょう(憶測) 社員ごとの使用エディタが載ってる社員紹介のページを探そうとしましたが, 今は見れないみたいで残念です.

第2部

ここを読むと Sencha Touch の基本を一通り理解できます. Sencha Touch のことを知っている人でもリファレンスとして見返すときに便利だと思います.

個々の内容について書いても本書の劣化版の文章にしかならないと思うので, 図やキャプチャが多く読み易い, とだけ書いておきます. それと Sencha Touch の config で設定する方式のおかげで, 余計なコードが無いのも読み易いです. そこは Sencha Touch (および Ext JS) のすごいところだと思います.

第3部

この部では実践的な内容として, アプリを1つ作ります. コンポーネントの作り方, Dropbox にデータを保存, 読み出しする proxy の作成などの内容が載っています. ここまで作れれば, 他の proxy の作成もできると思います.

誤植

気付いたものを書いておきます. (報告用のサイトがあればそっちに書こうと思います.)

P.27 2行目 s/Goole Chrome/Google Chrome/

最後に

Sencha Touch (に限らず Sencha Ext JS も) は JavaScript とは別の世界を作っていて, 独特の作法でアプリケーションを実装します. その作法を概観し実践につなげるには, この本はとても役立つと思います. 後から読み返すのにも良い本ですよ.

『「異様に難しいドラクエの謎解き」をモデル検査器で解く』代わりに数学で解く

前置き

タイトルは本歌取りもいい加減にしろ, という長さですが. こんなつぶやきをしたので, 予告どおり記事を書きます.

酒井さんの続きの記事 → http://msakai.jp/d/?date=20130402#p01

解説

まず方針としては酒井さんと同じく連立方程式を解きます. 酒井さんはモデル検査を用いて解いていますが, 私は数学で解きます. 一応, 数学を学んできた身としては, 数学で解けるものは数学で解きたいものです. (酒井さんも同じようなお考えなのかもしれません) 数学を使って厳密に解いてしまえば, この解が最適解かどうか考えるのも楽になります. 手法による違いを楽しんでいただけたら, と思います.

まず最初に立式する連立方程式は同じです.

$$ \begin{aligned} x_1 + x_2 + x_3 + a_1 &\equiv b_1\ (\bmod 4) \\ x_2 + x_3 + x_4 + a_2 &\equiv b_2\ (\bmod 4) \\ x_1 + x_3 + x_4 + a_3 &\equiv b_3\ (\bmod 4) \\ x_1 + x_2 + x_4 + a_4 &\equiv b_4\ (\bmod 4) \end{aligned} $$

4 次元の縦ベクトル \(\mathbf{a}\) は 4 つの銅像の初期状態, \(\mathbf{b}\) は終了状態を表します. 各要素は内側を向いている状態を 0 として, 右回りに 90 度回るごとに 1 増えるとします.

与えられた \(\mathbf{a}\) に対し \(\mathbf{b} \equiv 0\) の条件で \(\mathbf{x}\) について解くのですが, ここでおもむろに行列を持ち出します.

$$ \begin{aligned} \begin{pmatrix} 1 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 1 & 0 & 1 \end{pmatrix} \begin{pmatrix} x_1 \\ x_2 \\ x_3 \\ x_4 \end{pmatrix} + \begin{pmatrix} a_1 \\ a_2 \\ a_3 \\ a_4 \end{pmatrix} \equiv \begin{pmatrix} 0 \\ 0 \\ 0 \\ 0 \end{pmatrix} \end{aligned} $$

こうして

$$ \begin{aligned} \begin{pmatrix} 1 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 1 & 0 & 1 \end{pmatrix} \begin{pmatrix} x_1 \\ x_2 \\ x_3 \\ x_4 \end{pmatrix} \equiv \begin{pmatrix} - a_1 \\ - a_2 \\ - a_3 \\ - a_4 \end{pmatrix} \end{aligned} $$

こうして

$$ \begin{aligned} \begin{pmatrix} x_1 \\ x_2 \\ x_3 \\ x_4 \end{pmatrix} \equiv \begin{pmatrix} 1 & 2 & 1 & 1 \\ 1 & 1 & 2 & 1 \\ 1 & 1 & 1 & 2 \\ 2 & 1 & 1 & 1 \end{pmatrix} \begin{pmatrix} a_1 \\ a_2 \\ a_3 \\ a_4 \end{pmatrix} \end{aligned ...

Emacs 24.3.1 で ddskk 14.3 が使えなくなった

GNU Emacs では日本語入力に ddskk を使うのが常識ですが, Emacs のバージョンを 24.3.1 に上げたところ使えなくなってしまいました. C-x C-j としても skk-mode が有効になってくれません.

メッセージを見ると face-equal: Invalid face: modeline というエラーが出ています. ググってみると http://mail.ring.gr.jp/skk/201210/msg00000.html という話があり, modeline という face は mode-line という名前に変わったようです.

ここ を参考に最新の ddskk を入れます.

http://d.hatena.ne.jp/tomoya/20100905/1283681474 では APEL を先にインストールしていますが, 上記ページに「APEL に依存しなくなった」とあり, その作業は不要です.

$ cd /tmp
$ wget http://openlab.ring.gr.jp/skk/maintrunk/ddskk-15.1.tar.gz
$ tar xvf ddskk-15.1.tar.gz
$ cd ddskk-15.1
$ emacs SKK-CFG
... (↓末尾に追加)
(setq SKK_DATADIR "~/.emacs.d/etc/skk")
(setq SKK_INFODIR "~/.emacs.d/info")
(setq SKK_LISPDIR "~/.emacs.d/elisp/skk")
(setq SKK_SET_JISYO t)

$ make what-where
インストールされるディレクトリを確認

$ make install EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs

これでインストール完了です. Makefile の中には丁寧な説明が (もちろん日本語で) 書いてあるので確認すると良いです.

これで無事 ddskk が動くようになりました.

Have a nice Emacs day.

LaTeX in reST test

Emacs 24.3.1 に ProofGeneral 4.2

じぇねらるたんのステッカーをいただけることになったので, ProofGeneral をインストールしてみた記録.

ついでに Emacs も最新の 24.3.1 にしてみた.

ProofGeneral についてはこちら. → http://proofgeneral.inf.ed.ac.uk/download

Emacs 24.3.1 はここからビルド済みのものをダウンロード. → http://emacsformacosx.com

$ make clean
$ make compile EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs

これですんなりインストールが済むかと思いきや, バイトコンパイルでエラーが出た.

In toplevel form:
generic/pg-response.el:104:23:Error: `special-display-regexps' is an obsolete variable (as of 24.3); use `display-buffer-alist' instead.
make[1]: *** [generic/pg-response.elc] Error 1
make: *** [compile] Error 2

エラーの場所は分かったので, 以下のように書き換えて無事コンパイル完了.

--- before/pg-response.el    2012-09-25 18:44:18.000000000 +0900
+++ after/pg-response.el     2013-03-14 22:57:29.000000000 +0900
@@ -101,9 +101,9 @@
              pg-response-special-display-regexp
              proof-multiframe-parameters)))
     (if proof-multiple-frames-enable
-    (add-to-list 'special-display-regexps spdres)
-      (setq special-display-regexps
-        (delete spdres special-display-regexps))))
+    (add-to-list 'display-buffer-alist spdres)
+      (setq display-buffer-alist
+        (delete spdres display-buffer-alist))))
   (proof-layout-windows))

 (defun proof-three-window-enable ()

さてこれからはドキュメントを読みつつ使い方に慣れていく. → (PDF) http://proofgeneral.inf.ed.ac.uk/releases/ProofGeneral/doc/ProofGeneral.pdf

pip と Python 3.3

以下, メモレベルで.

発端

「Python3 で Sphinx って使えるんだっけー?」と思って, 試しにインストールしてみたときに気付いた. Jinja2 を pip でインストールするときに, 不思議なエラーが出る. インストール自体は成功する.

やりとり

清水川さんと色々やりとり

というわけで, distribute の easy_install 使って入れてみたら, さっきのエラーは出ずに無事インストールできた.

原因がさっぱり予想付かなかったけど, 稲田さんによるとこんなことらしい.

pip けっこう過激な対応してますね……

(追記 2013/02/16 22:50) この点について稲田さんが Pull Request を作成しています → https://github.com/pypa/pip/pull/810

distribute じゃなくて pip 使ってる理由は uninstall コマンドが使えることなんだけど, また清水川さんから教わる.

easy_install で入れたものが, pip freeze -l でも認識されてるし, pip uninstall でもちゃんと egg を消してくれた.

venv

venv + distribute での Shpinx のインストールを試す (予定)

use JavaFX from Jython

I love Python, even on JVM! So, I decided to use JavaFX from Jython.

This article is a 20th day of JavaFX Advent Calendar 2012

I started translating Java code on this article into Jython.

Setting up Environment

We need JavaFX SDK and Jython which can use it. A following sequence is actual processes I went through.

To obtain JavaFX developing environment, I installed JavaFX for Java SE 7.

Following this instruction, I made Java 7 as a default JDK.

$ sudo mv /System/Library/Java/JavaVirtualMachines/1.6.0.jdk /System/Library/Java/JavaVirtualMachines/1.6.0.jdk.bak
$ sudo ln -s /Library/Java/JavaVirtualMachines/1.7.0.jdk /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
$ java -version
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)

Next I compiled Jython with Java 7.

$ hg clone https://bitbucket.org/jython/jython
$ cd jython
$ ant
$ ls dist/bin/jython

The result jython executable exists at dist/bin/jython. When I compiled, the Mercurial changeset ID is 6898:2ccd73a00a86 and Jython version is 2.7.0a2+.

Now, all had been set up.

Hello, World!

Since ...

Scalaz の Functor trait を初心者が実装してみた

Scalaz Advent Calendar の 10 日目の記事として書いています.

前回の記事 では Functor の構造について数学の定義を対比させながら書きました. 今日は Scalaz を使ったプログラムを書いて Functor の実装をしてみましょう.

準備

今回の実装をするために sbt で管理している Scala プロジェクトを作成しました. 同じ環境を作成して色々触ってみると楽しいと思います. 実際, 私は自分で実装してみて Functor の使い方がより分かるようになりました.

私は以下の環境で作業しました. (scala, scalaz は sbt で取得するので, sbt のバージョンさえ合っていれば同じ作業ができるはずです)

sbt 0.12.1
scala 2.10.0-M7
scalaz 7.0.0-M3
Giter8 0.4.5

Giter8 についてはこちらを参照してください. http://blog.twiwt.org/e/f12c0f

前置き

説明を簡単にするために implicit なものは使っていません. 対象を函手で写すときには, implicit conversion を使うと綺麗に書けるのですが, 今回はそこが本題ではないので敢えて使っていません.

今回は以下のページを参考にしました.

環境準備

g8 typesafehub/scala-sbt コマンドを実行して, パッケージ名など適宜答えていきましょう. scala のバージョンを聞かれたら 2.10.0-M7 としておいてください.

<project_root>/project/<project_name>.scala に sbt の設定を追加して, scalaz が利用できるようにします.

resolvers += "Typesafe Snapshots" at "http://repo.typesafe.com/typesafe/snapshots/",

libraryDependencies ++= Seq(
  "org.scalaz" % "scalaz-core" % "7.0.0-M3" cross CrossVersion.full
),

scalacOptions += "-feature",

initialCommands in console := "import scalaz._, Scalaz._"

実際のファイルは https://bitbucket.org/cocoatomo/scalazsample/src/e5efd3d7b750/project/ScalazsampleBuild.scala?at=default を見てください.

次に <project_root>/src/main/scala/<package_hierarchy>/なんとか.scala に以下の import 文を追加します.

import scalaz.Functor

ソースコードは https://bitbucket.org/cocoatomo/scalazsample/src/a451998f4f2fa9ab09771622a333e9dd9fbe64b9/src/main/scala/net/elliptium/Scalazsample.scala?at=default を見てください.

そして最後にコンソールに戻って sbt run コマンドを実行すると, scalaz-core の取得が行われ, プログラムが動きます. g8 コマンドの引数に typesafehub/scala-sbt を指定してプロジェクトを作成した場合, "Hello, <project_name>" メッセージが出力されるだけのプログラムになっているはずです.

作成する Functor

今回作成する Functor は Important という名前にします. 普通の「クラスの圏」から「重要なクラスの圏」への函手というイメージになります. 今回持ち上げる射の例として length というものを選びます. 図式を書くと以下のようになります.

              lift(length)
Important[String] → Important[Int]
       ↑                ↑
       ↑                ↑
       ↑                ↑
     String       →     Int
                length

length: String => Int 函数は名前の通り「文字列の長さ」を返すものです. Important という Functor は「2重にする」函手です. 実体は Tuple2 に似た case class で, toString をちょっとイジってあります. これはソースコードを見た方が理解が早いでしょう.

実装

Important

これが Important[T] の実装です.

case class Important[T](val value: T) extends Product2[T, T] {

  def _1: T = value
  def _2: T = value

  override def toString: String = value.toString + ", " + value.toString

}

このクラスのコンストラクタで「普通のクラス T 」を「重要なクラス Important[T] 」に持ち上げています. 図式の以下の矢印にあたります.

Important[String]    Important[Int]
       ↑                ↑
       ↑                ↑
       ↑                ↑
     String ...

Scalaz の Functor.scala を初心者が読んでみた

Scalaz Advent Calendar の 6 日目の記事として書いています.

準備

今回解説するソースコードは scalaz/Functor.scala です.

scalaz-seven ブランチのものであることに注意してください.

前置き

数学 (代数) は一応やってはいたものの, Scala や Scalaz のことを全然分からない状態からこの記事を書いています. そんな人間が Scalaz を読んだらどう見えるか? という実験記録のようなものがこの記事です.

圏論については「圏論の基礎」を参照しています. 用語などはそちらに倣いました.

数学の函手とは

最初にざっと圏論の概念の定義を並べておきます.

圏 (category) の定義

  • 圏とは対象 (object) と対象の間の射 (arrow) の集まり

    • f はある対象 a とある対象 b を結び付けるもの

      この射は方向を持っているので f: a → b のように表記することが多いです

      この af のドメイン (domain, source), bf のコドメイン (codomain, target) と言います

  • 各対象 c には id c という c から c への射 (恒等射, identity) が存在する

  • f: a → b, g: b → c があったとき, それらをつないだ合成射 (composite) g・f: a → c も存在する

    • 恒等射 id c: c → c と合成の関係は以下の通り

      • f: b → c, g: c → d としたとき (id c)・f = f, g・(id c) = g

        つまり恒等射は合成 (composition) 演算の両側単位元です

    • 複数の合成がつながっている場合合成の順序は問わない

      f: a → b, g: b → c, h: c → d があったとき, (h・g)・f = h・(g・f)

      いわゆる結合則 (associative law) です

つまり圏とは群と群の間の準同型の集まり, のようなものです. この喩えでは, 対象が群という1つの集合なのですが, 圏論では群の元1つ1つについて直接扱わない流儀を採ります.

圏を図で書くと, 圏は対象をノードとし, 射をエッジとする有向グラフになります. これを図式 (diagram) とかと呼んで, 圏の説明で使ったりします.

函手 (functor) の定義

この対象と射を含む圏どうしの間にも対応付け (函手, functor) を考えることができます. 射が対象どうしの対応付けだったのに対し, この函手は圏どうしの対応付けになっていて 1 段上のメタなものになっています.

  • 函手とは圏と圏の間の対応付けで, 対象を対象に, 射を射に対応付ける

    型を考えると対象を写すものと, 射を写すものは別の関数になるのですが, 同じ記号で書いても混ざることは無いので同じ記号を援用したりします

    • 函手 T が写した対象と射の関係は以下の通り

      • T(id c) = id Tc

        恒等射を恒等射に写します

      • T(f・g) = T(f)・T(g)

        合成を保ちます

この函手を大雑把に説明すると, 圏の中にある図式を別の圏に写すものです.

Scalaz の Functor とは

ここまでを踏まえて Scalaz の Functor が数学の函手になっているのか見ていきましょう.

実装

まず Functor の先頭部分は以下のようになっています.

trait Functor[F[_]]  { self =>
  ////

  /** Lift `f` into `F` and apply to `F[A]`. */
  def map[A, B](fa: F[A])(f: A => B): F[B]

  // derived functions
  ...

F という Functor を宣言し, map というメソッドの型が定義されています.

他のメソッドは Functor#map メソッドを使って実装されているので, 最低限 Functor#map だけ実装すれば良さそうです. (このあたりはまた後日追い掛けます)

数学の定義と対比して

Scalaz の Functor はいったいどんな函手なのかを見てみましょう.

Functor#map の型を見てみると以下のようになっています.

/** Lift `f` into `F` and apply to `F[A]`. */
def map[A, B](fa: F[A])(f: A => B): F[B]

これから map メソッドは fa: F[A]f: A => B を受け取って, F[B] 型のインスタンスを返すのが分かります. 意図としては, f という関数を持ち上げて fa に適用しています.

図式として書くと以下のようになります.

F[A] → F[B]
 ↑      ↑
 A   →  B

函手のドメインである圏には AB が対象として存在し, f が射として存在しています. 下の段の矢印が射 f です.

A → B
  f

対象 A, B をそれぞれ持ち上げているのが型パラメータを 1 つだけ受け取る型クラス F です.

  F[A]   F[B]
F ↑    F ↑
  A ...

CentOS 6.3 に Emacs 24 をインストールした記録

scala-mode2 を使いたかったけど, CentOS 6.3 の yum では Emacs 23 までしか用意されておらず, scala-mode2 が動かなかったので, 自前で入れた手順の記録.

$ ./configure --with-x-toolkit=gtk
$ make
$ ./src/emacs
起動確認
$ sudo make install

X でビルドしてみたけど GUI が古臭かったので gtk にした. configure のときに色々ライブラリの不足で失敗するけど, その都度インストールした.

無事に Emacs 24 が動作し, scala-mode2 も動いている. めでたしめでたし.

Licenses