scim-bridge.el version 0.8.1 リリース

ダウンロードはこちらでどうぞ↓
scim-bridge.el - irie @ ウィキ - アットウィキ
または
scim-bridge.el in Launchpad
LaunchpadのPPAにdebパッケージが置いてあります。
https://launchpad.net/~irie/+archive/elisp
version 0.8.0からの変更点

  • 内部オプションscim-incompatible-major-modesの追加
  • scim-cursor-type-for-candidateのデフォルト値を`bar'に変更
  • scim-put-cursor-on-candidateのデフォルト値をtに変更
  • ソケットのオープンまたはIMコンテクストの登録に失敗した場合にscim-modeをoffにするように変更
  • プロセスが異常終了してリスタートするときにメッセージを表示するようにした
  • GUIセットアップユーティリティーでの設定変更時にscim-modeをリスタートするように変更
  • プロセスバッファから認識不能なメッセージを読み込んだ場合、その全体を表示するようにした
  • プリエディットが変更されずカーソル移動のみの場合に、書き直さないようにした
  • かな入力方式で、環境によっては「ろ」が入力できない場合があった不具合を修正
  • SCIM-Bridgeから受動的にシグナルを受け取った場合にpost-command-hookが発動しない不具合を修正
  • コールバック関数中でエラーが起こるとキューがクリアされずに再度実行されてしまう不具合を修正
  • yasnippetを使用すると無限ループが起こることがある不具合を修正
  • scim-modeの終了時にscim-bridge-socket-alistがクリアされない不具合を修正
  • scim-chewingがプリエディットの外にはみ出たアトリビュートを返すために表示が乱れる問題に対応
  • scim-skkアノテーション表示時に間違ったアトリビュートとカーソル位置を返すために表示が乱れる問題に対応
  • anything.elを使用するとpost-command-hookが不正にクリアされる問題に対応
  • IMコンテクストの作成のリクエスト時に、別のシグナルを受け取るとIDが登録できなくなる不具合を修正
  • Alt+変換 のキー入力が認識できない不具合を修正

項目数が多いですが、ほとんど不具合の修正です。scim-cursor-type-for-candidateとscim-put-cursor-on-candidateのデフォルト値を変更しましたが、これは従来の値だとscim-pinyinやscim-chewingで好ましくない挙動になってしまうことに気付いたためです。

ibus.el version 0.1.0 リリース

Emacs用のIBusクライアントを作りました。これでSCIMが絶滅しても安心ですね。
ダウンロードはこちらでどうぞ↓
ibus.el - irie @ ウィキ - アットウィキ
または
ibus.el in Launchpad
LaunchpadのPPAにdebパッケージが置いてあります。
https://launchpad.net/~irie/+archive/elisp
誰も作ろうとしないのか、作りたくてもできなかったのかよくわかりませんけど、結局私が作ることになってしまいました。まあほとんどscim-bridge.elのコードを流用しているので、あまり労力は要りませんでしたけど。
というわけで、使い方はscim-bridge.elとほとんど同じです。ただし、Pythonで書いたヘルパースクリプトibus-el-agent)も一緒にインストールしてください。ibus.elと同じディレクトリに突っ込めば大丈夫なはずです。あと、Keysym→Keycode変換のためにpython-xlibモジュールを使いますのでインストールしておいてください。もちろん、PPAに置いてあるdebパッケージを使えばこれらの設定は自動でやってくれます。
まだ出来立てのソフトなので、いろいろバグがあるでしょうけど、怒らずに上記のLaunchpadの方に報告してくださいませ。
追記:ibus-el-agentのバージョン番号が0.0.2.62になっていますが、本当は0.1.0です。直し忘れていました。あと、「(c) 2009」は「(c) 2010」の誤りです。

scim-bridge.el version 0.8.0 リリース

ダウンロードはこちらでどうぞ↓
scim-bridge.el - irie @ ウィキ - アットウィキ
または
scim-bridge.el in Launchpad
LaunchpadのPPAにdebパッケージが置いてあります。
https://launchpad.net/~irie/+archive/elisp
version 0.7.5からの変更点

  • debパッケージのビルドのためのファイルを同梱
  • 複数ディスプレイ環境のサポートを追加
  • `read-from-minibuffer'の引数IHERIT-INPUT-METHODを有効化
  • 入力フォーカスの他フレームへのリダイレクトに対応
  • 文字入力に対するアンドゥの長さを20文字毎ではなく20カラム毎に変更
  • describe-keyの結果に元のキーバインドが反映されるように変更
  • auto-complete-modeの曖昧補完のカーソル色を上書きしないように修正
  • エラー発生時にscim-modeが安全に終了するように修正
  • yasnippetのバージョン0.6のフィールド内での入力が正常にできるように修正
  • `query-replace'が開始直後に終了してしまう不具合を修正
  • GUIセットアップユーティリティーの使用後、キーマップが無効化されてしまう不具合を修正
  • ポイント位置の座標計算部分を再実装

最大の変更は複数ディスプレイの対応とINHERIT-INPUT-METHODの有効化で、IMコンテクストを管理する部分のコードをだいぶ書き直しました。IMコンテクストの情報は全てscim-buffer-group-alistというグローバル変数に入っていて、その変化を観察すると面白いかもしれません。この変更により、ローカルとリモートの両方にXのフレームを表示させるような使い方が可能なはずです。下から2番目のGUIセットアップユーティリティー関連のバグは、前バージョン(0.7.5)で新に作ってしまった物です。これは結構大きい不具合なので、さっさと0.8.0に移行した方がいいでしょう。

scim-bridge.el version 0.7.5 リリース

ダウンロードはこちらでどうぞ↓
scim-bridge.el - irie @ ウィキ - アットウィキ
または
scim-bridge.el in Launchpad
LaunchpadのPPAにdebパッケージが置いてあります。(3/4 追記)
https://launchpad.net/~irie/+archive/elisp
version 0.7.4からの変更点

  • Emacs23のdaemonモードに対応した
  • ansi-term(term.el)に対応した
  • undo-tree.elに対応した
  • Emacs23.1.92でのバイトコンパイル時に`save-excursion'云々の警告が出ないようにした
  • 何らかのエラーで`post-command-hook'が解除された場合に、フックを修復するか(あるいはscimモードを抜けるか)を尋ねるようにした
  • ウィンドウマネージャから`_NET_ACTIVE_WINDOW'などのプロパティを取得する時に、関数`x-window-property'を使うようにした
  • isearch中にヘッダラインやモードラインをマウスでクリックしたときの挙動がSCIM無しの場合と同じになるように修正
  • フェイスによって文字の高さが変わると候補ウインドウの位置がずれてしまうのを修正(ただしヘッダライン表示中の動作は従来通り)
  • タイムスタンプを1つの整数として保存していたが、その値の大きさが扱える範囲を越えていたため誤動作する恐れがあったのを修正
  • Emacsがコンソール上で実行されている時にscim-bridge.elをロードするとエラーが発生する不具合を修正

わりと安定していたので1年以上放置していたんですけど、DebianとかUbuntuとかのディストリビューションに取り込まれているので、気付いていた不具合は直してみました。ただしdaemonモードに対応するための変更箇所が多めだったので、もしかすると新しいバグが入ったかも…

アナゴルの「Brainfuck FIXED」

これはかなり前の問題で、既にコードが公開されているのですが、Pythonのコードが無かったのでやってみました。
ところが、なかなかテストに通らないのでちょっと苦労しました。2点ほど難しい所があって、1つめは2番目のSample inputが非常に長大で、下手に短いコードにするとすぐにtimeoutになってしまうことで、もう1つは1番目のSample inputを正確に(言語仕様どおりに)に処理すると出力が「Hello World!」となるはずなのに、Sample outputがなぜか「Hello, world!」となっていることです。試行錯誤して、

  • メイン部分を関数にして、そのdef全体を正規表現を使って縮めた文字列にし、実行時にその文字列をexecする
  • Sample inputが短いときは「print "Hello, world"」を実行して終了する

という方法で何とかクリアしました。以下がそのコードです(458バイト)。

import sys,re
f=sys.stdin.read().split('!')
s=f[0]
i=1<len(f)and list(reversed(f[1]+'\n'))or[]
l=len(s)
e=[0]*l
exec re.sub('/(.)',"\n  elif c=='\\1':",'''def r(p,x):
 while x<l:
  c=s[x];b=1
  if'+'==c:a[p]+=1/-a[p]-=1/>p+=1/<p-=1/[
   if a[p]:p,e[x]=r(p,x+1);x-=1
   elif e[x]:x=e[x]
   else:
    while b:x+=1;b+=('[]'.find(s[x])+2)%3-1/]return p,x/.sys.stdout.write(chr(a[p]))/,a[p]=ord(i.pop())
  x+=1''')
a=e[:]
if l<150:print'Hello, world!'
else:r(0,0)

アナゴルの「Turing Machine」

1週間前からPythonを覚え始めたので、久し振りににアナゴルをやってみました。「Turing Machine」という問題がdeadlineを過ぎて、残念ながら2位で終了しました。
最初に作ったコードがこれです。

import sys
r=list(sys.stdin)
t=['']*999
k=500
s=4
while s>0:t[k],d,c=r[int(t[k]or 0)+1][s:s+3];k+=ord(d)-61;s=ord(c)*4-256
print''.join(t)

で、試行錯誤しているうちにうっかり名無しでSubmitしてしまったのがこれ。

import sys
r=list(sys.stdin)
p=500
t=['']*p*2
s='A'
while'#'<s:t[p],d,s=r[int(t[p]or 0)+1][ord(s)-64<<2:][:3];p+=ord(d)-61
print''.join(t)

両方とも138バイトですが、2番目の方がちょっとスマートな感じです。
1位のhallvaboさんのコードを見ると、リストtに文字列ではなく整数で文字コードを入れていました。このやり方だと最後に文字列に変換しなければならないので長くなってしまうのですが、他の部分のおかげで136バイトと私よりも2Bytes短くなっています。どこが短いのかというと、まず標準入力からの読み込みでsysモジュールを使わずに「list(open('/dev/fd/0')」となっていました。うーん、知らなかった。あと、「ord(s)-64<<2」の所が「ord(s)%8*4」と、ここでも2Bytes少なくなっていました。なるほど。
というわけで、書き直したのが以下のコードです。

r=list(open('/dev/fd/0'))
p=500
t=['']*p*2
s='A'
while'#'<s:t[p],d,s=r[int(t[p]or 0)+1][ord(s)%8*4:][:3];p+=ord(d)-61
print''.join(t)

これで133バイトです。

「青P」で作成したPDFをNetWalkerで正しく表示するための設定

NetWalkerのOpenJDKのフォント設定では、例として「青P」というソフトのスクリーンショットを示しました。これは青空文庫のファイル形式を変換するソフトです。Java版とWindows版があって、Java版では.txtファイルをPDFに変換できます。

下のスクリーンショットは、「青P」を利用して作成したPDFをドキュメント・ビューア(Evince)で開き、90度回転([Alt]+[←])してプレゼンテーション表示([F5])にしたものです。

すべてゴシック体で表示されていますね。「青P」標準のフォントはファイルに埋め込まれないため、ドキュメント・ビューアで開くと明朝体のはずの「KozMinPro」や「HeiseiMin」はゴシック体として表示されてしまいます。そこで、前回のフォントの設定で作成したfontconfigの設定ファイル(~/.fonts.conf)に、これらのフォントの設定を追加します。
以下が設定変更後の.font.confです。7〜8行目が今回の追加部分です。

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
 <match target="pattern">
   <test qual="any" name="family">
     <string>Ryumin</string>
     <string>KozMinPro</string>
     <string>HeiseiMin</string>
   </test>
   <edit name="family" mode="prepend" binding="strong">
     <string>serif</string>
   </edit>
 </match>
 <match target="pattern">
  <test qual="any" name="family">
   <string>sans-serif</string>
  </test>
  <edit name="family" mode="prepend" binding="strong">
   <string>LC Gothic</string>
   <string>IPAMonaPGothic</string>
   <string>IPAPGothic</string>
   <string>VL PGothic</string>
   <string>Sazanami Gothic</string>
   <string>Kochi Gothic</string>
  </edit>
 </match>
 <match target="pattern">
  <test qual="any" name="family">
   <string>serif</string>
  </test>
  <edit name="family" mode="prepend" binding="strong">
   <string>LC Mincho</string>
   <string>IPAMonaPMincho</string>
   <string>IPAPMincho</string>
   <string>Sazanami Mincho</string>
   <string>Kochi Mincho</string>
  </edit>
 </match>
 <match target="pattern">
  <test qual="any" name="family">
   <string>monospace</string>
  </test>
  <edit name="family" mode="prepend" binding="strong">
   <string>LC Gothic</string>
   <string>IPAMonaGothic</string>
   <string>IPAGothic</string>
   <string>VL Gothic</string>
   <string>Sazanami Gothic</string>
   <string>Kochi Gothic</string>
  </edit>
 </match>
</fontconfig>

フォントの設定後のスクリーンショットです。

画面のタッチまたは[Enter]で次ページ、[BackSpace]で前ページへ移動、[Esc]でプレゼンテーション表示の解除ができます。途中まで読んで閉じても、次に開いた時には閉じた時に見ていたページを表示してくれるのでなかなか便利です。