mintty用xoria256カラーテーマ

昨日のパステルカラーのやつはちょっと明る過ぎで、赤地に白みたいな表示をされると読めないぐらいきつかったので、背景色に使われてもそこそこ落ち着いて眺められそうなカラーを探した。


で、みつけたのがxoria256っていうvimのカラースキーム……をrxvt用に移植したやつで、基本色を守りつつも控えめな彩度でよさそうな感じだったのでmintty用に移植してみた。



例によって.minttyrc版とエスケープシーケンス版と作ってGistに置いときました。

mintty: A soft pastel color theme(xoria256) for mintty
https://gist.github.com/3422835


CUIプログラムってシンタックスカラーとは違って、赤なら赤ってのをそれとなく期待してるところ*1があると思ってるので、ぜんぜん違う色を割り当てちゃうのはなんとなく抵抗があるのよね。綺麗なんだけど。

*1:diffの追加と削除とか、レッドバー、グリーンバーとか

Cygwinのscreenでタイトルが化ける問題(未解決)

連日のCygwin上のscreenでウィンドウタイトルが文字化けする問題だけど、ちょっとだけわかったことがある。


xtermのドキュメントによると次のようなエスケープシーケンスでウィンドウタイトルが変更できるらしい。

ESC]0;stringBEL -- Set icon name and window title to string
ESC]1;stringBEL -- Set icon name to string
ESC]2;stringBEL -- Set window title to string

というわけで、試しにこんなのを実行してみると……

# (1)
echo -en "\e]0;test\a"

# (2)
echo -en "\e]0;テスト\a"

上は正常に反映されるけど、下はなんとも言えない感じに文字化けして反映された。


そんで、screenのドキュメントを見てみるとこんなことが書いてある。

screen が認識する制御シーケンスの一覧を以下に示す。 "(V)" は VT100 固有の機能であることを示し、 "(A)" は ANSI または ISO 固有の機能であることを示す。
    :
ESC \                 (A)
    文字列の終端子
    :
ESC P                 (A)
    デバイス制御文字列。文字列を、解釈せず、直接ホストの端末に出力する。

なんかパススルーしてくれそうな感じ?
というわけで、早速こんな感じで試してみると……

# (3)
echo -en "\eP\e]0;test\a\e\\"

# (4)
echo -en "\eP\e]0;テスト\a\e\\"

ダメだった\(^o^)/

terminal (1) (2) (3) (4)
mintty 正常 正常 正常 正常
mintty+screen 正常 文字化け 正常 文字化け

余談

余談だけど、vimはタイトルを変更するときに、そのタイトル文字列の前後にt_tsとt_fsをつけて出力するみたい。
で、これがこんな感じに設定されてるのでウィンドウのタイトルが変わるみたい。

t_ts=^[]2;
t_fs=^G

Cygwinとminttyで行こう!

昨日頑張ってscreenを自前ビルドしてみたものの解決ならずがっくりしていたところ、「mintty使えよ」という各方面からの温かいお言葉により何気なく試してみたらなんと文字化けしないじゃありませんか!
なにこれ?やっぱりPuTTYの問題だったの?でもminttyってPuTTYベースなんだよね?なんかその辺の問題認識してて手を入れてあるのかな?


実はminttyはずっと前に試したことがあったんだけど、その当時はまだ設定とかもこなれてなかったし、これならCygTerm+PuTTYのほうがいいなと思ったのでした。
しかし、今使ってみるとこれで十分な気がする。PuTTYに比べると設定は少ないけどターミナルの設定とかは別にどうでもいいわけだし。


というわけで、minttyに乗り換えることにした!

カラー

色、大事だよね。
というわけで、Macで使ってたPastelにちょっとだけ手を加えたカラーテーマをminttyに移植した。


.minttyrc版とエスケープシーケンス版と作ってGistに置いときました。
あとエスケープシーケンスにするのがしんどかったので、.minttyrcの設定項目から色の部分だけ変換するスクリプト書きました。


A pastel color theme for mintty
https://gist.github.com/3412915

Convert .minttyrc color settings to escape sequences.
https://gist.github.com/3412590

screenのせい!?

というわけで、晴れてminttyに乗り換えが完了したわけだけど、screen上でvim起動したらやっぱりダメだった!
なんかねー、ウィンドウのキャプションを書き換える機能がうまく解釈できてないっぽいんだよね。
それでキャプションが文字化けするだけなら我慢すればいい話なんだけど、ケースによってはスクリーン上にゴミが表示されたりするのよね。


ただ、PuTTY+vimではダメだったのがmintty+vimでは大丈夫だったので、あとはscreenを解決すればいい感じ?
今のところ現象がvimだけなので、set notitleしてしまうという手もなくはないけど……。

Cygwinとscreenで行こう!

@ArcCosineさんがCygwin+screen+vimで文字崩れするーとかいってscreenを自前で入れていたので、自分も入れ直してみることにした。


確かにCygwin上のscreenでvimを使うと描画がおかしくなることがあって、自分も以前screenをビルドしなおしてみたりしたんだけど、結局解決できなかったので開き直ってWindowsネイティブ側のgvimを使っている。
Cygwinvim使うと重いし、元々gvimのほうが好きだってのもあるけど。→Cygwin内から外のgvimを使う - ぱせらんメモ

screen開発版を入れる

@ArcCosineさんは4.0.3を入れたみたいだけど、真似してもつまんないので最新版を入れてみることにした。


自分の環境はビルドに必要なツールとかlibncurses-develとかすでに入ってたっぽくて何も引っかからなかったけど、エラーが出る人は色々入れてみて。
configureオプションも--enable-colors256以外はよくわからないけど、Cygwinで関係無さそうなPAM以外は全部入りにしてみた。--prefixはお好みで。

# リポジトリをcloneしてくる
git clone git://git.savannah.gnu.org/screen.git

# パーミッション絡みで動かなかったのでパッチ書いて当てた
cd screen/src
curl -k https://raw.github.com/gist/3401354 | patch

# ビルド&インストール
./autogen.sh
./configure --prefix=/usr/local \
            --enable-colors256 \
            --enable-rxvt-osc \
            --enable-use-locale \
            --enable-telnet
make
make install

普通にビルドしてみたら起動時に"Directory '/tmp/uscreens' must have mode 777"とかいって起動できなかったので、Cygwin版のパッチを真似してそれっぽいところを無効化した。→それっぽいところを無効化するパッチ
自分はNTFS ACLを無効化(noacl)して使っているのでそれがいけないのかも。
screenのススメにあるパッチは取り込まれてるっぽい話だったので当てなかった。ざっとソース見た感じでは反映されてるっぽい。


とりあえずこれで無事に最新版が出来上がったわけだけど、実はウィンドウの終了時に"Utmp slot not found -> not removed"と出る問題が。
これもCygwin版のパッチを探ってみたんだけど、いかんせん全部入りでボリュームがでかすぎてどのへんを取り込めばいいのかわからない。
まぁCygwinだしutmpとか放っておいてもいいかなぁ……とか。だめ?
ちなみに、Cygwinパッチをそのまま取り込めないのはCygwin版が4.0.3だから。

screen関係無かった!?

で、若干問題はあるものの改めて自前でビルドしたscreenが手に入ったわけだけど、描画の乱れ全然直らねぇぇぇぇぇぇぇ!
というか、ググった感じだとこれscreenの問題というよりはcygterm経由でPuTTY使ってるからっぽい?
確かにCygwin bash直だと乱れない。もっと言うとscreen使ってなくてもvimなんかおかしい??

git submoduleがなんかおかしいけど原因よくわからん

submodule入りのgitリポジトリMac上でcloneして初期化してみたらなんかうまく行かなかった。
よくわかんないけど、とりあえず現象を記録しておく。


OS:Mac OS X 10.6.8 (Snow Leopard)
Git:1.7.11.1 (公式のMacインストーラで入れたやつ)
リポジトリhttps://github.com/pasela/studying-cakephp2.git


このリポジトリはsubmoduleをひとつ含んでいて、そのsubmoduleがさらにひとつsubmoduleを含んでいるという入れ子状態なんだけど、その入れ子のやつでおかしくなる。

$ cd /var/www/app
$ git clone https://github.com/pasela/studying-cakephp2.git
Cloning into 'studying-cakephp2'...
remote: Counting objects: 1291, done.
remote: Compressing objects: 100% (691/691), done.
remote: Total 1291 (delta 424), reused 1287 (delta 420)
Receiving objects: 100% (1291/1291), 1.35 MiB | 605 KiB/s, done.
Resolving deltas: 100% (424/424), done.

$ cd studying-cakephp2
$ git submodule update --init --recursive
Submodule 'app/Plugin/TwigView' (https://github.com/predominant/TwigView.git) registered for path 'app/Plugin/TwigView'
Cloning into 'app/Plugin/TwigView'...
remote: Counting objects: 333, done.
remote: Compressing objects: 100% (139/139), done.
remote: Total 333 (delta 159), reused 311 (delta 140)
Receiving objects: 100% (333/333), 53.25 KiB, done.
Resolving deltas: 100% (159/159), done.
Submodule path 'app/Plugin/TwigView': checked out '865c8c2d08e436070892d519f5b8566b070c5ba3'
Submodule 'Vendor/Twig' (git://github.com/fabpot/Twig.git) registered for path 'Vendor/Twig'
Cloning into 'Vendor/Twig'...
remote: Counting objects: 12116, done.
remote: Compressing objects: 100% (3231/3231), done.
remote: Total 12116 (delta 7862), reused 11672 (delta 7467)
Receiving objects: 100% (12116/12116), 1.55 MiB | 138 KiB/s, done.
Resolving deltas: 100% (7862/7862), done.
fatal: Not a git repository: ../../../../../../../../../private/var/www/app/studying-cakephp2/.git/modules/app/Plugin/TwigView/modules/Vendor/Twig
Failed to recurse into submodule path 'app/Plugin/TwigView'

なんかfatal: Not a git repositoryのところがすごいことになってる。
ちなみにこのパス自体はちゃんと存在してるし、いちおうgitリポジトリになってるっぽい。


この時のgitの情報はこんな感じになっている。

$ cat .gitmodules
[submodule "app/Plugin/TwigView"]
        path = app/Plugin/TwigView
        url = https://github.com/predominant/TwigView.git

$ cat app/Plugin/TwigView/.git
gitdir: ../../../.git/modules/app/Plugin/TwigView

$ cat app/Plugin/TwigView/.gitmodules
[submodule "Vendor/Twig"]
        path = Vendor/Twig
        url = git://github.com/fabpot/Twig.git

$ cat app/Plugin/TwigView/Vendor/Twig/.git
gitdir: ../../../../../../../../../private/var/www/app/studying-cakephp2/.git/modules/app/Plugin/TwigView/modules/Vendor/Twig

/var -> /private/varなのが怪しい?

OS Xは/varが/private/varへのリンクになっているので、この辺が影響してるのかもしれない?

$ ls -l /var
lrwxr-xr-x@ 1 root  wheel    11B  5  1  2010 /var@ -> private/var

ちなみに、なんでこんなことになってるのかは知らない。
あと、/tmpも/private/tmpになってるので、もしや…と思ったらやっぱり同じエラーになった。


んで、とりあえず/private/varが怪しい感じなので試しに別のところでやってみると上手くいった……。

$ cd ~/tmp
$ pwd
/Users/pasela/tmp

$ git clone https://github.com/pasela/studying-cakephp2.git
Cloning into 'studying-cakephp2'...
remote: Counting objects: 1291, done.
remote: Compressing objects: 100% (691/691), done.
remote: Total 1291 (delta 424), reused 1287 (delta 420)
Receiving objects: 100% (1291/1291), 1.35 MiB | 591 KiB/s, done.
Resolving deltas: 100% (424/424), done.

$ cd studying-cakephp2
$ git submodule update --init --recursive
Submodule 'app/Plugin/TwigView' (https://github.com/predominant/TwigView.git) registered for path 'app/Plugin/TwigView'
Cloning into 'app/Plugin/TwigView'...
remote: Counting objects: 333, done.
remote: Compressing objects: 100% (139/139), done.
remote: Total 333 (delta 159), reused 311 (delta 140)
Receiving objects: 100% (333/333), 53.25 KiB, done.
Resolving deltas: 100% (159/159), done.
Submodule path 'app/Plugin/TwigView': checked out '865c8c2d08e436070892d519f5b8566b070c5ba3'
Submodule 'Vendor/Twig' (git://github.com/fabpot/Twig.git) registered for path 'Vendor/Twig'
Cloning into 'Vendor/Twig'...
remote: Counting objects: 12116, done.
remote: Compressing objects: 100% (3231/3231), done.
remote: Total 12116 (delta 7862), reused 11672 (delta 7467)
Receiving objects: 100% (12116/12116), 1.55 MiB | 327 KiB/s, done.
Resolving deltas: 100% (7862/7862), done.
Submodule path 'Vendor/Twig': checked out '6e3a1c401608146e5302f7124404b7a0895484e0'


この時のgitの情報はこんな感じになっている。

$ cat .gitmodules
[submodule "app/Plugin/TwigView"]
        path = app/Plugin/TwigView
        url = https://github.com/predominant/TwigView.git

$ cat app/Plugin/TwigView/.git
gitdir: ../../../.git/modules/app/Plugin/TwigView

$ cat app/Plugin/TwigView/.gitmodules
[submodule "Vendor/Twig"]
        path = Vendor/Twig
        url = git://github.com/fabpot/Twig.git

$ cat app/Plugin/TwigView/Vendor/Twig/.git
gitdir: ../../../../../.git/modules/app/Plugin/TwigView/modules/Vendor/Twig

rootまで遡るような意味不明な状態にはなってない。


この辺にヒントがあるような気もする。

$ pwd
/var/www/app/studying-cakephp2

$ pwd -P
/private/var/www/app/studying-cakephp2

コマンドラインでランダムな文字列を生成する

FuelPHPとかSymfony2が触りたいのに何故かCakePHPをやってるぱせらです。
んで、こういうフレームワークはセキュリティ用のsaltとかが初期状態だと「ちゃんと設定してね」みたいなメッセージが出るようになってるので書き換えなきゃいけないんだけど、適当にキーボードがちゃがちゃやるのは問題外として、ハッシュ関数Base64はなんとなくそれっぽく見えちゃうので、こんな感じで生成してみた。

# 英数40桁
cat /dev/urandom | tr -dc '[:alnum:]' | head -c 40

# 数字29桁
cat /dev/urandom | tr -dc '[:digit:]' | head -c 29

上の例はCakePHPのcore.phpに初期設定されてるやつに合わせてみた*1けど、文字種とか文字数とか自由に決められていい感じ。


あとこんな感じで一気に生成できたりするのも楽しい。

$ cat /dev/urandom | tr -dc '[:graph:]' | fold -w 8 | grep '[:punct:]' | head -n 5
#n;%[A@2
AttFfb7,
i4/R>3pu
JcfA}s#k
$)E+:.VX

$ cat /dev/urandom | tr -dc 'a-zA-Z0-9_!@#$%&+-' | fold -w 8 | grep -i '[_!@#$%&+-]' | head -n 5
dE_MGw63
soL2@DoG
04rlu4_S
sL+lh&82
+QiG2Dxh


2012-07-22追記
OS Xとかで"tr: Illegal byte sequence"とか怒られちゃう場合は、trの前にLC_CTYPE=Cをつけてあげるといいかも。

$ cat /dev/urandom | tr -dc '[:alnum:]' | head -c 40
tr: Illegal byte sequence

$ cat /dev/urandom | LC_CTYPE=C tr -dc '[:alnum:]' | head -c 40
zec3tqT24y9PxEetepzca82mSYAOEvVpbfFuHYuQ

*1:Security.cipherSeedのほうは"digits only"って書かれてるので。

FuelPHP用のunite source、unite-fuelを作ってみた

GitHub - pasela/unite-fuel: A unite.vim plugin for FuelPHP
(unite-zf と unite-sf2パク参考にしました)


最近FuelPHPに興味を持ってちょこちょこいじってるんだけど、unite-zfやunite-sf2みたいに操作できたらいいなーと思って作ってみた。
作ってみたというかパクっ(ry


使い方はまぁ同じです。
coreとかvendorはいらんかなーとも思ったんだけど、ソース見たくなるかもしれないのでいちおう入れておいた感じ。


ほんとうはlangとかmodulesとかpackagesの下を自動展開するような仕組みも考えてみたんだけど、
define()のところが最初しか呼ばれないのでカレントディレクトリに応じて変えるにはどうしたらいいのかよくわからなくて断念した。
んで、よくよく考えたらそれってsourceとして提供する部分じゃなくて、sourceを表示した後の話だよなーと思ったのでやめた。