PAB@Scalaでお仕事はじめました

求職活動中とありますが、活動報告というよりは、技術の話題を多めでいきます。Scalaが大好きなので特にScalaの話が中心になると思います。

Scala勉強会第90回 in 本郷 - [PARTAKE]

Scala勉強会第90回 in 本郷 #rpscala - Togetter

今回の参加者はなんと17人。定員が15人なのでオーバーしてますね。 参加申請してないのに無理矢理参加した不届き者でもいるのでしょうか(他人事)。

前回に引き続き初心者の方が多かったと思います。 「初心者Scala in F@N」の影響でしょうか。 90回を越えてこんなに盛況なのはすごいですね。

Scala School

今回も初心者セッションでScala Schoolが読まれました。

Scala School意訳(Basics) - case class HatenaBlog(id: Symbol = ’seratch2)

今回やったのは「Curried functions」から「Constructor」までです。

初心者が作ってみた初級ツールを皆で叩いてみたりアレしたり good_oppai さん

ドキュメント作成のためにScalaのソースファイルからフィールド一覧を取り出すスクリプトを書いてみたらしいです。 こういう短いコードはGistに貼ってTwitterに流すとコードゴルフ大会が始まって面白いと思います。

Scalaの言語機能 - 型に対する制約 by lyrical_logical さん

第一回社内 Scala 勉強会(一部抜粋)

lyrical_logicalさんが初心者向けにStructual Subtyping、Implicit Conversions、Implicit Parametersについて解説されました。 社内勉強会用に作られた資料らしいですが、その社内勉強会は中止になったとか。

Scalaの型機能について、素朴なNominal SubtypingとGenericsしか持たないJavaと比較することで、わかりやすく紹介しています。

感想・まとめ

初心者の多い回のときにlyrical_logicalさんのScalaの機能の解説があって、とても良かったのではないかと思います。 Scala固有の機能を整理してわかりやすく解説するのって大変なんですよね。 これからScalaの勉強をする人はこのlyrical_logicalさんのスライドを読んでほしいですね。

先週のAkasaka.scalaについて書きたいと思います。

Akasaka.scala 44 #akskscala : ATND

#akskscala 44 - Togetter

今回はTypesafe社が開催しているDeveloper Contestに参加しようというのがテーマです。

Developer Contest

コンテストのページがこちらです。

Typesafe — Resources: Developer-contest

seratchさんが翻訳なさっています。

Developer Contest: Japanese Translation — Gist

相変わらずseratchさんのテーマ設定と準備には頭が下がります。

要約すると、Odersky先生がJAX Java Ambassador Awardで獲得した25万ドルの賞金を寄付されたことによって開かれたコンテストで、 コードサイズは100から1000行程度で、Scala、Play、Akkaのいずれかを使ったアプリケーションを作って送るようにということです。 提出期限は11月いっぱいです。

最初はプログラミング・コンテストということで腰が引けていたのですが、 あらためてちゃんと読んでみると100から1000行程度ということで、 要するにTypesafe社は短くてTypesafe Stackの魅力がわかるサンプルアプリが欲しいということが理解できました。

アイデア出し

まだ提出期限まで余裕があるということで、今回はどんなプログラムを書くかのアイディア出しの回になりました。 seratchさんがまとめられています。

Ideas for developer contest — Gist

前述のとおりデモンストレーション用のサンプルが欲しいのだろうということで、 すごいことをやろうというより短くてわかりやすいことを重視してアイデア出しが行われました。

感想・まとめ

参加する前はちゃんとしたものが作れるのかなあと不安だったのですが、 参加者のみなさんと検討してみてだいぶ敷居が下がりました。 コンテストに応募した人全員にTシャツが送られるらしいので、気楽に参加してみるといいんじゃないでしょうか。

Scala勉強会第89回 in 本郷 - [PARTAKE]

Scala勉強会第89回 in 本郷 #rpscala - Togetter

今回の参加者は14人で、初参加の方が多かったと思います。

もう一度最初からScala Schoolを読む

今までやってたScala Schoolはたぶん「Advanced types」あたりで2ヶ月くらい止まっていたと思うんですが、 もう一度最初から読むことになりました。

今回は初参加の方が多かったので良かったとは思うのですが、 やっぱりScala Schoolって初学者向けではないと思うんですよね。 無駄に衒学的なワードが出てくるわりに、基本的な機能が押さえられていなかったりするので、初心者を混乱させるだけなのではないかと。 じゃあ他に何をやるんだとなると難しいところなんですが…。

完全な初心者向けには「初心者Scala」みたいなイベントもあるらしいので、そちらに任せたほうがいいのかもしれないですね。 rpscalaも発表者が初心者にもわかるように発表することは重要だと思いますが。

Step-by-step how to build android test projects is written by scala by lyrical_logicalさん

シリーズ化しているlyrical_logicalさんのAndroid開発のテストの問題です。 テスト対象のコードでは使われないが、テストコードでは使われるライブラリをProGuardが消してしまうので、テストできないという問題ですね。

今回どうやら完全に解決に至ったらしく、lyrical_logicalさんがサンプルプロジェクトを公開されています。

lepidum-mochizuki/android-test-by-scala

このコード自体も参考になるのですが、lyrical_logicalさんのコミットログが

Commit History · lepidum-mochizuki/android-test-by-scala

一つ一つの問題とその解決の説明になっているらしく、こちらも合わせて読まれると良いと思います。

sbt-github-repo by pab_tech

僕の発表です。

sbt-github-repo

hexx/sbt-github-repo

この間のPlayのTypeScriptプラグインのリリースかぶり問題から、 Sonatype OSSRHに一度リリースしたものは消せないことが判明し、いきなりSonatype OSSRHにリリースするのはやめて、 とりあえずGithubをMavenリポジトリにして、そこで様子を見るようにしようという流れで産み出されたものです。 詳しくはスライドを見てください。

この発表の後半にくだらないネタ発表をしてみたのですが、見事にすべってしまったようです。 名前を出した方々には大変ご迷惑をおかけしてしまいました。すみません。

本当はこういうしょうもない発表ではなくて、 コンパイラプラグインの発表をやろうとは思ってるのですが、 結論から言うとScala 2.10のコンパイラプラグインの作り方って、 内部構造が大きく変更されているわりに、今までとほとんど変わっていないんですよ。

というか、コンパイラプラグインの作り方ってScala 2.8の頃から全然変わっていなくて、 昔のドキュメントが今でもかなり参考になります。 だから今発表するならちょっとアイデアが必要かなーということで考えているところです。

あと発表後すぐにxuwei_kさんに、sbtプラグインを作る場合はscalaVersionの指定をやめて、 sbtのScalaに合わせたほうがいいというアドバイスをいただきました。 気がつきませんでした。ありがとうございました。

rpscala 忘年会 兼 eed3si9n さんと飲む会の案内 by xuwei_kさん

コード、ドキュメント、翻訳と日本のScala界に多大な貢献をなさっているeed3si9nさんがアメリカから帰国されるということで、 xuwei_kさんが音頭を取ってrpscala 忘年会 兼 eed3si9n さんと飲む会が開催されることになりました。

rpscala 忘年会 兼 eed3si9n さんと飲む会 - [PARTAKE]

枠が余るようなら僕も参加させていただきたいと思ってます。

感想・まとめ

最近の記事の遅さを反省して、今回は早く書いてみました。

Scala勉強会第88回 in 本郷 - [PARTAKE]

Scala勉強会第88回 in 本郷 #rpscala - Togetter

こちらも遅くなってすみません。 今回の参加者は10人で、kmizuさんやxuwei_kさんなどScala界の著名人の集まる回になりました。

祝日計算 in Scala by gakuzzzzさん

t2v/holidays

scala-timeに日本の祝日を計算してくれる機能を足すライブラリです。これは便利ですね。

Play 2.0 の Action と BodyParser について学ぼう by lyrical_logicalさん

Play 2.0 の Action と BodyParser について学ぼう

Play2.0のActionとBodyParserについて、lyrical_logicalさんの視点から整理し解説されています。

それとPlay2.1のEssentialActionについても先取りして解説されています。

ScalaでAndroidアプリを作ると何が良いか? by OE_uiaさん

2012 09-26-scala

前々回のlyrical_logicalさんの発表のアンサー的な発表のようです。 lyrical_logicalさんがどちらかというと、ScalaでAndroidアプリを開発する苦労や問題点を解説されたのですが、 OE_uiaさんはScalaで開発するポジティブな面を中心に解説されています。 今回も参加されたlyrical_logicalさんがさらに開発の落とし穴を解説されて盛り上がりました。

Scala Conference 2013 について by kmizuさん

来年の3月2日に東工大でおこなわれるScala Conference 2013についてkmizuさんから説明がありました。 Scala Conference in Japan 2013

Akkaの作者でTypesafeのCTOのJonas Bonerさんなど豪華な海外ゲストが大勢来られる予定らしいです。

感想・まとめ

今回は発表も盛り沢山で大変勉強になりました。

記事がかなり遅れてしまって申し訳ありません。 Akasaka.scala 43について書きたいと思います。

Akasaka.scala 43 #akskscala : ATND

#akskscala 43 - Togetter

今回はseratchさんが作ったxsbt-scalag-pluginを使ってsbtプラグインを作ってみようというのがテーマです。

xsbt-scalag-plugin

seratch/xsbt-scalag-plugin

RailsのGeneratorのようなsbtコマンドを作ることができるフレームワークのようです。 FreeMarkerというJavaのテンプレートを使ってコードを生成しています。

このコード自体も労作でよくできていると思ったのですが、今回のseratchさんのネタ提供にはちょっと感動しましたね。 rpscalaの場合は誰かがリードするという感じではないので、 回によっては誰も発表するときがないときなど、どうしてもクオリティにばらつきが出てしまうのですが、 毎回Akasaka.scalaのテーマを考えてこういうネタを提供するseratchさんは本当に尊敬しますね。

sbtプラグインのデバッグ方法 & scripted-pluginの解説 by xuwei_kさん

今回はxuwei_kさんが初参加ということで、その豊富な知識を活かして、 xsbt-scalag-pluginの本体を修正したり、テストの作成をされていました。

途中 xuwei_k さんのレクチャーが入ったりして、非常に勉強になりました。 そのときのことは xuwei_k さん自身が記事にされています。

sbt plugin作成時のデバック、テスト方法 - scalaとか・・・

感想・まとめ・次回

僕は前にも書いたとおりJavaScript MVCフレームワークに興味が出てきていたので、 Backbone.jsのジェネレータを作ろうとして、Railsのジェネレータを調べたりしていました。 当日はその調査で終わりました

記事を書くのを忘れていたわけではないのですが、何かコード書いてから記事を書こうと思ったら、 他のコードを思いつきで適当に書いているうちに、遅れてしまいました。すみません。 Backbone.jsのジェネレータはちゃんと書こうと思ってます。

そして、そうこうしているうちに、次回のAkasaka.scalaの内容が発表されていました。

Akasaka.scala 44 #akskscala : ATND

10/1 〜 11/30 の期間で Typesafe 社が Developer Contest を開催しています。 Typesafe Stack を使うとどんなことができるのかを表現したアプリケーションがテーマです。

なんとこのコンテストに向けてコードを書くというのがしばらくテーマになるらしいです。 ハッカソンっぽくなってきました。

しかし、Typesafe Stackって使ったことないんですが、Scala本体にAkkaとPlayが入っているものでいいんでしたっけ?

Typesafe — Resources: Developer-contest

Typesafe is looking for beautiful applications that demonstrate programming in Scala, Akka, or Play (or all three of them together!).

こう書いてあるのですから、PlayやAkkaの補助ライブラリというよりは、見栄えのするアプリケーションがいいんでしょうね。 個人でどのくらいのものが作れるのでしょうか…。記念参加になりそうな気がしますが、一応何か作ってみたいと思います。

(以下の記事はちゃんと最後まで読んでください)

前にPlay2.0用のJSXとHaxeのプラグインを作ったのですが、

Play2.0のアセットとしてJSXとHaxeを使えるようにするプラグインを作りました

Play2.1とsbt 0.12が出たらちゃんとリリースするとか書いていたのですが (sbt 0.12以降はバージョン間でバイナリ互換があるためにリリースが楽なので)、そのまま放置して忘れていました…。

あれからsbt 0.12は出たものの、Play2.1はまだ出る気配がないのですが、どうやらPlay2.0系はScala 2.9.1とsbt 0.11.3固定でやるみたいなので、 いったんリリースしておこうと思います。

それに加えて、今回TypeScriptのプラグインも作ってみました。 それぞれのソースは以下にあります。

hexx/play-jsx

hexx/play-haxe

hexx/play-typescript

使い方は組み込みのCoffeeScriptと同じような感じです。

Documentation: AssetsCoffeeScript — Playframework

と、ここまで書いて、気づいたのですが…。

mumoshuさんとかぶってしまった!

前に作ったやつの流用で、ついでという感じでTypeScript版も作ったわけですが、まったく同じタイミングでmumoshuさんもTypeScriptプラグインを作ったようです。

Twitter / mumoshu: Play 2.0向けのTypeScriptプラグイン …

mumoshu/play2-typescript

コミット時間から推測するにほとんど同じ時間にリリースしたみたいです。

僕のは流用なので10分くらいで作った適当なやつなのですが、mumoshuさんのほうはテストもあって、ちゃんとしてます。 とりあえずこっちは今後メンテナンスしない宣言をします。mumoshuさんのほうを使ってください。

正直今すぐひっこめたくてたまらないんですが、Sonatype OSSのNexusでレポジトリからファイルを消そうと試しても

Delete the selected "/com/github/hexx/play-typescript_2.9.1_0.11.3/" folder?
↓
The server did not delete the file/folder from the repository

みたいになって消せないんですよね。消す方法を知っている方はTwitterの @pab_tech まで教えてください。

感想・まとめ

この記事を書いている途中で、mumoshuさんのツイートを見て、一気に青ざめました。 まさか、こんなものがかぶるとは…。 思いつきで適当にやってるからいけないんですね。 どうせしばらくTypeScript使うつもりもないのに。

もうちょっと責任の持てるものを作るというのと、自分の専門性を考えるという二点を今回の反省材料にしたいと思います。

makotow:

Selenium かー。ScalaTestもちゃんと使ったことないな。

JSON変換機能が追加されたGaedsとBackbone.jsを作ってサンプルアプリを作ってみます。 というか、JavaScript MVCフレームワークを使うためにGaedsにJSON変換機能を入れたんですよね。

今回作るのは前に作った掲示板のAjax版です。

前回までの記事

Backbone.js

前にAkasaka.scalaで、Play2のソースコードに入っているZentasksというサンプルアプリをいじってみるということをやったのですが、

Akasaka.scala 40 に参加してきました

これがBackbone.jsを使っているんですよね。Modelを使わない変則的な使い方なんですが、 これを見てPlayとJavaScript MVCフレームワークの組み合わせも色々考えられるなあと思ったのと、 同じくAkasaka.scalaで調べて、Play2がそのままではGoogle App Engineで動かないことがわかったので、 Google App EngineではUnfilteredやScalatraとJavaScript MVCフレームワークの組み合わせがいいのかなと考えていたんですよね。

それで、色々なJavaScript MVCフレームワークを見てみたんですが、 やっぱり今使うならシンプルさ、他のWebフレームワークとの組み合わせやすさ、メジャー度を考えると、Backbone.jsが無難かなと思いました。 しかし、一年後にはまったく違う情勢になってそうなのが、UI界隈の怖いところですよね。

coffeescripted-sbt

sbtのプロジェクトでCoffeeScriptを書く場合、Scala界ではお馴染のsoftpropsさんによるcoffeescripted-sbtというsbtプラグインが便利です。

softprops/coffeescripted-sbt

src/main/coffee以下にCoffeeScriptを置いておくと、sbt packageでパッケージを作るときにコンパイルして入れてくれます。 xsbt-web-pluginやsbt-appengineと組み合わせて使う場合は、build.sbtに以下の設定を足すとよいです。

resourceManaged in (Compile, CoffeeKeys.coffee) <<= (crossTarget in Compile)(_ / "webapp_managed" / "js")

webappResources in Compile <+= (crossTarget in Compile)(_ / "webapp_managed")

CoffeeScriptのコンパイル先をtargetの下のwebapp_managedというディレクトリにして、 それをパッケージを作るときにwebappと合わせてくれます。 これでコンパイルされたJavaScriptも普通のwebappの下に置いてあるものと同じように参照することができるようになります。

ディレクトリ構成

gaeds-backbonejs-sample
├── build.sbt
├── project
│   ├── build.properties
│   └── plugins.sbt
└── src
    └── main
        ├── coffee
        │   └── board.coffee
        ├── scala
        │   └── board.scala
        └── webapp
            ├── WEB-INF
            │   ├── appengine-web.xml
            │   └── web.xml
            ├── css
            │   ├── bootstrap-responsive.min.css
            │   └── bootstrap.min.css
            ├── img
            │   ├── glyphicons-halflings-white.png
            │   └── glyphicons-halflings.png
            ├── index.html
            └── js
                ├── backbone-min.js
                ├── bootstrap.min.js
                └── underscore-min.js

前のものと変わったのはTwirlを使うのをやめてBackbone.jsのboard.coffeeが増えているところです。

サンプルアプリ

ソースコードはこちらになります。

hexx/gaeds-backbonejs-sample

実際にGoogle App Engineにデプロイしたのがこちらになります。

Message Board Ajax版

Message Board 旧版

旧版と比べてみるとAjax版は書き込みが即時に反映されてることがわかると思います。

コード

Backbone.js側 (board.coffee)

Backbone.jsについては他のサイトを参照していただいたほうがいいということで、 あまり述べることはないのですが、AjaxはMessageListクラスにurlを書いておくだけで、 fetchcreateのときにjQuery.ajaxを使って適当に通信してくれます。

JavaScriptのテンプレートエンジンはUnderscore.js付属のものを使っています。 テンプレートはindex.htmlの中に含まれています。

サーバ側 (board.scala)

サーバ側ではBackbone.js側とJSONのやりとりをするREST APIを作ることになります。

作るAPIは以下の二つです。

  1. GET /messagesで、書き込みの一覧を返す
  2. POST /messagesで、新しい書き込みを保存する

GETのほうではGaeds 0.2.0で追加されたtoJObjectとlift-jsonを使って、一覧のJSONを作成して返しています。

POSTのコードの

if (req.underlying.getCharacterEncoding == null) {
  req.underlying.setCharacterEncoding("UTF-8")
}

の部分は文字化け対策です。 Google ChromeやiPhoneでは書き込みの読み込み時に文字エンコードがわからなくて文字化けしてしまいます。 Content-Typeにcharset=utf-8がないせいな気がしますが、よくわかりません。 もっといいやり方がある気がします。

UnfilteredはJsonBodyというのを使うとBodyをlift-jsonのJValueにして返してくれます(中身はparse(Body.string(r))ですけど…)。 そのJValueからGaeds 0.2.0で追加されたfromJObjectを使ってモデルを作ることができます。 あとは保存する最大数をチェックして保存して終わりです。

感想・まとめ

最近Scalaでしかコード書いてなかったのでJavaScriptのデバッグは面倒臭かったです。 ほんと動かしてみないと何もわからないですね、JavaScriptは。 もうちょっと静的にチェックしてほしいです。

そう言えば、最近話題のTypeScriptですが、将来的に型消去を使ったジェネリクスが入る予定らしいですね。 今コード書いてもジェネリクス導入で書き直しになりそうだし、本格的に使いはじめるのはそれからでいいかなあ。 MS製のプログラミング言語は進化のスピードが速いのですぐに入りそうな気がします。

久し振りですが、Gaedsをバージョンアップしました。

Google App Engineのバージョンアップで追加されたAND/ORフィルタ機能の対応と、lift-jsonを使ったJSONへの相互変換機能の追加です。

前回までの記事

AND/OR filter対応

日本のサイトではまだドキュメントが更新されていませんが、Google App Engine 1.7以降ではクエリのフィルタの仕様が変更されています。

Datastore Queries - Google App Engine — Google Developers

QueryクラスのaddFilterメソッドがDeprecatedになり、setFilterメソッドというものが追加されています。

今まではaddFilterメソッドをチェインすることでフィルタを重ねていきましたが、 1.7からはQuery.Filterというものをあらかじめ組み立ててからsetFilterでセットすることになります。 Query.FilterQuery.CompositeFilterOperatorandメソッドとorメソッドを使って組み立てることができます。 つまり、今まではaddFilterによりANDしかできなかったものが、ORの指定もできるようになったわけです。

Gaedsでもこの機能に対応しました。記述の違いはだいたいこんな感じです。

っていうか、Low-Level API面倒臭すぎですね。

JSON変換機能

lift-jsonを使って、モデルオブジェクトとJSONを相互に変換できる機能です。

lift-jsonのJsonASTのJObjectに対応したtoJObjectfromJObjectもあります。 実際はこっちを使うことが多いかも。

まとめ

JSON変換機能を追加しようと思ったら、Google App Engineがバージョンアップしててフィルタ機能も付けたという感じです。

クエリDSLを作るのはさすがScalaという感じで楽でしたが、 JSON変換機能はGoogle App Engineのデータのコンバータを書くのがしんどかったです。

今までGaedsは他のライブラリに全く依存してないのが売り文句でしたが、 今回でlift-jsonとApache Commonsを使うことになりました。 ライブラリが大きくなってきたからしょうがないですね。

勉強会第87回 - Scala勉強会 in 渋谷

Scala勉強会第87回 in 本郷 - [PARTAKE]

Scala勉強会第87回 in 本郷 #rpscala - Togetter

今回の参加者は6人でした。今回のPARTAKEが作られたのが開催の直前だったせいか、参加者が少なかったです。 PARTAKEに僕の名前が入ってなくてステルス参加みたいになっていますが、 中止になるかもしれないなと思って登録しないでいたらこうなってしまいました。すみません。

Neo4jのクエリー言語Cypherのパーサーを読む

community/cypher at master · neo4j/community

k4200jpさんが仕事でNeo4jを評価しているときに、クエリー言語のCypherがScalaで作られていることを知ったそうで、 今回はそのソースコードをみんなで読もうということになりました。

でもちょっとグダグダでしたね。 ソース自体は普通のScalaのパーサーコンビネータで、読めると言えば読めるのですが、 Cypherはソースが仕様状態らしく、文法を探りながら読む感じであまり捗らなかったです。 BNFがあれば、どういうふうに仕様をコードを落としているのかなどがわかりやすかったと思うのですが。 あとパーサーコンビネータを知らない人が案外多かったので、パーサーコンビネータのハンズオンにしたほうが良かったかもしれません。

初心者Scala

よくScalaの勉強会でご一緒するgkojaxさんが完全な初心者向けの勉強会を行うようです。

9月25日 初心者Scala in F@N 第一回(東京都)

環境を整えるところから順番にやっていくみたいです。 長く続いているScalaの勉強会はどうしても難易度が高くなってしまうので、 新しくScalaを始めてみたいという方はチェックしてみるといいんじゃないでしょうか。