2009年9月12日

Snow Leopard を上書きインストールした場合の fink の update 手順

以下の手順は 32bit モードで起動している場合の手順です。

  • 「/sw/etc/fink.conf」ファイルを開いて末尾に「NoAutoIndex: true」を追加
  • sudo fink index -f
  • sudo fink reinstall fink
  • sudo fink update fink
  • sudo fink install perl588-core

必要に応じて設定を変更します。設定の変更は以下のコマンドで実施します。

  • sudo fink configure

パッケージに関してはテストがまだ完全ではないため一部は上手く動作しない物も存在しますが徐々に対応されるでしょう。

2009年9月5日

Mac Python2.6.2 Universal Binary のビルド

本家で配布されている Python2.6.2 には x86_64 のバイナリが含まれない。
自分で作成する場合の Python2.6.2 Universal Binary の作成手順。

curl -O http://www.python.org/ftp/python/2.6.2/Python-2.6.2.tar.bz2
tar xvfj Python-2.6.2.tar.bz2
cd Python-2.6.2
unset DYLD_LIBRARY_PATH
unset LD_LIBRARY_PATH
./configure --enable-framework --enable-universalsdk=/ MACOSX_DEPLOYMENT_TARGET=10.5 --with-universal-archs=all --with-readline-dir=/usr/local --with-threads --with-gcc=gcc-4.0 CC=gcc-4.0 CXX=g++-4.0
make
sudo make frameworkinstall
sudo ln -s /Library/Frameworks/Python.framework/Versions/2.6/bin/python /usr/local/bin/python
file /Library/Frameworks/Python.framework/Versions/2.6/Python 

2009年5月30日

何かを監視して screen のステータスラインにメッセージを表示する

プロセスとかハードディスク容量とかとにかく何かを監視して、メッセージを出してほしい場合があります。

screen のステータスラインに出すなら以下のようにします。

例えばハードディスクの容量を監視するなら、以下みたいなスクリプトを書いて、パーミッションを設定しておきます。

#!/bin/sh

capacity=`df $dir|awk 'NR==2{sub("%","",$5);print $5}'`

if [ $capacity -gt 80 ];then
    msg="disk is 80 over!!"

else
    msg=""
fi

echo $msg

で .screenrcに以下みたいに書きます。

backtick 0 2 2 /path/to/shell.sh
hardstatus alwayslastline "%?%{=b rw}%0`%{-} %?"

backtick は 以下みたいな感じです。

backtick id lifespan autorefresh command [args]

一番目のが 「id」 で hardstatus で 「%id`」で参照できます。この例の場合「id」に「0」を採番してるので「%0`」で参照できます。

「lifespan」、「autorefresh」とかで監視間隔を修正します。

hardstatus の「%?」はその間の参照が展開されたら表示するっていわゆる条件分岐です。

なのでこの例だと「%0`」の内容が空文字以外だったら表示されます。

よってこの例だと df の結果でハードディスクが80%以上利用されているとステータスラインに文字が表示されます。

スクリプトを工夫するといろいろできると思います。

何かを監視してターミナルの色を変更する(Mac OS X限定)

@totte が「そういえばCPU負荷率に応じて色が変化する管理コンソールってないのかな。緑→赤で。」と Twitter でつぶやいていた。管理コンソールっていってもいろいろあるので、とりあえず監視できれば良いだろうってことでターミナルでやってみた。

スクリプトは即席なので超いい加減です。

#!/bin/sh

capacity=`df $dir|awk 'NR==2{sub("%","",$5);print $5}'`

if [ $capacity -gt 80 ];then
    background="red"

elif [ $capacity -gt 60 ];then
    background="yellow"
elif [ $capacity -gt 50 ];then

    background="black"
else
    background="blue"
fi

osascript << EOF

tell application "Terminal"
    tell window 1
        set background color to "${background}"
    end tell
end tell
EOF

とりあえずこれで df の結果からハードディスクの利用率を見ることができる。

CPUの負荷だったら、uptime の結果を処理すれば可能です。

であとはこれを cron で回すとか screen で backtick 設定するとかするとターミナルの背景色が変更できる。

これだと AppleScript利用しているけど、もっと普通のやり方があったはずなのだけどなー。

追記 : screen版として何かを監視して screen のステータスラインにメッセージを表示するを追記しました。

追記:よく考えると「管理コンソール」の意味が広いからちがっている気がしてきた。Windowsの「管理コンソール」とか、APサーバの「管理コンソール」とか一杯あるから。何かの「管理コンソール」でとにかく色が変更できれば良いってことならそういう製品がないかなーってことなのかもしれないけど。まあこれはこれで役に立つから良いや。

2009年5月27日

Pythonでパフォーマンス計測

Pythonでパフォーマンスチュニングをしたい場合、Python 2.5 以上なのであれば cProfile を利用してまずどこが遅いのかを計測します。

サンプルソースは以下みたいになります。

import cProfile, pstats, StringIO

prof = cProfile.Profile()
# 関数 main() の速度を計測しています
prof = prof.runctx("main()", globals(), locals())

stream = StringIO.StringIO()
stats = pstats.Stats(prof, stream=stream)

# cumulative で sort します
stats.sort_stats("cumulative")
# 上位 80%まで出力します
stats.print_stats(80)

# たとえばこうやると "docuitls" という名前のつく物だけ上位 10 % を出力します
stats.print_stats("docutils", .1)
# 以下2行はオプション

# stats.print_callees("docutils")
#stats.print_callers("rst", .1)
# 結果をログに出力してみます
logging.info("Profile data:\n%s", stream.getvalue())

logging.info の所は計測したい物がフレームワークを利用したプログラムだったりした場合は、プレームワークのログ機能に変更した方が良いかもしれません。

sort_stats の引数に利用できるキーは以下のような物があります。

出力内容に表示される文字の意味
キー名 意味
'cumulative' 累積時間
'file' ファイル名
'module' モジュール名
'pcalls' プリミティブな呼び出しの回数
'line' 行番号
'name' 関数名
'nfl' 関数名/ファイル名/行番号
'stdname' 標準名
'time' 内部時間

cumulative が大きい物ほど処理に時間がかかっています。

pcalls と time を見て pcalls が異常に多いとか time が高い物を探して修正することになります。

2009年4月18日

ブログにソースコードを掲載する方法のメモ

ブログにソースコードを掲載する方法は2006年にブログにコードを貼り付ける方法で悩むの巻が元でいろいろ議論されて結構まとまった記事がネット上にある。

今自分のブログはEmacs Museで生成するとコード部分がpreタグだけなのでpreだけなのだけど、現在の状況を調査してメモしてみる。

まずこれ関連に標準があるかと言うことなのだけれど、おそらく標準と呼べるのはHTML5 W3C Working Draftではないかと思われます。 Working Draftなので確定ではないけれど参考にはなります。

この文書の中で「The code element」がcodeの定義ですが、以下のような記述があります。

The following example shows how a block of code could be marked up using the pre and code elements.

<pre><code>var i: Integer; begin i := 1; end.</code></pre>

A class is used in that example to indicate the language used.

この記述を見るとpreとcodeで囲って、codeにclassを指定するのが良いと読めます。

続いて「The pre element」を見るとこのあたりが詳細に説明されています。 preの目的が以下の様に定義されています。

・Including an e-mail, with paragraphs indicated by blank lines, lists indicated by lines prefixed with a bullet, and so on.
・Including fragments of computer code, with structure indicated according to the conventions of that language.
・Displaying ASCII art.

「Including fragments of computer code」の記述がありますからソースコードに使えってことですね。

「samp」と「kbd」に関しても記述があります。

「samp」がoutputに利用するとのことで、プロンプトの表示などはsampですね。

「kbd」がinputに利用するとのことで、キーのショートカットとか画面に打つ文字とかですね。

これに従うのが良さそうです。

HTMLのエスケープなどはEmacs Museにまかせます。

codeの方にclassを指定すると自分のブログだと不便なのでpreの方にclass指定することにします。 でこんな感じにCSSを設定して、以後はpreとcodeで囲むようにしてみる。


pre.src {
  border: 1px solid gray;
  padding: 4px;
  overflow: auto;
  white-space: pre;
  width: 97.5%;
  cursor: text;
  line-height: 12pt;
  font-family: 'Consolas', 'Bitstream Vera Sans Mono', 'Andale Mono', 'Courier New', Monospace;
  color: #FFFFFF;
  background-color: #555555;
}
*:first-child+html pre.src {
    overflow: scroll;
}

なんかまだまだ変だけどとりあえず後で修正する。Emacs Museの生成コードに修正が必要かもしれない。

2008年11月3日

Mac OS X 10.5(Leopard)でscreenを使う時の注意

結構はまっている人がいるのでメモしておく。 以下みたいなエラーメッセージが出る人向け。
Returning nil _server
Timed out. AquaSKKServer.app didn't get online.
terminate called after throwing an instance of 'exception_CFMessagePortCreateRemote'
  what():  AquaSKK: CFMessagePortCreateRemote() failed
原因はLeopardにインストールされているGNU Screenにあたっているパッチが変。 解決方法は別のscreenをインストールすること。Finkなら以下にする。
sudo fink install screen
これで解決する。