hoge diary - カテゴリ - PC環境改善

[PC環境改善] PuTTY + Drag&Drop (2)

前回の続きです。

PuTTY にファイルやフォルダをドロップすると、パスが入力されるようにするパッチです。前回は Cygwin 1.5 のみの対応でしたが、今回は Cygwin 1.7 にも対応しました。

以下の環境にて使用できます。

[PC環境改善] PuTTY + Drag&Drop

コマンドプロンプトでは、ファイルやフォルダをドロップすると、パス名が入力されるようになっています (Vista 以降はセキュリティ強化の一環で使用できなくなりましたが…)。これを PuTTY にも実装しました。

以下の環境にて使用できます。

  • PuTTY 0.60 ごった煮版 (2007/8/6 版)
  • Cygwin 1.5 (1.7 は文字コードが EUC-JP になっているために(2009/10/12 追記) 1.7 では環境変数 LANG が未設定の場合に UTF-8 でパスを返すので2バイト文字が扱えません。1.7 用は現在作成中)
  • Cygterm 1.07 (1.05 でも動くはず)

Windows から渡されたフルパス名を、cygpath コマンドを使って Cygwin パス名に変換しています。ですので、Cygwin の bin ディレクトリにパスが通っている必要があります。

なお、PuTTY でリモートマシンに接続している場合にも、ファイルやフォルダをドロップすることはできますが、そこで入力されるパスは、あくまでローカル PC のパスです。

[PC環境改善] cygterm で端末エミュレータのウィンドウ位置を指定

いつも cygterm から PuTTY 0.58 (蛭子屋さんのごった煮版) を使っていますが,PuTTY は起動時のウィンドウ位置を指定できません.

PuTTY の要望にもあるみたいですが,実装しないようです (「ウィンドウ位置の設定は PuTTY でやるより,ウィンドウシステムあるいは外部ツールに任せた方がいい」という意見です.ごもっとも).

しかしながら,(私のワガママですが)他アプリのウィンドウ位置は特にどうでもよくて,PuTTY のためだけに外部ツールを入れるのも何か負けた気分になるので,PuTTY を起動する cygterm を改造して,指定した位置に PuTTY のウィンドウを配置させることにしました.

改造対象は cygterm 1.07 です.

以下のように,cygterm.cfg に X_POS と Y_POS を指定することでウィンドウ位置を指定します.

TERM = path\to\putty.exe -telnet %s -P %d
TERM_TYPE = xterm
PORT_START = 20000
PORT_RANGE = 40
SHELL = /bin/zsh --login
X_POS = 0
Y_POS = 326

で,以下技術的な話.

CreateProcess() に渡す STARTUPINFO 構造体の dwFlagsSTARTF_USEPOSITION を設定し,dwX, dwY メンバにウィンドウ位置を入れて起動することで,大抵のアプリケーションの位置は指定できます.ただ,この情報を元にウィンドウ作成時の位置を指定するのはアプリ側の実装次第で,PuTTY は残念ながら STARTUPINFO による指定ができませんでした.

ですので,今回の改造では,CreateProcess() 後,WaitForInputIdle() で待機してから,EnumWindows()GetThreadProcessId() でウィンドウを探し出し,SetWindowPos() するようにしています.

[PC環境改善] iPod の再生履歴を Last.fm へ送信する Ruby スクリプト

iPod で再生した曲の履歴を Last.fm へ送信するツールが何かないかなぁ,と探すと,iPod-last.fm bridge というスクリプトがありました.

アーカイブファイルをダウンロードして展開すると,いくつかの Ruby スクリプトが出てきます.

Cygwin 環境で試しました.まず最初に,config.rb を編集する必要があります.

$user_name = 'username'
$user_name = 'secret'
$ipod_paths = [
    "/cygdrive/e/iPod_Control/iTunes"
]
$ipod_timezone_shift = 8

強調で示した部分が今回私が書き換えた箇所です.

日本は GMT+9 ですから,$ipod_timezone_shift は最初 9 に設定していたのですが,iPod 本体の時刻設定が正しいにも関わらず,再生時刻が 1 時間ずれてしまったので,8 にしています.

とりあえず設定完了です.これで get_play_counts.rb を実行します.これを実行すると,以下のように,1 行に 1 曲分のテキストデータ (UTF-8) が得られます.

$ ./get_play_counts.rb
曲1のアーティスト ; 曲1のタイトル ; 曲1のアルバム ; 曲1の長さ ; 曲1の最終再生時刻
曲2のアーティスト ; 曲2のタイトル ; 曲2のアルバム ; 曲2の長さ ; 曲2の最終再生時刻
...
(中略)
...
$

get_play_counts.rb は曲の再生履歴を出力するだけです.これを Last.fm へ送信するには,as_submit.rb を使用します.パイプで渡すだけ.

$ ./get_play_counts.rb | ./as_submit.rb

これであとは待つばかりです.送信に失敗するとリトライしてくれます.

さて,iPod は再生回数と最終再生時刻しか本体に記録しないわけですが,このスクリプトは,再生回数も考慮してくれます.

ただしデフォルトの設定ですと,再生回数を無視するようになっています.これを有効にするには,config.rb の次の行を編集します.

$add_fake_songs_to_make_playcount_match = true

元々は false と書いてありますので,true に変更します.このスクリプトの作者は true に設定しているようです.

なお,clear_play_counts.rb を実行すると,再生履歴をクリアできます.

[PC環境改善] Firefox で lastfm: の URI を Amarok に関連付ける

amaroK-1.4.1 から Last.fm のストリームを直接再生することができるようになりました.

ですので,Firefox の protocol-handler を変更すれば,Amarok で lastfm: の URI を直接再生することができます.

最も単純に関連付けるには,Firefox の prefs.js に次の 1 行を書き加える(既に記述してある場合は書き換え)だけです.

user_pref("network.protocol-handler.app.lastfm", "/usr/bin/amarok");

ただしこれでは Amarok 側のプレイリストが上書きされてしまいますので,--append オプションを付けて次のように設定したいところです.

user_pref("network.protocol-handler.app.lastfm", "/usr/bin/amarok --append --play");

しかしこれでは動きません.おそらく引数のつもりで書き加えた部分も実行ファイル名の一部と見做されているのでしょう.

ですので,私は,下のようなシェルスクリプトを 1 個作ることにしました.

#! /bin/sh
/usr/bin/amarok --append --play "$1"

このスクリプトのパスを仮に /path/to/lastfm-protocol-handler としますと,スクリプトに実行属性を与えてから,prefs.js を以下の通りに書き加えるか書き換えれば OK です.

user_pref("network.protocol-handler.app.lastfm", "/path/to/lastfm-protocol-handler");

これで Firefox からハイパーリンクをクリックすることによって Amarok が再生してくれるようになります.

[PC環境改善] colorgcc

colorgcc なるソフトウェアがありました.

スクリーンショットが示すように,gcc の出力にエスケープシーケンスを付加するものです.

早速インストールしてみます.

% sudo emerge colorgcc
% ls -lF /usr/lib/colorgcc/bin/
合計 0
lrwxrwxrwx  1 root root 17  6月 30 01:55 c++ -> /usr/bin/colorgcc*
lrwxrwxrwx  1 root root 17  6月 30 01:55 cc -> /usr/bin/colorgcc*
lrwxrwxrwx  1 root root 17  6月 30 01:55 g++ -> /usr/bin/colorgcc*
lrwxrwxrwx  1 root root 17  6月 30 01:55 gcc -> /usr/bin/colorgcc*
lrwxrwxrwx  1 root root 17  6月 30 01:55 i686-pc-linux-gnu-c++ -> /usr/bin/colorgcc*
lrwxrwxrwx  1 root root 17  6月 30 01:55 i686-pc-linux-gnu-g++ -> /usr/bin/colorgcc*
lrwxrwxrwx  1 root root 17  6月 30 01:55 i686-pc-linux-gnu-gcc -> /usr/bin/colorgcc*

なお,colorgcc 自体は短い Perl スクリプトのようです./usr/lib/colorgcc/bin にインストールされたようなので,環境変数 PATH を設定して完了です.

無事完了と思ったら... 警告メッセージの色がエラーメッセージと同じ色で出力されます.

そうです.原因は LANG=ja_JP.eucJP です.メッセージが日本語で出力されたため,colorgcc が用いた正規表現で一致しなかったのです.

colorgcc 自体を書き換えてもいいんですけど,バージョンアップの度に直すのも面倒なので,環境変数 LANG=C としてから colorgcc を呼び出すラッパースクリプトを PATH の通った場所に置くことにしました.

#!/bin/sh

LANG=C /usr/lib/colorgcc/bin/`basename $0` $*

このスクリプトのファイル名を g++ として,次はシンボリックリンクを作成します.

% ln -s g++ gcc
% ln -s g++ c++
% ln -s g++ cc

まだ終わりではありません.このままではこのラッパースクリプトが無限に呼び出されてしまうので,~/.colorgccrc を編集し,呼び出すコンパイラの場所を指定します.

g++: /usr/bin/g++
gcc: /usr/bin/gcc
c++: /usr/bin/c++
cc:  /usr/bin/cc

これで解決しました.

[PC環境改善] zsh で補完候補に色を付ける方法

zsh入門スレからの情報.

zsh で,ファイルおよびディレクトリの補完候補に色を付けるには,~/.zshrc に次のように記入します.

zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}

これで環境変数 LS_COLORS と同じ色が補完候補に適用されます.

[PC環境改善] Mozilla Firefox の検索バーの幅

Firefox Help によると,userChrome.css に次の内容を書き加えると,検索バーの幅を変更できます.

#search-container, #searchbar { 
  -moz-box-flex: 400 !important; 
}

これで Mozilla Firefox の検索バーの幅が 400 ピクセルになります.

[PC環境改善] gnuplot enhanced eps vs 日本語 (4)

第 1 の選択肢が最適かも知れません.というのも,ghostscript+CJK をインストールするために,Fedora Core 3 test 2 に元々入っていた ghostscript+VFlib をアンインストールしたのですが...

ghostscript に依存しているアプリケーションが多少あるようです.私って後先考えずに行動しますので... しくしく.苦労したのに.

gnuplot-4.0.0-0vl1 と gnuplot 4.0.0 の diff を取って,それを Fedora Core 3 test 2 の gnuplot-4.0.0 に適用してインストールでもしてみましょうか.

[PC環境改善] gnuplot enhanced eps vs 日本語 (3)

第 4 の選択肢がありましたね...

「gnuplot 4.0.0 が吐き出した EPS に,後からフォントを合成する PostScript コードを埋め込み,ghostscript+VFlib でそのまま出力する」

システムに一切手を加えず,ユーザ側だけで対処できます.面倒ですが.

[PC環境改善] gnuplot enhanced eps vs 日本語 (2)

さて,gnuplot の日本語パッチと ghostscript+VFlib が何をしているのか分かったところで,Fedora Core 3 test 2 でも同じように日本語を利用する方法を考えてみましょう.

Fedora Core 3 では,ghostscript 7.07+VFlib を使用し,gnuplot 4.0.0 が搭載されました.バージョンを見て分かるように,gnuplot はオリジナルであり,パッチは当たっていません.ここで考えられる対処法は次の通りです.

  • gnuplot 4.0 にパッチを当てる.
  • ghostscript+VFlib をアンインストールし,ghostscript+CJK をインストールする.
  • ghostscript+VFlib の設定ファイルを適切に書き換える.

まず,3 は PostScript を理解する必要があるので却下です.

1 は,Vine Linux 3.0 の gnuplot-4.0.0-0vl1.i386.rpm をインストールする手があります.ファイルの配置が変わっていたとしても,gnuplot に依存するパッケージがないので問題ないでしょう.しかし,他ディストリビューションのパッケージを入れるのは気がひけます.

というわけで私は 2 を選択したのですが,研究室プリンタが必要とする lips4 のドライバをインストールしなければならず,手こずってしまいました.

今は快調に動いています.

[PC環境改善] gnuplot enhanced eps vs 日本語

gnuplot で enhanced な eps を吐き出すと,文字描画の度にフォントを設定するような PostScript になり,ghostscript+VFlib でレンダリングできないという不具合が発生します.

[PC環境改善] mutt on Cygwin で Maildir 形式のメールボックスを使用する際の問題点

Cygwin 環境をバリバリ使っている今日この頃,mutt で Maildir 形式のメールボックスを使うと,メールを既読にマークできません.rename システムコールで "No such file or directory" というエラーが発生するのです.非常に謎です.

そこで,仕方なしに MH 形式を使っていたのですが... MH 形式では到着したメールが新着かどうか分からないので使いづらいのなんの.mbox 形式でも構わないのですが,「1 メール 1 ファイル」に憧れているので,慣れた Maildir 形式で使いたいのが人情というもの.

今日ついに,mutt で Maildir 形式のメールボックスを使うときの不具合の謎が解けました!

原因はファイル名でした.Windows で使用できない文字をファイル名に使用しようとして失敗していたのです.

mutt の仕様なのか,Maildir の仕様なのかは分かりませんが,mutt で Maildir 形式のメールボックスを用いると,既読のメールに対して,"xxxxxxxxxx:S" という具合に,コロンを含むファイル名を付けようとします.Windows が用いるファイルシステム(FAT および NTFS)では当然のごとく,コロンをファイル名の文字として使用できません.

... というわけで,オープンソース界における伝家の宝刀,patch を振りかざすことにしました.

同様の問題に直面している人は他にもいるようで,検索を掛けると mutt 1.4.2.1i-ja のソースファイル mh.c を変更するらしいことはすぐに分かりました.当該ファイルを見てみると... 見事にコロンがコード中にマジックナンバーの如く埋め込まれています.せめて define して欲しかった...

とりあえず,コロンの代わりにセミコロンを使うようにして万事解決.


Valid XHTML 1.1! Valid CSS!
© 2004-2009 ぱくちゃん.
Last modified: Sun Jan 18 14:09:47 JST 2009