2009年5月30日

何かを監視してターミナルの色を変更する(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
これで解決する。

2008年10月25日

Terminal上でのPythonのコード補完

コードの補完ができると結構便利です。
コード補完の設定は Python チュートリアルのキー割り当て に記述があります。
readlineの機能を利用します。
$HOME以下に.pystartupのような名前で以下のファイルを作成します。

import atexit
import os
import readline
import rlcompleter

historyPath = os.path.expanduser("~/.pyhistory")

def save_history(historyPath=historyPath):
    import readline
    readline.write_history_file(historyPath)

if os.path.exists(historyPath):
    readline.read_history_file(historyPath)

atexit.register(save_history)
readline.parse_and_bind('Tab: complete')
# Mac OS X 10.5(Leopard)のデフォルトの場合のみ以下
# readline.parse_and_bind ("bind ^I rl_complete")

del os, atexit, readline, rlcompleter, save_history, historyPath
.bashrc等に以下を記述します。
export PYTHONSTARTUP=${HOME}/.pystartup
Mac OS X 10.5(Leopard)のreadlineはGNU readlineでないです。
GNU readlineと同様の動作にしたい場合は他からGNU readlineをインストールする必要があります。
Finkの場合は readline5-shlibs をインストールした後で Python の readline モジュールをインストールする必要があります。
sudo fink install readline5-shlibs
curl -o http://pypi.python.org/packages/source/r/readline/readline-2.5.1.tar.gz
tar zxvf readline-2.5.1.tar.gz
cd readlien-2.5.1
sudo python setup.py install
ためしにPythonインタプリタをTerminalで起動して以下の動作をためしてみてください。
import os
os.<TAB>
コード補完が効くようになります。

2008年10月18日

Alert! Cover was previously removed.

久しぶりにDellサーバのメモリ交換とかやったら「Alert! Cover was previously removed.」とか出た。
なんだっけ?という感じになってしばらく悩んでしまったのでメモしておく。
これはメモリ交換なんのためにカバーを開けた後で発生する警告メッセージ。
起動すると「F1でSKIP起動するかF2で設定しやがれ」という警告がでる。
F2で設定しないと毎回警告でやがるので、F2で設定することに。
設定の「System Security」で「Chassis Intrusion」を選択し、「Disabled」になっているのを「Enabled」か「Enabled-Silent」に変更すれば警告はでなくなる。

カバー開けたら設定しないとけいないので注意。

2008年10月6日

Mac OS X 10.5 で crochet を動かしてみる

crochetとは@showyouが作成している、Twitter用クライアント。
Pythonで作成されている。

以前も動作させたことがあるのだけどメモってなかったので今回は動かすまでをメモしておく。
参考にするサイト
crochet紹介 - Showyou@hatena Mac で crochet というか wxPython で作られたアプリを動かすお話 - yano3の日記
wxPythonのインストール
http://sourceforge.net/projects/wxpython/
http://downloads.sourceforge.net/wxpython/wxPython2.8-osx-unicode-2.8.9.1-universal-py2.5.dmg

バイナリなのでダブルクリックすれば良い。
simplejsonのインストール
http://code.google.com/p/simplejson/
http://pypi.python.org/pypi/simplejson

tar xvfz simplejson-2.0.1.tar.gz
cd simplejson-2.0.1
sudo python setup.py install
PILのインストール
http://www.pythonware.com/products/pil/
tar xvfz Imaging-1.1.6.tar.gz
cd Imaging-1.1.6
sudo python setup.py install
crochet
svn export -r HEAD http://svn.coderepos.org/share/lang/python/crochet
cd crochet
.chat/twdata の中にユーザ名とパスワードを設定して起動する。
./chat_all.py
起動して、投稿まではできた。

で、本当の目的は
エラー - showyouの日記とhamaの成長記録 - はてなグループ::ついったー部
に記述のある内容の再現と調査だったのですが、こういう時にかぎって再現しねー
AquaSKKが起動してると落る現象と、終了するとPy_Finalizeよばれる所でエラーの出る現象は出たけどcrochetの問題ではないような。
とりあえずしばらく動作させないと再現しなそう。