ng-japanで「AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ」という題で登壇してきました

先月行われたAngularのカンファレンス、ng-japanで登壇してきました。Angular開発コアチームの発表に挟まれつつ500人という自分が今まで経験した中でもっとも大きい聴衆の前で話すということでやたら緊張しましたがなんとか終わりました。

当日見に来てくれた方や、イベントの運営に当たっていたng-japanのスタッフの皆さん、ありがとうございました。お疲れ様でした。

デブサミ2015で「モバイル時代でも戦える - Webエンジニアの歩み方」というパネルディスカッションで登壇します

f:id:anatoo:20150217145105j:plain

翔泳社さん主催の開発者向けイベント、デブサミ2015にて「モバイル時代でも戦える - Webエンジニアの歩み方」というパネルディスカッションに登壇します。イベント2日目の2月20日の10時から始まります。

話の内容ですが、デスクトップからモバイルへと主戦場が移りつつある最近の流れの中で、ウェブエンジニアはどうやって生き残ればいいか、的なお話を他の3名+モデレーターの川田さんの4名のエキスパートの方とパネルディスカッションする予定です。

私はHTML5ハイブリッドアプリのエキスパートということで参加しますが、単にモバイルHTML5について技術的なことをやってるだけで実際にはウェブとかモバイルの未来とかそういうビジョナリー的なことはあまり得意ではないので何話そうか頭の中で色々考えています。エンジニアのキャリアに関する話でもあるので、組織の中で評価されるための邪悪な方法論の話とか聞いたり語りたいとか勝手に思ってますが実際どうなんでしょう。

大した話できなさそうな気もしますが、それ以上に他のパネリストの方々がすごい人ばかりなのでデブサミ参加される方は是非参加してみると良いと思います。以上告知でした。

UPDATE: 無事パネルディスカッション終わりました。聞きに来てくれていた皆さんご清聴ありがとうございました。また、他のパネリストの皆さんもありがとうございました。

gulp.jsをいい感じに起動してくれるラッパーコマンド作った

f:id:anatoo:20150201155354p:plain

フロントエンド開発で利用するタスクランナーをGruntからgulp.jsに切り替えて半年以上たった。

gulp.jsはストリームベースの書き方ができるので、何を行うにも一度ファイルに吐き出さないといけないGruntよりも高速に動作する。これは特に複数のプラグインを組み合わせて使う場合に顕著だ。また、タスクの書き方もGruntに比べると簡潔に記述できるので、gulp.jsに乗り換えてからもはやGruntを使う気は無くなってしまった。

フロントエンド開発のプロジェクトでは、vimでファイルを保存した瞬間にgulp.jsを使ってアセットのビルドを開始させて自動的にブラウザをリロードする、というような環境を作ることが多い。これはGruntでもできるがストリームで高速に動作するgulp.jsでやると更に便利だ。

ただ面倒なところがひとつあって、gulpfile.jsを編集した時は、起動しているgulpを手で停止して再起動しないといけない。これが地味にめんどくさかったりするので、これを解決するためにgulperというgulpの簡単なラッパーを作った。

gulperは、gulpを呼び出してくれるコマンドだが、gulpfile.jsやgulpfile.jsがrequireしているファイルが更新されるとgulpを自動的に再起動してくれる。

この記事ではこのgulperについて紹介する。

インストール

普通にnpmでインストールできる。

$ npm install -g gulper

インストールはこれで終わり。gulperは内部でgulpを起動するので、もしgulpをまだインストールしていない場合はこれもnpmからインストールしておく。

使い方

単純にgulpコマンドの代わりにgulperを使えばそれで良い。例えば、gulp serveというコマンドを使いたい場合には単にgulper serveという風にgulpをgulperに置き換えたコマンドを実行すると良い。

$ gulper serve # gulpをgulperに置き換えて実行するだけ

gulperは内部では別のプロセスを建ててgulpを呼び出しているので、gulperに渡したコマンドラインオプションは全てgulpにそのまま渡される。

gulperで起動した後、gulpfile.jsやgulpfile.js内でrequireしたモジュールが更新されると、gulperはそれを検知してgulpを再起動してくれる。コードを見ればわかるが、内部の実装にはnode-devをほとんどそのまま使っている。

終わりに

gulpfile.jsを編集した時に、gulpを再起動するのは地味にめんどくさかったりする。しかもどんなプロジェクトでもこのめんどくささは変わらない。この記事では、これを解決するために作ったgulperコマンドについて紹介した。

第一回Apache Cordova勉強会で「Cordovaで作るHTML5ハイブリッドアプリ 〜開発ベストプラクティスを学ぶ〜」という題で喋ってきた

第一回Apache Cordova勉強会にて、「Cordovaで作るHTML5ハイブリッドアプリ 〜開発ベストプラクティスを学ぶ〜」という題で登壇してきました。参加された皆さんお疲れ様でした。

第二回の募集もすでに始まったりしてるみたいです。

正規表現ばかりに頼ってはいけない

f:id:anatoo:20140927151452p:plain:left:w180

文字列のパースをする必要がある時、どんな文字列にでも何でもかんでも正規表現で処理しようとするエンジニアをたまに見かける。

正規表現は確かに文字列を扱うための強力な手段だが、万能ではない。正規表現の性質上、そもそもパースできない文法があるからだ。従ってそういうケースの時には正規表現ではなく別の方法を使ったほうが良い。正規表現を無理やり使っても、バグを埋め込んだり、メンテナンスが難しかったり、正しく文字列をパース出来なかったりで良いことはあまりない。

正規表現がパースできない文字列

正規表現が苦手とする文法で一番よく言われるのは、再帰的な構文を含む文法である。例えば、括弧つきの数式なんかがそうで、1+1 でも (1+1) でも ( (1+1) ) でも ( ( (1+1) ) ) でも ( ( ( ( 1+1) ) ) ) でも、という風にいくらでも入れ子にできる。正規表現では、こういった文字列をパースしようにも括弧の対応を取ることができない(わからない人は実際試してみるといい)。

開発者の回りを見ると、括弧つきの数式以外にも再帰的な文法を持つ文字列はいくらでも転がっている。JSONだったりXMLだったりJavaScriptだったりS式だったり… あと正規表現の文法自体もサブパターンの括弧の対応を取れている必要があるので、正規表現は正規表現をパースできない。勿論、PCREの独自拡張で利用できる再帰的な文法のためのパターン(?R)があるけど、それはあくまで独自拡張である。

例え正規表現でパース可能な場合でも、正規表現が数十行から数百行に渡るような大規模な文法になれば、そんなものをメンテナンスしたいと思う人間はあまりいないだろう。

パーサコンビネータを使おう

無理やり正規表現を使う人がなぜ無理やり正規表現を使うかといえば、恐らくそれ以外のやり方を知らないからだろう。

それ以外のやり方というのは自分で一からパーサを書くのを含めていくつかあるけれども、自分はパーサコンビネータを使うことをお薦めする。

パーサコンビネータは、文字列をパースするための大変強力な手段である。正規表現よりも強力で、かつlex&yaccみたいな字句解析器と構文解析器を使うのよりも手軽だし、どの言語でもたいていパーサコンビネータのためのライブラリが存在する。

(次回へ続く)