2014年11月18日火曜日

Juliaで外部のプログラムを動かすときのメモ

Juliaで外部のプログラムを動かすときのメモ。
PythonではPopenとかを使ってたので、Juliaでもそれと同じようなものがあるかなーと思ったけど、なかなか見つからなかった。

公式マニュアルはこれ。
http://julia.readthedocs.org/en/latest/manual/running-external-programs/

外部プログラムを起動して、そこから標準入力を扱いたいときは、こっちが参考になった。http://blog.leahhanson.us/running-shell-commands-from-julia.html

概要は、
プログラムが起動して、
write()で書き込み。書き込んだらその出力がsoにたまっていくので、
readall()でその出力を得る。
(so,si,pr) = readandwrite(`yourprogram`)
write(si, "command1")
write(si, "command2")
close(si)
output = readall(so)


これも一応メモ。
http://julialang.org/blog/2013/04/put-this-in-your-pipe/


2014年11月11日火曜日

Novel Class

アメリカ滞在の後半はNovel Classを取った。文字通り小説の授業だ。

半期に3つの小説を読んだ。1つはベトナム戦争についての話。もうひとつはThe Catcher In The Rye。最後にSidartha。Sidarthaはヘルマン・ヘッセの小説。どれも一字一句辞書で調べながらじっくり読んだんで、ものすごく思い出に残っている。

ベトナム戦争についての話はあんまり覚えてない。ただ、そのなかの参考資料にBreaking Awayという映画があった気がする。本当にこの小説の授業で出会ったものかは定かではないえけど、ものすごく感傷にひたったのを覚えている。Breaking Awayは青春を舞台にしたもので4人の登場人物がそれぞれ精一杯行きている。あーおれはこんなところで独りでなにをやっているんだろう。と心の通った友達とのチームプレイがいかに大事かが身に染みたのを覚えている。

2つ目のThe Catcher In the Ryeは有名な小説だが、村上春樹の日本語訳はまったくおすすめしない。帰国後日本語訳を手にとって読んでみたけど、まったく感情移入することが出来んかった。こっちはあまり前向きな話ではない。最後にDon't tell anybody anything. You will miss somebody.というのがすごく思い出に残っている。他にもI have to admit itとかThat kills me.とかものすごく当時のこころに響くセリフばかりだった。

Sidarthaは難しい本が読めなかったので、優しい英訳の本を読んだ。Sidarthaが悟りをひらくまでの苦悩が思い出に残っているが、詳しい内容は忘れたw


それぞれの本を読んだ後の課題は自由。どんな方法でも読んだ感想を表現すればよい。模型をつくった人もいれば、冊子を作った人もいた。日本のいわゆる読書感想文みたいに決まった書式はない。自分の得意な方法で表現すればよかった。いま日本にこんな教育をするところはあるんかな?


2014年11月6日木曜日

Julia Array操作の基本をメモ。

Pythonでやっていたlistの操作にすっかり慣れてしまったけど、JuliaのArrayではどうやるか確かめる。
Julia0.3で試して動いたものを掲載。

配列の生成

a = [i for i in 1:10]     #1から10を要素に持つ配列生成
a = [1:10]                #同上
b = reshape([1:9], (3,3)) #3x3の2次元配列。
b = [1 2 3; 4 5 6; 7 8 9] #3x3の2次元配列。上とは行、列が逆(転置の関係)

要素数

length(a)

要素アクセス

a[1]
a[1:end]   #要素1から最後まで
a[2:3:8] #要素2から8を3個おきに

追加,挿入

push!(a, 13)         #要素と同じ型追加
append!(a, [1,2,3])  #末尾に[1,2,3]を追加
prepend!(a, [1,2,3]) #先頭に[1,2,3]を追加
insert!(a, 3, 15)    #3番目に15を挿入する。(要素数は増える)
vcat(a, [11,12,13])  #aに末尾に[11,12,13]を追加(aは非破壊になる)
hcat(b, [10,11,12])  #bに列を追加
vcat(b, [10,11,12]') #bに行を追加('は転置)
要素数があらかじめわかっているなら、始めに配列を確保して代入したほうが速いっぽい。

置換

a[1] = 15
a[1:4] = [4,4,4,4]
#a[2:5]を削除して[0,0,0]を挿入。戻り値は削除した元のaの[2:5]の値。
splice!(a, 2:5, [0,0,0]) 

削除

shift!(a)  #最初の要素を削除
pop!(a)    #最後の要素を削除

検索

3 in a
findfirst(a, 4) #はじめに4が出る要素番号、なければ0を返す
findin(a, 4)    #4の存在する要素数をArrayに入れて返す)

Lytroが日本に上陸してアクセスが増えたのでLytroのすごいと思うところをのべる。

Lytroが日本にやってくるらしい。
http://dc.watch.impress.co.jp/docs/news/20141105_674603.html

なんか記事のアクセスがすごい。
これは良い機会とばかりにLytroがすごいと思うところを挙げる。1つは文化的内容。もう一つは技術的内容。

1. アナログとデジタルの融合が進んでいる。

上の記事にレンズの断面図がのってある。35mm判換算で30-250でFナンバーは2.0らしい。最近のカメラと比べると広角側が少し足りないと思われるかもしれない。注目すべきはレンズのスペックが高いにも関わらず、枚数12枚で非球面レンズを使っていないことだ。
http://dc.watch.impress.co.jp/img/dcw/docs/674/603/html/17.jpg.html

 確かIllumの発表の時に言及しとったと思うけど、レンズの収差もデジタルで補正できるような最適設定にしているらしい。収差のデジタル補正と言えば富士フイルムとかキヤノンにそういう機能(デコンボリューション)がついていたと思うけど、こういう技術はどちらかというと、まだレンズの最適化で取れない部分をデジタルで補正しているイメージ。しかし、Lytroの場合発想が逆で、デジタルで補正できるところまでレンズの収差を出しているようだ。Ngさんの博士論文にもそういう研究はあったし。もちろん日本の企業でも「倍率色収差」とか「歪曲収差」とかは、デジタルで補正できるようにセンサーとレンズの最適化を行っとるやろうけど、Lytroの最適化は1つ先の次元に行っとる気がする。


2. 技術をもって本気で新しい表現を模索している

Lytroは新しい表現を探している。ホームページのムービーでも言っとるけど、Light Fieldカメラで一瞬を切り取るとどういう表現ができるか模索している。最初に出した製品はセンサーも小さく使い勝手も悪かったが、今回のIllumはクリエイターをターゲットにしている。Light Fieldカメラが生き残るかどうかは、新しい表現方法が見つかるかどうかにかかっているといってもいい気がする。ボケ味を追求する日本のメーカーとは次元が違う。(もちろんどっちがいいとかいう話は抜きにして)
残念ながらぼくにはどういう表現がよいのか全くわかりません。

やっぱりSilicon Valleyの企業は日本とは考え方が違う。
ただLytroのIllumは使い勝手が悪いらしい。やっぱり手に馴染む機器の作り込みには時間がかかるようだ。


2014年11月3日月曜日

Juliaで固定配列

JuliaでArrayを使えばベクトルや行列計算できるけど、2とか3次元の点を表すのに可変長の配列を使うのはどうも無駄が多い気がする。自前で
immutable Vec
    x::Float64
    y::Float64
    z::Float64
end
とかやったけど、演算子とかを定義するのが面倒。

そんな問題を解決してくれるのがImuutableArrays
Julia0.3にはすでに採用されているので、
Using ImuutableArrays
v3 = Vector3{Float64}(1, 2, 3)
v2 = Vector2{Float64}(4, 5)

と書ける。デフォルトでは読み込んだ時に4次元まで作ってくれて、演算子の定義とかもやってくれている。(これがメタプログラミングの力か…)
しかも上で自分で定義したのより速い…

行列は
typealias Mat3d Matrix3x3{Float64}
とすれば使える。






2014年11月2日日曜日

IPython notebook でプレゼンテーション用スライドを作る

プレゼンテーションを作るときに困ることがある。

  1. 手軽に書きたい
  2. Texで数式
  3. 図を入れたい。
  4. プログラムを入れたい。
  5. かっこ良くしたい。
  6. PDFにしたい。
  7. 個人で使う分はフリーで済ませたい。
ざっと思いついたままに書くとこうなる。
いろいろ探していたら、最近IPython notebookからスライドが作成できることが判明した!
しかもreveal.jsを使っているのでいかにもギークっぽいかっこいいスライドが作れる。
こんな感じのやつ→http://lab.hakim.se/reveal-js/#/

まえからreveal.jsは使ってみたかったけど、jsとかHTMLとかよく分からんし、Web上で使えるやつもあったけど、PDFにするのに有料会員にならんといけんとかで挫折した。


スライドの作り方

1. IPython Notebookをインストールする。

IPython NotebookはAnacondaをつかってインストールするのがおすすめ。一式全部はいるし、アップデートも
conda update anaconda
で完了する。

2. 新しいNotebookを開いて設定する。

New Notebookを作成したら以下の図のところをSlideに設定する。

右のタブはSlide、Sub-Slideとか選べる。これはreveal.jsでいう横にスライドか、縦にスライドかを指定できる。いろいろ試してみて。

3. スライドへ変換する

IPython Notebookの編集が終わったら、NotebookからSlideへの変換をする。スライドの作成はここにあるとおりのコマンドを実行するとできる。--postでHTMLサーバーを指定する必要があるらしい。

ipython nbconvert notebook.ipynb --to slides --post serve

IPythonのバージョンが古いと文字がものすごく小さいので最新版にアップデートするのをおすすめ。
※Chromeで開くと数式がレンダリングされなかったのでmathjaxのプラグインをいれた。
ちなみにPDFにするときは
ipython nbconvert notebook.ipynb --to latex --post pdf


問題は記録用にPDFとかHTMLにしたらちょっとダサくなってしまうことか。
まぁよい。