Posts Tagged ‘プログラミング’

Mac OS X 10.6.8 -> 10.7.3 アップグレードメモ(感想、mecab、libsvm周り)

木曜日, 3月 22nd, 2012

今更ですが10.6.8から10.7.x系にアップグレードしました。

10.6.8での開発環境に不具合出たのが切っ掛け。ここで原因追及するぐらいなら安定し始めてるかもしれない最新版でやってみようぐらいの気持ちで。作業前後でもリプライ頂いたのですが、Xcode3,4共存もできるみたいだし(参考: @shinji_kono先生@shima__shima先生)。

あちこちはまったけど、特に分かり難かったのは python 周りのライブラリの導入方法。

必要に応じてxcode-selectすること。

通常easy_install or pip経由でインストールするか、ソース持ってきて手動で「python setup.py build; sudo python setup.py install」することになるけれども、そのままではこのbuildが通らない。多分クリーンインストールしてると問題なら無いと思うけど、私のように10.6.8からアップグレードしたケースでは10.6.sdkを参照しようとするので、次のように環境変数指定する必要があるっぽい。-archは必要無さそうだけど、念のため。「-L/opt/local/lib」はmacoprtsで入れたライブラリを参照させる場合の話で、そうじゃなければ適宜省略/編集すべし。

% env CC=/usr/bin/gcc CFLAGS=”-O -g -isysroot /Developer/SDKs/MacOSX10.7.sdk -arch x86_64 -L/opt/local/lib” python setup.py build

以下、時系列順に気になった点をメモ。


  • ダウンロード版は、ダウンロード後にすぐ起動してアップグレードするか否かだけの選択肢で進む。(10.5->10.6時には/Applications, /Users とか残すディレクトリを選択できた気がするのだけど、今回はそういう選択肢は用意されていない)
  • 「/Applications/Mac OS X Lion インストール.app」内のInstallESD.dmgでブートディスク作れるらしい。 QT Mac OX X Lionの起動ディスクの作成方法 – [モ]Modern Syntax
  • 上記アップグレードイメージは、アップグレード終了後には削除されてる。
  • アップグレード直後は動作がもっさりしてる気もするけど、裏でMail.appのデータ移行中なのでそれ次第かな。Spotlight周りもありそう。あと想像してたけどgcc消えたw
  • Mail.appはスレッド表示できるようになったのね。フォルダ上のどこにあってもスレッドとしてみれるのは嬉しい。(ヘッダしか見てないと思うから、これで意図的に2通使ってスパム表示させるとか何かやれそうな予感)
  • Finderは「環境設定」と「表示>ステータスバー」あたりで元表示に戻せる。
  • App Store経由でXcode4インストールすると、結構長時間「インストール中」のままになる。「購入済み」タブで進捗状況が見れる。
  • 終わったタイミングで「/Developer/Applications/Xcode.app」を起動するも、古いのが立ち上がる。ここでJava要求されるので、指示通りにインストール。(古いのが残ってるってことはgccも残ってる?)
  • Xcode4は「/Applications/Xcode.app」にインストールされる。起動後、起動すると古いのを消すかどうか聞かれます.あと,コマンドラインツールとかは起動後に Preferences > Downloads で別途インストールです.gcc は LLVM ですが… あと,場合によっては xcode-select を使う必要もあったりするらしい。
  • あれこれmecab, mecab-ipadic, libiconvと格闘するもmecabさんが文字化けしてしまう。
  • 手動で入れた「/usr/local/{lib,include}」側のlibiconvを参照すると、mecabコンパイル時点でこける(x86_64用のlibiconv_openとかが見つからないとかか宣う)。しかし、libiconv使うサンプルプログラムは普通にコンパイル通って実行も問題無し。一方、標準or古い「/usr/{lib,include}」側のlibiconvを参照すると、mecabはコンパイルできるものの、文字化け。参照方法をいくつか試してみても状況変わらず。ぐぬぬぬ。
  • 参考までにmacports側で入れたら正常に動くか確認してみようと「sudo port install mecab」するとXcodeが古すぎる(10.7.xならXcode4にしろ)と言われる。
  • 「xcode-select -print-path」で「/Developer」(Xcode3.xが入ってるトップディレクトリ)になってたので、「xcode-select -switch /Applications/Xcode.app」と指定すると「/Applications/Xcode.app/Contents/Developer」を参照するように。
  • これでport動くようになったのでmecabインストール。
  • % sudo port install mecab
    % sudo port install mecab-ipadic-utf8
    (このままだと /opt/local/lib/mecab/dic/ がeuc参照してるので変更)
    % cd /opt/local/lib/mecab/dic/
    % sudo ln -snf ipadic-utf8 sysdic

  • portで入れたmecabだと、これで文字化けせずに動く。手動コンパイルした方だと、「手動mecab+portのIPA辞書」でも「portのmecab+手動IPA辞書」でも化ける。手動コンパイルは両方とも不具合あるってこと?
  • ここでxcode-selectし直す前にlibiconv入れてた(それで問題無かったけど)ことに気付き、最後の一確認ということでlibiconv, mecab, ipadic をコンパイルし直してみる。が、/usr/local/以下のlibiconv参照するとやっぱりmecabのコンパイルでこける。/usr/以下のデフォルトだか古い環境の残り物だかを参照するとコンパイルできるけど、文字化け。ぐぬぬぬ。
  • 不具合のあるmecab, ipadicが邪魔にならないように make uninstall して暫く放置(portのほう使う)。
  • mecab-python(pythonバインディング)さんのインストール。普通に「python steup.py build」するとgcc-4.0とかMacOSX10.6.sdkを参照しちゃうので、build時に環境変数を指定してやる必要あり。なお、10.7.3からなのか、私の環境ではMacOSX10.7.sdkが/Applications/Xcode.app/以下のかなり深い場所にあったので、事前にlnしてからやってます。
  • % sudo ln -snf /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk /Developer/SDKs/MacOSX10.7.sdk
    % env CC=/usr/bin/gcc CFLAGS=”-O -g -isysroot /Developer/SDKs/MacOSX10.7.sdk -arch x86_64 -L/opt/local/lib” python setup.py build
    % sudo python setup.py install

  • RMeCabさんのインストール。といっても原則として「パッケージをインストールする」になっちゃって、そのソースパッケージでは「/usr/local/lib/libmecab.2.dylib」を参照してたりする。コンパイル済みでどうしようもないので、lnすることに。
  • % sudo ln -snf /opt/local/lib/libmecab.2.dylib /usr/local/lib/libmecab.2.dylib

  • libsvmさんのインストール。前回の通りに進めると「手順6 Python用 shared libraryのインストール」で「-sonameなんてオプション知らない」と言われる。ググった限りでは作成されるライブラリ名の指定っぽい。ここでサジェストされてるように-install_nameするとOK。手順7以降は前回の要領でやれました。
  • % cd python
    % c++ -shared -dynamiclib -Wl,-install_name,libsvm.so.2 ../svm.o -o libsvm.so.2
    % sudo cp libsvm.so.2 /usr/local/lib/


多分、これでいろんなケースに対応できるんじゃないかと思うが。。。

Installing libsvm-3.1 for Python on Mac OS X 10.6

木曜日, 11月 3rd, 2011

libsvmをコンパイルして「その場で動かす」だけなら README に書いてある手順で進められますが、実用的には好きな場所で実行できるようにしたい。ということでその手順です。

【蛇足コラム】
svm-trainとかの場所をos.path.exists()で確認するようなスクリプトになっているので絶対パスで指定せざるを得ないのだけど、cdll.LoadLibrary()のように環境変数か何かで指定されたPATHを参照して対象ファイルが存在するかを判断するようなライブラリって無いんだろうか。
ConfigParserあたりで変更箇所を一括管理する形で書くのも良いかもしれないけど。

環境構築手順

  1. libsvm本家サイトからソースをダウンロード。
  2. コンパイル。
  3. > tar xvfz libsvm-3.1.tar.gz
    > cd libsvm-3.1
    > make
    
  4. 実行ファイルを ~/bin/libsvm/ に、ツールを ~/bin/libsvm/tools/ にコピー。(要PATH設定)
  5. > mkdir -p ~/bin/libsvm/tools
    > cp svm-predict svm-scale svm-train ~/bin/libsvm/
    > cp tools/*.py ~/bin/libsvm/tools/
    
  6. スクリプトのパスを修正。
  7. > emacs ~/bin/libsvm/tools/easy.py
    is_win32でWindowsか否かに分けてパスをしている箇所で、
    svmscale_exe 等のパスを絶対パスで指定。下記は記入例。
    =====begin(easy.py)=====
    svmscale_exe = "/Users/tnal/bin/libsvm/svm-scale"
    svmtrain_exe = "/Users/tnal/bin/libsvm/svm-train"
    svmpredict_exe = "/Users/tnal/bin/libsvm/svm-predict"
    grid_py = "/Users/tnal/bin/libsvm/tools/grid.py"
    gnuplot_exe = "/usr/local/bin/gnuplot"
    =====end=====
    
  8. バイナリの動作確認
  9. > svm-train
    等と引数無しで実行した時にエラーが出なければ
    (使い方が出力されるだけなら)OK。
    
  10. Python用 shared libraryのインストール
  11. > cd python
    > make     #../libsvm.so.2 が作成される
    > sudo cp ../libsvm.so.2 /usr/local/lib/
    
  12. Python用ライブラリ(スクリプト)の編集
  13. # ライブラリをインストールする場所の確認。
    > python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
    # 以下は「/Library/Python/2.6/site-packages」と出力された場合の例。
    > emacs svm.py
    「if sys.platform == 'win32':」後でパスを指定している箇所にて、
    以下のように変更。元のインデントを保つように注意。
    =====begin(svm.py)=====
    #libsvm = CDLL(os.path.join(os.path.dirname(__file__),\
    #                '../libsvm.so.2'))
    cdll.LoadLibrary("libsvm.so.2")
    libsvm = CDLL("libsvm.so.2")
    =====end=====
    
  14. Python用ライブラリ(スクリプト)のインストール。
  15. > mkdir /Library/Python/2.6/site-packages/libsvm
    > cp svm.py svmutil.py /Library/Python/2.6/site-packages/libsvm/
    > touch  /Library/Python/2.6/site-packages/libsvm/__init__.py
    
  16. Python用ライブラリの動作確認。
  17. > python
    >> from libsvm import svm
    でエラーが出なければOK。
    

参考サイト: Installing libsvm-3.0 for Python on OSX 10.6

(Quiz/1年次) プログラミング: C言語におけるデバッグ

月曜日, 7月 27th, 2009

(出典: Wikipedia:デバッグ

デバッグ (debug) とはコンピュータプログラムや電気機器中のバグ・欠陥を発見および修正し、動作を仕様通りのものとするための作業である。
(中略)
デバッグの基本的なステップは以下である。

  1. バグの存在を認識する
  2. バグの発生源を分離する
  3. バグの原因を特定する
  4. バグの修正方法を決定する
  5. 修正し、テストする

上記を踏まえて,以下のクイズに答えよ.

  • プログラムを実行した結果,誤りのある最終結果が出力された.どうやらどこかで処理を誤っているようだが,プログラムとしては正常終了(最後まで実行して処理を終了する)している.このような場合,どのように誤りを見つけたら良いか?
  • プログラムを実行した結果,何も出力する事無く Bus error,または Segmentation fault により異常終了してしまった.このような場合,どのように誤りを見つけたら良いか?
  • 「Bus error」や「Segmentation fault」とはどのような状況で起きるのだろうか?

(Quiz/1年次) プログラミング: 構造化プログラミング

月曜日, 7月 6th, 2009

Wikipedia:構造化プログラミングより)
構造化プログラミング(こうぞうか-)は、コンピュータのプログラム上の手続きをいくつかの単位に分け、メインとなる処理では大まかな処理を記述し、サブルーチンによって細部を記述していく方法。1967年、エドガー・ダイクストラらによって提唱された。

全体的な機能から詳細機能へと順に開発するトップダウン式と小さな機能をまとめて大きな機能単位をつくるボトムアップ式の開発方法がある。

サブルーチン分割や構造化制御をサポートするプログラミング言語を構造化言語と呼ぶ場合があるが、現在の言語水準では特に明示されない場合でも、ほとんどの言語は構造化されているといえる。典型的な構造化言語はCやPascalといったいわゆるALGOL系の言語であろう。
オブジェクト指向でも、基本的な処理の流れは構造化から変わりない。

上記を踏まえて,以下のクイズに答えよ.

  • サブルーチンとは何か?
  • プログラムを構造化して記述する事で得られるメリット/デメリットは何だろうか?
  • それ以外の記述方式は無いだろうか?

(Quiz/2年次) プログラミング, OS: 配列の要素数外への不正なアクセス

火曜日, 6月 23rd, 2009
#include <stdio.h>

int main(int artc, char *argv[]){
  int array1[5];
  int scalar;

  scalar = 10;
  array[5] = 5; // 配列の要素を超えたアドレスへの不正アクセス                  
  printf("scalar=%d\n",scalar); // 結果は環境依存で異なる                       

  return 0;
}

上記ソース memory.c では次のような処理を行っている.

  1. int 型の配列 array を宣言.配列の要素数は5.
  2. int 型のスカラー変数 scalar を宣言.
  3. scalar に10を代入.
  4. array[5] に 5 を代入.
  5. printf で scalar の値を確認.

このとき,scalar の値は環境依存で結果が異なってしまう.
私が確認した限りでは以下の通りであった.

OS gccバージョン 出力結果
Mac OS X 10.5.7 gcc version 4.0.1 (Apple Inc. build 5490) scalar=5
CentOS release 4.3 (Final) gcc バージョン 3.4.5 20051201 (Red Hat 3.4.5-2) scalar=10

この結果を踏まえて,以下のクイズに答えよ.

  • なぜ結果が環境によって異なるのか?
  • それを解決するにはどうすれば良いか? 具体的にはソースをどのように書き直せば良いか?
  • このような問題が起きないようにするためのウマい方策は無いだろうか?

(FYI) JavaKueche 第八回勉強会

月曜日, 6月 22nd, 2009

JavaKueche勉強会のお知らせが届きました.
以下の通り開催されますので,学生の皆さんは奮って参加しましょう!
なお,部屋の都合上多くて20名ぐらいでの〆切になると思いますので,なるべく事前登録をしておいた方が良いでしょう(と思ったら,一応30名までの登録が可能になってますね).

2009-07-11: 第八回勉強会と2009年度総会のお知らせ

日時:7/11(土)15:00〜
場所:琉大工学部1号館401教室

内容:
15:00〜16:00:「JavaScriptの高速化」村田氏

 Webアプリケーション開発において、JavaScript を多用すると画面描画速度が低下していくという現象に悩んでいませんか?今回は Google が提供する Page Speed を使って、Web アプリケーションの診断と高速化の実践的な手法を紹介します。

16:10〜17:10:「Spring AOP をやってみよう」贄氏

 AOP は聞いたことがあるけど使ったことがない、また、どういう場面で使えるのか、いまひとつイメージが湧かないという技術者のための Spring AOP 入門です。また、Web アプリケーションに機能を追加するという、現場でよくあるテーマを題材に、AOP を使うとこう書ける、という具体例も紹介します。

17:20〜17:50:総会

18:30〜:懇親会(近くの居酒屋にて)

-参加費-
500円(学生は無料)

(Quiz/1年次) プログラミング: 変数のスコープ

月曜日, 6月 15th, 2009

Wikipedia:スコープより)
「プログラミングでのスコープとは、ある変数や関数が特定の名前で参照される範囲のこと。ある範囲の外に置いた変数等は、通常、その名前だけでは参照できない。このときこれらの変数はスコープ外である、「見えない」といわれる。」

上記を踏まえて,以下のクイズに答えよ.

  • 何のために「スコープ」という概念が設けられているのか?
  • グローバル変数は可能な限り使わないよう推奨される事が多い.それは何故か?
  • それらの問題・観点を解決するには,どのような方法が考えられるか?

FrocessingではじめるActionScriptドローイング

水曜日, 6月 10th, 2009

gihyo.jp にて「FrocessingではじめるActionScriptドローイング」という記事が.

どうやら Processing の ActionScript3.0 版ライブラリ(ライクなもの)らしい.
本家はここのようですね.

Processing を知らない学生は,

を参照すると良いでしょう.

ActionScript を知らない学生(もいるんだよね)は,同じく gihyo.jp の記事になりますがプログラマのためのFlash遊び方を読んでみて,実際に動かしてみてください.
AIR(ローカル環境で動作するFlashアプリケーション)の例題もあるようです.
本家である Adobe のサイトでも,各種ドキュメントだけでなくサンプル等が公開されてますので,いろいろ覗いてみてください.