JavaScriptで辞書型のキーをintだと思うな

 ぼくのJSのOSSライブラリにバグが報告されたので調べていたら、タイトルのような結論が出た。「辞書型」を「連想配列」に置き換えたい人は置き換えてもらっても構わないけど、本当はなにより「オブジェクト」と書きたい。というわけで以下オブジェクトと書く。

 JSのオブジェクトのキーは、intでキーを入れても、そのキーはstringに変換される。つまり…

オブジェクトのキーに整数1があるか調べたい。
Object.keys({1:"a"}).indexOf(1);

↑ "-1"

Object.keys({1:"a"}).indexOf("1");

↑ "0"

 でも下のようなのはキャストが効くのかありだったりするみたい。
1 in {1:"a"}


 上記はブラウザではもちろんNode.jsでも。
 JSのオブジェクトのキーが整数型を使えると思っていたらいかん。千行ぐらいのライブラリを書いているのにまったく知らんかった。
comment: 0

Webアプリとフレームワーク

 Webアプリでフレームワークを使うことを忌避する人がいる。その人たちはまあその人たちで、ぼくとしてはフレームワークは使っていきたい。


・自動エスケープ設定によるフェイルセーフの導入
 個人でプログラム書いてるわけでもなければ、新しく入ってくる人とかのためにフェイルセーフは置かないといかん。だからエスケープをオンにしたテンプレートエンジンを使いたい。

・Viewとロジックの切り分け
 PHPとHTMLの混ざったコードを見ていて「なんの閉じカッコなんだよこれ」と思うようなことが結構ある。ifやforがカッコでブロック化されていて、その閉じカッコのみがPHPタグに囲まれて存在してるとか気持ち悪い。
<?php } ?>


 大きい理由としては上記のところ。フレームワークは学習コストが高いなんて言われるけど、根本にあるなにがしたいかって部分が見えれば、それぞれやってることはほとんど一緒だと感じる。
 試しに薄いフレームワークしか使ったことのなかったぼくがフルスタックとしてASP.NET MVCを使ってみたが、ブログのエンジンを一週間で、使い方を調べながら作ることができた。
 正直なところASP.NET MVCのフルスタックなフレームワークとしての機能は全然使えていない。つまり多くをフレームワークにコントロールされることなく、薄いフレームワークと同様の使い方ができたということ。これは良くも悪くも、フルスタックフレームワークだからといって書き方の縛りがきついというわけではないということだろう。個人的には縛ってくれたほうが、そのフレームワークの思想とかが見えてきそうで面白いのだが。
 先日に同業の方と話す機会があったが、フレームワーク使うといろいろメリットあるよねという話ができて、やっぱりそうなるようなと思った。そういうわけで、今はASP.NET MVCをちゃんと使えるようにインプットとアウトプットを繰り返している。
comment: 0

デブサミとDevOps

 先週のデブサミで、興味のあったDevOpsに関するセッションを聴いてきた。DevOpsとは銘打っていなくても、それに準ずるような開発工法を発表している会社もあり、どんな課題が出てくるのかなど参考になった。
 そんなんでDevOpsに近づくためのステップを考えつつ自動テストを組んだりしていた。

 「巨大IT企業の筆頭であるMSでさえDevOpsにシフトにした」、そんなことが書かれた記事を見て感心し、いったいどんな仕組みで進めたのかが気になって読み進めた。それでも、MSは特別なんだから、まだ日本にこの開発手法が浸透するのはだいぶ先だろうと考えていた。
 別所で日本ヒューレットパッカードがDevOpsについて書いてある記事を見つけた。
http://www.atmarkit.co.jp/ait/articles/1701/29/news001.html

そこには「このツールを入れるとこんなすげえことができるんだ」ではなく、「もうこういう合理化していく時代だよね。そのためにはこういう仕組み入れていくべきだよね。じゃあこういうツールでそれを実現していこう」というようなことが書かれていた。本質的。外資といえど日本にある企業が、すでにDevOpsのなんたるかを理解して実践していた。巨大SIerの一角がこんな状態なら、DevOpsは案外早く来るんじゃないか?

 ぼくはもともとDevOpsがしたかったわけじゃない。自動にできるものは自動化して、仕事の属人性を排除したり(そんなにレベルの高いことやってるわけでもないので)、人為ミスによるエラーを減らしたかった。そのためにワンクリックデプロイや自動テストを調べていると、その先にリリースを高速に繰り返しながらプロダクトを磨き上げていくDevOpsが可能になるのを知った。そうするとそこまで到達したいというのは自然なことだ。もちろんDevOpsがゴールではない。

 さいきん、仕事にExcelを使った課題管理と、紙による資料管理が追加された。下手するとぼくは浦島太郎になるんじゃないだろうか。そうなる前に、先を走っている人たちに追いつきたい。
comment: 0

新人としてPHPプロジェクトでやらかしたこととその対策

 プログラマとして仕事を始めて間もないころ、PHP + Apacheというちょっとレガシーだけどよくある環境で開発を一人で任され、その開発期間中から納品後までえらいてんやわんやを経験した。ぼくの目の届くところで以後そういうことがないように、メモとして対策などを残しておく。


・定数宣言は一つのファイルにまとめろ、そしてそれを必ず読み込め
 PHPとApacheの組み合わせはそのディレクトリとURLのパスの対応が直感的らしく、簡単に見えるので非常に好まれていた。で、さまざまなパスに対応してPHPスクリプトが置いてあるわけだが、各ファイルで同じデータベース接続文字列が宣言されていた。開発環境から移行するとき、開発用データベースから本番用データベースへの接続文字列を書き換えなければならないところを見落とし、データベース接続をミスった。
 データベース接続文字列やローカルのファイルへのパスなどは、環境の移行によって変わる可能性がある。そういうものをいろんなファイル内に散在させず、宣言を一か所にまとめ一元管理できるようにしておく。


・絶対パスを書くな
 本番のディレクトリの隣に開発のディレクトリがあって、納品後に開発のほうは消そうか?という話になった。消したら本番の機能が一つ死んだ。本番ファイルが絶対パス指定によって、開発ディレクトリにあるファイルを読んでいたからだった。
 絶対パスを書くと、環境移行でそのパスの書き換えが必要になる。そんなことしなくていいように、相対パスや、下記のような、スクリプトのあるディレクトリのパスを有効に使う。
dirname(__FILE__)



・つか本番と開発のコードに差異を作るな
 定数宣言は環境を判断して分岐で宣言内容を変えれば、環境ごとに書き換える必要がなくなる。絶対パスを書くのをやめれば、環境を移してもパスの問題は出ないだろう。
 ぼくの見たところでは、メンテナンスが必要になったコードを本番から落とし、もろもろ宣言を書き換えて開発に適用してメンテナンスをしていた。メンテナンスが済んだコードは再び本番用に宣言を書き直されて本番へアップされていた。おいおい。
 
comment: 0

Bash on Ubuntu on WindowsでpyenvでFlask

'17/2/16追記*********************************************
公式ドキュメント見たらpyenvがdeprecatedだったので、この記事は完全に参考にならない記事に。
https://docs.python.org/3/library/venv.html

*********************************************

 FlaskでうっすいWebアプリを突貫で作りたかった。デプロイはコンテナでするとして、適当な環境で動きを確認するまでコンテナに入れなくていい。まずてっとりばやくFlaskを動く環境を作りたかった、Pythonは最新の3.6で。なのにWindowsでFlaskがうごかない・・・Bash on Ubuntu on WIndowsがあるじゃない。でもUbuntuのPythonは3.6じゃない。そこでpyenvを使うことにした。ちなみにPythonを始める人はこういう仮想環境構築はせんでいいと思う(参考)。


 まずBashを開く。そして依存ツールのインストール。
$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \

libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils


 そしてpyenvのインストール。
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc


 シェル再起動。
$ exec $SHELL


 今回使いたいPython3.6.0を入れる。
$ pyenv install 3.6.0


 カレントディレクトリで実行されるPythonを3.6.0にする。
$ pyenv local 3.6.0


 あとはpipでflaskを入れて動作確認。

comment: 0