scalaユーザー会#01でLiftについて発表して来ました
scalaユーザー会が立ち上がりました。
ご案内:Scalaユーザ会 5/22(金)19:00-21:00@新宿三井ビル34F豆蔵 - HHa(H派)メモ
ってことで、Liftについて発表してきました。
今回から資料をkeynoteで作ってkeynote remoteでiphoneからスライドを制御してやりました。
うまくいった。
けど、ちょっとネタがすべり気味だったのが反省です。
デモでは、Twitterのpublic timelineをcometで流すのもこんなに簡単に書けるんだよーって感じで見せましたが、時間が無かったのでコードをじっくり解説できなかったのが心残りではあります。こんなコードです。
package com.yuroyoro.scja01ex.comet import java.net.{URL, HttpURLConnection} import _root_.scala.xml.{XML, Text} import _root_.scala.util.matching._ import _root_.net.liftweb._ import http._ import util._ import Helpers._ import js._ import JsCmds._ import S._ import SHtml._ import JE._ import net.liftweb.http.js.jquery.JqJsCmds._ class Twitter extends CometActor { override def defaultPrefix = Full("tw") // 10毎にリフレッシュ ActorPing.schedule(this, FriendsTimeline, 10 seconds) private lazy val spanId = uniqueId+"_timelinespan" def render = bind("timeline" -> timelineSpan) def timelineSpan = (<span id={spanId}><div></div></span>) val url = "http://twitter.com/statuses/public_timeline.xml" var since_id = 0 override def lowPriority = { case FriendsTimeline => val urlConn = new URL(url) .openConnection.asInstanceOf[HttpURLConnection] urlConn.connect(); urlConn.getResponseCode for (s <- XML.load(urlConn.getInputStream) \ "status" reverse ; id = s \ "id" text; if(id.toInt > since_id )) { var (text, user_name, img_url) = (s \ "text" text, s \ "user" \ "name" text, s \ "user" \ "profile_image_url") since_id = id.toInt partialUpdate(PrependHtml(spanId, <div class="status"> <span class="profile_img"><img src={img_url}/></span> <span class="user_name">{user_name}</span> <span class="message">{text}</span> </div> )) } ActorPing.schedule(this, FriendsTimeline, 10 seconds) } } case object FriendsTimeline
デモで使ったソースはgithubに置いてあります。
http://github.com/yuroyoro/scala-ja-01-example/tree/master
Liftの特徴としては、やはりAjaxやcometのサーバー実装用frameworkとして使うのがいんじゃね?
というのが最近の俺のLiftに対して感じてることです。
正直、snipet + xhtmlでは、wicketのオブジェクト指向コンポーネントモデルに及ばないし。
その分、actor+cometの組み合わせは凶悪です。
Liftの特徴はcometにありっ!!
scalaユーザー会は名称が"scala-be(scala部)"に決定しました。
scala-beは、これからも月1回くらいのペースで イベントをやっていくことになってます。
あと、id:kmizushimaさんによるScalaの言語仕様輪読会も企画されています。
scalaアツイっすね!
懇親会とかでもちょっと話したんですが、俺の考えでは、scalaは、better javaとしてとらえてもscalaのおいしいところを味わえないと思ってます。
jvm上で動いてjavaと相互接続できるからといって、java的な発想でscalaを書いてもいいことなんか一つもないし面倒なだけ。
scalaには、scalaの流儀があるはずで、そういったナレッジをみんなで共有する場として、scala-beの活動には期待してます。
scala-be Google group
http://groups.google.co.jp/group/scala-be
発表メモ
*SimpleModeler(浅海さん) テキストベースのモデル定義からモデル駆動開発 DSLからGAE/JやGAE/Pythonなどを生成する SimpleModeler javaの1/3くらいのコード量でできる scalaはDSLのホスト言語として充実した機能 Demo ・CSVからクラス図を生成する ・GAE/Jでajaxなものを自動生成 GWT Atom Publishing くりくり動くよ edge2cc 実証プロジェクトで活動中 *知っていると役に立つ(かもしれない)Scala言語Tip (水島さん id:kmizushima) companion object/class あるクラスと同じファイルで同じ名前、スコープをもつobject compaing objectはcompanion objectに特権的なアクセス件を持つ インスタンス生成を特定のメソッドを経由しなければ行えないようにしたい 使わないとコンストラクタのスコープを広げなきゃならん factory objectとかに使える companion object/classとimpolictiの関係 implicit parameter 省略したい引数にimplictキーワードを撞ける 呼び出し側のスコープにimplicitな値があれば明示的に渡さなくてよい haskelのtypeclassの劣化 scala check テストデータの自動生成 型Tのimplicit scope implict parameterの型に関連づけられた他全てのcompainon moduleからなる このスコープがimplicit parameterの探索スコープに追加される。 なんらかのデフォルトを指定できる? implicit anonymous functionのスコープ Expr式の中で識別子が有効な箇所には _ を×。そのあとの _は引数であるような無名関数 _ + 1 → x => x+1 _ * _ → (x1,x2) => x1 * x2 if(_) x else xs.map(_): xs.map(x = x)では e = _, u=_なのでダメ 言語仕様を読もう traitのちょっとした使い方 あるクラスのメソッドに処理を挟み込みたい。 対象のメソッドが抽象メソッドの場合はabstract overrideで抽象メソッドをoverrideできる あるクラスをnewするときに、withでtraitをつけて処理をアスペクト的に織り込める! Scalaの言語仕様輪読会やるかも *scalaで数独を解く scala.List scala.Tuple (val1,val2)