jQueryMobileのListviewでテキストを折り返す

ググるとcssを編集するパターンが多いような気がするが、Google Ajax APIを使っているのでどうしたもんかと。

$list.find('.ui-li, .ui-btn-text, a.ui-link-inherit').css('white-space', 'normal');

参考

ProductName jQueryクックブック
jQuery Community Experts
オライリージャパン / 3780円 ( 2010-08-18 )


さくっと上越高田まで

親戚が手術したのでお見舞いに高田まで5時間の一人旅。

高田はなかなか趣のある街だったし、桜も綺麗なそうなので来年は家族で遊びに行きたいと思った。

到着時刻が遅かったので狙ってたとこは閉まっていて唯一開いていた雁木BAR ZAiGOで遅すぎる夕食。

1335701402

次の日は病院にお見舞い。妙高は雪山だった。

1335701404

帰りは八ヶ岳で蕎麦を食べたけど、まぁまぁだった。

1335701405

丸高中華そば

三ノ宮の駅から北の方に歩いて10分くらい。

1335700982

和歌山ラーメンか。

1335700984

こってりしてるけど、それほどしょっぱくないので結構いける。

富士市の人口推移

ちょっと時系列解析を触ってみたかったのと神戸に移動するのに時間があったので、富士の人口推移をプロットしてみることにした。

どれどれと月別人口の推移にアクセスしたらあーエクセルかよ、、、。この表管理している人は、綺麗な表をつくるところが目的で、本来の目的である分析のためのデータだってことをすっかり忘れてるよなぁと思いつつ呪いの言葉を吐きながらコピペしてデータを作りなおした。(普段はpyEcelerator使ってるのでコピペなんてやんない。)

ところで、統計情報のページってデータのせるだけで、プロットしたり分析サマリーのせたりしないのね。不思議だ。

できたcsvはgoogle spreadsheetに保存しておいたので好きに使ってください。

プロット

2008年11月から旧富士川町の人口が増えているので合併時の人数を除いたデータでプロットしている。本来は2008年10月までの富士川町の人口推移を加えたほうがいいんだろうけど、データが見つからなかった。

fpop <- read.csv('fuji_pop.csv')
fpop.ts <- ts(fpop$norm_pop, start=1967, frequency=12)
plot(fpop.ts)

pop

単に絶対数の比較をするだけでは、日本の人口変動の影響を排除できないのでノーマライズしてやる。日本の人口データはe-statの1番を使ったが、H12までのデータしかないので、総務省の2-1で補ったが、2010までしかなかった。それから日本の人口は月毎ではなくて年毎のデータを使っているのでギザギザになってる。

fpopr.ts <- ts(fpop$np_jp, start=1967, frequency=12)
plot(fpopr.ts)

pop

まぁ、頭打ちから現象に転じてるのはほぼ確実でしょうかなぁ。僕はピュアな富士市民ではないのでイベントとグラフの変動を結びつけて解釈できないのが残念。

あとは人口構成比と結びつけてどのくらいの速さで人口が減少していくかとか、(老人世代が増えることで)活力が失われていくかとかそっちのほうが気になる。市でもそういう分析やってるんだろうか?やっているんだったら分析技法の参考にしたいのでみてみたいなぁ。

それから図書館ももっとRの蔵書増やしたほうがいいと思うよ

ナウなヤングのnow.js

now.js楽ちんですね。

twitter-streamとnow.jsを使ってリアルタイムにtweetを拾ってブラウザに表示したくなったのでやってみた。コード書いてる時に丁度スケットダンスが放映されていたたみたいで、twitterのトレンドに表示されてたのでこれを拾ってみた。

ちなみにジャンプは毎週読んでるけどスケットダンスはほとんど見ないのでついていけてませんな。

twst

スケルトン作成

とりあえずいつものようにコマンドを打って、スケルトンを作成

express twnow
cd twnow

package.jsonを修正して

{
    "name": "application-name"
  , "version": "0.0.1"
  , "private": true
  , "dependencies": {
      "express": "2.5.8"
    , "jade": ">= 0.25.0"
    , "ntwitter": ">= 0.3.0"
    , "now": ">= 0.8.1"
  }
}

依存モジュールをインストールする

npm install -d

コード

あとはコードを描く

app.coffee

twitter = require("ntwitter")
express = require("express")
routes = require("./routes")
nowjs = require("now")

twit = new twitter(
  consumer_key: "####"
  consumer_secret: "####"
  access_token_key: "####"
  access_token_secret: "###"
)

app = module.exports = express.createServer()
app.configure ->
  app.set "views", __dirname + "/views"
  app.set "view engine", "jade"
  app.use express.bodyParser()
  app.use express.methodOverride()
  app.use express.cookieParser()
  app.use express.session(secret: "tweetandsweet")
  app.use app.router
  app.use express.static(__dirname + "/public")

app.configure "development", ->
  app.use express.errorHandler(
    dumpExceptions: true
    showStack: true
  )

app.configure "production", ->
  app.use express.errorHandler()

everyone = nowjs.initialize(app)

app.get "/", (req, res) ->
  console.log req.session.user_profile
  res.render "index",
    title: "twitter streaming and now.js"

twit.stream(
  'statuses/filter'
  {track:['#sketdance']}
  (stream) ->
    stream.on 'data', (data) ->
      everyone.now.receiveMessage data
      console.log data
)

app.listen 3000
console.log(
  "Express server listening on port %d in %s mode"
  app.address().port
  app.settings.env
)

style.css

body {
  padding: 50px;
  font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
}

a {
  color: #00B7FF;
}

li.tweet {
  list-style-type:none;
  width: 500px;
}

img.tweet {
  float: left;
  padding-right: 20px;
}

hr {
  width: 500px;
  clear: left;
  border: 0;
  height: 1px;
  background-image: -webkit-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0));
  background-image:    -moz-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0));
  background-image:     -ms-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0));
  background-image:      -o-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0));
}

layout.jade

!!!
html
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
    script(type="text/javascript", src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js")
    script(src="/nowjs/now.js")
  body!= body

index.jade

h1= title
p sample apps
ul#messages
script
  $(document).ready(function() {
    now.receiveMessage = function(data) {
      $("#messages").prepend(
   '<li class="tweet"><img class="tweet" src=\"' + data.user.profile_image_url +'\">'+ data.text + '<hr></li>');
    }
  });

now.jsは抽象度が上がりすぎてて、裏で何が行われているかよく理解できないんだが、使うぶんには簡単ですね。IE7対策をしなくてもとりあえず動くので、それもお気に入りポイント(企業のブラウザはIEでしかも古いからねー)

ProductName 徹底解説 HTML5 APIガイドブック コミュニケーション系API編
小松 健作
秀和システム / 2730円 ( 2010-12 )


IDEA HACKS! 2.0

本書で一番刺さったのは明るい標準レンズのカメラを持ち歩くことを推奨していることであるが、

カメラで写真を撮るということは、新鮮な目で風景を見直すきっかけになる

いう理由からである。強制的に構図を捉え直すのはカラーバスとかでもいいのかもしれないが、見える範囲という制約の中で調和を考えるという遊びは面白いかもと思った。そういえばこれと似たようなことかもしれない。

ProductName IDEA HACKS!2.0
小山 龍介
東洋経済新報社 / 1575円 ( 2011-12-09 )


セレンディピティに必要なもの

  • action
  • awareness
  • acceptance

U理論

  • センシング
  • プレゼンシング
  • リアライジング

その他

  • コンテキストの重要性
  • 仮説を早く立てる
  • できるだけ早く失敗する
  • 議事録ドリブン会議

最後の議事録ドリブンの会議はここ数年良く使っている。

DubstepとDrumstepの違い

今日聴いてたHospital Podcast 172のNetsky – Come Aliveのところで、

これはダブステップじゃなくてドラムステップだぜ。BPMはドラムンベースの半分だしな

と言っていて、やっと違いを理解した。確かにAmitとRoxyはヤバイすね。それからDrumstepはつなげやすいのでよいですね。

なにが言いたいかというと、logisticsを買うとイイよ!と。

ProductName FEAR NOT (NHS209CD)
LOGISTICS
HOSPITAL RECORDS / 1989円 ( 2012-05-16 )


富士市の人口密度

普段は仮想の空間(ケミカルスペース)とか多変量の解析ばかりしていて、リアルな地理情報を扱うようなエリアマーケティング的なところにはタッチしたことはなかったんだが、フジブログにインスパイアされてGISにも手を出し始めた。

やっぱ身近な話題は面白いね。データは政府統計のH12年国勢調査(小地域)をつかった。

library(maptools)
library(RColorBrewer)
library(classInt)
f <- readShapePoly("h12ka22210.shp")
pop <- f$JINKO / f$AREA * 1000
colors <- brewer.pal(9, "YlOrRd")
brks<-classIntervals(pop, n=10, style="quantile")
brks<- brks$brks
plot(f, col=colors[findInterval(pop, brks,all.inside=TRUE)], axes=F)

密度はf$JINKO / f$AREA * 1000で計算しているので単位面積あたりの人口ということになりますね。フジブログでは単純に人数をカウントしてるだけですが、実際には地域の何%が流出入したかをかんがえるべきかなと思います(予算配分的には人数でカウントするのが好ましいのかもしれないが)。

fuji pop

既にデータは国が出してんだからこういうのを小学校とか中学校のカリキュラムに取り入れれば、算数、地理、歴史の教育になっていいと思うんだけどなぁ。Rもオープンソースだしね。

ビジョナリー・カンパニー2を読んだ

古典の部類

このバスでどこに行くべきかは分からない。しかし、分かっていることもある。適切な人がバスに乗り、適切な人がそれぞれふさわしい席につき、不適切な人がバスから降りれば、素晴らしい場所に行く方法を決められるはずだ

日本の難しさは、一度乗ったバスからは簡単には降ろせないということですな。

ProductName ビジョナリー・カンパニー 2 - 飛躍の法則
ジェームズ・C. コリンズ
日経BP社 / 2310円 ( 2001-12-18 )


本書は、偉大な企業になるためにはどういう資質が必要かという観点で書いてあるが、内容は偉大な組織、偉大な個人に使えそうな考え方であるので、そういう読み方をしても面白い。

rpy2+ggplot2

なぜグラフを描くのかと問われれば要約統計量を見やすい形で表現したいからであり、ヒトの目という不完全なデバイスを通してデータを認識するためにはグラフとよばれる表現手段を介したほうが効率が良いからである。

と考えるならば、分析のためにグラフを描くという行為は統計解析と切り離せないものであり、画像を描くためだけのライブラリを選択することはあまりよろしいことではないと思う。

そして望ましくは、適切に前処理されたマトリックスから望むグラフが作られるべきであり、グラフを描くためにデータを(ハッシュなんかに)加工するというのはあまりいいやり方とは言えないんじゃないかなぁと思っている。

これが、Rでグラフを描く大きな理由。データの前処理はRでやることはほとんどなくて、大体はperl,pythonを使うので、rpy2は重宝する。

import rpy2.robjects.lib.ggplot2 as ggplot2
from rpy2.robjects import r
from rpy2.robjects.packages import importr
base = importr('base')

datasets = importr('datasets')
mtcars = datasets.mtcars

pp = ggplot2.ggplot(mtcars) + \
     ggplot2.aes_string(x='wt', y='mpg', col='factor(cyl)') + \
     ggplot2.geom_point() + \
     ggplot2.geom_smooth(ggplot2.aes_string(group='cyl'), method='lm')

#pp.plot()
r['ggsave'](file="mypng.png", plot=pp)
#r['dev.off']()

これで、重量(x)と燃費(y)のプロットに対して、気筒毎に回帰直線と信頼区間を描くことができる。

ggplot2

分析手法をテンプレート化して自動的にレポートを出力したい時にはプログラミングできる手段があるといいのでrpy2は良いライブラリだと思う。

ProductName グラフィックスのためのRプログラミング
H. ウィッカム
丸善出版 / 4200円 ( 2012-02-29 )