Perl 5.20 と DBI と utf8
「文字化け」とは意地でも言いたくないけど、化けるものは仕方ない。
諸悪の根源(?)は、DBI ( もしくは DBD::* ) がDBのエンコーディングを自動判別するようになったせい。
発動条件
自分で確認したのは PostgreSQL 。MySQL でも出るらしい。SQLite は不明。
現象
原因
- こちらをご参照のこと→ Perl DBI と UTF8フラグ と 文字化け問題 (2017/05/31追記) - adiary開発日誌
- 接続先のDBのエンコーディングが UTF-8 だった場合、それを自動的に察知して pg_enable_utf8 フラグが真になる(っぽい)
- 接続先のDBのエンコーディングが UTF-8 以外の場合、pg_enable_utf8 フラグは偽のまま(単にデフォルトのままとも言える)
対処
- use Encode; ( Encode.pm必須!他の方法は不可 )
- perlプロセスからDBにデータを渡す場合、Encode::decode() をかけてperl内部バイトコードの状態にして渡す
- DBから文字列を受け取った場合、perl内部バイトコードになっているため、適宜 Encode::encode() をかけて(ファイルや標準出力に)出力する
NG事例集
- ファイル入出力や標準入出力での受け渡しデータの文字コードが utf8 だったとしても、encode/decode を省略することは出来ない
- pg_enable_utf8 を偽に設定し、強引に内部バイトコードや utf8 エンコード文字列を保存しても化ける(エスケープ処理される??)
- pg_enable_utf8 を偽に設定し、「 SET CLIENT_ENCODING TO 'UTF-8' 」を実行してもダメ(エラーになる)
- jcode.pl や Jcode.pm で文字コード変換する仕組みは全滅
影響を受けないパターン
perl MD5 と SHA-256 のベンチマーク
結果
$ perl bench-digest.pl 100000000 Benchmark: timing 100000000 iterations of MD5, SHA-256... MD5: 40 wallclock secs (40.22 usr + 0.02 sys = 40.24 CPU) @ 2485089.46/s (n=100000000) SHA-256: 392 wallclock secs (391.78 usr + 0.30 sys = 392.08 CPU) @ 255049.99/s (n=100000000)
コード
#!/usr/bin/perl use strict; use warnings; use Benchmark qw( timethese ); use Digest::MD5 qw( md5_hex ); use Digest::SHA qw( sha256_hex ); my $count = shift(@ARGV) || 1000000; my $tmp = 0; timethese($count, { ' MD5' => sub { md5_hex( ++ $tmp ) }, 'SHA-256' => sub { sha256_hex( ++ $tmp ) }, });
Perlバージョン
$ perl -v This is perl 5, version 18, subversion 4 (v5.18.4) built for darwin-thread-multi-2level (with 2 registered patches, see perl -V for more detail) Copyright 1987-2013, Larry Wall ...略...
iPhoneとCamera+を使って花の写真を撮る
iPhoneで小さい花などの写真を撮る場合、被写体を通り越して背景にフォーカスが合ってしまい、花がボヤけてしまう。
それを防ぐために、Camera+のフォーカス固定機能を使うと花にフォーカスや露出を合わせられる。
- Camera+を起動して被写体を狙う
- 画面上の被写体の部分をタップしてフォーカスを合わせる
- 背景にフォーカスしてしまう場合は、被写体の横に手を添え、手にフォーカスを合わせる
- タップした所に四角い枠線が表示されるので、右上の「+」をタップする
- 画面右下に出現する錠のアイコンをタップする
- 上からフォーカス、露出、ホワイトバランスのロックアイコンが3つ並ぶので、右側の錠がロック状態になるように、必要なものをタップする
- 手を添えた場合は手を外す
- 構図や水平などを調整しつつ、シャッターを切る
今どきのPCの選び方
PCを選ぶ基準になるのは、突き詰めるとどれくらいのメモリー(RAM)を必要とするかに行き着くように思える。
4GB必要/64bit移行不可
- 拡張性重視
- Core i5 (LGA1156) や Core 2 Duo (LGA775)
- Windows 7 (32bit)、Windows XP
- 2〜3GB RAM
4GB不要/64bit移行可
- 安定性/静音性重視
- Core i3 (LGA1156) や Core 2 Duo (LGA775)
- Windows 7 (32bit)、Windows XP
- 2GB RAM
4GB不要/64bit移行不可
- コストパフォーマンス重視
- Core 2 Duo や Pentium DC、Celeron DC (いずれもLGA775)
- Windows 7 (32bit)、Windows XP
- 2GB RAM