2016年8月15日月曜日

boost.pythonの始め方

boost.pythonの導入からサンプル実行まででハマったのでメモ.

インストールなどは適当なサイトを見てやれば良いが,コンパイルが問題.
g++のオプションに-Iや-Lでインクルードパスやライブラリパスを指定するだけではなく,-FでpythonのFrameworksディレクトリまでのパスを指定してやる必要がある.
-Fの指定が無くてもshared objectを作るためのコンパイルは正常に終了し,pythonのimport文でインポートできてしまうものの,何らかの関数を実行しようとするとSegmentation Fault 11を吐いて落ちるのが非常にタチが悪い.

僕の環境では,

g++ -I`python -c 'from distutils.sysconfig import *; print get_python_inc()'` -DPIC -bundle -fPIC -o basic.so basic.cpp -lboost_python  -framework Python -I/usr/local/include -L/usr/local/Cellar/boost-python/1.61.0/lib/ -F/usr/local/Cellar/python/2.7.12/Frameworks/

でOKでした.
おわり.

追記:
サンプルを動かすのはOKだとしても,自分のやりたいことしようとすると
なかなかめんどくさそうだ.
Pybind11も見てみるか…

2015年5月15日金曜日

MacでHaskellの準備

1. Emacs

$ brew update
$ brew install --cocoa emacs

2. haskell-mode

基本的にはhttps://github.com/haskell/haskell-mode
の下部を見ながら進める.要は

$ emacs &
 emacsの中で
  M-x customize-option RET package-archives
 現れたインタフェースを使って
  Archive name: melpa-stable
  URL or directory name: http://stable.melpa.org/packages/
 として保存
 またemacsの中で
  M-x package-refresh-contents
 ”contacting”でハングしてるように見えても実はリフレッシュが済んでるので,
  M-x package-install RET haskell-mode
 emacsの設定ファイルに,
  (add-hook 'haskell-mode-hook 'haskell-indentation-mode)
 を追加

3. Haskell処理系

$ brew install ghc cabal-install

4. Cabal Hell になっちゃったら

$ rm -rf ~/.ghc
$ rm -rf ~/.cabal
すべてのプログラムに影響するけど,他にやりようがないみたい.
削除した後は以下のようにすると良い

$ cd プロジェクトのディレクトリ
$ cabal sandbox init
$ cabal install —only-dependencies
$ cabal configure

またCabal Hellっちゃったときは
$ cabal sandbox delete
で消してプロジェクトごとにやり直し



2013年6月27日木曜日

Incanterを含むjarファイルを実行できない

project.cljは,

(defproject incanter-sample "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :dependencies [
                 [incanter "1.5.0-SNAPSHOT"]]
  :main incanter-sample.core)

で,core.cljを

(ns incanter-sample.core
  (:gen-class))

(use '(incanter core))

(defn -main [& args]
  (do
    (def A (matrix [[1 2 3] [4 5 6] [7 8 9]]))
    (println A)
    ))

な感じに作成した.
"lein run"すれば行列が表示されるんだけど,"lein uberjar"してjarファイルを作ってから"java -jar"で実行すると,

java.lang.SecurityException: no manifiest section for signature file entry…

みたいな例外を吐く.

"lein uberjar"するときにで署名ファイルを除外するためには,project.cljに:uberjar-exclusions [#"除外したい署名ファイル.SF"]を追加すれば良い.
全部の署名ファイルを除外してしまうのが楽だけど,ファイルの名前が分からないので,

$ unzip -l 署名で怒られるjarファイル.jar | grep -i -e "\.sf"

を実行し,*.SFを探して:uberjar-exclusionsに渡す.

前のIncanterのサンプルでは以下のようなproject.cljを使えば良い.

(defproject incanter-sample "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :dependencies [
                 ;;[org.clojure/clojure "1.4.0"]
                 [incanter "1.5.0-SNAPSHOT"]]
  :main incanter-sample.core
  ;; Same thing, but for uberjars.
  :uberjar-exclusions [#"META-INF/BCKEY.SF"]
  )

2013年5月16日木曜日

LeiningenでIncanter

 前回でも書いたが,Clojureを始めるにあたってLeiningenをインストールした.LeiningenはClojureのビルドツールで,Clojure本体はもちろんのこと,基本となるライブラリも一緒にインストールでき,leinなるコマンドでプロジェクトの作成やコンパイルなどなどを簡単に行うことができる.なんといっても,使いたいライブラリを記述するだけで以下のレポジトリからダウンロードしてパスを通してくれるのが嬉しい.

 そんな感じで簡単に使えるライブラリの中でも,Incanterは秀逸.これはRのような行列演算,統計処理ライブラリで,さしずめPythonで言うところのNumpy, Scipy, Matplotlibのようなものです.RやScipyに比べると日本語の情報は少なく,始めにくいかもしれないけど,それなりに情報は見つかる(ここは結構まとまってる).

んで,始めたんだけど,Exception in thread "main" java.lang.IllegalAccessError: abs does not existってな例外が投げられて,すごい長いトレースバックが表示される.全然原因不明で小一時間苦しんだのち,この情報を発見.

プロジェクトの名前をincanterにしてたのが原因らしい.
(注:Incanter本家にもあるように,project.cljの:dependenciesにはincanterだけ書くのが安心.:dependencies のところに書くorg.clojure/clojureとincanterのバージョンの間には依存関係があるみたいなので,それぞれに適当なバージョンを指定するとうまく動かないかも.実はこれにもかなり時間をとられた…)
結局,名前を変えたらあっさりOK.


あーあ,コーヒーが冷めちゃったよ…

2013年5月14日火曜日

Clojure始めちゃいますか

そりゃ楽しく書くならLisp系,あるいはHaskellだけど,手元にMatlabがある状況ではどうしても低きに流れてしまうわけで….PythonはNumpy,Scipy,Matplotlibのおかげで,Matlabが使える状況で「図がきれいだから使うかな~」って気にもなるけど,楽しく書けても気軽に使えない状況ではどうしてもねぇ.まあ,自分のヘボさが招いてる言い訳ですけど….

ってなところで,Clojure始めちゃいますかって話です.
何と言ってもJavaを呼び出せるんで.

始め方はここを参照しました.
難しいことは全くないですし,躓くことも無いです.
プログラミングClojure第2版」も買いました.映画にコーラみたいなもんで,こういった本は必要じゃないと思っても買ってしまいますね.あと,「Land of Lisp」も買っちゃいました.表紙がもう何とも言えず,ほぼジャケ買いです(お小遣いが…).このAlien Lisp良いですねぇ~.

2012年9月12日水曜日

HaskellのaccumArray


Matlabのaccumarrayを良く使っていたので,Haskellにもあるかと思って探してみた.
以下はそのメモ.

Data.Arrayの中にaccumArrayがある
accumArray :: (e->a->e) -> e -> (i,i) -> [(i,a)] -> Array i e
引数1. (e->a->e) は a型 の値をどうやって e型 に蓄積していくかを決める関数
引数2. e は e型の値であり,蓄積の初期値
引数3. (i,i)はインデックスの範囲を決めるタプル
引数4. [(i,a)]は蓄積の対象になるデータ
引数5. Array i e は戻り値.[(i,e)]

ここでの目的からでは1の(e->a->e)は(+)で良い.[(i,a)]のiがインデックスで
ヒストグラムのi番目のビンを表すなら,(i,a)の存在はi番目のビンに相当する
Array i e の i番目のeをe+1という操作で蓄積したいため,aは常に1となるよう
に[(i,a)]を生成すればよい.また,この場合の蓄積の初期値は0で良いので,eは
0を渡しておけばよい.(i,i)はインデックスの範囲を決めるタプルなので,1から
10までのインデックスがあるなら(1,10)となる.すなわち(smallest-index,
largest-index)である.
例)Prelude Data.Array> accumArray (+) 0 (1,7) [(1,1),(3,1),(5,1),(7,1)]
       array (1,7) [(1,1),(2,0),(3,1),(4,0),(5,1),(6,0),(7,1)]

inRange :: Ix a => (a,a) -> a -> Bool も同様にData.Arrayの関数
引数1. (a,a)は範囲を表すタプル.(smallest-value, largest-value)だが,
          valueはIntやCharである必要がある.(Ix型.詳細は:i Ixで)
引数2. a は範囲内に存在するかどうかテストする値を表す
引数3. a が (a,a)内にあればTrueを返し,なければFalseを返す
例)Prelude Data.Array> inRange (1,5) 3
       True
    Prelude Data.Array> inRange (1,5) 7
       False
    Prelude Data.Array> inRange ((1,5),(10,12)) (7,8)
       True

Data.ArrayのArray型はNumeric.LinearAlgebraのfromArray2D
などの関数でMatrix型に変換できる

2012年9月11日火曜日

Haskellで楽に並列処理

Haskellはどうやら計算の並列化に向いるらしい.Matlabのparfor並に楽に並列化できるなら,趣味だけじゃなくて研究でもHaskellで楽しくプログラミングできるかもしれないのでちょっと調べてみた.

そしたらまさにそれらしき情報を発見(http://yunomu.hatenablog.jp/entry/2012/05/12/060238)したので,早速試してみる.

monad-parallelというパッケージを使うらしいのでまずはインストール.cabalを使えば楽勝.

$ cabal update
$ cabal list monad-parallel
 * monad-parallel
    Synopsis: Parallel execution of monadic computations
    Default available version: 0.7.1.1
    Installed versions: [ Not installed ]
    Homepage: http://trac.haskell.org/SCC/wiki/monad-parallel
    License:  GPL
$ cabal install monad-parallel

おわり.Windows(Cygwin)でもUbuntuでも特に問題なし.

使える関数はここを参照→
http://hackage.haskell.org/packages/archive/monad-parallel/0.5.1/doc/html/Control-Monad-Parallel.html

じゃあ次はテストをしてみる.
fibTest.hsという名前で以下を保存.


---------- ここから ----------
fib 0 = 1
fib 1 = 1
fib n = fib (n-2) + fib (n-1)

test n = print $ fib n

main = sequence [(test 40), (test 40), (test 40)]
---------- ここまで ----------


要は適当なフィボナッチ数を計算して表示するって計算を3回やるプログラム.
以下で時間を計ってみる.
$ ghc --make fibTest.hs -O
$ time ./fibTest

次にfibTestPar.hsという名前で以下を保存

---------- ここから ----------
import qualified Control.Monad.Parallel as P
fib 0 = 1
fib 1 = 1
fib n = fib (n-2) + fib (n-1)

test n = print $ fib n

main = P.sequence [(test 40), (test 40), (test 40)]
---------- ここまで ----------


コンパイル時および実行時にオプションが必要なので気を付ける.
$ ghc -threaded --make figTestPar.hs -O
$ time ./fibTestPar +RTS -N

パフォーマンスモニターで見れば並列計算が行われて時間が短くなったのが分かる.
実行時の +RTS -N オプションはOSが適当に使うコア数を決めるというオプション.
「2つのコアしか使いたくない」とかがあるなら +RTS -N2 でOK.
(よくわかんないけど,+RTS .... -RTS の間に並列計算のオプションを挟むってことか?)

他にもいろいろオプションがあるみたいだけど,それは必要になったときに調べます.