コードを書いてくらす

プログラミングについて書いてます。

Reactをやってみる

久しぶりにCloud9にログインしてみたらAWS傘下に統合されていたり、Githubはこの前Microsoftに買収されたけどWebの世界は変化が激しい。以前、ここに投稿していたAngular.jsもどんどんバージョンアップしているし。

前から気になってはいたけど、こんなに次々とリリースしたらユーザーの学習コストの方もかなり上がってしまうはず。今さっき、気になってReactを見てみたけど、Angular.jsとは全く異なるアプローチを採っていて応用できるものはなさそうだった。
フレームワークやライブラリだって永遠に使えるわけではないし、ライフサイクルがあることは分かるけどこのフロントエンド周りはちょっと早すぎじゃないかと思う。

と言いつつも、流行りのReactを少しだけ触ってみた。
GitHub - matildatilda/librarysample

*branchはtrial
*node_modulesは含まない

スターターに含まれているページに、テーブルを追加しただけ。まだタグしか表示できていないけど、ここからイベントや見た目を変えていく。その前に、公式をざっとでも読んでおかないと。

reactjs.org

ライブラリやフレームワークの仕様を理解する、触ってみる、の組み合わせで覚えていくのだけはあまり変わってない。

今日はこの辺で。

久しぶりすぎる更新

ほぼ2年ぶりのブログです。放置しすぎてある意味新鮮だ。
読み返したらRuby on Railsチュートリアルがほったらかしで終わってたりして、あまり知識のストックとしての目的は果たせてないものの、模索の痕跡というかちょっとした思い出にはなってる。

この2年も、もちろんコードを書いてくらしていました。
ここで模索していたようなWebアプリケーション開発をやっていたので無駄にはならなかったけど、コードについてというより別の部分で困難があったと、振り返って思う。
というのも、そもそもコードを書く以前の問題の方がすごく多い。

大まかな問題としては、

  • フロントエンドを実装する前にサーバーが起動しない、または時間がかかる
  • サーバーサイドの実装が更新されるとフロントエンドの実装が動作しなくなることが多い

など。
設計や構成をディレクションする立場ではなかったから、この「実装までの準備の時間」を直接的に解決できないことが大変だった。

反省を込めて振り返ってみると

  • フロントエンドはモックなどを使って実装し、結合は別の工程として作業する
  • フロントエンドとバックエンドの切り離し、または緩衝レイヤを設置するなどの実装の分離を徹底する

のように、工数の分割や実装レイヤの分離が不十分だった。
実装そのものは、ぶつからないようにファイル構成などがきちんと分離されていたので大きな問題は起きていなかった。

問題点は実装時の分離と結合に集約されると思う。
ここで気をつけたいのは、最終的なシステムの構成とコンストラクションの計画とは別だということ。
小規模のシステムであれば、個々のサブシステムを順次作り上げていき、最終的に結合する手順で問題ない。
けれどシステムの複雑さが増せば、それに伴うコンストラクションも単純であるはずがなくて何かしらの戦略が必要になる。

ここまで来るとSEの領分になってしまうので、実装のレベルで取れる対応を挙げてみたい。

  • 先行処理、後続処理の連結を緩やかにし、並行して実装できるようにする
  • 処理間のデータフローの視覚化


「並行して実装」は、前述の通りモックの利用やテストファーストな実装で実現できると思う。
またDDDのように処理を階層化することも良い。

「データフローの可視化」は、必要としているデータと入力データ、出力しなければならないデータと出力データの差分がすぐに確認できる状態にあると良いと思う。並行して実装していて、処理間の連結にずれが生じた時にすぐに発見できることが重要。これもツールを利用したり、システム内にデバッグ用のモジュールを組み込む、などで対応できると思う。


あまり大きな開発に携わったことがないので当たり前のことを書いているのかもしれないけれど、こういう知見を得られたのは良かったと思う。

それでは、今日はこの辺で。

Ruby on Rails チュートリアル その6

ずいぶん間が空いてしまったけど、ようやく11章完了。

今回は後半で画像アップロード機能を実装したんですが、本番環境でAWSのストレージを登録する部分については省略しました。アカウント取るだけなんだけど、まあいいやと思って。

さて、今回はMicropostの実装がメインでした。データベースの列の追加、アクションの指定、コントローラーの追加などはこれまでチュートリアルでやってきたことの復習のような感じ。ようやくこの辺の操作はさらっとできるようになってきたと思います。まあしばらくやってないと忘れてたりするんですけどね。


少し難しいのは既に実装したUserまわりの機能と連携する部分。連携といういか、User - Micropostは1:n の関係になるのでUserを削除したら関連するMicropostも削除する、などの制約があるところです。これまではデータベースの方で制約を定義したり、カスケードで削除アクションが起こるように設定しておいたりしてたんですが、railsではたった1行の宣言でできてしまうんですね。すごい。
Viewもオブジェクトに依存するコードを避けながら書けるので、部品ごとにコンパクトにまとまって見通しが良いです。


画像のアップロードも想像していたよりもかなり少ないコードで実装できてしまうので、本当にwebアプリケーションの要件に特化したフレームワークなんですね。
そして今回もテストがちょっと理解できていません。とりあえず通すことだけを念頭に、最後にざっとでも読み返してみようと思います。


あとは12章だけ。少し先になってしまいそうだけど、時間を見つけて進める予定です。
今日はこの辺で。

Ruby on Rails チュートリアル その5

ちょっと間を置いてしまったけど、9章、10章終わり。

10章の最後でパスワードリセットのメール配信のためにherokuのアドオンを使う部分があるんですが、今のところ保留中です。実装は全部できているんだけどアドオンサービスのためにクレジットカード番号を登録しなければならないらしくて、まあサンプルでそこまで要らないかなと思って止めました。それにしてもこれまではサーバーを立ててやらなければならないことも、こんなに簡単にできてしまうんですね。


9章のユーザー管理部分はさほど難しくはないけど、ユーザーフレンドリーにリダイレクトをする、その部分のテストが少しややこしいですね。というかこんな複雑そうに見える手順もテスト化できてしまうのがすごい。
10章はちょっと理解が追いついていないです。ユーザー認証とパスワードリセットの実装ですが、それぞれ章に分けてもいい程のボリュームです。実装自体はそれほど多くないけど、ダイジェストとトークンを使った認証が難しい。ユーザー認証もリセットも同じパターンを使っているみたいですが。それとメールに特化したメイラーという機能がRuby on Railsにはあるんですね。外部のライブラリではなく本体にバンドルされているところが、webアプリ特化型のフレームワークぽいです。


メイラーの使い方も一通りやってみましたが、一応理解はできても応用となるともう少し把握していないと難しそうです。それとメールに埋め込んだURLからのアクションもちょっと分からない。きちんとパスとアクションの結びつけをイメージしていないと思わぬアクションに飛んだりしそうです。そのための統合テストですが、その辺りをきちんと理解していないと間違ったテストを書いてしまうかも。


ちょっとボリュームが多くて挫折しそうですが、あと2章。できれば近日中にがんばります。
今日はこの辺で。

Ruby On Rails チュートリアル その4

先週に続き、6、7、8章まで完了。

ユーザー登録、ログイン、ログアウトの実装とそれに関する統合テストがメインです。セッションやトークンを使ったやりとりは以前にもPHPで似たことをしたのでさほど難しいことはないですね。
ただ全体は把握できたけど、コードをあちこちに書いているせいかクラスの役割がまだいまいち理解できていないところがあります。MVCは分かるけど、ヘルパーとか埋め込みビューがちょっと曖昧。チュートリアルにありそうだけど、自分で図を書いてみるといいかもしれないです。


今回はテストの方が大変でした。これを使いこなすようになるには全然理解できていないです。今のところ把握した部分をまとめてみます。

単体テスト

  • 正誤の2つのケースで作る
  • 分岐を網羅する
  • 網羅していない箇所は例外を投げる(そこでテストが必ず失敗するように)

統合テスト:

  • シナリオを想定する(今回の場合は、複数のビューからログアウトしたら、というケース)
  • フィクスチャー(テストデータ?)のパターンを用意する

というところです。
単体テストについては書けそうだけど、統合テストのシナリオは想定する業務や手順を前提に設計しないといけないような感じで、効率よくテスト設計をするにはもっと習得が必要そうです。

今日はこの辺で。

Ruby on Rails チュートリアル その3

5章まで終了しました。

途中でクラスや配列の操作説明が入ったりして、なかなかボリュームがありますね。
オブジェクト指向の基本はだいたい理解しているのでさほど難しいとは思わないけど、リテラルから即メソッドを呼び出したり、ハッシュリストのネストだったり、よく考えると背後でキャストしてるので当たり前ですが、ちょっと「ん?」となる書き方がけっこうありますね。javascriptもそうだけど、実行時点でのオブジェクトがどんな型なのかを常に把握しておく必要があります。整数だと思っていたら文字だったり。


それとルーティングの部分が少し不明です。

get 'help' => 'static_pages#help'

これを定義すると勝手にhelp_pathが参照可能になるようなんですが、これはグローバルな変数なんだろうか…。
Ruby on Railsは厳密にはRubyではないようだし、その差はまだ問題ではないけれど一応気をつけて置かなければならないところです。


今日はこの辺で。

Ruby on Railsのチュートリアル その2

というわけで今日は3章まで完了しました。
序盤からきっちりテストを盛り込んであるのがいいですね。チュートリアルで指示があるとどうしてもそれをやらなければ先に進めないのでいい習慣付けになりそうです。


以前はwindows環境での開発をメインにしていたので、Visual Studioにバンドルしていた単体テストを使っていたんですが、どういうテストがいいのか、どのくらいカバーしていればいいのか(コア部分だけでもするべきか)が分からなくてわりといい加減なテストしかできていませんでした。
これはこれで綿密な設計や計画が必要なものなので、生半可にとりかかってもあまり効果がないような気がします。
それでもやらないよりはましだろうけど。


とりあえず手元にあるコードコンプリート(下)にテストの項目があるのでそれを読み直して、すこしテストについても考えておこうと思います。

CODE COMPLETE 第2版 下 完全なプログラミングを目指して

CODE COMPLETE 第2版 下 完全なプログラミングを目指して


今日はこの辺で。