free as in air

2007|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|09|11|12|
2012|03|04|05|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|03|04|06|09|
トップ «前の日記(2008-10-02) 最新 次の日記(2008-10-04)» /編集

2008-10-03 [長年日記]

§ [perl] 文字コード

さっぱりわからん。

最初はMySQLの設定がさっぱりわからなかったわけだが。my.iniで設定すりゃええんやろ、と思ったけど、PHPはmy.iniを読んでくれないのだった。mysqldでujis固定にした。でもテーブルの文字コードがutf8になっててどこでどうコード変換してんのかまだわかってない。気分的には統一したいのだがどうしたものか。あとmysqldの文字コードを固定しているとmysqldumpの文字コードがワヤで、さらにクライアントの文字コードの扱いがよくわかんなくて大変だった。

Windowsのコンソールがよくわからん。コードページって何ですか。普通にUTF-8を表示させて欲しい。あとcmd.exeはglobしてくんないのでファイルを複数渡そうとしてガッカリした。

MySQLからDBIでEUC-JPでとってきて、CP932のテキストファイルをワーッと読み込んで記事毎に分割して、MySQLのデータとテキストをつき合わせて一致したら表示、とかそんな簡単な仕事なのだがえらく大変な気がした。こんなの。ちなみにこれ、人生において最長のPerlスクリプト。

use DBI;
use Encode qw(from_to decode encode);
use utf8;
use warnings;
use strict;
  
sub getdata {
	my $dbh = DBI->connect('DBI:mysql:dbname:server:3306', 'user', 'pass') or die "can't connect";
  
	my $aryref = $dbh->selectall_arrayref("select * from foobar");
  
	$dbh->disconnect;
  
	return $aryref;
}
  
sub articles {
	binmode STDIN => ":encoding(cp932)";
	my $strings = "";
  	
	my $state = 0;
	my @list = ();
  
	while(<>){
		$state++,next if /^-[-\s]+$/; #ハイフンだけの行で区切る
		$list[$state] .= $_;
	}
  
	return @list;
}
  
my @articles = articles();
my $data = getdata();
  
for(@$data) {
	my $id = $$_[0];
	my $aid = $$_[2];
	my $emp = $$_[6];
	$emp = decode("eucjp", $emp);
	$emp =~ s/[\r\n\s\p{Common}]//sg;
	my $re = qr/$emp/s;
	foreach my $art (@articles) {
		my $cp = $art;
		$cp =~ s/[\r\n\s\p{Common}]//sg;
		if($cp =~ /$re/) {
			print "$id, $aid\n";
			print Encode::encode("utf8", "$art\n");
		}
	}
}

正規表現一致させるのに、from_toじゃなくdecodeしなきゃならんように思われた。UTF8フラグとか関係あるんだろうか。文字コード周りは一通りハマった気がする。入出力 の文字コードとか、DBから読むときに変換しようとしたけど無理だったとか(サーバ側で固定だから)、変換ってどうやるのとか。あと参照の配列の参照の配列の参照(合ってる?)とか、どこで副作用起きるのとか、分割に正規表現を使うことを諦めたり(ヘタレ)とか。色々。正規表現を試すのにirbみたいなのが欲しいと切に思った。こうしてWindowsが嫌いになっていくんだなあ。

§ [software] Vimの不満点

 以下、知らないだけかもしれないシリーズ。

 コマンドモードのキーバインドがしょぼい。というか、Bash/Zshのemacsモードと同じにしてほしい。必死でいじれば変えられそうだけど。

 vimgrepとかしたあと:cnなんかで移動できるが、相対位置だけじゃなく絶対位置でも参照したいときがある。

 履歴検索。途中まで入力して上を押すと一致するものだけ表示される(前方一致)のは知っている。

 オムニ補完が大量のスクリプトを芋づる式に読み始めるのはどうか。読むのはいいにしても、キャッシュして欲しい。

 システムのクリップボードともうちょっと仲良くしたい。"+y$とか何度も続くとちょっと疲れる。mapしろってことかなあ。

 でかいファイルの扱いがなあ、まあいいけど。今時メモリてんこ盛りだし。

 可能ならUnicodeの扱いが更にまともになるとうれしい。

 コマンドオプションで文字コードを指定して読み込む方法がわからない。パイプで渡してからe! ++encとかできないし。

 しかしデフォルトでの使えっぷりはEmacsなんか全然目じゃないんだよな。

 コンプライアンスの関係でファイルをごっそり暗号化するようなアプリとは相性が悪かったりする(起動時にTXTファイルを読んでいる?)。まあ、いいんだけど。