2015-01-01ãã1å¹´éã®è¨äºä¸è¦§
ä»äº 5æãããã¾ã§Android 10æã¾ã§C# 11æè»¢è· 転è·å ã§ã¾ãAndroid ãã©ã¤ãã¼ã ç¹ã«å¤ãã£ããã¨ã¯èµ·ããã ãã¾ã«éæµæ§é£éçã£ã½ãçç¶ãåºãã®ãç´ã£ã¦ãªãã Prime Videoã使ãå§ãããã¨ã§æãå®¶ã®PS4ãããæ¬æ°åºãã¯ãããã ä»ã¯ã·ã¥ã¿ã²å°ç¨â¦
ã¿ã¤ãã«ã®ã¨ããã§ããKotlinã§æ¸ããAndroidã¢ããªããªãªã¼ã¹ãã¾ããããã¨ããããããããã¨ããããªããAndroidçHBFavã¯ãã§ã«å¥ã®æ¹ãHBFav for Androidããªãªã¼ã¹ãã¦ããã®ã§å°ãååãå¤ãã¦HBFav Materialã¨ããååã§åºãã¦ãã¾ããDesign Suppâ¦
ãã®ã¨ã³ããªã¼ã¯ åè¨Advent Calendar 2015ã®16æ¥ç®ã®ã¨ã³ããªã§ãã www.adventar.org åè¨ è²´æ§ã¯è£ä¸ãæãã°ããã§å°ãäºãããªãã£ã çã®æ¬²ã®å½¢ã示ãäºããªããéãè¦å¤±ã£ãè£ä¸ãæ¨ã¦ç½®ãã ãã ä¸äººã§ãã¾ãé¡ã®ã¾ã¾å°å¥éºãªçæ³ã¨ãããæãç¦ãâ¦
ä¸çªææ°ã®ãã¤ã¯ãã£ã¡ rei19.hatenablog.com ååã¯ãã¡ã rei19.hatenablog.com åã®ããã¸ã§ã¯ãã§éçºãã¦ããã¢ããªããªãªã¼ã¹ãã¦ããã¯Androidããé¢ãã¦ããã®ã§ãããä¼ç¤¾å¤ãã¦ã¾ã触ããã¨ã«ãªã£ãã®ã§æãåºãæå³ã§ãåèãã¾ãã ååã¯åºæ¥â¦
転è·ãã¦æ°ããªMacBookãæ¯çµ¦ããããã©ãã»ããã¢ããããã¨ãã«ããä½å ¥ãã¦ãã£ãï¼ã¨ãªã£ãã®ã§èªåç¨ã®ã¡ã¢ã(USãã¼ãã¼ãåã) è±æ°/ããªåãæ¿ã Google IMEãå ¥ãã Karabiner-Elementsãå ¥ãã Complex ModificationsããJPåãã®ruleãå ¥ãã¦ã³ãâ¦
ç®ç 鿥叏ãªç©ºéã«ããã£ã¦æ°ããæè¡ã«ææ¦ããããä½ããã¨æã£ã¦ãããã©æ®æ®µã¯ãªããªãæéãã»ã»ã»ã¨ãããããªãã®ãéä¸ãã¦ä½ã ãã¨ãã¨èº«å ã§ãã©ã¤ãã¼ãã§ãä½ãä½ã£ããããã®ã好ããªäººéãéã¾ã£ã¦ããããéçºããã¤ãã³ãã ã£ãããä»åâ¦
ãå ±å 10æãã£ã±ãã§éè·ãã¾ãã¨ãã話ãããæ¬æ¥ãæçµåºç¤¾ã§ããã社å å¤ã®æ¹ã«ã¯ãä¸è©±ã«ãªãã¾ããããããã¨ããããã¾ãããæ°ãã¤ãã°å ¥ç¤¾ãã¦ãã6å¹´ããã6å¹´åã ã¨ã¬ã©ã±ãµã¤ãã®éçºããã¯ãã¾ããæè¿ã ã¨ãã¤ãã£ãã¢ããªã®éçºã¨ãããããâ¦
Twitterã®ã¿ã¤ã ã©ã¤ã³ä¸ã§ã¤ãã³ããã¿ããã¦ããã¾ãè¦ãªãã³ã³ã»ããã®åå¼·ä¼ã§é¢ç½ããªã¼ã¨æã£ãã®ã§çãä¸ããå´ã§åå ãã¦ãã¾ããã主å¬ã® @yodatomato ãããä¼å ´ã貸ãã¦ããã 21cafeãããããã¨ããããã¾ãããã»ãã®åå è ã®æ¹ã ããç²ããã¾â¦
Kotlinã¨ã¯ InteliJ IDEAã§ããªãã¿ãJetBrains社ã主å°ãã¦éçºãã¦ããè¨èªã§ãJVMä¸ã§åãéçåä»ãã®ãªãã¸ã§ã¯ãæåããã°ã©ãã³ã°è¨èªãJava è¨èªãããç°¡æ½ã«æ¸ãããã¨ãç®æãã¦ããããããããã使ã£ã¦Androidã¢ããªãæ¸ãã¦ã¿ã¾ãã å ¬å¼ã¯ãâ¦
Atomå§ãã¾ãã ä»äºã ã¨.Netéçºãã¦ãã®ã§å¤§é¨åã®æéã¯Windows/VisualStudioã使ã£ã¦ã¾ãããå®¶ã ã¨MacBook使ãã®ã§æ®éã«ããã¹ãã¨ãã£ã¿ä½¿ã£ã¦ã¾ããã§ãä¸ã®ä¸çã«ã¯Vimã¨Emacsã§2åãã¦ããä¸ãSublime Text 2ã§HTMLããJavaScriptããNode.jsããGâ¦
Macros Foreword Macroã¯é常ã®Elixirã®ã³ã¼ãããããããã¥ãããéçºè ã¯è²¬ä»»ãæã£ã¦ã¯ãªã¼ã³ãªã³ã¼ããæ¸ãããã«å¿ãããã Elixirã¯ãã§ã«ç°¡æ½ã§ããããããä»çµã¿ãæä¾ãã¦ãããMacroã使ãã®ã¯æå¾ã®ææ®µã§ããã¨çè§£ãã¹ãã ããã Our first mâ¦
Quoting Elixir ã®ããã°ã©ã ã¯tupleãä¼´ã£ã3ã¤ã®è¦ç´ ã«ç½®ãæãããã¨ãã§ãããä¾ãã°sum(1, 2, 3)ããã£ãå ´åã¯ä»¥ä¸ã®ããã«æ¸ãæãããã¨ãã§ããã 以ä¸ãèªåã®ç°å¢ã ã¨sumãªãããããï¼ã¨è¨ãããã®ã§remã¨ãé©å½ãªãã«ãã¤ã³é¢æ°ã«ç½®ãæãã¦è©¦â¦
æå¾ã«routingã®æ©è½ãKVã¢ããªã±ã¼ã·ã§ã³ã«è¿½å ãããrouting table ã¯ãã®ããã«ãªãã [{?a..?m, :"foo@computer-name"}, {?n..?z, :"bar@computer-name"}] Our first distributed code VMã«ååãã¤ãã¦éå§ãããiex --sname fooã§REPLãèµ·åããã ãâ¦
Elixirã®Getting StartãMix/OTPãçµãããæ¬¡ã«é²ãã®ã§ããã復ç¿ãã¦ãåã«Elixirã§æ¸ããã³ã¼ããMix and OTPã®ç« ã§ãã£ããã¨ã使ã£ã¦æ¹åãã¦ã¿ã¾ãã å ãã¿ã¯Qiitaã®èªåã®æç¨¿ Elixirã§Slackã®botãä½ã£ã¦Herokuã§åããã¦ã¿ã - Qiita ãã¾ãã¡Qiitâ¦
TCPçµç±ã§åãåã£ãã¡ãã»ã¼ã¸ããã¼ã¹ãã¦KVã¢ããªã±ã¼ã·ã§ã³ã«éãå¦çãå®è£ ããã Doctests doctestã使ã£ã¦ãã¼ã¹ãã颿°ãå®è£ ãããããã¯ããã¥ã¡ã³ããããã¹ãã使ãããã¨ãã§ããããã¥ã¡ã³ãå ã®æ£ç¢ºãªãµã³ãã«ã³ã¼ãã®æä¾ãå©ãã¦ãããâ¦
Erlangã®:gen_tcp ã¢ã¸ã¥ã¼ã«ã«ã¤ãã¦å¦ã¶ã Echo server ã¾ãã¯Echo Serverã使ãããã¨ããå§ãããTCP Serverã¯ä»¥ä¸ã®Stepãå®è¡ãã å©ç¨å¯è½ãªPortãéãã¦Listenãã ãã®Portã§ã¯ã©ã¤ã¢ã³ãããã®æ¥ç¶ãå¾ ã¡ãåãå ¥ãã ã¯ã©ã¤ã¢ã³ãããã®è¦æ±ãâ¦
KVã¢ããªã±ã¼ã·ã§ã³ã¯å®æããã®ã§æ¬¡ã«ãããå®è£ ããTCPãµã¼ãã¼ã使ããããã®åã«Mixã®Dependencyã«ã¤ãã¦çè§£ããã External dependencies å¤é¨ä¾åã¯ãã¸ãã¹ãã¡ã¤ã³ã«ç¸ãããªããä¾ãã°ä»ã®KVã¢ããªã±ã¼ã·ã§ã³ã®ããã«HTTP APIãå¿ è¦ã§ããã°å¤é¨â¦
ãã£ãã·ã¥æ©æ§ã§ããErlang Term Storageã«ã¤ãã¦å¦ã¶ã ETS as a cache ETS㯠etsã¢ã¸ã¥ã¼ã«ãçµç±ãã¦ã¡ã¢ãªä¸ã®ETSãã¼ãã«ã«ãã¼ã¿ãä¿åã§ããä»çµã¿ iex(1)> table = :ets.new(:buckets_registry, [:set, :protected]) 8211 iex(2)> :ets.insert(tablâ¦
ãã®ç« ã§ã¯Elixirã®ããªã·ã¼ã§ããâfail fastâ 㨠âlet it crashâãå®ç¾ãã¦ããsupervisorã«ã¤ãã¦å¦ã¶ã Our first supervisor Supervisor behaviour ã使ã£ã¦supervisorãå®è£ ããã¢ã¸ã¥ã¼ã« lib/kv/supervisor.ex ã使ããã defmodule KV.Supervisor â¦
è¤æ°ã®handlerã«ã¤ãã³ããpublishã§ããGenEventã«ã¤ãã¦å¦ã¶ã Event managers iex -S mix ã§ã»ãã·ã§ã³ãæ°ããåããGenEvent API ã触ã£ã¦ã¿ãã iex> {:ok, manager} = GenEvent.start_link {:ok, #PID<0.83.0>} iex> GenEvent.sync_notify(manager, :â¦
Bucketã®ããã»ã¹ãç£è¦ããããã»ã¹ãGenServerã使ã£ã¦ä½æãã GenServerã¯Elixirã¨OTPã§ãµã¼ãã¼æ©è½ãå®è£ ããããã®æ½è±¡åãããä»çµã¿ã§ããã Our first GenServer GenServer㯠Client API 㨠Server Callback ã®2ã¤ã®é¨åãå®è£ ãããã Clientã¨Seâ¦
ãã®ç« ã§ã¯ KV.Bucket ã¨ããã¢ã¸ã¥ã¼ã«ã使ããããã®ã¢ã¸ã¥ã¼ã«ã¯key-valueå½¢å¼ã§ãã¼ã¿ãä¿åã§ããè¤æ°ã®ããã»ã¹ããã®èªã¿æ¸ããã§ããããã«å®è£ ããã The trouble with state Elixirã¯shared nothingã§immutableãªè¨èªã§ãããããç¶æ ãæã¤ä½ãâ¦
å®éã«Mixã¨OTPã使ã£ãã¢ããªã±ã¼ã·ã§ã³ã使ãã¦ããã âã®ããã«Key-Valueãªãã¼ã¿ãæ±ãã¢ããªãä½ã CREATE shopping OK PUT shopping milk 1 OK PUT shopping eggs 3 OK GET shopping milk 1 OK DELETE shopping eggs OK ã¢ããªã±ã¼ã·ã§ã³ãä½ãããâ¦
Types and specs Elixirã¯Typespecã使ã以ä¸ã®ç®çã«ç¨ãã ã«ã¹ã¿ã ãã¼ã¿åãå®ç¾©ããã¨ã 颿°ã®ã·ã°ããã£ï¼ä»æ§ï¼ãå®ç¾©ããã¨ã Typespecã¯éçºè ã®ããã ãã®ãã®ã§ã¯ãªããä¾ãã°Erlangã®éçè§£æãã¼ã«ã® dialyzer 㯠typespecãã£ã¬ã¯ãã£ããåâ¦
Elixir㯠errors throws exits ã®3ã¤ã®Errorã«é¢ããä»çµã¿ãæã¤ ãã ãErlangã§ã¯åºæ¬çã«ãã¯ã©ãã·ã¥ããããªãããã¦ãããã¨ããããªã·ã¼ãããã®ã§ã©ã®ãããªå ´åã«Errorããã³ããªã³ã°ãããã¯èããã¹ã Errors Errorãããã¯Exceptionã¯ã³ã¼ãã®ä¸â¦
~ ã§å§ã¾ãããã¹ããSigilã¨ãããæååãæ±ãããã®ä»çµã¿ãæä¾ããã delimiter sigil delimiter modifier ã®å½¢å¼ãr/hogehoge/i ã¿ãããªå½¢ã Regular expressions ~rã¯ãã使ãããSigilã§æ£è¦è¡¨ç¾ã使ããããã«ä½¿ã æ£è¦è¡¨ç¾ã¯ Perl-compatible râ¦
Elixirã§ã¯ãããªã¹ããfilterãã¦mapã«ããã¦å¥ã®ãªã¹ããä½ãã¨ãããã¨ããããå ´åãEnumã¢ã¸ã¥ã¼ã«ã使ããã¨ãä¸è¬çã ãããªã¹ãå å 表è¨ã使ã£ã¦æ¸ããã¨ãã§ãããforã使ãã¨EnumãStreamã使ã£ã¦æ¸ãããç°¡åãªè¨è¿°ã«ã§ãããã¨ãããã ï¼ç¢ºãï¼â¦
Protocol Protocolã¯Elixirã§ããªã¢ã¼ãã£ãºã ãå®ç¾ããããã®ä»çµã¿ããããã³ã«ã使ããã¨ã§ã©ã®ãããªãã¼ã¿ã§ãããåãã§ããããã«ãªã ãã¨ãã° Elixirã§ã¯nilã¨falseã ããfalseã¨ãã¦æ±ããããã以å¤ã®ãã¹ã¦ã¯trueã¨è©ä¾¡ãããããã¢ããªã±ã¼ã·â¦
Mapã®æ¡å¼µãã¦Structãããã Structã¯åæå¤ã®è¨å®ã¨ã³ã³ãã¤ã«æã®ãã§ãã¯ãè¡ã£ã¦ããã Defining structs defstruct ã§Structãå®ç¾©ã§ãã defmodule User do # ãã£ã¼ã«ãåã¨åæå¤ãå®ç¾©ãã defstruct name: "John", age: 27 end # mapã«ä¼¼ã¦ããã©â¦
Elixirã®Moduleã®attributeã¯æ¬¡ã®3ã¤ã®ç®çãããªãã ã¦ã¼ã¶ã¼ãVMã«ãã£ã¦ä½¿ç¨ãããããã®ã¢ã¸ã¥ã¼ã«ã®èª¬æãã¤ãã 宿°ã¨ãã¦åã ã³ã³ãã¤ã«ã®éã«ä½¿ããããããã³ãã©ãªé åã¨ãã¦åã As annotations Elixirã¯Erlangããã¢ã¸ã¥ã¼ã«å±æ§ã®æ¦å¿µãåãâ¦