Kindleで漫画はありなのか

と気になったので稲中購入。めくる方向が普通の本と違って漫画と一緒なので最初戸惑った。

蟲師も気になるところではあるが。

ProductName 蟲師(1): 1 (アフタヌーンKC (255))
漆原 友紀
講談社 / ?円 ( 2012-09-28 )


伝染るんですは電子書籍化されてなかった。待ち遠しい

ProductName 伝染(うつ)るんです。 (1) (小学館文庫)
吉田 戦車
小学館 / 630円 ( 1998-11 )


「Kindle自費出版ガイド」は役に立つ情報が満載だった

「Kindle自費出版ガイド」という電子書籍作成ノウハウ満載なミニコンテンツが興味深い件につられて購入して読んでみたが、必要なことが書いてあって僕にとっては費用対効果が高かったので満足。

レビューにはページ数に対して価格が高いか安いかという評価が多いようだが、そのコンテンツが幾らで消費されるべきものなのか?という観点で考えると興味深いかも。本書はブログの優良な1エントリぐらいの量だが、これが100円で消費されているわけですよね?ということはKindleで見れたほうが便利なブログのエントリはKDPでも買えるようにしておくとブログのAuthorも消費者もハッピーになれるwin-winなモデルになるのかなぁと。

例えばEmacsの設定みたいな設定系のやつとかquickstart系のエントリはKDPに持って行きやすいような気もする。Dive Into Python3なんかはそんな感じだよね。情報のポータビリティにお金を払うのか、コンテンツの内容にお金を払うのかはちょっと考える必要があるのかもしれないけど。

ProductName Dive Into Python 3 日本語版
Mark Pilgrim
/ ?円 ( 2012-10-26 )


例えば、はてブが一定以上ついて、それが継続的に続くようだったらKDPに移行するっていう出版モデルがあってもいいのかなぁと思ったりもする。それは、日経だかどこかみたいに2ページ目移行はログインが必要な感じのを真似して元エントリを削除してamazonへのリンクにしてもいいのかなぁと思う。そっちのほうがgoogle adsenseとかメルマガよりコンテンツの消費の仕方というか課金モデルとして健全な気がするしなぁ。

Alloyでつくる簡易RSSリーダー

Titanium Mobile iPhone/Androidアプリ開発入門の簡易RSSリーダーをAlloyで書きなおしてみた

alloy rssreader

CoffeeScrptで開発する方法については、ここを参照のこと。

軽くハマったのはviewかな。

views/index.xml

最初TabGroupにidを設定したら、$.index.openでエラーがでた。

結局$.indexってなんじゃろか?とドキュメントを読んだら解決した。

要するにViewのトップレベルには

  • Ti.UI.Window
  • Ti.UI.TabGroup
  • Ti.UI.iPad.SplitWindow

のいずれかが必要で、idが明示的に指定されてない場合には、そのファイル名がidとして利用される。

規約に従うことにしたらxmlはシンプルになった。

<Alloy>
    <TabGroup>
    </TabGroup>
</Alloy>

controllers/index.coffee

コントローラーは本の通りに。スタイルとかも全部コントローラーに書いちゃったのでindex.tssはいじってない。

createApplicationTabGroup =  ->
  tab1 = createRSSTab 'Developer Blog', 'http://developer.appcelerator.com/blog/feed'
  tab2 = createRSSTab 'Q&A', 'http://developer.appcelerator.com/questions/feed/newest'
  $.index.addTab tab1
  $.index.addTab tab2
  return

createRSSTab = (title, url) ->
  win = Ti.UI.createWindow
    title: title

  tab = Ti.UI.createTab
    title: title
    icon: 'KS_nav_views.png'
    window: win

  tableView = Ti.UI.createTableView {data:[]}
  win.add(tableView)

  win.addEventListener 'open', ->
    query = String.format "select * from rss where url = '%s'", url
    Ti.Yahoo.yql query, (res) -> 
      if res.success is false
        alert("Yahoo YQL error.")
        return
      res.data.item.forEach (item) ->
        tableView.appendRow
          title: item.title
          color: '#000'
          link: item.link
          hasChild: true
    return

  tableView.addEventListener 'click', (event) ->
    detailWin = Ti.UI.createWindow {title: event.rowData.title, backgroundColor: '#fff'}
    webView = Ti.UI.createWebView {url: event.rowData.link}
    detailWin.add(webView)
    tab.open(detailWin)
    return

  return tab

createApplicationTabGroup()

$.index.open()

ProductName Titanium Mobile iPhone/Androidアプリ開発入門―JavaScriptだけで作る
小澤 栄一
秀和システム / 2520円 ( 2012-02 )


Blogとは情報収集ツールであり自分のための反芻ツールでもある

zenbackの何がいいかというとSNSのボタンというより関連記事をまとめてくれることだ。

僕の場合は筆頭想定読者が自分なので、昔考えてエントリにしたことが関連記事で出てくると、思いがけず反芻することができたりして、そのおかげで当時よりも理解がすすんだり、もう一歩踏み込んだアイデアが浮かんだりするので重宝している。昨日再発見したこれなんかもエレベータで数階上がった感覚が得られた。

思考というか課題というのは螺旋を描きながら前進するものだろ思っているので、一周廻ったあたりでタイミングよく振り返るツールとしてzenbackの関連記事はいい機能だと思うんだがどうなんだろうか?

そしてblogは情報発信というよりは情報収集のためのアンテナとして優れているのだと思う(たぶん昔書いたような気もするが)その当時はコメントとかトラックバックでエントリ以上の質のレスポンスがあって、非常に勉強になったわけだが、いまはそれらはtwitterが担っているのだと思う。

というのは、ちょっと前に隠れフォロワー(twitterのアカウント持たずにtweetを補足するというアレ)に補足されるのが嫌になって鍵をかけたらレスポンスが激減していいことがなかったのでもとに戻したんだけど、その結果twitterはコメントツールの役割も担っているんだなぁ認識したので。

一方でfacebookは思考の幅を広げるには大して役にたたない(すくなくともblogのレスポンスとしては役に立ったことがない)。というか「いいね!」を押したからといって何がどうなるんだという。

そんな感じのことを考えながら澤の花を呑んでた。

Smashing Node.jsが気になる

気になっている本

ProductName Smashing Node.js: JavaScript Everywhere (Smashing Magazine Book Series)
Guillermo Rauch
Wiley / 3379円 ( 2012-09-11 )


「ウェブ分析論」を読んだ

web分析系はよくわからない三文字表記が多いので、それらを覚えるのに都合が良かった。内容も基礎的だけど丁寧に解説されていたので、わかりやすかった。

ウェブ分析では、サイトの目的・目標を「KGI(Key Goal Indicator)」と呼びます。ここで重要なのは目的を数値化することです

1353404795

CSF(Critical Success Factor)とはKGIに決定的な影響を及ぼす要因。これをさらに具体的な数値目標に落とすとKPI(Key Performance Indicator)になる。

talknoteで聞いたユーザータイムラインは本書で言うところのコンセプトダイアグラムと同じものかな。

統計の基礎知識

統計のあたりは流し読みで十分だった。

ウェブに関するデータで正規分布するものはほとんどない

と触れられていたが、正規分布がどういう分布か知っていればまぁそうだろうなと。それからP.90の時系列データを多項式近似するのは乱暴だなと思ったけど、入門者向けの説明だからいいのかな。逆にそのくらい粗い近似でいいというのが不思議な気もするがそういうもんなのかな。

サイトの課題発見

検索ワードには来訪者の「目的」や「期待」が表れる

ソーシャルメディア分析

検索エンジンからの流入分析じゃなくてソーシャルメディアの分析も面白いなと最近思うようになってきたので、facebookインサイトの説明は役に立った。

まぁ試行錯誤するタイプの分析は本読むよりは自分でやってみるに限るなとというか数をこなさないとダメだな。

すごいHaskellをたのしく学ぼう 121124@fuji

ポップでキッチュな表紙のあの本とは直接関係ありませんが、今週末に三島Haskell無名関数の会 第一回目があるので、興味があれば参加されると楽しいと思います。というより、そろそろ関数型プログラミングの勉強会を定期的に開催していければなぁと思います。

初学者の@ando_ando_andoも参加するということなので、快適なHaskellコーディング環境をつくるという話をしようと思っています。

とりあえず、タイトルと表紙だけつくってみました。

m_lambda

それから、世界観が大切だと思うのでそういうものもちゃんと考慮してあります。

天地創造(静岡東部版)

  • 1日目 sedがある中、神はエディタを作り、vi(光属性)とEmacs(闇属性)が出来た。
  • 6日目 神は栃木と群馬をつくり、λに似せた静岡をつくった。
  • 7日目 神は休んだ。

つまり我々はEmacsを信じHaskellを推進しなければならないのです。

C-sで検索をかけた時にC-x C-xで検索開始位置に戻れる(Emacs)

Emacs RocksのEpisode 01: From var to thisを見ていて、C-sすると自動的に検索開始時点の位置がマークされることを知った。

ということはC-x C-xで戻れるってことじゃないかと。

他にはexpand-regionってのが便利そうだったので、入れた(list-packagesで選択できる)。

五橋の本醸造

燗つけて飲んだ。

1351854465

名前の由来はあれだろうなぁと思いつつ探したらそうだった

一度は歩いてみたい。そして飲み歩いてみたい。

AlloyでのiPhoneアプリ開発にCoffeeScriptを使う

犬が早朝から吠えたので4時に叩き起こされたが、タイムラインを追いかけていたらAlloy with CoffeeScript のお誘いというこれは!というエントリがあがっていたので、早速誘われてみた。尚、jsとcoffeeは一緒のディレクトリに置いておくのが好みなので@k0sukeyのオリジナルなjmkに変更をくわえてあります。

ストップウォッチをつくる

Titanium Mobile iPhone/Androidアプリ開発入門のストップウォッチを参考にしました。

ProductName Titanium Mobile iPhone/Androidアプリ開発入門―JavaScriptだけで作る
小澤 栄一
秀和システム / 2520円 ( 2012-02 )


本書ではui.jsという1つのファイルで完結していますがAlloyのようなMVCフレームワークを使ったほうがコードの見通しは良くなると思います。

雛形をつくる

$ titanium create stopwatch # 対話でターゲットデバイスやapp-id設定
$ cd stopwatch
$ alloy new # alloyのひな形作成
$ alloy generate jmk

coffeeがコンパイルされるようにする

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){
});

alloyの開発

あとは普通に。

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

alloy_stopwatch

Let's Enjoy!