勉強会第15回発表1。Symbolとは?2。Liftでサイトを作って見る発表者:@nkjason      ナングン
Symbolとは?
      @serializable    final class Symbol private (val name: String) {	  override deftoString(): String = "'" + name	  @throws(classOf[java.io.ObjectStreamException])	  private defreadResolve(): Any = Symbol.apply(name)	}	object Symbol extends UniquenessCache[String, Symbol]	{	  protected defvalueFromKey(name: String): Symbol = new Symbol(name)	  protected defkeyFromValue(sym: Symbol): Option[String] = Some(sym.name)	}
	/** This is private so it won't appear in the library API, but 	  * abstracted to offer some hope of reusability.  */ 	private[scala] abstract class UniquenessCache[K, V >: Null] 	{ 	  import java.lang.ref.WeakReference 	  import java.util.WeakHashMap 	  import java.util.concurrent.locks.ReentrantReadWriteLock	  private valrwl = new ReentrantReadWriteLock()	  private valrlock = rwl.readLock	  private valwlock = rwl.writeLock	  private val map = new WeakHashMap[K, WeakReference[V]]	  protected defvalueFromKey(k: K): V	  protected defkeyFromValue(v: V): Option[K]def apply(name: K): V = {def cached(): V = {rlock.lock	      try {val reference = map get name	        if (reference == null) null	        else reference.get  // will be null if we were gc-ed	      }	      finally rlock.unlock	    }defupdateCache(): V = {wlock.lock	      try {val res = cached()	        if (res != null) res	        else {       valsym = valueFromKey(name)map.put(name, new WeakReference(sym))sym	        }	      }	      finally wlock.unlock	    }val res = cached()	    if (res == null) updateCache()	    else res	  }defunapply(other: V): Option[K] = keyFromValue(other)	}
def product = Twitter.search / "search.json" <<? params ># ('results ! (list ! obj))Twitter.scala‘results を使っているんですが、理由はあまりないと思います。Dispatchで使っているSymbolはStringでやっても大丈夫はず。理由はdef << (t: T)(js: JsValue) = js match {    case JsObject(m) => JsObject(m + (JsString(sym) -> JsValue(t)))    case js => error("Unable to replace property in " + js)}形でJsStringの部分ですが、その部分はこれがSymbolか、Stringかをmatch している。http://sourced.implicit.ly/net.databinder/dispatch-json/0.7.7/dispatch/Json.scala.html#15592 参照Symbolはmapとかを表現する時、Stringと区分するため、使っているはず。Symbol.name = String
作っているサイト紹介www.snssuite.com
目的:All SNS サイトまとめとイベントサイト言語:ScalaF/W:LiftDB: Mysql 5.5OS: Ubuntu 10.10Package基本クラス:com.snssuite基本条件:1。Encoding: UTF-82。html5で作る
スキル:1。 Internationalization2。 Twitter, facebook, flickr, mixigmail, gcalender, foursquare       me2day, nate(cyworld),naver,last.fmのoauthとapi連投3。 snsのsuiteライン(まとめページ)   各Snsのライン(各ページ)4。 各SNSの設定(呼び出し、書き込み)5。 AtndApi活用、効率的な検索6。 全てのSNSのカレンダ管理
使ったliftスキル:Ormapping, dispatch, oauthBatch, Paginator, Jsonetc
DB設計:User,UserOauth, SnsSuiteSnsSetup, SnsType, AtndEventsDBの詳細項目は別存在。
基本メーニュ:1. メーイン 1.1 ログイン, 1.2 ログアウト1.3 ユーザ登録,  1.4 ユーザ情報変更1.5パスーワード探す2. 検索2.0 検索(検索の特, Sns Suite, EtcSns, Youtue,      Googleで検索実施)2.1 Sns Setup(Twitter[oauth], Facebook[oauth]     , Gmail[oauth], me2day[oauth] etc)2.2 Sns Suite: Twitter, Facebook, Gmail, GCalendar, me2day etc2.3 etc SNSgithub(social Coding), last.fm, foursquare2.4 youtube2.5 atnd: Social
ソースを見てみましょう。

Sns suite presentation

  • 1.
  • 2.
  • 3.
          @serializable    final class Symbolprivate (val name: String) { override deftoString(): String = "'" + name @throws(classOf[java.io.ObjectStreamException]) private defreadResolve(): Any = Symbol.apply(name) } object Symbol extends UniquenessCache[String, Symbol] { protected defvalueFromKey(name: String): Symbol = new Symbol(name) protected defkeyFromValue(sym: Symbol): Option[String] = Some(sym.name) }
  • 4.
    /** This isprivate so it won't appear in the library API, but * abstracted to offer some hope of reusability. */ private[scala] abstract class UniquenessCache[K, V >: Null] { import java.lang.ref.WeakReference import java.util.WeakHashMap import java.util.concurrent.locks.ReentrantReadWriteLock private valrwl = new ReentrantReadWriteLock() private valrlock = rwl.readLock private valwlock = rwl.writeLock private val map = new WeakHashMap[K, WeakReference[V]] protected defvalueFromKey(k: K): V protected defkeyFromValue(v: V): Option[K]def apply(name: K): V = {def cached(): V = {rlock.lock try {val reference = map get name if (reference == null) null else reference.get // will be null if we were gc-ed } finally rlock.unlock }defupdateCache(): V = {wlock.lock try {val res = cached() if (res != null) res else { valsym = valueFromKey(name)map.put(name, new WeakReference(sym))sym } } finally wlock.unlock }val res = cached() if (res == null) updateCache() else res }defunapply(other: V): Option[K] = keyFromValue(other) }
  • 5.
    def product =Twitter.search / "search.json" <<? params ># ('results ! (list ! obj))Twitter.scala‘results を使っているんですが、理由はあまりないと思います。Dispatchで使っているSymbolはStringでやっても大丈夫はず。理由はdef << (t: T)(js: JsValue) = js match { case JsObject(m) => JsObject(m + (JsString(sym) -> JsValue(t))) case js => error("Unable to replace property in " + js)}形でJsStringの部分ですが、その部分はこれがSymbolか、Stringかをmatch している。http://sourced.implicit.ly/net.databinder/dispatch-json/0.7.7/dispatch/Json.scala.html#15592 参照Symbolはmapとかを表現する時、Stringと区分するため、使っているはず。Symbol.name = String
  • 6.
  • 7.
    目的:All SNS サイトまとめとイベントサイト言語:ScalaF/W:LiftDB:Mysql 5.5OS: Ubuntu 10.10Package基本クラス:com.snssuite基本条件:1。Encoding: UTF-82。html5で作る
  • 8.
    スキル:1。 Internationalization2。 Twitter, facebook, flickr,mixigmail, gcalender, foursquare me2day, nate(cyworld),naver,last.fmのoauthとapi連投3。 snsのsuiteライン(まとめページ)   各Snsのライン(各ページ)4。 各SNSの設定(呼び出し、書き込み)5。 AtndApi活用、効率的な検索6。 全てのSNSのカレンダ管理
  • 9.
  • 10.
    DB設計:User,UserOauth, SnsSuiteSnsSetup, SnsType,AtndEventsDBの詳細項目は別存在。
  • 11.
    基本メーニュ:1. メーイン 1.1ログイン, 1.2 ログアウト1.3 ユーザ登録, 1.4 ユーザ情報変更1.5パスーワード探す2. 検索2.0 検索(検索の特, Sns Suite, EtcSns, Youtue, Googleで検索実施)2.1 Sns Setup(Twitter[oauth], Facebook[oauth] , Gmail[oauth], me2day[oauth] etc)2.2 Sns Suite: Twitter, Facebook, Gmail, GCalendar, me2day etc2.3 etc SNSgithub(social Coding), last.fm, foursquare2.4 youtube2.5 atnd: Social
  • 12.