VASILYã§ã¯ãããè¯ãã¢ãŠãããããããããã«ã ãã¶ã€ã³ã€ã³ãããã®æéãé±1åèšããŠããŸãã ç»é¢é·ç§»ã§ãã£ãããã¡ãã£ãšããã¢ãã¡ãŒã·ã§ã³ãªã©åªããUIãããŒã ã§å
±æãã å®éã«iQONã®UIãUXãšããéšåã«åæ ããããšæ¥ã
ã詊è¡é¯èª€ããŠãããŸãã ä»åã¯ãã®äžã§ãVASILYãã¶ã€ããŒããŒã ã2æã« ãã¶ã€ã³ã€ã³ã¹ãã¬ãŒã·ã§ã³ãåããã¢ã㪠ãããã€ãã玹ä»ããããšæããŸãã 1. Spring Apple Design Award 2014ã«ãéžã°ããŠãããNYçºã®æ°ã³ããŒã¹ãã¡ãã·ã§ã³ã¢ããªã ãŠãŒã¶çºä¿¡ã®ã³ã³ãã³ãããã©ã³ããäžæãæŽ»çšãã ãšããææ³ãåãå
¥ããŠããŸãã è²·ãç©æ¬æ¥ã®æ¥œãããå³ãã£ãŠããããããããããŠã·ã³ãã«ãªæ§æ ã«ããŠããããã§ãå
šäœçã« ç¹çްã§äžåãªã¢ã㪠ãšããã€ã¡ãŒãžãåããŸããã 2. Storehouse åçãæ åãããã¹ããç¹ã亀ããªãã1ã€ã®ã¹ããŒãªãŒãäœãããšãã§ããŸãã èªç±ã«ã¬ã€ã¢ãŠããããªãã³ã°å¯èœãªããæ§ã
ãªèŠãæ¹ãå¯èœã§ãã CEOãå
Appleã®UXãšãã³ãžã§ãªã¹ã ãšããããšããããå
¬éãããŠããã¹ããŒãªãŒã¯ãã©ããçŸããã æããèªåãæçš¿ããããªãã®ããã®ã¢ããªã®é
å ã§ãã ãŸããããŒãã£ã³ã°ã¢ã€ã³ã³ã®èŠãæ¹ããã¡ããšãã¶ã€ã³ãããŠããŸããã Storehouse㯠Apple Design Award 2014 ã«ãéžã°ããŠããã¢ã㪠ã§ããããŸãã   3. Nat Geo View National Geographicãæ°ãããªãªãŒã¹ãããã€ãžã§ã¹ãã¢ããªã§ãã ææ¥ããšã«å³éžãããNational Geographicã®é«ç»è³ªãªåçãæ åã玹ä»ããŠãããŸãã å³éžãããŠãããšããããšããããèŠå
¥ã£ãŠããŸãäœåã°ããã§ãã¹ã¯ããŒã«ãããšãã® ãã©ã©ãã¯ã¹æãããã©ã³ãéžã³ãããŒãžã³ã®åãæ¹ãªã©ãšãŠãåèã«ãªããŸãã ãŸããåç»ã®ãµã ãã€ã«ã®èŠãæ¹ããã ã®éæ¢ç»ã§ã¯ãªãã ãã£ããã£ãŒç»åãã¢ãã¡ãŒã·ã§ã³ã§èŠããåçããªããŠãæ åã®å
å®¹ãæ¥œããã ãšããéšåã¯ä»ã®ã¢ããªã§ã¯ããŸããªãææ³ã ãšæããŸããã  4. YPlan çŽè¿ã«ããæ¥œããããªã€ãã³ãã玹ä»ããŠãããã¢ããªãæ°ã«ãªãã€ãã³ããããã°è©³çްæ
å ±ãèŠãããšãã§ãããã®å Žã§ãã±ããã賌å
¥å¯èœã ãã¶ã€ã³ã¯ æäœç³»ã®ãã¿ã³ãŸã§ã¢ãã¡ãŒã·ã§ã³ãäœ¿çš ããŠããããã¢ã¯ã·ã§ã³ã·ãŒããŸã§ããã¡ããšãã¶ã€ã³ãããŠããŠçްããéšåã®ãã¶ã€ã³ã«ããã ãããæããã¢ããªã§ããã 5. Timeline æŽå²ããã©ãããšã§ã³ã³ãã¯ã¹ãïŒæèïŒãããããã¥ãŒã¹ã¢ããªã§ãããŸããŸãªãžã£ã³ã«ã®ãã¥ãŒã¹ã幎衚ã§ãã©ã£ãŠãããã®ãç¹åŸŽã§ãã æè¿ç®ã«ããã«ãŒã圢åŒã®ãã¶ã€ã³ãæ¡çšããŠããã¢ã㪠ã§ããããŸãããŸããããŒãã£ã³ã°ã¢ã€ã³ã³ã®ã¢ãã¡ãŒã·ã§ã³ãã ã³ã³ãã³ãéã®åãæ¿ãããªã©ãªãããã§äœ¿ã£ãŠããŠå¿å°ãããšæãã¢ã㪠ã§ããã  6. AugustÂ é³æ¥œãåçãåç»ãããã¹ãããªã©ãã·ã§ã¢ã§ããã¢ããªã§ãã ãã«ããŠã³ã§ç°¡åã«èªåã®ãæ°ã«å
¥ãã«ã¹ããã¯ããããšãã§ããUIãç¹åŸŽ ã§ãããŸãããŠãŒã¶ãŒç»é¢ãã¹ã¯ããŒã«ããéã«èæ¯ç»åããã äžã«æµããŠæ¶ããã®ã§ã¯ãªããå¥¥ã«æ²ãã§ãããããªãã§ãŒãã¢ãŠããããŠããŠå°ãå€ãã£ã衚çŸã§ããã 7. Vurb  ã³ã³ããã¹ãåæ€çŽ¢ãšã³ãžã³ã¢ããªãæ€çŽ¢ããæ
å ±ããæ€çŽ¢ãšã³ãžã³ãé¢ããããšãªãèŠãããšãã§ããŸããæ€çŽ¢ã«ããŽãªã¯ããå Žæãæ ç»ããã¬ãã鳿¥œãæ åãã€ãã³ãããªã©ã«å€§ããåããããŠãæ ç»ã®ã«ããŽãªãéžæãããšããå
¬éäžãè¿æ¥å
¬éäºå®ããªã³ã©ã€ã³ã§èгãããã®ãªã©æ¡ä»¶ãçµãããšãå¯èœã§ããæ ç»ã®è©³çްç»é¢ã«å
¥ããšãäºåç·šãäžæ æéãã¬ãã¥ãŒãªã©ãèŠãããšãã§ããŸãã ãŸãã åçãå
šé¢ã«äœ¿çšããªããã«ãŒã圢åŒã®ãã¶ã€ã³ãåãå
¥ããŠããã®ãç¹åŸŽ ã§ããiQONãã«ãŒã圢åŒã®ãã¶ã€ã³ã®ããã ã«ãŒãããšã§ã©ã®ããã«æ
å ±ãåããããŠããããªã©åèã«ãªãã¢ã㪠ã§ããã  8. FastCompany  米åœããžãã¹èªãFast Companyãã®ã³ã³ãã³ãã¢ããªã FastCompanyãæäŸããwebãµã€ãã®ã³ã³ãã³ãããã¹ãŠé²èЧããããšãã§ããŸãã ã³ã³ãã³ãéã®åãããªããã ã§ãã³ã³ãã³ããç§»åããŠããŠãã¹ãã¬ã¹ãªãèŠç¶ãããããšæããŸããããŸãã¬ã€ã¢ãŠãã§ã¯åçã«èŠåºããããã£ãŠãããã ã«ããŽãªã倧èã«ãã¶ã€ã³ããŠåºåã£ãŠããããšãªã©ãä»ã®ã¢ããªã«ã¯ããŸãã¿ãããªãç¹ã ãšæããŸããã ãŸããã³ã³ãã³ãã®æåŸã«ãããšæ¬¡ã®ã³ã³ãã³ãã®èŠåºããšåçãããã æ¬¡ã®ã³ã³ãã³ãã«é·ç§»ããããªã仿ãããããŠãããã¶ã€ã³ ã§ããã æåŸã« VASILYãã¶ã€ããŒããŒã ããã¶ã€ã³ã€ã³ã¹ãã¬ãŒã·ã§ã³ãåããã¢ããªãŸãšã(2015幎2æ)ã¯ãããã§ããã§ããããã ã玹ä»ããã¢ããªã®ããã« iQONã®UIãUXãã¶ã€ã³ããã£ãšãããããïŒãšãããã¶ã€ããŒã®æ¹ã
ãçµ¶è³åéäžã§ãïŒ ãå¿åãåŸ
ã¡ããŠãããŸãã https://www.wantedly.com/projects/5485 é£çµ¡å
ïŒinfo[at]vasily.jp Â
 ãiQON ADã VASILYã§ã¯2014幎10æãããã€ã³ãã£ãŒãåãã€ãã£ãåºåãiQON ADããiQONã®iOSãšAndroidã¢ããªãã¹ããŒããã©ã³ãµã€ãã«åããŠé
ä¿¡ããŠããŸãã åœå
æå€§çŽã®ãã¡ãã·ã§ã³ã¢ããªãiQONãã 女æ§åããã€ãã£ãåºåãiQON ADããéå§ã ãiQON ADãã¯ãiQONå
ã«é
眮ãããç¬èªåºåãŠãããã«å¯ŸããŠåºåãé
ä¿¡ã§ãããµãŒãã¹ã«ãªããŸããæ¬ãããžã§ã¯ãã§ã®éçºèŠçŽ ã¯äž»ã«ä»¥äžã®3ã€ã§ãã 1. ãã€ãã£ãã¢ããªå
ã®åºåãŠããã(SDK) 2. åºå管çããŒã« 3. ã¢ããµãŒã㌠ãµãŒãã¹ã€ã³ããŠããå°ãéããããŠããŸããŸããããåºåé
ä¿¡ã·ã¹ãã ã«ã€ããŠç°¡åã«ç޹ä»ããããšæããŸãã ãiQON ADãã®ã·ã¹ãã æ§æ åºå管çããŒã«ãšã¢ããµãŒããŒã¯ãšãã«Rubyã§æžããŠãããããã«ãŠã§ã¢ãå«ããŠãã¹ãŠAWSäžã§éçšããŠããŸãã åºå管çããŒã« åºåã®å
¥çš¿ãã¬ããŒãã®é²èЧãé
ä¿¡ããŒã¿ã®çæãšé
ä¿¡ãã°ã䜿ã£ãéèšãªã©ãè¡ããŸãã瀟å
å€ã®éããããŠãŒã¶ãŒãå©çšããã·ã¹ãã ã§ãã Ruby2.0 + Rails4.0ã§æžããŠããŸãã ããŒã«ããå
¥çš¿ãããåºåããŒã¿ã¯RDS(MySQL5.6)ã«è²¯ããŠãåºåé
ä¿¡ã«å¿
èŠãªåœ¢ã«å€æããŠRedisãžãšåæããŸããã¢ããµãŒããŒããS3ã«èç©ãããåçš®èšæž¬ãã°ã宿çã«éèšããŠããããRDSã«è²¯ããŸããåºåã®ç»åã¯S3ã«ãããŠãCloudFrontããé
ä¿¡ããŠããŸãã ã¢ããµãŒã㌠䞻ã«åºåé
ä¿¡ãšåçš®ã€ãã³ãã®èšæž¬ãæ
åœããŸããHTTPãªã¯ãšã¹ãã«å¯ŸããŠJSONãè¿ãWebAPIã§ãã ã³ã¢ãšãªãEC2ã€ã³ã¹ã¿ã³ã¹ã§ã¯SinatraããŒã¹ã®Webã¢ããªã±ãŒã·ã§ã³ãunicornã«èŒããunixãã¡ã€ã³ãœã±ããã§nginxãšã€ãªãã§ããŸããåºåããŒã¿ã¯RedisããååŸããåçš®èšæž¬ã€ãã³ãã¯åãã€ã³ã¹ã¿ã³ã¹å
ã«ããfluentdãçµç±ããŠéçŽçšã®fluentdããS3ã«èç©ãmemcachedã«ã¯æ¶ããŠãã¯ãªãã£ã«ã«ã«ã¯ãªããªããã®ïŒãã€é
ä¿¡ã«ã¯å¿
èŠãªãã®ïŒãå
¥ããŠããŸããã¢ããµãŒããŒã§ã¯åºæ¬çã«éçã³ã³ãã³ãé
ä¿¡ã¯è¡ã£ãŠããŸããã é
ä¿¡ããžãã¯ãæé©åãã€ã€é«ãã¹ã«ãŒãããã確ä¿ããããšãèŠä»¶ã§ãããããRailsã®ãããªé«æ©èœã¯ãã¬ãŒã ã¯ãŒã¯ã¯äœ¿ããRuby2.0 + Sinatra1.4ã§æžããŠããŸãã ã¢ããµãŒããŒã®åŠçæ§èœ ããŒã¯ã¿ã€ã ã§ãµãŒããŒ1å°ããã30ãªã¯ãšã¹ã/ç§ãããã®åºåãªã¯ãšã¹ããåããŠããŠããããå¹³å30~40msecçšåºŠã§åŠçããŠããŸãã åçš®èšæž¬ã€ãã³ããªã©ãåãä»ããã®ã§ããããå«ãããšå®éã«ã¯ããå°ãå€ããªã¯ãšã¹ããåŠçããããšã«ãªããŸãã åºåé
ä¿¡ã®èŠæš¡ãšããŠã(äžè¬çãªã¢ããããã¯ãŒã¯çãšæ¯ã¹ããš)ããã»ã©å€§ããããã§ã¯ãªãã®ã§ãä»ã®ãšããå¿
èŠååãªæ§èœãšãªã£ãŠããŸãã Ruby2.0? çŸåšã®Rubyã®ææ°çã¯2.2ãªã®ã«2.0ã䜿ã£ãŠããçç±ã¯ããã€ããããŸãããæéçå¶çŽãäž»ãªçç±ã§ãã ãããžã§ã¯ãã®åæéçºæéãéåžžã«éãããŠãããããæ¢åãããžã§ã¯ãã§éçšå®çžŸã®ãããã®ã䜿ãããšã§ã€ã³ãã©æ§ç¯ã³ã¹ããæªçµéšã«ããéçšãªã¹ã¯ã¯æå°éã«æãã€ã€ãæéã®å€§åãã¢ããªã±ãŒã·ã§ã³éçºã«æå€§éããŠãããšã§ã²ãšéãã®æ©èœãæããããšãåªå
ããŸããã(VASILYã§ã¯ã€ã³ãã©æ§ç¯ã«ã¯AMIïŒChefã䜿ã£ãŠããŸã) Rubyã®ã³ãŒãã«ã€ããŠãããŸãåã£ãããšã¯ããã«ãããšæçŽã«æžããŠãããŸãããã®ãããèšèšãããã©ãŒãã³ã¹ã«ããŸã ãŸã æ¹åã®äœå°ã¯ãããŸããRuby2.1以åŸGCãŸããã®æ¹åã«ãã£ãŠããã©ãŒãã³ã¹ãæ¹åã§ãããã§ãããä»åŸã¯RubyããŒãžã§ã³ã¢ãããå«ããŠè²ã
ãšæ¹åãå³ã£ãŠããäºå®ã§ããäœãããææããã£ãæã«ã¯ãŸãæ¬ããã°ã§ç޹ä»ããããšæããŸãã 以äžãiQONã®åºåé
ä¿¡ã·ã¹ãã æ§ç¯ã®ç޹ä»ã§ããã VASILYã§ã¯ãåºåé
ä¿¡ã·ã¹ãã éçºã ãã«éãããšã³ãžãã¢ãåéããŠããŸãã https://www.wantedly.com/projects/7595 é£çµ¡å
ïŒinfo[at]vasily.jp
 瀟å
ã«ãã¶ã€ããŒãè€æ°äººåšç±ããå ŽåãããŒã å
ã§ã®ãã¶ã€ã³ã¯ãªãªãã£ã®æ
ä¿ãã¹ãã«ã¢ããã¯ã©ã®ããã«è¡ãããŠããŸãã§ããããïŒVASILYã§ã¯ããã¶ã€ã³ã¬ãã¥ãŒããã€ã³ããããã»ãããŒåå ãªã©ãããŒã ã§ãå人ã¬ãã«ã§ãåžžã«ç©æ¥µçã«è¡ããªããå¶äœããŠããŸãã ãã¶ã€ã³ã¬ãã¥ãŒãã€ã³ãããã®ä»æ¹ãªã©ã¯ããã¶ã€ããŒéã§ãããããã話é¡ã®äžã€ã ãšæããŸãããä»åã¯åŒç€Ÿ ãã¶ã€ããŒããŒã ãã¹ãã«ã¢ããã®ããã«å®éã«è¡ã£ãŠãã广çãªæ¹æ³ã3〠ã玹ä»ããããšæããŸãã 1. ãã¶ã€ããŒå
šå¡ã§ã®ãã¶ã€ã³ã¬ãã¥ãŒ  â ããŒã ãšããŠã®èª²é¡ ã¹ã¿ãŒãã¢ããã§ã¯ãå¶äœãšéçºãéããµã€ã¯ã«ã§åããŠãããªãããããã¶ã€ã³ã®è³ªãšéã¯ã©ã¡ããæ
ä¿ããŠãããªããšãããŸããã ãããŸã§ã¯ããšã³ãžãã¢ãžäŸé ŒãŸã§ã®çްãã確èªãšãå®è£
åŸã®ç¢ºèªããã¶ã€ããŒ1~2人ãæ
åœè
å
ã§é²ããŠããŸãããããã¶ã€ããŒãå¢ããããšããããã¯ãªãšã€ãã£ãã®ã¯ãªãªãã£ã¢ãããšå
±éèªèãã«ãŒã«ã®æèåããã¯èª²é¡ãšããŠããéãèªèããããã«ãªããŸããã  â ç®çãšå¹æ ããã«ãã ãé±ã«åèªã©ãã ãã®éãå¶äœããã確èªããããŠå¶äœç©ã«å¯ŸããŠããäžåºŠèŠçŽããŠæ¹åç¹ãæŽãåºããæ¬¡å¶äœã®ã¯ãªãªãã£ã¢ãããžã€ãªããã ããšãç®çãšãããé±ã«1å30åã1æéã»ã©ã®ãã¶ã€ã³ã¬ãã¥ãŒMTGãçŸåšè¡ã£ãŠããŸãã å¶äœç©ãå®å
šã«ãèŠããåããæèããããšã«ãã£ãŠããã¶ã€ã³ã¬ãã¥ãŒéå§åæã«æ¯ã¹ å¶äœéã¯çŽ2å ãšãªãããããžã§ã¯ãå
šäœãããŒã éã§ã®æ¹åæ§ã確èªãä¿®æ£ãæ¹åãè¡ã£ãŠãããã®ã§ããã¶ã€ããŒå
šå¡ã èªåã®ãã¶ã€ã³ã«å¯ŸããŠç®çãšæå³ããã£ãããšãã¬ãŒã³åºæ¥ã ããã«ãªããŸãã  2. å¶äœç©ãPinterestã®ã·ãŒã¯ã¬ããããŒãã§ç®¡ç â å®çŸãç¶ç¶ãããããã« ãã¶ã€ããŒãšããŠ1çªãã©ãŒã«ã¹ãã¹ãã§ãããå¶äœãã®ããã«ãããã¶ã€ã³ã¬ãã¥ãŒã®éçšæ¹æ³ã¯è² æ
ãªãç¶ãããããã«ããããã®ã§ãã ãçãæéã§ç¢ºèªåºæ¥ãã«ã¯äžèЧæ§ã欲ããã1é±éããšã«åºåã£ãŠèª°ãæçš¿ããŠãããã確èªãããã ãå¶ããæé©ãªæ¹æ³ã¯ Pinterestã®ã·ãŒã¯ã¬ããããŒãã§ã®ç®¡ç ã§ããã ä»ã«ããSlackã§ã¬ãã¥ãŒçšã®ãã£ã³ãã«ãäœæãããWikiãQiitaãžã®ã¢ãããªã©ãæ€èšããŸããããæ
å ±ãæµããŠããŸãäžèЧã§ç®¡çåºæ¥ãªããç·šéã³ã¹ããããã£ãŠããŸããªã©ã§ãã¡ãªãããå€ããä»ã®ãšããPinterestãäžçªã¹ãã¬ã¹ãªãå®è·µåºæ¥ãŠããããã§ãã  â å®è·µæ¹æ³ãšã¡ãªãã æ¹æ³ã¯ä»¥äžã®éãã§ãšã£ãŠãç°¡åã 1. å
±æããPinterestã®ã¢ã«ãŠã³ã ãäœæãã é±ããšã«ã·ãŒã¯ã¬ããããŒããäœæ 2. ããŒã ã¡ã³ããŒãããŒãã«æåŸ
ãã åèªã®ã¢ã«ãŠã³ãã§1é±éã®å¶äœç©ãã¢ãã 3. ãã¶ã€ã³ã¬ãã¥ãŒæã«ãããžã§ã¯ã¿ãŒã§å€§ããæ ãåºããå
šå¡ã§ç¢ºèªã åºãæèŠã¯ã³ã¡ã³ãã«èšå
¥ äžã§ãããèŠä»¶ä»¥å€ã§ã®ã¡ãªããã¯ã ã©ã®ç«¯æ«ã§ãç°¡åã«å®æ©ã§ç¢ºèªåºæ¥ã ããšã§ãã å¯äžãã¡ãªãããšããŠããããªããã1é±éããšã«ããŒããäœæããŠããã®åºŠã«ã¡ã³ããŒæåŸ
ããããšããããšããããããŸãããé±ã«äžåã®1åãããããªãäœæ¥ãªã®ã§çŸåš5人ã»ã©ã®ããŒã ã§éçšããŠãŸãããããŸã§ã®è² æ
ã¯ãããŸããã  3. ã¿ã¹ã¯ç¢ºèªãšã€ã³ãããã®æéãå
šå¡ã§äœã â ç·æ¥ã§ã¯ç¡ããéèŠãªããšããã æ¬¡ããæ¬¡ãžãšéã£ãŠããã¿ã¹ã¯ã®æ³¢ã«æººããŠããŸããã€ãã€ã人ã¯ç·æ¥ãªããšããæãä»ããŠããŸããã¡ã«ãªããŸãã ãã®ããVASILYã§ã¯ã é±ã®åãã«ã¿ã¹ã¯ã®åªå
床ãå
šå¡ã§ç¢ºèª ãåããåé¡ãããã°èª¿æŽããŠã€ã³ãããã®æéãæ»åºããŠããŸãã æ¥ã
ã®ã€ã³ãããããªããšåŒãåºããç¡ããªãã®ã§ãããã¢ãŠããããã«ç¹ããããã«ã匷å¶çã«æéãå
šå¡ã§äœãããã«ããŸããã  â å®è·µæ¹æ³ãšã¡ãªãã 1. ã¿ã¹ã¯ã鱿«ã«ãŸãšããŠãå
šå¡ã§ã®ç¢ºèªã¯ é±å§ãã®å§æ¥æéå ã«è¡ã 2. ã€ã³ããã㯠é±1ã§æ
åœè
ãå€ã ãäºåã«ããŒããæ±ºããŠã¡ã³ããŒã«ã·ã§ã¢ 3. æéã¯2æéã»ã©ç¢ºä¿ãããã®æ¥ã®ããŒãã«æ²¿ã£ãçºèŠãåŠãã ããšãåŸã§ åèªQiita:teamã«ãŸãšããŠå
±æ ãã ã¡ãªããã¯ããŸã 人ãå°ãªãå§æ¥æéåã«ã¿ã¹ã¯ç¢ºèªãè¡ãããšã§ãçŠãããšãªãããã£ãšçµããããšãã§ãã1é±éãäœè£ãã£ãŠæ°æã¡ããã¯ãããããšãã§ããŸãã ãŸããã€ã³ãããã§ã¯èªèº«ãäž»å¬è
ã«ãªãããšã§ããã«äžéã®ãã¬ã³ããæ
å ±ã«ã¢ã³ããã匵ã ãã¡ã·ãªããŒã·ã§ã³èœåãéããã ããã«ãªããŸãã Qiita:teamã«ãŸãšããŠå
±æããããšããã€ã³ãã§ããäœåã«å¯ŸããŠã®è©äŸ¡ãèªåã®æèŠãšããŠèšé²ããããšã§ã ãã¶ã€ã³ã®åãæªãã倿ããç¿æ
£ ãšãªã£ãŠãããŸãã  â éå»ã«å®è·µããŠè¯ãã£ãã€ã³ããã 代å®å±±èŠå±ã§æžç±ããåãå
¥ããæ°ããçºèŠããŸãšãã åçå±ãå
šå¡ã§éè³ ããŒã«ã®ååŒ·äŒ èª²é¡ãããŒãã«åãããŠã10åã§ãã¶ã€ã³ãæ¢ãåºãããã¬ãŒã³ããããæç¥šã§äžçªããã£ãäººãæ±ºãã etc... ä»åŸã¯ãšã³ãžãã¢ã®æ¹ã«ãååãåŸãŠãæè¡çãªã€ã³ããããããŠãããã°ãšäºå®ããŠããŸãã®ã§ãã€ã³ãããã®å
容ã«ã€ããŠã¯ãä»åŸè©³ããããã°ã§ãŸãšããŠãããŸãã  çªå€ç·š. UIãã¶ã€ã³ã¢ããã€ã¶ãŒããã®ãã£ãŒããã㯠åŒç€Ÿã§ã¯ã THE GUILDä»£è¡šã®æ·±æŽ¥è²Žä¹ïŒfladdictïŒãã ãUIãã¶ã€ã³ã¢ããã€ã¶ãŒãšããŠè¿ããŠãã ãé±1ã§UIæ¹åãæ°èŠæ©èœéçºã«ã€ããŠã®MTGãè¡ã£ãŠããŸãã MTGã§ã¯ãäœéšãæ©èœãå®çŸããããã®UIãå°ãã ãããã«ãããããã®ããããäœæãããã¶ã€ããŒã ãã§ãªãããšã³ãžãã¢ãããã£ã¬ã¯ã¿ãŒããããã¥ãŒãµãŒãåå ããå
šå¡ã§ç¢ºèªããŠãã¶ã€ã³æ€èšããŠããŸãã 瀟å
ã®äººéã ãã§éçºãé²ããŠãããšåãããªãã£ãæ°ä»ããçºèŠã¯ãšãŠã貎éã§ã 瀟å€ããã®ãã£ãŒãããã¯ãçã蟌ã ããšã§ããã¹ãã«ã¢ããã«ãç¹ãããŸãã â DesignSprintã®å®è·µ æè¿ã§ã¯ãGoogleã®ã¯ãŒã¯ã·ã§ããã§åå ãã DesignSprint ãæ·±æŽ¥ãããšãšãã«ç€Ÿå
ã§ãå®è·µãããµãŒãã¹ã¢ã€ãã£ã¢ãæ°æéã§æ¡æ£&åæãããããŒããŒããããŸã§èœãšã蟌ãã§çºè¡šãããšããå匷äŒãéããŸããã ãã¶ã€ã³æèã§éçºããŠããæå ãäŒç€Ÿã«æ ¹ä»ãããŠããã®ããã¶ã€ã³åã¢ããã®ããã®å€§äºãªèŠçŽ ã®äžã€ãšãªããŸãã®ã§ãéçºææ³ãç©æ¥µçã«åãå
¥ããŠãããããã«ããŸãããã çµãã㫠以äžãVASILYã®ãã¶ã€ããŒãã¹ãã«ã¢ããã®ããã«ããŒã å
ã§åãå
¥ããŠããæ¹æ³ãã玹ä»ããŸãããããããã§ããã§ããããã ããã¡ã®äŒç€Ÿã§ã¯ããããæ¹æ³ã§ãã¶ã€ã³ã¬ãã¥ãŒããŠããïŒãããã£ãšè¯ãããŒã«ãããããšãã£ãæèŠãªã©ããã°æ¯éæ
å ±äº€æãããŠããã ãããã®ã§ããªãã£ã¹ã«ãæ°è»œã«éã³ã«æ¥ãŠãã ããã ãŸããä»ããã«ã§ããã®ç°å¢ã§ãã¶ã€ã³ã¹ãã«ã¢ããããããšãããã¶ã€ããŒã®æ¹ã
ã çµ¶ è³åéããŠãããŸãã®ã§ãå¿åãåŸ
ã¡ããŠãããŸãã https://www.wantedly.com/projects/5485  é£çµ¡å
ïŒinfo[at]vasily.jp Â
å€ãã®iOSãšã³ãžãã¢ãæçšããŠããβãã¹ãã£ã³ã°ãµãŒãã¹ã®TestFlightã§ããã2015幎2æ26æ¥ããã£ãŠtestflightapp.comãééã«ãªããšãã å
¬åŒã¢ããŠã³ã¹ ããããŸããã TestFlightãéå¶ããBurstly瀟ãApple瀟ã«è²·åãããçŸåšã§ã¯iTunes Connectãã TestFlightãå©çšåºæ¥ãããã«ãªã£ãŠããŸããä»åŸã¯åŸç¶ãšãªã TestFlight Beta Testing ã®äœ¿çšãæšå¥šãããŠããŸãããåŸæ¥ã®TestFlightãšç°ãªãå¶çŽãå€ã
ãããããå¥ãµãŒãã¹ãæ€èšããŠããæ¹ãå€ãã®ã§ã¯ãªãã§ããããã ä»åã¯TestFlightã«å€ããβãã¹ãã£ã³ã°ãµãŒãã¹ã玹ä»ããããšæããŸãã  TestFlight Beta Testingã®åé¡ç¹ TestFlight Beta Testingã«ã¯ãå
¬åŒã§æäŸãããŠããããããã®ã¡ãªãããå€ã
ãããŸãã ããããå€ãã®ãããã¯ãã§ããã¯ã«ãªããšãŠãéèŠãªããšããããŸããããã¯ã iOS 8以äžã®ããã€ã¹ã§ãªããã°TestFlight Beta Testingã®ã¢ããªã䜿ããªã ããšããããšã§ãã ãŸã ãŸã iOS 7ããµããŒãããŠãããããã¯ãã¯å€ãã¯ãã§ãããã®çç±ã ãã§ä»£æ¿ãµãŒãã¹ãæ¢ãããšæãæ¹ã¯å€ããšæããŸãã 代æ¿ãµãŒãã¹ã®éžå®åºæº 代æ¿ãµãŒãã¹ã«ç§»è¡ããã®ã§ããã°ãããèªåãã¡ã®ãããã¯ãã«é©ããβãã¹ãã£ã³ã°ãµãŒãã¹ãéžå®ãããæ°æã¡ããããŸããä»åã¯ã TestFlight Beta Testing ãã Fabric Beta ãã DeployGate ãã®3ã€ã®ãã¹ãã£ã³ã°ãµãŒãã¹ãæ¯èŒããŠã¿ãŸãããæ¯èŒã®èгç¹ã¯6ã€ããã50åçšåºŠã®ç€Ÿå
ãã¹ã¿ãŒã«ãã¢ããªã±ãŒã·ã§ã³ã®ããŒãžã§ã³ã¢ããæ¯ã«é
ä¿¡ããããšãæ³å®ããŠããŸãã  㻠iOS7ããµããŒãããŠããã ã» å°å
¥ã容æã ã» ãã¹ã¿ãŒã®è¿œå ã容æã ã» å®äŸ¡ã§ããã ã» é
ä¿¡æã«æéãããããªãã ã» CIãšã®é£åã容æã§ããã äžèšçµæã ããèŠããšãTestFlight Beta Testingãã«ã€ããŠã¯ææå°æ©ã ãšæããŠé ãããšæããŸãã ããããã¡ãªãããç¡ãèš³ã§ããããŸãããæ¬¡ã«åãµãŒãã¹ã®ã¡ãªããã»ãã¡ãªãããäœ¿çšæã«ã€ããŠãŸãšããŸãã TestFlight Beta Testing ã» https://itunesconnect.apple.com/ æ¬èšäºã§ãäœåãç»å ŽããŠãããªãã£ã·ã£ã«ã®ãã¹ãã£ã³ã°ãµãŒãã¹ã§ãã ãã¡ãªããã ã» Releaseãã«ãã§ã¢ããªã確èªã§ãã ã» æå€§1000人ãŸã§å€éšãã¹ã¿ãŒãæåŸ
ã§ãããã£ãŒãããã¯ãåŸãããšãã§ãã ã» SDKãäžèŠ ããã¡ãªããã ã» iOS 7ã«å¯Ÿå¿ããŠããªã ã» å€éšãã¹ã¿ãŒã®ç»é²ã«æéãããã ã» å
éšãã¹ã¿ãŒã®æš©éã«èéããããªã 㻠端æ«ã®AppleIDãšçŽã¥ããããTestFlightã¢ã«ãŠã³ãã®åãæ¿ããéåžžã«é¢å ã» CIãšã®é£åãç°¡åã§ã¯ãªã Releaseãã«ãã§ã¢ããªã確èªåºæ¥ãã®ã¯çŽ æŽãããã¡ãªããã ãšæããŸãã å°ãªããšãéçºè
æ°åããã¹ããè¡ããšããæå³ã§ã¯ç©æ¥µçã«äœ¿çšããã¹ãã ãšæããŸããã DeployGate ã» https://deploygate.com/ åœç£ã®é
ä¿¡ãµãŒãã¹ã§ããå
ã
ã¯Androidã¢ããªã®ãã¹ãã£ã³ã°ãµãŒãã¹ã§ããããä»ã§ã¯iOSããµããŒããããŠããŸããmixi瀟ãéå¶ããŠããŸãããã2015幎2æ28æ¥ãæã£ãŠãããã€ã²ãŒã瀟ã«äºæ¥è²æž¡ãããŸãã ãã¡ãªããã ã» åœç£ãªã®ã§æ¥æ¬èªã®ããã¥ã¡ã³ãããã£ããããŠãã ã» é
ä¿¡ã ããªãSDKäžèŠ ã» CIãšã®é£æºããããã ããã¡ãªããã ã» ææ åŒç€Ÿã®å Žåã¯Androidã§DeployGateã䜿çšããŠããããããã¹ãã£ã³ã°ãµãŒãã¹ã®çµ±äžãããã§ã«ç¥èŠããããšããã®ã¯å€§ããªã¡ãªããã§ããAndroidã§ãã§ã«äœ¿ã£ãŠããäŒæ¥ãå€ããšæãã®ã§ãæéé¢ãåé¡ç¡ãã®ã§ããã°éžå®ããããã©ãããã©ãŒã ã ãšæããŸãã SDKãå°å
¥ããã°ãã¹ãã£ã³ã°ä»¥å€ã«ã掻çšã§ããŸãã Fabric Beta ã» https://get.fabric.io/ Crashlytics, Twitter , MoPubãçµ±åããããã©ãããã©ãŒã ã§ããTiwtter瀟ãéå¶ããŠããŸããCrashlyticsããã¹ãé
ä¿¡æ©èœ(Beta)ããã£ãŠãããCrashlyticsã䜿ã£ãŠããã¢ããªã±ãŒã·ã§ã³ã¯å°å
¥ã®æéããããã«ãã®ãŸãŸäœ¿ããŸãã ãã¡ãªããã ã» Crashlyticsã䜿çšããŠãããããã¯ãã§ããã°Betaã®å°å
¥ã楜 ã» ãã«ãããé
ä¿¡ãŸã§ã·ãŒã ã¬ã¹ã§ãããã°ã«ãŒãæ©èœã«ããé
ä¿¡ç¯å²ã®éžæã楜 ã» APIãå
¬éãããŠãããCI飿ºãå¯èœ ã» ããã·ã¥ããŒããèŠããã ããã¡ãªããã ã» Crashlyticsã䜿çšããŠããªãå Žåã¯SDKã®å°å
¥ãé¢å Crashã¬ããŒããµãŒãã¹ã«Crashlyticsãæ¡çšããŠãããããéåžžã«ç°¡åã«ãFabric Betaãã䜿ãããšãã§ããŸãããããã·ã¥ããŒãããšãŠãåªããŠããããã¹ã¿ãŒã®ã€ã³ã¹ããŒã«ç¶æ³ãªã©çŽæçã«åãããããUIãæäŸãããŠããŸãã ãŸãšã ä»åã¯å
ã
Crashlyticsã䜿ã£ãŠããããšããããFabric Betaããæ¡çšããŸããã Crashã¬ããŒããµãŒãã¹ãšããŠãéåžžã«åªç§ãªã®ã§ãæªå°å
¥ã®ãµãŒãã¹ã¯ãã®ã¿ã€ãã³ã°ã§SDKã®å°å
¥ãæ€èšããŠã¯ãããã§ããããã å
æ¥TestFlight Groupsãçºè¡šãããããšãβãã¹ãã£ã³ã°ãµãŒãã¹ã®éžå®ã¯æä»£ãšãããã¯ãã«ãã£ãŠæè»ã«ããŠããå¿
èŠãããããã§ããä»åã¯æ¯èŒå¯Ÿè±¡ã«äžããŸããã§ãããã以äžã®ãããªãµãŒãã¹ããããŸãã®ã§ã玹ä»ããŸãã HockeyApp http://hockeyapp.net/features/ æšå¹ŽMicrosoft瀟ãè²·åããŸããã HockeyAppãMicrosoft瀟ã®è£œåã«çµ±åããèšç»ãããã§ãããåŒãç¶ããµãŒãã¹ã¯æäŸãããäºå®ã®ããã§ããä»åŸã«æµãã«æ³šç®ã§ãã EMLauncherv https://github.com/KLab/emlauncher http://www.klab.com/jp/press/140304.html KLab瀟ãå
¬éããŠãããªãŒãã³ãœãŒã¹ã§ãã Burstly瀟ãè²·åãããéã«ãAndroidãšã³ãžãã¢ã詊ããŠããããšãå€ãã£ãããã§ãã çµããã« ä»åã®ãšã³ããªãã¿ãŠããããªãµãŒãã¹ããããããããã§ãâ¯â¯ãšããã¡ãªãããããããÃÃã«ä¹ãå€ããæ¹ããªã¹ã¹ã¡ïŒããšãã£ããæèŠããããšæããŸãããããªæ¹ããã²æ
å ±äº€æãããŠãã ããã ãèå³ãããã°VASILYã«éã³ã«ããŠé ããã°ãšæããŸãã ãŸããVASILYã§ã¯ãšã³ãžãã¢ãåéããŠãããŸãã®ã§å¿åãåŸ
ã¡ããŠãããŸãã https://www.wantedly.com/projects/7595 é£çµ¡å
ïŒinfo[at]vasily.jp Â
 å
æ¥ ThoughtWorks瀟 ããææ°ã®æè¡ååããŸãšãã Technology Radar ã®2015幎1æçãçºè¡šãããŸããã ãã®Technology Radarã§ããæ¯åã ãæè¡ã ãããŒã«ã ããã©ãããã©ãŒã ã ãèšèªã»ãã¬ãŒã ã¯ãŒã¯ã ãš4ã€ã®é åã«åããŠç޹ä»ããŠãããçµ¶è³æµè¡äžãããã¯ä»åŸæ³šç®ããããã¯ãããžãŒãªã©ã玹ä»ãããŠããŸãã ä»åã¯ãã㪠ãèšèªã»ãã¬ãŒã ã¯ãŒã¯ã ã®é åããå³éžãã11ã®æ³šç®ãã¯ãããžãŒã玹ä»ããŸãã ã¯ããã« åãã¯ãããžãŒã¯ ãAdoptã ãTrialã ãAssessã ãHoldã ãšãã4ã€ã®éçŽã®ã©ããã«å±ããŠãããåéçŽã¯ä»¥äžã®æå³ãæã£ãŠãããŸãã ã» ãAdoptã äŒæ¥ã§ã®äœ¿çšãæšå¥šãããã¬ãã« ã» ãTrialã 䜿çšãã䟡å€ã¯ããããäœãªã¹ã¯ã®ãããžã§ã¯ãã§äœ¿çšãã¹ãã¬ãã« ã» ãAssessã 䜿çšãã䟡å€ãããããäœ¿çšæ¹æ³ãããã³ã·ã£ã«ãæ€èšŒãã¹ãã¬ãã« ã» ãHoldã å
è¡ããããããªãã®ã§åãæ±ãã«ã¯æ³šæãã¹ãã¬ã㫠以äžãå€ãã®çŽ æŽããããã¯ãããžãŒãç»å ŽããŠããŸããéçŽã®æå³ã¯ãããŸã§ãåèçšåºŠã«èããã»ããè¯ãããã§ãã Adopt 1. Go language ãŸãæåã¯èšãããšç¥ããã Go ãã VASILYã®ãšã³ãžãã¢ã§ãå人ãããžã§ã¯ãã§äœ¿çšããŠãã人ãå€ãããŸãããä»äžçªæµè¡ã£ãŠããããã°ã©ãã³ã°èšèªã ãšå人çã«ãæããŠããŸãã åœå
ã¹ã¿ãŒãã¢ããã§ãå°å
¥å®çžŸãå¢ããŠãããå
æ¥éå¬ããã dots. Summit ã§ ã¡ã«ã«ãª ã Gunosy ã§äœ¿çšããŠãããšãã話ããããŸããã  2. Java 8 ç¶ããŠã¯ã Java 8 ãã ã©ã ãåŒ ã Stream API ãªã©åŒ·åãªæ©èœè¿œå ã§è©±é¡ã®Javaææ°ããŒãžã§ã³ã æ®å¿µãªããAndroidéçºã«é¢ããŠçŸæç¹ã§ã¯Java 8ã䜿ãããšã¯ã§ããŸããããJava 8ã®æ°æ©èœã¯ä»åŸAndroidéçºè
ãå«ããã¹ãŠã®Javaããã°ã©ããŒãå¿
é ã®ç¥èã«ãªã£ãŠãããšæãã®ã§ä»ããæããŠãããšè¯ããšæããŸãã ïŒçŸæç¹ã®Androidéçºã§ãã Retrolambda ããšã RxJava ããæã¡èŸŒãã°Java 8ã£ãœãèšè¿°ããããšãã§ããŸã  Trial 3. AngularJS GoogleãšãªãŒãã³ãœãŒã¹ã³ãã¥ããã£ã«ãã£ãŠéçºãããŠããJavaScriptã®æåãªãã¬ãŒã ã¯ãŒã¯ã§ããã AngularJS ãã ã¡ãã£ãšåãŸã§ã¯è³ããšããã§ååãèããŸãããæè¿ã¯å°ã React.js ã«æŒããæ°å³ã ãšå人çã«æããŠããŸããJSçéã¯ãã³ãã«åããæ¿ããã å°ã
åãäžãããæ©ãã ã®ã§ãããçŸåš v2.0 ãéçºäžãããã®ã§ä»åŸçãè¿ãã«ã¡ãã£ãšã ãæåŸ
ã§ãã ã¡ãªã¿ã«åŒç€Ÿéçºã¢ããªã® iQON ã«ãããŠè£ã®éçšããŒã«ã®äžéšã«äœ¿çšããŠããŸãã  4. Dashing ã€ã±ãŠãããã·ã¥ããŒããç°¡åã«äœããRubyã®ãã¬ãŒã ã¯ãŒã¯ã Dashing ãã ãã® ãµã³ãã« ã¿ãããªããã·ã¥ããŒãããRuby, HTML, Sass, CoffeeScriptãå°ãæžãã ãã§äœããŠããŸããŸãã Ruby 1.9以äžãå
¥ã£ãŠãããã·ã³ã§ä»¥äžã®æ°è¡ãæžãã ãã§å§ããããã®ã§ãããŒã å
ã§ã®KPIã®å
±æãªã©ã«æŽ»çšããŠã¿ããšé¢çœããšæããŸãã $ gem install dashing $ dashing new sweet_dashboard_project $ cd sweet_dashboard_project $ bundle $ dashing start  # localhost:3030 ã«ã¢ã¯ã»ã¹ 5. Django REST Pythonã®æåãªãã¬ãŒã ã¯ãŒã¯ã§ãã Django ãããŒã¹ãšããŠããRESTfulãªAPIãéçºããã«é©ããŠãããã¬ãŒã ã¯ãŒã¯ã Django REST framework ãã æšå¹Žæ«ã«å€§ããªå€æŽãå ãã v3.0 ããªãªãŒã¹ã«ãªããŸããããå€ãã®æ©èœã远å ãããŠããããèå³ãããæ¹ã¯ ãªãªãŒã¹ããŒã ãèªãã§ã¿ãŠãã ããã Pythonã§APIéçºãè¡ãå Žåã«åè£ã«å
¥ããŠã¿ãŠã¯ãããã§ããããã  6. Ionic framework HTML5ã§ãã€ããªãããªã¢ãã€ã«ã¢ããªãäœãããã¬ãŒã ã¯ãŒã¯ã Ionic framework ãã ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ Apache Cordove ãããŒã¹ã« AngularJS ãš Sass ãæšæºã§äœ¿ããããã«æ§æãããŠããŸãã ãã³ãã¬ãŒããçšæãããŠãããããèªåã§ã³ãŒããå±éããããã«ãã«ãããããšãã§ããŸãã HTML5ã§ã¯ãã¹ãã©ãããã©ãŒã ãæèããã¢ããªãäœãããæ¹ã¯å°å
¥ããŠã¿ãŠã¯ãããã§ããããã  7. Retrofit AndroidãšJavaã®RESTã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªãšããŠæåãªã Retrofit ãã éçºã¯ãAndroidçéã®ç¥JakeWhartonæ°ãåšç±ããSquare瀟ã éåžžã«äœ¿ãåæãè¯ãã©ã€ãã©ãªãªã®ã§å°å
¥ããŠããäŒç€Ÿã¯ã¡ãã»ãããããããªãããšæããŸãã ã¡ãªã¿ã«iQONã®Androidçã«ãããŠã¯ Retrofit ã¯äœ¿ã£ãŠããŸããããOttoãããButter Knifeããªã©ã¯äœ¿ã£ãŠããŸãïŒãã®èŸºã¯ãŸãå¥ã®æ©äŒã«ã玹ä»ããŸãïŒã  Assess 8. Lotus ãã®1幎ã§çªåŠçŸããRubyã®ææ°ãã¬ãŒã ã¯ãŒã¯ã Lotus ãã Github ãèŠãŠã¿ããšéåžžã«é¢çœããã§ãããã¢ãžã¥ãŒã«ããã¹ãŠå
¥ã£ããã«ã¹ã¿ãã¯ãªãããžã§ã¯ããããäžæ¹ããã¬ãŒã ã¯ãŒã¯ãã¢ãžã¥ãŒã«ããšã«åãããããžã§ã¯ããååšããŠããŸãã ãã®ã³ãŒããããåäœã§åå²ã容æã«è¡ãããšãã§ããç¹ãLotusã®ç¹åŸŽã«ãªã£ãŠããŸãã Sinatraã¿ãããªè»œéãªã¢ããªãäœãããšãã§ãããã€Railsã¿ãããªãã«ã¹ã¿ãã¯ãªã¢ããªãäœãããšãã§ããæè»ãªãã¬ãŒã ã¯ãŒã¯ã«ãªã£ãŠããŸãã  9. React.js æè¿è©±é¡ã®Facebook補JavaScriptã©ã€ãã©ãªã React.js ãã ãã£ããèšããšMVCã§ããViewã®éšåãã³ã³ããŒãã³ãåããŠéçºã§ãããšèšã£ãUIåšãã«ç¹åããã©ã€ãã©ãªã«ãªããŸãã ãã®1å¹Žã§æ¥ã«çãäžãã£ãŠãããšæããŠãããã§ãã Facebook, Instagram ã¯ãã¡ããã®ããš Netflix, Yahoo, Airbnb, Atlassian ãªã©ã§ã䜿ãããŠããããã§ãã React.jsã®äžçªã®ç¹åŸŽã¯ ä»®æ³ãªDOM ãJavaScriptå
ã«æã£ãŠããããšã§ããããã«ããåŸæ¥ã®å®éã®DOMãããããåããŠãç¶æ
ãšæ¯ã¹ãå¿
èŠæäœéã®æŽæ°ã®ã¿ã§æžãã®ã§ããã©ãŒãã³ã¹æ¹åã«ç¹ããããã§ãã ä»ã«ãããŒã¿ãåã«æž¡ããŠãããšããäžæ¹åãªããŒã¿ã®æµãã®ããã³ãŒãã远ãããããšããå©ç¹ããã£ãããJSXã䜿çšã§ããããšããããªç¹åŸŽãªããã©ã€ãã©ãªã§ãã  10. Rust Mozillaã«ãã£ãŠéçºäžã®ããã°ã©ãã³ã°èšèªã Rust ãã 1æã« 1.0.0 Alpha ããªãªãŒã¹ãããæ¥é±ã«ã¯ beta 1 ããªãªãŒã¹äºå®ã«ãªã£ãŠãããšãããããæ£åŒçããªãªãŒã¹ãããããªãã®ã¿ã€ãã³ã°ããã£ãããªã®ã§Rustè§Šã£ãŠã¿ãŠã¯ãããã§ããããã Rustæ¬äœãšãRustã®ããã±ãŒãžãããŒãžã£ã§ãã Cargo ãå
¥ããŠã ãã®ã€ã³ãããã¯ã·ã§ã³ ã«æ²¿ã£ãŠè¡ãã°Rustã®å
¥ãå£ãåŠã¶ããšãã§ããŸãã èšèªãšããŠã¯ãçŽç²é¢æ°åãæç¶ãåããªããžã§ã¯ãæåããµããŒãããŠãã髿©èœãªèšèªã«ãªã£ãŠããŸãã  11. Swift æšå¹ŽãçªåŠãšããŠçŸããiOSãOS Xã®ããã®æ°èšèªã Swift ãã ã€ãå
æ¥ãææ°ããŒãžã§ã³ã§ãã Swift 1.2 ã çºè¡š ããçãäžãããèŠããŠããŸãããiPhoneã¢ããªã®éçºè
ã¯ä»åŸçµ¶å¯Ÿã«æããŠãããªããšãããªãèšèªã§ããããšã¯ééããªãã§ãã 2ã€åã®ãšã³ããªãŒ ã§ã玹ä»ããŸãããããŸã åŒç€Ÿã iQON ã«ã¯æå
¥ã§ããŠããªããã®ã®æ°ãããããžã§ã¯ãã§ã¯æ¢ã«äœ¿ãå§ããŠãããŸãã 以äžã®ãšã³ããªãŒããŸã èªãŸããŠããªãæ¹ã¯ãã²ãšãèªãã§ã¿ãŠãã ããã Swiftã§äŒç€Ÿã®åä»ã¢ããªãäœã£ã話ãšCADisplayLink ãŸãšã æµè¡äžã®ãã¯ãããžãŒãããã€ãåãäžããŸããããæè¿ã¯ãã³ãã«æµè¡ãå»ããæ©ãããæ¥å¹Žã«ã¯ããã€ãæ¶ããŠããããããªãããšæããŸãïŒæ¢ã«ãªããªãã€ã€ãããã®ããããŸããïŒã ãããªäžã§ã¯ãããŸããèªåã奜ãã ãšæãããããã¯ããèŠã€ããŠæããŠããã®ã¯ãšã³ãžãã¢å¥å©ã«å°œãããšæããŸãã ä»åãããããšèª¿ã¹ãŠããéã«ãæè¿è§Šã£ãŠããªãèšèªãæ°ãã€ããããããããšé²ãã§ããŠã·ã§ãã¯ãåããã®ã§å®æçã«ããããªèšèªã«è§Šããªããšãã¡ã ãšæããŸããã VASILYã«éã³ã«æ¥ãŸãããïŒ ä»åã®ãšã³ããªãŒã«èšåãããæ¹ãææ°ãã¯ãããžãŒã奜ããªæ¹ã¯ãã²äžåºŠVASILYã«éã³ã«æ¥ãŸãããïŒ info[at]vasily.jp ã @yoichinishimura ãªã©ã§æ°è»œã«é£çµ¡ããã ããã°ãšæããŸãã ãŸãVASILYã§ã¯ãšã³ãžãã¢ã倧倧倧åéããŠãããŸãã®ã§å¿åãåŸ
ã¡ããŠãããŸãã https://www.wantedly.com/projects/7595 Â
 iQONã¯AppStoreã®ã¬ãã¥ãŒ4.5, GooglePlayã®ã¬ãã¥ãŒ4.3ãšãå¬ããããšã«ãŠãŒã¶ãŒããé«ãè©äŸ¡ãåããŠããŸããããããå®éã«ãŠãŒã¶ãŒãæ¥ã
æããŠããã¢ããªã®è¯ãç¹ã ã£ããäžæºç¹ãªã©ã®æ¬é³ã®éšåã¯ãã¬ãã¥ãŒãTwitterãªã©ã®ãŠãŒã¶ãŒãæçš¿ããæç« ã®äžã«å«ãŸããŠããŸããç¹ã«ãµããŒãã«ãåãåãããããŠãã ãã£ããŠãŒã¶ãŒãããããã ããããªæ¹åã蚎ããã¡ãã»ãŒãžãšã¯éããTwitterãã¬ãã¥ãŒã«æçš¿ããŠããæç« ã«ã¯çŸç¶ãŠãŒã¶ãŒãæããŠããæ¹åããŠã»ããç¹ããã°çããããæèããã«æžãããŠããå¯èœæ§ãé«ããšèããããŸãããã®ããã¹ãã®å
容ãè§£æã§ããã°ãéçºè
ãèªç¥ããŠããåé¡ã®äžã§ãããå€ãã®ãŠãŒã¶ãŒãæ¹åããŠã»ãããšæããŠããç¹ã§ãã£ãããæã
éçºè
ãæ°ã¥ããŠããªãã£ããã°ã®çºèŠçãå¯èœã«ãªããšèããããŸãã ããã§ä»åããè©å€åæã¯ããã®äžæ©ããšé¡ããŠãiQONã«ã€ããŠæžãããŠããæç« ã®è©å€åæãå®éšçã«ãããªã£ãŠã¿ãŸããã®ã§ããã®å
容ãšçµæã玹ä»ããããšæããŸãã è©å€åæãšã¯ïŒ  è©å€åæãšã¯æ§ã
ãªããã¹ãæ
å ±ãããã¹ããã€ãã³ã°ãæ©æ¢°åŠç¿ã®æè¡ãçšããŠãè¯å®çãªè©äŸ¡ãããŠããèšè¿°ãšåŠå®çãªè©äŸ¡ãããŠããèšè¿°ã«åé¡ããããå®éã«ãã®ããã¹ããæžããŠãã人ãã©ã®ãããªäºãèããŠèšè¿°ããŠãããåæããçè§£ããäºãèšããŸãã ããã°ãSNSã®çºå±ããAmazonãªã©ã®ECãµã€ãã®ã¬ãã¥ãŒæ©èœãå
å®ããçŸåšãè©å€åæã¯ãŠãŒã¶ãŒã®çã®å£°ãææ¡ããäºãã§ãããšæåŸ
ãããŠãããããç ç©¶åéã§ãçãäžãããèŠããŠããŸãã å®éšæŠèŠ å¯Ÿè±¡ããŒã¿ ã»æžãããŠããå
容ã®ç²Ÿæ»çã«ã³ã¹ãããããªãããã ã»ãã§ã«è©äŸ¡ã®ç¹æ°ãæ¯ãããŠããç¹ã è©å€åæãšã¯æ§ã
ãªããã¹ãæ
å ±ãããã¹ããã€ãã³ã°ãæ©æ¢°åŠç¿ã®æè¡ãçšããŠãè¯å®çãªè©äŸ¡ãããŠããèšè¿°ãšåŠå®çãªè©äŸ¡ãããŠããèšè¿°ãªã©ã«åé¡ããããå®éã«ãã®ããã¹ããæžããŠãã人ãã©ã®ãããªäºãèããŠèšè¿°ããŠãããåæããçè§£ããäºãèšããŸãã ããã°ãSNSã®çºå±ããAmazonãªã©ã®ECãµã€ãã®ã¬ãã¥ãŒæ©èœãå
å®ããçŸåšãè©å€åæã¯ãŠãŒã¶ãŒã®çã®å£°ãææ¡ããäºãã§ãããšæåŸ
ãããŠãããããç ç©¶åéã§ãçãäžãããèŠããŠããŸãã mattlawer/appstat ã®æ§ãªã³ãã³ãã©ã€ã³ããã¢ããªã®app_idãæå®ããŠã¬ãã¥ãŒãååŸãã䟿å©ãªãµãŒãã¹ãããã®ã§ãããä»åã¯200件以äžãååŸãããã£ãã®ã§ãAppleã®APIã®ã¬ã¹ãã³ã¹ãã¹ã¯ã¬ã€ãã³ã°ãã圢ã§ååŸããŸããã è©å€åæããŒã« ãç¬ç«è¡æ¿æ³äººæ
å ±éä¿¡ç ç©¶æ©æ§ æ§ç¥èåŠçã°ã«ãŒã æ
å ±ä¿¡é Œæ§ãããžã§ã¯ããã§äœãããŠããããŒã«ã䜿çšããŠåæãè¡ããŸããã(詳现ã¯ãã¡ã : http://alaginrc.nict.go.jp/opinion/ ) ãã¡ãã¯1è¡ã«ã€ã1æãæžãããããã¹ããã¡ã€ã«ãå
¥åãããšãâ ãã®è©äŸ¡æ
å ±ã衚ã衚çŸã®æœåºâ¡ ãã®è©äŸ¡æ
å ±ã®æå³çãªåé¡â¢ ããžãã£ã / ãã¬ãã£ãÂ ã®æ§ãªãã®æç« ã衚ããè©äŸ¡ãã«é¢ããæ
å ±ãæœåºããŠãããã¹ã¯ãªãã矀ã§ãã 以äžã®ãã®ãåãç°å¢ã§ããã¡ãã®ããŒã«ã䜿çšããäºãã§ããŸãã ã»CRF++ïŒVersion 0.54 ã§åäœç¢ºèªïŒ ã»iconv (Version 2.5ã§åäœç¢ºèª) ã»gawkïŒVersion 3.1.6 ããã³ 4.0.0ã§åäœç¢ºèªã3.1.5ã§ã¯ãšã©ãŒãçºçããŸãïŒ ã»gccïŒVersion 4.1.2ã§åäœç¢ºèªïŒ ã»perlïŒVersion 5.8.8 ããã³ 5.10.1ã§åäœç¢ºèªïŒ ã»JUMANïŒVersion 6.0 ããã³ 6.01ã§åäœç¢ºèªãVersion 7.0ã«ã¯å¯Ÿå¿ããŠããŸãããïŒ ã»KNPïŒVersion 3.01 ã§åäœç¢ºèªãVersion 4.0ã«ã¯å¯Ÿå¿ããŠããŸãããïŒ åæçµæãšããŠè¡šç€ºããããè©äŸ¡ã¿ã€ãã®çš®é¡ãšåã¿ã€ããæã¡ããæ¥µæ§ã¯ä»¥äžã®è¡šã®æ§ã«ãªããŸããïŒ+ã¯ããžãã£ãã-ã¯ãã¬ãã£ãã衚ããŸãïŒ å®éšå
容 ã»ã¹ã¯ã¬ã€ãã³ã°ã§ååŸããã¬ãã¥ãŒ300ä»¶ãååŸ ã»ã¢ããªã®ããŒãžã§ã³ à ã¬ãã¥ãŒã®ç¹æ° ããšã«ãã¡ã€ã«ãåå² ã»ã¬ãã¥ãŒã®ç¹æ°ããš/ããŒãžã§ã³å¥ã«è©äŸ¡åæã®çµæããŸãšãã ååŸããæç« ã¯äžã€ã®ã¬ãã¥ãŒã®äžã§è¯å®çãªæèŠãšåŠå®çãªæèŠãæ··ããŠèšèŒããŠãããã®ãååšããçç±ãããåæã¹ã¯ãªããã«æµããŠãã©ã®ãããªæèŠãè¿°ã¹ãŠãããå€å®ã§ããªãå¯èœæ§ãé«ããããæããšã«åºåã£ãŠåæãè¡ããŸããã å®éšçµæ å
šäœã®è©äŸ¡å
å®¹æ° ææ
+ Â Â Â Â : 6 ææ
-     : 0 æ¹è©+     : 200 æ¹è©-     : 77 ã¡ãªãã+ : 150 ã¡ãªãã-  : 56 æ¡åŠ+     : 8 æ¡åŠ-      : 0 åºæ¥äº+   : 0 åºæ¥äº-    : 0 åœçº      : 28 èŠæ      : 0 ã¬ãã¥ãŒãšããäºãããããæ¹è©+-ããã¡ãªãã+-ãã«é¢ããæèŠãå€ãçµæãšãªããŸããããŸãããåœçºããå€ãã¬ãã¥ãŒã«æžãããŠããäºããã¢ããªã«äœãæ±ããŠããããç¥ãäºãã§ãããã§ãã ã¬ãã¥ãŒç¹æ°ããšã®è©äŸ¡å
容 ã¬ãã¥ãŒ5ã®ã³ã¡ã³ãå
ã§ è©äŸ¡å
容 ã¬ãã¥ãŒ5ã®ãŠãŒã¶ãŒã®ã³ã¡ã³ããšããŠã¯ããžãã£ããªæèŠãå€ããç¹ã« ã»ã³ãŒããäœãããšã®æ¥œãã / 坿ã ã»è²·ãç©ã«äŸ¿å© ã»æ¢ããŠãããã®ãèŠã€ãã çã®æèŠãå€ãããã ããŸããã ã¬ãã¥ãŒ1ã®ã³ã¡ã³ãå
ã§ è©äŸ¡å
容 ã¬ãã¥ãŒ1ãããã ãããŠãŒã¶ãŒã®ã³ã¡ã³ãã«ã¯ãã¯ããã€ãã¹ãªæèŠãå€ãååšããŠããŸããä»å詊ããŠã¿ãããŒã«ã®çµæã®ãŸãŸã§ã¯ããã€ãã¹ãªæèŠã«é¢ããŠãããã€ããã©ã¹ã®æèŠãšããŠå€å®ãããŠããŸã£ãŠããã¢ãããããŸããã 倧ããåãããš ãã°å ±åç³» ãš æ¹åèŠæç³» ã®2çš®é¡ã«åããããŸãããã¡ããèªç¥ããŠä»åŸæ¹åãé²ããŠè¡ããã°ãæ©èœæ¹ä¿®ã«ã€ããŠãå€ãã®æèŠãããã ããŠããŸããããæ©èœæ¹åãããäºèªäœã«å¯Ÿããäžæºã®ãæèŠããããäºãããããŸããã ææ°ããŒãžã§ã³ã®ã¬ãã¥ãŒã§ãã€ãã¹è©äŸ¡ã®ãã® äžçªçŽè¿ã®ã¬ãã¥ãŒã®äžã§ãã€ãã¹ã®è©äŸ¡ã«ãªã£ããã®ãšããŠã¯äžèšã®ãç¥ããã«é¢ããŠã§ããããç¥ãããæ¶ãä»çµã¿ã¯çŸåšã®ã¢ããªã«ãå®è£
ãããŠããã®ã§ããã¡ãããŠãŒã¶ãŒã«ãã¡ããšäŒãã£ãŠããªãäºãããããŸãã Â çµæããã®èå¯ãšä»åŸã®è©± ä»åã¯ç¹ã«åæã«é¢ããŠã«ã¹ã¿ãã€ãºçãããŠããªãã®ã§ãè©å€åæã®ç²ŸåºŠãäžããäºã«ã¯èšåããŠããŸãããããŠãŒã¶ãŒãæçš¿ããŠããææžãè§£æããäºã§ ã» ãŠãŒã¶ãŒãäœã«åãã§ããããããã ã» ãŠãŒã¶ãŒãäœã«äžæºãæããŠããããããã æ®æ®µèŠéããŠããŸã£ãŠããã¬ãã¥ãŒã®äžã«ãããŠãŒã¶ãŒã®ææãã€ããã§ãµãŒãã¹ã«èœãšã蟌ãäºã¯ç¢ºå®ã«ã¡ãªããããããŸãã ä»ã«ããç§ãã¡éçºè
ãæ°ã¥ããŠããªããã°ã«ã€ããŠææ¡ãã§ãããŠãŒã¶ãŒãã©ãã®æ©èœã楜ããã§ãèªåãã¡ã®ã¢ããªã䜿ã£ãŠãããŠããããèªåãã¡ã®ã¢ããªã®åŒ·ã¿ãç¥ãäºã«ãã€ãªãããŸãã ä»åŸé²ãããããš èŸæž/åæã¢ã«ãŽãªãºã ã®æé©å ä»åã¯ãè©å€åæå°å
¥ã®ã¯ããã®äžæ©ããšããäºã§ãåæããŒã«ã«ç¹ã«åŠç¿ããŒã¿ãäžããŠåŠç¿ãããããèŸæžãã¢ããªãããã¹ããã€ãã³ã°ããã®ã«æé©åãããããªããšã¯ãããäžè¬çãªè©å€åæçšã®èŸæžã䜿ã£ãŠããŸãã ãã®ããããã©ã¹/ãã€ãã¹ã®è©äŸ¡ã®éšåãªã©ã§ãããããã®ãå€ã
ãããŸããã ã»åæãããããäŸ ãã®ããã«äººéãã¿ãã°äžçºã§ãã€ãã¹ã®ææ
ãªæèŠã§ãããã©ã¹ãªè©äŸ¡ã«å€å®ãããŠããŸã£ãŠããè§£æçµæãå€ã
ãããŸããä»åŸã¯ã¢ããªã®æ¹è©ã«é¢ããèšèãåŠç¿ãããŠèŸæžã«è¿œå ããŠãããªã©ããŠããã粟床ãäžããè©å€åæãã§ããã°ãã¢ããªã®æ¹åçã«ãã©ã¹ã«ãªãã®ã§é²ããŠè¡ããããšèããŠããŸãã åé ã§ãããã¹ããã€ãã³ã°ãçšããè©å€åæã®åéã¯ç ç©¶ã§çãäžãã£ãŠãããšèšèŒããŸãããã調ã¹ãŠããäžã§æ¬¡ã«è©Šããããªé¢çœãç ç©¶ããã£ãã®ã§ããã€ããããŸããããã²åèã«ããŠã¿ãŠãã ããã ã¬ãã¥ãŒã®èªã®éã¿ãèæ
®ããããã¹ããã€ãã³ã°ã«ããã²ãŒã ãœããã®è©å€åæ Â æ§æçãçšããæèŠã»è©å€æ
å ±æœåºææ³ ããŒã«ã«ããããžã¥ã¢ã©ã€ãº  ä»åã¯ããŒã«ã«ã®ããããåçºã§åããŠåŠçãããããã¹ããã¡ã€ã«ãã¢ãŠãããããšããŠããŸãããä»åŸã¯ ã»å®æçã«ææ°ã®ã¬ãã¥ãŒã®åæçµæãæŽæ° ã» ããŒã«ã§ãšã³ãžãã¢ä»¥å€ãèŠããããã« ã»åã¢ããªã®ããŒãžã§ã³ããšã§ã¬ãã¥ãŒã«ã©ã®ãããªå€åãçŸããŠããããèŠããåã ã» ã¬ãã¥ãŒã ãã§ç¡ãTwitterãªã©ã«æçš¿ãããŠããæç« ãè§£æãã ã»ãã©ã¹/ãã€ãã¹ããããã®è©äŸ¡ã®äžã§é »åºãªåèªã圢æ
çŽ è§£æã§åè§£ãããŒã«ã§èŠããããã«ãããŠãŒã¶ãŒãäœãããã®åªäœã«ãã¹ãããŠããå
容ã§ããããªã¯ãŒãã¯äœããèŠããå çãé²ããäºã§ãæ¥ã
ãŠãŒã¶ãŒã«åããæ¹åããšãããããªäœå¶ãäœããããšèããŠããŸãã  æåŸã« ä»åã¯ã¬ãã¥ãŒã«é¢ããåæã®å®éšå
容ããããŸããããã¬ãã¥ãŒãTwitter以å€ã«ãåŒç€Ÿã¢ããªã«ã¯æ§ã
ãªããã¹ãããŒã¿ãç»åããŒã¿ãããããã¡ãã·ã§ã³ã«é¢ããããŒã¿ãšããæå³ã§ã¯æ¥æ¬æå€§çŽã®ããŒã¿ãããŸã£ãŠããŸããVASILYã§ã¯çŸåšããããã®ããŒã¿ã䜿ã£ãŠä»è¿ã«ãªãæ°ãã䟡å€ãäžã®äžã«çã¿åºããŠè¡ããããšãããšã³ãžãã¢ã倧åéããŠããŸãïŒãã²äžç·ã«ãã¯ãããžãŒã®åã§ãã¡ãã·ã§ã³æ¥çã«ã€ã³ãã¯ããäžããŠããŸãããïŒ åéèŠé
é£çµ¡å
ïŒinfo[at]vasily.jp
iQONã®iOSã¢ããªã¯ãŸã å
šãŠObjective-Cã§èšè¿°ãããŠããŸãã Swiftãžã®ç§»è¡ã«ã€ããŠã¯ãããããŠããã©ãŒãã³ã¹ãäžããããã§ããªããâŠããšæã£ãŠæžã£ãŠããŸããã ãããªäžããªãã£ã¹ã®ç§»è»¢ããã£ããã«æ¥å®¢ã®åä»ã·ã¹ãã ãiPadã¢ããªã§äœãããšã«ãªããŸããã ã¹ã¯ã©ããã§ã¢ããªãäœãã®ãªãSwiftã§ããšããããšã§Swiftã§äœããŸããã ä»åã¯ãåä»ã·ã¹ãã ã®ç€Ÿå¡ãåŒã³åºãããŒã¿éä¿¡ãšããããããŒãžã®æèšã«äœ¿ã£ãCADisplayLinkå®è£
ã玹ä»ããŸãã 宿å www.youtube.com åŒã³åºããã瀟å¡ãéžæãããšãtwilioããååäººã®æºåž¯é»è©±ã«èªåé³å£°ã®é»è©±ãããã£ãŠããŸãã é»è©±åŒã³åºããšåæã«Slackã«ãéç¥ãé£ã¶ããã«ãªã£ãŠããŸãã å®è£
ããŒã¿ã®æµãã¯äžèšã®ããã«ãªã£ãŠããŸãã ã¢ããªããã¯herokuã®APIããªã¯ãšã¹ãããã ããªã®ã§ããšã©ãŒãã³ããªã³ã°ãç°¡åã«æžã¿ãŸããã ããŒã¿éä¿¡ iPadããåŒã³åºããã瀟å¡ãéžæãããšãã¢ããªããHerokuã®APIã«ãªã¯ãšã¹ã Herokuã®APIãSlackãštwilioã«ãªã¯ãšã¹ã 瀟å¡ã®ã±ãŒã¿ã€ã«é»è©±(èªåé³å£°)ãšSlackã®éç¥ãé£ã³ãŸã ã¢ããªã®å®è£
ãã€ãã£ãåŽã§ã¯äžèšã®ãããªããšããã£ãŠããŸãã ã» Swift補éä¿¡ã©ã€ãã©ãªã®Alamofireãäœ¿çš ã» CAGradientLayerã§iPhoneã®ããã¯è§£é€ã®ãããªã·ããŒã¢ãã¡ãŒã·ã§ã³ãå®è£
ã» æèšã®ã¢ãã¡ãŒã·ã§ã³ãCADisplayLinkã䜿ã£ãŠæ£ç¢ºã«æç» ã» UICollectionViewFlowLayoutããªãŒããŒã©ã€ãããŠãã»ã«è¿œå ã¢ãã¡ãŒã·ã§ã³ãå®è£
ã» åŒã³åºããªã¯ãšã¹ãäžã«AudioToolbox.frameworkã§å¹æé³ãç¡éã«ãŒãããã ã» éä¿¡äžã®æ³¢åœ¢ã¢ãã¡ãŒã·ã§ã³ã«CADisplayLinkã䜿ã£ãŠã¢ãã¡ãŒã·ã§ã³ ã» ã¢ããªã¢ã€ã³ã³ã¯åºæ¬çã«èŠããªãã®ã§ãidenticonã§ãã¶ã€ã³å·¥æ°ãŒã ãã®äžã®äžã€ãä»åã¯CADisplayLinkã®å®è£
ã玹ä»ããŸãã æèšã®ã¢ãã¡ãŒã·ã§ã³ãšCADisplayLink ã¢ããã°æèšã®ãããªç¡éã«åãç¶ããã¢ãã¡ãŒã·ã§ã³ãå®è£
ãããšããNSTimerãdispatch_afterã䜿ã£ãŠ0.01ç§ããšã«äœçœ®ãä¿®æ£ããåŠçãå®è¡ãããããªå®è£
ãèããããŸãã åä»ã·ã¹ãã ã®æèšã®ã¢ãã¡ãŒã·ã§ã³ã®å®è£
ã«ã¯ãCADisplayLinkã䜿çšããŠããŸãã CADisplayLinkã¯ç»é¢ã®ãªãã¬ãã·ã¥ã¬ãŒããšåæããŠæç»ãããã¿ã€ããŒãªããžã§ã¯ãã§ãã vs NSTimer NSTimerã䜿ã£ãããdispatch_afterãã«ãŒãããŠãåããããªåŠçãå®è£
ã§ããŸãã äŸãã°ãNSTimerã®ã€ã³ã¿ãŒãã«ã1ç§ã«èšå®ããŠããã®åŠçã®å®è¡æéã1.5ç§ã ã£ãå ŽåãåŠçå®è¡äžã¯æ¬¡ã®ã¿ã€ããŒåŠçãã¹ããããããåŠçãå®è¡ãããã®ã¯2ç§ééã«ãªã£ãŠããŸããŸãã(ãããããã¬ãŒã ã¹ããã) ããã¯CADisplayLinkã§ãåãããšã§ããCADisplayLinkã®å Žåã§ãã¹ãããã¯ãããŸããããããŸã§ãåŒã³åºãããã¿ã€ãã³ã°ã¯ç»é¢ã®æŽæ°ã«åæããã®ã§ã¢ãã¡ãŒã·ã§ã³ã䜿ãã«ã¯å¹çãè¯ãã®ã§ãã CADisplayLinkã®å®è£
CADisplayLinkãªããžã§ã¯ããçææã«ã¿ãŒã²ãããšã¡ãœããåãç»é²ããŸãã çæããCADisplayLinkãªããžã§ã¯ããNSRunLoopã®ã¡ã€ã³ã«ãŒãã«è¿œå ãããšãç»é¢æç»ã®ãªãã¬ãã·ã¥ããšã«ç»é²ããã¡ãœãããåŒã°ããŸãã let displayLink = CADisplayLink(target : self , selector : Selector ( "update:" )) displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode : NSRunLoopCommonModes ) åãæãå®è£
å®è£
ã®äžéšãäžã€ã®ViewControllerã«ãŸãšããŸããã GitHubã«ãµã³ãã«ãããžã§ã¯ã ã眮ããŠããã®ã§åãããŠã¿ãŠãã ããã ãããªã¢ãã¡ãŒã·ã§ã³ãåããŸãã import UIKit class ViewController : UIViewController { private let secondLayer = CAShapeLayer() override func viewDidLoad () { super .viewDidLoad() // åã®ã¬ã€ã€ãŒ let frame = view.frame let path = UIBezierPath() path.addArcWithCenter( CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame)), radius : frame.width / 2.0 - 20.0 , startAngle : CGFloat ( - M_PI_2), endAngle : CGFloat (M_PI + M_PI_2), clockwise : true ) secondLayer.path = path.CGPath secondLayer.strokeColor = UIColor.blackColor().CGColor secondLayer.fillColor = UIColor.clearColor().CGColor secondLayer.speed = 0.0 // â»1 view.layer.addSublayer(secondLayer) // åãæãã¢ãã¡ãŒã·ã§ã³ let animation = CABasicAnimation(keyPath : "strokeEnd" ) animation.fromValue = 0.0 animation.toValue = 1.0 animation.duration = 60.0 secondLayer.addAnimation(animation, forKey : "strokeCircle" ) // CADisplayLinkèšå® let displayLink = CADisplayLink(target: self, selector: Selector("update:")) displayLink.frameInterval = 1.0 // â»2 displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode : NSRunLoopCommonModes ) } func update (displayLink : CADisplayLink ) { // timeOffsetã«çŸåšæå»ã®ç§æ°ãèš let time = NSDate().timeIntervalSince1970 let seconds = floor(time) % 60 let milliseconds = time - floor(time) secondLayer.timeOffset = seconds + milliseconds // â»3 } } secondLayer.speed = 0.0 CALayer ã®speedã0ã«ããŠãèªåã§ã¢ãã¡ãŒã·ã§ã³ãåããªãããã«ãã displayLink.frameInterval = 1.0 1ãã¬ãŒã ããšã«åŠçãå®è¡ãã secondLayer.timeOffset = seconds + milliseconds ã¢ãã¡ãŒã·ã§ã³ã®é²æå
·åãèšå®ãã CALayerã® speed = 0.0 ã®ç¶æ
ã§ã timeOffset ãæäœããŠããã®ã§ãåãäžåšããŠãããŸãæåããæç»ãå§ãŸã£ãŠç¡éã«åãç¶ããŸãã Swiftã§æžããŠã¿ãŠæã£ãããš ã¡ãªãã ã³ãŒãéãæžã ãã .h/.m â .swift äžã€ã«ãªããŸã ãã åæšè« Objective-Cã§ã®äžäŸ¿ãªããšãæ¹å ãã æååã®æ±ããSwitchãenum Optional Value (?, !) ã ãã«ãããã«éçè§£æã§ãã°ã«æ°ä»ãããšãã§ããŸã iOSãšã³ãžãã¢ã«ä»¥å€ã®å¯èªæ§åäž ã Objective-Cã®ç¬ç¹ãªèšæ³ããªããªã£ãŠãiOSãšã³ãžãã¢ä»¥å€ã§ããªããšãªãçè§£ã§ãããããèªã¿ããããªããŸãã ããããã£ããã§Androidãšã³ãžãã¢ãplaygroundãè§Šãããã«ãªããŸãã æ®æ®µã¢ããªãObjective-Cã§äœã£ãŠãã人ã«ã¯ãããããŠé£ãããªã (ç°¡åãšããããã§ããªãã§ãã) äœããæžããŠããŠæ¥œãã ãã¡ãªãã Xcodeã§ã¡ãœããã®å®çŸ©ã«é£ã¶ã·ã§ãŒãã«ãã(Cmd+Ctrl+J)ãããŸãå¹ããªã ã optionããŒãæŒããªãããã³ãŒããã¯ãªãã¯ããŠåé¿ããŠããŸã ã©ã€ãã©ãªã®å©çšãé¢å ãã Alamofireãgitã®submoduleã䜿ã£ãŠã€ã³ã¹ããŒã«ããŸãããããªãé¢åã§ãã ãã CocoaPodsã§Swiftã©ã€ãã©ãªãæ±ããããã«ãªãã®ã¯ã0.36以éã®äºå®ã§ã ããã æ£åŒãªãªãŒã¹ãåŸ
ãããŸã ã¡ãªããã®æ¹ã倧ãããšæã£ãã®ã§iQONã®ã³ãŒããæ°ãããã®ããSwiftã§æžããŠããããšæããŸãã
 ã¿ãªããã¯Androidã¢ããªã®ãªãªãŒã¹äœæ¥ãèªååããŠããŸããïŒ 2014幎GooglePlayãã¹ãã¢ããªãåè³ããåŒç€Ÿã®ãã¡ãã·ã§ã³ã¢ããªãiQONãã§ã¯ããªãªãŒã¹äœæ¥ãCircleCIãšDeployGateã§èªååããŠããŸããä»åãã©ã®ããã«èªååããã®ãããæšå¹Ž11æããVASILYã§åãå§ããå æ±( @Horie1024 )ãã玹ä»ããããšæããŸãã æŠèŠ iQONã®éçºãããŒã¯ãPullRequestããŒã¹ã§è¡ãããŠãããéçºãå®äºããã³ãŒããreleaseãã©ã³ãã«éæPullRequestãéããªããéçºãé²ããŠããŸãã releaseãã©ã³ããäœæ releaseãã©ã³ãã«PullRequest åé¡ãç¡ããã°PullRequestãããŒãž 1~3ãç¹°ãè¿ã ãããŠããªãªãŒã¹äœæ¥ã¯ä»¥äžã®ãããªæé ã§è¡ã£ãŠããŸããã releaseãã©ã³ããmasterãã©ã³ããžPullRequest PullRequestãããŒãž masterãã©ã³ãããAPKãäœæ ã¡ãŒã«ã§APKã瀟å
é
åž æçµç¢ºèª GooglePlayã«ã¢ããããŒã ãªãªãŒã¹å®äºÂ äœæ¥æé ãšããŠã¯é£ãããªãã®ã§ãããé »ç¹ã«ãããªãªãŒã¹ã®åºŠã«äœæ¥ãçºçããã®ã§ãšãŠãé¢åã§ããã å®çŸãããããš ä»åãèªååããããšã§ä»¥äžã®2é
ç®ãå®çŸããããšæããŸãã APKäœæã®èªåå 瀟å
ãžã®é
åžã®èªåå ã©ãå®çŸããã ãµã³ãã«ãããžã§ã¯ã 解説çšã«ãµã³ãã«ãããžã§ã¯ããçšæããŸããã https://github.com/horie1024/CircleCISample å
šäœã®æµã GitHubãžå·®åãPush CircleCIããã«ããéå§ Slackãžãã«ãã®æåŠãéç¥ DeployGateãžAPKãã¢ããããŒã æ€èšŒç«¯æ«ã«DeployGateã¢ããªçµç±ã§APKãé
ä¿¡ APKãã€ã³ã¹ããŒã« APKäœæã®èªåå ã³ãã³ãã§ã®APKäœæ AndroidStudioã§ã®ãããžã§ã¯ãã®ãã«ã iQONã®éçºã«ã¯ãAndroidStudioã䜿çšããŠããŸããAndroidStudioã§ã¯ãIDEãšãã«ãã·ã¹ãã ãççµåã«ãªã£ãŠãããããã³ãã³ãã§ã®ãã«ãã容æã«è¡ããŸãã ãã«ãã·ã¹ãã ã«ã¯ãGradleã䜿ãããŠãããAndroid Gradle Pluginã䜿çšããŠAndroidãããžã§ã¯ãã®ãã«ããè¡ããŸããGradleã«ã€ããŠã®ãã詳ããæ
å ±ã¯ã Gradle æ¥æ¬èªããã¥ã¡ã³ã ãAndroid Gradle Pluginã«ã€ããŠã¯ã Gradle Plugin User Guide ãã芧ãã ããã ãã«ãã¹ã¯ãªãã AndroidStudioã§ãããžã§ã¯ããæ°èŠäœæãããšã以äžã®2ã€ã®build.gradleããããŸãã ProjectçŽäžã®build.gradle app moduleå
ã®build.gradle app moduleå
ã®build.gradleã«Androidãããžã§ã¯ãããã«ãããããã®èšå®ãå«ãŸããŠããŸãã assembleã¿ã¹ã¯ æ°èŠäœæããAndroidStudioã§ãããžã§ã¯ãã«ã¯ãgradlewãšããå®è¡åœ¢åŒãã¡ã€ã«ãå«ãŸããŠãããgradlewã䜿ãGradleã®ãã«ããå®è¡ããããšãæšå¥šãããŠããŸãã gradlewã§ãã«ããå®è¡ããå ŽåãGradleãèªåã§ããŠã³ããŒããããããã䜿çšããŠãã«ããå®è¡ãããŸãããã詳ãã解説㯠ãã¡ã ãã芧ãã ããã Gradleã«ãããã«ãã¯ããããžã§ã¯ãåäœã§äžã€ä»¥äžã®ã¿ã¹ã¯ã§æ§æãããŠããããããžã§ã¯ããå®è¡å¯èœãªã¿ã¹ã¯ã®äžèЧã¯ãtasksã§è¡šç€ºã§ããŸãã $ ./gradlew tasks ã¿ã¹ã¯äžèЧã®äžã«ãBuild tasksããããAPKãäœæããã«ã¯ãassembleã¿ã¹ã¯ãå®è¡ããŸãã Build tasks ----------- assemble - Assembles all variants of all applications and secondary packages. assembleDebug - Assembles all Debug builds assembleDebugTest - Assembles the Test build for the Debug build assembleRelease - Assembles all Release builds build - Assembles and tests this project. buildDependents - Assembles and tests this project and all projects that depend on it. buildNeeded - Assembles and tests this project and all projects it depends on. clean - Deletes the build directory. Androidãããžã§ã¯ãã¯ãããã©ã«ãã§debug APKãšrelease APKã®2çš®é¡ã®åºåãæã£ãŠããŠãassembleã¿ã¹ã¯ãå®è¡ãããšäž¡æ¹ãåºåããŸããåºåãåå²ããã«ã¯ã assembleDebug ã assembleRelease ã¿ã¹ã¯ãå©çšããŸããä»åã¯ãGooglePlayãžã¢ããããŒãã§ããç¶æ
ã§APKãäœæãããã®ã§ãassembleReleaseã¿ã¹ã¯ã§APKãäœæããŸãã ã¿ãŒããã«ããã®APKäœæ å®éã«ã¿ãŒããã«ããassembleReleaseã¿ã¹ã¯ãå®è¡ãããšãapp/build/outputs/apk以äžã«APKãåºåãããã®ã確èªã§ããŸãããã®assembleReleaseã¿ã¹ã¯ãèªåçã«å®è¡ããããšã§ãAPKã®äœæãèªååããŸãã $ ./gradlew assembleRelease 眲åã®èšå® ãµã³ãã«ãããžã§ã¯ãã§ã¯ãèšå®ããŠããŸããããæ¬æ¥ã§ããã°assembleReleaseã§APKãäœæããå Žåã«ã¯çœ²åãä»ããŸããReleaseãã«ãã§çœ²åãä»ããã«ã¯ãapp moduleå
ã®build.gradleã®ã³ãŒãã以äžã®ããã«ããŸãã詳现㯠ãã¡ã ãã芧ãã ããã ãªãªãŒã¹äœæ¥æé ã®ç¢ºèª ãªãªãŒã¹äœæ¥ã®æé ã確èªããèªååããç®æãæŽãåºããŸãã releaseãã©ã³ããmasterãã©ã³ããžPullRequest PullRequestãããŒãž masterãã©ã³ãããAPKãäœæ ã¡ãŒã«ã§APKã瀟å
é
åž æçµç¢ºèª GooglePlayã«ã¢ããããŒã ãªãªãŒã¹å®äº ç®çã¯APKäœæã®èªååã§ãã®ã§ã1~3ã®æé ã«æ³šç®ãããšã ãPullRequestã®ããŒãžã«ãã£ãŠmasterãã©ã³ãã«å€æŽãçãããAPKãäœæããã ãšãŸãšããããŸããããã CircleCI ãå©çšããŠèªååããŸãã CircleCI CiecleCIã®ãããªCI as a Serviceã§ã¯ãGitHubãšã®é£æºãåæã«ãªã£ãŠããã®ã§ãGitHubã«å·®åãPushãããã®ãããªã¬ãŒã«ãä»»æã®ã³ãã³ããå®è¡ãããšãã£ãã¿ã¹ã¯ãç°¡åã«å®çŸ©ã§ããŸããå®éã«CircleCIã«ã©ã®ãããªæåãããããã®èšå®ã¯ã circle.yml ãšããèšå®ãã¡ã€ã«ã«æžããCI察象ã®ãªããžããªã«èšçœ®ããŸãã circle.yml circle.ymlã®æ§é ã¯6ã€ã®ã»ã¯ã·ã§ã³ã«åãããŠãããäžããé ã«å®è¡ãããŸãããŸãããããã®ã»ã¯ã·ã§ã³å
šãŠã«ã€ããŠèšå®ãæžãå¿
èŠã¯ãããŸããã machine : VMã®èšå®ã®èª¿æŽ checkout : gitãªããžããªããã®clone dependencies : ãã«ãã®äŸåé¢ä¿ã®è§£æ±º database : ãã¹ãã®ããã®databaseã®æºå test : ãã¹ãã®å®è¡ deployment : ãããã€ã®å®è¡ åã»ã¯ã·ã§ã³ã¯ãbashã³ãã³ãã®ãªã¹ããæãŠãå®è¡ãããbashã³ãã³ããæå®ããŠãããŸããããç¹ã«ã³ãã³ããæå®ããªãå ŽåãCircleCIããªããžããªã®ã³ãŒãããæšæž¬ããã³ãã³ããå®è¡ãããŸããã³ãã³ãå®è¡æã®ãªãã·ã§ã³ãšããŠã以äž3çš®é¡ãéžæã§ããŸãã pre : CircleCIãæšæž¬ããã³ãã³ãããåã«å®è¡ override : CircleCIãæšæž¬ããã³ãã³ããç¬èªã«å®çŸ©ããã³ãã³ãã§äžæžãå®è¡ past : CircleCIãæšæž¬ããã³ãã³ãããåŸã«å®è¡ ããã6ã€ã®ã»ã¯ã·ã§ã³ãš3çš®é¡ã®ãªãã·ã§ã³ãèŠããŠããã°ãcircle.ymlã¯åé¡ãªãæžãããšæããŸãããã詳ãã解説ã¯ã Configuring CircleCI ãã芧ãã ããã æ¬¡ã«ãå®éã«Androidãããžã§ã¯ãããã«ãããcircle.ymlãæžããŠã¿ãŸãã Androidãããžã§ã¯ãã®ãã«ã Test Android applications ãåèã«æžããŠãããŸãã checkout ã»ã¯ã·ã§ã³ãš database ã»ã¯ã·ã§ã³ã«ã€ããŠã¯ãå¿
èŠãç¡ãã®ã§èšå®ãæžããŸããã âªïžVMã®èšå® ãã«ããå®è¡ããã«ã¯ã ANDROID_HOME ã®å®çŸ©ãå¿
èŠã«ãªããããcircle.ymlã®machineã»ã¯ã·ã§ã³ã§å®çŸ©ããŸããenvironmentã»ã¯ã·ã§ã³ã§ç°å¢å€æ°ãå®çŸ©ã§ããVMã® /usr/local/android-sdk-linux ã«Android SDKãçšæãããŠãã®ã§ããã®Pathãæå®ããŸãããŸããJavaã®ããŒãžã§ã³ãopenjdk7ã«æå®ããŸãã machine: java: version: openjdk7 environment: ANDROID_HOME: /usr/local/android-sdk-linux âªïžsdkã®ã¢ããããŒã VMã«çšæãããŠããAndroid SDKã¯åæç¶æ
ã®ãããå¿
èŠã«å¿ããŠã¢ããããŒãããŸããäŸãã°ãCI察象Androidãããžã§ã¯ãã®build.gradleã®èšå®ãã以äžã®ããã«ãªã£ãŠããå Žå android { compileSdkVersion 21 buildToolsVersion "21.1.2" } circle.ymlã«SDK 21ãšBuild-tools 21.1.2ãã€ã³ã¹ããŒã«ãããã远èšããŸããoverrideãšããŠãã®ã¯ãCircleCIãæšæž¬ããŠå®è¡ãããgradle dependenciesã«ãã£ãŠãã«ãã倱æããããã§ãã machine: java: version: openjdk7 environment: ANDROID_HOME: /usr/local/android-sdk-linux dependencies: override: - echo y | android update sdk --no-ui --filter "android-21,build-tools-21.1.2" ãµããŒãã©ã€ãã©ãªããGooglePlayServicesã©ã€ãã©ãªã䜿çšããå Žåãfilterã«ä»¥äžã®idã远å ããŸãã "extra-google-m2repository,extra-android-m2repository" ãŸããfilterã«æå®ã§ããidã¯ã以äžã®ã³ãã³ãã§ç¢ºèªã§ããŸãã $ android list sdk --all --extended âªïžtestã»ã¯ã·ã§ã³ testã»ã¯ã·ã§ã³ã¯ãå¿
ãå®è¡ãããŠããŸããããoverrideã§ãããŒã®åŠçãè¡ãããã«ããŸãã machine: java: version: openjdk7 environment: ANDROID_HOME: /usr/local/android-sdk-linux dependencies: override: - echo y | android update sdk --no-ui --filter "android-21,build-tools-21.1.2" test: override: - echo "Nothing to do here" Robolectric Gradle Plugin ãå°å
¥ããŠããå Žåãtestã»ã¯ã·ã§ã³ã§ãã¹ããå®è¡ããŸãã test: override: - ./gradlew test âªïžAPKã®äœæ deploymentã»ã¯ã·ã§ã³ã§APKãäœæããŸããdeploymentã»ã¯ã·ã§ã³ã¯ãè€æ°ã®ãµãã»ã¯ã·ã§ã³ãæãŠãŸãããµãã»ã¯ã·ã§ã³ã¯ãbranchã»ã¯ã·ã§ã³ãæã¡ãå·®åãçãããã©ã³ãããæå®ããbranchã«ãããããå Žåã«ãcommandsãå®è¡ããŸãããã詳ãã解説ã¯ã ãã¡ã ãåç
§ããŠãã ããã machine: java: version: openjdk7 environment: ANDROID_HOME: /usr/local/android-sdk-linux dependencies: override: - echo y | android update sdk --no-ui --filter "android-21,build-tools-21.1.2" test: override: - echo "Nothing to do here" deployment: master: branch: master commands: - ./gradlew assembleRelease âªïžãã«ãã§ããã詊ã CircleCIã§å®éã«Androidãããžã§ã¯ãããã«ãåºæ¥ãã確èªããŸãã CircleCIã«ãã°ã€ã³ã»ãµã€ã³ã¢ãã ã GitHubã®ã¢ã«ãŠã³ãã§ãã°ã€ã³ãããã¯ãµã€ã³ã¢ããããŸãã Add Projectsãã¯ãªã㯠ã å·ŠåŽã®ã¡ãã¥ãŒã®Add Projectsãã¯ãªãã¯ããŸãã CIã®å¯Ÿè±¡ãšãããããžã§ã¯ãã®éžæ ã 1ã§ã¢ã«ãŠã³ããéžæãã2ã§CIã®å¯Ÿè±¡ãšãããããžã§ã¯ããéžæããŸãã ååãã«ãã®å®è¡ ã ãããžã§ã¯ããéžæãããšååã®ãã«ããã¹ã¿ãŒãããŸããååãã«ãã§ã¯ãcircle.ymlãäžæ£ã ã£ããããã«ãã倱æããŸããã masterãã©ã³ãã«å€æŽãPush masterãã©ã³ãã§circle.ymlãä¿®æ£ããå床Pushãããšãã«ããã¹ã¿ãŒãããŸããcircle.ymlãæ£ããä¿®æ£ããããããç¡äºãã«ããæåããŸããã ææç© Androidãããžã§ã¯ãããã«ãã§ããAPKãäœæã§ããŸãããæ¬¡ã«APKãGooglePlayã«ã¢ããããŒãã§ãããããäœæããAPKãããŠã³ããŒãã§ããããã«ããŸãã CircleCIã§ã¯ããã«ããå®è¡ããçµæçºçããææç©ã¯ã Build artifacts ãšããŠãã«ãæ¯ã«ããŠã³ããŒãã§ããŸããBuild artifactsãšããŠããŠã³ããŒãããã«ã¯ããã«ãææç©ãä¿åããå¿
èŠããããŸãã ææç©ãä¿åããã«ã¯ãgeneralã»ã¯ã·ã§ã³ã®artifactsã»ã¯ã·ã§ã³ã«ææç©ã®ãã¹ãæå®ããŸããgeneralã»ã¯ã·ã§ã³ã¯ã6ã€ã®ã»ã¯ã·ã§ã³ãšã¯å¥ã«ãç¹å®ã®ã»ã¯ã·ã§ã³ã«å±ããªãããã«ãå
šäœã«é¢ããèšå®ãæžãããšãã§ããã»ã¯ã·ã§ã³ã§ãã general: artifacts: - "app/build/outputs/apk/app-release-unsigned.apk" machine: java: version: openjdk7 environment: ANDROID_HOME: /usr/local/android-sdk-linux dependencies: override: - echo y | android update sdk --no-ui --filter "android-21,build-tools-21.1.2" test: override: - echo "Nothing to do here" deployment: master: branch: master commands: - ./gradlew assembleRelease masterãã©ã³ãã§ã®ã¿ã¿ã¹ã¯ãå®è¡ãããããã«ãã ãããŸã§ã§ãGitHubã§PullRequestãããŒãžãããã¯å€æŽãPushããããšã§ãCircleCIã®ã¿ã¹ã¯ãå®è¡ãããããã«ãªããŸãããã§ãããmaster以å€ã®ãã©ã³ããžPushããå Žåã§ããã«ããå®è¡ãããŠããŸããŸããããã§ãmasterãã©ã³ããžã®Pushã§ã®ã¿ãã«ããå®è¡ãããããã«ããŸãã Specifying branches to build ãåèã«ãcircle.ymlã«èšå®ã远å ããŸããgeneralã»ã¯ã·ã§ã³ã«branchesã远å ããããšã§ãmasterãã©ã³ããžã®Pushã§ã®ã¿ãã«ããå®è¡ãããããã«ãªããŸãã general: branches: only: - master artifacts: - "app/build/outputs/apk/app-release-unsigned.apk" machine: java: version: openjdk7 environment: ANDROID_HOME: /usr/local/android-sdk-linux dependencies: override: - echo y | android update sdk --no-ui --filter "android-21,build-tools-21.1.2" test: override: - echo "Nothing to do here" deployment: master: branch: master commands: - ./gradlew assembleRelease 以äžã®ããã«ãtestãã©ã³ããPushããŠã ãNot Runã ãšãªããŸãã Slack飿º Slackãšé£æºãããããšã§ããã«ãã®æåã»å€±æãéç¥ãããããšãã§ããŸãã Slackã®Configure IntegrationsããCircleCIãéžæ éç¥ãããchannelãéžæ channelãéžæãããšWebhook URLãåŸãããŸãã CircleCIã®Project Settingsã§Webhook URLãç»é² Notifications > Chat NotificationsããSlackãéžã³ãWebhook URLãå
¥ååŸãSaveãã¯ãªãã¯ããŸãã OOMåé¡ èªååããŠãã°ããéçšããäžã§å®éã«èµ·ãã£ãåé¡ãªã®ã§ãããbuild-toolsã®ããŒãžã§ã³ã21ã«äžããã¿ã€ãã³ã°ã§Out Of Memoryã§ãã«ããé »ç¹ã«å€±æããããã«ãªããŸãããããã¯æ¢ç¥ã®åé¡ã®ããã§ãCircleCIã®ããã¥ã¡ã³ãã«ã OOM killer ran ãšããŠèŒã£ãŠããŸãã Androidãããžã§ã¯ãã§çºçããå Žåã®å¯Ÿçã§ããããããžã§ã¯ãã«ãã£ãŠåå ãç°ãªãå¯èœæ§ãããã®ã§ç¢ºå®ã§ã¯ãããŸããããGradleã®ããŒãžã§ã³ã2ç³»ã«äžããããšã§æ¹åã§ããŸããã 瀟å
ãžã®é
åžã®èªåå DeployGateã®å©çš 瀟å
ãžã®APKã®é
åžã«ã¯ã DeployGate ãå©çšããŸããDeployGateã¯ãAPKãã¢ããããŒãããããšã§ãå°çšã¢ããªãä»ããŠéçºäžã®ã¢ããªãç°¡åã«é
åžã§ãããµãŒãã¹ã§ãã DeployGateã§ã®ã¢ããªã®é
åžæ¹æ³ DeployGateã§ã®ã¢ããªã®é
åžæ¹æ³ã¯ããµã€ã³ã¢ããåŸã®ãã¥ãŒããªã¢ã«ããããããããããã«çè§£ã§ããŸããããŸãã ãã¡ãã®è³æ ãåèã«ãªããŸããã DeployGate APIã®å©çš 瀟å
ãžã®é
åžãèªååããã«ãããã DeployGate APIã®Push API ãå©çšããããšã§ãcURLã³ãã³ãã§ç°¡åã«APKãã¢ããããŒãã§ããŸãã $curl -F "file=@sample.apk" -F "token=YOUR_API_KEY" -F "message=sample" https://deploygate.com/api/users/YOUR_USER_NAME/apps APIããŒã®ååŸ APIãå©çšããã«ã¯ãAPIããŒãå¿
èŠã«ãªããŸããAPIããŒã¯ãDeployGateãžæ°èŠç»é²ããããšã§çºè¡ãããŸããæ°èŠç»é²åŸã«ã https://deploygate.com/settings#apiKey ã«ã¢ã¯ã»ã¹ããããšã§ç¢ºèªã§ããŸãã ã¿ãŒããã«ã§ã®å®è¡ Macã®ã¿ãŒããã«ããå®è¡ããDeployGateã«ã¢ããããŒããããããšã確èªããŸããDeployGateã®ããã·ã¥ããŒãã«ã¢ããããŒãããã¢ããªã衚瀺ãããã°æåã§ãã $ curl -F "file=@PATH_TO_YOUR_APK" -F "token=YOUR_API_KEY" -F "message=sample" https://deploygate.com/api/users/YOUR_USER_NAME/apps CircleCIã§ã®ãã«ããã瀟å
é
åžãŸã§ã®æµãã®è©³çް å®éã®é
åžã®æµãã¯ã以äžã®éãã§ãã CircleCIãAPKãäœæ CircleCIãDeployGateãžAPIã䜿ãAPKãã¢ããããŒã DeployGateãDeployGateã¢ããªãžé
ä¿¡ æ€èšŒç«¯æ«ã§DeployGateã¢ããªãèµ·åããAPKãããŠã³ããŒãã»ã€ã³ã¹ããŒã« DeployGateããã®é
ä¿¡ãåããã«ã¯ãDeployGateã¢ããªãã€ã³ã¹ããŒã«ããŠããå¿
èŠããããŸãã CircleCIãšã®ç¹ããã¿ CircleCIããã³ãã³ããå®è¡ããAPKãDeployGateãžã¢ããããŒãããŸããmasterãžã®PushããAPKãDeployGateãžã¢ããããŒãããããŸã§ã®æµãã¯ã以äžã®ããã«ãªãã¯ãã§ãã masterãžå·®åãPush CircleCIãæ€ç¥ããAPKãäœæ DeployGateãžã®ã¢ããããŒããå®è¡ ãããã£ãŠãcircle.ymlã以äžã®ããã«èšè¿°ããŸãã general: branches: only: - master artifacts: - "app/build/outputs/apk/app-release-unsigned.apk" machine: java: version: openjdk7 environment: ANDROID_HOME: /usr/local/android-sdk-linux dependencies: override: - echo y | android update sdk --no-ui --filter "android-21,build-tools-21.1.2" test: override: - echo "Nothing to do here" deployment: master: branch: master commands: - ./gradlew assembleRelease - curl -F "file=@app/build/outputs/apk/app-release-unsigned.apk" -F "token=YOUR_API_KEY" -F "message=sample" https://deploygate.com/api/users/YOUR_USER_NAME/apps deploymentã®commandsã§ãAPKãäœæãšAPKã®DeployGateãžã®ã¢ããããŒããå®è¡ããŠããŸããããã§ãAPIããŒãçŽæžãã«ãªã£ãŠããŸã£ãŠããã®ã§ãCircleCIã®ç°å¢å€æ°ã«ç»é²ãããããåç
§ããããã«ããŸãã CircleCIã®ç°å¢å€æ°ãžã®ç»é² Project Settingsã®Tweaks > Environment variablesããèšå®ããŸããNameãšValueãšããformãããã®ã§ãNameã«DEPLOY_GATE_API_KEYãValueã«APIããŒãå
¥åããSave variableãã¯ãªãã¯ããŸãããããšDEPLOY_GATE_API_KEYãšããŠç°å¢å€æ°ãç»é²ãããŸãã ç»é²ããç°å¢å€æ°ã䜿çšããããã«æžãæããŸãã general: branches: only: - master artifacts: - "app/build/outputs/apk/app-release-unsigned.apk" machine: java: version: openjdk7 environment: ANDROID_HOME: /usr/local/android-sdk-linux dependencies: override: - echo y | android update sdk --no-ui --filter "android-21,build-tools-21.1.2" test: override: - echo "Nothing to do here" deployment: master: branch: master commands: - ./gradlew assembleRelease - curl -F "file=@app/build/outputs/apk/app-release-unsigned.apk" -F "token=${DEPLOY_GATE_API_KEY}" -F "message=sample" https://deploygate.com/api/users/YOUR_USER_NAME/apps ãã®ããã«ãç»é²ãã倿°ã¯ãcircle.ymlããåç
§ã§ããŸãã ã³ãã³ãã®å¥ãã¡ã€ã«ãžã®åãåºã circle.ymlãèŠãããããããã«ãã³ãã³ããå¥ãã¡ã€ã«ã«ãŸãšããŠããŸããŸãã ./gradlew assembleRelease curl -F "file=@app/build/outputs/apk/app-release-unsigned.apk" -F "token=${DEPLOY_GATE_API_KEY}" -F "message=sample" https://deploygate.com/api/users/YOUR_USER_NAME/apps ãã®çµæãæçµçãªcircle.ymlã¯ã以äžã®ããã«ãªããŸãã general: branches: only: - master artifacts: - "app/build/outputs/apk/app-release-unsigned.apk" machine: java: version: openjdk7 environment: ANDROID_HOME: /usr/local/android-sdk-linux dependencies: override: - echo y | android update sdk --no-ui --filter "android-21,build-tools-21.1.2" test: override: - echo "Nothing to do here" deployment: master: branch: master commands: - ./deploy.sh åäœç¢ºèª ããŸãããã°ãDeployGateã¢ããªã«ãã«ãããAPKãé
ä¿¡ãããŸãã ãŸããArtifactsããAPKãããŠã³ããŒãã§ããŸãã èªååããçµæ APKã®äœæãã瀟å
é
åžãŸã§èªååããããšãã§ããŸãããPullRequestã®ããŒãžãè¡ããããšAPKãé
åžãããããã«ãªãããªãªãŒã¹äœæ¥ãããªãå¹çåãããŸããã èªååå releaseãã©ã³ããmasterãã©ã³ããžPullRequest PullRequestãããŒãž masterãã©ã³ãããAPKãäœæ ã¡ãŒã«ã§APKã瀟å
é
åž æçµç¢ºèª GooglePlayã«ã¢ããããŒã ãªãªãŒã¹å®äº èªåååŸ releaseãã©ã³ããmasterãã©ã³ããžPullRequest PullRequestãããŒãž CircleCIãAPKãçæããã¿ã¹ã¯ãå®è¡ DeployGateãä»ããŠç€Ÿå
é
åž æçµç¢ºèª CircleCIããAPKãããŠã³ããŒã GooglePlayã«ã¢ããããŒã 7. ãªãªãŒã¹å®äº ãŸãšã CircleCIãšDeployGateãå©çšããŠããªãªãŒã¹äœæ¥ãèªååããŠã¿ãŸãããæšå¹Ž11æããå®éã®ãªãªãŒã¹äœæ¥ã«çµã¿å
¥ãéçšããŠããŸãããæã£ãŠãã以äžã«ã¹ãã¬ã¹ãæžããå¿«é©ã«éçºãè¡ããããã«ãªããŸãããããŒã ã¡ã³ããŒããã®è©å€ãè¯ãããã£ãŠã¿ãŠè¯ãã£ããšæããŸãã ãããããŸã ãŸã æ¹åã§ããç¹ããããç¶ç¶ããŠæ¹åããŠããããšèããŠããŸããçŸåšãGooglePlayãžã®APKã®ã¢ããããŒãèªååãçµã¿èŸŒãã éçºãããŒããã³ãªãªãŒã¹äœæ¥æé ããã¹ãäžã§ã(å®éšããå
容㯠Qiitaã«äžããŸãã )ããŸããä»å玹ä»åºæ¥ãªãã£ãå
容ããããŸãã®ã§ãè¿æ¥äžã«ã玹ä»ã§ããã°ãšæããŸãã æåŸã« VASILYã§ã¯ãèªååãæ°ããæè¡ã倧奜ããšã³ãžãã¢ã倧åéããŠããŸãïŒå°ãã§ããèå³ã®ããæ¹ã¯æ¯éãªãã£ã¹ã«éã³ã«ããããŠãã ããïŒ ãŸãã1æ28æ¥ã«SmartNewsãããWantedlyãããš ãã¹ãã¢ããªååŒ·äŒ ãšããå匷äŒãéå¬ããŸããç§ãäŒå Žã«ããŸãã®ã§ããæ°è»œã«ã声æããã ããïŒ åéèŠé
é£çµ¡å
ïŒinfo[at]vasily.jp
twitterã§äžèšã®ãããªã³ã¡ã³ãããããåŒç€Ÿãæ°åæ¡çšãªã©ãã£ãŠããããšãããMatzããã«æ°åãšã³ãžãã¢ã®çµŠæã«ã€ããŠäŒºã£ãŠã¿ãŸããã Â è³ªå æ°åãšã³ãžãã¢ã®é©æ£çµŠæã¯ããã ãšãããªããããäœã ãšæããŸããïŒãã£ããã  Matz æ¥æ¬ãšããããšèããŠâŠç系倧åã§600äžãããããªã ã§ãããã倧åã¯ã ãããç²ãããã ãšèšã£ãŠããã®ãšåããå人差ã¯ç¡ããã®ãšããŠããã£ãŠããšãªã®ã§ãããã ãšããããããã ãã ãã³ã³ãã¥ãŒã¿ãµã€ãšã³ã¹ã®åŠç§ãåºãŠãããã°ã©ãã³ã°ã§ããã£ãŠããåŠçã300äžãšã400äžãšãããè²°ããªããšãåœŒã®æã£ãŠãæèœã¯ããŸãè©äŸ¡ãããŠãªãã£ãŠããšãããªãããªãšãç¹æ®æèœãæã£ãŠãããšæãããŠãªãã£ãŠããšãããªãããªã ããã°ã©ãã³ã°ããã®ã«åœå®¶è©Šéšã¯ãããªãã®ã§èª°ã§ããªããã£ãŠæãããŠããã ãã©ãå®éã¯ããã°ã©ã ããã人ãšãããªã人ã®å·®ã£ãŠãã®ããããããããªãã§ããã ããã°ã©ãã³ã°ã奜ãã§ããã®ãããèŠåŽããŠç¹æ®æèœãšããŠäŒžã°ããŠããèš³ã ããããã€ããããä»äºã§äœ¿ã£ãŠäŒç€Ÿã«è²¢ç®ããã¯ããªã®ã«ãæ®éã«å€§åŠåºãŠãããã°ã©ãã³ã°ã§ããŸãããããããä»äºã§ãããå匷ããŸãã£ãŠäººãšåãæ±ããããããšãå
šç¶è©äŸ¡ãããŠãªãã£ãŠããšã§ãã©ãããããšãªãã ããªã£ãŠã ã¹ã¿ãŒãã¬ãŒã€ãŒã ãšå€§åŠåæ¥ããŠããã§ã1000äžè¶
ããããããããªããšå€¢ããªãããããªãããªã£ãŠã éã«ã䜿ããªãã£ãããããµãªåããåã倧åŠåºãŠããšããŠãã æ°åã¿ããªäžžããšé«ãã£ãŠããã®ã¯ãããããã©ãã¹ã¿ãŒãã¬ãŒã€ãŒã«å¯ŸããŠæ®éã®çµŠæããåºããŠããªããšããä¿ºãæ®éã®äººãšåãã«åããŠããã°è¯ãã®ããªãã£ãŠãªããã§ããªãæ¯ãããã®ã¯ç°¡åãªã®ã§ã ã ãããããã°ã©ãã£ãŠãéçéžæãéçã«ãããã®ãšåããããã®æéãããŠããããªãã§ãããåªç§ãªäººã¯ã éçããããªãã ãã©ãé 匵ã£ã人ãã¿ããªããéçã®éžæã«ãªããèš³ãããªããã ãã©ãå°ãªããšããããã®äººã¯åãæåããŠããã®äººã¿ããã«ãªãããã£ãŠããæ§ãã®ååšã£ãŠãããã°ã©ããŒã ãšãããŸããªãããã çµå¶è
ã®æ¹ã§ã¯åããšã³ãžãã¢ãããã°ãã®ãšã³ãžãã¢ã®éçºèœåããéã«ãããŠæ¬²ãããããšã³ãžãã¢ã®æ¹ã¯èªåã®èœåãæ£åœã«è©äŸ¡ããŠããããšããã«è¡ã£ãŠããŠæ¬²ãããã VASILYã®çæ§ã«ããæã£ãŠããã¯ãããžãŒããéã«æããã£ãŠãšããã¯é 匵ã£ãŠã»ããããã  ---------- æ°åã®çããã»æ¡çšæ
åœã®çããã¯å°±è·æŽ»åãããŒãã¢ããããŠãããšæããŸãããæ¯éæ¯éåèã«ããŠèŠãŠãã ããã VASILYããã¯ãããžãŒããéã«æãããšãããé 匵ããŸãã VASILYã§ã¯2016å¹Žã®æ°åæ¡çšãè¡ã£ãŠããŸããèªåãããã¹ã¿ãŒãã¬ãŒã€ãŒã ãšæãæ¹ã¯æ¯éæ¯éãå¿åãã ããïŒ 2016幎床 æ°åæ¡çš
 質å RubyKaigiãæ¥œãã¿ã«ããŠããŸãããããããã£ãšæ¥œããããã«ã¯ã©ããããè¯ãã§ããïŒ åå è
ãšããŠæ¥œããã«ã¯å匷ããŠãããšããããšãªã©ããã°æããŠãã ãããç»å£è
ãäºåã«ãããã¹ããŒãã³ã°ãããšæ¥œãããšãã Matz ãŸãããããããã(ç¬) ã«ã³ãã¡ã¬ã³ã¹ã®å
容ã£ãŠãæ®ã©ã®ãã®ã£ãŠãããã調ã¹ãã°ãããæ
å ±ãªãã§ãããã ããããäŒå Žã«è¡ã£ãŠã£ãŠããã®ã¯ãã¹ããŒã«ãŒã§è©±ãèãããšãããããããããã¯ãŒãã³ã°ã£ãŠãããã人ãšäººãšãç¹ããããšã®ããã«è¡ããã ãšæã£ãŠããã§ããã ã§ããããã£ãŠãããŸãèšãããªãã®ã§ãå€ãã®äººãã¡ã£ãŠãã è¡ã£ãŠè©±ãèããŠããããã話ãèãããã£ãŠåž°ã£ãŠããŸãããšãããªãå€ãã®ã§ãã¡ãã£ãšãã£ãããªããªãšã ãã®æ¥çã®äººã¯ãããŸãç©æ¥µçã«ç¥ããªã人ãšäº€æµãã人ã°ãããããªããã ãã©ãããã¯ã¡ãã£ãšçœ®ããšããŠã§ããã人ãšäººã®ã€ãªããã¿ãããªããšãäž»çŒã«çœ®ãããããããããªãããªãšæããã§ãããç©æ¥µçã«ã¹ããŒã«ãŒã«è©±ãããããšããäŒæ©å®€ã§é£ã«åº§ã£ã人ã«ãããªãäœãã£ãŠãã®ãã¿ããã«è©±ãããããšãããããšããããš120%ãããŸã200%ãããããªããã©ãã«ã³ãã¡ã¬ã³ã¹ãæå¹æŽ»çšã§ããããããªãããšæããã§ãããã ææã«ãªã£ãŠãã®ã§ããã£ããè¡ã£ãåãåãè¿ãããã«ã¯ã©ãããããããã£ãŠãããšããããã£ãŠäººãšè©±ãã£ãŠããã®ã倧äºãªããããªãããªãšã 質å RubyKaigiã§ã¯ã人ãšè©±ãããã£ã³ã¹ã¯ã©ãã蟺ãªã®ã§ããããã Matz äžçªãããããã®ã¯æèŠªäŒã§ããããããã¯ããŸãèŠåŽããªããŠãã§ããã®ã§ãé 匵ã£ãæ¹ããããšæãã®ã¯ã³ãŒããŒãã¬ã€ã¯ãéäžã«ãããããªãã§ããããããããã«æå¹æŽ»çšããã®ãã£ãŠããã®ãçãç®ãããªãããšæããã§ãããã ãããã£ãæéã¯ç¥ã£ã人ãšã€ãåã£ãŠããŸããVASILYã®äººãšããå
ã
ç¥ã£ãŠã人ãšã°ããéãŸã£ãŠãããã®è©±ã¯ã©ãã ã£ãããã¿ãããªè©±ãããã¡ã ãã©ãããã¯ãªãã£ã¹ã«åž°ã£ãŠãããã§ããããã ãããããªããŠãè²ããªäººãšåãã¿ãããªã®ããããšããããªãšã ãŸãç§ã«ãããšèšãããŠãçµæ§èŸããã§ããã©ããæ§æ Œäž(ç¬) 質å Matzããã¯RubyKaigiã§éåžžã«å€ãã®äººãšè©±ããšæãã®ã§ãããã©ããã£ã話ãããŠããæã楜ããã§ããïŒ Matz RubyKaigiã®å Žåã¯æ¥ãŠã人ã¿ããªRubyã«é¢å¿ãããã奜ããªäººãªã®ã§ãããããæå³ã§èšããšèª°ãšè©±ããŠãŠã楜ããã®ã¯æ¥œãããã§ããã ããšèšããšæ°ããã¢ã€ãã£ã¢ã®è©±ãããã®ã¯çµæ§å¥œããªã®ã§ãããããªããšãã£ãŠã¿ããã§ããã©ãã¿ãããªè©±ãããã®ã¯æ¥œããã§ãããããã¯ããããªã¬ãã«ã ãã©ãRubyãã®ãã®ã«å¯ŸããŠã©ããããã¿ãããªã¢ã€ãã£ã¢ããŠã§ã«ã«ã ã ãã©ããRubyã§ãããªããšãã£ãŠã¿ãŸãããã¿ãããªè©±ãé¢çœãã§ããããç¹ã«ãä»ãŸã§ãã£ãããšãã¿ãããªè©±ã°ããã§ã¯ãªããŠãæ°ããããšãããããªããšè©Šãããããšãã詊ããŠããã§ããã©ãã¿ãããªè©±ãèãã®ã¯ããã奜ãã§ããã 質å Matzããã¯ä»å¹ŽãKeynoteããããŸããããå€ã«ãæ§ã
ãªãã¬ãŒã³ããããŠãããã§ããããšã³ãžãã¢ãšããŠã®ãã¬ãŒã³ã®ã³ãã£ãŠäœããããŸããïŒ Matz å¿åœããããã®ã¯æ°ããããããªããŠããã£ã±ãæ°ãããªããšèŽè¡ãäœãæåŸ
ããŠããã®ããšããå€§äœææ¡ã§ããŠãã ãã¶æ¥œã«ãªããŸããããã ããšã¯ããšã³ãžãã¢ãªã®ã§ãã¯ãã«ã«ãªè©±ã¯ãããã ãã©ããã¯ãã«ã«ã®ã¬ãã«ãäžãããã¡ãããš8å²9å²ã®äººã¯ä»ããŠæ¥ããªããªãã®ã§ãããã¯ããã£ãšè©³ããç¥ããã人ã¯ããšã§æ¥ãŠããã¿ãããªæãã§æããšãã£ãŠããã®ã¯ãšã³ãžãã¢åãã®è©±ãšããŠãçµæ§å€§äºãªæ°ã¯ããŸããã ãžã§ããªãã¯ãªè©±ã£ãŠãããäžè¬è«ã®æ¹ãã¿ããªå¥œããªããšãå€ãã¿ããã§ãã ãã詳现ã«ã¯ç«ã¡å
¥ããªããã ãã©ããããªããšãä»å€§äºãªã®ã§ããã¡ãã£ãšé 匵ãããã¿ãããªãããããªã®ããããã ãã©ããã倧äºãã¿ãããªæŠç¥çãªè©±ãããã®ã¯çµæ§éèŠããªãšæããŸãã ããšã倧äœã®ããšã£ãŠäžæ¬¡å
ã§ã¯æ±ºãŸããªããããªãã§ãããããã«ãã®ã®ã©ã³ãã³ã°ãšããšã¯éã£ãŠããã®ããšã¯åŸæãªãã ãã©ãã£ã¡ã¯èŠæã¿ãããªã®ã¯åžžã«ããã®ã§ããããããã¬ãŒããªããæèãã話ãããããã«ã¯å¿ãããŠããŸãã äžã€ã®ã¢ã€ãã£ã¢ãã©ãã§ããªãŒã«ãªãã±ãŒã¿ãããªã±ãŒã¹ã£ãŠãšã³ãžãã¢çã«ã¯ã»ãšãã©ãªããã§ããããããããåææ¡ä»¶ãããã°ãã®ã¢ã€ãã¢ã¯ãããã©ãåææ¡ä»¶ãæç«ããªããšãã¯ãŸãå¥ã®ãšãã颚ãªããšã«ãªãã®ã§ããããããã¬ãŒããªãã§ãããéžãã ãã ãã©ãåææ¡ä»¶ãæç«ããªããšãã¯ããã§ããªãããã£ãŠãã話ã¯ããããŸããã ãŸãããã§ã¢ã§ãããããšæã£ãŠãŸãããããŒã±ãã£ã³ã°ã®è©±ãšãã ãšããã®æè¡ã§äœã§ã解決ã¿ãããªããããããããã°ãªãã§ã解決ãã¿ãããªè©±ãããã¡ãªãã ãã©ãçŸå®ã¯ããã§ã¯ãªãã®ã§ããã¯ã¡ãããšèšãããã«ããŠãŸãã  ---------- RubyKaigi 2014ã¯9/18ã19ãMatzããã®Keynoteã¯19æ¥9:30ãã§ãã çãäžããŠã楜ãã¿ããã§ããïŒ (åŒç€ŸVASILYãGold SponsorãšããŠåå ïŒMatzããã®è¡£è£
ã³ãŒãã£ããŒããããŸãã®ã§ã楜ãã¿ã«ããŠããŠãã ãããŸãïŒ)
ããã«ã¡ã¯ãããã¯ãšã³ããšã³ãžãã¢ã®BoBã§ãã ä»åã¯çæ§ã«ãç¥ããããããŸãã åŒç€ŸVASILYãšãæ ªåŒäŒç€ŸããŒã¹ã婊人ç»å ±ç€Ÿå
±å¬ã§ãæ¥æ¬åã®ãã¡ãã·ã§ã³ãããŒããšããããã«ãœã³ ãTHE FASHION HACK in TOKYO powered by Hearst Fujingaho & VASILYã ïŒä»¥äžãTHE FASHION HACKïŒã 2014幎9æ6æ¥(å)~9æ7æ¥(æ¥) ã«éå¬ããäºãšãªããŸããïŒ ãTHE FASHION HACKãã¯ããšã³ãžãã¢ããã¶ã€ããŒãªã©ã®ã¯ãªãšã€ã¿ãŒã1ïœ3人1çµã®ããŒã ã§ãäžãããã24æéã§æ°ããªã¢ã€ãã£ã¢ã®ããšãå®éã«åããããã¯ããéçºããããã«ãœã³ã€ãã³ãã§ãã ä»åã¯ãã¡ãã·ã§ã³ã«æ®æ®µããèå³ããããšã³ãžãã¢ã®æ¹ã«ãšã£ãŠããããã§ãªããšã³ãžãã¢ã®æ¹ã«ãšã£ãŠãããã®ããã«ãœã³ã€ãã³ããããã«é
åçããäŒããããšæããŸãã 1. ãã¡ãã·ã§ã³Ããã¯ãããžãŒã¯ãŸã ãŸã æªéæ ä»åã®ããã«ãœã³ã€ãã³ãã®ããŒãã¯ãããã¡ãã·ã§ã³ãšITãã¯ãããžãŒãæãåãããŠãæ°ãããã®ãäœããã§ãããã以å€ã«ç¹ã«çžãã¯ãããŸããã è¿å¹ŽãåŒç€ŸiQONãã¯ãããã€ã³ã¿ãŒãããã®ãã¡ãã·ã§ã³ã¡ãã£ã¢ããŠãŒã¶ãŒæ°ãã©ãã©ãå¢ãããããããŒã¹ã婊人ç»å ±ç€Ÿã®æ§ãªãã¡ãã·ã§ã³æ¥çã®äŒç€Ÿãããžã¿ã«æŠç¥ãå éãããããšããã¯ãããžãŒã§ãã¡ãã·ã§ã³æ¥çã«ã€ãããŒã·ã§ã³ãèµ·ããããšããäŒæ¥ãå¢ããŠããŸãããããçŸç¶ããŸã ãŸã éæãããŠããªãé åã§ãã ãŸãããŠã§ã¢ã©ãã«ç«¯æ«ã§ãã£ããIoT(Internet of Things)ã®åéãçãäžãããèŠããŠããããã¡ãã·ã§ã³æ¥çããã倧ããªæ³šç®ã济ã³ãŠããŸããã¡ã¬ãå°éåºãJINSããéå¶ããæ ªåŒäŒç€Ÿ ãžã§ã€ã¢ã€ãšããçºè¡šãããJINS MEMEã¯èšæ¶ã«æ°ããããšæããŸãããããã®åéã¯ä»åŸç¢ºå®ã«äŒžã³ãŠè¡ãåéã§ããããã€ãã¡ãã·ã§ã³ãšã¯åã£ãŠãåãé¢ããªãåéãšãªã£ãŠããŸãã ä»åã®ãã®ã€ãã³ãããã£ããã«æ®æ®µæ°ã«ãªã£ãŠããæ°ãããã¯ãããžãŒã«è§Šãããã®ãã£ã¬ã³ãžã³ã°ãªåéã«èå³ãæã¡ãã€ãããŒãã£ããªãã®ã圢ã«ããŠããããã°ãšæããŸãã  2. æ®æ®µã¯ããããªããåœå
æå€§çŽã®ãã¡ãã·ã§ã³ã¢ããªãiQONãã®APIã䜿ã£ãéçºãã§ãã ãã¡ãã·ã§ã³ã³ãŒãã£ããŒãã¢ããªãiQONãã¯ãæçš¿ãããã³ãŒãã£ããŒãæ°ã¯100äžä»¶ãè¶
ããæ²èŒãããŠãããã¡ãã·ã§ã³ã¢ã€ãã ã400äžä»¶ä»¥äžãšãåœå
æå€§çŽã®ãã¡ãã·ã§ã³ã³ã³ãã³ããéãŸãã¢ããªã«æé·ããŠããŸãã ãã®iQONã®APIãä»åã®ã€ãã³ãéå®ã§ãåå è
ã«å
¬éããäºå®ãšãªã£ãŠããŸãã ãŸãããŒã¹ã婊人ç»å ±ç€ŸãææããŠããããã¡ãã·ã§ã³èšäºã«é¢ããAPIãåœæ¥å
¬éãããäºå®ãšãªã£ãŠããŸãã ãã¡ãããã®ä»ããã¡ãã·ã§ã³ã«é¢ãããæ§ã
ãªAPIã䜿ã£ãŠéçºããŠããã ããŠããŸããŸããã  ãã²æ®æ®µããããªãiQONããã®ä»ã®APIãèªç±ã«äœ¿ã£ãŠéçºã楜ããã§ããã ããããšæããŸãã  3. éåžžã®ããã«ãœã³ã§ã¯åºäŒããªããããªäººãšã®åºäŒã ããã«ãœã³ã®ééå³ãšããŠã¯ãæ®æ®µè©±ããªã人ãã¡ãšã®æ°ããåºäŒãããããšæããŸãã ç¹ã«ä»åã®ããã«ãœã³ã«é¢ããŠã¯ãšã³ãžãã¢ããã¶ã€ããŒã ãã§ãªãã審æ»å¡ãã¹ã¿ãããå«ãããã¡ãã·ã§ã³æ¥çã®æ¹ã«ãåå ããŠããã ãäºå®ãšãªã£ãŠãããŸãã詳ãã審æ»å¡ã®æ
å ±ã¯å°çšãµã€ãïŒ http://www.thefashionhack.com ïŒãã芧äžããã  ã€ãã³ãåŸã®æèŠªäŒãäºå®ããŠããŸãã®ã§ãä»ãã¡ãã·ã§ã³æ¥çã§ã¯ã©ã®ãããªãã¯ãããžãŒã«æ³šç®ããŠããã®ããä»åŸã©ã®ããã«ãã¡ãã·ã§ã³æ¥çãšãã¯ãããžãŒã®é¢ä¿ã¯å€ãã£ãŠè¡ãã®ããªã©ãæ®æ®µãªããªãèããªã話ãèãäºãã§ããã€ãã³ããšãªã£ãŠããŸãã  4. æ¡çšã«ã€ãªããå¯èœæ§ãããã ç§ãã¡VASILYã¯ããã¯ãããžãŒã§äžã®äžã«ã€ã³ãã¯ããäžããããšã³ãžãã¢ãåžžã«åéããŠããŸãã åŒç€Ÿãšã³ãžãã¢ãåœæ¥äŒå Žã«ããŸãã®ã§ãVASILYã«èå³ãããæ¹ã¯ãã²ãã²åå ããŠè©±ããŠã¿ãŠãã ããã 詳ããã€ãã³ãæŠèŠã®ç¢ºèªãããã«ãœã³ãžã®ç³ã蟌ã¿ã¯å°çšãµã€ãïŒ http://www.thefashionhack.com ïŒãããé¡ãèŽããŸãã çæ§ããã®ããããã®ãå¿åããåŸ
ã¡ããŠãããŸãïŒÂ  Â
 VASILYã§ã¯ãšã³ãžãã¢ãæµ·å€ã§è¡ãããã«ã³ãã¡ã¬ã³ã¹ã«åå ã§ããå¶åºŠããããæ¯å¹ŽiOSã¢ããªã®ãšã³ãžãã¢ã WWDC ã«ãAndroidã¢ããªã®ãšã³ãžãã¢ã Google I/O ã«åå ããŠããŸãã ä»å¹ŽãAndroidã¢ããªã®ãšã³ãžãã¢ã§ããç§ã @yoichinishimura ã6æ25æ¥ã26æ¥ã«è¡ããã Google I/O ã«åå ããŠããŸããã ä»å¹Žã®I/Oã§ã¯ã Material Design ãAndroidé¢é£ã®å€ãã®çºè¡šããããŸãããããã®äžã§ç§ãäžçªã«é¢å¿ãæã£ãã®ã Android Wear ã§ããã å幎ã»ã©åã«å
¬éãããPreviewçã®SDKã«ã¯ãã»ã©èå³ã¯æ¹§ããªãã£ãã®ã§ãããæ£åŒãªSDKãå
¬éãããã®ãšãäŒå Žã§åå è
ã«é
ããã Samsung Gear Live ã身ã«ã€ããŠãããæ¥ã«èå³ãæ¹§ããŠããŸããã ä»å㯠Android Wear ãšã¯ãã£ãããªãã§ããã®ã ãšããããšãI/Oã®ã»ãã·ã§ã³ãå
¬åŒããã¥ã¡ã³ãã§åŠãã ããšãšãç§ã®èå¯ãæ··ããªãã玹ä»ããããšæããŸãã 1. Android Wearãšã¯ I/Oã«è¡ãå㯠ã Android Wear ãšã¯GoogleãæäŸããOSãåãå
¥ããæèšãã€ãŸãã¹ããŒããŠã©ããã®ããšããšåæã«æã£ãŠããã®ã§ãããã©ãããã¹ããŒããŠã©ããã®ããšã ããããªããš Wearable computing with Google ãšããã»ãã·ã§ã³ã§ç¥ããŸããã ã»ãã·ã§ã³å
ã§ Google Glass ã Android Wear ã«å¯Ÿå¿ãããšããçºè¡šããã£ãã®ã§ãããã€ãŸã察å¿åŸã¯ Google Glass ã Android Wear ãšããæ±ãã«ãªãããã§ãã ã€ãŸã Android Wear ãšã¯ Androidãšéä¿¡ããããšãã§ãããŠã§ã¢ã©ãã«ç«¯æ«ãã¹ãŠ ãæãã®ã§ããAndroidãèµ·ããIoTã®æä»£ããã£ãŠãããšæããŸããã Android Wear ã€ã¡ãŒãžçã«ã¯ä»¥äžã®ç»åã®äžéšã«ããããšæããŸãã 2. æ¢åã¢ããªã®Android Wearã®äœ¿ãã©ãã Android Wear ã®éçºãã¯ãããæ¹ã¯ GoogleãåºããŠããå
¬åŒããã¥ã¡ã³ã ãäžèªããããšããªã¹ã¹ã¡ããŸãã Android Wear ã®äžçªã®åºæ¬æ©èœã¯ Context Stream ãšåŒã°ããã«ãŒããªã¹ãã衚瀺ããããšããã§ãã ãGoogle Nowã«äŒŒããã®ããšã€ã¡ãŒãžããã°ãããããããšæããŸããã1ç»é¢ã«1ã«ãŒãAndroidããéãããNotificationãªã©ã®æ
å ±ã衚瀺ããŸãã ããã€ã¹ã®æäœã¯ãã¹ããŒããã©ã³ãšåæ§ã«ã¿ãããã¹ã¯ã€ããYes or Noãªã©ã®ç°¡åãªæäœãé³å£°å
¥åãªã©ãè¡ããŸãã å®éã«äœ¿ã£ãŠã¿ããšããããããŸãããã¹ããŒããã©ã³ã«æ¯ã¹ãŠè¡ããããšãéããªãå°ãªãã§ããç»é¢ãéåžžã«å°ããã§ãã ãã®ããæ¢åã¢ããªãäžæã察å¿ãããããšæããšããªãèŠåŽãããšæããŸãã è©±ã¯æ»ããŸãã Wearable computing with Google ã®ã»ãã·ã§ã³ã§ä»¥äžã®å³ãåºãŠããŸããã Wearableã®éçºãããã«ããã£ãŠã¯åŸæ¥ã® ãã¶ã€ã³ã»éçºã»ãããã°(ãã¹ã) ã®å·¥çšã«å ã㊠UXã€ãã¬ãŒã·ã§ã³ ãéèŠã«ãªãããã§ãã éçºè
ãæå³ããUXãå®çŸããŠããããããWebãã¹ããŒããã©ã³ä»¥äžã«Wearableã®éçºã«ã¯UXã«é¢ããæéã䜿ãå¿
èŠãããããã§ãã iQONã§ã Android Wear 察å¿ãããã«ã¯æ¢åæ©èœã®äžã§äœã®æ©èœãå®è£
ããã®ãæé©ã§ããã®ããèããŠã¿ãã®ã§ããã宿çã«ãŠãŒã¶ãŒã«GCMã§éã£ãŠãã以äžã®ãããªæ
å ±ã Android Wear ã«æé©ãªåœ¢ã§å¯Ÿå¿ãããšå¹æãé«ããšèããŸããã LikeããŠãããã©ã³ãã®ã¢ã€ãã è¿œå æ
å ± ã¢ã€ãã ãå²åŒã«ãªã£ãéã®ã»ãŒã«æ
å ± LikeããŠããã¢ã€ãã ã売ãåãéè¿ã®åšåº«æ
å ± åžžã«èŠãã ãªãã¯ã§ã¿ã€ã ãªãŒãªæ
å ± ãé
ä¿¡ããã®ã¯ Android Wear å¥å©ã«å°œãããšæããŸãããäœ¿ãæ¹ãšããŠã¯ééã£ãŠããªããšæããŸãã å
æ¥ Android Wear 察å¿ããã®ã«å¿
é 㪠Google Play Services ã®ããŒãžã§ã³ã¢ãããæžãŸããã®ã§ãè¿æ¥ Android Wear 察å¿ããããŒãžã§ã³ãé
ä¿¡ããäºå®ã§ãã 3. Android Wearéçºã®ã¯ããæ¹ æåŸã«ãç°¡åã«ã¯ããããã Android Wear éçºã®ã¯ããæ¹ã玹ä»ããŸãã Hello World!åºå ãŸã㯠Android Studio ãã€ã³ã¹ããŒã« ãããã㯠v0.8.0 以äžã«ã¢ããããŒãããŠãã ããïŒSDKã®æŽæ°ãå¿ããã«ïŒã https://developer.android.com/sdk/installing/studio.html New Project ãç«ã¡äžããŠã Select the form factors your app will run on ãŸã§é²ãã§ã Phone and Tablet ãš Wear ã«ãã§ã㯠ãå
¥ããŠãã ãããããšã¯ãããããšNextãæŒäžããŠãããžã§ã¯ããäœæããŠãã ããã ãããžã§ã¯ããåºæ¥äžãããš mobile wear ãšèŠæ
£ããªããã£ã¬ã¯ããªæ§æã§ãããžã§ã¯ããç«ã¡äžãããŸãã mobile ã® Configuration ãéžæã Android ã®ã¹ããŒããã©ã³ã® 宿© or ãšãã¥ã¬ãŒã¿ã«ãã«ããè¡ãã wear ã® Configuration ãéžæã Android Wear ã® å®æ© or ãšãã¥ã¬ãŒã¿ ã«ãã«ããè¡ãããšã§ãåããã€ã¹ã« Hello World! ãåºåããããšãã§ããŸãã ãµã³ãã«ã³ãŒãã§åŠã¶ SDKãããŒãžã£ãŒãã Android 4.4W ã®ããã±ãŒãžãã€ã³ã¹ããŒã«ãããšä»¥äžã®ãã¹ã«ããããªå©çšã·ãŒã³ãæ³å®ãã17åãµã³ãã«ã®ãããžã§ã¯ããã§ããŠããŸãã ããããã«ãããªããå®éã«åãããã³ãŒããèªã¿é²ããŠãããš Android Wear ã§ã©ãããããšãã§ããã®ããå¹çè¯ãåŠã¶ããšãã§ããŸãã $ /samples/android-20/wearable/ 䜵ã㊠å
¬åŒã®éçºããã¥ã¡ã³ã ãèªã¿ãªãã Android Wear ããæ°ããç»å Žããã¯ã©ã¹ãæ¢ã£ãŠã¿ããšæŽã«çè§£ãæ·±ãŸããšæããŸãã 4. ãŸãšã ãã£ãããš Android Wear ã«ã€ããŠç޹ä»ããŸããããå®éã«æã«ãšã£ãŠäœ¿ã£ãŠã¿ãªããšè¯ããããããªããšæãã®ã§èå³ã®ããæ¹ã¯çºå£²éå§ããã¹ããŒããŠã©ãããæã«å
¥ããŠã¿ãŠãã ããã æèšãçŒé¡ã¯åžžã«èº«äœã«èº«ã«ã€ããŠãããã®ãªã®ã§ãæã«åã£ãŠæäœããªããšãããªãã£ãã¹ããŒããã©ã³ã§ã¯æäŸã§ããªãã£ãæ°ããäœéšã Android Wear ã§ã¯æäŸã§ãããšæããŸãã æåŸã®æåŸã«çŸå®ã®è©±ãããŸããš Android Wear ãšé£æºã§ããã®ã¯ Android 4.3 以äžã®ç«¯æ«ã®ã¿ ã§ãã 2014幎7æ14æ¥çŸåšãäžçå
šäœã®25ïŒ
ã®ãŠãŒã¶ãŒãã察å¿OSã䜿ã£ãŠããªãã§ãããiQONã«è³ã£ãŠã¯12ïŒ
ã®ãŠãŒã¶ãŒã®ã¿ã§ãããããã Android Wear 端æ«ã賌å
¥ããŠäœ¿ããŠãŒã¶ãŒãã©ã®ãããããããèãããšããªãå°ãªããšæããŸãã Android Wear 察å¿ãæ¥ãããšã¯ãããŸããããåè¿°ã®éãã·ã³ãã«ããã«èŠããŠã广ãæå€§éã«å¯Ÿå¿ããã«ã¯ããªãé£ããå°è±¡ã§ãã ãã®ããä»ããã¹ã¿ãŒãããã·ã¥ã§éçºãé²ãããŠããŠããããã®ããã¹ãã ãšæããŸããiQONãå
é£ãåã£ãŠãŠã§ã¢ã©ãã«å¯Ÿå¿ãé²ããŠãããŸãã iQONãéçºããŠããVASILYã§ã¯å
é£ãåã£ãŠäžçã«ã€ã³ãã¯ããäžããã Androidãšã³ãžã㢠ã倧åéããŠãããŸãã ãAndroidãäžçã§åã¡ããAndroidã¢ããªãšã³ãžãã¢åé ãŸãæ
å ±äº€æãªã©ãéæè¡ã£ãŠãããããšèããŠããã®ã§å匷äŒãªã©ã®éå¬ãåå ã«ã€ããŠãæ°è»œã«çžè«é ããã°ãšæããŸãã info[at]vasily.jp ã @yoichinishimura ãªã©ã§æ°è»œã«é£çµ¡ããã ããã°ãšæããŸãã
 VASILYæ°å
¥ããšã³ãžãã¢ã®Ericãšç³ããŸãã ãã£ã©ãã«ãã£ã¢ããæ¥ãŸããã奜ããªæŒ«ç»ã¯HUNTER x HUNTERã§ãã ä»åã¯äœ¿ããè±èªã³ãããã³ã¡ã³ãã10å玹ä»ããŸãã Fix, Change, Reviseãªã©ãæ¥æ¬äººã®æ¹ã«ã¯éããåããèŸããã®ããå®éã®äœ¿ãæãåããããã«ããŠã¿ãŸããã æ¯éç¥ã£ãŠã䜿ã£ãŠã¿ãŠãã ããïŒ 1. Fix æå³: çŽã, ä¿®çãã äœ¿ãæ¹: ãã°ãªã©ãåºãããã³ãŒããæžãçŽãå¿
èŠãããå Žåã«äœ¿ããŸããäœãåé¡ãçŽããŠãæ£ç¢ºãªæäœã«æ»ããã¥ã¢ã³ã¹ã匷ãã§ãã äŸ: ãFix inequality in LinesComponent èš³:ã LinesComponentã«ãããäžçåŒãæžãçŽã 2. Revise æå³:Â å€æŽãããä¿®æ£ãã äœ¿ãæ¹: ãã°ã¯åºãŠããŸããããäžååãªãšãããä¿®çãå¿
èŠãšãããšããããã£ãŠãã³ãŒããããããããæã«äœ¿ãããšãå€ããèãçŽããŠãæ¹åãããšãããã¥ã¢ã³ã¹ãæã£ãŠããŸãã äŸ: ãRevise User class variable types èš³:ã Userã¯ã©ã¹ã«ãããŠãã倿°ã®çš®é¡ãä¿®æ£ãã 3. Change æå³: 倿Žãå€ãã äœ¿ãæ¹: åãã£ãŠããç¶æ
ãå€ãããšãããã¥ã¢ã³ã¹ã匷ããããå€ãæã£ãŠãã倿°ã«å¥ã®å€ãã€ããããã¯ã©ã¹ãªã©ã®é ãã倿Žãããããæã«è¯ã䜿ããŸãã äŸ:ã Change var names for consistency èš³:ã äžè²«æ§ã®ããã«å€æ°åãæŽæ°ãã 4. Update æå³: æŽæ°ãããæ°ãããã äœ¿ãæ¹: ææ°ã®æ
å ±ãªã©ã«å¯Ÿå¿ããããã«ã³ãŒããããã¥ã¡ã³ãã倿Žããæã«ãã䜿ããŸããæè¿å€åããå¥ã®ãã®ã«ããããããšãããã¥ã¢ã³ã¹ãå
¥ã£ãŠããŸãã äŸ: ãUpdate documentation to show new methods èš³:ã ããã¥ã¡ã³ããæ°ããã¡ãœãããåæ ããããã«ã¢ããããŒããã 5. Upgrade æå³: æŽæ°ãããæ¹åãã äœ¿ãæ¹: ãããžã§ã¯ããªã©ã®éšåãã©ã€ãã©ãªãŒã®ããŒãžã§ã³ãæŽæ°ããæã«ãã䜿ããŸããUpdateãšã®éãã¯åŸ®åŠã§ãããããŒãžã§ã³çªå·ãªã©ãå€ããæã«äœ¿ãããšãå€ãã§ãã äŸ: ãUpgrade to markdown-preview@0.74 èš³:ã `markdown-preview`ãããŒãžã§ã³0.74ã«æŽæ°ãã 6. Clean up æå³: çä»ãããå¥éºã«ãã äœ¿ãæ¹: åããã«ããã£ãããç¡é§ããã£ãããããšãããçä»ããŠãåãããããããæã«äœ¿ãããšãå€ãã§ãã äŸ: ãClean up specs based on feedback. èš³:ã ãã£ãŒãããã¯ã«åŸã£ãŠã¹ããã¯ãçä»ãã 7. Remove æå³: åé€ãããåãé€ããé€å»ãã äœ¿ãæ¹: 以åã³ãŒãã«å
¥ã£ãŠãããã®ãåãé€ãæã«äœ¿ããŸãã äŸ: remove decoratorType instance var ã`decoratorType`ãšããã€ã³ã¹ã¿ã³ã¹å€æ°ãåé€ãã 8. Revert æå³: åãæ¶ããå
ã«æ»ã äœ¿ãæ¹: ãããžã§ã¯ããªã©ãå
ã®ç¶æ
ã«æ»ãæã«äœ¿ããŸãã äŸ: ãRevert to version 1.0.9 èš³:ã ããŒãžã§ã³1.09ã«æ»ã 9. Add æå³: 远å ãããå ãã äœ¿ãæ¹: ä»ãŸã§ãªãã£ããã®ã远å ããæã«ãã䜿ããŸãã äŸ: ãAdd `has-selection` class to the editor div èš³:ã`editor`ãdiv ã«`has-selection`ãšããã¯ã©ã¹ã远å ãã 10. Implement æå³: å®è£
ãã äœ¿ãæ¹: ãã远å ãããæ©èœããã£ãŒãã£ãŒããã£ãŠãå®éã«ã³ãŒããæžããŠãããžã§ã¯ãã«å
¥ããæã«äœ¿ããŸãã äŸ: ãImplement removeDecorations class èš³:ã `removeDecorations`ãšããã¯ã©ã¹ãå®è£
ãã  è±èªã§ã³ãããã³ã¡ã³ããæžãããšãgithubãªã©ã§äžçäžã®ãããžã§ã¯ãã«åå ããŠå€ãã®ãšã³ãžãã¢ãšäžç·ã«ä»äºãã§ããã®ã§åºæ¿çã§ãã ææŠããŠã¿ãŠãã ããïŒ Â VASILY iOSãšã³ãžãã¢ã«ããApple WWDCå ±åäŒãéå¬ããŸãïŒ ã»æ¥æïŒ6æ27æ¥ïŒéïŒ20:00ã22:00 ïŒ20:00ã21:00 Apple WWDCå ±åäŒã21:00ã22:00 ãªãã£ã¹ã§æèŠªäŒïŒ ã»å ŽæïŒæ±äº¬éœæžè°·åºæµæ¯å¯¿3-42-13 1F ããããæ ªåŒäŒç€ŸVASILYïŒ http://bit.ly/1mQQMDs ïŒ ã»åå è²»ïŒç¡æ ã»å®å¡ïŒ15å â»ãåå ã¯åŠçã瀟äŒäººåãã Apple Developer Programs ã«å å
¥ããŠããã£ãããæ¹ã®ã¿ãšãããŠé ããŸãã â»å®å¡å¶ã®ãããå¿åè
倿°ã®å Žåã¯æœéžãšãããŠããã ããŸãããæåŸ
ããæ¹ã®ã¿ 6/20(é)ã«ã¡ãŒã«ã«ãŠãé£çµ¡ããããŸãã VASILY iOSãšã³ãžãã¢ã«ããApple WWDCå ±åäŒã®ãç³ã蟌ã¿ã¯ ãã¡ã ãã
VASILY iOSãšã³ãžãã¢ã®åºåžã§ãã åããiOSãšã³ãžãã¢èäºãšããŒã å
šå¡(2å)ã§ãµã³ãã©ã³ã·ã¹ã³ã§éå¬äžã®WWDCã«æ¥ãŠããŸãã ä»åã®Keynoteã¯æ¢ã«ãåç¥ã®éãããOS X YosemiteãããiOS 8ããæ°èšèªãSwiftããªã©çãã ãããã®å
容ã§ããã Swiftã¯RubyãšäŒŒããããªèšæ³ãããã Rubyã䜿ã£ãŠããäŒç€Ÿ ã®äžå¡ãšããŠã¯ãšã£ã€ãããããŠããæãã§ãã ããŠãWWDCã®é嬿éã¯5æ¥éãããŸããã倧ããå ±éãããŠããKeynote以å€ã«ã ããããã®ã»ãã·ã§ã³ ãéãããŠããŸãã ãã®ã»ãã·ã§ã³ã®æ§å㯠WWDC2014ã®å
¬åŒãµã€ã ã§èŠãããšãã§ããŸãã Keynoteãã»ãã·ã§ã³ãçŸå°ã«è¡ããã«èŠããã®ã«ããªãé«ãåå è²»ãæã£ãŠçŸå°ã«æ¥ãã®ã§ããããã ä»åã¯ãçŸå°ã«æ¥ãã¹ãçç±ããããã€ã玹ä»ããŸãã WWDCã®çŸå°ã«æ¥ãã¹ãçç± 1. Labs WWDCã®äŒå Žã«ã¯Appleã®ãšã³ãžãã¢ãçŽæ¥æè¡çãªçžè«ã«ä¹ã£ãŠãããããŒã¹ããããŸãã(åºæ¬çã«è±èªãäžé𿥿¬èªã®ããããšã³ãžãã¢ãããããã§ã) æ¥æ¬ã«ãããšAppleã®ãšã³ãžãã¢ãšè©±ãæ©äŒã¯ãªããªããããŸãããè±èªã«èªä¿¡ããªããŠãã³ãŒãã§ãªãäŒè©±ãã§ããŸãã åéãå®éã«Labã«è¡ã£ãŠã¿ãŸãããè±èªãèŠæã§ãäžäººã²ãšãã«çè§£ã§ãããŸã§äžå¯§ã«æããŠãããŠãæ±ããŠããåé¡ã解決ããŸããã  2. Bash WWDCæéäžã®äžéãã®ã»ãã·ã§ã³ãçµãã£ãåŸãäŒå Žã®é£ã®å
¬åã§WWDCåå è
ãäžåã«äŒããBash(æã¡äžã)ãéå¬ãããŸãã å»å¹Žã¯ããã§ããããªã«æ¥æ¬äººæ¥ãŠãã®ãããšããããããå€ãã®æ¥æ¬äººãšã³ãžãã¢ãšè©±ãããšãã§ããŠãåž°åœåŸã亀æµãç¶ããŠããŸãã æ¯å¹Žæåãªã¢ãŒãã£ã¹ããæåŸ
ãããŠãããäŒæ¥ã®ãç¥ã®åãè¶
ããçãäžãããèŠããŸãã 3. Stump the Experts æ¯å¹ŽWWDCæéäžã«éå¬ãããã€ãã³ãã§ãã¹ããŒãžäžã®Appleãšã³ãžãã¢vs芳客ã®ãšã³ãžãã¢ã®ã¯ã€ãºå€§äŒã§ãã ã¯ã€ãºã®åé¡ã¯Appleã«é¢ããè¶
ããã¢ãã¯ãªãã®(äŸ: ç²ã
ã«ãªã£ããã©ã¹ããã¯çãèŠããŠãããã¯äœå¹Žã®macã®ã©ã®ããŒã?)ãå€ããåãªããã¯ãã£ã±ãçããããããŸããã KeynoteãšåãäŒå Žã§åžã¯ååã»ã©ããåãŸã£ãŠããŸããã§ããããKeynote以äžã®æå£°ãšç±æ°ããããŸããã 4. çŸå°ã§éå¬ãããŠããã€ãã³ãã«åå AltConf WWDCã®ãã±ããã®æœéžã«å€ããŠããŸã£ããšã³ãžãã¢éãæå¿ã§éå¬ããŠããã€ãã³ãã§ããWWDCæéäžãäŒå Žã®è¿ãã§éå¬ãããŠããŸãã åãèŠã«è¡ã£ãæã¯ããã«ãªã³ããæ¥ããšã³ãžãã¢ãXcode Pluginã«ã€ããŠèªã£ãŠããŸããã åœç¶WWDCã®ããã«ææ°æè¡ã«ã€ããŠã¯è§ŠããããŸãããããã¶ã€ã³é¢é£ã®ã»ãã·ã§ã³ãããŒã±ãã£ã³ã°é¢é£ã®ã»ãã·ã§ã³ããããWWDCã®ãã±ãããæã£ãŠããŠãè¡ã£ãŠã¿ã䟡å€ã¯ãããšæããŸãã ããŸãã«ãç¡æãªã®ã«Tã·ã£ããŸã§ããããŸããã AppAdviceã®ããŒãã£ãŒ WWDCéå¬ã®åæ¥ãäŒå Žã®è¿ãã§AppAdviceãšããã¢ã¡ãªã«ã®ã¬ãã¥ãŒã¢ããªã®ã¡ã³ããŒãäž»å¬ããããŒãã£ãŒã«è¡ã£ãŠããŸããã æ¥æ¬äººã¯åéã ãã§ããããWWDCã®ãžã£ã±ãããçããšã³ãžãã¢ãããããããã®ã§ãç©æ¥µçã«äº€æµããŠããŸããã ãäºãã«èªèº«ã®ã¢ããªã玹ä»ãåãããšã³ãžãã¢å士貎éãªæ
å ±äº€æãåºæ¥ãå Žã§ãã£ããšæããŸãã ããŒãã£ãŒã®è¶£æšã¯ããããããŸããã§ããããiQONã®å®£äŒãå¿ããã«ããŠããŸããã ãããã£ãã€ãã³ãã¯ãã®ææãããã£ãŠããããã§ãã 5. çŸå°ã®äŒæ¥ã«è¡ã ç¥äººã®ç޹ä»ã§Yahoo! inc.ã§ãYahoo! News Digestãã®PMãæ
åœããŠããæ¹ãšãç¥ãåãã«ãªããŸããã WWDCãèœã¡çããåŸãYahoo! Inc.ã®ãªãã£ã¹ã«ãéªéããŠããäºå®ã§ãã 6. ãšã«ãã話ãããã æ£çŽãªãšããåã¯è±èªãèŠæã§ããè±èªã ãšäŒè©±ã®ãã£ããããŒã«ãããŸãã§ããŸããããèªåããããŒã«ãæãå§ããããšã¯ã§ããŸãã ã»ãã·ã§ã³ã«äžŠã¶è¡åäžã«è©±ããããããé£ã®åžã«åº§ã£ã人ã®macãèŠãããã§è©±ããããã⊠ãã®è¡åã®ãããã§å»å¹Žãã£ãå€åœäººãšçŸå°ã§åäŒããããšãã§ããŸããã 7. 話ãããããã åçã«ããããã«VASILYã®ã¡ã³ããŒã«åããçç©ãçãŠè¡ããŸãããã广æçŸ€ã§ããã ã¿ããªãç¬é¡ã§ãã£ã¡ãèŠãŠãããããå€ãã®ãšã³ãžãã¢ã«å£°ããããããŸããã話ããããŠããã人ã®äžã«ã¯ãOh, Jedi...ããšãªãïŒã¯ã³ã»ã±ããŒããšåéãããŠãã人ãããŸããã ãã£ã€ããã¬ã¹ã®ãšã³ãžãã¢ããããåã話ããããããªãã®ã§åãå¿çã ãšæããŸãã ãŸãšã 5. ã«ã€ããŠã¯ãããŸããŸãã人ã玹ä»ããŠããã ããã®ã§ã©ãããŒã ã£ããšã¯æããŸããããã以å€ã®ããšã¯ãã±ããã賌å
¥ã§ããã°èªåã®åªåã§ã©ãã«ããªããŸãã ãŸãæ¥å¹ŽWWDCåå ãçã£ãŠããæ¹ã¯å
šåã§æ¥œããããã«ãä»å玹ä»ããå
容ã詊ããŠã¿ãŠã¯ãããã§ããããïŒ æãããæœéžã«ãããŠããŸã£ãæ¹ã¯ãçŸå°ã«è¡ã£ãæ¹ãã話ãèããšäœãããçºèŠããããããããŸããã ãããã« ãã®èšäºãèªãã§æ¥å¹Žããã¯WWDCã«è¡ã£ãŠã¿ãããšæã£ãããªããäžç·ã«iOSã¢ããªãéçºããŠWWDCã«è¡ã£ãŠã¿ãŸããã? (ãã¡ãããã±ãããåããã°ã®è©±ã§ãã) WWDCä»èŸŒã¿ã®ã¡ã³ããŒãšNo.1ã®ã¢ããªãäœãiOSãšã³ãžãã¢åé Â
 ãŸã€ããšããã²ããããåŒç€Ÿã®æè¡é¡§åã«å°±ä»»ããäºãšãªããŸããããã£ãããªã®ã§ãããã³ãã£ãŒã®éèŠæ§ããäžçã§ã®åã¡æ¹ããsierã®ã€ããããã¢ã«ã¢ã³æãšãšã³ãžãã¢ãªã³ã°ããªã©ããŸã€ããšããã«è²ã
èãããã£ãäºãã¶ã€ããŠã¿ãŸããïŒ Â vasily officeã«ãŠ è³ªå æã
ã¯ãå°ããäŒç€Ÿãªãããæè¡ã«ãã£ãŠäžã®äžã«ã€ã³ãã¯ããäžããããšé 匵ã£ãŠããŸãã ä»ã«ããããã£ãäŒç€Ÿãå¢ããŠããŸãããæãæãªã©æããŠãã ããã ãŸã€ããš ãã®éã¯å€§äŒæ¥ãšãã ãã©ãé¢ãã£ãŠãã人ãå€ããªãã°ãªãã»ã©ãèŸããªããŸãããã åã¯ããžãã¹ãã³ãããªãã®ã§ããšã³ãžãã¢ã幞ããã©ããããåãããªããã©ãèªåã§æ±ºããããªããšã³ãžãã¢ã¯äžå¹žãªãã§ãããã ãã®æè¡ã®æ¹ã絶察ããã®ã«ããäžåžã説åŸã§ããªãããåŸæ¥ã®ããæ¹ã§é 匵ããŸããããã¿ãããªç©ºæ°ã§è
ããªããããã®ã¯ããšã³ãžãã¢ã«ãšã£ãŠã¯äžå¹žãªãã§ãããã å°ããªãšãã ãšèªåã§äœããããæ±ºãããããããªãã§ãããããã¯ãšã³ãžãã¢ã«ãšã£ãŠã¯å¹žããªããšã ãšã ããšã¯ããããã®ã¹ããŒãæãç¶æããã£ãŠããã®ã¯ããããå°ããªçµç¹ã§ãªããã°ã§ããªãã ãå€§äŒæ¥ããããŸããããžãã¹ããããŸããå€§äŒæ¥ããã®ã·ã¹ãã ãæ¬²ããããçºæ³šããŸãããã¿ãããªæ§å³ã¯ããããªããªã£ãŠããããªãšã ãã¯ãããžãŒãæ
ãã®ã¯åãã®éãå°ããªçµç¹ãããªãããããªãããªããšæããŸããã è³ªå æã
ã¯ãã¯ãããžãŒãè¶³ãããã«ããŠäžçãšæŠãããšããŠããŸãã rubyã¯äžçé²åºã«æåãããããã¯ãã ãšæããŸããããã®çµéšãèžãŸããŠæåããã®ã«å¿
èŠãªäºã¯äœã ãšèããŸããïŒ ãŸã€ããš ãªãã§ã人éãçžæãªã®ã§ã人æ°ãåºããšãåºã䜿ããããšãã¯äººã決ãããäžäººäžäººããµã€ãã ã£ãããµãŒãã¹ã ã£ããããããã¯èšèªã ã£ãããéžã¶äºã«ãã£ãŠæ±ºãŸãããã§ãããã ãããéžã¶ãã©ããã£ãŠããã®ã¯ã奜ããã©ãããšãã䟿å©ãã©ããã§ãããã£ãŠæåã«äŸåããã rubyã®å Žåã¯ããã°ã©ããŒã®ãã€ã³ããšããããã«ãŒæåã¿ãããªãã®ã«å¯ãæ·»ã£ãŠãããã«æé©åããŠããŠããããç¹å®ã®åœã«äŸåããŠãªããã®ã ã£ãã®ã§ãäžæãè¡ã£ããšã çŸç¶ãæ¬åœã«äžçèŠæš¡ã§äœããããã«ã¯ãåœã«äŸåããªãå
±éãªäœãã®æåãèŠã€ãåºããŠãããã«æé©åããªããšé£ããããããªãããšæããŸããã iqonã¯æåããããã«æ¥æ¬ã®æåã»ãã¡ãã·ã§ã³ã®ææ³ã«ãããã£ãŠããããã§ããããããæµ·å€ã«æã£ãŠããããã«ã¯ããã®æ¥æ¬ãžã®æé©åãã®ãã®ãé害ã«ãªãå¯èœæ§ãåºãŠããŸãããã ãããã¯ããã®æ¥æ¬ã®ãã¡ãã·ã§ã³ãšããæåããšäžçå
±éèªãç®æããšããã®ãããããªããã©ã 質å ãšã³ãžãã¢ãããã°ã©ããŒã®å¹žãã£ãŠäœã ãšæããŸããã ãŸã€ããš æºè¶³ããŠãããã©ããã£ãŠããšããªã èªåã®åŸ
éã ã£ããå¢éã ã£ããã«å¯ŸããŠãæºè¶³ããŠãããã©ããã£ãŠããã®ã¯äžçªå€§äºã ãšæã£ãŠããŠãããã°ã©ããŒãšããŠæºè¶³ãªã®ã¯äœã£ãŠãããšã äžã€ã¯é¢çœããã®ãäœã£ãŠãããã©ããã ãã¯ãã«ã«ããšããµã€ãã§ãããã ãããã¡ããåå
¥ãããã ããå¿ãããã©ããããæéã®äœ¿ãæ¹ã ãšãã ããšã¯èªç±ãšãè£éã èªåãã»ããšãã«çŽ æŽããããæ£ãããšæãäºãèããŠãããããã説åŸã§ããäœå°ããããã©ããã ãšã³ãžãã¢ãäœãèšã£ãŠãé§ç®ã ã£ãŠè«ŠããŠãããšãããã¯éãã ããã¿ãããªã ã§ãæåŸã«ããã«ç¹ãããã®ã£ãŠããã®ã¯ãèªåããšã³ãžãã¢ãšããŠãæè¡ãæã£ãŠãã人ãšããŠããã¯ãããžãŒã䜿ã£ããã¯ãŒãæã£ãŠãã人ãšããŠãªã¹ãã¯ããããŠãããã ããåã®æã£ãŠããæè¡ã ã£ãã俺ã®ããããäºãã§ãããããããªããäžç·ã«ãã£ãŠãããªãããã£ãŠèšããããããªã¹ãã¯ããããŠããæ°ã«ãªããããªãã§ããããããããšãããåãåºãŠããã éã«ããåãã©ãæã£ãŠãããé¢ä¿ãªãã俺ã®èšã£ãç©äœããã£ãŠããã®ã¯ãªã¹ãã¯ããããªãããã§ãããã 質å ãªã¹ãã¯ããããŠããªãç¶æ
ã®äººéããããšæããŸããããããã人ã¯ã©ããããè¯ãã§ãããïŒ ãŸã€ããš ãããã ãããææ
¢ãã人ãå€ããŠãæ¯æ°ããããæªãã®ã¯ç¶ããŠããŠãããã«ããªããšåã¯ããŒãã«ãªã£ãŠããŸããããããªãã£ãŠããæææã¯ãããšæããã ãã©ããã®ãªã¹ãã¯ãããªã人ã«å¯ŸããŠå¥ä»ãã¡ãããšãã©ãã©ãç«å Žãäžãã£ãŠããã æçµçã«ã¯å¥Žé·ã«ãªã£ã¡ãããit奎é·ã«ã ããã¯ãã¡ã ãšæãã®ã§ãã©ããããã£ãŠãããšãæããããããæã¯åä¹±ãèµ·ããããããããšã³ãžãã¢ããªã¹ãã¯ãããªãé£äžã¯èŠæšãŠãã£ãŠããã ã©ãããšã³ãžãã¢ãããªãããã·ã¹ãã äœããªããã ããã ããããã®ãã¿ããªã§ãã£ãŠãæè¡è
ã倧åã«ããªããšèªåã®äºæ¥ã¯ç«ã¡ãããªãã£ãŠããç¶æ
ã«è¿œã蟌ãŸãªããšãè¯ããªããªããšæããã§ããã äŸãã°ãéå±±ãããããã¡ãã·ã§ã³çã«å€é©ãèµ·ãããããitã¯åãªãéå
·ããšããæ
床ã§ããã°vasilyãšå
±æã§ããªãã£ããšæããŸãã ããããå®éã«ã¯éå±±ãããéã¯ãšã³ãžãã¢ã§ãããã¯ãããžãŒãäžã®äžãå€ããããšãã§ãããæã
ã®ãã£ãŒã«ãã¯ãã¡ãã·ã§ã³ã ããšãããã¯ãããžãŒããªãã³ãªçºæ³ã ã£ãã®ã§ããããªããæäŒãã§ãããªãšæããŸããã 質å ã¡ãªã¿ã«ããããããäŒç€Ÿã¯æ°ãã€ããæ¹ãè¯ããã£ãŠããç©ã¯ãããŸããïŒ ãŸã€ããš ãsiãã£ãŠããåèªã䜿çšãããŠããäŒç€Ÿã¯8å²9å²ãã¡ã siã®ãã客æ§ã®çºã«ã·ã¹ãã ãäœãã£ãŠããæ§é ããwin-winã«ãªãã«ããã 顧客ã¯åºæ¥ãã ãå®ããåºæ¥ãã ãè¯ãç©ãäœã£ãŠããããããäœãæ¹ã¯åºæ¥ãã ãå°ãªãä»äºã§åºæ¥ãã ãæ²¢å±±ãéãè²°ããããäžç·ã®æ¹åãåããŠããªããã§ããã äœãæ¹ãæåã«äœããŸãã£ãŠèšã£ã仿§ãæºããæäœã©ã€ã³åºãã°è¯ããŠãçŽããŠããŸãã°çµããã§ãã客æ§ãæåããããªããŠé¢ä¿ãªããã§ãããã ã»ãšãã©ã®äŒç€Ÿã¯ã·ã¹ãã ã売ã£ãŠã¯ããªããã鿥éšéãªã®ã§ã³ã¹ãéšéãªãã§ããã 瀟å
ã§ãåãåãã£ãŠèšãããŠããŠãã¡ãã£ãšã§ãå®ãããªããšã£ãŠç©ãªã®ã§è²·ãå©ãããã®ã§ããã©ãããã ãšãšã³ãžãã¢ã¯å¹žãã«ãªããŸããããã ææªã®ããžãã¹æ§å³ã§ãã ãªã®ã§ãsiã¯ããèŠæšãŠããããªãããªãšã ã·ã¹ãã ã€ã³ãã°ã¬ãŒã·ã§ã³ã£ãŠããæ¥çš®ã壿»
ãããããã¡ãã£ãšãã·ã«ãªãããããªãããªã å€§äŒæ¥ã«ããŠèŠããã§ãã人ã«ã¯ãèŸãããããããããªããã£ãŠæ¯åèšã£ãŠãããã§ããã©ããã£ã±æããã§ãããããªãŒã©ã³ã¹ã«ãªããšãå°ããªäŒç€Ÿã«è¡ããšãã¯ã å¿ççãªéå£ã倧ãããã§ããããé 匵ã£ãŠå€§äŒæ¥ã«å
¥ããŸããããããèŸããããŸããããšã å¿ççãªéå£ã«çããŠãsiã¿ãããªå¹žãã«ãªããªãæ§é ãç¶æããŠããã®ã¯ã©ãããšããã®ã¯ãããŸããã 質å ãŸã€ããšããã¯ã¢ã«ã¢ã³æã®å®£æåž«ã ã£ãã®ã§ããããããããã°ã©ãã³ã°ããšã³ãžãã¢ãªã³ã°ã«äžããŠãã圱é¿ã£ãŠããã®ã§ããããïŒ ãŸã€ããš çžå¯Ÿåã§ããªãã®ã§ãåãæ¡ä»¶ã§ããããçµéšã®ãªãç§ãšä»ã®ç§ãšã¯æ¯ã¹ãããªãã®ã§ããªããªãé£ããã§ããã 倧åŠçã®æã«2幎é宣æåž«ãšããŠå¥ä»ãããã§ããã©ã人ãšåããããã話ããããã§ããäœäžäººãšã ãã®æå²ãšäººéãèŠããã§ãããããããã®ã圹ã«ç«ã£ãŠãããããããªããªãšæãæã¯ãããŸããã itã£ãŠãã¯ãããžãŒãªãã ãã©ãæåŸã®ãã¡ã¯ã¿ãŒã¯äººéãªãã§ãããã ãã¯ãããžãŒçã«ã¯ãã¬ãŒããªããæäŸã§ããããã®ããªã¥ãŒã ããã£ã¡ã«ããããšãããªã£ãŠããã£ã¡ãããããšãããªã£ãŠã£ãŠããã®ã¯ã§ãããã©ããããããã®ãã¬ãŒããªãã®ããªã¥ãŒã ãããããŸãã£ãŠããã®ã¯äººéãæ±ºãããã§ããã 絶察çãªççã¯ãªããŠã100人ã100人çŽåŸããæèŠã£ãŠããã®ã¯ãªãã®ã§ããã¯ãããžãŒã人éã«åãããéšåã倧äºãªãã§ããã ããã¯å€ãã®äººãšè©±ãããã®ã圹ã«ç«ã£ãŠãããããããªãã§ããã ããšã¯2人1çµã§æŽ»åããäºãå€ããŠãã ãããåã®çžæ£ã¯ã¢ã¡ãªã«äººãšãå€äººãå€ãã£ãã®ã§ãè±èªã䜿ã£ãŠããŸãããã ä»ãåãè±èªãåã£ãŠããã®ãåºç€ã¿ãããªã®ã¯ããã§ã§ãããšæããŸããã ãã®2ã€ã¯åœ±é¿ããã£ãããããªãããšã 質å ãã£ãããšãã質åã§æçž®ã§ãããããã°ã©ãã³ã°ã®å°æ¥ã£ãŠã©ããªãã®ããã䌺ããããã§ãã ãŸã€ããš è¿ãæªæ¥ã ãšããœãããŠã§ã¢ã®èŠæš¡ã¯ã©ãã©ãå°ãããªãããããªãããªãå°ããã®ãããããäœãã¿ãããªæãã«ãªãããããªãããšæããŸãã ããã¯äœããšãããšããã¬ãŒã ã¯ãŒã¯ã§ãããšããã©ã€ãã©ãªã§ãããšããå
å®ããŠããŠããããçµã¿åãããã ãã§äžéãã®äºãã§ãããšããã ãã®æã«rubyã¿ãããªèšèªã£ãŠã®ã¯ã¯ã©ã¹ã©ã€ãã©ãªãšããæäŸããŠãã£ãŠãããã°ã©ããŒã¯ã¹ã³ã¢ãªã³ã°ã®èª¿æŽãapiåã蟌ãã°è¯ãã ãã¿ããã«ãªã£ãŠã ã¿ãŒã³ã¢ã©ãŠã³ãã¿ã€ã ãã ãã ãçããªã£ãŠããããããªãããšæããŸãã é ãæªæ¥ã ãšãã³ã³ãã¥ãŒã¿ã人éã®èšèãçè§£ããŠã人éã«å€ãã£ãŠã³ã³ãã¥ãŒã¿ãèšç®ããŠãããŠãšããããæãã«ããžã¥ã¢ã©ã€ãºãŸã§ããŠåºããŠããããšãã£ãŠããæãã«ãªããšæããã§ããã©ã ãããããšããã°ã©ãã³ã°ã®æ¥œãã¿ããªããªããã ãã©ãåã¯ã¡ãã£ãšãããããã«ãªã£ãŠãããã°ã©ãã³ã°ããŠããŠãããããã¡ããããŸã幎å¯ãã®è¶£å³ãã£ãŠããããšãããããäœå幎åã®ããæ¹ãªãã ããããã£ãŠããã®ãããã°ã©ã ãããªããèšãããŠãããªæ°ãããŸãã ä»ã§ãçŸå®ã«æ®éã®äººã¯ããããªäºãæ¢ãããå
ã«googleããŸãããã ãããã©ãã©ãèªç¶èšèªã«è¿ã¥ããŠãã£ãŠããäœããç¥ãããããšããããšãä»ã§ãæ®éã«æç« ãæã¡èŸŒãäººçµæ§ãããã ãã©ãé©åœã«åºãŠããŠçšãæžããããã¿ãããªããããã©ãã©ãé²ãã§ããããããªãããªã ããšã¯ããã³ãã¯siriã¿ããã«ãªã£ãŠãã©ãã©ãèªç¶ã«ã 質å ãã®ä»çµã¿ãäœãåŽã«ã人ã¯ãããã§ãããã ãŸã€ããš ãã¡ãããåœé¢ã¯ããŸããã ã§ãããããã©ã£ãããèªååãããŠãã³ã³ãã¥ãŒã¿ã®ç¥èœãååé«ãŸã£ãŠãããšãèããã ãã§èšèãçè§£ããŠãæã£ãŠããæ
å ±ããããã£ãœãã®ãäœãåºããŠããããããªæ°ãããŸããã©ãã ããããã°ã©ããŒã®ä»äºã¯2極åããŠãã¢ã«ãããã¯ãªæå
端ã®ããšããã®ãšãæ¬åœã«ç°¡åãªäºãããã®ãšã åå¥ã®ããŒãºã«åãããŠãããã®æ¥çš®ã ããããããçµã¿åãããããããšããã®ããããšã³ãžãã¢ã¯åœé¢ã¯ãããšæããŸãã ã§ãããã¯èª°ã§ãåºæ¥ã¡ãããã§ãäœãå·®å¥åãããã£ãŠãããšããã¯ããŒãã€ã³ãã§ããã ãŸã€ããšããã²ãæ°ãå²ã㧠以äžãåœæ¥è©±ããå
容ã®ããäžéšã§ãã玹ä»ããããŸããã ä»ã«ããšã³ãžãã¢å士ã§èšèªãä»äºããããžã¡ã³ãã«ã€ããŠãªã©ãèžã¿èŸŒãã 話ã§çãäžãããŸããã vasilyã§ã¯ãäžç·ã«åç£ç¢ç£šã§ãããšã³ãžãã¢ã®ä»²éãæ¢ããŠããŸãã ãŸã€ããšãããè¿ããvasilyã¯ãšã³ãžãã¢ã«ãšã£ãŠããã«æé·ã§ããç°å¢ã«ãªããŸããã®ã§ããèå³ããæ¹ã¯æ¯éæ¯éâãã¡ããŸã§ïŒ äžçãå€ããããšã³ãžãã¢åé
VASILYã®iOSãšã³ãžãã¢ã¯ä»å¹ŽãWWDCãžåå ããŠããŸãã åæã«ãWWDCãžåå ããäžçååœã®ãšã³ãžãã¢ãã¡ãšã®äº€æµãæ·±ããŠããŸãã åæã§æ¥ãŠããŸã   WordPressã®ãšã³ãžãã¢ãš  ãã®ãããç±æ°ã§ã  iOSãšã³ãžãã¢ãšããŠããŠããŠãä»åŸã®ååãåŠã¶ã ãã§ãªããæåãéãªã©ãè²ã
ãåç£ãæã£ãŠåž°ã£ãŠããäºå®ã§ãïŒ Â Â
Androidãšã³ãžãã¢ã®æç°ã§ããããŒã ã¡ã³ããŒãå¢ããŠããŠãŸããŸããã¹ãã³ãŒãã®å¿
èŠæ§ãæããŠããŸãã ãšããããšã§Androidã¢ããªã®éçºã§ãŠããããã¹ããå°å
¥ããŸããã æ«æããªãã§ãŠããããã¹ããå§ããããã®ïŒã€ã®ãã€ã³ãã玹ä»ããŠãããããšæããŸãã ãªãå§ãããïŒ ãŸãã¯ããã«ãããããªãå§ããã®ãã®çç±ãïŒã€ç޹ä»ããŸãã ãããã¯ãã®å質ãä»çµã¿ãšããŠä¿ã¡ããã£ã ã³ãŒãã¬ãã¥ãŒã¯ããŠããããããŸã§äººã®ç®ã®ç¢ºèªãšãªãæãæŒããçããŠããŸããŸããã¯ã©ã¹ãã¡ãœããåäœã§ã®å質ã¯ä»çµã¿ãšããŠæ
ä¿ããããšæããŸããã ããŒã å
ã§ã¯ã©ã¹ãã¡ãœããã®ä»æ§ã«ã€ããŠã®å
±éèªèãé«ãããã£ã ãã®ã³ãŒãã¯äœãåãåã£ãããšã©ãŒãšããã®ãïŒãã¹ãã³ãŒããæžãã°ãããããããªããšæããŸããèªåã®ããã«ãããŒã ã¡ã€ãã®ããã«ããªããšæããŸãã 仿§å€æŽã«ãããã°çºçã®åé¿ ããããã®æ©èœããã€ã¹ããŒãã§éçºãæ¹åã廿¢ãªã©ããŠãããã¡ã«ã¡ãã£ãšããã³ãŒãã®å€æŽãæãã¬ãã°ãçãããšããããŸãã äºããã¹ããæžãããŠããã°ã³ãŒãã埮åŠã«å€ããŠãç°å€ã«ããæ°ãã€ãããšæããŸãã ãã®ããã«å§ããçç±ã¯çµæ§ããããããªçç±ã§ããã ããã§ã¯æ¬é¡ã«å
¥ã£ãŠãããŸããæ«æããªãããã«ãŠããããã¹ããå§ããããã®ïŒã€ã®ãã€ã³ãã玹ä»ããŠãããŸãã 1.çŸç¶åæ&ã·ã³ãã«ãªå°å
¥ 2.èªåã®ã³ãŒãã¯å®ç§ãããªããšçã 3.ã¡ãªãããæç¢ºã«çŽåŸãã çŸç¶åæ&ã·ã³ãã«ãªå°å
¥ å§ããã«ããã£ãŠã¢ããªã±ãŒã·ã§ã³ã®ã©ã®éšåããå§ããããæ±ºããã®ã¯å€§äºã§ãã ã©ãããå§ãããããã£ããçµã£ãŠåªå
ä»ããããŠããããšã§è¿·ããã«ãŠããããã¹ããå°å
¥ããããšãã§ããŸãã iQONã§ã¯ã¯ã©ã¹åäœã§ãã£ããã©ããã圹å²ãããã®ããææ¡ããããšããå§ããŸããã iQONã®Androidã¢ããªã®ã¯ã©ã¹æ° Activityã¯ã©ã¹ã®æ°:73 Fragmentã¯ã©ã¹ã®æ°:32 Adapterã¯ã©ã¹ã®æ°:15 Viewé¢é£ã®å
±éã¯ã©ã¹æ°:30 ã¢ãã«ãªã©ã®ããŒã¿åŠçç³»ã®ã¯ã©ã¹æ°:45 iQONã®æ©èœã®ã»ãšãã©ã¯ããã¯ãšã³ãã®APIãµãŒã+ç»åãµãŒããšhttpéä¿¡ãããããšã§å®çŸããŠããŸãã ãã®åŠçãæ
åœããã®ã1çªäžã®ããŒã¿åŠçç³»ã®ã¯ã©ã¹(45ã¯ã©ã¹)ã«ãªããŸãã ãŠãŒã¶ããèŠãã«ããåŠçã¯ãŠããããã¹ãã«ãã£ãŠã€ã ViewãšãActivityãšã衚é¢ã«èŠããéšåã®ãã°ã¯å®æ©ãã¹ããããšãã«äººã®ç®ã§ãæ€ç¥ã§ããŸãããããŒã¿åŠçç³»ã¯ç®èŠã§ã¯æ€åºãã«ãããæ¬åœã«ãã®æåãæ£ããã®ãæ£ç¢ºã«å€æã§ããªãããšããããŸãããããã£ãåŠçã¯ãŠããããã¹ãã§ãã°ãæ€ç¥ããã«ã¯ãã£ãŠã€ãã ãšæããŸãã åŠçã®éèŠåºŠã§åªå
ä»ã ããŒã¿åŠçé¢é£ã¯ã¢ãã¡ãŒã·ã§ã³ãªã©ã®è¡šçŸã«é¢ããåŠçã«æ¯ã¹ããšã·ãã¢ãªã®ã§ãŸãã¯ãã¹ããã¹ãã ãšæããŸããã©ããªã«ãããã¢ãã¡ãŒã·ã§ã³ã§è¡šçŸããŠãèå¿ã®åŠçãããŸãè¡ã£ãŠãªããã°æ¬æ«è»¢åã§ãã å°å
¥ã¯ç°¡åã«ãã·ã³ãã«ãªãã®ããå§ããŠãŸãã¯æåã¥ãããã ãŠããããã¹ããå§ãããšãã«ããããŸãããããªããšãæåãããã£ãŠã¯ãããŸãããæ°æã¡ã®åé¡ã§ãããæåããããããããéããŠå°å
¥ãéå§ãŸã§ã§ç²ããŠããŸã£ãŠæ«æããŠããŸãããšãããããšæããŸãããŸãã¯ç°¡åãªä»çµã¿ããå§ããŠãã¹ããããç¿æ
£ãæåãäœããŸãã å®éã«å°å
¥ãããã¹ãããŒã«ã¯ããããæ€èšããŸããããJavaã§æžãããã³ãŒãããŠããããã¹ãããã®ã«ãã£ãšãã¡ãžã£ãŒã§ã·ã³ãã«ãªJUnitãæ¡çšããŸãããåŒç€Ÿã§ã¯AndroidStudioã䜿çšããŠããã®ã§ãå®éããªãç°¡åã«å§ããããšãåºæ¥ãŸããã å
·äœçãªå°å
¥ã«ã€ããŠã¯æ¬¡å以éã®ãšã³ããªãŒã§ç޹ä»ããŠãããããšæããŸãã ãšãã3ã€ã®çç±ããJUnitã«ãããŠããããã¹ããéå§ããŸããã èªåã®ã³ãŒãã¯å®ç§ãããªããšçã ã¡ãããšåããŠãããšä¿¡ããŠããã¡ãœãããæå€ãšãŸãšãã«åããŠãªã ãã¹ãã³ãŒããæžããšãªããšå®¹èµŠãªããã©ã¡ãŒã¿ãã¡ãœããã«æããããã§ãããå€ãªå€ãæãããšæå€ãšããŸãåããŠããªãããšããããŸãã èšèšãèŠçŽãè¯ããã£ã³ã¹ ãã¹ãã³ãŒããæžãå§ãããšããããïŒãã¹ãæžãã«ããã¯ã©ã¹ããããªããšæãããšãåºãŠããŸããããã¯ãã¹ããæžãã«ããã¯ã©ã¹ãªã®ã§ã¯ãªããèšèšããããŸããããªãã¯ã©ã¹ã®å Žåãå€ããšæããŸããã¡ãã£ãšiQONã§ãã£ãå®äŸã玹ä»ããŸãã public void setJSON(JSONObject json) { try { if (!json.isNull("category")) { String category = json.getString("category"); if (2 < category.length()) { // çç¥(categoryãé©åœã«å€æŽããåŠç) this.category = category; } else { // çç¥(categoryãé©åœã«å€æŽããåŠç) this.category = category; } } else { // çç¥ } // çç¥ïŒä»ã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã«å¯ŸããåŠçããã®ããšã倿°ç¶ãïŒ } catch (JSONException e) { e.printStackTrace(); } } ããã¯ãšã³ãã®APIããè¿ã£ãŠããJSONã®ã¬ã¹ãã³ã¹ãäžã®ãããªã¡ãœããã«æž¡ããŠã ã€ã³ã¹ã¿ã³ã¹å€æ°ã®å€ãèšå®ããåŠçããããŸããã ãã®ã¡ãœããã¯300è¡è¿ãã«éãããšãŠãèŠéãã®è¯ãã³ãŒãã§ã¯ãªãã£ãã§ããæ¬æ¥ãªãsetterãå®è£
ããŠããã§å€ã®æ€èšŒãããŠãã€ã³ã¹ã¿ã³ã¹å€æ°ã«å€ãèšå®ããã®ããããšæããŸãã public void setJSON(JSONObject json) { try { if (!json.isNull("category")) { String category = json.getString("category"); setCategory(category) } else { // çç¥ } // çç¥ïŒä»ã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã«å¯ŸããåŠçããã®ããšã倿°ç¶ãïŒ } catch (JSONException e) { e.printStackTrace(); } } public void setCategory(String category) { try { if (2 < category.length()) { // çç¥(categoryãé©åœã«å€æŽããåŠç) this.category = category; } else { // çç¥(categoryãé©åœã«å€æŽããåŠç) this.category = category; } } catch (JSONException e) { e.printStackTrace(); } } ãã®ããããã°setCategoryã¡ãœããã§ããããªå€ãèšå®ããŠã€ã³ã¹ã¿ã³ã¹å€æ°ã®å€æŽã«é¢ãããã¹ãããããããã«ãªããŸãã ã¡ãã£ãšèšèšãæ¹åããã°ããã¹ããæžããããã«ãªããŸããéã«ãã¹ããæžãããšæã£ãã®ã§èšèšã®èŠçŽããã§ãããšæããŸããïŒä»åã®äŸã ãšããšããšåŠçãåãåããããšæã£ãŠããæ°æã¡ããã匷ããªããŸããïŒ ã¡ãªãããæç¢ºã« ãªããã¹ããããã®ãïŒãã®ã¡ãªãããæç¢ºã«ããŠããã¹ãã ãšæããŸãã ç§èªèº«ããã¹ããæžãã®ã«æ«æããããšããããŸããããæ«æããçç±ã®äžã€ãšããŠã¡ãªãããçŽåŸã§ããŠãªãã£ãããã ãšæããŠããŸãã èªåãªãã«çŽåŸãããã€ã³ãããã£ããäžããããšæããŸãã 1. ã³ãŒãã®å質ãããã èšãããããªããã¹ããããã°ãã®åã³ãŒãã®å質ã¯äžãããŸããããã¯ä¿å®ããã³ã¹ããäžããã¡ãªããããããŸããã 2. ãã¹ããæèãããããããªèšèšãä¿ãŠã ããããªèšèšãä¿ãŠããšããããšã¯ä¿å®ããã³ã¹ãããããªãã«äžãã£ãŠãããŸãããããã¡ãªããã§ããã 3. ãã¹ããçšæãããŠããã®ã§æãåã£ãéçºãã§ããããã«ãªã ãã¹ããçšæãããŠããã®ã§ãã¡ãã£ãšåŠçã®å
容ãå€ããŠããã¹ããæµãã°ãããããšããã¯ããã«æ€åºã§ããŸãã ãã®åŠçãå€ããããã¡ãã¡ã«åœ±é¿ãªãã ãããïŒãšéçºæã«è¿·ãæ°æã¡ãæãããããšæããŸããäžå®ãªããã¹ããæµãã°ããããã§ãã ãããã圱é¿ç¯å²ã調ã¹ããããéçºæã®ã³ã¹ããäžããããšãã§ãããã§ãããããã¡ãªãããšèšããã§ãããã 4. ãã¹ãã³ãŒãã仿§æžã«ãªã ã©ããªå€ãåãåã£ãŠãã©ããªå Žåã«ãšã©ãŒãè¿ãããã¿ãããªä»æ§ã¯ãã¹ãã³ãŒããèŠãã°äžç®çç¶ãªã®ã§ã仿§æžã®ä»£ããã«ãªããŸããããã¥ã¡ã³ããšããŠçްãã仿§ããŸãšããã®ã倧äºã§ããããã¹ãã³ãŒãã代ããã«ããŠã¿ããšããããç¡é§ãçãããããããŸããã ãŸãšã çŸç¶åæ&å°å
¥ã¯ã·ã³ãã«ã« çŸç¶ã®ã¢ããªã®äžã§ãã¹ããæžãå§ããããç®æãã©ããèŠæ¥µããã倧æãããªããã¿ãæåããããããšããªãã§å°ããªããšããå§ããŠã¿ããæåããé£ã°ãéãããšå°å
¥ã®æç¹ã§ç²åŒããŠç¶ããŸããã èªåã®ã³ãŒããçã èªåãæžããã³ãŒãã¯å®ç§ãããªããšçãããã¹ãã³ãŒããæžããŠã¿ãŠåããŠæ°ãã€ãããšã¯ãããããŸãã ã¡ãªãããæç¢ºã« ã¡ãªãããæç¢ºã«ããŠããã¡ããšçŽåŸããŠå§ããã æ¬¡åã¯å®éã®å°å
¥ã®ç޹ä»ãTravisCIãšã®é£æºãªã©ã玹ä»ããŠãããããšæããŸãã ãã°ãããã¹ãé¢é£ã®ãšã³ããªãŒãç¶ããŸãããæ¥œãã¿ã«ããŠé ããããšæããŸãã ãããã« iQONã§ã¯ãšã³ãžãã¢ãåéããŠããŸããäžç·ã«äžçãç®æãAndroidã¢ããªã®éçºãããŸãããïŒ ãAndroidãäžçã§åã¡ããAndroidã¢ããªãšã³ãžãã¢åé æ
å ±äº€æãªã©ãéæããŠãããããšæããŸãã®ã§å匷äŒãªã©ã®éå¬ãåå ã«ã€ããŠãæ°è»œã«çžè«é ããã°ãšæããŸãã
iOSãšã³ãžãã¢ã®åºåžã§ãã å
æ2æ20æ¥ããã第2åãiQONãšã³ãžãã¢ã»ãã㌠ïœé²åãç¶ããiQONãæ¯ããã°ããŒã¹ããã¯çãšã³ãžãã¢ãªã³ã°ææ³ãšã¯ïŒïœããšé¡ããŠããšã³ãžãã¢ã»ãããŒãéå¬ããŸããã äŒå Žãšãªã£ãåŒç€Ÿãªãã£ã¹ã«ããããã®ãšã³ãžãã¢ã®æ¹ã
ã«éãŸã£ãŠããã ããŸããã åœæ¥ã¯ãåŒç€Ÿãšã³ãžãã¢ããã°ããŒã¹ããã¯ããããŒãã«åãã©ãããã©ãŒã ãã©ã®ããã«iQONã®ã°ããŒã¹ããã¯ã«åãçµãã§ããããçºè¡šããŸããã åœæ¥ã®çºè¡šè³æãSpeaker Deckã«ã¢ããããã®ã§ãã²åŸ¡èЧãã ããã ã°ããŒã¹ããã¯ãæ¯ãããšã³ãžãã¢ãªã³ã° CTO 仿 Androidãã¡ãŒã¹ãïŒããæ©ãæäŸããããã®éçºææ³ AndroidããŒã (西æ/æç°) ã°ããŒã¹ããã¯ãããããã®iOSéçºææ³ -ãã°åéç·š- iOSããŒã (èäº/åºåž) iQONãæ¯ããããã¯ãšã³ã ããã¯ãšã³ãããŒã (åç°/倧貫) ã°ããŒã¹ããã¯çéçº æåã®äžæ© LTæ (ããšãã€) ãŸãšã ã°ããŒã¹ããã¯ã«ãã©ãŒã«ã¹ããŠã®åãã©ãããã©ãŒã ã§çºè¡šããŸããããæéã®éœåäžç޹ä»ã§ããã®ã¯ã°ããŒã¹ããã¯ã«é¢ããŠåãçµãã§ããããšã®äžç«¯ã«ãããŸããã ãã®ä»ã«åãçµãã§ããããšãã©ãã©ããã®ããã°ã§ç޹ä»ããŠãããããšæããŸãã åè³æã®æåŸã§ãè§ŠããŠããŸãããä»åã®ã»ãããŒãçºè¡šè³æã§iQONé¢çœããïŒãšæã£ãŠããã ããæ¹ããåŸ
ã¡ããŠãããŸãã æ¥æ¬æå€§çŽã®ãã¡ãã·ã§ã³ãµãŒãã¹iQONãã¶ã£ã¡ããã«ãããšã³ãžãã¢åéïŒ
ãŠã§ããµãŒãã¹ã«éãããã¢ããªã®ç¶ç¶çãäžããããã«ã¯é¢è±çãé¢è±ããŒãžã®èšæž¬ã¯éèŠã§ãã é¢è±çã®é«ãããŒãžãç¥ããæ¹åããããšã§ã¢ããªã®ç¶ç¶çãã³ã³ããŒãžã§ã³çã®åäžã«ã€ãªããããšãã§ããŸãã ç¹ã«æ°èŠãŠãŒã¶ãŒã®é¢è±ããŒãžãæ¹åãããšç¶ç¶çãžã®åœ±é¿ã¯å€§ããã§ãããã ä»åã¯ãiOSã¢ããªã®é¢è±ããŒãžèšæž¬ã«ã€ããŠ3ç¹ã«ãããŠç޹ä»ããŸãã iOSã¢ããªã«ãããé¢è±ãšã¯ æåé¢ã®UIViewã®ç¹å® æåé¢ã®ViewController (é¢è±ããŒãž) ã®ç¹å® iOSã¢ããªã«ãããé¢è±ãšã¯ iOSã¢ããªã«ããé¢è±ãšã¯ãããŒã ãã¿ã³ãæŒããããããã£ãŠããé»è©±ã«åºãããªã©ããã®ã¢ããªã±ãŒã·ã§ã³ã®å©çšãçµäºããããšãšå矩ã§ãã ãã®ã¿ã€ãã³ã°ã¯ UIApplicationDelegate ã® applicationWillResignActive: ãšããããªã²ãŒãã¡ãœããã§æ€ç¥ã§ããŸãã ãã®ã¿ã€ãã³ã°ã§æçµçã«è¡šç€ºããŠããããŒãžïŒïŒViewControllerïŒãååŸã§ããã°ããã®ã§ãããã¢ããªã±ãŒã·ã§ã³ã®å®è£
ã«ãã£ãŠã¯åæã«è€æ°ã®ViewControllerãååšããããç¹å®ãå°é£ã§ãã ããã§ã¯ applicationWillResignActive: ãåŒã°ããæç¹ã§æåé¢ã«ããViewControllerãé¢è±ããŒãžãšããŠèšæž¬ããã°ããã§ãããã æåé¢ã®ViewControllerãååŸããã«ã¯ãäžèšã®2ã¹ãããã§ãã æåé¢ã®UIViewãç¹å® ãã®UIViewãå±ããUIViewControllerãç¹å® Google Analyticsãªããã§ããã£ãŠãããšã§ããïŒ Google Analyticsã§ãç»é¢ããšã®é¢è±çãèšæž¬ããããšãã§ããŸãã ã§ãããä»åã¯æ°èŠãŠãŒã¶ãŒã«ã€ããŠã®ã¿ãã©ã®ç»é¢ã§é¢è±ããããèšæž¬ããããã«å®æœããŸããã æåé¢ã®UIViewã®ç¹å® æåé¢ã®UIViewãååŸããã«ã¯ UIWindow ããå§ãŸãsubviewsããªãŒã®æåŸã®Viewãååž°çã«ãã©ã£ãŠè¡ãããšã§æåé¢ã®UIViewãååŸã§ããŸãã æçµçã« applicationWillResignActive: ã§ååŸããã®ã§ãUIApplicationDelegateã®ã¯ã©ã¹ã§ã¡ãœãããå®è£
ããŸãã ã¢ããªã±ãŒã·ã§ã³ã®æåé¢ã®UIViewãååŸããåŠçã®å®è£
äŸ @implementation MyAppDelegate - (UIView *)foregroundView { // UIWindowããå§ãŸãViewéå±€ãååž°çã«ãã©ã UIView *foregroundView = self .window; while ( 1 ) { UIView *tmpView = nil ; for (UIView *subview in foregroundView.subviews.reverseObjectEnumerator) { // é衚瀺ã®viewã¯é€ã if (!subview.hidden && subview.alpha > 0.f ) { tmpView = subview; break ; } } if (tmpView) { foregroundView = tmpView; } else { break ; } } return foregroundView; } @end æåé¢ã®ViewController (é¢è±ããŒãž) ã®ç¹å® ããã»ã©ååŸããæåé¢ã®UIViewã®ã¬ã¹ãã³ããã§ãŒã³ããã©ã£ãŠè¡ããšããã®UIViewãå±ããUIViewControllerãååŸã§ããŸãã UIResponderã¯ã©ã¹ã®ã«ããŽãªã®ã¡ãœãããå®è£
ããŸãã UIViewã®ã¬ã¹ãã³ããã§ãŒã³ããèªèº«ãæå±ããUIViewControllerãååŸããåŠçã®å®è£
äŸ @implementation UIResponder (Addition) - (UIViewController *)belongingViewController { UIResponder *responder = self ; while ( 1 ) { if (!responder) { return nil ; } else if ([responder isKindOfClass:[UIViewController class]]) { return (UIViewController *)responder; } else { responder = responder.nextResponder; } } } @end æçµçã«æåé¢ã®UIViewControllerãååŸããŠèšæž¬ããåŠçã¯äžèšã®ããã«ãªããŸãã æåé¢ã®UIViewControllerãååŸããŠèšæž¬ããåŠçã®å®è£
äŸ @implementationMyAppDelegate - (UIViewController *)foregroundViewController { // 衚瀺ãããŠããæåé¢ã®ViewControllerãè¿ã UIViewController *vc = self .foregroundView.belongingViewController; if ([vc isKindOfClass:[UINavigationController class]]) { // UINaviagtionControllerã®å Žåã¯topViewControllerãè¿ã return ((UINavigationController *)vc).topViewController; } else { return vc; } } - ( void )applicationWillResignActive:(UIApplication *)application { // äŒå¡ç»é²ãã24æé以å
ã®ãŠãŒã¶ãŒã®ã¿ãã°ãèœãšã if ([[NSDate date] timeIntervalSinceDate:USER.createTime] <= 60 * 60 * 24 ) { UIViewContrller *vc = self .foregroundViewController; // ãã®ã³ã°åŠç } } @end ååž°åŠçããããããã£ãŠããã©ããã©ãŒãã³ã¹ã¯? èšæž¬åŠçãé
ããŠã¢ããªã±ãŒã·ã§ã³ã®äœ¿ãåæãæªããªããããªäºæ
ã¯é¿ããªããã°ãªããŸããã ä»åã¯ååž°åŠçã䜿ã£ãŠããŸããã宿©ã§ç¢ºèªããŠã¿ããšããã1msecããããè¿ã£ãŠããŸããã subviewsã®ããªãŒãšã¬ã¹ãã³ããã§ãŒã³ããã©ãã ãã®åŠçãªã®ã§ã倧ããè² è·ã¯ãªãããã§ãã ãŸãšã é¢è±çãèšæž¬ããããã«ãã¢ããªã±ãŒã·ã§ã³çµäºæã«æåé¢ã®ViewControllerãååŸããåŠçã玹ä»ããŸããã ã¬ã¹ãã³ããã§ãŒã³ããã©ãããšã§ãUIViewã®ãµãã¯ã©ã¹ããViewèªèº«ãæå±ããViewControllerãååŸããããšãã§ããŸãããViewãViewControllerã®ååšãæèããå¿
èŠã¯ãªãã®ã§ããããããŸããã èšæž¬ãããããšã¯ãµãŒãã¹æ¹åã®ç¬¬äžæ©ã§ããèšæž¬çµæãè§£æããŠãµãŒãã¹æ¹åã«åœ¹ç«ãŠãŠãã ããã æåŸã« ä»åã®èšäºã«ç©ç³ãïŒãšããæ¹ã¯ãã¡ããŸã§â ãiOSãAppleãèªããiQONã«ããã«ç£šããããããšã³ãžãã¢åé
è¿å¹ŽO2OïŒOnline to OfflineïŒã販売ä¿é²ã®ããŒã±ãã£ã³ã°ãªã©æ§ã
ãªåéã§èå
ãæµŽã³ãŠããŸãããO2Oã絡ããæ©èœãã¢ããªã§æäŸããããã«äžå¯æ¬ ãªèŠçŽ ãšã㊠äœçœ®æ
å ±ãµãŒãã¹ ããããŸãã ä»åã¯Androidã¢ããªã§äœçœ®æ
å ±ãµãŒãã¹ãå¹çãã䜿ãããã®2ã€ã®Tipsãšå®è£
äŸã玹ä»ããŠãããŸãã ïŒïŒãææ°ã®äœçœ®æ
å ±ãµãŒãã¹ã®çœ ãã察çãã¢ã³ã€ã³ã¹ããŒã«ãåé¿ ïŒïŒææ°æ©èœãGoogle Play Servicesã®Location APIãã䜿ã£ãŠå¹çUP Tips1:ãææ°ã®äœçœ®æ
å ±ãµãŒãã¹ã®çœ ãã察çãã¢ã³ã€ã³ã¹ããŒã«ãåé¿ Android4.4ïŒKitKatïŒããäœçœ®æ
å ±ãµãŒãã¹ã®èšå®ç»é¢ã倿ŽãããŸããã倧ããªå€æŽã¯ä»¥äžã®2ç¹ã«ãªããŸãã é«ç²ŸåºŠã»ããããªãŒç¯çŽã»GPSã®ã¿ ã®3ã€ã®ã¢ãŒãããéžæã§ããããã«ãªã£ã äœçœ®æ
å ±ãµãŒãã¹ãçŽè¿ã§å©çšããã¢ããªãäžèŠ§è¡šç€ºãããããã«ãªã£ã ç¹ã«åŸè
ã®ãã¢ããªãäžèЧã§è¡šç€ºãããã倿Žã«é¢ããŠã®å¯Ÿçã¯ãä»åŸã®äœçœ®æ
å ±ãµãŒãã¹ã䜿ãã¢ããªéçºã«ãããŠã¯éåžžã«éèŠãªèŠçŽ ã«ãªã£ãŠãããšèããŠãããŸãã å®ã¯ãã®ã¢ããªäžèЧã®åã¢ããªã®é
ç®ã¯ã¿ããããããšãã§ããã¿ãããããšã¢ããªæ
å ±ã®è©³çްããŒãžã«Intentãããä»çµã¿ã«ãªã£ãŠãŸãã ãåç¥ã®éãããã®ããŒãžã«æ¥ããšã¢ããªã®ã¢ã³ã€ã³ã¹ããŒã«ãã§ããŠããŸããŸã... 黿± ã®æžãã®æ©ãã«æ©ãã§ãããšãã«ãé«ã黿± 䜿çšéããšããæèšãèŠãããã¢ã³ã€ã³ã¹ããŒã«ã§ããããŒãžã«Intentãããæ®éãªãã©ãããã§ãããïŒ äœçœ®æ
å ±ãµãŒãã¹ã䜿ãéã«ã¯ 仿§ã«ããããŠæé©ãªéžæãããå¿
èŠä»¥äžã«äœçœ®æ
å ±ãµãŒãã¹ã䜿ããªã ãšããããšãä»åŸã¯éåã«ãªã£ãŠããŸãã ããããããšã§ ã¢ã³ã€ã³ã¹ããŒã«ã®ãªã¹ã¯ãåé¿ ããããšãã§ããŸãã iQONã§ã®äœçœ®æ
å ±ãµãŒãã¹ãå©çšããäºäŸ å
æ¥iQONã§ã¯ãAndroidã§å
è¡ããŠå€©æ°ã³ãŒãæ©èœããªãªãŒã¹ããŸãããèšå®ãããšãªã¢ã®å€©æ°äºå ±ãšã倩æ°äºå ±ã«ãããããã³ãŒããèŠããæ©èœã«ãªã£ãŠããŸãã åœããåãªè©±ã§ãã倩æ°ã¯å°åã«ãã£ãŠå
šãç°ãªã£ãŠãããã®ã§ãããã®ãããŠãŒã¶ãŒã«èªåãäœãã§ããå ŽæãéžæããŠãããå¿
èŠããããŸãã ãã ãèšå€§ãªå°åæ
å ±ããèªåãäœãã§ããå°åãéžæããŠããæäœã¯æéãããããæ©èœã®å©çšçåäžã®è¶³ããã«ãªããŸãã ããã§iQONã§ã¯æåã§ã®äœçœ®æ
å ±èšå®ã«äžŠè¡ããŠãäœçœ®æ
å ±ãµãŒãã¹ã䜿ã£ãèªåäœçœ®æ
å ±èšå®ã®æ©èœãæäŸããŸãããäœçœ®æ
å ±ã®ååŸã«é¢ããŠã¯åŸæ¥ã®ä»çµã¿ã§ãã android.location.LocationManager android.location.LocationListener ã䜿ã£ãŠããŸãã å
ã»ã©ãèšèŒããŸããããäœçœ®æ
å ±ãµãŒãã¹ã¯ 仿§ã«ããããŠæé©ãªéžæãããå¿
èŠä»¥äžã«äœçœ®æ
å ±ãµãŒãã¹ã䜿ããªã ãšããéåã倧äºã«ãªã£ãŠããŸãã ãããé ã«å
¥ããäžã§ã以äžã®2ã€ã®ãã€ã³ãã«æ°ãã€ããŠå®è£
ãè¡ããŸããã 倩æ°ãšãªã¢ã¯å€§ãŸããªäœçœ®æ
å ±ãååŸã§ããã°ååãªæ©èœãæäŸã§ãããã粟床ã¯å€å°èœã¡ãŠãè¯ã äžåºŠäœçœ®æ
å ±ãååŸã§ããã°æ©èœã«å©çšã§ããã®ã§äœçœ®æ
å ±ãç¶ç¶ããŠååŸãç¶ããå¿
èŠã¯ãªã public class WeatherSpotAutoSetActivity extends Activity implements LocationListener { LocationManager locationManager; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.weather_spot_auto_set); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); String gpsStatus = android.provider.Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if (gpsStatus.indexOf(LocationManager.NETWORK_PROVIDER) > 0) { // äœçœ®æ
å ±ã®ååŸåŠçéå§ // 倧ãŸããªäœçœ®æ
å ±ãååŸã§ããã°èŠä»¶ãæºãããã®ã§ãããã¯ãŒã¯ã§ååŸããåŠçãèµ°ãããïŒçé»åïŒ locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); } else { // äœçœ®æ
å ±ãµãŒãã¹ãOFFã®å Žåã¯åŠçãçµäº finish(); } } @Override protected void onDestroy() { locationManager.removeUpdates(this); super.onDestroy(); } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onLocationChanged(Location location) { String latitude = String.valueOf(location.getLatitude()); String longitude = String.valueOf(location.getLongitude()); // ãéèŠã緯床çµåºŠã1床ã§ãååŸã§ããæç¹ã§åŠçãçµäº locationManager.removeUpdates(this); // ååŸãã緯床çµåºŠã䜿ã£ãŠåŠçãè¡ãïŒåŠçã®è©³çްã¯çç¥ïŒ } } iQONã§ã¯ãããã¯ãŒã¯ããã®ååŸã«çµã£ãŠãããããäœçœ®æ
å ±ãµãŒãã¹ã®èšå®ç»é¢ã«ã¯ãäœã黿± 䜿çšéããšãã衚瀺ãããŸããã Tips2:ææ°æ©èœãGoogle Play Servicesã®Location APIãã䜿ã£ãŠå¹çUP åé
ã§iQONã¯çŸç¶ android.location.LocationManager android.location.LocationListener ãå©çšããŠäœçœ®æ
å ±ãååŸããŠãããšç޹ä»ãããŠããã ããŸãããå®ã¯ããã¯å€ãä»çµã¿ã§ã2014幎3æçŸåšã§ã¯ Google Play Servicesã®Location API ãå©çšããã®ãæãæ°ãã圢ã«ãªããŸãã æšå¹Žã®Google I/Oã§æ°ããçºè¡šãããæ©èœã§ãã OSã®ããŒãžã§ã³ãAndroid2.2以äžããGoogle Play éçºè
ãµãŒãã¹ãããŠãŒã¶ãŒã®ç«¯æ«ã«ã€ã³ã¹ããŒã«ãããŠããå¿
èŠããããŸããããªã¢ã«ã¿ã€ã ã§äœçœ®æ
å ±ãååŸããªããšãããªãã¢ããªã«é¢ããŠã¯Location APIã䜿çšããæ¹ãå§åçã«å¹çãè¯ããªããŸãã iQONã«ãããŠãä»åŸã®å±éãèããŠãè¿æ¥äžã«Location APIã«ä¹ãæããäºå®ã§ãã Location APIã¯åŸæ¥ã®ä»çµã¿ãšæ¯ã¹ãŠããã€ãåªããä»çµã¿ããããŸããããã®äžã§ãå®éã«äœ¿ã£ãŠã¿ãŠäžçªè¯ããšæã£ãä»çµã¿ã¯ Fused Location Provider ãšãããã®ã«ãªããŸãã åŸæ¥ã®ä»çµã¿ã§ã¯äœçœ®æ
å ±ãååŸããéã«ã¯ LocationManager.GPS_PROVIDER ã LocationManager.NETWORK_PROVIDER ãšæå®ããå¿
èŠããããŸããã Criteriaã¯ã©ã¹ããªãã·ã§ã³çã«çšããŠç²ŸåºŠãæ¶è²»é»åãæå®ããŠçµã¿åãããæ¹æ³ããããŸãããæ£çŽäœ¿ãåæã¯ããŸãè¯ããããŸããã§ããã Fused Location Provider ã¯ãåŸæ¥ã®ä»çµã¿ãšCriteriaã¯ã©ã¹ãçµ±åããããããªä»çµã¿ã«ãªã£ãŠããŠãç²ŸåºŠãšæ¶è²»é»åã®ã©ã¡ããåªå
ãããããéžæããã ãã§Providerã®æå®ã¯è¡ãå¿
èŠããªããªããŸããã å©çšã·ãŒã³ïŒïŒé«ç²ŸåºŠã§ãªã¢ã«ã¿ã€ã ã«äœçœ®æ
å ±ãååŸãããšãã®å®è£
äŸ public class TestActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener { /* * implementsããLocationListenerã¯com.google.android.gms.locationã®ãã® * æ¢åã®ä»çµã¿ããç§»è¡ããå Žåã«ã¯ããã«æ°ãã€ããªããšããããŸã */ private LocationClient mLocationClient; private LocationRequest mLocationRequest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_activity); // Google Play Services ãå©çšã§ãããç¢ºèª int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if (ConnectionResult.SUCCESS == resultCode) { mLocationClient = new LocationClient(this, this, this); } else { // åŸæ¥ã®ä»çµã¿ã§ä»£çšãããªãã®ãã©ã³ãèãã } } @Override protected void onStart() { super.onStart(); mLocationClient.connect(); } @Override protected void onStop() { mLocationClient.disconnect(); super.onStop(); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { // æ¥ç¶ã倱æãããšãã®åŠçã¯ããã«èšèŒ finish(); } @Override public void onConnected(Bundle bundle) { mLocationRequest = LocationRequest.create(); mLocationRequest.setInterval(5000); // 5ç§ããšã«äœçœ®æ
å ±ãååŸ mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // é«ç²ŸåºŠã§ååŸ if (mLocationClient.isConnected()) { mLocationClient.requestLocationUpdates(mLocationRequest, this); } } @Override public void onDisconnected() { // åæãããšãã®åŠçã¯ããã«èšèŒ if (mLocationClient.isConnected()) { mLocationClient.removeLocationUpdates(this); } } @Override public void onLocationChanged(Location location) { String latitude = String.valueOf(location.getLatitude()); String longitude = String.valueOf(location.getLongitude()); // ååŸããLat,Lonã䜿ã£ãŠåŠçãè¡ãïŒè©³çްã®åŠçã¯çç¥ïŒ } } } å©çšã·ãŒã³ïŒïŒããçšåºŠã®ç²ŸåºŠã§åžžæäœçœ®æ
å ±ãååŸããããšãã®å®è£
äŸ public class TestActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener { ... /* ä»ã®ç®æã¯å©çšã·ãŒã³ïŒãšåæ§ã®ããçç¥ */ @Override public void onConnected(Bundle bundle) { mLocationRequest = LocationRequest.create(); mLocationRequest.setInterval(3600000); // 1æéããšã«äœçœ®æ
å ±ãååŸ // setIntervalã¯ãããŸã§ãç®å®ã®ãããç¶æ³ã«ãã£ãŠééãå€ãã // ãã®ããé·æéååŸååŸããå Žåã¯setFastestIntervalãèšå®ãã mLocationRequest.setFastestInterval(300000); // ååŸã®é »åºŠã¯æäœã§ã5åã¯ç©ºãã mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); // ç²ŸåºŠãšæ¶è²»é»åã®ãã©ã³ã¹åã£ãŠååŸ if (mLocationClient.isConnected()) { mLocationClient.requestLocationUpdates(mLocationRequest, this); } } ... } å©çšã·ãŒã³ïŒïŒå€§ãŸããªäœçœ®æ
å ±ã1床ã ãååŸãããå Žåã®å®è£
äŸ public class TestActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener { ... /* ä»ã®ç®æã¯å©çšã·ãŒã³ïŒãšåæ§ã®ããçç¥ */ @Override public void onConnected(Bundle bundle) { mLocationRequest = LocationRequest.create(); mLocationRequest.setPriority(LocationRequest.PRIORITY_NO_POWER); // é»åã䜿ããªãç¯å²ã§ååŸ // PRIORITY_NO_POWER ããã粟床ãé«ã PRIORITY_LOW_POWER ã§ããã¹ããããŠã©ã¡ãã䜿ããæ±ºãã if (mLocationClient.isConnected()) { mLocationClient.requestLocationUpdates(mLocationRequest, this); } } @Override public void onLocationChanged(Location location) { String latitude = String.valueOf(location.getLatitude()); String longitude = String.valueOf(location.getLongitude()); // ååŸã§ããæç¹ã§åŠçãçµäºããã if (mLocationClient.isConnected()) { mLocationClient.removeLocationUpdates(this); } // ååŸããLat,Lonã䜿ã£ãŠåŠçãè¡ãïŒè©³çްã®åŠçã¯çç¥ïŒ } ... } ãã©ã¡ãŒã¿ã®å€ã¯å®è£
ããæ©èœã«ããããŠçްãããã¹ãããŠæé©ãªåœ¢ã«ããã ãŸãšã äœçœ®æ
å ±ãµãŒãã¹ã¯éåžžã«äŸ¿å©ã§ãããä»åŸã¯å©çšããã¢ããªã¯äžèŠ§è¡šç€ºãããŠæãããããšãçè§£ããäžã§å©çšããŠãã ããã ãã®ãã 仿§ã«ããããŠæé©ãªéžæãããå¿
èŠä»¥äžã«äœçœ®æ
å ±ãµãŒãã¹ã䜿ããªã ããšã培åºããªããšã¢ã³ã€ã³ã¹ããŒã«ã®ãªã¹ã¯ã«ç¹ãããŸãã ãŸãäœçœ®æ
å ±ååŸã¯åŸæ¥ã®ä»çµã¿ã§ãããã§ããã Google Play Servicesã®Location API ã¯ãã现ããèšå®ãã§ã䜿ããããã®ã§ãªã¹ã¹ã¡ã§ãã ãããã« æ¥ã
æé·ããŠãã æ¥æ¬æå€§çŽãã¡ãã·ã§ã³ãµãŒãã¹iQON ãäžç·ã«æé·ãããŠããããšã³ãžãã¢ãçµ¶è³åéããŠãããŸãã æããã¯ãšããæ¹ãåŸ
ã¡ããŠãããŸãã ãAndroidãäžçã§åã¡ããAndroidã¢ããªãšã³ãžãã¢åé æ¥æ¬æå€§çŽã®ãã¡ãã·ã§ã³ãµãŒãã¹iQONãã¶ã£ã¡ããã«ãããšã³ãžãã¢åéïŒ