2011-09-18
/ sbt
ãã¹ãã®è©±ãããããäžåºŠãã©ã°ã€ã³ãæžããŠããŸããšãã©ãããŠãé·æçãªãã®ã«ãªã£ãŠããŸããæ°ããæ©èœãå ãç¶ããïŒãããã¯ãã°ãçŽãç¶ããïŒããã«ã¯ãã¹ããæžãã®ãåççã ãã ãã©ããã«ãããŒã«ã®ãã©ã°ã€ã³ã®ãã¹ããªããŠã©ããã£ãŠæžãã°ãããã ããïŒãã¡ããé£ã¶ãã ãã
scripted test framework
sbt ã¯ãscripted test framework ãšãããã®ãä»ããŠããŠããã«ãã®çæžããã¹ã¯ãªããã«æžãããšãã§ãããããã¯ãããšããš å€æŽã®èªåæ€ç¥ããéšåã³ã³ãã€ã«ãªã©ã®è€éãªç¶æ³äžã§ sbt èªäœããã¹ãããããã«æžããããã®ã :
ããã§ã仮㫠B.scala ãåé€ããããA.scala ã«ã¯å€æŽãå ããªããã®ãšãããããã§ãåã³ã³ãã€ã«ãããšãA ããåç
§ããã B ãååšããªãããã«ããšã©ãŒãåŸãããã¯ãã ã
[äžç¥ (éåžžã«è€éãªããšãæžããŠãã)]
scripted test framework ã¯ãsbt ã以äžã«æžããããããªã±ãŒã¹ãç確ã«åŠçããŠãããã確èªããããã«äœ¿ãããŠããã
æ£ç¢ºã«ã¯ããã®ãã¬ãŒã ã¯ãŒã¯ã¯ siasia ãšããŠç¥ããã Artyom Olshevskiy æ° ã«ããç§»æ€ããã scripted-plugin çµç±ã§å©çšå¯èœã ããããã¯æ£åŒãªã³ãŒãããŒã¹ã«åã蟌ãŸããŠããã
ã¹ããã 1: snapshot
scripted-plugin ã¯ãã©ã°ã€ã³ãããŒã«ã«ã« publish ããããããŸã㯠version ã -SNAPSHOT ãªãã®ã«èšå®ãããã
ã¹ããã 2: scripted-plugin
次ã«ãscripted-plugin ããã©ã°ã€ã³ã®ãã«ãã«å ãããproject/scripted.sbt:
libraryDependencies <+= (sbtVersion) { sv =>
"org.scala-sbt" % "scripted-plugin" % sv
}
以äžã scripted.sbt ã«å ãã:
ScriptedPlugin.scriptedSettings
scriptedLaunchOpts := { scriptedLaunchOpts.value ++
Seq("-Xmx1024M", "-XX:MaxPermSize=256M", "-Dplugin.version=" + version.value)
}
scriptedBufferLog := false
ã¹ããã 3: src/sbt-test
src/sbt-test/<ãã¹ãã°ã«ãŒã>/<ãã¹ãå> ãšãããã£ã¬ã¯ããªæ§é ãäœãããšãããããsrc/sbt-test/<ãã©ã°ã€ã³å>/simple ããå§ãããšããã
2011-08-29
future ã®å®è£
ã«ã¯æ§ã
ãªãã®ããããã©ãæšæºã©ã€ãã©ãªã®äžã«å
±éã®èŠª trait ãããã°ãç¹å®ã®ãã©ãããã©ãŒã ã¹ã¿ãã¯ã«ã³ãŒããäŸåãããã«ãã®æŠå¿µã衚çŸã§ããã®ã«ãšæã£ãŠãããããæã人ãä»ã«ããããã¯åãããªããã©ãã©ã€ãã©ãªã®äœè
ãªããã«ã¯åœ¹ã«ç«ã€ããããªãããªãåãæ¢ããããããsff4s ãæžããåæ©ã ã
future ã£ãŠäœ?
å€åååãããã¯èããããšãããããããªããã©ãäžå¿ããããããããfutureå€ïŒpromise ãšãåŒã°ããïŒã¯æªå®ã®èšç®ã衚çŸããã
futureå€ã¯æªå®ã®èšç®ã衚çŸããã
ããããã䜿ããã説æã ãã©ãããã ãã§ã¯åãããªããããã§èšå€ã«å«ãŸããŠããã®ã¯ããã®èšç®ã¯è£ã§è¡ãããŠãããšããããšã ãããã¯åãã³ã³ãã¥ãŒã¿å
ã®å¥ã®ã¹ã¬ããããå¥ã®ãµãŒãã®äžãããããªãããè¡ååŸ
ã¡ã§ãŸã èšç®ã¯å§ãŸã£ãŠããããªããããããªãããšã«ãããèšç®ã¯çŸåšã®å¶åŸ¡ãããŒã®å€ã§è¡ãããŠãããšããããšã ã
èšç®ã¯ã©ããå¥ã®æã§è¡ãããã
futureå€ã®ããäžã€ã®åŽé¢ã¯ããã®ãã¡ã«èšç®çµæãåŸããããšããããšã ãScala ã®å Žå㯠def apply() ãåŒã³åºããªã©ã®æç€ºçãªã¹ããããèŠãããèšç®ãæªå®ã®å Žåã¯ããããã¯(block)ãããã€ãŸããèšç®çµæãåŸããããŸã§åŸ
ããããïŒãããã¯ã¿ã€ã ã¢ãŠãããïŒã
futureå€ããèšç®çµæãåŸãããšãã§ããã
æåã« futureå€ã宣èšãããæã«ã¯èšç®çµæã¯æããããããªããããŸã ç¡ããããããªããããŸãããã°ãããæç¹ã§çµæãå°çãããªããžã§ã¯ãã®å
éšæ§é ã倿Žããããããããfutureå€ãã解決ã(resolve)ãããšãããåæã«ç¶æ
ãå€ãããã®ãšããã®ã¯ããã°ã©ãã³ã°ã§ã¯ããŸãèŠãããªãã®ã§ãå°ãäžæ°å³ã§ã¯ããã
èšç®çµæã解決ããããã®è£å£ãããã
ãããŸã§ã§ãæãåçŽãªåœ¢ã® futureå€ãèšè¿°ãããå®éã«åœ¹ã«ç«ã€ã«ã¯ä»ã®æ©èœãå¿
èŠã ãã©ãããã§ã䜿ããªãããšã¯ãªããã¡ãã£ãšäœ¿çšäŸãã¿ãŠã¿ãã:
val factory = sff4s. impl. ActorsFuture
val f = factory future {
Thread . sleep( 1000 )
1
}
f() // => ãã㯠1ç§éãããã¯ããåŸã§ 1 ãè¿ã
现ããäºã¯æ°ã«ããªãã§ãæåŸã®äžè¡ã®æ¯ãèãã ãèŠãŠã»ããããã®ããã«ãèšç®çµæãååŸããããšãã匷èŠ(forcing)ãããšããããæå°éã® API ã¯ä»¥äžã®ããã«ãªãã
Future v0.1
abstract class Future [ +A ] {
/** èšç®çµæã匷èŠããŠç¡æéã«ãããã¯ãã */
def apply() : A
}
Scala ãã䜿çšå¯èœãª futureå€ã®å®è£
ã«ã¯ããã€ããããã©ãã©ããäžããæžãããŠããäžã®ãããªå
±éãªèŠªã¯ã©ã¹ãããã°ãç¹å®ã®ã©ã€ãã©ãªã«äŸåããªãã³ãŒããæžãããšãã§ããã
ãŸã æ¥ãªã?
Future v0.1 ã«å¯ŸããŠå¯äžã§ããäºãèšç®çµæãæ»ã£ãŠãããŸã§ãããã¯ããŠããŸãã®ã§ãããŸãã«ãäžäŸ¿ã ãåŸ
ã€ããšããã§ããªããã future ã䜿ããªãã»ããããããã®ãããå
šãŠã® futureå€ãæäŸããããäžã€ã®æ©èœãšããŠãèšç®çµæã®çšæãã§ãããã確ããããã³ããããã³ã°(non-blocking)ãªæ¹æ³ããããããã¯å®è£
ã«ãã£ãŠ isDoneãisSetãisDefinedãisCompleted ãªã©ãšåŒã°ããŠããããå
šãŠåãæå³ã ãä»ã®ãšãããåã®å¥œã¿ãšããŠã¯ def isDefined: Boolean ããããšæããfuture ãæŠå¿µçã« Option ã®å€æ°ãšããŠèããããšãã§ããããã ã
2011-05-28
Scalaçã®é¢æ°åããã°ã©ãã³ã°äžæŽŸã代衚ããè«å®¢ã®äžäººã@djspiewak ã 2010å¹Žã«æžãã “Monads Are Not Metaphors” ã翻蚳ããŸããã翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ãã翻蚳ã®ééãçãããã°é æ
®ãªããææãã ããã
2010幎12æ27æ¥ Daniel Spiewak è
2011幎5æ29æ¥ e.e d3si9n èš³
åã¯ä»ãçŽæãç Žããšããã ããããäžå¹Žåãåã¯çµ¶å¯Ÿã«ã¢ããã®èšäºã ãã¯æžããªããšèªåã«çŽæãããæ¢ã«ã¢ããã«é¢ããèšäºã¯æãäœã£ãŠãããèšäºã®æ°ãå€ãããŠãã®å€ãã ãã§å€ãã®äººã¯æ··ä¹±ããŠããããããå
šå¡ãã¢ããã«å¯ŸããŠç°ãªãæ±ãæ¹ãããŠãããããã¢ããã®æŠå¿µãåããŠåŠãŒããšããè
ã¯ãããªããŒãå®å®æã象ãç æŒ ã®ãããŠã£ã³ (蚳泚: ã¢ã©ãç³»éç§æ°) ã®å
±éé
ãæ¢ãåªåããããã¡ã«ãªã£ãŠããã
åã¯ããã®æ··ä¹±ããå©ã話ã®ãµãŒã«ã¹ã«ããããããäžã€è¿œå ãããããªããšã¯ããªãããŸããã©ã®å©ã話ãå®å
šã«ã¯æ£ç¢ºã§ã¯ç¡ããã©ã®å©ããå
šäœåãäŒããããŠããªãããããã€ãã¯éèŠãªç¹ã«é¢ããŠé²éªšã«èª€è§£ãæããããªå
容ã«ãªã£ãŠãããã¡ãã·ã³æçãå®å®ïŒããïŒã«æããã¯ããããšã§ã¯ã絶察㫠ã¢ãããçè§£ããããšã¯ã§ããªããã¢ãããçè§£ããå¯äžã®èŠæ¹ã¯ããããããã®ãŸãŸã®å§¿ãã€ãŸãæ°åŠçæŠå¿µãšããŠèŠãããšã ã
2011-04-23
Akka ã®äœè
ãšããŠçã
泚ç®ãéããŠãã Jonas Bonér ã 2008å¹Žã«æžãã “Real-World Scala: Dependency Injection (DI) ” ã翻蚳ããŸããã翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ãã翻蚳ã®ééãçãããã°é æ
®ãªããææãã ããã
2008幎10æ6æ¥ Jonas Bonér è
2011幎4æ22æ¥ eed3si9n èš³
ããŠã宿Šã§ã® Scala ã·ãªãŒãºç¬¬äºåŒŸã®ä»åã¯ãScala ãçšãã Depenency Injection (DI) ã®å®è£
ãã¿ãŠãããããScala ã¯ãåãã£ãŠããèšèªæ©æ§ã ããçšããŠãäœéããã® DI ãå®çŸã§ããéåžžã«è±ãã§ãã£ãŒããªèšèªã ããå¿
èŠã«å¿ããŠæ¢åã® Java DI ãã¬ãŒã ã¯ãŒã¯ã䜿ãããšãã§ããã
Triental ã§ã¯ãäžã€ã®æŠç¥ã«èœã¡çããŸã§äžã€ã®ç°ãªãæ¹æ³ã詊ããã以äžã®ããã«è©±ãé²ããŠããããŸããçŸè¡ã® DI ã®å®çŸæ¹æ³ã詳ãã説æããåŸã§ã詊ããä»ã®æ¹æ³ãç°¡åã«ã«ããŒããã
Cake ãã¿ãŒã³ãçšãã
ç§ãã¡ãçšããŠããçŸè¡ã®æŠç¥ã¯ããããã Cake ãã¿ãŒã³ã«åºã¥ããŠããããã®ãã¿ãŒã³ã¯ãMartin Odersky ã®è«æ Scalable Component Abstractions ã«ãããŠãOrdersky ãšåœŒã®ããŒã ã Scala ã®ã³ã³ãã€ã©ãæ§æããæ¹æ³ãšããŠæåã«çºè¡šãããããã®ãã¿ãŒã³ãã©ã®ããã«ã㊠DI ãå®çŸããã®ããšããããšãæ¥æ¬èªã§èª¬æããäºã詊ã¿ãããããïŒç§ãã¡ã®å®éã«äœ¿ã£ãŠããã³ãŒãã«å€§ãŸãã«åºã¥ããïŒæçŽãªãµã³ãã«ã³ãŒããã¿ãŠã¿ããã
泚æ:
é ã远ã£ãŠãæçµããŒãžã§ã³ã«åããŠãªãã¡ã¯ã¿ãªã³ã°ããªãã説æããŠããã®ã§ãæçµããŒãžã§ã³ãèªãã§çè§£ãããŸã§ã¯ãããã¡ããã!ããšå«ã¶ã®ã¯åŸ
ã£ãŠã»ããïŒãã¡ãããèªäºåŸã«ã©ãããŠããšèšããªãæ¹å€ãè³è³ãæèŠãã¢ã€ãã£ã¢ãªã©ãéã£ãŠãããïŒããŸãããã®ãµã³ãã«ã³ãŒãã¯ããã®ãããªãµã³ãã«ã®äŸã«ããããéåžžã«è€éãªæ¹æ³ã§åãã«è¶³ããªãäºãè¡ã£ãŠããããã«ã¿ããããææ
¢ããŠå€§èŠæš¡ã·ã¹ãã ã§ã®å®éã®ãµãŒãã¹ãæ³åããŠãã©ã®ããã«å¿çšã§ããããæ³åããŠæ¬²ããã
ãŸãã¯ãUserRepository (DAOãData Access Object) ãå®è£
ãããã
// å®éã®æ°žç¶åã¯äœãããŠããªããŠãç»é¢ã«ãŠãŒã¶ã衚瀺ããã ãã®ãããŒã
class UserRepository {
def authenticate( user: User ) : User = {
println( "authenticating user: " + user)
user
}
def create( user: User ) = println( "creating user: " + user)
def delete( user: User ) = println( "deleting user: " + user)
}
trait ã€ã³ã¿ãŒãã§ã€ã¹ãšãã®å®è£
ã«åããŠå®è£
ããããšãã§ãããã話ãç°¡åã«ããããã«ãæ¢ããŠããã§ã¯ããããªãã£ãã
2011-01-03
次ã
ãšã€ããã³ãŒãã玡ãåºã NY Scala ã·ãŒã³ã®äžå¿çååšã§ããç¶ãã @n8han ãäºå¹Žåã«æžãã “Weaving tweed with Scala and Json ” ã翻蚳ããŸããã翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ãã翻蚳ã®ééãçãããã°é æ
®ãªããææãã ããã
2009幎5æ27æ¥ n8han è
2011幎1æ2æ¥ eed3si9n èš³
æœåºå ã¯ãProgramming in Scala ã® 24ç« ã«ã®ã¿èšè¿°ãããŠãã Scala ã®ç§å¯æ©èœã§ããã®æ¥ã®å€§ãããã ãä»ãŸã§ã¯ç case Some(thing) => kerpow(thing) ã§æºè¶³ã ã£ãã®ããä»ã§ã¯æœåºåãæžããªããã° #scala freenode ã«ãå
¥ããŠããããªãããºã«ãããã° Scala ãã£ã³ãã«ã®ç¡¬æŽŸãªåžžé£ãã¡ã¯åã®ã³ã³ãã¥ãŒã¿ãããã¯ããŠé©ãã»ã©éŠ¬é¹¿ããããŒã«ããŠã¹ãé£ç¶åçããŠïŒãã ãæ··æµŽã·ã£ã¯ãŒã·ãŒã³ãé€ãïŒãçªçµã®ãã¢ã¯ãã£ããã®ããã«æå³ã®ããã¿ã€ãã³ã°ã諊ããªããã°ãããªãã
蚳泚ãä»¥äž Draco ããæç²
ãããµã ã»ã³ãŒãã¬ãŒã·ã§ã³ã¯äººéã®äººæ Œãçµéšããã¹ãŠæ¶ããæ°ããäººæ Œãæ€ãä»ããæè¡ãéçºããã圌ãã¯ãã®æè¡ãçšããŠãæŠéçšã®äººåœ¢ã¢ã¯ãã£ããçã¿åºããã
人圢ãã¡ã¯ããŒã«ããŠã¹ãšããæœèšã§ç掻ããŠããã誰ãã®äººæ Œãç§»æ€ãããä»»åã«æãã
ã¢ã¯ãã£ãã®äžäººããšã³ãŒã¯èšæ¶ã®ãªã©ã€ãäžã«ãšã©ãŒãèµ·ãããå®å
šã«ã¯èšæ¶ãæ¶ãããŠããªãã£ãã
ãã®æœåºåã¯ã¡ãã£ãšãã¯ã£ãšããŸãããã
åœããããéãåºããåã¯æœåºåããããšããããç¶æ³ã«é©çšããããåªãããäŸãã°ãJavaScript ã€ã³ã¿ããªã¿ãçè§£ã§ãããæŽèœãªæååãJson ãªããžã§ã¯ãã ãæœåºåã䜿ãã° case æ§æã§ãã®ããã«åŠçããããšãã§ãã:
import dispatch.json.Js
val echo = Js("""{"acting": "ç¡è¡šæ
ã§åãèŠãŠãã"}""")
object Echo extends Js { val acting = 'acting ? str }
echo match {
case Echo.acting(hmm) => hmm
case _ => "pshaw"
}
res0: String = staring blankly ahead
Symbol 'acting ã«å¯Ÿã㊠? ãåŒã³åºãããšã§æœåºåãäœæããããSymbol ã«ã¯ ? ã¡ãœããã¯ãªããæé»ã®å€æã§ããããã€ãªããžã§ã¯ãã«å€æãããŠãããEchoãã¯ãã€ãæŒæããŠããšããããšãåãã£ãŠããã®ã§ããã®æœåºåã䜿ã£ãŠçŽæ¥ä»£å
¥ããããšãã§ãã:
2010-12-30
Scala ããããªããä»ã® IDE ã詊ããŸããããçµå± TextMate ã«æ»ã£ãŠããŸãã
ä»åå··ã§è©±é¡ã® IntelliJ IDEA ã«äŸ¿ä¹ããã«ããã£ãŠãTwilight theme ãäœããŸããã
2010-12-07
/ scala / scalaxb
çµå±ã®æïŒscalaxb ã®ãŠãŒã¶ã¯ãšã³ãã£ãã£ã»ãªããžã§ã¯ãã衚çŸããçŸå®ã®åé¡ã«èå³ãããã®ã§ãã£ãŠïŒãããã©ã XML ã«æ°žç¶åãããããšãã£ãããšã§ã¯ãªãïŒã ããïŒãã€ãããŒã¿ãã€ã³ãã£ã³ã°ã®å®è£
ãã·ã³ã°ã«ãã³/ã³ã³ãããªã³ã»ãªããžã§ã¯ããã远ãåºããªããã°ãããªãããšã¯åãã£ãŠããïŒã€ãæè¿ãŸã§ããŒã¿ãã€ã³ãã£ã³ã°ã®å®è£
ã¯ä»¥äžã®ããã«çæãããŠãã:
object Address extends rt. ElemNameParser [ Address ] {
val targetNamespace = "http://www.example.com/IPO"
def parser( node: scala.xml.Node ) : Parser [ Address ] =
...
def toXML( __obj : Address , __namespace : String , __elementLabel : String , __scope : scala.xml.NamespaceBinding ) : scala.xml.NodeSeq =
...
}
ã€ãŸãïŒscalaxb 㯠Address ãã®ãã®ãšã¯é¢ä¿ã®ç¡ã XML ããŒã¿ãã€ã³ãã£ã³ã°ã®ããã«äžçå°ããã€ãžã£ãã¯ããŠããŸã£ãã®ã ïŒ
adapter
ãŸãæåã«ä»¥äžã®ãã㪠adapter ãªããžã§ã¯ãã«è¿œãåºãããšãèãã:
object DefaultXMLAdapter {
object AddressAdapter extends rt. ElemNameParser [ Address ] {
val targetNamespace = "http://www.example.com/IPO"
def parser( node: scala.xml.Node ) : Parser [ Address ] =
...
def toXML( __obj : Address , __namespace : String , __elementLabel : String , __scope : scala.xml.NamespaceBinding ) : scala.xml.NodeSeq =
...
}
}
ãã®æ¹æ³ã«ã¯ããã€ãã®åé¡ãããïŒãŸãïŒscalaxb ã®ã©ã³ã¿ã€ã ã§ãã DataRecord ãïŒä»ãŸã§ã¯ã³ã³ãããªã³ã»ãªããžã§ã¯ãã®æé»æ§ã䜿ã£ãŠãã©ã£ãŠãã toXML ã«ãã©ãçããªããšããããšã ïŒã³ã³ãããªã³ã»ãªããžã§ã¯ãã®è峿·±ãäžé¢ãšããŠãã³ã³ãã€ã©ã¯ïŒæé» (implicit) ã®å®çŸ©ã倿å
ã®åãšå€æå
ã®åã®ã³ã³ãããªã³ã»ãªããžã§ã¯ãã«ãæ¢ãã«ããã(Programming in Scala, p. 441) ãšãããã®ãããïŒ
第äºã®åé¡ã¯ïŒã¢ã€ãã³ãã£ãã£ãŒåé¡ã ïŒãŠãŒã¶ã®ã³ãŒãã®éªéã«ãªããªãããã«ããããšããŠããã®ã«ïŒAddress ãªããžã§ã¯ãã®ããã«ã¯ DefeaultXMLAdapter.AddressAdapterïŒItem ã®ããã«ã¯ DefeaultXMLAdapter.ItemAdapterãªã©ãšïŒãããã£ãŠç®ã«éããã®ãå°å
¥ããŠããŸã£ãïŒãŠãŒã¶ãç¥ã£ãŠããå¿
èŠãããã®ã¯ Address ã XML ã«å€æã§ãããšããäºå®ã ããã£ãŠïŒãããã©ãè¡ãããŠããããšããã®ã¯äœèšãªè©³çްã§ãããªãïŒ
第äžã®åé¡ãšããŠïŒæ¡åŒµæ§ã®åé¡ãããïŒäŸãã°ïŒAddress ãå®çŸ©ãã ipo.xsd ãšïŒAddress ã䜿ã purchaseReportèŠçŽ ãå®çŸ©ãã report.xsd ã®äºã€ã®ã¹ããŒãããããšããïŒåé¡ã¯ïŒreport.DefaultXMLAdapter.PurchaseReportAdapter 㯠ipo.DefaultXMLAdapter.AddressAdapter ãåç
§ããããïŒipo.DefaultXMLAdapter ãæ¡åŒµããŠã«ã¹ã¿ã ã®ããŒã¿ãã€ã³ãã£ã³ã°ãããããšãã§ããªããšããããšã ïŒ
2010-11-06
Debasish Ghosh ãã (@debasishg ) ã® “sjson: Now offers Type Class based JSON Serialization in Scala ” ã翻蚳ããŸããïŒ
å
èšäºã¯ãã¡ã: http://debasishg.blogspot.com/2010/07/sjson-now-offers-type-class-based-json.html
(翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ã)
翻蚳ã®ééãçãããã°é æ
®ãªããææãã ãã
é·ãé sjson ã®ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ API ã¯ãªãã¬ã¯ã·ã§ã³ã«äŸåãããã®ã ã£ãïŒãã®æ¹æ³ã®é·æãšããŠã¯ïŒçžã®äžã§ã¯ãªãã¬ã¯ã·ã§ã³ã«ããå®è£
ãé 匵ã£ãŠããŠã API ã¯äœ¿ããããããããšãã§ãããšããããšã ïŒ
ãããïŒJSON æ§é ãš Scala ã®ãªããžã§ã¯ãã§ã¯åæ
å ±ã®è±ããã«å€§ããªéããããããšãå¿ããŠã¯ãããªãïŒScala ãã JSON ã«ãããšãã«äœããã®åœ¢ã§åæ
å ±ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãããã³ã«ã®äžéšãšããŠä¿åããªããããïŒå¯é倿ãããã®ã¯å Žåã«ãã£ãŠã¯ãšãŠãããªãããŒã§é£ããããšã«ãªãïŒç¹ã« JVM ã§ã¯ type erasure ã®ããã§ JSONæ§é ã«ã·ãªã¢ã«åãã Scala ãªããžã§ã¯ãã®äžã«ã¯å
ã«æ»ãã®ãã»ãŒäžå¯èœãªãã®ãããã ããïŒ
ver 0.7 ãã sjson ã¯å
ã®ãã®ã«å ããªãã¬ã¯ã·ã§ã³ã䜿ããªã JSON ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãããã³ã«ãçšæããïŒããã¯ãŠãŒã¶ãä»»æã®ãªããžã§ã¯ããã JSON ãžã·ãªã¢ã«åããèªåã®ãããã³ã«ãèŠå®ã§ããããã«ãªã£ãïŒãªãã¬ã¯ã·ã§ã³ã«ãã JSON ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ ã§ã¯ã¢ãããŒã·ã§ã³ã§è¡ã£ãŠãããã®ãã«ã¹ã¿ã ãããã³ã«ãèªåã§å®è£
ããããšã§å®çŸããããšãã§ããïŒ
sjons ã®åã¯ã©ã¹ã«ããã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã¯ David MacIver ã«ããçŽ æŽããã sbinary (çŸåšã¯ Mark Harrah ã«ããã¡ã³ã ãããã) ã«ã€ã³ã¹ãã€ã¢ãããŠããïŒåããããã³ã«ã䜿ããŸãå®è£
ã¬ãã«ã§ãè²ã
ãšçãŸããŠããã£ãïŒ
åã¯ã©ã¹ã®åºç€çæŠå¿µãžã®å
¥éïŒScala ã§ã®å®è£
ïŒãããŠåã¯ã©ã¹ã䜿ã£ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãããã³ã«ã Scala ã§ã©ãèšèšã§ãããã«ã€ããŠã¯ïŒæ°é±éåã«æžãã以äžã® blog èšäºãåç
§ããŠã»ãã:
çµã¿èŸŒã¿åã® JSON ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³
ãã㯠sjson ã§ããã©ã«ãã®ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãããã³ã«ã䜿ã£ã REPL ã»ãã·ã§ã³ã®äžäŸã …
2010-11-03
Debasish Ghosh ãã (@debasishg ) ã® “Scala Implicits : Type Classes Here I Come ” ã翻蚳ããŸããïŒ
å
èšäºã¯ãã¡ã: http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
(翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ã)
翻蚳ã®ééãçãããã°é æ
®ãªããææãã ããïŒ
å
æ¥ Twitter äžã§ Daniel ãš Scala ã§ã®åã¯ã©ã¹ã«ã€ããŠè«è°ããŠãããšïŒçªç¶ãã®ãããã¯ã«é¢ããæžãããã ã£ãèšäºãçºèŠããïŒãããèªãã§ãããªãã¯ç¹ã«ç®æ°ããäºãçºèŠããããã§ã¯ãªããïŒåã¯ã©ã¹ã«åºã¥ããæèã¯ããªãã®èšèšã®å¹
ã«äŸ¡å€ãäžããããšãã§ãããšæãïŒãã®èšäºãæžãå§ããã®ã¯ãã°ããåã«èšèšã®çŽäº€æ§ã«ã€ããŠã®èšäº (åæ) ãå
¬éãããšãã®ããšã ïŒ
ãŸã㯠GoF ã® Adapter ãã¿ãŒã³ããå§ãããïŒå§è²åã® Adapter ã¯ããå§ããããåæ(composition)ãšãããã¯ããã¯çšããŠæœè±¡äœ(abstraction) ã©ããããã€ã³ãããïŒ
èšèšã®çŽäº€æ§ã®ãšããšåãäŸã䜿ããšïŒ
case class Address ( no: Int , street: String , city: String ,
state: String , zip: String )
ããã LabelMaker ãšããã€ã³ã¿ãŒãã§ã€ã¹ã«é©åãããããšããïŒã€ãŸãïŒæã
㯠Address ãªããžã§ã¯ãã LabelMaker ãšããŠäœ¿ãããïŒ
trait LabelMaker [ T ] {
def toLabel( value: T ) : String
}
ã€ã³ã¿ãŒãã§ã€ã¹å€æãè¡ãã¢ããã¿ãŒã¯…
// Adapter ã¯ã©ã¹
case class AddressLabelMaker extends LabelMaker [ Address ] {
def toLabel( address: Address ) = {
import address._
"%d %s, %s, %s - %s" . format( no, street, city, state, zip)
}
}
// ãã® Adapter 㯠Address ãªããžã§ã¯ãã« LabelMaker ã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããïŒ
AddressLabelMaker (). toLabel( Address ( 100 , "Monroe Street" , "Denver" , "CO" , "80231" ))
ããŠïŒäžã®èšèšã§æã
ã坿¬¡çã«å°å
¥ããŠããŸã£ãè€éãã¯ãªãã ããïŒ
2010-11-03
Debasish Ghosh ãã (@debasishg ) ã® “Refactoring into Scala Type Classes ” ã翻蚳ããŸããïŒ
å
èšäºã¯ãã¡ã: http://debasishg.blogspot.com/2010/07/refactoring-into-scala-type-classes.html
(翻蚳ã®å
¬éã¯æ¬äººãã蚱諟æžã¿ã§ã)
翻蚳ã®ééãçãããã°é æ
®ãªããææãã ããïŒ
äºé±éã»ã©åã« Scala ã®æé»ã®(implicit)ãã©ã¡ãŒã¿ãçšããåã¯ã©ã¹ã®å®è£
ã«ã€ããŠæžããïŒåã¯ã©ã¹ã¯ããæœè±¡äœ(abstraction)ã«ã€ããŠã®çŽäº€ããé¢å¿äºãïŒæœè±¡äœãã®ãã®ã«çŽæ¥çµã¿èŸŒãããšãªãã¢ãã«åããããšãã§ããïŒããã§ã³ã¢ãªæœè±¡äœããäœèšãªãã®ãåãå»ã£ãŠïŒå¥ã
ã®ç¬ç«ããã¯ã©ã¹æ§é ã«å€ããŠããããšãã§ããïŒæè¿ Akka actor ã®ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ããªãã¡ã¯ã¿ãªã³ã°ããŠåã¯ã©ã¹ã®æ©æµã«é¢ããå®å°çãªç¥èŠãåŸãããšãã§ããã®ã§ïŒããã«å ±åãããïŒ
æåã¯ç¶æ¿ãš trait ã§ããŸããããšæã£ã…
… ãããïŒããã¯é·ç¶ãããªãã£ãïŒJonas Boner ãšçè
ã®éã§ actor ã®ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã«é¢ããŠé¢çœãè«è°ãããïŒä»¥äžã®ãããªèšèšãçãŸãã …
trait SerializableActor extends Actor
trait StatelessSerializableActor extends SerializableActor
trait StatefulSerializerSerializableActor extends SerializableActor {
val serializer: Serializer
//..
}
trait StatefulWrappedSerializableActor extends SerializableActor {
def toBinary: Array [ Byte ]
def fromBinary( bytes: Array [ Byte ])
}
// .. 以äžç¶ã
ãã®ãã㪠trait ã¯ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãšããé¢å¿äºãã³ã¢ãª actor ã®å®è£
ãšçµå(couple)ãããããŠããŸãïŒæ§ã
ãªã·ãªã¢ã©ã€ãºå¯èœãª actor ãããããïŒè¯ãã¯ã©ã¹åãè¶³ããªããªã£ãŠããŠããïŒGoFæ¬ãæããŠãããç¥æµã®äžã€ã«ã€ã³ã¿ãŒãã§ã€ã¹ãçšããã¯ã©ã¹ã®åœåã«å°ããšãããïŒééã£ãããšããã£ãŠããïŒãšãããã®ãããïŒé¢å¿äºãããæå³ã®ããæ¹æ³ã§åå²ããå¥ã®ããæ¹ãæ¢ããïŒ
åã¯ã©ã¹ã
ã³ã¢ã® actor æœè±¡äœããã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã«é¢ããã³ãŒããæãåºãïŒå¥ã®åã¯ã©ã¹ã«ããïŒ
/**
* Actor çŽååã®ããã®åã¯ã©ã¹å®çŸ©
*/
trait FromBinary [ T <: Actor ] {
def fromBinary( bytes: Array [ Byte ], act: T ) : T
}
trait ToBinary [ T <: Actor ] {
def toBinary( t: T ) : Array [ Byte ]
}
// ã¯ã©ã€ã¢ã³ãã¯ããããã® Actor ã®ããã® Format[] ãå®è£
ããå¿
èŠããã
trait Format [ T <: Actor ] extends FromBinary [ T ] with ToBinary [ T ]
actor ãã·ãªã¢ã©ã€ãºå¯èœã«ããããã«ã¯ã©ã€ã¢ã³ããå®è£
ããå¿
èŠããã FromBinary[T <: Actor] ãš ToBinary[T <: Actor] ãšããäºã€ã®åã¯ã©ã¹ãå®çŸ©ããïŒãããããã« Format[T <: Actor] ãšããäºã€ãåããã trait ã«çµã¿åãããïŒ