Scala

今年も Scala Matsuri のスポンサーになりました

昨年、Scala Conference in Japan 2013 というイベントが行われました。 Scalaのカンファレンスとしては日本初で、大規模なイベントとして成功をおさめています。

今年は ScalaMatsuri 2014 という名称に変わり、規模も大きくなり、定員も増えて、ますます世の中のScala自体やScala周辺技術への注目を感じさせます。

Scala Matsuri

Scalaって?

久々に会った人にScalaとかやってるんですよ的な話をすると、プログラマーの人でも「何それ?」って顔をすることが未だあります。知られているところではすごくメジャーで、それ以外のところではほぼ無名、まだそんなポジションだと感じます。

Scala というのはプログラミング言語の名前でして、Javaなど静的型付き言語を扱う人の間では近年特に有名になっている言語です。静的型付き言語系を扱わない人でも、HaskellOCamlなどとともに関数型プログラミング系な言語の話題で名前が挙がっているのを見たことがあるかもしれません。

はじめてScalaを聞いたという人でも、 TwitterLinkedIn などの世界的大規模サービスのバックエンドとして使われていると言えば、ほほーと思うかも。そのほか、国内のソーシャルアプリやSNSなど実はバックエンドがScalaですなんていう事例はいくつも存在しています。

この2年くらいで、Playの人だと言われることが増えた

僕自身、現在ほとんどの業務の中心を Play framework というScala製のWebアプリケーションフレームワークを中心に、バックエンドおよびそれ上で動くWebのフロントエンドへ注力しており、実際それによって生活が成り立っているといってもいいくらいお世話になっております。

また勉強会を継続的に開催しているおかげでいろいろな縁が生まれたりしています。

昨年は、Java版のPlay frameworkの書籍を出させていただく機会もあり、特にJava使いがメイン構成となっていてモダンなフレームワークを探しているチームには必読の書となっています。

Play Framework 2徹底入門
http://www.amazon.co.jp/dp/4798133922/

Play framework がScala で動いている以上、本イベントも積極的に応援したいと考え、昨年に引き続き微力ではありますがスポンサードさせていただくことにしました。

開催は、2014-09-06(土)と09-07(日)の2日間です。

現在追加席販売中とのことで、検討されている方はぜひぜひ。こちらよりお申込みいただけます

普段PHPとか使ってるし、縁がないかも?

とはいえ、Scala は、Java VM上で動く静的型付き言語なので、PHPとかをメインで使っている方や、JavaScriptメインで使っている方にはあまりなじみがない方向性&プラットホームでしょう。JavaScriptを扱うエンジニアでもAltJSのTypeScriptなどを導入したことがある人ならコンパイル時に型チェックが行える静的型のメリットに触れたことがあるかもしれません。

Scalaは、Javaの持つオブジェクト指向のシステムを更にブラッシュアップしたBetter Javaとしての側面があり、何らかのプログラミング言語を触る機会がある人は(それがたとえフロントエンドであっても)、触ってみると刺激をうけると思います。Scalaを通じて得られる知見は、その後のコードの書き方を変えてしまう可能性もあると感じています。

ぶっちゃけScalaやその周辺ツールであるsbtとかakka、難しいなあと思います。ただ、Scalaからはじまる旅というのが勉強の過程ではある気がしていて、Scalaで詰まり、よくわからず影響を受けたと言われるHaskellをいじりに行ってみたり、型理論の本を買ってみたりなどした旅を一巡りして帰ってくると、今まで扱っていた言語に関する見方は結構変わったりするよなあと。

あと、今回のイベントでは、Scala 設計者, Typesafe 創業者である Martin Odersky 先生の講演もあります。これもScalaの根底に流れる想いをじかに聞くチャンスです。

ということで、 Scala Matsuri よろしくお願いします。

Read More

2013年のOptionUtil(Play Java的な意味の)

Play framework 2.x Java and 1.x Advent Calendar 2013の5日目担当の @kara_d です。
もはや12/5を過ぎてしまいましたが頑張ります。。

今回は、PlayのOptionの話。PlayのOptionを楽に扱えるOptionUtilというライブラリを去年から作成して使っていたのですが、1年ほどいくつかの仕事で使ってみた感想を書きます。

Optionは、Scalaとかに搭載されているコンテナ型の一種です。
値のある状態とない状態を保持することが出来、値がある状態はSome、ない状態はNoneという型で表現されます。
PlayにはF.javaというライブラリがあり、この中に含まれています。

実は去年もOptionの話を書きました。

2.0以降のPlay JavaでパワーアップしたPlayのOptionをつかう

その後、

Play 2.x用の管理画面プラグイン kurad

を作成した際にOptionUtilという小さなユーティリティクラスを作成しました。

OptionUtil

OptionUtilは、Java上でScalaのOptionを利用できるようにしようという野心的なものではなく、単にPlayのOptionを便利にしようとしたものです。

これは、kuradプラグイン内での使用に留まらず、いくつかの仕事で使うことになりました。

サーバ実装が自分のみの仕事の場合

個人プレイに近いような仕事では、自分で作ったので当たり前ですが大いに活用しました。nullが入りそうなところでは、

Option<Hoge> hoge = OptionUtil.apply(someMethod());
if(hoge.isDefined) {
    // Do
}

などのように、Scalaに比べればまどろっこしいかもしれませんが、その値がどういう状態を持ってやってくるかということが型でわかるためにNullPointerほげほげ系のミスが減りました。

チームでの利用

別の仕事としてチームでの仕事をすることにもなり、ここでも積極的に導入しました。Play 2.x Javaなプロジェクトです。

Optionを使うというスタイルは、はじめは馴染まなかったものの、徐々に導入されるようになっていき、その結果コード量の割にはnull系のバグは少なくなったと思っています。

ただし、僕の伝え方が悪くてパラダイムになじめなかったケースでは、Option型の返り値でのgetOrElseメソッドにnullを入れて利用されてしまうなどはおきました。特に導入当初はJavaな人たちからしてみれば、なんじゃこりゃ的な感じでした。

その後、安定されて使用されていっており、別プロジェクトでもOptionUtilを導入しているケースを確認しました。

現在では、一部使用ライブラリの関係上null値を渡さないといけない部分以外はほぼすべてOptionUtilを利用している状態になっており、一部過剰な感じになっております。

PlayのOptionには、値があるかどうかを判断するメソッドとして、isDefined()がありますが、これが一番よく使いました。値が無い場合の設定値を指定可能なgetOrElse()もかなり使うメソッドですが、Java版でgetOrElse()を使うと結構冗長になりやすく、むしろ見づらくなってしまうことが多々ありました。

ScalaのOptionではきっと多用されているmap()も、PlayのOptionにはあります。ただ、このmap()というメソッドは関数的なものを渡す必要があり、Javaの場合は匿名クラスとなってしまうため、ちょっとした処理も非常に大げさなものになってしまい、あまり利用しませんでした。

いろいろなメソッドがScalaのほうにはあるのですが、Java版は、値の有無を型で表現する以上の用途では使っていないのが現状です(それでもかなり便利ですが…)

コードも当初のものからブラッシュアップされ、PlayのOptionからScalaのOptionを返す、asScalaなどというメソッドも入っています。

以下が現状のOptionUtilです。

package jp.greative.utils;

import play.libs.F;
import scala.*;
import scala.None;
import java.util.List;

/**
 * OptionUtil
 *
 * @author hara kazuhiro - http://greative.jp/
 */

public class OptionUtil {

    public static <A> F.Option<A> apply(A value) {
        if(value != null) {
            return F.Option.Some(value);
        } else {
            return F.Option.None();
        }
    }

    public static <A> F.Option<List<A>> apply(List<A> value) {
        if(value != null && value.size() != 0) {
            return F.Option.Some(value);
        } else {
            return F.Option.None();
        }
    }

    public static <String> F.Option<String> applyWithString(String value) {
        if(value != null && !value.equals("")) {
            return F.Option.Some(value);
        } else {
            return F.Option.None();
        }
    }

    public static <T> F.None<T> none() {
        return new F.None<T>();
    }

    public static <T> Option<T> asScala(F.Option<T> value) {
        if(value.isDefined()) {
            return Option$.MODULE$.apply(value.get());
        } else {
            return Option$.MODULE$.empty();
        }
    }

}

このOptionUtilでは、オブジェクトがnullなとき以外にも、文字列が””のときもNoneとしたり、リスト型のときは、空のリストのときもNoneとしたりしています。

というのも、Play JavaのEbeanモデルなどの検索時の返り値がこれらの状態のケースがあり、それらをNoneとして扱えた方が都合がいいケースが現場レベルではあったことに基づきます。

そして、以下が、OptionUtilの簡単なテストコードです。

package jp.greative.utils;

import org.junit.Test;
import play.libs.F;
import java.util.ArrayList;
import java.util.List;
import static org.fest.assertions.Assertions.assertThat;

public class OptionUtilTest {

    @Test
    public void testApplyShouldSome() throws Exception {
        String test1 = "abc";
        F.Option<String> test1Result = OptionUtil.apply(test1);
        assertThat(test1Result.getClass()).isEqualTo(F.Some.class);
        assertThat(test1Result.getClass()).isNotEqualTo(F.None.class);
    }

    @Test
    public void testApplyShouldNone() throws Exception {
        String test2 = null;
        F.Option<String> test2Result = OptionUtil.apply(test2);
        assertThat(test2Result.getClass()).isEqualTo(F.None.class);
        assertThat(test2Result.getClass()).isNotEqualTo(F.Some.class);
    }

    @Test
    public void testApplyShouldSomeList() throws Exception {
        List<String> test3 = new ArrayList<String>() {
            {
                add("a");
                add("b");
                add("c");
            }
        };
        F.Option<List<String>> test3Result = OptionUtil.apply(test3);
        assertThat(test3Result.getClass()).isEqualTo(F.Some.class);
        assertThat(test3Result.getClass()).isNotEqualTo(F.None.class);
    }

    @Test
    public void testApplyShouldNoneList() throws Exception {
        List<String> test4 = new ArrayList<String>();
        F.Option<List<String>> test4Result = OptionUtil.apply(test4);
        assertThat(test4Result.getClass()).isEqualTo(F.None.class);
        assertThat(test4Result.getClass()).isNotEqualTo(F.Some.class);
    }

    @Test
    public void testApplyWithStringShouldSome() throws Exception {
        String test1 = "abc";
        F.Option<String> test1Result = OptionUtil.applyWithString(test1);
        assertThat(test1Result.getClass()).isEqualTo(F.Some.class);
        assertThat(test1Result.getClass()).isNotEqualTo(F.None.class);
    }

    @Test
    public void testApplyWithStringShouldNone() throws Exception {
        String test2 = "";
        F.Option<String> test2Result = OptionUtil.applyWithString(test2);
        assertThat(test2Result.getClass()).isEqualTo(F.None.class);
        assertThat(test2Result.getClass()).isNotEqualTo(F.Some.class);
    }

    @Test
    public void testAsScalaShouldSome() throws Exception {
        String s = "String";
        F.Option<String> result = OptionUtil.apply(s);発売日
        scala.Option<String> resultScala = OptionUtil.asScala(result);
        assertThat(result.getClass()).isEqualTo(F.Some.class);
        assertThat(resultScala.getClass()).isEqualTo(scala.Some.class);
    }

    @Test
    public void testAsScalaShouldNone() throws Exception {
        String n = null;
        F.Option<String> result = OptionUtil.apply(n);
        scala.Option<String> resultScala = OptionUtil.asScala(result);
        assertThat(result.getClass()).isEqualTo(F.None.class);
        assertThat(resultScala.getClass()).isEqualTo(scala.None$.class);
    }
}

さて、このOptionUtilですが、プラグイン化して使ったらいいのにという考えもあります。

ただ、PlayのOptionを内部的に使っていて、Playに依存するため、プラグインを作成する際にどのバージョンのPlayかをプラグイン側で取り込む必要があり、Playのバージョンごとにプラグインを出力する必要がありそうということで、一旦はコードのみで提供とします。

ライセンスは、とくにないです。

Play framework 2.x Javaの本、出ます!!

上記OptionUtilですが、12/16に出版予定のPlay frameworkの書籍

Play Framework 2徹底入門
http://www.amazon.co.jp/dp/4798133922/

でもばりばりと使われております。よろしければこちらも是非ご覧ください。540ページくらいあり、頑張って書いています。

2.2対応です。

つまり、新しくなった埋め込み型のCSRFトークンとか、API用のヘッダーレベルのCSRFトークンとか、build.sbtとかにも少し触れています。

  • 発売日:2013年12月16日
  • ISBN:9784798133928
  • 判型:B5変
  • ページ数:540P
  • 定価:本体3,800円+税

アドベントカレンダー、まだ募集中です!

Play frameworkのアドベントカレンダーはScalaとJava両方があります。
まだまだ執筆者募集中なので、皆さんお気軽にぜひ!

Play framework 2.x Java and 1.x Advent Calendar 2013
http://www.adventar.org/calendars/104

Play framework 2.x Scala Advent Calendar 2013
http://www.adventar.org/calendars/114

次のアドベントカレンダーの執筆者は yuba さんです。
と思ったらもう書かれていました。速い!(というか僕が遅い…)

EBeanでもユニットテストの導入はスマートです。そう、Lombokならね。 – C Sharpens you up

Read More

第1回&第2回 [Play部屋]Playはじめて&もくもく会を行いました

Play frameworkの手を動かす系の勉強会である「[Play部屋]Playはじめて&もくもく会」を開催しています。Play frameworkは、JavaもしくはScalaで開発が可能な、Webアプリケーションフレームワークです。WebSocketなどをはじめとする先進的なウェブの実装にも適しています。

第1回目を行った自体でブログエントリを書けばよかったんですが、ぐずぐずしている間に第2回も終わってしまいました。。

第1回目の話

第1回目は、2013年01月15日(火) 19時00分 – 22時00分に行いました。

-Play部屋- Play 2.0 Javaはじめて&もくもく会 – 日本Playframeworkユーザー会

実はこの日は結構急に決まったので、開催告知もあまり開催日まで時間がない感じで行ったのですが、多くの方に参加していただき、20人の方が集まりました。

当初募集時は「Play 2.0 Javaはじめて&もくもく会」という名称だったんですが、テーブル担当者が名乗り出ていただいたおかげで、JavaとScalaの両方のサポートが可能になりました。

20人というと、それほど多くないじゃないかと思われるかもしれませんが、そもそも会場となったコワーキングスペース茅場町 Co-Edoのハンズオン系の机有りな状態が25人くらいがたぶんMaxな感じなので、結構ぎゅうぎゅうな感じです。

当日は、この会の特色である初心者の人も積極的にPlay frameworkを試せるようにしていくという点を踏まえて、Play 2.0 Javaのはじめてテーブルを僕が、Play 2.0 Scalaのはじめてテーブルを小原さんが担当する感じにしました。

また、別途もくもくテーブルも用意してあり、ベテランな方々はここでもくもくとマイプロジェクトをしたり、談笑したりするという感じになっています。

shinya31さんによる当日のまとめがあります!

2013/01/15 Play 2.0 Javaはじめて&もくもく会 #play_ja

あと、ブログ記事も!

[勉強会][Playframework][Java]Play 2.0 Javaはじめて&もくもく会 に参加してきた #playbeya #play_ja

第2回目の話

続いて、第2回を2013年01月24日(木) 19時00分 – 22時00分に行いました。参加者は16名くらい。

[Play部屋] 第2回 Play 2.0 はじめて&もくもく会

今回も、Play 2.0のJava、Scalaのはじめてテーブルを僕と小原さんで担当したわけですが、今回は、はじめてその後テーブルというのも用意しました。

はじめてその後テーブルというのは、Playのチュートリアルはやってしまったけど、その後どうしようかという感じの方向けのもので、テーマは毎回変えていく予定です。

今回のはじめてその後テーブルのテーマはWebSocketということに決めていまして、参加者は、WebSocketのサンプルコードをいじって動かしたり、改造してちょっと違うアプリに仕立てたりと、取り組んでいました。

今後もはじめてのその後シリーズはやっていこうと思います。 次はテストとかにしようかなとか考えています。

第2回もshinya31さんによる当日のまとめがあります!

2013/01/24 [Play部屋] 第2回 Play 2.0 はじめて&もくもく会 #play_ja #coedo #playbeya

また、レポートも!

[勉強会][Playframework][Java]第2回 Play 2.0 Javaはじめて&もくもく会 に参加してきた #play_ja #coedo #playbeya

というわけで、「Play部屋」を通じてPlay frameworkを広めていけたらと思います。 よろしくお願いします!

※あと、お手伝いいただける方も積極的に募集しています! 参加料も会場代1000円は必要なものの、それ以外はボランティア的な感じで運営していますので、ご協力いただけると助かります! @kara_dまでお気軽に!!

Read More