Slide 1

Slide 1 text

RailsͱPhoenixͷύοέʔδൺֱˍ ElixirͷϚΫϩʹ͍ͭͯগʑ উຢ݈ଠ@ΞΧπΩ

Slide 2

Slide 2 text

ࣗݾ঺հ • ໊લɿউຢ݈ଠ • ࢓ࣄɿϑϦʔϥϯεͷࡶ৯ܥΤϯδχΞ • ݱࡏɿ(ג)ΞΧπΩ͞ΜͰ৽نࣄۀνʔϜͷΤϯδχΞ • झຯɿےτϨɾύʔςΟɾΫϥϒ׆ಈɾετϦʔτμϯεɾϥάϏʔ؍ ઓɾbokete(੕11000֫ಘܦݧ͋Γ) • ΩϟϦΞ·ͱΊ COBOL/Delphi/VC++/Perl/JavaScript/C#/VB.NET/Ruby/Java/PHP/ActionScript/lua/Python/Objective-C/Elixir Windows-SDK/MFC/STL/.NET Framework/Struts/CakePHP/Symfony/CodeIgniter/Zend Framwork/Ethna/Rails/Django/Phoenix SQL Server/Oracle/MySQL/Potgresql AWS(VPC/EC2/RDS/S3/CloudFront/Route53/IAM/SES/CLI) IIS/ActiveX(COM)/DirectShow/ActiveDirectory/Sharepoint/Biztalk/Exchange BIND/LDAP/DHCP/Sendmail/Postfix/apache/nginx/unicorn/Tomcat/Jenkins/Wercker/Chef/Capistrano/Gulp Xen/KVM/VMWare/Vagrant/Docker/LVS/memcached/Tokyo Tyrant/Kyoto Tycoon/Redis/MongoDB/Q4M/RabbitMQ Zabbix/nagios/Cacti/Munin/NewRelic/ElasticSearch/Mecab/Fluentd (αʔόʔαΠυ։ൃɾΠϯϑϥߏங؅ཧɾෛՙରࡦɾιʔγϟϧήʔϜ։ൃɾWindowsΞϓϦ։ൃɾiOS/AndroidΞϓϦ։ൃͳͲ৭ʑͱ)

Slide 3

Slide 3 text

ΞδΣϯμ • RailsͱPhoenixͷύοέʔδൺֱ • ElixirͷϚΫϩʹ͍ͭͯ

Slide 4

Slide 4 text

ύοέʔδൺֱද ༻్ 3BJMT 1IPFOJY ධՁ ϚΠάϨʔγϣϯ SJEHFQPMF FDUP@NJHSBUF  ೝূ EFWJTF VFCFSBVUI ˚ ೝՄ DBODBODBO HVBSEJBO ˓ ιʔγϟϧϩάΠϯ PNOJBVUI VFCFSBVUI@ ˓ ؅ཧը໘ BDUJWFBENJO FY@BENJO ˚ 3&45"1* HSBQF NBSV ˓ ը૾Ξοϓϩʔυ DBSSJFSXBWF BSD ˚ "84࿈ܞ BXTTELSBJMT BXTFMJYJSFY@BXT FSMDMPVE ˓ ଟݴޠରԠ JO HFUUFYU ˓ .PEFMͷ ଟࠃޠରԠ HMPCBMJ[F   ઃఆ஋؅ཧ SBJMT@DPOpH  ˚

Slide 5

Slide 5 text

ϚΠάϨʔγϣϯ (ecto_migrate) ■Good • ridgepoleͱಉ༷ʹɺࣗಈతʹCREATEจ΍ALTERจΛੜ੒ͯ͘͠Ε·͢ɻ ■Bad • ϑΟʔϧυͷܕΛมߋ͠ͳ͍ͱɺϑΟʔϧυͷαΠζมߋ౳͕ߦ͑ͳ͍ɻ • ઐ༻ͷςʔϒϧΛ3ͭ͘Β͍উखʹੜ੒ͯ͠͠·͏ɻ • Ecto2.0΁ͷΞοϓάϨʔυʹ௥ਵ͢Δؾ഑͕ͳ͍Ͱ͢ɻ(Issueཱ͕ͬͯͳ͍ˍͦΕ༻ͷϒϥϯν΋ ͳ͍) ■·ͱΊ • ݱ࣌఺Ͱ͸ɺPhoenixͷ௨ৗͷϚΠάϨʔγϣϯػೳΛ࢖༻͓͍ͯͨ͠ํ͕ྑ͍ͱࢥΘΕ·͢ɻ • ridgepoleͷElixir൛͕ཉ͍͠Ͱ͢ɾɾɾɻ

Slide 6

Slide 6 text

ೝূ (ueberauth/ueberauth_identity) ■Good • ͱΓ͋͑ͣPhoenixʹ͓͍ͯ͸ελϯμʔυͳೝূύοέʔδͳͷͰ҆৺ײ͸͋Γ·͢ɻ ■Bad • deviseͱൺֱ͢Δͱ͔ͳΓػೳෆ଍ɻ(֬ೝϝʔϧͷૹ৴ػೳ΍ύεϫʔυ࠶ઃఆػೳ౳͕ͳ͍) • ೝূޙͷϢʔβʔ৘ใΛηογϣϯʹอ࣋ͨ͠Γ͢ΔίʔυΛࣗ෼Ͱॻ͘ඞཁ͕͋Δɻ • (ඞવతʹ)ϔϧύʔؔ਺౳΋ࣗ෼Ͱ࡞੒͢Δඞཁ͕͋Δɻ(current_userͱ͔user_signed_in?ͱ ͔) ■·ͱΊ • ػೳෆ଍Ͱ͸͋Γ·͕͢ɺޙड़͢ΔueberauthͷιʔγϟϧϩάΠϯܥύοέʔδͱͷབྷΈ΋͋ ΔͷͰɺͱΓ͋͑ͣ͜ΕҰ୒͔ͳͱ͍͏ҹ৅Ͱ͢ɻ

Slide 7

Slide 7 text

ೝՄ (guardian) ■Good • ueberauthͱͷ࿈ܞ͸ී௨ʹՄೳͩͱࢥΘΕ·͢ɻ(ϑϩʔ͕ҟͳΔͷͰ౰વͱ͍͑͹౰વͰ͕͢) • Phoenixͷίϯτϩʔϥʔʹ૊ΈࠐΜͰ࢖͏ͷ͕લఏ(ΞΫγϣϯʹҾ਺͕2ͭ௥Ճ͞ΕΔ)ͳΑ͏Ͱ͕͢ɺޙड़͢ Δmaru(REST API༻ύοέʔδ)ͱͷ࿈ܞ΋ՄೳͩͱࢥΘΕ·͢ɻ • guardiandbͱ࿈ܞ͢Ε͹ɺαʔόʔଆͷૢ࡞ͰಛఆͷϢʔβʔΛڧ੍ϩάΞ΢τ͢Δ͜ͱ͸ՄೳͳΑ͏Ͱ͢ɻ ■Bad • υΩϡϝϯτ͕෼͔Γʹ͍͘Ͱ͢ɻʮphoenix_guardianʯͱ͍͏αϯϓϧ͕͋ΔͷͰͦͪΒΛࢀߟʹ͢Δͱྑ͍ ͔ͱɻ(https://github.com/hassox/phoenix_guardian) • cancancanΈ͍ͨͳߏจͰݖݶ൑ఆΛߦ͍͍ͨ৔߹͸ɺϥοϓ͢ΔϞδϡʔϧ΍ϔϧύʔΛผʹ࡞Δඞཁ͕͋Γ ͦ͏Ͱ͢ɻ ■·ͱΊ • ͱΓ͋͑ͣػೳͱͯ͠͸े෼଍Γ͍ͯΔ͔ͳͱ͍͏ҹ৅Ͱ͢ɻ

Slide 8

Slide 8 text

ιʔγϟϧϩάΠϯ (ueberauth_facebook౳) ■Good • ઃఆϑΝΠϧʹ֤ιʔγϟϧαʔϏε༻ͷAPIΩʔ౳Λهड़͓͚ͯ͠͹ɺ OAuth2पΓͷॲཧ͸શ෦໘౗Λݟͯ͘ΕΔͷͰศརͰ͢ɻ • ueberauth_exampleͱ͍͏αϯϓϧΛݟΕ͹େମͷ͜ͱ͸෼͔Γ·͢ɻ (https://github.com/ueberauth/ueberauth_example) ■·ͱΊ • ѱ͍఺͸ಛʹݟ౰ͨΒͳ͍ͷͰɺ໰୊ͳ͘࢖༻ग़དྷΔͷͰ͸ͳ͍͔ͱࢥΘ Ε·͢ɻ

Slide 9

Slide 9 text

REST API (maru) ■Good • grapeͱಉ༷ͳDSLΛ࢖ͬͯAPI͕ఆٛग़དྷ·͢ɻ ■Bad • (maru͕ѱ͍Θ͚Ͱ͸ͳ͍Ͱ͕͢)jbuilderతͳύοέʔδ͕ͳ͍ͷͰςϯϓϨʔτ Ͱ͸ͳ͘ϚοϓͰjsonΛఆٛ͢Δඞཁ͕͋Γ·͢ɻ ■·ͱΊ • jsonੜ੒෦෼ʹؔͯ͠͸ͱΓ͋͑ͣϚοϓͰରԠ͓͍ͯͯ͠ɺ༨༟͕͋Ε͹ಠࣗʹ ύοέʔδ࡞ͬͯDSLͰjson෦෼Λఆٛग़དྷΔΑ͏ͨ͠ํ͕ྑͦ͞͏ͳҹ৅Ͱ͢ɻ

Slide 10

Slide 10 text

؅ཧը໘ (ex_admin) ■Good • ActiveAdminͱ΄΅ಉ༷ͳUIˍػೳ͕؆୯ʹ࣮ݱग़དྷ·͢ɻ • ueberauthͱͷ࿈ܞ΋ՄೳͰ͢ɻ(ϩάΠϯ/ϩάΞ΢τ/ϩάΠϯϢʔβʔ໊ͷදࣔ౳) • (ueberauthͱ࿈ܞ͢ΔػೳΛ࡞੒ͨ͠ࡍͷهࣄ -> http://qiita.com/poly_soft/items/7da87d56ebdbb8755a3c) ■Bad • (ex_admin͕ѱ͍Θ͚Ͱ͸ͳ͍Ͱ͕͢)Ϟσϧͱؔ࿈ͨ͠ը૾ͷΞοϓϩʔυ͕UPDATEॲཧͷ৔߹ʹ͔͠ߦ͑ͳ͍ͱ͍͏੍ݶ͕ ͋Γ·͢ɻ(ޙड़͢Δarc_ectoͷ੍ݶ) • guardianͱͷ࿈ܞ͸ͪΐͬͱऑͦ͏ͳײ͡Ͱ͢ɻ(before_filterػೳΛ࢖͑͹ɺΞΫγϣϯ୯ҐͰݖݶΛ൑ఆ͢Δఔ౓ͷ͜ͱ͸Մ ೳͬΆ͍Ͱ͕͢) • ෆ۩߹ଟΊͰ͢ɻ͋Μ·Γςετ͞Εͯͳ͍ײ͡ɻࢲ΋2ͭ΄ͲϓϧϦΫΛૹ৴ͯ͠Ϛʔδ͞Ε·͕ͨ͠ɺ࡞ऀͷํ͕ଟ๩ͳΑ͏ ͳͷͰࠓޙ΋ϝϯςφϯε͞Ε͍ͯ͘ͷ͔ͪΐͬͱո͍͔͠ͳͱ…ɻ ■·ͱΊ • ը૾ϑΝΠϧͷΞοϓϩʔυػೳ΍ɺݫີͳೝՄܥͷػೳ͕ඞཁͳ͍ͷͰ͋Ε͹े෼ศརʹ࢖༻ग़དྷΔͱࢥ͍·͕͢ɺͦ͏͍ͬ ͨػೳ͕ඞਢͳͷͰ͋Ε͹ex_admin͸࢖༻͠ͳ͍ํ͕ྑ͍ͱࢥΘΕ·͢ɻ

Slide 11

Slide 11 text

ը૾Ξοϓϩʔυ (arc/arc_ecto) ■Good • ϩʔΧϧ/S3΁ͷϑΝΠϧΞοϓϩʔυɺը૾ͷϦαΠζ΍ϑΥʔϚοτม׵౳͸໰୊ͳ࣮͘ߦग़དྷ·͢ɻ ■Bad • Ectoͱͷ࿈ܞ͸arc_ectoΛ࢖༻͢Δ͜ͱͰՄೳʹͳΓ·͕͢ɺ(Ecto.TypeϏϔΠϏΞͷ࢓༷తʹ)INSERTॲཧ࣌ͷϞ σϧͱͷؔ࿈෇͚͕ߦ͑·ͤΜɻ • arc_ectoͷEcto2.0΁ͷରԠ͸૬౰஗͘ͳΓͦ͏Ͱ͢ɻ(Issueཱ͕ͬͯͳ͍ˍͦΕ༻ͷϒϥϯν΋ͳ͍) • arc_ectoΛ࢖༻͠ͳ͍৔߹͸ɺΞοϓϩʔυॲཧΛݺͼग़͢ίʔυΛίϯτϩʔϥ΍αʔϏε૚ʹ͍͍ͪͪॻ͘ඞ ཁ͕͋Γ·͢ɻ(͕͜͜໘౗) • CarrierwaveͷΑ͏ʹɺϒϥ΢βΩϟογϡରࡦͱͯ͠ϑΝΠϧ໊Λߋ৽࣌ʹຖճมߋ͢Δͷ͕গʑ೉͍͠ͷͰɺ Ωϟογϡରࡦͱͯ͠͸ΫΤϦจࣈྻΛ࢖Θ͟ΔΛಘͳ͍ɻ(CloudFront͸ҰԠରԠͯ͘͠Ε͍ͯΔ) ■·ͱΊ • arc_ecto͸࢖༻ͤͣɺarc͚ͩΛ࢖༻͢ΔΑ͏ʹͨ͠ํ͕ແ೉ͩͱࢥΘΕ·͢ɻ

Slide 12

Slide 12 text

AWS࿈ܞ (ex_aws/aws-elixir/erlcloud) ■Good • ͱΓ্͋͑ͣهͷ͍ͣΕ͔ͷύοέʔδΛ࢖༻͢Ε͹ɺAWSͷେମͷαʔϏεͱ͸࿈ܞग़དྷΔΑ͏Ͱ ͢ɻ ■Bad • ex_aws͸ݱ࣌఺ͰDynamo/Kinesis/Lambda/SQS/S3ʹ͔͠ରԠ͍ͯ͠·ͤΜɻ • aws-elixir͸ɺͳ͔ͥEC2/S3ʹରԠ͍ͯ͠·ͤΜɻ • erlcloud͸େମͷαʔϏε΍APIʹରԠ͍ͯ͠ΔΑ͏Ͱ͕͢ɺҾ਺ΛจࣈྻͰ͸ͳ͘char listͰ౉͢ඞཁ ͕͋Γɺ͞Βʹ໭Γ஋͕ϚοϓͰ͸ͳ͘listͰฦͬͯ͘ΔͷͰѻ͍͕গʑ໘౗ͬΆ͍Ͱ͢ɻ ■·ͱΊ • ύοέʔδ͕ґଘ͍ͯ͠Δ৔߹(arc -> ex_aws౳)Λআ͍ͯ͸ɺجຊతʹ͸erlcloudΛϥοϓͯ͠࢖͏ͷ ͕ྑ͍ͷͰ͸ͳ͍͔ͱࢥΘΕ·͢ɻ

Slide 13

Slide 13 text

ଟݴޠରԠ (gettext) ■Good • Ұൠతʹ޿͘࢖ΘΕ͍ͯΔख๏ͳͷͰͱΓ͋͑ͣແ೉Ͱ͸͋Γ·͢ɻ ■Bad • ѱ͍ͱ͍͏Θ͚Ͱ͸ͳ͍Ͱ͕͢ɺRailsͷymlϑΝΠϧʹΑΔଟݴޠԽʹ׳Ε͍ͯ Δਓʹ͸ͪΐͬͱҧ࿨ײ͕…ɻ ■·ͱΊ • Railsͷʮi18n.tʯͬΆ͘ॻ͚Δlinguistͱ͍͏ύοέʔδ͸͋Μ·Γਪ঑͞Ε͍ͯ ͳ͍Α͏ͳͷͰɺ͓ͱͳ͘͠gettextΛ࢖͓͍ͬͯͨํ͕͍͍͔ͳͱɻ

Slide 14

Slide 14 text

ϞσϧͷଟݴޠରԠ (ͳ͠) ■·ͱΊ • ͜ͷػೳʹରԠ͍ͯ͠Δύοέʔδ͸ଘࡏ͠·ͤΜɻ • Ecto.TypeϏϔΠϏΞͷίʔϧόοΫΛ׆༻͢Δํ๏Ͱ΋Կͱ ͔ͳΓͦ͏ͳؾ͸͠·͕͢ɺ༨෼ͳΫΤϦ͕େྔʹൃੜͯ͠ ͠·͏ͷͰ͋·Γݱ࣮తͰ͸ͳͦ͞͏ɻ • ݱ࣌఺Ͱ͸Ecto.Repo.preload/2ؔ਺Λ࢖ͬͨΓͱ͔ͯ͠ɺΰ ϦΰϦॻ͔͘͠ͳ͍Α͏Ͱ͢ɻ

Slide 15

Slide 15 text

ઃఆ஋؅ཧ (ͳ͠) ■·ͱΊ • rails_config(ݱconfig)ʹ֘౰͢ΔΑ͏ͳύοέʔδ͸ଘࡏ͠·ͤΜɻ • Application.get_env/3ؔ਺Ͱઃఆ஋Λऔಘ͢Δํ͕ࣜඪ४Ͱ͕͢ɺ ίʔυ͕ͪΐͬͱ৑௕ʹͳΔͷ͕ඍົͳҹ৅ɻ • config.exsͷ಺༰ΛίϯύΠϧ࣌ʹಡΈͩͯ͠ɺSettings.foo.barΈͨ ͍ͳײ͡Ͱઃఆ஋ʹΞΫηεग़དྷΔϞδϡʔϧΛੜ੒͢Δͷ͸Մೳͩ ͱ͸ࢥ͍·͕͢ɺͱΓ͋͑ͣඪ४తͳํ๏Λ࢖͓ͬͯ͘ͷ͕ແ೉͔ͳ ͱɻ

Slide 16

Slide 16 text

ϚΫϩʹ͍ͭͯগʑ

Slide 17

Slide 17 text

ϚΫϩʹ͍ͭͯগʑ Ruby/Railsͱൺֱ͢Δͱɺ֤छύοέʔδͷػೳ͕· ͩ·͔ͩͳΓෆ଍͍ͯ͠·͢ɻ ٯʹߟ͑Ε͹ɺύοέʔδΛ࡞ͬͯίϛϡχςΟʹߩ ݙͰ͖Δ༨஍͕͔ͳΓ࢒͞Ε͍ͯΔঢ়گͰ͋Δɺͱ΋ ݴ͑·͢ɻ

Slide 18

Slide 18 text

ϚΫϩʹ͍ͭͯগʑ bokete΋ͦ͏ͳͷͰ͕͢ɺ͓୊͕ग़͔ͯΒ͙͢ʹϘέͳ͍ͱɺ ͔ͳΓͷ֬཰ͰඃΓ·͢ɻ ͳͷͰElixirͷύοέʔδΛ։ൃͯ͠ެ։͢ΔͳΒɺଞͷํͱඃ Βͳ͍Α͏ʹͳΔ΂͘ૣ͍ํ͕͍͍ɺͱ͍͏͜ͱʹͳΓ·͕͢ɺ ύοέʔδΛ࡞Δ৔߹͸ϚΫϩͷ஌͕ࣝඞਢʹͳΓ·͢ɻ ͱ͍͏͜ͱͰElixirͷϚΫϩͷֶशϦιʔεͱ͔ಛघͳߏจʹؔ ͢Δݸਓతͳ஌ݟΛ·ͱΊͯΈ·ͨ͠ɻ

Slide 19

Slide 19 text

ֶशϦιʔε Quote and unquote http://elixir-lang.org/getting-started/meta/quote-and- unquote.html Macros http://elixir-lang.org/getting-started/meta/macros.html Domain Specific Languages http://elixir-lang.org/getting-started/meta/domain- specific-languages.html

Slide 20

Slide 20 text

ֶशϦιʔε Metaprogramming Elixir(ඞಡɻ෼ྔ͸গͳ͍ͷͰͦͷؾʹͳΕ͹1೔ͰಡΊ·͢) https://pragprog.com/book/cmelixir/metaprogramming-elixir ex_enum(੿࡞ͷ۠෼஋؅ཧ༻ύοέʔδɻػೳ͕γϯϓϧˍίʔυྔ͕গͳ͍ͷͰॳ ظͷֶशϦιʔεͱͯ͠͸ѱ͘ͳ͍͔ͳͱ) https://github.com/kenta-aktsk/ex_enum for_ecto_upgrade(੿࡞ͷEcto2.0࣮ݧ༻αϯϓϧɻarcͷΞοϓϩʔμʔͷڞ௨෦෼Λ ϚΫϩԽ͍ͯ͠·͢) https://github.com/kenta-aktsk/for_ecto_upgrade Elixir Slack(͘͢͝׆ൃɻࢲ΋্هͷύοέʔδΛ։ൃ͢Δࡍʹ͓ੈ࿩ʹͳΓ·ͨ͠) https://elixir-lang.slack.com

Slide 21

Slide 21 text

ϚΫϩΛಡΉࡍͷͪΐͬͱͨ͠ Tips quote/unquote͸ɺจࣈྻ಺Ͱม਺Λల։͍ͯ͠Δͷ ͱಉ͜͡ͱͩͱߟ͑Δͷ͕جຊ quoted = """ func3 func4 """ """ func1 func2 #{quoted} """ # => "func1\nfunc2\nfunc3\nfunc4\n\n"

Slide 22

Slide 22 text

ϚΫϩΛಡΉࡍͷͪΐͬͱͨ͠ Tips ͦͷίʔυ͕ʮͲ͜ʹʯల։͞ΕΔͷ͔ɺʮ͍ͭʯ࣮ߦ͞ΕΔͷ͔Λ೺Ѳ͢Δ͜ͱ͕ͱͯ΋ ॏཁɻ ■Ͳ͜ʹ ɾdefmodule ɾdefmacro ɾdef ■͍ͭ ɾϚΫϩల։࣌ ɾίϯύΠϧ࣌ ɾϥϯλΠϜ

Slide 23

Slide 23 text

defmodule Mod1 do defmacro macro1(name) do IO.puts "macro1 called." # ϚΫϩల։࣌ʹ࣮ߦ͞ΕΔ quote do Mod1.func1 # ίϯύΠϧ࣌ʹ࣮ߦ͞ΕΔ(defmodule಺Ͱల։͞ΕΔͨΊ) def unquote(name)() do # unquote(name)͸ϚΫϩల։࣌ʹ࣮ߦ͞ΕΔ IO.puts "#{unquote(name)} called." # IO.puts͸ϥϯλΠϜɻunquote(name)͸ϚΫϩల։࣌ Mod1.macro2 # ίϯύΠϧ࣌ʹల։͞ΕΔ end end end defmacro macro2 do quote do IO.puts "macro2 called." # ϥϯλΠϜ(defͷதʹల։͞ΕΔͨΊ) end end def func1 do IO.puts "func1 called." end end defmodule Mod2 do import Mod1 macro1 :hello end # => macro1 called. # => func1 called. Mod2.hello # => hello called. # => macro2 called.

Slide 24

Slide 24 text

ϚΫϩΛಡΉࡍͷͪΐͬͱͨ͠ Tips ■ElixirͷDSLͷجຊߏ଄ http://qiita.com/poly_soft/items/d9307068f4b2af733b78 ■ElixirͰؔ਺ͷҾ਺ʹunquoteΛࢦఆ͢Δߏจͷ༻్ http://qiita.com/poly_soft/items/6f3d4400873a5ccd6c0d ■Elixirͷ”var!”ϚΫϩʹΑΔnilίϯςΩετҾ਺ͷߟ࡯ http://qiita.com/poly_soft/items/4072ac914fbf76cadf7e ■Elixirͷdefmacro಺ͷ__MODULE__͸ͲͷϞδϡʔϧΛࢦ͍ͯ͠Δͷ͔ http://qiita.com/poly_soft/items/d260b38c43f8cfc94b8b

Slide 25

Slide 25 text

ϚΫϩΛॻ͘ࡍͷͪΐͬͱͨ͠ Tips ͱΓ͋͑ͣʮମͰ֮͑Δʯͱ͍͏͔ɺ(͘͢͝಄ͷྑ ͍ํ͸ผͱͯ͠)ίϯύΠϧΤϥʔ͕ग़ͯ͸͡Ίͯ ʮ͋Εɺ͜ͷߏจͩͱμϝͳͷʁʯͱ͍͏ͷ͕෼͔Δ έʔε͕ଟ͍ͷͰɺ࣮ࡍʹͳʹ͔ύοέʔδΛ࡞ͬͯ ΈΔͷ͕ૣ͍͔ͳͱɻ

Slide 26

Slide 26 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ ■Facebook https://www.facebook.com/kenta.katsumata ■Github https://github.com/kenta-aktsk https://github.com/kenta-polyglot ■qiita http://qiita.com/poly_soft ■ͦͷଞ https://jp.linkedin.com/in/kentakatsumata https://www.wantedly.com/users/62147 https://twitter.com/poly_soft http://bokete.jp/user/polysoft