2008 年 10 月 のアーカイブ

mysqldumpと「Got a packet bigger than 'max_allowed_packet' bytes」





















そこそこ巨大なテーブルをmysqldumpで書き出して、nkfでEUC-JPからUTF-8に変換、テーブルの照会順序もutf8-generic-ciにして書き戻す、ということをやろうとした。

サーバのMySQLのバージョンは4.1。

$ mysqldump –version
mysqldump  Ver 10.9 Distrib 4.1.20, for redhat-linux-gnu (i386)

$ mysqldump -u root -h localhost -p –complete-insert –quick –no-create-info データベース名 > datas.sql
$ nkf -Ew datas.sql > datas.utf8.sql
$ mysql -u root -h localhost -p データベース名 < datas.utf8.sql

こんな感じで実行してみたらタイトルにある”Got a packet bigger than ‘max_allowed_packet’ bytes”のエラーが発生。

SQLファイルの中身を見ると拡張INSERT文がずらーっと。しかも何かnkfが所々で文字化けを起こしてるし。

MySQLのバックアップデータをUTF8で復元する – Knowledge Database IT

–max_allowed_packet=128M のオプションとかはなぜか効かず。まぁ、効かないことが多いようですが。

Linuxでやる夫: [mysql] やる夫がmax_allowed_packetの設定をするようです。

mysqlコマンドでログインしてから「source ファイル名」でも取りこめるのですが、ちょっと面倒なので、拡張INSERTを何とかやめたい。

メモ: mysqldumpで一行ずつのINSERT

MySQL :: MySQL 4.1 リファレンスマニュアル :: 4.9.7 mysqldump(テーブル構造とデータのダンプ)

MySQL4.1のmysqldumpのマニュアルには–skip-系のオプションの記述がなかったのですが、MySQL5.1のマニュアルを見たら発見。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.12 mysqldump — データベースバックアッププログラム

使えるのかなーと思って試してみたところ成功。

$ mysqldump -u root -h localhost -p –complete-insert  –skip-extended-insert –quick –no-create-info データベース名 > datas.sql
$ nkf -Ew datas.sql > datas.utf8.sql
$ mysql -u root -h localhost -p データベース名 < datas.utf8.sql

nkfの文字化けも直ったしこれで解決。


nkfでサイト全体の文字コードを変更する




















find . -type f -name "*.php" -print0 | xargs -0 nkf -Ew -Lu –in-place

とりあえずこれでEUC-JPからUTF-8にPHPファイルが再帰的に変換される。

あと、ついでに-Luにより、改行コードをLFに統一しておく。

–in-placeは既存のファイルに上書きしつつ、タイムスタンプを更新するオプション。–overwriteでも上書きできるが、–overwriteではタイムスタンプを更新してくれない。

タイムスタンプの更新をしないと、svnが更新を検知してくれない。

これで一気に処理しておいて、phpMyAdminや他のライブラリなどの変換してはいけないコードは、個別にsvn revert –recursiveする。

ちなみに–in-placeオプションについては、nkf 2.0.6より実装。

2.0.6 – Change Logの表示 – nkf Network Kanji Filter – SourceForge.JP


GmailとWindows Live メールの相性がひどい件




















いつもGmailでたくさんのメールに「Junk E-mail」というラベルが勝手につく。時々必要なメールにもつくので困っていた。

何が原因なんだろうと思っていたら、Windows Live メールのせいだった。

Gmailで受信したメールに対して、IMAPでアクセスしているWindows Live メールが勝手に迷惑メールを分類してしまうのが原因で、GmailのWeb側でいくら迷惑メールを処理しても、Windows Live メールが再読み込みするたびに元に戻される。

しかも何が困るってIMAPにはメールフィルタをかけられないこと。フィルタをかけられるなら、受信段階で処理を止めさせるとかできたと思うのだけど…

IMAP

そのくせ、迷惑メールの処理だけはするのに、それを特定のアカウントに対してやめることもできない。

一応、Gmail側のフィルタ処理を諦めれば、Windows Live メールのアカウント設定でIMAPのフォルダを設定してやることで、Gmail側の迷惑メールフォルダは使える。

IMAP2

と思ったら使えなかった。

IMAP3

あぁ…なんて微妙な…

ちなみにルートフォルダのパスを指定すれば迷惑メールフォルダにつっこめるようになるのだけど、ラベルが使えなくなるそうな。

Windows Live メールでGmail見るなってことですか、Hotmail使えってことですか、そうですか。


Pythonで、サーバからの画像取得で止まる




















サーバで画像に動的にExif情報を付加して、それをローカルのPythonで大量取得しようとしてハマったのでメモ。

ローカル側は超省略するけど、以下のような感じ。

# URLをXMLから取得
image_path = i.find("Url").text
# 認証のかかっている場所から画像取得
img = urllib2.urlopen(urllib2.Request(unicode(image_path), None, {"Authorization": "Basic " + basicAuth}))
localfile = file('./' + id + ".jpg", "wb")
# 読み書き
localfile.write(img.read())
img.close()
localfile.close()

上記を10000ファイルくらい繰り返しで取得する。

が。

img.read()のところでなぜか止まる。

大体10個くらい読み込んだ時点で止まる。

Traceback (most recent call last):
  File "***.py", line 62, in <module>
    localfile.write(img.read())
  File "C:Python25libsocket.py", line 291, in read
    data = self._sock.recv(recv_size)
  File "C:Python25libhttplib.py", line 509, in read
    return self._read_chunked(amt)
  File "C:Python25libhttplib.py", line 573, in _read_chunked
    line = self.fp.readline()
  File "C:Python25libsocket.py", line 331, in readline
    data = recv(1)
KeyboardInterrupt

色々調べた結果、サーバ側でContent-Lengthを返さないと止まることがあるっぽい。

ということでサーバ側をちょこちょこ修正。

無事、止まらずに実行できるようになりました。


PythonスクリプトをWindowsのexe形式にする




















特に迷うことは何もない。py2exeでさっくり。

Tutorial – py2exe.org

色々モジュールインポートしていても、難なく作成できる。pySerialとか使ってたけど余裕。

ただし、Vista SP1+Python2.5で作成したexeをXP SP2に持っていこうとしたら

プロシージャ エントリ ポイント _except_handler4_common がダイナミック リンク ライブラリ msvcrt.dll から見つかりませんでした

と表示されて実行できない。

msvcrt.dllのバージョンの問題らしいのだけど…?

現在調査中。というか主に.NET Frameworkをインストール中。どうかな。