C言語ではじめる音のプログラミング

ひと通り読んだので、javascriptで何か作ってみたい。

macbookをクリーンインストールして娘に贈呈した

MBAに買い換えたらMacbook(2008 early@Lion)を娘にあげる約束をしていた。

今日は時間があったのでクリーンインストールしてから娘に贈ろうとしたら、バッテリーがイカれていたので、安いやつを探して発注しておいた。

クリーンインストールは簡単で、optionを押しながら起動してディスクユーティリティからHDDのデータを削除した後、再インストールをすればいいだけ。

最近とびだせどうぶつの森を手に入れてドット絵職人の道を歩きはじめたので、Pixenを入れてやったのと、ポケモングローバルリンクのブックマークを追加しておいてやった

あとはScratchとGimpを入れといてやらなきゃいけないなぁ。

AlloyでiPhoneのカメラを扱う

カメラで写真を取ってデータベースに格納するアプリを作ってみた。スクロールビューで画像が入れ替わるのがよくわからんがひと通りできた。

alloy camera

スキャフォールドはこことかここを参照。

controllers/index.coffee

カメラ用のボタンを押したら内蔵カメラを起動して、写真をファイルに保存したら、パスをデータベースに保存する。

pts = Alloy.Collections.photo

cameraButton = Ti.UI.createButton
  systemButton: Ti.UI.iPhone.SystemButton.CAMERA

$.win1.rightNavButton = cameraButton

cameraButton.addEventListener 'click', ->
  Ti.Media.showCamera
    success: (event) ->
      now = (new Date).getTime()
      file = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory,
              String.format("%d-%d", now, Math.floor(Math.random() * 1000)))
      file.write(event.media)
      photo = Alloy.createModel('photo', { path: file.nativePath })
      photo.save()
      Alloy.Collections.photo.add photo
      return
    mediaTypes:[Ti.Media.MEDIA_TYPE_PHOTO]

pts.fetch()

$.index.open()

models/photo.js

モデルの定義

exports.definition = {
  config: {
    "columns": {
      "path": "string"
    },
    "adapter": {
      "type": "sql",
      "collection_name": "photo"
    }
  }
}

views/index.xml

コレクションの定義をしておく

<Alloy>
    <Collection src="photo"/>
    <TabGroup>
        <Tab id="tab1" title="写真" icon="dark_book.png">
      <Window id="win1" title="写真">
            <ScrollView id="scroll" dataCollection="photo">
              <Require src="photo"/>
            </ScrollView>
      </Window>
        </Tab>
        <Tab id="tab2">
      <Window id="win2">
      </Window>
        </Tab>
    </TabGroup>
</Alloy>

views/photo.xml

個々の画像

<Alloy>
  <ImageView image="{path}" width="100%">
  </ImageView>
</Alloy>

AlloyのCollectionが見つからない

黒い本の写真アプリをAlloyで作っている。

app/models/photo.jsに

exports.definition = {
    config: {
        "columns": {
            "path": "text"
        },
        "adapter": {
            "type": "sql",
            "collection_name": "photo"
        }
    }
}

とモデルとコレクションを定義しておいて、index.jsで

cameraButton = Ti.UI.createButton
  systemButton: Ti.UI.iPhone.SystemButton.CAMERA

$.win1.rightNavButton = cameraButton

cameraButton.addEventListener 'click', ->
  Ti.Media.showCamera
    success: (event) ->
      now = (new Date).getTime()
      file = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory,
              String.format("%d-%d", now, Math.floor(Math.random() * 1000)))
      file.write(event.media)
      photo = Alloy.createModel('photo', { path: file.nativePath })
      photo.save()
      Alloy.Collections.photo.add photo
      return
    mediaTypes:[Ti.Media.MEDIA_TYPE_PHOTO]

で、写真の撮影は出来てセーブするときにAlloy.Collections.photo.addメソッドがない(というかAlloy.Collections.photoがundefined)というエラーに悩まされている。

130113 追記

index.xmlにCollectionタグを追加したり、なんかごちゃごちゃやってたらうまくいくようになった。エラーの原因は結局わかってない。

d3.jsでインタラクティブでよりよい分析体験を

年末、長野に遊びに行くのに本がないと不安なので勢いでd3.jsの電子書籍を購入して読んだ。内容は初歩の初歩でちょっと物足りなかったが、d3の世界に足を踏み入れるきっかけには十分だった。

1357684337

個人的によく使うのはggplot2(R)とSpotfireの2つ。

基本的に画像を描くためだけのライブラリを選択するのはあかんやろと考えているので統計処理とそれを見やすい形で表示するRは便利だと思っている。Spotfireは、デモを見れば分かる通り、フィルタリングがインタラクティブなのと、ビジュアライズ間の値の対応がとれているといったあたりが動的だ。ただし、散布図行列のような一つのウィンドウに複数の点を対応させるようなプロットは描けないのが不満だったりする。フィルタリングは右側のスライダーなんかでまとめて操作するようになっているのでデスクトップでマウスで操作するのが前提のデザインだったりする。

これに対してd3はより上の2つよりもさらにインタラクティブ性が高いビジュアライゼーションが可能となっているのだと思う。タブレットなんかで使えば触れるグラフとなってよりよい分析体験を与えるんだろうなと。

例えば、Rを勉強すれば必ず目にするirisの散布図行列なんかは選択すると対応する部分がハイライトされる。

motion chartもわかりやすい。市場予測とかプロジェクトのプロパティーの変遷なんかをこれで動かせるようにしておくと動きが上手くとらえられてイイかもしれない。

動かせるForce-Diarected Graphとかこれなんかもヨサゲ。

クラスターを円形に表現するレイアウトも素敵

mbostock’s blocks見てて飽きないわ。

職場で導入しようと思ったら必須ブラウザのIE8では動かないということに気づいて、ガッカリ感が半端無かった。

Graph-indexing wavelet tree (gWT)のグラフ検索が超速い

高速文字列解析の流れで、タイミングよく統数研チャンネルの資料が公開されていて、最後のほうのスライド(65枚目)にグラフの類似度検索の実装としてgwtが紹介されていたので遊んでみた。

データベースは、ChEMBLから取ってきた。なぜpubchemじゃないかというと面倒なので略。

入力のフォーマットがgSpanとかGASTONと一緒だったので、昔書いたのを流用しようとしたんだが、昔書いたpythonスクリプトはどうもOBMolAtomIterあたりがバグっていて動かないようだ(OBMolBondIterも動かなかった。)

File "sdf2gsp", line 17, in convert
  for i,atom in enumerate(ob.OBMolAtomIter(mol)): 
File "/usr/local/Cellar/python/2.7.3/lib/python2.7/site-packages/openbabel.py", line 4499, in __init__
  if not self.iter.__bool__():
AttributeError: '_OBMolAtomIter' object has no attribute '__bool__'

しょうがないのでiterateしない版で書き換えた。

#!/usr/bin/env python
import sys
import pybel
import openbabel as ob

def convert(sdf):
    mols = pybel.readfile('sdf',sdf)
    for n, mol in enumerate(mols, 1):
        print "t # %d" % n
        for i in range(mol.OBMol.NumAtoms()):
            print "v %d %d " % (i+1, mol.OBMol.GetAtom(i+1).GetAtomicNum())
        for j in range(mol.OBMol.NumBonds()):
            b = mol.OBMol.GetBond(j)
            print "e %d %d %d" % (b.GetBeginAtomIdx(),
                                  b.GetEndAtomIdx(),
                                  b.GetBondOrder())

if __name__ == "__main__":
    sdffile = sys.argv[1]
    convert(sdffile)

ちなみにこの形式に名前ついているんだろうか?babelとかでサポートされないと使い勝手が悪いんだけどなぁ。

これで、ChEMBLの137万件をgspにコンバートしてみたけど遅すぎるので後でHaskellで書きなおす。sdf単に舐めるだけだからOBMolに変換する必要もないし。

できたchembl_14.gspからindexファイルをつくる。600M(137万化合物)で10分ぐらいかかった@MBA。

./gwt-build -iteration 2 chembl_14.gsp chembl14

検索はみんな大好きImatinibをgspにしたものを使った。

$ ./gwt-search -kthreshold 0.8 chembl14 query.gsp
reading index file:chembl14
end reading
start building rank dictionary
end building rank dictionary
start transferring labels
end transferring labels
id:0 1080597:0.809449 712949:0.838758 413038:0.847826 \
394513:0.826087 391369:0.819028 179393:0.815124 \
175534:0.899647 48523:0.804348 47164:1.000000 16405:0.802727 
cpu time (sec):0.712119
mean cpu time (sec):0.712119

と5,6秒程度で計算終了。ウリィィィィって言いたくなるほど圧倒的に速い。

bayonも感激したけど、それ以上にgwtはすごいなぁと思った。

電子書籍を無名でも100万部売る方法

結論は口コミをうまく使えという事だろうか。

ProductName 電子書籍を無名でも100万部売る方法
ジョン ロック
東洋経済新報社 / 1260円 ( 2012-12-07 )


口コミが生まれやすくなるような印象的なシーンをちりばめろとか、買い手にレビュワーになってもらうためにメールを書けとかそんな感じ。

ゴールから考えるというかマーケット・インの思考的にはそうなるんだろうが、目的が100万部得る方法であっていい本を書く方法じゃないから、やり方がちょっと極端かなと思う。

極論としてはbooklapから適当に選んできてそれに合うようなテーマを探してきてちょこっと書いたら、はてブで話題になりそうなキャッチーなタイトル付けて、twitterで軽く炎上気味なプロモーションやれみたいな印象を持ったが、よく考えたらアルアルな感じか。

とはいえ、はてブでブックマークがつくのは自己肯定感位しか得られなくてお金にならんけど、ブックマーク稼ぐような内容をKindleで読めるようにするっていうのは一種の投げ銭システムとしてはいいやり方ではないかと考えているので、本書のようなやり方もアリだなとは思う。

OS10.8.2にopenbabel2.3.2をインストール

2.3.1のままだったので、昔のログを見ながらインストール。

が、古いswig(/usr/binにあるやつ)を見ていてエラーになるので、SWIGの場所をcmakeに知らせたいのだがオプションがわからない。

調べたトコロ

cmake -L

で一覧が出るらしい。必要なのはSWIG_EXECUTABLEなので

cmake ../openbabel-2.3.1 -DPYTHON_BINDINGS=ON \
-DPYTHON_LIBRARY=/usr/local/lib/libpython2.7.dylib\
-DPYTHON_EXECUTABLE=/usr/local/bin/python \
-DEIGEN2_INCLUDE_DIR=/Users/kzfm/openbabel/eigen-eigen-2.0.17 \
-DRUN_SWIG=ON \
-DSWIG_EXECUTABLE=/usr/loca/bin/swig

でOK

Titanium Studio3.0が動かない場合はPythonのpathとsdkのバージョンを確認する

ドはまっていたTitanium Studioがやっと動いた。

Titanium Studioの Help -> Titanium Studio -> View LogFileを見てみると

File "osx/3.0.0.v20121127170203/iphone/provisioner.py", line 10, in <module>
    from OpenSSL import crypto
ImportError: No module named OpenSSL

って出ていたのでprovisioner.pyの先頭行が

#!/usr/bin/env python

で、brew経由の/usr/local/bin/pythonを見ていてそっちにOpenSSLがインストールされていないのが原因だった。早速インストールしようとするとgccがないって怒られた。

$ sudo pip install pyOpenSSL
gcc-4.2: error trying to exec '/usr/bin/i686-apple-darwin11-gcc-4.2.1': execvp: No such file or directory

これはsof見て解決。

これでmobileprovisionを認識するようになったけれど、今度は

Available developer names:
[ERROR] :  Unable to find an iOS Developer Certificate for "NAME (NUMBER)"

ってのが出るようになったんだけど、これはTISTUD-2969にあるようにバグらしいのでバージョンをあげればいい。

$ titanium sdk install --branch 3_0_x --default

で最新のバージョンを入れた(3.0.0.v20121127170203 -> 3.0.1.v20130108000206)。Titanium Studioでバージョンを切り替える場合はtiapp.xmlをいじる。

追記13.01.09 titanium コマンドで実機に送る

実機に送る場合

titanium build -p iphone -T device -P [UUID] -f -V [NAME]

Shimehariというwaf

pypiのパッケージチェックをしていたらShimehariというwafを見つけてもしや!!と思ってクリックしたら予想通り〆張鶴インスパイアだった。

もうちょい調べたらFlaskとDjangoの中間あたりの規模を目指しているらしい

それからDocに使われているsphinx-bootstrapっていうテーマがいいなと思った。