#うへぇ、行列の計算させられる…
って時にjuliaだとさくっと書けます。
行列以外もいろいろ得意なんですが、まだそこまで使い込んでいないし、実は私自身数学が苦手なので、よくわかんないです。
使い方は数学好きの方におまかせします。
##こんな方にはjuliaをおすすめします。
- なんか計算っぽいことしないとならなくなった
- 本当はしたくない。さっさと終わらせたい
- 早く終わらせたいけど、計算のたびにコンパイルとかしたくない
- ライブラリとかリンクとかめんどくさい
- エクセレントに書きたい
- コマンドラインが好き
- 新しいものが好き
- 人と違うものが好き
- 女の子っぽい名前が好き
- 新言語投入で会社を困らせたい
というわけで上記に当てはまった私はjuliaを使うことにしました。
##CentOS向けの情報が少ない
そもそもjuliaは主要なOSに対応しています。
- Windows → インストーラがあります。
- Mac → インストーラがあります。
- Linux(Ubuntu)→ apt-get でいけたと思います。
他のLinux用にも一応バイナリはあるようなのですが、OSが新しすぎると動かないとの情報もあり、ソースからコンパイルすることにしました。
コンパイルとか面倒くさいですが、最初の1回だけなので我慢します。
epelでいけるとの情報もありましたが、epelを有効にしてyumってみても見つかりませんでした。
juliaは日本語の情報が少ないです。
ユーザが多いはずのRedHat系ディストリビュージョンへのインストール情報も少ないです。
ありがちな名前なので英語での検索も面倒です。
#CentOS7へのインストール
julia公式サイト
まずは素直にソースコードを持ってきます。
juliaのmakeはコンパイルだけで/usrディレクトリなどへのインストールは行なってくれません。
まぁ、あとでどうにでも移動できますのでお好みのディレクトリにダウンロードして大丈夫です。
移動を考えて root で作業しています。
wget https://github.com/JuliaLang/julia/releases/download/v0.5.0/julia-0.5.0.tar.gz
さすがにNighty Buildを使う度胸はありません。
本格的にコンパイルする前に、必要なパッケージをyumでインストールしておきます。
- git
- cmake
は必須です。
他にも必要なものがあったかもしれませんが、ある程度開発環境をととのえたPCでしたので、正確に何が必要なのかわかっていません。
私の場合、make中に「cmakeがない」と言って止まったので、「cmake」を入れて再コンパイルしました。
また、
- blas, blas-devel
- blas64, blas64-devel
- openblas, openblas-devel
- lapack, lapack-devel
があればどれか使うかもしれませんし無駄かもしれません。検証していません。別になくてもインストールできます。
さて、ソース本体を解凍してコンパイルします。
バージョン0.5.0では、configure など気の利いたものはありません。
いきなり make です。
コンパイルには1時間ぐらいかかりますので、覚悟しておきましょう。
make だけ叩いておやつを食べててもいいですが、エラーで止まってる場合もありますので時々覗くようにしましょう。
tar xzvf julia-0.5.0.tar.gz
cd julia-0.5.0
make
これで放置します。
なんかエラーが出たら、エラー文を読んで考えましょう。
コンパイルが終わったら、お好みのディレクトリに配置します。
私は、面倒くさかったので /usr/local 以下にごっそり移動して実行ファイルにシンボリックリンクを貼りました。
cd ../
mv julia-0.5.0 /usr/local/
ln -s /usr/local/julia-0.5.0/usr/bin/julia /usr/local/bin/julia
これで、本体のインストールは完了です。
ユーザ権限で初回起動する時に、~/.julia が生成されます。
##MySQL(MariaDB)への接続
ついでなので、MySQL(MariaDB)に接続できるようにしてみます。
時期によるのかもしれませんが、標準的な「Pkg.add("MySQL")」では、「using MySQL」時にエラーが出ましたので「Pkg.clone」しています。
コマンドプロンプトは、「$」がシェル、「>」がjuliaのREPLです。
$ julia
...
ウェルカムメッセージ
...
> Pkg.clone("https://github.com/JuliaDB/MySQL.jl")
「Pkg.clone()」や「Pkg.add()」のあとは少し時間がかかります。
普通にgitを叩いているつもりで待ちましょう。
最後に簡単なサンプルを書いておきます。
「販売履歴テーブルのようなものから販売間隔の平均(秒)を取得」してみます。
REPLならば、1行目の「#!〜」は不要です。
最後の行も「mean(b-a)」で結果が表示されます。
なれるまではREPLで1行ずつ動作を確認していくのがいいと思います。
#!/usr/local/bin/julia
using MySQL
con = mysql_connect("127.0.0.1", "user", "password", "dbname")
df = mysql_execute(con, """
SELECT
UNIX_TIMESTAMP(order_datetime) AS sec
FROM
orders
ORDER BY
order_daretime
"""
a = convert(Array, df[:sec])
b = copy(a)
pop!(a)
shift!(b)
println(mean(b-a))
実行は 「chmod +x ファイル名」で権限をつけて「./ファイル名」で結果が表示されます。
説明不要な簡単さでしょう?
ただ、以前より改善されたとはいえ、julia本体のVMの起動にかかるオーバーヘッドが気になります。
起動が遅ければ起動させたままならいいじゃない
などと企んでいるところです。