おまけ記事

ついでなので本職趣味の方の話も少し。

模型を本格的に作り出したのは多分高校に入ったくらいから。
私はわりとこだわりが(略、もちろん普通にキットを作るだけでは飽きたらず、キットとは別に売られているディテールアップパーツを買ってきて取り付けたり、やっぱり本を買ってきては見よう見まねで改造を加えていたりしてました。

高校卒業前くらいに完成した1/200 駆逐艦雪風


専門学校に入った頃、一度1/350スケールで戦艦を作ってみたいなーと思いたち、当時はキットが無かったので半年ほどかけて1/350 戦艦長門をプラ板と金属線などを使ってフルスクラッチしました。はてなダイアリーを使い始めたのがこの頃です。
2006-07-23 - 艦船模型の壷Blog

1/350 戦艦長門


就職してからも、ペースは落ちたものの少しずつ作り続けていたら第五回スーパーキッズランドプラモデルコンテストで特別賞を頂いたりもしました。

1/700 巡洋艦矢矧


そんな感じで、こちらの方もゆっくりですが続けていくつもりですのでよろしくお願いします。

転職します

5/18の出勤を最後に、今の会社を退職することになりました。
今の会社には専門学校の1年生の夏ごろからインターンとして入り、そのままずっとバイトとして働いた後は正社員として2年ちょっと、合計して6年近く働いてきました。

6年間を振り返ってみる

もともと人数の少ない会社だったので、その間はけっこういろんな事をやりました。
マニュアルの作成、サーバ環境の構築、ベンチマーク、Swingで作ったちょっとしたGUIツールの開発なんかに始まり、最後の1年半では一つの製品のゼロからの開発に関わりました。
有難いことに、企画からリリースに至るソフトウェア開発の全行程に関われるという貴重な経験が出来て、これには感謝しています。
そのソフトウェアは何度かバージョンアップを重ねて最終的に550クラスくらいでした。もともと、ユニットテストなど知らない頃にいきなり書き始めたコードだったので、自分で生産したレガシーコードを自身で改善するという貴重な(略


ところで私はわりとこだわりの強い性格をしているので、誰から言われたわけでもなく上手く開発をやりたいと思い始めるわけですが、社内には相談しようにも相談できそうな相手が居ない環境。そんなわけで専ら本やWebを使って勉強していました。
積んだままの本もや読みかけの本も多いので正確な数はよく分かりませんが、約3年で60冊程度くらいなのでそんなに多くない模様。せっかくの機会なのでいくつか紹介しておきます。

Filthy Rich Clients アニメーションとグラフィカルエフェクトを使ったデスクトップJavaアプリケーション (The Java Series)

Filthy Rich Clients アニメーションとグラフィカルエフェクトを使ったデスクトップJavaアプリケーション (The Java Series)

  • 作者: チェット・ハーゼ,ロマン・ガイン,Chet Haase,Romain Guy,松田晃一,小沼千絵
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2008/11/26
  • メディア: 単行本(ソフトカバー)
  • 購入: 2人 クリック: 41回
  • この商品を含むブログ (20件) を見る

About Face 3 インタラクションデザインの極意

About Face 3 インタラクションデザインの極意


珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造

珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造


CODE コードから見たコンピュータのからくり

CODE コードから見たコンピュータのからくり


Effective Java 第2版 (The Java Series)

Effective Java 第2版 (The Java Series)


インターフェイス指向設計 ―アジャイル手法によるオブジェクト指向設計の実践

インターフェイス指向設計 ―アジャイル手法によるオブジェクト指向設計の実践


Java仮想マシン仕様 (The Java series)

Java仮想マシン仕様 (The Java series)

  • 作者: ティムリンドホルム,フランクイェリン,Tim Lindholm,Frank Yellin,村上雅章
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2001/05
  • メディア: 単行本
  • 購入: 5人 クリック: 93回
  • この商品を含むブログ (33件) を見る

勉強会

しかし、本だけでなくやっぱり人から直接話を聞いてみたい&見てみたい。というかこのままで将来やっていけるんだろーか。などと思っていたところで勉強会なるものの存在を知り、1年前くらいから参加するようになりました。
なんだ、外にはすごい人がいっぱいいるじゃないか。自分もあんな人達になりたいし、仕事でもあんな人達と何かを作りたいたいなあなんて思ったり。

転職

そんな時間を過ごした会社ですが、ちょうど色々タイミングもよかったので転職することになりました。


そんなわけで現在有給消化中、6/1からは新しい職場で働きます。
今後もよろしくお願いします。

お約束?のamazon ほしい物リストです。よろしくお願いします。

鹿駆動勉強会で発表してきました

「Starting JavaFX <5分で!」というタイトルで発表してきました。
あまりGUIアプリケーションに詳しくない人向けに、JavaFXで何かを作ってみよう的な事を話そうかなということであのような感じの内容だったわけですがどうだったでしょうかね?30分位でも充分話せそうな題材なのでちょっと欲張り過ぎた感がしなくもない。
また、あのような大人数の前で発表するのは初めて、でもないのですが緊張で右手が震えてしまい、ろくろを回せなかったのが残念です。
コードはgithub*1へ数日中にアップロードしようと思います。

それはさておき
いつものhoge駆動的なノリ&人数の勉強会だろうと思い、勢いでatndを立てたのが1月下旬。
30人くらい集まれば会場費もなんとかなるだろうと思い、能楽ホールの使用申請をしたのが2月中旬。
まさか90人を超える人数の勉強会になるとは予想だにしませんでした。
無線LANが接続の限界を超えてしまってたり、懇親会の告知が上手く行き渡ってなかったりと反省する点もありますが、参加者及びスタッフの皆さん、本当にありがとうございました。
参加してよかった、と思える勉強会であったならば幸いです。

*1:少し修正したい

AreaChartの丸を消す

今回はAreaChartの点を消す話です。
まずは"丸"って何?という疑問を浮かべている人が多数だとおもいますが、下の図の矢印のあたりに並んでいる丸です。

この丸を正確にはsymbolと呼ぶようなので、この記事でも以後はsymbolと呼ぶことにします。


さて、まずは本題に入る前にAreaChartについて簡単に説明を。
すごく簡単に言ってしまうと、 ObservableList> data) の形でグラフ中の X, Y 座標に相当するデータのリストをチャートとして描画するクラスです。
なのですが、デフォルトの表示スタイルだと上の図のようにすべてのデータ点に symbol が表示されてしまうため、データが詰まっていると少し不細工です。なので、非表示に設定しようと javadoc を眺めてみたところそれらしいメソッドはありません。

困ってTwitterでつぶやいてみたところ、@skrbさんから


というアドバイスを頂きました。JavaFXのコントロールの細かなスタイルの設定はCSSで、というポリシーなのですかね。


そんなわけで、教えてもらったURLとCSSリファレンス
http://docs.oracle.com/javafx/2.0/charts/css-styles.htm
http://docs.oracle.com/javafx/2.0/api/javafx/scene/doc-files/cssref.html
とにらめっこしてchart-area-symbolという要素をCSSで非表示にすればいいことがわかりました。
それで書いたCSSが下のものです。

.chart-area-symbol { visibility: hidden; }

このCSSを適用させて実行させてみたところ、下の図のようになりました。


下のlegend領域のsymbolも一緒に消えてしまいました。
表示を同期させるというのは、単に色を変えたりする場合ではありがたい仕様ですが、今回の場合ではこれは困ります。
下のlegend領域のsymbolのスタイルは、area-legend-symbolを指定することで変更できるようなので、表示するように設定を追加してみました。

.chart-area-symbol { visibility: hidden; }
.area-legend-symbol { visibility: visible; }

このCSSを適用させて実行させてみたところ、下の図のようになりました。

チャート部分のsymbolを消したまま、legend領域のsymbolを表示するのに成功しました。

Dukeフィギュアを作ってみた

ちょっと話題的に古いのですが、Dukeのフィギュアを作ってみましたのでその紹介を。

まずこのようなエポキシパテという、混ぜ合わせることで化学反応により硬化する粘土のようなものを準備します。


おもむろにしっかりと混ぜます。


しっかりと混ぜ終わったら、適当なサイズにちぎって、おおまかに形を作ります。
・・・バラバラです。


パテが完全に硬化したら、紙ヤスリで形を整えつつ全体のバランスをとっていきます。
Dukeさんは形状がそれほど複雑でないのでここまでは簡単に出来ました。


削ったり盛ったりしながら主に手と腕の形状と、表面を整えていきます。
地味ですが一番の難所です。


出来上がりました。


有難いことに欲しいという方が何人かいたので、複製することにしました。
片面ごとに分けてシリコンを流しこみ型を取ります。
下の画像は半分を粘土に埋めているところです。


シリコンをだばぁっと。大体硬化に半日ほどかかるので気長に待ちます。
両面取るので合計24時間ですね。


型が出来上がったら、レジンというのを流しこんで型からインスタンスを生成します。
真ん中が原型で、両端が複製したものです。


あとはエアブラシでさくっと塗装して完成です。お粗末さまでした。


中の人は主に艦船模型とか作ってます。
もし興味があれば御覧になってください。
http://www.navalvessel.jp/

IntelliJ IDEAが便利になる40のショートカット

ここ数カ月、家でも仕事でもIntelliJ IDEAを使っているのですが、せっかくのIDEなのにショートカットをほとんど使っていなくて宝の持ち腐れ状態になっているので、ちょっと調べて便利そうな物を一欄にまとめてみました。
Macでは微妙に違うものもあるので注意。

ショートカット 動作
Ctrl + Space Basic Code Completion
Alt + Enter Show intention actions and quick-fixes
Ctrl + Alt + L Reformat code
Ctrl + Alt + O Optimize imports
Ctrl + P Parameter info
Ctrl + Q Quick Documentation lookup
Ctrl + F1 Show descriptions of error or warning at caret
Alt + Insert Generate code
Ctrl + O Override methods
Ctrl + I Implement methods
Ctrl + Alt + T Surround with
Ctrl + / Comment/uncomment with line comment
Ctrl + Shitt + / Comment/uncomment with block comment
Ctrl + W Select successively increasing code blocks
Ctrl + Shift + W Decrease current selection to previous state
Ctrl + D Duplicate current line or selected block
Ctrl + Y Delete line at caret
Shift + Enter Start new line
Ctrl + F4 Close active editor tab
Shift + F10 Run
Shift + F9 Debug
Ctrl + N Go to class
Ctrl + G Go to line
Ctrl + B Go to declaration
Ctrl + Alt + B Go to implementation(s)
Ctrl + H Type hierarchy
Ctrl + Shift + H Method hierarchy
Ctrl + Alt + H Call hierarchy
F11 Toggle Bookmark
Shift + F11 Show Bookmarks
F2 / Shift + F2 Next/previous highlighted error
Shift + F6 Rename
Ctrl + F6 Change Signature
Ctrl + Alt + N Inline
Ctrl + Alt + M Extract Method
Ctrl + Alt + V Introduce Variable
Ctrl + Alt + F Introduce Field
Ctrl + Alt + C Introduce Constant
Ctrl + Alt + P Introduce Parameter
Ctrl + J Insert Live Template

以下解説。

Ctrl + Space [Basic Code Completion]

いわゆる入力補完。一番お世話になるやつですね。

Alt + Enter [Show intention actions and quick-fixes]

キャレットのある位置で行うのに適したアクションの一覧を表示します。
という説明だとなんのことやらわかりにくいですが、エラー・警告表示の箇所では取り敢えずこのショートカットを使えば何とかなる。そんな頼りになる奴です。二番目にお世話になるやつです。
クラス名の上で入力するとサブクラスやテストクラスも作れます。

Ctrl + Alt + L [Reformat code]

コードを自動整形します。まさか手動でなんかやりませんよね?
整形ルールは設定のCode Styleで編集できます。

Ctrl + Alt + O [Optimize imports]

不要なimportを削除したりしてくれます。まさか手動で(略
こちらも設定のCode Styleでルールなどを編集できます。

Ctrl + P [Parameter info]

メソッドのパラメータ一覧を表示します。
パラメータを忘れた時にはこれ。

Ctrl + Q [Quick Documentation lookup]

javadocを表示します。
このクラス/メソッドなんだっけ?そんな時に。

Ctrl + F1 [Show descriptions of error or warning at caret]

キャレット位置のエラー/警告の説明を表示します。

Alt + Insert [Generate code]

コードを生成します。
setter/getterにメソッドのオーバーライド、委譲などが生成できます。

Ctrl + O [Override methods]

オーバーライドしたメソッドを生成します。

Ctrl + I [Implement methods]

interfaceのメソッドの実装を生成します。
もちろんinterfaceをimplementしていないクラスでは無意味です。

Ctrl + Alt + T [Surround with]

選択箇所をif文、while文、synchronized文などで囲みます。

Ctrl + / [Comment/uncomment with line comment]

選択行をコメント行化またはその逆を行います。

Ctrl + Shitt + / [Comment/uncomment with block comment]

選択箇所をコメントブロック化またはその逆を行います。

Ctrl + W [Select successively increasing code blocks]

連続したコードブロックを選択状態にします。
連続で入力すると、入力するごとに選択範囲が広がります。

Ctrl + Shift + W [Decrease current selection to previous state]

入力するごとに選択範囲が小さくなります。上のショートカットと組み合わせて使います。

Ctrl + D [Duplicate current line or selected block]

キャレットの行または選択箇所を複製します。

Ctrl + Y [Delete line at caret]

キャレットのある行を削除します。

Shift + Enter [Start new line]

新しい行を入力します。
どの位置にキャレットがあっても新しい行を入力できて便利です。

Ctrl + F4 [Close active editor tab]

アクティブなタブを閉じます。

Shift + F10 [Run]

実行します。

Shift + F9 [Debug]

デバッグモードで実行します。 

Ctrl + N [Go to class]

入力欄が表示されるので、クラス名を入力するとそのクラスのコードに移動します。

Ctrl + G [Go to line]

行番号を入力するとその行に移動します。

Ctrl + B [Go to declaration]

クラスやメソッド、変数などの宣言箇所に移動します。

Ctrl + Alt + B [Go to implementation(s)]

インターフェイスやそのメソッドを実装しているクラスの一覧を表示します。

Ctrl + H [Type hierarchy]

クラスの継承階層を表示します。

Ctrl + Shift + H [Method hierarchy]

継承しているクラスなどでのメソッドのオーバーライドの状況を表示します。

Ctrl + Alt + H [Call hierarchy]

メソッドを呼び出しているメソッドの一覧を表示します。

F11 [Toggle Bookmark]

キャレットのある行をブックマークに追加または削除します。

Shift + F11 [Show Bookmarks]

ブックマークの一覧を表示します。

F2 / Shift + F2 [Next/previous highlighted error]

コード中の次の/前のエラー箇所に移動します。

Shift + F6 [Rename]

クラス名やメソッド名、変数名などを変更します。

Ctrl + Alt + N [Inline]

選択しているメソッドをインライン展開します。
使うことがあるのか微妙ですが一応。

Ctrl + Alt + M [Extract Method]

選択箇所をメソッドにします。

Ctrl + Alt + V [Introduce Variable]

変数宣言を入力します。

new ArrayList<String>();

だけ入力してからこのショートカットキーを入力すると

ArrayList<String> strings = new ArrayList<String>();

こんな感じに補完されます。

Ctrl + Alt + F [Introduce Field]

こちらはフィールドとして宣言を入力します。

Ctrl + Alt + C [Introduce Constant]

こちらはstatic finalなフィールドとして宣言を入力します。

Ctrl + Alt + P [Introduce Parameter]

こちらはメソッドやコンストラクタのパラメータとして宣言を入力します。

Ctrl + J [Insert Live Template]

テンプレートを入力します。
soutで

System.out.println();

など、いくつか標準でもテンプレートが設定されています。

SwingでUIアーキテクチャパターン Supervising Controller編

今回はMVPパターンのうちSupervising Controllerと言われるパターンで「BMIによる肥満度判断」のサンプルを実装してみます。


前回のMVCパターンで問題となったプレゼンテーションの状態・ロジックを持つのがプレゼンターになります。また、MVCのビューはモデルの更新を受けて、ビュー自身が表示を更新を行いますが、Supervising Controllerではプレゼンターがプレゼンテーションロジックに関してビューを更新することができます。
では早速プレゼンターからコードを見ていきます。

public class Presenter{

    private boolean notifyEvent;
    private View view;
    private Model model;

    public Presenter( View view ){
        this.view = view;
    }


    public void setModel( Model model ){
        this.model = model;
    }

    public Model getModel(){
        return model;
    }

    public boolean isNotifyEvent(){
        return notifyEvent;
    }

    public void heightChanged( DocumentEvent e ){
        String text = getTextWithDocumentEvent( e );
        heightChanged( text );

    }

    public void heightChanged( String newHeight ){
        notifyEvent = true;
        try{
            model.setHeight( newHeight );
            updateColor();
        } finally{
            notifyEvent = false;
        }
    }

    public void weightChanged( DocumentEvent e ){
        String text = getTextWithDocumentEvent( e );
        weightChanged( text );

    }

    public void weightChanged( String newWeight ){
        notifyEvent = true;
        try{
            model.setWeight( newWeight );
            updateColor();
        } finally{
            notifyEvent = false;
        }
    }

    private void updateColor(){

        float bmi;
        try{
            bmi = Float.parseFloat( model.getBmi() );
        } catch ( NumberFormatException ignored ){
            return;
        }

        Color bmiColor;
        if( bmi < 18.5f ){
            bmiColor = Color.WHITE;
        } else if( bmi < 20.0f ){
            bmiColor = Color.YELLOW;
        } else if( bmi < 30.0f ){
            bmiColor = Color.ORANGE;
        } else{
            bmiColor = Color.RED;
        }

        view.setBmiBackground( bmiColor );
    }

    private String getTextWithDocumentEvent( DocumentEvent e ){
        try{
            return e.getDocument().getText( 0, e.getDocument().getLength() );
        } catch ( BadLocationException ignored ){
            return "";
        }
    }
}

前回のMVCパターンでは、モデルに実装していたBMIを表示するテキストボックスの背景色に関するロジックですが、今回のSupervising Controllerではこのプレゼンターに実装しています。
プレゼンターではユーザからのイベントをモデルに渡した後、updateColor()でBMIを表示するテキストボックスの背景色を計算してビューを直接更新しています。

public class Model{

    private EventListenerList listenerList = new EventListenerList();

    private String height = "";
    private String weight = "";
    private String bmi = "";


    public String getWeight(){
        return weight;
    }

    public String getHeight(){
        return height;
    }

    public String getBmi(){
        return bmi;
    }

    public void setWeight( String weight ){
        this.weight = weight;
        updateBMI();
        fireModelChanged();
    }


    public void setHeight( String height ){
        this.height = height;
        updateBMI();
        fireModelChanged();
    }

    private void updateBMI(){

        float height;
        float weight;

        try{
            height = Float.valueOf( this.height );
            weight = Float.valueOf( this.weight );
        } catch ( NumberFormatException e ){
            return;
        }

        if( height == 0f ){
            return;
        }

        float bmi = weight / ( height * height );

        this.bmi = Float.toString( bmi );
    }

    protected void fireModelChanged(){
        ModelListener[] listeners = listenerList.getListeners( ModelListener.class );
        ModelEvent event = new ModelEvent( this );
        for( ModelListener l : listeners ){
            l.modelChanged( event );
        }
    }

    public void addModelListener( ModelListener listener ){
        listenerList.add( ModelListener.class, listener );
    }

    public void removeModelListener( ModelListener listener ){
        listenerList.remove( ModelListener.class, listener );
    }
}

結果モデルからはプレゼンテーションに関するロジックが無くなり、純粋なドメインオブジェクトのクラスになりました。
ビューはBMIを表示するテキストボックスの背景色のセッターが追加されただけなので、ここではコードは省略します。


次回は、Passive Viewパターンです。
今回のコードはこちらです。
ソース一式(github)