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

32bit OSは、今すぐ捨てろ! 六本木心中編

32bit OSは、今すぐ捨てろ! 六本木心中編

sapi_kawahara

June 11, 2018
Tweet

More Decks by sapi_kawahara

Other Decks in Business

Transcript

  1. 余談:本日は天気が悪いですね️
    • 本日、雨の中、ご参加くださり、ありがとうございます。
    • だけど・・・こころなんて お天気で変わるのさ♪
    • 六本木心中 アン・ルイス

    View Slide

  2. 32ビットOSは今すぐ捨て
    ろ!
    The second 六本木心中編
    2018/06/11 Gotanda.pm #18(六本木編)
    川原 英明
    Twitter: @sapi_kawahara
    Facebook: kawahara.hideaki.0204

    View Slide

  3. 自己紹介
    • 川原 英明
    • 埼玉県川越市在中の2児のパパです。
    • 派遣会社に所属し、****的な大手企業などで開発を行っており
    ます。
    • スキルは
    • Perlちょっと出来ます。
    • PHPちょっとで出来ます。
    • Javaちょっと出来ます。
    • C言語ちょっと出来ます。(元ゲーム屋なので)
    • フロントサイド(JavaScriptなど)ちょっと出来ます。
    • サーバーサイド(Shell,AWKなど)ちょっと出来ます。
    • 最近は、RubyやPythonにも手を出しています。

    View Slide

  4. 前回話したこと
    • 32ビットOSで動いているPerlで、会員情報が、
    「4,294,967,296」を超えた。(実際は超える前に警告を出す
    よう出すようにしてあり、それが発動し、対応を行った話)
    • 32ビットOSのPerlではprintf "%d",$num;では
    「4,294,967,295」でカウンターストップするので、use
    Math::BigInt;で対応した。
    • それ以外ではuse bigint; プラグマで逃げた。
    • しかし、XML::Simple に、use bigint; プラグマを有効して
    XMLoutすると、数値項目がMath::BigIntオブジェクトになっ
    て落ちるので、XML::Simpleをつか使うところだけ、use
    bigint;を使わないようにした。

    View Slide

  5. この騒動には、
    続きがあります。

    View Slide

  6. 六本木心中
    32ビットOSと心中したくな
    い!!

    View Slide

  7. ターゲットはMySQL
    • 色々なシステムが動いているので、言語問いませんが、Perl以外は、
    64ビットOSで動いているので、とりあえずセーフでした。
    • 色々と大丈夫だったので、ついでに32ビットOSで動いている
    MySQLのバージョンが古いので、MySQL 5.1 の最終版から、64
    ビットOSで動くMySQL 5.7 の安定版に移行することになりました。
    • 設定は、今のスタンダードにしてもらいましたが、10年以上動いて
    いるシステムなので、日付関連のデフォルトは、ダメ設定「0000-
    00-00 00:00:00」のままにしました、ごめんなさい。
    • MySQLの0000-00-00 00:00:00は使ってはならない
    • https://soudai.hatenablog.com/entry/2018/05/12/191050

    View Slide

  8. データベースが用意出来たの
    でテストを行う。

    View Slide

  9. ぽとん

    View Slide

  10. ポトン

    View Slide

  11. ポトポトポトポト!

    View Slide

  12. あ゛あ゛あ゛、ア゛プ゛リ゛
    が落゛ち゛る゛!

    View Slide

  13. 一部、アプリが落ちる(PHP含む)
    • 落ちるところは、INSERTです。
    • 数値項目に、数値以外を入れようとしていますと言うエラーが
    発生していた。
    • MySQL設定のスタンダード、「STRICT_ALL_TABLES」が原
    因です。
    • この設定を辞めることも検討したが、この設定で動かないアプ
    リが悪い!と言う結論になりました。
    • そして、先人が作成したレガシーなソースコードを確認すると、
    2つ問題点が発見されました。

    View Slide

  14. 秘伝のタレ その1
    • データベースに渡すQueryにプレースホルダを使ってない。

    View Slide

  15. 秘伝のタレは害悪 その1
    • Queryの組み立ては、文字連結やら、正規表現まで駆使して、
    作り上げているタレであった。
    • そのくせ、入力値は正しい物として、処理を行うようになって
    おり、その結果、数値項目に空文字が入っていることに気づか
    ないまま実装されいる。
    • MySQLでSTRICT_ALL_TABLESが有効で無い時は、無効な値
    はスキーマーでのデフォルト値が入るので、今の今まで問題無
    しとして動作しておりました。
    • プレースホルダを使い修正しました。

    View Slide

  16. 秘伝のタレ その2
    • バリデーションが間違っている。

    View Slide

  17. 秘伝のタレは害悪 その2
    • 秘伝のタレ その1に行く前に、バリデーションを行っている
    ところに問題は無いか確認すると、もう一つの問題がありまし
    た。
    • それは、自分の目を疑うコードがありました。
    • ご覧ください。

    View Slide

  18. my $num =
    $input ? $input : '';

    View Slide

  19. 秘伝のタレは駆逐するべき!
    • my $num = $input ? $input : '';
    • それはバリデーションじゃない。
    • 作った人は、数値がきたらtrueだと思ったんだろうけど、0は
    falseだ!
    • 同一人物が実装したと思われるPHPにも似たコードがあました。
    • empty($input)とかしている。
    • 速やかに、正しいバリデーションに変更しました。

    View Slide

  20. この騒動からの反省点
    • やっぱり、32ビットOSを使い続けるのが悪い。
    • サポート切れのデータベースサーバーを使い続けるのが悪い。
    • データベースの設定は、今のスタンダードにし、エラーがでた
    らアプリが悪いと思うべき!
    • Queryは文字連結じゃなく、プレースホルダを使いましょう。
    • バリデーションは正しくやりましょう。
    • 秘伝のタレは害悪と思い駆逐する。

    View Slide

  21. これらを乗り越えて
    • 騒動を乗り越えて、やっとのことで、システムのマイグレー
    ションが終わりました。
    • 六本木心中32ビットOSと心中は避けられそうです。
    • Who are you...
    • 遊び馴れた32ビットOS六本木
    • エラーに震えるのよ純情ゆらすのよ Boogie Woogie

    View Slide