<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: TianZhen</title>
    <description>The latest articles on DEV Community by TianZhen (@dawncold).</description>
    <link>https://dev.to/dawncold</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F32749%2F6e16b65b-af30-481f-9144-d41a1cb450aa.jpeg</url>
      <title>DEV Community: TianZhen</title>
      <link>https://dev.to/dawncold</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dawncold"/>
    <language>en</language>
    <item>
      <title>New to dev.to, how it works so fast</title>
      <dc:creator>TianZhen</dc:creator>
      <pubDate>Sat, 09 Sep 2017 02:59:20 +0000</pubDate>
      <link>https://dev.to/dawncold/new-to-devto-how-it-works-so-fast</link>
      <guid>https://dev.to/dawncold/new-to-devto-how-it-works-so-fast</guid>
      <description>&lt;p&gt;&lt;a href="//dev.to"&gt;dev.to&lt;/a&gt; is so fast for me, I'm wondering how it works so fast, after I registered and write a post, I know some of it.&lt;/p&gt;

&lt;p&gt;The posts are written in &lt;code&gt;Markdown&lt;/code&gt; and generated to a static file, just like some static-blog-generator, they have same syntax: some mate info at the beginning of post.&lt;/p&gt;

&lt;p&gt;But I love that, hope someday I could export all my posts and build a personal blog.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Job queue rollback</title>
      <dc:creator>TianZhen</dc:creator>
      <pubDate>Sat, 02 Sep 2017 08:10:10 +0000</pubDate>
      <link>https://dev.to/dawncold/job-queue-rollback</link>
      <guid>https://dev.to/dawncold/job-queue-rollback</guid>
      <description>&lt;h2&gt;
  
  
  èƒŒæ™¯
&lt;/h2&gt;

&lt;p&gt;æˆ‘ä»¬çš„å¼‚æ­¥é˜Ÿåˆ—æ˜¯&lt;a href="https://github.com/closeio/tasktiger"&gt;Tasktiger&lt;/a&gt;ï¼Œä¸€ä¸ªèƒŒåŽæœ‰å•†ä¸šå…¬å¸æ”¯æŒçš„å¼€æºé¡¹ç›®ã€‚&lt;/p&gt;

&lt;p&gt;ä¹‹å‰æ˜¯&lt;a href="https://github.com/binarydud/pyres"&gt;Pyres&lt;/a&gt;ï¼Œä¸€ä¸ª&lt;a href="https://github.com/resque/resque"&gt;Resque&lt;/a&gt;çš„Pythonå®žçŽ°ï¼Œå› ä¸º&lt;a href="https://github.com"&gt;Github&lt;/a&gt;åœ¨ä½¿ç”¨&lt;a href="https://github.com/resque/resque"&gt;Resque&lt;/a&gt;ï¼Œ&lt;a href="https://www.instagram.com/"&gt;Instagram&lt;/a&gt;åœ¨ä½¿ç”¨&lt;a href="https://github.com/binarydud/pyres"&gt;Pyres&lt;/a&gt;ï¼Œæˆ‘ä»¬åº”è¯¥å¯ä»¥ç”¨ä¸€æ®µæ—¶é—´ã€‚&lt;/p&gt;

&lt;p&gt;åŽæ¥&lt;a href="https://github.com/binarydud/pyres"&gt;Pyres&lt;/a&gt;é•¿ä¹…ä¸å†ç»´æŠ¤ï¼Œç§¯ç´¯äº†ä¸€äº›bugä»¥åŠæ€§èƒ½é—®é¢˜è®©æˆ‘ä»¬ä¸å¾—ä¸é€‰æ‹©æ›´æ¢ä¸€ä¸ªå¼‚æ­¥é˜Ÿåˆ—ç³»ç»Ÿï¼ŒæœŸåˆè€ƒè™‘è¿‡&lt;a href="http://www.celeryproject.org/"&gt;Celery&lt;/a&gt;ï¼Œé‚£æ˜¯ä¸€ä¸ªå¾ˆæˆç†Ÿå¾ˆå¼ºå¤§çš„é˜Ÿåˆ—ç³»ç»Ÿï¼Œä»¥è‡³äºŽæˆ‘å¾ˆéš¾ä¸€ä¸‹å­æžæ¸…å®ƒã€‚&lt;/p&gt;

&lt;h2&gt;
  
  
  é—®é¢˜
&lt;/h2&gt;

&lt;p&gt;åœ¨ä½¿ç”¨&lt;code&gt;Tasktiger&lt;/code&gt;åŽæœ‰æ—¶ä¼šé‡åˆ°å·²ç»å¤„ç†å®Œæ¯•çš„taskåˆé‡æ–°è¢«enqueueçš„æƒ…å†µï¼Œå¦‚æžœæ‰€æœ‰taskéƒ½æ˜¯å¹‚ç­‰çš„ï¼ˆIdempotentï¼‰ï¼Œé‚£è¿™ä¹Ÿä¸æ˜¯é—®é¢˜ï¼Œç¬¬äºŒæ¬¡æ‰§è¡Œtaskä¼šå› ä¸ºä¹‹å‰å¤„ç†è¿‡è€Œä¸è‡³äºŽå†åšä¸€æ¬¡ã€‚ç„¶è€Œå¹¶ä¸æ˜¯æ‰€æœ‰taskéƒ½å®Œæˆäº†å¹‚ç­‰æ”¹é€ ï¼Œæ‰€ä»¥è¿™å¯¹äºŽæˆ‘ä»¬æ¥è¯´æ˜¯ä¸ªä¸¥é‡é—®é¢˜ï¼Œä½†å½“æ—¶å¹¶ä¸èƒ½ç¨³å®šé‡çŽ°ã€‚&lt;/p&gt;

&lt;h2&gt;
  
  
  æŽ¢ç´¢
&lt;/h2&gt;

&lt;p&gt;æ€€ç–‘è¿‡è®¸å¤šåœ°æ–¹ï¼ŒåŽæ¥å‘çŽ°åœ¨queue redisä¸Šæ‰§è¡Œ&lt;code&gt;BGREWRITEAOF&lt;/code&gt;å°±èƒ½é¿å…è¿™ä¸ªé—®é¢˜ï¼ŒäºŽæ˜¯æŠŠåŽŸå…ˆä¸€ä¸ªæœˆæ‰§è¡Œä¸€æ¬¡çš„&lt;code&gt;AOF&lt;/code&gt;é‡å†™æ“ä½œå˜æˆäº†æ¯å¤©æ‰§è¡Œä¸€æ¬¡ï¼Œå¤§æ¦‚åœ¨å¤‡ä»½æ•°æ®ä¹‹å‰ï¼Œå› ä¸ºå¤‡ä»½éœ€è¦åœæœºï¼Œå¦‚æžœä¸åœ¨è¿™ä¹‹å‰åšï¼Œå¯èƒ½å¤‡ä»½å¯¼è‡´é‡å¯æœåŠ¡å°±ä¼šè®©å¾ˆå¤šå·²ç»å¤„ç†è¿‡çš„taské‡å¤å¤„ç†ï¼Œä¾‹å¦‚å¯èƒ½ä¼šç»™ä¼šå‘˜å‘å¤šæ¡çŸ­ä¿¡å’Œå¾®ä¿¡æé†’ã€‚&lt;/p&gt;




&lt;p&gt;å°±åœ¨æ˜¨å¤©ï¼Œå› ä¸ºé‡å¯queue rediså¯¼è‡´å¾ˆå¤štaské‡å¤å¤„ç†ï¼Œè¿™ä¸ªé—®é¢˜ç»ˆç©¶æ²¡æœ‰è¢«è§£å†³ï¼ŒäºŽæ˜¯èŠ±äº†å¤§çº¦2å¤©æ—¶é—´ï¼Œæ‰¾åˆ°äº†å¯¼è‡´é—®é¢˜çš„æ ¹æºã€‚&lt;/p&gt;

&lt;p&gt;ä¹‹å‰çŒœæµ‹æ˜¯ä¸æ˜¯&lt;code&gt;Tasktiger&lt;/code&gt;å“ªé‡Œæ²¡å†™å¥½å¯¼è‡´ï¼Œæ¯•ç«Ÿè¿™ä¸ªé¡¹ç›®åœ¨Githubä¸Šåªæœ‰ä¸åˆ°500ä¸ªstarï¼Œè€Œredisæœ‰å‡ ä¸‡ï¼Œå¹¿å¤§ç”¨æˆ·åŸºç¡€æ›´å®¹æ˜“å‘çŽ°å¥‡æ€ªbugï¼Œè€Œåœ¨&lt;code&gt;Tasktiger&lt;/code&gt;ä¸Šé‡åˆ°æŸä¸ªbugï¼Œä¹Ÿè®¸ä½ å°±æ˜¯ä¸–ç•Œä¸Šç¬¬ä¸€ä¸ªé‡åˆ°çš„ã€‚åŸºäºŽè¿™ä¸ªå‡è®¾æˆ‘çœ‹äº†å¾ˆå¤šæºä»£ç ï¼Œæ²¡æœ‰æ‰¾åˆ°å¯é è¯æ®ï¼Œè€Œä¸”åŸºäºŽä¸€ä¸ªç®€å•äº‹å®žï¼šä¸€ä¸ªtaskä»Žæœ€å¼€å§‹ä¸å­˜åœ¨ï¼Œåˆ°å‡ºçŽ°åœ¨Tasktigerä¸­ï¼Œåˆ°å¤„ç†å®Œè¢«åˆ é™¤ï¼Œå¦‚æžœæ˜¯&lt;code&gt;Tasktiger&lt;/code&gt;çš„é—®é¢˜ï¼Œé‚£å®ƒä»Žå“ªé‡Œå¾—åˆ°æ•°æ®æž„é€ å‡ºä¸€ä¸ªtaskå‘¢ï¼Ÿéš¾é“æ˜¯redisçš„é—®é¢˜å—ï¼Ÿ&lt;/p&gt;

&lt;p&gt;queue redisä¸€èˆ¬éƒ½ä¼šå¯ç”¨&lt;code&gt;AOF&lt;/code&gt;ï¼Œæ‰€æœ‰ä¿®æ”¹æ•°æ®çš„å‘½ä»¤å’Œå€¼è¢«è®°å½•åˆ°&lt;code&gt;AOF&lt;/code&gt;ä¸­ï¼Œç­‰redisé‡å¯æ—¶ï¼Œä¼šæ‰§è¡Œ&lt;code&gt;AOF&lt;/code&gt;æ–‡ä»¶ä¸­çš„å‘½ä»¤ï¼Œè¿™æ ·rediså°±æœ‰äº†å’Œé‡å¯å‰ä¸€æ¨¡ä¸€æ ·çš„æ•°æ®ã€‚åœ¨&lt;code&gt;AOF&lt;/code&gt;ä¸­è®°å½•ç€æŸä¸ªtaskä»Žå‡ºçŽ°åˆ°æ¶ˆå¤±çš„å…¨è¿‡ç¨‹ï¼Œéš¾é“æ˜¯redisæ²¡å®Œæˆloadå°±æŽ¥å—æœåŠ¡äº†ï¼Ÿä»Žæ—¥å¿—ä¸Šçœ‹å¹¶ä¸æ˜¯è¿™æ ·ï¼Œåœ¨æ²¡loadå®Œæ‰§è¡Œæ“ä½œä¼šå¾—åˆ°å¼‚å¸¸ã€‚&lt;/p&gt;

&lt;p&gt;çœ‹äº†ä¸‹ç”Ÿäº§çŽ¯å¢ƒçš„queueçŠ¶æ€ï¼ŒåŸºæœ¬æ²¡æœ‰æ­£åœ¨å¤„ç†çš„taskï¼ŒåœæŽ‰queue redisï¼Œä¸‹è½½&lt;code&gt;AOF&lt;/code&gt;æ–‡ä»¶ï¼Œåœ¨æœ¬åœ°è®©rediså¯åŠ¨å¹¶loadè¿™ä»½&lt;code&gt;AOF&lt;/code&gt;ï¼Œä¸å¯åŠ¨&lt;code&gt;Tasktiger&lt;/code&gt;çš„workerï¼Œåªé™é™åœ°çœ‹queueçš„çŠ¶æ€ï¼Œå‘çŽ°loadå®ŒåŽæœ‰å¾ˆå¤štaskè¢«é‡æ–°æ”¾å›žäº†queueï¼Œæ­¤æ—¶å¦‚æžœæœ‰workerï¼Œä¸€å®šä¼šé‡å¤æ‰§è¡Œã€‚&lt;/p&gt;

&lt;p&gt;åˆ°è¿™é‡Œéš¾é“èƒ½ç¡®å®šæ˜¯redisçš„é—®é¢˜å—ï¼Ÿredisçš„&lt;code&gt;AOF&lt;/code&gt;å¹¶ä¸èƒ½è®©rediså›žåˆ°ä¹‹å‰çš„çŠ¶æ€ï¼Ÿå¦‚æžœæ˜¯è¿™æ ·çš„è¯redisæ€Žä¹ˆä¼šè¢«å¹¿æ³›åº”ç”¨ï¼Ÿ&lt;/p&gt;

&lt;p&gt;äºŽæ˜¯æ‰¾äº†ä¸€ä¸ªtaskï¼Œä»Ž&lt;code&gt;AOF&lt;/code&gt;ä¸­çœ‹çœ‹&lt;code&gt;Tasktiger&lt;/code&gt;æ˜¯å¦‚ä½•å¤„ç†å®ƒçš„ã€‚&lt;/p&gt;

&lt;p&gt;å¤„ç†è¿‡ç¨‹æ²¡å‘çŽ°å¼‚å¸¸ï¼Œåªæ˜¯&lt;code&gt;Tasktiger&lt;/code&gt;ç”¨äº†å¾ˆå¤š&lt;code&gt;lua&lt;/code&gt;è„šæœ¬æ“ä½œæ•°æ®ï¼Œä¾‹å¦‚æœ‰ä¸ªè„šæœ¬æ˜¯ï¼šå½“ä¸€ä¸ªkeyä¸åœ¨ç»™å®šçš„æŸå‡ ä¸ªzsetä¸­æ—¶åˆ é™¤è¿™ä¸ªkeyã€‚è¿™ä¸ªæ“ä½œä¸å¤æ‚ï¼Œä½†ä½ æ— æ³•åªç”¨rediså®Œæˆï¼Œå› ä¸ºredisåªæ˜¯ä¸€ä¸ªæ•°æ®å­˜å‚¨ï¼Œæ— æ³•å¤„ç†å¤æ‚é€»è¾‘ï¼Œæ‰€ä»¥åªèƒ½ä½¿ç”¨&lt;code&gt;lua&lt;/code&gt;å®Œæˆï¼Œå½“ç„¶å¾ˆå¤šè¯­éƒ½å¯ä»¥å®Œæˆè¿™ä¸ªé€»è¾‘ï¼Œåªä¸è¿‡redisæ”¯æŒæ‰§è¡Œ&lt;code&gt;lua&lt;/code&gt;è„šæœ¬ï¼Œç®—ä½œæ˜¯å¯¹redisæ“ä½œçš„è¡¥å……ã€‚&lt;/p&gt;

&lt;p&gt;å› ä¸ºæœ‰äº†ä¸€ä¸ªå…·ä½“taskï¼ŒæŸ¥çœ‹å’Œå®ƒç›¸å…³çš„æ‰€æœ‰æ“ä½œåŽï¼Œå‘çŽ°é™¤éžæ˜¯åœ¨æŸä¸€æ­¥&lt;code&gt;lua&lt;/code&gt;è„šæœ¬æœªæ‰§è¡Œæ—¶æ‰ä¼šå¯¼è‡´è¿™ä¸ªtaskè¢«æ”¾åœ¨active queueä¸­è€Œä¸æ˜¯è¢«ç§»é™¤ã€‚&lt;/p&gt;

&lt;p&gt;äºŽæ˜¯æˆ‘æž„é€ äº†ä¸€ä»½&lt;code&gt;AOF&lt;/code&gt;ï¼Œæœ€å¼€å§‹çš„éƒ¨åˆ†æ˜¯ä¸€å †&lt;code&gt;SCRIPT LOAD&lt;/code&gt;æŒ‡ä»¤ï¼ŒæŠŠ&lt;code&gt;Tasktiger&lt;/code&gt;éœ€è¦çš„è„šæœ¬éƒ½loadåˆ°redisä¸­ï¼Œè¿™æ ·åŽç»­æ“ä½œæ‰å¯ä»¥ä½¿ç”¨&lt;code&gt;EVALSHA&lt;/code&gt;ï¼Œè¿™ä»½æž„é€ å¥½çš„&lt;code&gt;AOF&lt;/code&gt;ä¹Ÿé€šè¿‡äº†&lt;code&gt;redis-check-aof&lt;/code&gt;æ£€æŸ¥ï¼Œè¢«loadåŽå†æ¬¡æŸ¥çœ‹queueçŠ¶æ€ï¼Œç«Ÿç„¶æ­£å¸¸äº†ï¼Œå’Œåœredisä¹‹å‰ä¸€è‡´ï¼çœ‹æ¥é—®é¢˜å‡ºåœ¨æ‰§è¡Œè¿™äº›è„šæœ¬çš„åœ°æ–¹ã€‚&lt;/p&gt;

&lt;p&gt;åœ¨redisä¸­æ‰§è¡Œ&lt;code&gt;lua&lt;/code&gt;è„šæœ¬æœ‰ä¸¤ç§åšæ³•ï¼Œç¬¬ä¸€ç§æ˜¯ä½¿ç”¨&lt;code&gt;EVAL&lt;/code&gt;ï¼Œè¿™ç§åšæ³•æ˜¯æŠŠè„šæœ¬å†…å®¹ä¸€å¹¶è´´ä¸Šï¼Œæ¯æ¬¡æ‰§è¡Œéƒ½éœ€è¦è¿™æ ·ï¼Œå¦‚æžœæ€»æ˜¯é‡å¤æ‰§è¡ŒæŸä¸ªç‰¹å®šè„šæœ¬å°±ä¼šå› ä¸ºä¼ è¾“äº†å¤§é‡è„šæœ¬å†…å®¹è€Œä½¿å¾—æ•ˆçŽ‡ä¸å¤Ÿé«˜ï¼ŒäºŽæ˜¯æœ‰äº†ç¬¬äºŒç§æ‰§è¡Œæ–¹æ³•––&lt;code&gt;EVALSHA&lt;/code&gt;ï¼Œä½¿ç”¨è¿™ç§éœ€è¦è„šæœ¬çš„&lt;code&gt;SHA1&lt;/code&gt;ï¼Œå½“æ‰§è¡Œ&lt;code&gt;SCRIPT LOAD&lt;/code&gt;åŽï¼Œredisè¿”å›žçš„å†…å®¹å°±æ˜¯è„šæœ¬çš„&lt;code&gt;SHA1&lt;/code&gt;ï¼Œloadè¿‡çš„è„šæœ¬åœ¨æ‰‹å·¥flushå‰æˆ–è€…redisé‡å¯å‰éƒ½æ˜¯æœ‰æ•ˆçš„ã€‚&lt;code&gt;SCRIPT LOAD&lt;/code&gt;åœ¨&lt;code&gt;BGREWRITEAOF&lt;/code&gt;åŽå¹¶ä¸ä¼šå­˜åœ¨ï¼Œè™½ç„¶ä½ è¿˜æ˜¯å¯ä»¥é€šè¿‡&lt;code&gt;EVALSHA&lt;/code&gt;è°ƒç”¨è„šæœ¬ã€‚&lt;/p&gt;

&lt;p&gt;é‚£ä¹ˆè¿™ä¸¤ç§æ‰§è¡Œæ–¹æ³•å¯¹äºŽ&lt;code&gt;AOF&lt;/code&gt;æ–‡ä»¶è®°å½•å†…å®¹æœ‰å·®åˆ«å—ï¼Ÿæ²¡æœ‰ï¼Œæ‰§è¡Œ&lt;code&gt;EVALSHA&lt;/code&gt;ä¹Ÿä¼šè¢«è®°å½•æˆ&lt;code&gt;EVAL&lt;/code&gt;ï¼Œå¦‚æžœä½ åœ¨&lt;code&gt;AOF&lt;/code&gt;ä¸­å‘çŽ°æœ‰&lt;code&gt;EVALSHA&lt;/code&gt;é‚£å°±å¥‡æ€ªäº†ã€‚åœ¨ç”Ÿäº§çŽ¯å¢ƒä¸‹è½½çš„&lt;code&gt;AOF&lt;/code&gt;ä¸­ï¼Œæœ‰ä¸å°‘&lt;code&gt;EVALSHA&lt;/code&gt;ï¼Œä¸ºä½•æ²¡æœ‰è¢«è®°å½•æˆ&lt;code&gt;EVAL&lt;/code&gt;ï¼Ÿå› ä¸ºè¿™äº›&lt;code&gt;EVALSHA&lt;/code&gt;å¹¶ä¸æ˜¯redisæ‰§è¡Œçš„ï¼Œè€Œæ˜¯&lt;code&gt;Tasktiger&lt;/code&gt;çš„&lt;code&gt;pipeline&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;å¯¼è‡´å‡ºçŽ°å›žæ»šé—®é¢˜çš„åŽŸå› æ˜¯ï¼šBGREWRITEAOFåŽï¼Œç”±äºŽSCRIPT LOADè¢«åŽ»æŽ‰ï¼Œredisé‡å¯åŽå¦‚æžœæœ‰ä½¿ç”¨EVALSHAè°ƒç”¨è„šæœ¬çš„åœ°æ–¹ä¼šå‡ºé”™ï¼Œå› ä¸ºé‚£ä¸ªè„šæœ¬å¹¶æ²¡æœ‰è¢«redis load&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ä¸æ˜¯è¯´&lt;code&gt;EVALSHA&lt;/code&gt;ä¼šè¢«ç¿»è¯‘æˆ&lt;code&gt;EVAL&lt;/code&gt;æ”¾åœ¨&lt;code&gt;AOF&lt;/code&gt;ä¸­å—ï¼Ÿæ˜¯çš„ï¼Œä¸è¿‡&lt;code&gt;Tasktiger&lt;/code&gt;è‡ªå·±å®žçŽ°äº†ä¸€ä¸ªredis &lt;code&gt;pipeline&lt;/code&gt;ï¼Œè¿™ä¹Ÿæ˜¯ä¸ª&lt;code&gt;lua&lt;/code&gt;è„šæœ¬ï¼Œåœ¨è¿™ä¸ª&lt;code&gt;lua&lt;/code&gt;è„šæœ¬ä¸­æ˜¯éœ€è¦è°ƒç”¨å…¶ä»–&lt;code&gt;lua&lt;/code&gt;è„šæœ¬çš„ã€‚è°ƒç”¨æ–¹æ³•åŒ…å«ä¸¤ç§ï¼Œå¤§å¤šæ•°éƒ½æ˜¯&lt;code&gt;EVALSHA&lt;/code&gt;ï¼Œ &lt;strong&gt;ç”±äºŽredisç¦æ­¢åœ¨luaä¸­ä½¿ç”¨redis.callæ‰§è¡ŒEVALSHAè°ƒç”¨å¦ä¸€ä¸ªè„šæœ¬ï¼ˆå¹¶ä¸æ˜¯æ‰€æœ‰rediså‘½ä»¤éƒ½å¯ä»¥åœ¨redis.callä½¿ç”¨ï¼‰&lt;/strong&gt; ï¼ŒTasktigerä½¿ç”¨äº†å…¶ä»–æ–¹æ³•æ¥è°ƒç”¨ï¼Œç®—æ˜¯ä¸€ç§hackã€‚&lt;/p&gt;

&lt;p&gt;ç”±äºŽredisçš„é™åˆ¶åŠ ä¸Š&lt;code&gt;Tasktiger&lt;/code&gt;çš„hackï¼Œå¯¼è‡´ &lt;strong&gt;åœ¨BGREWRITEAOFåŽï¼Œå¦‚æžœæœ‰pipelineè„šæœ¬çš„è°ƒç”¨å‘ç”Ÿï¼Œä¸‹æ¬¡é‡å¯redisä¼šä½¿å¾—ä¹‹å‰åšè¿‡çš„taskè¢«é‡æ–°æ”¾å›žqueueï¼Œå› ä¸ºç§»é™¤æ“ä½œçš„è„šæœ¬è¿˜æ²¡æœ‰loadï¼Œæ‰€ä»¥ç§»é™¤å¤±è´¥äº†ï¼Œçœ‹èµ·æ¥å°±åƒæ˜¯taskè¢«é‡æ–°æ”¾å›žqueue&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ç›®å‰æˆ‘ä»¬é’ˆå¯¹è¿™ä¸ªé—®é¢˜çš„è§£å†³æ–¹æ³•æ˜¯ï¼šå‹¤å¿«ç‚¹BGREWRITEAOFï¼Œæ¯å°æ—¶ä¸€æ¬¡ï¼Œé‡å¯redisä¹‹å‰å†åšä¸€æ¬¡&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>redis</category>
      <category>tasktiger</category>
    </item>
    <item>
      <title>worst day</title>
      <dc:creator>TianZhen</dc:creator>
      <pubDate>Sat, 02 Sep 2017 06:22:19 +0000</pubDate>
      <link>https://dev.to/dawncold/worst-day</link>
      <guid>https://dev.to/dawncold/worst-day</guid>
      <description>&lt;h2&gt;
  
  
  21:40 - æœåŠ¡ä¸å¯ç”¨
&lt;/h2&gt;

&lt;p&gt;ç›‘æŽ§å®æç¤ºHomepageæ— æ³•è®¿é—®ï¼Œä»¥ä¸ºæœ‰äººåœ¨éƒ¨ç½²ï¼ŒåŽæ¥å…¶ä»–æœåŠ¡ä¹Ÿä¸å¯ç”¨ï¼Œç™»å½•åˆ°æœåŠ¡å™¨ä¸Šçœ‹å‘çŽ°&lt;code&gt;top&lt;/code&gt;éƒ½ä¸èƒ½æ‰§è¡Œäº†ï¼ŒæŠ¥è¿‡&lt;code&gt;Bus error&lt;/code&gt;å’Œ&lt;code&gt;Segment fault&lt;/code&gt;ç­‰ï¼Œçœ‹&lt;code&gt;/var/log/syslog&lt;/code&gt;å‘çŽ°æ˜¯&lt;code&gt;RAID&lt;/code&gt;å¡å‡ºé”™ï¼Œä»Ž&lt;code&gt;iDRAC&lt;/code&gt;ä¸Šçœ‹æ²¡æœ‰é”™è¯¯ï¼Œ&lt;code&gt;RAID&lt;/code&gt;å¡å’Œç”µæ± çŠ¶æ€æ­£å¸¸ã€‚&lt;/p&gt;

&lt;p&gt;ç›®å‰å·²ç»æ— æ³•æä¾›æœåŠ¡äº†ï¼Œé‡å¯è¯•ä¸€ä¸‹ã€‚&lt;/p&gt;

&lt;p&gt;&lt;code&gt;RAID&lt;/code&gt;å¡æ— æ³•è¢«è¯†åˆ«åˆ°ï¼Œç³»ç»Ÿè¿›ä¸åŽ»ã€‚&lt;/p&gt;

&lt;p&gt;å¼ºåˆ¶åˆ·ä¸€ä¸‹&lt;code&gt;RAID&lt;/code&gt;å¡å›ºä»¶ï¼Œå¤±è´¥ï¼Œéƒ½æ— æ³•è¯†åˆ«ï¼Œä¹Ÿæ²¡æ³•åˆ·å›ºä»¶äº†ã€‚&lt;/p&gt;

&lt;p&gt;å…³æœºï¼Œç­‰ç¬¬äºŒå¤©åŽ»æœºæˆ¿æŠŠç£ç›˜æ¢åˆ°å¦ä¸€å°æœºå™¨ä¸Šï¼Œå¦ä¸€å°æœºå™¨æœ‰åž‹å·ä¸€æ ·çš„&lt;code&gt;RAID&lt;/code&gt;å¡ã€‚&lt;/p&gt;

&lt;h2&gt;
  
  
  7:00 - èƒ½è¿›ç³»ç»Ÿäº†
&lt;/h2&gt;

&lt;p&gt;ç¬¬äºŒå¤©æ—©æ™¨å¼€æœºåŽå‘çŽ°å¯ä»¥è¿›ç³»ç»Ÿï¼Œä½†æ•°æ®åº“å¯åŠ¨ä¸äº†ï¼Œå¯èƒ½æ•°æ®åº“çš„æŸäº›æ–‡ä»¶è¢«ç ´åã€‚&lt;/p&gt;

&lt;p&gt;å†æ¬¡é‡å¯æœºå™¨ï¼Œç³»ç»Ÿæ— æ³•å¯åŠ¨ï¼Œéœ€è¦&lt;code&gt;fsck&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8:10 - è¿›å…¥æœºæˆ¿
&lt;/h2&gt;

&lt;p&gt;åŽ»æœºæˆ¿æŠŠæœåŠ¡å™¨ç”µæºæ‹”æŽ‰ï¼Œé•¿æŒ‰å¼€æœºé”®è®©ç”µé‡è€—å…‰ï¼Œå¦‚æžœè¿™ç§resetè¿˜æ˜¯æ²¡èƒ½è§£å†³é—®é¢˜ï¼Œå°±åªèƒ½æ›´æ¢åˆ°å¦ä¸€å°æœåŠ¡å™¨äº†ã€‚&lt;/p&gt;

&lt;p&gt;hardware resetä¸ç®¡ç”¨ï¼ŒæŠŠç£ç›˜æ”¾å…¥å¦ä¸€å°æœåŠ¡å™¨ã€‚&lt;/p&gt;

&lt;p&gt;å¯åŠ¨æ—¶æé†’éœ€è¦import raidé…ç½®ï¼Œimportè¿›å…¥ç³»ç»Ÿæç¤ºéœ€è¦&lt;code&gt;fsck&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;æ‰‹å·¥æ‰§è¡Œ&lt;code&gt;fsck&lt;/code&gt;ï¼Œå‡ºçŽ°å¾ˆå¤šé”™è¯¯ï¼Œä¸€ä¸€ç¡®è®¤åŽè®©&lt;code&gt;fsck&lt;/code&gt;ä¿®å¤ï¼Œå¯ä»¥è¿›å…¥ç³»ç»Ÿã€‚&lt;/p&gt;

&lt;p&gt;å¤‡ä»½ç³»ç»Ÿåˆ°åˆ«çš„æœåŠ¡å™¨&lt;/p&gt;

&lt;h2&gt;
  
  
  14:30 - ä¿®å¤æ•°æ®åº“
&lt;/h2&gt;

&lt;p&gt;æ•°æ®åº“ï¼ˆPostgreSQL 9.6ï¼‰å’Œä¸€äº›é™æ€æ–‡ä»¶æœ‰æŸå&lt;/p&gt;

&lt;p&gt;å¤‡ä»½äº†æ•°æ®åº“çš„&lt;code&gt;data&lt;/code&gt;ç›®å½•åŽï¼Œå¼€å§‹è¯•ç€æ¢å¤æ•°æ®åº“&lt;/p&gt;

&lt;p&gt;resetäº†xlogï¼Œç”¨&lt;code&gt;dd&lt;/code&gt;åˆ›å»ºäº†ä¸€ä¸ªå…¨&lt;code&gt;0&lt;/code&gt;çš„clogï¼Œæ•°æ®åº“å¯ä»¥å¯åŠ¨ï¼Œä½†æœ‰äº›å¥‡æ€ªçš„æ•°æ®ï¼Œ&lt;code&gt;dump&lt;/code&gt;å‡ºæ‰€æœ‰æ•°æ®é‡å»º&lt;code&gt;database&lt;/code&gt;å†&lt;code&gt;restore&lt;/code&gt;ï¼Œå› ä¸ºæˆ‘ä»¬æ¯”è¾ƒåœ¨æ„databaseçš„å»ºæ¨¡ï¼Œå¾ˆå¤šæœ‰å…³ç³»çš„è¡¨ä¹‹é—´éƒ½æœ‰å¤–é”®çº¦æŸï¼Œ&lt;code&gt;restore&lt;/code&gt;çš„æ—¶å€™èƒ½å¸®æˆ‘ä»¬å‘çŽ°å¾ˆå¤šä¸ä¸€è‡´çš„æ•°æ®ï¼Œåªå¥½fix-dump-restoreæµ‹è¯•ï¼Œä¸€ç›´åˆ°æ‰€æœ‰æ•°æ®éƒ½æ­£å¸¸åŽï¼Œ&lt;code&gt;vacuum&lt;/code&gt;ï¼Œ rebuild index&lt;/p&gt;

&lt;h2&gt;
  
  
  21:00 - ç»“æŸ
&lt;/h2&gt;

&lt;p&gt;çœŸæ˜¯worst dayï¼ŒçŽ°åœ¨çœ‹æ¥æ•°æ®åº“æ–¹é¢æœ‰æ›´å¥½çš„ä¿®å¤æ–¹æ³•ï¼Œèµ·ç å¯ä»¥åšåˆ°åªä¸¢å¤±æœ€è¿‘çš„ä¸€éƒ¨åˆ†æ•°æ®ï¼Œç„¶è€Œæˆ‘ä»¬æ²¡æœ‰realtimeçš„æ•°æ®åº“å¤‡ä»½ä¹Ÿæ˜¯ä¸ªå¤§é—®é¢˜ï¼Œå‡†å¤‡ä½¿ç”¨&lt;a href="http://www.pgbarman.org/"&gt;Barman&lt;/a&gt;æ¥è§£å†³è¿™äº›é—®é¢˜ï¼Œå¦å¤–æœåŠ¡å™¨ç¡¬ä»¶ä¹Ÿæœ‰ä¸€äº›ä¸œè¥¿éœ€è¦é‡æ–°è€ƒè™‘&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>hardware</category>
    </item>
    <item>
      <title>unlock HG8347R</title>
      <dc:creator>TianZhen</dc:creator>
      <pubDate>Thu, 24 Aug 2017 13:09:36 +0000</pubDate>
      <link>https://dev.to/dawncold/unlock-hg8347r</link>
      <guid>https://dev.to/dawncold/unlock-hg8347r</guid>
      <description>&lt;p&gt;è”é€šå®½å¸¦ç§»æœºä¸€å®šè¦å¸¦ç€æ—§å…‰çŒ«ï¼Œä¸ç®¡æ—§å…‰çŒ«æ˜¯å¥½æ˜¯åæ˜¯æ­»æ˜¯æ´»ã€‚* 3&lt;/p&gt;

&lt;p&gt;æ–°å®¶å®Œæˆå®½å¸¦ç§»æœºï¼Œä¸æ”¶è´¹ï¼Œä½†å¦‚æžœä½ æ²¡æœ‰æ—§å…‰çŒ«çš„è¯ï¼Œå¾—è‡ªå·±è§£å†³ï¼Œæ¯”å¦‚æ·˜å®ä¸€ä¸ªå¤§çº¦50å—ã€‚&lt;/p&gt;

&lt;p&gt;æ–°å…‰çŒ«æ˜¯HG8347Rï¼Œæ®è¯´ç¡¬ä»¶é…ç½®ä¸é”™ï¼Œä½†æˆ‘å…³å¿ƒçš„æ˜¯èƒ½å¦ç»§ç»­ä½¿ç”¨è‡ªå·±çš„è·¯ç”±å™¨ï¼Œé»˜è®¤æƒ…å†µä¸‹ä¸èƒ½ï¼Œå› ä¸ºè¿™æ¬¾å…‰çŒ«é›†æˆäº†æ— çº¿è·¯ç”±åŠŸèƒ½ã€‚å¯¹äºŽå¤§å¤šæ•°ç”¨æˆ·æ¥è®²æ˜¯ä¸ªå¥½äº‹å„¿ï¼Œä½†å¯¹äºŽå…¶ä»–ç”¨æˆ·ï¼Œä»–ä»¬å°±ä¸è¿‡å¤šè€ƒè™‘äº†ï¼Œå¥½åœ¨å…‰çŒ«æ²¡é”æ­»ï¼Œå¯ä»¥è‡ªå·±è§£é”ã€‚&lt;/p&gt;

&lt;p&gt;éœ€è¦æœ‰å‡ æ¬¾è½¯ä»¶ï¼šåŽä¸ºONTç»„æ’­ç»´æŠ¤å·¥å…·ã€é…ç½®æ–‡ä»¶è§£å¯†å·¥å…·ã€tftp serverï¼Œå¯ä»Ž&lt;a href="https://pan.baidu.com/s/1pLfYcJ5"&gt;è¿™é‡Œ&lt;/a&gt;ä¸‹è½½åˆ°ã€‚ç»´æŠ¤å·¥å…·ä½œç”¨æ˜¯å¼€å¯å…‰çŒ«ç»´æŠ¤æ¨¡å¼ï¼Œè¿™æ ·æ‰å¯ä»¥telnetè¿›åŽ»ï¼Œæ‹¿åˆ°é…ç½®æ–‡ä»¶ã€æ¢å¤å‡ºåŽ‚è®¾ç½®ç­‰ã€‚&lt;/p&gt;

&lt;h2&gt;
  
  
  å¼€å¯ç»´æŠ¤æ¨¡å¼
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;ç”µè„‘ç½‘çº¿è¿žæŽ¥å…‰çŒ«LAN1å£&lt;/li&gt;
&lt;li&gt;æ‹”æŽ‰å…‰çŒ«å…‰çº¤ï¼Œæ­¤æ—¶å…‰çŒ«PONä½ç½®äº®çº¢ç¯&lt;/li&gt;
&lt;li&gt;æ‰“å¼€ONTç»„æ’­å·¥å…·ï¼Œé€‰æ‹©è¿žæŽ¥å…‰çŒ«çš„ç½‘å¡ï¼Œç‚¹å¯åŠ¨&lt;/li&gt;
&lt;li&gt;ç­‰åˆ°å…‰çŒ«æ‰€æœ‰æŒ‡ç¤ºç¯å…¨äº®åŽï¼Œå…³é—­å…‰çŒ«ç”µæºï¼Œæ­¤æ—¶ç»´æŠ¤æ¨¡å¼å·²å¼€å¯ã€‚å¦‚æžœé•¿æ—¶é—´æ²¡è¿›å…¥ç»´æŠ¤æ¨¡å¼ï¼ˆæ¯”å¦‚è¶…è¿‡äº†2åˆ†é’Ÿï¼‰å¯ä»¥å°è¯•å…³é—­å…‰çŒ«ç”µæºåŽå†æ‰“å¼€&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  èŽ·å–é…ç½®æ–‡ä»¶
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;å¯åŠ¨å·²å¼€å¯ç»´æŠ¤æ¨¡å¼çš„å…‰çŒ«&lt;/li&gt;
&lt;li&gt;ç”µè„‘å¯ä»¥pingé€šå…‰çŒ«ipåŽï¼Œæ‰“å¼€å‘½ä»¤è¡Œ&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;telnet 192.168.1.1&lt;/code&gt;ï¼Œç”¨æˆ·åæ˜¯ï¼šrootï¼Œå¯†ç æ˜¯ï¼šadmin&lt;/li&gt;
&lt;li&gt;ç™»å½•åŽåœ¨ç”µè„‘å¼€å¯&lt;code&gt;tftp server&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;åœ¨å‘½ä»¤è¡Œä¸­è¾“å…¥ï¼š&lt;code&gt;backup cfg by tftp svrip 192.168.1.2 remotefile hw_ctree.xml&lt;/code&gt;,å…¶ä¸­&lt;code&gt;192.168.1.2&lt;/code&gt;æ˜¯ç”µè„‘IPï¼Œå‘½ä»¤å®ŒæˆåŽå¯åœ¨&lt;code&gt;tftp&lt;/code&gt;è®¾ç½®çš„ç›®å½•ä¸­æ‰¾åˆ°&lt;code&gt;hw_ctree.xml&lt;/code&gt;æ–‡ä»¶&lt;/li&gt;
&lt;li&gt;è¿™æ˜¯ä¸€ä¸ªåŠ å¯†åŽçš„gzipæ–‡ä»¶ï¼Œæ­¤æ—¶éœ€è¦ç”¨åˆ°ç¬¬äºŒä¸ªè½¯ä»¶ï¼šé…ç½®æ–‡ä»¶è§£å¯†å·¥å…·&lt;/li&gt;
&lt;li&gt;è§£å¯†åŽå¾—åˆ°çš„æ–‡ä»¶æ˜¯gzipæ–‡ä»¶ï¼Œç”¨gzipå·¥å…·è§£åŽ‹å¯å¾—åˆ°çœŸæ­£&lt;code&gt;hw_ctree.xml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;åœ¨é…ç½®æ–‡ä»¶ä¸­æ‰¾åˆ°&lt;code&gt;UserLevel="1"&lt;/code&gt;ï¼Œå°†å…¶ä¿®æ”¹ä¸º&lt;code&gt;0&lt;/code&gt;ï¼Œè¡¨ç¤ºç‰¹æƒç”¨æˆ·&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  æ¢å¤å‡ºåŽ‚è®¾ç½®
&lt;/h2&gt;

&lt;p&gt;å›žåˆ°telnetå¼€å§‹æ¢å¤å‡ºåŽ‚è®¾ç½®&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;su
shell
restorehwmode.sh
exit
reset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;å¦‚æžœè®¾å¤‡æ²¡é‡å¯åˆ™å¯ä»¥æ‰‹åŠ¨å…³æŽ‰ç”µæºå†æ‰“å¼€&lt;/p&gt;

&lt;h2&gt;
  
  
  å¯¼å…¥é…ç½®
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;è®¾å¤‡é‡å¯åŽä¿®æ”¹ç”µè„‘IPä¸º&lt;code&gt;192.168.100.2&lt;/code&gt;ï¼Œç½‘å…³æ˜¯&lt;code&gt;192.168.100.1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;è®¿é—®&lt;code&gt;192.168.100.1&lt;/code&gt;ï¼Œä½¿ç”¨é»˜è®¤ç”¨æˆ·åï¼š&lt;code&gt;telecomadmin&lt;/code&gt;ï¼Œå¯†ç ï¼š&lt;code&gt;admintelecom&lt;/code&gt;ç™»å½•ï¼Œå¯¼å…¥åˆšåˆšä¿®æ”¹äº†é…ç½®æ–‡ä»¶ï¼Œè®¾å¤‡é‡å¯åŽå³å¯è‡ªåŠ¨èŽ·å–IPåœ°å€&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  è®¾ç½®WANæ¡¥æŽ¥
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;è®¿é—®&lt;code&gt;192.168.1.1&lt;/code&gt;ï¼Œå› ä¸ºé…ç½®æ–‡ä»¶åªä¿®æ”¹äº†ç”¨æˆ·æƒé™æ²¡æœ‰ä¿®æ”¹è´¦å·å¯†ç ï¼Œæ‰€ä»¥å¯ç”¨å…‰çŒ«èƒŒåŽçš„ç”¨æˆ·åå¯†ç ç™»å½•&lt;/li&gt;
&lt;li&gt;åœ¨WANè®¾ç½®ä¸­æ‰¾åˆ°&lt;code&gt;2_INTERNET_B_VID_3961&lt;/code&gt;ï¼Œç‚¹å‡»ä¸€ä¸‹å¯ä»¥å±•å¼€ç¼–è¾‘ï¼Œä¿®æ”¹&lt;code&gt;WANç±»åž‹&lt;/code&gt;ä¸º&lt;code&gt;WANæ¡¥æŽ¥&lt;/code&gt;å³å¯ä½¿ç”¨è‡ªå·±è·¯ç”±å™¨ï¼Œè·¯ç”±å™¨WANå£æŽ¥å…‰çŒ«LAN1å£ï¼Œä½¿ç”¨è·¯ç”±å™¨è®¤è¯ã€‚ä½¿ç”¨SPEEDTESTæµ‹è¯•é€Ÿåº¦åœ¨100Mbpsï¼Œæ²¡æŽ‰é€Ÿã€‚&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>hg8347r</category>
      <category>chinaunicom</category>
    </item>
    <item>
      <title>How to understand Program to an interface not an implementation</title>
      <dc:creator>TianZhen</dc:creator>
      <pubDate>Thu, 24 Aug 2017 06:35:36 +0000</pubDate>
      <link>https://dev.to/dawncold/how-to-understand-program-to-an-interface-not-an-implementation</link>
      <guid>https://dev.to/dawncold/how-to-understand-program-to-an-interface-not-an-implementation</guid>
      <description>&lt;p&gt;Yesterday my colleagues and I talk about JS &lt;code&gt;for loop&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt;. I found this &lt;a href="https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-closure-b2f0d2152b36"&gt;post&lt;/a&gt;, it refers a quote "Program to an interface not an implementation", I read this several years ago, and have no feeling about this, just think it's a cool quote or rule.&lt;/p&gt;

&lt;p&gt;Now, after several years working experience, I got some understanding about that.&lt;/p&gt;

&lt;p&gt;For instance I use a simple JS example,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;incr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;},&lt;/span&gt;
        &lt;span class="na"&gt;decr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;},&lt;/span&gt;
        &lt;span class="na"&gt;disp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I exposed three functions: &lt;code&gt;incr&lt;/code&gt;, &lt;code&gt;decr&lt;/code&gt;, &lt;code&gt;disp&lt;/code&gt;, they operate private &lt;code&gt;count&lt;/code&gt; variable, on the outer side, callee don't know &lt;code&gt;count&lt;/code&gt;, callee can call &lt;code&gt;incr&lt;/code&gt;, &lt;code&gt;decr&lt;/code&gt;, &lt;code&gt;disp&lt;/code&gt;, three functions are interfaces of &lt;code&gt;counter&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Another implementation of &lt;code&gt;counter&lt;/code&gt; is expose &lt;code&gt;count&lt;/code&gt;, callee increase count, decrease count, display count by operate &lt;code&gt;count&lt;/code&gt; variable directly.&lt;/p&gt;

&lt;p&gt;When &lt;code&gt;incr&lt;/code&gt;, &lt;code&gt;decr&lt;/code&gt; logic is changed, e.g. increase count by 2, not 1. Interfaces are same as before, callee don't need change any codes.&lt;/p&gt;

</description>
      <category>oop</category>
    </item>
    <item>
      <title>Upgrade X220 BIOS to 1.43 mod</title>
      <dc:creator>TianZhen</dc:creator>
      <pubDate>Wed, 02 Aug 2017 14:33:14 +0000</pubDate>
      <link>https://dev.to/dawncold/upgrade-x220-bios-to-143-mod</link>
      <guid>https://dev.to/dawncold/upgrade-x220-bios-to-143-mod</guid>
      <description>&lt;p&gt;original BIOS has some limition: RAM freq, hardware whitelist, missing 'Advanced' BIOS options, etc.&lt;/p&gt;

&lt;p&gt;I downloaded latest BIOS with modification from &lt;a href="http://x220.mcdonnelltech.com/resources/"&gt;here&lt;/a&gt;, if you want upgrade your X220 with faster RAM and 5G wifi(7620AC), you need upgrade your bios first.&lt;/p&gt;

&lt;p&gt;If you have a running Windows, you can save some time of creating WINPE USB stick, you should follow BIOS upgrade README.txt, if not, you need create a WINPE USB stick, you can run BIOS updater program on WINPE.&lt;/p&gt;

&lt;p&gt;After upgraded BIOS, I can't boot my Ubuntu system, I found a solution about boot loader missing after upgrade bios, &lt;a href="https://askubuntu.com/questions/629734/will-updating-the-bios-remove-my-ubuntu-efi-entry"&gt;here&lt;/a&gt;, what should be noticed is, you must use UEFI mode, not legacy mode, so check your BIOS boot mode, select &lt;code&gt;UEFI only&lt;/code&gt;, and run in LIVE terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo efibootmgr -c -L Grub -l /EFI/ubuntu/grubx64.efi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>install debian 9 on virtualbox</title>
      <dc:creator>TianZhen</dc:creator>
      <pubDate>Tue, 20 Jun 2017 16:03:34 +0000</pubDate>
      <link>https://dev.to/dawncold/install-debian-9-on-virtualbox</link>
      <guid>https://dev.to/dawncold/install-debian-9-on-virtualbox</guid>
      <description>&lt;h1&gt;
  
  
  why virtualbox
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;UPDATE: The list of VMWare OS version only help you set basic resource (CPU, Memory, etc), so you can choose anyone and modify them on your need&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I don't know which OS version should be chosen from VMWare OS version list. There are some Debian series, latest is Debian 8.x, but I need 9, also there is no Kernel 4.x item on the list, so I install virtualbox, I find a Debian (64bit).&lt;/p&gt;

&lt;h1&gt;
  
  
  disk space
&lt;/h1&gt;

&lt;p&gt;It's better to generate a 15Gib or more disk. I use a 10Gib disk and got "no more space" error during installing GNOME.&lt;/p&gt;

&lt;h1&gt;
  
  
  additional software
&lt;/h1&gt;

&lt;p&gt;compile virtualbox additional software needs some build softwares, you can get them from &lt;code&gt;build-essential&lt;/code&gt; package, and build kernel modules need kernel header files, you can get them from &lt;code&gt;linux-headers-4.9.0-3-amd64&lt;/code&gt;, which is default kernel version.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install build-essential linux-headers-4.9.0-3-amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>debian</category>
      <category>virtualbox</category>
      <category>linux</category>
    </item>
    <item>
      <title>VMware Tools 启动脚本未能在虚拟机中成功运行</title>
      <dc:creator>TianZhen</dc:creator>
      <pubDate>Tue, 06 Jun 2017 15:32:00 +0000</pubDate>
      <link>https://dev.to/dawncold/vmware-tools-</link>
      <guid>https://dev.to/dawncold/vmware-tools-</guid>
      <description>

</description>
      <category>vmware</category>
    </item>
    <item>
      <title>enlarge ubuntu root partition in vmware</title>
      <dc:creator>TianZhen</dc:creator>
      <pubDate>Sun, 12 Mar 2017 05:12:02 +0000</pubDate>
      <link>https://dev.to/dawncold/enlarge-ubuntu-root-partition-in-vmware</link>
      <guid>https://dev.to/dawncold/enlarge-ubuntu-root-partition-in-vmware</guid>
      <description>&lt;p&gt;I have a ubuntu vmware guest with 30Gb root partition, but it's not enough after restore data from production environment, so I have to enlarge it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shutdown ubuntu&lt;/li&gt;
&lt;li&gt;enlarge partition on vmware guest setting&lt;/li&gt;
&lt;li&gt;start ubuntu, it's better use text mode&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo fdisk /dev/sda&lt;/code&gt; (I have only one device in ubuntu, &lt;code&gt;sda&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;delete swap partition and root partition with &lt;code&gt;d&lt;/code&gt; command (yes, delete all partitions)&lt;/li&gt;
&lt;li&gt;create root partition (primary partition) with &lt;code&gt;n&lt;/code&gt; command, be careful the start selector must be as same as old root partition (default is good), end selector is the size what you want the partition be, e.g. &lt;code&gt;+45G&lt;/code&gt;, is a 45Gb partiton&lt;/li&gt;
&lt;li&gt;(optional) create swap partition if you need, with &lt;code&gt;n&lt;/code&gt; command, and then change swap partition type with &lt;code&gt;t&lt;/code&gt; command, swap type code is &lt;code&gt;82&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;write changes with &lt;code&gt;w&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;reboot ubuntu&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo resize2fs /dev/sda1&lt;/code&gt;, enlarge &lt;code&gt;sda1&lt;/code&gt; to default new size, e.g. 45Gb&lt;/li&gt;
&lt;li&gt;(optional) &lt;code&gt;sudo mkswp /dev/sda2&lt;/code&gt; if you create swap partition&lt;/li&gt;
&lt;li&gt;(optional) change swap partition record in &lt;code&gt;/etc/fstab&lt;/code&gt;, new swap partition uuid or label could be found on &lt;code&gt;sudo blkid&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ubuntu</category>
      <category>vmware</category>
      <category>resize2fs</category>
    </item>
    <item>
      <title>自建NAS选购指南 硬件篇</title>
      <dc:creator>TianZhen</dc:creator>
      <pubDate>Sat, 11 Mar 2017 13:59:03 +0000</pubDate>
      <link>https://dev.to/dawncold/nas-</link>
      <guid>https://dev.to/dawncold/nas-</guid>
      <description>

</description>
      <category>nas</category>
      <category>freenas</category>
      <category>ecc</category>
      <category>zfs</category>
    </item>
    <item>
      <title>TCP FIN_WAIT_2, TIME_WAIT and CLOSE_WAIT</title>
      <dc:creator>TianZhen</dc:creator>
      <pubDate>Wed, 15 Feb 2017 07:51:24 +0000</pubDate>
      <link>https://dev.to/dawncold/tcp-finwait2-timewait-and-closewait</link>
      <guid>https://dev.to/dawncold/tcp-finwait2-timewait-and-closewait</guid>
      <description>&lt;p&gt;Serverå’ŒClientéƒ½å¯ä»¥å…³é—­å·²å»ºç«‹çš„è¿žæŽ¥ï¼Œæœ‰å¯èƒ½Serverå…ˆå…³é—­ï¼Œæœ‰å¯èƒ½Clientå…ˆå…³é—­ï¼Œæœ‰å¯èƒ½åŒæ—¶å…³é—­ã€‚åŒæ—¶å…³é—­ä¸å¤ªå¸¸è§ï¼ŒServerå…³é—­ä¹Ÿä¸å¤ªå¸¸è§ï¼ˆServerè§‰å¾—æœ‰äº›Clientä¸€ç›´ä¿æŒç€è¿žæŽ¥å ç”¨èµ„æºï¼Œå…³é—­äº†æŸäº›Clientçš„è¿žæŽ¥ï¼Œä¸€èˆ¬æ¥è¯´Serveræ˜¯åšæœåŠ¡çš„ï¼Œä¸ä¼šä¸»åŠ¨æ–­å¼€ï¼Œé™¤éžæ˜¯æŸäº›ç‰¹åˆ«çš„éœ€è¦ï¼‰ï¼ŒClientå…ˆå…³é—­æ¯”è¾ƒå¸¸è§ã€‚&lt;/p&gt;

&lt;p&gt;Clientå…ˆå…³é—­çš„æƒ…å†µï¼š&lt;a href="https://benohead.com/tcp-about-fin_wait_2-time_wait-and-close_wait/"&gt;https://benohead.com/tcp-about-fin_wait_2-time_wait-and-close_wait/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Serverå…ˆå…³é—­çš„æƒ…å†µï¼š&lt;a href="https://benohead.com/c-understanding-close_wait-and-fin_wait_2/"&gt;https://benohead.com/c-understanding-close_wait-and-fin_wait_2/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;åŒæ—¶å…³é—­è¿žæŽ¥çš„æƒ…å†µï¼š&lt;a href="http://www.tcpipguide.com/free/t_TCPConnectionTermination-4.htm"&gt;http://www.tcpipguide.com/free/t_TCPConnectionTermination-4.htm&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>speed up your pyres worker</title>
      <dc:creator>TianZhen</dc:creator>
      <pubDate>Thu, 09 Feb 2017 14:40:28 +0000</pubDate>
      <link>https://dev.to/dawncold/speed-up-your-pyres-worker</link>
      <guid>https://dev.to/dawncold/speed-up-your-pyres-worker</guid>
      <description>&lt;p&gt;We have a queue system for async works, it is build by &lt;code&gt;Pyres&lt;/code&gt; with &lt;code&gt;Redis&lt;/code&gt;. It works fine if your application is small, pyres worker forks a new process before doing job, and then terminate working process, worker just waits for new job.&lt;/p&gt;

&lt;p&gt;With out application is more and more complex, every new working process spends much time on loading, the package must be loaded, the package's dependencies must be loaded, e.g. working process only spends 1s on executing job code, but it needs 10s for loading.&lt;/p&gt;

&lt;p&gt;We think if &lt;code&gt;worker process&lt;/code&gt; could load everything it needs, new process don't need load because of new process is forked by &lt;code&gt;worker process&lt;/code&gt;, python knows which module is loaded, if you load a loaded module, it just returns, very fast. Maybe &lt;code&gt;Worker&lt;/code&gt; class can be extened and implement &lt;code&gt;before_fork&lt;/code&gt; method for loading something, loaded modules are available for new forked process.&lt;/p&gt;

&lt;p&gt;Another methods is that, if &lt;code&gt;working process&lt;/code&gt; could exists for a long time, it don't need load modules again for some time. There is a &lt;code&gt;pyres_manager&lt;/code&gt;, it creates a &lt;code&gt;manager&lt;/code&gt;, &lt;code&gt;manager&lt;/code&gt; creates some &lt;code&gt;minion&lt;/code&gt;, &lt;code&gt;manager&lt;/code&gt; put &lt;code&gt;minion&lt;/code&gt; into &lt;code&gt;pool&lt;/code&gt;. If you want to use &lt;code&gt;pyres_manager&lt;/code&gt;, don't expect &lt;code&gt;resweb&lt;/code&gt; works fine, it can't display &lt;code&gt;worker&lt;/code&gt; because it don't know &lt;code&gt;minion&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>pyres</category>
    </item>
  </channel>
</rss>
