
ããã³ããšã³ããããã¯ãšã³ããã¢ãã€ã«éçºãªã©ãããã€ãã®ããŒã ããããžã§ã¯ãã«åãçµã¿ãŸããã ã»ãšãã©ã®å ŽåãRedditã®æ¢åã®ãã¯ãããžãŒã«å®è£
ãããŠããŸããã ãã®èšäºã§ã¯ãæè¡çãªé¢ã§Placeãã©ã®ããã«äœæãããããèŠãŠãããŸãã Placeã³ãŒãã衚瀺ãããå Žå㯠ã ããã«ãããŸãã
å¿
èŠæ¡ä»¶
ãŸãããšã€ããªã«ããŒã«ã®ãããžã§ã¯ãã®èŠä»¶ã決å®ããããšã¯éåžžã«éèŠã§ããããªããªãããã¹ãŠã®RedditãŠãŒã¶ãŒãããã«ã¢ã¯ã»ã¹ã§ããããã«ãããªãŒããŒã¯ããã¯ãããã«èµ·åããå¿
èŠãããããã§ãã 圌ãæåããå®ç§ã«åããŠããªãã£ããã圌ã¯å€ãã®äººã
ã®æ³šç®ãéããããšã¯ã»ãšãã©ãªãã£ãã ããã
ããŒãã¯éåžžã«å€§ããèŠããããã«1000x1000ã®ãµã€ãºã«ããå¿
èŠããããŸãã
ãã¹ãŠã®ã¯ã©ã€ã¢ã³ããåæããåäžã®ããŒãã¹ããŒã¿ã¹ã衚瀺ããå¿
èŠããããŸãã çµå±ã®ãšãããç°ãªããŠãŒã¶ãŒãç°ãªãããŒãžã§ã³ãæã£ãŠããå Žåãããããçžäºäœçšããããšã¯å°é£ã§ãã
äžåºŠã«å°ãªããšã100,000人ã®ãŠãŒã¶ãŒããµããŒãããå¿
èŠããããŸãã
ãŠãŒã¶ãŒã¯5åéã§1ã€ã®ã¿ã€ã«ãæçš¿ã§ããŸãã ãããã£ãŠã5åéã§100,000ã¿ã€ã«ã®å¹³åãªãã¬ãã·ã¥ã¬ãŒããç¶æããå¿
èŠããããŸãïŒ1ç§ããã333æŽæ°ïŒã
ãããžã§ã¯ãã¯ããµã€ãã®æ®ãã®éšåãšæ©èœã®åäœã«æªåœ±é¿ãäžããŠã¯ãªããŸããïŒããšãr / Placeãžã®ãã©ãã£ãã¯ãå€ãå Žåã§ãïŒã
- äºæããªãããã«ããã¯ãé害ãçºçããå Žåãæè»ãªæ§æãå¿
èŠã§ãã ã€ãŸããããŒã¿ããªã¥ãŒã ã倧ããããå Žåããªãã¬ãã·ã¥ã¬ãŒããé«ãããå Žåã¯ãããŒãã®ãµã€ãºãšèš±å®¹ãããæç»é »åºŠããªã³ã¶ãã©ã€ã§èª¿æŽã§ããå¿
èŠããããŸãã
ããã¯ãšã³ã
å®è£
ã®æ±ºå®
ããã¯ãšã³ããäœæããéã®äž»ãªå°é£ã¯ããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã®ããŒãã®ã¹ããŒã¿ã¹ã®è¡šç€ºãåæããããšã§ããã ã¯ã©ã€ã¢ã³ããã¿ã€ã«é
眮ã€ãã³ãããªã¢ã«ã¿ã€ã ã§ãªãã¹ã³ããããã«ããŒãå
šäœã®ã¹ããŒã¿ã¹ãèŠæ±ããããšã決å®ãããŸããã ãã®å®å
šãªç¶æ
ãçæãããåã«æŽæ°ããµãã¹ã¯ã©ã€ãããå Žåããããã«å€ãå®å
šãªç¶æ
ãæã€ããšã¯èš±å®¹ãããŸãã ã¯ã©ã€ã¢ã³ãã¯å®å
šãªç¶æ
ãåä¿¡ãããšãåŸ
æ©äžã«åä¿¡ãããã¹ãŠã®ã¿ã€ã«ã衚瀺ããŸãã åŸç¶ã®ã¿ã€ã«ã¯ãã¹ãŠãåãåã£ããããã«ããŒãã«è¡šç€ºããå¿
èŠããããŸãã
ãã®ã¹ããŒã ãæ©èœããããã«ã¯ãããŒãã®å®å
šãªç¶æ
ã®ãªã¯ãšã¹ããã§ããã ãæ©ãå®äºããå¿
èŠããããŸãã æåã¯ãããŒãå
šäœãCassandraã®1è¡ã«ä¿åããŠãåãªã¯ãšã¹ãããã®è¡ãèªã¿åãããã«ããŸããã ãã®è¡ã®ååã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã
(x, y): {'timestamp': epochms, 'author': user_name, 'color': color}
ããããããŒãã«ã¯100äžåã®ã¿ã€ã«ãå«ãŸããŠããããã100äžåãèªã¿åãå¿
èŠããããŸããã äœæ¥äžã®ã¯ã©ã¹ã¿ãŒã§ã¯ãæ倧30ç§ããããŸããããããã¯åãå
¥ãããããCassandraã«é床ã®è² è·ããããå¯èœæ§ããããŸããã
ãã®åŸãããŒãå
šäœãRedisã«ä¿åããããšã«ããŸããã 100äžåã®4ãããæ°ã®ããããã£ãŒã«ããååŸããããããã4ãããã«ã©ãŒããšã³ã³ãŒãã§ããxããã³y座æšã¯ããããã£ãŒã«ãã®ãªãã»ããïŒ offset = x + 1000y
ïŒã«ãã£ãŠæ±ºå®ãããŸããã ããŒãã®å®å
šãªç¶æ
ãååŸããã«ã¯ãããããã£ãŒã«ãå
šäœãèªã¿åãå¿
èŠããããŸããã
ã¿ã€ã«ã¯ãç¹å®ã®ãªãã»ããã§å€ãæŽæ°ããããšã§æŽæ°ã§ããŸãïŒèªã¿åã/æŽæ°/æžã蟌ã¿æé å
šäœããããã¯ãŸãã¯å®è¡ããå¿
èŠã¯ãããŸããïŒã ãããããã¹ãŠã®è©³çŽ°ãCassandraã«ä¿åããå¿
èŠãããããããŠãŒã¶ãŒã¯åã¿ã€ã«ã誰ããã€æçš¿ããããç¥ãããšãã§ããŸãã Redisãã¯ã©ãã·ã¥ããå ŽåãCassandraã䜿çšããŠããŒãã埩å
ããããšãèšç»ããŸããã ããŒãå
šäœãèªã¿åãã®ã«100ããªç§ãããããŸããã§ããã
ããã§ã¯ãäŸãšããŠ2x2ããŒãã䜿çšããŠRedisã«è²ãä¿åããæ¹æ³ã瀺ããŸãã

Redisã§èªã¿åã垯åå¹
ãçºçããã®ã§ã¯ãªãããšå¿é
ããŠããŸããã å€ãã®ã¯ã©ã€ã¢ã³ããåæã«æ¥ç¶ãŸãã¯æŽæ°ãããå Žåããã¹ãŠã®ã¯ã©ã€ã¢ã³ããããŒãã®å®å
šãªç¶æ
ã«å¯ŸããèŠæ±ãåæã«éä¿¡ããŸããã ããŒãã¯å
šäœçã«ã°ããŒãã«ãªç¶æ
ã§ãã£ããããæãããªè§£æ±ºçã¯ãã£ãã·ã¥ã䜿çšããããšã§ããã CDNïŒFastlyïŒã¬ãã«ã§ãã£ãã·ã¥ããããšã決å®ããŸãããå®è£
ãç°¡åã§ããã£ãã·ã¥ãã¯ã©ã€ã¢ã³ãã«æãè¿ããå¿çãåä¿¡ããæéãççž®ãããããã§ãã
ããŒãã¹ããŒã¿ã¹èŠæ±ã¯ã1ç§ãããã®ã¿ã€ã ã¢ãŠãã§é«éã«ãã£ãã·ã¥ãããŸããã ã¿ã€ã ã¢ãŠãã®æéãåãããšãã«å€§éã®ãªã¯ãšã¹ããé²ãããã«ã stale-while-revalidate
ã䜿çšããŸããã ãã£ãã·ã¥ãåå¥ã«ãã£ãã·ã¥ããçŽ33ã®POPãé«éã«ãµããŒãããŠãããããããŒãã®å®å
šãªç¶æ
ã«ã€ããŠ1ç§ãããæ倧33ã®ãªã¯ãšã¹ããåä¿¡ããããšãäºæ³ãããŸããã
ãã¹ãŠã®é¡§å®¢ã«æŽæ°ãå
¬éããããã«ã Webãœã±ãããµãŒãã¹ã䜿çšããŸãã ã ããã«å
ç«ã¡ã Reddit.Liveã100,000人以äžã®åæãŠãŒã¶ãŒãšé£æºããŠãLiveããã³ãã®ä»ã®æ©èœã®ãã©ã€ããŒãã¡ãã»ãŒãžã®éç¥ã確å®ã«è¡ãããã«äœ¿çšããŸããã ãµãŒãã¹ã¯ãéå»ã®ãšã€ããªã«ããŒã«ã®ãããžã§ã¯ã-The Button and Robinã®åºç€ã§ããããŸããã r / Placeã®å Žåãã¯ã©ã€ã¢ã³ãã¯Webãœã±ããæ¥ç¶ããµããŒãããŠããªã¢ã«ã¿ã€ã ã®ã¿ã€ã«é
眮æŽæ°ãåä¿¡ããŸãã
API
ããŒãã®å®å
šãªç¶æ
ãååŸãã

æåãã¯ãšãªã¯Fastlyã«åé¡ãããŸããã ããŒãã®æå¹ãªã³ããŒãããã°ã圌ã¯Redditã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã«æ¥ç¶ããã«ããã«ãããè¿ããŸããã ããã§ãªãå ŽåããŸãã¯ã³ããŒãå€ãããå ŽåãRedditã¢ããªã±ãŒã·ã§ã³ã¯RedisããããŒãå
šäœãèªã¿åããFastlyã«è¿ããŠããã£ãã·ã¥ããŠã¯ã©ã€ã¢ã³ãã«è¿ããŸããã
Redditã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠæž¬å®ãããèŠæ±é »åºŠãšå¿çæââéïŒ

èŠæ±é »åºŠã1ç§ããã33ã«éããããšããªãããšã«æ³šæããŠãã ãããã€ãŸããFastlyã«ãããã£ãã·ã³ã°ã¯ãã»ãšãã©ã®èŠæ±ããRedditã¢ããªã±ãŒã·ã§ã³ãä¿è·ããéåžžã«å¹æçãªæ段ã§ããã

ãããŠããªã¯ãšã¹ããã¢ããªã±ãŒã·ã§ã³ã«å±ããšãRedisã¯éåžžã«è¿
éã«å¯Ÿå¿ããŸããã
ã¿ã€ã«ãæã

ã¿ã€ã«ãæç»ããæé ïŒ
- CassandraããããŠãŒã¶ãŒã®ã¿ã€ã«ã®æåŸã®é
眮ã®ã¿ã€ã ã¹ã¿ã³ããèªã¿åãããŸãã ããã5åæªæºã®å Žåãäœãããããšã©ãŒããŠãŒã¶ãŒã«è¿ãããŸãã
- ã¿ã€ã«ã®è©³çŽ°ã¯RedisãšCassandraã«èšé²ãããŸãã
- çŸåšã®æéã¯ããŠãŒã¶ãŒã«ããæåŸã®ã¿ã€ã«é
眮ãšããŠCassandraã«èšé²ãããŸãã
- Webãœã±ãããµãŒãã¹ã¯ãæ¥ç¶ãããŠãããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«æ°ããã¿ã€ã«ã«é¢ããã¡ãã»ãŒãžãéä¿¡ããŸãã
å³å¯ãªäžè²«æ§ãç¶æããããã«ãCassandraã§ã®ãã¹ãŠã®æžã蟌ã¿ããã³èªã¿åãã¯ã QUORUMäžè²«æ§ã¬ãã«ã䜿çšããŠè¡ãããŸããã
å®éãããã§ã¯ããŠãŒã¶ãŒãäžåºŠã«è€æ°ã®ã¿ã€ã«ãæçš¿ã§ãããããã¬ãŒã¹ããããŸããã ã¹ããŒãž1ã3ã§ã¯ãããããã³ã°ã¯çºçããªãã£ããããã¿ã€ã«ãåæã«æç»ããããšãããšãæåã®æ®µéã§ãã¹ãã«åæ Œãã2çªç®ã®æ®µéã§æç»ãããŸãã äžéšã®ãŠãŒã¶ãŒã¯ãã®ãã°ãçºèŠããããã§ãïŒãŸãã¯ãªã¯ãšã¹ããéä¿¡ããé »åºŠã®å¶éãç¡èŠãããããã䜿çšããŸããïŒ-ãã®çµæãçŽ15,000ã¿ã€ã«ãé
眮ãããŸããïŒå
šäœã®ã0.09ïŒ
ïŒã
Redditã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠæž¬å®ãããèŠæ±é »åºŠãšå¿çæââéïŒ

ã¿ã€ã«ã®é
çœ®é »åºŠã®ããŒã¯ã¯ã1ç§ãããã»ãŒ200ã§ããã ããã¯333ã¿ã€ã«/ç§ã®æšå®å¶éãäžåã£ãŠããŸãïŒ5åããšã«100,000人ã®ãŠãŒã¶ãŒãã¿ã€ã«ãæçš¿ããå Žåã®å¹³åå€ïŒã

ç¹å®ã®ã¿ã€ã«ã®è©³çŽ°ãååŸãã

ç¹å®ã®ã¿ã€ã«ãèŠæ±ãããšããããŒã¿ã¯CassandraããçŽæ¥èªã¿åãããŸããã
Redditã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠæž¬å®ãããèŠæ±é »åºŠãšå¿çæââéïŒ

ãã®ãªã¯ãšã¹ãã¯éåžžã«äººæ°ãããããšã蚌æãããŠããŸãã éåžžã®ã¯ã©ã€ã¢ã³ããªã¯ãšã¹ãã«å ããŠã人ã
ã¯äžåºŠã«1ã¿ã€ã«ãã€ããŒãå
šäœãååŸããã¹ã¯ãªãããäœæããŸããã ãã®èŠæ±ã¯CDNã«ãã£ãã·ã¥ãããŠããªãããããã¹ãŠã®èŠæ±ã¯Redditã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠåŠçãããŸããã

ãããã®ãªã¯ãšã¹ãã«å¯Ÿããå¿çæéã¯éåžžã«çãããããžã§ã¯ãã®å
šæéãéããŠåãã¬ãã«ã«ä¿ãããŸããã
Webãœã±ãã
r / PlaceãWebãœã±ãããµãŒãã¹ã®æäœã«ã©ã®ããã«åœ±é¿ãããã瀺ãåå¥ã®ã¡ããªãã¯ã¯ãããŸããã ãããããããžã§ã¯ãã®éå§åãšå®äºåŸã«ããŒã¿ãæ¯èŒããããšã«ãããå€ãæšå®ã§ããŸãã
Webãœã±ãããµãŒãã¹ãžã®æ¥ç¶ã®ç·æ°ïŒ

r / Placeãèµ·åããåã®åºæ¬è² è·ã¯çŽ20,000æ¥ç¶ã§ãããŒã¯ã¯100,000æ¥ç¶ã§ããã ãã®ãããããŒã¯æã«ã¯ãããããçŽ80,000人ã®ãŠãŒã¶ãŒãåæã«r / Placeã«æ¥ç¶ããŠããŸããã
Webãœã±ãããµãŒãã¹ã®åž¯åå¹
ïŒ

r / Placeã®è² è·ã®ããŒã¯æã«ãWebãœã±ãããµãŒãã¹ã¯4ã®ã¬ããã/ç§ïŒåã€ã³ã¹ã¿ã³ã¹ã§150ã¡ã¬ããã/ç§ã24ã€ã³ã¹ã¿ã³ã¹ã®ã¿ïŒãéä¿¡ããŸããã
ããã³ããšã³ãïŒWebããã³ã¢ãã€ã«ã¯ã©ã€ã¢ã³ã
Placeã®ããã³ããšã³ããäœæããããã»ã¹ã§ã¯ãã¯ãã¹ãã©ãããã©ãŒã éçºã«é¢é£ããå€ãã®è€éãªã¿ã¹ã¯ã解決ããå¿
èŠããããŸããã iOSããã³Androidã®ãã¹ã¯ãããPCãã¢ãã€ã«ããã€ã¹ãªã©ããã¹ãŠã®äž»èŠãªãã©ãããã©ãŒã ã§ãããžã§ã¯ããåãããã«åäœããããšãæãã§ããŸããã
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯3ã€ã®éèŠãªæ©èœããããŸããã
- ããŒãã®ç¶æ
ããªã¢ã«ã¿ã€ã ã§è¡šç€ºããŸãã
- ãŠãŒã¶ãŒãããŒããšå¯Ÿè©±ã§ããããã«ããŸãã
- ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãå«ããã¹ãŠã®ãã©ãããã©ãŒã ã§åäœããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã®äž»ãªãªããžã§ã¯ãã¯ãã£ã³ãã¹ã§ããã Canvas APIã¯ããã«ãŽã£ããã§ããã ãµã€ãºã<canvas>
èŠçŽ ã䜿çšããåã¿ã€ã«ã¯åäžãã¯ã»ã«ãšããŠæç»ãããŸããã
ãã£ã³ãã¹æç»
Canvasã¯ãããŒãã®ç¶æ
ããªã¢ã«ã¿ã€ã ã§åæ ããããšã«ãªã£ãŠããŸãã ããŒãžãããŒããããšãã«ããŒãå
šäœãæç»ããWebãœã±ãããä»ããæŽæ°ãå®äºããå¿
èŠããããŸããã CanvasRenderingContext2D
ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšãããã£ã³ãã¹èŠçŽ ã¯ã CanvasRenderingContext2D
3ã€ã®æ¹æ³ã§æŽæ°ã§ããŸãã
drawImage()
ã䜿çšããŠãæ¢åã®ãã£ã³ãã¹ç»åãæç»ããŸãã- ããŸããŸãªãã©ãŒã ã¬ã³ããªã³ã°æ¹æ³ã䜿çšããŠãã©ãŒã ãæç»ããŸãã ããšãã°ã
fillRect()
ã¯é·æ¹åœ¢ãããè²ã§å¡ãã€ã¶ããŸãã ImageData
ãªããžã§ã¯ããäœæãã putImageData()
ã䜿çšããŠãã£ã³ãã¹ã«æç»ããŸãã
æåã®ãªãã·ã§ã³ã¯ãå®æããã€ã¡ãŒãžã®åœ¢ã®ããŒããæã£ãŠããªãã£ããããç§ãã¡ã«ã¯é©ããŠããŸããã§ããã ãªãã·ã§ã³2ãš3ããããŸãããæãç°¡åãªæ¹æ³ã¯ã fillRect()
ãfillRect()
åã
ã®ã¿ã€ã«ãæŽæ°ããããšfillRect()
ããæŽæ°ãWebãœã±ããçµç±ã§å°çãããšãäœçœ®ïŒxãyïŒã«1x1ã®é·æ¹åœ¢ãæç»ããŸãã äžè¬ã«ããã®æ¹æ³ã¯æ©èœããŸããããããŒãã®åæç¶æ
ãæç»ããã«ã¯ããŸã䟿å©ã§ã¯ãããŸããã§ããã putImageData()
ã¡ãœããã®æ¹ãã¯ããã«åªããŠããŸããputImageData()
ã€ã®ImageData
ãªããžã§ã¯ãã§åãã¯ã»ã«ã®è²ãå®çŸ©ããäžåºŠã«ãã£ã³ãã¹å
šäœãæç»ã§ããŸããã
ããŒãã®åæç¶æ
ãæã
putImageData()
ã䜿çšããã«ã¯ãããŒãã®ç¶æ
ãUint8ClampedArray
ã®åœ¢åŒã§æ±ºå®ããå¿
èŠããããŸããåå€ã¯ã0ã255ã®ç¯å²ã®8ããã笊å·ãªãæ°å€ã§ããåå€ã¯ãã«ã©ãŒãã£ã³ãã«ïŒèµ€ãç·ãéãã¢ã«ãã¡ïŒãââè¡šããåãã¯ã»ã«ã«ã¯4ã€å¿
èŠã§ãé
åå
ã®èŠçŽ ã 2x2ãã£ã³ãã¹ã«ã¯ãæåã®4ãã€ãããã£ã³ãã¹ã®å·Šäžã®ãã¯ã»ã«ãè¡šããæåŸã®4ãã€ããå³äžãè¡šã16ãã€ãé
åãå¿
èŠã§ãã
ãã£ã³ãã¹ãã¯ã»ã«ãUint8ClampedArrayè¡šçŸã«ã©ã®ããã«é¢é£ä»ãããããã以äžã«ç€ºããŸãã

ãããžã§ã¯ãã®ãã£ã³ãã¹ã«ã¯ã400äžãã€ã-4 MBã®é
åãå¿
èŠã§ããã
ããã¯ãšã³ãã§ã¯ãããŒãã®ç¶æ
ã¯4ãããã®ããããã£ãŒã«ããšããŠä¿åãããŸãã åè²ã¯ã0ã15ã®æ°å€ã§è¡šãããŸããããã«ãããåãã€ãã«2ãã¯ã»ã«ãè©°ããããšãã§ããŸãã ãããã¯ã©ã€ã¢ã³ãããã€ã¹ã§äœ¿çšããã«ã¯ã次ã®3ã€ã®ããšãè¡ãå¿
èŠããããŸãã
- APIããã¯ã©ã€ã¢ã³ãã«ãã€ããªããŒã¿ã転éããŸãã
- ããŒã¿ã解åããŸãã
- 4ãããã«ã©ãŒã32ãããã«å€æããŸãã
ãã€ããªããŒã¿ã転éããããã«ãããããµããŒããããã©ãŠã¶ã§Fetch API
ã䜿çšããŸããã ãããŠããµããŒãããŠããªã人ã®ããã«ãå€âarraybufferâ
ãæã€responseType
ã§XMLHttpRequest
ã䜿çšããŸããã
APIããåä¿¡ãããã€ããªããŒã¿ã«ã¯ãåãã€ãã«2ã€ã®ãã¯ã»ã«ãå«ãŸããŠããŸãã æå°ã®TypedArray
ã³ã³ã¹ãã©ã¯ã¿ãŒã«ãããã·ã³ã°ã«ãã€ãåäœã®åœ¢åŒã§ãã€ããªããŒã¿ãæäœã§ããŸãã ãã ããã¯ã©ã€ã¢ã³ãããã€ã¹ã§äœ¿çšããã«ã¯äžäŸ¿ã§ãããããããŒã¿ã解åããŠäœæ¥ããããããŸããã ããã»ã¹ã¯ç°¡åã§ããããã¯ãããããŒã¿ãå埩åŠçããå€ãããããšæ°ããããããåãåºããããããå¥ã®ãã€ãã«å¥ã®é
åã«ã³ããŒããŸããã
æåŸã«ã4ãããã®è²ã32ãããã«å€æããå¿
èŠããããŸããã

putImageData()
ã䜿çšããããã«å¿
èŠãªImageData
æ§é äœã¯ãæçµçµæããRGBAé åºã§ã«ã©ãŒãã£ãã«ããšã³ã³ãŒããããã€ããæã€Uint8ClampedArray
ã®åœ¢åŒã§ããUint8ClampedArray
ããããŸãã ããã¯ãå¥ã®ã¢ã³ããã¯ãå®è¡ããŠãåè²ãã³ã³ããŒãã³ããã£ãã«ãã€ãã«åå²ããæ£ããã€ã³ããã¯ã¹ã«é
眮ããå¿
èŠãããããšãæå³ããŸãã ãã¯ã»ã«ããšã«4ã€ã®ãšã³ããªãäœæããã®ã¯ããŸã䟿å©ã§ã¯ãããŸããã ãããã幞ããªããšã«ãå¥ã®ãªãã·ã§ã³ããããŸããã
TypedArray
ãªããžã§ã¯ãã¯ãåºæ¬çã«é
åã®åœ¢åŒã®ArrayBuffer
è¡šçŸã§ãã 泚æç¹ã1ã€ãããŸããè€æ°ã®TypedArray
ã€ã³ã¹ã¿ã³ã¹ãåãArrayBuffer
ã€ã³ã¹ã¿ã³ã¹ãArrayBuffer
ãŸãã 4ã€ã®å€ã8ãããé
åã«æžã蟌ã代ããã«ã1ã€ã®å€ã32ãããã®é
åã«æžã蟌ãããšãã§ããŸãïŒ æžã蟌ã¿ã«Uint32Array
ã䜿çšãããšãé
åã®1ã€ã®ã€ã³ããã¯ã¹ãæŽæ°ããã ãã§ãã¿ã€ã«ã®è²ãç°¡åã«æŽæ°ã§ããŸããã Uint8ClampedArray
ã Uint8ClampedArray
èªã¿åããšãã«ãã€ããèªåçã«æ£ããå Žæã«èœã¡ãããã«ãã«ã©ãŒãã¬ãããéãã€ãé ïŒABGRïŒã§ä¿åããå¿
èŠãããUint8ClampedArray
ã

Webãœã±ãããä»ããŠåä¿¡ããæŽæ°ã®åŠç
drawRect()
ã¡ãœããã¯ãåä¿¡ããåã
ã®ãã¯ã»ã«ã«ããæŽæ°ã®ã¬ã³ããªã³ã°ã«é©ããŠããŸãããã1ã€ã®åŒ±ç¹ããããŸãããåæã«å€§éã®æŽæ°ãè¡ããããšããã©ãŠã¶ãŒã®é床ãäœäžããå¯èœæ§ããããŸãã ãŸããåç· åœ¹äŒã®ç¶æ
ã®æŽæ°ã¯éåžžã«é »ç¹ã«è¡ãããå¯èœæ§ãããããšãç解ããŠãããããåé¡ãäœããã®åœ¢ã§è§£æ±ºããå¿
èŠããããŸããã
Webãœã±ãããä»ããŠæŽæ°ãåä¿¡ãããã³ã«ãã£ã³ãã¹ãããã«åæç»ãã代ããã«ãåæã«å°çããWebãœã±ããã®æŽæ°ããã³ãã«ããŠããã«äžæ¬ã§ã¬ã³ããªã³ã°ã§ããããã«ããããšã«ããŸããã ãã®ããã«2ã€ã®å€æŽãè¡ãããŸããã
drawRect()
䜿çšãputImageData()
ã䜿çšããŠäžåºŠã«å€ãã®ãã¯ã»ã«ãæŽæ°ãã䟿å©ãªæ¹æ³ãèŠã€ããŸããã- ãã£ã³ãã¹ã®æç»ãrequestAnimationFrameã«ãŒãã«è»¢éããŸãã
ã¬ã³ããªã³ã°ãã¢ãã¡ãŒã·ã§ã³ã«ãŒãã«è»¢éãããããã§ãå®éã®ã¬ã³ããªã³ã°ãé
ãããªããã ArrayBuffer
ãžã®Webãœã±ããã®æŽæ°ãããã«èšé²ããããšãã§ããŸããã ãã¬ãŒã éã§å°çãããã¹ãŠã®Webãœã±ããæŽæ°ïŒçŽ16ããªç§ïŒããã³ãã«ãããåæã«ã¬ã³ããªã³ã°ãããŸããã requestAnimationFrame
ãããã§ãæç»ã«æéãããããããå ŽåïŒ16ããªç§ããé·ãå ŽåïŒããã£ã³ãã¹ã®ãªãã¬ãã·ã¥ã¬ãŒãã«ã®ã¿åœ±é¿ãäžããŸãïŒãã©ãŠã¶ãŒå
šäœã®ããã©ãŒãã³ã¹ãäœäžãããŸããïŒã
ãã£ã³ãã¹ã®çžäºäœçš
ãŠãŒã¶ãŒãã·ã¹ãã ãšå¯Ÿè©±ããã®ããã䟿å©ã«ããããã«ããã£ã³ãã¹ãå¿
èŠã§ãã£ãããšã«æ³šæããããšãéèŠã§ãã äž»ãªçžäºäœçšã®ã·ããªãªã¯ããã£ã³ãã¹ã«ã¿ã€ã«ãé
眮ããããšã§ãã
ããããåãã¯ã»ã«ã1ïŒ1ã®ã¹ã±ãŒã«ã§æ£ç¢ºã«ã¬ã³ããªã³ã°ããããšã¯éåžžã«é£ããããšã©ãŒãåé¿ããããšã¯ã§ããŸããã ãã®ããããºãŒã ãå¿
èŠã§ããïŒå€§ããªïŒïŒã ããã«ããŠãŒã¶ãŒã¯ãã£ã³ãã¹ãç°¡åã«ããã²ãŒãã§ããå¿
èŠããããŸãããã»ãšãã©ã®ç»é¢ã§ã¯ãã£ã³ãã¹ã倧ããããããã§ãïŒç¹ã«ãºãŒã ã䜿çšããå ŽåïŒã
ãºãŒã
ãŠãŒã¶ãŒã¯5åããšã«ã¿ã€ã«ãæçš¿ã§ãããããé
眮ãšã©ãŒã¯ç¹ã«äžå¿«ã§ãã ã¿ã€ã«ãååã«å€§ãããé©åãªå Žæã«ç°¡åã«é
眮ã§ãããããªåçã®ãºãŒã ãå®è£
ããå¿
èŠããããŸããã ããã¯ãã¿ããã¹ã¯ãªãŒã³ããã€ã¹ã§ã¯ç¹ã«éèŠã§ããã
40xãºãŒã ãå®è£
ããŸãããã€ãŸããåã¿ã€ã«ã®ãµã€ãºã¯40x40ã§ããã <canvas>
ã<div>
ã«ã©ããããCSS transform: scale(40, 40)
ãé©çšããŸããã ããã¯ã¿ã€ã«ãé
眮ããããã®åªãããœãªã¥ãŒã·ã§ã³ã§ããããããŒãã®è¡šç€ºãé£ãããªããŸããïŒç¹ã«å°ããªç»é¢ã§ïŒã®ã§ã2段éã®ãºãŒã ãè¡ããŸããã
CSSã䜿çšããŠãã£ã³ãã¹ãã¹ã±ãŒãªã³ã°ãããšãããŒããæç»ããããã®ã³ãŒããšã¹ã±ãŒãªã³ã°ã®ããã®ã³ãŒããç°¡åã«åé¢ã§ããŸããã ãããããã®ã¢ãããŒãã«ã¯ããã€ãã®æ¬ ç¹ããããŸããã ç»åïŒãã£ã³ãã¹ïŒãã¹ã±ãŒãªã³ã°ããå Žåããã©ãŠã¶ã¯ããã©ã«ãã§ç»åå¹³æ»åã¢ã«ãŽãªãºã ãé©çšããŸãã å Žåã«ãã£ãŠã¯ãããã¯äžäŸ¿ããåŒãèµ·ãããŸããããåã«ãã¯ã»ã«ã°ã©ãã£ãã¯ãç Žå£ãããã£ããã®æ··ä¹±ã«å€ããŸãã è¯ããã¥ãŒã¹ã¯ãCSSããããã£image-rendering
ãããããšã§ããããã«ããããã©ãŠã¶ã«ã¢ã³ããšã€ãªã¢ã¹ãé©çšããªãããã«ãæ±ãããããšãã§ããŸããã æ®å¿µãªããšã«ããã¹ãŠã®ãã©ãŠã¶ããã®æ©èœãå®å
šã«ãµããŒãããŠããããã§ã¯ãããŸããã
ãºãŒã ãŒããïŒ

ãããã®ãã©ãŠã¶ã§ã¯ãå¥ã®ã¹ã±ãŒãªã³ã°æ¹æ³ãèŠã€ããå¿
èŠããããŸããã åè¿°ããããã«ããã£ã³ãã¹ã«æç»ããæ¹æ³ã¯3ã€ãããŸãã æåã®drawImage()
ã¯ãæ¢åã®ç»åãŸãã¯ä»ã®ãã£ã³ãã¹ã®ã¬ã³ããªã³ã°ããµããŒãããŸãã ãŸããã¬ã³ããªã³ã°äžã®ç»åã®æ¡å€§çž®å°ããµããŒãããŠããŸãïŒå¢å ãŸãã¯æžå°ïŒã ãã®å¢å ã«ã¯ãåè¿°ã®CSSãšåããŒããã®åé¡ããããŸããã CanvasRenderingContext2D.imageSmoothingEnabled
ãã©ã°ãåé€ããããšã«ããããã©ãŠã¶ãŒãµããŒãã®èŠ³ç¹ããããæ®éçãªæ¹æ³ã§è§£æ±ºã§ããŸãã
ããã§ãã¬ã³ããªã³ã°ããã»ã¹ã«å¥ã®ã¹ããããè¿œå ããããšã§ããã£ã³ãã¹ã®ãŒããã«é¢ããåé¡ã解決ããŸããã ãããè¡ãããã«ãå¥ã®<canvas>
ãäœæããŸããããã®<canvas>
ãµã€ãºãšäœçœ®ã¯ãã³ã³ããèŠçŽ ïŒã€ãŸããããŒãã®è¡šç€ºé åïŒãšäžèŽããŸãã æ°ãããã£ã³ãã¹ã§drawImage()
ã䜿çšããŠãã£ã³ãã¹ãåæç»ããåŸã衚瀺ãããŠããéšåãç®çã®çž®å°ºã§æç»ãããŸãã ãã®è¿œå æé ã«ããã¬ã³ããªã³ã°ã®ã³ã¹ãããããã«å¢å ãããããCSS image-rendering
ããããã£ããµããŒãããªããã©ãŠã¶ãŒã§ã®ã¿äœ¿çšããŸããã
ãã£ã³ãã¹ã®åã
ãã£ã³ãã¹ã¯ãç¹ã«ããããã®åœ¢åŒã®ãããªã倧ããªç»åã§ãããã®ããããã£ã³ãã¹ã移åã§ããããã«ããå¿
èŠããããŸããã ç»é¢äžã®ãã£ã³ãã¹ã®äœçœ®ã調æŽããããã«ãã¹ã±ãŒãªã³ã°ã®å Žåãšåãã¢ãããŒãã䜿çšããŸãããCSS transform: translate(x, y)
ãé©çšããå¥ã®<div>
ã§<canvas>
ãã©ããããŸããtransform: translate(x, y)
ã å¥ã®divã®ãããã§ããã£ã³ãã¹ã«å€æãé©çšããé åºãç°¡åã«å¶åŸ¡ããããšãã§ããŸãããããã¯ããºãŒã ãå€æŽãããšãã«ãã«ã¡ã©ãã®åããé²ãããã«å¿
èŠã§ããã
ãã®çµæããã«ã¡ã©ãã®äœçœ®ã調æŽããããŸããŸãªæ¹æ³ã®ãµããŒããæäŸããŸããã
- ãã¯ãªãã¯ããŠãã©ãã°ãïŒã¯ãªãã¯ããŠãã©ãã°ããŸãã¯ã¿ããããŠãã©ãã°ïŒ;
- ãã¯ãªãã¯ããŠç§»åãïŒã¯ãªãã¯ããŠç§»åïŒ;
- ããŒããŒãããã²ãŒã·ã§ã³ã
ãããã®ã¡ãœããã¯ããããç°ãªãæ¹æ³ã§å®è£
ãããŸãã
ã¯ãªãã¯ããŠãã©ãã°
ãããäž»ãªããã²ãŒã·ã§ã³æ¹æ³ã§ãã mousedown
ã€ãã³ãã®x
座æšãšy
座æšãmousedown
ãŸããã ãããã®åã€ãã³ãã«ã€ããŠãåæäœçœ®ã«å¯ŸããããŠã¹ã«ãŒãœã«ã®äœçœ®ã®å€äœãæ€åºãããã®å€äœããã£ã³ãã¹ã®æ¢åã®ãªãã»ããã«è¿œå ããŸããã ã«ã¡ã©ã®äœçœ®ã¯ããã«æŽæ°ããããããããã²ãŒã·ã§ã³ã¯éåžžã«åå¿ãè¯ãã£ãã§ãã
ãã¯ãªãã¯ããŠç§»åã
ã¿ã€ã«ãã¯ãªãã¯ãããšãç»é¢ã®äžå€®ã«é
眮ãããŸãã ãã®ã¡ã«ããºã ãå®è£
ããã«ã¯ããã¯ãªãã¯ããšãåãããåé¢ããããã«ã mouseup
ã€ãã³ããšmouseup
ã€ãã³ãéã®è·é¢ã远跡ããmousedown
ããmouseup
ã ããŠã¹ã移åããè·é¢ãã移åããšèŠãªãã®ã«ååã§ãªãå Žåããã«ã¡ã©ãã®äœçœ®ã¯ãããŠã¹ã®äœçœ®ãšç»é¢ã®äžå€®ã®ãã€ã³ããšã®å·®ã«åºã¥ããŠå€åããŸãã 以åã®ããã²ãŒã·ã§ã³æ¹æ³ãšã¯ç°ãªãããã«ã¡ã©ãäœçœ®ã¯å¹³æ»åæ©èœã䜿çšããŠæŽæ°ãããŸããã ããã«æ°ããäœçœ®ãèšå®ãã代ããã«ãããããã¿ãŒã²ããããšããŠä¿åããŸããã ã¢ãã¡ãŒã·ã§ã³ãµã€ã¯ã«ïŒãã£ã³ãã¹ã®åæç»ã«äœ¿çšããããã®ãšåãïŒå
ã§ãã¹ã ãŒãºæ©èœã䜿çšãããã«ã¡ã©ãã®çŸåšã®äœçœ®ãã¿ãŒã²ããã®è¿ãã«ç§»åããŸããã ããã«ãããæ¥æ¿ãªåãã®åœ±é¿ãåãé€ãããšãã§ããŸããã
ããŒããŒãããã²ãŒã·ã§ã³
ããŒããŒãã®ç¢å°ãŸãã¯WASDã䜿çšããŠãã£ã³ãã¹ãããã²ãŒãããããšãã§ããŸããã ãããã®ããŒã¯ãå
éšã¢ãŒã·ã§ã³ãã¯ãã«ãå¶åŸ¡ããŸããã ã©ã®ããŒãæŒãããŠããªãå Žåãããã©ã«ãã®ãã¯ãã«ã«ã¯åº§æšïŒ0ã0ïŒããããŸãã ããããã®ããã²ãŒã·ã§ã³ããŒãæŒããšã x
ãŸãã¯y.
1ãè¿œå ãããŸãy.
ããšãã°ããå³ããšãäžããæŒããšããã¯ãã«ã®åº§æšã¯ïŒ1ã-1ïŒã«ãªããŸãã 次ã«ããã®ãã¯ãã«ãã¢ãã¡ãŒã·ã§ã³ã«ãŒãå
ã§äœ¿çšããŠããã«ã¡ã©ãã移åããŸããã
ã¢ãã¡ãŒã·ã§ã³äžã«ã次ã®åŒã䜿çšããŠãè¿äŒŒã®ã¬ãã«ã«å¿ããŠç§»åé床ãèšç®ãããŸããã
movementSpeed = maxZoom / currentZoom * speedMultiplier
ãºãŒã ããªãã«ãããšããã¿ã³ã®å¶åŸ¡ãéããªããã¯ããã«èªç¶ã«ãªããŸããã
次ã«ãåããã¯ãã«ãæ£èŠåãããåãã®é床ãä¹ç®ããããã«ã¡ã©ãã®çŸåšã®äœçœ®ã«é©çšãããŸããã æ£èŠåã¯ã察è§ç·ãšçŽäº€ã®åãã®é床ãäžèŽããããã«äœ¿çšãããŸããã æåŸã«ãåããã¯ãã«èªäœã®å€åã«æ»ãããé¢æ°ãé©çšããŸããã , «» .
iOS- Android- . -, , . -, , OAuth: WebView . OAuth JS- WebView. . API:
r.place.injectHeaders({'Authorization': 'Bearer <access token>'});
iOS , . WebView, . , iOS 8 JS-:
webkit.messageHandlers.tilePlacedHandler.postMessage(this.cooldown / 1000);
.

-
. , . . . , , - . ããïŒ
. r/Place :


. , . , . , , :

, , . «» ? , Place , . , , Live- . , , , . .
, : â . .
:

, . , production- RabbitMQ, -, , reddit.com. . .
, . - , , Rabbit Diamond collector . , , -, , , Rabbit, . â .
, :
$ cat s****y_diamond.sh #!/bin/bash /usr/sbin/rabbitmqctl list_queues | /usr/bin/awk '$2~/[0-9]/{print "servers.foo.bar.rabbit.rabbitmq.queues." $1 ".messages " $2 " " systime()}' | /bin/grep -v 'amq.gen' | /bin/nc 10.1.2.3 2013
, - , : . - .
, :

. r/place/new:

, .
. , . , , . ãããŠãŸãã ãããŠãŸãã - , , , .
Place, , , « » . . , Fastly.
-
r/Place , . u/gooeyblob, u/egonkasper, u/eggplanticarus, u/spladug, u/thephilthe, u/d3fect , .