mysqldumpの文字化け回避法@Dreamhost

2009年末にいろいろ無制限な海外サーバーDreamhostを借りて、遊んでいたんですが、 家のサーバー(ubuntu)で作ったMysqlをDreamhostに移そうとすると、いつも文字化けしてしまいました。 おそらくDremahostのDBの文字コードがlatin1なのが原因なのは分かっていたんですが、変える権限はないので 検索して、下記のような対策を発見。

mysqldumpで文字化けデータを頑張ってダンプ&リストア
http://koexuka.blogspot.com/2009/04/mysqldumpdump.html

↑は「–default-character-set=binary」をつけて、エクスポート&インポートするやり方。 やってみたけど変わらず文字化けして失敗。

MySQL 4.1 から 5.0に、文字化けせずにmysqldumpでデータを移行する
http://www.goodpic.com/mt/archives2/2009/01/mysql_41_50mysq.html

ダンプしたファイルをテキストエディタなどで開いてutf8をlatin1などに書き換える方法。
成功するけど、非常にめんどくさい&自動化が難しいので、納得できず。
書き出すときに–deafault-char-set=latin1って付けても、dumpしたファイルの中にはutf8って書いてあるんですね。

半ばあきらめてmysqldumpの公式マニュアルに目を通していたら、 charset関係のオプションを発見。しかもデフォで有効。

–set-charset 出力にSET NAMES default_character_setを追加してください。このオプションはデフォルトで有効となっています。SET NAMESステートメントを抑制するには、–skip-set-charsetを使用してください。

というわけで、–skipを使って無効にして試してみる。
前提条件として、DH側に同じ名前のデーターベースは作ってある。
試行錯誤したらから要らないオプションが付きまくってる。
コピペじゃなくて手打ちしてるから、ミスがありそう。

ローカル側
mysqldump DB_NAME -u USER_NAME -pPASSWORD --add-drop-table --default-character-set=binary --no-create-db --skip-add-drop-database --skip-set-charset >dump.sql

(↓ファイルアップロード)

ドリホ側
mysql -u USER_NAME -pPASSWORD -h MYSQL_DOMAIN DB_NAME<dump.sql

これで文字化けせずに無事移転できました。
なんかインポートの際に権限無いですよ的なエラーがでるので、何かオプションをオフにし忘れてるっぽいけど、大丈夫そう(てきとー あと、アップロードの際は、bzip2使ったりしてます。

重いプログラムなので、家のサーバーで動かして、自動で定期的にDH側と同期できればいいなぁなんて考えてるけど シェルスクリプトがまだ分からないので、いつになるか。

Posted in MySQL, PHP at 2月 13th, 2010. No Comments.

25行の軽量PHPテンプレートエンジン「Petitmpl」作りました。

必要最低限、でもループにも対応したテンプレートエンジンです。 クラスで25行程度で、正規表現は極力控え、可能な限りstrtr()とstr_replace()で書き換えしてます。

必要なのは、 Petitmpl本体(PHP、25行のクラスなので、改造してソースに入れてもOK)、 テンプレート(HTMLなど)、 設定ファイル(PHP)、 です。

クラスにHTML等のテンプレートファイルと、置換前と置換後の文字を連想配列形式で渡して使います。 ループはさらにその連想配列を配列に入れて渡します。詳しくはサンプル見てください。

今日3時間ぐらいで作って、今日公開なので、いろいろ問題ありそうです。

実行例

テンプレ(HTML)  →  適応後

サンプルセットをダウンロード

◆本体(petitempl.php)
<?php
class petitmpl{
	private $tpl_data;
	function tpl_load($tpl_path){
		$this->tpl_data=file_get_contents($tpl_path);
	}
	function repl($words=array()){
		$tpld = strtr($this->tpl_data,$words);
		$this->tpl_data =$tpld;
	}
	function repl_arr($id='',$roop=array()){
		$tpld = $this->tpl_data;
		$reg='/<!\-\-START\['.$id.'\]-\-\>(.*?)<!\-\-END\['.$id.'\]-\-\>/s';
		preg_match_all($reg,$tpld,$repd);
		$roopdata='';
		foreach($roop as $item){
			$roopdata.=strtr($repd[1][0],$item);
		}
		$this->tpl_data =str_replace($repd[0],$roopdata,$tpld);
	}
	function publish(){
		return $this->tpl_data;
	}
}
?>
◆テンプレートファイル(tmpl.html)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<meta http-equiv="Content-Script-Type" content="text/javascript" />
	<meta http-equiv="Content-Style-Type" content="text/css" />
	<title>タイトル</title>
</head>
<body style="width: 800px;margin:auto;">
<h1>見出し1</h1>
	<p>文書の内容1</p>
	<p>文書の内容2</p>
	<p>文書の内容3</p>
	
<h2>見出し2</h2>

<ul>
<!--START[rep1]-->

<li class="id" style="margin-bottom:10px;"><a href="linkurl">リスト</a></li>

<!--END[rep1]-->
</ul>

<h3>見出し3</h3>

<ol>
<!--START[rep2]-->

<li style="margin-bottom:10px;"><strong>記号</strong> 内容</li>

<!--END[rep2]-->
</ol>

<p style="text-align:right;">フッター</p>
</body>
</html>
◆設定例ファイル(sample.php) テキストはデータベースから読み込んだもの等を使うので、こんな文字だらけにはならないはずです。
<?php
//classのファイル読み込みます
require_once('petitmpl.php');
//インスタンス作ります
$tple=new petitmpl();

//テンプレートファイルのパスを指定して読み込みます
$tple->tpl_load('tmpl.html');

/*「置換前=>置換後」の形式でテンプレにあわせて書いていきます。
一度置換されたワードはもう変換されないので順番は逆になっても大丈夫。
例えば「あああ」=>「いいい」を書いたあと、「いいい」=>「ううう」を書いても「いいい」のまんま
*/
$words=Array(
	'タイトル'=>'テンプレートエンジン「Petitmpl」テスト',
	'見出し1'=>'テンプレートエンジン「Petitmpl」とは',
	'文書の内容1'=>'拡張を前提とした必要最低限なテンプレートエンジンです。25行程度のクラスですが、ループにも対応してます。',
	'文書の内容2'=>'テンプレートは自然なhtmlのままデザインできます。ブラウザでそのまま確認できます。ループもHTMLのコメントを利用しており、置換後にコメントは消えます。',
	'文書の内容3'=>'独自のテンプレートタグも特に決めてないので、必要に応じて決めてください。置換の正規表現はループで必要な箇所だけにして、他はstrtrを利用しています。速いかも。',
	'見出し2'=>'ループの使用例',
	'見出し3'=>'その他',
	'フッター'=>'作成:ろっく 2010/01/22 <a href="http://petitec.17sai.jp/">http://petitec.17sai.jp/</a>',
	
);

$list=Array(
	Array('linkurl'=>'#id1','リスト'=>'置換ワードは連想配列で渡します。リストの場合は、それらをさらに配列に入れます。','class="id"'=>'id="id1"'),
	Array('linkurl'=>'#id2','リスト'=>'うまく説明できないのでサンプルとテンプレのソースを見てください。','class="id"'=>'id="id2"'),
	Array('linkurl'=>'#id3','リスト'=>'それぞれのアイテムごとに、複数の置換も可能です。','class="id"'=>'id="id3"'),
	Array('linkurl'=>'#id4','リスト'=>'このサンプルではリンク先のURLと、このテキスト,あとliのidを指定しています。','class="id"'=>'id="id4"'),
	Array('linkurl'=>'#id5','リスト'=>'ループ回数の制限もできません。設定した配列の数だけ出ます。制限するときは配列自体を調整してください。','class="id"'=>'id="id5"'),
);

$vartext='これは変数に入れたテキストです';
$list2=Array(
	Array('記号'=>'●','内容'=>'もちろん変数も指定できます。'),
	Array('記号'=>'★','内容'=>$vartext),
	Array('記号'=>'〓','内容'=>'エラー処理はしてないので、状況に応じてなんとかしてください。'),
	Array('記号'=>'◆','内容'=>'常に動的な出力を考えたため、キャッシュも、ファイル書き出し機能も付いてません。<br />キャッシュはPEARのCache_Lite、書き出しはパス指定してfile_put_contents使えばすぐ出来そうです。'),
	Array('記号'=>'◎','内容'=>'クラスを使い始めてまだ2日目で作ったものなので、改善点があれば教えてください'),
	Array('記号'=>'△','内容'=>'GPLライセンスで自由に使って、改造して、公開して、配布してください。'),
);
$tple->repl($words);
//通常の単語は1個の配列にまとめられます

$tple->repl_arr('rep1',$list);
//ループは個数分設定が必要です。<!--START[●●]-->繰り返す内容<!--END[●●]-->の●●を第一引数に、置換するリストを第2引数に指定します。
$tple->repl_arr('rep2',$list2);

//終わったら↓すると変換された内容が帰ってくるので、echoするなり、ファイルに書きだすなりしてください
echo $tple->publish();

?>
Posted in PHP at 1月 23rd, 2010. No Comments.

Twitterで英語の勉強をする支援ツールっぽい何か

思いつきで作りましたが、そのまま消滅させるのも僅かにもったいないので、 寝る前に公開しておきます。 入力した文章を英訳、もしくは和訳して、そのままTwitterに送れるツールです。
翻訳してTwitter

翻訳してTwitter

翻訳してTwitter(http://tw.17sai.jp/) サーバーの共有SSLが使えるので、鍵マークが好きな方はどうぞ↓。 翻訳してTwitter[SSL](https://ss1.coressl.jp/tw.17sai.jp/) ※TwitterのID、PASSを使う場合は、何かあっても責任取れないので、気をつけて使わないで下さい。 Googleの翻訳できるAPIをいじってみたら、文章、特に日本語が超約というかダメ約で、 変な方向に面白かったので、最近流行のTwitterとあわせてみたらいいんじゃね?っていう そんな感じの作りはじめだったと思います。覚えてないけど。今考えた。 英語の勉強に使えるってのは、作りはじめてから、さらにしばらくして思いついた後付設定です。 前述したように、超約なのであんまり役に立たないと思います。 英語ってなってるけど、GoogleAPIの方で対応してるのは一応選択できます。 正しく訳せているのかは全く分かりませんが。 どれだけの情熱と手間がかかっているかは、デザインとタイトルを見ればお分かりいただけると 思います。 その分、セキュリティやバグが心配なので、クッキーも使ってないし、TwitterのID&PASSも 受け次第保存などはせず、そのまま送ってます。 どうこうしてほしいとか、詳しい仕組み知りたいとかあったらコメントで教えてください。
Posted in PHP, javascript, プログラム at 11月 29th, 2009. No Comments.

【PHP】imagettftextで自動で改行させるスクリプト

PHPでテキストを画像に書き出すimagettftextですが、 そのままでは改行が出来ないのが不便でした。 そこで改行させるスクリプトを何とか書いてみました。 仕組みは、テキストボックスの幅や高さを取得するimagettfbboxを使い、 文を一字ずつ増やしながら幅を取得し、それが指定の幅まできたら 下にもう一つテキストボックスを追加してまた一字ずつ追加して・・・を繰り返します。 実行サンプル ソースコード http://17sai.jp/sample/linebreak.txt サンプルはフォントの箇所だけ自分で用意したフォントのパスに変えてください。 上のサンプルではフリーの毛筆フォント、青柳衡山毛筆フォントを使用させていただいています。 汚いソースなので、好きに改造してください。 なんかバグや改善点があれば教えてください。
< ?php
//imagettftextで自動で改行させるサンプルです。ろっく(http://petitec.17sai.jp/)091114

$im = imagecreatetruecolor(500, 300);// 画像を作成
$black = imagecolorallocate($im, 30, 30, 30);//色指定
$white = imagecolorallocate($im, 250, 250, 250);
imagefilledrectangle($im, 0, 0, 500, 300, $white);// 背景を白に

$font = 'AoyagiKouzanFont2.ttf';// フォントファイルへのパス
$text ='吾輩(わがはい)は猫である。名前はまだ無い。どこで生れたかとんと見当(けんとう)がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪(どうあく)な種族であったそうだ。この書生というのは時々我々を捕(つかま)えて煮(に)て食うという話である。';
//使用するテキスト
$FontSize=16;//フォントサイズ
$Rotation=0;//角度 90以上にすると幅が増えず、whileから抜け出せなくなるので注意
$XPositon=10;//開始x座標
$YPositon=0;//開始y座標
$LineMax=15;//行の最大値
$LineHeight=32;//行の高さ
$MaxWidth=500-$FontSize*2-$XPositon;//テキストの最大幅(px)フォントによる誤差が大きいので調整が必要
$InitialLeng=7;//文字数の初期値。大きいほどwhileループが少なくて済むが、大きすぎるとはみ出る。
for ($i=0; $i<$LineMax; $i++)
{
	$textwidth[$i]=0;
	$text_leng[$i]=$InitialLeng;
	$cut_text[$i]=mb_substr($text, 0, $text_leng[$i]);
	
	//行の幅が$MaxWidthを超えるまで一字ずつ増やしていく
	while ($textwidth[$i]<$MaxWidth)
	{
		$TextPositon[$i]=0;
		for ($o=0; $o<$i; $o++)
		{
			$TextPositon[$i]+=$text_leng[$o];
		}
		if (mb_strlen($text)>$TextPositon[$i]+$text_leng[$i]-$i)
		{//最後まで文を切り分けたらbreak
			$text_leng[$i]++;
			$cut_text[$i]=mb_substr($text, $TextPositon[$i], $text_leng[$i]);
			$bbox[$i] = imagettfbbox($FontSize, $Rotation, $font, $cut_text[$i]);
			$textwidth[$i] =$bbox[$i][2];//テキストボックスの右下の座標を取得
		}
		else
		{
			break 2;
		}
	}
}
for ($p=0; $p

ソースコード貼り付けるとWordpressの校正機能が無駄に働いてちょっとうざい。
Posted in PHP at 11月 14th, 2009. No Comments.

自作プログラムを晒すのって大変です。

私がjsやPHPで車輪の再発明以下の何かを作ったとき、 そんなもんでもせっかくだからブログにアップしようと思うんですが、やろうと思うとすごい大変。 異聞が分からないときにググって、必要な情報を見つけたとき、説明不足だったり、 コピペしても動かなかったときは、いらついてしまうんですが、 いざ自分で、分かりやすい説明で、汎用性もあり、難しい所はコメント振ってあって コピペしてそのまま使えるようなプログラムを公開するとなると その大変さを思い知ります。過去の記事を見れば分かりにくさがよく分かる。 何かをしたいとき、出来ないとき、自分じゃ分からないので検索し、いいブログやサイトを見つけて 解決できた時は非常に助かるし、はっきりいって検索エンジンとその先のブログ等が無ければ、 自分は何も作れないと思いますが、その便利さの裏には凄い方々の凄い優しさみたいなのがあるんですね。 自分がその凄い方々のようには、まだまだ慣れそうにはありません。 絵や感想などの文章だと、そんな迷惑もかけず自己満で完結できると思うんですが、 プログラムやシステム系のような実務的なものはそうも行きませんね。
Posted in プログラム at 11月 8th, 2009. No Comments.