MySQLでlatin1なテーブルのデータの救出方法

1月 27th, 2008 admin

それはそんなにも昔ではない、今よりももっとバカだった頃の話・・・
もう今更変えられないテーブルのデフォルト文字コード・・・と思っていた、が!

hori-uchi.com: mysqldumpで文字化けしないためのメモ
http://hori-uchi.com/archives/000450.html

やったー!すごいよ!左上のロゴもかっこいいよ!

mysqldump --default-character-set=latin1 -u USERNAME -p DBNAME > db.dump

ネタ元サイトと僕の場合は少し違い、パスワードを入力するようにしたのと、全部のDBではなく特定のDBだけをダンプするようにしました。
mysqldumpの使い方は以下

4.9.7. mysqldump(テーブル構造とデータのダンプ)
http://dev.mysql.com/doc/refman/4.1/ja/mysqldump.html

bamcompileを使ってPHPからexeファイルを作成

1月 27th, 2008 admin

顧客が作ったCSVを使ったアプリを作っているんですが

  • 全角英数字が混じる
  • (株)やローマ数字などいわゆる機種依存文字が混じる

ので、全角英数字を半角にし、機種依存文字を適当に変換するスクリプトを書いた。
ただそんなことをサーバサイドでやるのもアホらしいのでPHPをexeにしてくれるbamcompileってのを使った。

作ってみてPHPってバカにされているけど日本語処理に関しては他の言語よりかなり便利に使えることに気が付いた。
文字の扱いって他の言語じゃこんなに簡単じゃないと思う。(だから駄目だとか言われるんだろうけど)

bamcompileについて

bamcompile 本家
http://www.bambalam.se/bamcompile/
【PHP TIPS】 38. bamcompileでスタンドアロンEXEアプリを作ろう:ITpro

http://itpro.nikkeibp.co.jp/article/COLUMN/20070507/270089/

exeの作り方

僕はまずconvert.phpってのをつくり

C:\bamcompile1.21>bamcompile.exe -e:C:\xampp\php\extensions\php_mbstring.dll ./convert.php

ってやった。-eのオプションは任意のエクステンションを埋め込む用。
これだけでconvert.exeってのができて実行できるんだ。すげー!

今回の成果物の使い方

C:\>convert.exe old.csv

って感じで第一引数にファイル名を指定してやる。毎回コマンドプロンプトを立ち上げるのは面倒なのでショートカットを作成しておく予定。

ダウンロード

なんか嬉しいのでダウンロードできるようにしておく。
convert.zip(1.44MB)
(ウイルスチェックはしてありますし、悪意もありませんが、これをダウンロード及び実行したことによっていかなることが起こっても責任は一切負いません。)

PHPのソース

www.shibata.tv - Essay - 機種依存文字変換スクリプト
http://www.shibata.tv/essay/essay_515.html

↑ここのコードをお借りしました。

<?php
mb_language('ja');
mb_internal_encoding('SJIS');

if(!isset($argv[1]) || !file_exists($argv[1])){
	echo "第一引数にファイルを指定してください。";
	exit;
}

$filename = $argv[1];

echo "converting...\n";

$file = file($filename);
$newdata = '';

foreach($file as $v){
$v = replaceText($v);
$v = mb_convert_kana($v,'KVa');
$newdata .= $v;
}

$fp = fopen("new_".$filename,'w');
fwrite($fp,$newdata);

echo "converted ".count($file)."lines\n";

function replaceText($str){
$ret = $str;
$arr = array(
// 丸付き文字
'①' => '(1)',
'②' => '(2)',
'③' => '(3)',
'④' => '(4)',
'⑤' => '(5)',
'⑥' => '(6)',
'⑦' => '(7)',
'⑧' => '(8)',
'⑨' => '(9)',
'⑩' => '(10)',
'⑪' => '(11)',
'⑫' => '(12)',
'⑬' => '(13)',
'⑭' => '(14)',
'⑮' => '(15)',
'⑯' => '(16)',
'⑰' => '(17)',
'⑱' => '(18)',
'⑲' => '(19)',
'⑳' => '(20)',
'㊤' => '(上)',
'㊥' => '(中)',
'㊦' => '(下)',
'㊧' => '(左)',
'㊨' => '(右)',

// ローマ数字
'Ⅰ' => 'I',
'Ⅱ' => 'II',
'Ⅲ' => 'III',
'Ⅳ' => 'IV',
'Ⅴ' => 'V',
'Ⅵ' => 'VI',
'Ⅶ' => 'VII',
'Ⅷ' => 'VIII',
"Ⅸ\" => 'IX',
'Ⅹ' => 'X',
'ⅰ' => 'i',
'ⅱ' => 'ii',
'ⅲ' => 'iii',
'ⅳ' => 'iv',
'ⅴ' => 'v',
'ⅵ' => 'vi',
'ⅶ' => 'vii',
'ⅷ' => 'viii',
'ⅸ' => 'ix',
'ⅹ' => 'x',

// 単位文字
'㍉' => 'ミリ',
'㌔' => 'キロ',
'㌢' => 'センチ',
'㍍' => 'メートル',
'㌘' => 'グラム',
'㌧' => 'トン',
'㌃' => 'アール',
'㌶' => 'ヘクタール',
'㍑' => 'リットル',
'㍗' => 'ワット',
'㌍' => 'カロリー',
'㌦' => 'ドル',
'㌣' => 'セント',
'㌫' => 'パーセント',
'㍊' => 'ミリバール',
'㌻' => 'ページ',
'㎜' => 'mm',
'㎝' => 'cm',
'㎞' => 'km',
'㎎' => 'mg',
'㎏' => 'kg',
'㏄' => 'cc',
'㎡' => 'm<sup>2</sup>',

// その他
'№' => 'No.',
'㏍' => 'K.K.',
'℡' => 'TEL.',
'㈱' => '(株)',
'㈲' => '(有)',
'㈹' => '(代)',
'㍾' => '明治',
'㍽' => '大正',
'㍼' => '昭和',
'㍻' => '平成',
);
return str_replace( array_keys( $arr), array_values( $arr), $str);
}
?>

IEにjQueryでselectのoptionを追加できない

1月 26th, 2008 admin

JSONでとってきたデータを使ってselectのoptionを作っていた。
最初は

var html = "";
html = '<option value="" selected="selected">選択してください</option>';
$(html).appendTo("#select_box");
for (var i = 0; i < list.length; i++) {
	if(list[i][name_index] == family){
		html = '<option value="' + list[i][year_index] + '">' + list[i][year_index] + '</option>';
		$(html).appendTo("#select_box");
	}
}

こんな感じで

にHTMLを追加していく方法でやっていた。
しかし問題が2点、この方法で追加するとIE6では最後に追加した要素が選択状態になってしまう
しかもselectedIndexとかを使っても変更できない(後入れは評価されない?FireFoxだと動く)
今回の場合はデフォルトでは一番上の「選択してください」を表示していて欲しいので困った。

次にじゃあDOMを使ってやればいいんだろうと思って

$("#select_box").append(new Option("","選択してください"));

for (var i = 0; i < bikeList.length; i++) {
	//重複した名前は使わない
	if(!in_array(list[i][name_index],name_list)){
		$("#select_box").append(new Option(list[i][name_index],list[i][name_index]));
		$(html).appendTo("#select_box");
		name_list.push(list[i][name_index]);
	}
}

こうした、こっちの方が正しいやりかただと思うので正常に動くかと思ったらIEでは表示すらしなくなった

jQuery で select タグの option タグを増減させるときの注意点 (でぃべろっぱーず・さいど)
http://dev.chrisryu.com/2007/12/jquery_tips_about_add_option_to_selectbox.html

どうもjQueryオブジェクトとの相性が悪いらしい。なので仕方なく

select_box = window.document.getElementById("select_box");
var count = 0;
select_box.options[count++] = new Option("選択してください","");

for (var i = 0; i < list.length; i++) {
	//重複した名前は使わない
	if(!in_array(list[i][name_index],name_list)){
		select_box.options[count++] = new Option(list[i][name_index],list[i][name_index]);
		name_list.push(list[i][name_index]);
	}
}
select_box.selectedIndex = 0;

と普通のjavasCriptで書いたらばっちり動いた。こういう本質と関係ないところではまるのは疲れる。

テスト環境から本番環境へのファイル適用

1月 26th, 2008 admin

いつも設定ファイルをこうやって書いて

<?php
	//本番用
	define("FILE_UPLOAD_DIR","/xxx/yyy/xxx/");
	//テスト用
	//define("FILE_UPLOAD_DIR","/aaa/bbb/");
?>

subversionでignore属性つけてあるから完璧。とか思ってたんだけど。

よく考えたらapp_controller.phpとかで

<?php
	if($_SERVER['HTTP_HOST'] == "www.example.com"){ //本番環境のホスト名
		//本番環境
		config("dependent_settings");
	}else{
		//テスト環境
		config("test_dependent_settings");
	}
?>

って環境変数で設定ファイルを切り替えるようにしておけば、テスト環境と本番環境のファイルがまったく同じにできるんだと下記のページをみて気が付いた。

CakePHP 環境に応じてDBの設定を変える | Shin x blog
http://www.1×1.jp/blog/2006/09/cakephp_db_config.html

デプロイの方法とか今まで全然調べてなかったことなのでもうちょっと調べてみようと思う。みんなきっといいツールを使ってる(作ってる)はず。

アメリカに勝った! 書評「小鼠ニューヨークを侵略」

1月 22nd, 2008 admin

01819.jpg
小鼠ニューヨークを侵略 (創元推理文庫 F ウ 2-1)

あらすじ

北アルプス山中のグランド・フェンウィック大公国――自由を旗印に平和な日々を送るこの小国が外貨を獲得する手段は、国産ワインだけ。ところが、世界に誇る大公国のワインの偽物を、アメリカのワインメーカーが発売した。対する大公女の奇策は、かの大国への宣戦布告! 折もおり、アメリカでは究極兵器が完成? 大国支配の国際政治を笑い飛ばす、痛快無比のユーモア冒険小説!

感想

おもしろい!ストーリーはもちろんだが、登場人物がみな男気あふれる人たちばっかりで読んでいてすがすがしい。
外国を騙すぐらいなら正々堂々と戦争で戦おうという主人公や、アメリカ国籍をもつにもかかわらず良心に従って小国に手助けする博士、アメリカに負けたことを潔く認めるアメリカ大統領。そして手柄を手に入れるためとはいえヒーローとヒロインを結婚させてしまう伯爵。(求婚シーンのもどかしさも最高)こんないい人たちばっかりだったらそりゃいい世界になるよという感じだ。

ルパン三世カリオストロの城や風の谷のナウシカなんかをごったまぜにしたような世界観(年代的に逆だけど)も読んでいてとても楽しい、是非アニメ化して欲しい。