jed Editorの設定メモ

CentOSOSX で開発するようになってから軽量なemacsクローンのテキストエディタとしてjed を愛用しています。
Windows(7/XP) から putty経由でCentOSまたはOSXsshでログインし、screenの中でjedを立ち上げて作業しています。
これまで、いくつか設定に詰まった所がありましたので、以下にメモしておきます。

  • CTRL+HでBackspaceが効くようにしたい

デフォルトではCTRL+Hを入力するとヘルプが表示されてしまって困るので、~/.jedrc に

local_setkey ("backward_delete_char","^H");

と書くと編集バッファにおいてはBackspaceになります。が、ミニバッファ(最下行の入力行)で相変わらずヘルプが開いてしまい完全には解決できていません。
本家サイトのFAQによるとsttyの設定をちゃんとするのが正しい解決のようですが、それでもうまくいかない時は~/.jedrcに

map_input (8, 127);

と書けばよいようです。(この時、上のlocal_setkey()は不要です)

  • UTF-8 の文字が文字化けする

CentOSでは普通にUTF-8の文字が表示・入力できていたのですが、OSXでは文字化けしてしまいしばらく困っていました。ようやく解決策を見つけることができましたが、screenも絡んでいたとは気づきませんでした…。
screen と jed の双方で設定が必要です。
まず、~/.screenrcに以下の2行を追加します。(参考: ガク・ネットさんのscreenメモ)

defencoding utf-8
encoding utf-8 utf-8

次に、環境変数JED_UTF8を以下のようにセットします。私の場合は~/.profile等に書きました。(参考: jedソースアーカイブ付属のdoc/txt/utf8.txt)

export JED_UTF8=FORCE

これでOSXでも普通にUTF-8の日本語が表示・入力できるようになりました。

Qt Creator でデバッグ実行が動かない問題

先日から Qt Creatorデバッグ実行をしようとすると、こんなダイアログが表示されて全くデバッグできない、という問題に悩まされていました。

デバッグを楽に進めたくて IDE を使っているのにデバッグ実行ができないなんてあんまりです(苦笑)。
あれこれ状況を調べたところ、以下の事がわかりました。

  • Qt Creator をいったんアンインストールして再びインストールしても再現する→自分が知らないうちに Qt Creator の環境を壊した訳ではなさそう
  • 職場の PC に Qt Creator を入れて試しても発生しない→環境依存の問題と思われる
  • Qt Creator 付属のサンプルでも同じ現象が起きていた→自分のソースコードの書き方の問題ではなさそう
  • コマンドラインから直接 mingwgdb を実行してデバッグしようとしても再現した→ QtCreator 固有の問題ではなく mingwgdb を使う状況で起きる模様

これらの情報を頼りにあちこち検索してみると、同じような状況に出くわした人の記事が見つかりました。

前者を参考にビデオカードドライバを最新に上げてみても状況は変わりませんでしたが、後者を参考に Avira AntiVir をアンインストールすると無事デバッグ実行できるようになりました。代わりに AVG Free をインストールしましたが、こちらでは特に問題は起きていません。

Hibernate で名前が同じ複数のクラスに対して O/R マッピングする

org.foo.bar.Preference というクラスと org.blah.hoge.Preference というクラスがあるときに、それぞれをデータベースに保存できるようにしようとして散々ハマったので書いて起きます。
名前空間が異なるので一見問題なさそうに思えるんですが、実際にこれをやろうとすると tomcat 起動時にマッピングファイルが読み込めないという不具合が発生して悩まされていました。過去に遭遇したときは、時間もなく対策が見つけられなかったためクラス名が衝突しないように名前を変更して対応*1していました。が、今回さすがに業を煮やして eclipse 上のデバッガで追いかけてみたところ、握りつぶされていた Exception の内容を見ることができました。

org.hibernate.DuplicateMappingException: duplicate import: Preference refers to both org.foo.bar.Preference and org.blah.hoge.Preference (try using auto-import="false")

確かに衝突していました。またその対応策に auto-import なるものがあるようです。Hibernate のリファレンス によると、

auto-import (optional - defaults to true): specifies whether we can use unqualified class names of classes in this mapping in the query language.

クエリの中で無資格のクラス名が使えるようにする、とあるので名前空間が省略されたクラスに対して自動的に補完でもしてくれるんでしょうか。これを禁止したい時は、双方のマッピングファイル(手元の環境では src/org/foo/bar/Preference.hbm.xml と src/org/blah/hoge/Preference.hbm.xml)の中で以下のように書けばよいようです。

<hibernate-mapping auto-import="false">
...
</hibernate-mapping>

これで tomcat は無事起動でき、2つのクラスがどちらもデータベースに保存できるようになりました。
というか、そもそもデフォルトの設定が auto-import="true" というのが何とも納得が行きません…。初心者にとっては優しいのかもしれませんが、後々 O/R マッピングの数が増えてきた頃にハマることは必至です。デフォルトを false にして名前空間までちゃんと書く癖を付けさせた方がいいのに…と思ってしまいました。

*1:多数のjavaソースやxmlファイルに変更が及んで大変

そんなことせんでも最初から cygpath.exe があるじゃなイカ!

Zinnia さんのコメントにより cygwin 環境にはパスの変換を行う cygpath.exe なるコマンドがあることを知りました。そりゃそうか…ということでこちらを使った版も掲載しておきます。

#!/bin/sh
SCRIPTDIR=`dirname $0`
SCRIPTDIRWIN=`cygpath -m $SCRIPTDIR`
java -jar $SCRIPTDIRWIN/libs/validateXML-1.1-bin.jar -verbose -in $1

この場を借りて感謝します。ありがとうございました。

cygwin 環境の シェルスクリプトで Windows 形式のパスを得る方法

java で動作する XML チェッカー validateXML を使おうとしてつまづいたので書いておきます。

パスの表記は Windows 環境では「c:\foo\bar\」または「c:/foo/bar/」のように書きますが、cygwin 環境では「/cygdrive/c/foo/bar」のように書きます。これはシェルスクリプト上で pwd などのコマンドが返してくるパス名も同様です。cygwin 環境のプログラムに渡すだけなら全く問題ないんですが、今回は自前でインストールした java.exe を使う必要があり、当然ながら cygwin 形式のパス表記は理解してもらえません。変換する方法をちょっとググった程度では見つけられなかったので自分で書いてみました。

validateXML を置いたディレクトリ構造は以下を想定しています。

  • ./validateXML.sh
  • ./libs/validateXML-1.1-bin.jar

そして validateXML.sh の中身が以下のようになります。

#!/bin/sh
SCRIPTDIR=`dirname $0`
SCRIPTDIRWIN=`echo $SCRIPTDIR | sed -e 's|/cygdrive/\(.\)|\1:|g'`
java -jar $SCRIPTDIRWIN/libs/validateXML-1.1-bin.jar -verbose -in $1

$SCRIPTDIR に cygwin 形式のパスが、$SCRIPTDIRWIN に WINDOWS 形式のパス名が入ります。

まあこれだけなんですが…もし同様につまづいた方の参考になれば幸いです。というか、「それ○○でできるよ」的な方法があるに違いない…。orz

C++Builder2009 Boost Update の更新内容

Boostライブラリアップデートですが、どこが変わったのでしょうか?

#include 
std::cout << BOOST_LIB_VERSION << std::endl; //=>1_35

なので、バージョンは変わっていないようです。
使えるライブラリが増えたのでしょうか?

Update2 時点のものと更新後の boost ヘッダの diff を取ってみましたが、残念ながら新たなライブラリは追加されてないようです。あくまでヘッダの範囲ですが、確認できた変更は以下の 2 点でした。

  • コンパイラバージョンの更新(6.10→6.13)に合わせてBOOST_TESTED_AT(0x610) が 0x613 に変更されている
  • 何箇所か #include が追加されている(これの意味する所は未確認)

個人的には何かの間違いで gil が入ったらいいなー…と wktk してましたが、

trunk の回帰テスト結果によると bcc は全滅ですね。orz
どうやらこれは必要に感じた人が自分でバンバンしろ…ということなのかも知れません…。