Mac OS XでASP.NET 5開発環境構築(with Visual Studio Code)

MicrosoftからASP.NETがオープン化されてしばらく経ちました。前々から興味があったので、試しに開発環境構築をしてみます。

ASP.NETは昔は、Windows ServerのIIS上でしか動作せず、業務系のアプリケーション開発でよく使われていそうなイメージがあります。(その程度の知識しか持ち合わせていません…)

しかし、Windows Azureが登場してから、一気にASP.NETを利用する敷居が下がったのではないでしょうか?これまでオンプレミスのみで動作していたところから、クラウド化によってWindows Serverの利用が容易になりました。そして、ASP.NETのオープン化やVisual Studio Codeの様な、LinuxやMac OS Xでの開発環境を提供したことで、これからのWeb開発の選択肢にASP.NETが1つ加わったのではないかと思っています。

これまで、Web開発にはRuby on Railsをずっと使ってきました。最近は業務系のWebアプリケーション開発をよく行っているため、案件によっては社内サーバにデプロイする可能性も増えています。そこで、クラウド上(Windows Azure)とオンプレミス上(Windows Server)のどちらにもデプロイが行いやすい、ASP.NETを採用できないか考えていました。

正直なところ、Visual Studio自体は素晴らしい開発環境だと思うのですが、Windowsの使い勝手が悪く、その点で敬遠していました。Visual Studio Codeも公開され、いよいよ採用のチャンスかなと考えています。

それでは、本題の開発環境構築へ。

Continue reading

【gnuplot】PDFで線の種類を変える

gnuplotを使ってPDFのグラフを出力する際に、線の種類をlinetypeで指定しても変化が無かったので調べました。
結論から言うと、set terminal pdfset terminal pdf dashedに変更することで線の種類が変わります。

ダメな例

set terminal pdf

set output "test.pdf"
plot sin(x) with line , \
	cos(x) with line

通常

dashedオプションを付けた例

set terminal pdf dashed

set output "test_dash.pdf"
plot sin(x) with line , \
	cos(x) with line

dashedオブション付き

Railsでドメインロジックをモデルに書くのは、果たして良い設計なのだろうか?

Railsの”モデル”は責務を持ちすぎでは無いだろうか?

RailsのActive Recordはエンティティ(テーブル)とロジックを1対1に縛って、1枚岩の”モデル”と呼ぶオブジェクトとして扱っている。単純な場合は1対1で、多少の複雑さであればActive Recordは非常に便利なAPIを提供してくれて、開発効率をグンと上げてくれる。

しかし、ある程度の複雑度が出てくるとドメインロジックはエンティティと1対1に対応しなくなるし、それを扱う側(Controllerなど)によってロジックが変わることもある。

単純にFat modelに従えば、どちらか一方のモデルのメソッドとしてロジックを隠蔽する。そのため、複数のモデルの操作をしているにも関わらず、様々なデータ操作の責務を1つのモデルが抱えてしまう。これをControllerやViewで扱う時には、操作するオブジェクトが直感的で無く扱いづらい。

(例えば、複数のエンティティのデータを複合した集計なのに、一方のモデルのメソッドから取ってくる場合、1つのフォームから複数のモデルに対してアクセスする場合。)

かといってControllerに書いたら、DRYではない。

 

この1枚岩になっているエンティティとドメインロジックを、切り離してそれぞれ別のオブジェクトにした方が良いのではないだろうか?

この問題についてずっと考えてきた個人的な結論としては、ModelとControllerの中間層にオブジェクトが介在して、このオブジェクトがビジネスロジックの責務を持つのが良いのではないか?と考えてきた。

ふとSQLアンチパターンを呼んだところ、まさにActive Recordパターンのこの問題について言及している章があった。(24章:マジックビーンズ)SQLアンチパターンで提示されている解決策としても、エンティティ=アクティブレコード, ドメインロジック=ドメインモデルとして分離することを推奨していた。

 

ところで、1枚岩のActive Recordの機能をバラして使おうとする(Active Modelなど)とActive RecordやRailsの恩恵が犠牲になってしまう。(文字通りレールから逸れている)
ここをうまく切り抜けるにはどうしよう…というところ。うまくRailsのAPIを吸収して、ドメインモデルを分離したい。
この辺りに取り組んだ事例などが知りたい…

追記(12/11)

a_suenamiさんから、アドバイス記事をいただきました!

Rails でドメインロジックの実装方法まとめ

他にも参考になる記事があったので紹介します。

肥大化したActiveRecordモデルをリファクタリングする7つの方法(翻訳)

 

カメラのタイマーレリーズを自作してみた

「タイムラプス撮影や長時間露光撮影をしてみたい!」

ということで、この3連休を使ってCanonのタイマーレリーズをマイコンで自作してみました。前々から作ってみようと考えていたので、パーツ類は既に揃っていて、あとは手を動かすだけの状態でした。

自作タイマーレリーズ

自作タイマーレリーズ

Continue reading

【jQuery】selectボックスのchangeイベントを検知できない

jQueryを用いて,selectボックスの値に応じて何かしたいというパターンは多いですよね.jQuery.changeを用いればselectボックスの値の変更を検知することができます.

しかし,他のイベントと異なりjQuery.changeは定義の仕方を誤ると動作しません.

【動かない例】

(function() {
  $('#sample_select').change(function() {
    // 内容
  }));
)(jQuery);

【正しいコード】

そのままでは動かなかったので,jQuery.readyを使う必要があります.(よくよく考えてみれば,DOMの読み込みが完了してからセレクタを使わないとダメですよね…)

jQuery.readyは以下の様にも記述できます.

$(function($) {
  $('#sample_select').change(function() {
    // 内容
  });
});

jQueryを使うときは,基本的にはjQuery.ready(function() {})あるいは$(function() {})で囲むように注意しましょう.