Upgrade to Pro — share decks privately, control downloads, hide ads and more …

32bit OSは、今すぐ捨てろ!

32bit OSは、今すぐ捨てろ!

Gotanda.pm Perl Technology Conference #17
LT資料です。
https://gotanda-pm.connpass.com/event/84014/

sapi_kawahara

April 16, 2018
Tweet

More Decks by sapi_kawahara

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  6. そう言っても予算が!

    View Slide

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

    View Slide

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

    View Slide

  9. それで大丈夫?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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


    自分
    埼玉県川越市
    080-3726-****
    350


    View Slide

  17. 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.

    View Slide

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

    View Slide

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

    View Slide