screenでpbpasteできないのをどうにか

Macに標準でついてるscreenや,MacPortsの最近のscreenの上だと pbpaste が実行できなくて実に不便.いろいろ調べてみたところ,

http://www.samsarin.com/blog/2008/10/18/copying-gnu-screen-buffer-to-leopard-clipboard/

によれば,screenにはクリップボードを管理してるサービスにアクセスする権限がなくて,こんな事になってるらしい.上のURLでは,

  1. screenから起動していない別のプロセスでクリップボードにアクセスして
  2. その結果を取得

して解決していた.より具体的には,

  1. 要求されると クリップボード にアクセスするサーバ (screen上でないところで動作)
  2. サーバに要求を投げて結果を取得するクライアント (screen上で動作)

があればOK.上のURLではpbcopy向けのサーバ/クライアントを書いて他のですが,うちはpbpasteをよく使う*1 ので,そのためのサーバクライアントを書いてgistにおきました.

http://gist.github.com/115372

いろいろ強引なやりかたなので,もう少しスマートに解決したいなぁ.

*1:vim からpbpaste たたいてペーストするときれいにペーストできる

KeyRemap4MacBookでCtrl-[をEscapeに割り当てたら,Ctrl-@がEscapeに割当たっていた

あ…ありのまま 今 起こった事を話すぜ!

『KeyRemap4MacBookでCtrl-[をEscapeに割り当てたら,Ctrl-@がEscapeに割当たっていた.』

な… 何を言ってるのか わからねーと思うが おれも何をされたのかわからなかった…(ry



てなかんじにKeyRemap4MacBookがおかしい動作をしてたんだけど,ソースコード弄ったら意図する動作になったので,メモ.ちなみにMacBook with JIS keyboardな環境での話デス.

どうやら,KeyRemap4MacBookが想定している[(BRACKET_LEFT)キーのキーコードと実際に[キーを押したときに送出されるキーコードが違っている(@のキーコードになっている),のが問題っぽい.

なので,KeyRemap4MacBook5.1.0のソースコードを展開した中にある,src/core/kext/keycode.hppを弄ってBRACKET_LEFTに対応するキーコードを変えてやる.

--- keycode.hpp.orig	2008-06-23 02:33:16.000000000 +0900
+++ keycode.hpp	2008-06-23 02:33:29.000000000 +0900
@@ -116,8 +116,8 @@
 
       SEMICOLON = 41,
       COMMA = 43,
-      BRACKET_LEFT = 33,
-      BRACKET_RIGHT = 30,
+      BRACKET_LEFT = 30,
+      BRACKET_RIGHT = 42,
       QUOTE = 39,
 
       F1 = 122,

これをmakeしてインストールしたら,ちゃんとCtrl-[でEscapeできるようになった.これでストレスなくvimperatorが使えそうだわ.

ちなみに,keycode.hppにおいて,ほかのキーについても実際のキーコードと一致してないのがあった.実はJIS配列なMacをちゃんと想定してないとか?手元にUS配列なMacがないのでよくわからんけど.

MacならsayコマンドがあるのでRSSしゃべらすのも簡単

yharaさんがとなりでRubyでtwitterの新着を読み上げさせてみるをやっているときにMacでやってみたやつ.

use strict;
use warnings;
use XML::Feed;
use URI;
use Perl6::Say;

my $FEEDURI = shift;

my $feed = XML::Feed->parse( URI->new($FEEDURI),);

for my $entry ($feed->entries) {
    say $entry->title . '.';
    say $entry->content->body . '.';
}

というのをsay_xml.plという名前で保存して実行してやると,RSSの中身がテキストではかれるので,

$ perl say_xml.pl http://digg.com/rss/indexprogramming.xml| say 

とかすれば,英語の記事のないようをMacが読み上げてくれます.ただし,twitterのRSSとかは英語以外がまじるのでだめ.sayに日本語がとおるWindowsはいいなー.

$ perl say_xml.pl http://digg.com/rss/indexprogramming.xml| say -o /tmp/programming.aiff

とやるとaiffにも吐けるので,mp3に圧縮してpodcast化すると英語勉強に最適!

まぁ,音声合成なのでどこまで正確なのかは疑問ですがMacの音声合成は結構できがいいので悪くないかもしれませんね.

LeopardでCGI.pmのテストがとおらないのは変なTMPDIRのせい

Leopardでは特殊なTMPDIR環境変数が設定されているという記事を書いた。これに関連して、このTMPDIRのせいでCGI.pmのテストが失敗する。

LeopardはTMPDIR環境変数は以下のようになっている。

$ echo $TMPDIR
/var/folders/A2/A2AtxiekJ3jlm3DDlp98aE+++TI/-Tmp-/
$ ls -l 

パーミッションは700になっていてオーナー以外はなにもできない。セキュリティのためにこういうことをしているのかな?

このTMPDIRの"A2AtxiekJ3jlm3DDlp98aE+++TI"という部分は、どうやら必ず+++TIという文字列で終了するようだ。この、+++TIというのが問題になって、CGI.pmのテストが失敗する。

CGI.pmの中では、ファイル名が正しいかどうかを判定するのに、以下のような正規表現を利用している。

$filename =~ m!^([a-zA-Z0-9_ \'\":/.\$\\-]+)$!

この正規表現は、+を含んだファイル名にマッチしない。

しかしながら、LeopardのTMPDIR環境変数には+が含まれているために、不正なファイル名であると判定されてしまい、エラーが発生する。

このエラーをおこさないためには、普通に+にマッチするように正規表現を修正してやればよい。

$filename =~ m!^([a-zA-Z0-9_ \+\'\":/.\$\\-]+)$!

MacOSX以外でも+を名前に含むファイルは作成できたので、ファイル名に+を含むこと自体には問題は無いように思える。ということは、CGI.pmのファイル名チェックがぬるいのか、それとも、何かしらの意図があるのかということになるけど、どうなんだろう。

まぁ、そもそも、TMPDIRが"/一時ファイル"とかの日本語名とかになってれば、当然のようにテストが失敗しそうではある。このへんは実装のバランスの取り方なのかも。

ちなみに、CGIのなかでCGI.pmを利用するときにはこの特殊なTMPDIR環境変数は設定されないので、実害はないと思われます。

LeopardのTMPDIR環境変数

Mac OS X 10.5.1 LeopardのTMPDIR環境変数が若干不思議な件。Terminal.appでecho $TMPDIRすると以下のようになる。

$ echo $TMPDIR
/var/folders/A2/A2AtxiekJ3jlm3DDlp98aE+++TI/-Tmp-/
$

/var/foldersに入るのはあまり見たことがない。ところがsshでログインしたあと、だとTMPDIRになにも入っていない。

$ ssh localhost
$ echo $TMPDIR

$

/etc/profileとかには特別な記述なし。sudo su - するとTMPDIRは空で、iTerm.appで確認するとTMODIRに上と同じディレクトリ名が入る。どのタイミングでTMPDIRに値が入ってるいるのか知りたい。

なんで、こんなことごちゃごちゃ言っているかというと、CPANモジュールのテストで、これのせいで通らないやつがある。Log::Log4perlのテスト*1で、以下のようなコードがあるんだけど、

like($data, qr#GET file:$tmpfile#);

$tmpfileのなかにA2AtxiekJ3jlm3DDlp98aE+++という文字列が含まることになる。これを正規表現としてコンパイルしようとすると+が連続しているということでエラーが出てテストが失敗する。+とか*とかの量指定子の連続は組み合わせ数が膨大になる可能性があるので正規表現エンジンが止まってしまう。

TMPDIRの++の連続はほかのLeopard環境でも見られるので、うちの環境にはかぎらない問題だと考えられるけど、どうでしょう。

量指定子のあたりの詳細は詳説正規表現で読んだんだけど、忘れたのであとでチェックしよう。

詳説 正規表現 第2版

詳説 正規表現 第2版

*1:t/048lwp.t

Mac OS X 10.5.1にアップデートしたらはまった

10.5.1にアップデートしたら、Spotlightが暴走したり、システム全体がめちゃ遅になったりで、たいへんなことになった。キーボード入力したら1分くらいしてから画面に反映される感じ。

調べてみたところ、/tmpのパーミッションが644になっているのを発見。chmod 777 /tmp chmod 1777 /tmp*1したら普通に動くようになった。そら普通のプログラムは/tmpが1777になってる前提で動いてるわいな。

しかしながら、sshでマシンにログインするとキーボード入力も普通にできたりするので、GUIでだけ動いているプログラムがなんかしらやってるのかな。

追記: /tmpのパーミッションは777と思ってたら正確にはちょっと違うらしい。drwxrwxrwtだとか。tってなに?ともあれ、/tmo以外にもアクセス権が変わってそうなので、ディスクユーティリティからアクセス権の修正をするのが良さそう。