意識の高いLISPマシン

藤原惟/すかいゆき(@sky_y)の技術用ブログ

Macでsayコマンド使おうとしてハマった

zsh + oh-my-zshの環境でsayコマンドを使おうとしたら、こうなりました。

$ say -v Alex 'Hi'
say:1: bad option: -v

原因は、oh-my-zshperlプラグインでした。

$ grep -r 'say' .oh-my-zsh/*
(中略)
.oh-my-zsh/plugins/perl/perl.plugin.zsh:# say - append a newline to 'print'
.oh-my-zsh/plugins/perl/perl.plugin.zsh:say() {
.oh-my-zsh/themes/humza.zsh-theme:      # should it say b, kb, Mb, or Gb

$ vim .oh-my-zsh/plugins/perl/perl.plugin.zsh
(60行目あたり)
# say - append a newline to 'print'
say() {
    print "$1\n"
}

こいつか! perlプラグインを外してもよかったのですが、直接コメントアウトして、ようやく本来のsayコマンドを使えるようになりました。

CMakeを使ってOpenCVを楽にセットアップする方法 (for Visual Studio 2010)

Visual StudioOpenCVのプロジェクトを作るときに、いちいちインクルードディレクトリやライブラリを指定するのが面倒です。

CMakeを使って一度下準備をすれば、これらの設定を飛ばして楽にOpenCVプロジェクトを作成することが出来ます。

ここでは画像を表示するサンプルファイルを使って、CMakeで設定済みVisual Studioソリューションを生成する手順を紹介します。

手順

1. CMakeを使ってOpenCVをビルドする

まず、CMake公式サイトからCMakeをダウンロードし、インストールします。

次に、OpenCV公式サイトからOpenCVをダウンロードしてきて、CMakeを使いビルドします。

ビルドの手順は、下記のサイトに従って下さい。

Windows に OpenCV バージョン 2.4.5 をインストール

2. dllのディレクトリにパスを通す

環境変数PATHに下記のdllディレクトリを追加します。(ビルドした環境やバージョンによって微妙に違うかもしれないので、自分で確認して下さい。)

コントロールパネルのシステムから環境変数を開いてもいいのですが、個人的には Rapid Environment Editor をお勧めします。これを使うと、環境変数の編集が楽に出来ます。

3. CMakeLists.txtを書く

好きな場所にソースコードを置くディレクトリを作ります(例えばC:\myapp\SampleCMakeOpenCVなど)。

ここに、テキストエディタで下記のファイルを作成し、CMakeLists.txtと名付けます(ファイル名の綴りを要確認)。

# 下記の2つは自分の環境に合わせて書き換える
SET(OpenCV_DIR "C:/opencv/opencv/build") # OpenCVConfig.cmake があるディレクトリ
INCLUDE_DIRECTORIES("C:/opencv/opencv/build/include") # 上記ディレクトリの下のincludeディレクトリ

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT( SampleCMakeOpenCV )
FIND_PACKAGE( OpenCV REQUIRED )
ADD_EXECUTABLE( MyProject main.cpp )
TARGET_LINK_LIBRARIES( MyProject ${OpenCV_LIBS})

次に、 ここ からmain.cppをダウンロードして同じディレクトリに配置します。(自分でソースを書く場合にも、適当なC++ファイルを用意する必要があります。)

上記のmain.cppは適当なサンプル画像を必要とするので、ここからダウンロードして配置します。

4. CMakeを実行する

WindowsメニューのすべてのプログラムからCMakeを探し、「CMake (cmake-gui)」を実行します。

「Where is the source code」「Where to build the binaries」に同じもの(この例だとC:\myapp\SampleCMakeOpenCV)を入れます。バイナリの場所はお好みで指定しても構いません。

次に「Configure」を押します。Visual Studioの種類を聞かれたら、今回はVisual Studio 2010の64bit版なので「Visual Studio 10 64bit」を指定します。

エラーが出なければ「Generate」を押します。これで、同じディレクトリにソリューションファイル(SampleCMakeOpenCV.sln)ができているはずです。

5. Visual Studio 2010で実行する

ソリューションファイル(SampleCMakeOpenCV.sln)をダブルクリックします。

ソリューションの規定のスタートアッププロジェクトが「ALL_BUILD」になっていると思うので、プロジェクトMyProjectを右クリックして、「スタートアッププロジェクトに指定」をクリックします。

最後に、ビルドして実行します。上手くいけば、Lennaの絵が表示されるはず。

結局、何がうれしいのか?

最初は普通にプロジェクトを設定するのと同じぐらい面倒ですが、一度CMakeLists.txtを作ってしまえば、これを使い回しできます。

つまり、次回から新しいOpenCVプロジェクトを作成する際に、楽ができます。

OpenCV以外のライブラリでもCMakeの機能を使えば似たような手順で設定ができるので、ライブラリが増えれば増えるほどCMakeの恩恵が大きくなります。

ぜひ楽をするためにCMakeを使ってみてはいかがでしょうか。

アイデア:日本の事務書類に見られる複雑な表組みをLispのS式で書く

日本の事務書類に見られる複雑な表組みを、論理的な構造を保ちつつテキストファイルで書きたい。 (参考:奥村 晴彦:「ネ申 Excel」問題 [PDF])

そう考えていたとき、LispのS式で書くことを思いついた。

このアイデアのポイントは、下記である:

  • 表組みを罫線で区切るのではなく、(左側に置く)ラベルと(右側に置く)コンテンツの2つで構成される「ブロック」として考える
    • プログラマの方には、keyとvalueに例えた方が分かりやすいかもしれない。
  • 1つの表組みは、垂直に並んだブロック(行ブロック)の集合である
  • 1つの行ブロックには、複数のブロック(列ブロック)を水平に並べることができる
  • ラベルとコンテンツを、S式を使って ("ラベル" "コンテンツ") の形で書く

これを、Lisp Tableと呼ぼう。

これだけでは分かりにくいので、例として、手元にある文書のうち表組み部分をLispで書きおこしてみた。 すると、これぐらいの複雑さであれば素直にS式で書けることが分かった。

見本

f:id:sky-y:20140218004925j:plain

Lisp Tableによる表現

;; Lisp Table

(("フリガナ" "")
 ("氏  名" "")
 ("所  属" "")
 ("職名・学年" ""))


(("申請者の区分\n(いずれかに○)" "教職員  大学院学生等  学部学生等  事務所職員  業  者  その他")
 (("学内内線番号" "") ("車  種\n(いずれかに○)" "四 輪  二 輪"))
 (("車両番号" "") ("申 請 期 間\n※ 和 暦" "    年    月 から\n    年    月末まで"))
 ("現 住 所" "〒    -    \n")
 (("自動車等を利用したときの自宅からの距離" "    km") ("公共交通機関を利用した場合の所要時間" "    時間   分"))
 (("申請理由" "") (("確認者氏名" "印")))
 ("通勤手当受給者欄" "□ 通勤届を自動車等(四輪車・原付を含む二輪車)で提出済み(予定)\n(該当する場合、□にチェックを入れてください)"))

(("入構・駐車整理料金" "")
 ("許可番号" "")
 ("駐車場所" ""))

将来について

まず、詳細な仕様については全然詰めてないので、決める必要がある。

この記法をHTMLのTableかLaTeXのtabular環境に直せたら、実用的になるかもしれない。 できれば、Pandocに流してWord文書とかExcel文書に直せるようになったら最高。

時間ができたら自分で実装したいが、誰か実装してくれるとうれしい。 その際、Haskellで実装してくれると、Pandocに組み込むときに楽なのでさらに嬉しい。

Point Grey flea3 (USB3.0) カメラをLinuxで動かす

研究でPoint Grey flea3のUSB3.0を使おうとしていて、Windowsでは動くのですが、Linuxでは全く動かなくて困っていました。

調べてみると、libdc1394-22というライブラリを使えば、Windows以外でもPoint Greyカメラが動くようです。

参考サイト:

しかし、flea3のUSB3.0カメラはlibdc1394の最新の安定版(v2.2.1)でも対応していません。開発版ではどうやら対応しているようなので、それをインストールしてみます。

インストール手順

1. 開発版のソースをcloneする

gitを使って以下を実行しソースをcloneする。

git clone git://libdc1394.git.sourceforge.net/gitroot/libdc1394/libdc1394/

2. 必要なライブラリをインストールする

sudo aptitude install autotools autoconf pkg-config libtool libsdl

apt-getな人はお好みで。 何か漏れているかもしれないけど、確かこれぐらいあったはず。

3. autoconfでconfigureスクリプトを作る

cd libdc1394/libdc1394
libtoolize -c
aclocal;autoheader; automake -a -c; autoconf

4. インストール

./configure
make
sudo make install

5. flycapture2をインストール

公式サイトから最新版のflycapture2をダウンロードする。以下のサイトのDownloadsから(要会員登録・無料)。

パッケージをダウンロードする。

tar zxvf flycapture2-2.5.3.4-amd64-pkg.tgz
cd flycapture2-2.5.3.4-amd64
sudo sh install_flycapture.sh

6. flycapture2を動かす

FlyCap2ではないので注意。

flycap

これでとりあえず動くようになりました!

あとは、正しいフレームレートで動作させるために、細かいセッティングを変える必要がありそうです・・・。

追記(13.11.19 17:09):ファームウェアを更新する

flea3のUSB3.0カメラを正しいフレームレートで動作させるには、ファームウェアを更新する必要があったようです。

先ほどのPoint Grey公式サイトからファームウェアのzipファイルをダウンロードしてきます。 このとき、Flea3 U3 1.41.3.0 FirmwareFlea3 USB3 2.6.3.0 Firmwareを両方ダウンロードし、unzipします。

ファームウェアのアップデート用GUIを起動します。

sudo updatorgui

OperationsFirmware Update Fileでファイルを選択するのですが、以下の順番でファイルを開き、Updateを押してください(重要):

  • Flea3 U3 1.41.3.0 Firmwareのez2ファイル
  • Flea3 USB3 2.6.3.0 Firmwareのez2ファイル

これでシステムを再起動したら、見事に最高のフレームレートで取れるようになりました。

ただし、flycapをもう一度起動するとなぜかエラーになるのですが、これは未解決です・・・。

Python on Mac: Matplotlibのバグについて

Matplotlibを使おうとして、pipでインストールしたところ、 import時にフリーズする事象に遭遇しました。

前提

  • Homebrew
  • Python 2.7.5 (Homebrewでインストール)
  • pip

問題

pip install matplotlib
ipython
>>> import matplotlib # ここでフリーズ

吐き出されたメッセージを見たところ、import matplotlib.font_managerでフリーズしていたようでした。 調べたところ、 matplotlib 1.4.x にバグがあるようでした。

解決策

上記リンクによると、以下により開発版のMatplotlibをインストールすればよいようです。

pip install git+https://github.com/matplotlib/matplotlib.git#egg=matplotlib-dev

私の環境では、これによってimportできるようになりました。

以上、自分用メモでした。

Python on Mac: scikits.audiolab のインストール

Pythonでscikits.audiolabのインストールに少し手間取ったのでメモ。

※ エラーに遭遇したものをまとめたので体験した時系列的には逆ですが、 実際のインストールはこの順序でOKだと思います。

前提

  • OS: Mac OSX 10.9 Mavericks
  • Python: 2.7.5

以下は先にインストールしておく。

libffi をビルドする

これをしないと、次にPySoundFileのインストール時にffi.hが無いと怒られる。 (Homebrewだけではだめ。ソースからビルドする必要がある。)

適当なディレクトリに移動する。

git clone git://github.com/atgreen/libffi.git
./configure
make
make check
make install

libsndfile と PySoundFile のインストール

先に本体のライブラリ(libsndfile)をインストールしてから、Pythonラッパ(PySoundFile)をインストールする。

brew install libsndfile
pip install PySoundFile

scikits.audiolab のインストール

pip install scikits.audiolab

以上です。

Mac OS X 10.9 Mavericks: Canon レーザプリンタが動かなかった件(IP接続)

うちの研究室ではCanonのレーザプリンタにIPで接続するのですが、 Mavericksにアップデートしてから一切プリントアウトできずに困り果てていました。

今回、解決策が分かったので記録しておきます。

環境

対処

1) 下記に従ってドライバをインストールし、プリンタを削除する(登録はしない!)

キヤノン:Q&A検索|【オフィス向け複合機】Mavericksへアップデート後、印刷ができない場合の対処方法

2) Network printing issues in Mac OS X...: Apple Support Communities のRoyの意見に従い、次の手順で追加する。

  1. システム環境設定の「プリントとスキャン」を開く
  2. 「+」をクリックし、「IP」タブを開く
  3. IPアドレスを入力
  4. 【重要】プロトコルを「Line Printer Daemon - LPD」にする(IPPにしない!)
  5. 名前、場所などを適当に入れる
  6. 【重要】 プリンタを追加する際、「プリンタソフトウエア」のリストに 同名製品が複数表示されることがあるので、以下の例のように「(JP)」が付いていない、 製品名のみの項目を選択する。
    • ○: Canon LBP4500 ←こちらを選択!
    • ×: Canon LBP4500 LIPSLX (JP)
  7. 登録できたら、テストプリントしてみる。

以上です。LPDにするのは盲点だった・・・orz