Slide 1

Slide 1 text

32bit OSは、 今すぐ捨てろ! 川原 英明

Slide 2

Slide 2 text

自己紹介 • 川原 英明 • Twitter @sapi_kawahara • Facebook kawahara.hideaki.0204 • 川越市在住、2児のパパ • 派遣会社に所属して、色々なところに常駐してます。 • スキルとしては、Perl,PHP,Java,Python,シェル,C,アセンブラ で、元コンシューマーゲームプログラマー、現在はWebアプリ のエンジニアです。

Slide 3

Slide 3 text

まずは、明日でもいいから! • Perlが動いている所にログインして uname -a と入力だ! • 結果表示に64の文字が出てくる方!

Slide 4

Slide 4 text

これから話す内容を一切聞く 必要が無いので寝てくださ い!

Slide 5

Slide 5 text

64の表示が無かった方! • そのOS、恐らくですが、サポート切れですよ。 • そのまま、動かしてもメリットは有りません。 • 2038年問題も、恐らく発生するOSです。 • 今すぐ、OSの交換をしましょう!

Slide 6

Slide 6 text

そう言っても予算が!

Slide 7

Slide 7 text

交換は無理?なんで? 工数取れない?

Slide 8

Slide 8 text

本当にやばくなったら対応す る?

Slide 9

Slide 9 text

それで大丈夫?

Slide 10

Slide 10 text

駄目でした! • printf "%d¥n", $num; • このコードが炎上しました。 • ここにくる数値が「4,294,967,296」を超えました。 • 32bit OSで、Perlのprintf では、カウンターストップをします。

Slide 11

Slide 11 text

しょうがないので • ちゃんと対応しました。 • use Math::BigInt; • my $value = Math::BigInt->new( 4294967296 ); • print $value->bstr(), "¥n"; • 結果:4294967296 • これで、なんとか、なりました。 • https://qiita.com/sapi_kawahara/items/7f8668186474d 851a802

Slide 12

Slide 12 text

それ以外の対応 • printf を使っていないところは、use bigint プラグマで対応で きそうなので、とりあえず、プラグマ対応で逃げました。 • 恐らく、大丈夫だろうと自分は信じていました。

Slide 13

Slide 13 text

世の中、そんなに甘く無い!

Slide 14

Slide 14 text

XML出力で問題が発生 • XML::Simpleで、XMLoutを使う時に問題が発生しました。 • エラーメッセージは「Can't call method "isa" on unblessed reference at /usr/share/perl/5.10/Math/BigInt.pm line 526.」です。 です。 • 確認しました。

Slide 15

Slide 15 text

サンプル 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);

Slide 16

Slide 16 text

結果 Dumper $VAR1 = { 'house' => { 'zip' => [ 350 ], 'tel' => [ '080-3726-****' ], 'twitter' => 'sapi_kawahara', 'name' => [ '自分' ], 'address' => [ '埼玉県川越市' ] } }; out: 自分
埼玉県川越市
080-3726-**** 350

Slide 17

Slide 17 text

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.

Slide 18

Slide 18 text

ああ、そうだねそうだね • 数値を、全てbigintオブジェクトにするので、当然の内容です。 • モジュールの設定を探るもの良いのですが、工数が無いので! 仕様を再確認し、XMLoutを使うところに、4,294,967,296を超 える数値がくることは無いので、XMLoutが通るところには、 use bigint プラグマが作用しないように対応しました。 • 要するに、数値を使うところだけ{ローカル化して、そこだ use bigintしました。}、物凄く逃げてます。

Slide 19

Slide 19 text

この騒動から反省点 • use bigint プラグマは万能じゃ無い。 • XML::Simpleは悪く無い。 • 32bit OSを使い続けるのが悪い。 • 今からでも、64bit OSに交換したい。 • {ローカルスコープ最強!}