2012年1月17日火曜日

SnowLeopardにScipyをインストール

SnowLeopardにScipyをインストールしました。

で、できました。

ScipySuperPackというnumpy, scipy, matplotlibなどを一発インストールしてくれる便利スクリプトがあるのですが、Lion用のものしかありません。

デフォルトの状態のSnowLeopardにはインストールできなかったので、Pythonを2.7にあげてみたところ、うまくいきました。

Mac環境にScipyをインストールするのは昔から難しいらしく、ソースからインストール、Macportsでインストールなどやってみましたがうまく行きませんでした。調べてみたところみなさん苦労している様子です。

2011年10月8日土曜日

MacOSXでmallocを使う

MacOSXでmallocを使うときは、malloc.hではなくstdlib.hをインクルードします。

malloc.hをインクルードしようとしても、/usr/includeにmalloc.hは存在しないのでNo such file or directoryエラーが出ます。

/usr/include/sys/とか/usr/include/mallocにmalloc.hがあるのでそちらにパスを通す手もありますが、OSXというかFreeBSDではmalloc.hでなくstdlib.hをインクルードすべきとされています。

2011年9月13日火曜日

XCode4でgoogletestを使う方法

GoogleのC++テストフレームワークgoogletestをXCode4で使う方法です。
静的ライブラリlibgtest.aをビルドして使います。

実行環境
  • Mac OSX version10.7.1 
  • XCode version4.1 
  • gcc version4.2.1
  • googletest version1.6.0

1.google testをダウンロード

googletestのページから安定版をダウンロードします。

2011年9月11日日曜日

テンプレート関数の分割コンパイル

テンプレート関数をヘッダとソースに分割してコンパイルする方法です。

通常、テンプレート関数はヘッダとソースを同じファイルに書きます。分割して書くには、二つの方法があります。

1.ソースファイルをインクルードする

ヘッダファイル内でソースファイルをインクルードします。
参照が循環してしまうので、ソースにもインクルードガード(ifndef〜)を書きます。

ヘッダファイル linktest.h

ソースファイル linktest.cpp

ただし、このようにすると、これを利用する側で常にヘッダとソース両方が必要になってしまいます。

例えばこの方法でビルドしたライブラリをつくります。 そのライブラリを使うクライアント側に、ヘッダだけでなくソースファイルも渡してあげないとインクルードエラーがでます。

2.ソースの最後に個別のクラステンプレートを書く

ソースの最後に個別にクラス指定した関数を書きます。

ヘッダファイル linktest2.h

ソースファイル linktest2.cpp

こちらの場合は1番のようにソースが常に必要となる問題はありません。
しかし、ソースの最後に使う全てのクラスでの組合せを書かないといけないので、ちょっと大変です。上の例ではintとdoubleしか書いていませんが、floatなど必要なものは全て書く必要があります。

参考

1番の方法はこちらを参考にしました。

2番の方法はこちらを参考にしました。



XCode4でターゲットを追加する方法

プロジェクトにターゲットを追加する方法です。2つやり方があります。

1.Fileメニューから追加

File→New→New Targetから追加します。

2.プロジェクト設定画面から追加

2つの赤枠のうち、どちらかをクリックして、

下側にあるAdd Targetをクリックして追加します。

ターゲットの変更方法

ターゲット名をクリックして、

変更したいターゲットを選びます。

2011年8月22日月曜日

pythonで辞書のサブセットをcsvに変換

辞書のキーのうち必要なものだけをcsvで書き出します。
id, height, width, weightの辞書リストから、id, height, widthだけのcsvをつくっています。

import csv
outpath = '/path/to/csv'

paramnames = ['id','height','width']
rows = [{'id':0,'height':10,'width':5,'weight':3},{'id':1,'height':3,'width':7,'weight':9}]
header = dict([(val,val)for val in paramnames])

with open(outpath, mode='w') as f:
    rows.insert(0,header)
    writer = csv.DictWriter(f, paramnames, extrasaction='ignore')
    writer.writerows(rows)


paramnamesにid, height, widthを指定しているので、
id height width
0 10 5
1 3 7
というcsvができます。weightは指定していないので書き出されません。

辞書のサブセットをcsv化する方法は、
csv.DictWriterでextrasaction='ignore'にすると全パラメータを使わなくてもエラーをはきません。(ignoreしてますからね・・・)


DictWriterでヘッダを追加する方法はこちらを参考にしました。