かずきち。の日記

サーバサイドエンジニアのつぶやき

NULL文字が混在する壊れたデータを強制的に処理する

データにNULL文字が入っていたせいで、readline()をしても、そこでエラー処理されるという鬼畜プレーにハマっていたので、二度とないようにメモ。


NULL文字などが文頭に存在していたら…
バイナリモードで開いて、何バイトから正常な文字列か数えてから以下のコマンドを実行すれば、文頭を除くことができます。
headコマンド使ってもいいです。

$tail -n +byte file > file


これを特定のディレクトリ以下のデータに施すときは
シェルスクリプトなり、バッチを立てて処理。


Linux系だと秀丸的なエンコーディングを変えてくれるものがないので、iconvコマンドを使います。
文字コードを変えて保存してくれます。

$iconv -f encode -t encode -c file > file


この-cは極めて大事です。
-cでomit invalid characterで、NULL文字が途中であっても、無視して処理してくれます。



あとは多言語対応テキストビューアーのlvコマンドで確認します。
エンコードを指定して、読み込んでくれます。

$lv -i utf8 -o utf8 file


-iのエンコードで仮定して読み込んで、-oのエンコードで書き出します。


あと、久々にMySQLに接続しようとしたら…
_mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
とかいうエラー出てた。
サーバが立ってない状況で死ねるので、危機的でした。
ググるTCPポート3306の解放ができていないのが問題らしいので…

$sudo ufw allow 3306/tcp


これでポートを一応開けたつもりだったけど、何も変わらず。
結局、MySQLをアンインストールして、新しく入れました。
別にDBのフォルダを別に保護しておけば、致命的にはなりません。

アンインストール
$sudo apt-get remove mysql-server
関連するものもまとめて消す
$sudo apt-get autoremove
新しくインストール
$sudo apt-get install mysql-server


あと、apt-getでupdateを行おうとすると以下のエラーが出ました。
E: ロック /var/lib/dpkg/lock が取得できませんでした - open (11 Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
のエラーが出るときは…
Synaptic パッケージマネージャの同時起動が原因なので一度消すことが大事です。
topでプロセス出してkillするなりして、再度試みましょう。


最後はどうでもいいのだけど…
クレジットカードのキャッシングの枠を現金化するやつって…
もちろん信販会社の金利より一応低いんだよね??
じゃなかったら、フツーにATMでお金下ろしちゃうしね。