SlideShare une entreprise Scribd logo
1  sur  12
勉強会第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 サイトまとめとイベントサイト 言語:Scala F/W:Lift DB: Mysql 5.5 OS: Ubuntu 10.10 Package基本クラス:com.snssuite 基本条件: 1。Encoding: UTF-8 2。html5で作る
スキル: 1。 Internationalization 2。 Twitter, facebook, flickr, mixi gmail, gcalender, foursquare        me2day, nate(cyworld),naver, last.fmのoauthとapi連投 3。 snsのsuiteライン(まとめページ)    各Snsのライン(各ページ) 4。 各SNSの設定(呼び出し、書き込み) 5。 AtndApi活用、効率的な検索 6。 全てのSNSのカレンダ管理
使ったliftスキル: Ormapping, dispatch, oauth Batch, Paginator, Jsonetc
DB設計: User,UserOauth, SnsSuite SnsSetup, SnsType, AtndEvents DBの詳細項目は別存在。
基本メーニュ: 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 etc 2.3 etc SNS github(social Coding), last.fm, foursquare 2.4 youtube 2.5 atnd: Social
ソースを見てみましょう。

Contenu connexe

Tendances

Frege, What a Non-strict Language
Frege, What a Non-strict LanguageFrege, What a Non-strict Language
Frege, What a Non-strict Languagey_taka_23
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門Makoto Fukuhara
 
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6TanUkkii
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriYuta Okamoto
 
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLShinichiAoyagi
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...なおき きしだ
 
今から始める Lens/Prism
今から始める Lens/Prism今から始める Lens/Prism
今から始める Lens/PrismNaoki Aoyama
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットTaisuke Oe
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門SatoYu1ro
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)x1 ichi
 
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01nagachika t
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 

Tendances (19)

Frege, What a Non-strict Language
Frege, What a Non-strict LanguageFrege, What a Non-strict Language
Frege, What a Non-strict Language
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門
 
Thinking in Cats
Thinking in CatsThinking in Cats
Thinking in Cats
 
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6
 
講座Java入門
講座Java入門講座Java入門
講座Java入門
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuri
 
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
 
今から始める Lens/Prism
今から始める Lens/Prism今から始める Lens/Prism
今から始める Lens/Prism
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミット
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
Hokuriku Scala 1
Hokuriku Scala 1Hokuriku Scala 1
Hokuriku Scala 1
 
Slick入門
Slick入門Slick入門
Slick入門
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)
 
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 

En vedette

私とScalaと2010 @hito_asa
私とScalaと2010 @hito_asa私とScalaと2010 @hito_asa
私とScalaと2010 @hito_asaHitoshi Asai
 
Lifthub (#rpscala 26)
Lifthub (#rpscala 26)Lifthub (#rpscala 26)
Lifthub (#rpscala 26)k4200
 
Lifthub (rpscala #31)
Lifthub (rpscala #31)Lifthub (rpscala #31)
Lifthub (rpscala #31)k4200
 
Real-Time 3D Programming in Scala
Real-Time 3D Programming in ScalaReal-Time 3D Programming in Scala
Real-Time 3D Programming in ScalaHideyuki Takeuchi
 
Scala勉強会 in 渋谷 2010→2011(鹿島)
Scala勉強会 in 渋谷 2010→2011(鹿島)Scala勉強会 in 渋谷 2010→2011(鹿島)
Scala勉強会 in 渋谷 2010→2011(鹿島)k4200
 
sbt 0.10 for beginners?
sbt 0.10 for beginners?sbt 0.10 for beginners?
sbt 0.10 for beginners?k4200
 
20120718 scalaで転職
20120718 scalaで転職20120718 scalaで転職
20120718 scalaで転職大翼 福田
 
Scala design pattern
Scala design patternScala design pattern
Scala design patternKenji Yoshida
 
Grass
GrassGrass
Grassk4200
 

En vedette (13)

私とScalaと2010 @hito_asa
私とScalaと2010 @hito_asa私とScalaと2010 @hito_asa
私とScalaと2010 @hito_asa
 
Lifthub (#rpscala 26)
Lifthub (#rpscala 26)Lifthub (#rpscala 26)
Lifthub (#rpscala 26)
 
Lifthub (rpscala #31)
Lifthub (rpscala #31)Lifthub (rpscala #31)
Lifthub (rpscala #31)
 
Real-Time 3D Programming in Scala
Real-Time 3D Programming in ScalaReal-Time 3D Programming in Scala
Real-Time 3D Programming in Scala
 
Scala勉強会 in 渋谷 2010→2011(鹿島)
Scala勉強会 in 渋谷 2010→2011(鹿島)Scala勉強会 in 渋谷 2010→2011(鹿島)
Scala勉強会 in 渋谷 2010→2011(鹿島)
 
sbt 0.10 for beginners?
sbt 0.10 for beginners?sbt 0.10 for beginners?
sbt 0.10 for beginners?
 
Rpscala18th
Rpscala18thRpscala18th
Rpscala18th
 
Scala lang evolution
Scala lang evolutionScala lang evolution
Scala lang evolution
 
20120718 scalaで転職
20120718 scalaで転職20120718 scalaで転職
20120718 scalaで転職
 
Scala repl
Scala replScala repl
Scala repl
 
Scala design pattern
Scala design patternScala design pattern
Scala design pattern
 
scala-kaigi1-sbt
scala-kaigi1-sbtscala-kaigi1-sbt
scala-kaigi1-sbt
 
Grass
GrassGrass
Grass
 

Similaire à Sns suite presentation

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューAkira Inoue
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-Kazunari Hara
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnKoji Ishimoto
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.specKent Ohashi
 
Processingによるプログラミング入門 第6回
Processingによるプログラミング入門 第6回Processingによるプログラミング入門 第6回
Processingによるプログラミング入門 第6回Ryo Suzuki
 
Composable Callbacks & Listeners
Composable Callbacks & ListenersComposable Callbacks & Listeners
Composable Callbacks & ListenersTaisuke Oe
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとかyouku
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミングOuka Yuka
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?Kenji Nakamura
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかHisashi Aruji
 
Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Hiroshi Ito
 

Similaire à Sns suite presentation (20)

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.spec
 
Actor&stm
Actor&stmActor&stm
Actor&stm
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Scala東北紹介
Scala東北紹介Scala東北紹介
Scala東北紹介
 
大人のお型付け
大人のお型付け大人のお型付け
大人のお型付け
 
Processingによるプログラミング入門 第6回
Processingによるプログラミング入門 第6回Processingによるプログラミング入門 第6回
Processingによるプログラミング入門 第6回
 
Composable Callbacks & Listeners
Composable Callbacks & ListenersComposable Callbacks & Listeners
Composable Callbacks & Listeners
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとか
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているか
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks
 

Sns suite presentation

  • 3.       @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) }
  • 4. /** 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) }
  • 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
  • 7. 目的:All SNS サイトまとめとイベントサイト 言語:Scala F/W:Lift DB: Mysql 5.5 OS: Ubuntu 10.10 Package基本クラス:com.snssuite 基本条件: 1。Encoding: UTF-8 2。html5で作る
  • 8. スキル: 1。 Internationalization 2。 Twitter, facebook, flickr, mixi gmail, gcalender, foursquare me2day, nate(cyworld),naver, last.fmのoauthとapi連投 3。 snsのsuiteライン(まとめページ)    各Snsのライン(各ページ) 4。 各SNSの設定(呼び出し、書き込み) 5。 AtndApi活用、効率的な検索 6。 全てのSNSのカレンダ管理
  • 9. 使ったliftスキル: Ormapping, dispatch, oauth Batch, Paginator, Jsonetc
  • 10. DB設計: User,UserOauth, SnsSuite SnsSetup, SnsType, AtndEvents DBの詳細項目は別存在。
  • 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 etc 2.3 etc SNS github(social Coding), last.fm, foursquare 2.4 youtube 2.5 atnd: Social