Yuki猫のおうち

気ままに自由に日々を生きるエンジニアのブログ

AGC040 A - ><

今日の問題

atcoder.jp

今日の言語

golang

所要時間

1h 51m 03s

私の解答

github.com

感想

アホみたいに時間かかりました。法則性が全然見つけられませんでした。
1問目にこんなに時間をかけているようじゃ本番だったら一問も解けずに終わってるので、ごちゃごちゃ考えていないでまずはコードを書いてACすべきだったんでしょうね...

参考資料

なし

データベーススペシャリスト試験落ちました

惨敗

そういえば、今年の春に受験したデータベーススペシャリスト試験ですが、午前1で点数が足りず落ちました。

応用情報技術者試験の範囲をしっかり勉強し直してからそのうちまた受験したいです…

ブログ更新と勉強のモチベーション維持のためにも、勉強した内容をちゃんとまとめてブログに投稿するといいかもしれない。

PHP5.6からPHP7.3への移行対応

概要

会社の業務で、PHP5.6環境で動作しているプロダクトをPHP7.3環境に移行する対応を行ったので、対応内容を忘備録として残しておく。

一度に記事を書くのは大変なので、この記事をハブページとして、項目別にいくつかの記事に分けて投稿していく予定。

PHP5.6のサポートが切れている

公式サイトによると、PHP5.6のサポートは2019年1月に切れていることになっている。

PHP Manual:Supported Versions

f:id:yukineko4you:20191212002011p:plain
PHPのバージョン毎サポート情報 (PHP公式サイトから抜粋)

セキュリティサポートが切れているといっても、なにも今すぐ危険だというわけではない。とはいえ、今後致命的なセキュリティバグが発見されても修正されないということなので、そのまま放置していいものでもない。

PHP7

およそ10年ぶりのメジャーアップデートというのもあり、PHP5と比べると処理性能もメモリ使用量もかなり改善されている。
理論値では、およそ2倍になるケースもあるのだとか。

「PHP 7」登場。10年ぶりのメジャーバージョンアップで実行速度はPHP 5の2倍以上に、PHPの生みの親が語る。PHPカンファレンス2015(前編) - Publickey

単純にサーバー処理時間が短くなるのでレスポンス速度が速くなるし、CPU負荷も下がるのでスケールアウトしているサービスであればサーバー台数を削減できるかもしれない。
これは移行しない手はない。

対応方針

今回の移行にあたって、メンテナンス期間なしで移行対応を行うことになった。
方法としては、スケールアウトされているサーバー群に対して、PHP7環境のサーバーをサービスインしてPHP5環境をサービスアウトする、という方法で徐々にPHP7環境へと移行していく方式をとる。
その性質上、一時的にPHP5とPHP7のサーバーが混在する期間が発生するため、コードをPHP5でもPHP7でも動作する互換性のあるコードに修正していく方針となった。

下位互換性のない変更点

メジャーアップデートなので、当然(?)下位互換性のない変更点というのがいくつかある。

詳細は公式サイトにまとまっているが、全てのソースコードを目で確認するのは土台無理な話である。
そこで、静的チェックツールを活用しつつ下位互換性のない変更点を修正していくことになる。

https://www.php.net/manual/ja/migration70.php

静的チェックツールを利用した互換性のない処理の洗い出し

今回はPHPCompatibilityを使用した。

PHPCompatibility

github.com

導入方法は別記事で書く。

(予定)macにcomposerをインストールする
(予定)macでPHP5とPHP7の環境を切り替えられるようにする
(予定)composerでPHPCompatibilityをインストールしてコードを静的チェックする

互換コードへの修正対応

これはたくさんあるので後日別記事で書く。
(予定)PHPCompatibilityを活用してPHP5系とPHP7系どちらでも動作する互換コードに書き換える
(予定)PHPCompatibilityではチェックしきれない下位互換性のない変更点の修正

ABC075 B - Minesweeper

今日の問題

atcoder.jp

今日の言語

golang

所要時間

40m 29s

私の解答

github.com

感想

golangにおける文字列操作で、n番目の文字を置換するってどうやるんでしょう?
ちょっと調べた感じでは見つけられませんでした。

私の書いたコードでは、読み込んだ文字列を置換するのではなく、結果文字を文字列連結して別の配列を作ったので実行時間ギリギリになっちゃいましたが、一応ACできました。
十中八苦文字列連結が重たいと思うので、実行速度は改善の余地ありかなと。

参考資料

なし

ABC003 C - AtCoderプログラミング講座

今日の問題

atcoder.jp

今日の言語

golang

所要時間

42m 53s

私の解答

github.com

感想

視聴レートRが大きい動画をK個選んで、視聴レートRが低い順番にK個見ていけば良い。
入力されたRを降順ソートして、K個目から1個目までループを回して計算していけば良い。
よく考えたら、降順ソートしなくても、昇順ソートしてn-k-1個目からn個目まで回せば十分だった。

ARC060 B - Choose Integers

今日の問題

atcoder.jp

今日の言語

golang

所要時間

36m 24s

私の解答

github.com

感想

数字の法則性に気がつくためには紙に書いて整理するのが一番ですね。
数式として頭の中で組み立てられるようになりたい。

参考資料

なし

ARC002 B - 割り切れる日付

今日の問題

atcoder.jp

今日の言語

golang

所要時間

43m 35s

私の解答

github.com

感想

日付の扱いが難しくて手間取りました。
後、最初条件式を「年が月で割りきれるかつ年が日で割り切れる」にしていたんですが、この式は誤りで正しくは「年を月で割った商を日で割る」ということに気がつくまで時間がかかりました。