This tweet is recursive. https://t.co/bZISaPd3Ts
— Quine Tweet (@quine_tweet) 2016å¹´9æ19æ¥
ããã®ãã¤ã¼ãã¯ããã¾ãããã¨ãªã£ã¦ãã¾ãããURL ãã¯ãªãã¯ããã°èªåèªèº«ã«é£ã¹ã¾ãã
以ä¸ããã®ãã¤ã¼ããçã¾ããã¾ã§ã®çµç·¯ãé·ã ã¨æ¸ãã¾ãã
åé¡è¨å®
ãã®ãã¤ã¼ãèªèº«ã® URL ãåãè¾¼ãã ãã¤ã¼ããä½ãã¾ãããã¤ã¼ãã® URL ã¯ãã¤ã¼ããããå¾ã§ãªãã¨æ±ºã¾ããªããããã¤ã¼ãæé¢ãå¾ããæ´æ°ããæ段ã¯ãªãï¼ã¨æãï¼ã®ã§ãåç´ã§ããæå¤ã«é£ããåé¡ã§ãã
調æ»
ãåç¥ã®ããã«ãç¾å¨ã®ãã¤ã¼ãã® URL ã¯æ¬¡ã®ãããªå½¢å¼ã§ãã
https://twitter.com/<username>/status/<id>
username ã¯ãã®ã¾ã¾ãªã®ã§ãid ãäºåã«äºæ¸¬ã§ããã°è§£æ±ºã§ãã*1
調ã¹ã¦ã¿ãã¨ãã® id ã¯ãsnowflake ã¨ããåæ£ãã³ããªã³ã°ã·ã¹ãã ã§æ±ºãããã¦ããããã§ãããããã¤ãã®è§£èª¬è¨äºã«ããã¨ãid ã¯ä»¥ä¸ã®ãã㪠64 ãããæ´æ°ã§ããããã§ãã
+--------------------+--------------------+-------------------+ | timestamp (42 bit) | worker-id (10 bit) | sequence (12 bit) | +--------------------+--------------------+-------------------+
ããããã®æå³ã¯ä»¥ä¸ã®éããç´°ãããã¨ã¯ snowflake ã®ã½ã¼ã¹ã³ã¼ã*2ãè¦ã¦ç¢ºããã¾ããã
- sequence: åãããªç§æ å ã§ã®è¡çªãåé¿ããããã®ã·ã¼ã±ã³ã¹çªå·ï¼ããªç§ãã¨ã« 0 ãªã»ããï¼
- worker-id: ãã® id ãçºè¡ãããµã¼ãåºæã®çªå· *3
- timestamp: System.currentTimeMillis() - 1288834974657L ã®å¤ãï¼2010-11-04 10:42:54 é ããã®çµéããªç§ï¼
ä¸ä½ãããã timestamp ãªã®ã§ããã®çªå·ã¯ããããæéé ã«å¢ãã¦ããã¾ãã
ã¢ããã¼ã
ããããã®å¤ãäºæ¸¬ã㦠id ãä½ãããã¤ã¼ããæãã¦ã¿ã¦ãå¤ããããã¤æ¶ããQuine ãã¤ã¼ãã«æåããã¾ã§ã延ã ã¨ãããç¶ãã¾ããåãã¤ã¼ã試è¡ã¯ç¬ç«ã¨ä»®å®ããã°ãå ¸åçãªãã«ãã¼ã¤è©¦è¡ã§ããã
観å¯ã¨è¦ç©
TL ã«æµãã¦ãããã¤ã¼ããããã¤ãéãã¦ãããããã®å¤ã®å¾åã観å¯ãã¦ãæåã¾ã§ã«ããããããªæéãè¦ç©ããã¾ããã
- sequence ã¯ããªç§ãã¨ã«ãªã»ãããããã®ã§ã0 ã¨äºæ³ããã®ãéæ¿ã§ããå®éãTL ã«æµãã¦ãããã¤ã¼ãã® sequence ãããã¤ãæ¾ã£ã¦ã¿ã㨠0 ãå¤ãã§ããã1 æ¥ã«ãã¤ãã¿ã¼ã«æµããå ¨ãã¤ã¼ãæ°ã¯æ°åã§ã1 æ¥ã¯ 8640 ä¸ããªç§ãªã®ã§ãæé帯ã®åããèããã°ãããªãã®ã§ãããã
- worker-id ã¯åççã«ã¯ 2^10 = 1024 éãã®å¤ãåããã¾ããããã¤ãã®ãã¤ã¼ãã観å¯ãã¦ãç¹ã«å¾åã¯ã¤ããã¾ããã§ããã
- timestamp ã¯ããªãã¨ãªã ±500 ããªç§ãããã®ç²¾åº¦ã§å½ã¦ãããããããªãããªã¼ã¨èãã¾ããã
ãããã®è¦³å¯ãããå¤ãä¸è´ãã確çï¼ãããçã¨å¼ã¶ãã¨ã«ãã¾ãï¼ããããã 50 % ã0.1 % ã0.1 % ã¨ä»®å®ãã¾ãããããããã®å¤ãä¸è´ãã確çã¯ç¬ç«ã¨ä»®å®ãã¦ãQuine ãã¤ã¼ããçã¾ãã確ç㯠50 % à 0.1 % à 0.1 % = 0.00005 % ãæå¾ å¤ã§è¨ã㨠200 ä¸åã®ãã¤ã¼ã㧠1 åæåããè¨ç®ã«ãªãã¾ãã
ãã¤ãã¿ã¼ API ã®ã¬ã¼ããªãããã調ã¹ãã¨ã1 æéã« 100 ãã¤ã¼ãç¨åº¦ã許ãããããã§ããå°ãä½è£ãè¦ã¦ã40 ç§ã« 1 åãã¤ã¼ããããã¨ã«ãã¾ããã200 ä¸åã®ãã¤ã¼ããããã«ã¯ 3 å¹´å¼±ãããè¨ç®ã«ãªãã¾ãã
å¤ | äºåè¦ç© |
---|---|
sequence ãããç | 50 % |
worker-id ãããç | 0.1 % |
timestamp ãããç | 0.1 % |
å¿ è¦ãªãã¤ã¼ãæ°æå¾ å¤ | 2M å |
æè¦æéã®è¦è¾¼ã¿ | 3 å¹´ |
å¿ãæãããã«ãªãã¾ãããã3 å¹´ãããã® Quine ã¨ããã®ãããã³ããã£ã¦ããã ãã*4ãã¨ååãã«èããã¨ãããããã£ã¦ã¿ããã¨ã«ãã¾ããã
ç°¡æçã§ã®è©¦è¡
å°ç¨ã® Twitter ã¢ã«ã¦ã³ããä½æãã次ã®ãããªé©å½ãªäºæ¸¬ã§ææ¦ãã¾ããã
- sequence 㯠0 åºå®ã
- worker-id ã¯ãååã®å¤±æãã¤ã¼ãã® worker-id ããã®ã¾ã¾éããã¨ããæ¦ç¥ããã³ããªã³ã°ãµã¼ãã常æ 1024 å°èµ·åãã¦ã¯ãªãããã§ããããã¼ããã©ã³ãµã®æ¯ãåãå ã«ãåãããããããªããã¨æå¾ ã
- timestamp ã¯åç´ã«ãååã®å¤±æãã¤ã¼ããã 40,000ï¼40 ç§ï¼ã足ãã¦ä½ãã¾ãããã ãããã¼ã«ã«ã®æè¨ã¨ååã®å¤±æãã¤ã¼ãã® timestamp ã®ãºã¬ãè¦ã¦ããã¤ã¼ãçºå°ã¿ã¤ãã³ã°ã¯èª¿æ´ãã¾ãã
ããã§åæ¥èµ°ããã¦ã¿ã¾ããããã¾ããå½ããã¾ããã§ããã
失æãã¼ã¿ã®åæ
試è¡ã«ãã£ã¦ 1000 ãã¤ã¼ãåãããã®å¤±æãã¼ã¿ãæºã¾ã£ãã®ã§ãããããã®å¤ã®ãããçãè©ä¾¡ãã¦ã¿ã¾ããã
å¤ | äºåè¦ç© | ç°¡æç |
---|---|---|
sequence ãããç | 50 % | 80 % |
worker-id ãããç | 0.1 % | 7.0 % |
timestamp ãããç | 0.1 % | 0.05 % |
å¿ è¦ãªãã¤ã¼ãæ°æå¾ å¤ | 2M å | 35k å |
æè¦æéã®è¦è¾¼ã¿ | 3 å¹´ | 17 æ¥ |
worker-id ã¯äºæ³ãããããªãå½ã¦ããããã¨ããããã¾ããã
timestamp ã¯ã1000 ãã¤ã¼ãç¨åº¦ã§ã¯ 1 åãããããã¾ããã§ãããäºåè¦ç©ããè¨ã£ã¦ãã1000 ãã¤ã¼ã㧠timestamp ããããããæå¾
å¤ã¯ 1 ãªã®ã§ãããããªãèªä½ã¯æ³å®ç¯å²ã§ãããããã誤差åå¸ãè¦ã¦ã¿ã㨠±1500 ããªç§ãããã§åºãã£ã¦ãã¦ãäºæ³ãããå³ãããã§ãã誤差åå¸ãカーネル密度推定ãã¦ãããçãè¦ç©ãã£ãã¨ããã0.05 % ã§ããããããã¯ã¼ã¯è¶ãã ã¨ãããªãã®ãã
ããã worker-id ã®ãããçãã ãã¶æ¥½è¦³è¦ã§ããããã«ãªã£ãã®ã§ãæè¦æéã®æå¾ å¤ãè¨ç®ããªããã¨ãç´ 17 æ¥ã«ãªãã¾ããã3 å¹´ã«æ¯ã¹ããå ¨ç¶è¡ãã¾ããããã³ã¯ãªããªãã¾ãããã
æ¹è¯çã§ã®ææ¦
17 æ¥ãªãå¾ ã£ã¦ããããã§ããããã£ãããªã®ã§äºæ¸¬æ¹å¼ãæ¹è¯ãã¾ããã
- sequence ã¯å¤ããã 0 åºå®ã
- worker-id ã¯ããç´è¿ 5 ã¤ã®å¤±æãã¤ã¼ãã® worker-id ãå¤æ°æ±ºãã¦é¸ã¶ãã¨ãã¾ããã*5
- timestamp ã®ã¿ã¤ãã³ã°è£æ£ã« PID 制御ãå°å ¥ãã¾ããã
ããã§ãããçãè¦ã¦ã¿ã¾ãããï¼2 æ¥ã»ã©èµ°ãããæç¹ï¼
å¤ | äºåè¦ç© | ç°¡æç | æ¹è¯ç |
---|---|---|---|
sequence ãããç | 50 % | 80 % | 75 % |
worker-id ãããç | 0.1 % | 7.0 % | 9.8 % |
timestamp ãããç | 0.1 % | 0.05 % | 0.08 % |
å¿ è¦ãªãã¤ã¼ãæ°æå¾ å¤ | 2M å | 35k å | 15k å |
æè¦æéã®è¦è¾¼ã¿ | 3 å¹´ | 17 æ¥ | 8 æ¥ |
sequence ãè¥å¹²æªåãã¾ããããç°¡æçã§ãã¼ã¿æ¡åããã¨ã㯠Twitter ãæ··éãã¦ããªãæé帯ã ã£ãã®ãããï¼ããããã¨ã㯠sequence ã®è¡çªãçãã«ããï¼
ã¨ã«ãããããã§æè¦æéã®æå¾ å¤ã¯ç´ 8 æ¥ã«ãããã§ã¡ããã©å¸°çããã¿ã¤ãã³ã°ã«ãªã£ãã®ã§ãã¢ãã¿ãªã³ã°ã®ä»çµã¿ã ãä½ã£ã¦ãã®ã¾ã¾æ¾ç½®ãã¾ããã
çµæ
ç°¡æçã®å®é¨ã 9 æ 13 æ¥ã«ãã£ã¦ãæ¹è¯çã 9 æ 14 æ¥ã® 0 æããããæ¹è¯çã®å®è¡ãéå§ãã¾ããã9 æ 20 æ¥ã®æ 5 æããã14377 ãã¤ã¼ãç®ã«ãã¦ãã¤ãã« Quine ã«æåãã¾ãããè¦ç¯ 6 æ¥ã¨ 5 æéãã ãããäºæ³éãã§ããã
æ£ç´ãããããä¸å®ã§ããããã£ããæåããã®ã«ã¹ã¯ãªããã®ãã°ã§ãã¤æ¶ããã¦ãã¾ããªãã*6ã¨ããTwitter å´ã§å®å
¨ã« recursive ãªãã¤ã¼ãã¯ã¨ã©ã¼æ±ãã«ãããããªå¦çãå
¥ã£ã¦ããªããã¨ãããéå§ãã 5 æ¥çµã£ã¦ããããããããå½ãã£ã¦ããããããªãâ¦â¦ãã¿ãããªå
¸åçãªã®ã£ã³ãã©ã¼ã®èª¤è¬¬ã«é¥ã£ãããå®éã«ãã¾ãããã¨ããã¨ãã¾ããããã®ä¸å®ã3 å¹´éã¯èããããªãã£ãæ°ãããã
é¢é£ç 究
ããå§ããå¾ã§æ°ã¥ãããã§ããããã¿èªä½ã¯æ¢åºã§ãããã·ã§ãã¯ã
ãã㯠2009 å¹´ã®ãã¤ã¼ãã§ããå½æã® Twitter ã§ã¯ãid ããã ã®é£çªã§ãä¸å®ééã§ãã¤ã¼ããæããã°çªå·ãããã 200 å¢ããï¼作者による解説ã®å³ãè¦ãã¨ãããã¾ããã¬ã¦ãªãï¼ã®ã§ãä»ããã ãã¶é£æ度ãä½ãã£ãããã§ããããªç§å½ã¦ããªãã¦ããã®ã¯å¤§ãããSelf referential tweet http://twitter.com/SelfRefer/status/3128391843
— Diomidis Spinellis (@SelfRefer) 2009å¹´8æ4æ¥
ç¾å¨ã®ãã³ããªã³ã°ã·ã¹ãã ã«ãªã£ã¦ããã®ãã®ã¨ãã¦ã¯ã次ã®ãã¤ã¼ããããã¾ããã
ãã ãããã¯チートという噂ã§ããTinyURL ãä½ãããã®ç¶æ ã§ãã¤ã¼ããããã®ãã¤ã¼ãã® URL 㧠TinyURL ãå®æããããã¨ããæé ã§ã§ããããã§ããI love recursion, as seen here: http://t.co/M8jOdH8
— Markus Persson (@notch) 2011å¹´8æ15æ¥
ã¾ãä»ããç°¡åã ããããã¼ãã ãããæ¢åºãã¿ã¯æ¢åºãã¿ãªãã§ããã楽ããã£ãã®ã§ãããã¨ã«ãã¾ãã
ä»å¾ã®èª²é¡
ãã¨ãã¨ä½ãããã£ãã®ã¯ãèªåèªèº«ãåãè¾¼ãã ãã¤ã¼ããã ã£ãã®ã§ãããæ®å¿µãªããããã®ãã¤ã¼ãã¯ããã¾ãããã¨ãªã£ã¦ãã¾ãã¾ããããã¤ã¼ãä½ææç¹ï¼èªåèªèº«ãã¾ã ä½æããã¦ããªãï¼ã§ãªã³ã¯å
ããã§ãããã¦è¨é²ãããããªã®ã§ãå½ããåã§ãããæ®éã® Twitter card ã®ãªã³ã¯ãªã 1 é±éç¨åº¦ã§åã¯ãã¼ã«ãã¦ããããããã§ããããã¤ã¼ãã®ãªã³ã¯ã¯ Twitter card ã¨ã¯å¥ã®ä»çµã¿ã§åãè¾¼ã¾ãã¦ããã£ã½ãã®ã§ãã¯ãã¼ã«ãç´ãã¦ãããªãäºæããã¾ã*7ãæ®å¿µãä½ãæã¯ããããªãã
äºæ¸¬çãªæ¹è¯ã®ä½å°ã¯ 2 ã¤ãã¾ãããã¤ã¼ãçºå°ã¹ã¯ãªããã Ruby ãªã®ã§ãçºå°ã¿ã¤ãã³ã°èªä½ãããªç§åä½ã§ã¯å¶å¾¡ã§ãã¦ãã¾ããããªã¢ã«ã¿ã¤ã OS ã§ãã£ã¨ãã¡ãã¨å¶å¾¡ãã¦çºå°ããã°ãã¯ã©ã¤ã¢ã³ãå´ã®ãã¬ãæ¸ã£ã¦ timestamp ã®ãããçãä¸ããå¯è½æ§ãããã¾ãï¼ãããããã¯ã¼ã¯ã¨ Twitter ãµã¼ãã®ãã¬ã¯æ¶ããªãã®ã§ã大ããæ¹åãããã¨ã¯ãªãã¨æã£ã¦ããï¼ããããã worker-id ã¯ããããã¯ã·ã§ã³ã¬ãã«ã®ãµã¼ãã¹ããã¼ããã©ã³ãµã®ç¥èãæã£ã¦ãã人ãèããã°ããã£ã¨è³¢ãäºæ¸¬æ¹æ³ãæãã¤ãã®ããç¥ãã¾ããã
ä»ã«ä½ãããã®ã¯ãç¸äºå帰çãªãã¤ã¼ãã®ãã¢ã§ããã¨ãã£ã¦ãåããããªé£æ度ã§ä½ããã¯ãï¼æè¦æéã¯åã«ãªãï¼ãä»å¾ã Quine Tweet ã®æ¡æãç¶ããããã«ã¯ãèªå®
PC ã§ã¯ã¤ããã®ã§ VPS ãªã©ãåãããã¨ããã§ãããããã®ããã«ãéã¯æããããªããªãããã*8
ã¾ã¨ã
Quine ãä½ãã«ã¯ããã¼ã¿ãµã¤ã¨ã³ã¹ãå¶å¾¡çè«ã®ã¡ãã£ã¨ããç¥èãå½¹ã«ç«ã¤ãã¨ãããã¾ã*9ãQuine èªä½ã¯ä½ã®å½¹ã«ããã¡ã¾ããããããããªç¥èã»æè¡ãå®è·µçã«è©¦ããã£ããã«æé©ãªã®ã§ããã²ããªããã
*1:ä½è«ã§ãããusername ã®é¨åã¯å¥ã®æååã«å¤ãã¦ããã¤ã¼ãã¯éããããã§ãï¼æ£ãã username ã«è»¢éãããï¼ãusername ãå¤ãã¦ãããããªã³ã¯ã«ãªããªãããã«ãããªã£ã¦ããã¨æããã¾ãããä»äººã®ãã¤ã¼ãã URL ä¸ã§ã¯å½è£ ã§ããã¨ãè¨ãã¾ããâ¦â¦ã
*2:GitHub ã®ãªãã¸ããªããã¯æ¶ãã¦ãã¾ãããREADME ã«ããéãããªãªã¼ã¹ã¯æ®ã£ã¦ãã¾ãã
*3:snowflake ã®ã½ã¼ã¹ã³ã¼ãå ã§ã¯ãdatacenter-id 㨠worker-id ã¨ããååã§ããããã 5 ããããã¤ã®ããã§ãã
*4:3 å¹´ãªãããããçãã¦ãããã¡ã«ã¯çµããã ããããæ稿ã¹ã¯ãªãããã»ã¨ãã© sleep ãªã®ã§é»æ°ä»£ã¯ããããªããã
*5:åæ°ã®å ´åã¯é©å½ã5 ã¨ãããã©ã¡ã¼ã¿ã¯ã1000 ã®å¤±æãã¤ã¼ãã®ãã¼ã¿ã§ã·ãã¥ã¬ã¼ã·ã§ã³ãã¦ä¸çªãããçãé«ããªã£ãå¤ã
*6:å®éãæåæã®å¦çã« typo ããã£ã¦ä¾å¤ã«ãªã£ã¦ã¾ããããã¤æ¶ãã«ã¯è³ããªãã£ããã®ã®ãããã ãã Ruby ã¯â¦â¦ï¼éæ¨ã¿ï¼
*7:åå¨ããªãã£ããã¤ã¼ã URL ãå¾ããç¾ããå¯è½æ§ãèæ ®ããå¿ è¦ã¯ï¼æ®éã¯ï¼ãªãã®ã§ã
*8:ä»ã«ã Twitter bot ä½ããããã¿ã¯ãããã§ãããVPS ãã±ãã£ã¦ããã®ã§è©±ãé²ã¾ãªãã
*9:大ãããã¨ãã¦ãªãã®ã«åããã