Scala勉強会第90回 in 本郷 - [PARTAKE]
Scala勉強会第90回 in 本郷 #rpscala - Togetter
今回の参加者はなんと17人。定員が15人なのでオーバーしてますね。 参加申請してないのに無理矢理参加した不届き者でもいるのでしょうか(他人事)。
前回に引き続き初心者の方が多かったと思います。 「初心者Scala in F@N」の影響でしょうか。 90回を越えてこんなに盛況なのはすごいですね。
今回も初心者セッションでScala Schoolが読まれました。
Scala School意訳(Basics) - case class HatenaBlog(id: Symbol = ’seratch2)
今回やったのは「Curried functions」から「Constructor」までです。
ドキュメント作成のためにScalaのソースファイルからフィールド一覧を取り出すスクリプトを書いてみたらしいです。 こういう短いコードはGistに貼ってTwitterに流すとコードゴルフ大会が始まって面白いと思います。
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
今回はTypesafe社が開催している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はたぶん「Advanced types」あたりで2ヶ月くらい止まっていたと思うんですが、 もう一度最初から読むことになりました。
今回は初参加の方が多かったので良かったとは思うのですが、 やっぱりScala Schoolって初学者向けではないと思うんですよね。 無駄に衒学的なワードが出てくるわりに、基本的な機能が押さえられていなかったりするので、初心者を混乱させるだけなのではないかと。 じゃあ他に何をやるんだとなると難しいところなんですが…。
完全な初心者向けには「初心者Scala」みたいなイベントもあるらしいので、そちらに任せたほうがいいのかもしれないですね。 rpscalaも発表者が初心者にもわかるように発表することは重要だと思いますが。
シリーズ化しているlyrical_logicalさんのAndroid開発のテストの問題です。 テスト対象のコードでは使われないが、テストコードでは使われるライブラリをProGuardが消してしまうので、テストできないという問題ですね。
今回どうやら完全に解決に至ったらしく、lyrical_logicalさんがサンプルプロジェクトを公開されています。
lepidum-mochizuki/android-test-by-scala
このコード自体も参考になるのですが、lyrical_logicalさんのコミットログが
Commit History · lepidum-mochizuki/android-test-by-scala
一つ一つの問題とその解決の説明になっているらしく、こちらも合わせて読まれると良いと思います。
僕の発表です。
この間のPlayのTypeScriptプラグインのリリースかぶり問題から、 Sonatype OSSRHに一度リリースしたものは消せないことが判明し、いきなりSonatype OSSRHにリリースするのはやめて、 とりあえずGithubをMavenリポジトリにして、そこで様子を見るようにしようという流れで産み出されたものです。 詳しくはスライドを見てください。
この発表の後半にくだらないネタ発表をしてみたのですが、見事にすべってしまったようです。 名前を出した方々には大変ご迷惑をおかけしてしまいました。すみません。
本当はこういうしょうもない発表ではなくて、 コンパイラプラグインの発表をやろうとは思ってるのですが、 結論から言うとScala 2.10のコンパイラプラグインの作り方って、 内部構造が大きく変更されているわりに、今までとほとんど変わっていないんですよ。
というか、コンパイラプラグインの作り方ってScala 2.8の頃から全然変わっていなくて、 昔のドキュメントが今でもかなり参考になります。 だから今発表するならちょっとアイデアが必要かなーということで考えているところです。
あと発表後すぐにxuwei_kさんに、sbtプラグインを作る場合はscalaVersionの指定をやめて、 sbtのScalaに合わせたほうがいいというアドバイスをいただきました。 気がつきませんでした。ありがとうございました。
コード、ドキュメント、翻訳と日本のScala界に多大な貢献をなさっているeed3si9nさんがアメリカから帰国されるということで、 xuwei_kさんが音頭を取ってrpscala 忘年会 兼 eed3si9n さんと飲む会が開催されることになりました。
rpscala 忘年会 兼 eed3si9n さんと飲む会 - [PARTAKE]
枠が余るようなら僕も参加させていただきたいと思ってます。
最近の記事の遅さを反省して、今回は早く書いてみました。
Scala勉強会第88回 in 本郷 - [PARTAKE]
Scala勉強会第88回 in 本郷 #rpscala - Togetter
こちらも遅くなってすみません。 今回の参加者は10人で、kmizuさんやxuwei_kさんなどScala界の著名人の集まる回になりました。
scala-timeに日本の祝日を計算してくれる機能を足すライブラリです。これは便利ですね。
Play 2.0 の Action と BodyParser について学ぼう
Play2.0のActionとBodyParserについて、lyrical_logicalさんの視点から整理し解説されています。
それとPlay2.1のEssentialActionについても先取りして解説されています。
前々回のlyrical_logicalさんの発表のアンサー的な発表のようです。 lyrical_logicalさんがどちらかというと、ScalaでAndroidアプリを開発する苦労や問題点を解説されたのですが、 OE_uiaさんはScalaで開発するポジティブな面を中心に解説されています。 今回も参加されたlyrical_logicalさんがさらに開発の落とし穴を解説されて盛り上がりました。
来年の3月2日に東工大でおこなわれるScala Conference 2013についてkmizuさんから説明がありました。 Scala Conference in Japan 2013
Akkaの作者でTypesafeのCTOのJonas Bonerさんなど豪華な海外ゲストが大勢来られる予定らしいです。
今回は発表も盛り沢山で大変勉強になりました。
記事がかなり遅れてしまって申し訳ありません。 Akasaka.scala 43について書きたいと思います。
Akasaka.scala 43 #akskscala : ATND
今回はseratchさんが作ったxsbt-scalag-pluginを使ってsbtプラグインを作ってみようというのがテーマです。
RailsのGeneratorのようなsbtコマンドを作ることができるフレームワークのようです。 FreeMarkerというJavaのテンプレートを使ってコードを生成しています。
このコード自体も労作でよくできていると思ったのですが、今回のseratchさんのネタ提供にはちょっと感動しましたね。 rpscalaの場合は誰かがリードするという感じではないので、 回によっては誰も発表するときがないときなど、どうしてもクオリティにばらつきが出てしまうのですが、 毎回Akasaka.scalaのテーマを考えてこういうネタを提供するseratchさんは本当に尊敬しますね。
今回は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のプラグインも作ってみました。 それぞれのソースは以下にあります。
使い方は組み込みのCoffeeScriptと同じような感じです。
Documentation: AssetsCoffeeScript — Playframework
と、ここまで書いて、気づいたのですが…。
前に作ったやつの流用で、ついでという感じでTypeScript版も作ったわけですが、まったく同じタイミングでmumoshuさんもTypeScriptプラグインを作ったようです。
Twitter / mumoshu: Play 2.0向けの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使うつもりもないのに。
もうちょっと責任の持てるものを作るというのと、自分の専門性を考えるという二点を今回の反省材料にしたいと思います。
Selenium かー。ScalaTestもちゃんと使ったことないな。
JSON変換機能が追加されたGaedsとBackbone.jsを作ってサンプルアプリを作ってみます。 というか、JavaScript MVCフレームワークを使うためにGaedsにJSON変換機能を入れたんですよね。
今回作るのは前に作った掲示板のAjax版です。
前にAkasaka.scalaで、Play2のソースコードに入っているZentasksというサンプルアプリをいじってみるということをやったのですが、
これが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界隈の怖いところですよね。
sbtのプロジェクトでCoffeeScriptを書く場合、Scala界ではお馴染のsoftpropsさんによるcoffeescripted-sbtという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が増えているところです。
ソースコードはこちらになります。
実際にGoogle App Engineにデプロイしたのがこちらになります。
旧版と比べてみるとAjax版は書き込みが即時に反映されてることがわかると思います。
Backbone.jsについては他のサイトを参照していただいたほうがいいということで、
あまり述べることはないのですが、AjaxはMessageListクラスにurlを書いておくだけで、
fetchやcreateのときにjQuery.ajaxを使って適当に通信してくれます。
JavaScriptのテンプレートエンジンはUnderscore.js付属のものを使っています。
テンプレートはindex.htmlの中に含まれています。
サーバ側ではBackbone.js側とJSONのやりとりをするREST APIを作ることになります。
作るAPIは以下の二つです。
GET /messagesで、書き込みの一覧を返す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への相互変換機能の追加です。
日本のサイトではまだドキュメントが更新されていませんが、Google App Engine 1.7以降ではクエリのフィルタの仕様が変更されています。
Datastore Queries - Google App Engine — Google Developers
QueryクラスのaddFilterメソッドがDeprecatedになり、setFilterメソッドというものが追加されています。
今まではaddFilterメソッドをチェインすることでフィルタを重ねていきましたが、
1.7からはQuery.Filterというものをあらかじめ組み立ててからsetFilterでセットすることになります。
Query.FilterはQuery.CompositeFilterOperatorのandメソッドとorメソッドを使って組み立てることができます。
つまり、今まではaddFilterによりANDしかできなかったものが、ORの指定もできるようになったわけです。
Gaedsでもこの機能に対応しました。記述の違いはだいたいこんな感じです。
っていうか、Low-Level API面倒臭すぎですね。
lift-jsonを使って、モデルオブジェクトとJSONを相互に変換できる機能です。
lift-jsonのJsonASTのJObjectに対応したtoJObjectとfromJObjectもあります。
実際はこっちを使うことが多いかも。
JSON変換機能を追加しようと思ったら、Google App Engineがバージョンアップしててフィルタ機能も付けたという感じです。
クエリDSLを作るのはさすがScalaという感じで楽でしたが、 JSON変換機能はGoogle App Engineのデータのコンバータを書くのがしんどかったです。
今までGaedsは他のライブラリに全く依存してないのが売り文句でしたが、 今回でlift-jsonとApache Commonsを使うことになりました。 ライブラリが大きくなってきたからしょうがないですね。
Scala勉強会第87回 in 本郷 - [PARTAKE]
Scala勉強会第87回 in 本郷 #rpscala - Togetter
今回の参加者は6人でした。今回のPARTAKEが作られたのが開催の直前だったせいか、参加者が少なかったです。 PARTAKEに僕の名前が入ってなくてステルス参加みたいになっていますが、 中止になるかもしれないなと思って登録しないでいたらこうなってしまいました。すみません。
community/cypher at master · neo4j/community
k4200jpさんが仕事でNeo4jを評価しているときに、クエリー言語のCypherがScalaで作られていることを知ったそうで、 今回はそのソースコードをみんなで読もうということになりました。
でもちょっとグダグダでしたね。 ソース自体は普通のScalaのパーサーコンビネータで、読めると言えば読めるのですが、 Cypherはソースが仕様状態らしく、文法を探りながら読む感じであまり捗らなかったです。 BNFがあれば、どういうふうに仕様をコードを落としているのかなどがわかりやすかったと思うのですが。 あとパーサーコンビネータを知らない人が案外多かったので、パーサーコンビネータのハンズオンにしたほうが良かったかもしれません。
よくScalaの勉強会でご一緒するgkojaxさんが完全な初心者向けの勉強会を行うようです。
9月25日 初心者Scala in F@N 第一回(東京都)
環境を整えるところから順番にやっていくみたいです。 長く続いているScalaの勉強会はどうしても難易度が高くなってしまうので、 新しくScalaを始めてみたいという方はチェックしてみるといいんじゃないでしょうか。