yuw27b’s blog

技術メモと雑記

PHPがセッションIDを発行しなくなった

突然PHPsession_id()が空白を返すようになってしまった

もちろん本当に「突然」なのではなく、何かいじってしまったからなのですが。

PHPのセッション情報は、デフォルトではファイルに保存される

ので、そのファイルの読み書きができなければセッションIDも発行されません。

phpinfo();

でセッションの項目を確認。
session.save_handlerfilesの場合、
session.save_pathに設定されているディレクトリに読み書きの権限があるかを確認。



なぜそんなことになったのかの推測(自分メモ)

対象ディレクトリのユーザーがroot、グループがapacheになっていた。
当該サーバではApacheではなくNginxを使っているので、グループがapacheなのはおかしいようにも思える。
おかしくなる直前に、PHPの追加モジュールを入れたりしていたので、そこでパーミッションをいじってしまったか、グループがapacheに変わってしまったのかもしれない。

2019年の振り返り

もう22時だ…簡単に振り返り。(あれ、去年は書いてない)
今年も引き続き、大学の研究室でエンジニア業をしていました。ほぼ1人チーム開発です。
(昨年度からは副業しづらい契約なので、フリーランス業はお休み中)

Webアプリ開発

フロントはReact、バックエンドはRubyPHPでRESTful API、がほぼ定番化してきた感じ。今年は新規開発は少なめ。APIの仕様はSwaggerで定義している。
データベースはほぼMySQLだけど、最初のテーブル設計などはかなりマシにできるようになってきたと思う。
これまでに4〜5個は作っているので、だいぶ慣れては来たけど、もう少し丁寧にやりたい気持ちもある。
TypeScript入れるとか、テスト書くとか、CI入れるとか。
ただし、一般消費者向けサービスではないし、仕様変更も頻繁なので、どの程度までやるべきなのかが難しい。一人なので、なんとかなってしまってる、というのもあるかもしれない。

年明けに、仕様をきちんと固めてから作る案件がありそうなので、そこで導入したい。

そもそもWebアプリの仕様ってどういう風に記述するのが良いのでしょうか。おすすめあったら知りたいです。

機械学習

医療画像の判別モデルの作成にも取り組んでいました。
ディープラーニングアルゴリズム自体は、全く専門外ですし手を出せず、既存のものを使っていましたが、学習データをいかに準備するか、というところが重要なのだ、というのが私の印象です。
そのためのツール(Webアプリ)作りや、効率化のためのスクリプト作成など、結果的にはかなり学ぶことも多かったです。

これから機械学習をメインにすることはないと思いますが、周辺でのエンジニアリングには引き続き興味があります。

心残り

やはり、フリーランスでのコーディング業がなくなったので、CSSを書く機会が激減しました。
いかに分かりやすく、無理せず、メンテナンスしやすくCSSを書くか、ということに取り組むのはとても好きなので、もう少し書きたい気持ちがあります。

その他

出張:オーストラリア・アメリカ。国内は九州が多かったかな?
あまり遠出すると、コードを書く時間は減るので、それはちょっとどうなんだ、という気持ちもあり。
勉強会とか技術系のカンファレンスももう少し参加したかったです。

あとは、自分用のお役立ちBotを作ったり、遊びでBot作って友達に笑ってもらったり、Puppeteer使って遊んだり…ちょっとしたことでも技術で何か解決したり、物作りしたりするのは楽しいですね。

来年

やりたい:TypeScript、TDD
サーバレスな設計も興味はあるが、仕事では様々な理由でオンプレサーバがメインになるので、難しそう。

CSSカウンターを使って変則的な番号付きリストを実装する

久しぶりにCSSカウンター便利だな、と実感したのでメモ。

CSSカウンターとはこういうものです:
CSS カウンターの使用 - 開発者ガイド | MDN


こんな感じの文書をWebページに掲載するときに(あくまで例ですがこういう構造)、
f:id:yuw27b:20191105214629p:plain

マークアップにはOL要素を使うのが妥当に思えます。
リストの通し番号より先にカッコ付きの文が出てくるので、CSSカウンターを使ってこんな感じでコーディングしました。


See the Pen
List with CSS counters
by Yu Watanabe (@yuw27b)
on CodePen.

リストアイテムの先頭でなくても、任意の場所で通し番号を表示できるので便利です。
もちろんOL要素以外でも使えます。

ボタンを押したことが伝わるCSS

a要素やbutton要素のボタンのCSSは、最近よくこんな感じにします。
:active属性でボタンを押下した状態のスタイルを指定できますが、1px下に動かすだけでもユーザーに「ボタンを押した」ことが伝わります。


See the Pen
button:active
by Yu Watanabe (@yuw27b)
on CodePen.

margin-topまたはmargin-bottomでも下に1px動かすことはできますが、もともとのマージンや、隣接・親要素のマージンとの相殺が起こっている場合もあるので、それらに影響のないtransformを使っています。

特に装飾に指定がない場合は、この「とりあえず1px動かしておくCSS」を入れています。

Let's Encryptの証明書更新コマンドは、月1回実行ではダメ

TL;DR

  • Let's Encryptが発行するSSL証明書の有効期間は90日
  • ただし時計のずれを考慮して発行(更新)手続きの1時間前を"issue date"として発行される(つまり有効期間は発行時点からだと90*24-1時間)
  • なので、cronで「毎月x日」の設定で月に1回更新コマンドを実行している場合、暦によっては更新が間に合わず失効する可能性がある


深く考えずに月に1回更新コマンドを実行していたら、危うく失効しかけたのでメモ。

業務上の都合で、(クラウドではなく)自前のサーバにNginxをインストールして、いくつかのWebサービスホスティングしています。
SSL証明書Let's Encryptから取得し、HTTPSのサービスをしています。
そして、毎月1日のAM7時に証明書の更新コマンド(certbot-auto renew)が作動するようにcronを設定していました。
このコマンドは、有効期限が30日未満(less than 30 days)であればその証明書を更新する、という動作をします。

例えば1月1日のAM7時に取得された証明書がありました。

f:id:yuw27b:20190312120019p:plain
ファイルの生成日時を確認すると、1月1日の7:06です。

f:id:yuw27b:20190312120121p:plain
ブラウザでこの証明書の有効期限を確認すると、4月1日の6:06です。

今後のcronの作動タイミングは、
2月1日AM7時
3月1日AM7時
4月1日AM7時
・・・
ということになりますが、

2月1日AM7時・・・証明書の有効期限まで30日以上あるので更新かからず
3月1日AM7時・・・証明書の有効期限まで30日以上あるので更新かからず(3月は31日まである!)
4月1日AM6時6分・・・証明書失効(!)
(約1時間の証明書期限切れ状態)
4月1日AM7時・・・ここでやっと更新がかかる

約1時間とはいえ、これでは証明書の更新が間に合っていません。

ここで、証明書の有効期限は4月1日の7:06ではないのか、という疑問がわいたのですが、
ブラウザで証明書の詳細を見ると、1月1日の6:06に有効になって、4月1日の6:06に無効になる、と表示されます。
f:id:yuw27b:20190312163250p:plain

なぜ1時間ずれているのか。
同じ疑問を持った人がいるようで、Let's Encryptのコミュニティに質問と回答がありました。
Certificate Not Valid Before dated 1 hour prior to generation - Help - Let's Encrypt Community Support

回答者の中にLet's Encryptのエンジニアさんもいますが、時計のずれを許容できるように、という理由だそうです。

結論

月に2回とか25日に1回とかの設定で更新コマンドを実行するのが安全。

蛇足な補足

実は何度か「あと20日で失効しますよ」という警告のメールが届いて、不思議に思いつつも「とりあえず」で手動で更新したことがありました。月に2回更新コマンドを実行するように変更してからはそういう「不思議な」事態は起こっていません。