0107
最近急に寒くなりましたね。寒いととにかく外に出るのが億劫になっていけない。外にいる間もずっと暗いことを考えがちになってしまう。暗いことを考えて歩く夜道、ふと顔を上げて白い息を見上げたときの、「でもまあ、息が白いなら、いいかな」という気持ち。右上からこちらを見下ろしている半月。
仕事は大きめの改修とリファクタ。大きめの改修ったって機能としてはすごくシンプルなものなんだけど、以前そこを作った時に前提されていた条件がみたされなくなるので、それをなんとかするための実装がいろいろあった感じ。あいかわらずしんどいコードなのであちこちに肘をぶっつけながらなんとか完成した、と思う。しかし、正直なところあまり自信はない。とにかくなぜ動いているのかよくわからない部分が多いコードだから……。
リファクタのほうは、ようやくReduxアーキテクチャとUIKitを和解させるための一つの道筋を見つけた、というようなもので、つまり、非同期処理のハンドル自体はすべてViewControllerがやればいいと思うし、そのTaskをStateに持たせるなんてのは、不要だし正気でもない、という考えを明確にしたもの。これのおかげでStateは(局所的にだけど)すごくシンプルになるし、UIとの対応関係も見やすくなった。ただやっぱりどうしてもUIKitのライフサイクルとReduxはうまく整合しない部分を持つと思う(とにかくMany sources of truthsが発生しやすいのだ)。うーむ。
夜はDjangoとかいじっていました。SPAからもスマホアプリからも呼べるWebAPIを作ろうと思ったときに、SPA側はCSRF対策をしなくてはいけないのだけど、Cookieでやるとアプリ側でハンドルするのが面倒になるので、なんとかアプリ側からの呼び出し時だけ迂回できるようにした。具体的には、リクエストに特定のヘッダを追加しているときはCSRF対策を迂回するが、かわりにセッションIDも読まない、というもので、こうしておくとCSRF対策としては十分(少なくともあるユーザーに対して何かさせるリクエストは出せない)だし、アプリ側は別途認証トークンを使った認証を行うから問題ない。よい方法だ。StackOverflowのDjangoコミュニティに感謝しなくては。
あとは認証トークンが切れたときにGraphQL的にそれをどう表現するかなどを調べていた。GrapheneのMiddlewareを作れるようなので、そこで適宜判定するのがよかろう。このへんは明日にでも書く。
今日は充実した一日であった。明日もそうであることを祈りたいものだ。