2009年12月28日

.emacs.d の利用

Emacs 22 以上であれば通常 ~/.emacs.d 以下に設定ファイルやライブラリ類を集めるのが良いです。

~/.emacs.d を利用すれば .emacs や .emacs.el を作成しなければ ~/.emacs.d/init.el を利用することができます。

ライブラリ類を集めようとすると、ディレクトリを作成することが多いと思いますが、そのままだと load-path が通りません。

例えば .emacs.d/lisp に load-path を通したい場合は以下のようにすると良いでしょう。

(let ((default-directory (expand-file-name "~/.emacs.d/lisp")))
  (add-to-list 'load-path default-directory)
  (if (fboundp 'normal-top-level-add-subdirs-to-load-path)
      (normal-top-level-add-subdirs-to-load-path)))

normal-top-level-add-subdirs-to-load-path はディレクトリ内のサブディレクトリを load-path に追加します。

ディレクトリ内に置いておきたいが、 load-path に追加したくない場合は以下の制限を利用すれば良いでしょう。

  • 英数字以外で始まるディレクトリは読み込まない
  • RCSCVS という名前のディレクトリは読み込まない
  • .nosearch というファイルを含むディレクトリは読み込まない

例えば、フォルダの名前の先頭に「_(アンダーバー)」や「.(ピリオード)」を付与すれば良いでしょう。

さて、.emacs.d 内のディレクトリ構成をどうするかは悩みの種のようです。あまり共通化されていない様子。

~/
  .emacs.d/
    init.el

までは定型として、その下にどのようにディレクトリ構成を切るか、ということです。

最低限必要そうなのは以下のディクトリでしょうか。

  1. init.el を分割した、初期設定ファイル
  2. 他者配布の Emacs Lisp 類
  3. 自分作成の Emacs Lisp 類

1 に使えそうな名前は以下な感じでしょうか。

  • pref
  • prefs
  • conf
  • site-start.d
  • init.d
  • rc.d

2、3 に使えそうな名前は以下な感じでしょうか。

  • elisp
  • lisp
  • site-lisp
  • vendor
  • plugin
  • lib
  • libs

以下は個人的な選択方法。

init.d だと補完の時に init.el と重なるのであまり便利ではないですね。rc.d も Emacs Lisp を入れるディレクトリ名としては微妙な気がします。

pref や conf は Emacs 関連の文書にほとんど出てこないようです。 pref だと prefix、conf は cond と微妙にぶつかるからかもしれません。

elisp という名前は Elisp というプログラミンング言語が別にあるので避けています。 site-lisp という名前にすると Emacs Lisp を make でインストールする時に prefix 指定するだけでインストールできるので楽だったので、site-lisp が良いかなーと思ったのですけど、 init.el と init.d みたいに site-start.d とぶつかるのですよね。

ということで、今の所以下のような構成にしてみています。.emacs.d だけコピーするとほとんどの環境で同じに動作することを想定しています。

まだ試行錯誤中で整理しおわったら公開しようと思います。

~/
  .emacs.d/
    init.el
    site-start.d
      init-*.el
      … init.el から読みこむ起動設定ファイル
    lisp
     … 他者が配布している Emacs Lisp
    local-lisp
     … 自分で作成した Emacs Lisp やなんらかの理由で公式配布のバージョンから修正してある Emacs Lisp
    private
     … 公開しないファイル類など
    rc.d
     … zshrc 等の rc ファイルがはいっていて ln -s している。結局 Emacs との連携を考えるのでまとめた
    bin
     … Emacs Lisp のみから呼ぶことを想定して作成してあるスクリプト等
    share
      dtd
      rnc
      icons
      skk
      man
      info
      … Emacs Lisp が利用する固定(基本いじくらない)リソース
    etc
     snippets
     rst
     … Emacs Lisp が利用する可変(基本いじる)リソース
    var
     … キャシュファイルやバックアップファイル用

参考サイト

2009年12月12日

Optional Arguments と Named Arguments

オプション引数(Optional Arguments)と名前付け引数(Named Arguments)は似ているようでまったく違う機能です。

オプション引数は引数を省略可能にする機能で、名前付け引数は引数の名前を指定して値を渡すことができる機能です。

Python では

def info(text, opt=30):
    print "text=%s , opt = %d" %(text, opt,)

のような関数を定義した場合、以下のような関数の呼びだしが可能です。

info('hello')
info('hello', 20)
info(opt=40, text='world')

1番目と2番目がオプション引数の例、3番目が名前付け引数の例になります。

これと同じことができる言語は、Visual Basic や OCaml、Scala( http://www.scala-lang.org/node/2075 ) 等いくつか存在しています。

オプション引数しかできない言語も結構ありますし、オプション引数すら不可能な言語もそれなりにあります。 JavaScript 2.0 なんかは草案時には名前付け引数があったのだけど、見送られた様子。

オプション引数、名前付け引数のいずれに関しても好まない人もいるようですが使い方次第だと思っています。 当然のごとく、この機能がないとしても公開する API の引数の名前や順序は明確に綺麗に書くべきだと思います。

2009年11月21日

Snow Leopard に GHC 6.10.4 のインストールから cabal-install の動作まで

GHC は以下から取得して普通にインストールする。

http://www.haskell.org/ghc/download_ghc_6_10_4.html#macosxintel

このままだと ghc が完全には 64bit に対応していないため上手く動作しません。以下の変更をします。

/usr/bin/ghc を vi 等で開きます。内容は以下になっています。

#!/bin/sh

exec /Library/Frameworks/GHC.framework/Versions/610/usr/lib/ghc-6.10.4/ghc -B/Library/Frameworks/GHC.framework/Versions/610/usr/lib/ghc-6.10.4/. -dynload wrapped ${1+"$@"}

シェルスクリプトです。

これに -optl-arch\ i386 -optc-m32 -opta-m32 -optl-m32 フラグを追加することで 32bit 固定設定にします。

#!/bin/sh

exec /Library/Frameworks/GHC.framework/Versions/610/usr/lib/ghc-6.10.4/ghc -optl-arch\ i386 -optc-m32 -opta-m32 -optl-m32 -B/Library/Frameworks/GHC.framework/Versions/610/usr/lib/ghc-6.10.4/. -dynload wrapped ${1+"$@"}

また /usr/bin/runhaskell も同様のフラグを付与しておきます。

#!/bin/sh
exec /Library/Frameworks/GHC.framework/Versions/610/usr/lib/ghc-6.10.4/runghc -f /Library/Frameworks/GHC.framework/Versions/610/usr/bin/ghc ${1+"$@"}
#!/bin/sh
exec /Library/Frameworks/GHC.framework/Versions/610/usr/lib/ghc-6.10.4/runghc -f /Library/Frameworks/GHC.framework/Versions/610/usr/bin/ghc -optl-arch\ i386 -optc-m32 -opta-m32 -optl-m32 ${1+"$@"}

基本的にはこれで問題ありませんが このままだと cabal-install tool が動作しません。

cabal-install が使えないと Perl で cpan が使えないのと同じですから GHC の威力がかなりへってしまいます。

cabal-install は HTTP パッケージと zlib パッケージに依存していますのでこの二つをインストールします。

ここでは ユーザディレクトリにインストールします。 $HOME/.cabal 以下にすべてのライブライがインストールされます。

curl -O http://hackage.haskell.org/packages/archive/HTTP/4000.0.8/HTTP-4000.0.8.tar.gz
tar xvfa HTTP-4000.0.8.tar.gz
cd HTTP-4000.0.8
runhaskell Setup.lhs configure --ld-options="-arch i386" --gcc-option=-m32 --user
runhaskell Setup.lhs build
runhaskell Setup.lhs install
cd ../
curl -O http://hackage.haskell.org/packages/archive/zlib/0.5.2.0/zlib-0.5.2.0.tar.gz
tar xvfz zlib-0.5.2.0.tar.gz
cd cd zlib-0.5.2.0
runhaskell Setup.hs configure -p —ld-options="-arch i386" —gcc-option=-m32 --user
runhaskell Setup.hs build
runhaskell Setup.hs install
curl -O http://haskell.org/cabal/release/cabal-install-0.6.2/cabal-install-0.6.2.tar.gz
tar xvfz cabal-install-0.6.2.tar.gz
cd cabal-install-0.6.2
runhaskell Setup.hs configure -p —ld-options="-arch i386" —gcc-option=-m32 --user
runhaskell Setup.hs build
runhaskell Setup.hs install
# cabal のデータベースを更新します
~/.cabal/bin/cabal update

とりあえず動作確認のために pandoc をインストールしてみます。

pandoc を flags=highlighting でインストールします。pcre-light に依存しており、 pcre-light は pcre に依存しています。 ここでは pcre.h は fink の物をとりあえず利用しています。

あと日本語というか UTF-8 等を便利にあつかうために他にもいろいろ入れています。

~/.cabal/bin/cabal install utf8-string
~/.cabal/bin/cabal install zip-archive
~/.cabal/bin/cabal install pcre-light --extra-include-dirs=/sw/include
~/.cabal/bin/cabal install pandoc --flags=highlighting

エラーなくインストールできれば成功です。~/.cabal/bin に PATH を通しておくと便利です。

hg st や hg diff のColor表示

.hgrc 等に以下を記述すると全体的に色がつきます。

[extensions]
color=

これは Color Extension を設定しています。基本的にはこれでほとんどの場合で色が付与されます。

色のカスタマイズをしたければ .hgrc に以下のように色設定を書きます。

[color]
status.added = green bold
diff.deleted = red

細かい設定は Color Extension に記述があります。

これで hg st や hg diff で色が表示されます。

ただ hg diff などは長くなって less をしたくなるでしょうが、less -r しても色は付きません。

Mac OS X 10.6 等の場合は .bash_profile にでも以下のような alias を設定すると良いでしょう。

alias -g V="| /usr/share/vim/vim72/macros/less.sh"

以下のように利用します。

hg diff V

V を付与すると Vim の less.sh マクロの効果で色が付いて表示されます。操作感は less と同じになります。

2009年11月18日

Mac OS X での Universal Binary で ライブラリ非対応 architecture のバイナリを生成しない方法

例えば Python の easy_install や MacPorts、Fink等の自動インストール系ツールを利用した場合以下のようなエラーが発生することがあります。

ld: warning: in //usr/lib/bundle1.o, missing required architecture ppc64 in file
ld: warning: in //usr/lib/libgcc_s.10.5.dylib, missing required architecture ppc64 in file
ld: warning: in //usr/lib/libSystemStubs.a, missing required architecture ppc64 in file
ld: warning: in //usr/lib/libSystem.dylib, missing required architecture ppc64 in file
ld: symbol dyld_stub_binding_helper not defined (usually in crt1.o/dylib1.o/bundle1.o) for architecture ppc64

これはリンクしようとしているライブラリが ppc64 に対応していないにもかかわらず、ppc64対応バイナリを生成しようとするために発生しています。

この場合は 環境変数に ARCHFLAGS を設定することで回避します。

export ARCHFLAGS='-arch i386 -arch x86_64 -arch ppc'

リンクするライブラリによっては当然 ppc 非対応だったりするため ARCHFLAGS の内容を変更してください。

2009年11月11日

Mac OS X 10.6 で Goをコンパイルして動作させてみた

Google が 11/10 に新言語 Go を発表したので取り敢えず動作させてみました。

難しいことはなにもない。とりあえず 32bit でコンパイルしたけど、64bitでもコンパイル可能です。テストが一部通過しない物があるみたいですが、後で調べます。

以下の手順でコンパイルと動作確認しました。ソースの取得には Mercurial が必要です。

export GOROOT=/path/to/go
export GOOS=darwin
export GOARCH=386
hg clone -r release https://go.googlecode.com/hg/ $GOROOT
cd $GOROOT/src
./all.bash
cat >hello.go <<EOF
package main
import "fmt"
func main() {
   fmt.Printf("hello, world\n")
}
EOF
8g hello.go
8l hello.8
./8.out

この他にも基本的な物を動作させてみたけど、文法は簡単ですしライブラリもそれなりにあります。

言語的には Limbo とかの影響下にあるように見えるけど、まだちゃんとさわってないので不明です。

2009年10月12日

RFC の雑学

@nezike「メールなどで使う署名なんですけれどまぁよく----------------とか**********が使われますよね。ところで最近--だけとか使っている人がいるんですけれど流行ってるの?」 とつぶやいたので 「署名に -- を利用するのはRFCに記述があります」 と返しました。

@totte「RFC‥」 とつぶやき ふぁぼ てくれたりしています。

このやりとりで案外こういうのは知られていなかったりするのだな、と思ったのでメモとして RFC に記述のあるこんな感じの利用者側に影響のありそうな雑学で結構有名な物を書いてみます。

前提として RFC の記述はあくまでお願いの範囲であり、強制ではないことを一言付けくわえておきます。

署名の区切り

メール等の署名に関しては RFC 3676 (RFC 2646 の更新版) 、「4.3.Usenet Signature Convention」に記述があります。

タイトルから分かるようにメールの署名ではなくネットニュースでの署名の区切りに関する記述ですが、メールでも利用されています。

There is a long-standing convention in Usenet news which also commonly appears in Internet mail of using "-- " as the separator line between the body and the signature of a message. When generating a Format=Flowed message containing a Usenet-style separator before the signature, the separator line is sent as-is. This is a special case; an (optionally quoted or quoted and stuffed) line consisting of DASH DASH SP is neither fixed nor flowed.

署名の区切は「ダッシュ2つ+スペース(DASH DASH SP)」にしてほしい旨が記述されています。

ThunderbirdやGmailはこの規定を利用していて、署名に自動的に付与してくれたり、著名を引用しなくしたり等様々な処理をしてくれます。

この文書では他にも「4.2.Generating Format=Flowed」に一行の長さの目安、「4.5.Quoting」に引用記号(「>」)の利用方法等メールで一般的にルールとして適用されている項目が記述されています。

例示に利用を推奨するドメイン名

RFC 2606 に予約されているドメインとして記述があります。

TLD は以下が予約されています。

.test
.example
.invalid
.localhost

.com などの実際のTLDで利用したい場合は以下が予約されています。

example.com
example.net
example.org

予約されているというのは存在しないことを意味しません。よってping等は帰ってきます。

どうしても .jp を利用したい場合はRFCではなく 汎用 JP ドメイン名における予約ドメイン名 に記述があります。

"EXAMPLE","ドメイン名例"
"EXAMPLE"の後に1桁の数字("0"から"9")がつく文字列

メールの送信テスト等で実在するアドレスに送信してしまう事故を防ぐことが可能ですし、blogの記事等で偶然記述したメールアドレスが実在のものであるなんてこともなくなります。

例示に利用を推奨するIPアドレス

IPv4 に関しては RFC 3330 に記述があります。

192.0.2.0/24 - This block is assigned as "TEST-NET" for use in documentation and example code. It is often used in conjunction with domain names example.com or example.net in vendor and protocol documentation. Addresses within this block should not appear on the public Internet.

「192.0.2.0/24」の範囲を利用すれば良いわけです。

IPv6 に関しては RFC 3849 に記述があります。

IANA is to record the allocation of the IPv6 global unicast address prefix 2001:DB8::/32 as a documentation-only prefix in the IPv6 address registry. No end party is to be assigned this address.

「2001:DB8::/32」の範囲を利用すれば良いわけです。

このIPを利用すれば「そのアドレスを利用しているのは私だ事件」のようなトラブルにまきこまれることはありません。

RFC に限らずこの手の記述がある文書が結構あったりします。知っておくと結構役に立つんぢゃないでしょうか。

2009年9月26日

identi.ca の Twitter 互換 API

identi.ca には Twitter 互換 API が実装されているのですが、日本語ではあんまり情報が無いみたいなのでメモしておきます。

identi.ca の API 仕様は http://status.net/wiki/TwitterCompatibleAPI?source=laconica に記述があります。XML と JSON で提供されています。

JSONの主要な物だけここでは書いておきますが、XMLも同じです。

Twitter 互換 API(json)
API Methods API endpoint
statuses/show https://identi.ca/api/statuses/show/###ID###.json
statuses/update https://identi.ca/api/statuses/update.json
statuses/user_timeline https://identi.ca/api/statuses/user_timeline.json

他の物も基本 Twitter と同じになっています。Twitter の API 文書は http://apiwiki.twitter.com/Twitter-API-Documentation にあります。

またAPIではありませんが、Webで見れる情報を取得できるのが以下のURLになります。

identi.ca 主要URL
Methods URL
home https://identi.ca/###USERNAME###
statuses/friends https://identi.ca/notice/###STATUS###
search/hashtag https://identi.ca/###HASHTAG###

identi.ca は PHP で作成されたオープンソースなプロダクトで作成されています。

最新版は http://status.net/wiki/Source からダウンロードできます。会社内とか自宅とかで Twitter のような物を構築したい場合利用してみると良いのではないでしょうか。

2009年9月23日

Cyberduck 3.3b3 が起動するけどウィンドウが出ない件

2009/09/21にリリースされた Cyberduck 3.3b3 ですが Snow Leopard 利用者がアップデートすると起動はするけれどもウィンドウが表示されません。

Cyberduck の beta 版は http://update.cyberduck.ch/beta/ 以下に置いてありますので、ウィンドウが表示されない人は、 3.3b2 等の旧バージョンを取得して上書きすると良いでしょう。

原因ですがバグで現在 nightly build で修正されていますので次のリリースでは問題ないでしょう。

2009/10/12追記:2009/10/09にリリースされた Cyberduck 3.3b4 にてこの問題は解消されています。
一部の人が 3.3b4 を起動すると接続先に接続しに行く問題(?)が発生しているようですが、設定を確認してください。
環境設定の「一般」に「接続先を記憶し、再起動後に接続」という設定が存在しますので、チェックを外してください。

2009年9月22日

tubuyakix.user.js に identi.ca 投稿機能をつけてみた

  • 公開場所: 紹介マニア
  • ライセンス:GPL2 もしくはそれ以降
  • 動作確認環境:Firefox3 + Greasemonkey 0.8.20080609.0 以上

Twitter、Wassrへの投稿に対応したグリモンのtubuyakix.user.jsに identi.ca への投稿機能をつけてみました。

identi.ca は1年前とかに一時的に話題になったけど、日本語への対応が微妙だったこともあってすぐに日本人の利用者が利用しなくなってしまったサービス。
現在は日本語に比較的まっとうに対応しています。

twitter 互換 API が存在するので nowa が閉鎖されたかわりに投稿機能に対応してみました。

おためしください。

2009年9月12日

Snow Leopard で mod_wsgi を設定する

Snow Leopard で mod_wsgiをコンパイルして動作させてみます。

curl -O http://modwsgi.googlecode.com/files/mod_wsgi-3.0c4.tar.gz
tar xvfz mod_wsgi-3.0c4.tar.gz
cd mod_wsgi-3.0c4
./configure

もし Python2.6.2 を独自インストールしている場合は Makefile の修正が必要です。以下の修正を実施しないと、デフォルトでインストールされている 2.6.1 の方を参照しようとします。

--- Makefile.org        2009-09-12 20:35:02.000000000 +0900
+++ Makefile    2009-09-12 20:35:44.000000000 +0900
@@ -20,8 +20,8 @@

 CPPFLAGS =  -I/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -DNDEBUG
 CFLAGS =  -Wc,'-arch x86_64' -Wc,'-arch i386' -Wc,'-arch ppc7400'

-LDFLAGS =   -L/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/config  -arch x86_64 -arch i386 -arch ppc7400
-LDLIBS =  -lpython2.6 -ldl
+LDFLAGS =   -L/Library//Frameworks  -arch x86_64 -arch i386 -arch ppc7400
+LDLIBS =  -framework Python -ldl

 all : mod_wsgi.la

コンパイルしてインストールします。

make
sudo make install

Apache の設定ファイルにモジュール設定を記述します。特にこだわりがないなら「/etc/apache2/httpd.conf」に追加してください。

LoadModule wsgi_module libexec/apache2/mod_wsgi.so

Trac を wsgi で動作させてみます。

「/Users/ユーザ名/Sites/trac/index.wsgi」として以下のようなファイルを作成します。

import sys
sys.stdout = sys.stderr

import os
os.environ['TRAC_ENV_PARENT_DIR'] = "/path/to/trac"
os.environ['PYTHON_EGG_CACHE'] = '/path/to/trac/eggs'

os.environ["HGENCODING"] = "UTF-8"

import trac.web.main

application = trac.web.main.dispatch_request

「/private/etc/apache2/other」以下に「wsgi.conf」のファイル名で以下のようなファイルを作成します。

WSGIScriptAlias /trac /Users/ユーザ名/Sites/trac/index.wsgi


<Directory /Users/ユーザ名/Sites/trac>
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>

設定ファイルの文法が正しいことをチェックします。

apachectl configtest

Apache を再起動します。

sudo apachectl restart

「http://localhost/trac」にアクセスして動作が確認できれば成功です。

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の生成コードに修正が必要かもしれない。