投稿

2009の投稿を表示しています

英語の月名

数字の月名を英語の月名に置き換えるとき配列があると便利だが,/bin/shには無い. caseで書くのも面倒.

通常使われるテクニック

set dummy JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
shift $i
moneng=$1

dateコマンドを使ったもの.

moneng=`LANG=C date -j -f "%m" $mon "+%b" | tr "[:lower:]" "[:upper:]"`

install_name

Macの共有ライブラリには,インストール先の情報が記録される.インストール先は,-install_nameの指定があればそのディレクトリ,なければ-oで指定したものが使われる.ライブラリのinstall nameは,これをリンクしたライブラリやバイナリに転写されていく.

-install_nameの後はスペース.=を入れると正しく動作しないので注意.

オブジェクトファイルに関する情報は,otoolで表示することができる.
ライブラリの名前とバージョン,リンクしているオブジェクトやライブラリを表示するには,
otool -L ライブラリまたはバイナリ
ライブラリのinstall nameを表示するには,
otool -D ライブラリ
を使う.

共有ライブラリのinstall nameの変更は,install_name_toolを使う.
install_name_tool -id 新しいパス
でできる.ライブラリやバイナリに書き込まれた他のライブラリのinstall nameを変更するには,
install_name_tool -change 古いパス 新しいパス
とする.

多くのフリーウェアでは,libtoolがこのあたりの面倒を見てくれるが,シェルスクリプトやGNU Makeを駆使して機種依存の問題を解消しようとしているものもある.

vaporは,configureの変わりにoptions.mk, site.mkを手動で編集したり,機種依存のインクルードファイル(例: Darwin.mk)を用意している.ライブラリには,生成したディレクトリのパスがinstall_nameとして記録されているため,うまく動作しない.DYLD_LIBRARY_PATHを設定してライブラリを見つけようとしている.既定の-two_levelnamespaceだとコマンドラインと共有ライブラリに記録されたパスしか検索しないので,ライブラリは見つからない.

make/config/Darwin.mkのSHARED_LDFLAGSに-install_nameを指定して対処.

Octave-3.2.x

Octave-3.2以降の更新が滞っていた. doxygenのコンパイルが通らないため. doxygenをリンクするときに, srcからみて../libにあるlibmd5.aがなぜか見つからないためだった. 直接../lib/libmd5.aを指定したところ, リンクがうまくいくようになった (#22426).

doxygenは, octaveが依存しているftglがHTMLのドキュメント作成のために要求していたが, ドキュメントは必ずしも必要ない. またPDFのドキュメントを作るためにconfigureはpdflatexなども探しているが依存関係に指定されていない. そこで, docをvariantととして分離するように提案した (#22427).

Leopardでx86_64

MacPorts 1.8では, ${prefix}/etc/macports/macports.conf (${prefix}はたいてい/opt/local) にコンパイル時のアーキテクチャbuild_archを設定できる. Snow Leopardでは, x86_64がデフォルトなのですべて64-bitでコンパイルされる. Tiger, Leopardでは, Intel Macの場合はi386, PowerPCの場合はppcなので32-bitになる.

Leopardでbuild_archにx86_64を設定して, さらからコンパイルしてみた. p5-locale-gettextがデフォルトのアーキテクチャ以外でコンパイルできない (19381). autoconfなどが依存しているhelp2manがp5-locale-gettextに依存しているので, 先に進めない. nomaintainerなので困ったものだ.

Tclパッケージのパス

Mac OS X添付の/usr/bin/tclshは, ~/Library/Tclにパッケージをおけば見つけてくれる.
MacPortsでインストールした/opt/local/bin/tclshは,

$ /opt/local/bin/tclsh
% set auto_path
/opt/local/lib/tcl8.5 /opt/local/lib

しか見ていない.

環境変数TCLLIBPATHに追加するか,スクリプトの冒頭で

lappend auto_path /Users/foo/Library/Tcl

と書けば追加できる. Tclで完結する後者の方が良さそう.

Tcl httpでssl

SSLでログインしたあと, ファイルをダウンロードするためのTclスクリプトを書いてみる. wgetやcurlを使ってもよいが, tlsパッケージを併用するとhttpでSSL (https) が扱える.
package require http
package require tls
::http::register https 443 ::tls::socket

SSLサイトでのログイン. まず::http::formatQueryでPOSTするデータを作る. 送信すべきデータはサイトにより異なる.

set login [::http::formatQuery email $email passwd $passwd action login]

メタデータからクッキーをリストに保存.

set tok [::http::geturl $loginurl -query $login]
upvar #0 $tok state
set cookies [list]
foreach {name value} $state(meta) {
if {$name eq "Set-Cookie"} {
lappend cookies [lindex [split $value {;}] 0]
}
}
::http::cleanup $tok

クッキーは, ヘッダにつけて送信.

set tok2 [::http::geturl $dataurl$fname -headers [list Cookie [join $cookies {;}]]]

リダイレクトされる場合は, メタデータのLocationを使う.

upvar #0 $tok2 state
array set meta $state(meta)

$meta(Location)にURLが入っているはず.
リダイレクト先からのダウンロードにもクッキーが必要.

set tok3 [::http::geturl $meta(Location) -channel $f -headers [list Cookie [join $cookies {;}]]]
::http::cleanup $tok2
::http::cleanup $tok3

Tcl httpバッケージ

Tclのhttpパッケージは,httpクライアントの動作を実装したもの. ウェププラウザやwgetやcurlがサーバとのやりとりでするようなものがTclのコマンドで簡単に書ける.

::http:geturlの-validateオプションは, 0でない引数を与えると, ヘッダだけを取得する.結果は返り値に保存されるが, upvarを使ってアクセスする必要がある.ここでは, ヘッダにContent-Lengthが含まれているか調べて, ファイルが存在するかどうかを確認している.


set token [::http::geturl $url -validate 1]
# obtain results of geturl
upvar #0 $token state
set meta $state(meta)
# look for Content-Length
return [lsearch $meta Content-Length]

g95 on Snow Leopard

Snow Leopardでg95がコンパイルできずに苦労している.

gcc-4.0.4はi386では一応コンパイルできるが, g95のコンパイル途中で失敗する.

gcc-4.0.4とgcc-4.1.2では, configureで--buildにx86_64-apple-darwin10を与えるとうまくいかない.
x86_64はサポートされていないようだ.

Appleが修正したgcc-5465は,i386とx86_64両方のライブラリを作る.g95のコンパイルのときに,未定義のシンボルが多数出てしまいどうしようもなくなった.

gcc-4.3.4はいろいろと細工をして最後までコンパイルすることはできたが,g95の実行時にエラーが出る.gcc-4.3では,仕組みが大きく変わったのだろう.そこまで直せそうにない.

それならばとgcc-4.2.4を試したみた.gcc-4.3.4でしたような細工がいくつか必要だったが,gcc-4.3.4よりは難しくなかった.一応コンパイルに成功し,簡単なプログラムが動作することを確認した.細工にはいい加減なものもあるので,あとで問題が発生するかもしれない.それでもともかくめでたい.fileで確認したところ,確かにx86_64のコードが生成されている.

次はこれをPortfileにまとめなくてはならない.

11/9追記: gcc-4.2.4にリンクしたg95は, Snow LeopardだけでなくIntel MacであればTigerでもLeopardでも動いたが, PowerPCのMacでは動かなかった. そこで, 従来の4.0.4をベースにしてgcc42はvariantととした. r60290で変更をコミットした.
さらにr60340でSnow Leopardの検出を簡素化した.

g95でLAPACK

g95で実対称行列の固有値を求めるサブルーチンには,dsyev (driver),
dsyevd (divide and conquer)
dsyevx (expert)
dsyevr (relatively robust representations)といくつかある(LAPACKのユーザガイド及びmanページ参照).以下の簡単な例では,最初の3つの固有値は一致した.dsyevrはe-14〜e-15程度の差があった.
Macには,CBLAS, CLAPACKがAccelerate FrameworkとしてOSに添付されている.g95がインストールしてあれば,

g95 foo.f90 -framework accelerate

でライブラリをリンクできる.とっても簡単.

program eigen
implicit none

character, parameter :: jobz = "V", uplo = "L"
integer, parameter :: n = 3, lda = n, lwork = 3*n-1
integer :: info, i
real*8, dimension(lda,n) :: a
real*8, dimension(n) :: w
real*8, dimension(lwork) :: work

a(:,1) = (/1.0d0, 2.0d0, 3.0d0/)
a(:,2) = (/2.0d0, 3.0d0, -4.0d0/)
a(:,3) = (/3.0d0, -4.0d0, 5.0d0/)

call dsyev(jobz, uplo, n, a, lda, w, work, lwork, info)
print *, "info=", info
do i=1, n
print *, "mode:", i, " eigenvalue=", w(i)
print *, " eigenvector", a(:,i)
end do
end program eigen

MacPortsでphp5をインストール

Snow LeopardのPHP5はGDが有効化されているが,freetypeがサボートされていない.そこでMacPortsからインストール
MacPortsのHowToも参考に.

$ sudo port -d install php5 +pear
$ sudo port -d install php5-mysql
$ sudo port -d install php5-gd
標準のapache2にphp5のモジュールをロードするために,/etc/apache2/httpd.confを編集.

LoadModule php5_module /opt/local/apache2/modules/libphp5.so

MySQL5との接続.

$ cd /opt/local/etc/php5/
$ sudo cp php.ini-development php.ini

MySQL5に接続するために,php.iniを編集

pdo_mysql.default_socket= /opt/local/var/run/mysql5/mysqld.sock
mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
mysqli.default_socket = /opt/local/var/run/mysql5/mysqld.sock

Apache2を再起動.

$ sudo apachectl graceful

MacPortsでmysql5をインストール

mysql5のインストール
sudo port install mysql5
サーバとして使うにはmysql5-serverもインストールする.
データベース格納用ディレクトリの作成
sudo mkdir -p /opt/local/var/db/mysql5
sudo chown mysql /opt/local/var/db/mysql5
プロセスIDファイル用ディレクトリの作成
sudo mkdir -p /opt/local/var/run/mysql5
sudo chown mysql /opt/local/var/run/mysql5
初期化
sudo -u mysql mysql_install_db5
起動
sudo /opt/local/share/mysql5/mysql/mysql.server start
起動の確認
mysql5 -u root
パスワード変更
/opt/local/lib/mysql5/bin/mysqladmin -u root password 'password'

Snow LeopardとMacPorts 1.8

Snow Leopardを上書きインストールすると, 一見/optが消去されたように見える. ディスクの空き領域も増えている. 実は, /optはFinderで見えなくなっているだけで, 消去されていない. ディスクに余裕ができたのは, システムのPowerPC用の部分がSnow Leopardではなくなったから.
ただし, Snow Leopardと相前後してリリースされたMacPorts 1.8は以前のバージョンと仕様が変わり, デフォルトではCPUに応じたアーキテクチャが選択される. 例えば, Core 2 Duoを使ったMacBook ProやXeonを搭載したMac Proなら, 既定ではx86_64用にコンパイルされる. 1.7以前はi386用にコンパイルされていた. そのため, この例の場合, これまでのものを引き継ぐとアーキテクチャの違いから, リンクがうまくいかなくなる.
64-bit CPUを搭載したマシンで64-bitのコード生成は, 科学技術計算にはメリットがあるので, 歓迎すべき仕様変更である. 手間となるが, コンパイルしなおすのがよさそうだ. Leopardでコンパイルしたものは32-bitだが, ディレクトリの名前を変更すれば使い続けることができる (例えば/opt/localを/opt/local_i386).
MacPortsはボランティアにより支えられているので, 一朝一夕にすべてが移行できるわけではなく, 中にはSnow Leopardでうまくコンパイルできなくなるものもある. しばらく時間がかかるかもしれないが, 徐々に移行されていくはずだ. MacPortsは現行OSとその前までをサボートするので, Tigerはlegacyとなり積極的なサポートはなくなる. TigerユーザはLeopard, Snow Leopardへの移行を迫られるか, コンパイルできなくなるパッケージが出てくるという心づもりが必要だ.
Snow Leopardでは, XCode 3.2となった. XCode 3.2は, Snow LeopardのDVDのOptional Installsにある. デフォルトのコンパイラは, gcc-4.2となったようである.

gnudatalanguage +universal

gnudatalanguageのPortfileには問題はないが, +universalが失敗することがある.
これは, python25+universalがuniversalとは言っても, i386とppcの2種類のアーキテクチャ用のバイナリをつくるため (r17501). Intel Macでsources.confのuniversal_archsにx86_64が入っていてもi386とppc用に作られてしまう.

octave-3.2

グラフィックが充実. FLTK/OpenGLを使ったものも実験的に追加されている.
MacPortsのoctaveは, ftgl, fltk, GraphicMagickのほか, fftw-3-single, arpackへの依存関係がなく, 単にバージョンアップしただけの様子. qrupdateはOctaveから分離したようなので, 別途パッケージを作った.
チケット#20648.

netcdfのmaintainer

MacPortsのnetcdfのmaintainerをすることにした. netcdfに依存するパッケージの大半は自分が管理しているので, netcdfを自由にできた方が都合が良い.
--enable-netcdf-4はvariantにまわして, netcdf3にリンクしていたgrads, grads2, gmtもnetcdfにリンクしてコンパイルできるようにした. netcdf 3は削除.
nco, cdo, wgrib2は, netcdf4にvariantで対応.

TigerでMacPorts

Mac OS X 10.4 でoctave, gnudatalanguage, ncargのコンパイルに問題があるようだ. Tigerにさらからインストールしてみる.
Ports treeはrsyncでもよいが, 更新が遅いのでここではsubversionを使うことにする. 通常はそのようにする必要はない. rsyncのports treeもしばらくすればアップデートされる.
Tigerにはsubversionは入っていないので, まずsubversionをインストールする.

sudo port -d sync
sudo port -d install subversion

/opt/local/etc/macports/sources.confを編集.

file:///Library/MacPorts/ports [default]

を追加し, rsyncのエントリをコメントアウト.
Ports treeを取得する.

mkdir /Library/MacPorts/
cd /Library/MacPorts
svn checkout http://svn.macports.org/repository/macports/trunk/dports ports

パッケージのインストール. まずはgrads.

sudo port -d install grads

途中でgcc43がビルドされるので時間がかかる. でも, port dependentsには出てこない. どこかでdepends_buildになっているのだろうか.
gradsの動作確認. TigerではX11は手動で起動. 環境変数の設定も必要.

export DISPLAY=local:0.0
export GADDIR=/opt/local/share/grads

LeopardではDISPLAYは設定しない. Xが必要になると, 自動的に起動する. ドックにX11.appをおいておく必要はないし, おくべきではない.

インストーラーでMacPortsをインストールすると, .bash_profileが書き換えられ, PATHに/opt/local/binが追加される. にもかかわらず, Tigerのxtermでは, portコマンドが見つからない. これはX11起動時も, xterm起動時も.bash_profileが読み込まれないためで…

Exif情報の消去

Exif情報も一種の個人情報. ImageMagickでExifなどを消すには, -strip strip image of all profiles and comments オプションを使う. convert -strip foo.jpg foo_strip.jpg

みんなの体操祭

イメージ
開港150周年記念イベントの一環で横浜赤レンガ倉庫広場で開催.中田市長もあいさつしたが,本番では名前がでなかった.長野先生が忘れたのか,それとも体操しないでかえったのか.ラジオ体操連盟の皆さんは,15分のために全国から集まる.

集中講義予告

8/5から奈良女子大で「グローバル気象予測入門」と題し, 気象学の基礎やモデルの仕組み,現象論について集中講義をする予定.3日間連続で一日中立っているだけでも, 軟弱な研究者には奈良での修行.
万が一受講予定の学生さんが読んでいたら, 関数電卓 (iPhone等添付のものでも可) を持参してきてください.

ncarg on MacPorts

nclのソースが公開されて随分経つが, ソースのコンパイルは先延ばしにしてきた. ついに, Portfileを作成してコミットした. ビルドシステムは, configureやCMakeではなく, 独自cshスクリプトとymakeだが案外順調に進んだ.
HDFのヘッダをhdf/mfhdf.hで参照しているので, hdf/を削除するというパッチは必要だった. g2clibはwgrib2のものを使った. hdfeosにはPortfileを書いた. gcc43が既定のfortranコンパイラとなったが, +g95でg95でもコンパイルできる.
BLASのコンパイルに時間をかけているが, Macにはaccelerateフレームワークがあるから無駄なような気がする. でも, 最初は安全重視でncarg添付のものを使った.

花はきりしま

イメージ
イージス艦「きりしま」を見に横浜大棧橋へ.見学は30分待ち,と思ったらもれなく砕氷船「しらせ」もついてきた.「しらせ」では飲み物を売っていたし,船内をくまなく見られたのでよかっただが,なかなか「きりしま」に到達できず.「きりしま」はデッキのみの公開.「えんしゅう」の海難救助訓練が見られたのでよしとする.クラゲがうじゃうじゃいたのも印象に残る.

官僚たちの夏

2009/7/26横浜関内.神奈川県庁を「通商産業省」に見立てて,撮影をしていました.夏なのにコートを着た人が出たり入ったり.入っていく人は,杉本哲太さんらしき俳優さん.合間にはシャツになってスタッフに団扇であおいでもらっています.エキストラさんは年長なのにコートを着たまま.中華街もそばですが,儒教道徳的にいかがなものでしょう.怒ったついでに,公共物である神奈川県の建物を営利会社に撮影させて,通りがかりの県民や大事な観光客のみなさんには,何の権限か警備員が撮影を妨げるのは解せぬ.

KML対応grads2

MacPortsのgrads2を2.0.a5.oga.5にアップグレード.

このバージョンの特長は, Google Earthに結果を表示するKMLに対応したこと.

MacPortsのgrads2では+geotiffをつける.
ラスター形式のファイル出力に便利な+printimもついでにつけてインストールする例.

sudo port -d install grads2 +geotiff +printim


netcdf4に対応するとのことで, しばらく格闘していた. configure.acなどを解読して, --enable-dyn-supplibsをつけないで静的ライブラリをリンクするようにすると, netcdf4を探してくれることをようやく理解. 現状では, hdf5-18やlibgeotiffは静的ライブラリをインストールしない. しない理由はなさそうだが. 一応コンパイルはできたが, grads-2を起動したディレクトリに変なファイルができてしまうこと, x軸を探せずにsdfopenができなかったことから, 当面netcdf4対応は見送り, 復活させたnetcdf3にリンクすることにした.

これでnetcdf4騒動は一段落.

grads2に含まれるコマンドは-2がつくので注意 (grads-2, gradsdap-2など). grads2が作るwgribはwgrib2ではないwgribだが, バイナリ名はwgrib-2. gradsのwgribと同等だと思われる. wgrib2がインストールするバイナリはwgrib2.

autoconf

パッケージを管理していると, たまにaclocal.m4が古すぎるから作り直せと言われることがある. また, configureがなぜ期待通りに動作しないことがある. このようなときにautoconfの知識が少し必要になる.

configureはconfigure.acからautoconfを使って作成される. configureは長大なシェルスクリプトで読み解くのが大変だが, configure.acはm4マクロ置換をする前のものなので, 短めである.

aclocalは, configure.acに取り込まれるaclocal.m4を作成する. 同一ディレクトリにあるacinclude.m4は読み込まれるようだ. その他のマクロはaclocalに-Iオプションでディレクトリを渡す. そのアプリケーション独自のマクロは, acinclude.m4やconfigure.acと同一または別のディレクトリ (例: m4)にAC_DEFUNで定義されている.

netcdf 4騒動

有志でパッケージ管理をしていると, maintainerの中には連絡が取れなくなる人もいる. netcdfはいつの間にかnomaintainerとなっていた. そのまま放置されていただけならまだましだったのだが, どなたたかがnetcdf 4にアップグレードしてくれていた. netcdfに依存するライブラリが軒並みコンパイルできなくなって, 大迷惑だった. とりあえずnetcdf4の機能を分離してdefault variantsに指定, -netcdf4でオフにできるようにした.

netcdf 4は上位互換であるが, HDF5と統合されたので,リンクのときにHDF5のライブラリも指定する必要がある. 必要なライブラリは, pkg-configを使って,

$ nc-config --libs

などととして取得する.

cdo, ncoはnetcdf4に対応していたので, 依存するライブラリの指定やconfigure.argsの変更で済んだ. ただし, ncoはHAVE_NETCDF4_Hがconfig.hに書き込まれないので,陽に指定する必要があった. wgrib2, gnudatalanguage, vis5d+は-lnetcdf以外のリンクするライブラリを指定する必要があった. gmtとgradsは, netcdf3を復活させて, そちらにリンクするようにした. netcdf3は${prefix}/local/lib/netcdf3に「隠して」ある.

grads2はnetcdf4に対応しているはずだが, configureがnetcdf4を検知する部分をスキップしてしまう. Google EarthのKMLファイルが作れるので, 早く提供したいのだがまだ作業が必要なようだ.

netcdfでないけど, ついでに. gnudatalanguageは, aclocal.m4をconfigureの前に再作成して, use_autoconf yesとして, configureを作り直す必要があった. HDF5の古いAPIを使うために, -DH5_USE_16_APIをconfigure.cxxflagsに追加.

GrADSで書いた絵の縞

GrADSのメタファイルから作成したEPSには縞が出る.

GrADS:

ga-> set gxout shaded

ga-> enable print foo.gx
ga-> print
ga-> dispable print

コマンドライン:

$ gxeps -c -i foo.gx -o foo.eps

これは,アンチエイリアスが原因.

ImageMagickで縞のないラスタ画像を作るには,

convert +antialias foo.eps foo.png

とする.

Mac OS X Server 10.5のMySQL

Mac OS X Server Leopardには,MySQLのライブラリ等がイントールされていない.

下記から入手できる.Mac OS X Server 10.5.6に対応するのはMySQL-45.binaries.tar.gzで,45はMySQLのバージョンではなくAppleが付けた番号のようである.

http://www.opensource.apple.com/darwinsource/other/

aolserverのインストール

MacPortsからaolserver-4.5.1をインストール.
aolserverはtclで書かれているので,tclをインストールしておく.
tclは+universalなし+threadsありでインストールする.

ローカル用のソースツリー(例えば/Library/MacPorts/ports_local/www/aolserver)に
aolserverのPortfileをコピー.
ドキュメントをインストールするように修正.


variant doc description {install documentation} {
destroot.target-append install-docs
}


インデックスを更新し,インストール.

$ cd /Library/MacPorts/ports_local
$ portindex
$ sudo port -d install aolserver +doc


/opt/local/aolserverの下にhtmlとmanができる.
shareの下に置くべきかは分からないので,maintainerに任せる.

aolserverのデーモンはnsdスーパーユーザでは起動できないので,wwwで起動することにする.wwwがログを書き込めるように,所有者を変更する.ログファイルとプロセスIDがlogに作られるので,ディレクトリを作成する.servers以下にサイトが作られる.サイトは複数置ける.あとで,サンプルservers/server1を使ってnsdを起動するが,ここにもログが出力されるので,所有者を変更しておく.

$ sudo mkdir /opt/local/aolserver/log
$ sudo chown /opt/local/aolserver/log www
$ sudo chown -R /opt/local/aolserver/servers/server1


Foreground (-f) でnsdを起動する.

$ sudo bin/nsd -u www -ft base.tcl


IPアドレス:8000にアクセスすると,設定情報が表示される.

CocoaなTk

Mac版のTkはAqua化されているものと,X11と二通りある.Aquaは,Carbonを使っている.以前のMac OSでもTcl/Tkは動いていたので,これを移植したものだろう.Cocoaを使ったものも開発されているようである.

Tcl and the Tk toolkit second edition

Amazon.co.jpTcl and the Tk Toolkit (Addison-Wesley Professional Computing Series)の第2版の予約を受け付けている.2009/7/31発売予定.この本は,Tclの著者によるTcl/Tkの解説本で,Tcl/Tk 8.5に対応する.C言語は一通り知っていることを前提としており,TclとCについて解説していることが特徴.

今の版より安くなるようだ.

C言語でTclを拡張

Welch, Jones, and HobbsのPractical Programming in Tcl and Tkの第47章には,C言語でTclを拡張する方法が説明されている.

Example 47-2にはバグがあり,古い書き方が残っている.

interp->result = "Usage: random ?range?";

のように直接Tcl_interpのフィールドを操作するのではなく,本文中にあるように

Tcl_SetResult(interp, "Usage: random ?range?", TCL_STATIC);

とした方が安全.

文字列はbufferという名前で宣言しているので,bufは誤り.

リンクオプションは,-bundleでも-dylibでもよい.tclのソースのmacosx/READMEには-dylibのみunload可能とあるが,どうしたらよいかは分からない.

MacPortsのTclでは,libtcl.dylibにリンクするが,Mac OS X添付のTclでは,-framework Tcl -framework Systemが使える.自分でソースからコンパイルするときは,ソースのmacosxで./configureのオプションに--enable-frameworkを付け加える.

ところで,Leopard添付のtclshでは共有ライブラリの読み込みができたが,MacPortsのtcl-8.5.6ではRandom_SafeInit, Random_SafeUnload, Random_Unloadをソースに定義していないとエラーとなる.

Random_SafeInit(Tcl_Interp *interp) {
return Random_Init(interp);
}
int
Random_Unload(Tcl_Interp *interp, int flags) {
return TCL_OK;
}
int
Random_SafeUnload(Tcl_Interp *interp, int flags) {
return TCL_OK;
}

Ubuntuでやってみたが,これらは必要ないので,MacでTcl-8.5を使うときに発生する問題のようだ.

MacPortsのtclsh(tclを+universalで…

FLTK

FLTKは,高速,軽量なツールキット.クロスプラットフォームで,Macでは,AquaなGUIアプリケーションが作れる.Carbonを使っていて,ウィジェットは独自のものなので,X11でないという程度で見た目はよくない.MacPortsからインストールできる.

ヘッダ二つ,本体3行でウィンドウが出る.


#include <FL/Fl.H>
#include <FL/Fl_Window.H>
int main()
{
Fl_Window window(300,180);
window.show();
return(Fl::run());
}


fltk-config --cxxflagsやfltk-config --ldflagsでフラグを調べて,Makefileに書いておくと楽.


$ fltk-config --cxxflags
-I/opt/local/include -O2 -D_THREAD_SAFE -D_REENTRANT
$ fltk-config --ldflags
-L/opt/local/lib -lfltk -lpthread -framework Carbon -framework ApplicationServices
$ cat Makefile
CXX=c++
CXXFLAGS = -I/opt/local/include -O2 -D_THREAD_SAFE -D_REENTRANT
LDFLAGS = -L/opt/local/lib -lfltk -lpthread -framework Carbon -framework ApplicationServices
TARGET = hello

$(TARGET) : $(TARGET).o
$(CXX) $(LDFLAGS) -o $@ $^

clean :
rm -f *.o $(TARGET)

%.o : %.cxx
$(CXX) $(CXXFLAGS) $< -c

Ercoさんのビデオのチュートリアルでは,この簡単な例から始めて,ウィンドウのタイトルやボタンをつけ,最後にはクラスを使ったオブジェクト指向のプログラムにする.自然な流れが見事.

Interface Builderのように,FLUIDというGUIを使ったプログラミングもできる.

VTK5

+pythonでビルドし直そうとしたら,PythonのWrappingは構築されていない.

まず,DBUILD_SHARED_LIBS:BOOL=ONが必要だった.そのままだとdyldがライブラリを見つけられない.DYLD_LIBRARY_PATHを指定すると,vtkやvtkpythonコマンドが動作した.Tkのウィンドウがうまく動かないことがあったのは,-DVTK_USE_COCOA:BOOL=ONなのに-DBUILD_SHARED_LIBS:BOOL=OFFだったからかもと思ったが,これが原因ではなかった.

RPATHの指定.otool -Lでリンクされているライブラリのパスを確認できる.Mac OS Xでは,リンク時に-install_nameにライブラリのパスを指定することで,ライブラリに書き込める.vtkのライブラリは,/opt/local/lib/vtk-5.2にあり,install nameがフルパスでなかった.フルパスでなければ,DYLD_LIBRARY_PATHなどから探すことになる.

CMake 2.4の途中からか,CMAKE_INSTALL_NAME_DIRでパスを指定できるようになった.その他RPATHに関する記述やFinkのパッケージを参考にした.

-DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=ONはlibvtkCommon.dylibのリンクに失敗する.-DVTK_INSTALL_NO_PYTHON:BOOL=ONとして,post-destrootで手動でsetup.py installするようにした.CMakeを介すると,クウォートのためかうまくsetup.pyの引数が渡らなかったから.ここはFinkとは異なるところ.

+x11もうまく動作していなかった.CMakeはOS添付のTclやTkを見つけてしまう.こちらは,Aqua (Carbon).x11に限らず,いつでもMacPortsのTcl/Tkを指定するようにした.

-DTCL_INCLUDE_PATH=${prefix}/include \
-DTCL_LIBRARY=${prefix}/lib/libtcl.dylib \
-DTK_INCLUDE_PATH=${prefix}/include \
-DTK_LIBRARY=${prefix}/lib/li…

C++でVTK

C++にするとTclに比べて,ヘッダのインクルード,変数の宣言,余計な記号たちに加えて,インクルードパスやリンクするライブラリの指定が面倒.

CMakeを使ってみる.CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(foo)

FIND_PACKAGE(VTK REQUIRED)

INCLUDE(${VTK_USE_FILE})

ADD_EXECUTABLE(foo foo.cxx)
TARGET_LINK_LIBRARIES(foo vtkCommon)

コマンドラインで
cmake .
VTKを使わない場合でも,PROJECTとADD_EXECUTABLEを指定してMakefileが自動生成されるのは便利.他にライブラリvtkRenderingなどが必要なら追加.

C++で動的配列

Cのmallocを使ってもいいが,C++ではnew演算子を使う.
float* x = new float[n];
配列は,やっぱりFortranが便利.

C++でバイナリファイルを読む

#include <fstream>

std::ifstream f;

f.open(filename, std::ios::in | std::ios::binary);
f.seekg(pos);
f.read((char*)data, size);
f.close();

openするときの二つ目の引数がポイント.

C++でHello, World!

#include <iostream>
using namespace std;

int main()
{
std::cout << "Hello, World!" << std::endl;
}

名前空間std::が必要な今日この頃.

C++の標準数学関数

C同様

#include <math.h>

でもよいが,C++には
#include <cmath>

がある.

地球を描く

vtkEarthSourceで海岸線付きの球が描ける.SetOnRatioの既定は10で1が一番細かい.日本の形状は少しまともになるが,北海道,四国,九州が出てこない...


package require vtk

vtkEarthSource earth
earth SetOnRatio 1

vtkPolyDataWriter writer
writer SetInput [earth GetOutput]
writer SetFileName earth.vtk
writer Write

writer Delete
earth Delete

VTKで球を描く (手作り)

vtkSphereSourceは便利だが,勉強にならないので,球をセルから構成してみる.

定数

package require vtk

set nlon 100
set nlat [expr {$nlon/2 + 1}]
set pi [expr {acos(-1.)}]
set pi2 [expr {$pi * 2.}]
set npts [expr {$nlon * $nlat}]
#puts stdout "pi=$pi pi2=$pi2 npts=$npts"

経度φと余緯度θからデカルト座標に変換するコマンドを作る.
VTKでは,経度がθ余緯度がφのようだが気にしない.

proc phitheta2xyz args {
set phi [lindex $args 0]
set theta [lindex $args 1]
set xyz {}
set sin_theta [expr {sin($theta)}]
lappend xyz [expr {cos($phi) * $sin_theta}]
lappend xyz [expr {sin($phi) * $sin_theta}]
lappend xyz [expr {cos($theta)}]
}

経度,余緯度を生成.

set lon {}
set dlon [expr {$pi/$nlon}]
for {set i 0} {$i<$nlon} {incr i} {
lappend lon [expr {$pi2 * $i / $nlon}]
}
#puts stdout $lon
set lat {}
set dlat [expr {$pi/($nlat-1)}]
for {set j 0} {$j<$nlat} {incr j} {
lappend lat [expr {$dlat * $j}]
}
#puts stdout $lat

座標点のデカルト座標を生成してvtkPointsに登録.

vtkPoints pts
pts SetNumberOfPoints $npts
set i 0
foreach theta $lat {
foreach phi $lon {
# puts stdout "$phi…

VTK形式のファイルを描画

vtkinteractionを使う一部のサンプルでBus errorやSegmentation Faultが出る.VTK-5.2.1に更新したがだめだった.仕方がないので,単に表示してしばらくしたら終了するようにした.仮に動作しても,表示はParaViewの方がおそらく便利.


#!/bin/sh
# ¥
exec vtk "$0" ${1+"$@"}
package require vtk

if {$argc<1} {
puts stderr "vtk draw.tcl filename"
exit
}

vtkPolyDataReader reader
reader SetFileName [lindex $argv 0]

vtkPolyDataMapper sphereMapper
sphereMapper SetInputConnection [reader GetOutputPort]
reader Delete

vtkActor sphereActor
sphereActor SetMapper sphereMapper

vtkRenderer ren1
ren1 AddActor sphereActor

vtkRenderWindow renWin
renWin AddRenderer ren1
renWin SetSize 300 300
renWin Render

after 1000

vtkCommand DeleteAllObjects

VTKで球を描く (vtkSphereSource)

MacPortsでvtk5をインストール.デフォルトは,Cocoa.X11ではコンパイルに失敗した.まずは,お手軽にTclで球を描いてファイルに保存.次のスクリプトを適当な名前(例えばsphere1.tcl)で保存して,実行(vtk sphere1.tcl).


package require vtk

vtkSphereSource sphere
sphere SetRadius 1.0
sphere SetPhiResolution 100
sphere SetThetaResolution 50

vtkPolyDataWriter writer
writer SetInput [sphere GetOutput]
writer SetFileName sphere1.vtk
writer Write

sphere Delete
writer Delete

SPHEREPACK

07/10/06 19:51

SPHEREPACKはLegendre変換をするFortranライブラリ.
Mac OS X上でg95を使ってコンパイルして使っている。

解像度変換のユーティリティルーチンtrssph()が配列サイズが大きいときにNaNを返すことがある。試した範囲では、288×145を1200×600にするのは大丈夫で、1440×720にするのはだめだった。 メモリ節約のため、trssph()は、Legendre陪関数を逐次計算するサブルーチンsphcom.fにあるlegin()でルジャンドル陪 関数が正しく計算されないようである。アルゴリズムとしては、robustな方法を使っているはずだし、ベクトルのLegendre変換をするルーチンは うまく動作する。また、SPHEREPACKを呼んでいるNCLでは、正しく動作する。ソースを見たところ、ルジャンドル陪関数を計算するときに必要な係数abel, bbel, cbelが大きな整数のかけ算になっていたためであることが分かった。shagc.f, shsgc.f, shags.f, shsgs.f, shigc.f, shigs.fでは

- abel(imn)=sqrt(float((2*n+1)*(m+n-2)*(m+n-3))/
- 1 float(((2*n-3)*(m+n-1)*(m+n))))
- bbel(imn)=sqrt(float((2*n+1)*(n-m-1)*(n-m))/
- 1 float(((2*n-3)*(m+n-1)*(m+n))))
- cbel(imn)=sqrt(float((n-m+1)*(n-m+2))/
- 1 float(((n+m-1)*(n+m))))
+ abel(imn)=sqrt((2.*n+1.)*(m+n-2.)*(m+n-3.)/
+ 1 ((2.*n-3.)*(m+n-1.)*(m+n)))
+ bbel(imn)=sqrt((2.*n+1.)*(n-m-1.)*(n-m)/
+ 1 ((2.*n-3.)*(m+n-1.)*(m+n)))
+ …

D 2.025 for Mac OS X

D 2.025には,Mac OS X版が含まれている.D言語を開発したDigital Mars社純正で,Intel Macで動作する.writeln()等D 2.0で追加された機能が使える.ChageLogを見ると2009/2/14に公開された2.025からMac OS X版が追加されたようだ.マニュアルrdmd.1はあるが,rdmdはない.

2009/2/24 追記
#!/usr/bin/dmd -runと書けば良いようだ.スクリプト風に動くというのは面白い.

私の場合は,/usr/local/dmdというフォルダを作り,bin, libをコピー.shareにhtmlとmanをコピー.ランタイムはsrc以下にあるので,これもコピー.dmdは/etc/dmd.confの設定を読む./usr/local/dmd/etc/dmd.confからシンボリックリンクを張った. dmd.confには,次のように書いた.

DFLAGS=-I/usr/local/dmd/src/phobos -I/usr/local/dmd/src/druntime/import -L-L/usr/local/dmd/lib

gdcで変なメッセージが出ることに対応するパッチは,MacPortsのリポジトリに登録されたようだ.

plplot-5.9.2 revision 1

D言語のbindingとcairo/pangoドライバをvariantsとして追加.cairoドライバによりPDFが作成できるようになる.g95, gdc, cairoを有効にしてインストールするには,
sudo port -d install plplot +g95 +gdc +cairo
とする.

D言語サンプルは,bindingがexperimentalなので少ないが,/opt/local/share/plplot-5.9.2/examples/dにいくつかある.コンパイルは,ヘッダ/opt/local/include/plplot/plplot.d,モジュール本体は/opt/local/lib/libplplotd.dylibなので,
gdmd -I/opt/local/include/plplot x03d.d /opt/local/lib/libplplotd.dylibとする.gdcでなくgdmdを使うとソースコードから.dをとった名前のバイナリができる.簡単なプログラムでは便利.-lオプションはないようだ.

D言語

Windowsの.NETやLinuxやMacでも.NET互換の環境Monoの開発言語として,C#が注目されている.言語仕様は,よりよいC, Javaになっている.多次元配列もある.しかし,中間言語に翻訳するためか,Cの函数を直接呼べず,動的ライブラリをロードする必要がある.このあたりは不便であるように思われた.

plplotに対応している言語を見ていて,D言語があるのを見つけた.聞いたことはあったが,仕様はよく知らなかったので,調べてみた.「わかったつもりになるD言語」にはドキュメントの翻訳を含めて,詳しく紹介されていた.コンパイル型言語で,Cの函数をラッパー無しで直接呼べる.複素数型,動的に伸張配列可能な配列,文字列がUnicode文字の配列あること,標準ライブラリに正規表現が含まれることなどが大変便利に思えた.

MacPortsにもGNUのDコンパイラgdcがあったので,インストールしてみた.Leopardでは変なメッセージが出るが問題なく使える.かつてg95にもあり既に解決済なので,Portfileのパッチを作り,Ticketを発行して添付しておいた.

GNU Dも仕様通りUnicodeに対応しているので,Hello, worldは日本語で試せた.gdcはDMD 1.0仕様なので,writelnはないことに注意.

ちなみに,NHKの地上波の朝のニュースは「おはよう日本」,BSは「おはよう世界」である.

ソースはHTMLでもよいというのも面白い.の間のソースをコンパイルする.の間にタグが含まれていても無視するので問題ない.

Vis5D+

MacPortsにVis5D+を追加.以前にインストールメモを見てコンパイルしたことがあった.Fortranのコンパイルがうまくいかなくて困っていたが,configureスクリプトを改変すればg95でコンパイルが通るようになった.gcc43では,うまくいかない.Fortranコンパイラは使われておらず,Fortran用のインターフェースをコンパイルするかどうかだけ.+g95をつければ,-lvis5dをリンクしてFortranでvis5d+形式のデータを作成するツールが作れるはず.GTK1は,
うまくいかなかった.

モードライン

Portfileの最初の行におまじないのような一行がある.
# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4

EmacsとVim用にソースの種類やタブの取り扱いを設定するためのもので,モードラインと
呼ばれている.

Portfileの書き方として推奨されているので,よく考えずにこの行をつけていた.

モードラインの設定に従うはずなのに,この行があるにもかかわらず,~/.vimrcの設定が使われるので,モードラインが有効になっていないことに気づいた.

モードラインを有効にするには,
set modeline
set modelines=1
とする.いつも使うのなら,~/.vimrcに書いておけば良い.モードラインはset modelineで有効になる.モードラインの設定を検索する行数は,set modelinesで指定する.既定では,モードラインは無効でmodelines=0のようであるので,モードラインを使うにはこの設定が必要である.

後半にあるvimの部分では,テキストのエンコーディングをutf-8に(fenc=utf-8),ファイルタイプをtclに(ft=tcl),タブを展開(et),インデント,タブ,ソフトタブをそれぞれ4文字に設定している.ソフトタブに0でない値を設定すると,タブを入力したとき設定した文字数の空白に置換する.

ソースの種類により,スタイルは異なっている.Makefileはタブが必要なので,いつもタブの展開(set expandtab)しておくわけにはいかない.Cなど通常のソースでは,タブが4つの空白にすることが推奨されることが多い.長い数式を書き,doループが多重になることが多いFortranのソースでは,タブは2つくらいにしておきたい.このような場合でも,ソースの最初にモードラインを書いておけば,様々なスタイルに対応することができる.

Portfileは拡張子がないが,モードラインの設定のおかげで,文法に基づいた色づけ(syntax enable)を~/.vimrc等に設定しておけば,キーワード等に色がつく.インデント等の設定があるために,文字を揃えるの…

gdl-0.9r2, GMT-4.3.1

GDLとGMTのMacPortsパッケージを更新.universalにも対応.GDLが依存しているhdf5のuniversal対応は,管理者に連絡中.GDLのlibtoolが古かったので,/opt/local/share/libtool/config/ltmain.shをコピー.

Eigen2

Eigen2は,配列を扱うためのC++テンプレートライブラリ.MacResearchに掲載されたインタビューによると,SSE2やAltivecにも対応していて,ATLASに劣らない性能が出るそうだ.データ解析とお絵描きには使えるかもしれない.MacPortsで簡単にインストールすることができる.MacPortsで入れた場合,コンパイルは
c++ -I/opt/local/include/eigen2 foo.cc -o foo
とすればよい.

GrADS 2

OpenGrADSプロジェクトのArlindo da Silvaさんのすすめがあり,OPeNDAP,GRIB2に対応したGrADS 2のパッケージを作成.GRIB2のライブラリ・ユーティリティとOPeNDAPをステーションデータに対応させるためのgadapが必要なので,これも別のパッケージとして作成.

インストールするときに+universalとすると,複数のアーキテクチャに対応するバイナリが生成される.既定ではi386とppc,つまりIntel MacとPower Macで動作する./opt/local/etc/macports/macports.confのuniversal_archsを編集すると,ほかのアーキテクチャ用にもコンパイルできる.例えば,ppc64とすればPowerPC G5用,x86_64とすればAMD64用(AMDのプロセッサを搭載したMacはないので,これに互換のIntelのプロセッサ)の64ビットのバイナリになる.

GrADS2自体のコンパイルは簡単だったが,上記のふたつのライブラリ用のパッケージやlibwww, hdf4, libdap, libnc-dapのPortfileをいじってuniversalに対応させたるのに手間がかかった.

Windows 7 beta

自作PCは64ビットなので,できれば64ビットOSがよいのですが,32ビットでないといろいろと問題がおきるようなので,XPは32ビットでした.64ビットOSで遊んでみるためにWindows 7はもってこいです.
2つ目の内蔵ディスクにインストール.XPでダウンロードしてImgBurnでDVDに焼きます.BIOSではDVDドライブがHDDに優先しているのですが,DVDから起動したらすぐになにかキーを押さないとインストーラは起動しません.Windowsユーザには常識なのかもしれませんが.
ファイルのロードとSetupの起動はハングしたのではないかと思うほど待たされますが,気長に待ちましょう.Setupの途中でうっかり「ドライバのロード」を選ぶと戻れなくなり,振り出しに.ファイルの展開とコピーが終わると再起動になります.LinuxとXPのデュアルブートになっていたので,心配してF8を押してしまいましたが,これは誤りでインストールやり直しになりました.インストールしたHDDから起動してもだめでした.
Windows 7の画面はXPよりもきれい.問題なく解像度も最大に.Windows UpdateにATI X1200シリーズのアップデータがあり早速インストール.このあたりはXPより改善されています.
Bootcampまたは仮想化環境でWindowsを使いたいMacユーザでWindows 7を試してみようというという方もいるかと思います.2009/8/1まで無料で使えるのでよいのですが,Yahoo!動画はだめでした.そのうち対応してくれるとよいのですが.

MacユーザにやさしいWindows XP

Windows 7が出たところですが,Macユーザにも使いやすいようにWindows XPを整備してみました.Yahoo!動画だけではもったいないので.インストールも何度も再起動して大変ですが,使える環境にするのも結構大変です.UIを似せることにはこだわらず,シンプルにいきます.MicrosoftWindows update
Windows XP Service Pack 3
DirectX 9.0c
.NET Framework 2.0, Service Pack 1, 言語パック
Internet Explorer 7
Windows Media Player 11
メイリオ
MSゴシック,MS明朝JIS2004
Windowsサーチ4.0
メイリオを入れてシステムやブラウザで指定すると少しは見た目がきれいになります.設定はお好みで. サウンドなし
ウィンドウのデザイン,スタートメニュー クラッシック表示
背景単色
ビデオとチップセットドライバ Catalyst 8.12環境に合わせて入れます.プリンタドライバなども. キーボードxkeymacs ctrlとcaps lockとを入れ替え.Emacs風のキーにする機能はオフ
秀Caps 半角/全角をEscに,無変換をIMEオフに変換をIMEオンに,Shiftを押さずにアンダースコア
MS IMEはVJE風のキーバインドキー配列が違うとかなりストレスがたまりますので,このあたりは重要. 解凍ユーティリティLhaplus何が定番かはわかりません.ところで,Macだからといってsitはそろそろやめてほしい. AppleQuickTime
iTunes
Safari
Bonjour for WindowsSafariが入ると,かなりMacらしくなります. AdobeAcrobat Reader 9
Flash Player
Macにはプレビューが入っていますが,Windows XPにはPDF閲覧ソフトウェアはありません.アプリケーションをいくつかOpenOffice.org 3.0
Picasa2ImgBurn
OpenOffice 3はよくできています.でも数式はやっぱりTeX. TeX環境 TeXインストーラ3
ImageMagick
gvim-7.1
TeX2img
開発環境,科学技術アプリケーションは今なら仮想環境かデュアルブートでLinuxが多いのでしょうか.まだCy…