( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

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)