14012013 music javascript
ひと通り読んだので、javascriptで何か作ってみたい。
14012013 music javascript
ひと通り読んだので、javascriptで何か作ってみたい。
13012013 life
MBAに買い換えたらMacbook(2008 early@Lion)を娘にあげる約束をしていた。
今日は時間があったのでクリーンインストールしてから娘に贈ろうとしたら、バッテリーがイカれていたので、安いやつを探して発注しておいた。
クリーンインストールは簡単で、optionを押しながら起動してディスクユーティリティからHDDのデータを削除した後、再インストールをすればいいだけ。
最近とびだせどうぶつの森を手に入れてドット絵職人の道を歩きはじめたので、Pixenを入れてやったのと、ポケモングローバルリンクのブックマークを追加しておいてやった
あとはScratchとGimpを入れといてやらなきゃいけないなぁ。
13012013 javascript Ti
カメラで写真を取ってデータベースに格納するアプリを作ってみた。スクロールビューで画像が入れ替わるのがよくわからんがひと通りできた。
カメラ用のボタンを押したら内蔵カメラを起動して、写真をファイルに保存したら、パスをデータベースに保存する。
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()
モデルの定義
exports.definition = { config: { "columns": { "path": "string" }, "adapter": { "type": "sql", "collection_name": "photo" } } }
コレクションの定義をしておく
<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>
個々の画像
<Alloy> <ImageView image="{path}" width="100%"> </ImageView> </Alloy>
13012013 javascript coffeescript Ti
黒い本の写真アプリを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)というエラーに悩まされている。
index.xmlにCollectionタグを追加したり、なんかごちゃごちゃやってたらうまくいくようになった。エラーの原因は結局わかってない。
11012013 javascript
年末、長野に遊びに行くのに本がないと不安なので勢いでd3.jsの電子書籍を購入して読んだ。内容は初歩の初歩でちょっと物足りなかったが、d3の世界に足を踏み入れるきっかけには十分だった。
個人的によく使うのはggplot2(R)とSpotfireの2つ。
基本的に画像を描くためだけのライブラリを選択するのはあかんやろと考えているので統計処理とそれを見やすい形で表示するRは便利だと思っている。Spotfireは、デモを見れば分かる通り、フィルタリングがインタラクティブなのと、ビジュアライズ間の値の対応がとれているといったあたりが動的だ。ただし、散布図行列のような一つのウィンドウに複数の点を対応させるようなプロットは描けないのが不満だったりする。フィルタリングは右側のスライダーなんかでまとめて操作するようになっているのでデスクトップでマウスで操作するのが前提のデザインだったりする。
これに対してd3はより上の2つよりもさらにインタラクティブ性が高いビジュアライゼーションが可能となっているのだと思う。タブレットなんかで使えば触れるグラフとなってよりよい分析体験を与えるんだろうなと。
例えば、Rを勉強すれば必ず目にするirisの散布図行列なんかは選択すると対応する部分がハイライトされる。
motion chartもわかりやすい。市場予測とかプロジェクトのプロパティーの変遷なんかをこれで動かせるようにしておくと動きが上手くとらえられてイイかもしれない。
動かせるForce-Diarected Graphとかこれなんかもヨサゲ。
クラスターを円形に表現するレイアウトも素敵
mbostock’s blocks見てて飽きないわ。
職場で導入しようと思ったら必須ブラウザのIE8では動かないということに気づいて、ガッカリ感が半端無かった。
11012013 chemoinformatics Python openbabel
高速文字列解析の流れで、タイミングよく統数研チャンネルの資料が公開されていて、最後のほうのスライド(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秒程度で計算終了。ウリィィィィって言いたくなるほど圧倒的に速い。
10012013 life
結論は口コミをうまく使えという事だろうか。
口コミが生まれやすくなるような印象的なシーンをちりばめろとか、買い手にレビュワーになってもらうためにメールを書けとかそんな感じ。
ゴールから考えるというかマーケット・インの思考的にはそうなるんだろうが、目的が100万部得る方法であっていい本を書く方法じゃないから、やり方がちょっと極端かなと思う。
極論としてはbooklapから適当に選んできてそれに合うようなテーマを探してきてちょこっと書いたら、はてブで話題になりそうなキャッチーなタイトル付けて、twitterで軽く炎上気味なプロモーションやれみたいな印象を持ったが、よく考えたらアルアルな感じか。
とはいえ、はてブでブックマークがつくのは自己肯定感位しか得られなくてお金にならんけど、ブックマーク稼ぐような内容をKindleで読めるようにするっていうのは一種の投げ銭システムとしてはいいやり方ではないかと考えているので、本書のようなやり方もアリだなとは思う。
10012013 chemoinformatics Python openbabel
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
09012013 Ti
ドはまっていた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をいじる。
実機に送る場合
titanium build -p iphone -T device -P [UUID] -f -V [NAME]
09012013 Python
pypiのパッケージチェックをしていたらShimehariというwafを見つけてもしや!!と思ってクリックしたら予想通り〆張鶴インスパイアだった。
もうちょい調べたらFlaskとDjangoの中間あたりの規模を目指しているらしい
それからDocに使われているsphinx-bootstrapっていうテーマがいいなと思った。