Slide 1

Slide 1 text

1MBZ 4DBMB͸ /FYU4FBTBSͳͷ͔

Slide 2

Slide 2 text

ࣗݾ঺հ !VTTZ !UTVZPTIJ[BXB ٢ᖒɹؽ גࣜձࣾψʔϥϘ TDBMBPBVUIQSPWJEFS

Slide 3

Slide 3 text

4FBTBSͱͷؔΘΓ

Slide 4

Slide 4 text

ͱ͖͸ྲྀΕɾɾɾ w डୗҊ݅Ͱ͸ܧଓͯ͠4FBTBSΛ࠾༻ w 4FBTBSϝϯςφϯεϞʔυ΁ w ࣗ෼ͰԿ͔αʔϏεΞϓϦΛͭͬͯ͘Έ͍ͨʂ w 5ZQFUBMLψʔϥϘ̏ͭ໨ͷαʔϏεʹͳΔ

Slide 5

Slide 5 text

มԽ͠ଓ͚Δ࣌୅ "1* 8FC "OESPJE J04 0UIFS 4FSWJDF +40/ 3&45 )5.- 8FC4PDLFU .JDSPTFSWJDFT 41"

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

ΞʔΩςΫνϟͷҧ͍ +&&$POUBJOFS 4FBTBS +BWB /FUUZ 1MBZ'SBNFXPSL 4DBMB+BWB 4+%#$ 4MJDL 4QSPKFDU NPEVMFT

Slide 8

Slide 8 text

4DBMBͷಛ௃ +BWBϢʔβʔͩͬͨࢹ఺Ͱ

Slide 9

Slide 9 text

*NNVUBCMF case  class  User(name:  String,  lang:  Lang)   val  u  =  User("Seasar",  Lang("ja-­‐JP"))   u  =  User("Seasar",  Lang("en-­‐US"))  //  error   u.name  =  "Seasar"  //  error   val  u2  =  u.copy(lang  =  Lang(“en-­‐US”)) w DBTFDMBTTͷDPQZϝιουΛ࢖༻͢Δ͜ͱʹ ΑͬͯɺݩͷΠϯελϯεΛ௚઀มߋ͠ͳ͍

Slide 10

Slide 10 text

0QUJPO w +BWBͰ0QUJPOBM͕ಋೖ w 4DBMB͸ݴޠઃܭ࣌ʹ૊Έࠐ·Ε͍ͯΔͨΊɺ $PSF"1*͔ΒOVMM͕ฦ͞Εͳ͍҆৺ײ def  findUser(name:  String):  Option[User]  =  ???   findUser("Seasar").map  {  user  =>      …   }.getOrElse  {      …   }

Slide 11

Slide 11 text

ώΞυΩϡϝϯτ val  user  =  User("Seasar",  Lang(“en-­‐US”))   s"""   Hello!   Your  name  is  $user.name   """   Hello!   Your  name  is  Seasar w 4USJOH*OUFSQPMBUJPO΋͔Βαϙʔτ

Slide 12

Slide 12 text

ύλʔϯϚον User("Seasar",  Lang("ja-­‐JP"))  match  {      case  User(name,  lang)  if  lang  ==  Lang("ja-­‐JP")  =>          println(s"͜Μʹͪ͸  $name  ͞Μ")      case  User(name,  _)  =>          println(s"Hello  $name")   } w ΦϒδΣΫτΛ෼ղͯ͠஋ΛऔΓग़͢͜ͱ͕Ͱ͖Δ

Slide 13

Slide 13 text

໊લ౉͠ w ࣮ߦ௚લ·ͰॲཧΛߦΘͳ͍ w ྫʣෆཁͳϩάϨϕϧԼͰԿ΋ॲཧ͸ͤ͞ͳ͍ def  time(f:  =>  Unit)  {      val  before  =  System.currentTimeMillis      f      println(System.currentTimeMillis  -­‐  before)   }   val  isDebug  =  false   def  debug(s:  String)  =  if  (isDebug)  println(s)   def  lazyDebug(s:  =>  String)  =  if  (isDebug)  println(s)   time  {  debug("Hello"  *  5000000)  }  //  140ms   time  {  lazyDebug("Hello"  *  5000000)  }  //  0ms  

Slide 14

Slide 14 text

'VUVSF val  f1  =  Future  {  100  }  //  heavyTask   val  f2  =  Future  {  200  }  //  heavyTask   val  f  =  for  {      r1  <-­‐  f1      r2  <-­‐  f2   }  yield  (r1  +  r2)   f  onSuccess  {      case  r  =>  println(r)  //  300   } w ඇಉظॲཧͷ߹੒΋खܰ w +BWBͷ$PNQMFUBCMF'VUVSF

Slide 15

Slide 15 text

4DBMBͷίί͕ࠔΔ w ίϯύΠϧ͕஗͍ w ϓϩδΣΫτ෼ׂɺJNQMJDJUΛଟ༻͠ͳ͍ͱ ͍ͬͨ#, w όΠφϦޓ׵ੑ  ʜ  w ϥΠϒϥϦ͕ର৅4DBMBͷόʔδϣϯͰ࠶ίϯ ύΠϧ͢Δඞཁ͋Γʢ͔ͳΓվળ͞ΕͯΔʣ

Slide 16

Slide 16 text

DMFBODPNQJMFྫ 0 50 100 67s 90s MBA 11-inch Mid 2012 (2.0 GHz intel Core i7) MBP Retina 15-inch Early 2013 (2.7 GHz Intel Core i7) ։ൃ࣌͸ຖճΫϦʔϯίϯ ύΠϧ͢ΔΘ͚Ͱ͸ͳ͍ sbt ͕ࠩ෼ίϯύΠϧͯ͘͠ ΕΔ

Slide 17

Slide 17 text

1MBZͷಛ௃

Slide 18

Slide 18 text

3&45GVM class  UserController  extends  Controller  {      …      def  create  =  Action  {          val  user  =  …          Ok(Json.toJson(user))      }   } POST  /users  controllers.UserController.create

Slide 19

Slide 19 text

ηογϣϯ؅ཧ w 1MBZࣗମ͸αʔόʔηογϣϯΛ؅ཧ͠ͳ͍ w ΫϥΠΞϯτDPPLJFʹอ࣋͢ΔʢจࣈྻͷΈʣ w ΞϓϦͰੜ੒ͨ͠TFTTJPOJEͰ,743%# ͱؔ࿈͚ͮΔ w εέʔϧΞ΢τ͠΍͍͢࢓૊Έ

Slide 20

Slide 20 text

)PUEFQMPZ w 4FBTBSͷ୅໊ࢺ w 1MBZ։ൃϞʔυͰ͸Կ΋ઃఆͤͣʹར༻Մ w --ͷΑ͏ͳʢίϯύΠϧআ͘ʣײ֮ w $MBTT-PBEFSΛࠩ͠ସ͑Δಉ͡࢓૊Έ

Slide 21

Slide 21 text

5ZQFTBGFWJFX w )5.-Λฦͯ͠+40/Λऔಘ͢Δ࣌୅͚ͩͲ w ܕͷߏ଄Λมߋͨ͠ΒΤϥʔʹͳΔ҆৺ײ w ϝʔϧςϯϓϨʔτʹ΋࢖༻Մ w σβΠφʔͱͷڠۀʹ͸޲͍ͯͳ͍ @(user:  User)   @user.name

Slide 22

Slide 22 text

%*"01 w 1MBZ͔Β+43ʹΑΔ%*αϙʔτ w 4DBMBͷػೳΛར༻͢Δͱɺ΄ͱΜͲͷέʔεʹ ͓͍ͯ%*"01Λ࢖Θͳͯ͘΋Մ w ࣮ߦ࣌%*Ͱ͸ͳ͘ɺίϯύΠϧ%* w ίʔυʹॻ͔Εͯݟ͍͑ͯΔ΋ͷ͕͢΂ͯ

Slide 23

Slide 23 text

؆қͳϞοΫ࣮૷ྫ trait  Twitter  {      def  search(keyword:  String)  =  ???   }   object  Twitter  extends  Twitter   class  TwitterController  extends  Controller  {      val  twitter  =  Twitter      …   } class  MockTwitterController  extends  TwitterController   {      override  val  twitter  =  MockTwitter   }

Slide 24

Slide 24 text

τϥϯβΫγϣϯྫ def  findUser(name:  String)  =      DB.readOnly  {  implicit  session  =>          User.find(name)      } w τϥϯβΫγϣϯڥքΛϒϩοΫͰදݱ w τϥϯβΫγϣϯ͕͋ΔͱΘ͔Δ҆৺ײ w +BWBͷϥϜμࣜͰ΋࣮ݱՄ %PNB

Slide 25

Slide 25 text

03. w 4FBTBSͱ͍ͬͨΒ4+%#$ w 4FBTBSΛ࢖͍ଓ͚ΒΕͨཁҼ w 4MJDL4DBMJLF+%#$ʢඇ1MBZґଘʣ w ྲྀΕΔΠϯλʔϑΣʔεΛαϙʔτ w ϦϑϨΫγϣϯΛ࢖ΘͣʹϚοϐϯά

Slide 26

Slide 26 text

42-JT%4- sql"""      select          id,  name,  price,  created_at      from          products      where          id  =  ${id}   """   .map(rs  =>  Product(rs)).single.apply() w 4DBMB ϚΫϩ֦ுʹΑΔ҆શͳ42- CZTDBMJLFKECD  w ίʔυͱ42-͕෼཭͠ͳ͍ͨΊ೺Ѳ͠΍͍͢

Slide 27

Slide 27 text

%#ϚΠάϨʔγϣϯ w 4+%#$(FO w 1MBZ͸ඪ४Ͱ૊ΈࠐΈʢແޮՄೳʣ w 6Q%PXOεΫϦϓτΛ42-Ͱهड़ w ಛఆͷ03.ʹґଘ͢Δ΋ͷͰ͸ͳ͍ w ϦΫΤετ͝ͱʹมߋΛݕ஌ʢ։ൃϞʔυʣ w 'MZXBZͷϓϥάΠϯ΋͋Γ

Slide 28

Slide 28 text

%#ϚΠάϨʔγϣϯ

Slide 29

Slide 29 text

%#ϚΠάϨʔγϣϯ ϒϥϯνʹνΣοΫΞ΢τޙ ΞοϓάϨʔυ42-͕૸Δ ϒϥϯνΛ໭ͤ͹ μ΢ϯάϨʔυ42-͕૸Δ

Slide 30

Slide 30 text

υΩϡϝϯτ w ւ֎ͷϓϩμΫτͳͷͰӳޠ w ೔ຊޠ΋༗ࢤͷํʑ͕·ͰରԠ w 1MBZ +BWB޲͚ͷ೔ຊޠॻ੶ ։ൃʢ࢓༷มߋʣʴυΩϡϝϯτमਖ਼͕ૣ͘ɺ຋༁ ࡞ۀ౳Λ௥ਵ͢Δͷ͕େม

Slide 31

Slide 31 text

1MBZίϛϡχςΟ w (JUIVC w #VH*TTVF13Λड͚෇͚͍ͯΔ w (PPHMF(SPVQTʢ೔ຊޠάϧʔϓ΋͋Γʣ w ࣭໰Λͯ͠։ൃऀɺϢʔβʔ͕ฦ৴͢Δ 'PSVN w (JUUFSʢ೔ຊޠ͸TDBMBKQQVCMJDʣ w νϟοτͰؾܰʹ࣭໰ձ࿩

Slide 32

Slide 32 text

αϙʔτ w 5ZQFTBGF w &91&354611035ʢӳޠʣ w ࠃ಺ύʔτφʔγοϓ5*4ɺΞοτ΢ΣΞ͞Μ w γεςϜίϯαϧςΟϯάαʔϏε

Slide 33

Slide 33 text

1MBZͷ޷ҹ৅ͳ఺ w 4DBMBʹΑΔܕ҆શɺϥϯλΠϜΤϥʔ཈ࢭ w ࠇຐज़͕ͳ͍ͨΊɺ͸·ΓͮΒ͍ w ࢼߦࡨޡΛ܁Γฦ͢։ൃ͕͠΍͍͢ w ։ൃ͕ΞάϨογϒͰτϨϯυΛ௥͍΍͍͢

Slide 34

Slide 34 text

w +BWB΋αϙʔτ͍ͯ͠Δ΋ͷͷɺ4DBMB͕Θ͔ Βͳ͍ͱͭΒ͍ w ޙํޓ׵ੑ͸ظݶΛઃ͚ͯͳͯ͘͘͠Δ w ϑϩϯτ͚ͩमਖ਼ͯ͠ϦϦʔε͢Δʹ΋σϓϩΠ· Ͱʹ͕͔͔࣌ؒΔ 1MBZͷίί͕ࠔΔ "1*αʔόʔͱ͢Δͷ͕Αͦ͞͏ʁ

Slide 35

Slide 35 text

/FYU4FBTBSͳͷ͔ʁ

Slide 36

Slide 36 text

/FYU4FBTBSͳͷ͔ʁ w /FYU4FBTBSͰ͸ͳ͍ผͷํ޲ੑ w தେن໛ϓϩδΣΫτ΁ࣗ৴Λ࣋ͬͯਐΊΒΕͳ͍ w 4DBMB1MBZϢʔβʔͷ֬อɺڭҭ͕ඞཁ w ։ൃͷ͠΍͢͞ɺܕʹकΒΕͨݎ࿚ͳΞϓϦΛͭ͘ Γ΍͢͞͸ਐԽ͍ͯ͠Δ ·ͩ·ͩ࢖͍͚͍͖ͭͮͯ·͢ʢࠓͷॴʣ

Slide 37

Slide 37 text

4FSWMFUͰ4DBMB ΍Γ͍ͨํ 4LJOOZ'SBNFXPSL͕Φεεϝ

Slide 38

Slide 38 text

΍ͬͺΓ+BWBͳํ 4QSJOH#PPUͷηογϣϯ΁ʂ