2014-01-12

[murablog] Ruby on Rails アプリケーション事始め

この Blog を自前に置き換えることを目標とする.
サーバーサイドを Java で書くことも考えているが,去年触ってみたものの中途半端になってしまった Rails も触ってみようと思ったので,まず全面的に Rails で書いてみる.
(まず Rails の scaffold ベースの Blog アプリを作る → クラサバを JSON API に書き換える → サーバー側を JSON の Restful API に書き換える…というちょっと無駄な流れ.でもあえてやる.)

で,まずは Article エンティティつくるところまで.



rails new murablog-app


テストフレームワーク変更


で,テストフレームワークは test_unit ではなく RSpec を利用したいので,ライブラリを読み込み,デフォルトのテストフレームワークを変更します.

vim Gemfile
することで Bundler のライブラリ設定が編集できるので,

group :test do
  gem 'rspec'
  gem 'rspec-rails'
end

を追加して,
bundle
を実行.

で,
rails generate rspec:install
をすると rspec の設定ファイルとヘルパーが作られる.

しかし,このままだとrails 上でモデルを作った時に作られるテストコードは unit_test のものなので,デフォルトの設定を変更する.
config/application.rb の,以下の太字の3行を追加する.

module MurablogApp
  class Application < Rails::Application
    config.generators do |g|
      g.test_framework :rspec
    end
  end
end

記事エンティティを作成

おなじみ, scaffold で作成.
rails generate scaffold article title:string content:text posttime:datetime

そして,
rake db:migrate
rails server
を行った後に,ブラウザで以下を開けば OK.
http://localhost:3000/articles/new

ひとまずここまで.


2014-01-05

【JavaFX】Transition クラスで遊んでみる

JavaFX で遊ぶ,第3回目は Transition クラス.

--

今日のサンプルコードはこちら.

結局 Scene Graph とは何なのかというと,ツリー構造を持った GUI のデータ構造のこと.で,そのデータツリーの各要素が Node というクラスで構成されているわけだ.

Node のうち,子要素を持たないものを Leaf Node というのだが,コレの代表が Shape クラスのサブクラスで, javafx.scene.shape パッケージに属している.
これらのコンストラクタは,例えばこんな感じ.
Circle circle = new Circle(200, 2, 80);
Rectangle rectangle = new Rectangle(10, 100, 40, 50);
Arc arc = new Arc(200, 180, 40, 40, 0, 180);
どの型も,まず x 座標と y 座標を指定して,その後,それぞれの型に特有なプロパティを当てはめる感じですね.
--
で,これらの Shape にアニメーションを与えるのが Transition クラスです.
これは,サンプルコードを見てもらったほうが早いのですが,例えば TransrateTransition クラスを見てみます.
Text text1 = new Text("Sandbox");
TranslateTransition moving = 
new TranslateTransition(Duration.seconds(3), text1);
moving.setToX(-40);
moving.setToY(80);
どの Transition クラスも同じなのですが,まずコンストラクタでは Duration インスタンスを設定することで,アニメーションにどれだけの時間をかけるのかを決めています.この例なら3秒です.
コンストラクタの2つ目の引数は任意で,後から setter でセットすることも可能ですが,どの Node にアニメーションを与えるかを決めます.
moving#setToX と moving#setToY は TranslateTransition のメソッドで,どこに Node が移動するかを決定しています.
こんな感じで結構簡単にアニメーションを表現できるので,便利かも?
--
サンプルコードの配色はかなり適当 (目についたものを適当にピックアップしてるだけ)なので,ご容赦を…

2014-01-04

JavaFX にて,ボタンにリスナー登録 (addEventFilter と addEventHandler の違い)

JavaFX いじり,その2です.コンポーネントにイベントリスナーを登録する話.

--

本日のサンプルコードはこちら.

AWT パッケージでいうところの Component は,おおよそ JavaFX での Node というクラスに当たるようです. (だから,多分本当は「コンポーネント」という表現は良くないのかもしれません…)
それで, Node のサブクラスであるそれぞれのコンポーネントを表現するクラスは java.scene 下のパッケージで色々と用意されているようです.

Node#addEventHandler メソッド,及び Node#addEventFilter メソッドでイベントリスナーを登録します.この感覚はおおよそ AWT と変わらなさそうですが, addEventHandler と addEventFilter はどう違うの?ということ.

addEventFilter メソッドの Javadoc には「イベント伝達の capturing phaze」に呼ばれると書いてあり, addEventHandler メソッドの Javadoc には,「イベント伝達の bubbling phaze」に呼ばれると書いてあります.

つまり, Node クラスはツリー構造を持ち,ツリーの親要素から子要素に向かってイベントが伝播してゆくときに呼ばれるのが addEventFilter メソッドで登録されたリスナーであり,そのイベント完了が子要素から親要素に伝播するときに呼ばれるのが addEventHandler メソッドで登録されたリスナー,というようですね.

なので,サンプルコードでは (JDK 8 (Early Access) で書いてあるので注意!)

    button.addEventHandler(MouseEvent.MOUSE_PRESSED,
            e -> System.out.println("Handler 1"));
    button.addEventFilter(MouseEvent.MOUSE_PRESSED,
            e -> System.out.println("Filter 2"));
    button.addEventHandler(MouseEvent.MOUSE_PRESSED,
            e -> System.out.println("Handler 3"));
    button.addEventFilter(MouseEvent.MOUSE_PRESSED,
            e -> System.out.println("Filter 4"));

とボタンにリスナーを登録しているので,コンソールには
    Filter 2
    Filter 4
    Handler 1
    Handler 3
と表示されるわけです.

自分自身,あまり DOM を分かってないのですが, Node の種類を増やしてった後でいろいろ試してみようかと思います.

2014-01-03

JavaFX で Hello World するまで

久々に書きます. Mura-Mi です.
もう何度も,シリーズ化を思わせるような記事を書きつつ1回で終わるようなことをやってきたのですが,懲りずに (半分備忘を兼ねて) 記事書いてみます.

というのも,ちょっとだけ JavaFX を触ってみようかと思ったので,その記録です.
特に大きな理由があったわけではないのですが, 2014 年になり, Java 8 のリリースも3月に控えているということで,ラムダ式とかで遊んでみてたところ,ツイデだし JavaFX もこの正月で触ってみようかな,と思ったまでです.
ちなみに,普段は Java で金融系の業務システム開発に携わってますが,主に計算ロジックだったり,画面開発も社内フレームワークの上でゴニョゴニョする程度です.

--

本日のサンプルコードはこちら.

で, JavaFX で作られるアプリケーションのエントリポイントは, Application というクラスになります.
Application クラスは抽象クラスであり, start(Stage stage) メソッドが抽象メソッドで宣言されています. Application クラスから extends したクラスの start() メソッドで処理を書けば OK となります.
で, Application クラスで宣言されている launch(String... args) メソッドを呼べば start(Stage stage) 処理が動かされます.

サンプルコードを動かしたら,こんな感じになります.


とまぁ,まだまだ API に書いてあることをそのままやっただけですが,今日はここらで.
今度こそ (笑) なるべく続けようと思います


--
さて, Blogger だとソースコードのハイライトとかいろいろうまく行かないので,別のメディアに移行するのも考えてます.
仕事が忙しくなければ,勉強&遊び半分で Blog 自体も自分で作ってみようかな〜,とかも考えている今日このごろ.そのついでに,今年は勉強することを少しはアウトプットすることも習慣としてしまいたいなぁ,と.
それが出来るかどうかも,今年の仕事場が炎上しないことにかかっているのですがね…^^;