今年取り組むこと

いろいろやりたいこと(技術的な)が多すぎて、逆になにもできない。 やることを絞ってみる。

やること

  • Git再入門

会社のWGでGitを使うことになったけど、仕事で使ったことがないので全然詳しくない。 プライベートでも単純なことしかしていない。
プルリクとかIssuesも知識としては知ってるくらいで、実践が圧倒的に足りない。

アウトプットをしていかないとなあ。 ただ、なにをあげればいいのかわかんないので、他の人を参考にする。

  • Qiita

技術的なメモや知見はブログよりQiitaの方がいいかなとおもった。

  • Trello

タスク管理として使ってはいるけど、もっと活用していきたい。

最近始めた。
Better Javaとしての使い方より、関数型プログラミングしたい。

Scalaやるならこっちもやったほうが良いのではと思っている。

やはり

流行りものだけれど…
やったったんぞー!

Play2.4(Ebean4)のfindPagedListでページング

ページングを実装しようと思い、方法を探していたのだけれど… どこのページを見てもfindPagingList()しか載ってない。

でもPlay2.4でライブラリとして使っているEbeanではfindPagingList()が削除されていて、 findPagedList()に置き換わっていた。

github覗いてみる。

github.com

使い方

今までの'findPagingList()'はこんな使い方(使ったことないけど)

public List<Item> findPageItems(Integer page){
    Model.Finder<Long, Item> finder = new Model.Finder<>(Item.class);
    return finder
            .orderBy("id desc")
            .findPagingList(MAX_ITEM_PER_PAGE)
            .getPage(page)
            .getList();
}

それをこうする。

public PagedList<Item> getPagedList(Integer page){
    Model.Finder<Long, Item> finder = new Model.Finder<>(Item.class);
    return finder
            .orderBy("id desc")
            .findPagedList(page, MAX_ITEM_PER_PAGE);
}

public List<Item> findPageItems(Integer page){
    return getPagedList(page).getList();
}

メソッドに分けたけど、別に分けなくていいと思う。
PagedListが取得できたら、そこから指定したページのアイテムリストを取得する。
他にも、次のページ・前のページが有るかどうかや、最大ページ数なども取得できる。

getList()は取得結果のリストがキャッシュされる。
getTotalPageCount()hasNext()は同じキャッシュ(futureRowCount)をつかうみたい。

github.com

以上

新しくModelをつくったときのJSR-303

新しくモデルを追加して、フォーム作って、さあ送信

[IllegalStateException: JSR-303 validated property 'title' does not have a corresponding accessor for data binding - check your DataBinder's configuration (bean property versus direct field access)]

ちょっと調べたら一発でした。

activator clean

してからの

activator run

で、通りました。

参考

omiend.hatenablog.jp

ありがとうございました。

EBeanでカラム型の指定

Stringなフィールドを普通にマッピングしてると、
PostgreSQLのカラム型がVARCHAR(255)になっちゃう。

    public String text_field = "";
                                      Table "public.route"
   Column    |            Type             |                     Modifiers                      
-------------+-----------------------------+----------------------------------------------------
 id          | bigint                      | not null default nextval('route_id_seq'::regclass)
 tour_id     | bigint                      | 
 text_field  | character varying(255)      | 
 create_date | timestamp without time zone | not null
 update_date | timestamp without time zone | not null

こうなるんだけど、下記のようにすると

    @Column(columnDefinition="text")
    public String text_field = "";
                                         Table "public.route"
   Column    |            Type             |                     Modifiers                      
-------------+-----------------------------+----------------------------------------------------
 id          | bigint                      | not null default nextval('route_id_seq'::regclass)
 tour_id     | bigint                      | 
 text_field  | text                        | 
 create_date | timestamp without time zone | not null
 update_date | timestamp without time zone | not null

テキストになった。


参考

stackoverflow.com

EBeanでOneToManyなリレーション

発端

PlayFramework2 with Javaを試していて、DBとの接続にEBeanを使っている。
ORMをちゃんと使うのは初めてなので練習的に。
基礎的な使用方法はいろんなサイトに乗っているのだけど、
ちょっと変?な使い方をしようとすると資料が少なくなる。

OneToManyなリレーション

Routeが複数のPinを持っている場合

Route側のモデル

@Entity
public class Route extends Model{
    @Id
    public long id;

    @Required
    public String name;

    public String memo;

    @Valid
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "route")
    public List<Pin> pins = new ArrayList<>();
    
}

Pin側のモデル

@Entity
public class Pin extends Model{
    @Id
    public long pin_id;

    public String memo;

    @ManyToOne
    @JoinColumn(name = "route_id")
    public Route route;

    public long lat;
    public long lng;
  
}

とするのが正解っぽい。

Routeモデル

    @Valid
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "route")
    public List<Pin> pins = new ArrayList<>();

@Valid
リレーション先もValidate対象にするアノテーション
@OneToMany(cascade = CascadeType.ALL, mappedBy = "route")
1:多のリレーション、親の方につける。
mappedByプロパティには、子のモデルの親を指すフィールド名を指定。  

Pinモデル

    @ManyToOne
    @JoinColumn(name = "route_id")
    public Route route;

@ManyToOne
多:1のリレーション、子の方につける。
@JoinColumn(name = "route_id")
親との結合に使用するカラム名かな?  
しばらくできなかった時は、ManyToOneアノテーションだけにしていたからのようだ。

    @ManyToOne(cascade= CascadeType.ALL)
    public Route route;

cascade= CascadeType.ALL
これをつけることで、リレーション先にも変更を行うそう。
例えば

Route route = Route.findById(1);
Pin pin = route.pins.get(0);
pin.delete();

とかすると、Routeまで削除されちゃう。

今日はここまで。

MacBook Pro Retina (2015 early)購入

購入経緯

WindowsなメインPCがそろそろお役御免な感じがする(8年目) ので、メインをOSXにしようと思った。

iMac27は置く場所がないし、持ち運びもしたいし・・・
Retina使いたいし、トリプルディスプレイもしたい。
15インチは大きくて持ち運べない気がする。
ということでMacBook Pro(Retina,13-inch、Early 2015)をポチった。
MBAはとりあえずおいておこう。

開封の儀

というわけで、簡単に開封の儀。 Apple製品は5製品目になるのか。

外箱

f:id:nitakanworld:20150723232817j:plain

いつもの外箱、特に変わったとこはなし。

本体

f:id:nitakanworld:20150723232844j:plain f:id:nitakanworld:20150723232853j:plain

アルミの筐体、材質はMBAとおんなじね。
ベゼルが細いからMBA13と比較すると少し小さく感じる。

同梱物

f:id:nitakanworld:20150723232850j:plain

  • MagSafe2 x1
  • 延長ケーブル x1
  • クイックスタートガイド

とてもシンプル…
MagSafe2の形状はMBAと同じものぽい。
ちょっとACアダプタ部分が大きくなってて、Outputの電圧が14.85Vから16.5Vになってる。
Proだから?

起動

f:id:nitakanworld:20150723233721j:plain ジャーン♪

起動してやったこと

所感

巷で言われてるように、やっぱりキレイ。 解像度って自分で設定できるんだね。

  • トラックパッドのクリック感が変わった

MBAの時はカチッって音が結構気になってたんだけど、感圧になって全然気にならない。

  • トリプルディスプレイ

なかなか壮観になるけど、よく考えたら3つ使ってもしょうがないな。 家にいるときは本体として使おう。

以上。

Play FrameworkのViewとかRoutesでコード補完が使えない件

なんでだろうなー、デスクトップの方では使えるのに… と思ってたら、見つけた。

ただ、IntelliJ IDEAでPlay FrameworkをサポートできるのはUltimate版のみで、これは有償です。無償版だとプログラミング言語であるScalaは対応していますがPlayはサポートしていません。このため、たとえばPlayのビューを書くときにコード補完が効かず、不便な思いをします。

Play Frameworkについてざっくり説明する | anopara

そうだったのか…

デスクトップの方はIntelliJ 15 EAP Ultimateだった。 MBAの方は14 CEなんで、使えなかったようだ。

WebフレームワークはCakePHPしか触ったこと無いからわかんないことだらけだなぁ

15がリリースされたら買ってみるか。