Gotanda.pm Perl Technology Conference #17 LT資料です。 https://gotanda-pm.connpass.com/event/84014/
32bit OSは、今すぐ捨てろ!川原 英明
View Slide
自己紹介• 川原 英明• Twitter @sapi_kawahara• Facebook kawahara.hideaki.0204• 川越市在住、2児のパパ• 派遣会社に所属して、色々なところに常駐してます。• スキルとしては、Perl,PHP,Java,Python,シェル,C,アセンブラで、元コンシューマーゲームプログラマー、現在はWebアプリのエンジニアです。
まずは、明日でもいいから!• Perlが動いている所にログインして uname -a と入力だ!• 結果表示に64の文字が出てくる方!
これから話す内容を一切聞く必要が無いので寝てください!
64の表示が無かった方!• そのOS、恐らくですが、サポート切れですよ。• そのまま、動かしてもメリットは有りません。• 2038年問題も、恐らく発生するOSです。• 今すぐ、OSの交換をしましょう!
そう言っても予算が!
交換は無理?なんで?工数取れない?
本当にやばくなったら対応する?
それで大丈夫?
駄目でした!• printf "%d¥n", $num;• このコードが炎上しました。• ここにくる数値が「4,294,967,296」を超えました。• 32bit OSで、Perlのprintf では、カウンターストップをします。
しょうがないので• ちゃんと対応しました。• use Math::BigInt;• my $value = Math::BigInt->new( 4294967296 );• print $value->bstr(), "¥n";• 結果:4294967296• これで、なんとか、なりました。• https://qiita.com/sapi_kawahara/items/7f8668186474d851a802
それ以外の対応• printf を使っていないところは、use bigint プラグマで対応できそうなので、とりあえず、プラグマ対応で逃げました。• 恐らく、大丈夫だろうと自分は信じていました。
世の中、そんなに甘く無い!
XML出力で問題が発生• XML::Simpleで、XMLoutを使う時に問題が発生しました。• エラーメッセージは「Can't call method "isa" onunblessed reference at/usr/share/perl/5.10/Math/BigInt.pm line 526.」です。です。• 確認しました。
サンプルuse XML::Simple;use Data::Dumper;my $xs = new XML::Simple();my $data->{'house'} = {'zip' => [350],'name' => ['自分'],'tel' => ['080-3726-****'],'address' => ['埼玉県川越市'],'twitter' => 'sapi_kawahara'};print "Dumper¥n";print Dumper $data;print "out:¥n";print $xs->XMLout($data);
結果Dumper$VAR1 = {'house' => {'zip' => [350],'tel' => ['080-3726-****'],'twitter' => 'sapi_kawahara','name' => ['自分'],'address' => ['埼玉県川越市']}};out:自分埼玉県川越市080-3726-****350
use bigintを入れた結果Dumper$VAR1 = {'house' => {'zip' => [bless( {'value' => ['350'],'sign' => '+'}, 'Math::BigInt' )],'tel' => ['080-3726-****'],'twitter' => 'sapi_kawahara','name' => ['自分'],'address' => ['埼玉県川越市']}};out:Can't call method "isa" on unblessed reference at /usr/share/perl/5.10/Math/BigInt.pm line 526.
ああ、そうだねそうだね• 数値を、全てbigintオブジェクトにするので、当然の内容です。• モジュールの設定を探るもの良いのですが、工数が無いので!仕様を再確認し、XMLoutを使うところに、4,294,967,296を超える数値がくることは無いので、XMLoutが通るところには、use bigint プラグマが作用しないように対応しました。• 要するに、数値を使うところだけ{ローカル化して、そこだuse bigintしました。}、物凄く逃げてます。
この騒動から反省点• use bigint プラグマは万能じゃ無い。• XML::Simpleは悪く無い。• 32bit OSを使い続けるのが悪い。• 今からでも、64bit OSに交換したい。• {ローカルスコープ最強!}