Perl 5.20 と DBI と utf8

「文字化け」とは意地でも言いたくないけど、化けるものは仕方ない。

諸悪の根源(?)は、DBI ( もしくは DBD::* ) がDBのエンコーディングを自動判別するようになったせい。

発動条件

  • Perl 5.20 以上 (らしい。自分では検証していない)
  • DBI を使う ( DBI や DBD::Pg のバージョンも関係してるはず )
  • DBのエンコードUTF-8

自分で確認したのは PostgreSQLMySQL でも出るらしい。SQLite は不明。

現象

  • perlプロセスがDBI経由でDBに保存する utf8 文字列が化ける
  • perlプロセスがDBI経由でDBから取り出した 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 で文字コード変換する仕組みは全滅

影響を受けないパターン

  • DBのエンコーディングUTF-8 以外の場合、これまでと何ら変わらない処理方法が可能
  • jcode.pl だろうが Jcode.pm だろうが「 SET CLIENT_ENCODING TO '〜〜' 」でもなんでもござれ

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+のフォーカス固定機能を使うと花にフォーカスや露出を合わせられる。

  1. Camera+を起動して被写体を狙う
  2. 画面上の被写体の部分をタップしてフォーカスを合わせる
  3. 背景にフォーカスしてしまう場合は、被写体の横に手を添え、手にフォーカスを合わせる
  4. タップした所に四角い枠線が表示されるので、右上の「+」をタップする
  5. 画面右下に出現する錠のアイコンをタップする
  6. 上からフォーカス、露出、ホワイトバランスのロックアイコンが3つ並ぶので、右側の錠がロック状態になるように、必要なものをタップする
  7. 手を添えた場合は手を外す
  8. 構図や水平などを調整しつつ、シャッターを切る

iPadとiPhoneのUA比較

iPad (OS 3.2)

Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; ja-jp) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10

iPhone (OS 3.1.3)

Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_3 like Mac OS X; ja-jp) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7E18 Safari/528.16

iPad/iPhoneについての現在の疑問点

  1. プリペイドプランで有効期間が過ぎた時、Wi-Fiでの使用は可能か?
    • 大丈夫らしい
  2. 同じく、その状態でOSアップデート/アクティベーションは可能か?
    • 大丈夫らしい(上記参照)
  3. 次期iPhone(多分microSIM)のSIMをiPad 3G版に刺して(またはその逆)使う事は出来るか?
  4. その時の料金のかかり方は?

今どきのPCの選び方

PCを選ぶ基準になるのは、突き詰めるとどれくらいのメモリー(RAM)を必要とするかに行き着くように思える。

  • 「4GB必要」=メモリーを大量に必要とする、あるいは負荷の高い作業をする。
  • 「64bit移行可」=使用中のソフトウェアやデバイスドライバが64bit対応出来るかどうか。

4GB必要/64bit移行可

4GB必要/64bit移行不可

4GB不要/64bit移行可

4GB不要/64bit移行不可