21112012 javascript
気になっている本
Smashing Node.js: JavaScript Everywhere (Smashing Magazine Book Series)Guillermo Rauch
Wiley / 3379円 ( 2012-09-11 )
21112012 javascript
気になっている本
Smashing Node.js: JavaScript Everywhere (Smashing Magazine Book Series)20112012 life
web分析系はよくわからない三文字表記が多いので、それらを覚えるのに都合が良かった。内容も基礎的だけど丁寧に解説されていたので、わかりやすかった。
ウェブ分析では、サイトの目的・目標を「KGI(Key Goal Indicator)」と呼びます。ここで重要なのは目的を数値化することです

CSF(Critical Success Factor)とはKGIに決定的な影響を及ぼす要因。これをさらに具体的な数値目標に落とすとKPI(Key Performance Indicator)になる。
talknoteで聞いたユーザータイムラインは本書で言うところのコンセプトダイアグラムと同じものかな。
統計のあたりは流し読みで十分だった。
ウェブに関するデータで正規分布するものはほとんどない
と触れられていたが、正規分布がどういう分布か知っていればまぁそうだろうなと。それからP.90の時系列データを多項式近似するのは乱暴だなと思ったけど、入門者向けの説明だからいいのかな。逆にそのくらい粗い近似でいいというのが不思議な気もするがそういうもんなのかな。
検索ワードには来訪者の「目的」や「期待」が表れる
検索エンジンからの流入分析じゃなくてソーシャルメディアの分析も面白いなと最近思うようになってきたので、facebookインサイトの説明は役に立った。
まぁ試行錯誤するタイプの分析は本読むよりは自分でやってみるに限るなとというか数をこなさないとダメだな。
ポップでキッチュな表紙のあの本とは直接関係ありませんが、今週末に三島Haskell無名関数の会 第一回目があるので、興味があれば参加されると楽しいと思います。というより、そろそろ関数型プログラミングの勉強会を定期的に開催していければなぁと思います。
初学者の@ando_ando_andoも参加するということなので、快適なHaskellコーディング環境をつくるという話をしようと思っています。
とりあえず、タイトルと表紙だけつくってみました。

それから、世界観が大切だと思うのでそういうものもちゃんと考慮してあります。
つまり我々はEmacsを信じHaskellを推進しなければならないのです。
19112012 Emacs
Emacs RocksのEpisode 01: From var to thisを見ていて、C-sすると自動的に検索開始時点の位置がマークされることを知った。
ということはC-x C-xで戻れるってことじゃないかと。
他にはexpand-regionってのが便利そうだったので、入れた(list-packagesで選択できる)。
18112012 javascript Emacs coffeescript Ti
犬が早朝から吠えたので4時に叩き起こされたが、タイムラインを追いかけていたらAlloy with CoffeeScript のお誘いというこれは!というエントリがあがっていたので、早速誘われてみた。尚、jsとcoffeeは一緒のディレクトリに置いておくのが好みなので@k0sukeyのオリジナルなjmkに変更をくわえてあります。
Titanium Mobile iPhone/Androidアプリ開発入門のストップウォッチを参考にしました。
本書ではui.jsという1つのファイルで完結していますがAlloyのようなMVCフレームワークを使ったほうがコードの見通しは良くなると思います。
$ titanium create stopwatch # 対話でターゲットデバイスやapp-id設定 $ cd stopwatch $ alloy new # alloyのひな形作成 $ alloy generate jmk
stopwatch/app/alloy.jmkを以下のように書きなおす。これでapp/controller のcoffeeファイルはalloy compileでコンパイルされるようになります。
task("pre:compile", function(event,logger) { var wrench = require("wrench"), fs = require("fs"), path = require("path"), controller_root = event.dir.controllers, coffee = require("coffee-script"); wrench.readdirSyncRecursive(controller_root).forEach(function(controller){ if (controller.match("coffee$")) { fs.writeFileSync( path.join(controller_root,controller.replace("coffee", "js")), coffee.compile( fs.readFileSync(path.join(controller_root, controller)).toString(), { bare: true })); } }); }); task("post:compile",function(event,logger){ });
あとは普通に。
app/views/index.xml
<Alloy> <TabGroup> <Tab id="tab1" icon="dark_clock.png" title="ストップウォッチ"> <Window id="window1" title="ストップウォッチ"> <Label id="label"> 00:00:00.000 </Label> <Button id="button"> Start </Button> </Window> </Tab> <Tab id="tab2" icon="dark_info.png" title="使い方"> <Window id="window2" title="使い方"> <WebView url="howto.html"> </WebView> </Window> </Tab> </TabGroup> </Alloy>
/app/styles/index.tss
{"Window": { "barColor": "#000", "backgroundColor": "#000" }, "Tab": { "backgroundColor": "#000" }, "#label": { "color": "#fff", "width": "auto", "height": "auto", "font": { "fontSize": 40, "fontWeight": "bold" } }, "#button": { "color": "#000", "width": 150, "height": 40, "bottom": 30 }}
webview用のhtmlは /app/assets/iphone/howto.htmlに
<html> <head> <title>使い方</title> </head> <body> <h1>使い方</h1>このサンプル は<a href="http://www.amazon.co.jp/dp/479803231X">Titanium Mobile iPhone/Androidアプリ開発入門</a>のストップウォッチのサンプルをAlloyで 書きなおしてみたものです。 <img src="http://ec2.images-amazon.com/images/I/41jDZ5IY01L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU09_.jpg"/> </body> 興味を持ったら購入して読んでみるとよいと思いますよ。 </html>
最後にcoffeeをapp/controllers/index.coffeeに
started =false intervalID = null startStopwatch = -> $.label.text = "00:00:00.000" startTime = new Date() _updateTimer = -> u_sec = 1000 u_min = 60 * u_sec u_hour = 60 * u_min now = new Date() diff = now - startTime hour = Math.floor(diff/u_hour) min = Math.floor((diff - hour*u_hour)/u_min) sec = Math.floor((diff - hour*u_hour - min*u_min)/u_sec) msec = diff / u_sec $.label.text = ("0" + hour).slice(-2) + ":" + ("0" + min).slice(-2) + ":" + ("0" + sec).slice(-2) + "." + ("00" + msec).slice(-3) intervalID = setInterval(_updateTimer, 3) return $.button.addEventListener 'click', -> if started clearInterval(intervalID) $.button.title = "Start" started = false else startStopwatch() $.button.title = "Stop" started = true return $.index.open()
$ alloy run

Let's Enjoy!
18112012 twitter-bootstrap
今、728x90の横長のやつを張り付けているんだけど、スマホで表示させると邪魔だ。動的に大きさを変更するのは規約違反らしいので、横長よくないじゃんと。まぁサーバー側でチェックしてサイズ変えてもいいんだけどいちいち面倒くさい(というかbootstrap使う必要ないじゃん的な)。
2カラムにしてサイドバーの方に320x320くらいのレクタングルを貼り付けておくのが良いかなと思ったのでTwitter Bootstrap: Build A Stunning Two Column Blogを見てた。
というわけで2カラムのデザインでヨサゲなやつを参考にしてなんか作ろうかなと思ってwordpressのテーマを漁っている。
bootstrap関係
Alloyのtssの文法ってよく分からんですね。css-modeあててもjs2-modeをあててもエラーばっか吐くし、快適にコーディングできん。
ということでちょっと調べてみた。
Alloyのソースコード探していたらgrammerのとこにtss.pegjsってのがあって、ヘッダを読んでみるとTSS parser based on JSON parserって書いてあったので基本的にはJSONらしい。
それにしては{で始まらないよなぁとソースコードを追いかけていくとcompilerUtilsに
// Add enclosing curly braces, if necessary contents = /^\s*\{[\s\S]+\}\s*$/gi.test(contents) ? contents : '{' + contents + '}';
ってあって、要するに{で始まってない場合ファイルのコンテントを{}で囲むことになっているらしい。それからtssはキー値を""で囲まなくてもいいんだけど、囲んでも別に問題なかったりする。
結論としてはJSONで書いておけば、即時構文チェックとかシンタックスハイライトとか効かせられていいんじゃないかと。
つまり
"Label": { font: {fontSize: 20, fontFamily: "Helvetica Neue"}, color: "#999" }
って書いてるところを、最初から
{"Label": { "font": {"fontSize": 20, "fontFamily": "Helvetica Neue"}, "color": "#999" }}
って書くようにすれば、事前に構文のエラーを潰せて気持ちがいい。
json-modeを使ってみますが、package.elでは入れられないのでgit cloneしてrequireします。javascript-modeを継承しているのでTabの設定なんかはそっちの設定に従う。
次にFlymakeの設定をする。構文チェックにjslintを使うのでインストールしてない場合には
npm install -g jslint
で入れます。
Emacsのほうの設定はこんな感じ。tabはスペース2個分(個人的な好み)にした。それからelectric-pair-modeも入れてるので{},""をよろしくやってくれる。
;; JSON (require 'json-mode) (add-to-list 'auto-mode-alist '("\\.tss$" . json-mode)) (add-hook 'json-mode-hook 'electric-pair-mode) (add-hook 'json-mode-hook '(lambda () (setq js-indent-level 2) )) (when (load "flymake" t) (defun flymake-jslint-init () (let* ((temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace)) (local-file (file-relative-name temp-file (file-name-directory buffer-file-name)))) (list "jslint" (list "--terse" local-file)))) (setq flymake-err-line-patterns (cons '("^\\(.*\\)(\\([[:digit:]]+\\)):\\(.*\\)$" 1 2 nil 3) flymake-err-line-patterns)) (add-to-list 'flymake-allowed-file-name-masks '("\\.tss\\'" flymake-jslint-init))) (load-library "flymake-cursor")
この設定で少し使ってみる。
17112012 javascript Emacs Ti
静岡javaScript勉強会 #2に参加されるみなさんこんにちは、参加されないみなさんもこんにちは。僕は11月のすべての土曜日を留守にして家族の顰蹙を買うという重圧に耐え切れずに早々に離脱してしまいましたので朝からお家でjsってます。
ところで、@tomofの「Backbone.js入門」面白かったですか?よっしゃーいっちょおとうさんもbackbone.jsでウェブアプリケーションつくっちゃうぞーっていう気になりましたか?はいそうですか、そうですよね。ついでに、その勢いでBackbone.jsっぽい開発のノリでiPhoneアプリを開発できたら面白いと思いません?思いますよね。
やりましょう、Alloyで!(孫社長風味でよろしく)
というような内容のエントリです。

Titanium CLIはTitaniumで開発するためのコマンドラインのツールで、AlloyはTitaniumのためのMVCフレームワークですが、両方共Node.jsのv0.8以上がインストールされていればnpmでインストールできるはずです。
npm install -g titanium npm install -g alloy
うまくいかない場合は下のサイトを参考にしてください。
EmacsでもvimでもST2でも好きなモノを使えば良いとおもいますが、僕はEmacs(24)をつかっています。でnxmlモードにzencoding-modeをあててあります。入ってない場合はM-x list-packaegesでzencoding-modeを選んでインストールしたらinit.elに下の内容を追記しておけばいいです。
(add-hook 'sgml-mode-hook 'zencoding-mode) (add-hook 'nxml-mode-hook 'zencoding-mode)
他にはjavascriptの開発用にjs2-modeを入れているのとcoffeeモードにflymakeが効くようにしてありますが今回の内容では必要ありません。
追記121118: CoffeeScriptを使って開発する方法
最初にtitaniumコマンドでプロジェクトの雛形をつくります
$ titanium create Titanium Command-Line Interface, version 3.0.13 Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. Please report bugs to http://jira.appcelerator.org/ Target platforms: (android,ios,ipad,iphone,mobileweb) iphone App ID: com.example.tabsample Project name: tabsample [INFO] Creating Titanium Mobile application project [INFO] Project 'tabsample' created successfully in 276ms
プロジェクトのディレクトリに移動してalloyの雛形をつくります。
$ cd tabsample/ $ alloy new .__ .__ _____ | | | | ____ ___.__. \__ \ | | | | / _ < | | / __ \| |_| |_( <_> )___ | (____ /____/____/\____// ____| \/ \/ Alloy by Appcelerator. The MVC app framework for Titanium. [INFO] Installed "ti.physicalSizeCategory" module to tiapp.xml [INFO] Installed "ti.alloy" plugin to tiapp.xml [INFO] Deployed ti.alloy compiler plugin to plugins/ti.alloy/plugin.py [INFO] Deployed ti.alloy hooks to plugins/ti.alloy/hooks [INFO] Generated new project at: app
ここからEmacsを使っていきます。まずはapp/views/index.xmlを修正します。中身を全部消してzencodingでさくっと用意します。zencodingはC-returnで起動させて
Alloy>TabGroup>(Tab#tab icon title>Window#window title backgroundColor>Label#lable)*2
みたいにワンライナーで書けるので便利すぎです。

zencodingで大まかにスキャフォールドを用意したら、アトリビュートなんかを設定します。ちなみに画像はここから取ってきてapp/assets/iphone/に起きました。
<Alloy> <TabGroup> <Tab id="tab1" icon="KS_nav_views.png" title="Tab 1"> <Window id="window1" title="Tab 1" backgroundColor="#fff"> <Label id="label1"> I am Window1 </Label> </Window> </Tab> <Tab id="tab2" icon="KS_nav_ui.png" title="Tab 2"> <Window id="window2" title="Tab 2" backgroundColor="#fff"> <Label id="label2"> I am Window2 </Label> </Window> </Tab> </TabGroup> </Alloy>
app/styles/index.tssはLabelの設定だけ。
"Label": { font: {fontSize:20, fontFamily:"Helvetica Neue"}, color: "#999" }
tssにはどのモードをアサインするのがいいのでしょうか?誰か知っていたら教えて下さい。(追記121117 json-modeあててみた)
プロジェクトのトップディレクトリで
$ alloy run
するとシミュレータが立ち上がります。素敵ですね。これで、雛形作ってシミュレータを動かすところまでできました。あとはapp以下を良い感じにいじってイケてるアプリを作るだけですね。

シミュレータが立ち上がるまでに結構待たされるのでストレスを感じますが、それは僕のmacが遅いからですね。はやく買い換えたい。
@k0sukeyにAlloyJadeという素敵なものがあることを教えてもらいました。Jade派の僕としては非常に惹かれるので後で試そうかなと思っています。
16112012 sake