ReactもVue.jsもAngularJSも万能ではないよ

React好きですか?私は大好きです。仮想DOM、素敵じゃないですか。でも、会社のプロジェクトで採用しようとは全く思わないです。

JSフレームワークの話題といえば、やれReactだ、やれVue.jsだ、やれ脱jQueryだ、というのがここ数年のトレンドだと思います。これ、もう辞めませんか?フレームワークを使えばどんなものにでも対応できる、なんてものは幻想です。

先日、社内のアプリ開発チームと話をする機会があったのでいろいろと聞いてみたのですが、React Nativeを採用したアプリがあったけれども全てSwiftなどネイティブ言語に戻したらしいです。
とある人が率先してReact Nativeに取り組むも、デザイナーやプロデューサーからは批判続出、挙げ句の果てにはその人は退職して残された人がメンテを続けるという。
可読性の落ちていくコードに、ネイティブのような細かな処理を実装するのが困難(ノウハウも蓄積されていないため)で、まあガッカリだったそうで。

私はアプリ開発とは別の世界でやっているので、正直詳しいことはよくわからないのでなんとも言えないのですが、話を聞く限りでは良いことが何もなかったとのこと。うーんこの。
Web開発にしても、各種ライブラリのアップデートに対応していくなんて無理ゲーです。そんな工数はないですよ。

そんなこんなで自分の所属チームでは以下のような形で落ち着いています。

基本ライブラリ
  • jQuery
  • Underscore.js
モジュールバンドラ
  • webpack
トランスパイラ
  • Babel

普通ですね、超定番。枯れ始めた良い感じのツールたちです。セレクタはSizzleでいいのでは?AjaxはPromise使えばいいじゃん?などという話も出たのですが、結局は誰でも使いやすいようにjQueryに(あと面倒なブラウザテストを避けるためにも)なっています。

結局のところ、弊社のようにサービスを継続させていくにはメンテナンスが不可欠なわけで、仮に担当者が変わっていっても対応し易いようなものを開発していくしかないよなぁというのが所感です。仕方ないね、サラリーマンだもの。
そして仮に新しい技術やツールを採用するとしても、本当にそれが必要なのかどうかについてチーム全体で検討し合うべきだと思いますです。

PHPで日付操作するときのアンチパターン

どんな言語であっても、日付を扱うのは何かと厄介なのものです。

例えば、PHPで先月末日をyyyymmdd形式で表示したい場合。ググってみると以下のような書き方をしているサイトをチラホラ見かけます。

<?php
echo date('Y-m-t', strtotime('-1 month', strtotime(date('Y-m-1'))));
// 2017-02-28

動作は問題ない、けどちょっとこれは乱暴すぎでは?最低でも以下のように書くべきだと思います。

<?php
echo date('Y-m-d', strtotime('last day of last month'));
// 2017-02-28

この書き方は何かと便利なので覚えておいたほうがいいです。

<?php
$now = time();
$yesterday1 = date('Y-m-d', strtotime('-1 day', $now));
$yesterday2 = date('Y-m-d', strtotime('yesterday', $now));
// $yesterday1 === $yesterday2

PHP: 相対的な書式 - Manual


まあでもdate()とstrtotime()よりも、DateTimeクラスのほうが何かと捗ります。

<?php
$date = new DateTime('last day of last month');
echo $date->format('Y-m-d');
// 2017-02-28

date()はタイムゾーンがサーバ依存になってしまいますので、Webアプリ的な意味では正直言って論外です。strtotime()に関してはバッファオーバーフローするなどのバグで有名ですし。

date()とstrtotime()を使いまくっているソースを見かけた際には、ぜひプルリクしてあげてください。

Ubuntu 16.04ではncurses 6.0のコンパイルに失敗する

Ubuntu 16.04はgccのバージョンがデフォルトで5.4なので、そのままncursesをコンパイルしようとすると以下のように怒られます。

In file included from ./curses.priv.h:325:0,
                 from ../ncurses/lib_gen.c:19:
_30507.c:843:15: error: expected ‘)’ before ‘int’
../include/curses.h:1631:56: note: in definition of macro ‘mouse_trafo’
 #define mouse_trafo(y,x,to_screen) wmouse_trafo(stdscr,y,x,to_screen)
                                                        ^
Makefile:962: ターゲット '../objects/lib_gen.o' のレシピで失敗しました
make[1]: *** [../objects/lib_gen.o] エラー 1

解決策はいろいろありますが、ncurses-6.0/ncurses/base/MKlib_gen.shを直接修正するのが美しいと思います。ネットに転がっているものとほぼ同じですが、ncurses-6.0-gcc5.patchというパッチを作っておきましたのでご自由にどうぞ。

github.com

cd ncurses/base/
patch < ncurses-6.0-gcc5.patch