diff --git "a/2018/09/19/hello-my-first-blog-in-here-\357\274\201/index.html" "b/2018/09/19/hello-my-first-blog-in-here-\357\274\201/index.html" index 49ec05aa3d..90e2d02dc9 100644 --- "a/2018/09/19/hello-my-first-blog-in-here-\357\274\201/index.html" +++ "b/2018/09/19/hello-my-first-blog-in-here-\357\274\201/index.html" @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2018/09/25/Markdown/index.html b/2018/09/25/Markdown/index.html index ccb65667ef..12d72bf4c3 100644 --- a/2018/09/25/Markdown/index.html +++ b/2018/09/25/Markdown/index.html @@ -1913,7 +1913,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3014,8 +3014,7 @@

Markdown(2)兴奋于搭建了我的博客,兴奋于认识了markdown,终于可以甩开花里胡哨的word了,233333!!! -认识Markdo...优雅的MarkdownMarkdown浅尝一、勾选框注意[]前后都要有空格 -1234- [x] 干的漂亮- [x] 吃饭- [x] 写代码- [...优雅的Markdown(2)Markdown编辑器使用-MarkdownPad2 +认识Markdo...优雅的Markdown(2)Markdown编辑器使用-MarkdownPad2 imgur已被GFW干掉 快捷键 @@ -3027,7 +3026,8 @@

优雅的MarkdownMarkdown浅尝一、勾选框注意[]前后都要有空格 +1234- [x] 干的漂亮- [x] 吃饭- [x] 写代码- [... diff --git "a/2018/09/25/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2101\357\274\211/index.html" "b/2018/09/25/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2101\357\274\211/index.html" index 68e6766085..63bb95212d 100644 --- "a/2018/09/25/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2101\357\274\211/index.html" +++ "b/2018/09/25/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2101\357\274\211/index.html" @@ -1915,7 +1915,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/09/25/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2102\357\274\211/index.html" "b/2018/09/25/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2102\357\274\211/index.html" index 65d4cd57a0..5b9b834ff5 100644 --- "a/2018/09/25/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2102\357\274\211/index.html" +++ "b/2018/09/25/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2102\357\274\211/index.html" @@ -1917,7 +1917,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2018/09/26/Markdown-2/index.html b/2018/09/26/Markdown-2/index.html index f1ebdeb8aa..5d29c78514 100644 --- a/2018/09/26/Markdown-2/index.html +++ b/2018/09/26/Markdown-2/index.html @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2980,8 +2980,7 @@

优雅的MarkdownMarkdown浅尝一、勾选框注意[]前后都要有空格 -1234- [x] 干的漂亮- [x] 吃饭- [x] 写代码- [...优雅的Markdown(2)Markdown编辑器使用-MarkdownPad2 +添加图片优雅的Markdown(2)Markdown编辑器使用-MarkdownPad2 imgur已被GFW干掉 快捷键 @@ -2993,7 +2992,8 @@
+ctrl+B...优雅的MarkdownMarkdown浅尝一、勾选框注意[]前后都要有空格 +1234- [x] 干的漂亮- [x] 吃饭- [x] 写代码- [... diff --git a/2018/09/26/xuxu/index.html b/2018/09/26/xuxu/index.html index 09746a16a2..b8017e0cbe 100644 --- a/2018/09/26/xuxu/index.html +++ b/2018/09/26/xuxu/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/09/26/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2103\357\274\211/index.html" "b/2018/09/26/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2103\357\274\211/index.html" index 0c2a8cec3e..4ce9de4327 100644 --- "a/2018/09/26/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2103\357\274\211/index.html" +++ "b/2018/09/26/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2103\357\274\211/index.html" @@ -1915,7 +1915,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/09/27/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2104\357\274\211/index.html" "b/2018/09/27/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2104\357\274\211/index.html" index ecadf0ee09..9a84dca9e2 100644 --- "a/2018/09/27/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2104\357\274\211/index.html" +++ "b/2018/09/27/\345\215\232\345\256\242\346\220\255\345\273\272\345\216\206\347\250\213\357\274\2104\357\274\211/index.html" @@ -1916,7 +1916,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2018/09/28/music/index.html b/2018/09/28/music/index.html index 7c3c159d0d..064f90c9ac 100644 --- a/2018/09/28/music/index.html +++ b/2018/09/28/music/index.html @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/09/28/\344\274\230\351\233\205\347\232\204Markdown/index.html" "b/2018/09/28/\344\274\230\351\233\205\347\232\204Markdown/index.html" index a66ee4f8a3..bb8d178578 100644 --- "a/2018/09/28/\344\274\230\351\233\205\347\232\204Markdown/index.html" +++ "b/2018/09/28/\344\274\230\351\233\205\347\232\204Markdown/index.html" @@ -1915,7 +1915,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/09/29/\347\256\200\345\215\225\347\210\254\350\231\253/index.html" "b/2018/09/29/\347\256\200\345\215\225\347\210\254\350\231\253/index.html" index bc830297fe..cb3a13665e 100644 --- "a/2018/09/29/\347\256\200\345\215\225\347\210\254\350\231\253/index.html" +++ "b/2018/09/29/\347\256\200\345\215\225\347\210\254\350\231\253/index.html" @@ -1929,7 +1929,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/09/30/\344\274\230\351\233\205\347\232\204Markdown\357\274\2102\357\274\211/index.html" "b/2018/09/30/\344\274\230\351\233\205\347\232\204Markdown\357\274\2102\357\274\211/index.html" index ce0f3ecef7..82f581c7ff 100644 --- "a/2018/09/30/\344\274\230\351\233\205\347\232\204Markdown\357\274\2102\357\274\211/index.html" +++ "b/2018/09/30/\344\274\230\351\233\205\347\232\204Markdown\357\274\2102\357\274\211/index.html" @@ -1950,7 +1950,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/01/Requests\345\272\223\345\205\245\351\227\250-2/index.html" "b/2018/10/01/Requests\345\272\223\345\205\245\351\227\250-2/index.html" index cdea995ba4..3cc768d29e 100644 --- "a/2018/10/01/Requests\345\272\223\345\205\245\351\227\250-2/index.html" +++ "b/2018/10/01/Requests\345\272\223\345\205\245\351\227\250-2/index.html" @@ -1916,7 +1916,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/02/ACM\345\205\245\351\227\250/index.html" "b/2018/10/02/ACM\345\205\245\351\227\250/index.html" index 0c7d4da9bd..e18e989e91 100644 --- "a/2018/10/02/ACM\345\205\245\351\227\250/index.html" +++ "b/2018/10/02/ACM\345\205\245\351\227\250/index.html" @@ -1917,7 +1917,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/02/C++-\345\205\245\345\235\221\350\256\260/index.html" "b/2018/10/02/C++-\345\205\245\345\235\221\350\256\260/index.html" index d78797a6f0..29a270756c 100644 --- "a/2018/10/02/C++-\345\205\245\345\235\221\350\256\260/index.html" +++ "b/2018/10/02/C++-\345\205\245\345\235\221\350\256\260/index.html" @@ -1934,7 +1934,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/03/C++-\345\205\245\345\235\221\350\256\260-2/index.html" "b/2018/10/03/C++-\345\205\245\345\235\221\350\256\260-2/index.html" index f8e29f19f7..6c1bfce5cf 100644 --- "a/2018/10/03/C++-\345\205\245\345\235\221\350\256\260-2/index.html" +++ "b/2018/10/03/C++-\345\205\245\345\235\221\350\256\260-2/index.html" @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/03/\345\267\245\345\205\267\345\260\217\346\225\264\345\220\210/index.html" "b/2018/10/03/\345\267\245\345\205\267\345\260\217\346\225\264\345\220\210/index.html" index ce8ed7aa08..97b1c8ea02 100644 --- "a/2018/10/03/\345\267\245\345\205\267\345\260\217\346\225\264\345\220\210/index.html" +++ "b/2018/10/03/\345\267\245\345\205\267\345\260\217\346\225\264\345\220\210/index.html" @@ -1907,7 +1907,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/04/C++-\345\205\245\345\235\221\350\256\260-3/index.html" "b/2018/10/04/C++-\345\205\245\345\235\221\350\256\260-3/index.html" index 794d8555fb..ef3781c16a 100644 --- "a/2018/10/04/C++-\345\205\245\345\235\221\350\256\260-3/index.html" +++ "b/2018/10/04/C++-\345\205\245\345\235\221\350\256\260-3/index.html" @@ -1937,7 +1937,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/05/C++-\351\235\242\345\220\221\345\257\271\350\261\241/index.html" "b/2018/10/05/C++-\351\235\242\345\220\221\345\257\271\350\261\241/index.html" index 048394ea64..fe95f53529 100644 --- "a/2018/10/05/C++-\351\235\242\345\220\221\345\257\271\350\261\241/index.html" +++ "b/2018/10/05/C++-\351\235\242\345\220\221\345\257\271\350\261\241/index.html" @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/06/C++-\351\235\242\345\220\221\345\257\271\350\261\241-2/index.html" "b/2018/10/06/C++-\351\235\242\345\220\221\345\257\271\350\261\241-2/index.html" index 670d432565..8adb54a8df 100644 --- "a/2018/10/06/C++-\351\235\242\345\220\221\345\257\271\350\261\241-2/index.html" +++ "b/2018/10/06/C++-\351\235\242\345\220\221\345\257\271\350\261\241-2/index.html" @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/09/C++-\351\235\242\345\220\221\345\257\271\350\261\241-3/index.html" "b/2018/10/09/C++-\351\235\242\345\220\221\345\257\271\350\261\241-3/index.html" index 9483fcf544..a90eb81a1d 100644 --- "a/2018/10/09/C++-\351\235\242\345\220\221\345\257\271\350\261\241-3/index.html" +++ "b/2018/10/09/C++-\351\235\242\345\220\221\345\257\271\350\261\241-3/index.html" @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/10/\346\265\205\345\260\235BeautifulSoup/index.html" "b/2018/10/10/\346\265\205\345\260\235BeautifulSoup/index.html" index cf93abb29a..418ea83894 100644 --- "a/2018/10/10/\346\265\205\345\260\235BeautifulSoup/index.html" +++ "b/2018/10/10/\346\265\205\345\260\235BeautifulSoup/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/11/C++-\351\235\242\345\220\221\345\257\271\350\261\241-4/index.html" "b/2018/10/11/C++-\351\235\242\345\220\221\345\257\271\350\261\241-4/index.html" index 2d8057f9fe..564cbc21a1 100644 --- "a/2018/10/11/C++-\351\235\242\345\220\221\345\257\271\350\261\241-4/index.html" +++ "b/2018/10/11/C++-\351\235\242\345\220\221\345\257\271\350\261\241-4/index.html" @@ -1919,7 +1919,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/12/C++-\351\235\242\345\220\221\345\257\271\350\261\241-5/index.html" "b/2018/10/12/C++-\351\235\242\345\220\221\345\257\271\350\261\241-5/index.html" index e2306cfa28..d0c4a9df7c 100644 --- "a/2018/10/12/C++-\351\235\242\345\220\221\345\257\271\350\261\241-5/index.html" +++ "b/2018/10/12/C++-\351\235\242\345\220\221\345\257\271\350\261\241-5/index.html" @@ -1916,7 +1916,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2018/10/12/XXX/index.html b/2018/10/12/XXX/index.html index 15f8e0b09d..965c16f2b7 100644 --- a/2018/10/12/XXX/index.html +++ b/2018/10/12/XXX/index.html @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/12/\344\277\241\346\201\257\346\240\207\350\256\260/index.html" "b/2018/10/12/\344\277\241\346\201\257\346\240\207\350\256\260/index.html" index f61cd04fc9..63f0ee280a 100644 --- "a/2018/10/12/\344\277\241\346\201\257\346\240\207\350\256\260/index.html" +++ "b/2018/10/12/\344\277\241\346\201\257\346\240\207\350\256\260/index.html" @@ -1915,7 +1915,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2018/10/13/Just-relax/index.html b/2018/10/13/Just-relax/index.html index d52ef11f78..41217da0f3 100644 --- a/2018/10/13/Just-relax/index.html +++ b/2018/10/13/Just-relax/index.html @@ -1907,7 +1907,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/14/C++-\351\235\242\345\220\221\345\257\271\350\261\241-6/index.html" "b/2018/10/14/C++-\351\235\242\345\220\221\345\257\271\350\261\241-6/index.html" index 6e3d9a4600..1442d85bad 100644 --- "a/2018/10/14/C++-\351\235\242\345\220\221\345\257\271\350\261\241-6/index.html" +++ "b/2018/10/14/C++-\351\235\242\345\220\221\345\257\271\350\261\241-6/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2018/10/15/Eyes-candy/index.html b/2018/10/15/Eyes-candy/index.html index 0002365732..eb97837dbf 100644 --- a/2018/10/15/Eyes-candy/index.html +++ b/2018/10/15/Eyes-candy/index.html @@ -1907,7 +1907,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/15/\345\256\232\345\220\221\347\210\254\350\231\253-\344\270\255\345\233\275\345\244\247\345\255\246MOOC-python\347\275\221\347\273\234\347\210\254\350\231\253\345\256\236\344\276\213/index.html" "b/2018/10/15/\345\256\232\345\220\221\347\210\254\350\231\253-\344\270\255\345\233\275\345\244\247\345\255\246MOOC-python\347\275\221\347\273\234\347\210\254\350\231\253\345\256\236\344\276\213/index.html" index 6abd5b2852..f32a58ac49 100644 --- "a/2018/10/15/\345\256\232\345\220\221\347\210\254\350\231\253-\344\270\255\345\233\275\345\244\247\345\255\246MOOC-python\347\275\221\347\273\234\347\210\254\350\231\253\345\256\236\344\276\213/index.html" +++ "b/2018/10/15/\345\256\232\345\220\221\347\210\254\350\231\253-\344\270\255\345\233\275\345\244\247\345\255\246MOOC-python\347\275\221\347\273\234\347\210\254\350\231\253\345\256\236\344\276\213/index.html" @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/16/C++-\351\235\242\345\220\221\345\257\271\350\261\241-7/index.html" "b/2018/10/16/C++-\351\235\242\345\220\221\345\257\271\350\261\241-7/index.html" index 8583b6e692..a21fb58938 100644 --- "a/2018/10/16/C++-\351\235\242\345\220\221\345\257\271\350\261\241-7/index.html" +++ "b/2018/10/16/C++-\351\235\242\345\220\221\345\257\271\350\261\241-7/index.html" @@ -1913,7 +1913,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2018/10/16/recording/index.html b/2018/10/16/recording/index.html index bf0344b14b..f5291781ef 100644 --- a/2018/10/16/recording/index.html +++ b/2018/10/16/recording/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/18/\344\270\230\344\270\200\344\270\230\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217/index.html" "b/2018/10/18/\344\270\230\344\270\200\344\270\230\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217/index.html" index 48a778b1b1..4569a10005 100644 --- "a/2018/10/18/\344\270\230\344\270\200\344\270\230\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217/index.html" +++ "b/2018/10/18/\344\270\230\344\270\200\344\270\230\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217/index.html" @@ -1915,7 +1915,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/22/\345\235\221\344\272\272\347\232\204C++-2/index.html" "b/2018/10/22/\345\235\221\344\272\272\347\232\204C++-2/index.html" index 65ee172727..ae1e029dde 100644 --- "a/2018/10/22/\345\235\221\344\272\272\347\232\204C++-2/index.html" +++ "b/2018/10/22/\345\235\221\344\272\272\347\232\204C++-2/index.html" @@ -1927,7 +1927,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/22/\345\235\221\344\272\272\347\232\204C++/index.html" "b/2018/10/22/\345\235\221\344\272\272\347\232\204C++/index.html" index dcc3be97b2..148b98c0fd 100644 --- "a/2018/10/22/\345\235\221\344\272\272\347\232\204C++/index.html" +++ "b/2018/10/22/\345\235\221\344\272\272\347\232\204C++/index.html" @@ -1914,7 +1914,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/24/\347\253\226\345\274\217\351\227\256\351\242\230/index.html" "b/2018/10/24/\347\253\226\345\274\217\351\227\256\351\242\230/index.html" index 2263a18a69..e8b6574aba 100644 --- "a/2018/10/24/\347\253\226\345\274\217\351\227\256\351\242\230/index.html" +++ "b/2018/10/24/\347\253\226\345\274\217\351\227\256\351\242\230/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/30/HTML\350\257\225\346\260\264/index.html" "b/2018/10/30/HTML\350\257\225\346\260\264/index.html" index cae6b4d44f..3eb35015c4 100644 --- "a/2018/10/30/HTML\350\257\225\346\260\264/index.html" +++ "b/2018/10/30/HTML\350\257\225\346\260\264/index.html" @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/10/31/Scrapy\347\210\254\350\231\253\346\241\206\346\236\266/index.html" "b/2018/10/31/Scrapy\347\210\254\350\231\253\346\241\206\346\236\266/index.html" index d5e9151287..6d542c403b 100644 --- "a/2018/10/31/Scrapy\347\210\254\350\231\253\346\241\206\346\236\266/index.html" +++ "b/2018/10/31/Scrapy\347\210\254\350\231\253\346\241\206\346\236\266/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/11/02/python\347\224\237\346\210\220\345\231\250\345\233\236\351\241\276/index.html" "b/2018/11/02/python\347\224\237\346\210\220\345\231\250\345\233\236\351\241\276/index.html" index 5bad7d0222..7c94c12c06 100644 --- "a/2018/11/02/python\347\224\237\346\210\220\345\231\250\345\233\236\351\241\276/index.html" +++ "b/2018/11/02/python\347\224\237\346\210\220\345\231\250\345\233\236\351\241\276/index.html" @@ -1914,7 +1914,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/11/05/C++-11\347\211\271\346\200\247-1/index.html" "b/2018/11/05/C++-11\347\211\271\346\200\247-1/index.html" index 55c2f0cee4..c51b2fac1e 100644 --- "a/2018/11/05/C++-11\347\211\271\346\200\247-1/index.html" +++ "b/2018/11/05/C++-11\347\211\271\346\200\247-1/index.html" @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/11/05/C++-\346\240\207\345\207\206\345\272\223\347\261\273\345\236\213/index.html" "b/2018/11/05/C++-\346\240\207\345\207\206\345\272\223\347\261\273\345\236\213/index.html" index bcca4101b9..30a98b21fe 100644 --- "a/2018/11/05/C++-\346\240\207\345\207\206\345\272\223\347\261\273\345\236\213/index.html" +++ "b/2018/11/05/C++-\346\240\207\345\207\206\345\272\223\347\261\273\345\236\213/index.html" @@ -1926,7 +1926,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/11/06/\347\262\276\345\272\246-precision-\346\216\247\345\210\266/index.html" "b/2018/11/06/\347\262\276\345\272\246-precision-\346\216\247\345\210\266/index.html" index d7782d8d91..08b509fd54 100644 --- "a/2018/11/06/\347\262\276\345\272\246-precision-\346\216\247\345\210\266/index.html" +++ "b/2018/11/06/\347\262\276\345\272\246-precision-\346\216\247\345\210\266/index.html" @@ -1915,7 +1915,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/11/15/C++-\351\235\242\345\220\221\345\257\271\350\261\241-8/index.html" "b/2018/11/15/C++-\351\235\242\345\220\221\345\257\271\350\261\241-8/index.html" index 3147c9e957..ab0dfbb2e9 100644 --- "a/2018/11/15/C++-\351\235\242\345\220\221\345\257\271\350\261\241-8/index.html" +++ "b/2018/11/15/C++-\351\235\242\345\220\221\345\257\271\350\261\241-8/index.html" @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/11/19/\344\272\214\345\210\206\346\237\245\346\211\276/index.html" "b/2018/11/19/\344\272\214\345\210\206\346\237\245\346\211\276/index.html" index e2848b3bb3..a8d99633c6 100644 --- "a/2018/11/19/\344\272\214\345\210\206\346\237\245\346\211\276/index.html" +++ "b/2018/11/19/\344\272\214\345\210\206\346\237\245\346\211\276/index.html" @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/11/20/\346\216\222\345\272\217\347\256\227\346\263\225/index.html" "b/2018/11/20/\346\216\222\345\272\217\347\256\227\346\263\225/index.html" index 6b4aa9b7dc..19270c138f 100644 --- "a/2018/11/20/\346\216\222\345\272\217\347\256\227\346\263\225/index.html" +++ "b/2018/11/20/\346\216\222\345\272\217\347\256\227\346\263\225/index.html" @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/11/22/IO\347\261\273\345\236\213/index.html" "b/2018/11/22/IO\347\261\273\345\236\213/index.html" index 037b7a8d46..7f55e13752 100644 --- "a/2018/11/22/IO\347\261\273\345\236\213/index.html" +++ "b/2018/11/22/IO\347\261\273\345\236\213/index.html" @@ -1916,7 +1916,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/11/22/\345\206\215\346\216\242\345\207\275\346\225\260/index.html" "b/2018/11/22/\345\206\215\346\216\242\345\207\275\346\225\260/index.html" index e63e598996..5f1391afc7 100644 --- "a/2018/11/22/\345\206\215\346\216\242\345\207\275\346\225\260/index.html" +++ "b/2018/11/22/\345\206\215\346\216\242\345\207\275\346\225\260/index.html" @@ -1916,7 +1916,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/11/27/Keep-on-moving-\357\274\201/index.html" "b/2018/11/27/Keep-on-moving-\357\274\201/index.html" index b68e5986cf..3d5236c14b 100644 --- "a/2018/11/27/Keep-on-moving-\357\274\201/index.html" +++ "b/2018/11/27/Keep-on-moving-\357\274\201/index.html" @@ -1907,7 +1907,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/12/01/\346\240\207\345\207\206\345\272\223\345\256\271\345\231\250/index.html" "b/2018/12/01/\346\240\207\345\207\206\345\272\223\345\256\271\345\231\250/index.html" index 8266893647..90f1b7f0f9 100644 --- "a/2018/12/01/\346\240\207\345\207\206\345\272\223\345\256\271\345\231\250/index.html" +++ "b/2018/12/01/\346\240\207\345\207\206\345\272\223\345\256\271\345\231\250/index.html" @@ -1907,7 +1907,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/12/03/biu\344\270\200\344\270\213GDB/index.html" "b/2018/12/03/biu\344\270\200\344\270\213GDB/index.html" index d43edc1400..4ae0df548d 100644 --- "a/2018/12/03/biu\344\270\200\344\270\213GDB/index.html" +++ "b/2018/12/03/biu\344\270\200\344\270\213GDB/index.html" @@ -1913,7 +1913,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/12/13/\345\213\277\345\277\230\345\233\275\350\200\273\357\274\214\345\220\276\350\276\210\350\207\252\345\274\272\357\274\201/index.html" "b/2018/12/13/\345\213\277\345\277\230\345\233\275\350\200\273\357\274\214\345\220\276\350\276\210\350\207\252\345\274\272\357\274\201/index.html" index 10dc1b82d8..d15520f0fa 100644 --- "a/2018/12/13/\345\213\277\345\277\230\345\233\275\350\200\273\357\274\214\345\220\276\350\276\210\350\207\252\345\274\272\357\274\201/index.html" +++ "b/2018/12/13/\345\213\277\345\277\230\345\233\275\350\200\273\357\274\214\345\220\276\350\276\210\350\207\252\345\274\272\357\274\201/index.html" @@ -1907,7 +1907,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/12/14/\347\272\277\346\200\247\350\241\250\344\271\213\351\241\272\345\272\217\345\255\230\345\202\250-\351\241\272\345\272\217\350\241\250/index.html" "b/2018/12/14/\347\272\277\346\200\247\350\241\250\344\271\213\351\241\272\345\272\217\345\255\230\345\202\250-\351\241\272\345\272\217\350\241\250/index.html" index 15ed0d8cf8..d91017a0bd 100644 --- "a/2018/12/14/\347\272\277\346\200\247\350\241\250\344\271\213\351\241\272\345\272\217\345\255\230\345\202\250-\351\241\272\345\272\217\350\241\250/index.html" +++ "b/2018/12/14/\347\272\277\346\200\247\350\241\250\344\271\213\351\241\272\345\272\217\345\255\230\345\202\250-\351\241\272\345\272\217\350\241\250/index.html" @@ -1919,7 +1919,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/12/15/\347\272\277\346\200\247\350\241\250\347\232\204\351\223\276\345\274\217\345\255\230\345\202\250-\345\215\225\351\223\276\350\241\250/index.html" "b/2018/12/15/\347\272\277\346\200\247\350\241\250\347\232\204\351\223\276\345\274\217\345\255\230\345\202\250-\345\215\225\351\223\276\350\241\250/index.html" index 1cc452cb09..6d005f89fa 100644 --- "a/2018/12/15/\347\272\277\346\200\247\350\241\250\347\232\204\351\223\276\345\274\217\345\255\230\345\202\250-\345\215\225\351\223\276\350\241\250/index.html" +++ "b/2018/12/15/\347\272\277\346\200\247\350\241\250\347\232\204\351\223\276\345\274\217\345\255\230\345\202\250-\345\215\225\351\223\276\350\241\250/index.html" @@ -1917,7 +1917,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2018/12/31/memory/index.html b/2018/12/31/memory/index.html index 4fc054f594..9003f02468 100644 --- a/2018/12/31/memory/index.html +++ b/2018/12/31/memory/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2018/12/31/\350\207\264\346\225\2542018/index.html" "b/2018/12/31/\350\207\264\346\225\2542018/index.html" index 83f82ac39b..1510945264 100644 --- "a/2018/12/31/\350\207\264\346\225\2542018/index.html" +++ "b/2018/12/31/\350\207\264\346\225\2542018/index.html" @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/01/01/2019\344\275\240\345\245\275/index.html" "b/2019/01/01/2019\344\275\240\345\245\275/index.html" index a7b6f755ed..1ca9ff9208 100644 --- "a/2019/01/01/2019\344\275\240\345\245\275/index.html" +++ "b/2019/01/01/2019\344\275\240\345\245\275/index.html" @@ -1907,7 +1907,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/01/01/\345\215\232\345\256\242\346\220\255\345\273\272\345\217\202\350\200\203\346\261\207\346\200\273/index.html" "b/2019/01/01/\345\215\232\345\256\242\346\220\255\345\273\272\345\217\202\350\200\203\346\261\207\346\200\273/index.html" index c1fb8fdc3d..444c36bbaf 100644 --- "a/2019/01/01/\345\215\232\345\256\242\346\220\255\345\273\272\345\217\202\350\200\203\346\261\207\346\200\273/index.html" +++ "b/2019/01/01/\345\215\232\345\256\242\346\220\255\345\273\272\345\217\202\350\200\203\346\261\207\346\200\273/index.html" @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/01/03/\346\263\233\345\236\213\347\256\227\346\263\225-1/index.html" "b/2019/01/03/\346\263\233\345\236\213\347\256\227\346\263\225-1/index.html" index ebc9dc59ca..bd3777ff6d 100644 --- "a/2019/01/03/\346\263\233\345\236\213\347\256\227\346\263\225-1/index.html" +++ "b/2019/01/03/\346\263\233\345\236\213\347\256\227\346\263\225-1/index.html" @@ -1913,7 +1913,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/01/03/\350\243\205\351\245\260\345\231\250-python/index.html" "b/2019/01/03/\350\243\205\351\245\260\345\231\250-python/index.html" index 0679dba4fa..e295ef15f4 100644 --- "a/2019/01/03/\350\243\205\351\245\260\345\231\250-python/index.html" +++ "b/2019/01/03/\350\243\205\351\245\260\345\231\250-python/index.html" @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/01/09/Jinja2\350\257\255\346\263\225\345\260\217\350\256\260/index.html" "b/2019/01/09/Jinja2\350\257\255\346\263\225\345\260\217\350\256\260/index.html" index c38eb0fbd0..9882298e47 100644 --- "a/2019/01/09/Jinja2\350\257\255\346\263\225\345\260\217\350\256\260/index.html" +++ "b/2019/01/09/Jinja2\350\257\255\346\263\225\345\260\217\350\256\260/index.html" @@ -1923,7 +1923,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/01/16/\344\275\240\346\211\200\346\213\245\346\234\211\347\232\204\347\237\245\350\257\206\345\271\266\344\270\215\345\217\226\345\206\263\344\272\216\344\275\240\350\256\260\345\276\227\345\244\232\345\260\221\357\274\214\350\200\214\345\234\250\344\272\216\345\256\203\344\273\254\350\203\275\345\220\246\345\234\250\346\201\260\345\275\223\347\232\204\346\227\266\345\200\231\350\242\253\345\233\236\345\277\206\350\265\267\346\235\245\343\200\202/index.html" "b/2019/01/16/\344\275\240\346\211\200\346\213\245\346\234\211\347\232\204\347\237\245\350\257\206\345\271\266\344\270\215\345\217\226\345\206\263\344\272\216\344\275\240\350\256\260\345\276\227\345\244\232\345\260\221\357\274\214\350\200\214\345\234\250\344\272\216\345\256\203\344\273\254\350\203\275\345\220\246\345\234\250\346\201\260\345\275\223\347\232\204\346\227\266\345\200\231\350\242\253\345\233\236\345\277\206\350\265\267\346\235\245\343\200\202/index.html" index 9df22090e4..eb3076522d 100644 --- "a/2019/01/16/\344\275\240\346\211\200\346\213\245\346\234\211\347\232\204\347\237\245\350\257\206\345\271\266\344\270\215\345\217\226\345\206\263\344\272\216\344\275\240\350\256\260\345\276\227\345\244\232\345\260\221\357\274\214\350\200\214\345\234\250\344\272\216\345\256\203\344\273\254\350\203\275\345\220\246\345\234\250\346\201\260\345\275\223\347\232\204\346\227\266\345\200\231\350\242\253\345\233\236\345\277\206\350\265\267\346\235\245\343\200\202/index.html" +++ "b/2019/01/16/\344\275\240\346\211\200\346\213\245\346\234\211\347\232\204\347\237\245\350\257\206\345\271\266\344\270\215\345\217\226\345\206\263\344\272\216\344\275\240\350\256\260\345\276\227\345\244\232\345\260\221\357\274\214\350\200\214\345\234\250\344\272\216\345\256\203\344\273\254\350\203\275\345\220\246\345\234\250\346\201\260\345\275\223\347\232\204\346\227\266\345\200\231\350\242\253\345\233\236\345\277\206\350\265\267\346\235\245\343\200\202/index.html" @@ -1907,7 +1907,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/01/22/HTML-CSS-\345\210\222\346\260\264/index.html" "b/2019/01/22/HTML-CSS-\345\210\222\346\260\264/index.html" index 76de85a13a..e1def02783 100644 --- "a/2019/01/22/HTML-CSS-\345\210\222\346\260\264/index.html" +++ "b/2019/01/22/HTML-CSS-\345\210\222\346\260\264/index.html" @@ -1913,7 +1913,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2019/02/05/Happy-New-Year/index.html b/2019/02/05/Happy-New-Year/index.html index aa7b895fe4..2925ec9915 100644 --- a/2019/02/05/Happy-New-Year/index.html +++ b/2019/02/05/Happy-New-Year/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/03/03/vscode\351\205\215\347\275\256Pipenv\345\267\245\344\275\234\347\216\257\345\242\203/index.html" "b/2019/03/03/vscode\351\205\215\347\275\256Pipenv\345\267\245\344\275\234\347\216\257\345\242\203/index.html" index e3c3b623f1..fd6e564d35 100644 --- "a/2019/03/03/vscode\351\205\215\347\275\256Pipenv\345\267\245\344\275\234\347\216\257\345\242\203/index.html" +++ "b/2019/03/03/vscode\351\205\215\347\275\256Pipenv\345\267\245\344\275\234\347\216\257\345\242\203/index.html" @@ -1914,7 +1914,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/03/08/\345\260\206\346\234\254\345\234\260\351\241\271\347\233\256\346\216\250\351\200\201\345\210\260GitHub\350\277\234\347\250\213\344\273\223\345\272\223/index.html" "b/2019/03/08/\345\260\206\346\234\254\345\234\260\351\241\271\347\233\256\346\216\250\351\200\201\345\210\260GitHub\350\277\234\347\250\213\344\273\223\345\272\223/index.html" index e250cd4ace..817d8eb9f0 100644 --- "a/2019/03/08/\345\260\206\346\234\254\345\234\260\351\241\271\347\233\256\346\216\250\351\200\201\345\210\260GitHub\350\277\234\347\250\213\344\273\223\345\272\223/index.html" +++ "b/2019/03/08/\345\260\206\346\234\254\345\234\260\351\241\271\347\233\256\346\216\250\351\200\201\345\210\260GitHub\350\277\234\347\250\213\344\273\223\345\272\223/index.html" @@ -1919,7 +1919,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/03/16/Flask\347\232\204\350\257\267\346\261\202\351\222\251\345\255\220\344\270\216\344\270\212\344\270\213\346\226\207\347\256\200\350\256\260/index.html" "b/2019/03/16/Flask\347\232\204\350\257\267\346\261\202\351\222\251\345\255\220\344\270\216\344\270\212\344\270\213\346\226\207\347\256\200\350\256\260/index.html" index 3a36d4be26..074057b79d 100644 --- "a/2019/03/16/Flask\347\232\204\350\257\267\346\261\202\351\222\251\345\255\220\344\270\216\344\270\212\344\270\213\346\226\207\347\256\200\350\256\260/index.html" +++ "b/2019/03/16/Flask\347\232\204\350\257\267\346\261\202\351\222\251\345\255\220\344\270\216\344\270\212\344\270\213\346\226\207\347\256\200\350\256\260/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/03/20/SQLAlchemy\345\273\272\347\253\213\346\225\260\346\215\256\345\272\223\346\250\241\345\236\213\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273/index.html" "b/2019/03/20/SQLAlchemy\345\273\272\347\253\213\346\225\260\346\215\256\345\272\223\346\250\241\345\236\213\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273/index.html" index f1b15140e3..37c4e40df8 100644 --- "a/2019/03/20/SQLAlchemy\345\273\272\347\253\213\346\225\260\346\215\256\345\272\223\346\250\241\345\236\213\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273/index.html" +++ "b/2019/03/20/SQLAlchemy\345\273\272\347\253\213\346\225\260\346\215\256\345\272\223\346\250\241\345\236\213\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273/index.html" @@ -1915,7 +1915,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/03/20/\346\210\221\344\270\216vim\347\232\204\344\272\262\345\257\206\346\216\245\350\247\246/index.html" "b/2019/03/20/\346\210\221\344\270\216vim\347\232\204\344\272\262\345\257\206\346\216\245\350\247\246/index.html" index 8a05787494..eed456abf8 100644 --- "a/2019/03/20/\346\210\221\344\270\216vim\347\232\204\344\272\262\345\257\206\346\216\245\350\247\246/index.html" +++ "b/2019/03/20/\346\210\221\344\270\216vim\347\232\204\344\272\262\345\257\206\346\216\245\350\247\246/index.html" @@ -1914,7 +1914,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/03/22/\345\220\220\346\247\275/index.html" "b/2019/03/22/\345\220\220\346\247\275/index.html" index 7c18c2b1b1..1857489149 100644 --- "a/2019/03/22/\345\220\220\346\247\275/index.html" +++ "b/2019/03/22/\345\220\220\346\247\275/index.html" @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2019/04/08/Git-Branch-Practice/index.html b/2019/04/08/Git-Branch-Practice/index.html index cb4a6db7b5..905566ab9a 100644 --- a/2019/04/08/Git-Branch-Practice/index.html +++ b/2019/04/08/Git-Branch-Practice/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/04/23/HTTPie\347\232\204\344\275\277\347\224\250/index.html" "b/2019/04/23/HTTPie\347\232\204\344\275\277\347\224\250/index.html" index 16812d6649..7cfe69623a 100644 --- "a/2019/04/23/HTTPie\347\232\204\344\275\277\347\224\250/index.html" +++ "b/2019/04/23/HTTPie\347\232\204\344\275\277\347\224\250/index.html" @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/05/11/Python\345\244\232\350\277\233\347\250\213-\345\244\232\347\272\277\347\250\213/index.html" "b/2019/05/11/Python\345\244\232\350\277\233\347\250\213-\345\244\232\347\272\277\347\250\213/index.html" index b6edfdc99b..1d17ba1f68 100644 --- "a/2019/05/11/Python\345\244\232\350\277\233\347\250\213-\345\244\232\347\272\277\347\250\213/index.html" +++ "b/2019/05/11/Python\345\244\232\350\277\233\347\250\213-\345\244\232\347\272\277\347\250\213/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/05/22/Jupyter-Notebooks\347\232\204\347\256\200\345\215\225\344\272\206\350\247\243/index.html" "b/2019/05/22/Jupyter-Notebooks\347\232\204\347\256\200\345\215\225\344\272\206\350\247\243/index.html" index 71a2ce38d9..58366d8ee8 100644 --- "a/2019/05/22/Jupyter-Notebooks\347\232\204\347\256\200\345\215\225\344\272\206\350\247\243/index.html" +++ "b/2019/05/22/Jupyter-Notebooks\347\232\204\347\256\200\345\215\225\344\272\206\350\247\243/index.html" @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/05/24/Python\351\235\242\345\220\221\345\257\271\350\261\241/index.html" "b/2019/05/24/Python\351\235\242\345\220\221\345\257\271\350\261\241/index.html" index b2c377b55c..04833969c8 100644 --- "a/2019/05/24/Python\351\235\242\345\220\221\345\257\271\350\261\241/index.html" +++ "b/2019/05/24/Python\351\235\242\345\220\221\345\257\271\350\261\241/index.html" @@ -1918,7 +1918,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/06/08/\346\220\234\347\264\242\346\212\200\345\267\247/index.html" "b/2019/06/08/\346\220\234\347\264\242\346\212\200\345\267\247/index.html" index 07b044fdf8..9d5085e979 100644 --- "a/2019/06/08/\346\220\234\347\264\242\346\212\200\345\267\247/index.html" +++ "b/2019/06/08/\346\220\234\347\264\242\346\212\200\345\267\247/index.html" @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/06/17/MATLAB\345\237\272\346\223\215\345\244\215\344\271\240/index.html" "b/2019/06/17/MATLAB\345\237\272\346\223\215\345\244\215\344\271\240/index.html" index 666f18b2d6..7cb7cc1cd7 100644 --- "a/2019/06/17/MATLAB\345\237\272\346\223\215\345\244\215\344\271\240/index.html" +++ "b/2019/06/17/MATLAB\345\237\272\346\223\215\345\244\215\344\271\240/index.html" @@ -1914,7 +1914,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/06/18/latex\345\237\272\346\234\254\350\257\255\346\263\225\347\256\200\350\256\260/index.html" "b/2019/06/18/latex\345\237\272\346\234\254\350\257\255\346\263\225\347\256\200\350\256\260/index.html" index 8738e1983e..4598cc3d81 100644 --- "a/2019/06/18/latex\345\237\272\346\234\254\350\257\255\346\263\225\347\256\200\350\256\260/index.html" +++ "b/2019/06/18/latex\345\237\272\346\234\254\350\257\255\346\263\225\347\256\200\350\256\260/index.html" @@ -1916,7 +1916,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/07/12/breaking\344\270\200\345\246\202\346\227\242\345\276\200\347\232\204\345\270\205/index.html" "b/2019/07/12/breaking\344\270\200\345\246\202\346\227\242\345\276\200\347\232\204\345\270\205/index.html" index aeaa6e9559..8b4a0d65ef 100644 --- "a/2019/07/12/breaking\344\270\200\345\246\202\346\227\242\345\276\200\347\232\204\345\270\205/index.html" +++ "b/2019/07/12/breaking\344\270\200\345\246\202\346\227\242\345\276\200\347\232\204\345\270\205/index.html" @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/07/19/Python\345\215\217\347\250\213\357\274\210Coroutine\357\274\211/index.html" "b/2019/07/19/Python\345\215\217\347\250\213\357\274\210Coroutine\357\274\211/index.html" index 7830ba3edc..485a191ec2 100644 --- "a/2019/07/19/Python\345\215\217\347\250\213\357\274\210Coroutine\357\274\211/index.html" +++ "b/2019/07/19/Python\345\215\217\347\250\213\357\274\210Coroutine\357\274\211/index.html" @@ -1915,7 +1915,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/07/26/Python-\350\207\252\345\256\232\344\271\211\344\270\212\344\270\213\346\226\207\347\256\241\347\220\206\345\231\250/index.html" "b/2019/07/26/Python-\350\207\252\345\256\232\344\271\211\344\270\212\344\270\213\346\226\207\347\256\241\347\220\206\345\231\250/index.html" index e5cd6789cb..dfb2caf54f 100644 --- "a/2019/07/26/Python-\350\207\252\345\256\232\344\271\211\344\270\212\344\270\213\346\226\207\347\256\241\347\220\206\345\231\250/index.html" +++ "b/2019/07/26/Python-\350\207\252\345\256\232\344\271\211\344\270\212\344\270\213\346\226\207\347\256\241\347\220\206\345\231\250/index.html" @@ -1914,7 +1914,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2019/07/28/pdb-profile/index.html b/2019/07/28/pdb-profile/index.html index 51dc7941a3..e512523e64 100644 --- a/2019/07/28/pdb-profile/index.html +++ b/2019/07/28/pdb-profile/index.html @@ -1920,7 +1920,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/08/07/\345\207\240\344\270\252\344\270\215\351\224\231\347\232\204Jupyter Notebook\344\272\221\347\253\257\345\261\225\347\244\272\345\271\263\345\217\260/index.html" "b/2019/08/07/\345\207\240\344\270\252\344\270\215\351\224\231\347\232\204Jupyter Notebook\344\272\221\347\253\257\345\261\225\347\244\272\345\271\263\345\217\260/index.html" index dd20d0d40c..695ecc1e47 100644 --- "a/2019/08/07/\345\207\240\344\270\252\344\270\215\351\224\231\347\232\204Jupyter Notebook\344\272\221\347\253\257\345\261\225\347\244\272\345\271\263\345\217\260/index.html" +++ "b/2019/08/07/\345\207\240\344\270\252\344\270\215\351\224\231\347\232\204Jupyter Notebook\344\272\221\347\253\257\345\261\225\347\244\272\345\271\263\345\217\260/index.html" @@ -1913,7 +1913,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/08/08/docker\345\255\246\344\271\240\347\254\224\350\256\260/index.html" "b/2019/08/08/docker\345\255\246\344\271\240\347\254\224\350\256\260/index.html" index 4b468fb239..6c8b21f97a 100644 --- "a/2019/08/08/docker\345\255\246\344\271\240\347\254\224\350\256\260/index.html" +++ "b/2019/08/08/docker\345\255\246\344\271\240\347\254\224\350\256\260/index.html" @@ -1914,7 +1914,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/09/02/Python\347\216\257\345\242\203\347\256\241\347\220\206/index.html" "b/2019/09/02/Python\347\216\257\345\242\203\347\256\241\347\220\206/index.html" index fdaf55b915..caaa6f7354 100644 --- "a/2019/09/02/Python\347\216\257\345\242\203\347\256\241\347\220\206/index.html" +++ "b/2019/09/02/Python\347\216\257\345\242\203\347\256\241\347\220\206/index.html" @@ -1916,7 +1916,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/10/02/\347\256\200\345\215\225\344\272\206\350\247\243\344\270\213Python\345\206\205\347\275\256\346\225\260\346\215\256\347\261\273\345\236\213\345\270\270\347\224\250\346\223\215\344\275\234\347\232\204\346\200\247\350\203\275/index.html" "b/2019/10/02/\347\256\200\345\215\225\344\272\206\350\247\243\344\270\213Python\345\206\205\347\275\256\346\225\260\346\215\256\347\261\273\345\236\213\345\270\270\347\224\250\346\223\215\344\275\234\347\232\204\346\200\247\350\203\275/index.html" index bd749e4069..34230c5e34 100644 --- "a/2019/10/02/\347\256\200\345\215\225\344\272\206\350\247\243\344\270\213Python\345\206\205\347\275\256\346\225\260\346\215\256\347\261\273\345\236\213\345\270\270\347\224\250\346\223\215\344\275\234\347\232\204\346\200\247\350\203\275/index.html" +++ "b/2019/10/02/\347\256\200\345\215\225\344\272\206\350\247\243\344\270\213Python\345\206\205\347\275\256\346\225\260\346\215\256\347\261\273\345\236\213\345\270\270\347\224\250\346\223\215\344\275\234\347\232\204\346\200\247\350\203\275/index.html" @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/10/11/\344\275\277\347\224\250Microsoft-Edge-Beta\345\260\206\347\275\221\351\241\265\345\217\230\346\210\220\345\272\224\347\224\250/index.html" "b/2019/10/11/\344\275\277\347\224\250Microsoft-Edge-Beta\345\260\206\347\275\221\351\241\265\345\217\230\346\210\220\345\272\224\347\224\250/index.html" index 2c43372a9f..4e775c60e9 100644 --- "a/2019/10/11/\344\275\277\347\224\250Microsoft-Edge-Beta\345\260\206\347\275\221\351\241\265\345\217\230\346\210\220\345\272\224\347\224\250/index.html" +++ "b/2019/10/11/\344\275\277\347\224\250Microsoft-Edge-Beta\345\260\206\347\275\221\351\241\265\345\217\230\346\210\220\345\272\224\347\224\250/index.html" @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/10/27/clone\345\220\216\345\246\202\344\275\225checkout\345\210\260remote-branch/index.html" "b/2019/10/27/clone\345\220\216\345\246\202\344\275\225checkout\345\210\260remote-branch/index.html" index 0f43b87a78..ce5af45357 100644 --- "a/2019/10/27/clone\345\220\216\345\246\202\344\275\225checkout\345\210\260remote-branch/index.html" +++ "b/2019/10/27/clone\345\220\216\345\246\202\344\275\225checkout\345\210\260remote-branch/index.html" @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2019/11/14/map-filter-reduce/index.html b/2019/11/14/map-filter-reduce/index.html index 8f9d6e42b7..32216b97c4 100644 --- a/2019/11/14/map-filter-reduce/index.html +++ b/2019/11/14/map-filter-reduce/index.html @@ -1915,7 +1915,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2019/11/25/Serialization-and-Deserialization/index.html b/2019/11/25/Serialization-and-Deserialization/index.html index ea210d04d8..20bbeaedc7 100644 --- a/2019/11/25/Serialization-and-Deserialization/index.html +++ b/2019/11/25/Serialization-and-Deserialization/index.html @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2019/11/28/heart/index.html b/2019/11/28/heart/index.html index 9b33eec217..5b037df434 100644 --- a/2019/11/28/heart/index.html +++ b/2019/11/28/heart/index.html @@ -1907,7 +1907,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/12/13/\346\204\277\345\222\214\345\271\263\346\260\270\351\251\273\344\272\272\351\227\264/index.html" "b/2019/12/13/\346\204\277\345\222\214\345\271\263\346\260\270\351\251\273\344\272\272\351\227\264/index.html" index 6205fa2e5d..a4139d707b 100644 --- "a/2019/12/13/\346\204\277\345\222\214\345\271\263\346\260\270\351\251\273\344\272\272\351\227\264/index.html" +++ "b/2019/12/13/\346\204\277\345\222\214\345\271\263\346\260\270\351\251\273\344\272\272\351\227\264/index.html" @@ -1907,7 +1907,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2019/12/31/2019\345\271\264\346\200\273\347\273\223/index.html" "b/2019/12/31/2019\345\271\264\346\200\273\347\273\223/index.html" index 388387afec..354074ff84 100644 --- "a/2019/12/31/2019\345\271\264\346\200\273\347\273\223/index.html" +++ "b/2019/12/31/2019\345\271\264\346\200\273\347\273\223/index.html" @@ -1907,7 +1907,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/01/13/React-Flask\346\211\223\351\200\240\345\211\215\345\220\216\347\253\257\345\210\206\347\246\273\351\241\271\347\233\256\345\274\200\345\217\221\347\216\257\345\242\203/index.html" "b/2020/01/13/React-Flask\346\211\223\351\200\240\345\211\215\345\220\216\347\253\257\345\210\206\347\246\273\351\241\271\347\233\256\345\274\200\345\217\221\347\216\257\345\242\203/index.html" index 624c0ed498..8d9e051c02 100644 --- "a/2020/01/13/React-Flask\346\211\223\351\200\240\345\211\215\345\220\216\347\253\257\345\210\206\347\246\273\351\241\271\347\233\256\345\274\200\345\217\221\347\216\257\345\242\203/index.html" +++ "b/2020/01/13/React-Flask\346\211\223\351\200\240\345\211\215\345\220\216\347\253\257\345\210\206\347\246\273\351\241\271\347\233\256\345\274\200\345\217\221\347\216\257\345\242\203/index.html" @@ -1916,7 +1916,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/02/03/Git\345\206\205\351\203\250\345\216\237\347\220\206\346\216\242\347\264\242/index.html" "b/2020/02/03/Git\345\206\205\351\203\250\345\216\237\347\220\206\346\216\242\347\264\242/index.html" index 70a2a45d96..5daa1b1fe5 100644 --- "a/2020/02/03/Git\345\206\205\351\203\250\345\216\237\347\220\206\346\216\242\347\264\242/index.html" +++ "b/2020/02/03/Git\345\206\205\351\203\250\345\216\237\347\220\206\346\216\242\347\264\242/index.html" @@ -1915,7 +1915,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/03/06/\344\275\277\347\224\250-mypy-\345\201\232type-check/index.html" "b/2020/03/06/\344\275\277\347\224\250-mypy-\345\201\232type-check/index.html" index 2eda638858..7fcb8abe0f 100644 --- "a/2020/03/06/\344\275\277\347\224\250-mypy-\345\201\232type-check/index.html" +++ "b/2020/03/06/\344\275\277\347\224\250-mypy-\345\201\232type-check/index.html" @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/04/04/\345\215\225\344\276\213\346\250\241\345\274\217\345\246\202\344\275\225\344\277\235\350\257\201\345\256\236\344\276\213\347\232\204\345\224\257\344\270\200\346\200\247/index.html" "b/2020/04/04/\345\215\225\344\276\213\346\250\241\345\274\217\345\246\202\344\275\225\344\277\235\350\257\201\345\256\236\344\276\213\347\232\204\345\224\257\344\270\200\346\200\247/index.html" index 95bf5531a3..b15dea9ef5 100644 --- "a/2020/04/04/\345\215\225\344\276\213\346\250\241\345\274\217\345\246\202\344\275\225\344\277\235\350\257\201\345\256\236\344\276\213\347\232\204\345\224\257\344\270\200\346\200\247/index.html" +++ "b/2020/04/04/\345\215\225\344\276\213\346\250\241\345\274\217\345\246\202\344\275\225\344\277\235\350\257\201\345\256\236\344\276\213\347\232\204\345\224\257\344\270\200\346\200\247/index.html" @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/04/06/\345\217\257\346\211\251\345\261\225\346\236\266\346\236\204\350\256\276\350\256\241\344\271\213\346\266\210\346\201\257\351\230\237\345\210\227/index.html" "b/2020/04/06/\345\217\257\346\211\251\345\261\225\346\236\266\346\236\204\350\256\276\350\256\241\344\271\213\346\266\210\346\201\257\351\230\237\345\210\227/index.html" index 6b937418c4..45a98501a5 100644 --- "a/2020/04/06/\345\217\257\346\211\251\345\261\225\346\236\266\346\236\204\350\256\276\350\256\241\344\271\213\346\266\210\346\201\257\351\230\237\345\210\227/index.html" +++ "b/2020/04/06/\345\217\257\346\211\251\345\261\225\346\236\266\346\236\204\350\256\276\350\256\241\344\271\213\346\266\210\346\201\257\351\230\237\345\210\227/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/05/19/\344\272\206\350\247\243\344\270\200\346\263\242\347\273\217\345\205\270\347\232\204-IO-\346\250\241\345\236\213/index.html" "b/2020/05/19/\344\272\206\350\247\243\344\270\200\346\263\242\347\273\217\345\205\270\347\232\204-IO-\346\250\241\345\236\213/index.html" index 5a910a258f..fa3c15a29d 100644 --- "a/2020/05/19/\344\272\206\350\247\243\344\270\200\346\263\242\347\273\217\345\205\270\347\232\204-IO-\346\250\241\345\236\213/index.html" +++ "b/2020/05/19/\344\272\206\350\247\243\344\270\200\346\263\242\347\273\217\345\205\270\347\232\204-IO-\346\250\241\345\236\213/index.html" @@ -1915,7 +1915,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/06/04/\350\257\221-\351\200\232\350\277\207-Git-\345\222\214-Angular-\344\272\206\350\247\243\350\257\255\344\271\211\345\214\226\346\217\220\344\272\244\344\277\241\346\201\257/index.html" "b/2020/06/04/\350\257\221-\351\200\232\350\277\207-Git-\345\222\214-Angular-\344\272\206\350\247\243\350\257\255\344\271\211\345\214\226\346\217\220\344\272\244\344\277\241\346\201\257/index.html" index 16a8860894..f4893791cb 100644 --- "a/2020/06/04/\350\257\221-\351\200\232\350\277\207-Git-\345\222\214-Angular-\344\272\206\350\247\243\350\257\255\344\271\211\345\214\226\346\217\220\344\272\244\344\277\241\346\201\257/index.html" +++ "b/2020/06/04/\350\257\221-\351\200\232\350\277\207-Git-\345\222\214-Angular-\344\272\206\350\247\243\350\257\255\344\271\211\345\214\226\346\217\220\344\272\244\344\277\241\346\201\257/index.html" @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/06/21/\345\260\206Web\345\272\224\347\224\250\344\270\242\347\273\231\345\256\210\346\212\244\350\277\233\347\250\213/index.html" "b/2020/06/21/\345\260\206Web\345\272\224\347\224\250\344\270\242\347\273\231\345\256\210\346\212\244\350\277\233\347\250\213/index.html" index e08f7a9e2b..a669746109 100644 --- "a/2020/06/21/\345\260\206Web\345\272\224\347\224\250\344\270\242\347\273\231\345\256\210\346\212\244\350\277\233\347\250\213/index.html" +++ "b/2020/06/21/\345\260\206Web\345\272\224\347\224\250\344\270\242\347\273\231\345\256\210\346\212\244\350\277\233\347\250\213/index.html" @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/06/26/\347\273\231 GitHub commit \345\212\240\344\270\252\345\260\217\347\273\277\346\240\207/index.html" "b/2020/06/26/\347\273\231 GitHub commit \345\212\240\344\270\252\345\260\217\347\273\277\346\240\207/index.html" index 4ffd2b96c4..e80fb92802 100644 --- "a/2020/06/26/\347\273\231 GitHub commit \345\212\240\344\270\252\345\260\217\347\273\277\346\240\207/index.html" +++ "b/2020/06/26/\347\273\231 GitHub commit \345\212\240\344\270\252\345\260\217\347\273\277\346\240\207/index.html" @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/06/28/\344\275\277\347\224\250docker-compose\347\274\226\346\216\222\345\211\215\345\220\216\347\253\257\345\210\206\347\246\273\345\272\224\347\224\250/index.html" "b/2020/06/28/\344\275\277\347\224\250docker-compose\347\274\226\346\216\222\345\211\215\345\220\216\347\253\257\345\210\206\347\246\273\345\272\224\347\224\250/index.html" index 06816000db..08dcfd38b5 100644 --- "a/2020/06/28/\344\275\277\347\224\250docker-compose\347\274\226\346\216\222\345\211\215\345\220\216\347\253\257\345\210\206\347\246\273\345\272\224\347\224\250/index.html" +++ "b/2020/06/28/\344\275\277\347\224\250docker-compose\347\274\226\346\216\222\345\211\215\345\220\216\347\253\257\345\210\206\347\246\273\345\272\224\347\224\250/index.html" @@ -1914,7 +1914,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/07/08/React-Hooks-\351\202\243\344\272\233\344\272\213\345\204\277/index.html" "b/2020/07/08/React-Hooks-\351\202\243\344\272\233\344\272\213\345\204\277/index.html" index a2dedf69ba..dd3b88d42d 100644 --- "a/2020/07/08/React-Hooks-\351\202\243\344\272\233\344\272\213\345\204\277/index.html" +++ "b/2020/07/08/React-Hooks-\351\202\243\344\272\233\344\272\213\345\204\277/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/07/22/\346\223\215\344\275\234\347\263\273\347\273\237\350\277\233-\347\272\277\347\250\213\346\250\241\345\236\213/index.html" "b/2020/07/22/\346\223\215\344\275\234\347\263\273\347\273\237\350\277\233-\347\272\277\347\250\213\346\250\241\345\236\213/index.html" index 2b683c51b7..b7a3d64383 100644 --- "a/2020/07/22/\346\223\215\344\275\234\347\263\273\347\273\237\350\277\233-\347\272\277\347\250\213\346\250\241\345\236\213/index.html" +++ "b/2020/07/22/\346\223\215\344\275\234\347\263\273\347\273\237\350\277\233-\347\272\277\347\250\213\346\250\241\345\236\213/index.html" @@ -1915,7 +1915,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2020/08/02/Process-IPC/index.html b/2020/08/02/Process-IPC/index.html index 229ea819e5..6c972c1609 100644 --- a/2020/08/02/Process-IPC/index.html +++ b/2020/08/02/Process-IPC/index.html @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/08/22/setTimeout\346\230\257\345\210\260\344\272\206xx ms \345\260\261\346\211\247\350\241\214\345\220\227\357\274\214\344\272\206\350\247\243 Event-Loop \346\234\272\345\210\266/index.html" "b/2020/08/22/setTimeout\346\230\257\345\210\260\344\272\206xx ms \345\260\261\346\211\247\350\241\214\345\220\227\357\274\214\344\272\206\350\247\243 Event-Loop \346\234\272\345\210\266/index.html" index 08d875cd66..b05e69d618 100644 --- "a/2020/08/22/setTimeout\346\230\257\345\210\260\344\272\206xx ms \345\260\261\346\211\247\350\241\214\345\220\227\357\274\214\344\272\206\350\247\243 Event-Loop \346\234\272\345\210\266/index.html" +++ "b/2020/08/22/setTimeout\346\230\257\345\210\260\344\272\206xx ms \345\260\261\346\211\247\350\241\214\345\220\227\357\274\214\344\272\206\350\247\243 Event-Loop \346\234\272\345\210\266/index.html" @@ -1915,7 +1915,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/09/20/\350\264\237\350\275\275\345\235\207\350\241\241\346\212\200\346\234\257\345\260\217\350\256\260/index.html" "b/2020/09/20/\350\264\237\350\275\275\345\235\207\350\241\241\346\212\200\346\234\257\345\260\217\350\256\260/index.html" index fbf7bae9c0..018fe83477 100644 --- "a/2020/09/20/\350\264\237\350\275\275\345\235\207\350\241\241\346\212\200\346\234\257\345\260\217\350\256\260/index.html" +++ "b/2020/09/20/\350\264\237\350\275\275\345\235\207\350\241\241\346\212\200\346\234\257\345\260\217\350\256\260/index.html" @@ -1918,7 +1918,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/10/09/\346\265\205\350\247\243shallow copy\343\200\201deep copy/index.html" "b/2020/10/09/\346\265\205\350\247\243shallow copy\343\200\201deep copy/index.html" index 51ecf1d1b4..915126a3b9 100644 --- "a/2020/10/09/\346\265\205\350\247\243shallow copy\343\200\201deep copy/index.html" +++ "b/2020/10/09/\346\265\205\350\247\243shallow copy\343\200\201deep copy/index.html" @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/11/15/\344\275\277\347\224\250tcpdump\345\222\214wireshark\347\234\213\344\270\213TCP\346\217\241\346\211\213/index.html" "b/2020/11/15/\344\275\277\347\224\250tcpdump\345\222\214wireshark\347\234\213\344\270\213TCP\346\217\241\346\211\213/index.html" index de7b642c37..d90706a2a4 100644 --- "a/2020/11/15/\344\275\277\347\224\250tcpdump\345\222\214wireshark\347\234\213\344\270\213TCP\346\217\241\346\211\213/index.html" +++ "b/2020/11/15/\344\275\277\347\224\250tcpdump\345\222\214wireshark\347\234\213\344\270\213TCP\346\217\241\346\211\213/index.html" @@ -1914,7 +1914,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git "a/2020/12/13/\350\200\215\344\270\200\344\270\213Kafka/index.html" "b/2020/12/13/\350\200\215\344\270\200\344\270\213Kafka/index.html" index 4e682e091f..fe1a8e9511 100644 --- "a/2020/12/13/\350\200\215\344\270\200\344\270\213Kafka/index.html" +++ "b/2020/12/13/\350\200\215\344\270\200\344\270\213Kafka/index.html" @@ -1918,7 +1918,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/01/01/2021-new-year/index.html b/2021/01/01/2021-new-year/index.html index 330a98e62c..41eb98be65 100644 --- a/2021/01/01/2021-new-year/index.html +++ b/2021/01/01/2021-new-year/index.html @@ -1907,7 +1907,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/01/06/2020-annual-reviewed/index.html b/2021/01/06/2020-annual-reviewed/index.html index d8038ff81c..5ab4b07ee1 100644 --- a/2021/01/06/2020-annual-reviewed/index.html +++ b/2021/01/06/2020-annual-reviewed/index.html @@ -1907,7 +1907,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/01/19/hexo-blog-synchronization-with-rsync/index.html b/2021/01/19/hexo-blog-synchronization-with-rsync/index.html index 5f9415a66e..7add4ebf7c 100644 --- a/2021/01/19/hexo-blog-synchronization-with-rsync/index.html +++ b/2021/01/19/hexo-blog-synchronization-with-rsync/index.html @@ -1914,7 +1914,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/03/10/git-submodules/index.html b/2021/03/10/git-submodules/index.html index c754d4fec4..c83dcafd54 100644 --- a/2021/03/10/git-submodules/index.html +++ b/2021/03/10/git-submodules/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/04/25/enjoy-wslg/index.html b/2021/04/25/enjoy-wslg/index.html index c04468b4ff..23947b1d8f 100644 --- a/2021/04/25/enjoy-wslg/index.html +++ b/2021/04/25/enjoy-wslg/index.html @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/04/30/term-monorepo-multirepo/index.html b/2021/04/30/term-monorepo-multirepo/index.html index ea63a48d9c..23b38086d6 100644 --- a/2021/04/30/term-monorepo-multirepo/index.html +++ b/2021/04/30/term-monorepo-multirepo/index.html @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/05/16/heat-conduction-equation/index.html b/2021/05/16/heat-conduction-equation/index.html index 74092671b0..00b6db26a4 100644 --- a/2021/05/16/heat-conduction-equation/index.html +++ b/2021/05/16/heat-conduction-equation/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/06/29/osmosfeed-rss-reader/index.html b/2021/06/29/osmosfeed-rss-reader/index.html index b9504ba5a4..1753cb7d5c 100644 --- a/2021/06/29/osmosfeed-rss-reader/index.html +++ b/2021/06/29/osmosfeed-rss-reader/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/07/10/checksum-gpg-tools/index.html b/2021/07/10/checksum-gpg-tools/index.html index 3fa9de9264..0a03615572 100644 --- a/2021/07/10/checksum-gpg-tools/index.html +++ b/2021/07/10/checksum-gpg-tools/index.html @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/08/28/prometheus-federation/index.html b/2021/08/28/prometheus-federation/index.html index 26a5f2ec20..72077acdaf 100644 --- a/2021/08/28/prometheus-federation/index.html +++ b/2021/08/28/prometheus-federation/index.html @@ -1916,7 +1916,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/09/25/common-use-linux-network-command/index.html b/2021/09/25/common-use-linux-network-command/index.html index 14a3bdf8d2..2b46a27e57 100644 --- a/2021/09/25/common-use-linux-network-command/index.html +++ b/2021/09/25/common-use-linux-network-command/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/10/07/io-bound-cpu-bound-with-average-load/index.html b/2021/10/07/io-bound-cpu-bound-with-average-load/index.html index 706129714e..b0004bf004 100644 --- a/2021/10/07/io-bound-cpu-bound-with-average-load/index.html +++ b/2021/10/07/io-bound-cpu-bound-with-average-load/index.html @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/10/24/create-k8s-cluster/index.html b/2021/10/24/create-k8s-cluster/index.html index c0ceae4596..d941bf9dc2 100644 --- a/2021/10/24/create-k8s-cluster/index.html +++ b/2021/10/24/create-k8s-cluster/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/11/14/back-to-october/index.html b/2021/11/14/back-to-october/index.html index 526422b2bd..b5ae5d8816 100644 --- a/2021/11/14/back-to-october/index.html +++ b/2021/11/14/back-to-october/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/11/27/loopback-addr/index.html b/2021/11/27/loopback-addr/index.html index f12fb0b65a..47092856d0 100644 --- a/2021/11/27/loopback-addr/index.html +++ b/2021/11/27/loopback-addr/index.html @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2021/12/04/deserve/index.html b/2021/12/04/deserve/index.html index 25c465033b..e717e95da4 100644 --- a/2021/12/04/deserve/index.html +++ b/2021/12/04/deserve/index.html @@ -1919,7 +1919,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2950,13 +2950,13 @@

-
-
diff --git a/2021/12/26/git-lfs-and-thin-repo/index.html b/2021/12/26/git-lfs-and-thin-repo/index.html index 7b238854ba..a7beee5dd3 100644 --- a/2021/12/26/git-lfs-and-thin-repo/index.html +++ b/2021/12/26/git-lfs-and-thin-repo/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2022/01/01/2021-annual-reviewed/index.html b/2022/01/01/2021-annual-reviewed/index.html index 59f70f021f..bca4fae3df 100644 --- a/2022/01/01/2021-annual-reviewed/index.html +++ b/2022/01/01/2021-annual-reviewed/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2022/01/31/fsm-smr-dfsm/index.html b/2022/01/31/fsm-smr-dfsm/index.html index 5f5e94744c..8d89fe68f5 100644 --- a/2022/01/31/fsm-smr-dfsm/index.html +++ b/2022/01/31/fsm-smr-dfsm/index.html @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2022/02/26/profiling-flame-graph/index.html b/2022/02/26/profiling-flame-graph/index.html index 9a0c5a86bd..b5586926e8 100644 --- a/2022/02/26/profiling-flame-graph/index.html +++ b/2022/02/26/profiling-flame-graph/index.html @@ -1913,7 +1913,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2990,7 +2990,7 @@

参考相关文章
-
+ diff --git "a/2022/03/30/Go-json-Marshal-UnMarshal-\347\232\204\344\270\200\347\202\271\345\260\217-trick/index.html" "b/2022/03/30/Go-json-Marshal-UnMarshal-\347\232\204\344\270\200\347\202\271\345\260\217-trick/index.html" index 9f78b4aee8..fde58a726b 100644 --- "a/2022/03/30/Go-json-Marshal-UnMarshal-\347\232\204\344\270\200\347\202\271\345\260\217-trick/index.html" +++ "b/2022/03/30/Go-json-Marshal-UnMarshal-\347\232\204\344\270\200\347\202\271\345\260\217-trick/index.html" @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2022/04/23/understanding-prometheus-range-vectors/index.html b/2022/04/23/understanding-prometheus-range-vectors/index.html index e2ed0b4a8d..d5cfbbbc28 100644 --- a/2022/04/23/understanding-prometheus-range-vectors/index.html +++ b/2022/04/23/understanding-prometheus-range-vectors/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2022/06/18/understanding-elixir-macros-part-1-basics/index.html b/2022/06/18/understanding-elixir-macros-part-1-basics/index.html index 8660472246..af15c3b9bf 100644 --- a/2022/06/18/understanding-elixir-macros-part-1-basics/index.html +++ b/2022/06/18/understanding-elixir-macros-part-1-basics/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2022/06/19/understanding-elixir-macros-part-2-macro-theory/index.html b/2022/06/19/understanding-elixir-macros-part-2-macro-theory/index.html index f4147452a0..2968998ab7 100644 --- a/2022/06/19/understanding-elixir-macros-part-2-macro-theory/index.html +++ b/2022/06/19/understanding-elixir-macros-part-2-macro-theory/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2022/06/19/understanding-elixir-macros-part-3-getting-into-the-ast/index.html b/2022/06/19/understanding-elixir-macros-part-3-getting-into-the-ast/index.html index 4eaec93b61..253f5e0b84 100644 --- a/2022/06/19/understanding-elixir-macros-part-3-getting-into-the-ast/index.html +++ b/2022/06/19/understanding-elixir-macros-part-3-getting-into-the-ast/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2022/06/19/understanding-elixir-macros-part-4-diving-deeper/index.html b/2022/06/19/understanding-elixir-macros-part-4-diving-deeper/index.html index 4ee6ded700..650c23d223 100644 --- a/2022/06/19/understanding-elixir-macros-part-4-diving-deeper/index.html +++ b/2022/06/19/understanding-elixir-macros-part-4-diving-deeper/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2022/06/19/understanding-elixir-macros-part-5-reshaping-the-ast/index.html b/2022/06/19/understanding-elixir-macros-part-5-reshaping-the-ast/index.html index ed123df511..275831995d 100644 --- a/2022/06/19/understanding-elixir-macros-part-5-reshaping-the-ast/index.html +++ b/2022/06/19/understanding-elixir-macros-part-5-reshaping-the-ast/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2022/06/19/understanding-elixir-macros-part-6-in-place-code-generation/index.html b/2022/06/19/understanding-elixir-macros-part-6-in-place-code-generation/index.html index 2c41e06f02..e09214078e 100644 --- a/2022/06/19/understanding-elixir-macros-part-6-in-place-code-generation/index.html +++ b/2022/06/19/understanding-elixir-macros-part-6-in-place-code-generation/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2022/06/29/elixir-run-time-code-line-level-coverage-collection/index.html b/2022/06/29/elixir-run-time-code-line-level-coverage-collection/index.html index 9745157fc5..23898aba7f 100644 --- a/2022/06/29/elixir-run-time-code-line-level-coverage-collection/index.html +++ b/2022/06/29/elixir-run-time-code-line-level-coverage-collection/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3072,7 +3072,7 @@

参考相关文章
-
+ diff --git a/2022/08/31/the-solution-of-elixir-continuous-runtime-system-code-coverage-collection/index.html b/2022/08/31/the-solution-of-elixir-continuous-runtime-system-code-coverage-collection/index.html index e567cb3c15..3cfb0b5e67 100644 --- a/2022/08/31/the-solution-of-elixir-continuous-runtime-system-code-coverage-collection/index.html +++ b/2022/08/31/the-solution-of-elixir-continuous-runtime-system-code-coverage-collection/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3084,7 +3084,7 @@

相关文章
-
+ diff --git a/2022/11/26/Elixir-Tip-Case-vs-With/index.html b/2022/11/26/Elixir-Tip-Case-vs-With/index.html index 5cbf33d38a..53c191e462 100644 --- a/2022/11/26/Elixir-Tip-Case-vs-With/index.html +++ b/2022/11/26/Elixir-Tip-Case-vs-With/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2989,7 +2989,7 @@

+ diff --git a/2023/02/26/2022-annual-reviewed/index.html b/2023/02/26/2022-annual-reviewed/index.html index 155697862f..9a34d347a6 100644 --- a/2023/02/26/2022-annual-reviewed/index.html +++ b/2023/02/26/2022-annual-reviewed/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2023/03/11/sse-websocket/index.html b/2023/03/11/sse-websocket/index.html index 5fcfbb55b0..6954248c23 100644 --- a/2023/03/11/sse-websocket/index.html +++ b/2023/03/11/sse-websocket/index.html @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2023/08/12/elixir-deps-debug-skills/index.html b/2023/08/12/elixir-deps-debug-skills/index.html index 2f59e49ae0..33686d72ad 100644 --- a/2023/08/12/elixir-deps-debug-skills/index.html +++ b/2023/08/12/elixir-deps-debug-skills/index.html @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2978,7 +2978,7 @@

+ diff --git a/2024/02/07/become-a-romantic-muscian/index.html b/2024/02/07/become-a-romantic-muscian/index.html index 1a10a55dfe..c214ffaa2f 100644 --- a/2024/02/07/become-a-romantic-muscian/index.html +++ b/2024/02/07/become-a-romantic-muscian/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2024/02/19/elixir-github-codespace-dev/index.html b/2024/02/19/elixir-github-codespace-dev/index.html index 6b5ad95d98..c9ac2878f3 100644 --- a/2024/02/19/elixir-github-codespace-dev/index.html +++ b/2024/02/19/elixir-github-codespace-dev/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2024/02/29/using-ycsb-benchmark-etcd/index.html b/2024/02/29/using-ycsb-benchmark-etcd/index.html index cd5d91fab8..c97152e0b6 100644 --- a/2024/02/29/using-ycsb-benchmark-etcd/index.html +++ b/2024/02/29/using-ycsb-benchmark-etcd/index.html @@ -1913,7 +1913,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2024/03/04/awesome-tech-weekly-zh/index.html b/2024/03/04/awesome-tech-weekly-zh/index.html index 006dc2300a..da6a823309 100644 --- a/2024/03/04/awesome-tech-weekly-zh/index.html +++ b/2024/03/04/awesome-tech-weekly-zh/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2024/03/13/markup-screen/index.html b/2024/03/13/markup-screen/index.html index 995fbdd756..5a7eefa7c6 100644 --- a/2024/03/13/markup-screen/index.html +++ b/2024/03/13/markup-screen/index.html @@ -1909,7 +1909,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2024/03/15/develop-web-extension-with-wxt/index.html b/2024/03/15/develop-web-extension-with-wxt/index.html index 2900f68ad2..314a5bcbf2 100644 --- a/2024/03/15/develop-web-extension-with-wxt/index.html +++ b/2024/03/15/develop-web-extension-with-wxt/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2024/03/23/using-chezmoi-to-manage-dotfiles/index.html b/2024/03/23/using-chezmoi-to-manage-dotfiles/index.html index 137246e728..94ffa44795 100644 --- a/2024/03/23/using-chezmoi-to-manage-dotfiles/index.html +++ b/2024/03/23/using-chezmoi-to-manage-dotfiles/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2024/04/25/using-vfox-erlang-to-manage-erlang-version/index.html b/2024/04/25/using-vfox-erlang-to-manage-erlang-version/index.html index 6d974dab94..1813979289 100644 --- a/2024/04/25/using-vfox-erlang-to-manage-erlang-version/index.html +++ b/2024/04/25/using-vfox-erlang-to-manage-erlang-version/index.html @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2980,7 +2980,7 @@

+ diff --git a/2024/04/27/install-erlang-and-elixir-via-vfox/index.html b/2024/04/27/install-erlang-and-elixir-via-vfox/index.html index 99f82d18f6..a48b94c38d 100644 --- a/2024/04/27/install-erlang-and-elixir-via-vfox/index.html +++ b/2024/04/27/install-erlang-and-elixir-via-vfox/index.html @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2968,7 +2968,7 @@

安装 Elixir

因为安装 Elixir 也是从对应版本的源码进行编译安装的,Elixir 的编译需要依赖到 Erlang,我们先让当前使用的 shell 能找到刚才安装好的 Erlang。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 切换 Erlang 版本
❯ vfox use erlang@26.2.2
Now using erlang@26.2.2.
# 安装 Elixir,将会使用对应的 erlc 编译器
> vfox install elixir@1.15.2
.........
.........
Generated ex_unit app
==> logger (compile)
Generated logger app
Generated eex app
==> iex (compile)
Generated iex app
Install elixir@1.15.2 success!
Please use vfox use elixir@1.15.2 to use it.
-

当你看到 Install elixir@1.15.2 success!,也就意味着安装成功了。可以通过 iex 确认下安装彻底成功:

+

当你看到 Install elixir@1.15.2 success!,也就意味着安装成功了。可以通过 iex 确认下安装彻底成功:

1
2
3
4
5
6
7
❯ vfox use elixir@1.15.2
Now using elixir@1.15.2.
❯ iex
Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

Interactive Elixir (1.15.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
@@ -2994,7 +2994,7 @@

最后相关文章
-
+ diff --git a/2024/05/18/etcd-and-mongodb-chaos-testing/index.html b/2024/05/18/etcd-and-mongodb-chaos-testing/index.html index 87f837c043..df810afb6a 100644 --- a/2024/05/18/etcd-and-mongodb-chaos-testing/index.html +++ b/2024/05/18/etcd-and-mongodb-chaos-testing/index.html @@ -1911,7 +1911,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2024/05/25/validate-jenkinsfile/index.html b/2024/05/25/validate-jenkinsfile/index.html index 6eab8d2693..ac54f58de1 100644 --- a/2024/05/25/validate-jenkinsfile/index.html +++ b/2024/05/25/validate-jenkinsfile/index.html @@ -1913,7 +1913,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/2024/05/29/free-to-use-sider-with-qwen/index.html b/2024/05/29/free-to-use-sider-with-qwen/index.html index 09dba6d01c..df765f08e2 100644 --- a/2024/05/29/free-to-use-sider-with-qwen/index.html +++ b/2024/05/29/free-to-use-sider-with-qwen/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3167,6 +3167,11 @@

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ +
+
+ + + + + + + +
+ + + +
+ + + + +
+
+

大概一个多月前, 我写了篇关于如何使用跨平台版本管理工具 vfox 在 Linux 系统下安装管理多个 Erlang/OTP 版本的文章 -> 通过 vfox 安装管理多版本 Erlang 和 Elixir. 文章使用的示范操作系统是 Ubuntu 20.04 Linux 操作系统.

+

最近 vfox-erlangvfox-elixir 插件的最新版本已经支持了在 Windows 平台下安装管理多个 Erlang/OTP 和 Elixir 的版本. 且已经通过了 End to End 测试 -> Testing.

+

E2E testing

+

本篇文章将会以 Windows 10 操作系统为例, 教你如何在 Windows 平台安装和管理多个 Erlang/OTP 和 Elixir 版本.

+
1
2
3
4
5
6
> Get-ComputerInfo
WindowsBuildLabEx : 22621.1.amd64fre.ni_release.220506-1250
WindowsCurrentVersion : 6.3
WindowsInstallationType : Client
WindowsProductName : Windows 10 Pro
......
+ +

1、安装 vfox

vfox (version-fox) 是最近比较热门的一个跨平台通用版本管理工具, 使用 Go 语言进行编写, 插件机制使用了 Lua 去实现扩展性. 目前 vfox 已经支持管理大多数主流编程语言的版本, 生态还算强大. 在这里你可以看到目前 vfox 所支持管理的编程语言版本和工具 -> vfox-Available Plugins.

+

请确安装 0.5.3 及以上版本的 vfox, 否则 vfox-erlangvfox-elixir 将无法正常工作. 在这里我们通过 winget 安装 vfox:

+
1
2
3
4
5
> winget install vfox
.......

❯ vfox -version
vfox version 0.5.3
+ +

为了能让 vfox 找到已经安装的 Elixir 和 Erlang 版本, 需要将 vfox 默认挂载到 powershell 中:

+

打开 PowerShell 配置文件:

+
1
2
3
4
5
6
New-Item -Type File -Path $PROFILE # 无需在意 `文件已存在` 错误

# 如果它提示未能找到路径, 那么你需要强制创建 profile. 添加 "-Force" 选项.
# New-Item -Type File -Path $PROFILE –Force

Invoke-Item $PROFILE # 打开 profile
+ +

将下面一行添加到你的 $PROFILE 文件末尾并保存:

+
1
Invoke-Expression "$(vfox activate pwsh)"
+ +

如果powershell提示: 在此系统上禁止运行脚本, 那么请你以管理员身份重新运行powershell输入如下命令

+
1
2
3
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
# 之后输入Y, 按回车
y
+ +

你也可以参考官方文档安装 vfox -> https://vfox.lhan.me/guides/quick-start.html. 安装好 vfox 之后, 我们再安装下版本管理插件:

+
1
2
3
4
# 添加 vfox-erlang 插件
vfox add erlang
# 添加 vfox-elixir 插件
vfox add elixir
+ +

安装完成后就可以使用这两个 vfox 插件 vfox-erlangvfox-elixir 在 Windows 平台去安装管理多个 Erlang 和 Elixir 的版本了.

+

2、通过 vfox-erlang 插件安装 Erlang/OTP

因为 Elixir 依赖于 Erlang/OTP, 所以在安装 Elixir 之前, 我们需要先安装下 Erlang/OTP. 如果你已经通过其他方式安装了 Erlang/OTP, 请确保后续通过 vfox-elixir 安装的 Elixir 版本与它是兼容的, 可以查看 Elixir 官方文档说明去确认这一点 between-elixir-and-erlang-otp.

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 通过 vfox search 找到你想要安装的版本
❯ vfox search erlang
Please select a version of erlang [type to search]:
-> v25.0.4
v24.3.4.16
v24.1.3
v24.0
v24.3
v24.3.2
v25.2
v27.0-rc2
v24.3.4.1
Press ↑/↓ to select and press ←/→ to page, and press Enter to confirm

# 当然你也可以指定安装一个版本, 比如
vfox install erlang@26.2.2
+ +

理论上, 你可以安装任何一个出现在 https://github.com/erlang/otp/releases 中包含 exe 文件的发行版本. 当你看到如下信息, 就表明安装完成了.

+
1
2
3
4
compile info.......
...
Install erlang@26.2.2 success!
Please use vfox use erlang@26.2.2 to use it.
+ +

我们使用 vfox 切换下到刚才安装好的 Erlang/OTP 版本来验证下安装是否成功:

+
1
2
3
4
5
6
7
❯ vfox use -g erlang@26.2.2
Now using erlang@26.2.2.
❯ erl
Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

Eshell V14.2.2 (press Ctrl+G to abort, type help(). for help)
1>
+ +

如果能正确唤醒 REPL (Read-Eval-Print Loop) 交互式命令行, 那么安装就好啦. 接下来开始安装 Elixir 吧

+

3、 通过 vfox-elixir 插件安装 Elixir

在开始安装指定的 Elixir 版本之前, 请确保当前安装的 shell 能找到已经安装好 Erlang/OTP 版本相关工具链

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 切换 Erlang/OTP 版本
vfox use -g erlang@26.2.2

# 安装一个与 Erlang/OTP 版本兼容的 Elixir 版本
> vfox search elixir
Please select a version of elixir to install [type to search]:
-> v1.16.2-elixir-otp-26
v1.16.2-elixir-otp-25
v1.16.2-elixir-otp-24
v1.16.1-elixir-otp-26
v1.16.1-elixir-otp-25
v1.16.1-elixir-otp-24
v1.16.0-rc.1-elixir-otp-26
v1.16.0-rc.1-elixir-otp-25
v1.16.0-rc.1-elixir-otp-24
v1.16.0-rc.0-elixir-otp-26
v1.16.0-rc.0-elixir-otp-25
v1.16.0-rc.0-elixir-otp-24
v1.16.0-elixir-otp-26
v1.16.0-elixir-otp-25
v1.16.0-elixir-otp-24
v1.15.7-elixir-otp-26
v1.15.7-elixir-otp-25
v1.15.7-elixir-otp-24
v1.15.6-elixir-otp-26
v1.15.6-elixir-otp-25
Press ↑/↓ to select and press ←/→ to page, and press Enter to confirm

# 比如
vfox install elixir@v1.16.1-elixir-otp-26
.....
.....
Install elixir@1.16.1-elixir-otp-26 success!
Please use vfox use elixir@1.16.1-elixir-otp-26 to use it.
+ +

当你看到形如 Install elixir@1.16.1-elixir-otp-26 success! Please use vfox use elixir@1.16.1-elixir-otp-26 to use it. 相关信息, 就代表安装已经完成了, 接下来验证下可用性:

+
1
2
3
4
5
❯ vfox use -g elixir@1.16.1-elixir-otp-26
Now using elixir@1.15.2.
> iex.bat
Erlang/OTP 26 [erts-14.2.5] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns] Interactive Elixir (1.16.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
+ +

Elixir 的 REPL (Read-Eval-Print Loop) 交互式命令行能正常打开的话, 那么安装时成功且可用的.

+

最后

vfox 的两个安装管理 Erlang/OTP 和 Elixir 版本的插件同时也支持在 Uinx-like (Linux & Darwin MacOS) 系统下管理多个版本. 你可以查看这个文档去了解更多信息: https://github.com/version-fox/vfox-elixir. 全平台操作系统支持~

+

Happy & funny!

+ +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ +

评论

+ + +
+ +
+ + + + + + +
+ + + + + + + + + + +
+ + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + diff --git a/404.html b/404.html index 5fb11fbbff..50637ddcbc 100644 --- a/404.html +++ b/404.html @@ -45,8 +45,8 @@ - - + + @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2886,10 +2886,10 @@

-
+ @@ -2937,10 +2937,10 @@

-
+ @@ -4266,7 +4266,7 @@

- + diff --git a/Astronomy/index.html b/Astronomy/index.html index 8b9cc48f35..4e579c3e63 100644 --- a/Astronomy/index.html +++ b/Astronomy/index.html @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/Collect/index.html b/Collect/index.html index d33a6f7628..b1412da3b6 100644 --- a/Collect/index.html +++ b/Collect/index.html @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/I_want_to_tell_me/index.html b/I_want_to_tell_me/index.html index d0390872e4..96549929e8 100644 --- a/I_want_to_tell_me/index.html +++ b/I_want_to_tell_me/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/PyChina/index.html b/PyChina/index.html index e66042a941..2fef02dba6 100644 --- a/PyChina/index.html +++ b/PyChina/index.html @@ -43,8 +43,8 @@ - - + + @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2884,10 +2884,10 @@

-
+ @@ -4181,7 +4181,7 @@

- + diff --git a/Statement/index.html b/Statement/index.html index 733c90cc8f..61ea2246e1 100644 --- a/Statement/index.html +++ b/Statement/index.html @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/about/index.html b/about/index.html index 8dcdafc322..bf0568a4bc 100644 --- a/about/index.html +++ b/about/index.html @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2967,13 +2967,13 @@

2020-03-11 Hexo 主题升级

主题升级至volantis@2.0.2(原material-x主题改名了),紧跟dalao更新步伐

-

2020-04-29 volantis@2.0.2 -> volantis@2.6.5

+

2021-01-18 云服务器博客同步引入 CI/CD

写了个基于 rsync 协议的 GitHub Action 用于 CD 博客到 CVM 服务器,博文👉使用 rsync-deploy-action 同步 Hexo 博客到个人服务器

-

2021-03-10 volantis@2.6.5 -> volantis@4.3.1hexo@4.0.0 -> hexo@5.4.0

+

2021-06-25 切换评论系统 valine -> waline

diff --git a/archives/2018/09/index.html b/archives/2018/09/index.html index b228f05062..176a7a2493 100644 --- a/archives/2018/09/index.html +++ b/archives/2018/09/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3820,7 +3820,7 @@

文章数目:
-
156 篇
+
157 篇

@@ -3855,7 +3855,7 @@

最后活动时间:
-
2024-06-15 日
+
2024-06-18 日

@@ -4206,7 +4206,7 @@

vfox
(2)
+ >
vfox
(3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
  • diff --git a/archives/2018/09/page/2/index.html b/archives/2018/09/page/2/index.html index 814b1b3513..f8effefcbb 100644 --- a/archives/2018/09/page/2/index.html +++ b/archives/2018/09/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3108,7 +3108,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3143,7 +3143,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -3494,7 +3494,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2018/10/index.html b/archives/2018/10/index.html index 754b6852a6..6e5531a5ef 100644 --- a/archives/2018/10/index.html +++ b/archives/2018/10/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3728,7 +3728,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3763,7 +3763,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

  • @@ -4114,7 +4114,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2018/10/page/2/index.html b/archives/2018/10/page/2/index.html index bdf6c59e18..6d6eab6e4f 100644 --- a/archives/2018/10/page/2/index.html +++ b/archives/2018/10/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3684,7 +3684,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇

  • @@ -3719,7 +3719,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -4070,7 +4070,7 @@

    vfox
    (2)
    + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2018/10/page/3/index.html b/archives/2018/10/page/3/index.html index 87466cca68..fba8380dc6 100644 --- a/archives/2018/10/page/3/index.html +++ b/archives/2018/10/page/3/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3538,7 +3538,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3573,7 +3573,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3924,7 +3924,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2018/11/index.html b/archives/2018/11/index.html index 8624e98f53..28a0fec438 100644 --- a/archives/2018/11/index.html +++ b/archives/2018/11/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3745,7 +3745,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3780,7 +3780,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4131,7 +4131,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2018/12/index.html b/archives/2018/12/index.html index 6e7b77b9a2..b9eea71ec9 100644 --- a/archives/2018/12/index.html +++ b/archives/2018/12/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3492,7 +3492,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3527,7 +3527,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3878,7 +3878,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2018/index.html b/archives/2018/index.html index 65ba784c80..46148c29d5 100644 --- a/archives/2018/index.html +++ b/archives/2018/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3729,7 +3729,7 @@

    IO库

    <
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3764,7 +3764,7 @@

    IO库

    <
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4115,7 +4115,7 @@

    IO库

    <
  • vfox
    (2)
  • + >
    vfox
    (3)
  • IO库
  • <
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2018/page/2/index.html b/archives/2018/page/2/index.html index ae13f93181..24169cc4b4 100644 --- a/archives/2018/page/2/index.html +++ b/archives/2018/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3754,7 +3754,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3789,7 +3789,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4140,7 +4140,7 @@

    vfox
    (2)
    + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2018/page/3/index.html b/archives/2018/page/3/index.html index 6a7b43ea99..34ac7cb52c 100644 --- a/archives/2018/page/3/index.html +++ b/archives/2018/page/3/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3689,7 +3689,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3724,7 +3724,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4075,7 +4075,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2018/page/4/index.html b/archives/2018/page/4/index.html index 22cd2d5245..686fe40037 100644 --- a/archives/2018/page/4/index.html +++ b/archives/2018/page/4/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3704,7 +3704,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3739,7 +3739,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4090,7 +4090,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2018/page/5/index.html b/archives/2018/page/5/index.html index 234a4ded1a..9a81222bdd 100644 --- a/archives/2018/page/5/index.html +++ b/archives/2018/page/5/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3911,7 +3911,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3946,7 +3946,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4297,7 +4297,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2018/page/6/index.html b/archives/2018/page/6/index.html index 9888397ed1..34ea924bf5 100644 --- a/archives/2018/page/6/index.html +++ b/archives/2018/page/6/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3339,7 +3339,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3374,7 +3374,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3725,7 +3725,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2019/01/index.html b/archives/2019/01/index.html index dfcbe828a3..cd75dbff93 100644 --- a/archives/2019/01/index.html +++ b/archives/2019/01/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3495,7 +3495,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3530,7 +3530,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3881,7 +3881,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2019/02/index.html b/archives/2019/02/index.html index 563274fd6e..9c77a9ae79 100644 --- a/archives/2019/02/index.html +++ b/archives/2019/02/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3033,7 +3033,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3068,7 +3068,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3419,7 +3419,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2019/03/index.html b/archives/2019/03/index.html index 58b02a7a2b..986be8df38 100644 --- a/archives/2019/03/index.html +++ b/archives/2019/03/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3446,7 +3446,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3481,7 +3481,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3832,7 +3832,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2019/04/index.html b/archives/2019/04/index.html index 535ec7f6c0..95278f7524 100644 --- a/archives/2019/04/index.html +++ b/archives/2019/04/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3094,7 +3094,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3129,7 +3129,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3480,7 +3480,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2019/05/index.html b/archives/2019/05/index.html index bbb5c857c8..751438510f 100644 --- a/archives/2019/05/index.html +++ b/archives/2019/05/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3194,7 +3194,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3229,7 +3229,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3580,7 +3580,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2019/06/index.html b/archives/2019/06/index.html index c425722642..a13ff0adb0 100644 --- a/archives/2019/06/index.html +++ b/archives/2019/06/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3198,7 +3198,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3233,7 +3233,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3584,7 +3584,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2019/07/index.html b/archives/2019/07/index.html index 913e749c7b..96a57174ab 100644 --- a/archives/2019/07/index.html +++ b/archives/2019/07/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3282,7 +3282,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3317,7 +3317,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3668,7 +3668,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2019/08/index.html b/archives/2019/08/index.html index 994e75ea51..448b5b85ac 100644 --- a/archives/2019/08/index.html +++ b/archives/2019/08/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3112,7 +3112,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3147,7 +3147,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3498,7 +3498,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2019/09/index.html b/archives/2019/09/index.html index 568d3e4229..5c4ec36f4d 100644 --- a/archives/2019/09/index.html +++ b/archives/2019/09/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3037,7 +3037,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3072,7 +3072,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3423,7 +3423,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2019/10/index.html b/archives/2019/10/index.html index 2b73ea5cb5..5ee10b6878 100644 --- a/archives/2019/10/index.html +++ b/archives/2019/10/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3188,7 +3188,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3223,7 +3223,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3574,7 +3574,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2019/11/index.html b/archives/2019/11/index.html index 365358d40f..18e514fb9c 100644 --- a/archives/2019/11/index.html +++ b/archives/2019/11/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3190,7 +3190,7 @@

    map

    先看

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3225,7 +3225,7 @@

    map

    先看

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3576,7 +3576,7 @@

    map

    先看

  • vfox
    (2)
  • + >
    vfox
    (3)
  • map
  • 先看

    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2019/12/index.html b/archives/2019/12/index.html index e0190884f8..1057a38d0f 100644 --- a/archives/2019/12/index.html +++ b/archives/2019/12/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3107,7 +3107,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3142,7 +3142,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3493,7 +3493,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2019/index.html b/archives/2019/index.html index 3bf69166f0..f2a5d167aa 100644 --- a/archives/2019/index.html +++ b/archives/2019/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3735,7 +3735,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3770,7 +3770,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4121,7 +4121,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2019/page/2/index.html b/archives/2019/page/2/index.html index 905a641730..455138f944 100644 --- a/archives/2019/page/2/index.html +++ b/archives/2019/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3748,7 +3748,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3783,7 +3783,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4134,7 +4134,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2019/page/3/index.html b/archives/2019/page/3/index.html index dbb5374bdc..203d4c0cb3 100644 --- a/archives/2019/page/3/index.html +++ b/archives/2019/page/3/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3727,7 +3727,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3762,7 +3762,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4113,7 +4113,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2019/page/4/index.html b/archives/2019/page/4/index.html index a1d56da668..4ca9b715be 100644 --- a/archives/2019/page/4/index.html +++ b/archives/2019/page/4/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3492,7 +3492,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3527,7 +3527,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3878,7 +3878,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2020/01/index.html b/archives/2020/01/index.html index 13177b3119..2098b67981 100644 --- a/archives/2020/01/index.html +++ b/archives/2020/01/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2020/02/index.html b/archives/2020/02/index.html index 5bcd288de8..87c9a35ef5 100644 --- a/archives/2020/02/index.html +++ b/archives/2020/02/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3045,7 +3045,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3080,7 +3080,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3431,7 +3431,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2020/03/index.html b/archives/2020/03/index.html index 92eb9bedba..1acd6edfaf 100644 --- a/archives/2020/03/index.html +++ b/archives/2020/03/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3032,7 +3032,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3067,7 +3067,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3418,7 +3418,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2020/04/index.html b/archives/2020/04/index.html index 8ec02984b9..bd71d4f87c 100644 --- a/archives/2020/04/index.html +++ b/archives/2020/04/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3114,7 +3114,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3149,7 +3149,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3500,7 +3500,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2020/05/index.html b/archives/2020/05/index.html index 3b0f9e26f9..c17f4a0e8d 100644 --- a/archives/2020/05/index.html +++ b/archives/2020/05/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3057,7 +3057,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3092,7 +3092,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3443,7 +3443,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2020/06/index.html b/archives/2020/06/index.html index 8a6a8f4f7e..df2be72611 100644 --- a/archives/2020/06/index.html +++ b/archives/2020/06/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3250,7 +3250,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3285,7 +3285,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3636,7 +3636,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2020/07/index.html b/archives/2020/07/index.html index ea5791c828..cf38c8eed7 100644 --- a/archives/2020/07/index.html +++ b/archives/2020/07/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3119,7 +3119,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3154,7 +3154,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3505,7 +3505,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2020/08/index.html b/archives/2020/08/index.html index 160c584398..6845b6d3e3 100644 --- a/archives/2020/08/index.html +++ b/archives/2020/08/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3114,7 +3114,7 @@

    总览
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3149,7 +3149,7 @@

    总览
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3500,7 +3500,7 @@

    总览
    vfox
    (2)

  • + >
    vfox
    (3)
  • 总览 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2020/09/index.html b/archives/2020/09/index.html index 71fc2017dd..390b933c10 100644 --- a/archives/2020/09/index.html +++ b/archives/2020/09/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2020/10/index.html b/archives/2020/10/index.html index 29aecddadc..6c2d303a55 100644 --- a/archives/2020/10/index.html +++ b/archives/2020/10/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3038,7 +3038,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3073,7 +3073,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3424,7 +3424,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2020/11/index.html b/archives/2020/11/index.html index 3cf31c7cb5..013fb769fe 100644 --- a/archives/2020/11/index.html +++ b/archives/2020/11/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2020/12/index.html b/archives/2020/12/index.html index cedf796386..b8a006bb50 100644 --- a/archives/2020/12/index.html +++ b/archives/2020/12/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3045,7 +3045,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3080,7 +3080,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3431,7 +3431,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2020/index.html b/archives/2020/index.html index 568c113041..42ed925e0e 100644 --- a/archives/2020/index.html +++ b/archives/2020/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3756,7 +3756,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3791,7 +3791,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4142,7 +4142,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2020/page/2/index.html b/archives/2020/page/2/index.html index 1149e85515..1a086e657d 100644 --- a/archives/2020/page/2/index.html +++ b/archives/2020/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3588,7 +3588,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3623,7 +3623,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3974,7 +3974,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2021/01/index.html b/archives/2021/01/index.html index c26c2d7158..4677c7a479 100644 --- a/archives/2021/01/index.html +++ b/archives/2021/01/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3186,7 +3186,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3221,7 +3221,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3572,7 +3572,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2021/03/index.html b/archives/2021/03/index.html index ba2a1d070e..42498fc589 100644 --- a/archives/2021/03/index.html +++ b/archives/2021/03/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3031,7 +3031,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3066,7 +3066,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3417,7 +3417,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2021/04/index.html b/archives/2021/04/index.html index 31769c01b0..a1c7fc36c1 100644 --- a/archives/2021/04/index.html +++ b/archives/2021/04/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3114,7 +3114,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3149,7 +3149,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3500,7 +3500,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2021/05/index.html b/archives/2021/05/index.html index b7a217ef1d..db0cdc2daf 100644 --- a/archives/2021/05/index.html +++ b/archives/2021/05/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3033,7 +3033,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3068,7 +3068,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3419,7 +3419,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2021/06/index.html b/archives/2021/06/index.html index 1853677844..0e65d3efce 100644 --- a/archives/2021/06/index.html +++ b/archives/2021/06/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3037,7 +3037,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3072,7 +3072,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3423,7 +3423,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2021/07/index.html b/archives/2021/07/index.html index f1c02526f9..6cd92b7b7e 100644 --- a/archives/2021/07/index.html +++ b/archives/2021/07/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3035,7 +3035,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3070,7 +3070,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3421,7 +3421,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2021/08/index.html b/archives/2021/08/index.html index f3e429a278..41b6beaeec 100644 --- a/archives/2021/08/index.html +++ b/archives/2021/08/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3037,7 +3037,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3072,7 +3072,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3423,7 +3423,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/archives/2021/09/index.html b/archives/2021/09/index.html index a83fb8ccc9..28a59314a3 100644 --- a/archives/2021/09/index.html +++ b/archives/2021/09/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3031,7 +3031,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3066,7 +3066,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3417,7 +3417,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2021/10/index.html b/archives/2021/10/index.html index 59e0a623cb..7810b94136 100644 --- a/archives/2021/10/index.html +++ b/archives/2021/10/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3111,7 +3111,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3146,7 +3146,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3497,7 +3497,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2021/11/index.html b/archives/2021/11/index.html index 73534a771e..32dc0045a6 100644 --- a/archives/2021/11/index.html +++ b/archives/2021/11/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3112,7 +3112,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3147,7 +3147,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3498,7 +3498,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2021/12/index.html b/archives/2021/12/index.html index 41ef31b155..9bc1d9f2f7 100644 --- a/archives/2021/12/index.html +++ b/archives/2021/12/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2963,13 +2963,13 @@

    -
    -
    @@ -3121,7 +3121,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3156,7 +3156,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3507,7 +3507,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2021/index.html b/archives/2021/index.html index d7a420352f..066d2f392c 100644 --- a/archives/2021/index.html +++ b/archives/2021/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2979,13 +2979,13 @@

    -
    -
    @@ -3739,7 +3739,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3774,7 +3774,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4125,7 +4125,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2021/page/2/index.html b/archives/2021/page/2/index.html index a31dde82a0..d5b192d2b1 100644 --- a/archives/2021/page/2/index.html +++ b/archives/2021/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3481,7 +3481,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3516,7 +3516,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3867,7 +3867,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2022/01/index.html b/archives/2022/01/index.html index fb31818b09..6f49d9d777 100644 --- a/archives/2022/01/index.html +++ b/archives/2022/01/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3114,7 +3114,7 @@

    Yeah

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3149,7 +3149,7 @@

    Yeah

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3500,7 +3500,7 @@

    Yeah

  • vfox
    (2)
  • + >
    vfox
    (3)
  • Yeah
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2022/02/index.html b/archives/2022/02/index.html index 62990e45be..73aa6d3747 100644 --- a/archives/2022/02/index.html +++ b/archives/2022/02/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3044,7 +3044,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3079,7 +3079,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3430,7 +3430,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2022/03/index.html b/archives/2022/03/index.html index c4ccfa31dc..9ef9d733a0 100644 --- a/archives/2022/03/index.html +++ b/archives/2022/03/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3035,7 +3035,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3070,7 +3070,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3421,7 +3421,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2022/04/index.html b/archives/2022/04/index.html index be2c5f2943..21e60b32b5 100644 --- a/archives/2022/04/index.html +++ b/archives/2022/04/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3034,7 +3034,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3069,7 +3069,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3420,7 +3420,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2022/06/index.html b/archives/2022/06/index.html index 52911e7173..f62dd3723b 100644 --- a/archives/2022/06/index.html +++ b/archives/2022/06/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3502,7 +3502,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3537,7 +3537,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3888,7 +3888,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2022/08/index.html b/archives/2022/08/index.html index f4df2d8922..917ef951d7 100644 --- a/archives/2022/08/index.html +++ b/archives/2022/08/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3038,7 +3038,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3073,7 +3073,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3424,7 +3424,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2022/11/index.html b/archives/2022/11/index.html index c178d0b66e..3718bde37f 100644 --- a/archives/2022/11/index.html +++ b/archives/2022/11/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3037,7 +3037,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3072,7 +3072,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3423,7 +3423,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2022/index.html b/archives/2022/index.html index 6cc493c909..92005d3569 100644 --- a/archives/2022/index.html +++ b/archives/2022/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3746,7 +3746,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3781,7 +3781,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4132,7 +4132,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2022/page/2/index.html b/archives/2022/page/2/index.html index 49d7c69c5d..d23b3761eb 100644 --- a/archives/2022/page/2/index.html +++ b/archives/2022/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3276,7 +3276,7 @@

    Yeah

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3311,7 +3311,7 @@

    Yeah

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3662,7 +3662,7 @@

    Yeah

  • vfox
    (2)
  • + >
    vfox
    (3)
  • Yeah
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2023/02/index.html b/archives/2023/02/index.html index 2d466ffe9c..d32c638661 100644 --- a/archives/2023/02/index.html +++ b/archives/2023/02/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2023/03/index.html b/archives/2023/03/index.html index a8b8aad4ab..8695a6ab0d 100644 --- a/archives/2023/03/index.html +++ b/archives/2023/03/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3039,7 +3039,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3074,7 +3074,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3425,7 +3425,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2023/08/index.html b/archives/2023/08/index.html index 3acb941dd5..d1092f3b5d 100644 --- a/archives/2023/08/index.html +++ b/archives/2023/08/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3031,7 +3031,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3066,7 +3066,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3417,7 +3417,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2023/index.html b/archives/2023/index.html index c226d8e4aa..5466abf33a 100644 --- a/archives/2023/index.html +++ b/archives/2023/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3186,7 +3186,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3221,7 +3221,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3572,7 +3572,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2024/02/index.html b/archives/2024/02/index.html index ac1b2fd2da..8d6858e748 100644 --- a/archives/2024/02/index.html +++ b/archives/2024/02/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3193,7 +3193,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3228,7 +3228,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3579,7 +3579,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2024/03/index.html b/archives/2024/03/index.html index f32608259e..c378a58462 100644 --- a/archives/2024/03/index.html +++ b/archives/2024/03/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3250,7 +3250,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3285,7 +3285,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3636,7 +3636,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2024/04/index.html b/archives/2024/04/index.html index d61d214f24..2850bdc285 100644 --- a/archives/2024/04/index.html +++ b/archives/2024/04/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3106,7 +3106,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3141,7 +3141,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3492,7 +3492,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2024/05/index.html b/archives/2024/05/index.html index 8838569967..8d5549504f 100644 --- a/archives/2024/05/index.html +++ b/archives/2024/05/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3187,7 +3187,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3222,7 +3222,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3573,7 +3573,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2024/06/index.html b/archives/2024/06/index.html new file mode 100644 index 0000000000..db717e660c --- /dev/null +++ b/archives/2024/06/index.html @@ -0,0 +1,4963 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 归档:2024/6 - ShanSan + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + +
    +
    + + +

    More & Less

    + + +

    created by yeshan333

    + +
    + +
    + + +
    + + +
    + +
    +
    + +
    + + +
    + + + + + + + + + + +
    +
    + + + + + + +
    + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + +
    + + + +

    + +

    + +
    + +

    通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本

    + +
    + +
    +
    + + + + + + + + + vfox + + + + +
    + + + +
    + + +
    + +
    + + + +
    + + + + + + +
    + + + + + + + + + +
    + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + diff --git a/archives/2024/index.html b/archives/2024/index.html index 965179494b..b67200786a 100644 --- a/archives/2024/index.html +++ b/archives/2024/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2870,6 +2870,77 @@ + + +
    +
    + + + + + + +
    + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + +
    + + + +

    + +

    + +
    + +

    通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本

    + +
    + +
    +
    + + + + + + + + + vfox + + + + +
    + + + +
    + + +
    + +
    +
    @@ -3516,77 +3587,6 @@

    - -
    -
    - - - - - - -
    - - 使用 go-ycsb 对 etcd 进行基准 (benchmark) 性能测试 - -
    - - - -

    - -

    - -
    - -

    using go-ycsb to benchmark etcd.

    - -
    - -
    -
    - - - - - - - - - go-ycsb - - - - -
    - - - -
    - - -
    - -
    - - @@ -3711,7 +3711,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3746,7 +3746,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4097,7 +4097,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/2024/page/2/index.html b/archives/2024/page/2/index.html index 786d786767..5bcdbdc7a2 100644 --- a/archives/2024/page/2/index.html +++ b/archives/2024/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2848,6 +2848,77 @@ +
    +
    + + + + + + +
    + + 使用 go-ycsb 对 etcd 进行基准 (benchmark) 性能测试 + +
    + + + +

    + +

    + +
    + +

    using go-ycsb to benchmark etcd.

    + +
    + +
    +
    + + + + + + + + + go-ycsb + + + + +
    + + + +
    + + +
    + +
    + + +
    @@ -3127,7 +3198,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3162,7 +3233,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -3513,7 +3584,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/index.html b/archives/index.html index ea433bfcb3..1a2458fac7 100644 --- a/archives/index.html +++ b/archives/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    + + + + + + @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/10/index.html b/archives/page/10/index.html index 2bbac4da91..dcb1540112 100644 --- a/archives/page/10/index.html +++ b/archives/page/10/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/11/index.html b/archives/page/11/index.html index 516575dbb3..7c4b0599c7 100644 --- a/archives/page/11/index.html +++ b/archives/page/11/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/12/index.html b/archives/page/12/index.html index 5e0f1d16e1..c33a305939 100644 --- a/archives/page/12/index.html +++ b/archives/page/12/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/13/index.html b/archives/page/13/index.html index 4ca9d5c88e..205e6741d1 100644 --- a/archives/page/13/index.html +++ b/archives/page/13/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/14/index.html b/archives/page/14/index.html index f9747712d1..548fba6ee5 100644 --- a/archives/page/14/index.html +++ b/archives/page/14/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/15/index.html b/archives/page/15/index.html index 0f9ebb2b9d..18afd3dd77 100644 --- a/archives/page/15/index.html +++ b/archives/page/15/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/16/index.html b/archives/page/16/index.html index ba92628f08..c44b7f0b2c 100644 --- a/archives/page/16/index.html +++ b/archives/page/16/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/2/index.html b/archives/page/2/index.html index d8f0e5ee8a..e0448d8000 100644 --- a/archives/page/2/index.html +++ b/archives/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/3/index.html b/archives/page/3/index.html index 8e576799ff..13ddb9f304 100644 --- a/archives/page/3/index.html +++ b/archives/page/3/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/4/index.html b/archives/page/4/index.html index 7eb2f94ecf..3369fef49c 100644 --- a/archives/page/4/index.html +++ b/archives/page/4/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/5/index.html b/archives/page/5/index.html index 0a2b006a6f..94dbf820c4 100644 --- a/archives/page/5/index.html +++ b/archives/page/5/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/6/index.html b/archives/page/6/index.html index 28692b0521..e25048b1a0 100644 --- a/archives/page/6/index.html +++ b/archives/page/6/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/7/index.html b/archives/page/7/index.html index 63a2591cdf..654d48eb23 100644 --- a/archives/page/7/index.html +++ b/archives/page/7/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/8/index.html b/archives/page/8/index.html index 8c40e22fdc..abcc8520a4 100644 --- a/archives/page/8/index.html +++ b/archives/page/8/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/archives/page/9/index.html b/archives/page/9/index.html index 83212de633..7804441647 100644 --- a/archives/page/9/index.html +++ b/archives/page/9/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,6 +2851,22 @@

    2024

    +
    + + + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + +
    + + + + +
    @@ -5483,7 +5499,7 @@

    2018

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -5518,7 +5534,7 @@

    2018

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -5869,7 +5885,7 @@

    2018

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 2018
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/atom.xml b/atom.xml index e7706446fc..6837f43471 100644 --- a/atom.xml +++ b/atom.xml @@ -6,7 +6,7 @@ - 2024-05-29T00:29:49.000Z + 2024-06-18T22:58:39.000Z https://yeshan333.github.io/ @@ -16,6 +16,31 @@ Hexo + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + https://yeshan333.github.io/2024/06/18/install-erlang-and-elixir-via-vfox-on-windows/ + 2024-06-18T22:58:39.000Z + 2024-06-18T22:58:39.000Z + + + 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + + + + + + + + + + + + 手把手教你如何在 Sider (ChatGPT Sidebar) 中免费使用通义千问 @@ -790,13 +815,13 @@ <!-- 我们都一样 --> - <div id="aplayer-yULaxNlS" class="aplayer aplayer-tag-marker meting-tag-marker" + <div id="aplayer-MpmIKHIo" class="aplayer aplayer-tag-marker meting-tag-marker" data-id="1340001174" data-server="netease" data-type="song" data-mode="circulation" data-autoplay="true" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#ad7a86" ></div> - <div id="aplayer-HYSIWtzu" class="aplayer aplayer-tag-marker meting-tag-marker" + <div id="aplayer-aWWWsblK" class="aplayer aplayer-tag-marker meting-tag-marker" data-id="191252" data-server="netease" data-type="song" data-mode="circulation" data-autoplay="false" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#ad7a86" ></div> @@ -831,29 +856,4 @@ - - 回到十月-生活中的一点儿小确幸 - - https://yeshan333.github.io/2021/11/14/back-to-october/ - 2021-11-14T10:21:37.000Z - 2021-11-14T10:21:37.000Z - - - - - - - <link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="前言"><a href="#前言" class="headerlink" - - - - - - - - - - - - diff --git a/baidu_urls.txt b/baidu_urls.txt index 34631c738d..0ef8a900a9 100644 --- a/baidu_urls.txt +++ b/baidu_urls.txt @@ -1,3 +1,4 @@ +https://yeshan333.github.io/2024/06/18/install-erlang-and-elixir-via-vfox-on-windows/ https://yeshan333.github.io/2024/05/29/free-to-use-sider-with-qwen/ https://yeshan333.github.io/2024/05/25/validate-jenkinsfile/ https://yeshan333.github.io/2024/05/18/etcd-and-mongodb-chaos-testing/ @@ -6,5 +7,4 @@ https://yeshan333.github.io/2024/04/25/using-vfox-erlang-to-manage-erlang-versio https://yeshan333.github.io/2024/03/23/using-chezmoi-to-manage-dotfiles/ https://yeshan333.github.io/2024/03/15/develop-web-extension-with-wxt/ https://yeshan333.github.io/2024/03/13/markup-screen/ -https://yeshan333.github.io/2024/03/04/awesome-tech-weekly-zh/ -https://yeshan333.github.io/2024/02/29/using-ycsb-benchmark-etcd/ \ No newline at end of file +https://yeshan333.github.io/2024/03/04/awesome-tech-weekly-zh/ \ No newline at end of file diff --git a/categories/Algorithm/index.html b/categories/Algorithm/index.html index b97fc0898d..d8f8b57ad9 100644 --- a/categories/Algorithm/index.html +++ b/categories/Algorithm/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3216,7 +3216,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3251,7 +3251,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3602,7 +3602,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/Architecture/index.html b/categories/Architecture/index.html index 6a2c9d0a92..dd87ae35b1 100644 --- a/categories/Architecture/index.html +++ b/categories/Architecture/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3121,7 +3121,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3156,7 +3156,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3507,7 +3507,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/C/index.html b/categories/C/index.html index 0f71848dae..60e965313c 100644 --- a/categories/C/index.html +++ b/categories/C/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3035,7 +3035,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3070,7 +3070,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3421,7 +3421,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/CPP/index.html b/categories/CPP/index.html index 3fb98e34a0..3d9bfc4953 100644 --- a/categories/CPP/index.html +++ b/categories/CPP/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3790,7 +3790,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3825,7 +3825,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4176,7 +4176,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/CPP/page/2/index.html b/categories/CPP/page/2/index.html index 1769dcfc9c..a4b6fb3174 100644 --- a/categories/CPP/page/2/index.html +++ b/categories/CPP/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3732,7 +3732,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3767,7 +3767,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4118,7 +4118,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/CPP/page/3/index.html b/categories/CPP/page/3/index.html index 193c5a8106..18aae1c345 100644 --- a/categories/CPP/page/3/index.html +++ b/categories/CPP/page/3/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3137,7 +3137,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3172,7 +3172,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3523,7 +3523,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/CSS/index.html b/categories/CSS/index.html index ac5eb4f31f..d56f291267 100644 --- a/categories/CSS/index.html +++ b/categories/CSS/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3043,7 +3043,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3078,7 +3078,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3429,7 +3429,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Chaos/index.html b/categories/Chaos/index.html index dd80020911..0cbc6e94ca 100644 --- a/categories/Chaos/index.html +++ b/categories/Chaos/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Compile/index.html b/categories/Compile/index.html index b0b25c6a09..52a6db5da5 100644 --- a/categories/Compile/index.html +++ b/categories/Compile/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Cryptography/index.html b/categories/Cryptography/index.html index 870bc6e8fb..d05a910d01 100644 --- a/categories/Cryptography/index.html +++ b/categories/Cryptography/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3038,7 +3038,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3073,7 +3073,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3424,7 +3424,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/DevOps/index.html b/categories/DevOps/index.html index 2ab23d0766..aa5333e56b 100644 --- a/categories/DevOps/index.html +++ b/categories/DevOps/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Elixir/index.html b/categories/Elixir/index.html index 8056848f8c..fa42f9c9c8 100644 --- a/categories/Elixir/index.html +++ b/categories/Elixir/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3731,7 +3731,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3766,7 +3766,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4117,7 +4117,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Flask/index.html b/categories/Flask/index.html index 89e3993c24..7a30e2cf96 100644 --- a/categories/Flask/index.html +++ b/categories/Flask/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3227,7 +3227,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3262,7 +3262,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3613,7 +3613,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/Git/index.html b/categories/Git/index.html index 70da5bfd1c..df3785ad40 100644 --- a/categories/Git/index.html +++ b/categories/Git/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3563,7 +3563,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3598,7 +3598,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3949,7 +3949,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/Github-Codespaces/index.html b/categories/Github-Codespaces/index.html index 1d88f72dfd..130b76b26b 100644 --- a/categories/Github-Codespaces/index.html +++ b/categories/Github-Codespaces/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Go/index.html b/categories/Go/index.html index 23be865f0c..5dbbe3a6b8 100644 --- a/categories/Go/index.html +++ b/categories/Go/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3124,7 +3124,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3159,7 +3159,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3510,7 +3510,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/HTML/index.html b/categories/HTML/index.html index 6e8b327ac0..f9fde5b6e8 100644 --- a/categories/HTML/index.html +++ b/categories/HTML/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3116,7 +3116,7 @@

    二级标题

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3151,7 +3151,7 @@

    二级标题

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3502,7 +3502,7 @@

    二级标题

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 二级标题
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/JavaScript/index.html b/categories/JavaScript/index.html index 5ce9aedabf..52b4d21cb6 100644 --- a/categories/JavaScript/index.html +++ b/categories/JavaScript/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3121,7 +3121,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3156,7 +3156,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3507,7 +3507,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/Jenkins/index.html b/categories/Jenkins/index.html index 7660bd8f88..91fa903726 100644 --- a/categories/Jenkins/index.html +++ b/categories/Jenkins/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Kubernetes/index.html b/categories/Kubernetes/index.html index 855fac2d25..22cb623441 100644 --- a/categories/Kubernetes/index.html +++ b/categories/Kubernetes/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3037,7 +3037,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3072,7 +3072,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3423,7 +3423,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/LLMs/index.html b/categories/LLMs/index.html index 81e888e47d..1dc43cfcdc 100644 --- a/categories/LLMs/index.html +++ b/categories/LLMs/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3044,7 +3044,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3079,7 +3079,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3430,7 +3430,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Linux/index.html b/categories/Linux/index.html index 85062a2746..8c4855a1d1 100644 --- a/categories/Linux/index.html +++ b/categories/Linux/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3261,7 +3261,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3296,7 +3296,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3647,7 +3647,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/categories/Linux/\346\200\247\350\203\275\344\274\230\345\214\226/index.html" "b/categories/Linux/\346\200\247\350\203\275\344\274\230\345\214\226/index.html" index 8f514b327e..e91646b7e2 100644 --- "a/categories/Linux/\346\200\247\350\203\275\344\274\230\345\214\226/index.html" +++ "b/categories/Linux/\346\200\247\350\203\275\344\274\230\345\214\226/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Memory/index.html b/categories/Memory/index.html index 3676ecec00..7a91ed61cb 100644 --- a/categories/Memory/index.html +++ b/categories/Memory/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3038,7 +3038,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3073,7 +3073,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3424,7 +3424,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Monitoring/index.html b/categories/Monitoring/index.html index b03a5d90da..588fc1884d 100644 --- a/categories/Monitoring/index.html +++ b/categories/Monitoring/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/Performance/Profiling/index.html b/categories/Performance/Profiling/index.html index 9404c66810..11e3aa49dd 100644 --- a/categories/Performance/Profiling/index.html +++ b/categories/Performance/Profiling/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3047,7 +3047,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3082,7 +3082,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3433,7 +3433,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Performance/index.html b/categories/Performance/index.html index fe1551495f..071c43b547 100644 --- a/categories/Performance/index.html +++ b/categories/Performance/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3047,7 +3047,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3082,7 +3082,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3433,7 +3433,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Prometheus/index.html b/categories/Prometheus/index.html index ffc7595a8c..8469d4585f 100644 --- a/categories/Prometheus/index.html +++ b/categories/Prometheus/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3037,7 +3037,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3072,7 +3072,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3423,7 +3423,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Python/index.html b/categories/Python/index.html index 2b5d5dbff7..40762fdf11 100644 --- a/categories/Python/index.html +++ b/categories/Python/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3759,7 +3759,7 @@

    多态
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3794,7 +3794,7 @@

    多态
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4145,7 +4145,7 @@

    多态
    vfox
    (2)

  • + >
    vfox
    (3)
  • 多态 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/Python/page/2/index.html b/categories/Python/page/2/index.html index 44253d76b0..df0196b07b 100644 --- a/categories/Python/page/2/index.html +++ b/categories/Python/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3712,7 +3712,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3747,7 +3747,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4098,7 +4098,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/Python/page/3/index.html b/categories/Python/page/3/index.html index 9381833107..ce1e1cb28c 100644 --- a/categories/Python/page/3/index.html +++ b/categories/Python/page/3/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3084,7 +3084,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3119,7 +3119,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3470,7 +3470,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/RSS/index.html b/categories/RSS/index.html index cd920feab0..9b659fa4d2 100644 --- a/categories/RSS/index.html +++ b/categories/RSS/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/React/index.html b/categories/React/index.html index e33fedecf3..a07bc7769b 100644 --- a/categories/React/index.html +++ b/categories/React/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3118,7 +3118,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3153,7 +3153,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3504,7 +3504,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/SSE/index.html b/categories/SSE/index.html index 3ec3641cc2..f138dacebb 100644 --- a/categories/SSE/index.html +++ b/categories/SSE/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Scrapy/index.html b/categories/Scrapy/index.html index 211ac84ee1..df5d692d27 100644 --- a/categories/Scrapy/index.html +++ b/categories/Scrapy/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3052,7 +3052,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3087,7 +3087,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3438,7 +3438,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Sider/index.html b/categories/Sider/index.html index db3e4111f8..afaf6c0918 100644 --- a/categories/Sider/index.html +++ b/categories/Sider/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3044,7 +3044,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3079,7 +3079,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3430,7 +3430,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/Tech-Weekly/index.html b/categories/Tech-Weekly/index.html index 27827b2558..4d0935f21e 100644 --- a/categories/Tech-Weekly/index.html +++ b/categories/Tech-Weekly/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/WSL/index.html b/categories/WSL/index.html index fdd5612779..b58718b59b 100644 --- a/categories/WSL/index.html +++ b/categories/WSL/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3039,7 +3039,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3074,7 +3074,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3425,7 +3425,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/blog/index.html b/categories/blog/index.html index 40c58259a6..8dfee7045a 100644 --- a/categories/blog/index.html +++ b/categories/blog/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3057,13 +3057,13 @@

    -
    -
    @@ -3740,7 +3740,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3775,7 +3775,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4126,7 +4126,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/blog/page/2/index.html b/categories/blog/page/2/index.html index 5b0c52d447..38c51f4a23 100644 --- a/categories/blog/page/2/index.html +++ b/categories/blog/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3646,7 +3646,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3681,7 +3681,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4032,7 +4032,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/docker/index.html b/categories/docker/index.html index 7469efeff6..82da5c05d0 100644 --- a/categories/docker/index.html +++ b/categories/docker/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3116,7 +3116,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3151,7 +3151,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3502,7 +3502,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/dotfiles/index.html b/categories/dotfiles/index.html index dba57aa86f..f7a25ba5ee 100644 --- a/categories/dotfiles/index.html +++ b/categories/dotfiles/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/go-ycsb/index.html b/categories/go-ycsb/index.html index 45317ef0d1..12ba4c9e01 100644 --- a/categories/go-ycsb/index.html +++ b/categories/go-ycsb/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/index.html b/categories/index.html index 53bb14446e..931006af46 100644 --- a/categories/index.html +++ b/categories/index.html @@ -43,8 +43,8 @@ - - + + @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3147,7 +3147,7 @@

    所有分类

      vfox - (2) + (3) @@ -4468,7 +4468,7 @@

    所有分类

    - + diff --git a/categories/markdown/index.html b/categories/markdown/index.html index 4be4db934b..b733e391c9 100644 --- a/categories/markdown/index.html +++ b/categories/markdown/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3114,7 +3114,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3149,7 +3149,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3500,7 +3500,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/math/index.html b/categories/math/index.html index d96ed9cd21..334c9f8e0f 100644 --- a/categories/math/index.html +++ b/categories/math/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3200,7 +3200,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3235,7 +3235,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3586,7 +3586,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/categories/memory/index.html b/categories/memory/index.html index 293517ea66..5d62d3956a 100644 --- a/categories/memory/index.html +++ b/categories/memory/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3039,7 +3039,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3074,7 +3074,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3425,7 +3425,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/music/index.html b/categories/music/index.html index 33fb89c383..fa1c1bd4d5 100644 --- a/categories/music/index.html +++ b/categories/music/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3050,7 +3050,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3085,7 +3085,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3436,7 +3436,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/categories/vfox/index.html b/categories/vfox/index.html index 8acd5e90cb..7c3d900cac 100644 --- a/categories/vfox/index.html +++ b/categories/vfox/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2853,11 +2853,84 @@ + + +
    +
    + + + + + + +
    + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + +
    + + + +

    + +

    + +
    + +

    通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本

    + +
    + +
    +
    + + + + + + + + + vfox + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3109,7 +3182,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3144,7 +3217,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -3495,7 +3568,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/categories/\344\270\255\351\227\264\344\273\266/Kafka/index.html" "b/categories/\344\270\255\351\227\264\344\273\266/Kafka/index.html" index 398fd4eb2d..e9e5cb4e29 100644 --- "a/categories/\344\270\255\351\227\264\344\273\266/Kafka/index.html" +++ "b/categories/\344\270\255\351\227\264\344\273\266/Kafka/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3048,7 +3048,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3083,7 +3083,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3434,7 +3434,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/categories/\344\270\255\351\227\264\344\273\266/index.html" "b/categories/\344\270\255\351\227\264\344\273\266/index.html" index ceb1dc0138..2cef72d8ae 100644 --- "a/categories/\344\270\255\351\227\264\344\273\266/index.html" +++ "b/categories/\344\270\255\351\227\264\344\273\266/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3048,7 +3048,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3083,7 +3083,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3434,7 +3434,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/categories/\345\207\275\346\225\260\345\274\217\347\274\226\347\250\213/index.html" "b/categories/\345\207\275\346\225\260\345\274\217\347\274\226\347\250\213/index.html" index c23dc2c453..1480c6bfaf 100644 --- "a/categories/\345\207\275\346\225\260\345\274\217\347\274\226\347\250\213/index.html" +++ "b/categories/\345\207\275\346\225\260\345\274\217\347\274\226\347\250\213/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    map

    先看

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    map

    先看

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

    map

    先看

  • vfox
    (2)
  • + >
    vfox
    (3)
  • map

    先看

    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/categories/\345\244\247\346\250\241\345\236\213/index.html" "b/categories/\345\244\247\346\250\241\345\236\213/index.html" index 9cc8685d79..89c733637d 100644 --- "a/categories/\345\244\247\346\250\241\345\236\213/index.html" +++ "b/categories/\345\244\247\346\250\241\345\236\213/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3044,7 +3044,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3079,7 +3079,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3430,7 +3430,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/categories/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" "b/categories/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" index eeac8c5186..a78d1aa4fd 100644 --- "a/categories/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" +++ "b/categories/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3220,7 +3220,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3255,7 +3255,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3606,7 +3606,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/categories/\346\223\215\344\275\234\347\263\273\347\273\237/\350\277\233-\347\272\277\347\250\213/index.html" "b/categories/\346\223\215\344\275\234\347\263\273\347\273\237/\350\277\233-\347\272\277\347\250\213/index.html" index 52a39bc838..a8fb780b09 100644 --- "a/categories/\346\223\215\344\275\234\347\263\273\347\273\237/\350\277\233-\347\272\277\347\250\213/index.html" +++ "b/categories/\346\223\215\344\275\234\347\263\273\347\273\237/\350\277\233-\347\272\277\347\250\213/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3049,7 +3049,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3084,7 +3084,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3435,7 +3435,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/categories/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" "b/categories/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" index f41e0dfbfa..f5da5fcf0e 100644 --- "a/categories/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" +++ "b/categories/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3121,7 +3121,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3156,7 +3156,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3507,7 +3507,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/categories/\346\265\217\350\247\210\345\231\250\346\217\222\344\273\266\345\274\200\345\217\221/index.html" "b/categories/\346\265\217\350\247\210\345\231\250\346\217\222\344\273\266\345\274\200\345\217\221/index.html" index 1b18ed92b3..09a08bf415 100644 --- "a/categories/\346\265\217\350\247\210\345\231\250\346\217\222\344\273\266\345\274\200\345\217\221/index.html" +++ "b/categories/\346\265\217\350\247\210\345\231\250\346\217\222\344\273\266\345\274\200\345\217\221/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/categories/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html" "b/categories/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html" index 7b8a3ee1af..084fb3b932 100644 --- "a/categories/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html" +++ "b/categories/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3294,7 +3294,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3329,7 +3329,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3680,7 +3680,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/categories/\350\256\276\350\256\241\345\267\245\345\205\267/index.html" "b/categories/\350\256\276\350\256\241\345\267\245\345\205\267/index.html" index ed4d699f53..fcd079b19b 100644 --- "a/categories/\350\256\276\350\256\241\345\267\245\345\205\267/index.html" +++ "b/categories/\350\256\276\350\256\241\345\267\245\345\205\267/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3034,7 +3034,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3069,7 +3069,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3420,7 +3420,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/categories/\350\256\276\350\256\241\346\250\241\345\274\217/index.html" "b/categories/\350\256\276\350\256\241\346\250\241\345\274\217/index.html" index a427352e01..d387b43ab7 100644 --- "a/categories/\350\256\276\350\256\241\346\250\241\345\274\217/index.html" +++ "b/categories/\350\256\276\350\256\241\346\250\241\345\274\217/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3037,7 +3037,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3072,7 +3072,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3423,7 +3423,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/categories/\351\232\217\347\254\224/index.html" "b/categories/\351\232\217\347\254\224/index.html" index 31985fd92c..fd57a60ed7 100644 --- "a/categories/\351\232\217\347\254\224/index.html" +++ "b/categories/\351\232\217\347\254\224/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3340,7 +3340,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3375,7 +3375,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3726,7 +3726,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/cloud-native/index.html b/cloud-native/index.html index 3ef4ad96c4..00eebe2723 100644 --- a/cloud-native/index.html +++ b/cloud-native/index.html @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/content.json b/content.json index 53ef229abb..23c35d3daf 100644 --- a/content.json +++ b/content.json @@ -1 +1 @@ -{"meta":{"title":"ShanSan","subtitle":"个人博客","description":"ShanSan's Blog","author":"ShanSan","url":"https://yeshan333.github.io","root":"/"},"pages":[{"title":"","date":"2024-06-15T17:04:52.538Z","updated":"2024-06-15T17:04:52.538Z","comments":true,"path":"baidu_verify_XRNJycrlKL.html","permalink":"https://yeshan333.github.io/baidu_verify_XRNJycrlKL.html","excerpt":"","text":"XRNJycrlKL"},{"title":"","date":"2024-06-15T17:04:52.538Z","updated":"2024-06-15T17:04:52.538Z","comments":true,"path":"googlec01c2945d8a3c128.html","permalink":"https://yeshan333.github.io/googlec01c2945d8a3c128.html","excerpt":"","text":"google-site-verification: googlec01c2945d8a3c128.html"},{"title":"404 Not Found","date":"2024-06-15T17:04:52.526Z","updated":"2024-06-15T17:04:52.526Z","comments":false,"path":"/404.html","permalink":"https://yeshan333.github.io/404.html","excerpt":"","text":"]\\ 404"},{"title":"Astronomy","date":"2018-10-09T13:26:08.000Z","updated":"2018-10-09T13:26:08.000Z","comments":true,"path":"Astronomy/index.html","permalink":"https://yeshan333.github.io/Astronomy/index.html","excerpt":"","text":"北京天文馆每日天文一图NASA             天上的街市作者:郭沫若远远的街灯明了,好像闪着无数的明星。天上的明星现了,好像点着无数的街灯。我想那缥缈的空中,定然有美丽的街市。街市上陈列的一些物品,定然是世上没有的珍奇。你看,那浅浅的天河,定然是不甚宽广。那隔河的牛郎织女,定能够骑着牛儿来往。我想他们此刻,定然在天街闲游。不信,请看那朵流星,那怕是他们提着灯笼在走。 一天文单位(AU)=149,597,870.7公里(日地距离) 一光年=63241.1 AU=946e+12公里"},{"title":"Collect","date":"2019-01-08T22:39:26.000Z","updated":"2019-01-08T22:39:26.000Z","comments":true,"path":"Collect/index.html","permalink":"https://yeshan333.github.io/Collect/index.html","excerpt":"","text":"Tools小记 description tools Link 截屏工具 Snipaste https://zh.snipaste.com/ 录屏工具 oCam https://download.cnet.com/oCam/3000-13633_4-75758209.html 清理工具 CCleaner https://www.ccleaner.com/ccleaner 远程连接工具 Xshell https://www.netsarang.com/products/xsh_overview.html 搜索利器 Everything http://www.voidtools.com/ Markdown编辑器 typora https://www.typora.io/ Shadowsocks-Qt5 影梭 https://github.com/shadowsocks/shadowsocks-qt5 windows数字权利激活工具 CMWTAT_Digital_Edition https://tgsan.github.io/CMWTAT_Digital_Edition/ 镜像制作 WPE工具箱 http://udsdown.xyz/109.html 镜像制作 refus https://rufus.ie/ 启动项管理 EasyUEFI https://www.easyuefi.com/index-cn.html 压缩工具 7-zip https://www.7-zip.org/ 优质文章小记用GDB调试程序 https://blog.csdn.net/haoel/article/details/2879 https://blog.csdn.net/haoel/article/details/2880?utm_source=blogxgwz2 https://blog.csdn.net/haoel/article/details/2881 https://blog.csdn.net/haoel/article/details/2882 https://blog.csdn.net/haoel/article/details/2883/ https://blog.csdn.net/haoel/article/details/2884 https://blog.csdn.net/haoel/article/details/2885/ https://coolshell.cn/articles/3643.html 跟我一起写Makefile https://blog.csdn.net/haoel/article/details/2886 https://blog.csdn.net/haoel/article/details/2887/ https://blog.csdn.net/haoel/article/details/2888 https://blog.csdn.net/haoel/article/details/2889/ https://blog.csdn.net/haoel/article/details/2890 https://blog.csdn.net/haoel/article/details/2891 https://blog.csdn.net/haoel/article/details/2892 https://blog.csdn.net/haoel/article/details/2893/ https://blog.csdn.net/haoel/article/details/2894 https://blog.csdn.net/haoel/article/details/2895 https://blog.csdn.net/haoel/article/details/2896 https://blog.csdn.net/haoel/article/details/2897 https://blog.csdn.net/haoel/article/details/2898 https://blog.csdn.net/haoel/article/details/2899"},{"title":"我想对我说","date":"2019-06-28T20:37:16.000Z","updated":"2019-06-28T20:37:16.000Z","comments":true,"path":"I_want_to_tell_me/index.html","permalink":"https://yeshan333.github.io/I_want_to_tell_me/index.html","excerpt":"","text":""},{"title":"PyChina","date":"2024-06-15T17:04:52.526Z","updated":"2024-06-15T17:04:52.526Z","comments":true,"path":"PyChina/index.html","permalink":"https://yeshan333.github.io/PyChina/index.html","excerpt":"","text":""},{"title":"Statement","date":"2019-03-14T20:30:46.000Z","updated":"2019-03-14T20:30:46.000Z","comments":true,"path":"Statement/index.html","permalink":"https://yeshan333.github.io/Statement/index.html","excerpt":"","text":"声明: 本站文章基于 知识共享署名-相同方式共享 4.0 国际许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本站文章的署名 Shan San及链接。 作者: Shan San 出处: https://shansan.top/"},{"title":"About/关于我","date":"2018-09-20T13:37:03.000Z","updated":"2018-09-20T13:37:03.000Z","comments":true,"path":"about/index.html","permalink":"https://yeshan333.github.io/about/index.html","excerpt":"","text":"小 target 🚩:一个月至少一篇文章📌 聊一聊我是谁 在校 kubi 大四学生「毕业 she fei~ 人」,专业:「信息与计算科学」 略懂乐理🎹~ 目前在关注研究的技术领域 Cloud Native、DevOps、DevTest 『啥也不是🤨』 Pythonista、Elixirist、Gopher、Rustacean 关于博客博客的搭建和维护学了许多花里胡哨的东西😂,主要用来写写自己想写的东西(虽然现在大多是技术文章),emmm。。。有些话想到再说。 2018-09-19 博客诞生 1、其实具体日子我也不记得了,当初不熟悉 Git,Commit History 被我摧毁了很多次,难以追溯具体日期🤣🤦‍♂️2、基于 Hexo 搭建的静态博客,最初使用的博客主题为 yilia,使用 Github Pages 托管3、也曾玩过 WordPress、Typecho(曾剁手买了个主题-handsome)4、现在博客使用的 Hexo 博客主题是 xaoxuxu 大佬写的 volantis,曾经叫 Material-x 就开始用了 2018-09-29 使用顶级域名 shansan.top,CNAME 解析到 GitHub Pages 2018-12-24 启用备用域名 shan333.cn 将博客部署到腾讯云 CVM 服务器;Web 服务器使用到了 Nginx;使用宝塔面板进行 Ops;通过 Linux 定时任务同步博客到云服务器 2020-01-30 引入 GitHub Actions 使用 GitHub Actions 持续集成/部署 Hexo 博客到 GitHub Pages “workflow.yml🔗”,放弃云盘单独备份,使用 Git 做版本控制(回忆) 2020-03-11 Hexo 主题升级 主题升级至volantis@2.0.2(原material-x主题改名了),紧跟dalao更新步伐 2020-04-29 volantis@2.0.2 -> volantis@2.6.5 2021-01-18 云服务器博客同步引入 CI/CD 写了个基于 rsync 协议的 GitHub Action 用于 CD 博客到 CVM 服务器,博文👉使用 rsync-deploy-action 同步 Hexo 博客到个人服务器 2021-03-10 volantis@2.6.5 -> volantis@4.3.1,hexo@4.0.0 -> hexo@5.4.0 2021-06-25 切换评论系统 valine -> waline 2022-05-08 waline 升级 2022-11-05 volantis -> v5.7.6 升级 2024-02-06 hexo -> v7.0.0 升级 2024-03-14 volantis -> v2.6.3 升级 v2.8.3,API 不兼容,吐了🤮~ 博客加入了十年之约项目嗷~相信时间的力量。 加个微信吧加个 QQ 吧"},{"title":"所有分类","date":"2024-06-15T17:04:52.538Z","updated":"2024-06-15T17:04:52.538Z","comments":true,"path":"categories/index.html","permalink":"https://yeshan333.github.io/categories/index.html","excerpt":"","text":""},{"title":"云原生","date":"2021-02-21T13:37:03.000Z","updated":"2021-02-21T13:37:03.000Z","comments":true,"path":"cloud-native/index.html","permalink":"https://yeshan333.github.io/cloud-native/index.html","excerpt":"","text":"organization && communityCNCF 云原生基金会https://www.cncf.io/云原生技术社区中国云原生技术社区 dalaoJimmy Song中国云原生社区创始人米开朗基杨IBM Cloud Native 工程师"},{"title":"friends","date":"2018-09-19T22:18:33.000Z","updated":"2018-09-19T22:18:33.000Z","comments":true,"path":"friends/index.html","permalink":"https://yeshan333.github.io/friends/index.html","excerpt":"朋友们雨帆Java,C#xaoxuuvolantis作者,IOSMashiroWeb前端TRHX数据采集、逆向安全嗜血星空earthBIM学习者Librarius's BlogC#,HLSLhojunWeb开发Rinvay.H运维大佬教书先生Web开发Bert Liu's Blog室内设计情小北Web安全Hoe's Notes后端开发楓の街以有涯随无涯lvlv's blogWeb前端HONGWEI测试工程师辣椒の酱JavaMrGo123后端攻城狮炎忍Kolin,AndroidTanger加油加油LiZiWu李自伍的个人技术博客 & 期待与你相逢悲伤的吉子树Springboot果子酱Java,Golang 失踪的 dalao 们搅拌糖°技术不宅,Web开发HawkC++Don LexJava,Python一去二三遥Java,摄影清秋Python半叶子C云宝地Java残梦前端、JS洛尘曦Java,Python张雄向阳生长,触碰流云Nykee前端打杂狮/公路骑游党子翔一个努力学技术的小白(中学生)我爱吃土豆一个爱吃土豆的程序员","text":"朋友们雨帆Java,C#xaoxuuvolantis作者,IOSMashiroWeb前端TRHX数据采集、逆向安全嗜血星空earthBIM学习者Librarius's BlogC#,HLSLhojunWeb开发Rinvay.H运维大佬教书先生Web开发Bert Liu's Blog室内设计情小北Web安全Hoe's Notes后端开发楓の街以有涯随无涯lvlv's blogWeb前端HONGWEI测试工程师辣椒の酱JavaMrGo123后端攻城狮炎忍Kolin,AndroidTanger加油加油LiZiWu李自伍的个人技术博客 & 期待与你相逢悲伤的吉子树Springboot果子酱Java,Golang 失踪的 dalao 们搅拌糖°技术不宅,Web开发HawkC++Don LexJava,Python一去二三遥Java,摄影清秋Python半叶子C云宝地Java残梦前端、JS洛尘曦Java,Python张雄向阳生长,触碰流云Nykee前端打杂狮/公路骑游党子翔一个努力学技术的小白(中学生)我爱吃土豆一个爱吃土豆的程序员 友链🔗随缘添加哦","author":"yeshan333"},{"title":"所有标签","date":"2024-06-15T17:04:52.538Z","updated":"2024-06-15T17:04:52.538Z","comments":true,"path":"tags/index.html","permalink":"https://yeshan333.github.io/tags/index.html","excerpt":"","text":""}],"posts":[{"title":"手把手教你如何在 Sider (ChatGPT Sidebar) 中免费使用通义千问","slug":"free-to-use-sider-with-qwen","date":"2024-05-29T00:29:49.000Z","updated":"2024-05-29T00:29:49.000Z","comments":true,"path":"2024/05/29/free-to-use-sider-with-qwen/","permalink":"https://yeshan333.github.io/2024/05/29/free-to-use-sider-with-qwen/","excerpt":"","text":"最近国产大模型正在疯狂降价,推出了众多的免费策略,是时候该“白嫖”一手了。用过 Sider 的小伙伴应该很少有说不“妙”啊,用户体验也做得很棒。奈何它要开通使用全部的功能价格有可能不太能承受,且有些功能不一定用得上。但是免费,又有一定的额度和次数限制。Sider 其实是支持用户使用自己的 OpenAI 密钥的,但 OpenAI 的几个也不太低呐。 接下来本文将会介绍如何在 Sider 中“免费”使用通义千问。 什么是 Sider (ChatGPT Sidebar) Sider 是一款智能工具,可以添加到您的浏览器中,帮助您轻松完成各种在线任务。它使用 ChatGPT、GPT-4、Gemini 和 Claude 3 等 API,可以帮助您进行写作、阅读、聊天以及内容摘要等。以下是 Sider 的主要功能: 聊天任何话题、文件、图像 - 您可以就任何感兴趣的话题进行聊天, 甚至可以向 Sider 展示图片或文档,它会给出清晰的答复或建议,让每次聊天都很有趣且有帮助。 更快地阅读网页、选定文本、电子邮件 - Sider 可以帮助您更快地浏览网页、文本和电子邮件, 提供要点总结, 让您轻松快速地浏览长篇文章或消息。 更好地写作任何内容 - 无论是电子邮件、文章还是消息, Sider 都可以帮助您改善写作质量,提供建议以使您的写作更符合您的风格和目的。 等等 访问产品官网即可在浏览器快速安装 Sider 插件: https://sider.ai/zh-CN/ 在 Sider 浏览器插件中使用通义千问 “通义千问”是阿里云开发的一款大型语言模型. 如果你用过 Sider,应该知道能在通用配置处配置自己的 OpenAI 密钥的。要想在 Sider 中使用通义千问大模型,我们也需要用到这个配置。 最近阿里云的灵积模型服务开放 API 出了 OpenAI 的兼容模式接口 -> OpenAI接口兼容, 这意味着我们使用这个兼容接口作为 Sider 插件的配置即可使用通义千问。如下图,我们有三个配置需要填写: 1、API Key 从阿里云的模型服务灵积控制台获取 -> 获取 API Key 2、url 填写:https://dashscope.aliyuncs.com/compatible-mode 3、使用自定义模型名称,Model Name 填写你想使用的大模型名字,比如 qwen-turbo, 模型可以从这里找到: 通义前文-模型概览 配置完成之后,就可以直接使用它啦~","categories":[{"name":"大模型","slug":"大模型","permalink":"https://yeshan333.github.io/categories/%E5%A4%A7%E6%A8%A1%E5%9E%8B/"},{"name":"LLMs","slug":"LLMs","permalink":"https://yeshan333.github.io/categories/LLMs/"},{"name":"Sider","slug":"Sider","permalink":"https://yeshan333.github.io/categories/Sider/"}],"tags":[{"name":"Sider","slug":"Sider","permalink":"https://yeshan333.github.io/tags/Sider/"},{"name":"通义千问","slug":"通义千问","permalink":"https://yeshan333.github.io/tags/%E9%80%9A%E4%B9%89%E5%8D%83%E9%97%AE/"}]},{"title":"使用 vscode 插件 vscode-jenkins-pipeline-linter-connector 和 LLMs 大模型校验你的 Jenkinsfile","slug":"validate-jenkinsfile","date":"2024-05-25T17:05:12.000Z","updated":"2024-05-25T17:05:12.000Z","comments":true,"path":"2024/05/25/validate-jenkinsfile/","permalink":"https://yeshan333.github.io/2024/05/25/validate-jenkinsfile/","excerpt":"","text":"Jenkins 一直以来都是比较热门的用来做 CI/CD 的自动化工具, 如果你使用过 GitHub Action, 和它类似, 现在大多数的自动化工具都会提供 DSL(领域特定语言)去描述 & 编排自动化工作流, Jenkins 的 Pipeline Syntax 就是 Jenkins 提供的编排语言, 对应的编排文件一般称之为 Jenkinsfile, 语法规则和 Groovy 很类似. 我平常使用 Declarative Pipeline Syntax 比较多, Jenkinsfile 的管理一般都会使用一个 Git 仓库. 在本地编辑完成之后一直比较头疼的是语法的校验, 经常需要代码提交之后实际去跑 Pipeline 才能确认有没有语法问题. 其实这个语法校验在 Jenkins 的 UI 上配置是自带的, 但总不能每次在代码编辑器编辑之后再拷贝上去吧, Jenkins 的官方文档也有建议本地开发 Pipeline 的使用可以使用什么工具链 pipeline-development-tools. 可以使用命令行工具、Jenkins Open API、IDE 插件等可以去使用. 日常使用 Visual Studio Code 比较多, 所以最终选择了 vscode 的插件 vscode-jenkins-pipeline-linter-connector, 这个插件原理实现上还是通过将 Jenkinsfile 的内容通过 API 提交给 Jenkins 去校验的. 不过插件已经年久失修了, 代码比较久了, 实际的使用上遇到了不少的问题, 例如: Jenkinsfile 带有中文的话校验结果显示容易乱码, 比如这个 Jenkinsfile: 1234567891011pipeline { agent any stages { stage('Hello中文>>>>>') { steps { echo 'Hello Worl中文 } } }} 校验结果返回会有段乱码, 如下: 123Errors encountered validating Jenkinsfile:WorkflowScript: 6: unexpected char: 0xB8 @ line 6, column 36. echo 'Hello World'中æ�� 插件实现依赖的基础库也比较老了, 所以我 fork 了一下原来插件, 做了下代码重构和部分问题的修复 & 优化工作, 主要如下: 修复 Jenkinsfile 中文乱码问题. 可以在不保存 Jenkinsfile 的时候直接进行校验. 文件保存的时候立即自动触发校验. 支持控制什么样的文件名可以进行校验, 相当于一个白名单机制, 可能会有些人会将工作流定义写在另外的文件名下, 比如: workflows.jenkins 等, 所以才有了这个特性. 引入 langchain.js 和 Cloudflare 免费的 Workers AI REST API 配置大模型做 Review. … 插件现在已经同步发布到了 Visual Studio Code 商店和 Open VSX Registry 中, 理论上你可以在 Microsoft Visual Studio Code、code-server、VSCodium 等 vscode 系列 IDE 中使用到它, 链接如下: Microsoft Visual Studio Marketplace: https://marketplace.visualstudio.com/items?itemName=yeshan333.jenkins-pipeline-linter-connector-fork Open VSX Registry: https://marketplace.visualstudio.com/items?itemName=yeshan333.jenkins-pipeline-linter-connector-fork 现在你应该能在插件搜索里搜索到它, 使用 yeshan333.jenkins-pipeline-linter-connector-fork 去搜索安装即可: 配置插件插件的文档里已经给出了几个示例配置, 将配置填入你的 vscode 用户配置 json 文件中即可: 12345{ "jenkins.pipeline.linter.connector.url": "https://jenkins.shan333.cn/pipeline-model-converter/validate", "jenkins.pipeline.linter.connector.user": "jenkins_username", "jenkins.pipeline.linter.connector.pass": "jenkins_password"} 将 url、用户密码替换成你自己的 Jenkins 即可. 当然你也可以在插件配置处直接进行配置: 配置完成之后直接通过命令面板 (Command Pallette) 使用 Validate Jenkins 即可开启 Jenkinsfile 校验: 接下来介绍如何使用 LLM 去帮你评审 Jenkinsfile. 使用 LLM 大模型评审你的 Jenkinsfile这一功能默认是关闭的, 需要通过配置 jenkins.pipeline.linter.connector.llm.enable 去开启, 功能开启之后我们还需要几个填写几个关键配置, 如下: 123456{ "jenkins.pipeline.linter.connector.llm.enable": true, "jenkins.pipeline.linter.connector.llm.baseUrl": "https://api.cloudflare.com/client/v4/accounts/<CF_ACCOUNT_ID>/ai/v1", "jenkins.pipeline.linter.connector.llm.modelName": "@cf/meta/llama-2-7b-chat-fp16", "jenkins.pipeline.linter.connector.llm.apiKey": "<CF_API_TOKEN>",} 其中 baseUrl 和 apiKey 需要我们到 Cloudflare 用户管理后台申请. 插件默认会使用 Cloudflare Workers AI REST API 提供的文本生成模型去评审 review 我们的 Jenkinsfile, 目前它提供免费额度基本够日常使用. Step 1: 你需要先按照 Cloudflare 提供的文档去获取 API 访问的密钥 -> Get started with the Workers AI REST API, 将获取到的 API Token 填入配置 "jenkins.pipeline.linter.connector.llm.apiKey" 中. Step 2: 在上一步, 你在申请的时候也会拿到一个 Account ID, 这个 ACCOUNT ID 用于组装配置 "jenkins.pipeline.linter.connector.llm.baseUrl", 将 "https://api.cloudflare.com/client/v4/accounts/<CF_ACCOUNT_ID>/ai/v1" 的 <CF_ACCOUNT_ID> 替换为你的 Account ID 即可 配置 jenkins.pipeline.linter.connector.llm.modelName 是可选地, 你可以选用 https://developers.cloudflare.com/workers-ai/models/#text-generation 提到的任意一个文本生成模型去做评审. 将上述配置配置完成之后, 通过 vscode 命令面板 (Command Pallette) 使用 Validate Jenkins 开启 Jenkinsfile 校验的同时也会同时向大模型询问评审意见, 大致效果如下:","categories":[{"name":"Jenkins","slug":"Jenkins","permalink":"https://yeshan333.github.io/categories/Jenkins/"}],"tags":[{"name":"Jenkins","slug":"Jenkins","permalink":"https://yeshan333.github.io/tags/Jenkins/"},{"name":"Cloudflare","slug":"Cloudflare","permalink":"https://yeshan333.github.io/tags/Cloudflare/"},{"name":"Workers AI","slug":"Workers-AI","permalink":"https://yeshan333.github.io/tags/Workers-AI/"},{"name":"Langchain","slug":"Langchain","permalink":"https://yeshan333.github.io/tags/Langchain/"},{"name":"LLMs","slug":"LLMs","permalink":"https://yeshan333.github.io/tags/LLMs/"}]},{"title":"etcd 和 MongoDB 的混沌(故障)测试方法","slug":"etcd-and-mongodb-chaos-testing","date":"2024-05-18T15:02:09.000Z","updated":"2024-05-18T15:02:09.000Z","comments":true,"path":"2024/05/18/etcd-and-mongodb-chaos-testing/","permalink":"https://yeshan333.github.io/2024/05/18/etcd-and-mongodb-chaos-testing/","excerpt":"","text":"最近在对一些自建的数据库 driver/client 基础库的健壮性做混沌(故障)测试, 去验证了解业务的故障处理机制和恢复时长. 主要涉及到了 MongoDB 和 etcd 这两个基础组件. 本文会介绍下相关的测试方法. MongoDB 中的故障测试 MongoDB 是比较世界上热门的文档型数据库, 支持 ACID 事务、分布式等特性. 社区上大部分对 MongoDB 进行混沌(故障)测试的文章大多都是外围通过对 monogd 或 mongos 进行做处理进行模拟的. 比如如果想要让 MongoDB 自己触发副本集切换, 可以通过一下这样一段 shell 脚本: 123456# 将副本集主节点进程挂死kill -s STOP <mongodb-primary-pid># 挂死之后, 业务受损, MongoDB 在几秒到十几秒应该会进程主备切换# 切换完成后, 业务能自动将连接切换到新的工作正常的主节点, 无需人工干预, 业务恢复正常# 这里一般验证的是 Mongo Client Driver 的可靠性 上面提到的手段一般是系统层级的, 如果我们只是想要模拟某个 MongoDB command 命令遇到网络问题了, 怎么做?进一步想要进行更细粒度的测试. 其实 MongoDB 在 4.x 以上版本内部已经实现了一套可控的故障点模拟机制 -> failCommand. 在测试环境部署 MongoDB 副本集的时候, 一般可以通过以下方式启动这个特性: 1mongod --setParameter enableTestCommands=1 然后我们可以通过 mongo shell 针对特定的 command 开启故障点, 例如针对一次 find 操作让其返回错误码 2: 1234567db.adminCommand({ configureFailPoint: "failCommand", mode: { "times": 1, }, data: {errorCode: 2, failCommands: ["find"]}}); 这些故障点模拟是可控的, 成本相对于必直接在机器上搞破坏比较低, 也很适合融入持续集成自动化流程. MongoDB 内置的故障点机制还支持了很多的特性, 比如让某个故障概率发生、返回任意 MongoDB 支持的错误码类型等等, 通过该机制, 我们可以很方便的在单元测试和集成测试中验证我们自己实现的 MongoDB Client Driver 的可靠性. 如果想具体知道 MongoDB 支持哪些故障点, 可以详细查看 MongoDB 提供的 specification, 里面有提到针对 MongoDB 每一个特性, driver 可以使用哪些故障点进行测试. MongoDB 官方提供的 go 实现的 dirver 代码仓库中也有不少的例子可以参考 https://github.com/mongodb/mongo-go-driver/blob/345ea9574e28732ca4f9d7d3bb9c103c897a65b8/mongo/with_transactions_test.go#L122. etcd 中的故障测试 etcd 是一个开源的、高可用的分布式键值存储系统, 它主要用于共享配置和服务发现. 之前我们提到了 MongoDB 内置了可控的故障点注入机制方便我们做故障点测试, 那么 etcd 是否也提供了呢? 没错, etcd 官方也提供了内置的可控故障注入手段方便我们围绕 etcd 做故障模拟测试, 不过官方提供的可供部署的二进制分发默认是没有使用故障注入特性的, 区别于 MongoDB 提供了开关, etcd 需要我们手动从源码编译出包含故障注入特性的二进制出来去部署. etcd 官方实现了一个 Go 包 gofail 去做 “可控” 的故障点测试, 可以控制特定故障发生的概率和次数. gofail 可以用于任意 Go 实现的程序中. 原理上通过注释在源代码中通过注释 (// gofail:) 去对可能发生问题的地方埋藏一些故障注入点, 偏于进行测试验证, 例如: 12345if t.backend.hooks != nil { // gofail: var commitBeforePreCommitHook struct{} t.backend.hooks.OnPreCommitUnsafe(t) // gofail: var commitAfterPreCommitHook struct{}} 在使用 go build 构建出二进制之前, 使用 gofail 提供的命令行工具 gofail enable 可以取消这些故障注入相关代码的注释, 并生成故障点相关的代码,这样编译出的二进制可以用于故障场景的细粒度测试. 使用 gofail disable 去注释去除掉生成的故障点相关代码, 再使用 go build 编译出的二进制就可以在生产环境使用. 在执行二进制的时候, 可以通过环境变量 GOFAIL_FAILPOINTS 去唤醒故障点, 如果你的二进制程序是个永不停机的服务, 那么可以通过 GOFAIL_HTTP 环境变量在程序启动的同时, 启动一个 HTTP endpoint 去给外部测试工具唤醒埋藏的故障点. 具体的原理实现可以查看下 gofail 的设计文档 -> design. 值的一提的是 pingcap 重新基于 gofail 重新造了个轮子, 做了不少优化:failpoint 相关代码不应该有任何额外开销;不能影响正常功能逻辑,不能对功能代码有任何侵入;failpoint 代码必须是易读、易写并且能引入编译器检测;最终生成的代码必须具有可读性;生成代码中,功能逻辑代码的行号不能发生变化(便于调试);如果想要了解它的实现原理, 可以查看这篇官方文章: Golang Failpoint 的设计与实现这篇深度剖析的博客也值得一读: 在 Go 中使用 Failpoint 注入故障 接下来我们看看如何在 etcd 中启用这些故障埋点。 编译出可供进行故障测试的 etcdetcd 官方仓库的 Makefile 已经内置了对应的指令帮我们快速编译出包含故障点二进制 etcd server. 编译步骤大致如下: 12345678git clone git@github.com:etcd-io/etcd.gitcd etcd# 激活故障点注释make gofail-enablemake build# 还原代码make gofail-disable 经过如上步骤之后, 编译好的二进制文件直接可以在 bin 目录下可以看到, 让我们启动 etcd 看一下: 12# 开启通过 HTTP 激活故障点的方式GOFAIL_HTTP="127.0.0.1:22381" ./bin/etcd 使用 curl 看下有哪些故障点可以使用: 123456789101112131415161718192021222324252627282930313233343536curl http://127.0.0.1:22381afterCommit=afterStartDBTxn=afterWritebackBuf=applyBeforeOpenSnapshot=beforeApplyOneConfChange=beforeApplyOneEntryNormal=beforeCommit=beforeLookupWhenForwardLeaseTimeToLive=beforeLookupWhenLeaseTimeToLive=beforeSendWatchResponse=beforeStartDBTxn=beforeWritebackBuf=commitAfterPreCommitHook=commitBeforePreCommitHook=compactAfterCommitBatch=compactAfterCommitScheduledCompact=compactAfterSetFinishedCompact=compactBeforeCommitBatch=compactBeforeCommitScheduledCompact=compactBeforeSetFinishedCompact=defragBeforeCopy=defragBeforeRename=raftAfterApplySnap=raftAfterSave=raftAfterSaveSnap=raftAfterWALRelease=raftBeforeAdvance=raftBeforeApplySnap=raftBeforeFollowerSend=raftBeforeLeaderSend=raftBeforeSave=raftBeforeSaveSnap=walAfterSync=walBeforeSync= 知道了故障点, 就可以针对指定故障设置故障类型, 如下: 12345# beforeLookupWhenForwardLeaseTimeToLive 处 sleep 1 秒curl http://127.0.0.1:22381/beforeLookupWhenForwardLeaseTimeToLive -XPUT -d'sleep(10000)'# 查看故障点状态curl http://127.0.0.1:22381/beforeLookupWhenForwardLeaseTimeToLivesleep(1000) 故障点的描述语法见: https://github.com/etcd-io/gofail/blob/master/doc/design.md#syntax 至此, 已经可以利用 etcd 内置的故障点做一些故障模拟测试了, 具体怎么使用这些故障点可以参考下 etcd 官方的集成测试实现 -> etcd Robustness Testing. 通过故障点名称搜索相关代码即可. 除了上述这些 etcd 内置的故障点, etcd 的官方仓库也提供了一份系统级的集成测试例子 -> etcd local-tester, 它模拟了 etcd 集群模式下的节点宕机测试. 好了, 本文的分享, 到此暂时结束啦 ღ( ´・ᴗ・` )~ 小广告插播: 最近维护了可以维护多个 etcd server、etcdctl、etcductl 版本的工具 vfox-etcd, 你也可以用它来在机器上安装多个包含 failpoint 的 etcd 版本进行混沌 (故障模拟) 测试哦~","categories":[{"name":"Chaos","slug":"Chaos","permalink":"https://yeshan333.github.io/categories/Chaos/"}],"tags":[{"name":"Chaos Testing","slug":"Chaos-Testing","permalink":"https://yeshan333.github.io/tags/Chaos-Testing/"},{"name":"etcd","slug":"etcd","permalink":"https://yeshan333.github.io/tags/etcd/"},{"name":"MongoDB","slug":"MongoDB","permalink":"https://yeshan333.github.io/tags/MongoDB/"}]},{"title":"通过 vfox 安装管理多版本 Erlang 和 Elixir","slug":"install-erlang-and-elixir-via-vfox","date":"2024-04-27T15:36:31.000Z","updated":"2024-04-27T15:36:31.000Z","comments":true,"path":"2024/04/27/install-erlang-and-elixir-via-vfox/","permalink":"https://yeshan333.github.io/2024/04/27/install-erlang-and-elixir-via-vfox/","excerpt":"","text":"vfox (version-fox) 是最近比较热门的一个通用版本管理工具,使用 Go 语言进行编写,插件机制使用了 Lua 去实现扩展性. 目前 vfox 已经支持管理大多数主流编程语言的版本,生态还算强大。在这里你可以看到目前 vfox 所支持管理的编程语言版本和工具 -> vfox-Available Plugins Elixir 和 Erlang 社区一直以来都比较流行通过 asdf 去安装和管理多版本环境。asdf 也是一个通用的版本管理工具,生态非常的丰富。 vfox 的版本管理上和 asdf 很像,均通过 .tool-versions 文件去管理项目级和全局的版本信息。这意味着如果你之前使用了 asdf,那么切换到 vfox,不会很困难。因为 vfox 和 asdf 的核心实现有有点不一样,vfox 的执行速度比 asdf 快了将近 5 倍~,官方文档也给出了基准测试结果:version-fox Comparison with asdf-vm 如果你之前使用 asdf 去管理维护多个 Erlang 和 Elixir 的版本,那么 vfox 也是一个不错的选择,值的一试。 本篇文章将会介绍如果通过 vfox 去安装和管理多个 Erlang 和 Elixir 的版本。 安装 vfoxvfox (version-fox) 的跨操作系统支持上很友好,这意味可以 Windows 和 Unix-like 系统上使用它。本篇文章的核心是通过 vfox 去安装和管理多个 Erlang 和 Elixir 语言的版本。因为目前 vfox 的两个管理 Erlang 和 Elixir 版本的插件实现上还没有去支持在 Windows 操作系统下的管理,所以本篇文章的示例环境主要是 Ubuntu 20.04 Linux 环境。让我们开始吧~ 先安装下 vfox (version fox): 123echo "deb [trusted=yes] https://apt.fury.io/versionfox/ /" | sudo tee /etc/apt/sources.list.d/versionfox.listsudo apt-get updatesudo apt-get install vfox 为了能让 vfox 找到已经安装的 Elixir 和 Erlang 版本,需要将 vfox 默认挂载到 shell 中。接下来修改下 shell 的配置 (以 Bash 为例): 1echo 'eval "$(vfox activate bash)"' >> ~/.bashrc 你也可以参考这个官方文档安装 vfox -> https://vfox.lhan.me/guides/quick-start.html。安装好 vfox 之后,我们再安装下插件: 1234# 添加 vfox-erlang 插件vfox add erlang# 添加 vfox-elixir 插件vfox add elixir 接下来我们就可以通过上面安装好的两个 vfox 插件 vfox-erlang 和 vfox-elixir 去安装管理多个 Erlang 和 Elixir 的版本了。 通过 vfox-erlang 插件安装 Erlang/OTP因为 Elixir 依赖于 Erlang,所以在安装 Elixir 之前,我们需要先安装下 Erlang。Erlang 的安装是通过对应版本的源码进行安装的,所以我们需要有对应的编译工具链,这里以 Ubuntu 20.04 为例: 1sudo apt-get -y install build-essential autoconf m4 libncurses5-dev libwxgtk3.0-gtk3-dev libwxgtk-webview3.0-gtk3-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev openjdk-11-jdk 接下来可以安装 Erlang 了。 12345678910111213141516# 通过 vfox search 找到你想要安装的版本❯ vfox search erlangPlease select a version of erlang [type to search]: -> v25.0.4 v24.3.4.16 v24.1.3 v24.0 v24.3 v24.3.2 v25.2 v27.0-rc2 v24.3.4.1Press ↑/↓ to select and press ←/→ to page, and press Enter to confirm# 当然你也可以指定安装一个版本,比如vfox install erlang@26.2.2 理论上,你可以安装任何一个出现在 https://github.com/erlang/otp/releases 的版本。因为是从源码编译安装的, 所以安装过程会花费点时间。当你看到如下信息,就表明安装完成了。 1234compile info..........Install erlang@26.2.2 success! Please use vfox use erlang@26.2.2 to use it. 我们使用 vfox 切换下到刚才安装好的 Erlang/OTP 版本来验证下安装是否成功: 1234567❯ vfox use erlang@26.2.2Now using erlang@26.2.2.❯ erlErlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]Eshell V14.2.2 (press Ctrl+G to abort, type help(). for help)1> 如果能正确唤醒 REPL,那么安装就好啦。接下来开始安装 Elixir 吧 安装 Elixir因为安装 Elixir 也是从对应版本的源码进行编译安装的,Elixir 的编译需要依赖到 Erlang,我们先让当前使用的 shell 能找到刚才安装好的 Erlang。 123456789101112131415# 切换 Erlang 版本❯ vfox use erlang@26.2.2Now using erlang@26.2.2.# 安装 Elixir,将会使用对应的 erlc 编译器> vfox install elixir@1.15.2..................Generated ex_unit app==> logger (compile)Generated logger appGenerated eex app==> iex (compile)Generated iex appInstall elixir@1.15.2 success! Please use vfox use elixir@1.15.2 to use it. 当你看到 Install elixir@1.15.2 success!,也就意味着安装成功了。可以通过 iex 确认下安装彻底成功: 1234567❯ vfox use elixir@1.15.2Now using elixir@1.15.2.❯ iexErlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]Interactive Elixir (1.15.2) - press Ctrl+C to exit (type h() ENTER for help)iex(1)> 如果你想要安装其他版本的 Elixir,请确保当前使用的 Erlang/OTP 版本和 Elixir 版本是兼容的,可以查看这个文档去确认兼容性: 《compatibility-and-deprecations.html#between-elixir-and-erlang-otp》。 设置全局使用版本我们可以使用 vfox use -g xxx 设置默认使用的 Erlang 和 Elixir 版本。 1234567> vfox use -g erlang@26.2.2> vfox use -g elixir@1.15.2# 可以查看 .tool-versions 确认设置是否完成> cat ~/.version-fox/.tool-versions erlang 26.2.2elixir 1.15.2 最后vfox 的两个安装管理 Erlang/OTP 和 Elixir 版本的插件同时也支持在 MacOS Darwin 下管理多个版本。你可以查看这个文档去了解更多信息: https://github.com/version-fox/vfox-elixir?tab=readme-ov-file#install-in-darwin-macos-13. Happy & funny!","categories":[{"name":"vfox","slug":"vfox","permalink":"https://yeshan333.github.io/categories/vfox/"}],"tags":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"},{"name":"Erlang","slug":"Erlang","permalink":"https://yeshan333.github.io/tags/Erlang/"},{"name":"vfox","slug":"vfox","permalink":"https://yeshan333.github.io/tags/vfox/"}]},{"title":"使用 vfox-erlang 安装管理多个 Erlang/OTP 版本","slug":"using-vfox-erlang-to-manage-erlang-version","date":"2024-04-25T23:15:01.000Z","updated":"2024-04-25T23:15:01.000Z","comments":true,"path":"2024/04/25/using-vfox-erlang-to-manage-erlang-version/","permalink":"https://yeshan333.github.io/2024/04/25/using-vfox-erlang-to-manage-erlang-version/","excerpt":"","text":"vfox (version fox) 是一款跨平台、可拓展的通用版本管理器. 支持原生 Windows 以及 Unix-like 系统! 通过它, 可以快速安装和切换开发环境的软件版本. 最近给 vfox 水了几个插件, 其中就有管理多个 Erlang/OTP 版本的, 很喜欢他的插件管理机制. 之前也有使用过类似的工具 asdf, 不过 asdf 之前的使用体验不怎么好 (木有拉踩的意思~, asdf 的生态是非常强大的), vfox 现在支持的插件已经非常之多了, 已经可以管理大多数常见主流语言的版本. vfox 的版本管理工作流大体上是和 asdf 类似的, 不过性能要好一点 (5 倍左右), 毕竟 asdf 核心是 shell 写的. 官方文档也给出了一份基准测试, 参见 《Comparison with asdf-vm》: vfox 和 asdf 一样, 可以通过 .tool-version 配置文件设置全局和项目级使用到的版本, 这意味着如果你从 asdf 切换到 vfox, 相当的方便. vfox-erlang 的使用本篇文章主要介绍怎么使用 vfox-erlang 插件, 在同一台机器上管理多个 Erlang/OTP 的版本. 一般在开发环境拥有多个版本的 Erlang/OTP 供测试比对也是常见的需求. 目前插件的实现上实际的安装过程是通过从源码进行编译安装 Erlang/OTP 的, 所以暂时只支持在 Unix-like 系统 (比如 ubuntu、macos darwin 等) 上安装管理 Erlang/OTP 的版本 (官方其实提供了 exe 安装器在 windows, 还没时间去研究加上去 2333~, 不过在 windows 使用 Erlang 的场景一般也比较少)。 Erlang 是一种编程语言, 用于构建具有高可用性要求的大规模可扩展软实时系统。它的一些用途是电信、银行、电子商务、计算机电话和即时通讯。Erlang 的运行时系统内置了对并发、分布和容错的支持。OTP 是一组 Erlang 库和设计原则, 提供中间件来开发这些系统。它包括自己的分布式数据库、用于连接其他语言的应用程序、调试和发布处理工具。 安装 vfox 和 vfox-erlang 插件在使用 vfox-erlang 管理 Erlang/OTP 版本之前, 请确保你已经在你的机器上安装好了 vfox, 可以参考官方的文档 Quick Start, 本文以 Ubuntu 为例. 12345678910# 安装 vfoxecho "deb [trusted=yes] https://apt.fury.io/versionfox/ /" | sudo tee /etc/apt/sources.list.d/versionfox.listsudo apt-get update -ysudo apt-get install vfox -y# 让 vfox hook 你的 shell, 偏于 vfox 识别使用的 Erlang/OTP 版本echo 'eval "$(vfox activate bash)"' >> ~/.bashrc# 添加 vfox-erlang 插件vfox add erlang 安装使用指定版本 Erlang/OTP由于是是从源码编译安装的 Erlang/OTP, 所以我们需要有对应的构建工具链和依赖软件, 这里以 Ubuntu 20.04 下安装为例: 12# “无脑”安装依赖的软件sudo apt-get -y install build-essential autoconf m4 libncurses5-dev libwxgtk3.0-gtk3-dev libwxgtk-webview3.0-gtk3-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev openjdk-11-jdk 然后我们即可通过 vfox 管理安装多个 Erlang/OTP 版本了。 123456789101112# 可以使用 search 命令查找可供安装的版本❯ vfox search erlangPlease select a version of erlang [type to search]: -> v25.3.2.5 v24.0-rc3 v24.3 v23.3.4.18 v24.0.6 v24.3.2 v25.3 v24.1.4 v26.0.2 12345# 或者直接指定一个版本安装> vfox install erlang@26.2.2...Install erlang@26.2.2 success! Please use vfox use erlang@26.2.2 to use it. 当你看到类似 Install erlang@xxx success! 的信息, 就意味着安装完成了。接下来可以通过 vfox use 命令切换版本, 即可让当前 shell 会话可以使用对应的 Erlang/OTP 版本了. 1vfox use erlang@26.2.2 vfox 提供了三种视角的版本管理方法: shell 会话、项目级、全局, 通过一个 .tool-versions, 可以灵活的为不同的项目目录分配使用不同的 Erlang/OTP 版本, 跟多信息可以查看官方文档的介绍: vfox-Switch runtime. 本篇文章的使用示例主要以 Linux 系统为主, 但是 vfox-erlang 的使用文档上也给出了在 MacOS Darwin 系统下的使用指南 install-in-darwin-macos-13, 并提供了在 Linux 和 MacOS 下持续集成测试供参考: vfox-erlang E2E testing. Happy and funny~","categories":[{"name":"vfox","slug":"vfox","permalink":"https://yeshan333.github.io/categories/vfox/"}],"tags":[{"name":"vfox","slug":"vfox","permalink":"https://yeshan333.github.io/tags/vfox/"},{"name":"Erlang/OTP","slug":"Erlang-OTP","permalink":"https://yeshan333.github.io/tags/Erlang-OTP/"},{"name":"vfox-plugin","slug":"vfox-plugin","permalink":"https://yeshan333.github.io/tags/vfox-plugin/"},{"name":"vfox-erlang","slug":"vfox-erlang","permalink":"https://yeshan333.github.io/tags/vfox-erlang/"}]},{"title":"使用 chezmoi & vscode, 管理你的 dotfiles","slug":"using-chezmoi-to-manage-dotfiles","date":"2024-03-23T16:11:23.000Z","updated":"2024-03-23T16:11:23.000Z","comments":true,"path":"2024/03/23/using-chezmoi-to-manage-dotfiles/","permalink":"https://yeshan333.github.io/2024/03/23/using-chezmoi-to-manage-dotfiles/","excerpt":"","text":"什么是 dotfiles In Unix-like operating systems, any file or folder that starts with a dot character (for example, /home/user/.config), commonly called a dot file or dotfile.任何以 . 开头去命名的文件或者目录都可以称为 dotfile, 在 Unix-like 系统一般用的比较多, 但现在 dotfile 一般用于管理应用/软件的配置, 所以 Windows 平台上也可以看到 dotfile 的身影. 什么是 chezmoichezmoi 是使用 Go 编写的跨平台 dotfiles 管理工具, 使用同一的 Git 仓库进行配置同步, 可以很方便的帮助我们在多个开发环境共用一套配置, 免去一些同一工具链需要手工重新在多个机器配置的工作量. 开源社区流行的 dotfiles 管理工具很多, 我们可以在这个网站上可以看到: https://dotfiles.github.io/utilities/. 本篇文章主要介绍使用 chezmoi 进行 dotfiles 管理的一些基本流程, 还会介绍如何使用 vscode 配置 chezmoi 让配置管理体验更好的一些小技巧. chezmoi 管理 dotfile 工作流123456789# 在使用 chezmoi 时, 需要先安装 chezmoi, 可以参考: https://www.chezmoi.io/installsh -c "$(curl -fsLS get.chezmoi.io)"# 安装完后初始化 chezmoi 的工作目录chezmoi init# 使用 chezmoi cd 可以直接切换到工作目录chezmoi cd # 然后使用 git 将工作目录和代码仓库关联起来即可git initgit remote add origin <your-git-repo> 官方文档也给出了使用 chezmoi 管理 dotfile 的工作流大概是怎么样的, 这里稍作解释: 我们以 .bashrc 文件的管理为例子: 1234567891011121314# Step 1、将 .bashrc 文件纳入 chezmoi 管控范围# chezmoi 会将该文件拷贝到 chezmoi 工作目录下, 会重命名为 dot_bashrc, 使用 dot 替换 .chezmoi add .bashrc# .bashrc 文件纳入管控之后, 就不应该在修改配置的时候编辑 .bashrc 文件了, 而是编辑 chezmoi 工作目录下的 dot_bashrc 文件# 可以切换去工作目录查看下chezmoi cdls -al# Step 2、配置的修改我们可以使用如下命令去修改, chezmoi 会使用文本编辑器打开对应的 dot_bashrc 文件chezmoi edit ~/.bashrc# Step 3、配置修改后是还没有应用到 .bashrc 文件的, diff 命令可以用来查看修改情况chezmoi diff ~/.bashrc# Step 4、想应用修改后的配置可以使用 apply 命令chezmoi apply ~/.bashrc# 至此已经基本完成一次 dotfile 的管理, 但为了想要在其他机器也使用这此改动, 是需要使用 git 做一次配置同步的 chezmoi 使用的一些小技巧与配置建议1、替换 chezmoi edit 使用的默认编辑器为 vscodechezmoi edit 默认根据 $VISUAL 或 $EDITOR 环境变量决定使用什么编辑器打开文件, 我们可以修改 chezmoi 的配置文件改变 chezmoi 文件的行为, 配置文件一般在 ~/.config/chezmoi 目录下, 参考配置如下: 12345# 控制 chezmoi edit 命令使用的编辑器, code --wait 会确保文件关闭再继续# 配置文件在: ~/.config/chezmoi/chezmoi.toml[edit] command = "code" args = ["--wait"] tips: chezmoi apply 应用修改后的配置时, 会根据 chezmoi 工作目录的层级去覆盖 HOME 目录对应的文件 2、替换 chezmoi diff 使用的 diff 工具为 vscode万物皆可 vscode, 如果你想使用 vscode 的 dif 能力怎么办, 这里直接给出 chemoi 的参考配置: 1234567# https://github.com/twpayne/chezmoi/discussions/2424[diff]command = "code"args = ["--wait", "--diff", "{{ .Destination }}", "{{ .Target }}"][merge]command = "bash" 3、敏感数据存储如果你想用 chezmoi 管理你的密钥(例如: id_rsa ssh 密钥),同时又想把你的 dotfiles 配置在 GitHub 共享出来,chezmoi 自带了敏感数据存储的方案,可以使用 GPG、AGE 等对配置文件进行加密, 参考: https://www.chezmoi.io/user-guide/encryption/","categories":[{"name":"dotfiles","slug":"dotfiles","permalink":"https://yeshan333.github.io/categories/dotfiles/"}],"tags":[{"name":"chezmoi","slug":"chezmoi","permalink":"https://yeshan333.github.io/tags/chezmoi/"},{"name":"dotfiles","slug":"dotfiles","permalink":"https://yeshan333.github.io/tags/dotfiles/"}]},{"title":"使用 WXT 开发浏览器插件(上手使用篇)","slug":"develop-web-extension-with-wxt","date":"2024-03-15T07:47:53.000Z","updated":"2024-03-15T07:47:53.000Z","comments":true,"path":"2024/03/15/develop-web-extension-with-wxt/","permalink":"https://yeshan333.github.io/2024/03/15/develop-web-extension-with-wxt/","excerpt":"","text":"WXT (https://wxt.dev/), Next-gen Web Extension Framework. 号称下一代浏览器开发框架. 可一套代码 (code base) 开发支持多个浏览器的插件. 上路~WXT 提供了脚手架可以方便我们快速进行开发,但是我们得先安装好环境依赖,这里我们使用 npm, 所以需要安装下 node,可以参考 https://nodejs.org/en. 123456789# 直接基于脚手架创建项目npx wxt@latest init yeshan-bowser-extensoincd yeshan-bowser-extensoin# 安装依赖npm install --registry=https://registry.npmmirror.com# 开始调试插件npm run dev QAQ - WSL2 下开发遇到的问题使用 WSL2 进行开发的时候,npm run dev 在 wsl 是没办法自动打开浏览器的,会吐出如下问题: 1WARN Cannot open browser when using WSL. Load ".output/chrome-mv3" as an unpacked extension manually 大概看了下 wxt 的实现,它是通过 web-ext 跟进指定的浏览器的 bin 文件(默认为 chromium)启动浏览器装载开发好的插件. 曾经通过文章 chromium-in-wsl2 提到的办法直接在 wsl2 安装了 chromium,还是没能解决此问题😂😣. 翻了下官方仓库的 issue,有关联问题 https://github.com/wxt-dev/wxt/issues/55, 本质上是 web-ext 的 BUG issuecomment-1837565780,截至 2024/3/15 还未修复. 解决方法没办法了,如果还想继续用 wsl 做开发,只能手动加载插件了,在 windows 上打开 chrome 后,地址栏输入 chrome://extensions/ 转到插件管理页 (记得开启开发者模式) -> 加载已解压的扩展程序: 我们要加载的插件目录是在 wsl 中的(即: .output/chrome-mv3/),好在 Window 和 wsl2 的文件文件系统是打通的,可以相互访问,我们可以使用 wslutils 提供的工具获取在 Windows 下可以访问的路径 123# 获取 windows 文件管理器可以访问的地址❯ wslpath -w .output/chrome-mv3/\\\\wsl.localhost\\Ubuntu-20.04\\home\\yeshan333\\workspace\\github\\yeshan-bowser-extensoin\\.output\\chrome-mv3 Done , 搞定咯,可以愉快码代码了","categories":[{"name":"浏览器插件开发","slug":"浏览器插件开发","permalink":"https://yeshan333.github.io/categories/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"}],"tags":[{"name":"extension","slug":"extension","permalink":"https://yeshan333.github.io/tags/extension/"},{"name":"WXT","slug":"WXT","permalink":"https://yeshan333.github.io/tags/WXT/"}]},{"title":"Windows PowerToys:屏幕标尺,测量屏幕上任何内容的像素","slug":"markup-screen","date":"2024-03-13T03:23:55.000Z","updated":"2024-03-13T03:23:55.000Z","comments":true,"path":"2024/03/13/markup-screen/","permalink":"https://yeshan333.github.io/2024/03/13/markup-screen/","excerpt":"","text":"如果你是一名 web 开发者或者设计师,Windows 自带的 PowerToys 工具集提供了一个很不错的工具 -> 屏幕标尺。通过屏幕标尺,我们可以很方便的测量屏幕上任何内容的像素,无需再通过某种方式中转到专业软件进行编辑: 使用文档可以查看:https://learn.microsoft.com/zh-cn/windows/powertoys/screen-rulerhttps://learn.microsoft.com/zh-cn/windows/powertoys/screen-ruler。 如果你使用 MacOS,那个 xScope 是个不错的免费替代品。","categories":[{"name":"设计工具","slug":"设计工具","permalink":"https://yeshan333.github.io/categories/%E8%AE%BE%E8%AE%A1%E5%B7%A5%E5%85%B7/"}],"tags":[{"name":"设计工具","slug":"设计工具","permalink":"https://yeshan333.github.io/tags/%E8%AE%BE%E8%AE%A1%E5%B7%A5%E5%85%B7/"}]},{"title":"Awesome Technology Weekly Zh-Hans - 中文技术月/周/日刊一览","slug":"awesome-tech-weekly-zh","date":"2024-03-04T11:14:47.000Z","updated":"2024-03-04T11:14:47.000Z","comments":true,"path":"2024/03/04/awesome-tech-weekly-zh/","permalink":"https://yeshan333.github.io/2024/03/04/awesome-tech-weekly-zh/","excerpt":"","text":"作为开发者,我们每天都需要吸收大量的信息补充我们的知识体系. Awesome Technology Weekly Zh-Hans 项目收集了中文技术社区各个领域的高质量的中文技术月/周/日刊,定时刷新获取最新一期中文技术月/周/日刊进行展示. 访问网站开始关注吧~:https://shansan.top/awesome-tech-weekly-zh. Github 项目地址 -> https://github.com/yeshan333/awesome-tech-weekly-zh.","categories":[{"name":"Tech-Weekly","slug":"Tech-Weekly","permalink":"https://yeshan333.github.io/categories/Tech-Weekly/"}],"tags":[{"name":"Tech-Weekly","slug":"Tech-Weekly","permalink":"https://yeshan333.github.io/tags/Tech-Weekly/"}]},{"title":"使用 go-ycsb 对 etcd 进行基准 (benchmark) 性能测试","slug":"using-ycsb-benchmark-etcd","date":"2024-02-29T14:16:51.000Z","updated":"2024-02-29T14:16:51.000Z","comments":true,"path":"2024/02/29/using-ycsb-benchmark-etcd/","permalink":"https://yeshan333.github.io/2024/02/29/using-ycsb-benchmark-etcd/","excerpt":"","text":"最近在对一些存储组件做性能测试,主要使用到了 YCSB,💧篇文章记录下。 什么是 YCSBYCSB,全称为“Yahoo!Cloud Serving Benchmark”,是雅虎开发的用来对云服务进行基准 (benchmark) 性能测试的工具。可以用来对多种 NoSQL 数据库,如 MongoDB、Redis 等进行性能测试。官方内置了丰富的性能测试场景 (称之为: workload),压测场景可以通过文件进行配置,便于压测场景的复现重用。 go-ycsb雅虎的 YCSB 是 Java 语言实现的,且没有对 etcd 内置的支持,pingcap 使用 Go 仿照 Java 版本的 YCSB 实现了 go-ycsb,工作机制大体类似. 且支持的数据库类型更加丰富,其中就有 etcd. 本文主要介绍使用 go-ycsb 基于 etcd 官方提供的性能场景场景 -> Benchmarking etcd v3,做一下基准性能测试。 性能测试一般有三个主要阶段: 1数据准备(load phase) -> 压测执行(load run phase) -> 结果分析(load analysis phase) go-ycsb 使用上可覆盖前两个阶段,对应如下: 1、数据准备(load phase): ./bin/go-ycsb load etcd -P workloads/workloada 2、压测执行(load run phase): ./bin/go-ycsb run etcd -P workloads/workloada 这里针对 etcd 进行数据准备和压测执行. 两个阶段都依赖到了一个负载控制的配置文件 workloada, 接下来让我们看看它. workload 负载配置介绍在开始进行性能测试之前,我们对 go-ycsb 的 workload 负载配置简单介绍一下,以 go-ycsb 代码仓库提供的 workloads/workload_template 文件为例子: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798# 主要支持的配置项见: https://github.com/pingcap/go-ycsb/blob/master/pkg/prop/prop.go# 负责控制性能测试压力的核心实现# 这里可以指定为我们自己实现的压力控制器, 不过 ycsb 内置的 core 一般情况下够用了# 见:https://github.com/pingcap/go-ycsb/blob/f9c3dce045990bc03dac5092be2b00bef386b7c6/cmd/go-ycsb/main.go#L129workload=core# 指定了数据库中存在的数据条目数量# 在数据准备阶段 (load phase) 会据此创建指定条目的数据# 压测执行时 (load run phase) 可操作的数据条目总数recordcount=1000000# 压测执行阶段 (load run phase) 执行的数据库操作总数, 到达这个数量后一般压测即会停止执行operationcount=3000000# 执行数据库操作使用的线程数量threadcount=500# 控制目标吞吐量 OPStarget=1000# 插入操作总数, 如果与 recordcount 不一致, 会根据 insertstart 指定的位置开始插入数据#insertcount=# 第一次插入操作的位置偏移量insertstart=0# 一条数据库记录存在的字段数量# 在数据准备阶段 (load phase) 会据此创建每一条数据库数据fieldcount=10# 控制每个字段的大小 (单位: Byte 字节)fieldlength=100# 用于控制压测执行时, 读取操作是否会读取所有字段readallfields=true# 压测执行时, 控制数据库更新操作更新数据库记录时是否会更新所有字段writeallfields=false# The distribution used to choose the length of a fieldfieldlengthdistribution=constant#fieldlengthdistribution=uniform#fieldlengthdistribution=zipfian# 压测执行时, 读操作占总操作数 (operationcount) 的比例readproportion=0.95# 压测执行时, 写更新操作占总操作数 (operationcount) 的比例updateproportion=0.05# 压测执行时, 插入新数据操作占总操作数 (operationcount) 的比例insertproportion=0# 压测执行时, 先读取再写入操作占总操作数 (operationcount) 的比例readmodifywriteproportion=0# 扫描操作占总操作数 (operationcount) 的比例scanproportion=0# 每一次扫描操作, 扫描的记录总数maxscanlength=1000# 控制扫描操作的策略, 即每一次扫描操作的记录数策略# uniform:表示每次扫描的记录数是随机的# zipfian:根据 Zipfian 分布来选择记录数. 互联网常说的 80/20 原则, 也就是 20% 的 key, 会占有 80% 的访问量;scanlengthdistribution=uniform#scanlengthdistribution=zipfian# 控制数据是否是顺序插入的insertorder=hashed#insertorder=ordered# 数据库操作的策略# uniform:随机选择一个记录进行操作;# sequential:按顺序选择记录操作;# zipfian:二八原则;# latest:和 Zipfian 类似,但是倾向于访问新数据明显多于老数据;# hotspot:热点分布访问;# exponential:指数分布访问;requestdistribution=zipfian# 数据准备阶段,hotspot 热点分布策略下数据的占比hotspotdatafraction=0.2# 访问热点数据的数据库操作百分比hotspotopnfraction=0.8# 最大的执行时间 (单位为秒). 当操作数达到规定值或者执行时间达到规定最大值时基准测试会停止#maxexecutiontime=# 数据准备和压测执行阶段被操作的数据库表名称table=usertable# 控制压测结果的展现形式, 见: https://github.com/pingcap/go-ycsb/blob/fe11c4783b57703465ec7d36fcc4268979001d1a/pkg/measurement/measurement.go#L84measurementtype=histogram#measurementtype=csv#measurementtype=raw workload 负载文件支持的配置项以 pkg/prop/prop.go 声明的为准。 知道了 go-ycsb 的 workload 怎么配置,接下来我们开始使用它模拟下 etcd 官方的基准测试场景吧。 Benchmarking etcd v3 etcd 基准性能测试我们需要先准备下测试环境,并获取 go-ycsb 负载工具。 环境准备etcd 直接使用 docker 起就好,这里我们使用 docker-compose, 编排文件如下: 12345678910version: '3.0'services: etcd: image: 'bitnami/etcd:latest' environment: - ALLOW_NONE_AUTHENTICATION=yes ports: - 2379:2379 - 2380:2380 go-ycsb 可以直接从项目的 README 获取下载方式,或者我们基于源码构建出来即可. 1234567# 从源码构建,需要安装 Gogit clone https://github.com/pingcap/go-ycsb.gitcd go-ycsbmake# give it a try./bin/go-ycsb --help 性能测试好了,我们可以开始对 etcd 进行性能测试了,本地我们主要模拟 Benchmarking etcd v3 中的 reading one single key 场景. go-ycsb 的 workload 配置如下: 12345678910111213141516171819202122232425262728293031# scene ref: https://etcd.io/docs/v3.5/benchmarks/etcd-3-demo-benchmarks/#reading-one-single-key# etcd 官方给的场景 reading one single key# 单条 key-value 数据recordcount=1# benchmark 总共的操作次数operationcount=20000workload=core; threadcount=1# 控制 OPS 为 2000; target=2000fieldcount=1fieldlength=200# 控制 etcd 的 key 大小在 256 字节keyprefix=__3MKdVjJjpfz0tzfHtL4ycTztGas4lWVLJIlVNT8HjtWf6Picj3WYC3KE76nVNkdnvCv1gMiMO7PZUUkmlBODEkJDZTVqtpQbqJ5pNUnz3oEuNoieOTpvrvAVTgJ7myi3Z0ns5Y3TYk05gzmmPINKsP3zcpN1hY5eITitMz8SSxNGv0KKHDKhH370U9QOLhMI4bsClkSbvCWgQ98LiLIhfZukqlFVZPp__readallfields=truewriteallfields=true# 全部为读操作readproportion=1updateproportion=0scanproportion=0insertproportion=0dataintegrity=false# 顺序访问requestdistribution=sequential 上述 workload 配置可在这个仓库中找到: https://github.com/yeshan333/benchmark-etcd-with-go-ycsb. 接下来使用 go-ycsb 准备压测数据: 1./bin/go-ycsb load etcd -P workloads/etcd_offcial_workload 压测执行: 1./bin/go-ycsb load etcd -P workloads/etcd_offcial_workload 执行结果大致如下: 12345678910111213141516171819202122232425-> % ./bin/go-ycsb run etcd -P workloads/etcd_offcial_workloadUsing request distribution 'sequential' a keyrange of [0 0]***************** properties *****************"command"="run""scanproportion"="0""dotransactions"="true""operationcount"="20000""keyprefix"="__3MKdVjJjpfz0tzfHtL4ycTztGas4lWVLJIlVNT8HjtWf6Picj3WYC3KE76nVNkdnvCv1gMiMO7PZUUkmlBODEkJDZTVqtpQbqJ5pNUnz3oEuNoieOTpvrvAVTgJ7myi3Z0ns5Y3TYk05gzmmPINKsP3zcpN1hY5eITitMz8SSxNGv0KKHDKhH370U9QOLhMI4bsClkSbvCWgQ98LiLIhfZukqlFVZPp__"";"="target=2000""requestdistribution"="sequential""workload"="core""fieldlength"="200""readproportion"="1""recordcount"="1""readallfields"="true""insertproportion"="0""fieldcount"="1""writeallfields"="true""dataintegrity"="false""updateproportion"="0"********************************************************************************************Run finished, takes 9.134419329sREAD - Takes(s): 9.1, Count: 20000, OPS: 2190.0, Avg(us): 451, Min(us): 220, Max(us): 2453503, 50th(us): 322, 90th(us): 379, 95th(us): 396, 99th(us): 448, 99.9th(us): 1351, 99.99th(us): 1748TOTAL - Takes(s): 9.1, Count: 20000, OPS: 2189.9, Avg(us): 451, Min(us): 220, Max(us): 2453503, 50th(us): 322, 90th(us): 379, 95th(us): 396, 99th(us): 448, 99.9th(us): 1351, 99.99th(us): 1748 可以同一场景下看到 90 分位的 RTT 与 etcd 官方的压测结果相差不大. 上述执行结果由 github actions 跑出来,具体执行过程可观看 yeshan333/benchmark-etcd-with-go-ycsb/actions/runs/8091287653/job/22110155088. 参考 探究Go-YCSB做数据库基准测试 YCSB wiki - Running a Workload 中译版","categories":[{"name":"go-ycsb","slug":"go-ycsb","permalink":"https://yeshan333.github.io/categories/go-ycsb/"}],"tags":[{"name":"etcd","slug":"etcd","permalink":"https://yeshan333.github.io/tags/etcd/"},{"name":"Go","slug":"Go","permalink":"https://yeshan333.github.io/tags/Go/"},{"name":"YCSB","slug":"YCSB","permalink":"https://yeshan333.github.io/tags/YCSB/"},{"name":"go-ycsb","slug":"go-ycsb","permalink":"https://yeshan333.github.io/tags/go-ycsb/"},{"name":"benchmark","slug":"benchmark","permalink":"https://yeshan333.github.io/tags/benchmark/"}]},{"title":"使用 GitHub Codespaces 加速 Elixir 开发环境工作速度","slug":"elixir-github-codespace-dev","date":"2024-02-19T16:29:08.000Z","updated":"2024-02-19T19:29:08.000Z","comments":true,"path":"2024/02/19/elixir-github-codespace-dev/","permalink":"https://yeshan333.github.io/2024/02/19/elixir-github-codespace-dev/","excerpt":"","text":"前言使用 Elixir 开发点小玩意的时候,面对经常需要走外网下载依赖 (Elixir 的镜像站 UPYUN 使用有时候也经常抽风) 的时候,为了避免需要不断的进行网络代理配置,有想到之前经常使用 GitHub Codespaces 来在浏览器里面通过云环境来写博客文章,也可以做点开发: 第一次连接一般会看到:👋 Welcome to Codespaces! You are on our default image. It includes runtimes and tools for Python, Node.js, Docker, and more. See the full list here: https://aka.ms/ghcs-default-image Want to use a custom image instead? Learn more here: https://aka.ms/configure-codespace 🔍 To explore VS Code to its fullest, search using the Command Palette (Cmd/Ctrl + Shift + P or F1). 📝 Edit away, run your app as usual, and we’ll automatically make it available for you to access. 使用 GitHub Codespaces 甚至也能直接提交代码到 GitHub 仓库之中. 通过 vscode 插件 GitHub Codespaces,能通过本地 IDE 连接云端的环境进行开发. GitHub 提供了免费使用的额度,足够白嫖了🐏. 如果有将 vscode 的配置同步到 GitHub,也可以在一定程度复用本地 IDE 的配置. 通过 https://github.com/codespaces/new 我们能配置 GitHub 使用的环境规格和部署地区: 加速 Elixir 开发环境Elixir 应用构建拉依赖经常需要走外网,但 GitHub 默认创建的 Codespaces 环境默认一般都是 js 的开发环境 Dockerfile,并没有 Elixir 环境,需要我们自己单独配置一手,好在提供了 devcontainer 的形式供我们自定义自己的基础开发环境,我们只需要提供配置文件就好, 我们需要做的如下: 1、GitHub 仓库创建 .devcontainer 目录; 2、.devcontainer 下的 devcontainer.json 文件声明开发环境配置; 示范仓库如: https://github.com/yeshan333/erlang_elixir_asdf_ubuntu_container/tree/main/.devcontainer 123456789{ "image": "ghcr.io/yeshan333/erlang_elixir_asdf_ubuntu_container:latest", "customizations": { "vscode": { "extensions": ["jakebecker.elixir-ls"] } }, "postCreateCommand": "git config --global core.fileMode false"} 通过 image 字段,我们直接声明了 GitHub Codespaces 使用的 Docker 镜像,extensions 指定了要启用哪些 vscode 插件,postCreateCommand 制定了环境起来之后要跑的 shell 命令. 甚至于也可以指定我们自己写的 Dockerfile 来启动 GitHub Codespaces 环境,可参考:https://github.com/devcontainers/images/blob/main/src/go/.devcontainer/devcontainer.json. 基于以上,我们可以通过 https://github.com/codespaces/new 指定海外节点进行 GitHub Codespaces 创建即刻. 参考 create-dev-container GitHub Codespaces","categories":[{"name":"Github Codespaces","slug":"Github-Codespaces","permalink":"https://yeshan333.github.io/categories/Github-Codespaces/"}],"tags":[{"name":"Elixir, Github Codespaces","slug":"Elixir-Github-Codespaces","permalink":"https://yeshan333.github.io/tags/Elixir-Github-Codespaces/"}]},{"title":"乐理通识","slug":"become-a-romantic-muscian","date":"2024-02-07T18:40:24.000Z","updated":"2024-02-07T18:40:24.000Z","comments":true,"path":"2024/02/07/become-a-romantic-muscian/","permalink":"https://yeshan333.github.io/2024/02/07/become-a-romantic-muscian/","excerpt":"","text":"2023 年搞了台雅马哈 61 键的电子琴,顺手看了下啊 B 的上的课程 《零基础自学音乐学乐理合集-第一季》,这里是部分笔记(给博客加点不一样的东西👀)。 简谱各部分一览 C 表示音名 竖线为小节线 音名 完整钢琴键盘 88 键 9个组,一组 7 个白键,5 个黑键位 键位表示,音名对应的键位 1=C 的意思即简谱中 1 对应的键位,代表 1 从哪个键出发,1 的位置一旦确定,234567的位置,也跟着确定 1=C 到底是哪个 C对应钢琴的键即为 C4 的 C 61 键的电子琴是从大字组开始的 1=D对应的情况 C#-C升;Db-D降 全音与半音 全音与半音表示两个音的距离 C 到 C# 的距离即为一个半音距离 E 到 F 的距离为一个半音 C 到 D 为一个全音 从全音半音看 12345671 的规律 正因为满足了-全全半全全全半,才真正听出 do,re,me,fa,so,la,si,do 的味道 调式 调式简单来说即为一串音,按照一定的规则排列起来 (自然)大调 1=C 即为 C 大调 黑键开始的自然大调与白键开始对应的关系 音阶 1=C 的主音即为 C 按照-全全半全全全半的规律构造音阶 音符与节拍 竖线为小节线 节拍四拍子 拍子为时间单位, 图中的小方块仅表示一拍子,不表示四分音符。 四分音符为一拍,2 拍为一小节简谱例子: 传说中的动次打次律动 附点与休止符附点的意义 简谱打拍子练习唱四二拍,四分音符为一拍时,V表示一拍仅四分音符情况 有八分音符时 有十六分音符时 群魔乱舞 附点 唱八分音符的拍子 五线谱 多声部处理,一次发出多个声 谱号 用于确定要弹哪个音,大致范围 高音谱号 - 字母 g 的变体,小字一组的 g 从第二条线开始画,第二条线表示小字一组的 $ g^1 $ 低音谱号-F,小字组的 F 中音谱号-两个反着的 C,确定中央C,即小字一组的 C 次中音谱号第四线表示中央 C 度 度:一个音名到另一个音名要经过的音名个数 两个相邻组同音名即为一个 8 度 八度与十五度 通过八度(8va)与十五度标记,快速找到键位 音符 音高看符头,外观确认音符时间(几拍) 另一种写法,为了美观 附点音符 休止符 音值组合法-符尾连成一起,组成一拍,方便区一拍与另一拍,方便看谱 有一拍一拍的感觉,划分成了一个个音群 大于一拍的,就不连了 四分音符为一拍的音程组合法 八分音符为一拍的组合法,会将可以组成一小节的音符连在一起 调号 :::info五线谱中用调号提示哪些音需要升降,不用在谱中再标记,上图,对应下图::: 快速识别五线谱调号技巧 一、C 大调与 F 大调 二、升号 # 调 三、降号 b 掉 一拍子具体多少秒? 下图: 一个四分音符 1 秒 右边数字越大一般越快 下面的谱子大概在 33 秒内弹完 重(chong)升 X 与重降 bb 度 - 音程 度又称音程,即两个音之间的距离 度与升降号无关 音数、大二度、小二度 音数:相邻两个键的音数为 0.5,键包括黑键 同度数,近一点的为小度 纯八度 C1 - C1 为纯一度,音数为 0 自然音程 & 变化音程 自然音程:CDEFGAB 七个白键可以组成的所有音程 变化音程:自然音程外的音程 协和与不协和音程 和弦 和音:两个音 和弦:三个音及以上构成 常用和弦三和弦:::info三个音,三度叠置构建::: 三和弦转位:::warning 第一转位:根音提高一个八度,三音变为低音 第二转位:在第一转位基础上,三音提高八度 命名:根音与三音的距离 ,低音与三音的距离::: 七和弦:::info由四个音组合构建::: 七和弦命名(下左图): 七和弦转位","categories":[{"name":"music","slug":"music","permalink":"https://yeshan333.github.io/categories/music/"}],"tags":[{"name":"music","slug":"music","permalink":"https://yeshan333.github.io/tags/music/"}]},{"title":"Elixir 依赖 (deps) 调试的小技巧","slug":"elixir-deps-debug-skills","date":"2023-08-12T16:15:40.000Z","updated":"2023-08-12T16:15:40.000Z","comments":true,"path":"2023/08/12/elixir-deps-debug-skills/","permalink":"https://yeshan333.github.io/2023/08/12/elixir-deps-debug-skills/","excerpt":"","text":"许久未更博客,“微有所感”,小更一篇。 最近使用 Elixir 有点多, 经常需要观察一些依赖 (Deps) 的实现, 比如想加个日志打印点 IO.inspect 啥的观察下某个变量,才能更好的理解某个 Elixir 的依赖。这里介绍下一些调试的方式: 这里以 yeshan333/ex_integration_coveralls 为例子. 我们先 clone 项目到本地: 1234git clone git@github.com:yeshan333/ex_integration_coveralls.gitcd ex_integration_coveralls# 拉一下依赖mix deps.get 比如, 我们想看一下代码扫描的依赖 credo 这个扫描规则 Credo.Check.Design.TagTODO 的实现大概是怎么样的. 1、mix deps.compile找到它的实现 deps/credo/lib/credo/check/design/tag_todo.ex, 我们想要观察下变量 issue_meta 实际是怎么样的, IO.inspect 一下. 123456789101112@doc false@impl truedef run(%SourceFile{} = source_file, params) do issue_meta = IssueMeta.for(source_file, params) include_doc? = Params.get(params, :include_doc, __MODULE__) IO.inspect(issue_meta, label: "观察下 issue_meta 放的什么") source_file |> TagHelper.tags(@tag_name, include_doc?) |> Enum.map(&issue_for(issue_meta, &1))end 好了,接下来我们重编译一下 credo 模块即可: 123❯ mix deps.compile credo # 重编译下 credo==> credoCompiling 1 file (.ex) 调用下 credo 即可观察到我们埋下的变量打印点信息: 1mix credo 这样每次添加依赖观察点之后, 我们只需要 recompile 下依赖即可. 123# 如果想废弃掉我们对依赖的修改,只需要重新拉去依赖即可mix deps.clean credomix deps.get 2、mix.exs 使用 :path 引用依赖上面的方法经常需要手动重新编译指定的依赖, 这里还有个方式可以在我们使用任意 Mix Tasks 的时候,依赖都会自动重新编译, 我们只需要编译 mix.exs 将依赖指定为本地即可, 我们使用 path 指定依赖来源: 1{:credo, "~> 1.6", only: [:dev, :test], runtime: false, path: "deps/credo"},","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"},{"name":"Deps","slug":"Deps","permalink":"https://yeshan333.github.io/tags/Deps/"},{"name":"Mix","slug":"Mix","permalink":"https://yeshan333.github.io/tags/Mix/"}]},{"title":"(译) Server-Sent Events: the alternative to WebSockets you should be using","slug":"sse-websocket","date":"2023-03-11T14:26:29.000Z","updated":"2023-03-11T14:26:29.000Z","comments":true,"path":"2023/03/11/sse-websocket/","permalink":"https://yeshan333.github.io/2023/03/11/sse-websocket/","excerpt":"","text":"原文地址: https://germano.dev/sse-websockets/作者: Germano Gabbianelli 当开发实时 web 应用时,WebSockets 可能是我们首先想到的。然而,Server Sent Events (SSE) 是通常会是一种更简单的替代方案。 1. 序言最近我对实现实时 Web 应用程序的一些最佳方式很感兴趣。也就是一个应用程序包含一个或多个组件,这些组件会根据某些外部事件自动实时更新。这种应用程序的最常见例子是消息服务,我们希望每条消息都能立即广播到所有已经连接的人,而不需要进行任何的用户交互。 经过一些研究,我偶然发现了 Martin Chaov 的一个精彩分享,其比较了 Server Sent Events、WebSockets 和 Long Polling 几个技术的优劣。这个演讲也有篇对应的博客文章来辅助阅读 Using SSE Instead Of WebSockets For Unidirectional Data Flow Over HTTP/2,内容有趣而且非常有启发性。我真的很推荐大家去看一下。然而,它是 2018 年的内容,一些细节可能已经发生了改变,因此我决定写下这篇文章。 2. WebSockets?WebSockets 可以在浏览器和服务器之间创建 双向低延迟 的通信通道。 这使得它在某些场景中非常适用:比如双向通信的多人游戏,即浏览器和服务器都会一直在通道上发送消息,需要将这些消息以较低延迟进行传递。 在一款第一人称射击游戏中,浏览器可以持续地传输玩家的位置,同时从服务器接收所有其他玩家位置的更新。此外,我们肯定希望这些消息能够以尽可能花费少的开销进行传递,以避免游戏迟缓感,提升用户体验。 这与传统的 HTTP 请求-响应模型正好相反,其中浏览器始终是发起通信的一方,每个消息都具有显著的开销,因为要建立 TCP 连接和传输 HTTP 头部信息。 然而,许多应用程序的实现不需要这么严格的要求。即使在实时应用程序中,数据流也通常是不对称的:服务器发送了大部分的消息,而客户端大多只是负责监听,并且只是偶尔发送一些更新。例如,在实时的聊天应用程序中,用户可能会连接到许多聊天房间,每个房间都有几十个或几百个参与者。因此,接收到的消息数量远远超过发送的消息数量。 3. WebSockets 的问题在于哪里双向的通信通道和低延迟是非常好的功能特性。那么,我们为什么还要继续寻找其他解决方案呢? WebSockets 有一个主要缺点:它们不完全基于 HTTP 工作。它们需要自己的 TCP 连接。它们只需要使用 HTTP 建立连接,然后将其升级为一个独立的 TCP 连接,在其上可以使用 WebSocket 协议。 这可能看起来不是很重要,但这意味着 WebSockets 不能从任何已有的 HTTP 特性中受益。即: 不支持压缩 不支持 HTTP/2 的多路复用 可能存在代理问题 无跨站点劫持保护 至少,在 WebSocket 协议首次发布时是这种情况。现在,有一些补充标准试图改善这种情况。让我们更详细地了解当前的情况。 注意:如果您不关心细节,请随意跳过本节其余部分,直接转到 Server-Sent Events 或 demo 部分。 3.1 压缩 (Compression)在标准的连接上,每个浏览器都支持 HTTP 压缩技术,在服务器端启用也非常容易,只需在所选择的反向代理中开启切换一下开关。但是,对于使用 WebSockets 的情况这更加复杂,因为没有请求和响应,需要压缩各个独立的 WebSocket 帧 (frames)。 RFC 7692,于 2015 年 12 月发布,试图通过定义 “WebSocket 压缩扩展” 来改善这种情况。然而,据我所知,没有任何流行的反向代理服务(如 nginx、caddy)实现了这一功能,因此无法透明地启用压缩。 这意味着,如果要使用压缩,则必须在后端直接实现。幸运的是,我找到了一些支持 RFC 7692 的库。例如,Python 的 websockets 和 wsproto 库,以及 nodejs 的 ws 库。 然而,后者并不建议使用该功能: 该扩展在服务器上默认禁用,在客户端上默认启用。它在性能和内存消耗方面增加了显著的开销,因此我们建议只在确实需要时才启用它。 请注意,Node.js 在高性能压缩方面存在各种问题,尤其是在 Linux 上增加并发性可能会导致灾难性的内存碎片和性能下降。 在浏览器方面,Firefox 从 37 版本开始支持 WebSocket 的压缩。Chrome 也支持。然而,显然 Safari 和 Edge 不支持。 我没有验证移动设备上的支持情况如何。 3.2 多路复用 (Multiplexing)HTTP/2 引入了对多路复用的支持,意味着向同一主机发送的多个请求/响应对不再需要单独的 TCP 连接。相反,它们可以共享同一个 TCP 连接,每个请求在其自己独立的 HTTP/2 流上运行。 这也得到了每个浏览器的支持,而且在大多数反向代理上启用它也非常容易。 相比之下,WebSocket 协议默认不支持多路复用。向同一主机发送多个 WebSocket 将各自打开自己的独立的 TCP 连接。如果要使两个独立的 WebSocket 终端共享它们的基础连接,您必须自己在应用程序代码中添加多路复用能力支持。 RFC 8441 于 2018 年 9 月发布,尝试通过添加“使用 HTTP/2 引导 WebSocket”的支持来解决这个问题。它已在 Firefox 和 Chrome 中实现。然而,据我所知,没有主要的反向代理服务实现了它。不幸的是,我也找不到 Python 或 Javascript 的任何实现。 3.3 代理问题 (Issues with proxies)没有显式支持 WebSockets 的 HTTP 代理可能会阻止未加密的 WebSocket 连接正常工作。这是因为代理无法解析 WebSocket 帧 (frames) 并关闭连接。 但是,通过 HTTPS 发起的 WebSocket 连接应该不受此问题的影响,因为帧将被加密,代理应该只是转发所有内容而不会关闭连接。 要了解更多信息,请参见 Peter Lubbers 的“HTML5 Web Sockets 如何与代理服务器交互”。 3.4 跨站 WebSocket 劫持WebSocket 连接没有受到同源策略的保护,这使它们容易受到跨站 WebSocket 劫持攻击。 因此,如果 WebSocket 后端没有使用任何客户端缓存的身份验证方式(例如 cookie或 HTTP 身份验证),它们必须检查 Origin 头的正确性。 我在这里不会详细讨论,但是请考虑这个简短的例子。假设一个比特币交易所使用 WebSockets 提供其交易服务。当您登录时,交易所可能设置一个 cookie 来保持您的会话在一定时间内活动。现在,攻击者要偷取你珍贵的比特币所要做的就是让你访问她控制的站点,然后简单地打开一个 WebSocket 连接到交易所。恶意连接将被自动验证,除非交易所检查 Origin 头并阻止来自未授权域的连接。 我建议您阅读 Christian Schneider 关于跨站 WebSocket 劫持的精彩文章以了解更多信息。 4. Server-Sent Events现在我们对 WebSockets 有了更多的了解,包括它们的优点和缺点,让我们学习一下 Server-Sent Events 并了解它们是否是一个有效的替代方案。 Server-Sent Events 使服务器能够随时向客户端发送低延迟的推送事件。它们使用非常简单的协议,并且是 HTML 标准的一部分,受到每个浏览器的支持。 与 WebSockets 不同,Server-Sent Events 仅支持向客户端单向信息流动。这使得它们不适合一些需要处理特定场景的应用程序,即那些需要既是双向又是低延迟的通信通道,比如实时游戏。然而,这些权衡取舍也是它们相对于 WebSockets 的主要优势,因为单向流动使得 Server-Sent Events 可以在 HTTP 之上无缝的工作,而无需自定义协议。这使它们自动获得了所有 HTTP 的功能,例如压缩或 HTTP/2 多路复用能力,使它们成为大多数实时应用程序的非常方便的选择,其中大部分数据都来自服务器,并且由于 HTTP 头部的一些开销而导致一些请求的开销是可以接受的。 协议非常简单。它使用 text/event-stream 作为内容类型 (Content-Type) 和消息的形式如下: 123456789101112data: First messageevent: joindata: Second message. It has twodata: lines, a custom event type and an id.id: 5: comment. Can be used as keep-alivedata: Third message. I do not have more data.data: Please retry later.retry: 10 每个事件由两个换行符(\\n)分隔,并由多个可选字段组成。 可重复使用在多处出现的字段 data 通常用于表示事件数据的内容。 字段 event 允许指定自定义事件类型,如下一节所示,它可以用于在客户端上触发不同的事件处理程序。 另外两个字段 id 和 retry 用于配置自动重连机制的行为。这是 Server-Sent Events 最有趣的特性之一。它确保在连接断开或被服务器关闭时,无需用户干预,客户端将自动尝试重新连接。 retry 字段用于指定在尝试重新连接之前等待的最短时间(以秒为单位)。当服务器连接了太多客户端时,它也可以在立即关闭客户端连接之前发送该字段以减轻其负载。 id 字段将标识符与当前事件相关联。在重新连接时,客户端将使用 Last-Event-ID HTTP 请求头将上次看到的 id 传输给服务器。这使得我们可以从正确的失效点恢复通讯流。 最后,服务器可以通过返回 HTTP 204 No Content 响应来完全停止自动重连机制。 5. 来点实际代码 Demo现在,让我们将所学的内容付诸实践。在本节中,我们将使用 Server-Sent Events 和 WebSockets 实现一个简单的服务。这将使我们能够实际比较这两种技术。我们将了解到使用每种技术开始的难易程度,并手动验证前面讨论的功能。 我们将使用 Python 作为后端,Caddy 作为反向代理,当然还需要一些 JavaScript 代码用于前端。 为了让我们的示例尽可能简单,我们的后端将只包含两个端点 (endpoints),每个端点都会流式传输唯一的随机数字序列。从 /sse1 和 /sse2 进行 Server-Sent Events 访问,从 /ws1 和 /ws2 进行 WebSockets 的访问。我们的前端将仅由一个 index.html 文件组成,其中包含一些 JavaScript 代码,可以让我们启动和停止 WebSockets 和 Server-Sent Events 连接。 示例代码 - GitHub 5.1 反向代理使用反向代理,例如 Caddy 或 nginx,对于这种小例子中非常有用。它让我们很容易地开启很多我们所选择的后端可能缺少的功能。 更具体地说,它允许我们轻松地提供静态文件并自动压缩 HTTP 响应;提供 HTTP/2 支持,即使我们的后端仅支持 HTTP/1,也可以让我们受益于多路复用;最后还可以进行负载均衡。 我选择了Caddy,因为它可以自动为我们管理HTTPS证书,让我们跳过一个非常乏味的任务,尤其是对于一个快速实验 Demo。 基本配置位于项目根目录下的 Caddyfile 中,大致如下: 12345678localhostbind 127.0.0.1 ::1root ./staticfile_server browseencode zstd gzip 这指示 Caddy 监听本地接口的 80 和 443 端口,启用 HTTPS 支持并生成自签名证书。它还支持压缩和提供访问 static 目录下的静态文件。 最后一步,我们需要让 Caddy 代理到我们的后端服务。Server-Sent Events只是普通的HTTP请求,所以这里没有什么特别的: 12reverse_proxy /sse1 127.0.1.1:6001reverse_proxy /sse2 127.0.1.1:6002 要代理 Websocket,需要反向代理显式支持。幸运的是,Caddy 可以毫无障碍地处理这个问题,尽管配置有点冗长: 123456789101112@websockets { header Connection *Upgrade* header Upgrade websocket}handle /ws1 { reverse_proxy @websockets 127.0.1.1:6001}handle /ws2 { reverse_proxy @websockets 127.0.1.1:6002} 最后使用如下命令启动 Caddy: 1sudo caddy start 5.2 前端让我们从前端开始,比较 WebSockets 和 Server-Sent Events 的 JavaScript API。 WebSocket 的JavaScript API非常易于使用。首先,我们需要创建一个新的 WebSocket 对象,传递服务器的 URL。这里,wss 表示连接将在 HTTPS 上进行。如上所述,强烈建议使用 HTTPS 以避免代理问题。 然后,我们应该监听一些可能的事件(即打开 open、消息 message、关闭 close、错误 error),通过设置 on$event 属性或使用 addEventListener()。 123456const ws = new WebSocket("wss://localhost/ws");ws.onopen = e => console.log("WebSocket open");ws.addEventListener( "message", e => console.log(e.data)); JavaScript 的 Server-Sent Events API 非常类似。它要求我们创建一个新的 EventSource 对象,传递服务器的 URL,然后可以通过相同的方式订阅事件。 主要的区别在于,我们还可以订阅自定义事件。 1234567891011const es = new EventSource("https://localhost/sse");es.onopen = e => console.log("EventSource open");es.addEventListener( "message", e => console.log(e.data));// Event listener for custom event// 订阅自定义事件es.addEventListener( "join", e => console.log(`${e.data} joined`)) 我们现在可以使用所有这些关于 JS APIs 的新知识来构建我们实际的前端。 为了让事情尽可能简单,它只包含一个 index.html 文件,里面有一堆用来启动和停止 WebSockets 和 EventSources 的按钮。像这样: 12345<button onclick="startWS(1)">Start WS1</button><button onclick="closeWS(1)">Close WS1</button><br><button onclick="startWS(2)">Start WS2</button><button onclick="closeWS(2)">Close WS2</button> 我们需要多个 WebSocket/EventSource,这样我们就可以测试 HTTP/2 多路复用是否有效以及打开了多少连接。 现在让我们实现这些按钮工作所需的两个函数: 123456789101112131415161718const wss = [];function startWS(i) { if (wss[i] !== undefined) return; const ws = wss[i] = new WebSocket("wss://localhost/ws"+i); ws.onopen = e => console.log("WS open"); ws.onmessage = e => console.log(e.data); ws.onclose = e => closeWS(i);}function closeWS(i) { if (wss[i] !== undefined) { console.log("Closing websocket"); websockets[i].close(); delete websockets[i]; }} Server-Sent Events 的前端代码几乎相同。唯一的区别是 onerror 事件处理程序,它之所以存在,是因为一旦发生错误,浏览器就会记录一条消息,并尝试进行重连。 123456789101112131415161718const ess = [];function startES(i) { if (ess[i] !== undefined) return; const es = ess[i] = new EventSource("https://localhost/sse"+i); es.onopen = e => console.log("ES open"); es.onerror = e => console.log("ES error", e); es.onmessage = e => console.log(e.data);}function closeES(i) { if (ess[i] !== undefined) { console.log("Closing EventSource"); ess[i].close() delete ess[i] }} 5.3 后端现在我们来编写后端代码。我们将使用 Python 的异步 Web 框架 Starlette,使用 Uvicorn 作为服务器。为了使事情模块化,我们将分离数据生成过程和端点 (endpoints) 的实现。 我们希望两个端点中的每一个都生成一系列唯一的随机数。为了实现这一点,我们将使用流 ID(即1或2)作为随机种子 (random seed)的一部分。 理想情况下,我们也希望我们的流是可恢复的。也就是说,如果连接中断,客户端应该能够从它收到的最后一条消息恢复流,而不是重新读取整个序列。为了实现这一点,我们将为每个消息/事件分配一个 ID,并在生成每个消息之前使用它来初始化随机种子,以及流 ID。在我们的例子中,ID 将只是从 0 开始的计数器 (Counter)。 有了这些,我们就可以编写 get_data 函数来生成我们的随机数: 123456import randomdef get_data(stream_id: int, event_id: int) -> int: rnd = random.Random() rnd.seed(stream_id * event_id) return rnd.randrange(1000) 现在我们来写出实际的 endpoints。 Starlette 的入门非常简单。我们只需要初始化一个应用程序 app,然后注册一些路由给它: 123from starlette.applications import Starletteapp = Starlette() 为了编写 WebSocket 服务,我们选择的 web 服务器和框架都必须有明确的支持。幸运的是,Uvicorn 和 Starlette 可以胜任这个任务,编写 WebSocket 端点与编写普通路由一样方便。 这就是我们需要的所有代码: 1234567891011121314from websockets.exceptions import WebSocketException@app.websocket_route("/ws{id:int}")async def websocket_endpoint(ws): id = ws.path_params["id"] try: await ws.accept() for i in itertools.count(): data = {"id": i, "msg": get_data(id, i)} await ws.send_json(data) await asyncio.sleep(1) except WebSocketException: print("client disconnected") 上述代码将确保每当浏览器请求以 /ws 开头并后跟一个数字的路径时(例如 /ws1、/ws2),就会调用 websocket_endpoint 函数。 然后,对于每个匹配的请求,它将等待 WebSocket 连接建立,随后开始无限循环每秒发送随机数字,编码为 JSON 有效载荷。 对于 Server-Sent Events,代码非常相似,除了不需要任何特殊的框架支持。在这种情况下,我们注册一个路由,匹配以 /sse 开头并以数字结尾的 URL(例如 /sse1、/sse2)。但是,这次我们的端点只是设置适当的标头并返回 StreamingResponse: 123456789101112from starlette.responses import StreamingResponse@app.route("/sse{id:int}")async def sse_endpoint(req): return StreamingResponse( sse_generator(req), headers={ "Content-type": "text/event-stream", "Cache-Control": "no-cache", "Connection": "keep-alive", }, ) StreamingResponse 是 Starlette 提供的一个实用程序类,它接受一个生成器,并将其输出流式传输到客户端,保持连接处于打开状态。 下面为 sse_generator 的实现代码,几乎与 WebSocket 端点相同,只是消息按照 Server-Sent Events 协议进行编码: 1234567async def sse_generator(req): id = req.path_params["id"] for i in itertools.count(): data = get_data(id, i) data = b"id: %d\\ndata: %d\\n\\n" % (i, data) yield data await asyncio.sleep(1) 我们完成了! 最后,假设我们将所有代码放在名为 server.py 的文件中,我们可以使用 Uvicorn 启动我们的后端 endpoints,如下所示: 12$ uvicorn --host 127.0.1.1 --port 6001 server:app &$ uvicorn --host 127.0.1.1 --port 6002 server:app & 6. 彩蛋: SSE 很棒的特性好了,现在让我们来总结一下,实现我们之前吹嘘的那些漂亮的功能是多么容易。 可以通过修改端点中的几行代码来启用压缩: 123456789101112131415161718192021@@ -32,10 +33,12 @@ async def websocket_endpoint(ws): async def sse_generator(req): id = req.path_params["id"]+ stream = zlib.compressobj() for i in itertools.count(): data = get_data(id, i) data = b"id: %d\\ndata: %d\\n\\n" % (i, data)- yield data+ yield stream.compress(data)+ yield stream.flush(zlib.Z_SYNC_FLUSH) await asyncio.sleep(1) @@ -47,5 +50,6 @@ async def sse_endpoint(req): "Content-type": "text/event-stream", "Cache-Control": "no-cache", "Connection": "keep-alive",+ "Content-Encoding": "deflate", }, ) 然后,我们可以检查开发者工具 (DevTools) 来验证一切是否按预期工作: 因为 Cadd y支持 HTTP/2,所以多路复用是默认启用的。我们可以再次使用开发者工具来确认所有 SSE 请求都使用同一个连接: 自动重连: 在发生意外连接错误时自动重新连接很简单,只需在后端代码中读取 [Last-Event-ID](https://html.spec.whatwg.org/multipage/server-sent-events.html#last-event-id) 头信息: 1234< for i in itertools.count():---> start = int(req.headers.get("last-event-id", 0))> for i in itertools.count(start): 前端代码不需要任何改动。 我们可以通过启动到 SSE 端点的连接,然后关闭 uvicorn 来测试它是否正常工作。连接会断开,但浏览器会自动尝试重新连接。因此,如果重新启动服务器,我们会看到流从中断的地方恢复! 请注意流是如何从消息 243 恢复的。感觉就像魔法🔥 7. 总结WebSockets 是建立在 HTTP 和 TCP 之上的大型机制,提供了一套极其特定的功能,即双向低延迟通信。 为了实现这一点,它们引入了许多复杂性,最终使得客户端和服务器实现比完全基于 HTTP 的解决方案更加复杂。 这些复杂性和限制已经在新的规范(RFC 7692,RFC 8441)中得到了解决,并将逐渐在客户端和服务器库中实现。 然而,即使在没有技术缺陷的情况下,WebSockets 仍然是一项相当复杂的技术,涉及大量额外的客户端和服务器代码。因此,您应仔细考虑是否值得增加复杂性,或者是否可以通过更简单的解决方案(如 Server-Sent Events)去解决问题。 就这些内容了,朋友们!希望你们觉得这篇文章有趣,也能从中学到一些新东西。 如果你想尝试一下 Server-Sent Events 和 WebSockets,可以自由地在 GitHub 上查看演示 Demo 代码。 我也鼓励你们阅读下 SSE 的规范,因为它解释得非常清晰,包含了很多示例。","categories":[{"name":"SSE","slug":"SSE","permalink":"https://yeshan333.github.io/categories/SSE/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"Websocket","slug":"Websocket","permalink":"https://yeshan333.github.io/tags/Websocket/"},{"name":"SSE","slug":"SSE","permalink":"https://yeshan333.github.io/tags/SSE/"}]},{"title":"2022 | Summary","slug":"2022-annual-reviewed","date":"2023-02-26T15:59:12.000Z","updated":"2023-02-26T15:59:12.000Z","comments":true,"path":"2023/02/26/2022-annual-reviewed/","permalink":"https://yeshan333.github.io/2023/02/26/2022-annual-reviewed/","excerpt":"","text":"迟来的总结,2022 五味杂陈,最后的几个月,基本都在尝试着解决某些情绪,这一年有很多东西应该被记录。坚持是最反人性的一种东西,但长远来看,这应该也是最浪漫的东西。这一年,我真正感受到了什么叫信念的崩塌,原来没有了光是这种感觉。或许真正明白了一个道理:没有经历过,只是看过别人的经历,没有多大用的,路走过了才勉强懂了。 博客 & 技术-Blog & Techs看了眼归档 archives,貌似今年的文章水得有点差强人意😂,不过原创文得质量还阔以,就是少了点。时间本很多事哗啦呼啦冲走了,同时貌似没啥思路水点东西。 Techs & Coding2022 年的 GitHub 小绿点,还阔以,挺养眼。不过有些是 RSS 定时器打的,2333,质量不得。 22 年 public 了两个 Elixir 和 Java 的项目,虽然有点水,但是感觉还不错,比上一年稍微好点了 (今年多了几个 PR,2333~)。 yeshan333/ApacheJmeter_Schema_Assertionhttps://github.com/yeshan333/ApacheJmeter_Schema_Assertion yeshan333/ex_integration_coverallshttps://github.com/yeshan333/ex_integration_coveralls 曾收到过一封 invitation,奈何感觉口语不行,没敢回: 生活-LifeGames22 年稍微回归了下某王者,老躺平放松娱乐游戏了。值得纪念的是入手了 switch,开拓了玩耍范围。火焰纹章终于不用模拟器“白嫖”了,回顾了下经典的超级机器人大战。 switchreal switch Sports费体力的事 22 年也不能少。又徒了几次步 15 km+,爬了好几个山头 😀。22 年还完成了之前愣是没去学的自行车,学会了之后愣是从大学城穿越大街小巷硬骑回了住处附近。忽然觉得有点猛,haha: bicycleroad Reading貌似 22 年看的书稍微花了点,心里的波动不是特别大了,很多东西得经历下再回头看看才行。 技术类的下面看的几个都不错: 《Google 软件工程》:22 年出了中文本,好啃多了。 《数据密集型应用系统设计》:看着很香,没拿下, 23 年还得多看看。 《Google 的软件测试之道》:一些理念实践很 nice,Google N 年前就做了的事,国内还不太行,震惊。 《用 Go 语言自制编译器》:Continue …….一堆 Erlang & Elixir 相关的 2y220425那些天rose 这里本应该会写更多的东西,每一段经历都应该被记录,或许才能更坦然的去面对它。 未来-Future话虽少,事其实挺多。Time is waiting for me.","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"(译)Elixir Tip: Case vs. With","slug":"Elixir-Tip-Case-vs-With","date":"2022-11-26T23:10:46.000Z","updated":"2022-11-26T23:10:46.000Z","comments":true,"path":"2022/11/26/Elixir-Tip-Case-vs-With/","permalink":"https://yeshan333.github.io/2022/11/26/Elixir-Tip-Case-vs-With/","excerpt":"","text":"从 1.2 版本开始, with 运算符是需要点时间去理解的 ELixir 特性之一. 它经常在使用 case 的情形下使用, 反之亦然. 两者的不同在于如果没有可以匹配到的子句, with 将失败, 而 case 将抛出一个不匹配 (no-match) 的错误 (CaseClauseError). 是不是有一点点疑惑, 让我们从最基本的使用开始看看. 使用 case 进行精准匹配, 你非常确定至少有一个是可以被匹配到的: 123456case foo() do cond1 -> expression1 cond2 -> expression2 cond3 -> expression3 _ -> default_expressionend 一个常见的 case 使用情景是对潜在的错误进行模式匹配: 1234case foo() do {:ok, res} -> do_something_with_result(res) {:error, err} -> handle_error(err)end 目前为止, 一切都看起来很好. 让我们来看一个常见的日常工作场景案例. 试想一下, 我们有一个这样的操作 (它可以是外部的 API 调用、IO 或者数据库操作), 我们想执行第二个这样的操作, 但只有当第一个操作成功的时候才执行. 这个行为我们怎么实现? 回想一下, Elixir 中的条件语句也是函数. 它们可以被插入或链接到其他条件的表达式部分. 这允许我们使用链式的条件语句来解决上面的问题: 12345678case foo() do {:ok, res} -> case bar(res) do {:ok, res2} -> do_something_with_result(res2) {:error, err} -> handle_error(err) end {:error, err} -> handle_error(err)end 尽管只有两个类似的调用操作, 但代码的复杂度是急剧上升的. 如果再添加一个类似的调用操作, 代码将会变得不可读: 123456789101112case foo() do {:ok, res} -> case bar(res) do {:ok, res2} -> case baz(res2) do {:ok, res3} -> do_something_with_result(res3) {:error, err} -> handle_error(err) end {:error, err} -> handle_error(err) end {:error, err} -> handle_error(err)end 使用 with 去拯救一下这就是 with 运算符非常方便的地方. 它的基本形式类似于上面 case 的链式例子, 但在某种程度上, 它的功能也类似于管道操作符. 看看这个: 12345with {:ok, res} <- foo(), {:ok, re2} <- bar(res) {:ok, re3} <- baz(re2) do do_something_with_result(res3)end 这可以解释为, “按顺序执行所有以逗号分隔的操作, 如果前一个操作是匹配的, 则执行下一个操作. 最后, 运行 do/end 块中的代码”. 这看起来比之前的版本更简洁和可读, 而且它还有另一个很大的优势. 它允许工程师优先关注正常的业务场景. 有些人可能想知道, 如果任何以逗号分隔的操作返回的是 {:error, err} 元组, 会发生什么情况. 答案是, 将返回第一个不匹配的操作表达式. 简单地说, 如果我们不关心非 ok 的结果, 那么我们也可以留下正常的路径, 把它留给调用者来处理最终结果. 如果你使用过 Phoenix,你可能会想起,这正是它的 fallback actions 的工作方式. 12345678910111213defmodule MyController do use Phoenix.Controller action_fallback MyFallbackController def show(conn, %{"id" => id}, current_user) do with {:ok, post} <- Blog.fetch_post(id), :ok <- Authorizer.authorize(current_user, :view, post) do render(conn, "show.json", post: post) end endend 这个 Fallback Controller 的例子来源于 official Phoenix docs with/else如果我们想要自己关注这些副作用 (side effects), with 提供了一个扩展版本给我们使用: 12345678with {:ok, res} <- foo(), {:ok, res2} <- bar(res) do do_something_with_res(res2)else {:error, {:some_error, err}} -> handle_some_error(err) {:error, {:some_other_error, err}} -> handle_some__other_error(err) default -> handle_something_completely_unexpected(default)end NOTE: 请记住,虽然基础的 with 形式在匹配失败时不会抛出错误,但在使用 else 时,你必须详尽地匹配所有的情况. 什么使用不应该使用 with用 else 处理单个模式匹配的场景这将使代码比你需要的更难以阅读. 代码如下: 12345with {:ok, res} <- foo() do do_something_with_res(res)else {:error, {:some_error, err}} -> handle_some_error(err)end 可以使用更具有可读性的 case 块处理: 1234case foo() do {:ok, res} -> do_something_with_res(res) {:error, {:some_error, err}} -> handle_some_error(err)end 相关文章 Elixir: Thoughts on the with Statement","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"}]},{"title":"the-solution-of-elixir-continuous-runtime-system-code-coverage-collection","slug":"the-solution-of-elixir-continuous-runtime-system-code-coverage-collection","date":"2022-08-31T22:43:10.000Z","updated":"2022-08-31T22:43:10.000Z","comments":true,"path":"2022/08/31/the-solution-of-elixir-continuous-runtime-system-code-coverage-collection/","permalink":"https://yeshan333.github.io/2022/08/31/the-solution-of-elixir-continuous-runtime-system-code-coverage-collection/","excerpt":"","text":"zh_hans Code coverage is an effective means to assist software engineers in verifying code quality. The runtime environment’s ability to collect code coverage fully combines black and white box testing capabilities and greatly increases engineers’ confidence in software quality. This article introduces a solution for code coverage collection in the Elixir runtime environment, and provides an in-depth insight into its internal principles. 1. Brief talk on code coverageAs a SDET or a SWE, we often need to write unit tests or integration test cases to verify the correctness of the system/application, but at the same time we often question whether our tests are adequate. At this time, test coverage is a means of measuring the adequacy of our testing, enhancing the success rate and confidence of the software release, and giving us more reflective perspectives. The note of the value is that high code coverage does not indicate high code quality, but conversely, code coverage is low, and code quality will not be high. Most programming languages come with the ability to collect unit test coverage, and the same is true for Elixir, the official mix build tool comes with the ability to collect coverage, but it is currently only suitable for offline system, not for runtime system. This article will be based on Erlang’s cover module to give a solution for the Elixir runtime system. Since cover is Erlang’s built-in module, but why it works equally well with Elixir, we’ll unveil its mystery in a follow-up. Before we get started, let’s take a look at the two mainstream ways in which the open source community collects code coverage at runtime (here we look at the bytecode stubbing method of Java, which has a huge ecosystem of the language community): Next let’s focus on the core of elixir runtime coverage collection in this article - the cover module. 2. Delve into the Erlang Cover coverage collection implementation mechanism2.1. Introduction Erlang Covercover is part of Erlang’s built-in tools set, providing a powerful ability to collect code coverage. 2.2. Erlang code coverage collection implementation analysisAs you can see from Erlang’s official manual of the cover module, cover counts the number of times every executable line in the Erlang program is executed. From the introduction of the official documentation, cover can be used for code coverage collection of the runtime system. When the code is instrumented, it does not modify the code source files of any modules or the beam files generated after compilation (that is the industry calls the On-The-Fly mode). Every time the executable row is called, the runtime system updates the number of calls to cover in an in-memory database (erlang ets) for storing data for subsequent coverage analysis. Next, we’ll explore the details of the On-The-Fly mode under cover. 2.3. Learn about BEAM File FormatBefore we can further understand the details of the cover implementation, it is necessary to understand the format of the BEAM file after the elixir source code is compiled. The compiled product of the Elixir (.ex file), like the Erlang (.erl file), is a binary chunked file, which is divided into several sections to store information used when the program runs (such as virtual machine operation instructions). In Erlang/Elixir, each module will have a corresponding BEAM file. The approximate structure of the BEAM file is as follows: Let’s take a look at the approximate content of the beam file through an Elixir mini demo project: Step 1. Clone the project yeshan333/explore_ast_app to the local: 12git clone https://github.com/yeshan333/explore_ast_app.gitcd explore_ast_app Step 2. Build this project in OTP release format. (note: Elixir and Erlang need to be installed locally): 1MIX_ENV=prod mix distillery.release It can be noted that each Elixir module is compiled into a BEAM file (can be seen in the directory _build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin). Step 3. Next, let’s view the chunks in the Beam file through Erlang’s standard library beam_lib: 12# open the iex consoleiex -S mix View all chunks of the compiled BEAM file (Elixir.ExploreAstApp.beam): 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253$ iex -S mixErlang/OTP 24 [erts-12.1] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit] [dtrace]Interactive Elixir (1.12.3) - press Ctrl+C to exit (type h() ENTER for help)iex(1)> beam_file_path = "_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin/Elixir.ExploreAstApp.beam""_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin/Elixir.ExploreAstApp.beam"iex(2)> all_chunks = :beam_lib.all_chunks(String.to_charlist(beam_file_path)){:ok, ExploreAstApp, [ {'AtU8', <<0, 0, 0, 15, 20, 69, 108, 105, 120, 105, 114, 46, 69, 120, 112, 108, 111, 114, 101, 65, 115, 116, 65, 112, 112, 8, 95, 95, 105, 110, 102, 111, 95, 95, 10, 97, 116, 116, 114, 105, 98, 117, 116, 101, ...>>}, {'Code', <<0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, 0, 14, 0, 0, 0, 4, 1, 16, 153, 0, 2, 18, 34, 16, 1, 32, 59, 3, 21, 23, 8, 16, 50, 117, 66, 117, 82, 101, 98, ...>>}, {'StrT', ""}, {'ImpT', <<0, 0, 0, 2, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 1>>}, {'ExpT', <<0, 0, 0, 4, 0, 0, 0, 15, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 9, ...>>}, {'LitT', <<0, 0, 0, 52, 120, 156, 99, 96, 96, 96, 98, 96, 96, 16, 106, 206, 1, 146, 140, 25, 76, 229, 172, 25, 169, 57, 57, 249, 137, 12, 89, 64, 190, 88, 115, 46, 144, 20, 248, ...>>}, {'LocT', <<0, 0, 0, 0>>}, {'Attr', <<131, 108, 0, 0, 0, 1, 104, 2, 100, 0, 3, 118, 115, 110, 108, 0, 0, 0, 1, 110, 16, 0, 165, 236, 94, 47, 119, 160, 184, 33, 240, 28, 89, 11, 22, 130, 207, ...>>}, {'CInf', <<131, 108, 0, 0, 0, 3, 104, 2, 100, 0, 7, 118, 101, 114, 115, 105, 111, 110, 107, 0, 5, 56, 46, 48, 46, 51, 104, 2, 100, 0, 7, 111, 112, 116, 105, 111, ...>>}, {'Dbgi', <<131, 80, 0, 0, 1, 143, 120, 156, 117, 80, 203, 78, 3, 49, 12, 76, 233, 67, 162, 5, 113, 65, 124, 70, 87, 253, 2, 212, 67, 63, 129, 115, 148, 221, 120, ...>>}, {'Docs', <<131, 80, 0, 0, 0, 241, 120, 156, 93, 142, 205, 10, 194, 48, 16, 132, 215, 74, 91, 9, 248, 14, 129, 94, 244, 82, 241, 234, 65, 40, 88, 241, 45, 108, ...>>}, {'ExCk', <<131, 104, 2, 100, 0, 17, 101, 108, 105, 120, 105, 114, 95, 99, 104, 101, 99, 107, 101, 114, 95, 118, 49, 116, 0, 0, 0, 1, 100, 0, 7, 101, 120, ...>>}, {'Line', <<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 1, 18, 241, 0, 22, 108, 105, 98, 47, 101, 120, 112, 108, ...>>} ]} As you can see, the obtained chunks correspond to the previous diagram. We can also obtain the Erlang AST (abstract syntax tree) corresponding to the module (ExploreAstApp) through the beam_lib standard library: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475iex(3)> result = :beam_lib.chunks(String.to_charlist(beam_file_path), [:abstract_code]){:ok, {ExploreAstApp, [ abstract_code: {:raw_abstract_v1, [ {:attribute, 1, :file, {'lib/explore_ast_app.ex', 1}}, {:attribute, 1, :module, ExploreAstApp}, {:attribute, 1, :compile, [:no_auto_import]}, {:attribute, 1, :export, [__info__: 1, hello: 0]}, {:attribute, 1, :spec, {{:__info__, 1}, [ {:type, 1, :fun, [ {:type, 1, :product, [ {:type, 1, :union, [ {:atom, 1, :attributes}, {:atom, 1, :compile}, {:atom, 1, :functions}, {:atom, 1, :macros}, {:atom, 1, :md5}, {:atom, 1, :exports_md5}, {:atom, 1, :module}, {:atom, 1, :deprecated} ]} ]}, {:type, 1, :any, []} ]} ]}}, {:function, 0, :__info__, 1, [ {:clause, 0, [{:atom, 0, :module}], [], [{:atom, 0, ExploreAstApp}]}, {:clause, 0, [{:atom, 0, :functions}], [], [ {:cons, 0, {:tuple, 0, [{:atom, 0, :hello}, {:integer, 0, 0}]}, {nil, 0}} ]}, {:clause, 0, [{:atom, 0, :macros}], [], [nil: 0]}, {:clause, 0, [{:atom, 0, :exports_md5}], [], [ {:bin, 0, [ {:bin_element, 0, {:string, 0, [240, 105, 247, 119, 22, 50, 219, 207, 90, 95, 127, 92, ...]}, :default, :default} ]} ]}, {:clause, 0, [{:match, 0, {:var, 0, :Key}, {:atom, 0, :attributes}}], [], [ {:call, 0, {:remote, 0, {:atom, 0, :erlang}, {:atom, 0, :get_module_info}}, [{:atom, 0, ExploreAstApp}, {:var, 0, :Key}]} ]}, {:clause, 0, [{:match, 0, {:var, 0, :Key}, {:atom, 0, :compile}}], [], [ {:call, 0, {:remote, 0, {:atom, 0, :erlang}, {:atom, 0, :get_module_info}}, [{:atom, 0, ExploreAstApp}, {:var, 0, :Key}]} ]}, {:clause, 0, [{:match, 0, {:var, 0, :Key}, {:atom, 0, :md5}}], [], [ {:call, 0, {:remote, 0, {:atom, 0, :erlang}, {:atom, 0, :get_module_info}}, [{:atom, 0, ExploreAstApp}, {:var, 0, :Key}]} ]}, {:clause, 0, [{:atom, 0, :deprecated}], [], [nil: 0]} ]}, {:function, 15, :hello, 0, [{:clause, 15, [], [], [{:atom, 0, :world}]}]} ]} ]}} It can be seen that AST is expressed in the form of Erlang Terms (called Abstract Code), which is easy to read. The Abstract Code is very useful in the on-the-fly instrumentation process of cover. The above AST structure is simple and easy to read, and we can easily match it with the source code (lib/explore_ast_app.ex) before the module is compiled, although the AST structure is the final Erlang AST, and some extras information are added by the Erlang compiler, but does not affect reading: The second element in the tuple generally represents the number of source code lines. You can learn more about Erlang’s Abstract Format through the official documentation. By observing the Erlang AST structure of several BEAM files, you will be familiar with it. It is worth noting that the Abstract Code was stored in the Abstract Chunk of the BEAM file before OTP 20. If you want to learn more about BEAM files in detail, you can check out the following two documents: http://beam-wisdoms.clau.se/en/latest/indepth-beam-file.html#beam-term-format https://blog.stenmans.org/theBeamBook/#BEAM_files 2.4. Elixir source code compilation processAfter understanding BEAM File Format, we also need to understand the compilation process of Elixir code, which will help us better understand cover. The process of compiling Elixir source code into BEAM file may not be as you imagined In the same way, instead of directly from Elixir’s AST, it becomes executable BEAM Code after being processed by the compiler backend. There is also a process in the middle, as shown in the following figure: The above process can be described as: Step 1、The Elixir source code will be parsed by a custom lexical analyzer (elixir_tokenizer) and yacc to generate the initial version of Elixir AST, which is expressed in the form of Elixir Terms; if you are interested in Elixir’s AST, you can follow this Project arjan/ast_ninja; Step 2、In the Elixir AST stage, some custom and built-in Macros have not been expanded, and these Macros are expanded into the final Elixir AST in the Expanded Elixir AST stage; Step 3、Final Elixir AST will be converted into Erlang standard AST form (Erlang Abstract Format) after being processed by Elixir Compiler; Step 4、Finally, Elixir will use the Erlang Compiler to process the Erlang AST, converting it into BEAM bytecode executable by the BEAM Virtual Machine (VM). For details on the compiler, see: elixir_compiler.erl and elixir_erl.erl source code For more details on the Erlang Compiler, see theBeamBook/#CH-Compiler. 2.5. Cover On-The-Fly Instrumentation ImplementationNow it’s time for dinner. Let’s see how cover performs instrumentation and coverage collection. To use cover to complete code coverage collection, we must know three dragon-slaying swords: cover:start: Used to create the cover coverage collection process, it will complete the creation of the relevant ets table to store the coverage data, cover.erl#L159 & cover.erl#L632, and we can also start the cover process of the remote Erlang node. cover:compile_beam: For instrumentation, cover will read the content of the abstract_code of the BEAM file, namely Erlang AST. The key code is in cover.erl#L1541, and then transform and munge the Erlang AST From, it will call bump_call, after each executable line will insert the following abstract_code: 123456789{call,A,{remote,A,{atom,A,ets},{atom,A,update_counter}}, [{atom,A,?COVER_TABLE}, {tuple,A,[{atom,A,?BUMP_REC_NAME}, {atom,A,Vars#vars.module}, {atom,A,Vars#vars.function}, {integer,A,Vars#vars.arity}, {integer,A,Vars#vars.clause}, {integer,A,Line}]}, {integer,A,1}]}. From the previous understanding of Erlang AST, we know that this is equivalent to inserting the following line of code: 1ets:update_counter(?COVER_TABLE, #bump{module=Module, function=Function, arity=Arity, clause=Clause, line=Line}, 1). Then for the mungeed Erlang AST Form, cover uses the Erlang Compiler to obtain the Erlang Beam Code (also known as object code. i.e. bytecode, VM execution instructions) from the mungeed AST expression form. cover.erl#L1580. And then use the Erlang code server to replace the old object code with the new object code obtained, load_binary cover.erl#L1581 into ERTS (Erlang Run Time System). cover completes the Erlang AST instrumentation process, so that whenever the executable line is Executed, the corresponding ets storage table will update the number of times the code line was called. cover:analyze: Analyze the data stored in the ets table to obtain the number of times the executable line was executed (called), which can be used for statistical coverage data. munge: Used to make a series of potentially destructive or irreversible changes to data or files. 3. Elixir Application runtime coverage collection exampleThrough the above, after understanding the implementation details of the Erlang Cover module. Let us take a deployed and running Elixir Application (we will use the previous yesan333/explore_ast_app) as an example to perform large-scale tests (system & integration tests) of the Elixir application runtime of code line-level coverage collection. Here we will use a tool library: ex_integration_coveralls for coverage analysis, which is an Elixir Wrapper for the Erlang module cover to collection Elixir runtime system coverage. Let’s start: Step 1、Add ex_integration_coveralls dependency to mix.exs file: 123456defp deps do [ ..., {:ex_integration_coveralls, "~> 0.3.0"} ]end Pull the dependencies and rebuild the project: 12mix deps.getMIX_ENV=prod mix distillery.release Step 2、Start the project: 1_build/prod/rel/explore_ast_app/bin/explore_ast_app foreground Step 3、Connect to the remote_console of the Elixir runtime application node: 1_build/prod/rel/explore_ast_app/bin/explore_ast_app remote_console Step 4、Use ex_integration_coveralls (ExIntegrationCoveralls.execute) to start cover and perform code coverage collection: 12345678910111213141516iex(explore_ast_app@127.0.0.1)1> compiled_beam_dir_path = "/Users/yeshan/oss_github/explore_ast_app/_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin""/Users/yeshan/oss_github/explore_ast_app/_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin"iex(explore_ast_app@127.0.0.1)2> ExIntegrationCoveralls.execute(compiled_beam_dir_path)[ ok: ExploreAstApp.Router, ok: ExploreAstApp.Plug.VerifyRequest.IncompleteRequestError, ok: ExploreAstApp.Plug.VerifyRequest, ok: ExploreAstApp.Application, ok: ExploreAstApp]iex(explore_ast_app@127.0.0.1)3> compile_time_source_lib_abs_path = "/Users/yeshan/oss_github/explore_ast_app""/Users/yeshan/oss_github/explore_ast_app"iex(explore_ast_app@127.0.0.1)4> source_code_abs_path = "/Users/yeshan/oss_github/explore_ast_app""/Users/yeshan/oss_github/explore_ast_app"iex(explore_ast_app@127.0.0.1)5> ExIntegrationCoveralls.get_total_coverage(compile_time_source_lib_abs_path, source_code_abs_path)0 As you can see, the initial coverage is 0, because no code has been called yet. Step 5、Let’s execute the following cURL. Let code be called: 12$ curl --location --request GET 'http://localhost:8080/hello'hello % Check out the code coverage data again in iex console: 12iex(explore_ast_app@127.0.0.1)6> ExIntegrationCoveralls.get_total_coverage(compile_time_source_lib_abs_path, source_code_abs_path)17.1 As you can see, the cURL (test case) coverage for this project is 17.1%. We can also use the following methods to view more detailed code coverage, such as viewing the code coverage of lib/explore_ast_app/router.ex (nil means the line is not an executable line): 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132iex(explore_ast_app@127.0.0.1)7> result = ExIntegrationCoveralls.get_coverage_report(compile_time_source_lib_abs_path, source_code_abs_path).......iex(explore_ast_app@127.0.0.1)8> Enum.at(Map.get(result, :files), 3)%ExIntegrationCoveralls.Stats.Source{ coverage: 18.2, filename: "lib/explore_ast_app/router.ex", hits: 4, misses: 18, sloc: 22, source: [ %ExIntegrationCoveralls.Stats.Line{ coverage: 1, source: "defmodule ExploreAstApp.Router do" }, %ExIntegrationCoveralls.Stats.Line{coverage: 1, source: " use Plug.Router"}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " use Plug.ErrorHandler" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " import Plug.Conn" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " alias ExploreAstApp.Plug.VerifyRequest" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug Plug.Parsers, parsers: [:urlencoded, :multipart]" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug VerifyRequest, fields: [\\"content\\", \\"mimetype\\"], paths: [\\"/upload\\"]" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " plug :match"}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug Plug.Parsers, parsers: [:json], pass: [\\"application/json\\"], json_decoder: Jason" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug :dispatch" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " get \\"/welcome\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " send_resp(conn, 200, \\"Welcome\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " get \\"/upload\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " send_resp(conn, 201, \\"Uploaded\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 1, source: " get \\"/hello\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # query parameter is user like this:" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # http://localhost:4001/hello?name=John" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # which will create %{\\"name\\" => \\"John\\"}" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 1, source: " send_resp(conn, 200, \\"hello \\#{Map.get(conn.query_params, \\"name\\")}\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " get \\"/hello/:name\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " send_resp(conn, 200, \\"hello \\#{name}\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " post \\"/hello\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # json body of POST request {\\"name\\": \\"John\\"} is parsed to %{\\"name\\" => \\"John\\"}" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # so it can be accesable with e.g. Map.get(conn.body_params, \\"name\\") or with pattern matching" }, %ExIntegrationCoveralls.Stats.Line{coverage: 0, source: " name ="}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " case conn.body_params do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " %{\\"name\\" => a_name } -> a_name" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " _ -> \\"\\"" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, ...}, %ExIntegrationCoveralls.Stats.Line{...}, ... ]} Based on the post_cov_stats_to_ud_ci interface, it is possible to further interface with internal or external Codecov-like coverage systems. Based on this, we can realize the collection of code coverage with large-scale (integration & system) testing capabilities without stopping the Elixir Application. 4. Continuous runtime coverage collection solution for large-scale Elixir/Erlang Microservice clustersWith the continuous expansion of the Elixir/Erlang microservice system, the coverage collection method shown in the previous section needs further evolution. Referring to the design of Prometheus Pull-Base, the overall design (combination of Pull & Push mode) is as follows: We expand based on ex_integration_coveralls. After the Elixir Application is started, a http worker is started up to expose the code coverage data in real time, which is convenient for communication with heterogeneous systems. The Coverage Push Gateway is responsible for regularly pulling the coverage data (Gateway can be a OTP Application, which allows ex_integration_coveralls to directly start up the custom GenServer Worker for interactive integration test system in the distributed OTP system), after the integration/system test system informs the end of the test, the Gateway pushes the coverage data to the Cover Center for code coverage rate display. End (long way to go). References Code Coverage at Google Erlang cover A brief introduction to BEAM A peak into the Erlang compiler and BEAM bytecode Getting each stage of Elixir’s compilation all the way to the BEAM bytecode excoveralls BeamFile - A peek into the BEAM file https://github.com/KronicDeth/intellij-elixir#beam-files","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"},{"name":"Test Coverage","slug":"Test-Coverage","permalink":"https://yeshan333.github.io/tags/Test-Coverage/"}]},{"title":"Elixir 连续运行时代码覆盖率采集方案","slug":"elixir-run-time-code-line-level-coverage-collection","date":"2022-06-29T23:14:26.000Z","updated":"2022-06-29T23:14:26.000Z","comments":true,"path":"2022/06/29/elixir-run-time-code-line-level-coverage-collection/","permalink":"https://yeshan333.github.io/2022/06/29/elixir-run-time-code-line-level-coverage-collection/","excerpt":"","text":"1. 浅谈代码覆盖率作为 SET 和 SWE, 我们经常需要编写单元测试或集成测试用例来验证系统/应用的正确性, 但同时我们也常会质疑我们的测试是否充分了. 这时测试覆盖率是可以辅助用来衡量我们测试充分程度的一种手段, 增强发布成功率与信心, 同时给了我们更多可思考的视角. 值的注意的是代码覆盖率高不能说明代码质量高, 但是反过来看, 代码覆盖率低, 代码质量不会高到哪里去. 大部分的编程语言都自带了单元测试覆盖率的收集能力, Elixir 也同样如此, 官方提供的 mix 构建工具自带了覆盖率的收集能力, 但目前只适用于离线(offline)系统, 对于运行时系统, 并不适用. 本文将会基于 Erlang 的 cover 模块, 给出一个 Elixir 运行时系统的解决方案. 既然 cover 是 Erlang 的内置模块, 但为什么它也同样适用于 Elixir, 我们将会在后续的环节中揭开它神秘的面纱. 在开始之前, 让我们先看下开源社区进行运行时系统代码覆盖率采集的两种主流方式(这里我们看下语言社区生态庞大的 Java 的字节码插桩方式): 接下来让我们关注一下本文的 Elixir 运行时覆盖率收集的核心 - cover 模块. 2. 深度解析 Erlang Cover 覆盖率收集实现机制2.1 Erlang Cover 简介cover 是 Erlang 内置工具集(tools set)的一部分, 提供了代码覆盖率收集的能力. 2.2 Erlang 代码覆盖率收集实现分析从 Erlang 关于 cover 模块官方手册可以知道, cover 统计了 Erlang 程序中每一可执行(executable line)被执行的次数. 从官方文档的介绍来看, cover 可以用于运行时系统的代码覆盖率收集, cover 进行代码插桩时, 并不会对任何模块的代码源文件或编译后生成的 beam 文件进行修改(即业界所说的 On-The-Fly 模式). 运行时系统每次可执行行被调用一次, 都会更新调用次数到 cover 用于存储数据的内存数据库中, 用于后续的覆盖率分析. 接下来, 我们将会去探索下 cover 进行 On-The-Fly 插桩的细节. 2.3 了解 BEAM File Format在进一步了解 cover 实现细节之前, 我们有必要先了解下 Elixir 源码编译后的产物 BEAM 文件的格式. Elixir (.ex 文件)编译后的产物与 Erlang (.erl 文件)一样, 都是一个二进制分块文件(binary chunked file), 它被划分为了多个 section, 用于存储程序运行时用到的信息(如虚拟机操作指令). Erlang/Elixir 中, 每一个模块都会有一个对应的 BEAM 文件. BEAM 文件大致的结构如下图: 让我们来通过一个 Elixir mini demo 项目查看下 beam 文件大概内容: Step 1、clone 项目 yeshan333/explore_ast_app 到本地: 12git clone https://github.com/yeshan333/explore_ast_app.gitcd explore_ast_app Step 2、构建此项目为 OTP release 格式, 本地需要安装 Elixir 和 Erlang: 1MIX_ENV=prod mix distillery.release 可以关注到, 每一个 Elixir 模块, 都被编译成了一个 BEAM 文件(于目录_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin 中可以看到). Step 3、接下来让我们通过 Erlang 的标准库 beam_lib 文件查看 Beam 文件中的 chunk: 12# 打开 iex consoleiex -S mix 查看编译后 BEAM 文件 (Elixir.ExploreAstApp.beam) 的所有 chunks: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253$ iex -S mixErlang/OTP 24 [erts-12.1] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit] [dtrace]Interactive Elixir (1.12.3) - press Ctrl+C to exit (type h() ENTER for help)iex(1)> beam_file_path = "_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin/Elixir.ExploreAstApp.beam""_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin/Elixir.ExploreAstApp.beam"iex(2)> all_chunks = :beam_lib.all_chunks(String.to_charlist(beam_file_path)){:ok, ExploreAstApp, [ {'AtU8', <<0, 0, 0, 15, 20, 69, 108, 105, 120, 105, 114, 46, 69, 120, 112, 108, 111, 114, 101, 65, 115, 116, 65, 112, 112, 8, 95, 95, 105, 110, 102, 111, 95, 95, 10, 97, 116, 116, 114, 105, 98, 117, 116, 101, ...>>}, {'Code', <<0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, 0, 14, 0, 0, 0, 4, 1, 16, 153, 0, 2, 18, 34, 16, 1, 32, 59, 3, 21, 23, 8, 16, 50, 117, 66, 117, 82, 101, 98, ...>>}, {'StrT', ""}, {'ImpT', <<0, 0, 0, 2, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 1>>}, {'ExpT', <<0, 0, 0, 4, 0, 0, 0, 15, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 9, ...>>}, {'LitT', <<0, 0, 0, 52, 120, 156, 99, 96, 96, 96, 98, 96, 96, 16, 106, 206, 1, 146, 140, 25, 76, 229, 172, 25, 169, 57, 57, 249, 137, 12, 89, 64, 190, 88, 115, 46, 144, 20, 248, ...>>}, {'LocT', <<0, 0, 0, 0>>}, {'Attr', <<131, 108, 0, 0, 0, 1, 104, 2, 100, 0, 3, 118, 115, 110, 108, 0, 0, 0, 1, 110, 16, 0, 165, 236, 94, 47, 119, 160, 184, 33, 240, 28, 89, 11, 22, 130, 207, ...>>}, {'CInf', <<131, 108, 0, 0, 0, 3, 104, 2, 100, 0, 7, 118, 101, 114, 115, 105, 111, 110, 107, 0, 5, 56, 46, 48, 46, 51, 104, 2, 100, 0, 7, 111, 112, 116, 105, 111, ...>>}, {'Dbgi', <<131, 80, 0, 0, 1, 143, 120, 156, 117, 80, 203, 78, 3, 49, 12, 76, 233, 67, 162, 5, 113, 65, 124, 70, 87, 253, 2, 212, 67, 63, 129, 115, 148, 221, 120, ...>>}, {'Docs', <<131, 80, 0, 0, 0, 241, 120, 156, 93, 142, 205, 10, 194, 48, 16, 132, 215, 74, 91, 9, 248, 14, 129, 94, 244, 82, 241, 234, 65, 40, 88, 241, 45, 108, ...>>}, {'ExCk', <<131, 104, 2, 100, 0, 17, 101, 108, 105, 120, 105, 114, 95, 99, 104, 101, 99, 107, 101, 114, 95, 118, 49, 116, 0, 0, 0, 1, 100, 0, 7, 101, 120, ...>>}, {'Line', <<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 1, 18, 241, 0, 22, 108, 105, 98, 47, 101, 120, 112, 108, ...>>} ]} 可以看到, 获取到的 chunks 是和之前的图对应的. 我们还可以通过 beam_lib 标准库获取到模块(ExploreAstApp)对应的 Erlang AST(抽象语法树): 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475iex(3)> result = :beam_lib.chunks(String.to_charlist(beam_file_path), [:abstract_code]){:ok, {ExploreAstApp, [ abstract_code: {:raw_abstract_v1, [ {:attribute, 1, :file, {'lib/explore_ast_app.ex', 1}}, {:attribute, 1, :module, ExploreAstApp}, {:attribute, 1, :compile, [:no_auto_import]}, {:attribute, 1, :export, [__info__: 1, hello: 0]}, {:attribute, 1, :spec, {{:__info__, 1}, [ {:type, 1, :fun, [ {:type, 1, :product, [ {:type, 1, :union, [ {:atom, 1, :attributes}, {:atom, 1, :compile}, {:atom, 1, :functions}, {:atom, 1, :macros}, {:atom, 1, :md5}, {:atom, 1, :exports_md5}, {:atom, 1, :module}, {:atom, 1, :deprecated} ]} ]}, {:type, 1, :any, []} ]} ]}}, {:function, 0, :__info__, 1, [ {:clause, 0, [{:atom, 0, :module}], [], [{:atom, 0, ExploreAstApp}]}, {:clause, 0, [{:atom, 0, :functions}], [], [ {:cons, 0, {:tuple, 0, [{:atom, 0, :hello}, {:integer, 0, 0}]}, {nil, 0}} ]}, {:clause, 0, [{:atom, 0, :macros}], [], [nil: 0]}, {:clause, 0, [{:atom, 0, :exports_md5}], [], [ {:bin, 0, [ {:bin_element, 0, {:string, 0, [240, 105, 247, 119, 22, 50, 219, 207, 90, 95, 127, 92, ...]}, :default, :default} ]} ]}, {:clause, 0, [{:match, 0, {:var, 0, :Key}, {:atom, 0, :attributes}}], [], [ {:call, 0, {:remote, 0, {:atom, 0, :erlang}, {:atom, 0, :get_module_info}}, [{:atom, 0, ExploreAstApp}, {:var, 0, :Key}]} ]}, {:clause, 0, [{:match, 0, {:var, 0, :Key}, {:atom, 0, :compile}}], [], [ {:call, 0, {:remote, 0, {:atom, 0, :erlang}, {:atom, 0, :get_module_info}}, [{:atom, 0, ExploreAstApp}, {:var, 0, :Key}]} ]}, {:clause, 0, [{:match, 0, {:var, 0, :Key}, {:atom, 0, :md5}}], [], [ {:call, 0, {:remote, 0, {:atom, 0, :erlang}, {:atom, 0, :get_module_info}}, [{:atom, 0, ExploreAstApp}, {:var, 0, :Key}]} ]}, {:clause, 0, [{:atom, 0, :deprecated}], [], [nil: 0]} ]}, {:function, 15, :hello, 0, [{:clause, 15, [], [], [{:atom, 0, :world}]}]} ]} ]}} 可以看到 AST 以 Erlang Terms 的形式表示(称之为 Abstract Code), 方便阅读. 该 Abstract Code, 在 cover 进行 on-the-fly 插桩过程中大有妙用. 上述 AST 结构简单易读, 我们可以很简单的将其与模块编译前的源代码(lib/explore_ast_app.ex)对应起来, 虽然该 AST 结构是最终的 Erlang AST, 被 Erlang 编译器添加了部分额外的信息, 但不影响阅读: 元组(tuple)中的第二个元素一般表示所处的源码行数. 你可以通过官方文档详细了解下 Erlang 的 Abstract Format, 动手多观察几个 BEAM 文件的 Erlang AST 的结构, 便可了熟于心. 值得注意的是 Abstract Code 在 OTP 20 之前是存放在 BEAM 文件的 Abst Chunk 中的. 如果你想了解更多关于 BEAM 文件的细节, 可以查看以下两篇文档: http://beam-wisdoms.clau.se/en/latest/indepth-beam-file.html#beam-term-format https://blog.stenmans.org/theBeamBook/#BEAM_files 2.4 Elixir 源码编译过程了解了 BEAM File Format(BEAM 文件格式)之后, 我们还有必要了解下 Elixir 代码的编译过程, 有助于我们更好的理解 cover. Elixir 源码的编译为 BEAM 文件的过程可能和你想象的不太一样, 不直接从 Elixir 的 AST, 经过编译器后端的处理后成为可执行的 BEAM Code, 中间还有一个过程, 如下图所示: 上图的过程可以描述为: Step 1、Elixir 源代码会被自定义的词法分析器(elixir_tokenizer)和 yacc 进行语法分析生成初始版的 Elixir AST, AST 以 Elixir Terms 的形式表示;如果你对 Elixir 的 AST 感兴趣, 可以关注下这个项目 arjan/ast_ninja. Step 2、在 Elixir AST 阶段, 一些自定义的和内置的宏(Macros)还没有被展开, 这些宏在 Expanded Elixir AST 展开为最终的 Elixir AST(final Elixir AST); Step 3、final Elixir AST 经过 Elixir Compiler 处理会被转换为 Erlang 标准的 AST 形式(Erlang Abstract Format); Step 4、最后, Elixir 会使用 Erlang 的 Compiler 处理 Erlang AST, 将其转换为可被 BEAM 虚拟机(VM)执行的 BEAM 字节码. 关于 compiler 的细节, 可以查看: elixir_compiler.erl 和 elixir_erl.erl 源码, 如果你也想了解 Erlang Compiler 的细节, 可以查看 theBeamBook/#CH-Compiler. 2.5 Cover On-The-Fly 插桩实现现在该来到正餐环节了, 让我们来看看 cover 是如何进行插桩和覆盖率收集的, 使用 cover 完成代码覆盖率收集, 必须要知道三把屠龙利剑: cover:start: 用于创建 cover 覆盖率收集进程, 它会完成存储覆盖率数据的相关 ets 表的创建, cover.erl#L159 & cover.erl#L632, 还可以启动远程(remote) Erlang 节点的 cover 进程. cover:compile_beam: 进行插桩, cover 会读取 BEAM 文件的 abstract_code 的内容, 即 Erlang AST, 关键代码在 cover.erl#L1541, 然后对 Erlang AST From 进行 transform 和 munge, 它会调用 bump_call, 在每一个可执行行后插入如下 abstract_code: 123456789{call,A,{remote,A,{atom,A,ets},{atom,A,update_counter}}, [{atom,A,?COVER_TABLE}, {tuple,A,[{atom,A,?BUMP_REC_NAME}, {atom,A,Vars#vars.module}, {atom,A,Vars#vars.function}, {integer,A,Vars#vars.arity}, {integer,A,Vars#vars.clause}, {integer,A,Line}]}, {integer,A,1}]}. 通过前文对 Erlang AST 的了解, 我们知道这相当于插入了如下一行代码: 1ets:update_counter(?COVER_TABLE, #bump{module=Module, function=Function, arity=Arity, clause=Clause, line=Line}, 1). 然后对于被 munge 后的 Erlang AST Form, cover 使用了 Erlang Compiler 从被 munge 后的 AST 表达形式中获取 Erlang Beam Code(又称 object code, 即字节码, VM 执行指令)cover.erl#L1580, 然后利用 Erlang code server 将获取到的新 object code 替换旧的 object code, load_binary cover.erl#L1581 到了 ERTS(Erlang Run Time System)中 . cover 完成了 Erlang AST 插桩流程, 这样, 每当可执行行被执行, 对应的 ets 存储表都会更新该行被 call 的次数. cover:analyze: 分析 ets 表中存储的数据, 可获取可执行被执行(called)的次数, 可用于统计覆盖率数据. munge: 用于对数据或文件进行一系列可能具有破坏性或不可撤销的更改. 3. Elixir Application 运行时覆盖率采集示例通过前文, 在了解了 Erlang Cover 模块的实现细节之后, 让我们以一个部署运行的 Elixir Application(我们会使用之前的 yeshan333/explore_ast_app ) 为例, 进行Elixir 应用运行时的大型测试(系统 & 集成测试)代码行级覆盖率采集. 这里我们会使用到一个工具库: ex_integration_coveralls 进行覆盖率的分析, 它是 Erlang 模块 cover 的一个 Elixir Wrapper. 让我们开始: Step 1、添加 ex_integration_coveralls 依赖到 mix.exs 文件中: 123456defp deps do [ ..., {:ex_integration_coveralls, "~> 0.3.0"} ]end 拉取依赖, 重新构建项目: 12mix deps.getMIX_ENV=prod mix distillery.release Step 2、启动项目: 1_build/prod/rel/explore_ast_app/bin/explore_ast_app foreground Step 3、连接运行时应用节点的 remote_console: 1_build/prod/rel/explore_ast_app/bin/explore_ast_app remote_console Step 4、利用 ex_integration_coveralls (ExIntegrationCoveralls.execute) 启动 cover, 执行代码覆盖率收集: 12345678910111213141516iex(explore_ast_app@127.0.0.1)1> compiled_beam_dir_path = "/Users/yeshan/oss_github/explore_ast_app/_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin""/Users/yeshan/oss_github/explore_ast_app/_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin"iex(explore_ast_app@127.0.0.1)2> ExIntegrationCoveralls.execute(compiled_beam_dir_path)[ ok: ExploreAstApp.Router, ok: ExploreAstApp.Plug.VerifyRequest.IncompleteRequestError, ok: ExploreAstApp.Plug.VerifyRequest, ok: ExploreAstApp.Application, ok: ExploreAstApp]iex(explore_ast_app@127.0.0.1)3> compile_time_source_lib_abs_path = "/Users/yeshan/oss_github/explore_ast_app""/Users/yeshan/oss_github/explore_ast_app"iex(explore_ast_app@127.0.0.1)4> source_code_abs_path = "/Users/yeshan/oss_github/explore_ast_app""/Users/yeshan/oss_github/explore_ast_app"iex(explore_ast_app@127.0.0.1)5> ExIntegrationCoveralls.get_total_coverage(compile_time_source_lib_abs_path, source_code_abs_path)0 可以看到, 初始的覆盖率是 0, 还没有代码被调用. Step 5、让我们执行以下 cURL : 12 $ curl --location --request GET 'http://localhost:8080/hello'hello % 再次查看代码覆盖率数据: 12iex(explore_ast_app@127.0.0.1)6> ExIntegrationCoveralls.get_total_coverage(compile_time_source_lib_abs_path, source_code_abs_path)17.1 可以看到, cURL(测试)对该项目的覆盖率是 17.1%. 我们还可以使用如下方式查看更为详尽的代码覆盖情况, 比如查看 lib/explore_ast_app/router.ex 的代码覆盖情况(nil 表示该行不是 executable line): 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132iex(explore_ast_app@127.0.0.1)7> result = ExIntegrationCoveralls.get_coverage_report(compile_time_source_lib_abs_path, source_code_abs_path).......iex(explore_ast_app@127.0.0.1)8> Enum.at(Map.get(result, :files), 3)%ExIntegrationCoveralls.Stats.Source{ coverage: 18.2, filename: "lib/explore_ast_app/router.ex", hits: 4, misses: 18, sloc: 22, source: [ %ExIntegrationCoveralls.Stats.Line{ coverage: 1, source: "defmodule ExploreAstApp.Router do" }, %ExIntegrationCoveralls.Stats.Line{coverage: 1, source: " use Plug.Router"}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " use Plug.ErrorHandler" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " import Plug.Conn" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " alias ExploreAstApp.Plug.VerifyRequest" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug Plug.Parsers, parsers: [:urlencoded, :multipart]" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug VerifyRequest, fields: [\\"content\\", \\"mimetype\\"], paths: [\\"/upload\\"]" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " plug :match"}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug Plug.Parsers, parsers: [:json], pass: [\\"application/json\\"], json_decoder: Jason" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug :dispatch" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " get \\"/welcome\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " send_resp(conn, 200, \\"Welcome\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " get \\"/upload\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " send_resp(conn, 201, \\"Uploaded\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 1, source: " get \\"/hello\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # query parameter is user like this:" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # http://localhost:4001/hello?name=John" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # which will create %{\\"name\\" => \\"John\\"}" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 1, source: " send_resp(conn, 200, \\"hello \\#{Map.get(conn.query_params, \\"name\\")}\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " get \\"/hello/:name\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " send_resp(conn, 200, \\"hello \\#{name}\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " post \\"/hello\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # json body of POST request {\\"name\\": \\"John\\"} is parsed to %{\\"name\\" => \\"John\\"}" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # so it can be accesable with e.g. Map.get(conn.body_params, \\"name\\") or with pattern matching" }, %ExIntegrationCoveralls.Stats.Line{coverage: 0, source: " name ="}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " case conn.body_params do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " %{\\"name\\" => a_name } -> a_name" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " _ -> \\"\\"" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, ...}, %ExIntegrationCoveralls.Stats.Line{...}, ... ]} 基于 post_cov_stats_to_ud_ci 接口,可以进一步对接内部或外部的类似于 Codecov 的覆盖率系统. 基于此, 我们可以实现在 Elixir Application 不停止运行的情况下, 配合大型(集成 & 系统)测试能力, 完成代码覆盖率的收集. 4. 大规模 Elixir/Erlang 微服务集群连续运行时覆盖率收集方案随着 Elixir 微服务系统规模的不断扩大, 前一节所展现的覆盖率收集手段需要进一步的演进. 参考 Prometheus Pull-Base 的设计, 总体设计(Pull & Push 模式结合)如下: 我们基于 ex_integration_coveralls 做拓展, 在 Elixir Application 启动后, 拉起一个 http worker 将代码覆盖率数据实时暴露出去, 方便与异构系统的通信. 由 Coverage Push Gateway 负责定时拉取覆盖率数据(Gateway 可以是一个 OTP Application, 这让可以直接让ex_integration_coveralls 拉起 GenServer Worker 在分布式 OTP 系统进行交互集成), 在集成/系统测试系统告知测试结束后, Gateway 将覆盖率 push 给 Cover Center(覆盖率中心)进行代码覆盖率展示. End(long way to go). 参考 Code Coverage at Google Erlang cover A brief introduction to BEAM A peak into the Erlang compiler and BEAM bytecode Getting each stage of Elixir’s compilation all the way to the BEAM bytecode excoveralls BeamFile - A peek into the BEAM file https://github.com/KronicDeth/intellij-elixir#beam-files","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"},{"name":"Test Coverage","slug":"Test-Coverage","permalink":"https://yeshan333.github.io/tags/Test-Coverage/"}]},{"title":"(译) Understanding Elixir Macros, Part 6 - In-place Code Generation","slug":"understanding-elixir-macros-part-6-in-place-code-generation","date":"2022-06-19T17:47:21.000Z","updated":"2022-06-19T17:47:21.000Z","comments":true,"path":"2022/06/19/understanding-elixir-macros-part-6-in-place-code-generation/","permalink":"https://yeshan333.github.io/2022/06/19/understanding-elixir-macros-part-6-in-place-code-generation/","excerpt":"","text":"Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir Macros, Part 2 - Macro Theory [3] (译) Understanding Elixir Macros, Part 3 - Getting into the AST [4] (译) Understanding Elixir Macros, Part 4 - Diving Deeper [5] (译) Understanding Elixir Macros, Part 5 - Reshaping the AST [6] (译) Understanding Elixir Macros, Part 6 - In-place Code Generation原文 GitHub 仓库, 作者: Saša Jurić. 这是宏系列文章的最后一篇. 在开始之前, 我想提一下 Björn Rochel, 他已经将他的 Apex 库中的 deftraceable 宏改进了. 因为他发现系列文章中 deftraceable 的版本不能正确处理默认参数(arg \\ def_value), 于是做了一个修复 bugfix. 这次, 让我们结束这个宏的故事. 今天的文章知识点可能是整个系列中涉及最广的, 我们将讨论原地代码生成的相关技术, 以及它可能对宏的影响. 在模块 module 中生成代码正如我在第 1 章中提到的那样, 宏并不是 Elixir 中唯一的元编程机制. 我们也可以在模块中直接生成代码. 为了唤起你的记忆, 我们来看看下面的例子: 12345678910111213141516171819202122defmodule Fsm do fsm = [ running: {:pause, :paused}, running: {:stop, :stopped}, paused: {:resume, :running} ] # Dynamically generating functions directly in the module for {state, {action, next_state}} <- fsm do def unquote(action)(unquote(state)), do: unquote(next_state) end def initial, do: :runningendFsm.initial# :runningFsm.initial |> Fsm.pause# :pausedFsm.initial |> Fsm.pause |> Fsm.pause# ** (FunctionClauseError) no function clause matching in Fsm.pause/1 在这里, 我们直接在模块中动态生成函数子句(clause). 这允许我们针对某些输入(在本例中是关键字列表)进行元编程, 并生成代码, 而无需编写专门的宏. 注意, 在上面的代码中, 我们如何使用 unquote 将变量注入到函数子句定义中. 这与宏的工作方式完全一致. 请记住, def 也是一个宏, 并且宏接收的参数总是被 quoted. 因此, 如果您想要一个宏参数接收某个变量的值, 您必须在传递该变量时使用 unquote. 仅仅调用 def action 是不够的, 因为 def 宏接收到的是对 action 的 unquoted, 而不是变量 action 中的值. 当然, 您可以以这种动态的方式调用自己的宏, 原理是一样的. 然而, 有一个意想不到的情况 — 生成(evaluation) 的顺序与你的预期可能不符. 展开的顺序正如你所预料的那般, 模块级代码(不是任何函数的一部分的代码)在 Elixir 编译过程的展开阶段被执行. 有些令人意外的是, 这将发生在所有宏(除了 def)展开之后. 很容易去证明这一点: 1234567891011121314151617iex(1)> defmodule MyMacro do defmacro my_macro do IO.puts "my_macro called" nil end endiex(2)> defmodule Test do import MyMacro IO.puts "module-level expression" my_macro end# Output:my_macro calledmodule-level expression 从输出看出, 即使代码中相应的 IO.puts 调用在宏调用之前, 但 mymacro 还是在 IO.puts 之前被调用了. 这证明编译器首先解析所有标准宏. 然后开始生成模块, 也是在这个阶段, 模块级代码以及对 def 的调用被执行. 模块级友好宏这对我们自己的宏有一些重要的影响. 例如, 我们的 deftraceable 宏也可以动态调用. 但是, 现在它还不能工作: 123456789101112131415161718192021iex(1)> defmodule Tracer do ... endiex(2)> defmodule Test do import Tracer fsm = [ running: {:pause, :paused}, running: {:stop, :stopped}, paused: {:resume, :running} ] for {state, {action, next_state}} <- fsm do # Using deftraceable dynamically deftraceable unquote(action)(unquote(state)), do: unquote(next_state) end deftraceable initial, do: :running end** (MatchError) no match of right hand side value: :error expanding macro: Tracer.deftraceable/2 iex:13: Test (module) 出现一个有点神秘, 而且不是非常有帮助的错误提示. 那么出了什么问题?如上一节所述, 在 in-place 本地模块执行开始之前, 将进行宏展开. 对我们来说, 这意味着 deftraceable 被调用之前, for 语境甚至还没有执行. 因此, 即使它是从当前语境中调用, deftraceable 实际上将只被调用一次. 此外, 由于未对当前语境进行求值, 因此当我们的宏被调用时, 内部变量 state, action 和 next_state 都不存在. 怎么可以让它工作?本质上, 我们的宏将靠 unquote 来调用 - head 和 body 将分别包含代表 unquote(action)(unquote(state)) 和 unquote(next_state)的 AST. 现在, 回想一下当前版本的 deftraceable, 我们对宏中的输入做了一些假设. 这里是一段伪代码: 12345678defmacro deftraceable(head, body) do # 这里, 我们假设输入头部是什么样的, 并执行一些操作 # AST 转换基于这些假设. quote do ... endend 这就是我们的问题. 如果我们在原地生成代码的同时动态地调用 deftraceable, 那么这样的假设就不再成立. 延迟代码生成当宏执行时, 区分宏上下文和调用者的上下文是很重要的: 123456defmacro my_macro do # Macro context(宏上下文): 这里的代码是宏的正常部分, 并在宏运行时被执行 quote do # Caller's context(调用者上下文): 生成的代码在宏所在的位置运行 end 这就是让事情变得有点棘手的地方. 如果我们想支持对宏的模块级动态调用, 就不应该在宏上下文中做任何假定. 相反, 我们应该将代码生成推迟到调用方的上下文中. 用这段代码说明: 1234567defmacro deftraceable(head, body) do # Macro context: 我们不应该对输入 AST 做任何假设 quote do # Caller's context: 我们应该在这里转换输入的 AST, 然后在这里做出我们的假设 endend 为什么我们可以在调用者的上下文(Caller’s context)中进行假设? 因为这段代码将在所有宏展开后运行. 例如, 请记住, 即使我们的宏是从一个推导式中调用的, 它也只会被调用一次. 但是, 宏生成的代码将在推导式中运行 — 对每个元素运行一次. 因此, 这种方法相当于推迟了最终的代码生成. 我们生成的中间模块级语句将生成最终代码, 而不是立即生成目标代码. 这些中间语句将在扩展的最后时刻运行, 在所有其他宏都已处理之后: 1234567891011121314defmodule Test do ... for {state, {action, next_state}} <- fsm do # 在 deftraceable 扩展后, 这里我们将得到一个 # 生成在目标函数的代码, 此代码会被推导式执行. # 即在每一次 for 循环中被调用一次. # 此时, 我们在调用者的上下文中, # 并且可以访问 state、action和 next_state 变量 # 正确生成相应的函数. end ...end 在实现解决方案之前, 必须注意到这不是一个通用的模式, 你应该考虑是否真的需要这个方法. 如果你的宏不打算用于模块级别, 那么你可能应该避免使用这种技术. 否则, 如果从函数定义内部调用宏, 并且将代码生成操作移动到调用者的上下文中, 那么实际上将代码执行从编译时(compile-time)移动到了运行时(run-time), 这会影响到性能. 此外, 即使你的宏是在模块级别上运行的, 只要你对输入不做任何假定, 就没有必要使用这项技巧. 例如, 在第 2 章中, 我们模拟了 Plug 的 get 宏: 1234567defmacro get(route, body) do quote do defp do_match("GET", unquote(route), var!(conn)) do unquote(body[:do]) end endend 即使这个宏在模块级上工作, 它并没有假设 AST 的结构, 只是在调用者的上下文中注入输入片段, 并散布一些样板代码. 当然, 我们希望 body 会有一个 :do 选项, 但我们并没有对 body[:do] AST 的具体形状和结构作任何假定. 总结一下, 如果你的宏是在模块级别调用的, 这可能是通用的模式: 123456789defmacro ... # 宏上下文(Macro context): # 可以在这里做任何准备工作, # 只要不对输入的 AST 作任何假设 quote do # 调用者上下文(Caller's context): # 如果你需要分析或转换输入的 AST, 你应该在这里进行. end 由于调用者上下文(Caller’s context)是模块级的, 因此这种延迟转换仍将在编译时发生, 不会有运行时性能损失. 解决方案鉴于这些讨论, 解决方案相对简单, 但解释它相当复杂. 所以我将从展示最终的结果开始(注意注释): 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182defmodule Tracer do defmacro deftraceable(head, body) do # 这是最重要的更改, 让我们能正确传递 # 输入 AST 到调用者的上下文中. 我稍后会解释这是如何工作的. quote bind_quoted: [ head: Macro.escape(head, unquote: true), body: Macro.escape(body, unquote: true) ] do # Caller's context: 我们将从这里生成代码 # 由于代码生成被推迟到调用者上下文, # 我们现在可以对输入 AST 做出我们的假设. # 此代码大部分与以前的版本相同 # # 注意, 这些变量现在在调用者的上下文中创建 {fun_name, args_ast} = Tracer.name_and_args(head) {arg_names, decorated_args} = Tracer.decorate_args(args_ast) # 与以前的版本完全相同. head = Macro.postwalk(head, fn ({fun_ast, context, old_args}) when ( fun_ast == fun_name and old_args == args_ast ) -> {fun_ast, context, decorated_args} (other) -> other end) # 此代码与以前的版本完全相同. # Note: 但是, 请注意, 代码像前面三个表达式那样 # 在相同的上下文中执行. # # 因此, unquote(head) 在这里引用了 head 变量 # 在此上下文中计算, 而不是宏上下文. # 这同样适用于其它发生在函数体中的 unquote. # # 这就是延迟代码生成的意义所在. 我们的宏产生 # 此代码, 然后依次生成最终代码. def unquote(head) do file = __ENV__.file line = __ENV__.line module = __ENV__.module function_name = unquote(fun_name) passed_args = unquote(arg_names) |> Enum.map(&inspect/1) |> Enum.join(",") result = unquote(body[:do]) loc = "#{file}(line #{line})" call = "#{module}.#{function_name}(#{passed_args}) = #{inspect result}" IO.puts "#{loc} #{call}" result end end end # 与前一个版本相同, 但函数被导出, 因为它们 # 必须从调用方的上下文中调用. def name_and_args({:when, _, [short_head | _]}) do name_and_args(short_head) end def name_and_args(short_head) do Macro.decompose_call(short_head) end def decorate_args([]), do: {[],[]} def decorate_args(args_ast) do for {arg_ast, index} <- Enum.with_index(args_ast) do arg_name = Macro.var(:"arg#{index}", __MODULE__) full_arg = quote do unquote(arg_ast) = unquote(arg_name) end {arg_name, full_arg} end |> Enum.unzip endend 让我们试试这个宏:、 1234567891011121314151617181920212223iex(1)> defmodule Tracer do ... endiex(2)> defmodule Test do import Tracer fsm = [ running: {:pause, :paused}, running: {:stop, :stopped}, paused: {:resume, :running} ] for {state, {action, next_state}} <- fsm do deftraceable unquote(action)(unquote(state)), do: unquote(next_state) end deftraceable initial, do: :running endiex(3)> Test.initial |> Test.pause |> Test.resume |> Test.stopiex(line 15) Elixir.Test.initial() = :runningiex(line 13) Elixir.Test.pause(:running) = :pausediex(line 13) Elixir.Test.resume(:paused) = :runningiex(line 13) Elixir.Test.stop(:running) = :stopped 正如你所看到的那样, 修改并不复杂. 我们设法保持我们的大部分代码完整, 虽然我们不得不用一些技巧:bind_quoted:true 和 Macro.escape: 123456quote bind_quoted: [ head: Macro.escape(head, unquote: true), body: Macro.escape(body, unquote: true)] do ...end 让我们仔细看看它们是什么意思. bind_quoted记住, 我们的宏生成一个代码, 它将生成最终的代码. 在第一级生成的代码(由我们的宏返回的代码)的某处, 我们需要放置以下表达式: 1def unquote(head) do ... end 这个表达式将在调用者的上下文(客户端模块)中被调用, 它的任务是生成函数. 如在注释中提到的, 重要的是要理解 unquote(head) 在这里引用的是存在于调用者上下文中的 head 变量. 我们不是从宏上下文注入一个变量, 而是一个存在于调用者上下文中的变量. 但是, 我们不能使用简单的 quote 生成这样的表达式: 123quote do def unquote(head) do ... endend 记住 unquote 如何工作. 它往 unquote 调用里的 head 变量中注入了 AST. 这不是我们想要的. 我们想要的是生成表示对 unquote 的调用的 AST, 然后在调用者的上下文中执行, 并引用调用者的 head 变量. 这可以通过提供 unquote:false 选项来实现: 123quote unquote: false do def unquote(head) do ... endend 这里, 我们将生成代表 unquote 调用的代码. 如果这个代码被注入到正确的地方, 且其中变量 head 存在, 我们将最终调用 def 宏, 传递 head 变量中的任何值. 所以似乎使用 unquote: false 可以达到我们想要的效果, 但有一个缺点, 我们不能从宏上下文访问任何变量: 1234foo = :barquote unquote: false do unquote(foo) # <- 由于 unquote: false, 工作不正常end 使用 unquote: false 有效地阻止立即注入 AST, 并将 unquote 当作任意其它函数调用. 因此, 我们不能将某些东西注入到目标 AST. 这里 bind_quoted 派上了用场. 通过提供 bind_quoted: bindings, 我们可以禁用立即 unquoting, 同时仍然绑定我们想要传递到调用者上下文的任何数据: 123456789quote bind_quoted: [ foo: ..., bar: ...] do unquote(whatever) # <- 类似于 unquote: false 的作用 foo # <- 由于 bind_quoted 而可访问 bar # <- 由于 bind_quoted 而可访问end 代码注入 vs 数据传输我们要面临的另一个问题是: 从宏传递到调用者上下文的内容在默认情况下是注入的, 而不是传输的. 因此, 当你使用 unquote(som_ast) 时, 你正在将一个 AST 片段注入到用 quote expression 构建的另一个 AST 片段中. 有时候, 我们希望传输数据, 而不是注入数据. 我们来看一个例子. 假设我们有一些三元组, 我们想要传输到调用者的上下文中: 12iex(1)> data = {1, 2, 3}{1, 2, 3} 现在, 让我们尝试使用典型的 unquote 进行传输: 12iex(2)> ast = quote do IO.inspect(unquote(data)) end{{:., [], [{:__aliases__, [alias: false], [:IO]}, :inspect]}, [], [{1, 2, 3}]} 这似乎是有效的. 让我们用 eval_quoted 看下结果: 12iex(3)> Code.eval_quoted(ast)** (CompileError) nofile: invalid quoted expression: {1, 2, 3} 那么这里发生了什么? 问题是我们并没有真正传输 {1,2,3} 三元组. 我们将其注入到目标 AST 中, 注入意味着 {1,2,3} 本身被视为一个 AST 片段, 这显然是错误的. 在这种情况下, 我们真正想要的是数据传输. 在代码生成上下文中, 我们有一些数据要传输到调用者的上下文中. 这就是Macro.escape 作用所处. 通过转义一个 term, 我们可以确保它是被传输的, 而不是被注入的. 当我们调用 unquote(Macro.escape(term)) 时, 我们将注入一个 AST, 以 term 描述数据. 让我们试试: 123456iex(3)> ast = quote do IO.inspect(unquote(Macro.escape(data))) end{{:., [], [{:__aliases__, [alias: false], [:IO]}, :inspect]}, [], [{:{}, [], [1, 2, 3]}]}iex(4)> Code.eval_quoted(ast){1, 2, 3} 如你所见, 我们成功传送了未受影响的数据. 再看我们的延迟代码生成, 这正是我们需要的. 与注入目标 AST 不同, 我们想要传输输入 AST, 完全保留它的形状: 1234567defmacro deftraceable(head, body) do # 这里我们有 head 和 body 的 AST quote do # 我们在这里需要相同的 head和 body 的AST, 以便生成 # 最终代码. endend 通过使用 Macro.escape/1, 我们可以确保输入 AST 被原原本本地传输回调用者的上下文, 在那里我们将生成最终的代码. 正如前一节所讨论的, 我们使用了 bind_quoted, 但原理相同: 1234567quote bind_quoted: [ head: Macro.escape(head, unquote: true), body: Macro.escape(body, unquote: true)] do # 这里我们有了从宏上下文中得到的 # head 和 body 的精确副本.end Escaping 和 unquote: true注意我们传递给了 Macro.escape 一个欺骗性的 unquote: true 选项. 这是最难解释的. 为了能够理解它, 你必须清楚 AST 是如何传递给宏并返回到调用者的上下文中的. 首先, 记住我们如何调用我们的宏: 1deftraceable unquote(action)(unquote(state)) do ... end 现在, 由于宏实际上接收到的是 quoted 的参数, head 参数将等同于以下内容: 1234# 这是宏上下文中的 head 参数实际包含的内容quote unquote: false do unquote(action)(unquote(state))end 请记住, Macro.escape 会保存数据, 因此当你在其他 AST 中传输变量时, 其内容将保持不变. 考虑下上面的 head 形状, 这是我们在宏展开后最终会出现的情况: 123456789101112131415# 调用者的上下文for {state, {action, next_state}} <- fsm do # 这里是我们生成函数的代码. 由于 bind_quoted, 这里 # 我们可以使用 head 和 body 变量. # 变量 head 等效于 # quote unquote: false do # unquote(action)(unquote(state)) # end # 我们真正需要的是: # quote do # unquote(action)(unquote(state)) # endend 为什么我们需要 quoted head 的第二种形式? 因为这个 AST 现在是在调用者的上下文中形成的, 在这个上下文中我们有可用的 action 和 state 变量. 第二个表达式会用到这些变量的内容. 这就是所谓的 unquoted: true 的作用. 当我们调用 Macro.escape(input_ast, unquote: true) 时, 我们仍然(大部分)保留传输数据的形状, 但输入 AST 中的 unquote 片段(例如, unquote(action) )将在调用方的上下文中解析. 总的来说, 输入 AST 到调用者上下文的正确传输方式如下所示: 123456789defmacro deftraceable(head, body) do quote bind_quoted: [ head: Macro.escape(head, unquote: true), body: Macro.escape(body, unquote: true) ] do # Generate the code here end ...end 这并不算难, 但需要一些时间来理解这里到底发生了什么. 试着确保你不是盲目地做 escapes(和/或 unquote: true), 而不理解这是你真正想要的. 毕竟, 这不是默认的行为是有原因的. 在编写宏时, 要考虑你是否要注入一些 AST, 或者不加更改地传输数据. 在后一种情况, 你需要使用 Macro.escape. 如果传输的数据是一个 AST 且可能包含 unquote 片段, 那么您可能需要以 unquote: true 的方式使用 Macro.escape . 回顾关于 Elixir 宏的系列文章到此结束了. 我希望你觉得这些文章有趣且有学习意义, 并且对宏的工作机制有了更多的了解和使用信心. 一定要记住 — 在展开阶段, 宏相当于 AST 片段的普通组合. 如果你理解调用者的上下文和宏输入, 那么直接执行转换或在必要时通过延迟执行转换并不算难. 本系列绝不可能涵盖方方面面和所有的细节. 如果你想了解更多, quote/2 special form 的文档是一个不错的地方. 您还可以在 Macro 和 Code 模块中找到一些有用的帮助程序. Happy meta-programming! 原文: https://www.theerlangelist.com/article/macros_6","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir-Macros","slug":"Elixir-Macros","permalink":"https://yeshan333.github.io/tags/Elixir-Macros/"}]},{"title":"(译) Understanding Elixir Macros, Part 5 - Reshaping the AST","slug":"understanding-elixir-macros-part-5-reshaping-the-ast","date":"2022-06-19T16:56:29.000Z","updated":"2022-06-19T16:56:29.000Z","comments":true,"path":"2022/06/19/understanding-elixir-macros-part-5-reshaping-the-ast/","permalink":"https://yeshan333.github.io/2022/06/19/understanding-elixir-macros-part-5-reshaping-the-ast/","excerpt":"","text":"Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir Macros, Part 2 - Macro Theory [3] (译) Understanding Elixir Macros, Part 3 - Getting into the AST [4] (译) Understanding Elixir Macros, Part 4 - Diving Deeper [5] (译) Understanding Elixir Macros, Part 5 - Reshaping the AST [6] (译) Understanding Elixir Macros, Part 6 - In-place Code Generation原文 GitHub 仓库, 作者: Saša Jurić. 上次我介绍了一个基本版本的可追溯宏 deftraceable, 它允许我们编写可跟踪的函数. 这个宏的最终版本还有一些遗留的问题, 今天我们将解决其中一个 — 参数模式匹配. 从今天的练习应该认识到, 我们必须仔细考虑关于宏可能接收到的输入的所有假设情况. 问题所在正如我上次所暗示的那样, 当前版本的 deftraceable 不能使用模式匹配的参数. 让我们来演示一下这个问题: 12345678iex(1)> defmodule Tracer do ... endiex(2)> defmodule Test do import Tracer deftraceable div(_, 0), do: :error end** (CompileError) iex:5: unbound variable _ 发生了什么? deftraceable 宏盲目地假设输入参数是普通变量或常量. 因此, 当你调用 deftracable div(a, b) 时, deftracable div(a, b), do: ... 生成的代码将包含: 1passed_args = [a, b] |> Enum.map(&inspect/1) |> Enum.join(",") 上面这段会按预期工作, 但如果一个参数是匿名变量(_), 那么我们将生成以下代码: 1passed_args = [_, 0] |> Enum.map(&inspect/1) |> Enum.join(",") 这显然是不正确的, 因此我们得到了未绑定变量错误. 那么解决方案是什么呢? 我们不应该对输入参数做任何假设. 相反, 我们应该将每个参数放入宏生成的专用变量中. 或者用代码来表达, 如果宏被调用: 1deftraceable fun(pattern1, pattern2, ...) 我们会生成这样的函数头: 1def fun(pattern1 = arg1, pattern2 = arg2, ...) 这将允许我们将参数值代入内部临时变量, 并打印这些变量的内容. 解决方案让我们来实现它. 首先, 我将向你展示解决方案的顶层示意版: 1234567891011121314151617181920defmacro deftraceable(head, body) do {fun_name, args_ast} = name_and_args(head) # 通过给每个参数添加 "= argX"来装饰输入参数. # 返回参数名称列表 (arg1, arg2, ...) {arg_names, decorated_args} = decorate_args(args_ast) head = ?? # Replace original args with decorated ones quote do def unquote(head) do ... # 不变 # 使用临时变量构造追踪信息 passed_args = unquote(arg_names) |> Enum.map(&inspect/1) |> Enum.join(",") ... # 不变 end endend 首先, 我们从函数头(head)提取函数名称和 args (我们在前一篇文章中解决了这个问题). 然后, 我们必须将 = argX 注入到 args_ast 中, 并收回修改后的参数(我们将将其放入 decorated_args中). 我们还需要生成的变量的纯名称(或者更确切地说是它们的 AST), 因为我们将使用这些名称来收集参数值. 变量 arg_names 实际上包含 quote do [arg_1, arg_2, ....] end, 可以很容易地注入到 AST 树中. 我们来实现剩下的部分. 首先, 让我们看看如何修饰参数: 1234567891011121314defp decorate_args(args_ast) do for {arg_ast, index} <- Enum.with_index(args_ast) do # 动态生成 quoted 标识符 arg_name = Macro.var(:"arg#{index}", __MODULE__) # 为 patternX = argX 生成 AST full_arg = quote do unquote(arg_ast) = unquote(arg_name) end {arg_name, full_arg} end |> Enum.unzipend 大多数操作发生在 for 语句中. 本质上, 我们处理了每个变量输入的 AST 片段, 然后使用 Macro.var/2 函数计算临时名称(quoted 的 argX), 它能将一个原子变换成一个名称与其相同的 quoted 的变量. Macro.var/2 的第二个参数确保变量是hygienic 的. 尽管我们将 arg1, arg2, ... 变量注入到调用者上下文中, 但调用者不会看到这些变量. 事实上, deftraceable 的用户可以自由地使用这些名称作为一些局部变量, 不会干扰我们的宏引入的临时变量. 最后, 在推导式的末尾, 我们返回一个元组, 该元组由临时的名称和 quoted 的完整模式组成 - (例如 _ = arg1, 或 0 = arg2). 使用 unzip 和 to_tuple 进行推导之后确保 decorate_args以 {arg_names, decorated_args} 的形式返回结果. decorate_args 辅助变量就绪后, 我们就可以传递输入参数, 并获得修饰参数, 以及临时变量的名称. 现在我们需要将这些修饰过的参数注入到函数的头部, 以取代原始参数. 要注意, 我们需要做到以下几点: 递归遍历输入函数头的 AST 找到指定函数名和参数的位置 用修饰过的参数的 AST 替换原始(输入)参数 如果我们使用宏, Macro.postwalk/2 这个处理可以被合理地简化掉: 1234567891011121314151617181920212223242526defmacro deftraceable(head, body) do {fun_name, args_ast} = name_and_args(head) {arg_names, decorated_args} = decorate_args(args_ast) # 1. 递归地遍历 AST head = Macro.postwalk( head, # lambda 函数处理输入 AST 中的元素, 返回修改过的 AST fn # 2. 模式匹配函数名和参数所在的位置 ({fun_ast, context, old_args}) when ( fun_ast == fun_name and old_args == args_ast ) -> # 3. 将输入参数替换为修饰参数的 AST {fun_ast, context, decorated_args} # 头部 AST 中的其它元素(可能是 guards) # -> 我们让它保留不变 (other) -> other end ) ... # 不变end Macro.postwalk/2 递归地遍历 AST, 并且在所有节点的后代被访问之后, 为每个节点调用提供的 lambda 函数. lambda 函数接收元素的 AST, 这样我们有机会返回一些除了指定节点之外的东西. 我们在这个 lambda 里做的实际上是一个模式匹配, 我们在寻找 {fun_name, context, args}. 如第三篇文章中所述那样, 这是表达式 some_fun(arg1, arg2, ...) 的 quoted 表现形式. 一旦我们遇到匹配此模式的节点, 我们只需要用新的(修饰过的)输入参数替换掉旧的. 在所有其它情况下, 我们简单地返回输入的 AST, 使得树的其余部分不变. 这看着有点复杂了, 但它解决了我们的问题. 以下是 deftraceable 宏的最终版本: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859defmodule Tracer do defmacro deftraceable(head, body) do {fun_name, args_ast} = name_and_args(head) {arg_names, decorated_args} = decorate_args(args_ast) head = Macro.postwalk(head, fn ({fun_ast, context, old_args}) when ( fun_ast == fun_name and old_args == args_ast ) -> {fun_ast, context, decorated_args} (other) -> other end) quote do def unquote(head) do file = __ENV__.file line = __ENV__.line module = __ENV__.module function_name = unquote(fun_name) passed_args = unquote(arg_names) |> Enum.map(&inspect/1) |> Enum.join(",") result = unquote(body[:do]) loc = "#{file}(line #{line})" call = "#{module}.#{function_name}(#{passed_args}) = #{inspect result}" IO.puts "#{loc} #{call}" result end end end defp name_and_args({:when, _, [short_head | _]}) do name_and_args(short_head) end defp name_and_args(short_head) do Macro.decompose_call(short_head) end defp decorate_args([]), do: {[],[]} defp decorate_args(args_ast) do for {arg_ast, index} <- Enum.with_index(args_ast) do # 动态生成 quoted 标识符(identifier) arg_name = Macro.var(:"arg#{index}", __MODULE__) # 为 patternX = argX 构建 AST full_arg = quote do unquote(arg_ast) = unquote(arg_name) end {arg_name, full_arg} end |> Enum.unzip endend 让我们来试试: 1234567891011121314iex(1)> defmodule Tracer do ... endiex(2)> defmodule Test do import Tracer deftraceable div(_, 0), do: :error deftraceable div(a, b), do: a/b endiex(3)> Test.div(5, 2)iex(line 6) Elixir.Test.div(5,2) = 2.5iex(4)> Test.div(5, 0)iex(line 5) Elixir.Test.div(5,0) = :error 正如你所看到的那样, 可以进入 AST, 分解它, 并在其中散布一些自定义的注入代码, 这并不算很复杂. 缺点是, 编写的宏的代码会变得越来越复杂, 并且更难分析. 今天的话题到此结束. 下一次, 我将讨论原地代码生成技术 《(译) Understanding Elixir Macros, Part 6 - In-place Code Generation》. 原文: https://www.theerlangelist.com/article/macros_5","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir-Macros","slug":"Elixir-Macros","permalink":"https://yeshan333.github.io/tags/Elixir-Macros/"}]},{"title":"(译) Understanding Elixir Macros, Part 4 - Diving Deeper","slug":"understanding-elixir-macros-part-4-diving-deeper","date":"2022-06-19T12:02:19.000Z","updated":"2022-06-19T12:02:19.000Z","comments":true,"path":"2022/06/19/understanding-elixir-macros-part-4-diving-deeper/","permalink":"https://yeshan333.github.io/2022/06/19/understanding-elixir-macros-part-4-diving-deeper/","excerpt":"","text":"Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir Macros, Part 2 - Macro Theory [3] (译) Understanding Elixir Macros, Part 3 - Getting into the AST [4] (译) Understanding Elixir Macros, Part 4 - Diving Deeper [5] (译) Understanding Elixir Macros, Part 5 - Reshaping the AST [6] (译) Understanding Elixir Macros, Part 6 - In-place Code Generation原文 GitHub 仓库, 作者: Saša Jurić. 在前一篇文章中, 我向你展示了分析输入 AST 并对其进行处理的一些基本方法. 今天我们将研究一些更复杂的 AST 转换. 这将重提已经解释过的技术. 这样做的目的是为了表明深入研究 AST 并不是很难的, 尽管最终的结果代码很容易变得相当复杂, 而且有点黑科技(hacky). 追踪函数调用在本文中, 我们将创建一个宏 deftraceable, 它允许我们定义可跟踪的函数. 可跟踪函数的工作方式与普通函数一样, 但每当我们调用它时, 都会打印出调试信息. 大致思路是这样的: 1234567891011defmodule Test do import Tracer deftraceable my_fun(a,b) do a/b endendTest.my_fun(6,2)# => test.ex(line 4) Test.my_fun(6,2) = 3 这个例子当然是虚构的. 你不需要设计这样的宏, 因为 Erlang 已经有非常强大的跟踪功能, 而且有一个 Elixir 包可用. 然而, 这个例子很有趣, 因为它需要一些更深层次的 AST 转换技巧. 在开始之前, 我要再提一次, 你应该仔细考虑你是否真的需要这样的结构. 例如 deftraceable 这样的宏引入了一个每个代码维护者都需要了解的东西. 看着代码, 它背后发生的事不是显而易见的. 如果每个人都设计这样的结构, 每个 Elixir 项目都会很快地变成自定义语言的大锅汤. 当代码主要依赖于复杂的宏时, 即使对于有经验的开发人员, 即使是有经验的开发人员也很难理解严重依赖于复杂宏的底层代码的实际流程. 但是在适当使用宏的情况下, 你不应该仅仅因为有人声称宏是不好的, 就不使用它. 例如, 如果在 Erlang 中没有跟踪功能, 我们就需要设计一些宏来帮助我们(实际上不需要类似上述的例子, 但那是另外一个话题), 否则我们的代码就会有大量重复的模板代码. 在我看来, 模板代码太多是不好的, 因为代码中有了太多形式化的噪音, 因此更难阅读和理解. 宏有助于减少这些噪声, 但在使用宏之前, 请先考虑是否可以优先使用 Elixir 内置的运行时结构(函数, 模块, 协议)来解决重复代码. 看完这个长长的免责声明, 让我们开始实现 deftraceable吧. 首先, 手动生成对应的代码. 让我们回顾下用法: 123deftraceable my_fun(a,b) do a/bend 生成的代码类似于这样: 123456789101112131415def my_fun(a, b) do file = __ENV__.file line = __ENV__.line module = __ENV__.module function_name = "my_fun" passed_args = [a,b] |> Enum.map(&inspect/1) |> Enum.join(",") result = a/b loc = "#{file}(line #{line})" call = "#{module}.#{function_name}(#{passed_args}) = #{inspect result}" IO.puts "#{loc} #{call}" resultend 这个想法很简单. 我们从编译器环境中获取各种数据, 然后计算结果, 最后将所有内容打印到屏幕上. 该代码依赖于 __ENV__ 特殊形式, 可用于在最终 AST 中注入各种编译时信息(例如行号和文件). __ENV__ 是一个结构体, 每当你在代码中使用它时, 它将在编译时展开为适当的值. 因此, 只要在代码中写入 __ENV__.file. 文件生成的字节码将包含包含文件名的(二进制)字符串常量. 现在我们需要动态构建这个代码. 让我们来看看大概的样子(outline): 12345678910111213141516171819defmacro deftraceable(??) do quote do def unquote(head) do file = __ENV__.file line = __ENV__.line module = __ENV__.module function_name = ?? passed_args = ?? |> Enum.map(&inspect/1) |> Enum.join(",") result = ?? loc = "#{file}(line #{line})" call = "#{module}.#{function_name}(#{passed_args}) = #{inspect result}" IO.puts "#{loc} #{call}" result end endend 这里我们在需要基于输入参数动态注入 AST 片段的地方放置问号(??). 特别地, 我们必须从传递的参数中推导出函数名、参数名和函数体. 现在, 当我们调用宏 deftraceable my_fun(...) do ... end, 宏接收两个参数 — 函数头(函数名和参数列表)和包含函数体的关键字列表. 这些都是被 quote 过的. 我是如何知道的?其实我不知道. 我一般通过不断试错来获得的这些信息. 基本上, 我从定义一个宏开始: 1234defmacro deftraceable(arg1) do IO.inspect arg1 nilend 然后我尝试从一些测试模块或 shell 中调用宏. 我将通过向宏定义中添加另一个参数来测试. 一旦我得到结果, 我会试图找出参数表示什么, 然后开始构建宏. 宏结束处的 nil 确保我们不生成任何东西(我们生成的 nil 通常与调用者代码无关). 这允许我进一步构建片段而不注入代码. 我通常依靠 IO.inspect和 Macro.to_string/1 来验证中间结果, 一旦我满意了, 我会删除 nil 部分, 看看是否能工作. 此时 deftraceable 接收函数头和身体. 函数头将是一个我们之前描述的结构的 AST 片段: 1{function_name, context, [arg1, arg2, ...] 所以接下来我们需要: 从 quoted 的头中提取函数名和参数 将这些值注入我们的宏返回的 AST 中 将函数体注入同一个 AST 打印跟踪信息 我们可以使用模式匹配从这个 AST 片段中提取函数名和参数, 有一个 Macro.decompose_call/1 的辅助功能函数可以帮我们做到. 做完这些步骤, 宏的最终版本实现如下所示: 12345678910111213141516171819202122232425262728defmodule Tracer do defmacro deftraceable(head, body) do # 提取函数名和参数 {fun_name, args_ast} = Macro.decompose_call(head) quote do def unquote(head) do file = __ENV__.file line = __ENV__.line module = __ENV__.module # 注入函数名和参数到 AST 中 function_name = unquote(fun_name) passed_args = unquote(args_ast) |> Enum.map(&inspect/1) |> Enum.join(",") # 将函数体注入到 AST result = unquote(body[:do]) # 打印 trace 跟踪信息 loc = "#{file}(line #{line})" call = "#{module}.#{function_name}(#{passed_args}) = #{inspect result}" IO.puts "#{loc} #{call}" result end end endend 让我们试一下: 12345678910111213iex(1)> defmodule Tracer do ... endiex(2)> defmodule Test do import Tracer deftraceable my_fun(a,b) do a/b end endiex(3)> Test.my_fun(10,5)iex(line 4) Test.my_fun(10,5) = 2.0 # trace output2.0 这似乎起作用了. 然而, 我应该立即指出, 这种实现存在一些问题: 宏不能很好地处理带守卫(guards)的函数定义 模式匹配参数并不总是有效的(例如, 当使用 _ 来匹配任何 term 时) 在模块中直接动态生成代码时, 宏不起作用. 我将逐一解释这些问题, 首先从守卫(guards)开始, 其余问题留待以后的文章再讨论. 处理 guards (守卫)所有具有可追溯性的问题都源于我们对输入 AST 做了一些事实假设. 这是一个危险的领域, 我们必须小心地涵盖所有情况. 例如, 宏假设 head 只包含函数名称和参数列表. 因此, 如果我们想定义一个带守卫的可跟踪函数, deftraceable 将不起作用: 123deftraceable my_fun(a,b) when a < b do a/bend 在这种情况下, 我们的头部(宏的第一个参数)也将包含守卫(guards)的信息, 并且不能被 macro .decompose_call/1 解析. 解决方案是检测这种情况, 并以一种特殊的方式处理它. 首先, 让我们来看看这个 head 是如何被 quoted 的: 12345678iex(16)> quote do my_fun(a,b) when a < b end{:when, [], [ {:my_fun, [], [{:a, [if_undefined: :apply], Elixir}, {:b, [if_undefined: :apply], Elixir}]}, {:<, [context: Elixir, import: Kernel], [{:a, [if_undefined: :apply], Elixir}, {:b, [if_undefined: :apply], Elixir}]} ]} 所以实际上我们的 guard head 实际上是这样的: {:when, _, [name_and_args, ...]}, 我们可以依靠它来使用模式匹配提取函数名称和参数: 12345678910defmodule Tracer do ... defp name_and_args({:when, _, [short_head | _]}) do name_and_args(short_head) end defp name_and_args(short_head) do Macro.decompose_call(short_head) end ... 当然, 我们需要从宏中调用这个函数: 123456789defmodule Tracer do ... defmacro deftraceable(head, body) do {fun_name, args_ast} = name_and_args(head) ... # 不变 end ...end 如您所见, 可以定义额外的私有函数并从宏调用它们. 毕竟, 宏只是一个函数, 当调用它时, 包含的模块已经编译并加载到编译器的 VM 中(否则, 宏无法运行). 以下是宏 deftraceable 的完整版本: 1234567891011121314151617181920212223242526272829303132defmodule Tracer do defmacro deftraceable(head, body) do {fun_name, args_ast} = name_and_args(head) quote do def unquote(head) do file = __ENV__.file line = __ENV__.line module = __ENV__.module function_name = unquote(fun_name) passed_args = unquote(args_ast) |> Enum.map(&inspect/1) |> Enum.join(",") result = unquote(body[:do]) loc = "#{file}(line #{line})" call = "#{module}.#{function_name}(#{passed_args}) = #{inspect result}" IO.puts "#{loc} #{call}" result end end end defp name_and_args({:when, _, [short_head | _]}) do name_and_args(short_head) end defp name_and_args(short_head) do Macro.decompose_call(short_head) endend 让我们来试验一下: 1234567891011121314151617181920iex(1)> defmodule Tracer do ... endiex(2)> defmodule Test do import Tracer deftraceable my_fun(a,b) when a<b do a/b end deftraceable my_fun(a,b) do a/b end endiex(3)> Test.my_fun(5,10)iex(line 4) Test.my_fun(5,10) = 0.50.5iex(4)> Test.my_fun(10, 5)iex(line 7) Test.my_fun(10,5) = 2.0 这个练习的主要目的是说明可以从输入 AST 中推断出一些东西. 在这个例子中, 我们设法检测和处理带 guards 的函数. 显然, 因为它依赖于 AST 的内部结构, 代码变得更加复杂了. 在这种情况下, 代码依旧比较简单, 但你将在后面的文章 《(译) Understanding Elixir Macros, Part 5 - Reshaping the AST》 中看到我是如何解决 deftraceable 宏剩余的问题的, 事情可能很快变得复杂起来了. 原文: https://www.theerlangelist.com/article/macros_4","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir-Macros","slug":"Elixir-Macros","permalink":"https://yeshan333.github.io/tags/Elixir-Macros/"}]},{"title":"(译) Understanding Elixir Macros, Part 3 - Getting into the AST","slug":"understanding-elixir-macros-part-3-getting-into-the-ast","date":"2022-06-19T10:53:07.000Z","updated":"2022-06-19T10:53:07.000Z","comments":true,"path":"2022/06/19/understanding-elixir-macros-part-3-getting-into-the-ast/","permalink":"https://yeshan333.github.io/2022/06/19/understanding-elixir-macros-part-3-getting-into-the-ast/","excerpt":"","text":"Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir Macros, Part 2 - Macro Theory [3] (译) Understanding Elixir Macros, Part 3 - Getting into the AST [4] (译) Understanding Elixir Macros, Part 4 - Diving Deeper [5] (译) Understanding Elixir Macros, Part 5 - Reshaping the AST [6] (译) Understanding Elixir Macros, Part 6 - In-place Code Generation原文 GitHub 仓库, 作者: Saša Jurić. 是时候继续探索 Elixir 的宏了. 上次我介绍了一些关于宏的基本原理, 今天, 我将进入一个较少谈及的领域, 并讨论 Elixir AST 的一些细节. 跟踪函数调用到目前为止, 你只看到了接受输入 AST 片段并将它们组合在一起的基础宏, 并在输入片段周围或之间添加了一些额外的样板代码. 由于我们不分析或解析输入的 AST, 这可能是最干净(或最不 hackiest)的宏编写风格, 这样的宏相当简单且容易理解. 然而, 有时候我们需要解析输入的 AST 片段以获取某些特殊信息. 一个简单的例子是 ExUnit 的断言. 例如, 表达式 assert 1+1 == 2+2 会出现这个错误: 1234Assertion with == failedcode: 1+1 == 2+2lhs: 1rhs: 2 这个宏 assert 接收了整个表达式 1+1 == 2+2, 然后从中分出独立的表达式用来比较, 如果整个表达式返回 false, 则打印它们对应的结果. 所以, 宏的代码必须想办法将输入的 AST 分解为几个部分并分别计算子表达式. 更多时候, 我们调用了更复杂的 AST 变换. 例如, 你可以借助 ExActor 这样做: 1defcast inc(x), state: state, do: new_state(state + x) 它会被转换为大致如下的形 1234567def inc(pid, x) do :gen_server.cast(pid, {:inc, x})enddef handle_cast({:inc, x}, state) do {:noreply, state+x}end 和 assert 一样, 宏 defcast 需要深入分析输入的 AST 片段, 并找出每个子片段(例如, 函数名, 每个参数). 然后, ExActor 会执行一个精巧的变换, 将各个部分重组成一个更加复杂的代码. 今天, 我将想你展示构建这类宏的基础技术, 我也会在之后的文章中会将变换做得更复杂. 但在此之前, 我要请你认真考虑一下你的代码是否有有必要基于宏. 尽管宏十分强大, 但也有缺点. 首先, 就像之前我们看到的那样, 比起那些 “普通” 的运行时抽象 (函数, 模块, 协议), 宏的代码会很快地变得非常多. 你可以依赖 undocumented format (译注: 缺少文档解释, 寓意代码极其难以理解) 的 AST 来快速完成许多嵌套的 quote/unquoted 调用, 以及奇怪的模式匹配. 此外, 宏的滥用可能使你的客户端代码 (译注: 使用宏的代码) 极其难懂, 因为它将依赖于自定义的非标准习惯用法(例如 ExActor 的 defcast). 这使得理解代码和了解底层究竟发生了什么变得更加困难. 从好的方面来看, 宏在删除样板代码时非常有用(正如 ExActor 示例所展示的那样), 并且具有访问运行时不可用的信息的能力(正如您应该从 assert 示例中看到的那样). 最后, 由于宏在编译期间运行, 因此可以通过将计算转移到编译时来优化一些代码. 因此, 肯定会有适合宏的情景, 您不应该害怕使用它们. 但是, 您不应该仅仅为了获得一些可爱的 dsl 式语法而选择宏. 在使用宏之前, 应该考虑是否可以依靠“标准”语言抽象(如函数、模块和协议)在运行时有效地解决问题. 探索 AST 结构目前, 关于 AST 结构的文档不多. 然而, 在 shell 会话中可以很简单地探索和使用 AST, 我通常就是这样探索 AST 结构的. 例如, 这里有一个关于变量的 quoted 12iex(1)> quote do my_var end{:my_var, [if_undefined: :apply], Elixir} 在这里, 第一个元素代表变量的名称;第二个元素是上下文 Keyword 列表, 它包含了该 AST 片段的元数据(例如 imports 和 aliases). 通常你不会对上下文数据感兴趣;第三个元素通常代表 quoted 发生的模块, 同时也用于确保 quoted 变量的 hygienic. 如果该元素为 nil, 则该标识符是不 hygienic 的. 一个简单的表达式看起来包含了许多东西: 123iex(2)> quote do a+b end{:+, [context: Elixir, import: Kernel], [{:a, [if_undefined: :apply], Elixir}, {:b, [if_undefined: :apply], Elixir}]} 看起来可能很复杂, 但是如果我向你展示更高层次的表达模式, 就很容易理解了: 1{:+, context, [ast_for_a, ast_for_b]} 在我们的例子中, ast_for_a 和 ast_fot_b 遵循着你之前所看到的变量的形状(如 {:a, [if_undefined: :apply], Elixir}). 一般, quoted 的参数可以是任意复杂的, 因为它们描述了每个参数的表达式. 事实上, Elixir AST 是一个简单 quoted expression 的深层结构, 就像我给你展示的那样. 让我们看一个关于函数调用的例子: 12iex(3)> quote do div(5,4) end{:div, [context: Elixir, import: Kernel], [5, 4]} 这类似于 quoted + 的操作, 我们知道 + 实际上是一个函数. 事实上, 所有二进制运算符都会像函数调用一样被 quoted. 最后, 让我们来看一个被 quoted 的函数定义: 12345678910iex(4)> quote do def my_fun(arg1, arg2), do: :ok end{:def, [context: Elixir, import: Kernel], [ {:my_fun, [context: Elixir], [ {:arg1, [if_undefined: :apply], Elixir}, {:arg2, [if_undefined: :apply], Elixir} ]}, [do: :ok] ]} 看起来有点吓人, 但可以只看重要的部分来简化它. 事实上, 这种深层结构相当于: 1{:def, context, [fun_call, [do: body]]} fun_call 是一个函数调用的结构(正如之前你看过的那样). 如你所见, AST 背后通常有一些逻辑和意义. 我不会在这里写出所有 AST 的形状, 但会在 iex 中尝试你感兴趣的简单的结构来探索 AST. 这是一个逆向工程, 但不是火箭科学. 写一个 assert 宏为了快速演示, 让我们编写一个简化版的 assert 宏. 这是一个有趣的宏, 因为它重新定义了比较操作符的含义. 通常, 当你写下 a == b 表达式时, 你会得到一个布尔结果. 但是, 当将此表达式给 assert 宏时, 如果表达式的计算结果为 false, 则会打印详细的输出. 我将从简单的部分开始, 首先在宏里只支持 == 运算符. 可以知道, 我们调用 assert expected == required 时, 等同于调用 assert(expect == required), 这意味着我们的宏接收到一个表示比较的引用片段. 让我们来探索这个比较表达式的 AST 结果: 123456iex(1)> quote do 1 == 2 end{:==, [context: Elixir, import: Kernel], [1, 2]}iex(2)> quote do a == b end{:==, [context: Elixir, import: Kernel], [{:a, [if_undefined: :apply], Elixir}, {:b, [if_undefined: :apply], Elixir}]} 所以我们的结构本质上是 {:==, context, [quoted_lhs, quoted_rhs]}. 如果你记住了前几个系列中所演示的例子, 那么就不会感到意外, 因为我提到过二进制运算符是作为 2 个参数的函数被 quoted 的. 知道了 AST 的形状, 实现这个宏就很简单: 12345678910111213141516171819defmodule Assertions do defmacro assert({:==, _, [lhs, rhs]} = expr) do quote do left = unquote(lhs) right = unquote(rhs) result = (left == right) unless result do IO.puts "Assertion with == failed" IO.puts "code: #{unquote(Macro.to_string(expr))}" IO.puts "lhs: #{left}" IO.puts "rhs: #{right}" end result end endend 第一个有趣的事情发生在第 2 行. 注意我们是如何对输入表达式进行模式匹配的, 希望它符合某种结构. 这完全没问题, 因为宏是函数, 这意味着您可以依赖于模式匹配、guards(守卫), 甚至有多子句宏. 在我们的例子中, 我们依靠模式匹配将(被 quoted 的)比较表达式的每一边带入相应的变量. 然后, 在 quoted 的代码中, 我们通过分别计算左边和右边重新解释 == 操作(第 4 行和第 5 行), 然后是整个结果(第 7 行). 最后, 如果结果为假, 我们打印详细信息(第 9-14 行). 来试一下: 123456789iex(1)> defmodule Assertions do ... endiex(2)> import Assertionsiex(3)> assert 1+1 == 2+2Assertion with == failedcode: 1 + 1 == 2 + 2lhs: 2rhs: 4false 将代码实现通用化将之前的代码用到其他的运算操作符并不困难: 1234567891011121314151617181920defmodule Assertions do defmacro assert({operator, _, [lhs, rhs]} = expr) when operator in [:==, :<, :>, :<=, :>=, :===, :=~, :!==, :!=, :in] do quote do left = unquote(lhs) right = unquote(rhs) result = unquote(operator)(left, right) unless result do IO.puts("Assertion with #{unquote(operator)} failed") IO.puts("code: #{unquote(Macro.to_string(expr))}") IO.puts("lhs: #{left}") IO.puts("rhs: #{right}") end result end endend 这里只有一点点变化. 首先, 在模式匹配中, 硬编码(hard code) :== 被变量 operator 取代了(第 2 行). 我还引入(实际上, 是从 Elixir 源代码中复制粘贴了)guard 语句指定了宏能处理的运算符集(第 3 行). 这个检查有一个特殊原因. 还记得我之前提到的, quoted a + b(或任何其它的二进制操作)的形状等同于引用 fun(a, b). 因此, 没有这些 guard 语句, 任何双参数的函数调用都会在我们的宏中结束, 这可能是我们不想要的. 使用这个 guard 语句能将输入限制在已知的二进制运算符中. 有趣的事情发生在第 9 行. 在这里我使用了 unquote(operator)(left, right) 来对操作符进行简单的泛型分派. 你可能认为我可以使用 left unquote(operator) right 来替代, 但它并不能运算. 原因是 operator 变量保存的是一个原子(如:==). 因此, 这个天真的 quoted 会产生 left :== right, 这甚至不符合 Elixir 的语法规定. 记住, 在 quote 时, 我们不组装字符串, 而是组装 AST 片段. 所以, 当我们想生成一个二进制操作代码时, 我们需要注入一个正确的 AST, 它(如前所述)与双参数的函数调用相同. 因此, 我们可以简单地使用函数调用的方式 unquote(operator)(left, right). 这一点讲完了, 今天的这一章也该结束了. 它有点短, 但略微复杂些. 下一章 《(译) Understanding Elixir Macros, Part 4 - Diving Deeper》, 我将深入 AST 解析的话题. 原文: https://www.theerlangelist.com/article/macros_3","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir-Macros","slug":"Elixir-Macros","permalink":"https://yeshan333.github.io/tags/Elixir-Macros/"}]},{"title":"(译) Understanding Elixir Macros, Part 2 - Macro Theory","slug":"understanding-elixir-macros-part-2-macro-theory","date":"2022-06-19T00:36:03.000Z","updated":"2022-06-19T00:36:03.000Z","comments":true,"path":"2022/06/19/understanding-elixir-macros-part-2-macro-theory/","permalink":"https://yeshan333.github.io/2022/06/19/understanding-elixir-macros-part-2-macro-theory/","excerpt":"","text":"Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir Macros, Part 2 - Macro Theory [3] (译) Understanding Elixir Macros, Part 3 - Getting into the AST [4] (译) Understanding Elixir Macros, Part 4 - Diving Deeper [5] (译) Understanding Elixir Macros, Part 5 - Reshaping the AST [6] (译) Understanding Elixir Macros, Part 6 - In-place Code Generation原文 GitHub 仓库, 作者: Saša Jurić. 这是关于 Elixir 宏系列的第二篇. 上一次我们讨论了 Elixir 编译过程和 Elixir AST, 最后讲了一个基本的宏的例子 trace. 今天, 我们会更详细地讲解宏的机制. 可能有一些内容会和上一篇重复, 但我认为这对于理解运作原理和 AST 的生成很有帮助. 掌握了这些以后, 你对于自己编写的宏代码就更有信心了. 基础很重要, 因为随着更多地用到宏, 代码可能会由许多的 quote/unquote 结构组成. 调用一个宏我们最需要重视的是展开阶段. 编译器在这个阶段调用了各种宏(以及其它代码生成结构)来生成最终的 AST. 例如, 宏 trace 的典型用法是这样的: 1234567defmodule MyModule do require Tracer ... def some_fun(...) do Tracer.trace(...) endend 像之前所提到的那样, 编译器从一个类似于这段代码的 AST 开始. 这个 AST 之后会被展开, 然后生成最后的代码. 因此, 在这段代码的展开阶段, Tracer.trace/1 会被调用. 我们的宏接受了输入的 AST, 然后必须生成输出对应的 AST 结构. 之后编译器会简单地用输出的 AST 替换掉对宏的调用. 这个过程是渐进的 — 一个宏可以返回调用其他宏 (甚至它本身) 的 AST. 编译器会再次展开, 直到不可以展开为止. 调用宏使得我们有机会修改代码的含义. 一个典型的宏会获取输入的 AST 并修改它, 并在它周围添加一些代码. 那就是我们使用宏 trace 所做的事情. 我们得到了一个 quoted expression(例如 1+2), 然后返回了这个: 123result = 1 + 2Tracer.print("1 + 2", result)result 要在代码的任何地方调用宏(包括 shell 里), 你都必须先调用 require Tracer 或 import Tracer. 为什么呢?因为宏有两个看似矛盾的性质: 宏也是 Elixir 代码 宏在在最终的字节码生成之前的展开阶段运行 Elixir 代码是如何在被生成之前运行的?它不能. 要调用一个宏, 其容器模块(宏的定义所在的模块)必须已经被编译. 因此, 要运行 Tracer 模块中所定义的宏, 我们必须确认它已经被编译了. 也就是说, 我们必须向编译器提供一个关于我们所需求的模块的顺序. 当我们 require 了一个模块, 我们会让 Elixir 暂停当前模块的编译, 直到我们 require 的模块编译好并载入到了编译器的运行时(编译器所在的 Erlang VM 实例). 只有在 Tracer 模块完全编译好并对编译器可用的情况下, 我们才能调用 trace 宏. 使用 import 也有相同效果, 只不过它还在词法上引入了所有的公共函数和宏, 使得我们可以用 trace 替代 Tracer.trace. 由于宏也是函数, 而 Elixir 在调用函数时可以省略括号, 所以我们可以这样写: 1Tracer.trace 1+2 这很可能是 Elixir 之所以不在函数调用时要求括号的最主要原因. 记住, 大多数语言结构都是宏. 如果括号是必须的, 那么我们需要编写的代码将会更加嘈杂. 1234defmodule(MyModule, do: def(function_1, do: ...) def(function_2, do: ...)) Hygiene在上一篇文章中我们提到, 宏默认是整洁(Hygiene)的. 意思就是宏引入的变量有其自己的私有作用域, 不会影响代码的其他部分. 这就是我们能够在我们的 trace 宏中安全地引入 result 变量的原因: 1234quote do result = unquote(expression_ast) # result 是宏的私有变量 ...end 该变量不会干扰调用这个宏的代码. 在调用宏的地方, 可以随意的声明你自己的 result 变量, 它不会被 tracer 宏中的 result 变量隐藏覆盖. 大多数时候 hygiene 是我们想要的效果, 但是也有例外. 有时候, 可能需要创建在调用者作用域内可用的变量. 下面我们通过 Plug 库的一个用例来演示, 我们如何使用 Plug 来制定路由: 1234567get "/resource1" do send_resp(conn, 200, ...)endpost "/resource2" do send_resp(conn, 200, ...)end 注意, 上面这两个宏是如何使用并不存在的 conn 变量. 这是因为, get 宏在生成的代码中绑定了该变量. 可以想象一下, 产生的代码如下: 123456defp do_match("GET", "/resource1", conn) do ...enddefp do_match("POST", "/resource2", conn) do ...end 注意: Plug 生成的真实代码是不同的, 这里为了演示对其进行了简化. 这是一个例子, 宏引入了一个变量, 它必须不是 hygienic 的. 变量 conn 由 get 宏引入, 必须对调用者可见. 另一个例子是使用 ExActor 的. 看看下面的例子: 12345defmodule MyServer do ... defcall my_request(...), do: reply(result) ...end 如果你对 GenServer 很熟悉, 那么你知道一个 call 的结果必须是 {:reply, response, state} 的形式. 然而, 在上述代码中, 甚至没有提到 state. 那么我们是如何返回 state 的呢?这是因为 defcall 宏生成了一个隐藏的state 变量, 它之后将被 reply 宏明确使用. 在上面两种情况中, 宏都必须创建一个不 hygienic 的变量, 而且必须在宏所引用的代码之外可见. 为达到这个目的, 可以使用 var! 结构. 下面是 Plug的 get 宏的简化版本: 1234567defmacro get(route, body) do quote do defp do_match("GET", unquote(route), var!(conn)) do # put body AST here end endend 注意我们如何使用 var!(conn) 的. 通过这样做, 我们指定 conn 是一个对调用者可见的变量. 上述代码没有解释 body 是如何注入的. 在这之前, 你需要理解宏所接受的参数. 宏参数你要记住, 宏本质上是在 AST 展开阶段被导入的 Elixir 函数, 然后生成最终的 AST. 宏的特别之处在于它所接受的参数都是 quoted 的. 这就是我们之所以能够调用的原因: 123def my_fun do ...end 等同于: 1def(my_fun, do: (...)) 注意我们如何调用 def 宏, 传递 my_fun, 即使这个变量不存在. 这完全没问题, 因为我们实际上传递的是 quote(do: my_fun) 的结果, 而引用(quote)不要求变量存在. 在内部, def 宏会接收到包含了 :my_fun 的引用形式. def 宏会使用这个信息来生成对应名称的函数. 这里再提一下 do...end 块. 任何时候发送一个 do...end 块给一个宏, 都相当于发送一个带有 :do 键的 Keyword 列表(Keywords list). 所以如下调用: 1my_macro arg1, arg2 do ... end 等同于 1my_macro(arg1, arg2, do: ...) 这些只不过是 Elixir 中的语法糖. 解释器将 do ... end 转换成了 {:do, ...}. 现在, 我只提到了参数是被引用(quoted)的. 然而, 对于许多常量(原子, 数字, 字符串), 引用(quoted)形式和输入值完全一样. 此外, 二元元组和列表会在被引用(quoted)时保持它们的结构. 这意味着 quote(do: {a, b}) 将会返回一个二元元组, 它的两个值都是被引用(quoted)的. 1234567891011121314iex(1)> quote do :an_atom end:an_atomiex(2)> quote do "a string" end"a string"iex(3)> quote do 3.14 end3.14iex(4)> quote do {1,2} end{1, 2}iex(5)> quote do [1,2,3,4,5] end[1, 2, 3, 4, 5] 对三元元组的引用(quoted)不会保留它的形状: 12iex(6)> quote do {1,2,3} end{:{}, [], [1, 2, 3]} 由于列表和二元元组在被引用时能保留结构, 所以关键词列表(Keywords list)也可以: 12345iex(7)> quote do [a: 1, b: 2] end[a: 1, b: 2]iex(8)> quote do [a: x, b: y] end[a: {:x, [], Elixir}, b: {:y, [], Elixir}] 在第一个例子中, 你可以看到输入的关键词列表完全没变. 第二个例子证明了复杂的部分(例如调用 x和 y)会是 quoted 形式. 但是列表还保持着它的形状. 这仍然是一个键为 :a 和 :b 的关键词列表. 将它们放在一起为什么这些都很重要? 因为在宏代码中, 您可以很容易地从关键字列表 (Keyword list) 中获取所需要的选项, 而不需要分析一些令人费解的 AST. 之前, 我们留下了这个草图代码: 1234567defmacro get(route, body) do quote do defp do_match("GET", unquote(route), var!(conn)) do # put body AST here end endend 记住, do ... end 和 do: ... 是一样的, 所以当我们调用 get route do ... end 时, 我们实际上是在调用 get(route, do: ...) 记住宏参数是 quoted 的, 但也要知道 quoted 的关键字列表会保持它们的形状, 可以使用 body[:do]获取宏中引用的主体: 1234567defmacro get(route, body) do quote do defp do_match("GET", unquote(route), var!(conn)) do unquote(body[:do]) end endend 因此, 我们只需将 quoted 的输入主体注入到正在生成的 do_match 子句(clause)主体中. 如之前所述, 这就是宏的用途. 它接收一些 AST 片段, 并将它们与样板代码组合在一起, 以生成最终结果. 理想情况下, 当我们这样做时, 我们不需要关心输入 AST 的内容, 在我们的例子中, 我们只需要在生成的函数中注入函数体, 而不需要关心函数体中实际有什么. 测试这个宏很简单. 以下是所需代码的最小化: 1234567891011defmodule Plug.Router do # 宏 get 从客户端删除样板代码 # 确保生成的代码符合泛型逻辑所需的一些标准 defmacro get(route, body) do quote do defp do_match("GET", unquote(route), var!(conn)) do unquote(body[:do]) end end endend 现在, 我们可以实现一个客户端 (译注: 使用宏的代码) 模块: 123456789101112defmodule MyRouter do import Plug.Router # 多子句 dispatch 的通用代码 def match(type, route) do do_match(type, route, :dummy_connection) end # 使用宏最小化样板代码量 get "/hello", do: {conn, "Hi!"} get "/goodbye", do: {conn, "Bye!"}end 测试一下: 12345MyRouter.match("GET", "/hello") |> IO.inspect# {:dummy_connection, "Hi!"}MyRouter.match("GET", "/goodbye") |> IO.inspect# {:dummy_connection, "Bye!"} 注意 match/2 的代码. 它是通用的代码, 依赖于 do_match/3 的实现. 使用模块观察上述代码, 你可以看到 match/2 的胶水代码存在于客户端模块中. 这肯定算不上完美, 因为每个客户端都必须提供对这个函数的正确实现, 而且必须调用 do_match 函数. 更好的选择是, Plug.Router 能够将这个实现抽象提供给我们. 我们可以使用 use 宏, 大概就是其它语言中的 mixin. 总体思路如下: 1234567891011121314defmodule ClientCode do # 调用 mixin use GenericCode, option_1: value_1, option_2: value_2, ...enddefmodule GenericCode do # 在模块被使用的时候调用 defmacro __using__(options) do # 生成一个AST, 该 AST 将被插入到 use 的地方 quote do ... end endend 因此, 使用 use 机制允许我们向调用者的上下文中注入一些代码. 就像是替代了这些: 1234defmodule ClientCode do require GenericCode GenericCode.__using__(...)end 这可以通过查看 Elixir 的源代码来证明. 这证明了另一点 — 不断展开. use 宏生成调用另一个宏的代码. 或者更巧妙地说, 用生成代码来生成代码. 正如前面提到的, 编译器会递归地展开它所发现的所有宏定义, 直到没有可展开的宏为止.. 有了这些知识, 我们可以将 match 函数的实现转移到通用的 Plug.Router 模块: 123456789101112131415defmodule Plug.Router do defmacro __using__(_options) do quote do import Plug.Router def match(type, route) do do_match(type, route, :dummy_connection) end end end defmacro get(route, body) do ... # 这段代码保持不变 endend 这使得客户端代码 (译注: 使用宏的代码) 非常精简: 123456defmodule MyRouter do use Plug.Router get "/hello", do: {conn, "Hi!"} get "/goodbye", do: {conn, "Bye!"}end __using__ 宏生成的 AST 会简单地被注入到调用 use Plug.Router 的地方. 特别注意我们是如何从 __using__ 宏里使用 import Plug.Router 的, 这不是必要的. 但这让你可以使用 get 替代使用 Plug.Router.get. 那么我们得到了什么?各种样板代码汇集到了一个地方(Plug.Router). 不仅仅简化了客户端代码, 也让这个抽象正确闭合. 模块 Plug.Router确保了 get 宏所生成的任何东西都能适合使用 match 的通用代码. 在客户端中, 我们只要 use那个模块, 然后用它提供的宏来组合我们的 router. 总结一下本章的内容. 还有许多细节没有提到, 但希望你对于宏是如何与 Elixir 编译器相结合工作的有了更好的理解. 在下一部分 《Understanding Elixir Macros, Part 3 - Getting into the AST》, 我们会更深入, 并开始探索如何分解输入的 AST. 附注 mixin: Mixin 即 Mix-in, 常被译为 “混入”, 是一种编程模式, 在 Python 等面向对象语言中, 通常它是实现了某种功能单元的类, 用于被其他子类继承, 将功能组合到子类中. 12345678910# 例子class Mixin: def mixin_method(self): print("Mixin method called")class MyClass(Mixin): passobj = MyClass()obj.mixin_method() # 输出: Mixin method called 原文: https://www.theerlangelist.com/article/macros_2","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir-Macros","slug":"Elixir-Macros","permalink":"https://yeshan333.github.io/tags/Elixir-Macros/"}]},{"title":"(译) Understanding Elixir Macros, Part 1 Basics","slug":"understanding-elixir-macros-part-1-basics","date":"2022-06-18T14:13:45.000Z","updated":"2022-06-18T14:13:45.000Z","comments":true,"path":"2022/06/18/understanding-elixir-macros-part-1-basics/","permalink":"https://yeshan333.github.io/2022/06/18/understanding-elixir-macros-part-1-basics/","excerpt":"","text":"Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir Macros, Part 2 - Macro Theory [3] (译) Understanding Elixir Macros, Part 3 - Getting into the AST [4] (译) Understanding Elixir Macros, Part 4 - Diving Deeper [5] (译) Understanding Elixir Macros, Part 5 - Reshaping the AST [6] (译) Understanding Elixir Macros, Part 6 - In-place Code Generation原文 GitHub 仓库, 作者: Saša Jurić. 这是讨论 Elixir 宏 (Macros) 系列文章的第一篇. 我原本计划在我即将出版的《Elixir in Action》一书中讨论这个主题, 但最终决定不这么做, 因为这个主题不符合这本书的主题, 这本书更关注底层 VM 和 OTP 的关键部分. 就我个人而言, 我觉得宏的主题非常有趣, 在本系列文章中, 我将试图解释它们是如何工作的, 提供一些关于如何编写宏的基本技巧和建议. 虽然我确信编写宏不是很难, 但与普通的 Elixir 代码相比, 它确实需要更高视角的关注. 因此, 我认为这了解 Elixir 编译器的一些内部细节是非常有帮助的. 了解事情在幕后是如何运行之后, 就可以更容易地理解元编程代码. 这是篇中级水平的文章. 如果你很熟悉 Elixir 和 Erlang, 但对宏还感觉到困惑, 那么这些内容很适合你. 如果你刚开始接触 Elixir 和 Erlang, 那么最好从其它地方开始. 比如 Getting started guide, 或者一些可靠的书. 元编程 (Meta-programming)或许你已经对 Elixir 中的元编程有一点了解. 其主要的思想就是我们可以编写一些代码, 它们会根据某些输入来生成代码. 正因为有了宏 (Macros), 我们可以写出如下这段来自于 Plug 的代码: 1234567get "/hello" do send_resp(conn, 200, "world")endmatch _ do send_resp(conn, 404, "oops")end 或者是来自 ExActor 的 12345defmodule SumServer do use ExActor.GenServer defcall sum(x, y), do: reply(x+y)end 在以上两个例子中, 我们使用到了一些自定义的宏, 这些宏会在编译时 (compile time) 都转化成其它的代码. 调用 Plug 的 get 和 match 会创建一个函数, 而 ExActor 的 defcall 会生成两个函数和将参数正确从客户端进程传播给服务端进程的代码. Elixir 本身的实现上就非常多地用到了宏. 例如 defmodule, def, if, unless, 甚至 defmacro 都是宏. 这使得语言的核心能保持最小化, 日后对语言的扩展就会更加简单. 鲜为人知的是, 宏可以让我们可以有动态 (on the fly) 生成函数的可能性: 123456789101112131415161718192021defmodule Fsm do fsm = [ running: {:pause, :paused}, running: {:stop, :stopped}, paused: {:resume, :running} ] for {state, {action, next_state}} <- fsm do def unquote(action)(unquote(state)), do: unquote(next_state) end def initial, do: :runningendFsm.initial# :runningFsm.initial |> Fsm.pause# :pausedFsm.initial |> Fsm.pause |> Fsm.pause# ** (FunctionClauseError) no function clause matching in Fsm.pause/1 在这里, 我们定义了一个 Fsm module, 同样的, 它在编译时会转换成对应的多子句函数 (multi-clause functions). 类似的技术被 Elixir 用于生成 String.Unicode 模块. 本质上讲, 这个模块是通过读取 UnicodeData.txt 和SpecialCasing.txt 文件里对码位 (codepoints) 的描述来生成的. 基于文件中的数据, 各种函数 (例如 upcase, downcase) 会被生成. 无论是宏还是代码生成, 我们都在编译的过程中对抽象语法树做了某些变换. 为了理解它是如何工作的, 你需要学习一点Elixir 编译过程和 AST 的知识. 编译过程 (Compilation process) 输入的源代码被解析, 然后生成相应的抽象语法树 (AST1). AST1 会以嵌套的 Elixir Terms 的形式来表述你的代码. 然后进入展开阶段. 在这个阶段, 各种内置的和自定义的宏被转换成了最终版本. 一旦转换结束, Elixir 就可以生成最后的字节码, 即源程序的二进制表示. 这只是对整个编译过程的概述. 例如, Elixir 编译器还会生成 Erlang AST, 然后依赖 Erlang 函数将其转换为字节码, 但是我们还不需要知道这部分细节. 不过, 我认为这幅图对于理解元编程代码是有帮助的. 理解元编程魔法的关键点在于理解在展开阶段 (expansion phase) 发生了什么. 编译器会基于原始 Elixir 代码的 AST 展开为最终版本. 另外, 从这个图中可以得到另一个重要结论, Elixir 在生成了二进制之后, 元编程就停止了. 你可以确定你的代码不会被重新定义, 除非使用到了代码升级或是一些动态的代码插入技术 (这不在本文讨论范围). 元编程总是会引入一个隐形 (或不明显)的层, 在 Elixir 中这只发生在编译时, 并独立于程序的各种执行路径. 代码转换发生在编译时, 因此推导最终产品会相对简单, 而且元编程不会干扰例如 dialyzer 这样的静态分析工具. 编译时元编程 (Compile time meta-programming)也意味着我们不会有性能损失. 进入运行时 (run-time) 后, 代码就已经定型了, 代码中不会有元编程结构在运行. 创建 AST 片段什么是 Elixir AST? 它是一个 Elixir Term (译注: Elixir 中的所有数据都可以看成是 term), 一个深度嵌套的层次结构, 用于表述一个语法正确的 Elixir 代码. 为了说得更明白一些, 举个例子. 要生成某段代码的 AST, 可以使用 quote: 12iex(1)> quoted = quote do 1 + 2 end{:+, [context: Elixir, import: Kernel], [1, 2]} 使用 quote 可以获取任意一个复杂的 Elixir 表达式对应的 AST 片段. 在上面的例子中, 生成的 AST 片段用于描述一个简单的求和操作 (1+2). 这通常被称为 quoted expression. 大多数时候你不需要去理解 quoted 结构的具体细节, 让我们来看一个简单的例子. 在这种情况下, AST 片段是一个包含如下元素的三元组 (triplet): 一个原子 (atom) 表示所要进行的操作 (:+) 表达式上下文 (context, 例如 imports 和 aliases). 通常你并不需要理解这个数据 操作参数 要点: 这个 quoted expression 是一个描述代码的 Elixir term. 编译器会使用它生成最终的字节码. 虽然不常见, 但对一个 quoted expression 求值也是可以的: 12iex(2)> Code.eval_quoted(quoted){3, []} 返回的元组中包含了表达式的结果, 以及一个列表, 其中包含了构成表达式的变量. 但是, 在 AST 被求值前 (通常由编译器完成), quoted expression 并没有进行语义上的验证. 例如, 当我们书写如下表达式时: 12iex(3)> a + b** (CompileError) iex:3: undefined function a/0 (there is no such import) 我们会得到错误, 因为这里没有叫做一个叫做 a 的变量 (或函数). 相比而言, 如果 quote 这个表达式: 123iex(3)> quote do a + b end{:+, [context: Elixir, import: Kernel], [{:a, [if_undefined: :apply], Elixir}, {:b, [if_undefined: :apply], Elixir}]} 这个没有发生错误, 我们有了一个表达式 a+b 的 quoted 表现形式. 其意思是, 生成了一个描述该表达式 a+b 的 term, 不管表达式中的变量是否存在. 最终的代码并没有生成, 所以这里不会有错误抛出. 如果把该表述插入到某些 a 和 b 是有效标识符的 AST 中, 刚才发生错误的代码 a+b, 才是正确的. 下面来试一下, 首先 quote 一个求和 (sum)表达式: 123iex(4)> sum_expr = quote do a + b end{:+, [context: Elixir, import: Kernel], [{:a, [if_undefined: :apply], Elixir}, {:b, [if_undefined: :apply], Elixir}]} 然后创建一个 quoted 变量绑定表达式: 123456789iex(5)> bind_expr = quote do...(5)> a=1...(5)> b=2...(5)> end{:__block__, [], [ {:=, [], [{:a, [if_undefined: :apply], Elixir}, 1]}, {:=, [], [{:b, [if_undefined: :apply], Elixir}, 2]} ]} 记住, 它们只是 quoted 表达式. 它们只是在描述代码的简单数据, 并没有执行. 这时, 变量 a 和 b 并不存在于当前 Elixir shell 会话 (session)中. 要使这些片段能够一起工作, 必须把它们连接起来: 1234567891011121314iex(6)> final_expr = quote do...(6)> unquote(bind_expr)...(6)> unquote(sum_expr)...(6)> end{:__block__, [], [ {:__block__, [], [ {:=, [], [{:a, [if_undefined: :apply], Elixir}, 1]}, {:=, [], [{:b, [if_undefined: :apply], Elixir}, 2]} ]}, {:+, [context: Elixir, import: Kernel], [{:a, [if_undefined: :apply], Elixir}, {:b, [if_undefined: :apply], Elixir}]} ]} 这里我们生成了一个由 bind_expr 和 sum_expr 构成的新的 quoted expression -> final_expr. 实际上, 我们生成了一个新的 AST 片段, 它结合了这两个表达式. 暂不要关心 unquote 的部分 - 我稍后会解释这一点. 与此同时, 我们可以进行求值计算这个 AST 片段 (fragment): 12iex(7)> Code.eval_quoted(final_expr){3, [{{:b, Elixir}, 2}, {{:a, Elixir}, 1}]} 再次看到, 求值结果由一个表达式结果 (3), 一个变量绑定列表构成. 形如: 1234{expression, [{{:variable, Elixir}, value},...]}=========== ======== ====== | | |表达式结果 变量名称 变量的值 从这个绑定列表中我们可以看出, 该表达式绑定了两个变量 a 和 b, 对应的值分别为 1 和 2. 这就是在 Elixir 中元编程方法的核心. 当我们进行元编程的时候, 我们实际上是把各种 AST 片段组合起来生成新的我们需要的 AST. 我们通常对输入 AST 的内容和结构不感兴趣, 相反, 我们使用 quote 生成和组合输入片段, 并生成经过修饰后的代码. Unquotingunquote 在这里出现了. 注意, 无论 quote 块 (quote ... end) 里有什么, 它都会变成 AST 片段. 这意味着我们不可以简单地将外部的变量注入到我们的 quote 里. 例如, 这样是不能达到效果的: 123456789iex(8)> quote do...(8)> bind_expr...(8)> sum_expr...(8)> end{:__block__, [], [ {:bind_expr, [if_undefined: :apply], Elixir}, {:sum_expr, [if_undefined: :apply], Elixir} ]} 在这个例子中, quote 仅仅是简单的生成对 bind_expr 和 sum_expr 的变量引用, 它们必须存在于这个 AST 可以被理解的上下文环境里. 但这不是我们想要的结果. 我需要的效果是有一种方式能够直接注入 bind_expr 和 sum_expr 的内容到生成的 AST 的对应的位置. 这就是 unquote(...) 的目的 - 括号里的表达式会被立刻执行, 然后就地插入到调用了 unquote 的地方. 这意味着 unquote 的结果必须是合法的 AST 片段. 理解 unquote 的另一种方式是, 可以把它看做是字符串的插值 (#{}). 对于字符串你可以这样写: 1"....#{some_expression}...." 类似的, 对于 quote 可以这样写: 12345quote do ... unquote(some_expression) ...end 对此两种情况, 求值的表达式必须在当前上下文中是有效的, 并注入该结果到你构建的表达式中. (要么是 string, 或者是一个 AST 片段) 理解这一点很重要: unquote 并不是 quote 的反向过程. quote 将一段代码转换成 quoted 表达式 (quoted expression), unquote并没有做逆向操作. 如果需要把一个 quoted expression 转换为字符串, 可以使用 Macro.to_string/1. 123456iex(9)> Macro.to_string(bind_expr)"a = 1\\nb = 2"iex(10)> Macro.to_string(sum_expr)"a + b"iex(11)> Macro.to_string(final_expr)"(\\n a = 1\\n b = 2\\n)\\n\\na + b" 例子: tracing expression理论结合实践, 一个简单例子, 我们将编写一个帮助我们调试代码的宏. 这个宏可以这样用: 123iex(1)> Tracer.trace(1 + 2)Result of 1 + 2: 33 Tracer.trace 接受一个给定的表达式, 会打印其结果到屏幕上. 然后返回表达式的结果. 需要认识到这是一个宏, 它的输入(1+2)可以被转换成更复杂的形式 — 打印表达式的结果并返回它. 这个变换会发生在宏展开阶段, 产生的字节码为输入代码经过修饰的版本. 在查看它的实现之前, 想象一下最终的结果或许会很有帮助. 当我们调用 Tracer.trace(1+2), 对应产生的字节码类似于这样: 123mangled_result = 1 + 2Tracer.print("1+2", mangled_result)mangled_result mangled_result 表示 Elixir 编译器会销毁所有在宏里引用的临时变量. 这也被称为宏清洗 (macro hygiene), 让宏保持干净, 不会影响到使用宏的代码, 我们会在本系列之后的内容中讨论它(不在本文). 该宏的定义是这样的: 123456789101112131415defmodule Tracer do defmacro trace(expression_ast) do string_representation = Macro.to_string(expression_ast) quote do result = unquote(expression_ast) Tracer.print(unquote(string_representation), result) result end end def print(string_representation, result) do IO.puts "Result of #{string_representation}: #{inspect result}" endend 让我们来逐步分析这段代码. 首先, 我们用 defmacro 定义宏. 宏本质上是特殊形式的函数. 它的名字会被销毁, 并且只能在展开期调用它(尽管理论上你仍然可以在运行时调用). 我们的宏接收到了一个 quoted expression. 这一点非常重要 — 无论你发送了什么参数给一个宏, 它们都已经是 quoted 的. 所以, 当我们调用 Tracer.trace(1+2), 我们的宏(它是一个函数)不会接收到 3. 相反, expression_ast 的内容会是 quote(do: 1+2) 的结果. 在第三行, 我们使用 Macro.to_string/1 来求出我们所收到的 AST 片段的字符串表达形式. 这是你在运行时不能够对一个普通函数做的事之一. 虽然我们能在运行时调用 Macro.to_string/1, 但问题在于我们没办法再访问 AST 了, 因此不能够知道某些表达式的字符串形式了. 一旦我们拥有了字符串形式, 我们就可以生成并返回结果 AST 了, 这一步是在 quote do ... end 结构中完成的. 它的结果是用来替代原始的 Tracer.trace(...) 调用的 quoted expression. 让我们进一步观察这一部分: 如果你明白 unquote 的作用, 那么这个就很简单了. 实际上, 我们是在把 expression_ast(quoted 1+2)代入到我们生成的片段(fragment)中, 将表达式的结果放入 result 变量. 然后我们使用某种格式来打印它们(借助 Macro.to_string/1), 最后返回结果. 展开一个 AST在 Shell 观察其是如何连接起来是很容易的. 启动 iex Shell, 复制粘贴上面定义的 Tracer 模块: 123iex(1)> defmodule Tracer do ... end 然后, 必须 require Tracer: 1iex(2)> require Tracer 接下来, 对 trace 宏调用进行 quote 操作: 123iex(3)> quoted = quote do Tracer.trace(1+2) end{{:., [], [{:__aliases__, [alias: false], [:Tracer]}, :trace]}, [], [{:+, [context: Elixir, import: Kernel], [1, 2]}]} 现在, 输出看起来有点恐怖, 通常你不必需要理解它. 但是如果你仔细看, 在这个结构中你可以看到 Tracer 和 trace, 这证明了 AST 片段是何与源代码相对应的, 但还未展开. 现在, 该开始展开这个 AST 了, 使用 Macro.expand/2: 12345678910111213141516171819iex(4)> expanded = Macro.expand(quoted, __ENV__){:__block__, [], [ {:=, [], [ {:result, [counter: -576460752303423231, if_undefined: :apply], Tracer}, {:+, [context: Elixir, import: Kernel], [1, 2]} ]}, {{:., [], [ {:__aliases__, [counter: -576460752303423231, alias: false], [:Tracer]}, :print ]}, [], [ "1 + 2", {:result, [counter: -576460752303423231, if_undefined: :apply], Tracer} ]}, {:result, [counter: -576460752303423231, if_undefined: :apply], Tracer} ]} 这是我们的代码完全展开后的版本, 你可以看到其中提到了 result(由宏引入的临时变量), 以及对 Tracer.print/2 的调用. 你甚至可以将这个表达式转换成字符串: 1234567iex(5)> Macro.to_string(expanded)"result = 1 + 2\\nTracer.print(\\"1 + 2\\", result)\\nresult"iex(6)> Macro.to_string(expanded) |> IO.putsresult = 1 + 2Tracer.print("1 + 2", result)result:ok 这些说明了你对宏的调用已经展开成了别的东西. 这就是宏工作的原理. 尽管我们只是在 shell 中尝试, 但使用 mix 或elixirc 构建项目时也是一样的. 我想这些内容对于第一篇来说已经够了. 你已经对编译过程和 AST 有所了解, 也看过了一个简单的宏的例子. 在下一篇 《(译) Understanding Elixir Macros, Part 2 - Micro Theory》, 我们将更深入地讨论宏的一些机制. 译注 codepoints: 通常是一个数字, 用于表示 Unicode 字符. Terms: 任何数据类型中的一段数据都被称为 term. 原文:https://www.theerlangelist.com/article/macros_1","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir-Macros","slug":"Elixir-Macros","permalink":"https://yeshan333.github.io/tags/Elixir-Macros/"}]},{"title":"(译) 理解 Prometheus 的范围向量 (Range Vector)","slug":"understanding-prometheus-range-vectors","date":"2022-04-23T15:38:37.000Z","updated":"2022-04-23T15:38:37.000Z","comments":true,"path":"2022/04/23/understanding-prometheus-range-vectors/","permalink":"https://yeshan333.github.io/2022/04/23/understanding-prometheus-range-vectors/","excerpt":"","text":"Prometheus 中 Range Vector 的概念是有一点不直观的,除非你彻底阅读并理解了官方提供的文档。谁会这样做呢,去读官方文档?大多的人应该会花些错误的时间去做了一些错误的事情,然后随机去寻找一篇像本文一样的文章去理解这个概念,不是吗? 什么是 Vector由于 Prometheus 是一个时序型的数据库,所以所有的数据都在基于时间戳的上下文中被定义。由时间戳到记录数据的映射(map)序列(series)被称之为时间序列(timeseries)。在 Prometheus 的术语中,关于时间序列的集合(即一组时序数据)被称之为 vector。让我们用一个示例去更好的说明这一点。 假设 http_requests_total 是一个表示服务受到的 http 请求总量的 vector。Vectors 允许我们更进一步的使用被称为 “labels” 的东西多维度去表示数据。 例: 1234567// the set of timeseries representing the number of requests with a `200` HTTP response code.// HTTP 状态码为 200 的请求数的一组时间序列http_requests_total{code="200"}// the set of timeseries representing the number of requests served by the `/api/v1/query` handler.// 表示' /api/v1/query '处理程序处理的请求数的一组时间序列http_requests_total{handler="/api/v1/query"} 这样,我们就拥有了所有与所服务的 HTTP 请求数量相关的细粒度的信息,同时还可以在需要时选择聚合这些信息。从语法上讲,http_requests_total 指的是命名为它的整个时间序列集。通过添加 {code="200"} 或 {handler="/api/v1/query"},我们选择了一个子集。 Vectors 的类型Prometheus 进一步定义了两种类型的 vector,取决于时间戳(timestamps)被映射为什么: Instant vector-一组时间序列,其中每个时间戳都映射到“瞬间(instant)”的单个数据点。在下面的响应中,我们可以看到在时间戳 1608481001 处记录的单个值。 12345678curl 'http://localhost:9090/api/v1/query' \\ --data 'query=http_requests_total{code="200"}' \\ --data time=1608481001{ "metric": {"__name__": "http_requests_total", "code": "200"}, "value": [1608481001, "881"]} Range vector-一组时间序列,其中每个时间戳映射到一个数据点的“范围(range)”,记录到过去的一段持续时间。如果没有称为 “range” 的指定持续时间,则这些值不能存在,该持续时间用于构建每个时间戳的值列表。 在下面的示例中,请注意带有时间戳的值列表,从 1608481001 到过去最多 30s。 123456789101112curl 'http://localhost:9090/api/v1/query' \\ --data 'query=http_requests_total{code="200"}[30s]' \\ --data time=1608481001{ "metric": {"__name__": "http_requests_total", "code": "200"}, "values": [ [1608480978, "863"], [1608480986, "874"], [1608480094, "881"] ]} 基于此,我们可以建立关于这两个 vector 类型的两个概念(ideas): Instant vectors 可以用直接被绘制; Range vectors 则不能。这是因为绘制图表需要在 y 轴上为 x 轴上的每个时间戳显示一个数据点。Instant vectors 的每个时间戳只有一个值,而 Range vectors 有很多。为了绘制指标(metric)图表,对于在时间序列中显示单个时间戳的多个数据点是没有被定义的。 Instant vectors 可以进行比较和运算; Range vectors 不能。这也是由于比较运算符和算术运算符的定义方式。对于每个时间戳,如果我们有多个值,我们不知道如何添加[1]或将它们与另一个性质类似的时间序列进行比较。 为什么我们还需要 Range Vectors我们现在知道,Range Vectors 不能直接用于图表或聚合。因此,很自然地要问它们为什么会存在? 答案很简单: counter。 counter 是监控系统的基本类型之一,除了 gauges 和 timings。我们将继续前面的示例,去试图理解 counters 和 range vectors 是如何相互作用的。 假设我们想知道我们的服务现在正在处理多少请求。我们的度量指标 http_requests_total{code="200",handler="/api/v1/query"} 是一个 instant vector,其值代表一个单调递增的 counter [2]。这个 counter 用于度量我们的服务接收到的请求总数。我们知道 Prometheus 在过去的不同时间里 “爬取(scraped)” 了这个 counter,所以我们可以简单地从请求 counter 的值开始: 1234567curl 'http://localhost:9090/api/v1/query' \\ --data 'query=http_requests_total{code="200",handler="/api/v1/query"}'{ "metric": {"__name__": "http_requests_total", "code": "200", "handler":"/api/v1/query"}, "value": [1608437313, "881"]} 但从响应中可以看到,这样做会得到我们不感兴趣的请求的总数,我们关注的是它在过去的有限时间内收到的请求的数量(上面表示的是过去所有时间的请求总量),例如,最近十五分钟。当我们只有一个不断增长的 counter 时,我们如何得到这个数字? 更好的方法是用 counter 的当前值减去 15 分钟前看到的 counter 值。这样我们就可以得到实例在这段时间内接收到的确切请求数。为了在 PromQL 中表示这一点,我们给 instant vector 附加持续时间 [15m]。这部分叫做 range selector,它把 instant vector 转换成 range vector。然后,我们使用像increase 这样的函数,它有效地[3]从 range 开始处的数据点减去 range 结束处的数据点。 123456789curl 'http://localhost:9090/api/v1/query' \\ --data 'query=increase(http_requests_total{code="200",handler="/api/v1/query"}[15m])'{ "metric": {"__name__": "http_requests_total", "code": "200", "handler":"/api/v1/query"}, "values": [ [1608437313, "18.4"] ]} 上面查询语句的解释:它表示过去 15 分钟内请求总数的增长量。上面的响应包含了我们想要拿到的期望之内的答案。结果以 instant vector 的形式出现,现在可以用于进一步绘制图表或汇总(aggregated)。 用于 Range Vector 的函数类似于 increase(range-vector),下面的 PromQL 函数只可用于 range vectors: changes(range-vector) absent_over_time(range-vector) delta(range-vector) deriv(range-vector) holt_winters(range-vector, scalar, scalar) idelta(range-vector) irate(range-vector) predict_linear(range-vector, scalar) rate(range-vector) resets(range-vector) avg_over_time(range-vector) min_over_time(range-vector) max_over_time(range-vector) sum_over_time(range-vector) count_over_time(range-vector) quantile_over_time(scalar, range-vector) stddev_over_time(range-vector) stdvar_over_time(range-vector) 上述的函数的计算结果返回都为 instant vector。因此,我们可以得出这样的结论: range vector 作为这些以 “range vector” 为输入值的函数是有用的。 除了上面的函数和 curls[^1],还有更多关于 range vectors 的内容,我们将在另一篇博文中介绍。 脚注[1] 未定义的行为并不意味着不可能定义一种使这些操作可以工作的方式。这意味着实现选择避免支持这一点。这样做可以简化实现,或者因为可能没有一种方法使它在各种情况 (cases)之间一致地工作。 [2] 单调递增 counter 的值永不减少;它要么增加要么保持不变。Prometheus 只允许一种 counter 减少的情况,即在目标重启期间。如果 counter 值低于之前记录的值,则 rate 和 increase 等 range vector 函数将假定目标重新启动并将整个值添加到它所知道的现有值。这也是为什么我们应该总是先 rate 后 sum,而不是先 sun 后 rate。Rate then sum, never sum then rate [3] “有效(effectively)”是这里的关键词。increase 实际上也可以进行外推,因为所请求的持续时间可能没有在范围(range)的“开始”和“结束”处精确对齐的数据点。 原文:https://satyanash.net/software/2021/01/04/understanding-prometheus-range-vectors.html作者:Satyajeet Kanetkar","categories":[{"name":"Prometheus","slug":"Prometheus","permalink":"https://yeshan333.github.io/categories/Prometheus/"}],"tags":[{"name":"Prometheus","slug":"Prometheus","permalink":"https://yeshan333.github.io/tags/Prometheus/"}]},{"title":"Go json Marshal & UnMarshal 的一点小 trick","slug":"Go-json-Marshal-UnMarshal-的一点小-trick","date":"2022-03-30T23:58:46.000Z","updated":"2022-03-30T23:58:46.000Z","comments":true,"path":"2022/03/30/Go-json-Marshal-UnMarshal-的一点小-trick/","permalink":"https://yeshan333.github.io/2022/03/30/Go-json-Marshal-UnMarshal-%E7%9A%84%E4%B8%80%E7%82%B9%E5%B0%8F-trick/","excerpt":"","text":"在编写 Web Service 等涉及数据序列化和反序列化的场景,对于 JSON 类型的数据,在 Go 中我们经常会使用到 encoding/json Package。最近微有所感,小水一篇 omitemptyJSON 数据的 UnMarshal 我们经常会配合 Struct Tags 使用,让 Struct 的 Filed 与 JSON 数据的指定 property 绑定。 如果要序列化为 Go Struct 的 JSON 数据对应的 Fields 相关的 JSON properties 是缺失的,我们经常会用 omitempty 标记 Go Fields,序列化时,JSON 数据中缺少的属性将会被设置为 Go 中对应的 zero-value,比如: 1234567891011121314151617181920212223package mainimport ( "encoding/json" "fmt")type Person struct { Name string `json:"name"` Age string `json:"age,omitempty"` Weak bool `json:"weak,omitempty"`}func main() { jsonData := `{"name":"ShanSan"}` req := Person{} _ = json.Unmarshal([]byte(jsonData), &req) fmt.Printf("%+v", req) fmt.Println(req.Age)}// output// {Name:ShanSan Age: Weak:false}// Go Playground Link 但上面的例子对于一些场景的处理可能会有问题。看下下面这个例子: 1234567891011121314151617181920212223package mainimport ( "encoding/json" "fmt")type Person struct { Name string `json:"name"` Age string `json:"age,omitempty"` Weak bool `json:"weak,omitempty"`}func main() { jsonData := `{"name":"ShanSan", "age": ""}` req := Person{} _ = json.Unmarshal([]byte(jsonData), &req) fmt.Printf("%+v", req) fmt.Println(req.Age)}// output// {Name:ShanSan Age: Weak:false}// 可以看到 age 为 "" 时,和缺省时的结果是一样的。很显然,上面的写法,缺省的字段和空字段是没有被区分开的。对于一些数据的 Update 操作,比如我们只想 Update Name 字段,对应的 JSON 数据为 {"name":"ShanSan"},执行上述的反序列化动作,Age 字段会被设置为 empty string,Waek 也被设置为了 false,这显然不是我们想看到的。 nil 一下我们可以指针类型(pointer type)对上面的情况区分一下: 123456789101112131415161718192021222324package mainimport ( "encoding/json" "fmt")type Person struct { Name *string `json:"name"` Age *string `json:"age,omitempty"` Weak *bool `json:"weak,omitempty"`}func main() { jsonData := `{"name":"ShanSan"}` jsonDataEmptyAge := `{"name":"ShanSan", "age": ""}` req := Person{} reqEmptyAge := Person{} _ = json.Unmarshal([]byte(jsonData), &req) _ = json.Unmarshal([]byte(jsonDataEmptyAge), &reqEmptyAge) fmt.Printf("%+v", req) fmt.Printf("%+v", reqEmptyAge)}// {Name:0xc000010390 Age:<nil> Weak:<nil>}{Name:0xc0000103c0 Age:0xc0000103d0 Weak:<nil>} emmm,缺省的字段为 nil 了。 Marshal 的时候序列化 struct 的时候,如果使用了 omitempty,也会出现类似上面反序列化的情况,对于缺省的 field 或者 zero-value,序列化得到的 JSON 数据也会缺省相关属性,此时我们也可以通过 pointer 保留相关字段,如下: 123456789101112131415161718192021222324252627282930313233343536package mainimport ( "encoding/json" "fmt")type Student struct { Name string `json:"name"` Score int `json:"score,omitempty"`}type StudentWithPointer struct { Name string `json:"name"` Score *int `json:"score,omitempty"`}func main() { student := Student{ Name: "ShanSan", Score: 0, } score := 0 studentWithPointer := StudentWithPointer{ Name: "ShanSan", Score: &score, } data, _ := json.Marshal(student) dataWithPointer, _ := json.Marshal(studentWithPointer) fmt.Println(string(data)) fmt.Println(string(dataWithPointer))}// {"name":"ShanSan"}// {"name":"ShanSan","score":0} Go Playground 参考 encoding/json Differentiate between empty and not-set fields with JSON in Golang Go’s “omitempty” explained","categories":[{"name":"Go","slug":"Go","permalink":"https://yeshan333.github.io/categories/Go/"}],"tags":[{"name":"json","slug":"json","permalink":"https://yeshan333.github.io/tags/json/"},{"name":"Marshal","slug":"Marshal","permalink":"https://yeshan333.github.io/tags/Marshal/"},{"name":"UnMarshal","slug":"UnMarshal","permalink":"https://yeshan333.github.io/tags/UnMarshal/"}]},{"title":"profiling & Flame Graphs","slug":"profiling-flame-graph","date":"2022-02-26T22:54:38.000Z","updated":"2022-02-26T22:54:38.000Z","comments":true,"path":"2022/02/26/profiling-flame-graph/","permalink":"https://yeshan333.github.io/2022/02/26/profiling-flame-graph/","excerpt":"","text":"忽然想起来还没怎么用过 profiling tools,这可是性能分析“杀器”啊,小水一波,兴许以后就用上了🙃。 profiling profiling,分析。有很多时候,我们都会相对处于 runtime 的程序进行指标 & 特征分析,比如 CPU 使用情况、内存使用情况,race 检测等。 Flame Graphs(火焰图) Flame Graph,火焰图。火焰图是一种常用的可视化分析性能数据的方式。不同类型火焰图适合不同的性能分析优化场景。 上图为 CPU 使用情况的 Flame Graph,来自 -> (https://github.com/brendangregg/FlameGraph。通过该图,我们可以找到 CPU 占用最多的函数,分析代码热路径。特征如下: 纵轴:表函数调用栈,上层函数时下层函数的子函数; 横轴:表示 CPU 占用时间,越长表示占用时间越多; 值得注意的是:横轴先后顺序是为了聚合,跟函数间依赖或调用关系无关;一般情况下,火焰图各种颜色是为方便区分,本身不具有特殊含义。 小试一下Elixir Phoenix Framework & Flame On根据这篇 Toturial -> Profiling Elixir Applications with Flame Graphs and Flame On,我们在 Phoenix App Telemetry Dashboard 中集成 Flame On,GET 到如下 Flame Graph: Go && pprofGo 内置了 profiling 工具 [pprof][https://github.com/google/pprof] 方便我们对程序进行分析,通过 runtime/pprof 包,我们可以在程序中指定位置埋下采集点。 123456789101112131415161718192021222324252627282930313233343536373839404142434445package mainimport ( "math/rand" "os" "runtime/pprof" "time")func generate(n int) []int { rand.Seed(time.Now().UnixNano()) nums := make([]int, 0) for i := 0; i < n; i++ { nums = append(nums, rand.Int()) } return nums}func insertionSort(nums []int) { var n = len(nums) for i := 1; i < n; i++ { j := i for j > 0 { if nums[j-1] > nums[j] { nums[j-1], nums[j] = nums[j], nums[j-1] } j = j - 1 } }}func main() { profileFile, _ := os.OpenFile("cpu.pprof", os.O_CREATE, 0644) defer profileFile.Close() pprof.StartCPUProfile(profileFile) defer pprof.StopCPUProfile() var n int = 10 for i := 0; i < 5; i++ { nums := generate(n) insertionSort(nums) n *= 100 }} 123go run main.go # 生成 cpu.pprof profiling 文件# 启动 http server 查看分析数据go tool pprof -http=:8080 cpu.pprof 然后可以 GET 到类似如下得 Flame Graphs,就挺不 Simplex 的,2333: ReactReact App 的 profiling 我们可以借助浏览器扩展 React DevTools 进行,也可以在使用官方提供的 Profiler API. 我们起个 Ant-Design Pro 来看看:https://github.com/ant-design/ant-design-pro 1yarn create umi 参考 Flame Graphs Profiling Elixir Applications with Flame Graphs and Flame On Go程序性能分析 pprof","categories":[{"name":"Performance","slug":"Performance","permalink":"https://yeshan333.github.io/categories/Performance/"},{"name":"Profiling","slug":"Performance/Profiling","permalink":"https://yeshan333.github.io/categories/Performance/Profiling/"}],"tags":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"},{"name":"React","slug":"React","permalink":"https://yeshan333.github.io/tags/React/"},{"name":"Go","slug":"Go","permalink":"https://yeshan333.github.io/tags/Go/"},{"name":"Profiling","slug":"Profiling","permalink":"https://yeshan333.github.io/tags/Profiling/"},{"name":"Flame Graphs","slug":"Flame-Graphs","permalink":"https://yeshan333.github.io/tags/Flame-Graphs/"}]},{"title":"状态机的一点儿事(fsm-smr-dfsm)","slug":"fsm-smr-dfsm","date":"2022-01-31T17:32:51.000Z","updated":"2022-01-31T17:32:51.000Z","comments":true,"path":"2022/01/31/fsm-smr-dfsm/","permalink":"https://yeshan333.github.io/2022/01/31/fsm-smr-dfsm/","excerpt":"","text":"有限状态机(Finite State Machine) 有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机(英语:finite-state automaton,缩写:FSA),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。- 维基百科 有限状态机的要素 状态:状态是有限个的,任一时刻,只处于一种状态 条件:用于触发状态转移动作的“事件”,条件被满足(输入)就会触发相应动作 动作:条件满足后,执行状态转移的行为 转换:从一个状态转换为另一个状态,转换一般由状态转换函数完成 让我们来看下有限状态机的经典例子:旋转闸机(这年代闸机基本不用硬币了😂) 使用状态图表示的话就是下面这样子: 状态:旋转闸机只有两种状态:锁定和解锁 条件、动作、转换:闸机的初始状态是锁定(Locked)的,当游客放置硬币(Coin)到闸机中时,闸机就会转换为解锁(Un-locked)状态,当游客执行推动作通过闸机后,闸机状态又会被转换为锁定(Locked)。 当闸机处于解锁(Un-locked)状态时,反复的放硬币是没有用的,状态不会变,同理,锁定态时,反复 Push 旋转门也是没用的,闸机状态不会变,游客通过不了。 用状态转换表表示如下图: Go 实现旋转门的 FSM基于 Go 语言,可实现旋转门闸机的 FSM 如下,StateTransitionTable 即为状态转换表: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889package mainimport ( "bufio" "fmt" "log" "os" "strings")const ( Locked = iota Unlocked)const ( InputCoin = "coin" InputPush = "push")type State uint32type StateTransitionTableDef struct { State State Input string}// Actiontype TransitionFunc func(state *State)var StateTransitionTable = map[StateTransitionTableDef]TransitionFunc{ {Locked, InputCoin}: func(state *State) { fmt.Println("Unlocks the turnstile so that the customer can push through.") *state = Unlocked }, {Locked, InputPush}: func(state *State) { fmt.Println("The turnstile has been locked.") }, {Unlocked, InputCoin}: func(state *State) { fmt.Println("The turnstile has been unlocked.") }, {Unlocked, InputPush}: func(state *State) { fmt.Println("When the customer has pushed through, locks the turnstile.") *state = Locked },}type TurnStile struct { State State}func (t *TurnStile) ExecuteAction(action string) { stateActionTupple := StateTransitionTableDef{ t.State, strings.TrimSpace(action), } if transFunc := StateTransitionTable[stateActionTupple]; transFunc == nil { fmt.Println("Unknown action, please try again!") } else { transFunc(&t.State) }}func main() { turnstileFSM := &TurnStile{ State: Locked, // Initial State } prompt(turnstileFSM.State) reader := bufio.NewReader(os.Stdin) for { action, err := reader.ReadString('\\n') if err != nil { log.Fatalln(err) } turnstileFSM.ExecuteAction(action) }}func prompt(s State) { m := map[State]string{ Locked: "Locked", Unlocked: "Unlocked", } fmt.Printf("current state is: [%s], please input action: [coin | push]: \\n", m[s])} FSM 应用-词法分析FSM 很典型的一个应用就是用于编译器前端->词法分析器(Lexer)的词法分析上(tokenize)。比如如下关系表达式语句的 tokenize 上: blogAge > 3 我们的 Lexer 扫描关系表达式时需要识别到 blogAge 为标识符(Identifier),> 为比较操作符(Greater),3 为数字字面量(NumericLiteral),对应的词法规则如下: 标识符(Identifier):首字符需要为字母,其他字符可为数字或字母或下划线 比较操作符(Greater):> 数字字面量(NumericLiteral):全部由数字组成 对应的 FSM 简化版状态图如下: 复制状态机(Replicated State Machine)在分布式系统领域,状态机被用于保证节点状态的一致性,分布式系统一致性算法是基于复制状态机(Replicated State Machine)提出来的。 每一个 Server 节点都会有一个状态机,这个状态机的输入来源为一份储存着命令序列的日志,对于相同的命令输入,每个节点状态机(确定有限自动机 DFA,Deterministic Finite Automata)的输出是确定的、相同的。 参考 复制状态机 Finite-state machine 使用 Golang 实现状态机","categories":[{"name":"Compile","slug":"Compile","permalink":"https://yeshan333.github.io/categories/Compile/"}],"tags":[{"name":"FSM","slug":"FSM","permalink":"https://yeshan333.github.io/tags/FSM/"},{"name":"Compiler","slug":"Compiler","permalink":"https://yeshan333.github.io/tags/Compiler/"},{"name":"Lexer","slug":"Lexer","permalink":"https://yeshan333.github.io/tags/Lexer/"}]},{"title":"2021 | 肆意随心","slug":"2021-annual-reviewed","date":"2022-01-01T12:55:00.000Z","updated":"2022-01-01T12:55:00.000Z","comments":true,"path":"2022/01/01/2021-annual-reviewed/","permalink":"https://yeshan333.github.io/2022/01/01/2021-annual-reviewed/","excerpt":"Yeah“兜兜转转”又一年了,又到了该水年度 Review 的时候啦✅❇️。 算下来,博客三年了,准备开启新的三年了。这篇总结也算是第三篇总结了,3 - 可以说是我很喜欢的数字,挺多网名(ShanSan、yeshan333),还有博客域名(shansan.top、shan333.cn、…)是和“三”有关的(and so on),也算是“谐音梗”啦😎? 回头看看之前写的几篇总结,还挺有意思的。21 年似乎并没有太多那么刻意去做的事,想到了就去试试了。这一次,不需要那么的有条理性,随手一记。","text":"Yeah“兜兜转转”又一年了,又到了该水年度 Review 的时候啦✅❇️。 算下来,博客三年了,准备开启新的三年了。这篇总结也算是第三篇总结了,3 - 可以说是我很喜欢的数字,挺多网名(ShanSan、yeshan333),还有博客域名(shansan.top、shan333.cn、…)是和“三”有关的(and so on),也算是“谐音梗”啦😎? 回头看看之前写的几篇总结,还挺有意思的。21 年似乎并没有太多那么刻意去做的事,想到了就去试试了。这一次,不需要那么的有条理性,随手一记。 博客 & 技术-Blog & Techs21 年的博客没有多大的变化,实现了个简单的 GitHub Action 做了下 CI/CD 到腾讯云的 CVM 服务器(对应域名 shan333.cn 下的一个备份 [backup] 博客),切换了下评论系统到 Waline,更有范了~。 仔细算算,博客的 PV 应该有 10w 了吧(算上我中途干掉的 PV 统计😂)?博客太水,之前没敢甩群被 dalao 一波吐槽 & 本来就写着玩的,不需要过多的 PV/UV。 BTW,当初甩下的一个月至少一篇文章的 🚩,好像完成的还可以,就二月份少了篇(那时候我应该在锤《Command & Conquer : Mental Omega》🤦‍♂️) 十年之约(2021.09.15-Begin) 十年之约,即从加入这个活动起,我们的博客十年不关闭,保持更新和活力。- 来自十年之约站点首页 写到这个我想起了最近一个月在看的斗破苍穹,就离谱。 十年之约 <www.foreverblog.cn>,印象之中好像是 18 年的时候在 Valine 的交流群知道的?我记得我申请过一次,被 reject 掉了(太水了,😶‍🌫️),回头看看归档页,那时候写得文章挺水的,挺想删掉,但是我在 20 年初的时候给博客套了下 Git -> ⌈actions-for-hexo-blog⌋,博客的变更历史已经追踪起来了,不删了不删了,费劲😊,我还每年都到互联网档案馆(Internet Archive)做下 Snapshot,多重手段保留回忆,我被自己制裁了😢。 十年,好像挺长啊,但它三年了,文章质量慢慢好起来了 <不过还是挺水,但我还能更“水”>,是时候了,Brother! 十年之约审核 Techs & Coding再看看 21 年 GitHub 的小绿点,有点差强人意啊,有很多小点是一个 rss-feed 的 CI 打的,21 年的 Coding 时间是少了点,挪了很多的时间去做点其他事情去了,最近编码量稍增,能感觉到代码质量越来越 low 了 <2333,好像原来就挺拉跨的🙃,裂开了>。我感觉 22 年差不多可以去“水”一下感兴趣的开源项目了吧? 在 Twitter 上看了一圈,dalao 们太恐怖了🤐。 GitHub 21 年折腾的新玩意好像不多,照旧耍着 Go、TypeScript、Kubernetes,“蜻蜓点水”般看了下 Prometheus。再想想看了啥技术相关的书,好像挺少有技术深度的,我看了很多和 DevOps、CloudNative 、工程化相关的书。打开自己本想专门用来 Reading 的“小平板子”,好像和上年没多大变化,电子书还是那几本,哈哈哈,吃灰了吃灰了~(^_^): iPads 上的电子书 如果说 21 年看过的印象最深刻的技术书是哪几本,那么应该就是《Go 语言设计与实现》和《凤凰架构-构建可靠的大型分布式系统》,《Go 语言设计与实现》作者的功底很强,膜了❤️,21 年我冒出了个想接触 Compile 技术的想法,就是因为这本书。 Geektime 用的时间减少了,不剁手了,回头看看一些老的东西。 忽然间想起来因为毕设还看了下《普林斯顿微积分读本》,虽然没用上,但我居然看得津津有味,我怕是个假的数学系学生,这本书是挺入门的,我还反手剁手到 App Store 买了下 MarginNote3 去看这本书,一直没怎么用上这个 App,2022 年应该能用上了吧😢? 校园-Campus2021,21 年最大的一件事应该就是毕业了,21 年的毕业季因为疫情的原因好像是那般的“常规”,好像没有做下过什么承诺,好像没有怎么和同学 & 老师聊过对未来的期待,因为经历过 2020 年的春招和秋招的摧残,好像并没有找工作的焦虑感,更多的我想因该还是迷惑,一切似都那么的“平淡”,并没有做什么“惊心动魄”的事,好像并没有电影中的那些桥段?🐇🐇🐇👀 离开学校前,微微整理了下那些年吹过的水,把 Speak 稍微整理了下,将之前的吹水站 slide.shan333.cn 迁移到了 React & Gastby 写的 slides.shan333.cn 上。 那些年的 Slides 12 月份在 koukou 空间捞了手学校的照片,越来越好看了😲: 学校风景 我还顺便拿抖音的剪映稍微理了个短视频,音视频技术 tql,真是“降维打击”,释放灵感:☁☁☁ 不得不承认,现在的确是个好的时代,很多东西不会都可以去搜索着学,就看自己想不想接触,有没有兴趣,愿不愿意花时间,想做得多专业。 工作-Work不知不觉已经来到 A 厂工作快六个月了,近距离从内网 yuque & 技术站观摩之前知道的一些 dalao 在做的事情 & 写的东西。瞬间发现这些人好像比想象中的还要强。 毕业后,我选择了比较感兴趣的一门行业,我觉得我选择的是一个极具创造力和思考力的职业。我觉得这里应该有很多的话记录才对,但在这写不出来了,我在另一个地方“写了”。 生活-Life2021 年的下半年我也经历了很多的事情,我也渐渐明白了一些事情,有些事真的得自己经历过,才会有更多得体会,一切似乎是那么得难以理解,又似乎那么的理所当然。我甚至觉得我似乎开始质疑起了某样东西,但又没全盘否定。于局中仍可保持清醒,于局外,又可以看到很多的东西。“当局者迷,旁观者清”有时候也可予以驳斥。这一年同样也认识了一些人, 缘起于那本《微习惯》,仔细回忆起来,我好像多了很多的习以为常的“小动作”,几乎是下意识的动作,上班的路途反手就是打开读书 App,看那么几页,没有多大的压力,一天想看多少看多少,哪怕只是一页。好了,当我敲出这行字的时候,顺便做了几个俯卧撑😂。 21 年 12 月中,来了次十多公里的徒步,相当的放松,博客首次贴张 chou 照🤗: kubi 游戏-Games真三国无双 7 帝国 回忆了一下,21 年一如既往的锤老游戏多一点,我把电脑给换了,锤 SC2 更爽了,但是 8 月份的时候国服差不多 GG 了,退出江湖选择养老游戏了。 火焰纹章-晓之女神 11 & 12 月有部分时间在和位 dalao 打,“真滴菜”: 阅读-Reading2021,阅读源更多还是语雀和书,知乎看得没有那么频繁了,我还接触了个叫做少数派的网站,内容质量很高。我与语雀🕊️的缘分应该起于大二的时候?我在这里了解了一波体验设计 & 交互 & 前端知识,见识了很多有“思考度”的文章还有dalao,疯狂 follow。好像那些年我对体验设计的兴起就是缘于这里,想起来拿教育邮箱薅的 Figma 还在“我的桌面”很久没打开过了,我还想着试着拿 iPad 试试插画(illustration)来着,Edge 的集锦功能真不错,存了很多插画网站,又多个收藏吃灰的地方🐕。 我的语雀 21年看的“闲书”多了起来,看着一些别人描述的事,想想自己是怎么样的人,如何去描述自己,再看看自己会变成什么样的人,可能会是什么样的人(in the future),我想要的是有更广的看问题的视角 & 锻炼下思考力?: 《活着》 《微习惯》 《蛤蟆先生去看心理医生》 《分寸感》 《杨绛:谈定从容,便是优雅》 《黑客与画家》 …… 可能是因为之前周刊看多了,我把 21 年阅读看到的一些内容(随手抄 & 一些碎片话思考)反手在语雀上开了个周刊记录了下来 👉记录这一周我 看/听 让我有感触的一些文字 ,颇有“万物皆可周刊”那意思了。 2021 年印象深刻的三句话 最恐怖的是你自己不知道你不知道;因为如果你不爱一件事,你不可能把它做得真正优秀;我们一生可能会做很多很多的事情,有些事情之所以去做,并非它是有多么大的意义,而是因为我们感兴趣。 但有些灵感和想法,总是那么的容易消逝。哪怕是我将它即刻记录下来了,可当我再看的时候,好像已经不是之前那个“味道”了。翻了下 Microsoft ToDo 这一年我好像积压了很多 Items。RSS Reed 阅读信息流似乎没那么好了,最近有试试 TG RSS Feed Robot + yuque 的想法,虽然在某推上看到了许多 dalao KM 管理的方式,但好像没有特别适合我的。Exploring! 折磨 看 & 听-See & Listen 21 年又关注了下 Red Bull BC One,Respect 一下那些年耍过的街舞,21 年没有我特别喜欢的 Style,这应该是第二次在 World Final 有 Bgirl 了,不知道啥时候能出现中国区的 dalao🙃。 21 年 10 月开始,我一个人开启了基本每周一场电影的模式(累计 10 场,人生目前累计 13 场?🏄),还挺有意思的,或许这就是传说中的成长了?相比之前,我有了更多的视角,我看懂了更多电影要描绘的故事,外加一些经历和看到或者听到过的故事,我可以更多的对个人的理解进行描述了。 21 年的电影 2021年,听技术 Podcast(播客)没有那么多了,还是一如既往的关注着捕蛇者说,转战某推围观 dalao 了,深夜听喜马拉雅催眠。 未来-Future2021 如果用一句话描述的话,那么应该是:有挺多的事是想到了,便去做了,不需要那么的有规划性。 2022 年,我想怎么操作:更有挑战,更有趣,更有思考,更有深度的事?2333,这里就不立 🚩 了,我还需要想段时间。 流年 关注思考的过程,终将更加卓越 | 2020 年总结 2019 年总结","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"Git 仓库瘦身与 LFS 大文件存储","slug":"git-lfs-and-thin-repo","date":"2021-12-26T16:26:23.000Z","updated":"2021-12-26T16:26:23.000Z","comments":true,"path":"2021/12/26/git-lfs-and-thin-repo/","permalink":"https://yeshan333.github.io/2021/12/26/git-lfs-and-thin-repo/","excerpt":"熟悉 Git 的小伙伴应该都知道随着 Git 仓库维护的时间越来越久,追踪的文件越来越多,git 存储的 objects 数量会极其庞大,每次从远程仓库 git clone 的时候都会墨迹很久。如果我们不小心 git add 了一个体积很大的文件,且 git push 到了远程仓库,那么我们 git clone 的时候也会很慢。 看一下 GitHub 上的 microsoft/vscode 仓库,都有 九万多个 commit 了,可想而知 objects 的数量应该很恐怖,尝试 clone 一下(一百多万个 objects):","text":"熟悉 Git 的小伙伴应该都知道随着 Git 仓库维护的时间越来越久,追踪的文件越来越多,git 存储的 objects 数量会极其庞大,每次从远程仓库 git clone 的时候都会墨迹很久。如果我们不小心 git add 了一个体积很大的文件,且 git push 到了远程仓库,那么我们 git clone 的时候也会很慢。 看一下 GitHub 上的 microsoft/vscode 仓库,都有 九万多个 commit 了,可想而知 objects 的数量应该很恐怖,尝试 clone 一下(一百多万个 objects): 这里微微记录下 Git 仓库瘦身和使用 Git LFS 进行大文件存储管理的几个常规操作。 Git 仓库瘦身 瘦身背景:错误把大文件 push 到了远程仓库 我们可以通过以下命令或者 du -mh 查看 Git 仓库的体积,git-count-objects: 12# 查看仓库体积情况git count-objects -vH 示例:可以看到当前仓库体积只有 12.00 KiB 左右 现在我们模拟错误的将大文件上传到远程 Git 仓库的动作: 1234567891011121314151617# 1、生成一个 90MB 大小的文件,Github 做了限制超过 100 MB 大小的文件建议使用 LFS,直接拒绝 push➜ dd if=/dev/zero of=bigfile bs=90MB count=1# 2、将这个文件 push 到远程仓库➜ git add bigfile➜ git commit -m "add 90MB bigfile"➜ git push origin masterEnumerating objects: 4, done.Counting objects: 100% (4/4), done.Delta compression using up to 16 threadsCompressing objects: 100% (3/3), done.Writing objects: 100% (3/3), 85.71 KiB | 306.00 KiB/s, done.Total 3 (delta 0), reused 0 (delta 0)remote: warning: See http://git.io/iEPt8g for more information.remote: warning: File bigfile is 85.83 MB; this is larger than GitHub's recommended maximum file size of 50.00 MBremote: warning: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.To github.com:yeshan333/git-lfs-prune-repo.git e3baf1a..f057313 master -> master 好,接下来我们假装这个仓库有很多文件,不知道具体是那个文件让 Git 仓库的体积突然变大,导致 clone 很慢🤣。就算知道了是哪里个文件造成的,我们直接删除那个文件是没有用的,我们还需要删除那个文件对应的 Git Object 文件。 接下来我们可以通过一下命令将本地 clone 的仓库历史提交过的体积较大的前 5 个文件名与对应的 Object 文件的 ID 罗列出来: 1git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')" 然后我们删除历史提交过的大文件 bigfile,从日志中我们可以看到本地仓库已经移除大文件成功了 1234567891011121314➜ git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch bigfile' --prune-empty --tag-name-filter cat -- --allWARNING: git-filter-branch has a glut of gotchas generating mangled history rewrites. Hit Ctrl-C before proceeding to abort, then use an alternative filtering tool such as 'git filter-repo' (https://github.com/newren/git-filter-repo/) instead. See the filter-branch manual page for more details; to squelch this warning, set FILTER_BRANCH_SQUELCH_WARNING=1.Proceeding with filter-branch...Rewrite e3baf1ac709ae54b60afac9038adcf26fd086748 (1/1) (0 seconds passed, remaining 0 predicted)WARNING: Ref 'refs/heads/master' is unchangedWARNING: Ref 'refs/remotes/origin/master' is unchangedWARNING: Ref 'refs/remotes/origin/main' is unchangedWARNING: Ref 'refs/remotes/origin/master' is unchanged 接下来我们使用 reflog 和 gc 压缩(清理和回收大文件占用的 objects 空间)看看瘦身效果,最后将变动推送到远程仓库即可: 123456789101112➜ git reflog expire --expire=now --all && git gc --prune=now --aggressive➜ git count-objects -vH➜ git push --mirrorTotal 0 (delta 0), reused 0 (delta 0)To github.com:yeshan333/git-lfs-prune-repo.git - [deleted] main + f057313...e3baf1a master -> master (forced update) * [new branch] origin/HEAD -> origin/HEAD * [new branch] origin/main -> origin/main * [new branch] origin/master -> origin/master What’s the difference between git clone –mirror and git clone –bare Git LFS 大文件存储如果我们之前生成的大文件 bigfile 大小超过 100 MB,那么 push 到 Github 的时候,会抛出个 error 错误,并会有条建议使用 LFS (Large File Storage):https://git-lfs.github.com/ 管理这个大文件: 1234567891011121314➜ git push origin mainEnumerating objects: 4, done.Counting objects: 100% (4/4), done.Delta compression using up to 16 threadsCompressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 1.85 MiB | 752.00 KiB/s, done.Total 3 (delta 0), reused 1 (delta 0)remote: error: Trace: 993cb74d30fdb2342e7243f5a7002c1892d00d3a216b80e64b43ef7e4382b947remote: error: See http://git.io/iEPt8g for more information.remote: error: File bigfile is 1907.35 MB; this exceeds GitHub's file size limit of 100.00 MBremote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.To github.com:yeshan333/git-lfs-prune-repo.git ! [remote rejected] main -> main (pre-receive hook declined)error: failed to push some refs to 'git@github.com:yeshan333/git-lfs-prune-repo.git' 1234567891011121314151617181920212223242526272829303132333435# 仓库初始化 LFS➜ git lfs installUpdated git hooks.Git LFS initialized.# 创建大文件➜ dd if=/dev/zero of=bigfile200 bs=200MB count=11+0 records in1+0 records out200000000 bytes (200 MB, 191 MiB) copied, 0.176594 s, 1.1 GB/s# 指定 LFS 追踪大文件➜ git lfs track "bigfile200"Tracking "“bigfile200”"# 被追踪的文件会记录再 .gitattributes 文件中我们将 .gitattributes 文件 push 到远程仓库即可➜ cat .gitattributes"bigfile200" filter=lfs diff=lfs merge=lfs -text➜ git add .gitattributes➜ git commit -m "add .gitattributes"➜ git push# 提交大文件➜ git add bigfile200➜ git commit -m "bigfile 200MB"[master 84fb90b] bigfile 200MB 1 file changed, 3 insertions(+) create mode 100644 bigfile200➜ git pushUploading LFS objects: 100% (1/1), 200 MB | 3.7 MB/s, done.Enumerating objects: 4, done.Counting objects: 100% (4/4), done.Delta compression using up to 16 threadsCompressing objects: 100% (3/3), done.Writing objects: 100% (3/3), 423 bytes | 423.00 KiB/s, done.Total 3 (delta 0), reused 0 (delta 0)To github.com:yeshan333/git-lfs-prune-repo.git aef9a0b..84fb90b master -> master 开启了 LFS 之后,对应大文件的内容存储在 LFS 服务器中,不再是存储在 Git 仓库中,Git 仓库中存储的是大文件的指针文件,LFS 的指针文件是一个文本文件。 Done? 参考 Push Mirroring-Gitlab git 瘦身 | Palance’s Blog 详解 Git 大文件存储(Git LFS)","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"}]},{"title":"Deserve","slug":"deserve","date":"2021-12-04T06:49:35.000Z","updated":"2021-12-04T06:49:35.000Z","comments":true,"path":"2021/12/04/deserve/","permalink":"https://yeshan333.github.io/2021/12/04/deserve/","excerpt":"今天凌晨五点就醒了,积累了好多好多的情绪啊!","text":"今天凌晨五点就醒了,积累了好多好多的情绪啊!","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"回环地址的一点儿破事","slug":"loopback-addr","date":"2021-11-27T11:41:50.000Z","updated":"2021-11-27T11:41:50.000Z","comments":true,"path":"2021/11/27/loopback-addr/","permalink":"https://yeshan333.github.io/2021/11/27/loopback-addr/","excerpt":"心血来潮,小水一篇! 回环地址(loopback address) loopback 在维基百科上有一段这样的解释:Loopback (also written loop-back) is the routing of electronic signals or digital data streams back to their source without intentional processing or modification. It is primarily a means of testing the communications infrastructure.通熟的说就是将由“源”发送出去的数据路由回“源”。","text":"心血来潮,小水一篇! 回环地址(loopback address) loopback 在维基百科上有一段这样的解释:Loopback (also written loop-back) is the routing of electronic signals or digital data streams back to their source without intentional processing or modification. It is primarily a means of testing the communications infrastructure.通熟的说就是将由“源”发送出去的数据路由回“源”。 作为划水选手,我们肯定会接触过这样一个东西 -> Virtual loopback interface。当我们写的应用/服务想在同一台机器上进行通信的时候,基本都会使用到它。 在类 Unix 系统中,虚拟回环接口(Virtual loopback interface)通常被命名为 lo 或者 lo0。我们可以使用 ipconfig 看一下: emmm,127.0.0.1,好家伙,没错,127.0.0.1 就是一个 IPv4 的回环地址。IETF 标准中(RFC1122、RFC5735)将 IPv4 CIDR 地址块 127.0.0.0/8 划为回环地址(即 127.0.0.0 ~ 127.255.255.255)。IPv6 下回环地址为 ::1/128。 IPv6 下 127.0.0.1 表示为 ::1 几个常见的小家伙OK, 回环地址简介完了,接下来让我们看下以下几个常用的“小家伙”: localhost 0.0.0.0 127.0.0.1 在这里,抛出几个问题?再自问自答!😎 这三个家伙有什么区别? 显而易见,0.0.0.0 和 127.0.0.1 是 IP 地址嘛,localhost 是 hostname。至于再具体点的东西,可以看下后面两个问题。 为什么断网后,我们还能 ping 通这三个东西? 断网的情况下,我们使用 ping 命令,ping 一下公网的 IP 地址,一般是不通的。但是 ping 127.0.0.1 却可以。因为 127.0.0.1 是一个回环地址(Loopback Address),操作系统对于走真实网卡的公网 IP 数据包的处理和走虚拟网卡的本机回环地址(之前介绍的 lo 和 lo0,Virtual loopback interface)的处理是不一样的。相对于目标是公网 IP 的数据包走的 ring buffer,回环地址的数据包走了一个数据结构 input_pkt_queue 触发软中断 ksoftirqd 处理,这篇文章有较为深入的介绍 👉🔗🐂。 至于 ping localhost 也是通的是因为 localhost DNS 解析到了回环地址 127.0.0.1,可以使用 cat /etc/hosts 查看 Linux hosts 文件。IETF 标准 RFC6761 将域名 localhost 默认保留给了回环地址 127.0.0.1。 123➜ cat /etc/hosts127.0.0.1 localhost::1 ip6-localhost ip6-loopback 至于为什么断网能 ping 通 0.0.0.0,可以结合下一个问题思考一下。 开发完后的 Web Service,我们一般会 listen 0.0.0.0,这有什么用? listen 0.0.0.0 会监听本机上的所有IPV4地址。让服务访问方就可以通过本机的多个 IP 地址(包括回环地址,只要服务访问方与本机处于同一个网络下)访问本机的 Web 服务。RFC 5735 对特殊的 0.0.0.0 地址做了介绍。 Wireshark 回环地址抓包在这里介绍下使用 Wireshark 抓取回环地址的数据包, Wireshark 如果想要抓取回环地址的包((loopback packets)),需要安装 Npcap。 1、我们本地使用 Go 的 Gin 起个粗糙版 Web 服务: 12345678910111213package mainimport "github.com/gin-gonic/gin"func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")} 2、打开 Wireshark,capture 回环地址的虚拟网卡: 3、过滤一下 TCP 端口,curl 一下 localhost:8080/ping: 1curl --location --request GET 'localhost:8080/ping' 水完,收工!😊 参考 LoopBack (Virtual loopback interface) - wikipedia Localhost - wikipedia 断网了,还能ping通 127.0.0.1 吗?为什么?","categories":[{"name":"计算机网络","slug":"计算机网络","permalink":"https://yeshan333.github.io/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"}],"tags":[{"name":"Wireshark","slug":"Wireshark","permalink":"https://yeshan333.github.io/tags/Wireshark/"}]},{"title":"回到十月-生活中的一点儿小确幸","slug":"back-to-october","date":"2021-11-14T10:21:37.000Z","updated":"2021-11-14T10:21:37.000Z","comments":true,"path":"2021/11/14/back-to-october/","permalink":"https://yeshan333.github.io/2021/11/14/back-to-october/","excerpt":"","text":"前言不知不觉,离开校园将近四个月了,正式工作(摸🐟~)也差不多四个多月了,最近经历了很多事,头发也掉了不少😂 {微微害怕了}。之前一直有想法想补充一些带有生活气息的博文到自己的博客中,印象中 2021 年的 reviewed 有提到过,总觉得自己的博客少了点味儿(生活的味道),毕竟我也是个活脱脱的人啊,也是有 “感觉” 的。 趁着周末,来一篇。略微回顾了下这几个月,觉得最应该写的就是 10 月(屁事多😄),虽然说现在都 11 月了,但也不妨碍我写 10 月的事。 10 月的那些小确幸 国庆 答辩 或许注定的遇见 国庆七天emmm,说到 10 月,首当其冲的当然是国庆七天的假期了。这七天我有下面的一个小总结,2333: Day 1,游戏(FPS); Day 2,游戏(FPS); Day 3,游戏(SRPG); Day 4,现代文学小说《活着》 + 电影《活着》; Day 5,爬个山; Day 6,动物园 & 北京路 & 书店; Day 7,看了个电影,写篇文章; Day 8,上了个班儿。 游戏:我在 7 月份换了个配置还可以电脑,终于能打点像样点的游戏了,之前那小破电脑,我只能打个《细胞分裂:断罪》意思一下,哦,还有《星际争霸 2》也能勉强玩玩,当初看着室友玩新出的游戏,那叫一个羡慕啊(那时候我一般只好甩个门出去卷了)。10 月前,《Sniper Elite 4》狙击精英 4 正好打折,反手在 Steam 入手了我的第二款游戏(之前老白嫖党了,花点钱,意思下)。BTW,国庆前一个同事推荐过我耍下《Hearts of Iron》钢铁雄心,玩了下,真复杂,不适合我。被某《王者荣耀》影响,打习惯学习成本没么高的游戏了(这就是传说中的迫于生活?)。于是机智的我,巧妙的避开了国庆前三天的人海,决定不出去,打开两天的《狙击精英 4》,唉,真香! 第三天,反手打开了海豚模拟器(没办法,条件它不允许),玩起了 SRPG 游戏 -> 《火焰纹章:晓之女神》,火焰纹章系列游戏玩了很多年了,不知道我什么时候能嫖上 2019 年出的《火焰之纹章:风花雪月》/(ㄒoㄒ)/~~,Google 了一遍,没翻到镜像,太难了😭。每次玩这种略微带点年代感的游戏,都会回忆起小时候玩插卡带游戏的那种快乐。 oh,这个月我还通过某小程序耍了下当初小时候玩过的《热血格斗》,快乐就这么简单😎? 小说:第四天,我尝试着看了下余华的长篇小说《活着》,丰富下自己的精神世界。所幸它的篇幅也没有那么长(想起来,当初我那套周易也没看完,虽然一小本挺薄的😢,但小本本堆起来就很多了)。小说在用死亡去“象征”活着,尽管主人公的一生是那么的不幸,但他最后仍然是那么的乐观豁达。仔细想想,我觉得福贵还是挺幸运的,遇到了那么多对自己好的人。尽管我没有生长在那个年代,但我在这小说中从一个平凡人的视角(相比于之前的经常看的抗战电视剧)又看到了的当初那些年代的不容易。第四天稍微晚些的时候,我顺便看了下张艺谋执导的同名电影,电影稍微美化了下小说,但不得不说 94 年的电影这么棒,那箱贯穿整部电影的皮影箱,让我印象很深刻,电影的虽然没有拍完整部小说,但描绘得很到位了。也许多年后的我再看会有更多得体会🤔,下面是我看小说的时候喜欢得一段话: 爬山:第五天的爬山其实并没有列入我的规划中(想了想,我的国庆当初也没规划🤣),这可以说是说走就走了,出去呼吸下新鲜空气。这天相当的 relax,这广州的白云山还挺矮,不过快到山顶的那段路也不好走啊。我以为过完一遍山上的景点了,但是和某个人聊的时候,我发现我居然还有那么多的地点没去,后面再去次(囧.jpg)。 动物园 & 北京路 & 电影:这里要特别提一下,我都是一个人去的,2333,我骄傲(😎)。吐槽一下,动物园 & 北京路 也就这了,不过如此🤣,感觉每个城市都有。电影看的是最近很火的《长津湖》,人生的第一次一个人去看的电影,只能说我太勇了,之前看电影一直是和同学去的,一直害怕一个人去看(有种想法一直围绕着我的脑海:一个人去不太好吧?周围都是小情侣?被暴击)。被朋友疯狂 push,悟了,想看就看,关注那么多别人的看法干嘛(别人也未必关注你)。 书店:谈到阅读,我经历了从纸质书到电子书再到纸质书 & 电子书混合双打的变换。最近几个月去书店的频率有点高了,被语雀上 dalao 们丰富的精神世界刺激到了🤣,我对自己精神世界的探索又更加热切了,去书店攒点“气”。自己之前是很多喜欢到知乎还有微信公众号去看别人写的文章的,奈何还是没有能够很好的把自己的想法真实写出来。我又悟了🤣,是我没有料,料储备不够多,Maybe,一本完整的书相比于片段化的文章能让我有更深刻的感受!那么就微微提高了下看书的频率,做点突破。 答辩这个月还有一件重要的事,就是我的转正答辩。不得不说写 PPT 是个很痛苦的事情,但是为了给自己个交代,必须得写一个。准备答辩的过程我也慢慢对自己有了更加清楚的认知。 直至现在,我仍然能很清楚得感受到自己的变化。 最近认识的同事 & 朋友都跟我说过一句话(Social 还得是你啊!),实际上,Social?我并没有那么的 Social。我觉得我以前是那么一个孤僻的人,哪怕是对家人也是如此。我是那么的喜欢一个人呆着(呆着?或许可以称之为独处),不愿意于太多的人接触,能自己做的事绝不找别人,就算不能自己做,也会继续坚持找着法去做,就是不太愿意找别人帮忙。我感觉知乎上的一个话题对我这一类人的描述是很到位的 -> 为什么说内向的人精神内耗很严重呢?。有些时候,我会觉得我是那么的不自信。工作上的事,最初是比较厌恶沟通的,周围的同事还是不错的,但我还是不愿意去沟通,总觉得我自己能解决😢,但这效率相对于合作来说,就没那么的好了。 现在感觉好多了,我慢慢的踏出了那一步,主动和别人沟通稍微多了点。但还是有种类似于“厌恶”的心理存在,不想别人知道太多。好了,这里我也不想写太多,我期待自己的下一步变化🙂。 这里的话可能有点乱,稍(日)后再理一理。 遇见…… Life is not over.","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"使用 Kubeadm 搭建个公网 k8s 集群(单控制平面集群)","slug":"create-k8s-cluster","date":"2021-10-24T13:51:19.000Z","updated":"2021-10-24T13:51:19.000Z","comments":true,"path":"2021/10/24/create-k8s-cluster/","permalink":"https://yeshan333.github.io/2021/10/24/create-k8s-cluster/","excerpt":"前言YY:国庆的时候趁着阿里云和腾讯云的轻量级服务器做促销一不小心剁了个手😎😢,2 Cores,4G RAM 还是阔以的,既然买了,那不能不用呀🚩,之前一直想着搭建个 k8s 集群玩玩,本地开发机虽然起了个 k8s(拿 Docker Desktop 起的,不 dei 劲),但就一个 Node,不爽,对 k8s 的体验不到位😒,1024,是时候用起来了,折腾一下,顺便让最近浮躁的心冷静一下。 这次拿官方的 Kubeadm 耍一下,以阿里云的轻量级应用服务器为 Control 节点,腾讯云的轻量级应用服务器为 Worker 节点,说干就干。","text":"前言YY:国庆的时候趁着阿里云和腾讯云的轻量级服务器做促销一不小心剁了个手😎😢,2 Cores,4G RAM 还是阔以的,既然买了,那不能不用呀🚩,之前一直想着搭建个 k8s 集群玩玩,本地开发机虽然起了个 k8s(拿 Docker Desktop 起的,不 dei 劲),但就一个 Node,不爽,对 k8s 的体验不到位😒,1024,是时候用起来了,折腾一下,顺便让最近浮躁的心冷静一下。 这次拿官方的 Kubeadm 耍一下,以阿里云的轻量级应用服务器为 Control 节点,腾讯云的轻量级应用服务器为 Worker 节点,说干就干。 Check 一下文档要求 - 准备工作Kubenetes 官方文档给出了 Kubeadm 起 k8s 集群的几点要求,在这里微微检查下两台轻量级云服务器: A compatible Linux host. The Kubernetes project provides generic instructions for Linux distributions based on Debian and Red Hat, and those distributions without a package manager.[我们用的 Ubuntu 20.04,那肯定符合 Debian 系的]. 2 GB or more of RAM per machine (any less will leave little room for your apps).[4G, 我们很 OK, 但感觉后面会拉跨]. 2 CPUs or more. [正好一台 2个 CPU, nice]. Full network connectivity between all machines in the cluster (public or private network is fine).[两台轻量级应用服务器都有公网 IP,那必须互通啊]. Unique hostname, MAC address, and product_uuid for every node.[这里得微微 check 一下两台服务器,cat /sys/class/net/eth0/address 看下 MAC 地址,sudo cat /sys/class/dmi/id/product_uuid 看下 product_uuid, hostname 看下主机名,emmm, correct!] Certain ports are open on your machines. [这里得到阿里云轻量级服务器 & 腾讯云的轻量级应用服务器的防火墙开放下相关 TCP 端口]。 阿里云轻量级应用服务器开启 Control(控制平面)节点的 TCP 端口,这里要对照下文档给出的需要开放的端口: Control Plane Open PortsAliyun Control Node 腾讯云轻量级应用服务器开启 Worker(工作)节点的 TCP 端口: Worker Node Open PortsTencent Cloud Worker Node Swap disabled. You MUST disable swap in order for the kubelet to work properly. [为了让 kubelet 起来,要把 Swap 分区关闭,使用 free -mh 看下 Swap 是否在使用, swapoff -a 关闭 Swap 分区]. 参考:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ 为什么需要关闭 Swap 分区,有 dalao 做了分析:https://www.jianshu.com/p/6f3268ce642f Letting iptables see bridged traffic. 这里照着文档,一波操作下两台服务器: 12345678910111213sudo modprobe br_netfiltercat <<EOF | sudo tee /etc/modules-load.d/k8s.confbr_netfilterEOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOFsudo sysctl --systemlsmod | grep br_netfilter Container Runtime Interface(CRI). [这里需要安装下 Pod 运行需要的容器运行时,我们选择 Docker]. 1234567891011apt-get updateapt-get install -y apt-transport-https \\ software-properties-common \\ ca-certificates \\ curl \\ gnupg \\ lsb-releasecurl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"apt-get updateapt-get install -y docker-ce docker-ce-cli containerd.io 安装完毕还需要将 Docker 的 cgroup driver 替换为 systemd,确保与 Kubeneters 使用的一致。 12345678cat>>/etc/docker/daemon.json<<EOF{ "exec-opts": ["native.cgroupdriver=systemd"]}EOFsystemctl daemon-reloadsystemctl restart docker 安装 kubeadm, kubelet, kubectl上面检查工作如果很顺利的话,接下来就可以准备 kubeadm, kubelet, kubectl 安装了,不过我们还得给 apt 添加 Kubenetest 软件源,官方文档中使用的如软件源是 Google 域名下的,国内云服务器访问会有问题(懂得都懂了😂),这里使用国内得源,这里两台服务器都操作一下: 123456# 1、添加 GPG Keysudo curl -fsSL http://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -# 2、添加 k8s 软件源sudo add-apt-repository "deb http://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main"3、update 一下apt-get update 上面执行没有问题的话,就可以开始安装 kubelet kubeadm kubectl了: 1234567sudo apt-get install -y kubelet kubeadm kubectl# 查看安装的版本, apt install apt-show-versionsapt-show-versions kubectl kubelet kubeadm# 让 kubelet 开机启动sudo systemctl start kubeletsudo systemctl enable kubelet kubeadm: 引导启动 Kubernate 集群的命令行工具。 kubelet: 在群集中的所有计算机上运行的组件, 并用来执行如启动 Pods 和 Containers 等操作。 kubectl: 用于操作运行中的集群的命令行工具。 初始化集群为了能够让集群初始化更快,我们可以先预拉取集群初始化依赖的镜像,emmm,官方文档给出的又是 Google 的网址,这里我们基于 GitHub -> AliyunContainerService/k8s-for-docker-desktop 项目做镜像的快速拉取。确保相关镜像版本与 kubelet 保持一致(这里是 v1.22.2), kubeadm config images list --kubernetes-version v1.22.2 可查看需要哪些镜像。 12345678910111213141516git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git && cd k8s-for-docker-desktoprm -f images.properties# 调整镜像版本cat>>images.properties<<EOFk8s.gcr.io/pause:3.5=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5k8s.gcr.io/kube-controller-manager:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.22.2k8s.gcr.io/kube-scheduler:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.22.2k8s.gcr.io/kube-proxy:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.22.2k8s.gcr.io/kube-apiserver:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.22.2k8s.gcr.io/etcd:3.5.0-0=registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.0-0k8s.gcr.io/coredns/coredns:v1.8.4=registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.4quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1=registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.26.1EOF# 拉取镜像./load_images.sh 初始化控制平面节点(Control Plane Node(s))控制(Control)节点 {阿里云轻量级应用服务器} 的镜像预拉取完毕后,可执行如下命令进行初始化操作: 12345# api server IPv4 地址使用公网 IPkubeadm init \\ --pod-network-cidr=10.244.0.0/16 \\ --kubernetes-version v1.22.2 # --apiserver-advertise-address 120.79.73.159 为当前 root 用户生成 kubeconfig: 123mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config 安装 CNI(Container Network Interface) -> Flannel 1curl --insecure -sfL https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml | kubectl apply -f - 查看节点状况,emmm,Ready 没毛病 123root@iZwz92a65mqaa8zwy83dpnZ:~/k8s-for-docker-desktop# kubectl get nodesNAME STATUS ROLES AGE VERSIONizwz92a65mqaa8zwy8 Ready control-plane,master 4m6s v1.22.2 添加工作节点(Worker Node(s))接下来我们将 Worker 节点加入到集群中,由于我们在初始化控制平面所在的主节点时并没有指定公网 IP,所以这里先做个 IP 转发,让 Worker 节点能够和控制平面节点间进行通信。 1iptables -t nat -A OUTPUT -d <初始化控制平面节点得到的 IP> -j DNAT --to-destination <阿里云轻量级服务器公网 IP> 然后我们将 Worker 节点 join 进集群中: 1kubeadm join <初始化控制平面节点得到的 IP>:6443 --token 4zicbp.d1wertghxdgcgz6y --discovery-token-ca-cert-hash sha256:1912dbf415da652f97b9fa728cb85dd338e17b24ee338ec48b073c8fa8sdfgth 顺利的话😊,那么结果如下: worker join 然后到控制节点看下集群节点状态,顺利的话结果如下🤣: 1234root@iZwz92a65mqdpnZ:~/k8s-for-docker-desktop# kubectl get nodesNAME STATUS ROLES AGE VERSIONizwz92a65mqaa8zwy83dpnz Ready control-plane,master 48m v1.22.2vm-8-4-ubuntu Ready <none> 8m9s v1.22.2 参考 Installing kubeadm 使用 Kubeadm 部署 解决阿里云ECS下kubeadm部署k8s无法指定公网IP","categories":[{"name":"Kubernetes","slug":"Kubernetes","permalink":"https://yeshan333.github.io/categories/Kubernetes/"}],"tags":[{"name":"Kubernetes","slug":"Kubernetes","permalink":"https://yeshan333.github.io/tags/Kubernetes/"},{"name":"Kubeadm","slug":"Kubeadm","permalink":"https://yeshan333.github.io/tags/Kubeadm/"}]},{"title":"从平均负载开始,这进程是 CPU Bound 还是 IO Bound 的?","slug":"io-bound-cpu-bound-with-average-load","date":"2021-10-07T16:12:38.000Z","updated":"2021-10-07T16:12:38.000Z","comments":true,"path":"2021/10/07/io-bound-cpu-bound-with-average-load/","permalink":"https://yeshan333.github.io/2021/10/07/io-bound-cpu-bound-with-average-load/","excerpt":"","text":"在排查性能问题的时候,我们经常会使用 top 或者 uptime 两个 Linux 命令,top 命令和 uptime 命令都会给出最近机器 1 min,5 min,15 min 的平均负载情况,一般平均负载值(Average Load)接近甚至超出 CPU cores (现在一般指 processors 的个数, 现在 CPU 的一个 core 一般有两个 processor, 可以处理两个进程) 时,系统会有性能瓶颈. 平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程. 造成平均负载升高的原因一般有以下几种: 1、有 IO Bound 进程(即存在 IO 密集型任务) 2、有 CPU Bound 进程(即存在 CPU 密集型任务) 3、处于就绪状态(Ready)的进程多 ….. 本篇文章主要记录下造成平均负载升高的两个场景. IO 密集型场景和 CPU 密集型场景. 这里的实验环境在一个操作系统为 Ubuntu 20.04.3 LTS 的容器内, 通过 stress 进行 IO Bound 与 CPU Bound 场景的模拟, 宿主机有 16 个 processors, 8G 运行内存. 123456789101112131415docker run --rm -it ubuntu:latestroot@bfdbc798879c:/# cat /etc/os-releaseNAME="Ubuntu"VERSION="20.04.3 LTS (Focal Fossa)"ID=ubuntuID_LIKE=debianPRETTY_NAME="Ubuntu 20.04.3 LTS"VERSION_ID="20.04"HOME_URL="https://www.ubuntu.com/"SUPPORT_URL="https://help.ubuntu.com/"BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"VERSION_CODENAME=focalUBUNTU_CODENAME=focal 123456789101112131415161718192021222324252627282930root@bfdbc798879c:/# toptop - 11:21:53 up 3:10, 0 users, load average: 0.66, 0.79, 0.46Tasks: 2 total, 1 running, 1 sleeping, 0 stopped, 0 zombie%Cpu0 : 1.0 us, 0.6 sy, 0.0 ni, 93.3 id, 0.0 wa, 0.0 hi, 5.1 si, 0.0 st%Cpu1 : 10.2 us, 0.3 sy, 0.0 ni, 88.1 id, 0.0 wa, 0.0 hi, 1.3 si, 0.0 st%Cpu2 : 10.4 us, 2.7 sy, 0.0 ni, 87.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu4 : 11.1 us, 0.7 sy, 0.0 ni, 88.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu5 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu6 : 0.7 us, 1.3 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu7 : 3.0 us, 0.0 sy, 0.0 ni, 97.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu8 : 0.3 us, 1.0 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu9 : 0.7 us, 0.0 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu10 : 0.0 us, 0.0 sy, 0.0 ni, 99.7 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu11 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu12 : 0.3 us, 0.3 sy, 0.0 ni, 99.0 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu13 : 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu14 : 10.7 us, 0.7 sy, 0.0 ni, 88.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu15 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stMiB Mem : 7829.4 total, 1913.4 free, 1582.2 used, 4333.7 buff/cacheMiB Swap: 2048.0 total, 2047.7 free, 0.3 used. 5582.8 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 4232 3504 2952 S 0.0 0.0 0:00.02 bash 12 root 20 0 6092 3332 2828 R 0.0 0.0 0:00.08 toproot@bfdbc798879c:/# free -mh total used free shared buff/cache availableMem: 7.6Gi 1.6Gi 1.8Gi 410Mi 4.3Gi 5.4GiSwap: 2.0Gi 0.0Ki 2.0Gi 让我们先安装一下 stress 压力测试工具和系统观测要用到的工具. 12apt-get updateapt-get install -y stress sysstat CPU Bound 场景这里我们让三个逻辑 CPU 满载: 12# 持续 10 min, 3 CPU 满载stress -c 3 -t 600 我们用 watch 命令持续观察平均负载情况, 平均负载在逐渐变高,此时我的电脑 CPU 风扇也很响了😂 1watch -d uptime 我们在使用 top 命令可以看到有三个 CPU 已经满载了,使用率百分百,还可以看到是哪个 COMMMAND 造成的, 但是上面不能很清楚的看到 IO 的情况,接下来我们用 mpstat 每隔 5 秒将所有 CPU 的观测情况打出来: 1mpstat -P ALL 5 可以很清楚的看到,的确有三个 CPU 的空闲状态为 0(满载),使用率百分百,且 IO Wait 等待时间是很低的,所以单单 CPU Bound 场景可造成 Average Load 的升高. 不使用 top 命令,使用 pidstat 每隔 5 秒, 三次打印进程的 CPU 情况可定位出是哪个进程造成的平均负载升高. 1234567root@bfdbc798879c:/# pidstat -u 5 3Linux 5.4.72-microsoft-standard-WSL2 (bfdbc798879c) 10/07/21 _x86_64_ (16 CPU)12:01:29 UID PID %usr %system %guest %wait %CPU CPU Command12:01:34 0 571 100.00 0.00 0.00 0.00 100.00 9 stress12:01:34 0 572 100.00 0.00 0.00 0.00 100.00 15 stress12:01:34 0 573 100.00 0.00 0.00 0.00 100.00 11 stress IO Bound 场景stress 压力工具也可以方便的进行 IO Bound 场景的模拟, 开始之前将上面 CPU Bound 场景给终止, 同样地, 我们先开好一个 Terminal 观察平均负载的变化: 1watch -d uptime 使用 strees 调起 50 个进程(这里要高于 CPU processors 的数量, 让进程争夺 CPU), 不断打 IO, 持续 10 min: 12root@bfdbc798879c:/# stress -i 50 -t 600stress: info: [1756] dispatching hogs: 0 cpu, 50 io, 0 vm, 0 hdd 可以观察到, 平均负载在不断升高, 再使用 mpstat 可以观测到 IO Wait 很高. 1mpstat -P ALL 5 可以 GET 到 IO Bound 任务的确会造成平均负载升高, 结合 iostat, 我们还可以观测磁盘设备的读写性能情况: 1iostat -d -x","categories":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/categories/Linux/"},{"name":"性能优化","slug":"Linux/性能优化","permalink":"https://yeshan333.github.io/categories/Linux/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/tags/Linux/"},{"name":"压力测试","slug":"压力测试","permalink":"https://yeshan333.github.io/tags/%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95/"},{"name":"CPU Bound","slug":"CPU-Bound","permalink":"https://yeshan333.github.io/tags/CPU-Bound/"},{"name":"IO Bound","slug":"IO-Bound","permalink":"https://yeshan333.github.io/tags/IO-Bound/"}]},{"title":"常用的 Linux 网络相关的命令","slug":"common-use-linux-network-command","date":"2021-09-25T16:34:52.000Z","updated":"2021-09-25T16:34:52.000Z","comments":true,"path":"2021/09/25/common-use-linux-network-command/","permalink":"https://yeshan333.github.io/2021/09/25/common-use-linux-network-command/","excerpt":"水文警告⚠😂,最近这些玩意用得多,微微记录一下,目前写的比较水,后面应该会补点实践经验🚩。","text":"水文警告⚠😂,最近这些玩意用得多,微微记录一下,目前写的比较水,后面应该会补点实践经验🚩。 netstatnetstat 一般用于查看 Socket 的使用情况。这命令在 Windows 下也可直接使用(但参数有一定的差异)。如使用 Ubuntu 需要安装 net-tools 12# ubuntu$ apt install net-tools 常用命令: 123456789101112131415161718# 1、查看 TCP Socket 情况,TCP 连接的状态$ netstat -atActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 0 172.25.239.216:51430 aerodent.canonical:http TIME_WAIT# 2、查看 TCP Socket 统计信息$ netstat -stTcp: 3 active connection openings 0 passive connection openings 0 failed connection attempts 0 connection resets received 0 connections established 248 segments received 195 segments sent out 5 segments retransmitted 0 bad segments received 0 resets sent 实践:在性能测试场景,我们可能需要观察 TCP 连接的状态、连接数等,我们可能会需要如下命令配合 grep 等命令对数据库连接、Web Service 连接状态问题进行排查: 1netstat -alnp ssss 的作用跟 netstat 很相似,但当服务器连接数非常多的时候,执行速度比 netstat 快很多,如果 man netstat 一下,netstat 的手册中也推荐使用 ss。 1234$ man netstatNOTES This program is mostly obsolete. Replacement for netstat is ss. Replacement for netstat -r is ip route. Replacement for netstat -i is ip -s link. Replacement for netstat -g is ip maddr. 常用命令: 12345678# 1、显示 TCP Socket 使用状况$ ss -t -aState Recv-Q Send-Q Local Address:Port Peer Address:PortESTABLISH 0 0 172.16.0.12:46148 13.229.188.59:https...# 2、列出所有打开的端口,配合 grep,可查看指定端口使用情况$ ss -pl | grep 8080 dig域名查询工具,一般用于查看主机 DNS 轮询解析状况。一般 Linux 系统都会自带这个命令。 12# 安装$ apt-get install dnsutils 常用: 1234567891011121314151617181920212223242526272829303132# 1、指定 DNS Server 查看域名 DNS 解析情况$ dig @8.8.8.8 shansan.top; <<>> DiG 9.16.1-Ubuntu <<>> @8.8.8.8 shansan.top; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44094;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 512;; QUESTION SECTION:;shansan.top. IN A;; ANSWER SECTION:shansan.top. 600 IN CNAME yeshan333.github.io.yeshan333.github.io. 3600 IN A 185.199.108.153yeshan333.github.io. 3600 IN A 185.199.109.153yeshan333.github.io. 3600 IN A 185.199.110.153yeshan333.github.io. 3600 IN A 185.199.111.153;; Query time: 160 msec;; SERVER: 8.8.8.8#53(8.8.8.8);; WHEN: Sat Sep 25 21:00:48 CST 2021;; MSG SIZE rcvd: 137# 2、查看指定 DNS 类型记录,如 CNAME$ dig shansan.top CNAME# 3、反向解析 IP 地址对应域名$ dig -x 8.8.8.8 +short nslookupnslookup 命令的作用和 dig 命令类似,在 Windows 下的 PowerShell & Linux 可以直接使用。 常用: 1234567# 1、指定 DNS Server 查询域名解析信息➜ nslookup shan333.cn f1g1ns1.dnspod.netServer: f1g1ns1.dnspod.netAddress: 61.151.180.44#53Name: shan333.cnAddress: 111.230.58.139 telnettelnet 可用于判断 TCP 端口是否可通。 12345➜ telnet github.com 22Trying 20.205.243.166...Connected to github.com.Escape character is '^]'.SSH-2.0-babeld-4f04c79d 与 telnet 作用差不多的有 netcat、nc。","categories":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/categories/Linux/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/tags/Linux/"}]},{"title":"基于 Docker 搭建一个最小化的 Prometheus Federation「联邦」集群","slug":"prometheus-federation","date":"2021-08-28T17:25:18.000Z","updated":"2021-08-28T17:25:18.000Z","comments":true,"path":"2021/08/28/prometheus-federation/","permalink":"https://yeshan333.github.io/2021/08/28/prometheus-federation/","excerpt":"一不小心就八月末了,我敲,最近大部分的时间都在了解 Prometheus,一直想“搂”篇文章出来,奈何一直在墨迹,是时候了,不然就九月了,完不成博客的 Flag 了,233333。 前言本篇文章主要介绍了 Promethues Federation 集群化机制 & 基于 Docker 搭建一个最小化的 Prometheus Federation 集群娱乐环境的相关操作。不是 Step By Step 的。","text":"一不小心就八月末了,我敲,最近大部分的时间都在了解 Prometheus,一直想“搂”篇文章出来,奈何一直在墨迹,是时候了,不然就九月了,完不成博客的 Flag 了,233333。 前言本篇文章主要介绍了 Promethues Federation 集群化机制 & 基于 Docker 搭建一个最小化的 Prometheus Federation 集群娱乐环境的相关操作。不是 Step By Step 的。 Prometheus先回顾一下 Prometheus 的各个生态组件,了解下它们各自承担的责任是是什么。基于下面一张来自 Prometheus 官方文档的架构 & 生态组件图做下简介: Prometheus targets(Jobs/exporters):提供监控 Metrics 的数据源,Prometheus 是基于拉(Pull-Based)模型的监控系统; Pushgateway:Metrics 推送网关,Prometheus 拉取 Metrics 是有时间间隔的,有时候一些短时任务(Short-lived jobs)没有等到 Prometheus 过来拉取其 Metrics 就没了,所以提供了一个这样的组件让 Jobs 主动推送 Metrics 到作为中介的 Pushgateway 组件; Prometheus Server:核心组件 Retrieval:Prometheus 的通过 yaml 配置文件进行配置的,可以配置 Prometheus 拉取 Metrics 的时间间隔,告警规则计算配置,爬取数据源配置等能力; TSDB:Prometheus 内置的本地存储时间序列数据库,该数据库经历了从原型到 V1 到现在 V2 版本的演进,做了许多的优化,想了解更多细节可以看看这篇文章 The Evolution of Prometheus Storage Layer;Exporters 是基于文本格式进行 Metrics 的暴露的, V2 版本Prometheus 放弃了原有的 Protocol Buffers 序列化协议,实现了 Text Decoder,优化了性能,官方对此更多的考虑可以看看这篇文档: protobuf_vs_text; HTTP Server:提供了与 TSDB 和 Prometheus 交互的 HTTP API,方便在更多的场景下做一些自定义操作; Service discovery:服务发现机制,Prometheus 内置了基于文本文件、DNS Server和 Consul 的服务发现机制(都可以在配置文件进行配置),规模化监控场景下,方便发现 Prometheus 的爬取对象进行 Metrics 拉取; Alertmanager:告警通知组件,提供了告警分组,告警抑制(Inhibit),告警静默(Silence),邮件通知,WebHook 等机制;值得注意的是 Prometheus Server 提供了告警规则的计算能力,但是通知并不由它完成,而是由 Alertmanager 完成。告警通知是个重活,并不简单。文章搞搞 Prometheus: Alertmanager 对 Alertmanager 进行了深层次的分析,可以微微看下; PromQL:Prometheus 提供的一个 DSL,同于用于时序数据的查询与聚合运算等操作,告警规则(Alerting Rules & Recording Rules)的计算也用到了 PromQL; Prometheus Web UI:Prometheus 自带的一个 Web UI,提供了许多的数据可视化能力,但其对可视化图表的支持有限,所以社区出现了 Grafana 可视化工具,其提供的 Dashboard 管理能力是很强大的,但仍然有缺点,比如这篇文章就说了一点 如何使 Grafana as code。 Federation 机制Pormetheus Federation(联邦)机制是 Promehteus 本身提供的一种集群化的扩展能力。当我们要监控的服务很多的时候,我们会部署很多的 Prometheus 节点分别 Pull 这些服务暴露的 Metrics,Federation 机制可以讲这些分别部署的 Prometheus 节点所获得的指标聚合起来,存放在一个中心点的 Prometheus。如下图: 在 Prometheus 的配置配置文件,调整如下字段即可使用 Federation 机制: 123456789101112131415161718192021scrape_configs: - job_name: 'federate' scrape_interval: 10s honor_labels: true metrics_path: '/federate' # 通过 match 参数,配置要拉取的 Metrics, # 不要 Pull full metrics params: 'match[]': - '{job="prometheus"}' - '{job="node"}' - '{job="blackbox"}' static_configs: # 其他 Prometheus 节点 - targets: - 'prometheus-follower-1:9090' - 'prometheus-follower-2:9090' 关于 Federation 联邦集群更多的讨论可以看看:别再乱用prometheus联邦了,分享一个multi_remote_read的方案来实现prometheus高可用 基于服务功能分区,我们可以通过 Federation 集群的特性在任务级别对 Prometheus 采集任务进行划分,以支持规模的扩展。 基于 Docker 搭建最小化的 Federation 集群上文微微 Recap 了一下 Prometheus「普罗米修斯」相关知识,现在回到最小化 Federation 的搭建,本次要搭建的一个最小化 Federation 集群(Architecture)如下图: 可以看到,这里我们使用了两个 Prometheus Follower Container 分别对 Node Exporter 和 Black Exporter 暴露的主机状态相关的 Metrics 和 网络状况相关的 Metrics 进行拉(Pull)取,然后通过一个中心的 Prometheus Leader 对上述指标进行聚合。我们还分别给 Leader 和 一个 Follower 部署了可视化面板 Grafana 用于查看 Metrics。Alertmanager 也通过容器化的方式启动。 告警的通知基于 WebHook,这里使用到了钉钉群机器人,配置了主机内存 & CPU 使用情况的告警,规则如下: 12345678910111213141516171819202122232425262728293031groups:- name: targets rules: - alert: monitor_service_down expr: up == 0 for: 30s labels: severity: critical annotations: summary: "Monitor service non-operational" description: "Service {{ $labels.instance }} is down."- name: host rules: - alert: high_cpu_load expr: node_load1 > 1.5 for: 30s labels: severity: warning annotations: summary: "Server under high load" description: "Docker host is under high load, the avg load 1m is at {{ $value}}. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}." - alert: high_memory_load expr: (sum(node_memory_MemTotal_bytes) - sum(node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) ) / sum(node_memory_MemTotal_bytes) * 100 > 45 for: 30s labels: severity: warning annotations: summary: "Server memory is almost full" description: "Docker host memory usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}." 我们通过 Docker Volume 挂载的方式讲 Prometheus 的配置文件和告警规则文件挂载到对应的识别路径;Grafana 的 Dashboard 与登陆相关的配置我们也基于此方式。Prometheus 的更多配置可参考 prometheus configuration:;Grafana 更多的配置参数可以参考:Grafana Provisioning。 Federation 集群的通信我们创建了一个 Docker Network「monitoring_network」。我们使用 Docker—Compose 进行容器的编排,编排文件内容如下: docker-compose.yml 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146version: '3.5'networks: monitoring_network:volumes: prometheus_leader_data: {} prometheus_follower_1_data: {} prometheus_follower_2_data: {} grafana_leader_data: {} grafana_follower_data: {}services: prometheus-leader: container_name: prometheus-leader image: prom/prometheus networks: - monitoring_network volumes: - ./configs/prometheus-leader/prometheus.yml:/etc/prometheus/prometheus.yml - ./configs/prometheus-leader/alerts/alert.rules:/etc/prometheus/alert.rules - prometheus_leader_data:/prometheus ports: - "9090:9090" command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' restart: unless-stopped prometheus-follower-1: container_name: prometheus-follower-1 image: prom/prometheus networks: - monitoring_network volumes: - ./configs/prometheus-follower-1/prometheus.yml:/etc/prometheus/prometheus.yml - ./configs/prometheus-follower-1/records/node_exporter_recording.rules:/etc/prometheus/node_exporter_recording.rules - ./configs/prometheus-follower-1/alerts/node_exporter_alert.rules:/etc/prometheus/node_exporter_alert.rules - prometheus_follower_1_data:/prometheus ports: - "9099:9090" command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' restart: unless-stopped prometheus-follower-2: container_name: prometheus-follower-2 image: prom/prometheus networks: - monitoring_network volumes: - ./configs/prometheus-follower-2/prometheus.yml:/etc/prometheus/prometheus.yml # - ./configs/prometheus-follower-2/records/node_exporter_recording.rules:/etc/prometheus/node_exporter_recording.rules # - ./configs/prometheus-follower-2/alerts/node_exporter_alert.rules:/etc/prometheus/node_exporter_alert.rules - prometheus_follower_2_data:/prometheus ports: - "9098:9090" command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' restart: unless-stopped grafana_leader: container_name: grafana_leader image: grafana/grafana networks: - monitoring_network volumes: - ./configs/grafana-leader/provisioning/dashboards:/etc/grafana/provisioning/dashboards - ./configs/grafana-leader/provisioning/datasources/config.yml:/etc/grafana/provisioning/datasources/config.yml - grafana_leader_data:/etc/grafana environment: - TERM=linux - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin123456 ports: - "3000:3000" restart: unless-stopped grafana_follower: container_name: grafana_follower image: grafana/grafana networks: - monitoring_network volumes: - ./configs/grafana-follower/provisioning/dashboards:/etc/grafana/provisioning/dashboards - ./configs/grafana-follower/provisioning/datasources/config.yml:/etc/grafana/provisioning/datasources/config.yml - grafana_follower_data:/etc/grafana environment: - TERM=linux - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin123456 ports: - "3001:3000" restart: unless-stopped node_exporter: image: quay.io/prometheus/node-exporter:latest container_name: node_exporter_stats networks: - monitoring_network ports: - "9100:9100" expose: - "9100" restart: unless-stopped blackbox_exporter: image: prom/blackbox-exporter container_name: blackbox_exporter networks: - monitoring_network ports: - "9115:9115" restart: unless-stopped alertmanager: image: prom/alertmanager container_name: alertmanager networks: - monitoring_network volumes: - ./configs/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml ports: - "9093:9093" restart: unless-stopped dingtalk-robot: image: timonwong/prometheus-webhook-dingtalk container_name: dingtalk-robot networks: - monitoring_network ports: - "8060:8060" volumes: - ./configs/dingtalk/config.yml:/etc/prometheus-webhook-dingtalk/config.yml restart: unless-stopped dingtalk 通知的配置参考了这篇文章:将钉钉接入 Prometheus AlertManager WebHook。 已经相关的配置文件和容器编排文件上传到了 GitHub,更多的配置细节可以到 GitHub 的项目仓库 yeshan333/prometheus-federation-minimal-demo 查看,也可将该项目 clone 到本地,跑一下看看: 1、git clone; 12git clone https://github.com/yeshan333/prometheus-federation-minimal-democd prometheus-federation-minimal-demo 2、更换钉钉机器人的 WebHook 地址,机器人配置的 Webhook 地址在 configs/dingtalk/config.yml 文件; 1vim configs/dingtalk/config.yml 123targets: webhook1: url: https://oapi.dingtalk.com/robot/send?access_token=<dingtalk-robaot-access-token> 3、通过 docker-compose 启动联邦集群,你可能需要安装 Docker & docker-compose,可参考:Get Docker; 1docker-compose up -d 4、期待的容器运行状况如下: 1234567891011$ docker-compose psNAME COMMAND SERVICE STATUS PORTSalertmanager "/bin/alertmanager -…" alertmanager running 0.0.0.0:9093->9093/tcp, :::9093->9093/tcpblackbox_exporter "/bin/blackbox_expor…" blackbox_exporter running 0.0.0.0:9115->9115/tcp, :::9115->9115/tcpdingtalk-robot "/bin/prometheus-web…" dingtalk-robot running 0.0.0.0:8060->8060/tcp, :::8060->8060/tcpgrafana_follower "/run.sh" grafana_follower running 0.0.0.0:3001->3000/tcp, :::3001->3000/tcpgrafana_leader "/run.sh" grafana_leader running 0.0.0.0:3000->3000/tcp, :::3000->3000/tcpnode_exporter_stats "/bin/node_exporter" node_exporter running 0.0.0.0:9100->9100/tcp, :::9100->9100/tcpprometheus-follower-1 "/bin/prometheus --c…" prometheus-follower-1 running 0.0.0.0:9099->9090/tcp, :::9099->9090/tcpprometheus-follower-2 "/bin/prometheus --c…" prometheus-follower-2 running 0.0.0.0:9098->9090/tcp, :::9098->9090/tcpprometheus-leader "/bin/prometheus --c…" prometheus-leader running 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp 5、查看 Grafana Leader:http://localhost:3000,Alertmanager UI:http://localhost:9093 End.","categories":[{"name":"Monitoring","slug":"Monitoring","permalink":"https://yeshan333.github.io/categories/Monitoring/"}],"tags":[{"name":"Prometheus","slug":"Prometheus","permalink":"https://yeshan333.github.io/tags/Prometheus/"},{"name":"Grafana","slug":"Grafana","permalink":"https://yeshan333.github.io/tags/Grafana/"},{"name":"Federation","slug":"Federation","permalink":"https://yeshan333.github.io/tags/Federation/"},{"name":"Docker","slug":"Docker","permalink":"https://yeshan333.github.io/tags/Docker/"},{"name":"Monitoring","slug":"Monitoring","permalink":"https://yeshan333.github.io/tags/Monitoring/"}]},{"title":"对下载软件/文件进行校验的工具(Checksum and GPG)","slug":"checksum-gpg-tools","date":"2021-07-10T18:23:57.000Z","updated":"2021-07-10T18:23:57.000Z","comments":true,"path":"2021/07/10/checksum-gpg-tools/","permalink":"https://yeshan333.github.io/2021/07/10/checksum-gpg-tools/","excerpt":"前言之前装软件一直都没有验证安装文件的习惯,信息安全意识不高,碰巧最近没啥事,微微写篇文章记录下校验工具(互联网http、https、ftp 服务并没有那么安全,是可以被劫持篡改。老装软件选手了,是该养成个校验文件的习惯了)。 在互联网下载软件/文件的时候经常会看到官方提供了一段⌈校验和(checksum)⌋或包含校验和的文件供校验。常见的校验和有 md5、SHA 家族等。还有部分软件/文件会提供 GPG 校验文件(signature file, SIG)给下载者进行校验。 来看看这两种校验方式相关的工具。","text":"前言之前装软件一直都没有验证安装文件的习惯,信息安全意识不高,碰巧最近没啥事,微微写篇文章记录下校验工具(互联网http、https、ftp 服务并没有那么安全,是可以被劫持篡改。老装软件选手了,是该养成个校验文件的习惯了)。 在互联网下载软件/文件的时候经常会看到官方提供了一段⌈校验和(checksum)⌋或包含校验和的文件供校验。常见的校验和有 md5、SHA 家族等。还有部分软件/文件会提供 GPG 校验文件(signature file, SIG)给下载者进行校验。 来看看这两种校验方式相关的工具。 校验和校验工具 校验和(英语:Checksum)是冗余校验的一种形式。 它是通过错误检测方法,对经过空间(如通信)或时间(如计算机存储)所传送数据的完整性进行检查的一种简单方法。 -来自维基百科 Windows CertUtilCertUtil 是 Windows 自带的文件校验和计算程序,我们可以通过它计算下载的软件/文件的 checksum 与官方提供的 checksum 作对比。 在 PowerShell 或 CMD 中可以执行 CertUtil -? 命令查看 CertUtil 支持的参数。CertUtil 的计算文件校验和命令的一般形式为 1CertUtil -hashfile <path to file> <hash algorithm> CertUtil 支持的校验和计算的哈希算法有 MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512 等。 1234567891011121314151617Usage: CertUtil [Options] -hashfile InFile [HashAlgorithm] Generate and display cryptographic hash over a fileOptions: -Unicode -- Write redirected output in Unicode -gmt -- Display times as GMT -seconds -- Display times with seconds and milliseconds -v -- Verbose operation -privatekey -- Display password and private key data -pin PIN -- Smart Card PIN -sid WELL_KNOWN_SID_TYPE -- Numeric SID 22 -- Local System 23 -- Local Service 24 -- Network ServiceHash algorithms: MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512 让我们看个例子,就装个 Go 吧(嘿嘿,最近在装系统,什么软件都没了),直接官方(https://golang.org/dl/)下载 Go 的安装程序,下载页面给出了 SHA256 Checksum。 Go 下载页 使用 Certutil 计算 go1.16.5.windows-amd64.msi 安装程序的校验和。 1CertUtil -hashfile go1.16.5.windows-amd64.msi SHA256 CertUtil 计算结果 CertUtil 计算结果(322dd8c585f37b62c9e603c84747b97a7a65b56fcef56b64e3021ccad90785b2)和下载页提供的校验和(322dd8c585f37b62c9e603c84747b97a7a65b56fcef56b64e3021ccad90785b2)比对,emmm,没毛病,微微放心安装了。 文档:microsoft windows-commands certutil Linux md5summd5sum 是大多数 Linux 系统都预装的校验 128 位 MD5 哈希值,用于检查文件完整性的校验和工具。 命令的一般形式如下,使用 md5sum --help 查看更多操作: 1md5sum <file-path or files-path> 输出格式一般示例如下(校验和 + 文件名) md5sum 计算校验和 部分软件下载时会拿到一个类似如下内容格式的 checksum 文件,姑且命名为 demo_hash.md5 12f4e81ade7d6f9fb342541152d08e7a97 .profile0f077c02d1303b89b9c5cb92e5d7d112 .bashrc 那么使用 md5sum 进行校验时可以这么操作,md5sum 会自动根据 demo_hash.md5 里面的文件逐个检查 md5: 123$ md5sum -c demo_hash.md5 # 加个 `-c` 参数.profile: OK.bashrc: OK 文档:md5sum-invocation GPG key 校验工具 GPG(GnuPG)是一个实现了 OpenPGP 标准的用于数据加密和数字签名的工具。 互联网上存在着部分软件/文件通过 GPG 密钥进行签名来证明其来源。GitHub 也有着一种使用 GPG 密钥来检验 Git Commit 来源可靠性的手段,如果可靠,会在前端页面 commit log 历史那里显示一个如下的小绿标: GitHub commit signature btw,之前微微写过一篇文章 -> 给 GitHub commit 加个小绿标。 使用 GPG key 进行软件/文件校验的一般步骤如下: step 1:获取软件/文件作者的公钥(public key),导入到 GPG key 管理器; step 2:根据作者的 gpg key 指纹(fingerprint)验证公钥(public key)的可靠性; step 3:根据软件/文件的签名文件(signature file,SIG)校验来源是否可靠。 Gpg4winGpg4win 是官方的 Windows GnuPG 发行版,全家桶软件,官网为 gpg4win.org。通过自带的 GUI 客户端 Kleopatra,我们可以很方便的完成文件的校验。直接官网下载安装即可 -> Download Page。 Kleopatra 这里我们以 Windows 下 Python 3.9.6 的安装为例,看下使用 Kleopatra 进行校验的过程是怎么样的 ⌈以下操作下载的文件均在同一个目录下⌋。 先到官方下载页release/python-396下载 Windows Python 3.9.6 的安装文件和对应的 GPG 密钥签名文件(sig): 安装文件和签名文件下载 12curl -sSlO https://www.python.org/ftp/python/3.9.6/python-3.9.6-amd64.execurl -O https://www.python.org/ftp/python/3.9.6/python-3.9.6-amd64.exe.asc 现在开始对着之前所的校验步骤操作一下。 Step 1:获取软件/文件作者的公钥(public key),导入到 GPG key 管理器; 从 https://www.python.org/downloads/ 页面大概四分之三的地方,我们可以看到之前下载的 Windows Banaries 的 release manager 是 Steve Dower,我们根据官网提供的链接获取公钥。 获取 Steve Dower 公钥keybase 上的公钥 下载公钥。 1curl -O https://keybase.io/stevedower/pgp_keys.asc 使用 Kleopatra 导入下载好的公钥 pgp_keys.asc。 导入公钥 Step 2:根据作者的 gpg key 指纹(fingerprint)验证公钥(public key)的可靠性; 验证指纹 导入的公钥指纹与提供的指纹一致,一般就无问题了。 Step 3:根据软件/文件的签名文件(signature file,SIG)校验来源是否可靠。 使用之前下载好的 signature file(python-3.9.6-amd64.exe.asc)进行校验,如下: SIG 校验 emmm,没问题。Good job! GnuPG(GPG)GnuPG 是之前提到的 Gpg4win 的后端,适合命令行选手。大部分 Linux 系统自带。下面我们在 WSL(Ubuntu-20.04)感受下。 这里我们以对 GnuPG(LTS) Tarball 的下载校验为例子。 123456mkdir gnupg_tarballcd gnupg_tarball# 下载 GnuPG(LTS) tarballcurl -O https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.2.29.tar.bz2# 下载校验文件curl -O https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.2.29.tar.bz2.sig Step 1:保存公钥,导入公钥。在 https://www.gnupg.org/signature_key.html 拿到作者的 signature key,保存到 gnupg-2.2.29.asc。 保存公钥 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667➜ cat>gnupg-2.2.29.asc<<EOF> -----BEGIN PGP PUBLIC KEY BLOCK----->> mQENBE0ti4EBCACqGtKlX9jI/enhlBdy2cyQP6Q7JoyxtaG6/ckAKWHYrqFTQk3I> Ue8TuDrGT742XFncG9PoMBfJDUNltIPgKFn8E9tYQqAOlpSA25bOb30cA2ADkrjg> jvDAH8cZ+fkIayWtObTxwqLfPivjFxEM//IdShFFVQj+QHmXYBJggWyEIil8Bje7> KRw6B5ucs4qSzp5VH4CqDr9PDnLD8lBGHk0x8jpwh4V/yEODJKATY0Vj00793L8u> qA35ZiyczUvvJSLYvf7STO943GswkxdAfqxXbYifiK2gjE/7SAmB+2jFxsonUDOB> 1BAY5s3FKqrkaxZr3BBjeuGGoCuiSX/cXRIhABEBAAG0Fldlcm5lciBLb2NoIChk> aXN0IHNpZymJAVUEEwEIAD8CGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAFiEE> 2GkhI8QGXepeDzq1JJs50k8l47YFAl4MxBkFCRShVzYACgkQJJs50k8l47YImQf9> HaqHWor+aSmaEwQnaAN0zRa4kPbAWya182aJtsFzLZJf6BbS0aoiMhwtREN/DMvB> jzxARKep/cELaM+mc7oDK4mEwqSX/u6BE8D7FaNA9sut8P+4xjpoLPU+UzILMg29> t1remjyT9rs6sbu8BqufIxueArkjoi4WCOSRiVTdw+YDd88volPkXlPfS8hg9Rct> wZ8kEEDywa+NrxiLx+kDgDNTNdk3PJdfcnesf8S1a+KLUTNRds5+xGTYz0JSQ9BZ> 7Q9r4VQ/NL55muQZi5W7lVxdp3HxQFUNjHzzBfGtkpS4xqZpJvNjW50Wh5Vi5RYZ> LZ3M1EuIHXHmRiY4dmqqcpkBDQRUUDsjAQgA5hBwN9F3OqKf+9mXCXUDK4lb5wMj> dti96xG04gAn7wWo7On6c5ntriZQuRdR5GHcdw73XC6CFehHeo/eSVYiWqBNBAfE> 9UzbkES+cY+4wDzqVacqhKxd70XmHQgyK7ppRG/MwkL1UyArCGGAKN6MV/2fzO6I> GQw3jntRue3/2PGGnGaisNAKlvttHWZ91uy4KY5fBM19uQCgZdx4v8/rP0+yQqsW> TwJUKvymx5GIfNaCJvgF+v+aPrwspxBMf9jpHXqDXnh4Lo8C/GsQMD6GClVfQjsv> vzUHKH2eoL4oNfku+Ua5BuAHYi+uAuzqV9TdpF9PCpQMyPfuuZclMPLdMwARAQAB> tDJOSUlCRSBZdXRha2EgKEdudVBHIFJlbGVhc2UgS2V5KSA8Z25paWJlQGZzaWou> b3JnPokBPAQTAQgAJgIbAwULBwgJAwQVCAkKBRYCAwEAAh4BAheABQJYDxRZBQkL> S5A2AAoJECBxsIozvT8GvG8IAMBIlGz9voYcSSXAdQOuvz2gM2kOjvMHzN6VlS9V> P06IjnTz2DnejFZwLmxJw8e8mZjUo0jw22uo1HREQhDrne3S1IazPMeTUCUNzpWF> MxXNc6SAyrw9apWa8gouGUWJv3HOwVs8EFA2E9UdtDJ2uG7MY/+eC5K/aeOAyudZ> EbvS8rgZypTFrBtBcNKUWZhz7FRn63HxEmYLE3p6I19ZDXrc1WTazF2oz18zym6c> uURr6waRbdSemUTshpLnKCBZXzJ82bXBgXNnfdmc3gtS24ZmM3ZfK/rYztEDkiTk> s2R1gwDwf5RtDpaf5LD2ufESdbLuT+8blAlscbgYLBcwDquZAY0EWMu6rgEMAKcz> vM1IhpUwBpxPCNdrlMZh7XeLqKUd7hUvQ1KHOuDONxCDnfXdxGCKKI0Ds5I7Kkyp> Wzvcl7PplRy2fYZWwcGtL+Kj01y4L2lXB/xrrVaVwRr4S0FrcbseUGYRafBpR0C1> Yo24CL1ef4ivsfbER2SyaZ3lrT9Ccv6xfvTluhU8X+2li1ssak/Frvy02u3EORLD> LxaaLQgANgsjnIjv/JQZ4l3xFIJT98tEoL18btg5lGrS2w4yFU1aa1SNsbp7vcu7> wsqcJmCzX98LyG8/IBGJ5JXmZ03yzWhZ3uhhy1+Avi4GV4Mi0ADwaGMp6O63Mc3w> SL8A/DoCKJLISOc+D5xNfw6C8sYlaOSzQfqY9l4HW/+QbJmEFL2+bnjSHb8yaVU3> ae2IIrlNkZ5Jamp12Kq6x9Vei0xGk3gd4sqhmHhECdxoJtkX9L5gt436QxdjiTcW> q3V+NNfq94UJu2Ej2kN0fNT0t9RU2n0P/mS0L+1gw5Ex6BX7BIzGL0bZhYomQwAR> AQABiQHOBB8BCAA4FiEEW4DFdUKY8MtV2O1qvO9+KUsJLigFAljLwN0XDIABlKXJco7CV2> oDwv5co7CV2OH99yPPRitrECBwAACgkQvO9+KUsJLig2Cgv/T4rXEjHwlbsuTkzp> tgK80Dh92URzBAhPhSJ0kUz2b6y7FgVYgZ95u8elGUS4lOB0GOQSK3y4sCgldTQF> GQpMuvNMX6oNQTv1Z/H9H7Sc6AntozKRA6LQC+7DMxjPh2DEhVLYNqi7gMXtuH8o> Xz5+quarw/xbVmuS4UNqcxakd4A/HW6PayRhuju4+oV2+UmGU0etzGVwKSN/UicC> 3Re3mUy8SwJFQ9/3EAfiY0SGzSWH1z7bTRg9Ga2ctYDNzUpyQsgLxD6ZRHcONkOoMEQ9> GUMEQ96BeSsjT4yW9ED70CcCbhg+pMxR+lnpk4BZ4WML/plBjEb8B1YaRvhYWKd3> OSVB/JsS6J6Q/y9TTsAJDBLAfw9h7RQKibViuVFSNftAuSdktah5mDwFnL0ZMzVS> 3tDVDa5PDqbHEhK55/5EWBg4eNbAukVZmmoLzzERGXuj+LOIRElG3/n3chy1uM73> B6da3al4gDDNHifPsuozpkVN1EAROZx1K9hGGDZC3yFQTjsJtCRBbmRyZSBIZWlu> ZWNrZSAoUmVsZWFzZSBTaWduaW5nIEtleSmJAdQEEwEIAD4WIQRbgMV1Qpjwy1XY> 7Wq8734pSwkuKAUCWMu6rgIbAwUJEswDAAULCQgHAgYVCAkKCwIEFgIDAQIeAQIX> gAAKCRC8734pSwkuKEL9DACEIL5IS9wUty62Bnwd9wK2hmwihXNkTLsOOoi8aCdO> ywPwcIucgAcIO+c/t0lbe4y4sJ1KrKbdyOUQiJAyxobLCSV/MkhIDAmsZB1ZIpF3> nfmNekRdCVcMpqX8jAwoBS3Q9m2UJz1LeDCLFCvLF0nbyUnqHZP19UOvxmzAyZMA> Ub3W5y1+GMo4yA+3xSFI8ZbjzhawixCCRs69/4p+zCXR4e7LBf6koAHllD/0ZULp> SDjF+t2IkvRrMlM+e+Mxjklinr8v1FRGzmE/kCcdHaP88+iwC2wUKOZtFs4yIBLO> SWdQk9tLPmR8uWgNZmatRJyNvOaxd6EbK3jfckbJGFkmXjH+M9vMqFpoAewZ359FUs7AX> qjq+Us7AXLAMNUynom7IrtR5Rvsjx6RNtKQYUD6XY5rc7r9js9iGruHDAAW5lyRg> j3wikc0IbV9L1bTsXIp29BsrU9sXUkVEp+xQJZgwqoOduoSjmOK88QdkibDqJiGF> dzIRiXx+Nxv1Pr9L7A4/tq+YMwRfQ+WJFgkrBgEEAdpHDwEBB0DPvkeV6RzXomGF> 8jQwp0RXEt2TGFwwI7RkbpYwECY2l7QfV2VybmVyIEtvY2ggKGRpc3Qgc2lnbmlu> ZyAyMDIwKYiaBBMWCgBCFiEEbapuZKdtKEBXG0kCUoiXuCZAOtoFAl9D7DUCGwMF> CRKFxxEFCwkIBwIDIgIBBhUKCQgLAgQWAgMBAh4HAheAAAoJEFKIl7gmQDraea4A> /24v8c50HSC/Basf4WlREkuzhudplo8iT0BGtTQRdGAmAP9gIZ8dBekg9PRlpe7A> l7ErThn6owVH9szWrUt6jkKOBg==> =h7e4> -----END PGP PUBLIC KEY BLOCK----->EOF 接下来导入公钥到 gpg。 1234567➜ cat gnupg-2.2.29.asc | gpg --importgpg: key 249B39D24F25E3B6: public key "Werner Koch (dist sig)" importedgpg: key 2071B08A33BD3F06: public key "NIIBE Yutaka (GnuPG Release Key) <gniibe@fsij.org>" importedgpg: key BCEF7E294B092E28: public key "Andre Heinecke (Release Signing Key)" importedgpg: key 528897B826403ADA: public key "Werner Koch (dist signing 2020)" importedgpg: Total number processed: 4gpg: imported: 4 Step 2:查看导入的公钥的指纹是否与官网上公布的一致 12345678➜ gpg --list-keys --keyid-format=long Werner Kochpub rsa2048/249B39D24F25E3B6 2011-01-12 [SC] [expires: 2021-12-31] D8692123C4065DEA5E0F3AB5249B39D24F25E3B6uid [ unknown] Werner Koch (dist sig)pub ed25519/528897B826403ADA 2020-08-24 [SC] [expires: 2030-06-30] 6DAA6E64A76D2840571B4902528897B826403ADAuid [ unknown] Werner Koch (dist signing 2020) 如果一致的话,信任此公钥。 123456789101112131415161718192021222324252627➜ gpg --edit-key D8692123C4065DEA5E0F3AB5249B39D24F25E3B6gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.pub rsa2048/249B39D24F25E3B6 created: 2011-01-12 expires: 2021-12-31 usage: SC trust: unknown validity: unknown[ unknown] (1). Werner Koch (dist sig)gpg> signpub rsa2048/249B39D24F25E3B6 created: 2011-01-12 expires: 2021-12-31 usage: SC trust: unknown validity: unknown Primary key fingerprint: D869 2123 C406 5DEA 5E0F 3AB5 249B 39D2 4F25 E3B6 Werner Koch (dist sig)This key is due to expire on 2021-12-31.Are you sure that you want to sign this key with yourkey "yeshan333 <1329441308@qq.com>" (582AAB66132A3FDA)Really sign? (y/N) ygpg> save 这玩意还需要一个指纹 sign 公钥,可通过下面的命令快速操作 1gpg --lsign-key "6DAA6E64A76D2840571B4902528897B826403ADA" Signing a key tells your software that you trust the key that you have been provided with and that you have verified that it is associated with the person in question. Step 3:使用 signature file 校验 Tarball 12345678910➜ gpg --verify gnupg-2.2.29.tar.bz2.siggpg: assuming signed data in 'gnupg-2.2.29.tar.bz2'gpg: Signature made Sun Jul 4 22:54:50 2021 CSTgpg: using EDDSA key 6DAA6E64A76D2840571B4902528897B826403ADAgpg: checking the trustdbgpg: marginals needed: 3 completes needed: 1 trust model: pgpgpg: depth: 0 valid: 2 signed: 2 trust: 0-, 0q, 0n, 0m, 0f, 2ugpg: depth: 1 valid: 2 signed: 0 trust: 2-, 0q, 0n, 0m, 0f, 0ugpg: next trustdb check due at 2021-12-31gpg: Good signature from "Werner Koch (dist signing 2020)" [full] emmm,问题不大。这里有一丢丢问号❓What is the exact meaning of this gpg output regarding trust? 微微提升下信任水平 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495➜ gpg --edit-key 6DAA6E64A76D2840571B4902528897B826403ADA D8692123C4065DEA5E0F3AB5249B39D24F25E3B6gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.pub ed25519/528897B826403ADA created: 2020-08-24 expires: 2030-06-30 usage: SC trust: undefined validity: full[ full ] (1). Werner Koch (dist signing 2020)Invalid command (try "help")gpg> trustpub ed25519/528897B826403ADA created: 2020-08-24 expires: 2030-06-30 usage: SC trust: undefined validity: full[ full ] (1). Werner Koch (dist signing 2020)Please decide how far you trust this user to correctly verify other users' keys(by looking at passports, checking fingerprints from different sources, etc.) 1 = I don't know or won't say 2 = I do NOT trust 3 = I trust marginally 4 = I trust fully 5 = I trust ultimately m = back to the main menuYour decision? 4pub ed25519/528897B826403ADA created: 2020-08-24 expires: 2030-06-30 usage: SC trust: full validity: full[ full ] (1). Werner Koch (dist signing 2020)Please note that the shown key validity is not necessarily correctunless you restart the program.gpg> saveKey not changed so no update needed.➜ gpg --edit-key D8692123C4065DEA5E0F3AB5249B39D24F25E3B6gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.gpg: checking the trustdbgpg: marginals needed: 3 completes needed: 1 trust model: pgpgpg: depth: 0 valid: 2 signed: 2 trust: 0-, 0q, 0n, 0m, 0f, 2ugpg: depth: 1 valid: 2 signed: 0 trust: 0-, 1q, 0n, 0m, 1f, 0ugpg: next trustdb check due at 2021-12-31pub rsa2048/249B39D24F25E3B6 created: 2011-01-12 expires: 2021-12-31 usage: SC trust: undefined validity: full[ full ] (1). Werner Koch (dist sig)gpg> trustpub rsa2048/249B39D24F25E3B6 created: 2011-01-12 expires: 2021-12-31 usage: SC trust: undefined validity: full[ full ] (1). Werner Koch (dist sig)Please decide how far you trust this user to correctly verify other users' keys(by looking at passports, checking fingerprints from different sources, etc.) 1 = I don't know or won't say 2 = I do NOT trust 3 = I trust marginally 4 = I trust fully 5 = I trust ultimately m = back to the main menuYour decision? 4pub rsa2048/249B39D24F25E3B6 created: 2011-01-12 expires: 2021-12-31 usage: SC trust: full validity: full[ full ] (1). Werner Koch (dist sig)Please note that the shown key validity is not necessarily correctunless you restart the program.gpg> save➜ gpg --verify gnupg-2.2.29.tar.bz2.siggpg: assuming signed data in 'gnupg-2.2.29.tar.bz2'gpg: Signature made Sun Jul 4 22:54:50 2021 CSTgpg: using EDDSA key 6DAA6E64A76D2840571B4902528897B826403ADAgpg: checking the trustdbgpg: marginals needed: 3 completes needed: 1 trust model: pgpgpg: depth: 0 valid: 2 signed: 2 trust: 0-, 0q, 0n, 0m, 0f, 2ugpg: depth: 1 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 2f, 0ugpg: next trustdb check due at 2021-12-31gpg: Good signature from "Werner Koch (dist signing 2020)" [full] 更多 GPG Key 校验工具查看 GnuPG 主页:https://www.gnupg.org/download/index.html","categories":[{"name":"Cryptography","slug":"Cryptography","permalink":"https://yeshan333.github.io/categories/Cryptography/"}],"tags":[{"name":"MD5","slug":"MD5","permalink":"https://yeshan333.github.io/tags/MD5/"},{"name":"GPG","slug":"GPG","permalink":"https://yeshan333.github.io/tags/GPG/"}]},{"title":"使用 osmosfeed 创建自己的 Web RSS 阅读器","slug":"osmosfeed-rss-reader","date":"2021-06-29T15:34:20.000Z","updated":"2021-06-29T15:34:20.000Z","comments":true,"path":"2021/06/29/osmosfeed-rss-reader/","permalink":"https://yeshan333.github.io/2021/06/29/osmosfeed-rss-reader/","excerpt":"之前一直用 App Store 上的一个 RSS 阅读器 RSS Reader Prime 订阅技术周刊和 dalao 的技术博客,不得不说挺好用的,奈何全线下架了,现在就平板上保留着这个 App,手机上没有(国区好用的 RSS 阅读器基本无了)。有时候又想着用手机读读技术文章(板子太大,不好拿),于是乎翻了下 GitHub rss-reader topic 下的相关阅读器项目,挑了手基于 Web 和 GitHub Pages 的 RSS 阅读器(Web 才是真的“跨端”,2333~),水篇文章微微记录下。","text":"之前一直用 App Store 上的一个 RSS 阅读器 RSS Reader Prime 订阅技术周刊和 dalao 的技术博客,不得不说挺好用的,奈何全线下架了,现在就平板上保留着这个 App,手机上没有(国区好用的 RSS 阅读器基本无了)。有时候又想着用手机读读技术文章(板子太大,不好拿),于是乎翻了下 GitHub rss-reader topic 下的相关阅读器项目,挑了手基于 Web 和 GitHub Pages 的 RSS 阅读器(Web 才是真的“跨端”,2333~),水篇文章微微记录下。 什么是 RSS RSS, Really Simple Syndication. 一种描述和同步网站内容的 XML 格式,一般网站都会提供 RSS,有利于让用户通过 RSS Feed(RSS源,一般即为站点的RSS地址) 获取网站内容的最新更新。 更多关于 RSS 的内容在 GitHub 上有个名为 ALL-about-RSS 的项目有介绍。 使用 osmosfeed 搭建 Web-based RSS 阅读器osmosfeed 是 GitHub 上开源的一个 RSS Web 版阅读器,可以使用 GitHub Pages 托管,主题可自定义。 1、首先根据 osmosfeed 的模板仓 osmosfeed-template 新建个人仓库。 戳此链接使用模板仓库:https://github.com/osmoscraft/osmosfeed-template/generate 通过模板库新建个人公共仓库 2、仓库建好后,GitHub Actions 会自动触发 RSS Web Reader 构建的 actionBuild site on schedule or main branch update,构建产物将会被推送到仓库的 gh-pages 分支。 3、最近 GitHub 更新了波,GitHub Pages 的开启有了新的选项卡,仓库顶部 Settings -> 左侧边栏 Pages,调整发布源分支gh-pages,反手一个 Save 就好了。 开启仓库 Pages,源分支为 gh-pages 4、订阅源可直接编辑根目录下的 osmosfeed.yaml 文件,反手把自己博客订阅上👻😎。preview: https://shansan.top/osmosfeed-rss-reader/ 1234# cacheUrl: https://GITHUB_USERNAME.github.io/REPO_NAME/cache.jsonsources: - href: https://github.com/osmoscraft/osmosfeed/releases.atom # Get new feature announcement via this feed - href: https://shansan.top/rss2.xml action 在没有对仓库 main 分支变动的情况下,会每天自动触发一次。 action schedule, crontab.guru 更多操作可参考 osmosfeed 项目的 README:https://github.com/osmoscraft/osmosfeed","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"},{"name":"RSS","slug":"RSS","permalink":"https://yeshan333.github.io/categories/RSS/"}],"tags":[{"name":"RSS Reader","slug":"RSS-Reader","permalink":"https://yeshan333.github.io/tags/RSS-Reader/"}]},{"title":"热传导方程非特征 Cauchy 问题的一些笔记","slug":"heat-conduction-equation","date":"2021-05-16T15:14:31.000Z","updated":"2021-05-16T15:14:31.000Z","comments":true,"path":"2021/05/16/heat-conduction-equation/","permalink":"https://yeshan333.github.io/2021/05/16/heat-conduction-equation/","excerpt":"毕设工作即将结束之际,附上一份笔记到博客-数学物理方程-热传导方程.","text":"毕设工作即将结束之际,附上一份笔记到博客-数学物理方程-热传导方程. 反问题与不适定问题反问题描述note quote 一对问题称为是互逆的 不适定问题的三个判断标准 问题的解是存在的; 问题的解是唯一的; 问题的解是稳定的; 该概念由现法国科学院院士 J.Hadamard 在耶鲁大学提出. 适定(well-posed)问题 & 不适定(ill-posed)问题. $$ Ax=y, A: X \\rightarrow Y 的线性紧算子 $$ 1、解的存在性:$ \\forall y \\in Y, \\exist x \\in X, $ 使得 $ Ax=y. $2、解的唯一性:$ \\forall y_1, y_2 \\in Y, y_1 \\neq y_2, $ 有 $ Ax_1=y_1, Ax_2=y_2, $ 使得 $ x_1 \\neq x_2. $3、解的稳定性(即解的连续性):若有 $ Ax_1=y_1, Ax_2=y_2, $ 则当 $ y_1 \\rightarrow y_2 $ 时, 使得 $ x_1 \\rightarrow x_2. $ note info 当定解条件(初值条件,边界条件)以及方程中的系数有微小变动时,相应的解也只有微小变动. 解的稳定性也称为解关于参数的连续依赖性. 微分方程 微分方程:包含导数的方程,常用于描述现实事物的变化. 微积分学是一门研究变化的学问. 微分应用包括对速度、加速度、曲线斜率、最优化等的计算. 微分方程的定解条件:即初值条件和边界条件; 三类边界条件 第一类:狄利克雷边界条件(Dirichlet boundary condition)也被称为常微分方程或偏微分方程的“第一类边界条件”,指定微分方程的解在边界处的值. 求出这样的方程的解的问题被称为狄利克雷问题. 第二类:诺伊曼边界条件(Neumann boundary condition) 也被称为常微分方程或偏微分方程的“第二类边界条件”. 诺伊曼边界条件指定了微分方程的解在边界处的微分. 第三类:Robbin条件/混合边界条件,未知函数在边界上的函数值和外法向导数的线性组合. 偏微分方程三大问题 初边值问题或混合问题:偏微分方程 + 初值条件 + 边界条件; 初值问题或 Cauchy 问题:偏微分方程 + 初值条件; 边值问题:偏微分方程 + 边界条件; 方程式与方程组 方程式:方程个数为 1; 方程组:方程个数大于 1; 欠定与超定 欠定:方程个数少于未知函数个数; 超定:方程个数多于未知函数个数; 方程(组)中出现的未知函数的最高阶偏导数的阶数称为方程(组)的阶数. 数学物理微分方程反问题的分类文献[1]根据以下一般形式的微分方程组,给出了数学物理反问题的五大分类. 其中 $ u(x,t) $ 为微分方程组的解;$ L, I, B, A $ 分别是微分算子,初始算子,边界算子和附加算子. $ \\Omega $ 为求解区域,$ \\partial \\Omega $ 为求解区域的边界. $ \\partial \\Omega^{\\prime} $ 为 $ \\Omega $ 的一部分. $ f(x,t) $ 为方程的右端项,$ \\varphi(x), \\psi(x,t), k(x,t) $ 分别为初始条件、边界条件和附加条件. 上述任一已量变为未知量,即为微分方程反问题. 参数识别问题:算子 $ L $ 未知(通常 $ L $ 的结构是已知的,未知的为算子中的参数); 寻源反问题:右端方程源项 $ f(x,t) $ 未知; 逆时反问题:$ \\varphi(x) $ 条件未知时,附加条件为系统某一时刻的状态,该反问题从后面的状态去确定初始状态; 边界控制问题:边界条件 $ \\psi(x,t) $ 未知; 几何反问题:区域边界 $ \\partial \\Omega $ 未知; 反问题通常是不适定的,即初始条件上的一个微小的扰动,将导致结果的巨大变化. 克服反问题不适定性是比较棘手的,这也是反问题研究的重要课题. 随机微分方程解的爆破:在大多数时间里,解是有解的。但存在某一时间点,解趋于 $ \\infty $. 任何一个物理现象都是处在特定条件下的. 关于反问题的更多描述 关于反问题的一个比较适用的数学定义是“由定解问题的解的部分信息去求定解问题中的未知成分”. 有效反问题的数值算法以正问题的高精度解法为基础.反问题的不适定性主要表现在两个方面: 一方面,由于客观条件限制的输入数据(即给定的解的部分已知信息)往往是欠定的或者是超定的,这就导致解的不唯一性或者是解的不存在性; 另一方面,反问题的解对输入数据往往不具有连续依赖性。由于输入数据中不可避免的测量误差,人们就必须提出由扰动数据求反问题在一定意义下近似解的稳定的方法. 因此,反问题和不适定问题是紧密联系在一起的.定解条件都是通过测量和统计而得到的,在测量和统计的过程中误差总是难免的,同时在建立数学模型的过程中也多次用了近似. 如果解的稳定性不成立,那么所建立的定解问题就失去了实际意义. 如果一个定解问题的适定性不成立,就要对定解问题作进一步地修改,直到它具有适定性[3]. 热传导方程 Direct heat conduction problems (DHCPs) 直接热传导问题, Inverse heat conduction problem (IHCPs) 逆热传导问题 热传导正/反问题 热传导反问题:在热交换情形下,通过研究物体内部或边界的一点或多点温度分布信息来反演热源项、初始条件、边界条件、物理的几何条件等未知量. 热传导方程非特征 Cauchy 问题的[4]:典型的热传导方程的非特征Cauchy问题是通过一部分边界上的或者内部的数据来判定另一部分边界的热流. 一维热传导方程初边值问题有限域上边界条件为第一类 Dirichlet 边界条件的数学模型: 求解区域: 处理热传导方程非特征 Cauchy 问题的相关方法基本解方法基本解方法(the method of fundamental solutions, MFS)使用微分算子的基本解去近似数值解. 热传导方程非特征 Cauchy 问题使用基本解方求解时,数值近似解由以下基本解的线性组合得到[5]: $$\\begin{array}{c}\\tilde{u}(x) = \\sum_{i = 1}^{N} a_{i} u^{*}\\left(x-\\mu_{i}\\right)\\end{array}$$ 待定系数 $ a_{i} $ 通过对求解区域边界和虚边界进行配置点配置得到. 基本解方法是一种无网格的径向基函数类方法. 因 Cauchy 问题的不适定性,基本解方法所得到的线性系统是高度病态的,常规方法求解已没有意义. 需要使用正则化方法处理线性系统的病态性. 正则化方法 正则化方法求解不适定问题的本质是, 对问题的解进行一定的限制, 考虑一个近似的适定问题来保证原问题近似解的稳定性. Tikhonov 正则化方法 正则化参数 $ \\alpha $ 的选取. 确定式方法 偏差原则 拟最优方法 启发式方法 广义交叉核式 L-曲线法则 参考 [1] 张智倍. 热传导方程反问题的若干方法研究[D]. 哈尔滨: 哈尔滨工业大学, 2010. [2] 臧顺全. 热传导方程正问题和反问题的数值解研究[D]. 西安: 西安理工大学, 2019. [3] 王明新. 数学物理方程[M]. 清华大学出版社, 2005: 1-171. [4] 贾现正. 热传导方程中的若干反问题[D]. 上海: 复旦大学, 2005. [5] 金邦梯. 一类椭圆型偏微分方程反问题的无网格方法[D]. 杭州: 浙江大学, 2005.","categories":[{"name":"math","slug":"math","permalink":"https://yeshan333.github.io/categories/math/"}],"tags":[{"name":"math","slug":"math","permalink":"https://yeshan333.github.io/tags/math/"}]},{"title":"简单了解波 Mono-repo & Multi-repo(Poly-repo)","slug":"term-monorepo-multirepo","date":"2021-04-30T23:30:00.000Z","updated":"2021-04-30T23:30:00.000Z","comments":true,"path":"2021/04/30/term-monorepo-multirepo/","permalink":"https://yeshan333.github.io/2021/04/30/term-monorepo-multirepo/","excerpt":"Mono-repo 和 Multi-repo 是软件开发中代码管理的两个不同策略。Mono-repo & Multi-repo 孰优孰劣是个老生常谈得话题了,这里就不 PK 了,“略微”看下两者区别。 当我们使用 Git 作为版本控制系统管理项目的代码时,那么 monorepo 与 multirepo 的定义表述如下: monorepo,使用一个 Git 仓库管理项目相关的多个 模块/包/功能/应用。 multirepo(又称为 polyrepo),使用多个 Git 仓库分别管理项目的每一个 模块/包/功能/应用。","text":"Mono-repo 和 Multi-repo 是软件开发中代码管理的两个不同策略。Mono-repo & Multi-repo 孰优孰劣是个老生常谈得话题了,这里就不 PK 了,“略微”看下两者区别。 当我们使用 Git 作为版本控制系统管理项目的代码时,那么 monorepo 与 multirepo 的定义表述如下: monorepo,使用一个 Git 仓库管理项目相关的多个 模块/包/功能/应用。 multirepo(又称为 polyrepo),使用多个 Git 仓库分别管理项目的每一个 模块/包/功能/应用。 Monorepo 的应用实例GitHub 有很多的使用 Monorepo 风格管理代码的开源项目,比如大名鼎鼎的 Babel,项目结构如下图: Babel GitHub Repo packages 目录下存放了很多个 Babel 相关的子项目。 googles-monorepo-demo给出了一个基于 Maven 构建工具的 Google 风格的 Monorepo 项目。 还有大佬给出了有 CI/CD pipeline 基于 Java, Maven, GitHub Actions 的 Demo 👉 monorepo-maven-example。 monorepo-maven-example-with-github-actions 使用工具快速搭建 Monorepo 风格的项目现今,有许多可以创建 Monorepo 风格项目的工具,在前端社区有 Lerna、Nx、Rush Stack、Yarn Workspaces 等,还有许多其它的构建工具可以用于创建 Monorepo 风格的项目,见项目 -> awesome-monorepo。这里让我们看看通过 Nx 创建的 Monorepo 风格的项目是怎么样的: Nx create project medium 上有篇文章简述了 11 种不同 Monorepo 构建工具的特点:11 Great Tools for a Monorepo in 2021 一图看 Monorepo 和 Multirepo 的区别这里我们用一张图来看下使用 Git 管理多个 package 时,Monorepo 和 Multirepo(Polyrepo) 的区别: Monorepo & Multirepo(Polyrepo) Don’t say so much. 就这样了🤨🕊️,又水了一篇文章。","categories":[{"name":"Architecture","slug":"Architecture","permalink":"https://yeshan333.github.io/categories/Architecture/"}],"tags":[{"name":"项目管理","slug":"项目管理","permalink":"https://yeshan333.github.io/tags/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/"},{"name":"Monorepo","slug":"Monorepo","permalink":"https://yeshan333.github.io/tags/Monorepo/"}]},{"title":"Windows Insiders WSLg Linux GUI App 支持尝鲜","slug":"enjoy-wslg","date":"2021-04-25T18:59:48.000Z","updated":"2021-04-25T18:59:48.000Z","comments":true,"path":"2021/04/25/enjoy-wslg/","permalink":"https://yeshan333.github.io/2021/04/25/enjoy-wslg/","excerpt":"2021 年 4 月 21 日,微软在 Developer Blogs 发布了 Windows 预览版 WSL(Windows Linux 子系统) 对 Linux GUI App 的支持的公告🔗,碰巧😀我最近重装了波电脑,系统换成了 Windows Insiders(Dev),正好可以感受波 Linux GUI App 的支持。btw,预览版的文件管理器支持访问 WSL 的文件了,6~ 的。 Windows new icons WSL 现在居然支持跑 Linux 图形应用了,真香(😎,虽然上一年 WSL 的 Roadmap 中有说过要支持,但我没关注,老二手知识党了)。Quickstart ->","text":"2021 年 4 月 21 日,微软在 Developer Blogs 发布了 Windows 预览版 WSL(Windows Linux 子系统) 对 Linux GUI App 的支持的公告🔗,碰巧😀我最近重装了波电脑,系统换成了 Windows Insiders(Dev),正好可以感受波 Linux GUI App 的支持。btw,预览版的文件管理器支持访问 WSL 的文件了,6~ 的。 Windows new icons WSL 现在居然支持跑 Linux 图形应用了,真香(😎,虽然上一年 WSL 的 Roadmap 中有说过要支持,但我没关注,老二手知识党了)。Quickstart -> WSLg 的架构WSLg 是支持 Windows 运行 Linux 图形应用的核心项目, Windows Subsystem for Linux GUI 的简写,看了眼 Git commit,8 天前开源的,🐂。README 里面有张 WSLg 的架构图,略微操作下帖到这里: WSLg Architecture 扫了眼,只有 RDP 和 X11 有点印象,这个 Wayland 在最近关于 Ubuntu 21.04 的新闻有看到过,具体原理这里就不了解了,骚就完事了,先跑个 Linux GUI App 感受波。 已有微软大佬对 WSLg 的架构做了详细的介绍,参见文章:WSLg Architecture Windows Insiders Dev 跑下 Linux GUI App这里又到了经典的环境配置环节(干啥啥不行,老装环境选手了)。不得不说,Windows 系统换成 Insiders 版本真香,WSL 安装一句命令就完事了。虽然又碰到了许久未见到的经典蓝屏问题,但还是阔以接受的,我 giao。 看波 WSLg 的 README,配下环境,操作系统版本要 21362+,还得微微更新波🤨: Upgrade Windows System Sometime later………………. Windows insiders version OK,可以操作了,之前我已经安装过 WSL,且切换到了 v2 版本,so,按照 README 所说,只需要进行如下操作即可。 以 Administrator 身份启动 Powershell 执行以下命令: 1234# 1、重启下 WSLwsl --shutdown# 2、Updatewsl --update WSL Update 然后随意装个 GUI App 感受下,装个 gedit 吧: 123# Nautilus 文件管理器,可在 Windows 开始菜单启动 Linux GUI Appsudo apt install nautilus -ysudo apt install gedit -y Windows Desktop Gedit 还阔以,虽然我是“命令行仔”了,但时不时用下 GUI App 还是香的。","categories":[{"name":"WSL","slug":"WSL","permalink":"https://yeshan333.github.io/categories/WSL/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/tags/Linux/"},{"name":"WSL","slug":"WSL","permalink":"https://yeshan333.github.io/tags/WSL/"},{"name":"GUI","slug":"GUI","permalink":"https://yeshan333.github.io/tags/GUI/"}]},{"title":"初探 Git Submodules","slug":"git-submodules","date":"2021-03-10T15:51:15.000Z","updated":"2021-03-10T15:51:15.000Z","comments":true,"path":"2021/03/10/git-submodules/","permalink":"https://yeshan333.github.io/2021/03/10/git-submodules/","excerpt":"之前一直想将一个 Git 仓库放到另一个 Git 仓库,有 Maven 多模块项目(Maven Multimodule Project)和 Gradle 多项目构建(Gradle Multiproject Build)那味儿。Git 这么骚,肯定也可以。“扫”了多个开源仓库,Get 到了 Git submodule 可以做这种操作,水篇文章记录波。","text":"之前一直想将一个 Git 仓库放到另一个 Git 仓库,有 Maven 多模块项目(Maven Multimodule Project)和 Gradle 多项目构建(Gradle Multiproject Build)那味儿。Git 这么骚,肯定也可以。“扫”了多个开源仓库,Get 到了 Git submodule 可以做这种操作,水篇文章记录波。 没有使用 Git Submodules 之前没有使用 submodule 之前,如果在一个 Git 项目追踪另一个 Git 项目,会报一个 warning「我敲,有暗示用 submodule,之前没注意」,操作如下: 1234mkdir git-submodulecd git-submodulegit initgit clone https://github.com/volantis-x/hexo-theme-volantis --depth 1 执行 git add hexo-theme-volantis,会出现如下 warning(adding embedded git repository): 追踪执行结果 然后使用 git status 查看,虽然 git add 成功了,但是并没有成功 add 到 hexo-theme-volantis 里面的内容。提示也说了(will not contain the contents of the embedded repository),提交到 GitHub 后,显示结果如下, folder 戳也戳不开。 push to GitHub 可以明显的看到,并不能保证 子目录/文件 的完整性。就我之前如果想在一个 Git 项目保留另一个 Git 项目,那么我只能将一个项目的 Git 版本库去掉,从后续的使用感受来看,此后我追踪另一个项目的更新会有点麻烦。从 yeshan333/actions-for-hexo-blog 项目的对 volantis 项目追踪的历史commit@3ce9316 可以看得出来 Git Submodules 的作用是时候该见识 submodule 的作用了,从官方文档可以看到,它可以解决之前上面提到的一些问题。略微概括下就是: Git的 submodule 可以将一个 Git 版本库作为一个子目录保存在另一个 Git 版本库中,并可以保留两个版本库之间 commit 的分离,保持父项目和子项目相互独立,实现更为精确的版本控制。 Git Submodules 的本质拿 actions-for-hexo-blog 项目来实践感受下 submodule。操作如下: 12git clone git@github.com:yeshan333/actions-for-hexo-blog.git && cd actions-for-hexo-bloggit submodule add git@github.com:volantis-x/hexo-theme-volantis.git themes/volantis 执行上述命令之后,会看到当前项目下生成了个 .gitmodules 文件,内容如下: 123[submodule "themes/volantis"] path = themes/volantis url = git@github.com:volantis-x/hexo-theme-volantis.git 同时,.git/config 文件也会被追加写入如下内容: 123[submodule "themes/volantis"] url = git@github.com:volantis-x/hexo-theme-volantis.git active = true 再看看 theme/volantis 目录,发现该项目的 Git 版本库不见了,之前提到 git submodule 可以保留两个版本库之间 commit 的分离,那么项目 volantis 的版本库放哪了?摸索下当前项目的版本库可以看到被放在了 .git/modules/themes/volantis 下。尝试提交到 GitHub 看看。 GitHub 提交结果 emm……,收工,目录名显示多个 commit 引用,可以进行跳转。 更多操作 与 submodule 类似的 subtree:Git Submodules vs Git Subtrees 子模块更新:git submodule update submodule 最佳实践 12345# 子模块删除- 删除.gitsubmodule文件中子模块的相关字段;- 删除.git/config文件中子模块的相关字段;- 删除模块目录:- git rm --cached <submodule-path>","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"}]},{"title":"使用 rsync-deploy-action 同步 Hexo 博客到个人服务器","slug":"hexo-blog-synchronization-with-rsync","date":"2021-01-19T20:02:51.000Z","updated":"2021-01-19T20:02:51.000Z","comments":true,"path":"2021/01/19/hexo-blog-synchronization-with-rsync/","permalink":"https://yeshan333.github.io/2021/01/19/hexo-blog-synchronization-with-rsync/","excerpt":"前几天写了个基于 rsync 进行文件同步的 Action -> rsync-deploy-action。目的有三个: 1、深入了解波 GitHub Actions,感受下 GitHub 的文档; 2、个人博客在我的腾讯云 CVM 服务器上是部署有一份的「域名:shan333.cn」,之前的博客同步方式是通过 Linux 的定时任务,觉得不太行,当前博客的更新并没有那么频繁,没必要每隔几个小时就 git pull 一下,且服务器还挂着其他东西,性能还是有点损耗的,换成通过 rsync 进行主动推送的方式好点; 3、熟悉波 SSH 协议和 rsync 协议。 今天撸一篇文章简单记录下这次折腾。","text":"前几天写了个基于 rsync 进行文件同步的 Action -> rsync-deploy-action。目的有三个: 1、深入了解波 GitHub Actions,感受下 GitHub 的文档; 2、个人博客在我的腾讯云 CVM 服务器上是部署有一份的「域名:shan333.cn」,之前的博客同步方式是通过 Linux 的定时任务,觉得不太行,当前博客的更新并没有那么频繁,没必要每隔几个小时就 git pull 一下,且服务器还挂着其他东西,性能还是有点损耗的,换成通过 rsync 进行主动推送的方式好点; 3、熟悉波 SSH 协议和 rsync 协议。 今天撸一篇文章简单记录下这次折腾。 rsync-deploy-action 的创建挑 rsync 协议,不挑 FTP 或 scp 的新建 GitHub Actions 的部分原因是 rsync 可以做增量备份。GitHub Action 有三种类别,即 Docker container、JavaScript 和 Composite run steps。这次手撸的 Action 归属于 GitHub 官方文档介绍的 Docker container action。rsync-deploy-action 已经发布到 GitHub 的 Marketplace。源仓库地址:https://github.com/yeshan333/rsync-deploy-action。 rsync 与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。 rsync-deploy-action 基于 SSH 协议进行文件的远程同步,从元数据文件 action.yml 可以看到,Action 支持 8 个参数「6个必选,2个可选」。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950name: 'rsync-deploy-action'description: 'Synchronize files to the remote server using the SSH private key'inputs: ssh_login_username: description: 'SSH login username' required: true remote_server_ip: description: 'remote server ip' required: true ssh_port: description: 'remote server SSH port' required: true default: "22" ssh_private_key: description: 'login user SSH private key' required: true source_path: description: 'The source storage path of the synchronous files' required: true destination_path: description: 'The destination storage path of the synchronous files' required: true ssh_args: description: 'SSH args' required: false rsync_args: description: 'rsync args' required: falseoutputs: start_time: description: 'Start time of synchronization' end_time: # id of output description: 'End time of synchronization'runs: using: 'docker' image: 'Dockerfile' args: - ${{ inputs.ssh_login_username }} - ${{ inputs.remote_server_ip }} - ${{ inputs.ssh_port }} - ${{ inputs.ssh_private_key }} - ${{ inputs.source_path }} - ${{ inputs.destination_path }} - ${{ inputs.ssh_args }} - ${{ inputs.rsync_args }}branding: icon: 'file' color: 'green' 利用 rsync-deploy-action 的 Dockerfile 文件配合 Action 执行日志可以一窥 GitHub Actions 背后是如何执行的。 Action 的 with 参数的传递在一定程度上利用了 Dockerfile 的 ENTRYPOINT。 12345678910111213141516# Container image that runs your codeFROM alpine:latestRUN apk update \\ && apk upgrade \\ && apk add --no-cache \\ rsync \\ openssh-client# Copies your code file from your action repository to the filesystem path `/` of the containerCOPY entrypoint.sh /entrypoint.shRUN chmod +x /entrypoint.sh# Code file to execute when the docker container starts up (`entrypoint.sh`)ENTRYPOINT ["/entrypoint.sh"] 接下来介绍下利用 rsync-deploy-action 进行 Hexo 博客同步到个人腾讯云 CVM 服务器的过程。 Hexo 博客同步到云服务器由于 rsync 是基于 SSH 协议的,rsync-deploy-action 需要使用到 SSH 私钥,所以需要先创建一个可以进行 SSH 远程登录的用户,不建议直接使用 root 用户。 SSH 密钥登录1、先配置好远程腾讯云 CVM 服务器 SSH 允许密钥登录。编辑 SSH 配置文件 /etc/ssh/sshd_config。 1vim /etc/ssh/sshd_config StrictModes yes 改成 StrictModes no (去掉注释后改成 no) 找到 #PubkeyAuthentication yes 改成 PubkeyAuthentication yes (去掉注释) 找到 #AuthorizedKeysFile .ssh/authorized_keys 改成 AuthorizedKeysFile .ssh/authorized_keys (去掉注释) 保存后,重启 sshd。 1systemctl restart sshd 2、新建用户 github,用于远程 SSH 免密登录。 在远程服务器执行如下命令: 12345# root 用户下创建用户 github 并且指定 HOME 目录useradd -d /home/github github# 也可以使用 adduser github,adduser会自动创建 HOME 目录等# 设置 github 用户密码,用于后续 SSH 登录公钥的上传passwd github 3、在本地 PC 执行如下命令,创建用于登录的密钥对。 123456# 生成密钥对ssh-keygen -t rsa -b 4096 -C "1329441308@qq.com"# 将生成的公钥上传到云服务器,server_ip 为服务器 IP 地址,ssh_port 为 SSH 端口号cat ~/.ssh/id_rsa.pub | ssh github@server_ip -p ssh_port "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"# ssh 密钥登录测试,server_ip 为服务器 IP 地址,ssh_port 为 SSH 端口号ssh -p ssh_port -i ~/.ssh/id_rsa github@server_ip 以上操作完成没问题之后,即可使用 rsync-deploy-action 了,后面以个人 Hexo 博客的同步为例子,简单看下如何使用此 Action。 Hexo 博客同步个人 Hexo 博客之前已经配置过 GitHub Action 的 workflows 进行博客的自动部署「博客源仓库:yeshan333/actions-for-hexo-blog」,所以再添加个 step 给 rsync-deploy-action 即可启用博客同步。step 声明如下: 123456789101112131415161718192021222324252627282930313233name: Site CIon: pull_request: branches: [master] push: branches: [master]jobs: build: runs-on: ubuntu-latest steps: ...... - name: Release to GitHub Pages run: | git config --global user.email "1329441308@qq.com" git config --global user.name "yeshan333" git clone git@github.com:yeshan333/yeshan333.github.io.git .deploy_git chmod 755 -R .deploy_git hexo clean hexo generate hexo deploy - name: Push to tencentyun CVM uses: yeshan333/rsync-deploy-action@v1.0.0 with: ssh_login_username: ${{ secrets.SSH_LOGIN_USERNAME }} remote_server_ip: ${{ secrets.REMOTE_SERVER_IP }} ssh_port: ${{ secrets.SSH_PORT }} ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} source_path: ./.deploy_git/* destination_path: ~/shan333.cn rsync_args: --exclude="./.deploy_git/.git/*" workflow 中名为 Push to tencentyun CVM 的 step 会将 .deploy_git 下的所有文件上传到云服务器「存放到 ~/shan333.cn 目录下」,熟悉 Hexo 的朋友应该知道 hexo deploy 生成的文件会放在 .deploy_git 目录下,这里用到了 Hexo 的一个 Plugin -> hexo-deployer-git。其实也可以将 hexo generate 生成的 public 目录下的所有文件同步到云服务器。 rsync-deploy-action 使用到的参数解释「有部分数据也算是隐私数据,这里意思下用了 GitHub 的 repository secrets」: ssh_login_username:可以进行 SSH 密钥登录的用户名,即之前配置好的 github 用户。 remote_server_ip:云服务器 IP ssh_private_key:SSH 登录用户的私钥,即之前的 ~/.ssh/id_rsa 文件的内容 source_path:博客相关所有文件路径 destination_path:同步到云服务器的目标路径~/shan333.cn,即/home/github/shan333.cn rsync_args:action 的可选参数,.git 目录是没必要同步上传的,排除掉 “大功告成”。rsync 协议的更多介绍可参考:WangDoc.com rsync。 More个人的腾讯云 CVM 服务器之前为了方便维护安装了个运维面板BT.CN,Hexo 博客是用过 Nginx Serving 的,但 Nginx 是通过运维面板安装的,默认的 user 为 www「宝塔对 Nginx 的配置文件进行了拆分」,但同步后的博客是放在 github 用户的 HOME 目录下的 shan333.cn 目录中的,www 无权限执行博客的相关文件(403 Forbidden),所以需要操作波给 www 用户可执行权限,让 Nginx Worker 可以 serving 博客: 1234# root 用户下执行,github 目录下的所有文件 755 权限chmod -R 755 /home/github# 将 www 用户添加到 github user groupusermod www -G -a github 参考 GitHub Actions-Creating actions GitHub Actions-Workflow syntax SSH 密钥登录-网道文档 nginx-split-large-configuration-file Dockerfile ENTRYPOINT","categories":[{"name":"DevOps","slug":"DevOps","permalink":"https://yeshan333.github.io/categories/DevOps/"}],"tags":[{"name":"Github Actions","slug":"Github-Actions","permalink":"https://yeshan333.github.io/tags/Github-Actions/"},{"name":"DevOps","slug":"DevOps","permalink":"https://yeshan333.github.io/tags/DevOps/"},{"name":"Nginx","slug":"Nginx","permalink":"https://yeshan333.github.io/tags/Nginx/"}]},{"title":"关注思考的过程,终将更加卓越 | 2020 年总结","slug":"2020-annual-reviewed","date":"2021-01-06T16:29:08.000Z","updated":"2021-01-06T16:29:08.000Z","comments":true,"path":"2021/01/06/2020-annual-reviewed/","permalink":"https://yeshan333.github.io/2021/01/06/2020-annual-reviewed/","excerpt":"","text":"开篇碎语2020 年末和 2021 年初在掘金社区和 Twitter 看了诸多大佬的 2020 年总结「顺便膜拜 dalao 的同时学习波文法😀,方便写自己的年度总结」。 2020 年 12 月 08 日,我在 QQ 空间发布了篇“预总结”,特地立了个 flag 🚩『2020年最后一周或者 2021 年第一周把年度总结写出来』,防止自己“赖账”😂。毕竟 2019 年都写了份总结了,2020 年的不能少吧!从那时候开始,就在磨磨唧唧的准备材料,写篇文章不容易啊 /(ㄒoㄒ)/~~。第二次写年度总结,今年写份长点的。 最近使用了“毕生的 EN 功力”去翻译一篇毕设相关的论文 -> 《Method of fundamental solutions with regularization techniques for Cauchy problems of elliptic operators》,敲打着一堆的数学公式「Latex 和 plain 混着用」,回顾着诸多偏微分方程(PDE)的知识「裂开了~」,瞬间感觉自己又是一个数学系的学生了。 话不多说,回到正题,总结来了! 回顾 2020可以注意到,在这篇年度总结的题目中我特别提到了思考,且这一年博客首页的 Banner 换了几次 Title 也是和“思考过程”有关的。可以引申出一点 - 这一年,相对于结果的产出,我更关注的是过程的收获-解决问题过程中的思考。校招时部分面试的背书式回答让我很不爽「自己太菜😒」,逼自己了解把某项技术出现的历史与原因,这算是部分原因。另一部分嘛,以前入门时一步一步跟着别人做 demo,跟着别人的思路走,按照别人的方法解决问题,现在深受其害库😥,缺少了点“独立思考”,太不爽了。So,2020 年关注了下解决问题的思考过程,方案如何高效高质产出。 学习 - 成长谈到学习,这一年看得书不算多,但是感觉还挺硬核。我汲取知识的方式不仅有读书 & 文档 & 博客,还会看一些 dalao 在极客时间开的技术专栏,略微看下我的极客时间 2020 年终报告: 极客时间 2020 年终报告 “有一天肝得太晚了,不得,以后好好摸鱼呀,啊 sir。” 跟着耗子叔认识了这个平台,剁了好几次手 2333~,不过到现在看来并不亏,相对于视频学习,个人还是比较喜欢这种文字形式的学习的,可以很方便的反复琢磨,通过这个平台还了解到了许多各个领域的 dalao。 Podcast从上一年(2019) GET 到的播客「捕蛇者说」汲取知识的姿势 2020 年仍然保持着,对个人来说又新颖、又有趣,可以听到 dalao 的声音『小声 bb,校招面试总感觉有个面试官声音在哪里听过🤣』。 Reading这一年看得书还真的不算多,略微罗列下: 在读,有部分差不多读完了 《React 设计模式与最佳实践》 《计算机是怎样跑起来的》 《网络是怎样连接的》 《Python 云原生:构建应对海量用户数据的高可扩展 Web 应用》 《现代操作系统 原书第四版》 《云原生 Java》 《Cloud Native Go 构建基于 Go 和 React 的云原生 Web 应用与微服务》 《Kubernetes Handbook》 《TypeScript Deep Dive》 《大型网站技术架构:核心原理与案例分析》 《Nginx 高性能与 Web 服务器详解》 今年准备了解下 《Go 语言设计与实现》 《程序员的自我修养 - 链接、装载与库》 …… 这一年,我关注了许多 CS 基础相关「深知与 CS 专业的 dalao 的差距还是很大的」的书籍,为了校招面试,更为了以后更好的发展。今年看的书有部分是和 Jimmy Song dalao 相关的,也因这位 dalao 关注上了 Cloud Native。感叹下《Go 语言设计与实现》作者深厚的功底,2021 年想再深入了解波编译原理。 Coding到了,Coding 相关的,不得不提 GitHub,作为“资深 GitHub 打卡混子”,除了 Gitee 上为了感受下 DevOps 做的 AI 相关的入门级项目的代码,今年写的大部分代码都以放到了 GitHub 个人公有仓或者私有仓上。看看我的 GitHub 年度报告,可以大致了解下我的 Coding 情况: 2020 GitHub annual report 再看看小绿点,这一年过得还算“充实”。 GitHub Card 诸多的第一次2020 年,有着诸多对于我来说特别有意义的第一次,认识了许多的朋友、dalao。 第一次一个人的远途2020 年的 21 届暑假实习春招,我最终接了一家杭州互联网大厂的 offer,大老远的从桂林跑去杭州实习。这还是我第一次一个人跑这么远,大学入学时还有父母陪同,这真的是第一次跑到杭州这么远的地方。哪个厂?看下图😀「学院社团,瞒天过海,嘿嘿嘿~(^_^),对不住-对不住」: HangZhou Netease 顺带一提,第一次白天坐“灰机”,见识了下祖国的大好河山「东南丘陵、江浙平原」。 第一次实习说起实习,这还是我第一次实习「“打工仔”」,不像有些大佬从大一就开始有实习机会了。三个月的实习期都在“混”一个平台的开发,复习巩固 & 学习了挺多的前端、服务端、性能优化相关的技术,这里有 Cloud Native 相关技术的落地,在这里痛快的玩了几下 Kubernetes 和 DevOps 元素周期表里面的东西,看了波“传说”中的 PingCAP dalao 的分享。在这里要非常感谢我的 mentor 给了我很多机会让我实践我的想法,将相关技术、规范融入到平台的开发中来。不得不提的是-我所在的部门归属于 Netease 的一个 AI Lab,很幸运能够了解到前沿 RL 相关技术的落地实践,具体就不展开港了。 在杭州实习认识了几个来自武大、浙大、北大、电子科大、HongKong 的朋友 & 策划dalao、动效dalao、美术dalao,有同厂的也有不同厂的,这些人真的强,我吐了,我一直想跟他们说能不能给点机会,别吊打我了,求放过,疯狂暗示+明示🤪抬几手。和几个大佬开了很多次小灶,涨了很多知识,只想感叹:差距咋这么大,不比了-不必了。 第一次校招2020 年,第一次参加校招(2021届春、秋招),也许是最后一次校招了,无读研打算(“菜”就一个字)。没想到我个菜鸡居然有机会大厂一轮游(BAT、TMD、菊厂、🐖厂等),非常感谢每个面试官给的机会,还顺带给了我非常多成长、沟通方面的建议,印象最深刻的就是美团和鹅厂的面试,知识面打满了,还顺带问了数理统计相关的知识,帮我打通了下知识体系。总得来说,这次校招不亏不亏,拿了几个不算好也不算差的 offer,可能因为我太菜,没能留🐖厂,最终选择了 A 厂,继续努力,期待以后更好的成长。 再次顺带一提,20 年凑(“白嫖”)了几个厂的小物件。 Gift 第一次支持杰哥的演唱会作为杰哥将近八年的歌迷,今年听了场网易云音乐的线上演唱会,2333~,终于支持了波杰哥,希望 2021 年有机会线下听一场杰哥的巡回演唱会。 WE LIVE 生日演唱会 第一次把自己的笔记本“干掉了”2020 年,安奈不住心中的“冲动”,把自己的渣渣笔记本电脑“解剖”了,「特别想换一下,奈何没资本,跑个 IDEA 真费劲,等我入职第一个月 salary 到手,反手“屠”了它」。 个人笔记本配置 展望 2021一波操作水下来,发现 2020 年过得还凑合。2021 年希望活得更精彩、更快乐。一波面试和实习下来,发现自己各方面的能力还是不行啊,希望今年能学好冰山上层的同时好好提升下冰山下层的能力。 网图-冰山模型 2020 年的开源技术社区参与程度还是不行,2021 年继续努力。2020 年末,有幸受赵老师邀请给上 Linux 课的学弟学妹做了次 Linux 相关的分享,特地回顾了下之前学到的东西,太多纰漏(“虽然我在吹水,而且我也没讲多少 Linux,对不住,哈哈哈,还白嫖了个小米手环~哈哈哈!”)。Slides 「Tip:下图可以拨动哦(^_^)」 2021 年,坚持输出,希望个人博客更有味道,不只是技术文章,能有点生活味儿~! 2019 年总结","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"2021 Happy New Year","slug":"2021-new-year","date":"2021-01-01T00:00:00.000Z","updated":"2021-01-01T00:00:00.000Z","comments":true,"path":"2021/01/01/2021-new-year/","permalink":"https://yeshan333.github.io/2021/01/01/2021-new-year/","excerpt":"","text":"","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"简单耍一下-Kafka","slug":"耍一下Kafka","date":"2020-12-13T20:30:14.000Z","updated":"2020-12-13T20:30:14.000Z","comments":true,"path":"2020/12/13/耍一下Kafka/","permalink":"https://yeshan333.github.io/2020/12/13/%E8%80%8D%E4%B8%80%E4%B8%8BKafka/","excerpt":"趁着毕设初期,还能摸会儿🐟,了解波 Kafka。 Kafka 术语一览 Kafka,分布式消息引擎系统,主要功能是提供一套完备的消息发布与订阅解决方案。Kafka 也是一个分布式的、分区的、多副本的多订阅者,基于 Zookeeper 协调的分布式日志系统,可用于处理 Web 日志和消息服务。 Topic:主题,承载消息(Record)的逻辑容器,每条发布到 Kafka 集群的消息都归属于某一个 Topic,实际应用中,不同的 topic 对应着不同的业务; Broker:Kafka 服务进程,一个 Kafka 集群由多个 Broker 服务进程组成,虽然多个 Broker 可在同一服务器上进行部署,但为了高可用,会将不同的 Broker 部署在不同的机器上; Partition:分区,一组有序的消息序列,一个 Topic 可以有多个分区,同一 Topic 下的 Partition 可以分布在不同的 Broker 中。Producer 生产的每一条消息都会被放到一个 Partition 中,每条消息在 Partition 中的位置信息由一个 Offset(偏移量)数据表征。Kafka 通过偏移量(Offset)来保证消息在分区内的顺序性;","text":"趁着毕设初期,还能摸会儿🐟,了解波 Kafka。 Kafka 术语一览 Kafka,分布式消息引擎系统,主要功能是提供一套完备的消息发布与订阅解决方案。Kafka 也是一个分布式的、分区的、多副本的多订阅者,基于 Zookeeper 协调的分布式日志系统,可用于处理 Web 日志和消息服务。 Topic:主题,承载消息(Record)的逻辑容器,每条发布到 Kafka 集群的消息都归属于某一个 Topic,实际应用中,不同的 topic 对应着不同的业务; Broker:Kafka 服务进程,一个 Kafka 集群由多个 Broker 服务进程组成,虽然多个 Broker 可在同一服务器上进行部署,但为了高可用,会将不同的 Broker 部署在不同的机器上; Partition:分区,一组有序的消息序列,一个 Topic 可以有多个分区,同一 Topic 下的 Partition 可以分布在不同的 Broker 中。Producer 生产的每一条消息都会被放到一个 Partition 中,每条消息在 Partition 中的位置信息由一个 Offset(偏移量)数据表征。Kafka 通过偏移量(Offset)来保证消息在分区内的顺序性; Leader:每个 Partition 下可以配置多个 Replica(副本),Replica 由一个 Leader 和多个 Follower 组成,Leader 负责当前 Partition 消息的读写; Follower:用于同步 Leader 中的数据,数据冗余,Leader 失效时会从 Followers 中选取; Producer:生产者即数据的发布者。Producer 将消息发送给 Kafka 对应的 Topic 中,Broker 接收到消息后,会将消息存储到 Partition 中; Consumer:消费者,消费者可以消费多个 Topic 中的消息,一个 Topic 中的消息也可以被多个消费者消费; Consumer Group:消费者组,每一个消费者都会归属于某一个消费者组,如果未指定,则取默认的 Group; Consumer Offset:消费者位移,用于表示消费者的消费进度; 与 Kafka 相关的几个问题: Kafka 实现高可用的手段Kafka 实现伸缩性的手段Zookeeper在Kafka中的作用Kafka如何实现消息的有序 Broker 分布式部署 备份机制(Replacation),把相同的数据拷贝到多台机器上。即 Kafka Replica,Leader Replica 提供数据的读写操作,Follower Replica 负责同步数据。 Partition 机制,一个 Topic 划分为多个 Partition,防止单台 Broker 机器无法容纳太多的数据,Partition 机制与 Replica 机制联系紧密,每个 Partition 可以有多个 Replica(1 Leader + N Followers)。 Zookeeper 可为分布式系统提供分布式配置服务、同步服务和命名注册服务。 Broker 注册; Topic 注册,Partition 与 Broker 信息的保存; 负载均衡服服务,Producer 与 Consumer 的负载均衡; 分区与消费者关系的管理; …等 源码解说zookeeper在kafka中的作用 从前文可知,Kafka 的消息存储在 Topic 中,一个 Topic 又可以划分为多个 Partition,多 Partition 时,Kafka 只能保证 Partition 内的消息有序(Offset保证有序),如需保证 Topic 消息的有序,那么只能使用单个Partition了。如果仍要使用多个 Partition,消息的分区写入策略应选择按键(Key)保存。 详细解析kafka之kafka分区和副本 通过 Go 体验一下 Kafka环境搭建既然只是玩一下,不如使用 Docker 搭建 Kafka 环境吧,“即用即焚”。 环境:Windows 10 Docker Desktop + WSL 这里通过 Docker-Compose 搭建个单机版的 kafka 集群,编排文件如下: 123456789101112131415161718192021222324252627282930313233343536version: '3.4'services: zoo1: container_name: zookeeper-one image: zookeeper:3.4.9 hostname: zoo1 ports: - "2181:2181" environment: ZOO_MY_ID: 1 ZOO_PORT: 2181 ZOO_SERVERS: server.1=zoo1:2888:3888 volumes: - ./zk-single-kafka-single/zoo1/data:/data - ./zk-single-kafka-single/zoo1/datalog:/datalog kafka1: container_name: kafka-one image: confluentinc/cp-kafka:5.3.1 hostname: kafka1 ports: - "9092:9092" environment: KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER_INTERNAL://kafka1:19092,LISTENER_DOCKER_EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER_INTERNAL:PLAINTEXT,LISTENER_DOCKER_EXTERNAL:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_DOCKER_INTERNAL KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181" KAFKA_BROKER_ID: 1 KAFKA_LOG4J_LOGGERS: "kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO" KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 volumes: - ./zk-single-kafka-single/kafka1/data:/var/lib/kafka/data depends_on: - zoo1 该编排文件来自:https://github.com/simplesteph/kafka-stack-docker-compose 的 zk-single-kafka-single.yml。使用 docker-compose up 启动容器。 编排文件中所使用到的镜像 confluentinc/cp-kafka:5.3.1 和 zookeeper:3.4.9 配置参考: https://hub.docker.com/_/zookeeper https://hub.docker.com/r/confluentinc/cp-kafka Kafka 和 Zookeeper 容器启动后,配合 IDEA 的两个插件 Kafkalytic 和 Zoolytic ,我们可以很方便的观察集群的情况: Cluster Management 通过 vscode 插件我们可以方便的对启动的容器进行管理(日志追踪、shell attach等): vscode docker plugin 通过 Kafka 自带的命令行工具可以查看 Topic:(先连接到 Kafka 容器:docker exec -it kafka-one bash) 12345root@kafka1:/# kafka-topics --describe --zookeeper zoo1:2181Topic:__confluent.support.metrics PartitionCount:1 ReplicationFactor:1 Configs:retention.ms=31536000000 Topic: __confluent.support.metrics Partition: 0 Leader: 1 Replicas: 1 Isr: 1Topic:__consumer_offsets PartitionCount:50 ReplicationFactor:1 Configs:s...... 使用 confluent-kafka-go 体验 KafkaGo 中有两个比较有名的 Go Client,即 kafka-go 和 confluent-kafka-go。我都不熟悉😂,但是前面编排时用到了 confluent 公司的 Kafka 镜像,所以这里选用 confluent-kafka-go 创建 Client。confluent-kafka-go 项目的 example 拿来即用。 1、创建 Go Module 1234mkdir go-kafka-democd go-kafka-demogo mod init github.com/yeshan333/go-kafka-demogo get -u github.com/confluentinc/confluent-kafka-go 2、创建 Consumer。这个 Consumer 订阅的 Topic 为 myTopic。 1234567891011121314151617181920212223242526272829303132333435// kafka_consumer.gopackage mainimport ( "fmt" "github.com/confluentinc/confluent-kafka-go/kafka")func main() { c, err := kafka.NewConsumer(&kafka.ConfigMap{ "bootstrap.servers": "localhost", "group.id": "myGroup", "auto.offset.reset": "earliest", }) if err != nil { panic(err) } c.SubscribeTopics([]string{"myTopic", "^aRegex.*[Tt]opic"}, nil) for { msg, err := c.ReadMessage(-1) if err == nil { fmt.Printf("Message on %s: %s\\n", msg.TopicPartition, string(msg.Value)) } else { // The client will automatically try to recover from all errors. fmt.Printf("Consumer error: %v (%v)\\n", err, msg) } } c.Close()} 3、创建 Producer。这个 Producer 向 myTopic Topic 发送了 7 条消息。 1234567891011121314151617181920212223242526272829303132333435363738394041424344// kafka_producer.gopackage mainimport ( "fmt" "github.com/confluentinc/confluent-kafka-go/kafka")func main() { p, err := kafka.NewProducer(&kafka.ConfigMap{"bootstrap.servers": "localhost"}) if err != nil { panic(err) } defer p.Close() // Delivery report handler for produced messages go func() { for e := range p.Events() { switch ev := e.(type) { case *kafka.Message: if ev.TopicPartition.Error != nil { fmt.Printf("Delivery failed: %v\\n", ev.TopicPartition) } else { fmt.Printf("Delivered message to %v\\n", ev.TopicPartition) } } } }() // Produce messages to topic (asynchronously) topic := "myTopic" for _, word := range []string{"Welcome", "to", "the", "Confluent", "Kafka", "Golang", "client"} { p.Produce(&kafka.Message{ TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny}, Value: []byte(word), }, nil) } // Wait for message deliveries before shutting down p.Flush(15 * 1000)} 4、两个 terminal,先跑 Consumer,再跑 Producer。 1234# terminal 1go run kafka_consumer.go# ternimal 2go run kafka_producer.go run result 收工,其他东西后续慢慢啃。本文源文件:https://github.com/yeshan333/go-kafka-demo 参考 CONFLUENT-Kafka Go Client Apache Kafka Operations kafka-stack-docker-compose","categories":[{"name":"中间件","slug":"中间件","permalink":"https://yeshan333.github.io/categories/%E4%B8%AD%E9%97%B4%E4%BB%B6/"},{"name":"Kafka","slug":"中间件/Kafka","permalink":"https://yeshan333.github.io/categories/%E4%B8%AD%E9%97%B4%E4%BB%B6/Kafka/"}],"tags":[{"name":"Kafka","slug":"Kafka","permalink":"https://yeshan333.github.io/tags/Kafka/"},{"name":"消息引擎系统","slug":"消息引擎系统","permalink":"https://yeshan333.github.io/tags/%E6%B6%88%E6%81%AF%E5%BC%95%E6%93%8E%E7%B3%BB%E7%BB%9F/"},{"name":"流处理平台","slug":"流处理平台","permalink":"https://yeshan333.github.io/tags/%E6%B5%81%E5%A4%84%E7%90%86%E5%B9%B3%E5%8F%B0/"}]},{"title":"使用tcpdump和Wireshark看下TCP握手","slug":"使用tcpdump和wireshark看下TCP握手","date":"2020-11-15T15:52:13.000Z","updated":"2020-11-15T15:52:13.000Z","comments":true,"path":"2020/11/15/使用tcpdump和wireshark看下TCP握手/","permalink":"https://yeshan333.github.io/2020/11/15/%E4%BD%BF%E7%94%A8tcpdump%E5%92%8Cwireshark%E7%9C%8B%E4%B8%8BTCP%E6%8F%A1%E6%89%8B/","excerpt":"tcpdump 和 Wireshark 是最常用的网络抓包和分析工具,作为经常和网络打交道的划水选手,怎么能不了解下呢?补篇博文回顾下相关操作。这里以 example.com 的一次 GET 请求为例,先使用 tcpdump 抓个包,再使用 Wireshark 看下 TCP 的握手。 操作环境:WSL2(Ubuntu 20.04 LTS) + Windows 10","text":"tcpdump 和 Wireshark 是最常用的网络抓包和分析工具,作为经常和网络打交道的划水选手,怎么能不了解下呢?补篇博文回顾下相关操作。这里以 example.com 的一次 GET 请求为例,先使用 tcpdump 抓个包,再使用 Wireshark 看下 TCP 的握手。 操作环境:WSL2(Ubuntu 20.04 LTS) + Windows 10 用 tcpdump 抓个包先在 WSL2 Ubuntu 安装下 tcpdump。 1234# 启动 wslwsl# 安装 tcpdumpapt-get install tcpdump 抓包需要使用两个终端,一个终端使用 curl 向 example.com 发送请求,一个用于 packets 的抓取。OK,抓包开始: 1、一个终端使用 tcpdump 监听 example.com。 12# terminal 1,监听 example.com 的网络包tcpdump -nn host example.com -w web.pcap 2、另一个终端使用 curl 发送网络请求。 12# terminal 2,发送网络请求curl example.com 请求发送完毕后,Ctrl + C 终止终端 1 的监听,将抓取结果 wep.pcap 拷贝到 Windows 10 桌面。 1mv web.pcap /mnt/c/Users/yeshan/Desktop/web.pcap 拿 Wireshark 看下包由于 tcpdump 的输出格式并不直观,所以之前将抓取结果写入到 web.pcap。然后这里使用有图形化界面的 Wireshark 去看下刚刚抓下来的网络包 web.pcap。 下载安装 Wireshark:https://www.wireshark.org/download.html 1、使用 Wireshark 打开 web.pcap。 2、使用 Wireshark 的统计工具可以看到 TCP 握手的流程。分析->流量图 123# 确定 example.com ip$ dig +short example.com93.184.216.34 完美,可以看到经典的 TCP 握手过程。「TCP三次握手,四次挥手:」 很香的是 Wireshark 提供了许多示例网络包『SampleCaptures 』,计网学习新世界?","categories":[{"name":"计算机网络","slug":"计算机网络","permalink":"https://yeshan333.github.io/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"}],"tags":[{"name":"Wireshark","slug":"Wireshark","permalink":"https://yeshan333.github.io/tags/Wireshark/"},{"name":"计算机网路","slug":"计算机网路","permalink":"https://yeshan333.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E8%B7%AF/"},{"name":"TCP","slug":"TCP","permalink":"https://yeshan333.github.io/tags/TCP/"},{"name":"tcpdump","slug":"tcpdump","permalink":"https://yeshan333.github.io/tags/tcpdump/"}]},{"title":"浅解shallow copy、deep copy","slug":"浅解shallow copy、deep copy","date":"2020-10-09T23:04:04.000Z","updated":"2020-10-09T23:04:04.000Z","comments":true,"path":"2020/10/09/浅解shallow copy、deep copy/","permalink":"https://yeshan333.github.io/2020/10/09/%E6%B5%85%E8%A7%A3shallow%20copy%E3%80%81deep%20copy/","excerpt":"“回👋掏”。最近做东西,有点儿玩不转复杂数据类型,写篇博文再回顾下深、浅拷贝相关知识。深、浅的区分主要在对复杂数据类型进行操作的时候。 By the way:时间过得很快,十月了,之前定了个小目标:一个月至少一篇文章产出。2020年的 $ \\frac{5}{6} $ 已经过去。很庆幸自己坚持了下来,学到了不少东西。实习期间其实有不少的文章主题的想法,但真正想动手写篇博文的时候,发现事情并没有想想中的那么简单,一个主题涉及到的知识点还是蛮多的,再加上实践经验的不足,有些东西很难写道点上,copy & paste 总是不太好的『努力提高文章质量,hhh~』。希望自己后续继续加油。","text":"“回👋掏”。最近做东西,有点儿玩不转复杂数据类型,写篇博文再回顾下深、浅拷贝相关知识。深、浅的区分主要在对复杂数据类型进行操作的时候。 By the way:时间过得很快,十月了,之前定了个小目标:一个月至少一篇文章产出。2020年的 $ \\frac{5}{6} $ 已经过去。很庆幸自己坚持了下来,学到了不少东西。实习期间其实有不少的文章主题的想法,但真正想动手写篇博文的时候,发现事情并没有想想中的那么简单,一个主题涉及到的知识点还是蛮多的,再加上实践经验的不足,有些东西很难写道点上,copy & paste 总是不太好的『努力提高文章质量,hhh~』。希望自己后续继续加油。 浅拷贝(shallow copy) 浅拷贝总结:新对象内容为原对象内第一层对象的引用。 Python 中的浅拷贝关键点就在于这第一层对象。让我们先看看 Python 中的浅拷贝。 先看看不含嵌套元素的情形: 12345678910111213141516l1 = [1, 2, 3]# 直接赋值,使用 is 比较地址l2 = l1print(l1 is l2) # True# 使用构造器l3 = list(l1)print(l1 is l3) # False# 切片l4 = l1[:]print(l1 is l4) # Falseprint(id(l1), id(l2), id(l3), id(l4)) # 查看内存地址# 2124445454144 2124445454144 2124445477568 2124445029248 含嵌套元素的情形: 12345678910111213141516171819202122232425262728293031l1 = [1, [2,3], 4]# 直接赋值l2 = l1# 构造器l3 = list(l1)# 切片l4 = l1[:]for first, second, third, fourth in zip(l1, l2, l3, l4): # 查看每层对象的地址 print("value", first, "address:", id(first), id(second), id(third), id(fourth))# value 1 address: 140729744430752 140729744430752 140729744430752 140729744430752# value [2, 3] address: 1924217248768 1924217248768 1924217248768 1924217248768# value 4 address: 140729744430848 140729744430848 140729744430848 140729744430848l4[1].append("new")print(l1) # [1, [2, 3, 'new'], 4]print(l2) # [1, [2, 3, 'new'], 4]print(l3) # [1, [2, 3, 'new'], 4]print(l4) # [1, [2, 3, 'new'], 4]for first, second, third, fourth in zip(l1, l2, l3, l4): # 查看每层对象的地址 print("value", first, "address:", id(first), id(second), id(third), id(fourth))# value 1 address: 140729744430752 140729744430752 140729744430752 140729744430752# value [2, 3, 'new'] address: 1639298767872 1639298767872 1639298767872 1639298767872# value 4 address: 140729744430848 140729744430848 140729744430848 140729744430848 从上面的示例可以看到,Python中切片操作、工厂函数和=操作均是浅拷贝,只拷贝了原对象的第一层对象的引用,对第一层对象的操作会影响到其它对元对象进行浅拷贝的对象。但=操作和切片、构造器(工厂函数)不同的是,=操作不会创建新的对象。 值得注意的是,Python 中 tuple 的 tuple() 和切片操作和=进行的拷贝一样,不会创建新的对象。字典的浅拷贝可以使用 dict.copy()。 JS 中的浅拷贝让我们再来看看 JS 中的浅拷贝操作。 老规矩,先看看简单对象: 123456789101112131415161718192021let obj1 = { a: 1, b: 2};// 赋值let obj2 = obj1; // { a: 1, b: 2 }// Object.assignlet obj3 = Object.assign({}, obj1); // { a: 1, b: 2 }console.log(obj3)// spreadlet obj4 = {...obj1}; // // { a: 1, b: 2 }obj2.a = "new";// { a: 'new', b: 2 } { a: 'new', b: 2 } { a: 1, b: 2 } { a: 1, b: 2 }console.log(obj1, obj2, obj3, obj4) 再看下复杂对象: 1234567891011121314151617181920212223let obj1 = { a: { b: 1, c: 2 }, d: 3};// 直接赋值let obj2 = obj1; // { a: { b: 1, c: 2 }, d: 3 }// Object.assignlet obj3 = Object.assign({}, obj1); // { a: { b: 1, c: 2 }, d: 3 }// Object Spreadlet obj4 = {...obj1}; // { a: { b: 1, c: 2 }, d: 3 }obj2.a.b = "new";console.log(obj1); // { a: { b: 'new', c: 2 }, d: 3 }console.log(obj2); // { a: { b: 'new', c: 2 }, d: 3 }console.log(obj3); // { a: { b: 'new', c: 2 }, d: 3 }console.log(obj4); // { a: { b: 'new', c: 2 }, d: 3 } 可以看到,JS 对象的=操作、Object.assign({}, originObject) 和对象扩展运算均是浅拷贝。但是 Object.assign和对象的扩展运算对只有一层的对象进行的是深拷贝。此外 JS 数组「array 也是 object」的 map、reduce、filter、slice 等方法对嵌套数组进行的也是浅拷贝操作。 可以明显的看到,JS 和 Python 中的浅拷贝拷贝的均是第一层对象的引用。 深拷贝(deep copy) 深拷贝总结:创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。 Python 中的深拷贝在 Python 中实现复杂对象的拷贝可以通过标准库copy 提供的 copy.deepcopy 实现,此外 copy 模块还提供了 copy.copy 进行对象的浅拷贝。 看下深拷贝的情况: 12345678import copyl1 = [1, [2, 3], 4]l2 = copy.deepcopy(l1)l2[1].append("new")print(l1) # [1, [2, 3], 4]print(l2) # [1, [2, 3, 'new'], 4] 可以看到,有别于浅拷贝,对深拷贝 l1 的新对象 l2 的子元素增加新元素,并不会影响到 l1。 JS 中的深拷贝在 JS 中进行复杂对象的深拷贝,可以使用 JSON.stringify 先将 JS 对象转成 JSON 再转 JS 对象,如下: 123456789101112131415let obj1 = { a: { b: 1, c: 2 }, d: 3};let obj2 = JSON.parse(JSON.stringify(obj1));obj2.a.b = "new";console.log(obj1); // { a: { b: 1, c: 2 }, d: 3 }console.log(obj2); // { a: { b: 'new', c: 2 }, d: 3 } 可以看到,深拷贝后对新对象深层次对象的更改不会使原对象发生变更。 手动实现深拷贝操作在某些情况下需要我们实现深拷贝操作,比如对自定义数据类型进行深拷贝。前面 JS 所述使用 JSON 进行的深拷贝方法仍有缺陷,比如:会忽略 undefined、会忽略 symbol、不能序列化函数、不能解决循环引用的对象。这时候就需要了解波深拷贝的实现了。 从前面所述可知,深拷贝与浅拷贝的区别主要在于 copy 的层次,浅拷贝 copy 的是第一层对象的引用,深拷贝需要 copy 深层次对象。So,以 deepcopy 层次 Object 为例子,要实现真正的深拷贝操作则需要通过遍历键来赋值对应的值,这个过程中如果遇到 Object 类型还需要再次进行遍历「同样的方法」。递归无疑了。来看波实现: 1234567891011121314151617181920212223242526function deepclone(obj) { let map = new WeakMap(); // 解决循环引用 function deep(data) { let result = {}; // 支持 Symbol 类型的属性 const keys = [...Object.getOwnPropertyNames(data), ...Object.getOwnPropertySymbols(data)] if (!keys.length) return data; const exist = map.get(data); if (exist) return exist; map.set(data, result); keys.forEach(key => { let item = data[key]; if (typeof item === 'object' && item) { result[key] = deep(item); } else { result[key] = item; } }) return result; } return deep(obj);} OK,再看些 Python 的 copy.deepcopy 的实现: 1234567891011121314def deepcopy(x, memo=None, _nil=[]): """Deep copy operation on arbitrary Python objects. See the module's __doc__ string for more info. """ if memo is None: memo = {} d = id(x) # 查询被拷贝对象x的id y = memo.get(d, _nil) # 查询字典里是否已经存储了该对象 if y is not _nil: return y # 如果字典里已经存储了将要拷贝的对象,则直接返回 ... emm…,实现思想也是使用递归,同时借助了 memo (备忘录)解决对象的循环引用问题,避免 StackOverflow。 参考 Object Spread Initializer Python copy.deepcopy JS Symbol 关于 JavaScript 的数据类型,你知多少? Python对象的比较、拷贝","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"},{"name":"JavaScript","slug":"JavaScript","permalink":"https://yeshan333.github.io/categories/JavaScript/"}],"tags":[{"name":"深拷贝与浅拷贝","slug":"深拷贝与浅拷贝","permalink":"https://yeshan333.github.io/tags/%E6%B7%B1%E6%8B%B7%E8%B4%9D%E4%B8%8E%E6%B5%85%E6%8B%B7%E8%B4%9D/"}]},{"title":"负载均衡技术小记","slug":"负载均衡技术小记","date":"2020-09-20T18:25:06.000Z","updated":"2020-09-20T18:25:06.000Z","comments":true,"path":"2020/09/20/负载均衡技术小记/","permalink":"https://yeshan333.github.io/2020/09/20/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E6%8A%80%E6%9C%AF%E5%B0%8F%E8%AE%B0/","excerpt":"OSI 模型 常见 OSI 模型负载均衡方案 2 层负载均衡:一般是用虚拟 MAC 地址方式,外部对虚拟 MAC 地址请求,负载均衡器接收后分配后端实际的 MAC 地址响应。 3 层负载均衡:一般采用虚拟 IP 地址方式,外部对虚拟的 IP 地址请求,负载均衡器接收后分配后端实际的 IP 地址响应。","text":"OSI 模型 常见 OSI 模型负载均衡方案 2 层负载均衡:一般是用虚拟 MAC 地址方式,外部对虚拟 MAC 地址请求,负载均衡器接收后分配后端实际的 MAC 地址响应。 3 层负载均衡:一般采用虚拟 IP 地址方式,外部对虚拟的 IP 地址请求,负载均衡器接收后分配后端实际的 IP 地址响应。 4 层负载均衡:基于 IP + 端口的负载均衡方案,对应于 OSI 七层模型的第四层。基于传输层的底层负载均衡方案,可以实现 TCP 连接层的会话保持。 7 层负载均衡:即应用层的负载均衡。7 层的负载均衡更加针对特定的应用协议。基于 HTTP 应用的负载均衡可以实现对 URL 的转发应用、HTTP 请求的处理、session 信息会话保持等等。 4 层与 7 层负载均衡 4 层的负载均衡更偏向底层能力的转发,相对于 7 层负载均衡,负载性能更好。7 层负载均衡能做更细微粒度的负载决策。常见负载均衡器(Load Balancer):F5:硬件负载均衡器;LVS:基于IP层和基于内容请求分发的负载均衡器;Nginx:轻量级负载均衡器,TCP/UDP、HTTP 负载均衡支持;HAProxy:支持 TCP/HTTP 的负载均衡; 常见负载均衡算法 轮询(Round Robin) 将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。 加权轮询(Weighted Round Robin) 根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。自动问询真实服务器的负载情况,并动态地调整其权值。 目标地址散列(Destination Hashing) “目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。 源地址散列(Source Hashing) “源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。 最少链接(Least Connections) 将请求分配到连接数最少的服务器上(目前处理请求最少的服务器)。根据服务器当前的请求处理情况,动态分配. 加权最少链接(Weighted Least Connections) 在集群系统中的服务器性能差异较大的情况下,负载均衡器采用”加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。负载均衡器可以自动问询真实服务器的负载情况,并动态地调整其权值。 随机法、加权随机(Random) 通过系统随机函数,根据后台服务器列表的大小值来随机选取其中一台进行访问。由概率概率统计理论可以得知,随着调用量的增大,其实际效果越来越接近于平均分配流量到后台的每一台服务器,也就是轮询法的效果。 加权随机法跟加权轮询法类似,根据后台服务器不同的配置和负载情况,配置不同的权重。不同的是,它是按照权重来随机选取服务器的,而非顺序。 参考 What Is Layer 7 Load Balancing? 常见负载均衡算法","categories":[{"name":"计算机网络","slug":"计算机网络","permalink":"https://yeshan333.github.io/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"}],"tags":[{"name":"Load Balance","slug":"Load-Balance","permalink":"https://yeshan333.github.io/tags/Load-Balance/"}]},{"title":"setTimeout 是到了xx ms 就执行吗,了解浏览器的 Event-Loop 机制","slug":"setTimeout是到了xx ms 就执行吗,了解 Event-Loop 机制","date":"2020-08-22T13:42:41.000Z","updated":"2020-08-22T13:42:41.000Z","comments":true,"path":"2020/08/22/setTimeout是到了xx ms 就执行吗,了解 Event-Loop 机制/","permalink":"https://yeshan333.github.io/2020/08/22/setTimeout%E6%98%AF%E5%88%B0%E4%BA%86xx%20ms%20%E5%B0%B1%E6%89%A7%E8%A1%8C%E5%90%97%EF%BC%8C%E4%BA%86%E8%A7%A3%20Event-Loop%20%E6%9C%BA%E5%88%B6/","excerpt":"要想 JavaScript 玩得溜,还得了解波 JavaScript 执行机制/(ㄒoㄒ)/~~。 前言最近看了波 JavaScript 相关的文章,不得不说,JavaScript 我还真没玩明白(给我哭~。。。😅)。也挺久没写文了,实习(“摸🐟”)之余小记一波。 回顾一句话:JavaScript 是一门单线程、非阻塞、异步、解释性脚本语言。 本文的标题是:setTimeout 是到了xx ms 就执行吗,了解 Event-Loop 机制。先回答波:不是。 来看下网上的一段经典 js 代码在浏览器中「Microsoft Edge 84.0.522.63(64位)」的执行结果。 12345678910console.log('script start');setTimeout(() => { console.log('setTimeout');},0);Promise.resolve().then(() => { console.log('promise1');}).then(() =>{ console.log("promise2");});console.log('script end');","text":"要想 JavaScript 玩得溜,还得了解波 JavaScript 执行机制/(ㄒoㄒ)/~~。 前言最近看了波 JavaScript 相关的文章,不得不说,JavaScript 我还真没玩明白(给我哭~。。。😅)。也挺久没写文了,实习(“摸🐟”)之余小记一波。 回顾一句话:JavaScript 是一门单线程、非阻塞、异步、解释性脚本语言。 本文的标题是:setTimeout 是到了xx ms 就执行吗,了解 Event-Loop 机制。先回答波:不是。 来看下网上的一段经典 js 代码在浏览器中「Microsoft Edge 84.0.522.63(64位)」的执行结果。 12345678910console.log('script start');setTimeout(() => { console.log('setTimeout');},0);Promise.resolve().then(() => { console.log('promise1');}).then(() =>{ console.log("promise2");});console.log('script end'); 可以明显看到 setTimeout 的 callback 并非在 0 ms 后立即执行。那么,这是问什么?要了解原因,需要了解后续介绍的 Event Loop 机制。 概念一览 浏览器的内核-多线程的渲染进程:页面的渲染、js 的执行、事件的循环都在渲染进程中进行。渲染进程主要包含以下几个线程: JS内核中的线程 Task:Task 有 MicroTask 和 MacroTask 之分,MicroTask 在 Promise 出现之后引入。MacroTask 和 MicroTask 分别在以下几种场景形成: MacroTask:主代码块、setTimeout、setInterval、IO 事件等。 MicroTask:Promise、process.nextTick 等。 浏览器中的Event Loop有了基础概念,让我们来了解一下文章开头给出的代码是怎么执行的,代码如下: 12345678910console.log('script start');setTimeout(() => { console.log('setTimeout');},0);Promise.resolve().then(() => { console.log('promise1');}).then(() =>{ console.log("promise2");});console.log('script end'); 1、首先,整个代码块作为第一个 MacroTask 被执行,同步的代码直接被压入执行栈被执行「同步任务在JS引擎线程上执行」,script start 和 script end 被打印; 2、setTimeout 被作为 MacroTask 处理,加入宏任务队列中; 3、Promise 被作为 MicroTask 处理,加入微任务队列中; 4、本次 MacroTask 处理完毕,检查微任务队列,发现 promise then 的 callback,promise1,promise2 先后打印; 5、接下来执行下一个 MacroTask,即 setTimeout 推送给任务队列的 callback,打印 setTimeout。 so,代码执行结果如下: 12345script startscript endpromise1promise2setTimeout 由此,可大致了解到浏览器下 Event-Loop 执行机制大致如下: Event-Loop 执行机制 1、一开始,整段脚本被当作 MacroTask 执行2、执行过程中,同步代码进入可执行栈中直接执行,MacroTask 进入宏任务队列,MicroTask 进入微任务队列3、当前 MacroTask 执行完就出队,检查微任务队列,如果不为空,则依次执行微任务队列中的 MicroTask,直到微任务队列为空4、执行浏览器的 UI 线程的渲染工作「两个 MicroTask 执行空隙,有次 render 工作」6、执行队首的 MacroTask,回到 2,依此循环,直至宏任务队列和微任务队列都为空可通过下图简单理解一波: 由此可知道,setTimeout 中的 callback 不能按时执行是因为 Event-Loop,导致 JS 引擎线程还有其它的 task (promise MicroTask)要处理,主线程还未空闲下来。 参考 What the heck is the event loop anyway?「很精彩的演讲🐂」 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理 精读《Tasks, microtasks, queues and schedules》 😇原生JS灵魂之问(下) 【THE LAST TIME】彻底吃透 JavaScript 执行机制","categories":[{"name":"JavaScript","slug":"JavaScript","permalink":"https://yeshan333.github.io/categories/JavaScript/"}],"tags":[{"name":"Event-Loop","slug":"Event-Loop","permalink":"https://yeshan333.github.io/tags/Event-Loop/"},{"name":"JavaScript","slug":"JavaScript","permalink":"https://yeshan333.github.io/tags/JavaScript/"}]},{"title":"操作系统笔记-IPC 机制","slug":"Process-IPC","date":"2020-08-02T14:53:41.000Z","updated":"2020-08-02T14:53:41.000Z","comments":true,"path":"2020/08/02/Process-IPC/","permalink":"https://yeshan333.github.io/2020/08/02/Process-IPC/","excerpt":"进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法。 总览IPC","text":"进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法。 总览IPC 进程间通信的问题 竞态条件(race condition):多个进程对共享数据进行修改,影响程序的正确运行。在计算机内存或者存储里,如果同时发出读写大量数据的指令的时候竞态条件可能发生,机器试图覆盖相同的或者旧的数据,而此时旧的数据仍然在被读取。 临界区(critical section):对共享资源进行访问的程序片段。 进程的同步与互斥 进程的同步与互斥 进程的同步(Synchronization)是解决进程间协作关系(直接制约关系) 的手段。进程同步指两个以上进程基于某个条件来协调它们的活动。一个进程的执行依赖于另一个协作进程的消息或信号,当一个进程没有得到来自于另一个进程的消息或信号时则需等待,直到消息或信号到达才被唤醒。进程互斥关系是一种特殊的进程同步关系。在系统中多个进程因争用临界资源(Critical Resource)而互斥执行。 互斥设计互斥设计 参考 现代操作系统 Inter-process communication 进程间通信","categories":[{"name":"操作系统","slug":"操作系统","permalink":"https://yeshan333.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"}],"tags":[{"name":"进程通信","slug":"进程通信","permalink":"https://yeshan333.github.io/tags/%E8%BF%9B%E7%A8%8B%E9%80%9A%E4%BF%A1/"}]},{"title":"操作系统笔记-进/线程模型","slug":"操作系统进-线程模型","date":"2020-07-22T20:22:41.000Z","updated":"2020-07-22T20:22:41.000Z","comments":true,"path":"2020/07/22/操作系统进-线程模型/","permalink":"https://yeshan333.github.io/2020/07/22/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E8%BF%9B-%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8B/","excerpt":"模型是指对于某个实际问题或客观事物、规律进行抽象后的一种形式化表达方式。- MBA 智库百科 - 模型 概念梳理进程 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。 一个进程是某种类型活动的一个活动,它有程序、输入、输出以及状态。进程是对正在运行程序的一个抽象。单个处理器可以被若干进程共享,它使用某种调度算法决定何时停止一个进程的工作,并转而为另一个进程提供服务。一个程序可对应多个进程。 系统资源以进程为单位分配,如内存、文件、每个进程拥有独立的地址空间。","text":"模型是指对于某个实际问题或客观事物、规律进行抽象后的一种形式化表达方式。- MBA 智库百科 - 模型 概念梳理进程 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。 一个进程是某种类型活动的一个活动,它有程序、输入、输出以及状态。进程是对正在运行程序的一个抽象。单个处理器可以被若干进程共享,它使用某种调度算法决定何时停止一个进程的工作,并转而为另一个进程提供服务。一个程序可对应多个进程。 系统资源以进程为单位分配,如内存、文件、每个进程拥有独立的地址空间。 进程表进程表(process table),也称进程控制块(PCB),是由操作系统维护的,每个进程占用其中一个表项。该表项包含了操作系统对进程进行描述和控制的全部信息,从而保证该进程换出后再次启动时,就像从未中断过一样。 典型进程表表项的一些字段 segment 段定义( segment ) 是用来区分或者划分范围区域的意思。汇编语言的 segment 伪指令表示段定义的起始,ends 伪指令表示段定义的结束。段定义是一段连续的内存空间。ref:程序员需要了解的硬核知识之汇编语言(全) 进程控制原语 原语 原语:完成某种特定功能的一段程序,具有不可分割性或不可中断性。即原语的执行必须是连续的,在执行过程中不允许被中断。也就是满足原子性。原子性操作,一组相关操作要么全部执行不可中断,要么就不执行。 进程创建原语 进程撤消原语 阻塞原语 唤醒原语 挂起原语 激活原语 改变进程优先级 上下文切换从一个进程切换到另一个进程需要一定的时间进行管理处理,包括保存寄存器的值和内存映射,更新不同的表格和列表、清除和重新调入内存高速缓存等。 进程间切换(process switch)又称上下文切换(context switch),它是一个存储和重建 CPU 状态的机制,要交换 CPU 上的进程时,必需先行存储当前进程的状态,然后再将进程状态读回 CPU 中。进程不运行时,将寄存器的值保存在进程控制块PCB中;当操作系统要运行一个新的进程时,会将PCB中的相关值送到对应的寄存器中。 地址空间地址空间是内存中可供程序或进程使用的有效地址范围。也就是说,它是程序或进程可以访问的内存。存储器可以是物理的,也可以是虚拟的,用于执行指令和存储数据。 线程线程,是进程中的一个运行实体,是 CPU 调度的基本单位。线程的下文环境是程序计数器等寄存器。线程拥有自己独立的栈和共享的堆。 线程引入解决的问题 降低上下文切换开销,线程的创建、撤销花费时间少于进程 多线程充分利用多核 CPU 的计算能力「内核线程」,在线程粒度进行阻塞而不是进程 降低通信难度,同一进程内的线程共享内存和文件 进程和线程各自持有的资源进程和线程各自持有的资源 多道程序设计中的进程模型 多道程序设计:允许多个程序同时进入内存并运行,其目的是为了提高系统效率。 多道程序设计中的进程模型 图例「来自《现代操作系统》」中多道程序设计计算机的内存中有 4 道程序,这 4 道程序被抽象为各自拥有自己控制流程的进程(每道程序都拥有自己的逻辑计数器)。图 c ,在任何一给定瞬间仅有一个进程真正在运行,进程运行时会将自己的逻辑程序计数器装入实际的物理程序计数器中,进程结束或暂停执行时,物理程序计数器将被保存在内存中该进程的逻辑程序计数器中。 常见线程模型 用户线程和内核线程之分 用户线程,是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全由库函数在用户空间完成,不需要内核的帮助。因此这种线程是极其低消耗和高效的。但同一进程下创建的用户线程对 CPU 的竞争是以进程的维度参与的,这会导致该进程下的用户线程只能分时复用所属进程被分配的 CPU 时间片,所以无法很好的利用 CPU 多核运算的优势。一般情况下说的线程指的是用户线程。内核线程,由操作系统进行管理和调度,能够直接操作计算机的底层资源,线程切换时 CPU 需要切换到内核态。内核级线程可以很好利用多核 CPU 的并行计算额优势,开发人员可以通过系统调用的方式使用内核线程。 用户空间管理线程,整个线程包放在用户空间,内核对线程包一无所知,内核管理的还是进程 每个线程有用自己的线程表,线程在一个运行时系统上执行(运行时系统时一个管理线程的过程的集合,常用过程有 pthread_create、pthread_yield等) 优点: 保存线程状态的过程和调度程序都只是本地过程,效率比进行内核调用高 线程切换不需要内核特权,线程调度非常快捷,调度算法可由应用程序特定 缺点 大多数系统调用都是阻塞的,我们需要避免被阻塞线程影响其他线程,此时阻塞系统调用如何实现? 内核只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上 用户空间管理线程 在内核空间管理线程 内核空间使用线程表记录所有的线程,线程的更新、线程创建、销毁通过系统调用实现 线程阻塞时,内核可选择运行处于就绪态的线程(同一个进程中的线程或其它进程中的线程) 问题: 多线程进程创建新的进程时会遇到到底是拥有与原进程相同数量的线程还是一个线程的问题 如果线程的创建、终止操作较为频繁,系统调用的开销还是不可忽视的 在内核空间实现线程 线程模型混合模型,即内核线程与用户线程间多路复用。 一个进程对应一个内核线程一个进程对应一个内核线程 此模型下(用户级线程模型),线程的创建、切换和同步等工作较为轻量与高效,依赖于编程语言实现。但同进程内的多线程无法很好的利用多核 CPU 优势,只能通过分时复用方式轮换执行。当进程内的任意线程阻塞,比如线程 A 请求 I/O 操作被阻塞,很可能导致整个进程范围内的阻塞,这是因为进程对应的内核线程因进程内的线程被阻塞而被剥夺 CPU 执行时间,导致整个进程丢失在 CPU 执行指令的机会。 进程中的每个线程都对应一个内核线程进程中的每个线程都对应一个内核线程 此模型下(内核级线程模型),线程的调度和管理由操作系统内核负责,每次上下文切换都会从用户态切换到内核态,会产生不小的资源消耗,用户空间创建的线程数量受限于操作系统内核可创建内核线程的数量。但此模型下,多线程可充分利用多核 CPU 的并行计算能力,因为每个线程可以独立地被操作系统调度分配到 CPU 上执行指令,某个线程的阻塞不会影响到进程内其他线程工作的执行。 两级线程模型此模型为用户级线程模型与内核级线程模型的混合,实现多个用户级线程与多个内核级线程的多路复用。此模型下,一个进程对应多个内核线程,有进程内的调度器决定进程内的线程如何与申请的内核线程对应。 两级线程模型 此线程模型可有效降低线程创建和管理的资源消耗,同时提供良好的并行能力。用户线程的调度和管理又进程的调度器负责,内核线程的调度和管理由操作系统负责。但此模型的线程的上下文信息的保存和恢复,栈空间的大小管理给开发人员带来的较大的技术挑战。 Go 中的 MPG 线程模型GO 语言的 MPG 线程模型基于两级线程模型进行了改造,提高了线程调度的灵活度。如图: MPG 线程模型 MPG 解释 M(Machine):一个 Machine 对应一个内核级线程,在 M 的生命周期内,它只会与一个内核线程进行绑定。P(Processor):一个 Processor 表示执行 Go 代码片段所需的上下文环境,在运行时一个 M 只能绑定一个 P,M 和 P 的组合为 G 提供运行环境。在单个 Go 语言进程中,P 的最大数量决定了程序的并发规模。G(Goroutine):Go 语言代码片段的封装(通常为一个方法,函数是 Go 的一等公民),一个待执行的任务,Go 协程。协程(coroutine),一种用户态轻量级线程,不同于之前所说的线程,协程实现的是非抢占式调度(即由当前协程切换到其他协程由当前协程决定),协程是语言级别的。「协作式调度」协程优缺点:coroutine协程详解Go 1.14 基于信号的抢占式调度实现原理 在实际运行过程中,M 和 P 的组合为 G 提供有效的运行环境,而多个可执行 G 将会顺序排成一个队列挂在某个 P 上面,等待调度和执行。M 和 P 会适时的组合和断开,以保证执行 G 队列能够得到及时运行。如下图: Goroutine 阻塞 上图右半部分,当 M 对应的内核线程被唤醒时,M 会尝试为 G0 捕获一个 P 上下文,可能是从空闲的 P 列表中获取,如果获取不成功,M 会把 G0 放入调度器的可执行 G 队列中,等待其他 P 的查找。 参考 现代操作系统 go1.14 基于信号的抢占式调度实现原理 Linux下的进程类别(内核线程、轻量级进程和用户进程) 操作系统原理-进程线程模型「进程状态转换模型」 Go 并发编程实战 coroutine协程详解","categories":[{"name":"Go","slug":"Go","permalink":"https://yeshan333.github.io/categories/Go/"},{"name":"操作系统","slug":"操作系统","permalink":"https://yeshan333.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"},{"name":"进/线程","slug":"操作系统/进-线程","permalink":"https://yeshan333.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E8%BF%9B-%E7%BA%BF%E7%A8%8B/"}],"tags":[{"name":"进程","slug":"进程","permalink":"https://yeshan333.github.io/tags/%E8%BF%9B%E7%A8%8B/"},{"name":"线程","slug":"线程","permalink":"https://yeshan333.github.io/tags/%E7%BA%BF%E7%A8%8B/"}]},{"title":"React Hooks 那些事儿","slug":"React-Hooks-那些事儿","date":"2020-07-08T14:33:31.000Z","updated":"2020-07-08T14:33:31.000Z","comments":true,"path":"2020/07/08/React-Hooks-那些事儿/","permalink":"https://yeshan333.github.io/2020/07/08/React-Hooks-%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF/","excerpt":"翻了波之前写的文章还有笔记,发现关于前端的文章并不多(好歹也划水做过点前端开发)。巧了,最近没什么好话题可写,做下 React Hooks 学习笔记吧。 Effect Hook不得不说 Hook 的出现降低了我们在 React 中处理副作用(side effect)的心智负担,通过 useEffect 就可以很好的完成之前需要使用几个生命周期函数配合才能完成的事。 Effect Hook 死循环请求问题由于 Effect Hook 不熟「官方文档没读透」,最近使用 useEffect 出现了异步请求发送了无限次的问题,翻🚗了。我有个组件大概是这么写的:","text":"翻了波之前写的文章还有笔记,发现关于前端的文章并不多(好歹也划水做过点前端开发)。巧了,最近没什么好话题可写,做下 React Hooks 学习笔记吧。 Effect Hook不得不说 Hook 的出现降低了我们在 React 中处理副作用(side effect)的心智负担,通过 useEffect 就可以很好的完成之前需要使用几个生命周期函数配合才能完成的事。 Effect Hook 死循环请求问题由于 Effect Hook 不熟「官方文档没读透」,最近使用 useEffect 出现了异步请求发送了无限次的问题,翻🚗了。我有个组件大概是这么写的: 12345678910111213141516171819202122232425262728293031323334353637383940import React, { useState, useEffect } from 'react';import request from 'umi-request';import logo from './logo.svg';import './App.css';function App() { const [data, setData] = useState([]); useEffect(() => { request('https://jsonplaceholder.typicode.com/todos/', { method: 'get', }) .then(response => { console.log('fetch data'); setData(response); }) .catch(error => { console.log("report error: ", error); }) }); return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <ul> {data.map(item => { return ( <li key={item.id}>{item.title}</li> ); })} </ul> </header> </div> );}export default App; 效果如下: 效果 https://zo2c2.csb.app/,可以很方便的从调试控制台看到,异步请求一直在发,陷入了死循环之中。这是为什么?因为 useEffect 会在组件 Mounting 和 Updating 阶段执行。每次 request 请求成功,我们都会设置一次组件的 state -> data,所以组件会更新,useEffect 会再次执行,循环往复,造成了无限重复请求问题。那么,如何解决这个问题?之前我忽略了 useEffect 第二个参数的存在,使用 useEffect 的第二个参数可以解决这个问题。一般情况下,我们希望组件只在 mounting 阶段异步获取数据,所以,我们可以这么设置 useEffect 的第二个参数,让它具有和 componentDidMount 生命周期函数类似的行为(组件第一次 mount 后执行): React 组件生命周期 来源:https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/ 123456789101112useEffect(() => { request('https://jsonplaceholder.typicode.com/todos/', { method: 'get', }) .then(response => { console.log('fetch data'); setData(response); }) .catch(error => { console.log("report error: ", error); })}, []); 我们传递了一个空数组作为 useEffect 的第二个参数,这样就能避免在组件 Updating 阶段执行 useEffect。这个数组成为依赖数组。依赖数组为空,表明 useEffect 不会因为某个变量的变化而再次执行。在组件需要根据某个变量变化进行渲染的时候,可以将此变量放到依赖数组中,一旦这个依赖的变量变动,useEffect 就会重新执行。 让组件卸载后做点事在 class 组件中,我们可以将组件卸载后要做的事放在 componentWillUnmount 中。引入 Hook 后,在 function 组件中,我们可以把组件卸载要做的事放在 useEffect 中,让它返回一个 callback 即可,如下: 1234567891011121314151617181920212223242526272829import React, { useState, useEffect } from "react";function Child({ visible }) { useEffect(() => { alert("组件已挂载"); return () => { // return 一个 callback alert("组件已被卸载!!"); }; }, []); return visible ? "true" : "false";}export default function App() { const [visible, changeVisible] = useState(true); return ( <div> {visible && <Child visible={visible} />} <button onClick={() => { changeVisible(!visible); }} > {visible ? "卸载组件" : "挂载组件"} </button> </div> );} effect 卸载组件做点事儿 参考 精读 useEffect 完全指南 useEffect 完整指南 useEffect 使用指南 How to fetch data with React Hooks? 看完这篇,你也能把 React Hooks 玩出花","categories":[{"name":"React","slug":"React","permalink":"https://yeshan333.github.io/categories/React/"}],"tags":[{"name":"React","slug":"React","permalink":"https://yeshan333.github.io/tags/React/"}]},{"title":"使用docker-compose编排前后端分离应用","slug":"使用docker-compose编排前后端分离应用","date":"2020-06-28T11:39:55.000Z","updated":"2020-06-28T11:39:55.000Z","comments":true,"path":"2020/06/28/使用docker-compose编排前后端分离应用/","permalink":"https://yeshan333.github.io/2020/06/28/%E4%BD%BF%E7%94%A8docker-compose%E7%BC%96%E6%8E%92%E5%89%8D%E5%90%8E%E7%AB%AF%E5%88%86%E7%A6%BB%E5%BA%94%E7%94%A8/","excerpt":"几个月过去了,是时候把当初的 🚩 干掉了。 顺便提高下 docker 的熟练度,得闲看下原理🚩(假期看过,没总结…)。 重装了波系统(Windows 2004 版本),这个版本下,Docker Desktop 是以 WSL2 为 backend 的,不用 Hyper -V 了,舒服了很多。 细品了下(又摸鱼搞 DevOps),跑这个前后端分离项目需要到的容器还挺多,4 个左右(后端 REST 服务、数据库服务、前端服务),前端服务上了两个容器『貌似没必要』,一个用来过渡,一个跑挂着 SPA 的 Nginx。 这次祭出了 Docker Compose,毕竟容器有点“小多”,单单用命令费劲。","text":"几个月过去了,是时候把当初的 🚩 干掉了。 顺便提高下 docker 的熟练度,得闲看下原理🚩(假期看过,没总结…)。 重装了波系统(Windows 2004 版本),这个版本下,Docker Desktop 是以 WSL2 为 backend 的,不用 Hyper -V 了,舒服了很多。 细品了下(又摸鱼搞 DevOps),跑这个前后端分离项目需要到的容器还挺多,4 个左右(后端 REST 服务、数据库服务、前端服务),前端服务上了两个容器『貌似没必要』,一个用来过渡,一个跑挂着 SPA 的 Nginx。 这次祭出了 Docker Compose,毕竟容器有点“小多”,单单用命令费劲。 Demo 实战 Demo 地址:https://github.com/yeshan333/Flask-React-ToDoList 123git clone https://github.com/yeshan333/Flask-React-ToDoListcd Flask-React-ToDoListgit checkout docker 1、先给后端服务写个 Dockerfile这个项目的后端服务是用 Flask 写的,Dockerfile 如下所示: 12345678910111213141516171819202122FROM python:3.8-alpineLABEL maintainer = "yeshan <yeshan1329441308@gmail.com>"EXPOSE 5000# Keeps Python from generating .pyc files in the containerENV PYTHONDONTWRITEBYTECODE 1# Turns off buffering for easier container loggingENV PYTHONUNBUFFERED 1# Install pip requirementsADD requirements.txt .RUN python -m pip install -r requirements.txtWORKDIR /appADD . /app# production web serverCMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]# CMD ["flask", "run", "--host", "0.0.0.0", "--port", "5000"] 生产环境下,Flask 自带的服务器不够骚,所以这里上 gunicorn。 2、再给前端 React-SPA 写个 Dockerfile前端使用 React 编写「想起初学那时候抽组件那叫一个痛苦」,Dockerfile 如下 12345678910111213141516171819FROM node:12.18-alpine as frontend-reactLABEL maintainer = "yeshan <yeshan1329441308@gmail.com>"ENV NODE_ENV productionWORKDIR /usr/src/appCOPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]RUN npm install && npm install -g serveCOPY . .RUN npm run buildEXPOSE 5000CMD ["serve", "-l", "tcp://0.0.0.0:5000", "-s", "build"] 原来想的是直接使用 react-script 自带的 HTTP 服务器的,前端应用也在容器跑,但是这个 HTTP 服务器不够骚,为了生产环境,还是上 Nginx 了。为了调试,使用 serve 套一下构建好的页面。 3、编写 docker-compose.yml 对容器进行编排接下来的编排文件才是大头,调试了半天『🤣连接 MongoDB😂』。这个 URI 连接字符串试了多种操作,比如:connection = MongoClient("mongodb://mongo:27017/")、connection = MongoClient("mongo:27017"),最后还是看文档解决的,这…,文档还是香的。 原来 compose v2 以上,使用 compose 进行编排时,会默认建立一个网络(bridge 类型),连接各个容器,主机名和容器名相同,后面指定了下container_name: flask_backend、container_name: mongo_database才在 flask_backend 容器 ping 通 MongoDB 服务。 文档原文如下: By default Compose sets up a single network for your app. Each container for a service joins the default network and is both reachable by other containers on that network, and discoverable by them at a hostname identical to the container name.🔗 OK,看下这个小 demo 的编排文件: 12345678910111213141516171819202122232425262728293031323334353637383940414243version: '3.4'services: backend: container_name: flask_backend image: backend build: context: ./backend dockerfile: Dockerfile ports: - "5000:5000" depends_on: - database database: container_name: mongo_database image: mongo volumes: - data:/data/db frontend: container_name: frontend-react image: frontend build: context: ./frontend dockerfile: Dockerfile volumes: - static:/usr/src/app/build ports: - "3000:5000" nginx: container_name: webserver-nginx image: nginx:latest ports: - "80:80" volumes: - static:/usr/share/nginx/html command: "/bin/bash -c "nginx -g 'daemon off;'"volumes: data: static: 可以明显的看到,之前为前端 SPA 创建的容器只是为了做下过渡「通过 static volumn 进行过渡」。最终的应用还是挂在 Nginx 上的。通过 volume 做下持久存储。 最后,跑下试试,看看效果如何。 1docker-compose up -d 12# 初始化数据库docker exec -i flask_backend flask create-database 开始编排容器创建的网络与卷效果 收工,下一步就是做下服务抽离,部署到云原生的操作系统上-Kubernetes!🚩 参考 Compose file version 3 reference Networking in Compose Python in a container docker-practice npm serve 使用 Docker 部署 NodeJS + MongoDB 项目 Docker Nginx 部署 React","categories":[{"name":"docker","slug":"docker","permalink":"https://yeshan333.github.io/categories/docker/"}],"tags":[{"name":"docker","slug":"docker","permalink":"https://yeshan333.github.io/tags/docker/"},{"name":"DevOps","slug":"DevOps","permalink":"https://yeshan333.github.io/tags/DevOps/"},{"name":"服务编排","slug":"服务编排","permalink":"https://yeshan333.github.io/tags/%E6%9C%8D%E5%8A%A1%E7%BC%96%E6%8E%92/"}]},{"title":"给 GitHub commit 加个小绿标","slug":"给 GitHub commit 加个小绿标","date":"2020-06-26T19:11:12.000Z","updated":"2020-06-26T19:11:12.000Z","comments":true,"path":"2020/06/26/给 GitHub commit 加个小绿标/","permalink":"https://yeshan333.github.io/2020/06/26/%E7%BB%99%20GitHub%20commit%20%E5%8A%A0%E4%B8%AA%E5%B0%8F%E7%BB%BF%E6%A0%87/","excerpt":"最近一波重装系统啥都没了,最常用的 Git 配置肯定得安排回来的。记得之前给 git 的 commit 加了个签名,回想下为什么要给 commit 做下签名?因为它能让 GitHub 的 commit 历史更帅?看下加签名之前是怎么样的: 对commit进行签名前","text":"最近一波重装系统啥都没了,最常用的 Git 配置肯定得安排回来的。记得之前给 git 的 commit 加了个签名,回想下为什么要给 commit 做下签名?因为它能让 GitHub 的 commit 历史更帅?看下加签名之前是怎么样的: 对commit进行签名前 再看下对 commit 签名后是怎么样的: 对commit进行签名后 这么一对比,是更帅了!但我好像不是因为这的才做的。我是为了更好的去混开源项目做的,这个绿标能更好的证明我的身份!!!(假装我很专业,2333~)。使用过 Git 的同学应该都晓得,我们的提交作者信息是可以自己设置的(这意味着我们可以使用他人身份信息),如下: 12$ git config user.name "tester"$ git config user.email "gg@qq.com" 冒用作者信息 我们可以看到,是可以 push 到 GitHub 的[没有小绿标而已]。这看起来就不太好,得让 GitHub 证明下自己得身份才行,从官方文档可以看到, GitHub 提供了一种使用 GPG 的方式可以让我们的 commit “戴”上小绿标。 忘了当初是怎么操作的了,在 Windows 下操作貌似还挺麻烦的,趁此捋一下过程,趁机水篇文章。 GNU Privacy Guard(GnuPG或GPG)是一个密码学软件,用于加密、签名通信内容及管理非对称密码学的密钥。 生成 GPG 密钥对第一步肯定就是通过 GPG 生成密钥对了。这时候需要到一个 GnuPG 软件,OK,去下载:🔐GnuPG。其实 Git fot windows 自带一个 gpg 命令行程序,但是命令行用多了,还是上 GUI 愉快点吧,我们选择使用带 GUI 的 Gpg4win🔗。 我们通过全家桶软件之 Kleopatra 新建立一对密钥,名字为 GitHub 用户名,邮箱为 GitHub 的注册邮箱(使用 4096 bits的密钥): 设置 passphrase (通行口令)来保护我们的密钥对,每次签名都会用它到。(也可以不设置,不用口令验证就可以直接使用密钥) 好了,密钥对生成完毕。下一步,就是把把公钥放到 GitHub 上,让 GitHub 对我们的提交进行验证,判断是否该给 commit “戴”上小绿标。[获取公钥:鼠标右键->细节->导出]、[GitHub 添加公钥:Settings->SSH and GPG keys]。 下一步就是开启 Git 提交签名。 启用 Git 提交签名首先,我们需要让 Git 知道 gpg 的可执行程序在哪里?gpg 的可执行程序位于Gpg4win🔗同级目录下的GnuPG/bin中(GnuPG 是 Gpg4win 组件之一),我们需要进行如下配置: 1$ git config --global gpg.program <path_to_gpg> 我的设置如下: 1234$ where gpgE:\\Git\\usr\\bin\\gpg.exe # 这个是 Git for windows 自带的E:\\GnuPG\\bin\\gpg.exe # 这个才是我们要用的$ git config --global gpg.program "E:\\GnuPG\\bin\\gpg.exe" 然后每次git commit时,加上-S即可启用签名。 每次都要多打个参数多麻烦,我们通过如下配置让 Git 默认启用 GPG 签名: 1$ git config --global commit.gpgsign true 最后我们git push一下看看有没有效果。https://github.com/yeshan333/anonymous-git-commit/commits/master 没问题,收工了。我的 Git 全局配置如下: 12345678$ cat ~/.gitconfig[user] name = yeshan333 email = 1329441308@qq.com[gpg] program = E:\\\\GnuPG\\\\bin\\\\gpg.exe[commit] gpgsign = true 参考 GunPG GitHub - Signing commits 给你的 Git commit 加上绿勾 - 一个简单但很多人没注意的细节","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"GPG","slug":"GPG","permalink":"https://yeshan333.github.io/tags/GPG/"},{"name":"加密","slug":"加密","permalink":"https://yeshan333.github.io/tags/%E5%8A%A0%E5%AF%86/"},{"name":"隐私","slug":"隐私","permalink":"https://yeshan333.github.io/tags/%E9%9A%90%E7%A7%81/"}]},{"title":"将 Web 应用丢给守护进程","slug":"将Web应用丢给守护进程","date":"2020-06-21T14:26:36.000Z","updated":"2020-06-21T14:26:36.000Z","comments":true,"path":"2020/06/21/将Web应用丢给守护进程/","permalink":"https://yeshan333.github.io/2020/06/21/%E5%B0%86Web%E5%BA%94%E7%94%A8%E4%B8%A2%E7%BB%99%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B/","excerpt":"最近老是要把 Web App/Service 部署在个人的服务器上进行测试,发现自己不怎么熟悉「前提:不上 docker ,逃~」,特写此文章来纪念下🤔👀(之前部署的 Web App/Service 都是丢给 Heroku、Netlify、GitHub 这样的 PaaS 平台运行,写个配置文件「action、yaml、toml」就完事了。自己整的玩意儿丢在自己服务器上跑的并不算多,今天费点劲,了解点基础设施。根据冰山模型,了解下 FaaS 能更好的了解 PaaS)。","text":"最近老是要把 Web App/Service 部署在个人的服务器上进行测试,发现自己不怎么熟悉「前提:不上 docker ,逃~」,特写此文章来纪念下🤔👀(之前部署的 Web App/Service 都是丢给 Heroku、Netlify、GitHub 这样的 PaaS 平台运行,写个配置文件「action、yaml、toml」就完事了。自己整的玩意儿丢在自己服务器上跑的并不算多,今天费点劲,了解点基础设施。根据冰山模型,了解下 FaaS 能更好的了解 PaaS)。 冰山的底部-基础在把 Web 应用丢给守护(daemon)进程前,应该了解部分基础概念。 守护进程是在后台运行不受终端控制的进程(如输入、输出等)。 插入个场景,我们之前在开发环境下,是如何运行 Web 服务的?对于 Spring Boot,我们可以在终端使用 mvn spring-boot:run 在前台跑 Web 服务;对于 React 前端应用,我们可以使用 npm script 即 npm start 启动前端 HTTP 服务器进行 view 层预览。问题来了,这样操作,服务进程是跑在前台的(所谓的前台任务/进程),当我们退出操作终端或者手动终止时,这些服务也就不能用了,而且前台任务独占了一个终端,使得我们不能再在此终端执行其他命令。在生产环境下,我们要让服务持久运行,这种情况明显不是我们想看到的,那么,如何解决这个问题? 所谓的前台任务是我们可以直接看得到的。 在了解如何解决问题前,我觉得有必要了解下为什么前台任务会随着 session 的退出而退出(收到了 SIGHUP)。Linux 系统对此的设计如下: 12341、用户准备退出 session2、系统向该 session 发出SIGHUP信号3、session 将SIGHUP信号发给所有子进程4、子进程收到SIGHUP信号后,自动退出 SIGHUP 是什么 SIGHUP(signal hang up) 信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一 session 内的各个作业, 这时它们与控制终端不再关联. 系统对 SIGHUP 信号的默认处理是终止收到该信号的进程。查看维基百科:Unix 信号 什么是进程组 进程组是一系列相互关联的进程集合,系统中的每一个进程必须从属于某一个进程组;每个进程组中都会有一个唯一的 ID(process group id),简称 PGID;PGID 一般等同于进程组的创建进程的 Process ID,而这个进程一般也会被称为进程组先导(process group leader),同一进程组中除了进程组先导外的其他进程都是其子进程;进程组的存在,方便了系统对多个相关进程执行某些统一的操作,例如,我们可以一次性发送一个信号量给同一进程组中的所有进程。 什么是 session 会话(session)是一个若干进程组的集合,同样的,系统中每一个进程组也都必须从属于某一个会话;一个会话只拥有最多一个控制终端(也可以没有),该终端为会话中所有进程组中的进程所共用。一个会话中前台进程组只会有一个,只有其中的进程才可以和控制终端进行交互;除了前台进程组外的进程组,都是后台进程组;和进程组先导类似,会话中也有会话先导(session leader)的概念,用来表示建立起到控制终端连接的进程。在拥有控制终端的会话中,session leader 也被称为控制进程(controlling process),一般来说控制进程也就是登入系统的 shell 进程(login shell); OK,回到我们的问题,如何让任务持久运行、不影响其他操作。这时,后台进程就该登场了,将任务丢在后台执行。一个任务要丢给守护进程的第一步就是要将他变为后台进程。变为后台进程后,一个进程是否就成为了守护进程呢?或者说,用户退出 session 以后,后台进程是否还会继续执行?答案是未必。看完后面就明白了。 冰山的上层-应用Linux 提供了很多种方法让我们将前台进程变为后台进程,挑几种介绍下。 将前台进程变为后台进程的几种方式位与运算符-&通过在命令的尾部加个符号&即可将进程启动为后台进程,后台进程的特点如下: 后台进程特点 1、继承当前 session (对话)的标准输出(stdout)和标准错误(stderr)。因此,后台任务的所有输出依然会同步地在命令行下显示。2、不再继承当前 session 的标准输入(stdin)。你无法向这个任务输入指令了。如果它试图读取标准输入,就会暂停执行(halt)。这个特点使得我们可以执行其他命令。 我们可以运行一个 FastAPI 编写的 Web 服务观察下。 1uvicorn main:app --reload & 可以很明显的看到,后台进程继承了当前 session (对话)的标准输出(stdout)。我们知道进程收到 SIGHUP 信号会被终止,那么后台进程是否会收到 SIGHUP 信号挂掉?掏出阿里云服务器实验下。 这。。。后台进程在我们退出 session 后挂掉了!!!,这是为啥?那是因为后台进程与标准 I/O 有交互(这个服务打日志了),后台进程的的标准 I/O 继承自当前 session,就算加个 & 符号也没有改变这一特点。我们想要的是服务在后台持久运行,怎么解决? Linux 提供了一个 nohup 命令可以帮我们解决这个问题。 FastAPI Web 服务代码 12345678910111213141516171819202122232425# -*- coding: utf-8 -*-from fastapi import FastAPIfrom pydantic import BaseModelapp = FastAPI()class People(BaseModel): name: str age: int country: str offer_call: bool = None@app.get('/')def root(): return {"status": "hello world"}@app.get('/person/{your_name}')def get_people_info(your_name: str, q: int = None): return {"your name": your_name, "query": q}@app.put('/person/{your_name}')def update_people_info(your_name: str, person: People): return {"people name": your_name, "locate": person.age} 阻断 SIGHUP 信号的 nohup 好了,就算结束了 session 此 Web 服务仍在运行。nohup 命令实际上将子进程与它所在的 session 分离了。OK,进程由后台进程变为守护进程了(有那味了,还不算真正的守护进程)。 守护进程在 session 关闭时不会受影响。守护进程的会话组和当前目录,文件描述符都是独立的。后台运行只是终端进行了一次fork,让程序在后台执行,这些都没改变。 nohup 做的那些事 阻止SIGHUP信号发到这个进程(PID:14229)。关闭标准输入。该进程不再能够接收任何输入,即使运行在前台。重定向标准输出和标准错误到文件nohup.out。 守护进程管理工具-systemdSystemd(System Daemon) 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。这里不做介绍,直接结合场景来玩耍。教程可看:Systemd 入门教程:命令篇。 是时候掏出 Spring-Boot 应用了(mvn clean package 构建好 jar 包)。先为这个应用写个 Systemd 的配置文件spring-boot-app.service,如下 12345678910111213[Unit]Description=Spring Boot RESTful APIs Services[Service]ExecStart=/usr/local/java/jdk1.8.0_221/bin/java -jar /home/www/body/target/bodymanagement-0.0.1-SNAPSHOT.jarRestart=alwaysUser=rootGroup=rootEnvironment=PATH=/usr/local/java/jdk1.8.0_221/bin/javaWorkingDirectory=/home/www/body/[Install]WantedBy=multi-user.target 然后执行如下命令: 123456# 将配置文件拷贝到 systemd 中cp spring-boot-app.service /etc/systemd/system# 重载配置文件$ sudo systemctl daemon-reload# 启动服务$ sudo systemctl start spring-boot-app.service 访问:http://47.92.4.141:8080/api/user/findLatestInf,即可看到网页显示[]。 12$ systemctl enable spring-boot-app.service # 设置开机启动Created symlink from /etc/systemd/system/multi-user.target.wants/spring-boot-app.service to /etc/systemd/system/spring-boot-app.service. 使用systemctl status spring-boot-app.service可以查看服务状态,使用journalctl -u spring-boot-app可以查看服务状态。 更多常用命令如下: 1234567891011121314151617181920212223242526272829# 查看某个 Unit 的日志$ sudo journalctl -u nginx.service# 查看某个 Unit 状态$ sudo systemctl status mongod# 让某个 Unit 开机时启动$ sudo systemctl enable mongod# 立即启动一个服务$ sudo systemctl start apache.service# 立即停止一个服务$ sudo systemctl stop apache.service# 重启一个服务$ sudo systemctl restart apache.service# 杀死一个服务的所有子进程$ sudo systemctl kill apache.service# 重新加载一个服务的配置文件, 一旦配置文件修改就需要使用$ sudo systemctl reload apache.service# 查看某个服务的配置文件$ systemctl cat sshd.service# 重新加载所有配置文件$ sudo systemctl daemon-reload 参考 网络编程的三个重要信号(SIGHUP ,SIGPIPE,SIGURG) Linux 守护进程的启动方法 什么是守护进程 Node 应用的 Systemd 的启动","categories":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/categories/Linux/"}],"tags":[{"name":"服务器进程管理","slug":"服务器进程管理","permalink":"https://yeshan333.github.io/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86/"}]},{"title":"(译)通过 Git 和 Angular 了解语义化提交信息","slug":"译-通过-Git-和-Angular-了解语义化提交信息","date":"2020-06-04T22:06:59.000Z","updated":"2020-06-04T22:06:59.000Z","comments":true,"path":"2020/06/04/译-通过-Git-和-Angular-了解语义化提交信息/","permalink":"https://yeshan333.github.io/2020/06/04/%E8%AF%91-%E9%80%9A%E8%BF%87-Git-%E5%92%8C-Angular-%E4%BA%86%E8%A7%A3%E8%AF%AD%E4%B9%89%E5%8C%96%E6%8F%90%E4%BA%A4%E4%BF%A1%E6%81%AF/","excerpt":"受传统提交规范和 Angular 约定的启发,让我们来解释语义化提交术语,并演示提交信息的实际示例。 许多项目决定以某种约定方式来标准化它们的提交信息。这种做法并不是新出现的,但在最近几年中越来越多地得到了应用。而且很可能您已经在某些项目中遇到过这样的提交消息。","text":"受传统提交规范和 Angular 约定的启发,让我们来解释语义化提交术语,并演示提交信息的实际示例。 许多项目决定以某种约定方式来标准化它们的提交信息。这种做法并不是新出现的,但在最近几年中越来越多地得到了应用。而且很可能您已经在某些项目中遇到过这样的提交消息。 最早出现的规范之一来自与 AngularJS 项目。这个项目团队创建了一个详细的文档,其中指定了他们应该提交的目标和方式。这些提交约定非常流行,有些您可能通过 Karma 指南遇到过。但是,还有一些不同的约定,像 jQuery, JSHint, Ember, Angular(一个受AngularJS 提交规范启发的增强版约定),甚至更多: 可以清楚地看到上面各种各样的提交约定,这无疑构成了一个标准化官方规范的正当理由。约定式提交就是这样一种规范,它在实践中简化了 Angular 约定,并简化指出了提交消息规范的要点。 在本文中,我们将介绍“语义化提交”背后的概念,并使用 Git 和 Angular 的提交约定来演示具体的例子。声明一下,我们使用它们只是为了澄清概念——意味着版本控制工具和规范的选择取决于您。 那我们就开始吧!👨🏻‍🏫 动机让我们从定义开始: 语义化提交是遵循着特定约定并具有人类和机器可读含义的提交消息 这意味着,它只是提交消息的指导方针,因此: 提交消息是语义化的:因为它们被划分为有意义的类型,标识了提交(commit)的意图 提交消息是约定俗成的:对于开发者和工具,它们有着统一的结构和良好的类型标识 此外,当我们通常需要执行以下操作时,语义化提交可能会派上用场: 允许维护人员和贡献者轻松地浏览项目历史并理解提交的意图,同时通过提交消息类型忽略不重要的更改 强制提交信息的结构,鼓励有针对特定目的的小型提交 直接提交信息的主体,不必话大段话去解说 根据提交信息类型自动更新包版本号(Bump the package version) 自动生成日志(CHANGELOGs)和 release 说明 最后,语义化提交致力于实现更好的可读性和自动化,以及速度的提高。 话虽如此,我们中的一些人可能不接受这些消息约定,认为它们是可读的或提供信息的,这显然是有意义的。所以如果我们也不需要这些附带的好处,那在项目中执行这样的规范显然是没有意义的。 好了,是时候了解我们如何实际遵循这些约定了。 免责声明:从这一刻起,我们将引用 Angular 提交信息约定及其好处。 提交信息的格式Angular 规范要求根据以下结构来构造提交消息(Commit Message): 上图向我们说明了提交消息由三个部分组成 —— header、body 和 footer 。 HeaderHeader 是强制要求的一行,它简单地描述了更改的目的(最多100个字符)。更好的是,它本身由三部分组成: 类型(Type):标识更改类型的短前缀 范围(Scope):可选项,表明 Commit 影响的范围 主体(Subject):表示对实际更改的简明描述 实际上,就 Git 而言,它就是提交消息的首行: 1git commit -m "fix(core): remove deprecated and defunct wtf* apis" 我们插入单行消息,并用 : 分隔。当 fix和 core(受影响的包)分别是类型和范围时,我们将左分区假设称为“前缀”。另一方面,右分区显然构成了主体(Subject)。 简而言之,上述消息含义是:“本次更改通过移除不推荐使用(deprecated)和不存在的 wtf * api 修复了来自Core软件包的错误”。 Body主体(Body)是可选行,用于介绍本次更改背后的动机或仅描述一些更详细的信息。 让我们以上述的例子为例,并添加一个主体: 1git commit -m "fix(core): remove deprecated and defunct wtf* apis" -m "These apis have been deprecated in v8, so they should stick around till v10, but since they are defunct we are removing them early so that they don't take up payload size." 现在,我们在消息上附加了几句话,详细说明了此提交(Commit)目的。 请注意以下几点: 我们使用了多个-m来连接段落而不是简单的行 头部和主体应该用空白行分隔(根据这些段落,这显然是正确的) 注意:尽管我们可以使用其他方式将消息分成几行,但为了简单起见,我们将在下一个示例中继续使用多个 -m(展示了一个与shell无关的解决方案)。 Footer尾部(Footer)是可选行,其中提到了由于更改而产生的影响,例如:宣布重大更改、链接关闭已解决的问题(issues)、提及贡献者等等。 这是上述带有尾部(footer)的提交消息: 1git commit -m "fix(core): remove deprecated and defunct wtf* apis" -m "These apis have been deprecated in v8, so they should stick around till v10, but since they are defunct we are removing them early so that they don't take up payload size." -m "PR Close #33949" 在本例中,我们只是简单地添加了对相关拉请求(pull request)的引用,而没有添加其他内容。 最后,让我们查看完整的提交日志: 正如您可能会推断的,此提交实际上是 Angular 存储库中存在的。 常见类型除了定义提交消息格式外,Angular 的提交消息约定还指定了一个有用的类型列表,其中包含了各种各样的更改。 在开始之前,我们应该区分如下两种类型: 开发(Development):一种维护类型,它对变更进行分类,面向开发人员,这些变更实际上并不影响产品代码,而是影响内部的开发环境和工作流程(workflows) 生产(Production):一种增强类型,用于对仅影响产品代码的最终用户(end users)进行更改分类 现在,让我们介绍和解释这些类型。 注意:以下示例直接取自Angular存储库的提交日志。 👷构建构建类型 build(以前称为chore)用于识别与构建系统相关的开发更改(涉及脚本、配置或工具)和包依赖项(dependencies)。 例子: 💚cici 类型用于识别与持续集成和部署系统相关的开发更改——包括脚本、配置或工具。 例子: 📝文档docs文档类型用于识别与项目相关的文档更改——无论是针对最终用户的外部更改(对于库)还是针对开发人员的内部更改。 例子: ✨特性该feat类型用于标识生产环境相关的新的向后兼容能力(backward-compatible)或功能的更改。 例子: 🐛修复fix类型用于标识生产环境相关向后兼容(backward-compatible)的 bug 修复(bug fixes) 例子: ⚡️性能perf类型用于标识生产环境相关向后兼容的性能(performance)改进相关的产品更改。 例子: ♻️重构refactor类型用于识别与修改代码库相关的开发更改,这些更改既没有添加功能,也没有修复 bug —— 例如删除冗余代码、简化代码、重命名变量等等。 例子: 🎨风格style类型用于标识代码样式变动相关的开发更改,而不考虑其含义——例如缩进、分号、引号、结尾逗号等等。 例子: ✅测试test类型用于标识与测试相关的开发更改——例如重构现有测试或添加新测试。 例子: 好处现在我们已经熟悉了这些约定,让我们看看从中收获的两种好处。 浏览历史变更记录Git 为我们提供了浏览存储库提交历史的能力,所以我们就可以知道实际发生了什么,谁做了贡献等等。 让我们看看这些约定是如何简化我们对这些记录的浏览: 1git log --oneline --grep "^feat\\|^fix\\|^perf" 我们使用提交消息类型来过滤,因此只显示生产更改(所有以 feat、fix 或 perf开头的消息)。 另一个例子: 1git log --oneline --grep "^feat" | wc -l 我们只打印 feat 更改的总数。 上述的关键是提交消息格式非常结构化,这使得我们在扫描或过滤提交历史记录时能够有效地依赖于此格式。 即,更加迅速!💪🏻 自动发布提交消息格式对于自动化发布过程的步骤也很有用。 事实上,这可能是因为像Standard Version和Semantic Versioning这样的工具严格遵循语义化的版本规范和特定的信息提交约定(分别是传统的提交约定和 Angular 约定)。它们之间的主要区别在于 approach,但是让我们关注语义化发布(Semantic Release)。 因此,基于提交信息(特别是类型)——语义化发布(Semantic Release)能够给我们提供以下能力: 转到下一个语义化包版本(发生重大变更时-补丁发布、监控到新特性和性能的优化) 创建一个包含生产环境相关发布信息的 CHANGELOG 文件 为新的发布版本创建一个 Git tag 将release artifact发布(Publish)到 npm 注册中心 酷吧? 例如,Ionic 的angular-toolkit项目,集成了语义化发布来自动化发布过程(在此遵循 Angular 的提交约定): 正如我们所注意到的,发布的版本是基于 tag 和注释生成的——但重点是,这是自动完成的。🤖 其它为了充分利用语义化提交(semantic commit),让我们来看一些东西。 使用Emojis将表情符号附加到提交消息可能会进一步提高可读性,这样我们就可以在浏览提交历史时非常快速和容易地识别它们。💯 请参阅以下链接: gitmoji Commit Message Emoji 👋 CLI工具Commitizen 是一个通过命令行强制格式化提交信息的工具: 检查器(Linter)commitlint 是一个保证提交消息格式符合约定的工具: VSCode扩展如果你想使用一个可定制的VScode扩展,那么下面的内容可能会让你感兴趣: 总结我们今天介绍了“语义化提交”这个术语,并通过遵循 Angular 提交消息约定的具体例子,解释了这种消息的结构。 概括要点: 语义化提交是对开发人员和工具都有重要意义的提交信息方式,它们遵循特定的约定 语义化提交(以及基于它的工具)有助于提高可读性、速度和自动化 Conventional Commits 是一个详细描述语义提交的规范,遵循轻量级约定 Angular 的指导原则详细描述了遵循项目约定的语义化提交,包括: 包含 header、body 和 footer 的信息格式 与开发和生产相关的提交更改的类型 我们可以利用信息约定轻松浏览提交历史 我们可以从这些规范收获自动化发布流程(release process)的好处 最后,不管您是否决定采用这些约定,您可能会偶尔遇到它们,所以请记住上面的几点。😉 原文地址:Understanding Semantic Commit Messages Using Git and Angular 原文作者:Nitay Neeman 译文首发于:Seven innovation base/Git-IN-ACTION-docs 译者:MrGo123 校对者:yeshan333","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"},{"name":"工程化","slug":"工程化","permalink":"https://yeshan333.github.io/tags/%E5%B7%A5%E7%A8%8B%E5%8C%96/"},{"name":"译文","slug":"译文","permalink":"https://yeshan333.github.io/tags/%E8%AF%91%E6%96%87/"}]},{"title":"了解一波经典的 I/O 模型","slug":"了解一波经典的-IO-模型","date":"2020-05-19T15:19:14.000Z","updated":"2020-05-19T15:19:14.000Z","comments":true,"path":"2020/05/19/了解一波经典的-IO-模型/","permalink":"https://yeshan333.github.io/2020/05/19/%E4%BA%86%E8%A7%A3%E4%B8%80%E6%B3%A2%E7%BB%8F%E5%85%B8%E7%9A%84-IO-%E6%A8%A1%E5%9E%8B/","excerpt":"最近读了波网络 I/O 相关的文章,做下总结、摘录。(未完) 经典 I/O 模型 阻塞式 I/O(blocking I/O) 非阻塞式 I/O(non-blocking I/O) I/O 多路复用(I/O multiplexing) 信号驱动式 I/O(signal driven I/O) 异步 I/O(asynchronous I/O) 阻塞式 I/O 模型对于阻塞式 I/O,以套接字(Socket)的输入操作为例。 1、首先应用进程发起 I/O 系统调用后,应用进程阻塞,转到内核空间处理。 2、之后,内核开始等待数据,等待数据到达之后,将内核中的数据拷贝到用户的缓冲区中,整个 I/O 处理完毕后返回进程。最后应用进程解除阻塞状态,处理数据。","text":"最近读了波网络 I/O 相关的文章,做下总结、摘录。(未完) 经典 I/O 模型 阻塞式 I/O(blocking I/O) 非阻塞式 I/O(non-blocking I/O) I/O 多路复用(I/O multiplexing) 信号驱动式 I/O(signal driven I/O) 异步 I/O(asynchronous I/O) 阻塞式 I/O 模型对于阻塞式 I/O,以套接字(Socket)的输入操作为例。 1、首先应用进程发起 I/O 系统调用后,应用进程阻塞,转到内核空间处理。 2、之后,内核开始等待数据,等待数据到达之后,将内核中的数据拷贝到用户的缓冲区中,整个 I/O 处理完毕后返回进程。最后应用进程解除阻塞状态,处理数据。 上图以 UDP 的 Socket 调用为例,进程调用 recvfrom 后,系统调用直到数据报到达且被复制到用户空间中或发生错误才返回。进程从调用开始到它返回的整段时间内是被阻塞的。recvfrom 成功返回后,应用进程开始处理数据报。 默认情形,Linux/Unix 的所有 Socket 是阻塞的。 附:基于 UDP 协议的 Socket 程序函数调用过程图 一般情况下,服务端需要管理多个客户端连接(处理并发连接),而 recvfrom 只能监视单个 Socket。上图的阻塞式 I/O 模型表示的是一对一沟通的情形,使用多线程/进程 + 阻塞式 I/O 我们可以管理多个 Socket ,实现一对多服务。 非阻塞式 I/O 模型在类 Unix 系统下,可以把一个 Socket 设置成非阻塞的。这意味着内核在数据报没有准备好时不会阻塞应用进程(睡眠态),而是返回一个错误。 上图以 UDP 的 Socket 调用为例,进程反复调用 recvfrom(polling,轮询),无数据返回 EWOULDBLOCK 错误,直至数据报准备好。 问题:单进程处理数据报,不同于阻塞I/O,由于需要反复 polling,非阻塞 I/O 会耗费大量的 CPU 资源,进程阻塞不耗费 CPU 资源。如果耍上了多进程,那耗费,是不可承受的。 关于阻塞的原理,这篇文章有简单介绍✔🔗。 I/O 多路复用模型什么是多路复用?多路指的是多个通道,一般就是多个网络连接的 I/O;复用指的是多个通道复用在一个复用器上。 引入多路复用机制的一个目的是为了处理多个网络连接 I/O。 I/O多路复用方法的演进历程:select 模型-> poll 模型-> epoll 模型 select 模型 上图所示的整个用户进程一般一直是被阻塞的(blocking),即被 select(复用器) 所阻塞,多个 Socket 被注册在 select 中。进程阻塞于 select 调用,等待数据报套接字变为可读,一但 select 返回套接字可读,系统调用 recvfrom 把所读数据报复制到应用进程缓冲区。 问题来了?为了处理多个网络连接 I/O,我们也可以通过多线程/进程的方式实现,多路复用的优势何在?这里的多路复用模型似乎比阻塞式 I/O 模型更为复杂,但它最大的优势在于用户可以在一个进程/线程内同时处理多个 socket 的 IO 请求。用户可以注册多个 socket,然后不断地调用 select 读取被激活的 socket,即可达到在同一个线程内同时处理多个 IO 请求的目的。(select 可接受的 socket 描述符数会有一定限制) 我们知道,操作系统多个进程/线程的开销维护还是蛮大的。对于高并发场景,如果一台机器要维护 1 万个连接(C10K问题),使用多线程/进程的方式处理,操作系统是无法承受的。如果维持 1 亿用户在线需要 10 万台服务器,成本那是相当的高。 $ 服务端单机最大 TCP 连接数=客户端 IP 数×客户端端口数 $,对于 IPv4,客户端的 IP 数最多为 2 的 32 次方,客户端的端口数最多为 2 的 16 次方。这只是理论上限,每个 TCP 连接的建立会受制于操作系统内存等因素的影响。 epoll 模型新模型的出现肯定是为了解决旧模型的问题,那么 select 模型有什么问题?每次 Socket 所在的文件描述符集合中有 Socket 发生变化的时候,select 都需要通过轮询的方式去检查,而 epoll 引入了 CallBack(回调)机制,当某个文件描述符发送变化的时候,主动通知。随着监听的 Socket 数据增加的时候,效率相比于 select 的轮询快多了。 了解 epoll 的本质 -> 如果这篇文章说不清epoll的本质,那就过来掐死我吧! (2) 参考 《UNIX网络编程 卷1:套接字联网API》 趣谈网络协议 RPC实战与核心原理 如果这篇文章说不清epoll的本质,那就过来掐死我吧! 5种网络IO模型(有图,很清楚) 《Nginx高性能Web服务器详解》","categories":[{"name":"操作系统","slug":"操作系统","permalink":"https://yeshan333.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"},{"name":"计算机网络","slug":"计算机网络","permalink":"https://yeshan333.github.io/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"}],"tags":[{"name":"I/O模型","slug":"I-O模型","permalink":"https://yeshan333.github.io/tags/I-O%E6%A8%A1%E5%9E%8B/"}]},{"title":"『笔记』可扩展架构设计之消息队列","slug":"可扩展架构设计之消息队列","date":"2020-04-06T19:44:09.000Z","updated":"2020-04-06T19:44:09.000Z","comments":true,"path":"2020/04/06/可扩展架构设计之消息队列/","permalink":"https://yeshan333.github.io/2020/04/06/%E5%8F%AF%E6%89%A9%E5%B1%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1%E4%B9%8B%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/","excerpt":"前言众所周知,开发低耦合系统是软件开发的终极目标之一。低耦合的系统更加容易扩展,低耦合的模块更加容易复用,更易于维护和管理。我们知道,消息队列的主要功能就是收发消息,但是它的作用不仅仅只是解决应用之间的通信问题这么简单。消息队列作为常用的中间件,经常被用来对系统解耦,对模块解耦。增强系统的可扩展性和模块的可复用性。 除了对用于对系统、模块解耦,消息队列还有以下几种通途: 服务异步处理 流量控制 作为发布 / 订阅系统实现一个微服务级系统间的观察者模式 连接流计算任务和数据 用于将消息广播给大量接收者 事物的存在总会有对立的一面,引入消息队列可能会带来延迟问题、产生数据不一致的问题、增加系统复杂度的问题等等。","text":"前言众所周知,开发低耦合系统是软件开发的终极目标之一。低耦合的系统更加容易扩展,低耦合的模块更加容易复用,更易于维护和管理。我们知道,消息队列的主要功能就是收发消息,但是它的作用不仅仅只是解决应用之间的通信问题这么简单。消息队列作为常用的中间件,经常被用来对系统解耦,对模块解耦。增强系统的可扩展性和模块的可复用性。 除了对用于对系统、模块解耦,消息队列还有以下几种通途: 服务异步处理 流量控制 作为发布 / 订阅系统实现一个微服务级系统间的观察者模式 连接流计算任务和数据 用于将消息广播给大量接收者 事物的存在总会有对立的一面,引入消息队列可能会带来延迟问题、产生数据不一致的问题、增加系统复杂度的问题等等。 EDA 架构之生产者与消费者模式 事件驱动架构(Event Driven Architecture, EDA) EDA 架构原理事件驱动架构由事件发起者和事件使用者组成。事件的发起者检测或感知事件,并以消息的形式来表示事件。它并不知道事件的使用者或事件引起的结果。 检测到事件后,系统会通过事件通道从事件发起者传输给事件使用者,而事件处理平台则会在该通道中以异步方式处理事件。事件发生时,需要通知事件使用者。他们可能会处理事件,也可能只是受事件的影响。 事件处理平台将对事件做出正确响应,并将活动下发给相应的事件使用者。通过这种下发活动,我们就可以看到事件的结果。 检测到事件后,系统会通过事件通道从事件发起者传输给事件使用者,而事件处理平台则会在该通道中以异步方式处理事件。事件发生时,需要通知事件使用者。他们可能会处理事件,也可能只是受事件的影响。 事件处理平台将对事件做出正确响应,并将活动下发给相应的事件使用者。通过这种下发活动,我们就可以看到事件的结果。 生产者-消费者模型操作系统中常见的 EDA 架构就是生产者-消费者模型。消息队列常用来作为生产者和消费者之间的缓冲带,平衡生产者和消费者的处理能同时对服务进行解耦。有了这层缓冲带,生产者和消费者可能都不知道对方的存在。 以下为生产者-消费者模型的简单实现,(内存消息队列) 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647import timefrom queue import Queuefrom random import randintfrom threading import Threadclass Producer(Thread): def __init__(self, queue): super().__init__() self.queue = queue def run(self): while True: productA = randint(0, 10) productB = randint(90, 100) print('Produce A「number」: {}, Produce B「number」: {}'.format(productA, productB)) self.queue.put((productA, productB)) time.sleep(2)class Consumer(Thread): def __init__(self, queue): super().__init__() self.queue = queue def run(self): while True: # block=True, if queue is empty, block(阻塞) products_tuple = self.queue.get(block=True) print(f'Consume products: {products_tuple[0]} & {products_tuple[1]}') time.sleep(randint(0, 10))def main(): queue = Queue() producer = Producer(queue) consumer = Consumer(queue) producer.start() consumer.start()main()"""Produce A「number」: 8, Produce B「number」: 95Consume products: 8 & 95Produce A「number」: 4, Produce B「number」: 92Consume products: 4 & 92Produce A「number」: 9, Produce B「number」: 90... """ 基于ZeroMQ PubSub模式的观察者模式实例 1234567891011121314151617181920# publisher1.pyimport timeimport zmqdef publisher1(): context = zmq.Context() socket = context.socket(zmq.PUB) socket.bind("tcp://*:5555") while True: count = 99 while True: time.sleep(1) socket.send_string('publisher1 pushes event %d' % count) print('push event %d' % count) count += 1if __name__ == "__main__": publisher1() 123456789101112131415161718192021# publisher2.pyimport timeimport zmqdef publisher2(): context = zmq.Context() socket = context.socket(zmq.PUB) socket.bind("tcp://*:5556") while True: count = 1 while True: time.sleep(1) socket.send_string('publisher2 pushes event %d' % count) print('push event %d' % count) count += 1if __name__ == "__main__": publisher2() 1234567891011121314151617# subscriber1.pyimport zmqdef subscriber1(): context = zmq.Context() socket = context.socket(zmq.SUB) socket.connect('tcp://127.0.0.1:5555') socket.connect('tcp://127.0.0.1:5556') socket.setsockopt_string(zmq.SUBSCRIBE, '') while True: message = socket.recv() print('message: %s' % message)if __name__ == "__main__": subscriber1() 1234567891011121314151617# subscriber2.pyimport zmqdef subscriber2(): context = zmq.Context() socket = context.socket(zmq.SUB) socket.connect('tcp://127.0.0.1:5555') socket.connect('tcp://127.0.0.1:5556') socket.setsockopt_string(zmq.SUBSCRIBE, '') while True: message = socket.recv() print('message: %s' % message)if __name__ == "__main__": subscriber2() 秒杀系统的架构设计与消息队列某秒杀系统的主要处理步骤如下: 风险控制 库存锁定 生成订单 短信通知 更新统计数据 使用消息队列进行异步处理由于秒杀成功的关键取决于风险控制、库存锁定这两步骤,所以 server 端处理了这两步之后可以给 client 端返回结果了,后续的步骤可放入消息队列中异步执行。不一定要在秒杀请求中完成。集中资源处理关键步骤(同步),碎片时间(全部秒杀请求处理结束)处理次要步骤(异步)。 使用消息队列进行流量控制(削峰)秒杀开始后,将超过 server 端处理上限(短时间内)的秒杀请求放入消息队列中,后续有能力处理时再对消息队列中消费请求进行处理。对于超时的请求可以直接丢弃(秒杀失败)。 参考 大型网站技术架构 什么是事件驱动架构 为什么需要消息队列-极客时间 ZeroMQ pyzmq","categories":[{"name":"Architecture","slug":"Architecture","permalink":"https://yeshan333.github.io/categories/Architecture/"}],"tags":[{"name":"架构设计","slug":"架构设计","permalink":"https://yeshan333.github.io/tags/%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/"},{"name":"消息队列","slug":"消息队列","permalink":"https://yeshan333.github.io/tags/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/"}]},{"title":"单例模式如何保证实例的唯一性","slug":"单例模式如何保证实例的唯一性","date":"2020-04-04T19:59:09.000Z","updated":"2020-04-04T19:59:09.000Z","comments":true,"path":"2020/04/04/单例模式如何保证实例的唯一性/","permalink":"https://yeshan333.github.io/2020/04/04/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E5%AE%9E%E4%BE%8B%E7%9A%84%E5%94%AF%E4%B8%80%E6%80%A7/","excerpt":"前言 最近面试发现自己不懂的东西还是很多的,写一波文章来巩固和挖掘欠缺的知识点以及加深对已有知识点原理的理解。","text":"前言 最近面试发现自己不懂的东西还是很多的,写一波文章来巩固和挖掘欠缺的知识点以及加深对已有知识点原理的理解。 什么是单例模式 指一个类只有一个实例,且该类能自行创建这个实例的一种创建型设计模式。 使用目的:确保在整个系统中只能出现类的一个实例,即一个类只有一个对象。对于频繁使用的对象,“忽略”创建时的开销。 特点: 单例类只有一个实例对象; 该单例对象必须由单例类自行创建; 单例类对外提供一个访问该单例的全局访问点; 如何保证实例的唯一性那么,如何保证实例的唯一性? Java 的解决方案之一对于 Java 来说,要确保类的构造方法是私有的,使用 static final 的私有成员变量存放这个唯一实例。我们还要提供一个获取实例的接口(由于我们要通过类名获取实例,所以接口方法是 static 的)。实现如下: 1234567public class Singleton { private static final Singleton instance=new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; }} 我们知道,对于 static 的变量,类所有的实例都可以共享这个变量,我们可以直接通过类名来访问它。再使用 final 修饰这个变量,使得它不能再被改变。 戳此处深入了解 → Python 的解决方案之一以下为 Python 使用装饰器实现的单例模式。这里将不可变的类地址存放在了 dict 中,值为那个唯一的实例。 123456789101112131415161718192021222324def Singleton(cls): _instance = {} def getInstance(*args, **kwargs): if cls not in _instance: _instance[cls] = cls() return _instance[cls] return getInstance@Singletonclass test_singleton: def __init__(self): passdef main(): class1 = test_singleton() class2 = test_singleton() print('class1 id: {}, class2 id: {}'.format( id(class1), id(class2))) print(class1 == class2)main()# class1 id: 1814844368152, class2 id: 1814844368152# True 参考 Creating a singleton in Python 单例模式(单例设计模式)详解","categories":[{"name":"设计模式","slug":"设计模式","permalink":"https://yeshan333.github.io/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/"}],"tags":[{"name":"设计模式","slug":"设计模式","permalink":"https://yeshan333.github.io/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/"}]},{"title":"使用 mypy 做 type check","slug":"使用-mypy-做type-check","date":"2020-03-06T11:29:17.000Z","updated":"2020-03-06T11:29:17.000Z","comments":true,"path":"2020/03/06/使用-mypy-做type-check/","permalink":"https://yeshan333.github.io/2020/03/06/%E4%BD%BF%E7%94%A8-mypy-%E5%81%9Atype-check/","excerpt":"前言完残!😂,最近看之前写的 Python 代码老得琢磨这比变量的类型是啥(Python 无类型系统xxx),不愧是我写的! 看段之前写的实现迭代器模式的代码:","text":"前言完残!😂,最近看之前写的 Python 代码老得琢磨这比变量的类型是啥(Python 无类型系统xxx),不愧是我写的! 看段之前写的实现迭代器模式的代码: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465# 抽象迭代器类class Iterator(object): def hasNext(): pass def next(): pass# 抽象聚集类class Aggregate(object): def iterator(): passclass BookShelf(Aggregate): def __init__(self): self._books = [] self._last = 0 def getBookAt(self, index): return self._books[index] def appendBook(self, book): self._books.append(book) self._last = self._last + 1 def getLength(self): return self._last def iterator(self): return BookShelfIterator(self)class BookShelfIterator(Iterator): def __init__(self, bookShelf): self._bookShelf = bookShelf self._index = 0 def hasNext(self): if self._index < self._bookShelf.getLength(): return True else: return False def next(self): book = self._bookShelf.getBookAt(self._index) self._index = self._index + 1 return bookclass Book(): def __init__(self, name): self._name = name def getName(self): return self._nameif __name__ == "__main__": bookShelf = BookShelf() bookShelf.appendBook(Book("A")) bookShelf.appendBook(Book("B")) bookShelf.appendBook(Book("C")) bookShelf.appendBook(Book("D")) it = bookShelf.iterator() while it.hasNext(): book = it.next() print(book.getName()) 有一丢丢难读(不通读的话,会乱猜某变量类型),回想之前在 PyCon China 2019 的大会资聊曾看到过类型检查相关的演讲主题,回顾下演讲视频。水一波,写篇文章了解下 Python 标准(PEP 3107 & PEP 484 )支持的 mypy。 类型系统:编译期的类型推导检查规则,类型系统属于一种轻量级的形式化方法(一种数学方法) 使用-mypy1234# 安装 mypypip install mypy# 使用 mypy 做类型检查mypy module_name.py 以下使用方式适用于 Python 3.6 及以上的版本。值得注意:mypy 默认的推导类型不可为 None 变量的类型注释12345678integer: int = 1string: str = "ShanSan"err_str: str = 1 # error: Incompatible types in assignmentchild: bool = True# mypy 默认的推导类型不可为 Nonenone: int - None # error: Invalid type comment or annotationprint(integer, string) 内建类型关于更多 mypy 的类型系统内建的类型可参考:https://mypy.readthedocs.io/en/stable/builtin_types.html 123456789101112131415161718192021from typing import Dict, Tuple, Optional, Iterable, Union# 对于映射(Map)数据结构,需要指定 key 和 value 的类型x: Dict[str, float] = {'field': 2.0}# Tuple 需要指定所有元素的类型x: Tuple[int, str, float] = (3, "yes", 7.5)# error: Incompatible types in assignment (expression has type "Tuple[int, str, float, int]", variable has type "Tuple[int, str, float]")y: Tuple[int, str, float] = (3, "yes", 7.5, 11)op: Optional[str] = None # 可为 str 或 None# 泛用可迭代对象l: Iterable = [1]t: Iterable = (1, 2)d: Iterable = {1: 1}# 可为 str 或 intstr_int1: Union[str, int] = 1str_int2: Union[str, int] = "ss"str_int3: Union[str, int] = None # error 函数注解12345678910111213141516171819from typing import NoReturndef f1() -> None: passdef f2() -> NoReturn: # 无返回值 passdef plus(num1: int, num2: int) -> int: return num1 + num2# 带默认值def plus_default(num1: int, num2: int = 3) -> int: return num1 + num2# 容器的参数类型def container_param(names: List[str]) -> None: for name in names: print(name) 类成员注解123456789101112131415class MyClass: attr: int # 带默认值的实例变量 charge_percent: int = 100 # 没有任何返回值应该注解为 None def __init__(self) -> None: pass # 忽略对 self 类型的注解 def my_method(self, num: int, str1: str) -> str: return num * str1# 支持自定义类型的注解x: MyClass = MyClass() 结尾OK, 差不多了,对之前的迭代器模式的代码改造一波 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667from typing import List, Iterable# 抽象迭代器类class Iterator(object): def hasNext(self): pass def next(self): pass# 抽象聚集类class Aggregate(object): def iterator(self): passclass BookShelf(Aggregate): def __init__(self) -> None: self._books: List[Book] = [] self._last: int = 0 def getBookAt(self, index: int) -> Book: return self._books[index] def appendBook(self, book: Book) -> None: self._books.append(book) self._last = self._last + 1 def getLength(self) -> int: return self._last def iterator(self) -> BookShelfIterator: return BookShelfIterator(self)class BookShelfIterator(Iterator): def __init__(self, bookShelf) -> None: self._bookShelf: BookShelf = bookShelf self._index: int = 0 def hasNext(self) -> bool: if self._index < self._bookShelf.getLength(): return True else: return False def next(self) -> Book: book: Book = self._bookShelf.getBookAt(self._index) self._index = self._index + 1 return bookclass Book(): def __init__(self, name) -> None: self._name: str = name def getName(self) -> str: return self._nameif __name__ == "__main__": bookShelf: BookShelf = BookShelf() bookShelf.appendBook(Book("A")) bookShelf.appendBook(Book("B")) bookShelf.appendBook(Book("C")) bookShelf.appendBook(Book("D")) it: Iterator = bookShelf.iterator() while it.hasNext(): book: Book = it.next() print(book.getName()) emmm, 舒服了一丢丢/(ㄒoㄒ)/~~ 参考 https://github.com/python/mypy PyCon China 2019 成都分会场-刘知杭-静态类型的 Python, video🔗 PyCon China 2019 北京分会场-依云-类型检查拯救粗心开发者, video🔗 Type hints cheat sheet (Python 3)","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"静态类型检查","slug":"静态类型检查","permalink":"https://yeshan333.github.io/tags/%E9%9D%99%E6%80%81%E7%B1%BB%E5%9E%8B%E6%A3%80%E6%9F%A5/"}]},{"title":"洞悉技术的本质-Git内部原理探索","slug":"Git内部原理探索","date":"2020-02-03T00:49:18.000Z","updated":"2020-02-03T00:49:18.000Z","comments":true,"path":"2020/02/03/Git内部原理探索/","permalink":"https://yeshan333.github.io/2020/02/03/Git%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86%E6%8E%A2%E7%B4%A2/","excerpt":"前言洞悉技术的本质,可以让我们在层出不穷的框架面前仍能泰然处之。用了那么久的 Git,不懂点内部原理,那可不行!懂点原理可以让我们遇到问题的时候能够更好更快的理清解决问题的思路。 要真正读懂本文可能需要以下基础: 有 Git 使用经验 对 Git 的三个分区有所了解 熟悉常用的 Linux 命令 对经典哈希算法有一定的了解,比如SHA-1、SHA-256、MD5等 在开始之前,让我们先抛出几个问题,然后一一解决、回答它们 .git版本库里的文件/目录是干什么的? Git是如何存储文件信息的? 当我们执行git add、git commit时,Git背后做了什么? Git分支的本质是什么?","text":"前言洞悉技术的本质,可以让我们在层出不穷的框架面前仍能泰然处之。用了那么久的 Git,不懂点内部原理,那可不行!懂点原理可以让我们遇到问题的时候能够更好更快的理清解决问题的思路。 要真正读懂本文可能需要以下基础: 有 Git 使用经验 对 Git 的三个分区有所了解 熟悉常用的 Linux 命令 对经典哈希算法有一定的了解,比如SHA-1、SHA-256、MD5等 在开始之前,让我们先抛出几个问题,然后一一解决、回答它们 .git版本库里的文件/目录是干什么的? Git是如何存储文件信息的? 当我们执行git add、git commit时,Git背后做了什么? Git分支的本质是什么? Git分区在真正开始之前,让我们先回顾下Git的三个分区(Workspace、Index / Stage、git repository) 工作区(Workspace):此处进行代码文件的编辑 索引或称暂存区(Index / Stage):存储文件状态信息,进行commit前会对此时的文件状态作快照(Snapshot) Git版本库(git repository):由Git Object持久记录每一次commit的快照和链式结构的commit变更历史 先看下从《Got Git》和网络上搬来的Git分区工作原理图和待remote的工作流再次感性回顾下之前使用Git自己时怎么操作的 相信看了这些,会对Git有新的认知,让我们正式开始🎉! .git版本库里的文件/目录是干什么的让我们通过一个从GitHub clone下来的一个实际项目的版本库来看下这些文件/目录,clone下来的repository 12345678910111213$ git clone https://github.com/yeshan333/Explore-Git$ ls -F1configdescriptionHEADhooks/indexinfo/logs/objects/packed-refsrefs/ 挑几个重要文件/目录的做下解释 HEAD文件:用于存放当前所在分支的引用,这个引用是个符号引用(symbolic reference) index文件:二进制文件,它就是暂存区(Stage Area)。它是一个目录树,记录了文件的时间戳、文件长度、SHA-1等 refs目录:基本所有的引用(references)文件都存放在这里,引用文件中的内容为SHA-1值,一般是commit object的SHA-1值 objects目录:用于存放数据的所有 Git Object均存放在这个目录下,每个 Git Object 对应一个目录,object对应的SHA-1值的前 2 位为目录名,后 38 位为文件名 抱着一些初步的认知,我们继续解决后面几个问题,加深对.git版本库内文件的理解 Git是如何存储文件信息的要知道Git如何存储信息,我们需要了解一下常见的Git对象,Git就是通过这些对象存储文件信息的。Git Object是Git存储文件信息的最小单元,如下为几种常见的Git Object以及它们的作用,它们一般是不可变的(immutable),这些对象使用40位的SHA-1值进行标识。 blob:用于存储文件内容,Git保存文件的时候不会保存文件名 tree object:当前目录结构的一个快照(Snapshot),它存储了一条或多条树记录(tree entries),每条记录含有一个指向数据对象(blob)或子树对象(子树木对象可理解为子目录)的SHA-1指针以及相应的文件模式、类型、文件名,用于表示内容之间的目录层次关系 commit object:存储顶层tree object的SHA-1值、作者/提交者信息+时间戳以及提交注释,如果有父commit object,还会保存有这个commit object对应的SHA-1值。对于merge commit可能会有多个父commit object tag object:用于标记commit object。关于tag object 让我们通过一个实际的版本库了解下这些对象,使用git log查看这个版本库详尽的历史提交记录 12345678910111213141516$ git log --pretty=rawcommit ee8a0dbc0c6fe89e6ff39b16c77543e8e2c6475btree fb12b3e52ce18ce281bfc2b11a5e4350c2d10358parent 7b94dcbe89c9534913854284b4af727a9a5dfc84author yeshan333 <1329441308@qq.com> 1580629391 +0800committer yeshan333 <1329441308@qq.com> 1580629391 +0800 final commitcommit 7b94dcbe89c9534913854284b4af727a9a5dfc84tree 8feb4afbab18e8d386413224a9e74f871c15a5caauthor yeshan333 <1329441308@qq.com> 1580629170 +0800committer GitHub <noreply@github.com> 1580629170 +0800 Initial commit Git提供了一把非常好用的瑞士军刀🔪给我们剖析这些对象,它是就是cat-file,通过-t参数可以查看object的类型,通过-p参数我们可以查看object存储的具体内容。查看信息时,我们需要使用到object对应的SHA-1值,可不必写完,从头开始的前几位不冲突即可。git cat-file 让我们通过它查看下SHA-1值ee8a0dbc0c6fe89e6ff39b16c77543e8e2c6475b对应的commit object的类型以及存放的内容。 1234567891011$ git cat-file -t ee8acommit$ git cat-file -p ee8atree fb12b3e52ce18ce281bfc2b11a5e4350c2d10358parent 7b94dcbe89c9534913854284b4af727a9a5dfc84author yeshan333 <1329441308@qq.com> 1580629391 +0800committer yeshan333 <1329441308@qq.com> 1580629391 +0800final commit 让我们再查看下这个commit object(ee8a)存储的tree object(fb12)的信息 1234567$ git cat-file -p fb12100644 blob 6116a7dd8f752dabff8730a46b46846b2d0a696b README.md040000 tree 41ed97c2adb97658107069582b6a27e474b4cc64 test$ git cat-file -t fb12tree 我们知道tree object存储了一条或多条树记录(tree entries),每条记录含有一个指向数据对象(blob)或子树对象(子树木对象可理解为子目录)的SHA-1指针以及相应的文件模式、类型、文件名。100644即为对应的文件模式,100644表示普通文本文件,040000表示目录文件。关于文件模式的一点疑问 让我们再看下tree object(fb12)存储的SHA-1指针(6116)对应的blob(6116)存放的内容 12345$ git cat-file -p 6116# Explore-Git$ git cat-file -t 6116blob Nice,很好的对应了之前对blob、tree object、commit object的描述。关于文件的大部分信息都存放在这些object中。 当我们执行git add、git commit时,Git背后做了什么解答这个问题,我们需要通过实践去一步步感受Git背后的操作。我们创建一个简单的例子感受下,我们需要时刻关注.git/objects这个目录 1234567891011$ mkdir demo$ cd demo$ git init # 初始化Git仓库$ find .git/objects -type f # 没有文件$ echo "test" > test.txt$ mkdir hi$ cd hi$ echo "Hello" > hello.txt$ cd ..$ find .git/objects -type f$ # 什么都没有 这里我们创建先了两个文件,test.txt、hello.txt,其中hello.txt文件放到了hi目录中,然后我们查看了.git/objects目录,没有文件。接下来就是重头戏了,我们要将当前目录的文件/目录(Linux一切皆文件)添加到暂存区(stage/index)。 1234$ git add .$ find .git/objects -type f.git/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4.git/objects/e9/65047ad7c57865823c7d992b1d046ea66edf78 我们可以看到,执行了git add之后生成了两个文件,让我们通过git cat-file看看这两个文件 12345678$ git cat-file -t 9daeblob$ git cat-file -p 9daetest # test.txt文件中的内容$ git cat-file -t e965blob$ git cat-file -p e965Hello # hi/hello.txt文件中的内容 哦,Git为我们生成了两个object,两个blob,存放的是test.txt、hello.txt的内容,让我们commit一下看看Git又做了什么 123456789101112131415161718192021222324$ find .git/objects -type f.git/objects/27/1c49aa4a2c8eb1b2ef503c19378aa6810fca1e.git/objects/2e/8ebea76975c98806e73c0b7aea6c40c58d427c.git/objects/8c/3c7fbcd903744b20fd7567a1fcefa99133b5bc.git/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4.git/objects/e9/65047ad7c57865823c7d992b1d046ea66edf78$ git cat-file -t 271ccommit$ git cat-file -t 2e8etree$ git cat-file -t 8c3ctree$$ git cat-file -p 271ctree 2e8ebea76975c98806e73c0b7aea6c40c58d427cauthor root <root@DESKTOP-CQ9JEC7.localdomain> 1580651827 +0800committer root <root@DESKTOP-CQ9JEC7.localdomain> 1580651827 +0800Hello Git$ git cat-file -p 8c3c100644 blob e965047ad7c57865823c7d992b1d046ea66edf78 hello.txt$ git cat-file -p 2e8e040000 tree 8c3c7fbcd903744b20fd7567a1fcefa99133b5bc hi100644 blob 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 test.txt 哦,commit后Git为我们新创建了3个object,分别是根树对象tree object(2e8e)、子树对象tree object(8c3c)、commit object(271c)。现在一共有5个Git Object。这些object存放的内容符合我们在解答Git是如何存储文件信息的时对它们的表述。Git在add、commit后有条不紊的把它们组织了起来。tql👍 让我们看下此次提交的日志 1234567$ git log --pretty=rawcommit 271c49aa4a2c8eb1b2ef503c19378aa6810fca1etree 2e8ebea76975c98806e73c0b7aea6c40c58d427cauthor root <root@DESKTOP-CQ9JEC7.localdomain> 1580651827 +0800committer root <root@DESKTOP-CQ9JEC7.localdomain> 1580651827 +0800 Hello Git 问题来了,Git是如何组织这些object的❓令人兴奋的是Git在提供给我们这些顶层API去愉快使用的同时还提供了一些较为底层的API让我们能够更深入的了解它。接下来我们将通过部分底层的API来重现本次commit log的创建过程。主要用到的底层API如下: git hash-object:生成blob git update-index:对暂存区进行操作 git write-tree:根据当前暂存区(index)状态创建一个tree object git read-tree:将tree object读入暂存区 git commit-tree:创建commit object 重现步骤如下: 1、先初始化版本库,再为内容分别为test的test.txt、Hello的hello.txt创建两个blob,blob不存储文件名 1234567$ mkdir test$ cd testgit init$ echo 'test' | git hash-object -w --stdin9daeafb9864cf43055ae93beb0afd6c7d144bfa4$ echo 'Hello' | git hash-object -w --stdine965047ad7c57865823c7d992b1d046ea66edf78 2、使用git update-index -add将blob(e965)加入暂存区,使用--cacheinfo参数指定文件模式、SHA-1值、文件名(hello.txt) 1$ git update-index --add --cacheinfo 100644 e965047ad7c57865823c7d992b1d046ea66edf78 hello.txt 3、使用git write-tree将当前暂存区状态写入一个tree object(8c3c) 12$ git write-tree8c3c7fbcd903744b20fd7567a1fcefa99133b5bc 4、将hello.txt移出暂存区,将blob(9dae)加入暂存区(即将test.txt加入暂存区) 12$ git update-index --remove hello.txt$ git update-index --add --cacheinfo 100644 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 test.txt 5、使用git read-tree将已有tree object作为子树对象加入暂存区,通过--prefix设置名称为hi 1$ git read-tree --prefix=hi 8c3c7fbcd903744b20fd7567a1fcefa99133b5bc 6、记录下当前暂存区状态到tree object 12$ git write-tree2e8ebea76975c98806e73c0b7aea6c40c58d427c 7、使用git commit-tree根据tree object的SHA-1值创建commit object 12$ echo 'Hello Git' | git commit-tree 2e8e2616a5b40ead79df23736f61b346080423f438fe 8、查看commit log,没多大毛病,收工🎉 123456789101112131415$ git log --pretty=raw 2616commit 2616a5b40ead79df23736f61b346080423f438fetree 2e8ebea76975c98806e73c0b7aea6c40c58d427cauthor root <root@DESKTOP-CQ9JEC7.localdomain> 1580660050 +0800committer root <root@DESKTOP-CQ9JEC7.localdomain> 1580660050 +0800 Hello Git$ git cat-file -p 2616tree 2e8ebea76975c98806e73c0b7aea6c40c58d427cauthor root <root@DESKTOP-CQ9JEC7.localdomain> 1580660050 +0800committer root <root@DESKTOP-CQ9JEC7.localdomain> 1580660050 +0800Hello Git 相信到了这里,已经对Git在我们git add、git commit时做了什么有了一定的了解。如果想了解Git Object对应的SHA-1值如何生成和如何复现并串联多个commit object形成一个提交历史链,可查看《Pro Git》的第十章第二小节或参看后面的参考资料。 Git分支的本质是什么Git分支的本质是指向某一系列提交之首的指针或引用。Git使用引用的一个好处就是我们不需要花心思去记那些Git Object长长的SHA-1值。引用是存放SHA-1值的文件,它们位于.git/refs目录中。Git提供了一个API让我们更新引用-update-ref,示例如下 123456789101112131415$ git update-ref refs/heads/master 2616 # 2616为之前浮现commit log创建的commit object的SHA-1值$ git logcommit 2616a5b40ead79df23736f61b346080423f438fe (HEAD -> master)Author: root <root@DESKTOP-CQ9JEC7.localdomain>Date: Mon Feb 3 00:14:10 2020 +0800 Hello Git$ git log mastercommit 2616a5b40ead79df23736f61b346080423f438fe (HEAD -> master)Author: root <root@DESKTOP-CQ9JEC7.localdomain>Date: Mon Feb 3 00:14:10 2020 +0800 Hello Git$ cat .git/refs/heads/master2616a5b40ead79df23736f61b346080423f438fe HEAD引用在介绍HEAD文件的时候我们说过它存放的是当前所在分支的引用,而且这个引用是个符号引用(symbolic reference)。那么什么是符号引用?它是一个指向其它引用的指针。我们可以查看之前clone下来的Explore-Git的HEAD文件 12$ cat .git/HEADref: refs/heads/master 当我们checkout到某个分支时,HEAD文件内容如下 123456$ git branch yeshan$ git checkout yeshanSwitched to branch 'yeshan'$ cat .git/HEADref: refs/heads/yeshan 至此,抛出的问题已解答完毕。 参考 Go Git:面向未来的代码平台,了解版本控制系统的发展和Git现存的问题,版本控制系统未来的走向 《Git权威指南》 - Git对象探秘 这才是真正的Git——Git内部原理揭秘! 《Pro Git》- Basic Snapshotting Git对象模型 你知道 Git 是如何做版本控制的吗 图解Git GitHub Developer REST API Git Blobs 如何读取git-ls-tree输出的模式字段 常用Git命令清单","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"}]},{"title":"React+Flask打造前后端分离项目开发环境","slug":"React-Flask打造前后端分离项目开发环境","date":"2020-01-13T12:56:16.000Z","updated":"2020-01-13T12:56:16.000Z","comments":true,"path":"2020/01/13/React-Flask打造前后端分离项目开发环境/","permalink":"https://yeshan333.github.io/2020/01/13/React-Flask%E6%89%93%E9%80%A0%E5%89%8D%E5%90%8E%E7%AB%AF%E5%88%86%E7%A6%BB%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/","excerpt":"前言 新的一年,开始水第一篇技术文。碰巧最近React玩得多,撸一篇文章纪念一下开发环境的搭建。🤔 开篇两问: 什么是React?:React,用于构建用户界面的 JavaScript 库(官网复制粘贴,真香,不用怎么写template了,舒服 什么是Flask?:一个使用Python编写的轻量级Web应用框架。用来写云原生应用很香! 先看下最终的项目结构,如下:《项目源码》 12345678910111213141516171819├── app.py├── env| ├── Include| ├── Lib| ├── LICENSE.txt| ├── Scripts| └── tcl├── frontend| ├── build| ├── node_modules| ├── package-lock.json| ├── package.json| ├── public| ├── README.md| └── src├── static| └── js└── templates └── index.html","text":"前言 新的一年,开始水第一篇技术文。碰巧最近React玩得多,撸一篇文章纪念一下开发环境的搭建。🤔 开篇两问: 什么是React?:React,用于构建用户界面的 JavaScript 库(官网复制粘贴,真香,不用怎么写template了,舒服 什么是Flask?:一个使用Python编写的轻量级Web应用框架。用来写云原生应用很香! 先看下最终的项目结构,如下:《项目源码》 12345678910111213141516171819├── app.py├── env| ├── Include| ├── Lib| ├── LICENSE.txt| ├── Scripts| └── tcl├── frontend| ├── build| ├── node_modules| ├── package-lock.json| ├── package.json| ├── public| ├── README.md| └── src├── static| └── js└── templates └── index.html 开发环境:Windows+Flask+React+Git Bash+vscode Backend-Flask 个人比较喜欢用CLI,So,项目开发依赖使用virtualenv+pip管理,pipenv也还行,虽然lock package有点久。听说比较新的poetry很香? 1234567891011# 1、安装virtualenvpip install virtualenv# 2、为项目(Flask_React)创建虚拟环境->envvirtualenv env# 3、激活虚拟环境envsource env/Scripts/activate# 4、安装项目依赖pip install -r requirments.txt# 5、创建好templates和static目录,用于存放React打包好的渲染模板和静态文件mkdir templatesmkdir static 后端服务的基础环境搭建好了,随手写个路由,看下能不能用先 1234567891011# app.pyfrom flask import Flaskapp = Flask(__name__)@app.route('/')def index(): return "<h1>Hello React+Flask!</h1>"if __name__ == '__main__': app.run('127.0.0.1', port=5000, debug=True) Frontend-React 前端React应用的开发环境使用官方提供的脚手架create-react-app搭建。 1234# 1、安装脚手架npm install -g create-react-app# 2、为Flask_React项目创建React App->frontendcreate-react-app frontend # 这里有点小久,喝杯咖啡☕摸下鱼 OK,前端开发环境搭建好了,清理掉src目录下的所有文件,自己写个组件,如下: 123cd frontend/srcrm -rf *touch index.js 1234567891011121314151617181920//index.jsimport React from 'react'import ReactDOM from 'react-dom'class App extends React.Component { render() { return ( <div className="container"> <h1 className="center-align"> 盒装一流弊<br/> <span className="waves-effect waves-light btn"> <i className="material-icons right">cloud</i>您说的都对 </span> </h1> </div> ); }}ReactDOM.render(<App />, document.getElementById('root')) OK,预览下效果,顺便调试(没啥可调试的/(ㄒoㄒ)/~~)。npm start。效果如下: 没多大问题的话,是时候打包写好的React App给后端服务了。 Done很舒服的是create-react-app封装好了 Babel 和 webpack,我们可以直接使用npm run build打包写好的App到frontend/build目录中。然后手动将生成的文件分别挪到Flask的templates和static目录中即可。等等?手动,能不能使用CLI,dang然阔以。 npm 允许我们在package.json文件里面,使用scripts字段自定义脚本命令。更舒服的是npm script提供了pre和post钩子。我们可以给build脚本命令提供两个钩子prebuild和postbuild。编辑后的package.json文件的Script命令如下如下: 12345678"scripts": { "start": "react-scripts start", "prebuild": "rm -rf ..\\\\templates\\\\index.html && rm -rf ..\\\\static", "build": "react-scripts build", "postbuild": "mv build\\\\index.html ..\\\\templates\\\\ && mv build\\\\static ..\\\\static", "test": "react-scripts test", "eject": "react-scripts eject"}, 这时候,我们执行npm run build命令时,会自动按照下面的顺序执行 123rm -rf ..\\\\templates\\\\index.html && rm -rf ..\\\\staticreact-scripts buildmv build\\\\index.html ..\\\\templates\\\\ && mv build\\\\static ..\\\\static OK,我们试试。如下: Nice,没毛病。🎉🎉🎉。改下app.py: 12345678910from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def index(): return render_template('index.html') # 渲染打包好的React App的页面if __name__ == '__main__': app.run('127.0.0.1', port=5000, debug=True) 冇问题啊!收工!!! References React Docs Create React App npm-scripts npm scripts 使用指南","categories":[{"name":"React","slug":"React","permalink":"https://yeshan333.github.io/categories/React/"}],"tags":[{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/tags/Flask/"},{"name":"React","slug":"React","permalink":"https://yeshan333.github.io/tags/React/"}]},{"title":"2019 年总结","slug":"2019年总结","date":"2019-12-31T11:15:07.000Z","updated":"2019-12-31T11:15:07.000Z","comments":true,"path":"2019/12/31/2019年总结/","permalink":"https://yeshan333.github.io/2019/12/31/2019%E5%B9%B4%E6%80%BB%E7%BB%93/","excerpt":"","text":"前言扯🥚终于考完试了(昨天下午终结了最后一科-“万恶”的复变函数🎈🎉),可以摩擦下年终总结了,花点时间想下2019年我干了什么🎁。完了写不下去了(此时中午12点59分30秒。 忆往昔-xxx~2019这一年过得无比的充实,个人感觉高中的时候都没对自己这么狠过,我怕是上了个假的大学(忽然想起高三临近高考那段时间,别人在复习,而我却趴在桌面上在睡觉<被“农药”毒害,趴了整个高三,挺对不起老师的,惭愧😥)。 以下开始略微总结下今年的操作、收获与遗憾。 阅读方面这一年看了很多的书,有技术方面的也有非技术方面的都有,我佛了,大三上一整个学期就没打过游戏,我都佩服我自己,ε=ε=ε=┏(゜ロ゜;)┛,略微罗列下: 没看完的,看了大部分,但是没再继续看 《Python密码学编程》 《Python从入门到实践》 《C++ Primer Plus》 《Python基础教程(第3版)》 《算法图解》 《啊哈!算法》 《HTTP权威指南》 《Flask Web开发:基于Python的Web应用开发实战》 《Flask 入门教程》 《Docker Deep Dive》 《Linux 就该这么学》 《How To Think Like A Computer Scientist》 可以说是看完了的 《Web全栈工程师的自我修养》 《Don’t Make Me Think》 《Growth: 全栈增长工程师指南》 《我的职业是前端工程师》 《RePractise》 …… 上图,emmm…我正在看的,希望开学前能看完大部分,又能“吹水”了,都是💪力量啊! 小声bb,我入手了套《周易》,看了那么多还是菜(太卑微了,总有那么种好高骛远的感觉!!!斑驳 技术实践与交流这一年,我喜欢上了开源社区,我的第一个issue。很幸运能够偷偷的在图灵读者群QQ当个混子,知道了Manjusaka(璈叔,一直在听大佬出《捕蛇者说》播客,收获满满),通过大佬又知道了PyCon China。今年Python30周年,PyCon China 2019大佬云集,太香了,路费太贵没能去成,没能线下见诸位大佬(太苦bi了/(ㄒoㄒ)/~~,还好有PPT和视频放出来,现在仍在反复的看一些感兴趣的Topic的Slide和视频,又get✅到了学习的新姿势。 这一年我做的都是一些小玩意,太卑微了,不敢列出来。不得不说GitHub真香,一些开源项目拿来即可用,可以快速集成到自己弄得东西上(此处吐槽😒文档写的不好或者连文档都没有的,看的太难受了)。虽然整的都是一些花里胡哨的小东西,至少我看到了自己在成长,不亏,此处上我的GitHub小绿点: 再看下大佬的,我透,我就是didi,我整的还贼水。 GitHub还有一点特别香,通过follow各领域的大佬,我能了解到一些“骚”技术(emmm。。。,有些东西我还用上了,不愧是终极程序员社交网站。此处艾特一位友链小伙伴TRHX🔗,嘿嘿嘿,你star的大部分项目我都拿来耍过几下。 emmm,很幸运的认识了友链里诸位大佬,无聊的时候经常去lu你们的文章,收获还是蛮多的。 缺憾与期待这一年有点难 自学太痛苦了(线下找不到倾诉的伙伴,院里找不到“真正”有共同兴趣、爱好、热情的伙伴,大部分人只是说说而已,行动上的弱者),真希望有个dalao带带我(枯了 我吐,一年多没跳舞了,我居然抛弃了我曾经热爱的Breaking,虽然仍在看一些街舞文化相关的节目和比赛->《这!就是街舞》、《Red Bull BC One》,但我已经不再是个纯粹的B-Boy了 感觉自己没能真正的融入开源社区,并未参与多人优质开源项目的开发 撸了一下董老师的《爱澎湃2019年度Python榜单》,发现我知道的东西还是太少,看来我对Python的热爱没有那么纯粹,信息的来源不太行 看了下我的GitHub年度报告,看来得好好养生了 期待 新的一年,我又立下了一丢丢flag🚩,不知道下学期结束前能不能操作完(☆▽☆) 稳住,别浪,Hello World -> Cloud Native, Meta Year 期待下一年能撸一个优秀的技术开源项目或者去为优秀的开源项目贡献代码 期待自己所待的科协在未来有真正强有力的积累,能发挥出“马太效应” 我似乎还没真正想明白我想要什么,不给力啊! 新一年对自己的要求:不只是要做思想上的强者,更要做行动上的强者;多思考、多折腾、多更新。很喜欢的一句话:I hear and I forget. I see and I remember. I do and I understand.","categories":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/categories/%E9%9A%8F%E7%AC%94/"}],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"愿和平永驻人间","slug":"愿和平永驻人间","date":"2019-12-13T12:25:33.000Z","updated":"2019-12-13T12:25:33.000Z","comments":true,"path":"2019/12/13/愿和平永驻人间/","permalink":"https://yeshan333.github.io/2019/12/13/%E6%84%BF%E5%92%8C%E5%B9%B3%E6%B0%B8%E9%A9%BB%E4%BA%BA%E9%97%B4/","excerpt":"","text":"","categories":[{"name":"memory","slug":"memory","permalink":"https://yeshan333.github.io/categories/memory/"}],"tags":[{"name":"memory","slug":"memory","permalink":"https://yeshan333.github.io/tags/memory/"}]},{"title":"❤Thanksgiving❤","slug":"heart","date":"2019-11-28T23:50:56.000Z","updated":"2019-11-28T23:50:56.000Z","comments":true,"path":"2019/11/28/heart/","permalink":"https://yeshan333.github.io/2019/11/28/heart/","excerpt":"","text":"","categories":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/categories/%E9%9A%8F%E7%AC%94/"}],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"Serialization and Deserialization","slug":"Serialization-and-Deserialization","date":"2019-11-25T16:25:23.000Z","updated":"2019-11-25T16:25:23.000Z","comments":true,"path":"2019/11/25/Serialization-and-Deserialization/","permalink":"https://yeshan333.github.io/2019/11/25/Serialization-and-Deserialization/","excerpt":"序列化与反序列化 Serialization:Data Structure/Object –> Binary StringDeserialization:Binary String –> Data Structure/ObjectGoals:Cross-platform Communication、Persistent Storage and More Python中对象的序列化与反序列化pickle module pickle 仅可用于 Python,pickle所使用的数据流格式仅可用于 Pythonpickle 模块可以将复杂对象转换为字节流,也可以将字节流转换为具有相同内部结构的对象。可被pickling和unpickling的对象:https://docs.python.org/zh-cn/3/library/pickle.html#what-can-be-pickled-and-unpickled pickle提供了优秀的方法方便我们对对象进行pickling(封存)和unpickling(解封)","text":"序列化与反序列化 Serialization:Data Structure/Object –> Binary StringDeserialization:Binary String –> Data Structure/ObjectGoals:Cross-platform Communication、Persistent Storage and More Python中对象的序列化与反序列化pickle module pickle 仅可用于 Python,pickle所使用的数据流格式仅可用于 Pythonpickle 模块可以将复杂对象转换为字节流,也可以将字节流转换为具有相同内部结构的对象。可被pickling和unpickling的对象:https://docs.python.org/zh-cn/3/library/pickle.html#what-can-be-pickled-and-unpickled pickle提供了优秀的方法方便我们对对象进行pickling(封存)和unpickling(解封) 使用dumps和loads方法进行序列化和反序列化123456789101112131415>>> import pickle>>> person = dict(name='shan', age=20, sex="man")>>> pickle.dumps(person) # dumps方法会将obj序列化为bytes返回b'\\x80\\x03}q\\x00(X\\x04\\x00\\x00\\x00nameq\\x01X\\x04\\x00\\x00\\x00shanq\\x02X\\x03\\x00\\x00\\x00ageq\\x03K\\x14X\\x03\\x00\\x00\\x00sexq\\x04X\\x03\\x00\\x00\\x00manq\\x05u.>>>>>> with open("dump.txt","wb") as f:... pickle.dump(person, f)...>>> f = open("dump.txt","rb")>>> d = pickle.load(f)>>> f.close()>>> d{'name': 'shan', 'age': 20, 'sex': 'man'}>>> pickle.loads(pickle.dumps(d)){'name': 'shan', 'age': 20, 'sex': 'man'} https://docs.python.org/zh-cn/3/library/pickle.html#pickle.dump bytes对象是由单个字节组成的不可变序列 使用dump方法可将序列化的对象写入file obj load用于还原封存生成的bytes_object,loads方法用于还原从文件中读取的封存对象 json module 相比于pickle,json只能表示内置类型的子集,不能表示自定义的类json格式的文件的易读性更好Python json模块提供的API与pickle模块很相似 使用dumps和loads进行序列化和反序列化12345678>>> import json>>> person = dict(name='shan', age=20, sex="man")>>> json.dumps(person)'{"name": "shan", "age": 20, "sex": "man"}'>>>>>> json_str = json.dumps(person)>>> json.loads(json_str){'name': 'shan', 'age': 20, 'sex': 'man'} dumps方法会将obj转换为标准格式的JSON str并返回 loads方法可将包含JSON文档的str、bytes或者bytearray反序列化为Python对象 自定义对象的序列化与反序列化 对于自定义对象的序列化和反序列化操作需要我们实现专门的encoder和decoder需要用到dumps方法的default参数和loads方法的object_hook参数https://docs.python.org/3/library/json.html#json.loadshttps://docs.python.org/3/library/json.html#json.loads 1234567891011121314151617181920212223242526272829>>> import json>>>>>> class Student(object):... def __init__(self, name, age, score):... self.name = name... self.age = age... self.score = score...>>> def student2dict(std):... return {... 'name': std.name,... 'age': std.age,... 'score': std.score... }...>>> def dict2student(d):... return Student(d['name'], d['age'], d['score'])...>>> s = Student('Bob', 20, 88)>>> print(json.dumps(s, default=student2dict)){"name": "Bob", "age": 20, "score": 88}>>> json_str = json.dumps(s, default=student2dict)>>> print(json.loads(json_str, object_hook=dict2student))<__main__.Student object at 0x000001B101675198>>>> json.loads(json_str, object_hook=dict2student)<__main__.Student object at 0x000001B101675128>>>> old = json.loads(json_str, object_hook=dict2student)>>> old.name'Bob' third-party module:marshmallow marshmallow is an ORM/ODM/framework-agnostic library for converting complex datatypes, such as objects, to and from native Python datatypes. 1234567891011121314151617181920212223>>> import datetime as dt>>> import marshmallow>>> from dataclasses import dataclass>>>>>> from marshmallow import Schema, fields>>>>>> @dataclass... class Album:... title: str... release_date: dt.date...>>> class AlbumSchema(Schema):... title = fields.Str()... release_date = fields.Date()...>>> album = Album("Seven Innovation Base", dt.date(2019, 11, 23))>>> schema = AlbumSchema()>>> data = schema.dump(album) # obj -> dict>>> data{'title': 'Seven Innovation Base', 'release_date': '2019-11-23'}>>> data_str = schema.dumps(album) # obj -> str>>> data_str'{"title": "Seven Innovation Base", "release_date": "2019-11-23"}' 使用 marshmallow 可以很方便的对自定义对象进行序列化和反序列化 对object进行在序列化之前,需要为object创建一个schema,schema中的字段名必须与自定义的object中的成员一致 dumps method:obj -> str, dump method:obj -> dict 反序列化的 dict -> obj 需要使用decorator:post_load自己实现 12345678910111213141516171819202122232425from marshmallow import Schema, fields, post_loadclass User: def __init__(self, name, email): self.name = name self.email = email def __repr__(self): return "<User(name={self.name!r})>".format(self=self)class UserSchema(Schema): name = fields.Str() email = fields.Email() @post_load def make_user(self, data, **kwargs): return User(**data)user_data = { "email": "ken@yahoo.com", "name": "Ken",}schema = UserSchema()result = schema.load(user_data)print(result) # 输出结果:<User(name='Ken')> References 序列化与反序列化 pickle module json module bytes RESTful API编写指南 Flask RESTful API开发之序列化与反序列化 marshmallow","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"Json","slug":"Json","permalink":"https://yeshan333.github.io/tags/Json/"}]},{"title":"map-filter-reduce","slug":"map-filter-reduce","date":"2019-11-14T21:49:41.000Z","updated":"2019-11-14T21:49:41.000Z","comments":true,"path":"2019/11/14/map-filter-reduce/","permalink":"https://yeshan333.github.io/2019/11/14/map-filter-reduce/","excerpt":"听说函数式编程很⑥,咱也不知道,咱也不晓得,还没实际用过。emmm。。。。,先mark下Python中和函数式编程有关的部分功能先,又开始水了,立个flag🚩:慢慢完善 map先看下Python官方文档的说法 map(function, iterable, …),返回一个将 function 应用于 iterable 中每一项并输出其结果的迭代器。 如果传入了额外的 iterable 参数,function 必须接受相同个数的实参并被应用于从所有可迭代对象中并行获取的项。 见识一下 123456789101112>>> def cook(something):... if something == "cow":... return "hamburger"... elif something == "tomato":... return "chips"... elif something == "chicken":... return "ddrumstick"... elif something == "corn":... return "popcorn"...>>> list(map(cook, ["cow", "tomato", "chicken", "corn"]))['hamburger', 'chips', 'ddrumstick', 'popcorn']","text":"听说函数式编程很⑥,咱也不知道,咱也不晓得,还没实际用过。emmm。。。。,先mark下Python中和函数式编程有关的部分功能先,又开始水了,立个flag🚩:慢慢完善 map先看下Python官方文档的说法 map(function, iterable, …),返回一个将 function 应用于 iterable 中每一项并输出其结果的迭代器。 如果传入了额外的 iterable 参数,function 必须接受相同个数的实参并被应用于从所有可迭代对象中并行获取的项。 见识一下 123456789101112>>> def cook(something):... if something == "cow":... return "hamburger"... elif something == "tomato":... return "chips"... elif something == "chicken":... return "ddrumstick"... elif something == "corn":... return "popcorn"...>>> list(map(cook, ["cow", "tomato", "chicken", "corn"]))['hamburger', 'chips', 'ddrumstick', 'popcorn'] filter也看下官方文档的说法 filter(function, iterable),用 iterable 中函数 function 返回真的那些元素,构建一个新的迭代器。iterable 可以是一个序列,一个支持迭代的容器,或一个迭代器。如果 function 是 None ,则会假设它是一个身份函数,即 iterable 中所有返回假的元素会被移除。 也见识下 123456789>>> def isVegetarian(food):... check = ['chips', 'popcorn']... if food in check:... return True... else:... return False...>>> list(filter(isVegetarian, ['hamburger', 'chips', 'ddrumstick', 'popcorn']))['chips', 'popcorn'] reduce再看下官方文档 Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to >reduce the iterable to a single value. 见识下 123>>> from functools import reduce>>> reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])15 一图胜千言 曾看到过一张把filter、map、reduce描述得很透彻得图,真滴六🐂 references Demonstrating map, filter, and reduce in Swift using food emoji 函数式编程指引 functools.reduce map","categories":[{"name":"函数式编程","slug":"函数式编程","permalink":"https://yeshan333.github.io/categories/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"函数式编程","slug":"函数式编程","permalink":"https://yeshan333.github.io/tags/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B/"}]},{"title":"git clone后如何checkout到remote branch","slug":"clone后如何checkout到remote-branch","date":"2019-10-27T00:36:10.000Z","updated":"2019-10-27T00:36:10.000Z","comments":true,"path":"2019/10/27/clone后如何checkout到remote-branch/","permalink":"https://yeshan333.github.io/2019/10/27/clone%E5%90%8E%E5%A6%82%E4%BD%95checkout%E5%88%B0remote-branch/","excerpt":"","text":"what/why通常情况使用git clone github_repository_address下载下来的仓库使用git branch查看当前所有分支时只能看到master分支,但是想要切换到其他分支进行工作怎么办❓ 其实使用git clone下载的repository没那么简单😥,clone得到的是仓库所有的数据,不仅仅是复制在Github repository所能看到的master分支下的所有文件,clone下来的是仓库下的每一个文件和每一个文件的版本(也就是说所有的分支都被搞下来了咯),那为啥看不到,其实remote branch被隐藏了,需要使用git branch -a才能看到。 howemmm…,现在看到了,那么怎么切换到remote branch呢?(我太难了🙃),又到了查文档的时候了,一波操作过后了解到git checkout是有restore working tree files的功能的,可以用来restore remote branch,比如使用以下命令在本地创建个新分支track远程分支: 1$ git checkout -b <branch> --track <remote>/<branch> 12# 例子,本地为远程分支CkaiGrac-PYMO创建的新分支名为yeshan,push时需要注意git checkout -b yeshan --track origin/CkaiGrac-PYMO tips:使用git checkout -t <remote/branch>默认会在本地建立一个和远程分支名字一样的分支 reference git-branch: https://git-scm.com/docs/git-branch git-checkout: https://git-scm.com/docs/git-checkout","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"}]},{"title":"使用Microsoft Edge Beta将网页变成应用","slug":"使用Microsoft-Edge-Beta将网页变成应用","date":"2019-10-11T23:50:56.000Z","updated":"2019-10-11T23:50:56.000Z","comments":true,"path":"2019/10/11/使用Microsoft-Edge-Beta将网页变成应用/","permalink":"https://yeshan333.github.io/2019/10/11/%E4%BD%BF%E7%94%A8Microsoft-Edge-Beta%E5%B0%86%E7%BD%91%E9%A1%B5%E5%8F%98%E6%88%90%E5%BA%94%E7%94%A8/","excerpt":"","text":"今天无聊的我打开了装了很久都没用的Microsoft Edge Beta,一波乱戳,惊讶的发现Microsoft Edge Beta居然有将网页打包为应用的功能😂 B站也有PC”客户端”了,真香😂","categories":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/categories/%E9%9A%8F%E7%AC%94/"}],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"简单感受下Python内置数据类型常用操作的性能","slug":"简单了解下Python内置数据类型常用操作的性能","date":"2019-10-02T19:01:46.000Z","updated":"2019-10-02T19:01:46.000Z","comments":true,"path":"2019/10/02/简单了解下Python内置数据类型常用操作的性能/","permalink":"https://yeshan333.github.io/2019/10/02/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3%E4%B8%8BPython%E5%86%85%E7%BD%AE%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E5%B8%B8%E7%94%A8%E6%93%8D%E4%BD%9C%E7%9A%84%E6%80%A7%E8%83%BD/","excerpt":"生成一个列表的几种方式的性能对比12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152# -*- coding: utf-8 -*-from timeit import Timerimport matplotlib.pyplot as plt# 列表常用操作性能测试# 迭代 + '+'def test1(): l = [] for i in range(1000): l = l + [i]# 迭代 + appenddef test2(): l = [] for i in range(1000): l.append(i)# 列表生成式def test3(): l = [i for i in range(1000)]# list构造函数 + rangedef test4(): l = list(range(1000))t1 = Timer("test1()", "from __main__ import test1")# print("concat %f seconds" % t1.timeit(number=1000))t2 = Timer("test2()", "from __main__ import test2")# print("concat %f seconds" % t2.timeit(number=1000))t3 = Timer("test3()", "from __main__ import test3")# print("concat %f seconds" % t3.timeit(number=1000))t4 = Timer("test4()", "from __main__ import test4")# print("concat %f seconds" % t4.timeit(number=1000))result = [t1.timeit(1000), t2.timeit(1000), t3.timeit(1000), t4.timeit(1000)]method = ["for+ '+'", "for + append", "list comprehension", "list + range"]plt.bar(method, result, color='rgby')# plt.legend('concat time')# print(zip(method, result))for x,y in zip(method, result): plt.text(x, y, "%fs" % y)plt.show()","text":"生成一个列表的几种方式的性能对比12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152# -*- coding: utf-8 -*-from timeit import Timerimport matplotlib.pyplot as plt# 列表常用操作性能测试# 迭代 + '+'def test1(): l = [] for i in range(1000): l = l + [i]# 迭代 + appenddef test2(): l = [] for i in range(1000): l.append(i)# 列表生成式def test3(): l = [i for i in range(1000)]# list构造函数 + rangedef test4(): l = list(range(1000))t1 = Timer("test1()", "from __main__ import test1")# print("concat %f seconds" % t1.timeit(number=1000))t2 = Timer("test2()", "from __main__ import test2")# print("concat %f seconds" % t2.timeit(number=1000))t3 = Timer("test3()", "from __main__ import test3")# print("concat %f seconds" % t3.timeit(number=1000))t4 = Timer("test4()", "from __main__ import test4")# print("concat %f seconds" % t4.timeit(number=1000))result = [t1.timeit(1000), t2.timeit(1000), t3.timeit(1000), t4.timeit(1000)]method = ["for+ '+'", "for + append", "list comprehension", "list + range"]plt.bar(method, result, color='rgby')# plt.legend('concat time')# print(zip(method, result))for x,y in zip(method, result): plt.text(x, y, "%fs" % y)plt.show() list和dict的检索效率对比123456789101112131415161718192021222324252627282930# -*- coding: utf-8 -*-import randomfrom timeit import Timerimport matplotlib.pyplot as pltlst_result = []d_result = []for i in range(10000,1000001,20000): t = Timer("random.randrange(%d) in x" % i, "from __main__ import random,x") x = list(range(i)) lst_time = t.timeit(number=1000) x = {j:None for j in range(i)} d_time = t.timeit(number=1000) lst_result.append(lst_time) d_result.append(d_time) print("%d,%10.3f,%10.3f" % (i, lst_time, d_time))test = [i for i in range(10000,1000001,20000)]plt.plot(test, lst_result, 'ro')plt.plot(test, d_result, 'bo')plt.legend(['List','Dictionary'])plt.show() del list[index]与del dict[key] 性能对比 average time complexity:$ O(n)\\ \\ vs\\ \\ O(1) $ 1234567891011121314151617181920212223242526272829303132# -*- coding: utf-8 -*-import randomfrom timeit import Timerimport matplotlib.pyplot as pltsize = 20000l_result = []d_result = []for i in range(size): test_list = [i for i in range(size)] list_t = Timer("del test_list[%d]" % i,"from __main__ import test_list") list_result = list_t.timeit(number=1) l_result.append(list_result) test_dict = {j:None for j in range(size)} dict_t = Timer("del test_dict[%d]" % i,"from __main__ import test_dict") dict_result = dict_t.timeit(number=1) d_result.append(dict_result) # print("%d,%f,%f" % (i, list_result, dict_result))plt.plot(range(size), l_result)plt.plot(range(size), d_result)plt.legend(['del list[index]', 'del dict[key]'])plt.show() 参考 matplotlib中文文档 TimeComplexity 北大数据结构与算法公开课 Python timeit","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"Python 环境管理与项目依赖管理","slug":"Python环境管理","date":"2019-09-02T13:07:13.000Z","updated":"2019-09-02T13:07:13.000Z","comments":true,"path":"2019/09/02/Python环境管理/","permalink":"https://yeshan333.github.io/2019/09/02/Python%E7%8E%AF%E5%A2%83%E7%AE%A1%E7%90%86/","excerpt":"个人简单记录下 virtualenv + pip virtualenv是一个用于创建”隔离的ython运行环境”的工具,Docspip是Python的包管理工具,Docs 1234567891011121314# 安装virtualenvpip install virtualenv# -------------------------------- ## 虚拟环境的创建与使用# 1、在当前工程目录下使用virtualenv创建一套独立的Python运行环境virtualenv venv # 环境名为venv(自由定义)# 2、cd 到创建好的虚拟环境的Scripts目录,执行如下命令可激活或者退出虚拟环境activate # 激活,激活后命令提示符会变成当前工程目录Python环境名deactivate # 退出# 3、激活虚拟环境后可使用pip为当前项目安装依赖,example:pip install numpy# 4、使用pip freeze > requirements.txt 可导出项目依赖到requirements.txt中# 为项目创建一个新的、干净的环境时,可使用 pip install -r requiremen.txt 为项目安装依赖","text":"个人简单记录下 virtualenv + pip virtualenv是一个用于创建”隔离的ython运行环境”的工具,Docspip是Python的包管理工具,Docs 1234567891011121314# 安装virtualenvpip install virtualenv# -------------------------------- ## 虚拟环境的创建与使用# 1、在当前工程目录下使用virtualenv创建一套独立的Python运行环境virtualenv venv # 环境名为venv(自由定义)# 2、cd 到创建好的虚拟环境的Scripts目录,执行如下命令可激活或者退出虚拟环境activate # 激活,激活后命令提示符会变成当前工程目录Python环境名deactivate # 退出# 3、激活虚拟环境后可使用pip为当前项目安装依赖,example:pip install numpy# 4、使用pip freeze > requirements.txt 可导出项目依赖到requirements.txt中# 为项目创建一个新的、干净的环境时,可使用 pip install -r requiremen.txt 为项目安装依赖 Pipenv Pipenv集包管理和虚拟环境管理于一身,使用Pipfile和Pipfile.lock管理项目依赖(Pipfile中保存着各个依赖包的版本信息,Pipfile.lock保存着依赖包的锁信息)。Docs Pipenv playground Pipfile and Pipfile.lock 123456789101112# 安装pip install pipenv# ------------------ ## Pipenv的使用# 1、为当前工程创建虚拟环境pipenv install # 这里会生成Pipfile和Pipfile.lock文件# 2、虚拟环境的激活pipenv shell # 激活虚拟环境# 3、安装依赖pipenv install [package_name]# 4、在虚拟环境中运行Python脚本pipenv run xxx.py Poetry Poetry是新一代的用来处理依赖项的安装、构建和打包成Python包的工具(2018年2月28日发布0.1.0版本),Poetry使用pyproject.toml管理项目依赖。Docs 12345678910111213# Poetry的安装pip install poetry# ---------------------- ## poetry的使用# 1、快速创建一个Python项目poetry new [project_name]# 2、以交互式的方式为当前项目创建pyproject.toml文件poetry init# 3、为当前项目添加依赖poetry add [package_name]# 4、构建源码并对当前项目进行wheels archive(打包成Python包)poetry build 拓展关于Wheel打包格式《PEP427》","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"环境管理","slug":"环境管理","permalink":"https://yeshan333.github.io/tags/%E7%8E%AF%E5%A2%83%E7%AE%A1%E7%90%86/"}]},{"title":"docker学习笔记","slug":"docker学习笔记","date":"2019-08-08T17:29:19.000Z","updated":"2019-08-08T17:29:19.000Z","comments":true,"path":"2019/08/08/docker学习笔记/","permalink":"https://yeshan333.github.io/2019/08/08/docker%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/","excerpt":"Play With Docker一个免费使用的基于web界面的Docker环境 常用docker命令可使用docker COMMAND --help查看命令的用法 Docker镜像相关 1、docker image pull:用于下载镜像,镜像从远程镜像仓库服务的仓库中下载,默认从Docker Hub的仓库中拉取 1234# 格式:docker pull [OPTIONS] NAME[:TAG|@DIGEST]# 说明:如果给出tag,一般拉取latest,name一般为username/repository,digest为镜像摘要可不给出docker image pull ubuntu:latest# 这个拉取标签为latest的ubuntu官方镜像,latest: Pulling from library/ubuntu,latest不一定是最新镜像","text":"Play With Docker一个免费使用的基于web界面的Docker环境 常用docker命令可使用docker COMMAND --help查看命令的用法 Docker镜像相关 1、docker image pull:用于下载镜像,镜像从远程镜像仓库服务的仓库中下载,默认从Docker Hub的仓库中拉取 1234# 格式:docker pull [OPTIONS] NAME[:TAG|@DIGEST]# 说明:如果给出tag,一般拉取latest,name一般为username/repository,digest为镜像摘要可不给出docker image pull ubuntu:latest# 这个拉取标签为latest的ubuntu官方镜像,latest: Pulling from library/ubuntu,latest不一定是最新镜像 2、docker image ls:列出本地Docker主机上存储的镜像 3、docker image inspect:查看镜像的细节,包括镜像层数据和元数据 12# docker image inspect [OPTIONS] IMAGE [IMAGE...]# inspect后一般跟repository name或image id 4、docker image rm:用于删除镜像。如果镜像存在关联的容器,并且容器处于运行(Up)或停止(Exit)状态时,不允许删除该镜像。rm后可跟repository或image id 5、dicker image search:从Docker Hub查找镜像 6、docker image build:根据Dockerfile构建镜像 12# 例如:使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。docker build -t yeshan333/ubuntu:latest . 7、docker image history:用于查看镜像构建的相关信息 Docker容器相关 1、docker container run:用于启动新容器 123456789101112# 格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]# 常用options:# -d: 后台运行容器,并返回容器ID;# -i: 以交互模式运行容器,通常与 -t 同时使用;# -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;# -P: 随机端口映射,容器内部端口随机映射到主机的高端口# -p: 指定端口映射,格式为:主机(宿主)端口:容器端口# --name="container-name": 为容器指定一个名称;# 示例docker container run -it ubuntu:latest /bin/bash# 说明:-it使容器具备交互性并与终端连接,命令最后表明运行容器中的Bash Shell程序 2、docker container ls:列出所有运行状态的容器可用docker ps代替,如果加个**-a*附加参数,会列出所有容器(包括处于停止状态的容器) 3、docker container stop:停止运行中的容器,并将其状态设置为Exited(0),stop后跟container name或container id 4、docker container rm:用于删除停止运行的容器,rm后跟container name或container id,使用-f参数可强制删除运行中的容器 5、docker container exec:用于连接一个处于运行状态的容器 123# 例如:docker container exec -t <container-name or container-id> bash# 该命令会将docker主机中的shell连接到一个运行中的容器,在容器内部启动一个新的bash shell进程 6、docker container start:用于重启处于停止(Exited)状态的容器,start后跟container name或container id 7、docker container inspect:查看容器的配置信息和运行时信息,inspect后跟container name或container id 8、快捷键Ctrl+PQ用于断开docker主机的shell终端与容器终端的连接,并在退出后保证容器在后台运行 应用容器化 (Containerizing|Dockerizing)即将应用整合到容器中并且运行的过程 应用容器化的一般步骤 1、编写应用代码 2、创建Dockerfile,其中包括当前应用的描述、依赖以及如何运行这个应用 3、对Dockerfile执行docker image build命令 4、等待Docker将应用程序构建到Docker镜像中 Once your app is containerized (made into a Docker image), you’re ready to ship it and run it as a container.《Docker Deep Dive》 使用Dockerfile定制镜像 Dockerfile最佳实践 使用Dockerfile定制镜像 Dockerfile中以#开头的都是注释行,除注释之外,每一行都是一条指令指令的的一般格式:INSTRUCTION argument,INSTRUCTION一般都为大写 示例Dockerfile:https://github.com/yeshan333/psweb 123456789101112131415161718FROM alpineLABEL maintainer="nigelpoulton@hotmail.com"# Install Node and NPMRUN apk add --update nodejs nodejs-npm# Copy app to /srcCOPY . /srcWORKDIR /src# Install dependenciesRUN npm installEXPOSE 8080ENTRYPOINT ["node", "./app.js"] 说明: 每个Dockerfile文件文件的第一行一般都是FROM指令。FROM指定的镜像会作为当前镜像的一个基础镜像层,当前应用的剩余内容会作为新的镜像层添加到基础镜像层之上。,FROM建议引用官方镜像 LABEL指定当前镜像维护者,给镜像使用者一个沟通渠道 RUN apk add --update nodejs nodejs-npm将当前应用的依赖安装到镜像中,RUN指令会新建一个镜像层存储这些内容 COPY . /src会将应用相关文件从构建上下文复制到当前镜像中,这会新建一个镜像层 WORKDIR /src会为Dockerfile中未执行的指令设置工作目录 RUN npm install在当前工作目录中为应用安装依赖,这会新建一个镜像层 EXPOSE 8080对外提供一个web服务端口 ENTRYPOINT ["node", "./app.js"]指定了当前镜像的入口程序,container运行时就会运行 构建镜像使用docker image build根据Dockerfile制作镜像,示例: 123# -t用于指定制作好的镜像的名字及标签,通常 name:tag 或者 name# 最后的 . 表示使用当前目录作为构建上下文docker image build -t web:latest . 使用docker image history web:latest可以查看构建镜像过程中执行了哪些指令 推送镜像到Docker Hub 推送镜像前建议使用以下命令给镜像打新标签12# new-tag建议以自己的 DockerHub ID/new-tag 的格式命名,方便推送到自己的repodocker image tag <current-tag> <new-tag> 使用docker image push <tag-name>推送镜像,推送前需要docker login,记得测试打包好的应用再推送!!! Dockerfile常用指令 指令 说明 FROM 指定要构建的镜像的基础镜像,一般为Dockerfile文件第一行 RUN 用于在镜像中执行命令,会新建一个镜像层 COPY 一般用于将应用代码copy到镜像中,这会新建一个镜像层 WORKDIR 用于设置Dockerfile中未执行的指令的工作目录 ENTRYPOINT 指定镜像以容器方式启动后默认运行的程序, ENTRYPOINT 的命令不会被docker run指定要执行的命令覆盖 CMD 指定容器启动时执行的命令,一个 Dockerfile 中只能有一个 CMD 指令,如果写了多个,那么只有最后一个会执行。CMD 和 ENTRYPOINT 同时存在时,CMD 中的内容会变成 ENTRYPOINT 中指令命令的默认参数,该参数可以被 docker run 时设置的命令覆盖 ENV 设置镜像中的环境变量 EXPOSE 记录应用所使用的网络端口 更多: Dockerfile指令详解 Dockerfile reference","categories":[{"name":"docker","slug":"docker","permalink":"https://yeshan333.github.io/categories/docker/"}],"tags":[{"name":"docker","slug":"docker","permalink":"https://yeshan333.github.io/tags/docker/"}]},{"title":"几个不错的Jupyter Notebook云端展示平台","slug":"几个不错的Jupyter Notebook云端展示平台","date":"2019-08-07T09:27:50.000Z","updated":"2019-08-07T09:27:50.000Z","comments":true,"path":"2019/08/07/几个不错的Jupyter Notebook云端展示平台/","permalink":"https://yeshan333.github.io/2019/08/07/%E5%87%A0%E4%B8%AA%E4%B8%8D%E9%94%99%E7%9A%84Jupyter%20Notebook%E4%BA%91%E7%AB%AF%E5%B1%95%E7%A4%BA%E5%B9%B3%E5%8F%B0/","excerpt":"jupyter nbviewerURL:https://nbviewer.jupyter.org/ 结合Github的示例用法:https://nbviewer.jupyter.org/github/ + <用户名或者用户名/存放ipynb文件的仓库或者Gist ID> 例如:https://nbviewer.jupyter.org/github/yeshan333/JupyterNotebook-Show-sample","text":"jupyter nbviewerURL:https://nbviewer.jupyter.org/ 结合Github的示例用法:https://nbviewer.jupyter.org/github/ + <用户名或者用户名/存放ipynb文件的仓库或者Gist ID> 例如:https://nbviewer.jupyter.org/github/yeshan333/JupyterNotebook-Show-sample 还行~~~ binderURL:https://mybinder.org 使用文档:https://mybinder.readthedocs.io/en/latest/index.html# 结合Github的示例用法:https://mybinder.org/v2/gh/ + <用户名/仓库名> + /分支名 + ?filepath= + ipynb文件名 例如:https://mybinder.org/v2/gh/yeshan333/JupyterNotebook-Show-sample/master?filepath=demo.ipynb 很nice啊,在线交互式环境,在线跑代码,就是渲染有点小慢 google colab官方介绍:https://colab.research.google.com/notebooks/welcome.ipynb,需要科学上网 结合Github的示例用法:https://colab.research.google.com/github/ + 用户名/ + 存放ipynb文件的仓库名/ + blob/ + 分支名 + 要展示的ipynb文件路径 示例:https://colab.research.google.com/github/yeshan333/JupyterNotebook-Show-sample/blob/master/demo.ipynb 也是个在线的交互式环境,很nice了","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"Jupyter","slug":"Jupyter","permalink":"https://yeshan333.github.io/tags/Jupyter/"}]},{"title":"pdb && cProfile","slug":"pdb-profile","date":"2019-07-28T15:55:48.000Z","updated":"2019-07-28T15:55:48.000Z","comments":true,"path":"2019/07/28/pdb-profile/","permalink":"https://yeshan333.github.io/2019/07/28/pdb-profile/","excerpt":"pdb https://docs.python.org/zh-cn/3.7/library/pdb.html#module-pdb 使用方式 1、在命令行下直接运行调试 1python -m pdb test.py 2、在需要被调试的代码中添加import pdb、pdb.set_trace()再运行代码进行调试","text":"pdb https://docs.python.org/zh-cn/3.7/library/pdb.html#module-pdb 使用方式 1、在命令行下直接运行调试 1python -m pdb test.py 2、在需要被调试的代码中添加import pdb、pdb.set_trace()再运行代码进行调试 1234567891011# test.pydef func(): print('enter func()')a = 1b = 2import pdbpdb.set_trace() # 运行到此处启动pdbfunc()c = 3print(a + b + c) 常用命令 简写 说明 p <变量名> 输出变量的值 l 列出源码,当前位置前后11行 n 执行吓一条语句 s 执行下一条语句,如果是函数,则会进入函数内,显示–call–,执行函数内第一条语句,执行完函数内语句后跳出显示–return– b 列出当前所有断点 b lineno 在某行添加断点 cl 清除断点 q 退出调试pdb help 帮助 cProfile-性能分析 https://docs.python.org/zh-cn/3.7/library/profile.html 123456789101112131415161718192021222324252627# test.pydef memoize(f): memo = {} def helper(x): if x not in memo: memo[x] = f(x) return memo[x] return helper@memoizedef fib(n): if n == 0: return 0 elif n == 1: return 1 else: return fib(n-1) + fib(n-2)def fib_seq(n): res = [] if n > 0: res.extend(fib_seq(n-1)) res.append(fib(n)) return resfib_seq(30) 1python -m cProfile test.py ncalls:相应代码/函数被调用的次数 tottime:相应代码/函数执行所需时间(不包括它调用的其他代码/函数的时间) tottime percall:tottime/ncalls的结果 cumtime:对应代码/函数执行所需时间,包含它调用的其他代码/函数的时间 cumtime percall:cumtime和ncall相除的平均结果","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"debug","slug":"debug","permalink":"https://yeshan333.github.io/tags/debug/"}]},{"title":"Python-自定义上下文管理器","slug":"Python-自定义上下文管理器","date":"2019-07-26T16:30:46.000Z","updated":"2019-07-26T16:30:46.000Z","comments":true,"path":"2019/07/26/Python-自定义上下文管理器/","permalink":"https://yeshan333.github.io/2019/07/26/Python-%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%8A%E4%B8%8B%E6%96%87%E7%AE%A1%E7%90%86%E5%99%A8/","excerpt":"上下文管理器 上下文管理器可以帮助我们自动分配和释放资源 上下文管理器需要配合with语句使用 比如进行文件操作的时候我们可能会忘记操作后关闭文件(file close),使用with open(filename, mode) as f不需要我们手动关闭文件,不管处理文件中是否有异常出现,都能保证with语句执行完毕后关闭文件,有效防止资源泄露,安全多了。 123# with 语句的一般格式with context_expression [as target(s)]: with-body 在执行with-body会调用上下文管理器的__enter__方法,执行完with-body之后再调用上下文管理器的__exit__方法","text":"上下文管理器 上下文管理器可以帮助我们自动分配和释放资源 上下文管理器需要配合with语句使用 比如进行文件操作的时候我们可能会忘记操作后关闭文件(file close),使用with open(filename, mode) as f不需要我们手动关闭文件,不管处理文件中是否有异常出现,都能保证with语句执行完毕后关闭文件,有效防止资源泄露,安全多了。 123# with 语句的一般格式with context_expression [as target(s)]: with-body 在执行with-body会调用上下文管理器的__enter__方法,执行完with-body之后再调用上下文管理器的__exit__方法 基与类的上下文管理器 基与类的上下文管理器需要我们实现对象的__enter()__和__exit()__方法 我们需要在__enter()__中管理资源对象,在__exit__()中释放资源 enter 方法在 with 语句体执行前调用,with 语句将该方法的返回值赋给 as 字句中的变量,如果有 as 字句的话 123456789101112131415161718192021222324# 模拟 Python 的打开文件、关闭文件操作class Filemanager: def __init__(self, name, mode): print('calling __init__ method') self.name = name self.mode = mode self.file = None def __enter__(self): print('caling __enter__ method') self.file = open(self.name, self.mode) return self.file def __exit__(self, exc_type, exc_val, exc_tb): print('caling __exit__ method') if self.file: self.file.close# Filemanager为上下文管理器# with Filemanager('test.txt', 'w') as f 是上下文表达式,f为资源对象with Filemanager('test.txt', 'w') as f: print('ready to write to file') f.write('Hello World') 运行结果解析: 1、with 语句调用__init__方法,初始化对象 2、with 语句先暂存了Filemanager的__exit__方法 3、然后调用__enter__方法,输出caling enter method,返回资源对象(这里是文件句柄)给f 4、输出ready to write to file,将Hello World写入文件 5、最后调用__exit__方法,输出caling exit method,关闭之前打开的文件流 注意:__exit__方法中的参数exc_type、exc_val、exc_tb分别表示exception type、exception value、traceback。进行资源回收时如果有异常抛出,那么异常的信息就会包含再这三个变量中,让我们可以再__exit__中处理这些异常。例如: 12345678910111213141516171819class Foo: def __init__(self): print('__init__ called') def __enter__(self): print('__enter__ called') return self def __exit__(self, exc_type, exc_value, exc_tb): print('__exit__ called') if exc_type: print(f'exc_type: {exc_type}') print(f'exc_value: {exc_value}') print(f'exc_traceback: {exc_tb}') print('exception handled') return Truewith Foo() as obj: raise Exception('exception raised').with_traceback(None) 123456789101112131415161718192021222324输出结果:---------------------------------------1、__exit__返回 True__init__ called__enter__ called__exit__ calledexc_type: <class 'Exception'>exc_value: exception raisedexc_traceback: <traceback object at 0x00000234AA532F08>exception handled---------------------------------------2、__exit__返回 False__init__ called__enter__ called__exit__ calledexc_type: <class 'Exception'>exc_value: exception raisedexc_traceback: <traceback object at 0x00000120D0324F88>exception handledTraceback (most recent call last): File "e:\\Blog\\shansan\\source\\_posts\\context.py", line 19, in <module> raise Exception('exception raised').with_traceback(None)Exception: exception raised--------------------------------------- 发生异常时,__exit__方法返回 True 表示不处理异常,否则会在退出该方法后重新抛出异常以由 with 语句之外的代码逻辑进行处理。 基与生成器的上下文管理器 基于生成器的上下文管理器的实现需要使用@contextmanage装饰器 我们需要在finally block 中释放资源 12345678910111213from contextlib import contextmanager@contextmanagerdef file_manager(name, mode): try: f = open(name, mode) yield f finally: f.close()with file_manager('test.txt', 'w') as f: f.write('hello world') 参考 浅谈Python的with语句 上下文管理器-极客学院 http://wiki.jikexueyuan.com/project/interpy-zh/context_managers/README.html 深入理解 Python 中的上下文管理器 Python核心技术与实战-极客时间","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"上下文","slug":"上下文","permalink":"https://yeshan333.github.io/tags/%E4%B8%8A%E4%B8%8B%E6%96%87/"}]},{"title":"Python协程-asyncio、async/await","slug":"Python协程(Coroutine)","date":"2019-07-19T14:58:48.000Z","updated":"2019-07-19T14:58:48.000Z","comments":true,"path":"2019/07/19/Python协程(Coroutine)/","permalink":"https://yeshan333.github.io/2019/07/19/Python%E5%8D%8F%E7%A8%8B%EF%BC%88Coroutine%EF%BC%89/","excerpt":"看到吐血 (´ཀ`」 ∠) 协程(Coroutine)本质上是一个函数,特点是在代码块中可以将执行权交给其他协程 众所周知,子程序(函数)都是层级调用的,如果在A中调用了B,那么B执行完毕返回后A才能执行完毕。协程与子程序有点类似,但是它在执行过程中可以中断,转而执行其他的协程,在适当的时候再回来继续执行。 协程与多线程相比的最大优势在于:协程是一个线程中执行,没有线程切换的开销;协程由用户决定在哪里交出控制权 这里用到的是asyncio库(Python 3.7),这个库包含了大部分实现协程的魔法工具 使用 async 修饰词声明异步函数 使用 await 语句执行可等待对象(Coroutine、Task、Future) 使用 asyncio.create_task 创建任务,将异步函数(协程)作为参数传入,等待event loop执行 使用 asyncio.run 函数运行协程程序,协程函数作为参数传入","text":"看到吐血 (´ཀ`」 ∠) 协程(Coroutine)本质上是一个函数,特点是在代码块中可以将执行权交给其他协程 众所周知,子程序(函数)都是层级调用的,如果在A中调用了B,那么B执行完毕返回后A才能执行完毕。协程与子程序有点类似,但是它在执行过程中可以中断,转而执行其他的协程,在适当的时候再回来继续执行。 协程与多线程相比的最大优势在于:协程是一个线程中执行,没有线程切换的开销;协程由用户决定在哪里交出控制权 这里用到的是asyncio库(Python 3.7),这个库包含了大部分实现协程的魔法工具 使用 async 修饰词声明异步函数 使用 await 语句执行可等待对象(Coroutine、Task、Future) 使用 asyncio.create_task 创建任务,将异步函数(协程)作为参数传入,等待event loop执行 使用 asyncio.run 函数运行协程程序,协程函数作为参数传入 解析协程运行时12345678910111213141516171819202122232425262728import asyncioimport timeasync def a(): print("欢迎使用 a !") await asyncio.sleep(1) print("欢迎回到 a !")async def b(): print("欢迎来到 b !") await asyncio.sleep(2) print("欢迎回到 b !")async def main(): task1 = asyncio.create_task(a()) task2 = asyncio.create_task(b()) print("准备开始") await task1 print("task1 结束") await task2 print("task2 结束")if __name__ == "__main__": start = time.perf_counter() asyncio.run(main()) print('花费 {} s'.format(time.perf_counter() - start)) 解释: 1、asyncio.run(main()),程序进入main()函数,开启事件循环 2、创建任务task1、task2并进入事件循环等待运行 3、输出准备开始 4、执行await task1,用户选择从当前主任务中切出,事件调度器开始调度 a 5、a 开始运行,输出欢迎使用a!,运行到await asyncio.sleep(1),从当前任务切出,事件调度器开始调度 b 6、b 开始运行,输出欢迎来到b!,运行到await asyncio.sleep(2),从当前任务切出 7、以上事件运行时间非常短(毫秒),事件调度器开始暂停调度 8、一秒钟后,a的sleep完成,事件调度器将控制权重新交给a,输出欢迎回到a!,task1完成任务,退出事件循环 9、await task1完成,事件调度器将控制权还给主任务,输出task1结束,然后在await task2处继续等待 10、两秒钟后,b的sleep完成,事件调度器将控制权重新传给 b,输出欢迎回到 b!,task2完成任务,从事件循环中退出 11、事件调度器将控制权交还给主任务,主任务输出task2结束,至此协程任务全部结束,事件循环结束。 上面的代码也可以这样写,将15到21行换成一行await asyncio.gather(a(), b())也能实现类似的效果,await asyncio.gather 会并发运行传入的可等待对象(Coroutine、Task、Future)。 12345678910111213141516171819202122import asyncioimport timeasync def a(): print("欢迎使用 a !") await asyncio.sleep(1) print("欢迎回到 a !")async def b(): print("欢迎来到 b !") await asyncio.sleep(2) print("欢迎回到 b !")async def main(): await asyncio.gather(a(), b())if __name__ == "__main__": start = time.perf_counter() asyncio.run(main()) print('花费 {} s'.format(time.perf_counter() - start)) 异步接口同步实现12345678910111213141516171819202122232425"""- 简单爬虫模拟- 这里用异步接口写了个同步代码"""import asyncioimport timeasync def crawl_page(url): print('crawling {}'.format(url)) sleep_time = int(url.split('_')[-1]) await asyncio.sleep(sleep_time) # 休眠 print('OK {}'.format(url))async def main(urls): for url in urls: await crawl_page(url) # await会将程序阻塞在这里,进入被调用的协程函数,执行完毕后再继续start = time.perf_counter()# pip install nest-asyncioasyncio.run(main(['url_1', 'url_2'])) # 协程接口print("Cost {} s".format(time.perf_counter() - start)) 使用 Task 实现异步1234567891011121314151617181920212223# 异步实现import asyncioimport timeasync def crawl_page(url): print('crawling {}'.format(url)) sleep_time = int(url.split('_')[-1]) await asyncio.sleep(sleep_time) print('OK {}'.format(url))async def main(urls): tasks = [asyncio.create_task(crawl_page(url)) for url in urls] for task in tasks: await task # 14、15行也可以换成这一行await asyncio.gather(*tasks) # *tasks 解包列表,将列表变成了函数的参数,与之对应的是,** dict 将字典变成了函数的参数start = time.perf_counter()asyncio.run(main(['url_1', 'url_2']))print("Cost {} s".format(time.perf_counter() - start)) 生产者消费者模型的协程版本 123456789101112131415161718192021222324252627282930313233343536373839404142434445# 极客时间:Python核心技术与实战import asyncioimport randomimport timeasync def consumer(queue, id): """消费者""" while True: val = await queue.get() print('{} get a val : {}'.format(id, val)) await asyncio.sleep(1)async def producer(queue, id): """生产者""" for _ in range(5): val = random.randint(1, 10) await queue.put(val) print('{} put a val: {}'.format(id, val)) await asyncio.sleep(1)async def main(): queue = asyncio.Queue() consumer_1 = asyncio.create_task(consumer(queue, 'consumer_1')) consumer_2 = asyncio.create_task(consumer(queue, 'consumer_2')) producer_1 = asyncio.create_task(producer(queue, 'producer_1')) producer_2 = asyncio.create_task(producer(queue, 'producer_2')) await asyncio.sleep(10) # cancel掉执行之间过长的consumer_1、consumer_2,while True consumer_1.cancel() consumer_2.cancel() # return_exceptions 设为True,不让异常throw到执行层,影响后续任务的执行 await asyncio.gather(consumer_1, consumer_2, producer_1, producer_2, return_exceptions=True)if __name__ == "__main__": start = time.perf_counter() asyncio.run(main()) print("Cost {} s".format(time.perf_counter() - start)) 12345678910111213141516171819202122# 输出结果producer_1 put a val: 7producer_2 put a val: 4consumer_1 get a val : 7consumer_2 get a val : 4producer_1 put a val: 6producer_2 put a val: 1consumer_2 get a val : 6consumer_1 get a val : 1producer_1 put a val: 8producer_2 put a val: 1consumer_1 get a val : 8consumer_2 get a val : 1producer_1 put a val: 6producer_2 put a val: 4consumer_2 get a val : 6consumer_1 get a val : 4producer_1 put a val: 7producer_2 put a val: 8consumer_1 get a val : 7consumer_2 get a val : 8Cost 10.0093015 s 拓展阅读:Python的生产者消费者模型,看这篇就够了 参考 https://docs.python.org/3/library/asyncio.html#module-asyncio 深入理解asyncio(一) 揭密Python协程","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"协程","slug":"协程","permalink":"https://yeshan333.github.io/tags/%E5%8D%8F%E7%A8%8B/"}]},{"title":"breaking一如既往的帅","slug":"breaking一如既往的帅","date":"2019-07-12T21:29:25.000Z","updated":"2019-07-12T21:29:25.000Z","comments":true,"path":"2019/07/12/breaking一如既往的帅/","permalink":"https://yeshan333.github.io/2019/07/12/breaking%E4%B8%80%E5%A6%82%E6%97%A2%E5%BE%80%E7%9A%84%E5%B8%85/","excerpt":"","text":"** 看到了就爱上了,(๑•̀ㅂ•́)و✧Cloud的style move真的帅~~~(虽然很久没玩breaking了。。。。。(ノへ ̄、))**","categories":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/categories/%E9%9A%8F%E7%AC%94/"}],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"Latex基本语法简记","slug":"latex基本语法简记","date":"2019-06-18T15:05:57.000Z","updated":"2019-06-18T15:05:57.000Z","comments":true,"path":"2019/06/18/latex基本语法简记/","permalink":"https://yeshan333.github.io/2019/06/18/latex%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95%E7%AE%80%E8%AE%B0/","excerpt":"备注:当前博客使用的 latex 渲染引擎有点问题,本篇文章更好的阅读体验:https://blog.csdn.net/qq_41022329/article/details/92798759 公式插入方式 行内公式可用\\(...\\)或$...$ 例如$ f(x)=x^2 $,显示为$ f(x)=x^2 $ 独立公式(单独另起一行,公式会居中),使用$$...$$或\\[...\\] 例如:$$ \\int{f(x)dx} $$或 $$ \\int_a^b{f(x)dx} $$,显示为: $$ \\int{f(x)dx} $$ $$ \\int_a^b{f(x)dx} $$","text":"备注:当前博客使用的 latex 渲染引擎有点问题,本篇文章更好的阅读体验:https://blog.csdn.net/qq_41022329/article/details/92798759 公式插入方式 行内公式可用\\(...\\)或$...$ 例如$ f(x)=x^2 $,显示为$ f(x)=x^2 $ 独立公式(单独另起一行,公式会居中),使用$$...$$或\\[...\\] 例如:$$ \\int{f(x)dx} $$或 $$ \\int_a^b{f(x)dx} $$,显示为: $$ \\int{f(x)dx} $$ $$ \\int_a^b{f(x)dx} $$ 大括号的使用1234567891011121314151617181920212223方法一:$$ f(x)=\\left\\{\\begin{aligned}x & = & \\cos(t) \\\\y & = & \\sin(t) \\\\z & = & \\frac xy\\end{aligned}\\right.$$方法二:$$ F^{HLLC}=\\left\\{\\begin{array}{rcl}F_L & & {0 < S_L}\\\\F^*_L & & {S_L \\leq 0 < S_M}\\\\F^*_R & & {S_M \\leq 0 < S_R}\\\\F_R & & {S_R \\leq 0}\\end{array} \\right. $$方法三:$$f(x)=\\begin{cases}0& \\text{x=0}\\\\1& \\text{x!=0}\\end{cases}$$ 方法一: $$ f(x)=\\left{\\begin{aligned}x & = & \\cos(t) \\y & = & \\sin(t) \\z & = & \\frac xy\\end{aligned}\\right.$$ 方法二: $$ F^{HLLC}=\\left{\\begin{array}{rcl}F_L & & {0 < S_L}\\F^*_L & & {S_L \\leq 0 < S_M}\\F^*_R & & {S_M \\leq 0 < S_R}\\F_R & & {S_R \\leq 0}\\end{array} \\right. $$ 方法三: $$f(x)=\\begin{cases}0& \\text{x=0}\\1& \\text{x!=0}\\end{cases}$$ 符号表要输出字符 空格 # $ % & _ { } ,用命令:\\空格 # \\$ \\% \\& _ { } 运算符表关系运算符 命令 显示 命令 显示 \\pm $\\pm$ \\times $\\times$ \\div $\\div$ \\mid $\\mid$ \\nmid $\\nmid$ \\cdot $\\cdot$ \\circ $\\circ$ \\ast $\\ast$ \\bigodot $\\bigodot$ \\bigotimes $\\bigotimes$ \\bigoplus $\\bigoplus$ \\leq $\\leq$ \\geq $\\geq$ \\neq $\\neq$ \\approx $\\approx$ \\equiv $\\equiv$ \\sum $\\sum$ \\prod $\\prod$ 集合运算符 命令 显示 命令 显示 \\emptyset $\\emptyset$ \\in $\\in$ \\notin $\\notin$ \\subset $\\subset$ \\supset $\\supset$ \\subseteq $\\subseteq$ \\supseteq $\\supseteq$ \\bigcap $\\bigcap$ \\bigcup $\\bigcup$ \\bigvee $\\bigvee$ \\bigwedge $\\bigwedge$ \\biguplus $\\biguplus$ \\bigsqcup $\\bigsqcup$     对数运算符 命令 显示 命令 显示 命令 显示 \\log $\\log$ \\lg $\\lg$ \\ln $\\ln$ 三角运算符 命令 显示 命令 显示 命令 显示 \\bot $\\bot$ \\angle $\\angle$ 30^\\circ $30^\\circ$ \\sin $\\sin$ \\cos $\\cos$ \\tan $\\tan$ \\cot $\\cot$ \\sec $\\sec$ \\csc $\\csc$ 微积分运算符 命令 显示 命令 显示 命令 显示 \\prime $\\prime$ \\int $\\int$ \\iint $\\iint$ \\iiint $\\iiint$ \\oint $\\oint$ \\lim $\\lim$ \\infty $\\infty$ \\nabla $\\nabla$     逻辑运算符 命令 显示 命令 显示 命令 显示 \\because $\\because$ \\therefore $\\therefore$ \\forall $\\forall$ \\exists $\\exists$ \\not= $\\not=$ \\not> $\\not>$ \\not< $\\not<$ \\not\\subset $\\not\\subset$     其它符号戴帽和连线符号 命令 显示 命令 显示 命令 显示 \\hat{y} $\\hat{y}$ \\check{y} $\\check{y}$ \\breve $\\breve{y}$ \\overline{a+b+c+d} $\\overline{a+b+c+d}$ \\underline{a+b+c+d} $\\underline{a+b+c+d}$ \\overbrace{a+\\underbrace{b+c}_{1.0}+d}^{2.0} $\\overbrace{a+\\underbrace{b+c}_{1.0}+d}^{2.0}$ 箭头符号 命令 显示 命令 显示 命令 显示 \\uparrow $\\uparrow$ \\downarrow $\\downarrow$ \\Uparrow $\\Uparrow$ \\Downarrow $\\Downarrow$ \\rightarrow $\\rightarrow$ \\leftarrow $\\leftarrow$ \\Rightarrow $\\Rightarrow$ \\Leftarrow $\\Leftarrow$ \\longrightarrow $\\longrightarrow$ \\Longrightarrow $\\Longrightarrow$ \\longleftarrow $\\longleftarrow$ \\Longleftarrow $\\Longleftarrow$ 矩阵基本语法 起始标记\\begin{matrix},结束标记\\end{matrix} 每一行末标记\\\\进行换行,行间元素以&分隔用于对齐。 12345$$\\begin{matrix}1&0&0\\\\0&1&0\\\\0&0&1\\\\\\end{matrix}$$ $$\\begin{matrix}1&0&0\\0&1&0\\0&0&1\\\\end{matrix}$$ 进阶 可用下列词替换matrix设置矩阵边框 pmatrix、bmatrix、Bmatrix:小括号、中括号、大括号边框 vmatrix、Vmatrix:单竖线、双竖线边框 省略元素 横省略号:\\cdots 竖省略号:\\vdots 斜省略号:\\ddots 123456$$\\begin{Bmatrix}{a_{11}}&{a_{12}}&{\\cdots}&{a_{1n}}\\\\{a_{21}}&{a_{22}}&{\\cdots}&{a_{2n}}\\\\{\\vdots}&{\\vdots}&{\\ddots}&{\\vdots}\\\\{a_{m1}}&{a_{m2}}&{\\cdots}&{a_{mn}}\\\\\\end{Bmatrix}$$ $$\\begin{Bmatrix}{a_{11}}&{a_{12}}&{\\cdots}&{a_{1n}}\\{a_{21}}&{a_{22}}&{\\cdots}&{a_{2n}}\\{\\vdots}&{\\vdots}&{\\ddots}&{\\vdots}\\{a_{m1}}&{a_{m2}}&{\\cdots}&{a_{mn}}\\\\end{Bmatrix}$$ 希腊字母表 命令 显示 命令 显示 \\alpha $\\alpha$ \\beta $\\beta$ \\gamma $\\gamma$ \\delta $\\delta$ \\epsilon $\\epsilon$ \\zeta $\\zeta$ \\eta $\\eta$ \\theta $\\theta$ \\iota $\\iota$ \\kappa $\\kappa$ \\lambda $\\lambda$ \\mu $\\mu$ \\nu $\\nu$ \\xi $\\xi$ \\pi $\\pi$ \\rho $\\rho$ \\sigma $\\sigma$ \\tau $\\tau$ \\upsilon $\\upsilon$ \\phi $\\phi$ \\chi $\\chi$ \\psi $\\psi$ \\omega $\\omega$     如果需要大写的希腊字母,将命令首字母大写即可 例如:\\Gamma,显示$ \\Gamma $ 如果要将字母斜体显示,使用\\var前缀即可 例如:\\varGamma,显示$ \\varGamma $ 杂项 分组: 使用{}将具有相同等级的内容扩入其中,成组处理。 比如:\\10^10呈现为$10^10$,10^{10}呈现为$10^{10}$。 空格: 单个空格:a\\ b,$a\\ b$ 四个空格:a\\quad b,$a\\quad b$ 上标^,下标_ 尖括号\\langle\\rangle:$\\langle\\rangle$ 使用\\left或\\right使符号大小与临近的公式符号相适应,对比如下: (\\frac{x}{y}):$(\\frac{x}{y})$ \\left(\\frac{x}{y}\\right):$\\left(\\frac{x}{y}\\right)$ 分式: \\frac{1}{3}:$\\frac{1}{3}$ 1 \\over 3:$1 \\over 3$ 开根\\sqrt[n]{3}:$\\sqrt[n]{3}$ 省略号: \\ldots:与文本底线对齐的省略号 \\cdots:与文本中线对齐的省略号 $f(x_1,x_2,\\ldots,x_n) = x_1^2 + x_2^2 + \\cdots + x_n^2$:$f(x_1,x_2,\\ldots,x_n) = x_1^2 + x_2^2 + \\cdots + x_n^2$ 综合运用示范123% 极限运算$$\\lim\\limits_{n \\rightarrow +\\infty} \\frac{1}{n(n+1)}$$$$\\lim_{n \\rightarrow +\\infty} \\frac{1}{n(n+1)}$$ $$\\lim\\limits_{n \\rightarrow +\\infty} \\frac{1}{n(n+1)}$$ $$\\lim_{n \\rightarrow +\\infty} \\frac{1}{n(n+1)}$$ 1$$ \\left[J_\\alpha(x) = \\sum_{m=0}^\\infty \\frac{(-1)^m}{m! \\Gamma (m + \\alpha + 1)} {\\left({ \\frac{x}{2} }\\right)}^{2m + \\alpha}\\right] $$ $$ \\left[J_\\alpha(x) = \\sum_{m=0}^\\infty \\frac{(-1)^m}{m! \\Gamma (m + \\alpha + 1)} {\\left({ \\frac{x}{2} }\\right)}^{2m + \\alpha}\\right] $$ 参考 MathJax使用LaTeX语法编写数学公式教程 MathJax 语法参考 基本数学公式语法(of MathJax) MathJax basic tutorial and quick reference","categories":[{"name":"math","slug":"math","permalink":"https://yeshan333.github.io/categories/math/"}],"tags":[{"name":"Latex","slug":"Latex","permalink":"https://yeshan333.github.io/tags/Latex/"}]},{"title":"MATLAB基操复习","slug":"MATLAB基操复习","date":"2019-06-17T19:51:57.000Z","updated":"2019-06-17T19:51:57.000Z","comments":true,"path":"2019/06/17/MATLAB基操复习/","permalink":"https://yeshan333.github.io/2019/06/17/MATLAB%E5%9F%BA%E6%93%8D%E5%A4%8D%E4%B9%A0/","excerpt":"MATLAB基本操作1. 对象定义使用sym定义单个对象、使用syms定义多个对象 2. 使用limit求极限 $$ \\lim_{v \\rightarrow a} f(x) $$ 1limit(f,v,a) % 使用limit(f,v,a,'left')可求左极限 3. 导数使用diff(f,v,n)对$ f(v)=v^{t-1} $求 $ n $ 阶导 $ \\frac{d^nf}{d^nv} $,n缺省时,默认为1,diff(f)默认求一阶导数。 4. 定积分和不定积分使用int(f,v)求f对变量v的不定积分,使用int(f,v,a,b)求f对变量v的定积分,a、b为积分上下标。$ \\int{f(v)dv} $、$ \\int^{a}_{b}{f(v)dv} $。","text":"MATLAB基本操作1. 对象定义使用sym定义单个对象、使用syms定义多个对象 2. 使用limit求极限 $$ \\lim_{v \\rightarrow a} f(x) $$ 1limit(f,v,a) % 使用limit(f,v,a,'left')可求左极限 3. 导数使用diff(f,v,n)对$ f(v)=v^{t-1} $求 $ n $ 阶导 $ \\frac{d^nf}{d^nv} $,n缺省时,默认为1,diff(f)默认求一阶导数。 4. 定积分和不定积分使用int(f,v)求f对变量v的不定积分,使用int(f,v,a,b)求f对变量v的定积分,a、b为积分上下标。$ \\int{f(v)dv} $、$ \\int^{a}_{b}{f(v)dv} $。 5. matlab函数文件定义形式 12function [输出形参列表] = 函数名(输入形参列表) 函数体 12345678910111213141516171819202122232425262728293031323334353637function spir_len = spirallength(d, n, lcolor)% SPIRALLENGTH plot a circle of radius as r in the provided color and calculate its area% 输入参数:% d: 螺旋的旋距% n: 螺旋的圈数% lcolor:画图线的颜色% 输出参数:% spir_len:螺旋的周长% 调用说明:% spirallength(d,n):以参数d,n画螺旋线,螺旋线默认为蓝色% spirallength(d,n,lcolor):以参数d,n,lcolor画螺旋线% spir_len = spirallength(d,n):计算螺旋线的周长,并以蓝色填充螺旋线% spir_len = spirallength(d,n,lcolor):计算螺旋线的周长,并以lcolor颜色填充螺旋线% 版本号V1.0,编写于1999年9月9号,修改于1999年9月10号,作者:亚索if nargin > 3 error('输入变量过多!');elseif nargin == 2 lcolor = 'b'; % 默认情况下为蓝色endj = sqrt(-1);phi = 0 : pi/1000 : n*2*pi;amp = 0 : d/2000 : n*d;spir = amp .* exp(j*phi);if nargout == 1 spir_len = sum(abs(diff(spir))); fill(real(spir), imag(spir), lcolor);elseif nargout == 0 plot(spir, lcolor);else error('输出变量过多!');endaxis('square'); 6. matlab程序设计语句 1234567891011121314151617181920212223242526272829303132333435363738% for循环for 循环变量=初值:步长:终值 循环体end% while循环while 条件 循环体end% if语句if 条件 语句组1elseif 语句组2else 语句组3end% switch语句switch 表达式 case 表达式1 语句组1 case 表达式2 语句组2 ... ... case 表达式m 语句组m otherwise 语句组end% try语句try 语句组1 %语句组1若正确则跳出该结构catch 语句组2end 7. 矩阵操作 操作 作用 size(A) 求矩阵A的行数和列数 length(x) 返回向量x的长度 A’ A的转置 A(:,n) 取矩阵A第n列数,A(n,:)取第n行 det(A) 求矩阵A的行列式 inv(A) 求A的逆 rank(A) 求A的秩 trace(A) 求A的迹 max(A)、min(A) 求A的各列最大、最小元素 mean(A) 求A各列的平均值 sum(A) 求A各列元素之和 8. matlab简单绘图  plot函数是MATLAB中最核心的二维绘图函数,有诸多语法格式,可实现多种功能。常用格式有: plot(x):缺省自变量的绘图格式,x可为向量或矩阵。 plot(x, y):基本格式,x和y可为向量或矩阵。 plot(x1, y1, x2, y2,…):多条曲线绘图格式,在同一坐标系中绘制多个图形。 plot(x, y,‘s’):开关格式,开关量字符串s设定了图形曲线的颜色、线型及标示符号(见下表)。 无约束优化问题求解fminbnd、fminunc函数输出变量解释 变量 描述 x 由优化函数求得的值. 若exitflag>0,则x为解; 否则,x不是最终解, 它只是迭代制止时优化过程的值 fval 解 x 处的目标函数值 exitflag 描述退出条件:exitflag>0,表目标函数收敛于解x处;exitflag=0,表已达到函数评价或迭代的最大次数;exitflag<0,表目标函数不收敛 output 包含优化结果信息的输出结构。Iterations:迭代次数;Algorithm:所采用的算法;FuncCount:函数评价次数 一元函数无约束优化问题-fminbnd常用格式$$ min f(x), x_1<x<x_2 $$ (1)x= fminbnd (fun, x1, x2)(2)x= fminbnd (fun, x1, x2 , options)(3)[x , fval]= fminbnd(…)(4)[x , fval , exitflag]= fminbnd(…)(5)[x , fval , exitflag , output]= fminbnd(…)函数fminbnd的算法基于黄金分割法和二次插值法,它要求目标函数必须是连续函数,并可能只给出局部最优解 例子求函数 $ f(x)=2e^{-x}sin(x) $ 在 $ 0<x<8 $ 时的最小值 12345% 如果求最大需要对f取反f = @(x) (2*exp(-x)*sin(x));[x,fval] = fminbnd(f,0,8);xfval 多元函数无约束优化问题-fminunc常用格式$$ min f(X),这里X为n维变量 $$fminunc常用格式为: (1)x= fminunc(fun, X0); (2)x= fminunc(fun, X0,options); (3)[x,fval]= fminunc(…); (4)[x,fval,exitflag]= fminunc(…); (5)[x,fval,exitflag,output]= fminunc(…)其中 X0为初始值 例子求函数$ f(x_1,x_2)=(4x_1^2+2x_2^2+4x_1x_2+2x_2^2+1)e^x $的最小值,$ X_0=[-1,1] $ 12345f = @(x) (4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1)*exp(x(1));x0 = [-1,1];[x,fval] = fminunc(f, x0);xfval 线性规划问题求解使用linprog求解一般线性规划问题常见问题(linprog默认求最小值)$$ minz=cX $$ $$ s.t. \\begin{cases}AX\\leq{b}\\Aeq\\cdot{X}=beq\\VLB\\leq{X}\\leq{VUB}\\end{cases}$$ 求解命令 1[x,fval] = linprog(c,A,b,Aeq,beq,VLB,VUB) 例子$$ min z=13x_1+9x_2+10x_3+11x_4+12x_5+8x_6 $$ $$ s.t.\\left{\\begin{aligned}& x_1+x_2=400\\& x_2+x_5=600\\& x_3+x_6=500\\& 0.4x_1+1.1x_2+x_3\\leq{800}\\& 0.5x_4+1.2x_5+1.3x_6\\leq{900}\\& x_i\\geq0,i=1,2,…,6\\end{aligned}\\right.$$ 1234567891011f = [13 9 10 11 12 8];A = [0.4 1.1 1 0 0 0 0 0 0 0.5 1.2 1.3];b = [800; 900];Aeq=[1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1];beq=[400 600 500];vlb = zeros(6,1);vub=[];[x,fval] = linprog(f,A,b,Aeq,beq,vlb,vub) 使用bintprog求解0-1规划问题matlab2014以上版本使用intlinprog求解0-1规划问题 $$ minz=cX $$ $$ s.t. \\begin{cases}AX\\leq{b}\\Aeq\\cdot{X}=beq\\X为0-1变量\\end{cases}$$ 12% 命令[x,fval] = bintprog(c,A,b,Aeq,beq) 例子$$ min z=3x_1+7x_2-x_3+x_4 $$$$ s.t.\\begin{cases}2x_1-x_2+x_3-x_4\\geq{1}\\x_1-x_2+6x_3+4x_4\\geq{8}\\5x_1+3x_2+x_4\\geq{5}\\x_i=0或1(i=1,2,3,4)\\end{cases}$$ 123456789z = [3;7;-1;1];A = [-2 1 -1 1; -1 1 -6 -4; -5 -3 0 -1];b = [-1;-8;-5];Aeq = [];beq = [];[x,fval] = bintprog(z,A,b,Aeq,beq) 数据插值与拟合数据插值,使用interpl进行一维插值matlab命令 1yi = interpl(X,Y,xi,method) 该命令用指定的算法找出一个一元函数,然后以该函数给出xi处的值。其中x=[x1,x2,…,xn]’和 y=[y1,y2,…,yn]’两个向量分别为给定的一组自变量和函数值,用来表示已知样本点数据;xi为待求插值点处横坐标,可以是一个标量,也可以是一个向量,是向量时,必须单调;yi得到返回的对应纵坐标。 method可以选取以下方法之一: ‘nearest’:最近邻点插值,直接完成计算; ‘spline’:三次样条函数插值; ‘linear’:线性插值(缺省方式),直接完成计算; ‘cubic’:三次函数插值; 例子作函数$ y=(x^2-3x+7)e^{-4x}sin(2x) $在[0,1]取间隔为0.1的点图,用插值进行实验 12345678910x=0:0.1:1;y=(x.^2-3*x+7).*exp(-4*x).*sin(2*x); %产生原始数据subplot(1,2,1);plot(x,y,x,y,'ro') %作图xx=0:0.02:1; %待求插值点yy=interp1(x,y,xx,'spline'); %此处可用nearest,cubic,spline分别试验subplot(1,2,2)plot(x,y,'ro',xx,yy,'b') %作图 曲线拟合拟合函数polyfit12p=polyfit(x,y,n)[p,s]= polyfit(x,y,n) 说明:x,y为数据点,n为多项式阶数,返回p为幂次从高到低的多项式系数向量p。p是n+1维参数向量p(1),p(2)….那么拟合后对应的多项式即为:$$ p(1)x^n+p(2)x^{n-1}+\\cdot\\cdot\\cdot+p(n)x+p(n+1) $$ x必须是单调的。矩阵s用于生成预测值的误差估计 多项式求值函数polyval12y=polyval(p,x)[y,DELTA]=polyval(p,x,s) 说明:y=polyval(p,x)为返回对应自变量x在给定系数p的多项式的值;[y,DELTA]=polyval(p,x,s) 使用polyfit函数的选项输出s得出误差估计DELTA。它假设polyfit函数数据输入的误差是独立正态的,并且方差为常数。则DELTA将至少包含50%的预测值。 例子求如下给定数据的拟合曲线x=[0.5,1.0,1.5,2.0,2.5,3.0],y=[1.75,2.45,3.81,4.80,7.00,8.60] 1234567x=[0.5,1.0,1.5,2.0,2.5,3.0];y=[1.75,2.45,3.81,4.80,7.00,8.60];plot(x,y,‘*r’) %先观察数据点的大致形态p=polyfit(x,y,2) %用二次多项式拟合x1=0.5:0.05:3.0; % 步长0.05y1=polyval(p,x1);plot(x,y,'*r',x1,y1,'-b')","categories":[{"name":"math","slug":"math","permalink":"https://yeshan333.github.io/categories/math/"}],"tags":[{"name":"MATLAB","slug":"MATLAB","permalink":"https://yeshan333.github.io/tags/MATLAB/"}]},{"title":"搜索技巧","slug":"搜索技巧","date":"2019-06-08T20:22:17.000Z","updated":"2019-06-08T20:22:17.000Z","comments":true,"path":"2019/06/08/搜索技巧/","permalink":"https://yeshan333.github.io/2019/06/08/%E6%90%9C%E7%B4%A2%E6%8A%80%E5%B7%A7/","excerpt":"搜索也是门学问啊,GFW之下,世道艰难。 (ノ~、)","text":"搜索也是门学问啊,GFW之下,世道艰难。 (ノ~、) 百度高级搜索技巧双引号精确匹配 格式:”搜索词” 在查询词两边加上双引号表示查询词不能被拆分。 减号(-)不含特定查询 格式:搜索词 -排除词 ** 减号后面紧跟的是需要排除的词,前面为要搜索的词(有个空格隔开) ** site,限制搜索范围在特定站点 格式:搜索词 site:站点域名 site:后面紧跟站点域名, 不要带协议头。site:和域名之前没有空格。 inurl,搜索范围限定在url链接中 格式:搜索词 inurl:url中必须存在的词 intitle,搜索范围限定在网页标题 格式:搜索词 intitle:标题必须含有的词 filetype,搜索范围限定在指定文件格式中 格式:搜索词 filetype:文件格式名 源于百度:https://jingyan.baidu.com/article/d621e8dae7593c2864913f7b.html","categories":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/categories/%E9%9A%8F%E7%AC%94/"}],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"Python面向对象","slug":"Python面向对象","date":"2019-05-24T12:54:40.000Z","updated":"2019-05-31T12:54:40.000Z","comments":true,"path":"2019/05/24/Python面向对象/","permalink":"https://yeshan333.github.io/2019/05/24/Python%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/","excerpt":"对象:一个自包含的实体,用一组可识别的特性和行为来标识 类:具有相同的属性和功能的对象的抽象的集合 实例:一个真实的对象,实例化就是创建对象的过程 多态:可对不同类型的对象执行相同的操作,而这些操作就像“被施了魔法”一样能够正常运行 封装:对外部隐藏有关对象工作原理的细节 继承:可基于通用类创建专用类 多态 多态可以让我们在不知道变量指向哪种对象时,也能够对其执行操作,且操作的行为将随对象所属的类型(类)而异。每当不知道对象是什么样就能对其执行操作,都是多态在起作用 多态以 继承 和 重写 父类方法 为前提 多态是调用方法的技巧,不会影响到类的内部设计 多态性即向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法) 听说Python天然就多态 12345678910111213141516171819202122232425class Person(object): def __init__(self,name,sex): self.name = name self.sex = sex def print_title(self): if self.sex == "male": print("man") elif self.sex == "female": print("woman")class Child(Person): # Child 继承 Person def print_title(self): if self.sex == "male": print("boy") elif self.sex == "female": print("girl")May = Child("May","female")Peter = Person("Peter","male")print(May.name,May.sex,Peter.name,Peter.sex)# 同一消息May.print_title()Peter.print_title()","text":"对象:一个自包含的实体,用一组可识别的特性和行为来标识 类:具有相同的属性和功能的对象的抽象的集合 实例:一个真实的对象,实例化就是创建对象的过程 多态:可对不同类型的对象执行相同的操作,而这些操作就像“被施了魔法”一样能够正常运行 封装:对外部隐藏有关对象工作原理的细节 继承:可基于通用类创建专用类 多态 多态可以让我们在不知道变量指向哪种对象时,也能够对其执行操作,且操作的行为将随对象所属的类型(类)而异。每当不知道对象是什么样就能对其执行操作,都是多态在起作用 多态以 继承 和 重写 父类方法 为前提 多态是调用方法的技巧,不会影响到类的内部设计 多态性即向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法) 听说Python天然就多态 12345678910111213141516171819202122232425class Person(object): def __init__(self,name,sex): self.name = name self.sex = sex def print_title(self): if self.sex == "male": print("man") elif self.sex == "female": print("woman")class Child(Person): # Child 继承 Person def print_title(self): if self.sex == "male": print("boy") elif self.sex == "female": print("girl")May = Child("May","female")Peter = Person("Peter","male")print(May.name,May.sex,Peter.name,Peter.sex)# 同一消息May.print_title()Peter.print_title() 封装 封装指的是向外部隐藏不必要的细节。与多态有点像,他们都是抽象的原则。多态让你无需知道对象所属的类(对象的类型)就能调用其方法。封装让你无需知道对象的构造就能够使用它。 实现封装可以对类内的属性和方法的访问加以限制。就像C++类使用private、protected一样对类的成员访问进行限制一样 默认情况下,Python中的属性和方法都是公开的,可以在对象外部访问 私有变量 Python并没有真正的私有化支持,但可用下划线得到伪私有。 在Python定义私有变量只需在变量名或函数名前加上两个下划线__,例如__name。那种仅限在一个对象内部访问的“私有”变量在Python中并不存在 使用双下划线将方法或属性变为私有时,在内部,Python将以双下划线开头的名字都进行转换,即在开头加上一个下划线和类名。但这样的私有变量或方法还是可以访问的,访问形式如:实例名._类名__变量名、实例名._类名__方法名() 以单下划线开头的时保护成员变量,只有本类和子类成员实例能访问这些变量 property装饰器、__slots__魔法 我们可以使用property装饰器对属性进行封装、通过getter和setter方法进行属性的访问和修改 Python是一门动态语言,可以在程序运行时给对象绑定属性和方法,也可以对已经绑定的属性和方法进行解绑定,我们可以使用__slots__魔法限定对象可以绑定的属性 继承&&派生 一个新类从已有类那里获得其已有特性,这种现象称为继承。从一个已有类(父类,Python叫超类)产生一个新的子类,称为类的派生。要指顶定超类,可在class语句中的类名后加上超类名,并将其用原括括起来 一个类可以继承多个类(多重继承)。但是,如果多个超类以不同的方式实现了同一个方法(即有多个同名的方法),必须在class语句中小心排列这些类,因为位于前面的类的方法将覆盖位于后面的类的方法 对子类的实例调用方法(或访问其属性)时,如果找不到该方法或者属性,将在父类中查找 在子类中可以重写超类的方法(包括构造函数),重写构造函数时,要确保在子类的构造函数中调用超类的构造函数,否则可能无法正确的初始化对象 Python中所有的方法实际上是virtual的 123456789class Person: def __init__(self,name): print("我叫{}".format(name))class Student(Person): def __init__(self,name): # 使用super函数调用父类构造函数 super().__init__(name) # 也可以写成这样:Person.__init__(self,name) print("我是一个学生!") 抽象基类 抽象基类是不能(至少是不应该)实例化的类,其职责是定义子类应该实现的一组抽象方法。Python可通过引入ABC模块实现抽象基类,使用@abstractmethod装饰器将方法标记为抽象的。例如: 1234class Basic{ public: virtual void talk() const = 0;//纯虚函数}; 123456from abc import ABC, abstractmethodclass Basic(ABC): @abstractmethod def talk(self): pass 抽象类(即包含抽象方法的类)最重要的特征是不能实例化。如果派生出的类没有重写talk方法,那么派生出的类也是抽象的,不能实例化。 鸭子类型 “鸭子类型”的语言是这么推断的:一只鸟走起来像鸭子、游起泳来像鸭子、叫起来也像鸭子,那它就可以被当做鸭子。也就是说,它不关注对象的类型,而是关注对象具有的行为(方法)。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的走和叫方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名 鸭子类型的关注点在对象的行为,而不在对象的类型 参考:https://zhuanlan.zhihu.com/p/59299729 类方法、静态方法 类方法:使用@classmethod装饰器定义。类方法将类本身作为对象进行操作,类方法的第一个参数必须是当前类对象(一般命名为cls,用于传递类的属性和方法),实例对象和类对象都可以调用类方法。 静态方法:使用@staticmethod装饰器定义。没有self和cls参数。在方法中不能使用类或实例任何属性和方法。实例和对象都可以调用静态方法。 参考: https://github.com/jackfrued/Python-100-Days/blob/master/Day01-15/Day09/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%BF%9B%E9%98%B6.md","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"Jupyter Notebooks的简单了解","slug":"Jupyter-Notebooks的简单了解","date":"2019-05-22T22:00:25.000Z","updated":"2019-05-22T22:00:25.000Z","comments":true,"path":"2019/05/22/Jupyter-Notebooks的简单了解/","permalink":"https://yeshan333.github.io/2019/05/22/Jupyter-Notebooks%E7%9A%84%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3/","excerpt":"撸一手Jupyter","text":"玩Python这么久了,连Jupyter都不会,有点捞,今天补一补这方面的操作。。。。 Jupyter Notebooks  Jupyter Notebooks 是一款开源的网络应用,我们可以将其用于创建和共享代码与文档。其提供了一个环境,你无需离开这个环境,就可以在其中编写你的代码、运行代码、查看输出、可视化数据并查看结果。因此,这是一款可执行端到端的数据科学工作流程的便捷工具,其中包括数据清理、统计建模、构建和训练机器学习模型、可视化数据等等。 安装pip install ipython jupyter 上手上手在终端输入jupyter notebook启动Jupyter notebooks,它会在默认浏览器中打开,地址是http://localhost:8888/tree。 新建个Python文件试试 Jupyter常用键盘快捷键esc和enter用于切换Jupyter的键盘输入模式,esc切换为命令模式(blue),enter切换为编辑模式(green) 命令模式(常用) 连续按两下D,删除当前活跃单元 按A在活跃单元上插入一个单元,按B在活跃单元下插入一个单元 按Z撤销被删除的单元 按Y将当前单元变为代码单元 按Shift+方向上下键选择多个单元,按Shift+M可以合并选择的单元 Ctrl+Shift+F用于打开命令面板 按H查看快捷键完整列表 编辑模式(常用) Ctrl+S保存(防死机(๑•̀ㅂ•́)و✧) Ctrl+Home回到单元起始位置 Ctrl+Enter运行整个单元块 Alt+Enter运行当前活跃单元块,并在当前活跃单元块下方创建新的单元块 emmm可以划水了。。。。 了解更多: 始于Jupyter Notebooks:一份全面的初学者实用指南 jupyter notebook使用技巧 Jupyter介绍和使用 中文版","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"Python多进程&&多线程(初步)","slug":"Python多进程-多线程","date":"2019-05-11T21:40:32.000Z","updated":"2019-05-11T21:40:32.000Z","comments":true,"path":"2019/05/11/Python多进程-多线程/","permalink":"https://yeshan333.github.io/2019/05/11/Python%E5%A4%9A%E8%BF%9B%E7%A8%8B-%E5%A4%9A%E7%BA%BF%E7%A8%8B/","excerpt":"进程 && 线程 进程:进程是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。进程可以通过fork或者wpawn的方式来创建新的进程执行其他任务,不过新的进程有自己独立的内存空间和数据栈,所以必须通过进程间的通信机制(IPC,Inter Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存等。 线程:进程的一个执行单元。线程在同一个进程中执行,共享程序的上下文。一个进程中的各个线程与主线程共享同一片数据空间,因而相比与独立的进程,线程间的信息共享和通信更为容易。线程一般是以并发的方式执行的。注意在单核CPU系统中,真正的并发是不可能的,所以新城的执行实际上是这样规划的:每个线程执行一小会,然后让步给其他线程的任务(再次排队等候更多的CPU执行时间)。在整个线程的执行过程中,每个线程执行它自己的特定的任务,在必要时和其他进程进行结果通信。 Python多进程(使用multiprocessing)1234567891011121314151617181920212223242526from time import time, sleepfrom random import randintfrom multiprocessing import Processdef my_task(name): sleep_time = randint(1,10) sleep(sleep_time) print("你叫了一声%s,它鸟你用了%d秒" % (name, sleep_time))def main(): start = time() process_1 = Process(target=my_task, args=["yeshan", ]) process_2 = Process(target=my_task, args=["foel", ]) # 启动进程 process_1.start() process_2.start() # 等待进程执行结束 process_1.join() process_2.join() end = time() print("一共花费了%f秒" % (end-start))if __name__ == '__main__': main()","text":"进程 && 线程 进程:进程是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。进程可以通过fork或者wpawn的方式来创建新的进程执行其他任务,不过新的进程有自己独立的内存空间和数据栈,所以必须通过进程间的通信机制(IPC,Inter Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存等。 线程:进程的一个执行单元。线程在同一个进程中执行,共享程序的上下文。一个进程中的各个线程与主线程共享同一片数据空间,因而相比与独立的进程,线程间的信息共享和通信更为容易。线程一般是以并发的方式执行的。注意在单核CPU系统中,真正的并发是不可能的,所以新城的执行实际上是这样规划的:每个线程执行一小会,然后让步给其他线程的任务(再次排队等候更多的CPU执行时间)。在整个线程的执行过程中,每个线程执行它自己的特定的任务,在必要时和其他进程进行结果通信。 Python多进程(使用multiprocessing)1234567891011121314151617181920212223242526from time import time, sleepfrom random import randintfrom multiprocessing import Processdef my_task(name): sleep_time = randint(1,10) sleep(sleep_time) print("你叫了一声%s,它鸟你用了%d秒" % (name, sleep_time))def main(): start = time() process_1 = Process(target=my_task, args=["yeshan", ]) process_2 = Process(target=my_task, args=["foel", ]) # 启动进程 process_1.start() process_2.start() # 等待进程执行结束 process_1.join() process_2.join() end = time() print("一共花费了%f秒" % (end-start))if __name__ == '__main__': main() 我们通过Process类创建了进程对象,通过target参数我们传入一个函数来表示进程启动后要执行的代码,后面的args是一个元组,它代表了传递给函数的参数。Process对象的start方法用来启动进程,join方法表示等待进程执行结束。 Python多线程(使用threading)123456789101112131415161718192021222324252627282930313233#!/usr/bin/env python#-*- coding:utf-8 -*-from time import time, sleepfrom random import randintfrom threading import Threaddef download(filename): print("开始下载 %s ..." % filename) download_time = randint(1,10) sleep(download_time) print("下载完成!耗时 %d 秒" % download_time)def main(): start = time() t1 = Thread(target=download, args=('黑暗地宫',)) t1.start() t2 = Thread(target=download, args=('通天',)) t2.start() t1.join() t2.join() end = time() print("下载总共耗时 %.3f 秒" % (end-start))if __name__ == '__main__': main() ** 继承Thread类,实现自定义线程类 ** 123456789101112131415161718192021222324252627282930313233343536373839#-*- coding:utf-8 -*-from time import time, sleepfrom random import randintfrom threading import Threadclass DownLoadTask(Thread): def __init__(self, filename): super().__init__() #初始化父类的构造函数 self._filename = filename # 私有的 def run(self): print("开始下载 %s ..." % self._filename) download_time = randint(1,10) sleep(download_time) print("%s下载完成!耗时 %d 秒" % (self._filename, download_time))def main(): strat = time() t1 = DownLoadTask("从菜鸟到菜鸡") t1.start() t2 = DownLoadTask("去哪里啊弟弟") t2.start() t1.join() t2.join() end = time() print("下载完成,总共耗费 %.3f 秒" % (end-strat))if __name__ == '__main__': main() 线程间的通信 因为多个线程可以共享进程的内存空间,因此要实现多个线程间的通信相对简单,大家能想到的最直接的办法就是设置一个全局变量,多个线程共享这个全局变量即可。但是当多个线程共享同一个变量(我们通常称之为“资源”)的时候,很有可能产生不可控的结果从而导致程序失效甚至崩溃。如果一个资源被多个线程竞争使用,那么我们通常称之为“临界资源”,对“临界资源”的访问需要加上保护,否则资源会处于“混乱”的状态。在这种情况下,“锁”就可以派上用场了。我们可以通过“锁”来保护“临界资源”,只有获得“锁”的线程才能访问“临界资源”,而其他没有得到“锁”的线程只能被阻塞起来,直到获得“锁”的线程释放了“锁”,其他线程才有机会获得“锁”,进而访问被保护的“临界资源”。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455from time import sleepfrom threading import Thread, Lockclass Account(object): def __init__(self): self._balance = 0 self._lock = Lock() def deposit(self, money): # 先获取锁才能获取后面的代码 self._lock.acquire() try: # 计算存款后的余额 new_balance = self._balance + money # 模拟受理存款业务需要0.01秒的时间 sleep(0.01) # 修改账户余额 self._balance = new_balance finally: self._lock.release() @property def balance(self): return self._balanceclass AddMoneyThread(Thread): def __init__(self, account, money): super().__init__() self._account = account self._money = money def run(self): self._account.deposit(self._money)def main(): account = Account() threads = [] # 创建100个存款的线程向同一个账户中存钱 for _ in range(100): t = AddMoneyThread(account, 1) threads.append(t) t.start() # 等所有存款的线程都执行完毕 for t in threads: t.join() print('账户余额为: ¥%d元' % account.balance)if __name__ == '__main__': main() 输出结果为100块,不用锁为2块 ** Python内置装饰器 property ** *** property装饰器一般存在于类中,可以将一个函数定义成一个属性,属性的值就是该函数return的内容 *** 1234567891011121314class Student(object): # 把一个方法变成属性 @property def score(self): return self._score # setter把一个方法变成一个可控属性用于赋值 @score.setter def score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') self._score = value 参考: 一篇文章搞懂装饰器的用法 https://github.com/jackfrued/Python-100-Days/blob/master/Day01-15/Day13/%E8%BF%9B%E7%A8%8B%E5%92%8C%E7%BA%BF%E7%A8%8B.md","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"HTTPie的使用","slug":"HTTPie的使用","date":"2019-04-23T23:47:48.000Z","updated":"2019-04-23T23:47:48.000Z","comments":true,"path":"2019/04/23/HTTPie的使用/","permalink":"https://yeshan333.github.io/2019/04/23/HTTPie%E7%9A%84%E4%BD%BF%E7%94%A8/","excerpt":"HTTPie","text":"HTTPie(发音为aitch-tee-tee-pie)是一个命令行HTTP客户端。其目标是使与Web服务的CLI交互尽可能人性化。它提供了一个简单的http命令,允许使用简单自然的语法发送任意HTTP请求,并显示彩色输出。HTTPie可用于测试,调试以及通常与HTTP服务器交互。 HTTPie官方文档 https://httpie.org/doc windows下安装 pip install --upgrade httpie HTTPie的简单使用一个完整的请求语句的大概样子http [选项(flags)] [方法] URL [查询字符串/数据字段/首部字段] HTTPie数据语法 类型 符号 示例 URL参数 == param==value 首部字段 : Name:value 数据字段 = field=value 原生JSON字段 := field:=json 表单上传字段 @ field@dir/file 示例1234567891011121314# 下载文件$ http --download www.jb51.net/my_file.zip# 提交表单$ http -f POST www.jb51.net name='Dan Nanni' comment='Hi there'# HTTPie的默认数据类型为JSON格式的$ http PUT example.org name=John email=john@example.org# 使用代理$ http --proxy=http:http://10.10.1.10:3128 --proxy=https:https://10.10.1.10:1080 example.org# 定制请求头$ http www.test.com User-Agent:Xmodulo/1.0 Referer:http://www.imike.me MyParam:Foo 放着先。。。。。。。。。占个位","categories":[],"tags":[]},{"title":"Git Branch Practice","slug":"Git-Branch-Practice","date":"2019-04-08T12:52:55.000Z","updated":"2019-04-08T12:52:55.000Z","comments":true,"path":"2019/04/08/Git-Branch-Practice/","permalink":"https://yeshan333.github.io/2019/04/08/Git-Branch-Practice/","excerpt":"Git Branch Practice","text":"最近在弄一个东西,基本的功能已经弄好了,现在想再扩展一起其他功能,但这样势必会改动原有代码,我又不想破坏原有的代码逻辑,方便以后查看。记得Git有个分支工作流可以很好的满足我的需求(๑•̀ㅂ•́)و✧。emmm,很久没发文了,record一下吧。(ノへ ̄、) 使用到的命令12345678910111213$ git branch # 显示所有本地分支$ git branch <new branch> # 创建新分支$ git checkout <branch> # 切换到指定分支$ git branch -d <branch> # 删除本地分支$ git push --set-upstream origin <branch> # 将本地分支与远程分支关联$ git push origin --delete <branch> # 删除远程分支$ git tag -n # 列出所有本地标签以及相关信息$ git tag <tagname> # 基于最新提交创建标签& git tag <tagname> -m "备注信息" # 基于最新提交创建含备注信息的标签$ git tag -d <tagname> # 删除标签$ git push orign <tagname> # 将指定信息推送到远程仓库$ git push --tags # 推送所有标签到远程仓库 操作~操作 emmm,顺便试试tag","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"}]},{"title":"吐槽","slug":"吐槽","date":"2019-03-22T00:51:31.000Z","updated":"2019-03-22T00:51:31.000Z","comments":true,"path":"2019/03/22/吐槽/","permalink":"https://yeshan333.github.io/2019/03/22/%E5%90%90%E6%A7%BD/","excerpt":"","text":"better and better","categories":[],"tags":[]},{"title":"我与vim的亲密接触(ˉ▽ ̄~)","slug":"我与vim的亲密接触","date":"2019-03-20T23:51:17.000Z","updated":"2019-03-20T23:51:17.000Z","comments":true,"path":"2019/03/20/我与vim的亲密接触/","permalink":"https://yeshan333.github.io/2019/03/20/%E6%88%91%E4%B8%8Evim%E7%9A%84%E4%BA%B2%E5%AF%86%E6%8E%A5%E8%A7%A6/","excerpt":"emmm,闲来无事,打算了解下神奇vim(用来zhuangbi)。在终端操作很帅(ˉ▽ ̄~)~~!什么是vim??Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 vi/vim的使用vi/vim有三种模式: 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。刚启动时就是这个模式。 输入模式:正常的文本录入。 末行模式:保存或退出文档,以及设置编辑环境。又可成为底线命令模式。","text":"emmm,闲来无事,打算了解下神奇vim(用来zhuangbi)。在终端操作很帅(ˉ▽ ̄~)~~!什么是vim??Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 vi/vim的使用vi/vim有三种模式: 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。刚启动时就是这个模式。 输入模式:正常的文本录入。 末行模式:保存或退出文档,以及设置编辑环境。又可成为底线命令模式。 常用命令命令模式常用命令: 命令 作用 dd 删除(剪切)光标所在整行 5dd 删除(剪切)从光标处开始的5行 yy 复制光标所在的整行 5yy 复制从光标处开始的5行 n 显示搜索命令定位到的下一个字符串 N 显示搜索命令定位到的上一个字符串 u 撤销上一步的操作 p 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面 末行模式可用命令: 命令 作用 :w 保存 :q 退出 :q! 强制退出(放弃对文档内容的修改) :wq! 强制保存退出 :set nu 显示行号 :set nonu 不显示行号 :命令 执行该命令 :整数 跳转到该行 :s/one/two 将当前光标所在行的第一个one替换成two :s/one/two/p 将当前光标所在行的所有one替换成two :%s/one/two/g 将全文中的所有one替换成two ?字符串 在文本中从下到上搜索该字符串 /字符串 在文本中从上到下搜索该字符串 我与它的亲密接触。。。。。 相关 vim官网:https://www.vim.org/ vim快捷键键位图:https://www.jianshu.com/p/8b986f572a61","categories":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/categories/Linux/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/tags/Linux/"}]},{"title":"SQLAlchemy建立数据库模型之间的关系","slug":"SQLAlchemy建立数据库模型之间的关系","date":"2019-03-20T17:45:17.000Z","updated":"2019-03-20T17:45:17.000Z","comments":true,"path":"2019/03/20/SQLAlchemy建立数据库模型之间的关系/","permalink":"https://yeshan333.github.io/2019/03/20/SQLAlchemy%E5%BB%BA%E7%AB%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E6%A8%A1%E5%9E%8B%E4%B9%8B%E9%97%B4%E7%9A%84%E5%85%B3%E7%B3%BB/","excerpt":"常见关系: 一对多关系 多对一关系 多对多关系 一对一关系 一对多关系(一个作者,多篇文章)123456789101112131415161718192021222324252627282930## 一对多关系,单作者-多文章,外键不可少## 外键(ForeignKey)总在多的那边定义,关系(relationship)总在单的那边定义class Author(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(70), unique=True) phone = db.Column(db.String(20)) # articles为关系属性(一个集合,可以像列表一样操作,在关系的出发侧定义 ## relationship()函数的第一个参数为关系另一侧的模型名称(Article) articles = db.relationship('Article')class Article(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(15), index=True) body = db.Column(db.Text) # 传入ForeignKey的参数形式为:"表名.字段名" ## 模型类对应的表名由Flask-SQLAlchemy生成,默认为类名称的小写形式,多个单词通过下划线分隔 author_id = db.Column(db.Integer, db.ForeignKey('author.id')) ## 外键字段(author_id)和关系属性(articles)的命名没有限制## 建立关系可通过操作关系属性进行>>>shansan = Author(name="shansan")>>>hello = Article(title="Hello world !")>>>boy = Article(title="Hello Boy !")>>>db.session.add(shansan) # 将创建的数据库记录添加到会话中>>>db.session.add(hello)>>>db.session.add(boy)>>>shansan.articles.append(hello) # 操作关系属性>>>shansan.articles.append(boy)>>>db.session.commit()","text":"常见关系: 一对多关系 多对一关系 多对多关系 一对一关系 一对多关系(一个作者,多篇文章)123456789101112131415161718192021222324252627282930## 一对多关系,单作者-多文章,外键不可少## 外键(ForeignKey)总在多的那边定义,关系(relationship)总在单的那边定义class Author(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(70), unique=True) phone = db.Column(db.String(20)) # articles为关系属性(一个集合,可以像列表一样操作,在关系的出发侧定义 ## relationship()函数的第一个参数为关系另一侧的模型名称(Article) articles = db.relationship('Article')class Article(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(15), index=True) body = db.Column(db.Text) # 传入ForeignKey的参数形式为:"表名.字段名" ## 模型类对应的表名由Flask-SQLAlchemy生成,默认为类名称的小写形式,多个单词通过下划线分隔 author_id = db.Column(db.Integer, db.ForeignKey('author.id')) ## 外键字段(author_id)和关系属性(articles)的命名没有限制## 建立关系可通过操作关系属性进行>>>shansan = Author(name="shansan")>>>hello = Article(title="Hello world !")>>>boy = Article(title="Hello Boy !")>>>db.session.add(shansan) # 将创建的数据库记录添加到会话中>>>db.session.add(hello)>>>db.session.add(boy)>>>shansan.articles.append(hello) # 操作关系属性>>>shansan.articles.append(boy)>>>db.session.commit() 基于一对多的双向关系(bidirectional relationship)在这里我们希望可以在Book类中存在这样一个属性:通过调用它可以获取对应的作者的记录,这类返回单个值的关系属性称为标量关系属性 1234567891011121314151617181920212223# 建立双向关系时,关系两边都有关系函数# 在关系函数中,我们使用back_populates参数连接对方,参数的值设置为关系另一侧的关系属性名class Writer(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) # back_populates的参数值为关系另一侧的关系属性名 books = db.relationship('Book', back_populates='writer') def __repr__(self): return '<Writer %r>' % self.nameclass Book(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), index=True) writer_id = db.Column(db.Integer, db.ForeignKey('writer.id')) writer = db.relationship('Writer', back_populates='books') def __repr__(self): return '<Book %r>' % self.name# 设置双向属性后,我们既可以通过集合属性操作关系,也可通过标量关系属性操作关系 多对一关系(多个市民都在同一个城市)123456789101112# 外键总在多的一侧定义## 多对一关系中,外键和关系属性都在多的一侧定义## 这里的关系属性是标量关系属性(返回单一数据)class Citizen(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20), unique=True) city_id = db.Column(db.Integer, db.ForeignKey('city.id')) city = db.relationship('City')class City(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20), unique=True) 一对一关系(国家和首都)12345678910111213## 一对一关系,将关系函数的uselist参数设为False,使得集合关系属性无法使用列表语义操作## 这里使用的是一对一双向关系class Country(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20), unique=True) capital = db.relationship('Capital', uselist=False)class Capital(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20), unique=True) country_id= db.Column(db.Integer, db.ForeignKey('country.id')) country = db.relationship('Country') 多对多双向关系(老师和学生) 多对多关系的建立需要使用关联表(association table)。关联表不存储数据,只用来存储关系两侧模型的外键对应关系 定义关系两侧的关系函数时,需要添加一个secondary参数,值设为关联表的名称 关联表由使用db.Table类定义,传入的第一个参数为关联表的名称 我们在关联表中将多对多的关系分化成了两个一对多的关系 123456789101112131415161718192021## 多对多关系,使用关联表(association table),关联表由db.Table定义## 关系函数需要设置secondary参数,值为关系表名association_table = db.Table('association_table', db.Column('student_id', db.Integer, db.ForeignKey('teacher.id')), db.Column('teacher_id', db.Integer, db.ForeignKey('student.id')) )class Student(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(70), unique=True) grade = db.Column(db.String(20)) teachers = db.relationship('Teacher', secondary=association_table,back_populates='students')class Teacher(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(70), unique=True) office = db.Column(db.String(20)) students = db.relationship('Student', secondary=association_table, back_populates='teachers') 常用的SQLAlchemy关系函数参数和常用的SQLAlchemy关系记录加载方式(lazy参数可选值) 使用关系函数定义的属性不是数据库字段,而是类似于特定的查询函数 当关系属性被调用时,关系函数会加载相应的记录 相关http://www.sqlalchemy.org/ https://github.com/sqlalchemy/sqlalchemy https://github.com/mitsuhiko/flask-sqlalchemy","categories":[{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/categories/Flask/"}],"tags":[{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/tags/Flask/"}]},{"title":"Flask的请求钩子与上下文简记","slug":"Flask的请求钩子与上下文简记","date":"2019-03-16T22:32:05.000Z","updated":"2019-03-16T22:32:05.000Z","comments":true,"path":"2019/03/16/Flask的请求钩子与上下文简记/","permalink":"https://yeshan333.github.io/2019/03/16/Flask%E7%9A%84%E8%AF%B7%E6%B1%82%E9%92%A9%E5%AD%90%E4%B8%8E%E4%B8%8A%E4%B8%8B%E6%96%87%E7%AE%80%E8%AE%B0/","excerpt":"请求钩子(Hook) 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:在请求开始时,建立数据库连接;在请求结束时,指定数据的交互格式。为了让>每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。通过请求钩子,我们可以对请求进行预处理(preprocessing)和后处理>(postprocessing)。 Flask的请求钩子通过装饰器实现,每个钩子可以注册任意多个处理函数,默认的五种请求钩子如下: 钩子 说明 before_first_request 注册一个函数,在处理请求前运行 before_request 注册一个函数,在处理每个请求前运行 after_request 注册一个函数,如果有未处理的一场抛出。会在每个请求结束后运行 teardown_request 注册一个函数,即使有未处理的异常抛出,会在每个请求介绍后执行。如果发生异常,会传入异常对象作为参数注册到函数中 after_this_request 在视图函数内注册一个函数,在这个请求结束后运行","text":"请求钩子(Hook) 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:在请求开始时,建立数据库连接;在请求结束时,指定数据的交互格式。为了让>每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。通过请求钩子,我们可以对请求进行预处理(preprocessing)和后处理>(postprocessing)。 Flask的请求钩子通过装饰器实现,每个钩子可以注册任意多个处理函数,默认的五种请求钩子如下: 钩子 说明 before_first_request 注册一个函数,在处理请求前运行 before_request 注册一个函数,在处理每个请求前运行 after_request 注册一个函数,如果有未处理的一场抛出。会在每个请求结束后运行 teardown_request 注册一个函数,即使有未处理的异常抛出,会在每个请求介绍后执行。如果发生异常,会传入异常对象作为参数注册到函数中 after_this_request 在视图函数内注册一个函数,在这个请求结束后运行 假如我们创建了三个视图函数A、B、C,其中视图C使用了after_this_request钩子,那么当请求A进入后,整个请求处理周期的请求处理函数调用流程如图: 上下文 什么是上下文?上下文相当于一个容器,它保存了程序运行过程中的一些信息,它是当前环境的一个快照(snapshot)。Flask中有两种上下文,程序上下文(application context)和请求上下文(request context)。程序上下文中包含了程序运行所必须的信息;请求上下文里包含了请求的各种信息,比如请求的URL、HTTP方法等 上下文全局变量我们知道,Flask将请求报文封装在request对象中。按照一般的思路,如果我们要在视图函数中使用它,就得把它作为参数传入视图函数,就像我们接收URL变量一样。但这样就会导致大量的重复,而且增加了的程序的负担。不一般的是,我们可以从Flask导入一个全局的request变量,在视图函数中直接调用request的属性获取数据。这是为什么?因为Flask会在每个请求产生后后自动激活当前请求的上下文,激活请求上下文后,request被临时设置为全局可访问。在每个请求结束后,Flask就会销毁对应的请求上下文。 Flask提供的四个上下文全局变量如下: 变量名 上下文类别 说明 current_app 程序上下文 指向处理请求的当前程序实例 g 程序上下文 替代Python的全局变量用法,确保仅在当前请求可用,用于存储全局数据,每次请求都会重设 request 请求上下文 封装客户端发出的请求报文数据 session 请求上下文 用于记住请求之间的数据,通过签名的Cookie实现 不同的视图函数中,request对象都表示和视图函数对应的请求,也就是当前请求 程序存在多个程序实例的情况,使用current_app可获取对应的实例 上下文的激活请求进入时,Flask会自动激活请求上下文,此时程序上下文也被自动激活。请求处理完毕后,请求上下文和程序上下文也会自动销毁。两者具有相同的生命周期。 Flask自动激活上下文的情况: 使用flask run命令启动程序时 使用旧的app.run()方法启动程序时 执行使用@app.cli.command()装饰器注册的flask命令时 使用flask shell命令启动Python Shell时 手动激活的方法: 使用with语句,程序上下文对象可通过app.app_context()获取 使用push()方法激活程序上下文 请求上下文可以通过test_request_context()方法临时创建 12345>>> from app import app>>> from flask import current_app>>> with app.app_context(): ... current_app.name'app' 1234567>>> from app import app>>> from flask import current_app>>> app_ctx = app.app_context()>>> app_ctx.push()>>> current_app.name'app'>>> app_ctx.pop() 12345>>> from app import app>>> from flask import request>>> with app.test_request_context('/hello'):... request.method'GET' 参考:https://book.douban.com/subject/30310340/","categories":[{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/categories/Flask/"}],"tags":[{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/tags/Flask/"}]},{"title":"将本地项目推送到GitHub远程仓库","slug":"将本地项目推送到GitHub远程仓库","date":"2019-03-08T23:59:28.000Z","updated":"2019-03-08T23:59:28.000Z","comments":true,"path":"2019/03/08/将本地项目推送到GitHub远程仓库/","permalink":"https://yeshan333.github.io/2019/03/08/%E5%B0%86%E6%9C%AC%E5%9C%B0%E9%A1%B9%E7%9B%AE%E6%8E%A8%E9%80%81%E5%88%B0GitHub%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93/","excerpt":"如何将本地项目推送到Github Tip:在本地要安装好Git,官网:https://git-scm.com/ 一个学习Git的好地方:https://try.github.io/ 在线闯关实战,边练边学的好地方:https://learngitbranching.js.org/ 方法一:使用https推送12345678910111213# 步骤# 1.创建一个目录mkdir Test# 2.将当前目录变为git管理仓库git init# 3.将文件添加到版本库,这里将目录下的所有文件都添加进去了git add .# 4.告诉git将文件提交到仓库git commit -m "first-commit"# 5.将当前仓库与远程仓库关联git remote add origin 远程仓库的https地址 # eg: git remote add https://github.com/ssmath/Test.git# 6.将仓库内master分支的所有内容推送到远程仓库,这里会使用到Github的账号密码git push -u origin master","text":"如何将本地项目推送到Github Tip:在本地要安装好Git,官网:https://git-scm.com/ 一个学习Git的好地方:https://try.github.io/ 在线闯关实战,边练边学的好地方:https://learngitbranching.js.org/ 方法一:使用https推送12345678910111213# 步骤# 1.创建一个目录mkdir Test# 2.将当前目录变为git管理仓库git init# 3.将文件添加到版本库,这里将目录下的所有文件都添加进去了git add .# 4.告诉git将文件提交到仓库git commit -m "first-commit"# 5.将当前仓库与远程仓库关联git remote add origin 远程仓库的https地址 # eg: git remote add https://github.com/ssmath/Test.git# 6.将仓库内master分支的所有内容推送到远程仓库,这里会使用到Github的账号密码git push -u origin master 方法二:使用ssh推送 生成ssh密钥 12ssh-keygen -t rsa -C "your email address"# eg: ssh-keygen -t rsa -C "1329441308@qq.com" 找到生成的文件,复制id_rsa.pub文件中的内容,文件一般在用户目录下的.ssh目录中 使用密钥与远程仓库配对,检验能否成功通讯 ssh -T git@github.com # 检验能否成功通讯 推送本地文件到github","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"}]},{"title":"vscode配置Pipenv工作环境","slug":"vscode配置Pipenv工作环境","date":"2019-03-03T23:25:30.000Z","updated":"2019-03-03T23:25:30.000Z","comments":true,"path":"2019/03/03/vscode配置Pipenv工作环境/","permalink":"https://yeshan333.github.io/2019/03/03/vscode%E9%85%8D%E7%BD%AEPipenv%E5%B7%A5%E4%BD%9C%E7%8E%AF%E5%A2%83/","excerpt":"让vscode使用Pipenv工作环境1、查看Pipenv的位置1234# 先激活Pipenv环境pipenv shell# 获取当前虚拟环境的位置pipenv --venv 2、打开setting.json配置文件 Ctrl+Shift+P,输入settings,选择Open Settings(JSon) 将之前得到的Pipenv环境路径添加进去 “python.venvPath”: “C:\\Users\\Algorithm\\.virtualenvs”","text":"让vscode使用Pipenv工作环境1、查看Pipenv的位置1234# 先激活Pipenv环境pipenv shell# 获取当前虚拟环境的位置pipenv --venv 2、打开setting.json配置文件 Ctrl+Shift+P,输入settings,选择Open Settings(JSon) 将之前得到的Pipenv环境路径添加进去 “python.venvPath”: “C:\\Users\\Algorithm\\.virtualenvs” 3、重启vscode 参考https://segmentfault.com/a/1190000017558652 https://blog.csdn.net/weixin_34294649/article/details/87518937","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"Happy New Year !","slug":"Happy-New-Year","date":"2019-02-05T00:00:00.000Z","updated":"2019-02-05T00:00:00.000Z","comments":true,"path":"2019/02/05/Happy-New-Year/","permalink":"https://yeshan333.github.io/2019/02/05/Happy-New-Year/","excerpt":"","text":"12345678910111213141516171819202122232425262728C:printf("Happy New Year");C++ : cout<<"Happy New Year";Objectivec: NSLog(@"Happy New Year!");QBasic : Print "Happy New Year"Asp : Response.Write "Happy New Year"PHP : echo "Happy New Year";Ruby: puts "Happy New Year!"JavaScript: alert("Happy New Year")VBScript:MsgBox "Happy New Year"JavaScript: document.write("Happy New Year")JavaScript: console.log(' Happy New Year');xml <TextView android:text="Happy New Year! " />Delphi: ShowMessage('Happy New Year!');VB: Msg("Happy New Year!")VC: MessageBox("Happy New Year!");shell: echo Happy New Yearperl: print 'Happy New Year'java: System.out.println("Happy New Year");LISP:(format t "Happy New Year!~%")powerBuilder:messagebox("Happy New Year")C#:System.Console.WriteLine("Happy New Year!")COBOL:DISPLAY 'Happy New Year!'Python:print("Happy New Year!")aswing:JOptionPane.showMessageDialog("happy","Happy New Year!")flex:Alert.show("Happy New Year!");Clojure: (println "Happy New Year")verilog/systemverilog/e $display("Happy New Year")as:trace("Happy New Year!");","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"HTML&&CSS(划水~~~)","slug":"HTML-CSS-划水","date":"2019-01-22T17:09:40.000Z","updated":"2019-01-22T17:09:40.000Z","comments":true,"path":"2019/01/22/HTML-CSS-划水/","permalink":"https://yeshan333.github.io/2019/01/22/HTML-CSS-%E5%88%92%E6%B0%B4/","excerpt":"HTML(超文本标记语言)HTML标签不区分大小写。 HTML属性 ID属性指定一个标识符,用于唯一标识页面元素,这些标识符主要供Javascript和CSS使用 class属性是一个全局属性,可用于建立元素编组。可以给多个元素指定相同的class属性,以便在CSS或Javascript中将这些元素作为一个编组来引用它们 style属性用于定义标签的样式。任何标签中都可以指定属性style。使用style属性可以为标签指定一个或多个样式规则,** 在style定义多条规则的方法是用分号将他们分开 **","text":"HTML(超文本标记语言)HTML标签不区分大小写。 HTML属性 ID属性指定一个标识符,用于唯一标识页面元素,这些标识符主要供Javascript和CSS使用 class属性是一个全局属性,可用于建立元素编组。可以给多个元素指定相同的class属性,以便在CSS或Javascript中将这些元素作为一个编组来引用它们 style属性用于定义标签的样式。任何标签中都可以指定属性style。使用style属性可以为标签指定一个或多个样式规则,** 在style定义多条规则的方法是用分号将他们分开 ** HTML的列表列表标签的特征: 每个列表都有一个指定列表类型的外部元素。 每个列表项都有自己的标签。 12345无序列表:<ul></ul>有序列表:<ol></ol>定义列表:<dl></dl>词汇列表的列表项为<dt><dd>其他列表的列表项为<li> 有序列表(ol)有序列表默认的编号为罗马数字,可以使用属性style指定列表的编号样式,使用CSS属性list-style-type进行修改 1234567eg:<ol style="list-style-type: upper-roman"> <li>罗马假日</li> <li>平凡的世界</li> <li>封神榜</li> <li>无间道</li></ol> 罗马假日 平凡的世界 封神榜 无间道 有序列表的编号样式 CSS属性list-style-type 描述 decimal(默认) 标准阿拉伯数字 lower-alpha 小写字母 upper-alpha 大写字母 lower-roman 小写罗马数字 upper-roman 大写罗马数字 无序列表(ul)无序列表编号样式 CSS属性list-style-type 描述 disc 圆盘,默认样式 square 实心正方形 circle 空心圆 123456eg:<ul style="list-style-type: square"> <li>正方体</li> <li>长方体</li> <li>圆柱体</li></ul> 正方体 长方体 圆柱体 定义列表(dl)定义列表的每个列表项都包含两部分 术语,标签为<dt> 术语的定义,标签为<dt> 1234567eg:<dl> <dt>HTML</dt> <dd>超文本标记语言,标准通用标记语言下的一个应用。是 网页制作必备的编程语言。</dd> <dt>CSS</dt> <dd>层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。</dd></dl> HTML 超文本标记语言,标准通用标记语言下的一个应用。是 网页制作必备的编程语言。 CSS 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。 链接和锚链接到另一个页面的特定位置** 方法: 使用锚,即在链接的URL中指定要链接到的元素的ID ** 12345678910eg:另一个页面2.html:<h2 id="part4">Part four</h2>当前页面1.html:<a href="2.html#part4">go to part four</a> 链接到当前页面的其他元素** 方法: 省略页面名就行,使用#号和ID ** 12eg:go to<a href="#section5">the fifth setion</a> span标签span标签和style属性结合使用时,可取代很多标签,效果很nice 1234<p>Here is some<span style="text-decoration: underline"> underline text</span></p><p>Here is some<span style="font-style:oblique"> oblique text</span></p><p>Here is some<span style="text-decoration:line-through">line-through text</span></p><p>Here is some<span style="font-weight:120"> bolder text</span></p> Here is some underline text Here is some oblique text Here is someline-through text Here is some bolder text HTML表格 标签 用途 <table></table> 定义表格 <caption></caption> 创建表题(可选) <tr></tr> 定义一个表格行,其中可包含表头单元格或数据单元格 <th></th> 定义一个表头单元格。表头单元格得内容通常显示为粗体,且在水平和竖直方向上都居中 <td></td> 定义一个数据单元格。数据单元格得内容通常显示为常规字体,在水平方向上左对齐,而且在垂直方向上居中 <colgroup></colgroup> 将一列或多列编组 <col></col> 用于定义表格列属性 <thead></thead> 创建表示表头的行编组。一个表格只能有一个表头 <tfoot></tfoot> 创建表示表尾的行编组。一个表格只能有一个表尾,它必须在表体前定义 <tbody></tbody> 定义一个或多个表示表体的行编组。一个表格可包含多个表头部分 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465<!DOCTYPE html><html><head> <title>Table</title></head><body> <table border="1" style="width: 100%;"> <caption><b>Science and Mathematic Class Schedules</b></caption> <colgroup style="width: 20%; text-align: center; vertical-align: top; background-color: #fcf;"> <colgroup span="2" style="width: 40%; vertical-align: top; background-color: #ccf;"> <!-- span属性指定了列编组包含的列数,默认为1 --> <thead style="background-color: red;"> <tr> <th>Class</th> <th>Room</th> <th>Time</th> </tr> </thead> <tbody style="background-color: yellow;"> <tr> <td>Biology</td> <td>Science Wing, Room 102</td> <td>8:00 AM to 9:45 AM</td> </tr> <tr> <td>Science</td> <td>Science Wing, Room 110</td> <td>9:50 AM to 11:30 AM</td> </tr> <tr> <td>Physics</td> <td>Science Wing, Room 107</td> <td>1:00 PM to 2:45 PM</td> </tr> </tbody> <tbody style="background-color: gray;"> <tr> <td>Geometry</td> <td>Mathematics Wing, Room 236</td> <td>8:00 AM to 9:45 Am</td> </tr> <tr> <td>Algebra</td> <td>Mathematics Wing, Room 239</td> <td>9:50 AM to 11:30 AM</td> </tr> <tr> <td>Trigonometry</td> <td>Mathematics Wing, Room 245</td> <td>1:00 PM to 2:45 PM</td> </tr> </tbody> <!-- tfoot一般放在tbody之前 --> <tfoot style="background-color: blue;"> <tr> <th>Class</th> <th>Room</th> <th>Time</th> </tr> </tfoot> </table></body></html> text-align:指定水平对齐方式,可能取值:left、center、right vertical-align:指定垂直对齐方式,可能取值:top、middle、bottom 表格属性 属性 适用元素 用途 border table 指定表格是否带边框,默认不带。这个属性指定了表格边框的宽度 span col和colgroup 指定列编组包含多少列,必须是大于0的整数 colspan th或td 指定单元格将向右延伸横跨多少列 rowspan th或td 指定单元格将向下延伸横跨多少行 123456789101112131415161718192021222324252627<!DOCTYPE html><html><head> <title>colspan and rowspan</title></head><body> <table border="10" style="width: 100%"> <caption><b>跨行跨列表格</b></caption> <!-- 跨列 --> <tr> <th colspan="2">性别</th> </tr> <tr> <td>男</td> <td>女</td> </tr> <!-- 跨行 --> <tr> <th rowspan="2">辣椒</th> <td>牛角椒</td> </tr> <tr> <td>灯笼椒</td> </tr> </table></body></html> HTML表单 标签/属性 用途 <form> 创建HTML表单。一个文档可包含多个表单,但是不可嵌套 action 标签<form>的一个属性,使用URL路径指定负责处理表单数据的服务器脚本 enctype <form>的一个属性,指定将表单数据发送给服务器前如何对其进行编码 method <form>的一个属性,指定如何将表单数据发送给服务器 <input> 一个用于创建表单控件以收集用户输入的信息 <button> 创建一个可包含HTML内容的按钮 <textarea> 创建多行的文本输入字段 <select> 创建一个菜单或可滚动列表,列表项由<option>创建 <progress> 显示任务完成进度的进度条 <label> 创建与表单控件配套的标签 <fieldset> 将表单控件编组 type 标签<input的一个属性>,指定了表单控件的类型,可能取值:text:创建一个单行文本输入字段password: 创建一个可遮挡用户输入的单行文本输入字段hidden: 创建一个隐藏的表单控件checkbox: 创建一个复选框search: 创建一个搜索关键字输入字段file: 创建一个文件上传控件让用户能够选择要随表单数据一起上传到服务器的文件color、date、datetime、email、url、reset等等 其它 items 说明 HTML语义标签 http://www.w3school.com.cn/html/html5_semantic_elements.asp pre标签 http://www.w3school.com.cn/tags/tag_pre.asp HTML字符实体 http://www.w3school.com.cn/html/html_entities.asp CSS(层叠样式表)样式表由一系列规则组成,大致结构如下 selector { property1: value1; property } 每条规则都以选择器(selector)打头,后面是一系列有花括号括起来的属性(property)和值(value)。 每个选择器可以指定任意数量的属性,但属性之间必须用分号分隔。 在最后一个属性/值对后面,可以有分号,也可以没有。 选择器(selector) 任何标签都可以用作CSS选择器,与这种选择器相关联的规则将应用于页面中所有指定的元素 可使用单个选择器将样式应用于多种元素,元素间用逗号间隔,比如: 123p, ul { color: blue} 下面这个规则与上面那个等价 1234567p { color: blue;}ul { color: blue;} 上下文选择器  使用上下文选择器可以将样式应用于嵌套在指定元素内的元素 123ol em { color: red;} 上面那条规则应用于嵌套在有序列表中的em元素 123cite { font-style: inherit; font-weight: 200;}p cite { font-style: italic; font-weight: 500;}li cite{ font-style: normal; font-weight: bolder;} 第一条为应用于所有cite标签的规则对于嵌套的cite标签,后两条规则说明了他们应该应用的样式 类 && ID 选择器 将选择器应用于类,使用.+类名 将选择器应用于ID,使用#+ID,ID是独一无二的 给多个元素指定相同的样式可以使用类名,给单个元素指定样式可以使用ID 12345678910111213141516171819<!-- 使用类型名 --><div class="shan">test</div><!-- CSS -->.shan { color: red;}<!-- ------------------------------------ --><!-- 使用ID --><div id="footer">Copyright 2019</div><!-- CSS -->#footer { font-size: small;} 子选择器1p > span.important { fot-weight: bold; } 这个选择器只与p标签,属于important类的span标签匹配,与下面的span标签不匹配 1<p>This is a paragraph. <em>This is an <span class="important">important</span> sentence.</em></p> 这里的span为p的孙子 伪类http://www.w3school.com.cn/css/css_pseudo_classes.asp 锚伪类 1234a:link {color: #FF0000} /* 未访问的链接 */a:visited {color: #00FF00} /* 已访问的链接 */a:hover {color: #FF00FF} /* 鼠标移动到链接上 */a:active {color: #0000FF} /* 选定的链接 */ 更多 http://www.w3school.com.cn/css/css_selector_descendant.asp CSS度量单位 http://www.w3school.com.cn/cssref/css_units.asp CSS颜色 http://www.w3school.com.cn/cssref/css_colors.asp 盒子模型 element: 元素/内容 padding: 内边距 border: 边框 margin: 外边距 边框的属性 属性 说明 border-style 指定显示的边框类型。可能取值包括:none、dotted、dashed、solid、double、groove、ridge、inset、outset、inherit。 border-width 指定边框的宽度,单位通常为像素(px)。 border-color 指定边框颜色。 同时设置多个边框属性时,形式如下 1selector { border: style width color; } eg: 1a { border: dashed 3px red; } 内边距和外边距 内边距(padding)是边框里面的空白区域 外边距(margin)是边框外面的空白区域 123456789101112131415161718192021222324<!DOCTYPE html><html><head> <title>test</title> <style type="text/css"> .outer { border: 2px solid black; } .inner { border: 2px dotted black; padding: 15px; margin: 15px; } </style></head><body> 工程狮 <div class="outer"> <div class="inner"> 攻城狮(谐音)工程师,来源于腾讯QQ手机管家于2012年3月1日16:53在发布了一条微博:<br/> 声称腾讯公司一名保安经过一层层技术面试进入了腾讯研究院,成为一名攻城狮(工程师)。<br/> 这种事儿看起来相信很多人的第一反应都是恶搞,不过不久,腾讯老大马化腾亲自出面,核实了这一事件的真实性,并且称这是个“很励志的故事”。<br/> </div> </div></body></html> 内容(element)盒子 块式盒子 内嵌盒子 块级元素前后都换行,而内嵌元素的尺寸取决于其包含的内容以及外边距、内边距和边框的设置。CSS提供了属性display来修改元素的默认行为,属性display的可能取值有三个:block、inline和none。 边框显示了在样式表中指定的盒子的尺寸。但文本太多的时候,盒子可能无法容纳,多出来的文本可能会跑到边框的下方。这时,可以通过CSS属性overflow告诉浏览器要如何做。overflow的可能取值包括:visible(默认)、hidden、scroll、auto和inherit。 浮动(修改块级元素的排列方式) 属性float,指出浮动位置,取值:right、left、none 属性clear,消除浮动的影响,取值:none、left、right、both See the Pen 1 by Mr.Ye (@yeshan333) on CodePen.   浮动的p元素移到了页面右边,而第二个段落出现在它的左边。通过将属于right类的元素p的样式属性float设置为right,指出了页面其他元素应沿元素绕排。我们将第三个段落的clear属性设置为both,消除了前面浮动的影响。 如果想要将第二段浮动到第一段的下方,可设置第二段的属性float为right,属性clear设置为right。仅仅设置float属性时,两个段落会并排。 12345678.main { border: 3px solid black; padding: 10px; margin: 10px; float: right; clear: right; width: 33%;}","categories":[{"name":"HTML","slug":"HTML","permalink":"https://yeshan333.github.io/categories/HTML/"},{"name":"CSS","slug":"CSS","permalink":"https://yeshan333.github.io/categories/CSS/"}],"tags":[{"name":"HTML","slug":"HTML","permalink":"https://yeshan333.github.io/tags/HTML/"},{"name":"CSS","slug":"CSS","permalink":"https://yeshan333.github.io/tags/CSS/"}]},{"title":"你所拥有的知识并不取决于你记得多少,而在于它们能否在恰当的时候被回忆起来。","slug":"你所拥有的知识并不取决于你记得多少,而在于它们能否在恰当的时候被回忆起来。","date":"2019-01-16T23:08:36.000Z","updated":"2019-01-16T23:08:36.000Z","comments":true,"path":"2019/01/16/你所拥有的知识并不取决于你记得多少,而在于它们能否在恰当的时候被回忆起来。/","permalink":"https://yeshan333.github.io/2019/01/16/%E4%BD%A0%E6%89%80%E6%8B%A5%E6%9C%89%E7%9A%84%E7%9F%A5%E8%AF%86%E5%B9%B6%E4%B8%8D%E5%8F%96%E5%86%B3%E4%BA%8E%E4%BD%A0%E8%AE%B0%E5%BE%97%E5%A4%9A%E5%B0%91%EF%BC%8C%E8%80%8C%E5%9C%A8%E4%BA%8E%E5%AE%83%E4%BB%AC%E8%83%BD%E5%90%A6%E5%9C%A8%E6%81%B0%E5%BD%93%E7%9A%84%E6%97%B6%E5%80%99%E8%A2%AB%E5%9B%9E%E5%BF%86%E8%B5%B7%E6%9D%A5%E3%80%82/","excerpt":"","text":"","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"Jinja2语法小记","slug":"Jinja2语法小记","date":"2019-01-09T23:26:59.000Z","updated":"2019-01-09T23:26:59.000Z","comments":true,"path":"2019/01/09/Jinja2语法小记/","permalink":"https://yeshan333.github.io/2019/01/09/Jinja2%E8%AF%AD%E6%B3%95%E5%B0%8F%E8%AE%B0/","excerpt":"jinja2模板语法小记 Jinja2模板中文文档 三种常见界定符 表达式{{ ... }} 用于装载字符串、变量、函数调用等 语句{% ... %} 用于装载控制语句,比如if判断、for循环等 注释{# ... #} 用于装载一个注释,模板渲染的时候会被忽略掉","text":"jinja2模板语法小记 Jinja2模板中文文档 三种常见界定符 表达式{{ ... }} 用于装载字符串、变量、函数调用等 语句{% ... %} 用于装载控制语句,比如if判断、for循环等 注释{# ... #} 用于装载一个注释,模板渲染的时候会被忽略掉 变量 在模板中,我们可以使用“**.**”获取变量的属性 1234user = { 'username' : 'shansan', 'bio': '我佛了',} 如果user为传入模板中的字典变量,则我们可通过”.“获取它的键值。eg:user.usernameuser.username等价于user[‘username’] 我们可以用set标签在模板中定义变量 1{% set navigation = [('/','Home'),('/about','关于我')] %} 使用endset声明结束 过滤器(filter) 过滤器(filter)是一些可以用来修改和过滤特殊变量值的函数。过滤器和变量用一个竖线“**|**”(管道符号)隔开,需要参数的过滤器可以像函数一样使用括号传递 eg: 对一个movies列表使用length过滤器获取其长度 1movies|length 下面是Jinja2常用的内置过滤器 过滤器 说明 default(value,default_value,boolean=False) 设置默认值,默认值作为参数传入,别名为d escap(s) 转义HTML文本,别名为e first(seq) 返回序列的第一个元素 last(seq) 返回列表的最后一个元素 length(object) 返回变量的长度 safe(value) 将变量标记为安全,避免转义 wordcount(s) 计算单词数量 过滤器函数的第一个参数表示被过滤的变量值(value)或字符串(s),即竖线符号左侧的值其他参数可以使用括号传入 测试器(Test) 测试器主要用来判断一个值是否满足某种变量类型,返回布尔值(True or False)的特殊函数语法为:if…is… is的左侧是测试器函数的第一个参数(value) 其他参数可以通过添加括号传入,也可以在右侧使用空格连接 Jinja2常用内置测试器 测试器 说明 callable(object) 判断对象是否可调用 defined(value) 判断变量是否已定义 none(value) 判断变量是否为None number(value) 判断变量是否为数字 string(value) 判断变量是否为字符串 sequence(value) 判断变量是否为序列,比如字符串、列表、元组 iterable(value) 判断变量是否可迭代 mapping(value) 判断变量是否是匹配对象,比如字典 smeas(value,other) 判断变量与other是否指向相同的内存地址 123{% if foo is smeas(bar) %}{# 等价于 #}{% if foo is smeas bar %} 判断foo和bar所以指向的内存地址是否相同 语句 在Jinja2中,语句使用**{% ... %}**标识在语句结束的地方,必须添加结束标签 if语句使用endif for语句使用endfor 12345{% if user.name == 'shansan' %} <h1>you are right!</h1>{% else %} <h1>you are wrong!</h1>{% endif %} 123{% for g in ga %} <li>{{ g.name }} - {{ g.year }}</li>{% endfor %} 不可使用break和continue控制循环的执行 模板局部模板 当多个独立模板中使用到同一块HTML代码时,可以把这部分代码抽离出来,放到局部模板中 局部模板的命名一般以一个下划线开始 使用include标签插入一个局部模板 1{% include '_banner.html' %} 宏 宏,类似于Python中的函数。使用宏可以封装一部分模板代码 一般把宏寄存在即存在名为macros.html或_macros.html文件中 使用macro和endmacro标签声明宏的开始和结束 在开始标签中定义宏的名称和接收的参数 1234567{% macro qux(amount=1) %} {% if amount==1 %} I am qux. {% elif amount>1 %} We are qux. {% endif %}{% endmacro %} 就像从Python模块中导入函数一样,我们可以使用import导入宏 1{% from 'macros.html' import qux %} PS:默认情况下,使用include导入一个局部模板会传递上下文到局部模板中,但使用import却不会 模板继承 模板继承允许我们构建一个包含站点共同元素的基本模板”骨架”,并定义子模版可以覆盖的块 基模板 base.html ** 在基模板中定义的块(block),可以让子模版通过定义同名的块来执行继承操作 ** 块的开始和结束分别使用block和endblock标签,不同的块允许嵌套以下示例代码中使用head、title、styles、content、footer和scripts划分了不同的标签块 123456789101112131415161718192021<!DOCTYPE html><html><head> {% block head %} <meta charset="utf-8"> <title>{% block title %}Template - HelloFlask{% endblock %}</title> {% block styles %}{% endblock styles %} {% endblock head %}</head><body> <ul><li><a href="{{ url_for('index') }}">Home</a></li></ul> <main> {% block content %}{% endblock content %} </main> <footer> {% block footer %} {% endblock footer %} </footer> {% block scripts %}{% endblock scripts %}</body></html> 子模版 index.html 当在子模版创建同名的块时,会使用字块的内容覆盖父块的内容 这里子模版的content块的内容覆盖了基模板content块的内容 extends 标签必须是模板中的第一个 标签 1234567891011121314{% extends 'base.html' %}{% from 'macros.html' import qux %}{% block content %}{% set name='baz' %}<h1>Template</h1><ul> <li><a href="{{ url_for('watchlist') }}">Watchlist</a></li> <li>Filter: {{ foo|musical }}</li> <li>Global: {{ bar() }}</li> <li>Test: {% if name == 'baz' %}I am baz.{% endif %}</li> <li>Macro: {{ qux(amount=5) }}</li></ul>{% endblock content %} *** 如需要向基模板中追加内容,可以使用Jinja2的super()函数 *** 如向基模板的styles块追加一行样式 12345678{% block styles %}{{ super() }}<style> html{ color: red; }</style>{% endblock %} 参考: https://book.douban.com/subject/30310340/ https://www.cnblogs.com/yanzi-meng/p/8342798.html http://docs.jinkan.org/docs/jinja2/templates.html#id21","categories":[{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/categories/Flask/"}],"tags":[{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/tags/Flask/"}]},{"title":"泛型算法-1","slug":"泛型算法-1","date":"2019-01-03T18:41:00.000Z","updated":"2019-01-03T18:41:00.000Z","comments":true,"path":"2019/01/03/泛型算法-1/","permalink":"https://yeshan333.github.io/2019/01/03/%E6%B3%9B%E5%9E%8B%E7%AE%97%E6%B3%95-1/","excerpt":"泛型算法-1 泛型算法实现了一些经典算法的公共接口,如排序和搜索;称它们是“泛型的”,是因为它们可以用于不同类型的元素的和多种容器类型(不仅包括标准库类型,还包括内置的数组类型),以及其它类型的序列。 ** 大多数算法都定义在头文件algorithm中 ** 算法永远不会执行容器的操作","text":"泛型算法-1 泛型算法实现了一些经典算法的公共接口,如排序和搜索;称它们是“泛型的”,是因为它们可以用于不同类型的元素的和多种容器类型(不仅包括标准库类型,还包括内置的数组类型),以及其它类型的序列。 ** 大多数算法都定义在头文件algorithm中 ** 算法永远不会执行容器的操作 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105/*算法find*//*- find将范围内中的所有元素与给定值进行比较,返回指向第一个等于给定值的迭代器- 如果范围内无匹配元素,则find返回第二个参数来表示搜索失败*/void find_value(){ //find函数的返回值类型是迭代器类型 //在vector中查找值 int val = 7; vector<int> v{1,2,3,4,5,6,7,8}; auto result = find(v.begin(),v.end(),val); cout<<*result<<endl; //在数组中查找值 int nums[10] = {1,2,3,4,5,6,7,8,9,10}; auto search = find(begin(nums),end(nums),11);//值不存在,返回尾后迭代器 cout<<*search<<endl;}/*算法count*//*- 返回给定值在序列中出现的次数*/void value_count(){ //count函数返回给定值在序列中出现的次数 int a[]={1,1,1,1,1,2,3,4,5,6}; auto c = count(a,a+10,1); cout<<"1出现的次数:"<<c<<endl;}/*算法accumulate*//*- accumulate将第三个参数作为求和起点- 注意序列中的元素的类型必须与第三个参数匹配*/void sum_num(){ //accumulate函数用去求给定元素范围内元素的和 vector<int> v={1,2,3,4,5,6,7,8,9,10}; auto sum = accumulate(v.begin(),v.end(),0); vector<int> v_compare{1,2,3,4,5,6,7,8,9,10,11}; if( equal(v.begin(),v.end(),v_compare.begin()) ) cout<<"yeah"<<endl; cout<<sum<<endl;}/*算法fill*//*- 用于确定两个序列中是否保存相同的值- 第二个序列至少与第一个序列一样长*/void init_fill(){ vector<int> v{1,2,3,4,5,6,7,8}; fill(v.begin(),v.end(),1);//不要对空容器使用此操作 for(auto a:v) cout<<a<<" ";}void elimDups(vector<string> &words){ void print(vector<string> v); sort(words.begin(),words.end()); //使用sort算法按字典序重排序列 //unique重排了输入范围,使得每个单词只出现一次, //unique返回指向不重复区域之后一个位置的迭代器 auto end_unique = unique(words.begin(),words.end()); //删除重复元素 words.erase(end_unique,words.end()); print(words);}void print(vector<string> v){ for(auto a:v) cout<<a<<" "; cout<<endl;}//定制操作,按照长度重新排vectorbool isShorter(const string &s1,const string &s2){ return s1.size() > s2.size();}//按长度进行排序void length_sort(vector<string> &words){ sort(words.begin(),words.end(),isShorter); print(words); //使用算法stable_sort来保持等长元素间的字典序 stable_sort(v.begin(),v.end(),isShorter); print(v);} 向算法传递函数算法谓词 算法谓词即标准库算法传递的参数, 可以指定算法的操作,它是一个可以调用的表达式,其返回结果是一个能用作条件的值 接受谓词参数的算法对输入序列中的元素调用谓词。因此元素类型必须能转换成谓词的参数类型 标准库算法所使用的谓词分为两类:1.一元谓词:它们只接受一个参数2.二元谓词:它们接受两个参数 12345678910111213141516//定制操作,按照长度重新排vectorbool isShorter(const string &s1,const string &s2){ return s1.size() > s2.size();}//按长度进行排序void length_sort(vector<string> &words){ sort(words.begin(),words.end(),isShorter); print(words); //使用算法stable_sort来保持等长元素间的字典序 stable_sort(v.begin(),v.end(),isShorter); print(v);} 这里向算法stable_sort传递的第三个参数就是一个谓词 lambda表达式(匿名函数) lambda表达式与其它函数的区别是:lambda表达式可定义在函数内部 基本形式: 1[capture lsit](parameter list) -> return type {function body} capture list(捕获列表): 一个lambda所在函数中的定义的局部变量的列表(通常为空) parameter list(参数列表) return type(返回类型) function body(函数体) ** 我们可以忽略形参列表和返回类型,但是必须永远包含捕获列表和函数体 ** 12 auto f = []{return 44;} ;cout<<f()<<endl;//打印44 上面的向算法stable_sort传递的实参可以改写为,效果还是一样的 1stable_sort(v.begin(), v.end(), [](const string &a,const string s&b){return a.size()<b.size()}); 捕获列表的使用一个lambda可以出现在一个函数内部,使用其局部变量,但它只能使用那些指明的变量。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include<iostream>#include<algorithm>#include<vector>using namespace std;void biggies(vector<string> &words,vector<string>::size_type sz){ //使用sort算法按字典序重排序列 s sort(words.begin(),words.end()); //unique重排了输入范围,使得每个单词只出现一次, //unique返回指向不重复区域之后一个位置的迭代器 auto end_unique = unique(words.begin(),words.end()); //删除重复元素 words.erase(end_unique,words.end()); //按长度排序,长度相同的按字典序排 stable_sort(words.begin(),words.end(), [](const string &a,const string &b){return a.size() < b.size();}); //算法find_if返回一个迭代器,这个迭代器指向第一个满足size()>=sz的元素 //这里用到了捕获列表,使用局部变量sz auto wc = find_if(words.begin(),words.end(), [sz](const string &a){return a.size()>sz; }); //计算满足size >= sz 的元素的个数 auto count = words.end() - wc; cout<<"the numbers of word longer than "<<sz<<": "<<count<<endl; //打印长度大于等于给定值sz的单词 //算法for_earch接受一个可调用对象,并对输入序列中的每个元素调用此对象 for_each(wc,words.end(),[](const string &s){ cout<<s<<" "; });}int main(){ vector<string> words; string str; while(cin>>str) words.push_back(str); for(auto a:words) cout<<a<<" "; cout<<endl; biggies(words,6);//打印长度大于或等于给定值的单词 return 0;} ** 捕获列表只用于局部非静态(static)变量,lambda可以直接使用局部static变量和在它所在函数之外声明的名字 ** lambada捕获和返回 变量的捕获方式有两种:值捕获、引用捕获 使用引用捕获变量时,必须确保被引用的对象在lambda执行的时候是存在的 lambda捕获的是局部变量,这些变量在函数结束后就不复存在了 我们可以从一个函数返回lambda,函数可以直接返回一个可调用对象,或者返回一个类对象,该类含有可调用对象的数据成员。如果函数返回一个lambda,则与函数不能返回一个局部变量类似,此lambda也不能包含引用捕获 使用***&、=***进行隐式捕获我们可以让编译器根据lambda体中的代码来推断我们要使用哪些变量 **&**告诉编译器采用引用捕获方式 **=**告诉编译器采用值捕获方式 混合使用显式捕获和隐式捕获时,显示捕获必须使用与隐式捕获不同的方式 1234567891011121314151617181920212223242526272829#include<iostream>#include<vector>#include<algorithm>using namespace std;void biggies(vector<string> &words, ostream &os=cout, char c=' '){ //os隐式捕获,c显式捕获 for_each(words.begin(), words.end(), [&, c](const string &s){ os<<s<<c;} ); printf("\\n"); //c隐式捕获,os显示捕获 for_each(words.begin(), words.end(), [=, &os](const string &s){ os<<s<<c;} );}int main(){ vector<string> str; string temp; while(cin>>temp) str.push_back(temp); biggies(str); return 0;} 指定lambda的返回类型 要为一个lambda定义返回类型时,必须使用尾置返回类型 尾置返回类型跟在形参列表后面,并以一个->符号开头 12auto f = [](int i)->int{ return i+1;};cout<<f(3)<<endl;//输出结果为:4 可变lambada使用关键字mutable改变一个被捕获变量的值 1234int i=1;auto f = [i]()mutable{ return ++i;};i=0;cout<<f();//输出结果为2 lambda捕获列表   说明 [] 空捕获列表。lambda不能使用所在函数中的变量。一个lambda只有捕获变量后才能使用它们 [names] names是一个逗号分隔的名字列表,这些名字都是lambda所在函数的局部变量。默认情况下,捕获列表中的变量都被拷贝 [&] 隐式捕获列表,采用隐式捕获方式 [=] 隐式捕获列表,采用值捕获方式 [&, identifier_list] identifier_list是一个逗号分隔的列表,包含0个或多个来自所在函数的变量,这些变量采用值捕获方式。任何隐式捕获的变量都采用引用方式捕获 [=, identifier_list] identifier_list是一个逗号分隔的列表,包含0个或多个来自所在函数的变量,这些变量采用引用捕获方式,且变量名字前必须使用&。任何隐式捕获的变量都采用值方式捕获","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"装饰器--python","slug":"装饰器-python","date":"2019-01-03T18:39:32.000Z","updated":"2019-01-03T18:39:32.000Z","comments":true,"path":"2019/01/03/装饰器-python/","permalink":"https://yeshan333.github.io/2019/01/03/%E8%A3%85%E9%A5%B0%E5%99%A8-python/","excerpt":"python装饰器回顾返回函数","text":"python装饰器回顾返回函数 什么是装饰器 python装饰器就是用于拓展原来函数功能的一种函数,目的是在不改变原函数定义的情况下,给函数增加新的功能。这个函数的特殊之处在于它的返回值也是一个函数,这个函数是内嵌“原”函数的函数 在代码运行期间动态的增加功能装饰器(decorator)是修改其它函数功能的函数,是返回函数的高阶函数 demo12345678910111213141516171819202122232425# -*- coding: utf-8 -*-'''- 这是一个decorator- 使用一个函数作为参数- 它返回一个函数'''def a_new_decorator(a_func): def wrapTheFunction(): print("I am doing some boring work before executing a_func()") a_func() print("I am doing some boring work after executing a_func()") return wrapTheFunction''''''- 使用a_new_decorator装饰a_function_requiring_decoration- @a_new_decorator 等价于 a_function_requiring_decoration = a_new_decorator(a_function_requiring_decoration)''''''@a_new_decoratordef a_function_requiring_decoration(): print("I am the function which needs some decoration remove my foul smell")a_function_requiring_decoration() 运行结果 @a_new_decorator 等价于 a_function_requiring_decoration = a_new_decorator(a_function_requiring_decoration) 下面这段程序和上面那段等价 1234567891011121314151617181920212223242526# -*- coding: utf-8 -*-def a_new_decorator(a_func): def wrapTheFunction(): print("I am doing some boring work before executing a_func()") a_func() print("I am doing some boring work after executing a_func()") return wrapTheFunctiondef a_function_requiring_decoration(): print("I am the function which needs some decoration to remove my foul smell")#a_function_requiring_decoration()#outputs: "I am the function which needs some decoration to remove my foul smell"a_function_requiring_decoration = a_new_decorator(a_function_requiring_decoration)#now a_function_requiring_decoration is wrapped by wrapTheFunction()a_function_requiring_decoration()#outputs:I am doing some boring work before executing a_func()# I am the function which needs some decoration to remove my foul smell# I am doing some boring work after executing a_func() 应用:日志打印 在wrap函数内,首先打印日志,再调用原始函数*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict PS对于上面的demo >>>print(a_function_requiring_decoration.__name__) #输出结果为 wrapTheFunction 明显不是我们想要的,我们函数的名字和注释文档被重写了预期应该为 a_function_requiring_decoration 使用functools.warps可以解决这个问题 上面的demo应该这样写 参考 http://www.runoob.com/w3cnote/python-func-decorators.html https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000 https://eastlakeside.gitbooks.io/interpy-zh/content/decorators/ https://www.cnblogs.com/yuzhanhong/p/9180212.html","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"博客搭建参考汇总","slug":"博客搭建参考汇总","date":"2019-01-01T21:20:28.000Z","updated":"2019-01-01T21:20:28.000Z","comments":true,"path":"2019/01/01/博客搭建参考汇总/","permalink":"https://yeshan333.github.io/2019/01/01/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E5%8F%82%E8%80%83%E6%B1%87%E6%80%BB/","excerpt":"","text":"以下是我搭建博客参考的一些教程 hexo博客搭建教程https://blog.csdn.net/gdutxiaoxu/article/details/53576018 https://m.w3cschool.cn/hexo_blog/hexo_blog-tvpu244e.html https://www.cnblogs.com/jackyroc/p/7681938.html https://blog.csdn.net/u010820857/article/details/82027535 Yilia主题配置https://github.com/litten/hexo-theme-yilia https://www.jianshu.com/p/517263426abd 404公益页面http://www.qq.com/404/ https://blog.csdn.net/liu1340308350/article/details/81744824 使用valine评论https://panjunwen.com/diy-a-comment-system/ https://www.xxwhite.com/2017/Valine.html valine头像https://en.gravatar.com/emails?auto-applied=1 版权设置https://blog.zscself.com/2017/01/25/ee4d9ecb/ http://tc9011.com/2017/02/02/hexo%E6%96%87%E7%AB%A0%E6%B7%BB%E5%8A%A0%E7%89%88%E6%9D%83%E5%A3%B0%E6%98%8E%E5%8F%8A%E4%B8%80%E4%BA%9B%E7%89%B9%E6%95%88/ 访问量统计https://blog.csdn.net/qq_40910541/article/details/80659193 https://blog.csdn.net/zxlvxj/article/details/77720934 https://ruider.github.io/2018/06/11/%E6%B7%BB%E5%8A%A0hexo-yilia%E4%B8%BB%E9%A2%98%E7%9A%84%E8%AE%BF%E9%97%AE%E6%95%B0%E9%87%8F/ http://easydo.work/2017/10/26/hexo-yilia-page-view.html 域名绑定https://blog.csdn.net/yucicheung/article/details/79560027 https://www.jianshu.com/p/d92ea8542673?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq 添加目录https://blog.csdn.net/u013082989/article/details/70212008 http://lawlite.me/2017/04/17/Hexo-yilia%E4%B8%BB%E9%A2%98%E5%AE%9E%E7%8E%B0%E6%96%87%E7%AB%A0%E7%9B%AE%E5%BD%95%E5%92%8C%E6%B7%BB%E5%8A%A0%E8%A7%86%E9%A2%91/","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"2019你好","slug":"2019你好","date":"2019-01-01T00:00:00.000Z","updated":"2019-01-01T00:00:00.000Z","comments":true,"path":"2019/01/01/2019你好/","permalink":"https://yeshan333.github.io/2019/01/01/2019%E4%BD%A0%E5%A5%BD/","excerpt":"","text":"","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"致敬2018","slug":"致敬2018","date":"2018-12-31T16:20:16.000Z","updated":"2018-12-31T16:20:16.000Z","comments":true,"path":"2018/12/31/致敬2018/","permalink":"https://yeshan333.github.io/2018/12/31/%E8%87%B4%E6%95%AC2018/","excerpt":"","text":"博客 2018 使用的图床(imgur)已挂掉,大部分 2018 年的文章配的图需要使用 proxy 才能看到","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"基于Typecho搭建个人博客","slug":"memory","date":"2018-12-31T12:40:34.000Z","updated":"2018-12-31T12:40:34.000Z","comments":true,"path":"2018/12/31/memory/","permalink":"https://yeshan333.github.io/2018/12/31/memory/","excerpt":"","text":"**本页图片已挂,需跨越 G-F?W ** 搭建依托于我的个人服务器的博客emmm。。。 2018年12月24日0点10分,忽然觉得无聊,打开某云,手一贱租了台云服务器(233~~~~)。嗯,既然都租了,那就再来个博客吧。 基于typecho搭建的个人博客宝塔面板安装1yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh 网站搭建点击添加,创建网站 嗯,接下来访问自己域名(公网ip地址),看看是否创建成功 接下来配置伪静态规则 嗯,接下来搭建博客,这里使用宝塔后台无脑安装(不好意思,我太菜),还是用命令行操作吧 记得填写常用邮箱、管理员名和密码 http://typecho.org/download 嗯,接下来访问自己的域名就ok了 emm,是不是少了什么,SSL证书没有,少了小绿锁 那就去申请吧 站点管理,设置 因为我的web服务器是nigix","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"线性表的链式存储-单链表","slug":"线性表的链式存储-单链表","date":"2018-12-15T00:28:59.000Z","updated":"2018-12-15T00:28:59.000Z","comments":true,"path":"2018/12/15/线性表的链式存储-单链表/","permalink":"https://yeshan333.github.io/2018/12/15/%E7%BA%BF%E6%80%A7%E8%A1%A8%E7%9A%84%E9%93%BE%E5%BC%8F%E5%AD%98%E5%82%A8-%E5%8D%95%E9%93%BE%E8%A1%A8/","excerpt":"单链表操作 单链表的创建(尾插法、头插法) 单链表的查找操作 单链表的删除操作 单链表的逆置操作(使用头插法) 单链表表长的计算 打印单链表","text":"单链表操作 单链表的创建(尾插法、头插法) 单链表的查找操作 单链表的删除操作 单链表的逆置操作(使用头插法) 单链表表长的计算 打印单链表 单链表的创建头插法12345678910111213141516forward_list* creat_3() //头插法{ forward_list *head,*s; int num; head = NULL;//链表初始状态为空 while(scanf("%d",&num) && num) { s = (forward_list*)malloc(sizeof(forward_list)); s->data = num; s->next = head; head = s;//将新结点插入到表头 } return head;} 尾插法(不含头结点)1234567891011121314151617181920212223//尾插法建表forward_list* creat_1(){ forward_list *head=NULL;//头指针,初始状态为空 forward_list *rear=NULL;//尾指针,初始状态为空 int num; forward_list *s; while(scanf("%d",&num) == 1 && num)//输入0结束 { s = (forward_list*)malloc(sizeof(forward_list)); s->data = num; if(head == NULL)//将新节点加入空表 head = s; else //原表非空,将新节点链接到表尾之后 rear->next = s; rear = s;//尾指针指向新的表尾 } if(rear!= NULL)//对于非空表,将尾结点的下一个结点置空 rear->next = NULL; return head;} 尾插法(含头结点)12345678910111213141516171819202122//尾插法建表,包含头结点forward_list* creat_2(){ forward_list *s; forward_list *head, *rear; int num; head = (forward_list*)malloc(sizeof(forward_list)); rear = head; while(scanf("%d",&num)==1 && num) { s = (forward_list*)malloc(sizeof(forward_list)); s->data = num; rear->next = s; rear = s;//表指针指向新的表尾 } rear->next = NULL; return head;} 单链表的查找操作按值查找123456789101112131415void search_1(forward_list *s, int x){ forward_list *p; p = s; while(p != NULL) { if(p->data == x) { printf("\\nthe value : %d is exist !\\n",x); return ; } p = p->next; } printf("\\nthe value : %d is not fonud !\\n",x);} 按值查找(包含头结点)123456789101112131415void search_2(forward_list *s, int x)//带头节点{ forward_list *p; p = s->next;//emmmm while(p != NULL) { if(p->data == x) { printf("\\nthe value : %d is exist !\\n",x); return ; } p = p->next; } printf("\\nthe value : %d is not fonud !\\n",x);} 单链表的删除操作按给定结点的位置删除(带头结点)1234567891011121314151617181920void delete_1(forward_list *head,int i) //删除第i个节点(单链表包含头节点){ int j=0; forward_list *p,*q; p=head; j=0; while((p->next!=NULL)&&(j<i-1)) { p=p->next; j++; } if(p->next!=NULL) { q=p->next; p->next=p->next->next; free(q); } else printf("illegal delete position,delete failed!");} 按照指定值删除结点(不带头结点)123456789101112131415161718192021222324void forward_list_delete_1(forward_list *s,int x)//删除链表(不带头节点)中指定值的元素{ forward_list *p; forward_list *temp;//用来存放被删除元素的前一个结点 p = s; if(x == p->data) free(p); temp = p; p = p->next; while(p != NULL) { if(p->data == x) { temp->next = p->next; free(p); return ; } temp = p; p = p->next; } printf("\\n你要删除的元素 %d 不在表中\\n",x); return ;} 单链表的逆置头插法逆置(带头结点)12345678910111213void reverse_2(forward_list *head)//头插法逆置,带头节点{ forward_list *p,*q; p=head->next; head->next=NULL; while(p) { q=p; p=p->next; q->next=head->next; head->next=q; }} 计算单链表的表长*** 带头结点 *** 1234567891011void list_length_2(forward_list *s){ int count; forward_list *p=s->next; while(p) { count++; p = p->next; } printf("\\nlist length: %d\\n",count);} *** 不带头结点 *** 1234567891011void list_length_1(forward_list *s){ int count; forward_list *p=s; while(p) { count++; p = p->next; } printf("\\nlist length: %d\\n",count);} 打印单链表*** 带头结点 *** 1234567891011void print_forward_list_2(forward_list *s)//打印含头节点的单链表{ forward_list *p; p = s->next;//因为含有头节点,head->data的数据域的数据未知 while(p != NULL) { printf("%-3d",p->data); p = p->next; } return ;} *** 不带头结点 *** 1234567891011void print_forward_list_1(forward_list *s)//打印单链表{ forward_list *p; p = s; while(p != NULL) { printf("%4d",p->data); p = p->next; } return ;} 试试源程序123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311#include<stdio.h>#include<malloc.h>#include<stdlib.h>//定义单链表结点类型typedef struct node{ int data; //结点数据域 struct node *next; //结点指针域}forward_list;//尾插法建表forward_list* creat_1(){ forward_list *head=NULL;//头指针,初始状态为空 forward_list *rear=NULL;//尾指针,初始状态为空 int num; forward_list *s; while(scanf("%d",&num) == 1 && num)//输入0结束 { s = (forward_list*)malloc(sizeof(forward_list)); s->data = num; if(head == NULL)//将新节点加入空表 head = s; else //原表非空,将新节点链接到表尾之后 rear->next = s; rear = s;//尾指针指向新的表尾 } if(rear!= NULL)//对于非空表,将尾结点的下一个结点置空 rear->next = NULL; return head;}//尾插法建表,包含头结点forward_list* creat_2(){ forward_list *s; forward_list *head, *rear; int num; head = (forward_list*)malloc(sizeof(forward_list)); rear = head; while(scanf("%d",&num)==1 && num) { s = (forward_list*)malloc(sizeof(forward_list)); s->data = num; rear->next = s; rear = s;//表指针指向新的表尾 } rear->next = NULL; return head;}forward_list* creat_3() //头插法{ forward_list *head,*s; int num; head = NULL;//链表初始状态为空 while(scanf("%d",&num) && num) { s = (forward_list*)malloc(sizeof(forward_list)); s->data = num; s->next = head; head = s;//将新结点插入到表头 } return head;}void search_1(forward_list *s, int x){ forward_list *p; p = s; while(p != NULL) { if(p->data == x) { printf("\\nthe value : %d is exist !\\n",x); return ; } p = p->next; } printf("\\nthe value : %d is not fonud !\\n",x);}void search_2(forward_list *s, int x)//带头节点{ forward_list *p; p = s->next;//emmmm while(p != NULL) { if(p->data == x) { printf("\\nthe value : %d is exist !\\n",x); return ; } p = p->next; } printf("\\nthe value : %d is not fonud !\\n",x);}void reverse_1(forward_list *head)//头插法逆置单链表{ forward_list *p; forward_list *temp; p = head;//存好之前的单链表 //printf("\\n%d\\n",p->data); head->next = NULL; while(p) { temp = p; //printf("1"); p = p->next; temp->next = head->next; head = temp; printf("\\n%d\\n",head->data); }}void reverse_2(forward_list *head)//头插法逆置,带头节点{ forward_list *p,*q; p=head->next; head->next=NULL; while(p) { q=p; p=p->next; q->next=head->next; head->next=q; }}void forward_list_delete_1(forward_list *s,int x)//删除链表(不带头节点)中指定值的元素{ forward_list *p; forward_list *temp;//用来存放被删除元素的前一个结点 p = s; if(x == p->data) free(p); temp = p; p = p->next; while(p != NULL) { if(p->data == x) { temp->next = p->next; free(p); return ; } temp = p; p = p->next; } printf("\\n你要删除的元素 %d 不在表中\\n",x); return ;}void delete_1(forward_list *head,int i) //删除第i个节点(单链表包含头节点){ int j=0; forward_list *p,*q; p=head; j=0; while((p->next!=NULL)&&(j<i-1)) { p=p->next; j++; } if(p->next!=NULL) { q=p->next; p->next=p->next->next; free(q); } else printf("illegal delete position,delete failed!");}/*//不对void list_delete(forward_list *s, int i)//删除单链表(不带头节点)的第i个结点{ int count=1; forward_list *p,*q; p=s; //将p移动到被删除结点的前一个结点 while((p!=NULL)&&(count<i-1)) { p=p->next; count++; } if(i == count) { q = p; p = p->next; free(q); return ; } if(p->next!=NULL) { q=p->next; p->next=p->next->next; free(q); } else printf("illegal delete position,delete failed!");}*/void list_length_1(forward_list *s){ int count; forward_list *p=s; while(p) { count++; p = p->next; } printf("\\nlist length: %d\\n",count);}void list_length_2(forward_list *s){ int count; forward_list *p=s->next; while(p) { count++; p = p->next; } printf("\\nlist length: %d\\n",count);}void print_forward_list_1(forward_list *s)//打印单链表{ forward_list *p; p = s; while(p != NULL) { printf("%4d",p->data); p = p->next; } return ;}void print_forward_list_2(forward_list *s)//打印含头节点的单链表{ forward_list *p; p = s->next;//因为含有头节点,head->data的数据域的数据未知 while(p != NULL) { printf("%-3d",p->data); p = p->next; } return ;}int main(){ /*不带头结点的单链表*/ printf("使用不带头结点的单链表:\\n"); forward_list *p; printf("尾插法建表:\\n"); p = creat_1();//尾插法建表 print_forward_list_1(p); list_length_1(p); //查找是否存在值为6的结点 search_1(p,6); printf("\\n删了个5后,表变为\\n"); forward_list_delete_1(p,5); print_forward_list_1(p); //头插法建表 forward_list *s; printf("\\n头插法建表:\\n"); s = creat_3(); print_forward_list_1(s); list_length_1(s); /*带头结点的单链表*/ printf("\\n\\n使用带头结点的单链表:\\n"); forward_list *t; t = creat_2(); print_forward_list_2(t); search_2(t,6); list_length_2(t); printf("\\n逆置:\\n"); reverse_2(t); print_forward_list_2(t); list_length_2(t); return 0;} 运行结果","categories":[{"name":"数据结构","slug":"数据结构","permalink":"https://yeshan333.github.io/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"}],"tags":[{"name":"C","slug":"C","permalink":"https://yeshan333.github.io/tags/C/"},{"name":"数据结构","slug":"数据结构","permalink":"https://yeshan333.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"}]},{"title":"线性表之顺序存储-顺序表","slug":"线性表之顺序存储-顺序表","date":"2018-12-14T12:14:59.000Z","updated":"2018-12-14T12:14:59.000Z","comments":true,"path":"2018/12/14/线性表之顺序存储-顺序表/","permalink":"https://yeshan333.github.io/2018/12/14/%E7%BA%BF%E6%80%A7%E8%A1%A8%E4%B9%8B%E9%A1%BA%E5%BA%8F%E5%AD%98%E5%82%A8-%E9%A1%BA%E5%BA%8F%E8%A1%A8/","excerpt":"顺序表的操作 向有序顺序表插入一个元素 顺序表的冒泡排序 顺序表的删除操作 顺序表中元素的查找 顺序表的逆置 删除顺序表中的相同元素 向顺序表的指定位置插入元素 打印顺序表","text":"顺序表的操作 向有序顺序表插入一个元素 顺序表的冒泡排序 顺序表的删除操作 顺序表中元素的查找 顺序表的逆置 删除顺序表中的相同元素 向顺序表的指定位置插入元素 打印顺序表 顺序表的存储结构1234567#define maxsize 100 //存储空间的分配量//定义顺序表数据类型typedef struct{ int data[maxsize]; int last; //存放表中最后一个元素的下标}sequenlist; 顺序表的冒泡排序1234567891011121314151617void list_bubble_sort(sequenlist *p)//max to min{ int i,j; int temp; for(i=0; i< p->last; i++)//attention { for(j=0; j< p->last-i; j++) { if(p->data[j] < p->data[j+1]) { temp = p->data[j]; p->data[j] = p->data[j+1]; p->data[j+1] = temp; } } }} 顺序表的删除操作12345678910111213141516171819nt delete_1(sequenlist *s,int del) //删除函数{ int temp; for(int i=0; i <= s->last; i++) { if(del == s->data[i]) { temp = i; for(int j=i; j<s->last; j++) { s->data[j] = s->data[j+1]; } s->last = s->last - 1; return 0;//删除第一个与del相同的元素,函数结束 } } //要删的那个元素不在表中 printf("the element you want to delete is not in the sequenlist!\\n");} 顺序表中元素的查找12345678910111213int search(sequenlist *s,int key) //查找函数{ for(int i=0; i<= s->last; i++) { if(key == s->data[i]) { printf("exist !\\n"); return 0; } } printf("not found !\\n"); return 0;} 顺序表的逆置12345678910111213void reverse(sequenlist *s)//逆置函数{ int i,j; int temp; int last_temp = s->last; for(i=0; i<= s->last/2; i++) { temp = s->data[i]; s->data[i] = s->data[last_temp]; s->data[last_temp] = temp; last_temp--; }} 删除顺序表中的相同元素12345678910111213141516171819void delete_same(sequenlist *s)//删除表中相同的元素{ int i,j; int temp; for(i=0; i<=s->last; i++) { for(j=1; j<=s->last; j++) { if(s->data[j] == s->data[i])//元素相同 { for(int k=j; k<s->last; k++) { s->data[k] = s->data[k+1]; } s->last = s->last - 1; } } }} 向顺序表的指定位置插入元素123456789101112131415161718192021222324252627int insert(sequenlist *L,int i,int x) //指定位置,插入{ int j; if(((*L).last) >= maxsize-1) { printf("the list is overflow!\\n"); return (0); } else { if((i<1)||(i>(*L).last+2)) { printf("position is not correct!\\n"); return (0); } else { for(j=(*L).last;j>=i-1;j--) { (*L).data[j+1]=(*L).data[j]; } (*L).last=(*L).last+1; (*L).data[i-1]=x; return (0); } }} 向顺序表的指定位置插入元素123456789101112131415161718192021222324252627int insert(sequenlist *L,int i,int x) //指定位置,插入{ int j; if(((*L).last) >= maxsize-1) { printf("the list is overflow!\\n"); return (0); } else { if((i<1)||(i>(*L).last+2)) { printf("position is not correct!\\n"); return (0); } else { for(j=(*L).last;j>=i-1;j--) { (*L).data[j+1]=(*L).data[j]; } (*L).last=(*L).last+1; (*L).data[i-1]=x; return (0); } }} 打印顺序表12345678void print_list(sequenlist *s) //打印顺序表{ int i; for(i=0; i<=s->last; i++) { printf("%3d",s->data[i]); }} 试着煲下汤123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247/** author: shansan.top* date: 2018/12/12* version: 1.0*/#include<stdio.h>#define maxsize 100//定义顺序表数据类型typedef struct{ int data[maxsize]; int last;}sequenlist;int search(sequenlist *s,int key) //查找函数{ for(int i=0; i<= s->last; i++) { if(key == s->data[i]) { printf("exist !\\n"); return 0; } } printf("not found !\\n"); return 0;}int delete_1(sequenlist *s,int del) //删除函数{ int temp; for(int i=0; i <= s->last; i++) { if(del == s->data[i]) { temp = i; for(int j=i; j<s->last; j++) { s->data[j] = s->data[j+1]; } s->last = s->last - 1; return 0;//删除第一个与del相同的元素,函数结束 } } //要删的那个元素不在表中 printf("the element you want to delete is not in the sequenlist!\\n");}void print_list(sequenlist *s) //打印顺序表{ int i; for(i=0; i<=s->last; i++) { printf("%3d",s->data[i]); }}void reverse(sequenlist *s)//逆置函数{ int i,j; int temp; int last_temp = s->last; for(i=0; i<= s->last/2; i++) { temp = s->data[i]; s->data[i] = s->data[last_temp]; s->data[last_temp] = temp; last_temp--; }}void list_bubble_sort(sequenlist *p)//max to min{ int i,j; int temp; for(i=0; i< p->last; i++)//attention { for(j=0; j< p->last-i; j++) { if(p->data[j] < p->data[j+1]) { temp = p->data[j]; p->data[j] = p->data[j+1]; p->data[j+1] = temp; } } }}void insert_in_order_list(sequenlist *s,int value)//有序表中插入元素{ int i,j; int count=0; //int temp = s->last+1; for(i=0; i<=s->last; i++) { count++; if( value <= s->data[i]) { s->last = s->last + 1; for(j=s->last; j>i; j--) { s->data[j] = s->data[j-1]; } s->data[i] = value; return ;//结束函数 } } //printf("i=%d",i); //printf("s->last=%d\\n",s->last); if(i > s->last-1) { s->last = s->last + 1; s->data[s->last] = value; }}int insert(sequenlist *L,int i,int x) //指定位置,插入{ int j; if(((*L).last) >= maxsize-1) { printf("the list is overflow!\\n"); return (0); } else { if((i<1)||(i>(*L).last+2)) { printf("position is not correct!\\n"); return (0); } else { for(j=(*L).last;j>=i-1;j--) { (*L).data[j+1]=(*L).data[j]; } (*L).last=(*L).last+1; (*L).data[i-1]=x; return (0); } }}void delete_same(sequenlist *s)//删除表中相同的元素{ int i,j; int temp; for(i=0; i<=s->last; i++) { for(j=1; j<=s->last; j++) { if(s->data[j] == s->data[i])//元素相同 { for(int k=j; k<s->last; k++) { s->data[k] = s->data[k+1]; } s->last = s->last - 1; } } }}int main(){ sequenlist p={{1,3,2,6,5,4,9,7,8},8}; //这里有9个数,但数组下表是从0开始的,所以 p.last = 8 print_list(&p); printf("\\n"); //查找 printf("please input a value which you want: "); int value;//C++语法可以临时定义一个变量,C语言不可以(需放在开头)。 scanf("%d",&value); //search(&p,10); search(&p,value); print_list(&p); printf("\\n\\n"); //删除表中的指定元素 delete_1(&p,8); printf("after delete:\\n"); print_list(&p); //逆置顺序表 printf("\\n\\nafter reverse:\\n"); reverse(&p); print_list(&p); //冒泡排序 printf("\\nafter sort:\\n"); printf("\\n"); //list_bubble_sort(&try_1); list_bubble_sort(&p); print_list(&p); //往有序顺序表中插入一个元素 printf("\\n\\n"); sequenlist try_1 = {{1,2,3,5,6,7},5}; print_list(&try_1); printf("\\n"); printf("please input the value that you wan to insert into the sequenlist: "); int data; scanf("%d",&data); insert_in_order_list(&try_1,data); //insert_in_order_list(&try_1,9); print_list(&try_1); //删除表中相同的元素 printf("\\n\\n"); sequenlist try_2= {{1,1,2,2,3,3,4,4},7}; print_list(&try_2); printf("\\ndelete the same element:\\n"); delete_same(&try_2); print_list(&try_2); printf("\\n"); //另一种玩法 int n; int i; printf("\\nplease input the number of elements: "); scanf("%d",&n); printf("please input %d values:\\n",n); sequenlist try_3; try_3.last = n-1;//注意,数组的小标从0开始 for(i=0; i<=try_3.last; i++) { scanf("%d",&try_3.data[i]); } print_list(&try_3); printf("\\n\\n"); //在指定位置插入 insert(&try_3,1,22); print_list(&try_3); return 0;} 程序运行结果","categories":[{"name":"数据结构","slug":"数据结构","permalink":"https://yeshan333.github.io/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"}],"tags":[{"name":"C","slug":"C","permalink":"https://yeshan333.github.io/tags/C/"},{"name":"数据结构","slug":"数据结构","permalink":"https://yeshan333.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"}]},{"title":"勿忘国耻,吾辈自强!","slug":"勿忘国耻,吾辈自强!","date":"2018-12-13T00:17:58.000Z","updated":"2018-12-13T00:17:58.000Z","comments":true,"path":"2018/12/13/勿忘国耻,吾辈自强!/","permalink":"https://yeshan333.github.io/2018/12/13/%E5%8B%BF%E5%BF%98%E5%9B%BD%E8%80%BB%EF%BC%8C%E5%90%BE%E8%BE%88%E8%87%AA%E5%BC%BA%EF%BC%81/","excerpt":"","text":"","categories":[{"name":"Memory","slug":"Memory","permalink":"https://yeshan333.github.io/categories/Memory/"}],"tags":[{"name":"Memory","slug":"Memory","permalink":"https://yeshan333.github.io/tags/Memory/"}]},{"title":"Biu一下GDB","slug":"biu一下GDB","date":"2018-12-03T23:51:52.000Z","updated":"2018-12-03T23:51:52.000Z","comments":true,"path":"2018/12/03/biu一下GDB/","permalink":"https://yeshan333.github.io/2018/12/03/biu%E4%B8%80%E4%B8%8BGDB/","excerpt":"gcc常见编译选项 ** -c **:只激活预处理、编译和汇编,也就是生成obj文件 ** -S **:只激活处理和编译,把文件编译成汇编代码 ** -o **:定制目标名称,缺省的时候编译出来的可执行程序名为a.exe(windows)或a.out(linux) ** -Wall **:打开一些很有用的编译警告 ** -std **:指定C标准,如-std=99,使用C99标准 ** -g **:指示编译器,编译的时候添加调试信息 ** -O0 -O1 -O2 -O3 **:编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高","text":"gcc常见编译选项 ** -c **:只激活预处理、编译和汇编,也就是生成obj文件 ** -S **:只激活处理和编译,把文件编译成汇编代码 ** -o **:定制目标名称,缺省的时候编译出来的可执行程序名为a.exe(windows)或a.out(linux) ** -Wall **:打开一些很有用的编译警告 ** -std **:指定C标准,如-std=99,使用C99标准 ** -g **:指示编译器,编译的时候添加调试信息 ** -O0 -O1 -O2 -O3 **:编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高 1234567891011121314151617181920/*file_name: swap.c*/#include<stdio.h>void swap(int a, int b){ int t; t = a; a = b; b = t;}int main(){ int a=3, b=4; swap(a,b); printf("%d %d",a,b); return 0;} GDB的使用 什么是GDBhttps://www.bing.com/knows/search?q=gdb&mkt=zh-cn&FORM=BKACAIhttp://www.gnu.org/software/gdb/ 一般来说,GDB主要帮助你完成以下四个方面的内容1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序2、可以让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事4、你可以改变你的程序,将一个BUG产生的影响修正,从而测试其他BUG GDB常见命令 简称 全称 备注 l list 显示指定行号或者指定函数附近的源代码 b break 在指定行号或指定函数开头设置断点 r run 运行程序,直到程序结束或遇到断点 c continue 在程序中断后继续执行程序,直到程序结束或遇到断点停下。注意在程序开始执行前只能用r,而不能用c n next 执行一条语句。如果有函数调用,则把它当做一个整体 s step 执行一条语句。如果有函数调用,则进入函数内部 u until 执行到指定行号或指定函数的开头 p print 显示变量或表达式的值 disp display 把一个表达式设置为display,当程序每次停下来时都会显示其值 cl clear 取消断点,和b格式相同,如果该位置有多个断点,将同时取消 i info 显示各种信息,如i b显示所有断点,i disp显示display,而i lo显示所有局部变量 bt backtrace 打印所有栈帧信息 调用栈(Call Stack)调用栈描述的是函数之间的调用关系。调用栈由栈帧(Stack Frame)组成,每个栈帧对应着一个未运行完的函数。在GDB中可以用backtrace(简称bt)命令打印所有栈帧信息。若要用p命令打印一个非当前栈帧的局部变量,可以用frame命令选择另一个栈帧 拿个程序来玩玩,swap.c文件1234567891011#include<stdio.h>void swap(int a, int b){ int t;t = a;a = b;b = t;}int main(){ int a=3, b=4; swap(a,b); printf("%d %d",a,b); return 0;} *** 程序的目的是交换a和b的值,然而并没有交换交换成功 *** 原因: 函数的形参和在函数内部声明的变量都是该函数的局部变量。无法访问其他函数的局部变量。 局部变量的存储空间是临时分配的,函数执行完毕时,局部变量的空间将被释放,其中的值无法保留到下次使用。 如果要实现真正的交换,我们应该传入的是存储变量的地址,此时函数swap的形参类型应该为指针类型 PS:C语言的变量都是放在内存中的,而内存中间的每一个字节都有一个称为地址(address)的编号。每一个变量都占有一定数目的字节(可以用sizeof运算符获得),其中第一个字节的地址称为变量的地址。 o(*≧▽≦)ツ┏━┓拿个递归程序来玩玩1234567891011#include<stdio.h>int f(int n){ return n == 0 ? 1 : f(n-1)*n;}int main(){ printf("%d\\n",f(3)); return 0;} 在C语言的函数中,调用自己和调用其他函数没有任何本质区别,都是建立新栈帧,传递参数并修改当前代码行。在函数执行体完毕后删除栈帧,处理返回值,并修改当前代码行数。 以上调用栈的一个比喻 皇帝(拥有main函数的栈帧):大臣,你给我算下f(3)大臣(拥有f(3)的栈帧):知府,你给我算下f(2)知府(拥有f(2)的栈帧):县令,你给我算下f(1)县令(拥有f(1)的栈帧):师爷,你给我算下f(0)师爷(拥有f(0)的栈帧):回老爷,f(0)=1县令(心算f(1)=f(0)*1=1):回知府大人,f(1)=1知府(心算f(2)=f(1)*2=2):回大人,f(2)=2大臣(心算f(3)=f(2)*3=6):回皇上,f(3)=6皇上满意了 emmmmmm。。。。。。。。。。。。","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"GDB","slug":"GDB","permalink":"https://yeshan333.github.io/tags/GDB/"}]},{"title":"标准库容器","slug":"标准库容器","date":"2018-12-01T17:45:46.000Z","updated":"2018-12-01T17:45:46.000Z","comments":true,"path":"2018/12/01/标准库容器/","permalink":"https://yeshan333.github.io/2018/12/01/%E6%A0%87%E5%87%86%E5%BA%93%E5%AE%B9%E5%99%A8/","excerpt":"","text":"标准库容器是模板类型,用来保存给定类型的对象。一个容器就是一些特定类型对象的集合。 顺序容器 顺序容器我们提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器时的位置对应。 一般来说,每个容器都定义在一个都文件中 顺序元素几乎可以保存任意类型的元素 顺序容器类型 说明 vector 可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢 array 固定大小数组,支持快速随机访问,不能添加或删除元素 string 与vector相似的容器,但专门用于保存字符。随机访问块。在尾部插入或删除快 deque 双端队列。支持快速随机访问。在头尾位置插入或删除速度很快 list 双向链表。只支持双向顺序访问,在list中任何位置进行插入或删除操作的速度都很快 forward_list 单向链表。只支持单向顺序访问,在链表的任何位置进行插入或删除操作的速度都很快 forward_list、array是新C++标准增加的类型与内置数组相比,array是一种更安全、更容易使用的数组类型。array对象的大小不是固定的,因此,他支持插入和删除元素以及改变容器大小的操作 容器类型成员每个容器都定义了多个类型 类型别名 说明 iterator 容器的迭代器类型成员 const_iterator 可以读取元素,但不能修改元素的迭代器类型 size_type 无符号整数类型,足够保存此种容器类型最大可能容器的大小 differrnce_type 带符号整数类型,足够保存两个迭代器之间的距离 value_type 元素类型 reference_type 元素左值类型,与value_type&含义相同 const_reference 元素的const左值类型,(即const value_type&) ** 通过类型别名,我们可以在不了解容器中元素类型的情况下使用它 ** 为了使用这些类型,我们必须显示的使用其类型名 vector::iterator iter;//iter是通过vector定义的迭代器类型 容器的begin成员和end成员begin成员生成一个指向容器中第一个元素位置的迭代器end成员生成指向尾元素之后的位置的迭代器 容器定义和初始化 每个容器都定义了一个默认的构造函数。容器的默认的构造函数都会创建一个指定类型的空容器,他们都可以接受指定容器大小和元素初始值的参数 由于array是固定大小的数组。定义一个array时,除了制定元素类型外,还要指定容器的大小 创建一个容器为另一个容器的拷贝时,两个容器的类型以及元素的类型必须相同 当传递迭代器参数来拷贝一个范围时,不要求容器的类型必须相同,且新容器和原容器的元素类型也可以不同,只要能将要拷贝的元素的类型转换为要初始化的容器的元素类型即可 定义&初始化方式 说明 C a 默认构造函数,如果C是一个array,则a中元素按默认方式初始化,否则a为空 C a(b)C a=b a初始化为b的拷贝。**a和b必须是相同的类型(它们必须是相同的容器类型,且保存的是相同的元素类型)**,对于array我们还要定义它的大小 C a{b,c,d,e,f,…}C a={b,c,d,e,f,…} a初始化为初始化列表中元素的拷贝。列表中的元素类型必须与a的元素类型相容。对于array来说,列表元素的数目必须小于或等于array的大小,任何遗漏的元素直接进行值初始化 C a(b_iterator,c_iterator) a初始化为迭代器b_iterator和c_iterator指定范围中元素的拷贝,范围中元素的类型必须与a的元素类型相容 C a(n) a包含n个元素,这些元素进行了值初始化,此构造函数explicit的,string和array不适用 C a(n,value) a包含n个初始化为值value的元素 123456789101112131415161718192021222324252627#include<iostream>#include<vector>#include<list>#include<forward_list>using namespace std;int main(){ list<string> svec(10,"shan"); for(auto i:svec) { cout<<i<<endl; } //vector<string> vec = svec;//#错误,容器类型不匹配 forward_list<string> fvec(svec.begin(),svec.end());//使用迭代器范围进行拷贝初始化 for(auto temp:fvec) { cout<<temp<<endl; } return 0;} 标准库array的使用 定义一个array时,我们要指定元素的类型,还要指定容器的大小 由于大小是array类型的一部分,array不支持不同容器类型的构造函数 对array进行列表初始化的时候,初始值的数目必须等于或小于array的大小 array要求初始值的类型必须要与创建的容器类型相一致 虽然我们不能对内置的数组进行拷贝或对象赋值操作,但是array并无此限制 123456789101112131415161718192021222324252627#include<iostream>#include<array>using namespace std;int main(){ array<int ,10> num_1;//定义了一个保存10个int的数组 for(auto i:num_1) cout<<i<<" "; cout<<endl; array<int ,10> num_2={1,2,3,4,5,6,7,8,9,10}; for(auto i:num_2) cout<<i<<" "; cout<<endl; int d[5]={3,6,9,12,15}; //int b[5]=d; 这是错误的,内置数组不支持拷贝和赋值 array<int ,6> try_1={4,5,6,7,8,9}; array<int ,6> try_2=try_1; for(auto temp:try_2) cout<<temp<<" "; return 0;} 容器操作swap和assign a.swap(b):用于交换两个容器中的元素,两个容器必须具有相同的类型 swap(a,b):用于交换两个相同类型的容器中的元素 a.assign(1_iterator,2_iterator):将a中的元素替换为迭代器1_iterator和2_iterator范围中的元素,迭代器不能指向a中的元素 a.assign(value_list): 将a中的元素初始化为初始化列表value_list中的元素 a.assign(n,value):将a中的元素替换为n个值为value的元素 123456789101112131415161718192021222324252627282930313233343536373839404142#include<iostream>#include<vector>using namespace std;int main(){ vector<int> a={1,2,3,4,5,6}; vector<int> b; b.assign({6,7,8,9,10,11}); cout<<endl; for(auto temp:b) cout<<temp<<" "; cout<<endl; b.assign(a.begin(),a.end()); for(auto temp:b) cout<<temp<<" "; cout<<endl; /* * swap操作交换两个相同类型容器的内容 * assing操作用参数所指定的元素(即拷贝)替换左边容器中的所有元素。 * assign允许我们从不同但相容的类型赋值,或者从一个容器的子序列赋值 * 除了string外,指向容器的迭代器、引用和指针在swap操作后都不会失效 */ vector<int> temp={11,22,33,44,55,66,77,88}; b.swap(temp); cout<<"temp: "; cout<<"size-"<<temp.size()<<" "; for(auto i=temp.begin();i != temp.end();i++) cout<<*i<<" "; cout<<endl; cout<<endl; cout<<"b: "; cout<<"size-"<<b.size()<<" "; for(auto j=b.begin();j != b.end();j++) cout<<*j<<" "; return 0;} 向容器中添加元素(array不支持这些操作)   说明 C.push_back(t)C.emplace_back(args) 在C的尾部创建一个值为t或由args创建的元素。返回void类型 C.push_front(t)C.emplace_front(args) 在C的头部创建一个值为t或由args创建的元素,返回指向新添加的元素的迭代器 C.insert(p_iterator,t)C.emplace(p_iterator,args) 在迭代器p_iterator之前插入一个值为t或由args创建的元素,返回指向新添加的元素的迭代器 C.insert(p_iterator,n,t) 在迭代器p_iterator指向的元素之前插入n个值为t的元素,返回指向新插入的第一个元素的迭代器,若n为0,则返回p_iterator C.insert(p_iterator,a_iterator,b_iterator) 将迭代器a_iterator和b_iterator指定的范围内的元素插入到迭代器p_iterator指向的元素之前,迭代器范围不能指向C中的元素。返回指向第一个新添加的元素的迭代器,若范围为空,则返回p_iterator C.insert(p_iterator,li) 将由花括号括起来的元素值列表li插入待迭代器p_iterator所指的元素之前。返回新添加的第一个元素的迭代器,若列表为空,则返回p_iterator 向一个vector、string或deque中插入元素会使所有指向容器的迭代器、引用和指针失效 记住,insert函数将元素插入到迭代器所指定的位置之前 当我们用一个对象来初始化容器时,或将一个对象插入到容器中的时,实际上放入到容器中的是对象的值的拷贝,而不是对象本身 vector、list、deque、string都支持insert成员,forward_list提供了特殊版本的insert成员 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253#include<iostream>#include<vector>#include<list>using namespace std;void operated_1(){ vector<string> ss{"shansan","wocao","yeshan"}; vector<string> v; for(auto i:ss) v.push_back(i); for(auto temp:v) cout<<temp<<" ";}void operated_2(){ list<int> ls; for(int num=3;num>=0;num--) ls.push_front(num); for(int i=5;i<8;i++) ls.push_back(i); for(auto i=ls.begin();i != ls.end(); i++) cout<<*i<<" ";}void operated_3(){ vector<int> v_1{1,2,3,4,5}; vector<int> v_2{6,7,8,9,10}; v_1.insert(v_1.begin(),66);//在迭代器v_1.begin()所指的元素之前插入一个元素66 for(auto temp: v_1) cout<<temp<<" "; cout<<endl; v_1.insert(v_1.begin(),v_2.begin(),v_2.end()); //在迭代器v_1.begin()所指的元素之前,插入迭代器v_2.begin()到v_2.end()指顶范围内的元素 for(auto temp:v_1) cout<<temp<<" ";}int main(){ operated_1(); cout<<endl; operated_2(); cout<<endl; operated_3(); return 0;} emplace操作 当调用一个insert或push成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中当调用一个emplace函数时,则是将参数传递给元素类型的构造函数。emplace成员直接使用这些参数在容器管理的内存空间中直接构造函数 emplace函数在容器中直接构造函数。传递给emplace函数的参数必须与元素类型的构造函数相匹配 12345678910111213141516171819202122232425262728293031323334#include<iostream>#include<vector>using namespace std;class student{ public: student(string str,int a):name(str),age(a){} void print_1() { cout<<"name: "<<this->name<<","<<"Age: "<<this->age<<endl; } private: int age; string name;};int main(){ vector<student> s;//我们将student存到了vector中 s.emplace_back("shansan",18);//使用student对象的构造函数 auto temp=s.begin(); (*temp).print_1(); cout<<endl; //s.push_back("try",66);//error:没有接受两个参数的push_back版本 s.push_back(student("try",66));//创建一个临时的student对象传递给push_back for(auto i:s) i.print_1(); return 0;} 访问容器中的元素 访问操作 说明 c.back() 返回c中尾元素的引用。若c为空,函数行为未定义 c.front() 返回c中首元素的引用。若c为空,函数行为未定义 c[n] 返回c中下标为n的元素的引用,n是一个无符号整数。若n>=c.size(),则函数行为未定义 c.at(n) 返回下标为n的元素的引用。如果下标越界,则抛出一个out_of_range异常 123456789101112131415161718192021#include<iostream>#include<vector>using namespace std;int main(){ /* * 不要对一个空的容器使用front和back操作 * at和下标操作只适用于string、vector、deque和array * back不适用于forward_list */ vector<int> v{1,6}; int a = v.front(); a=33; cout<<"v[0]="<<v[0]<<endl; int &refer = v.front(); refer =33;//改变了v[0]的值 cout<<"v[0]="<<v[0]; return 0;} 由于访问成员函数的返回值是引用类型,如果是非const的,我们可以使用它来改变元素的值 删除容器中的元素 删除操纵 说明 c.pop_back() 删除c的尾元素,如果c是空的,则函数行为未定义。函数返回void c.pop_front() 删除c的首元素,如果c是空的,则函数行为未定义。函数返回void c.erase(p_iterator) 删除迭代器p_iterator所指定的元素,返回一个指向被删除的元素之后元素的迭代器,若p_iterator指向尾元素,则返回尾后迭代器,若p_iterator是尾后迭代器,则函数行为未定义 c.erase(a_iterator,b_iterator) 删除迭代器a_iterator和b_iterator所指定范围内的元素,返回一个指向最后一个被删元素之后元素的迭代器,若b_iterator本身就是尾后迭代器,则返回尾后迭代器 c.clear() 删除c中所有的元素 删除deque中除首尾位置之外的任何元素都会使迭代器、引用和指针失效。指向vector或string中删除点位置之后的迭代器、引用和指针都会失效 1234567891011121314151617181920212223242526272829303132#include<iostream>#include<vector>#include<list>using namespace std;int main(){ vector<string> str{"shansan","wocao","555"}; for(auto temp:str) cout<<temp<<" "; str.pop_back(); cout<<endl; for(auto temp:str) cout<<temp<<" "; cout<<endl; str.erase(str.begin(),str.end()); for(auto temp:str) cout<<temp<<" "; list<int> lst={0,1,2,3,4,5,6,7,8,9,10}; auto it = lst.begin(); while(it != lst.end()) { if(*it%2) it = lst.erase(it);//删除奇数元素,返回指向被删除元素的下一个元素的迭代器 else it++; } for(auto temp:lst) cout<<temp<<" "; return 0;} 改变容器大小 c.resize(n):调整c的大小为n个元素。若n<c.size(),则多出的元素被丢弃;若必须添加新元素,对新元素进行值初始化 c.resize(n,t):调整c的大小为n个元素,任何新添加的元素都初始化为值t 1234567891011121314151617181920212223242526#include<iostream>#include<vector>#include<deque>using namespace std;int main(){ vector<int> v{22,33,3}; cout<<"v capacity:"<<v.capacity()<<endl; v.resize(6,1); cout<<"v size:"<<v.size()<<endl; cout<<"v capacity:"<<v.capacity()<<endl; for(auto i:v) cout<<i<<" "; /* - 使用reserve操作通知容器应该为我们预留多少空间 - resize成员函数只改变容器中成员函数的数目,不改变容器的容量 - 容器的size操作指的是它已经保存的元素的数目 - capacity则是在不不分配新的内存空间的前提下知道它最多可以保存多少个元素 */ v.reserve(100); cout<<endl<<"v capacity:"<<v.capacity()<<endl; cout<<"v size:"<<v.size()<<endl; return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"Keep on moving !","slug":"Keep-on-moving-!","date":"2018-11-27T00:35:22.000Z","updated":"2018-11-27T00:35:22.000Z","comments":true,"path":"2018/11/27/Keep-on-moving-!/","permalink":"https://yeshan333.github.io/2018/11/27/Keep-on-moving-%EF%BC%81/","excerpt":"","text":"比赛终于完了!又可以安心打代码看书了emmmmmmm","categories":[],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"再探函数","slug":"再探函数","date":"2018-11-22T00:16:21.000Z","updated":"2018-11-22T00:16:21.000Z","comments":true,"path":"2018/11/22/再探函数/","permalink":"https://yeshan333.github.io/2018/11/22/%E5%86%8D%E6%8E%A2%E5%87%BD%E6%95%B0/","excerpt":"main:处理命令行//main函数的两种定义形式 int main(int argc,char **argv[]) int main(int argc,char *argv[]) argc:指的是命令行中输入参数的个数 argv:一个数组,它存储了所有的命令行参数","text":"main:处理命令行//main函数的两种定义形式 int main(int argc,char **argv[]) int main(int argc,char *argv[]) argc:指的是命令行中输入参数的个数 argv:一个数组,它存储了所有的命令行参数 参数使用示例子: 1234567891011121314//file_name:test.cpp//author:shansan#include<iostream>#include<stdio.h>using namespace std;int main(int argc,char **argv){ int i; for(i=0;i<argc;i++) { printf("argv[%d]=%s\\n",i,argv[i]); } return 0;} 含有可变形参的函数initializer_list形参 initializer_list是一种标准库类型,用于表示某种特定类型的值的数组 initializer_list也是一种模板类型 支持size(),begin(),end()等操作 向initializer_list形参中传递一个值的序列,则必须把序列放在花括号中 123456789101112131415161718192021222324252627282930313233#include<iostream>using namespace std;void print_1(initializer_list<string> str){ //遍历实参表列,使用initializer_list对象的成员begin和end进行遍历 cout<<"parameter nums: "<<str.size()<<endl; for(auto temp = str.begin();temp != str.end(); ++temp) { cout<<*temp<<endl; } cout<<endl; //用范围for语句遍历表列 for(auto beg : str) { cout<<beg<<endl; }}int main(){ const string a = "shansan"; string b = "yeshan333"; string c = "wocao"; //向initializer_list形参中传递一个值的序列需放在花括号内部 print_1({a,b,c}); return 0;} 函数返回值—–列表初始化返回值 函数可以返回花括号包围的值的列表 如果函数返回的是内置类型,则花括号包围的列表最多包含一个值,而且该值所占空间不应该大于目标类型的空间 如果函数返回的是类类型,由类本身定义初始值如何使用 1234567891011121314151617181920#include<iostream>#include<vector>using namespace std;vector<string> process(){ return {"shansan","yeshan333"};}int main(){ vector<string> v; v = process(); //遍历vector对象 for(auto temp : v) { cout<<temp<<endl; } return 0;} 调试帮助,预定义跟踪调试编译器为我们定义的 func:存放当前调试函数的名字 FILE:存放文件名的字符串字面值常量 LINE:存放文件当前行号的整型字面值 TIME:存放文件编译时间的字符串字面值常量 DATE:存放文件编译日期的字符串字面值常量","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"IO类型","slug":"IO类型","date":"2018-11-22T00:13:54.000Z","updated":"2018-11-22T00:13:54.000Z","comments":true,"path":"2018/11/22/IO类型/","permalink":"https://yeshan333.github.io/2018/11/22/IO%E7%B1%BB%E5%9E%8B/","excerpt":"IO库** IO库设施: ** istream类型:提供输入操作 ostream类型:提供输出操作 cin:一个istream对象,从标准输入读取数据 cout:一个ostream对象,从标准输出写入数据 cerr:一个ostream对象,通常用于输出程序错误信息,写入到标准错误 >>运算符:用来从一个istream对象读取输入数据 <<运算符:用来向一个ostream对象写入数据 getline函数:从一个给定的istream读取一行数据,存入一个给定的string对象中","text":"IO库** IO库设施: ** istream类型:提供输入操作 ostream类型:提供输出操作 cin:一个istream对象,从标准输入读取数据 cout:一个ostream对象,从标准输出写入数据 cerr:一个ostream对象,通常用于输出程序错误信息,写入到标准错误 >>运算符:用来从一个istream对象读取输入数据 <<运算符:用来向一个ostream对象写入数据 getline函数:从一个给定的istream读取一行数据,存入一个给定的string对象中 IO类 头文件 IO库类型 iostream istream,wistream从流读取数据ostream,wostream向流写入数据iostream,wiostream读写流 fstream ifstream,wistream从文件读取数据ofstream,wofstream向文件写入数据fstream,wfstream读写文件 sstream istringstream,wistringstream从string读取数据ostringstream,wostringstream向string写入数据stringstream,wstringstream读写string IO对象没有拷贝或赋值 定义函数时不能将形参设置为流类型 进行IO操作的函数通常使用引用方式传递和返回流 因为读写一个IO对象会改变其状态,因此传递和返回的引用不能是const类型的 一个流一旦发生错误,其后续的IO操作都会失败 1234567891011121314151617181920#include<iostream>using namespace std;istream& read_print(istream &s){ int score; while(s>>score) { cout<<score<<endl; } s.clear();//流复位,清楚所有错误标志位 return s;}int main(){ read_print(cin); cout<<"shansan"; return 0;} 输出缓冲管理cout<<"shansan" 文本串可能立即打印出来,但也有可能被操作系统保存在操作系统的缓冲区中,随后再打印。缓冲机制的存在可以让操作系统将程序的多个输出操作组合成单一的系统级写操作由于设备写操作可能很耗时间,允许操作系统将多个输出操作组合为单一的设备写操作可以带来很大的便利 ** 使用操纵符刷新缓冲区 ** endl:完成换行机制并且刷新缓冲区 ends:仅刷新缓冲区 flush:仅刷新缓冲区 程序崩溃,输出缓冲区不会刷新 文件IOhttps://shansan.top/2018/10/22/%E5%9D%91%E4%BA%BA%E7%9A%84C++-2/#%E5%86%99%E5%85%A5%E6%96%87%E4%BB%B6-amp-amp-%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6头文件定义了三个文件类型来支持文件IO ifstream:从文件读取数据 ofstream:向文件写入数据 fstream:读和写操作都能进行 每一个文件流对象都定义了一个名为open的成员函数,它完成了一些系统相关的操作,来定位给定的文件,并视情况打开为读或写模式一旦一个文件流已经打开,它就保持与对应文件的关联。对一个已经打开的文件流调用open会失败,并会导致failbit被置位,随后试图使用文件流的操作都会失败 ** ifstream、ofstream、fstream对象上的操作,以下操作都适用 操作 说明 fstream file 创建一个未绑定的文件流 fstream file(file_name) 创建一个fstream对象,并打开名字为file_name的文件。file_name可以是一个指向C风格的字符串,也可以是一个string类型 fstream file(file_name,mode) mode为指定的打开模式 fstream.close() 关闭与fstream绑定的文件 fstream.is_open() 返回一个bool值,指出与fstream关联的文件是否成功被打开且尚未被关闭 123456789101112131415161718192021222324252627282930313233343536#include<iostream>#include<fstream>#include<vector>using namespace std;void write(){ ofstream file; file.open("shansan.txt"); //等价于fstream file("shanshan.txt"); //像文件写入数据 file<<"shansan"<<endl; file<<"shansan.top"<<endl; file<<"yeshan333.github.io"<<endl; file.close();}void read_print(){ string buffer; ifstream read_file("shansan.txt"); vector<string> v; while(getline(read_file,buffer))//每次从read_file读取一行给buffer v.push_back(buffer);//将buffer存到vector对象v中 for(auto temp:v) cout<<temp<<endl;}int main(){ write(); read_print(); return 0;} 文件模式每一个流都有一个关联的文件模式,用来指出如何使用文件。每一个文件流都定义了一个默认的文件模式 与ifstream关联的文件默认以in模式打开 与ofstream关联的文件默认以out模式打开 与fstream关联的文件默认以in和out模式打开 文件模式 说明 in 以读方式打开文件 out 以写方式打开文件 app 每次写操作前均定位到文件末尾 ate 打开文件后立即定位到文件末尾 trunc 截断文件 binary 以二进制方式进行IO","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"排序算法","slug":"排序算法","date":"2018-11-20T00:35:20.000Z","updated":"2018-11-20T00:35:20.000Z","comments":true,"path":"2018/11/20/排序算法/","permalink":"https://yeshan333.github.io/2018/11/20/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/","excerpt":"稳定的直接插入排序基本思想:我们将一个待排序序列分为有序区和无序区(一般开始的时候将第一个元素作为有序区,剩下的元素作为无序区),每次将无序区的第一个元素作为待插入记录,按大小插入到前面已经排好的有序区中的适当位置,直到记录全部插入完成为止。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面)","text":"稳定的直接插入排序基本思想:我们将一个待排序序列分为有序区和无序区(一般开始的时候将第一个元素作为有序区,剩下的元素作为无序区),每次将无序区的第一个元素作为待插入记录,按大小插入到前面已经排好的有序区中的适当位置,直到记录全部插入完成为止。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面) C++ 实现 1234567891011121314151617void insert_sort_1(int a[],int n)//对n个元素从小到大排序{ int i,j; int temp; for(i=1;i<n;i++) { temp = a[i];//待插入元素 j = i-1; while(temp<a[j] && j) { a[j+1] = a[j];//将大的往后挪 j--;//顺利的话可以减到-1,要么就是减到可以插入的位置的前一个位置 //所以后面的j需要加1 } a[j+1]=temp; }} Python 实现 1234567891011def insert_sort(arr: List[int], n: int) -> None: for i in range(1, n): j: int = i - 1 wait_insert_ele: int = arr[i] while j >= 0: if arr[j] > wait_insert_ele: arr[j+1] = arr[j] # 将大于待插入元素的往后移 else: break j -= 1 arr[j + 1] = wait_insert_ele # 插入数据 稳定的冒泡排序基本思想:我们把待排序元素序列竖直放置,每趟对相邻的元素进行两两比较,顺序相反则进行交换,每趟会将最小或最大的元素“浮”到元素序列的顶端,最终元素序列达到有序 实现示例 1234567891011121314151617void bubble_sort(int array[],int n)// 对 n 个数从小到大排序,注意数组下标从 0 开始{ int i,j; int temp; for(i=0;i<n-1;i++)// 进行 n-1 趟比较 { for(j=0;j<n-1-i;j++)// 每趟进行 n-1-i 次比较 { if(array[j+1]<array[j]) { temp = array[j+1]; array[j+1] = array[j]; array[j] = temp; } } }} 优化(一但有一趟不需要比较,就表明可以结束了) 123456789def bubble_sort(arr: List[int], n: int) -> None: for i in range(n): flag: bool = False # 标记某趟是否还需要比较 for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j+1], arr[j] = arr[j], arr[j+1] flag = True if not flag: # 一但有一趟不需要比较,就表明可以结束了 break 不稳定的快速排序快速排序是分治思想在排序算法上的应用,从本质上来讲快速排序应该是在冒泡排序基础上的递归分治法。 算法步骤: 从待排数列中选出一个元素作为基准,一般选第一个元素 重新排序待排数列,所有元素比基准小的摆放在基准前面,所有元素比基准大的摆放在基准后面(相同的数可以放在任意一边)。在这个分区退出后,该基准就处于中间位置。(这个即为分区操作(partion))。 递归地把小于基准元素的子数列和大于基准元素的子数列进行排序。 实现 123456789101112131415161718def quick_sort(arr: List[int], left: int, right: int) -> None: if left >= right: return index = partition(arr, left, right) quick_sort(arr, left, index - 1) quick_sort(arr, index + 1, right)def partition(arr: List[int], left: int, right: int) -> None: pivot = arr[right] index = left for j in range(left, right): if arr[j] < pivot: arr[j], arr[index] = arr[index], arr[j] index += 1 arr[index], arr[right] = arr[right], arr[index] return index 另类 C 实现 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566#include<stdio.h>int a[101],n;void quick_sort(int left, int right){ int i,j,temp; int t; if(left > right) { return ; } temp = a[left];//基准数 i = left; j = right; while(i != j) { //顺序很重要,先从右往左找 while( a[j] >= temp && i<j) { j--; } //再从左边往右找 while( a[j] <= temp && i<j) { i++; } //交换两个数在数组中的位置 if(i<j)//两个哨兵没有相遇 { t = a[i]; a[i] = a[j]; a[j] = t; } } //最终将基准数归位, a[left] = a[i]; a[i] = temp;//归位 quick_sort(left,i-1);//继续处理左边的数 quick_sort(i+1,right);//继续处理右边的数 return ;}int main(){ int i,j; scanf("%d",&n); for(i=1; i<=n; i++)//下表从1开始 scanf("%d",&a[i]); quick_sort(1,n);//sort for(j=1; j<=n; j++) printf("%d ",a[j]); return 0;} 参考 https://blog.csdn.net/adusts/article/details/80882649 https://github.com/hustcc/JS-Sorting-Algorithm 极客时间-数据结构与算法之美","categories":[{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/categories/Algorithm/"}],"tags":[{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/tags/Algorithm/"}]},{"title":"二分查找","slug":"二分查找","date":"2018-11-19T00:30:43.000Z","updated":"2018-11-19T00:30:43.000Z","comments":true,"path":"2018/11/19/二分查找/","permalink":"https://yeshan333.github.io/2018/11/19/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE/","excerpt":"","text":"二分查找算法 二分查找的基本思想: 将 n 个元素分成大致相等的两部分,取 a[n/2] 与 x(查找目标值) 做比较,如果x == a[n/2] ,则找到 x,算法中止;否则,如果x < a[n/2],则只要在数组 a 的左半部分继续搜索 x,如果x > a[n/2], 则只要在数组 a 的右半部搜索 x。 使用二分查找算法的前提:待查找序列是有序的 时间复杂度分析由算法核心思想可知:每次对比都将下一步的比对范围缩小一半。每次比对后剩余数据项如下表: 最好情况即要找的元素正好在初始查找序列的中间一次比较出结果,时间复杂度为 $ O(1) $。 最坏情况即比对范围只剩下 1 个数据项的情况这个数据项即为正要找的元素。这时,可求解如下方程组($ i $ 为比较次数): $$ \\frac{n}{2^i}=1 $$ 时间复杂度为 $ O(log(n)) $ 平均时间复杂度进行平均时间复杂度分析时需要讨论:随着元素个数n的增多,需要几步算法才能终止?查找成功有多少种情况?查找失败有多少种情况? 设 $ n=2^k-1 $, $ k $ 为比较次数。易知,对于 $$ t=1,2,…, \\lfloor log(n) \\rfloor + 1 $$, 会有 $ 2^{t-1} $ 个元素在 $ t $ 步之后使算法成功终止。总共有 $ (2n+1) $ 种情况,$ n $ 种情况为成功结束,$ (n+1) $ 种情况为失败终止。 由此可得二分搜索的平均比较次数为 $ (k = \\lfloor log(n) \\rfloor + 1) $:$$ A(n)= \\frac{1}{2n+1}(\\sum_{i=1}^{k}i2^{i-1} + k(n+1)) $$根据初等数学等差乘等比数列求和的错位相减法/裂项相消法。易知,$$ \\sum_{i=1}^{k}i2^{i-1} = 2^k(k-1)+1 $$ 使用裂项相消法由 $ \\sum_{i=1}^{k}i2^{i-1} $,设 $ a_i=i2^{i-1},(i=1,…,k) $。注意到,$ a_i=(k-1)2^k-(k-2)2^{k-1} $。$$ \\sum_{i=1}^{k}i2^{i-1}=0\\times2^1+1+1\\times2^2-0\\times2^1+2\\times2^3-1\\times2^2+…+(k-1)2^k-(k-2)2^{k-1}=2^k(k-1)+1 $$ $$ A(n)= \\frac{1}{2n+1}(\\sum_{i=1}^{k}i2^{i-1} + k(n+1)) $$$$ \\sum_{i=1}^{k}i2^{i-1} = 2^k(k-1)+1 $$综上可得,$$ A(n) = \\frac{1}{2n+1}((k-1)2^{k}+1+k2^k) $$ 当 $ n $ 非常大时,可得$$ A(n) \\approx \\frac{1}{2^{k+1}}((k-1)2^{k}+k2^k)=\\frac{(k-1)}{2}+\\frac{k}{2}=k-\\frac{1}{2} $$所以 $ A(n)<k=O(log(n)) $ ,平均时间复杂度为$ O(log(n)) $。 代码实现123456789101112131415161718192021222324252627282930# -*- coding: utf-8 -*-# binary_searchdef binary_search(list_1, item): low = 0 high = len(list_1)-1 while low <= high: '''使用 // 整除运算符可以不用int进行类型转换''' #每次都检查中间的元素 mid = (low + high)/2 guess = list_1[int(mid)] if guess == item: return int(mid)#返回所在位置的索引 if guess < item: #猜的数字小了,修改low low = mid+1 if guess > item: #猜的数字大了,修改high high = mid-1 return Nonedef main(): list_2 = [1,2,3,4,5,6,7,8,9] print(binary_search(list_2, 8)) print(binary_search(list_2, 10))main() 1234567891011121314151617181920212223242526272829303132333435363738#include<iostream>#include<typeinfo>using namespace std;int binary_search(int a[9],int n,int x)//n为元素个数{ int mid; int high,low=0; int guess; high = n-1;//数组下标从0开始 while(low <= high) { mid = (high+low)/2; guess = a[mid]; if(guess == x) return mid; if(guess > x) high = mid-1; if(guess < x) low = mid+1; } return -1;}int main(){ int temp; int a[9] = {1,2,3,4,5,6,7,8,9}; cout<<sizeof(a)/sizeof(int)<<endl; cout<<typeid(sizeof(a)/sizeof(int)).name()<<endl; temp = binary_search(a,sizeof(a)/sizeof(int),5); cout<<temp<<endl; return 0;} 附:C++ 使用头文件typeinfo下的typeid(parameter).name()可获取参数获取类型名","categories":[{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/categories/Algorithm/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"},{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/tags/Algorithm/"},{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"C++面向对象-8","slug":"C++-面向对象-8","date":"2018-11-15T23:40:22.000Z","updated":"2018-11-15T23:40:22.000Z","comments":true,"path":"2018/11/15/C++-面向对象-8/","permalink":"https://yeshan333.github.io/2018/11/15/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-8/","excerpt":"","text":"使用struct关键字定义类*** 使用class和struct定义类的唯一区别就是默认的访问权限 ***] 使用struct关键字,定义在第一个访问说明符之前的成员是public 使用class关键字,定义在第一个访问说明符之前的成员是private 定义在类内的成员函数是自动inline的 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475#include<cstring>#include<iostream>using namespace std;struct Sales_data{ /* - isbn成员函数用于返回对象的ISBN编号 - combine成员函数,用于将一个Sales_data对象加到另一个对象上 - avg_price成员函数,用于返回售出书籍的平均价格 */ string isbn() const{return bookNo;}//这是一个常量成员函数,不能改变调用它的对象的内容 Sales_data& combine(const Sales_data&); double avg_price() const; string bookNo; //ISBN unsigned units_sold = 0; //销售总数 double revenue = 0.0; //收益};double Sales_data::avg_price() const{ if(units_sold) return revenue/units_sold; else return 0;}Sales_data& Sales_data::combine(const Sales_data &rhs){ units_sold += rhs.units_sold; revenue += rhs.revenue; return *this;//返回调用该函数的对象}/** Salse_data的非成员接口函数:- add函数,执行两个Sales_data对象的加法- read函数,将数据从istream读入到Sales_data对象中- print函数,将Sales_data对象的值输出到ostream*/Sales_data add(const Sales_data& ,const Sales_data&);ostream &print(ostream& , const Sales_data&);istream &read(istream& , const Sales_data&);//输入的交易信息包括ISBN、售出总数、售出价格istream &read(istream &is, Sales_data &item){ double price = 0.0; is>>item.bookNo>>item.units_sold>>price;}ostream &print(ostream &os, const Sales_data &item){ os<<item.isbn()<<" "<<item.units_sold<<" " <<item.revenue<<" "<<item.avg_price(); return os;}Sales_data add(const Sales_data &lhs, const Sales_data &rhs){ Sales_data sum = lhs;//把lhs的数据成员拷贝给sum sum.combine(rhs); return sum;}int main(){ Sales_data total; string temp; temp = "shansan"; total.bookNo = temp; //total.bookNo = "shansan"; cout<<total.bookNo<<endl; cout<<total.isbn()<<endl; return 0;} 使用=default保留默认的构造函数 & 构造函数初始值列表 当我们需要其他构造函数的时,同时也希望保留默认的构造函数时候,可以使用= default 构造函数初始值是成员函数的一个列表,每个名字后面紧跟括号括起来的(或则在花括号内的)成员初始值。不同成员的初始值通过逗号分隔 构造函数初始值列表只说明用于初始化成员的值,而不限定初始化的具体执行顺序 但是如果一个成员是用另一个成员来初始化的,那么这两个成员的初始化顺序就很重要 consturctor(parameter):initializer_list,注意那个冒号,构造函数不能被声明成const的 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798#include<cstring>#include<iostream>using namespace std;struct Sales_data{ //新增构造函数 //使用构造函数初始值列表,注意那个冒号 //这两个构造函数的函数体都是空的,构造函数没有返回类型 Sales_data() = default;//保留默认构造函数 Sales_data(const string &s) :bookNo(s) {} Sales_data(const string &s, unsigned n, double p):bookNo(s),units_sold(n),revenue(p*n) {} //声明一个constructor,定义放在类外了 Sales_data(istream&); string isbn() const{return bookNo;}//这是一个常量成员函数,不能改变调用它的对象的内容 Sales_data& combine(const Sales_data&); double avg_price() const; string bookNo; unsigned units_sold = 0; double revenue = 0.0;};double Sales_data::avg_price() const{ if(units_sold) return revenue/units_sold; else return 0;}Sales_data& Sales_data::combine(const Sales_data &rhs){ units_sold += rhs.units_sold; revenue += rhs.revenue; return *this;//返回调用该函数的对象}/** Salse_data的非成员接口函数:- add函数,执行两个Sales_data对象的加法- read函数,将数据从istream读入到Sales_data对象中- print函数,将Sales_data对象的值输出到ostream*/Sales_data add(const Sales_data& ,const Sales_data&);ostream &print(ostream& , const Sales_data&);istream &read(istream& , const Sales_data&);//输入的交易信息包括ISBN、售出总数、售出价格istream &read(istream &is, Sales_data &item){ double price = 0.0; is>>item.bookNo>>item.units_sold>>price;}ostream &print(ostream &os, const Sales_data &item){ os<<item.isbn()<<" "<<item.units_sold<<" " <<item.revenue<<" "<<item.avg_price()<<endl; return os;}Sales_data add(const Sales_data &lhs, const Sales_data &rhs){ Sales_data sum = lhs;//把lhs的数据成员拷贝给sum sum.combine(rhs); return sum;}//类外定义新的构造函数Sales_data::Sales_data(istream &is){ read(is,*this);//从is中读入一条信息存到this对象中}int main(){ Sales_data total;//调用默认的构造函数 string temp; temp = "shansan"; total.bookNo = temp; //total.bookNo = "shansan"; cout<<total.bookNo<<endl; cout<<total.isbn()<<endl; Sales_data let("shansan.top",33,33);//调用构造函数Sales_data(const string &s, unsigned n, double p) cout<<let.bookNo<<" "<<let.units_sold<<" "<<let.revenue<<endl; Sales_data read_print;//调用默认的构造函数 read(cin,read_print); print(cout,read_print); Sales_data dada(cin);//调用构造函数Sales_data(istream &is) print(cout,dada); return 0;} 委托构造函数 一个委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程 它把自己的一些或全部职责委托给了其他构造函数 一个委托构造函数和其他构造函数一样也有一个成员初始值列表和一个函数体 委托构造函数的成员初始值列表只有一个入口,就是类名本身。类名后面紧跟圆括号括起来的初始值列表,参数列表必须与另一个构造函数匹配 当一个构造函数委托给另一个构造函数时,受委托的构造函数的初始值列表和函数体被依次执行 12345678910111213141516171819202122232425262728293031323334353637383940#include<iostream>using namespace std;class People{ public: //非委托构造函数使用对应的实参初始化成员 People(string m,string x,int n):first_name(m),last_name(x),age(n) {} //其余构造函数全部委托给另一个构造函数 //注意使用冒号 People(): People("li","lei",18){} People(string insert): People(insert,"wan",33){} People(int a): People("wu","ge",a){} int print_info(People temp) { cout<<temp.first_name<<" "<<temp.last_name<<" "<<temp.age<<endl; return 0; } private: string first_name; string last_name; int age;};int main(){ People num_1("shan","san",18);//调用构造函数 People(string m,string x,int n) num_1.print_info(num_1); People num_2;//调用委托构造函数 People("li","lei",18) num_2.print_info(num_2); People num_3("six");//调用委托构造函数 People(string insert) num_3.print_info(num_3); People num_4(100);//调用委托构造函数 People(int a) num_4.print_info(num_4); return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"精度(precision)控制","slug":"精度-precision-控制","date":"2018-11-06T23:50:56.000Z","updated":"2018-11-06T23:50:56.000Z","comments":true,"path":"2018/11/06/精度-precision-控制/","permalink":"https://yeshan333.github.io/2018/11/06/%E7%B2%BE%E5%BA%A6-precision-%E6%8E%A7%E5%88%B6/","excerpt":"C++输出精度(precision)控制,格式化输出使用cout对象的成员 setprecision() setf() width() fill() flags(ios::fixed)","text":"C++输出精度(precision)控制,格式化输出使用cout对象的成员 setprecision() setf() width() fill() flags(ios::fixed) 123456789101112131415161718192021222324252627282930313233#include<iostream>using namespace std;int main(){ double a=3.1415926; double c=66.666666; cout.precision(3); //控制输出流显示的有效数字个数 cout<<a<<endl; cout<<c<<endl; cout<<endl; cout.width(8); //控制输出宽度 cout.setf(ios::right); //设置对齐方式 cout<<a<<endl; cout<<endl; cout.setf(ios::right); cout.fill('#'); //设置填充字符 cout.width(8); cout<<a<<endl; cout<<endl; cout.flags(ios::fixed); //flags(ios::fixed)和precision()配合使用控制精度 cout.precision(4); cout<<a<<endl; return 0;} 使用头文件iomanip中的setprecision()和setiosflags(ios::fixed)进行精度控制1234567891011121314#include<iostream>#include<iomanip>using namespace std;int main(){ double e = 2.7182818; cout<<setprecision(3)<<e<<endl; cout<<setiosflags(ios::fixed)<<endl; cout<<setprecision(3)<<e<<endl; return 0;} 参考自:https://blog.csdn.net/yanglingwell/article/details/49507463","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"C++标准库类型","slug":"C++-标准库类型","date":"2018-11-05T23:24:19.000Z","updated":"2018-11-05T23:24:19.000Z","comments":true,"path":"2018/11/05/C++-标准库类型/","permalink":"https://yeshan333.github.io/2018/11/05/C++-%E6%A0%87%E5%87%86%E5%BA%93%E7%B1%BB%E5%9E%8B/","excerpt":"标准库类型string 标准库类型string表示可变长的字符序列 使用string类型必须包含string头文件,string定义在命名空间std中 定义和初始化string对象初始化string对象的方式 初始化方式 说明 string s1 默认初始化,s1是一个空字符串 string s2(s1) s2是s1的副本 string s2=s1 等价于s2(s1),s2是s1的副本 string s3(“shansan”) s3是字面值”shansan”的副本,除了字面值最后的那个空字符串外 string s3=”shansan” 等价于s3(“shansan”) string s4(n,’c’) 把s4初始化为由连续n个字符c组成的串","text":"标准库类型string 标准库类型string表示可变长的字符序列 使用string类型必须包含string头文件,string定义在命名空间std中 定义和初始化string对象初始化string对象的方式 初始化方式 说明 string s1 默认初始化,s1是一个空字符串 string s2(s1) s2是s1的副本 string s2=s1 等价于s2(s1),s2是s1的副本 string s3(“shansan”) s3是字面值”shansan”的副本,除了字面值最后的那个空字符串外 string s3=”shansan” 等价于s3(“shansan”) string s4(n,’c’) 把s4初始化为由连续n个字符c组成的串 1234567891011121314151617181920#include<iostream>using namespace std;int main(){ string s1; cout<<s1<<endl; cout<<"1"<<endl; string s2 = "shansan"; cout<<s2<<endl; string s3(s2); cout<<s3<<endl; string s4(6,'s'); cout<<s4<<endl; return 0;} string对象上的操作 getline(is,s):从is中读取一行赋给s,返回is s.empty():s为空返回true s.size():返回s中字符的个数 12345678910111213141516171819202122232425#include<iostream>using namespace std;//empty(),getline(),size()int main(){ string s; cin>>s; //* 读取时string对象会默认忽略掉开头的空白(即空格符、换行符、制表符等) //* 从第一个真正的字符开始读起,直到遇见下一处空白为止 cout<<s<<endl; cout<<s.size()<<endl; if(!s.empty())//如果string对象非空 { cout<<"the string is not empty !"<<endl; } string line; //每次读取一整行,遇到换行符结束 while(getline(cin,line)) cout<<line<<endl; return 0;} 标准库类型vector** #include ** 标准库类型表示对象的集合,其中所有的对象类型都相同 集合中的每一个对象都有一个与之对应的索引,索引用于访问对象 定义和初始化vector对象 定义和初始化vector对象的方法 说明 vector v1 v1是一个空vector,它潜在的元素是T类型的,执行默认初始化 vector v2(v1) v2中包含有v1所有元素的副本 vector v2=v1 等价于v2(v1) vector v3(n,value) v3包含了n个重复的元素,每个元素的值都是value vector v4(n) v4包含了n个重复地执行了值初始化的对象 vector v5{a,b,c,…} v5包含了初始值的个数的元素,每元素被赋予相应的初始值 vector v5={a,b,c,…} 等价于v5 vector对象上的操作 v.empty():如果v不含有任何元素,返回真,否者返回假 v.size():返回v中元素的个数 v.push_back(t):向v的尾端添加一个值为t的元素 1234567891011121314151617181920212223242526272829#include<iostream>#include<vector>using namespace std;int main(){ vector<int> s={1,2,3,4,5};;//列表初始化vector对象s //- 可使用下标访问vector对象 cout<<s[0]<<endl; vector<int> a(8,1); for(auto i:a) { cout<<i<<" "; } cout<<endl; string word; vector<string> text; while(cin>>word) { text.push_back(word);//push_back() } for(auto str:text) { cout<<str<<" "; } return 0;} 使用范围for语句处理vector对象12345678910111213141516171819202122232425#include<iostream>#include<vector>using namespace std;int main(){ int num; vector<int> v; while(cin>>num)//获取元素值 { v.push_back(num); } for(auto &i:v)//求元素值的平方 { i = i*i; } for(auto temp:v)//输出v中每一个元素 { cout<<temp<<" "; } return 0;} 不可用下标形式为vector对象添加元素12345678910111213141516#include<iostream>#include<vector>using namespace std;int main(){ vector<int> v;//空的vector对象 for(decltype(v.size()) i =0;i!=6;i++) { v[i] = i; } // -v是一个空的vector,不存在任何元素,不能通过下标去访问 // -应该使用vector对象的成员函数push_back()为vector对象添加元素较为安全 cout<<v[0]<<endl; return 0;} vector对象(以及string对象)的下标运算符可用于访问已存在的元素,而不能用于添加元素 使用标准库函数begin()和end()遍历数组123456789101112131415#include<iostream>using namespace std;//库函数begin和end,以数组名作为参数int main(){ int sums[]={1,2,3,4,5,6,7,8,9,10}; int *beg = begin(sums); //指向sums首元素的指针 int *last = end(sums); //指向sums尾元素的下一位置的指针 int *temp; for(temp = beg;temp != last;temp++) { cout<<*temp<<" "; } return 0;} begin()函数返回指向数组sums首元素的指针 end()函数返回指向数组sums尾元素下一位置的指针 使用可迭代对象(容器||string对象)的成员begin()和end()进行遍历 end成员返回指向容器(string对象)“尾元素下一位置(one past the end)”的迭代器(尾后迭代器) begin成员负责返回指向第一个元素(或者第一个字符的迭代器) 123456789101112131415161718192021222324252627282930313233343536#include<iostream>#include<vector>#include<string.h>using namespace std;int main(){ string s="shan san";//s("shan san"); cout<<s<<endl; //首字母改成大写形式 if(s.begin() != s.end()) { auto it = s.begin();//令it指向s的第一个元素 *it = toupper(*it); } cout<<s<<endl; //全部字母改成大写形式,&& !isspace(*temp) //temp是个迭代器,通过 * 运算符解引用迭代器获得迭代器所指的对象 for(auto temp=s.begin();temp != s.end() ; temp++) { *temp = toupper(*temp); } cout<<s<<endl; const int a=8; //a=0; cout<<a<<endl; char c[10]="123456789"; char b[10]; strcpy(b,c); cout<<b[1]<<endl; return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"C++11特性-1","slug":"C++-11特性-1","date":"2018-11-05T23:19:57.000Z","updated":"2018-11-05T23:19:57.000Z","comments":true,"path":"2018/11/05/C++-11特性-1/","permalink":"https://yeshan333.github.io/2018/11/05/C++-11%E7%89%B9%E6%80%A7-1/","excerpt":"c++11特性列表初始化 使用花括号来初始化对象 使用列表初始化内置类型的变量,可能会存在丢失信息的风险","text":"c++11特性列表初始化 使用花括号来初始化对象 使用列表初始化内置类型的变量,可能会存在丢失信息的风险 auto类型说明符号decltype类型说明符auto auto让编译器通过初始值来推算变量的类型 使用auto也能在一条语句中声明多个变量。因为一条声明语句只能有一个基本数据类型,所以该语句中的所有变量的初始基本数据类型都必须一样 编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则 123456789101112131415161718#include<iostream>#include<typeinfo>using namespace std;int main(){ int a = 33; double pi = 3.1415926; auto b=a; //auto c=1.414,d=1;//[Error] inconsistent deduction for 'auto': 'double' and then 'int' cout<<typeid(pi).name()<<endl; cout<<typeid(a).name()<<endl; //cout<<typeid(c).name()<<endl; return 0;} delctype 从表达式的类型推断出要定义的变量的类型,不使用该表达式的值初始化变量 编译器分析表达式并得到它的类型,却不实际计算表达式的值 如果decltype使用的表达式不是一个变量,则返回表达式结果对用的类型 1234567891011121314151617181920#include<iostream>#include<typeinfo>using namespace std;int main(){ int a=1,b=3; int &refer_a=a; decltype(a+b) temp=33; decltype(refer_a) en=b;//引用类型定义时就必须初始化 decltype((a)) refer=b;//decltype((variable))的结果永远是引用,使用了双层括号 cout<<temp<<" "<<"it's type:'"<<typeid(temp).name()<<endl; cout<<refer_a; cout<<en<<endl; cout<<refer<<endl; return 0;} 范围for语句基本形式: for(declaration : expression) statement expression部分是一个对象,用于表示一个序列 declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,declaration部分的变量都会被初始化为expression部分的下一个元素值 使用范围for语句遍历string对象1234567891011121314151617181920212223242526272829303132333435#include<iostream>using namespace std;int main(){ string str("shan san"); //通过编译器来决定变量的类型 for(auto s : str) { cout<<s<<" "; } cout<<endl; for(auto temp : str) { cout<<temp; } cout<<endl; //使用引用,使字符串对象str变为大写 for(auto &a : str) { a = toupper(a); } cout<<str<<endl; //使用下标进行迭代,改变字符串对象str的大小写状态 for(decltype(str.size()) index = 0; index != str.size(); ++index) { str[index] = toupper(str[index]); } cout<<str; return 0;} 使用范围for语句遍历二维数组*** 使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型 *** 1234567891011121314151617181920212223242526272829#include<iostream>#include<cstddef>using namespace std;int main(){ constexpr size_t rowCnt = 3,colCnt = 4; int a[rowCnt][colCnt]; //二位数组初始化 for(size_t i = 0; i != rowCnt; i++) { for(size_t j=0; j != colCnt;j++) { //将元素的位置索引作为它的值 a[i][j] = i*colCnt + j; } } for(auto &temp : a) //对于外层数组的每一个元素 { for(auto lim :temp) //对于内层数组的每一个元素 { cout<<lim<<endl; } } return 0;} 使用范围for语句遍历vector对象1234567891011121314151617181920#include<iostream>#include<vector>using namespace std;int main(){ int scores; vector<int> v; while(cin>>scores) { v.push_back(scores); } for(auto temp : v) { cout<<temp<<" "; } return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"python生成器回顾","slug":"python生成器回顾","date":"2018-11-02T23:25:44.000Z","updated":"2018-11-02T23:25:44.000Z","comments":true,"path":"2018/11/02/python生成器回顾/","permalink":"https://yeshan333.github.io/2018/11/02/python%E7%94%9F%E6%88%90%E5%99%A8%E5%9B%9E%E9%A1%BE/","excerpt":"python生成器(generator) 生成器是一种使用普通函数语法定义的迭代器 包含yield语句的函数都是生成器,它是一个不断产生值的函数 生成器每次使用yield产生一个值后,函数都将冻结,即在此处停止执行,等待重新被唤醒。被唤醒后从停止的地方开始继续执行 生成器推导(生成器表达式)*** 使用圆括号()创建一个生成器推导 ***,它创建了一个可迭代的对象使用next()函数可以获得生成器推导的下一个返回值 g = (i**2 for i in range(10))","text":"python生成器(generator) 生成器是一种使用普通函数语法定义的迭代器 包含yield语句的函数都是生成器,它是一个不断产生值的函数 生成器每次使用yield产生一个值后,函数都将冻结,即在此处停止执行,等待重新被唤醒。被唤醒后从停止的地方开始继续执行 生成器推导(生成器表达式)*** 使用圆括号()创建一个生成器推导 ***,它创建了一个可迭代的对象使用next()函数可以获得生成器推导的下一个返回值 g = (i**2 for i in range(10)) simple generator** demo_1 ** 斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到 ** demo_2_generator ** recursive generator处理多层嵌套列表 123456789101112131415def flagtten(nested): try: for sublist in nested: for element in flagtten(sublist): yield element except TypeError:#处理迭代单个对象引起的typeerror异常 yield nesteddef main(): s = list(flagtten([1,[2,3]])) print(s)main() 12345678910111213141516171819202122def flagtten(nested): try: #不迭代类似于字符串的对象 try: nested + '' except TypeError: pass else: raise TypeError for sublist in nested: for temp in flagtten(sublist): yield temp except TypeError: yield nesteddef main(): s = list(flagtten(["haha",["shan","san"]])) print(s)main()","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"Scrapy爬虫框架","slug":"Scrapy爬虫框架","date":"2018-10-31T23:13:19.000Z","updated":"2018-10-31T23:13:19.000Z","comments":true,"path":"2018/10/31/Scrapy爬虫框架/","permalink":"https://yeshan333.github.io/2018/10/31/Scrapy%E7%88%AC%E8%99%AB%E6%A1%86%E6%9E%B6/","excerpt":"","text":"网络爬虫框架scrapy(配置型爬虫) 什么是爬虫框架? 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合 爬虫框架是个半成品,帮助用户实现专业网络爬虫 scrapy框架结构(“5+2”结构) spider: 解析downloader返回的响应(Response) 产生爬取项(scraped item) 产生额外的爬去请求(Request)需要用户编写配置代码 engine(引擎): 控制所有模块之间的数据流 根据条件触发事件不需要用户修改 scheduler(调度器): 对所有爬取请求进行调度处理不需要用户修改 downloader(下载器): 根据请求下载网页不需要用户修改 item pipelines(): 以流水线处理spider产生的爬取项 由一组操作顺序组成,类似流水线,每个操作是一个Item Pipeline类型 可能操作包括:清理、检验和查重爬取项中的HTML数据,将数据存储到数据库中需要用户编写配置代码 downloader middleware(中间件): 目的:实施engine、scheduler和downloader之间进行用户可配置的控制 功能:修改、丢弃、新增请求或响应用户可以编写配置代码 spider middleware(中间件): 目的:对请求和爬去项的再处理 功能:修改、丢弃、新增请求或爬取项用户可以编写配置代码 数据流 1.Engine从Spider处获得爬取请求(Request) 2.Engine将爬取请求转发给Scheduler,用于调度 3.Engine从Scheduler处获得下一个爬取的请求 4.Engine将爬取请求通过中间件发送给Downloader 5.爬取网页后,Downloader形成响应(Response),通过中间件(Middleware)发给Engine 6.Engine将收到的响应通过中间件发送给Spider处理 7.Spider处理响应后产生爬取项(scraped item)和新的爬取请求(Requests)给Engine 8.Engine将爬取项发送给Item Pipeline(框架出口) 9.Engine将爬取请求发送给Scheduler Engine控制各模块数据流,不间断从Scheduler处获得爬取请求,直到请求为空 框架入口:Spider的初始爬取请求 框架出口:Item Pipeline scrapy命令行格式 scrapy <command> [options] [args] ** 常用命令 ** 命令 说明 格式 startproject 创建一个新工程 scrapy startproject [dir] genspider 创建一个爬虫 scrapy genspider [options] [domain] settings 获得爬虫配置信息 scrapy settings [options] crawl 运行一个爬虫 scrapy crawl list 列出工程中所有的爬虫 scrapy list shell 启动URL调试命令行 scrapy shell [url] demohttps://python123.io/ws/demo.html创建工程scrapy startproject python123demo 创建爬虫scrapy genspider demo python123.io //生成了一个名为demo的spider //在spider目录下增加代码文件demo.py(该文件也可以手工生成) ** demo.py文件 ** 1234567891011# -*- coding: utf-8 -*-import scrapyclass DemoSpider(scrapy.Spider): name = 'demo' allowed_domains = ['python123.io'] start_urls = ['http://python123.io/'] def parse(self, response): pass 配置产生的spider爬虫12345678910111213141516# -*- coding: utf-8 -*-import scrapyclass DemoSpider(scrapy.Spider): name = 'demo' #allowed_domains = ['python123.io'] start_urls = ['http://python123.io/ws/demo.html'] def parse(self, response): #存储文件名demo.html file_name = response.url.split('/')[-1] with open(file_name,"wb") as f: f.write(response.body) self.log('Saved file %s' % file_name)#日志 *** 另一个版本 ** 12345678910111213141516171819202122# -*- coding: utf-8 -*-import scrapyclass DemoSpider(scrapy.Spider): name = 'demo' #allowed_domains = ['python123.io'] #start_urls = ['http://python123.io/ws/demo.html'] def start_requests(self): urls = [ 'http://python123.io/ws/demo.html' ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): #存储文件名demo.html file_name = response.url.split('/')[-1] with open(file_name,"wb") as f: f.write(response.body) self.log('Saved file %s' % file_name)#日志 运行爬虫scrapy crawl demo Scrapy爬虫数据类型 Request类 Response类 Item类 Request类class scrapy.http.Request() Request对象表示一个HTTP请求 由Spider生成,由Downloader执行 属性 方法 .url Requests对应的请求URL地址 .method 对应的请求方法,’GEt’、’POST’等 .headers 字典类型风格的请求头 .body 请求内容主体,字符串类型 .meta 用户添加的扩展信息,在Scrapy内部模块间传递信息使用 .copy 复制该请求 Response类class scrapy.http.Response() Response对象表示一个HTTp响应 由Downloader生成,由Spider处理 属性或方法 说明 .url Response对应的URL地址 .status HTTP状态码,默认是200 .headers Response对应的头部信息 .body Response对应的内容信息,字符串类型 .flags 一组标记 .request 产生Response类型对应的Request对象 .copy() 复制该响应 Item类class scrapy.item.Item() Item对象表示一个从HTML页面中提取的信息内容 由Spider生成,由Item Pipeline处理 Item类似字典类型,可以按照字典类型操作 Scrapy爬虫的使用步骤 创建一个工程和Spider模板 编写Spider 编写Item Pipeline 优化配置策略 scrapy爬虫信息提取方法 Beautifui Soup lxml re XPath Selector CSS Selector","categories":[{"name":"Scrapy","slug":"Scrapy","permalink":"https://yeshan333.github.io/categories/Scrapy/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"Scrapy","slug":"Scrapy","permalink":"https://yeshan333.github.io/tags/Scrapy/"}]},{"title":"HTML试水","slug":"HTML试水","date":"2018-10-30T23:39:10.000Z","updated":"2018-10-30T23:39:10.000Z","comments":true,"path":"2018/10/30/HTML试水/","permalink":"https://yeshan333.github.io/2018/10/30/HTML%E8%AF%95%E6%B0%B4/","excerpt":"一级标题 二级标题","text":"一级标题 二级标题 倚天屠龙记张无忌这是另一段 锚点这是我的个人博客这是我的个人博客,新标签页打开 邮箱联系我 图像** img是自关标记,不需要结束标记 ** 文本这里是粗体 这里是斜体 what 这里还是斜体 插入字体,下划线 删除线 下标&&上标 H<sub>2</sub>O<sub>2</sub> 嗯<sup>我飘了</sup> <code>#include<stdio.h> int main() { printf("wocao!"); }</code> 正常字 <small>小号字</small> <q>短引用,双引号包围</q> <blockquote>长引用 土地是以它的肥沃和收获而被估价的;才能也是土地,不过它生产的不是粮食,而是真理。 如果只能滋生瞑想和幻想的话,即使再大的才能也只是砂地或盐池,那上面连小草也长不出来的。 —— 别林斯基 </blockquote> 22222222222 22222222222222 2222 ## 表格 <table>...</table>:定义表格 <th>...</th>:定义表格的标题栏(文字加粗体) <tr>...</tr>:定义表格的行 <td>...</td>:定义表格的列 <table border="1"> <tr> <td>row 1, cell 1</td> <td>row 1, cell 2</td> </tr> <tr> <td>row 2, cell 1</td> <td>row 2, cell 2</td> </tr> </table> ### 跨列表格 <table border="1"> <tr> <th>姓名</th> <th colspan="2">电话</th> </tr> <tr> <td>shansan</td> <td>1329441308</td> <td>164354491</td> </tr> <table> <h3>跨行表格</h3> <table border="1"> <tr> <th>姓名</th> <td>shansan</td> </tr> <tr> <th rowspan="2">电话</th> <td>1329441308</td> </tr> <tr> <td>164354491</td> </tr> </table> ## syntax 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104# HTML试水<h1> 一级标题 </h1><h2> 二级标题 </h2><!-- more --><p>倚天屠龙记</p><p>张无忌</p><p>这是另一段</p>## 锚点<a href = "https://shansan.top">这是我的个人博客</a><a href = "https://shansan.top" target="_blank">这是我的个人博客,新标签页打开</a><a href="mailto:1329441308@qq.com" target="_top">邮箱联系我</a># 图像** img是自关标记,不需要结束标记 **<img src="https://www.baidu.com/img/bd_logo1.png" width="500" height="500">## 文本<b>这里是粗体</b><i>这里是斜体</i><strong>what</strong><em>这里还是斜体</em><ins>插入字体,下划线</ins><del>删除线</del>~~~ 还是删除线 ~~~下标&&上标H<sub>2</sub>O<sub>2</sub>嗯<sup>我飘了</sup><code>#include<stdio.h>int main(){ printf("wocao!");}</code>正常字<small>小号字</small><q>短引用,双引号包围</q><blockquote>长引用土地是以它的肥沃和收获而被估价的;才能也是土地,不过它生产的不是粮食,而是真理。如果只能滋生瞑想和幻想的话,即使再大的才能也只是砂地或盐池,那上面连小草也长不出来的。 —— 别林斯基</blockquote>22222222222222222222222222222## 表格<table border="1"><tr><td>row 1, cell 1</td><td>row 1, cell 2</td></tr><tr><td>row 2, cell 1</td><td>row 2, cell 2</td></tr></table>### 跨列表格<table border="1"><tr> <th>姓名</th> <th colspan="2">电话</th></tr><tr> <td>shansan</td> <td>1329441308</td> <td>164354491</td></tr><table><h3>跨行表格</h3><table border="1"><tr> <th>姓名</th> <td>shansan</td></tr><tr> <th rowspan="2">电话</th> <td>1329441308</td></tr><tr> <td>164354491</td></tr></table> ---","categories":[{"name":"HTML","slug":"HTML","permalink":"https://yeshan333.github.io/categories/HTML/"}],"tags":[{"name":"HTML","slug":"HTML","permalink":"https://yeshan333.github.io/tags/HTML/"}]},{"title":"竖式问题","slug":"竖式问题","date":"2018-10-24T23:59:00.000Z","updated":"2018-10-24T23:59:00.000Z","comments":true,"path":"2018/10/24/竖式问题/","permalink":"https://yeshan333.github.io/2018/10/24/%E7%AB%96%E5%BC%8F%E9%97%AE%E9%A2%98/","excerpt":"字符串处理函数strchr() && 竖式问题 竖式问题","text":"字符串处理函数strchr() && 竖式问题 竖式问题 题目描述 找出所有形如abc*de(三位数乘两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。 输入: 输入一个数字集合(相邻数字之间没有空格) 输出: 输出所有竖式.每个竖式前应该编号,之后应该有一个空行。最后输出解的总数。 样例输入: 2357 样例输出: (1)  775x  33—– 23252325 —–25575The number of solution = 1 分析小学的乘法运算 1234567891011121314151617181920212223242526272829303132#include<stdio.h>#include<string.h>int main(){ int count; char s[20],buf[99]; scanf("%s",s); for(int abc = 111;abc <= 999;abc++) { for(int de = 11;de <= 99;de++) { int x = abc*(de%10),y = abc*(de/10),z = abc*de; sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z); /* - 使用sprintf()把信息输出到字符串 - strchr()函数的作用是在一个字符串中查找单个字符 */ int ok = 1; for(int i = 0;i<strlen(buf);i++) { if(strchr(s,buf[i])==NULL) ok = 0; } if(ok) { printf("(%d)\\n",++count); printf("%5d\\nx%4d\\n-----\\n%5d\\n%4d\\n-----\\n%5d\\n\\n",abc,de,x,y,z); } } } printf("The number of solutions = %d\\n",count); return 0;} 字符处理函数strchr()strchr() 用来查找某字符在字符串中首次出现的位置,其原型为: char * strchr (const char *str, int c); strchr() 将会找出 str 字符串中第一次出现的字符 c 的地址,然后将该地址返回。 如果找到指定的字符则返回该字符所在地址,否则返回 NULL。 12345678910#include<stdio.h>#include<string.h>int main(){ char *s="666shansan"; char *p; p = strchr(s,'s'); printf("%s",p); return 0;} 输出结果 shansan","categories":[{"name":"C","slug":"C","permalink":"https://yeshan333.github.io/categories/C/"}],"tags":[{"name":"C","slug":"C","permalink":"https://yeshan333.github.io/tags/C/"}]},{"title":"坑人的C++-2","slug":"坑人的C++-2","date":"2018-10-22T23:41:19.000Z","updated":"2018-10-22T23:41:19.000Z","comments":true,"path":"2018/10/22/坑人的C++-2/","permalink":"https://yeshan333.github.io/2018/10/22/%E5%9D%91%E4%BA%BA%E7%9A%84C++-2/","excerpt":"C++文件和流在C++中进行文件处理,可使用标准库fstream 它定义了三个新的数据类型,用于从文件写入流和从文件读取流 数据类型 描述 ofstream 该数据类型表示输出文件流,用于创建文件并向文件中写入信息 ifstream 该数据类型表示输入文件流,用于从文件中读取信息 fstream 该数据类型通常表示文件流,同时具有ofstream和ifstream两种功能,他可以创建文件,向文件中写入信息,从文件中读取信息","text":"C++文件和流在C++中进行文件处理,可使用标准库fstream 它定义了三个新的数据类型,用于从文件写入流和从文件读取流 数据类型 描述 ofstream 该数据类型表示输出文件流,用于创建文件并向文件中写入信息 ifstream 该数据类型表示输入文件流,用于从文件中读取信息 fstream 该数据类型通常表示文件流,同时具有ofstream和ifstream两种功能,他可以创建文件,向文件中写入信息,从文件中读取信息 打开文件ofstream和ifstream对象都可以open()函数打开文件进行写操作。open()函数是ofstream、ifstream、fstream对象的一个成员。open()函数标准语法 void open(const char *filename,ios::openmode mode) 第一个参数为要打开的文件名称和位置 第二个参数为文件打开的模式 模式标志 描述 ios::app 追加模式。所有写入都追加到文件末尾 ios::ate 文件打开后定位到文件末尾 ios::in 打开文件用于读取 ios::out 打开文件用于写入 ios::trunc 如果文件已经存在,其内容在打开文件之前被截断,即把文件长度设为0 打开模式可以两个或者多个结合使用 ofstream outfile; outfile.open("file.data",ios::out|ios::trunc) //outfile.open("file.data",ios::out|ios::in) 关闭文件C++程序终止时,它会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件。听说优秀的程序员会在程序终止前关闭打开的文件 使用close()函数 写入文件 && 读取文件 使用流插入运算符(<<)向文件写入信息,就像使用该运算符输出信息到屏幕上一样,但用的不是cout对象,而是ofstream或者fstream对象 -使用流提取运算符(>>)从文件中读取信息。这里使用的是ifstream或者fstream对象 demo12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include<iostream>#include<fstream>using namespace std;int main(){ char data[100]; //以写模式打开文件 ofstream outfile; outfile.open("afile.data");//这里使用了相对路径 cout<<"writing to the file"<<endl; cout<<"enter your name:"; cin.getline(data,100);//cin对象的附加函数,getline()从外部读取一行 //向文件写入用户输入的数据 outfile<<data<<endl; cout<<"enter your age:"; cin>>data; cin.ignore();//忽略掉之前读语句留下的多余字符 //再次向文件写入用户输入的数据 outfile<<data<<endl; outfile.close(); //以读模式打开文件 ifstream infile; infile.open("afile.data"); cout<<"reading from the file"<<endl; infile>>data; //在屏幕上读取数据 cout<<data<<endl; //再次从文件中读取数据并显示它 infile>>data; cout<<data<<endl; infile.close(); return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"坑人的C++","slug":"坑人的C++","date":"2018-10-22T23:38:58.000Z","updated":"2018-10-22T23:38:58.000Z","comments":true,"path":"2018/10/22/坑人的C++/","permalink":"https://yeshan333.github.io/2018/10/22/%E5%9D%91%E4%BA%BA%E7%9A%84C++/","excerpt":"C++自定义命名空间使用关键字namespace namespace namespace_name { //代码声明 }","text":"C++自定义命名空间使用关键字namespace namespace namespace_name { //代码声明 } 123456789101112131415161718192021222324252627282930#include<iostream>using namespace std;using std::cout;namespace print_myname{ void func() { cout<<"myname: shansan"<<endl; }}namespace print_font{ void func_1() { std::cout<<"什么鬼 !"<<endl; }}using namespace print_myname;using namespace print_font;int main(){ //print_myname::func(); func(); //print_font::func_1(); func_1(); return 0;} 不连续的命名空间 命名空间可以定义在几个不同的部分中,因此命名空间是由几个单独定义的部分组成的。一个命名空间的组成部分可以分布在多个文件中所以,如果命名空间中某个组成部分需要请求定义在另一个文件中的名称,仍然需要声明该名称。下面的命名空间可以定义一个新的命名空间,也可以是为已有的命名空间增加新的元素。 namespace namespace_name { //代码生明 } 嵌套的命名空间可以在一个命名空间中定义另一个命名空间 1234567891011121314151617181920212223242526272829#include<iostream>using namespace std;namespace my_firstname{ void print_firstname() { cout<<"shan "; } namespace my_lastname { void print_lastname() { cout<<"san"<<endl; } }}//using namespace my_firstname;using namespace my_firstname::my_lastname;int main(){ //print_firstname(); //my_lastname::print_lastname(); print_lastname(); return 0;} C++异常处理 异常是在程序执行期间产生的问题。 C++异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。 异常提供了一种转移程序控制权的方式。 C++异常处理关键字 throw:当问题出现时,程序会抛出一个异常。通过throw关键字来完成。 catch:在想要处理问题的地方,通过异常处理程序捕获异常。catch关键字用于捕获异常。 try:try块中的代码标识将被激活的特定异常。他后面通常跟着一个或者多个catch块如果您想让 catch 块能够处理 try 块抛出的任何类型的异常,则必须在异常声明的括号内使用省略号... 12345678try { //被保护代码块 } catch(...) { //能处理任何异常代码 } 12345678910111213141516171819202122232425262728293031#include<iostream>using namespace std;double division(double a,double b){ if(b == 0) { throw "Division by zero condition!"; } return (a/b);}int main(){ int a,b; double temp; scanf("%d%d",&a,&b); try { temp = division(a,b); cout<<temp<<endl; } /*由于我们抛出了一个类型为 const char* 的异常, 因此,当捕获该异常时,我们必须在 catch 块中使用 const char*。*/ catch(const char *msg) { cerr<<msg<<endl; } return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"丘一丘正则表达式","slug":"丘一丘正则表达式","date":"2018-10-18T01:51:46.000Z","updated":"2018-10-18T01:51:46.000Z","comments":true,"path":"2018/10/18/丘一丘正则表达式/","permalink":"https://yeshan333.github.io/2018/10/18/%E4%B8%98%E4%B8%80%E4%B8%98%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/","excerpt":"正则表达式(regular expression,regex,RE) 正则表达式是一种用来简洁表达一组字符串的表达式 正则表达式是一种通用的字符串表达框架 正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具 正则表达式可以用来判断某字符串的特征归属","text":"正则表达式(regular expression,regex,RE) 正则表达式是一种用来简洁表达一组字符串的表达式 正则表达式是一种通用的字符串表达框架 正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具 正则表达式可以用来判断某字符串的特征归属 正则表达式常用操作符 操作符 说明 实例 . 表示任意单个字符 py. 可以匹配pyc,pyy,py!等等 [ ] 字符集,对单个字符给出取值范围 [abc]可以匹配a或b或c;[0-9a-zA-z\\_]可以匹配一个数字、一个字母或者一个下划线 [^ ] 非字符集,对单个字符给出排除范围 [^abc]可以匹配非a或非b或非c的单个字符 * 前一个字符0次或多次扩展 abc* 可以匹配ab、abc、abcc、abccc等等 + 前一个字符的1次或多次扩展 abc+可以匹配abc、abcc、abccc等等 ? 前一个字符0次或1次扩展 abc?可以匹配ab、abc | 左右表达式任意一个 abc|def表示abc、def {m} 扩展前一个字符m次 ab{2}c匹配abbc {m,n} 扩展前一个字符m至n次数(含n) ab{1,2}c可以匹配abc、abbc ^ 匹配字符串开头 ^abc表示abc且在一个字符串的开头,^\\d表示必须以数字开头 $ 匹配字符串结尾 abc表示abc且在一个字符串的结尾、\\d$白哦是必须以数字结尾 ( ) 分组标记,内部只能使用|操作符 (abc|def)表示abc、def \\d 可以匹配一个数字,相当于[0-9] \\d{3}表示匹配3个数字,如010 \\w 可以匹配一个字母或者数字或者下划线,相当于[a-zA-Z0-9_] \\w\\w\\d可以匹配’py3’ \\s 可以匹配一个空格(也包括Tab等空白字符) \\s+表示至少有一个空格,如’ ‘、’ ‘ 精确匹配在正则表达式中,如果直接给出字符,就是精确匹配 ‘pyt’ 匹配’pyt’ ‘00\\d’ 可以匹配’007’ ‘\\w\\d’ 可以匹配’!5’ ‘ye.’ 可以匹配’yes’ ‘(P|p)python’ 可以匹配’Python’、’python’ 高阶精确匹配,经典实例 ^[A-Za-z]+$ 匹配由26个英文字母组成的字符串,如’abrg’、’abgsfsfga’ [a-zA-Z\\][0-9a-zA-Z\\]* 可以匹配由字母或者下划线开头、后接任意一个由字母、数字或者下划线组成的字符串,也就是python的合法变量 ^-?\\d+$ 匹配整数形式的字符串 ^[0-9][1-9][0-9]$ 匹配正整数形式的字符串 [1-9]\\d{5} 中国境内邮政编码,6位 [\\u4e00-\\u9fa5] 匹配中文字符 \\d{3}-\\d{8}|\\d{4}-\\d{7} 国内电话号码,010-68913536 python正则表达式模块,(Re模块) re是python的标准库,主要用于字符串匹配 re库采用raw string类型(原生字符串类型)表示正则表达式,例如r'[1-9]\\d{5}',raw string是不包含对转义符再次转义的字符串 re库也可以采用string类型表示正则表达,但是较为繁琐,例如'[1-9]\\\\d{5}' re库功能函数 函数 说明 re.search() 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象 re.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象 re.findall() 搜索字符串,以列表类型返回全部能匹配的子串 re.split() 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型 re.finditer 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象 re.sub() 在字符串中替换所有匹配正则表达式的子串,返回替换后的字符串 1. re.search(pattern,string,flags=0) 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象 pattern:正则表达式的字符串或原生字符串表示 string:待匹配字符串 flags: 正则表达式使用时的控制标记 常用标记 说明 re.I re.IGNORECASE 忽略正则表达式的大小写,[A-Z]能够匹配小写字符 re.M re.MULTILINE 正则表达式中的^操作符能够将给定字符串的每行当做匹配开始 re.s re.DOTALL 正则表达式中的.操作符能够匹配所有字符串,默认匹配除换行外的所有字符串 2. re.match(pattern,string,flags=0) 从一个字符串的开始位置起匹配正则表达式,返回match对象 pattern:正则表达式的字符串或者原生字符串表示 string:待匹配字符串 flags:正则表达式使用时的控制标记 3. re.findall(pattern,string,flags=0) 搜索字符串,以列表类型返回全部能匹配的字符串 4. re.split(pattern,string,maxsplit=0,flags=0) 将一个字符串按照正则匹配结果进行分割,返回列表类型 maxsplt:最大分割数,剩余部分作为最后一个元素输出 5. re.finditer(pattern,string,flags=0) 搜索字符串,返回一个匹配结果的迭代类型,每个迭代类型是match对象 6. re.sub(pattern,repl,string,cout=0,flags=0) 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串 repl:替换匹配字符串的字符串 cout:匹配的最大替换次数 re库的面向对象用法在python中使用正则表达式的时候,re模块内部会做两件事: 编译正则表达式,如果正则表达式本身不合法,会报错 用编译后的正则表达式去匹配字符串 regex = re.compile(pattern,flags=0) 将正则表达式的字符串形式编译成正则表达式对象 pattern:正则表达式的字符串或原生字符串表示 flags:正则表达式使用时的控制标记 compile后生成了regular expression对象,由于该1对象包含了正则表达式,所以调用对应的方法不用给出正则字符串 re库的Match对象 Match对象是一次匹配的结果,包含很多信息 Match对象的属性 属性 说明 .string 待匹配的文本 .re 匹配使用的pattern对象(正则表达式) .pos 正则表达式搜索文本的开始位置 .endpos 正则表达式搜索文本的结束位置 Match对象的方法 方法 说明 .group(0) 获得匹配后的字符串 .start() 匹配字符串在原始字符串的开始位置 .end() 匹配字符串在原始字符串的结束位置 .span() 返回(.start(),.end())一个元组 re库的贪婪匹配和最小匹配re库默认使用贪婪匹配,即匹配最长的子串 最小匹配 ** 最小匹配操作符 ** 操作符 说明 *? 前一个字符0次或者无限次扩展,最小匹配 +? 前一个字符1次或者无限次扩展,最小匹配 ?? 前一个字符0次或1次扩展,最小匹配 {m,n}? 扩展前一个字符m至n次(包含n),最小匹配 只要输出长度可能不同的,都可以通过在操作符后面加?变成最小匹配 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143193331387014ccd1040c814dee8b2164bb4f064cff000","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"爬虫","slug":"爬虫","permalink":"https://yeshan333.github.io/tags/%E7%88%AC%E8%99%AB/"},{"name":"正则表达式","slug":"正则表达式","permalink":"https://yeshan333.github.io/tags/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/"}]},{"title":"C++面向对象-7","slug":"C++-面向对象-7","date":"2018-10-16T23:39:00.000Z","updated":"2018-10-16T23:39:00.000Z","comments":true,"path":"2018/10/16/C++-面向对象-7/","permalink":"https://yeshan333.github.io/2018/10/16/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-7/","excerpt":"数据抽象 数据抽象(data abstraction)是与面向对象(object-oriented)并列的一种编程范式(programming paradigm)。数据抽象也成为抽象数据类型(abstract data type/ADT)。数据抽象是一种依赖于接口和实现分离的编程(设计)技术。 https://wizardforcel.gitbooks.io/sicp-py/content/2.2.htmlhttp://wj196.iteye.com/blog/860303https://blog.csdn.net/Solstice/article/details/6707148 C++类为数据抽象提供了可能。它们向外界提供了大量用于操作对象数据的公共方法,也就是说,外界实际上并不清楚类的内部实现。数据抽象仅为用户暴露接口,而把具体的实现隐藏了起来","text":"数据抽象 数据抽象(data abstraction)是与面向对象(object-oriented)并列的一种编程范式(programming paradigm)。数据抽象也成为抽象数据类型(abstract data type/ADT)。数据抽象是一种依赖于接口和实现分离的编程(设计)技术。 https://wizardforcel.gitbooks.io/sicp-py/content/2.2.htmlhttp://wj196.iteye.com/blog/860303https://blog.csdn.net/Solstice/article/details/6707148 C++类为数据抽象提供了可能。它们向外界提供了大量用于操作对象数据的公共方法,也就是说,外界实际上并不清楚类的内部实现。数据抽象仅为用户暴露接口,而把具体的实现隐藏了起来 数据抽象的两个优势 类的内部受到保护,不会因为无意的用户级错误导致对象状态受损。 类实现可能随着时间的推移而发生变化,以便应对不断变化的需求,或者应对哪些不改变用户级代码的错误报告。 1234567891011121314151617181920212223242526272829303132333435363738//example://demo#include<iostream>using namespace std;class Student{ private: //对外隐藏的数据 int num; int score; public: //构造函数 Student() { cout<<"Constructor called !"<<endl; } //对外的接口 int SetNum(int number) { this->num = number; return num; } //对外的接口 int SetScore(int s) { this->score = s; return score; }};int main(){ Student A; cout<<A.SetScore(20)<<endl; cout<<A.SetNum(17001)<<endl; return 0;} 数据封装 数据封装是一种把数据和操作数据的函数捆绑在一起的机制。C++程序中,任何带有公有和私有成员的类都可以作为数据封装和数据抽象的实例 1234567891011121314151617181920212223242526272829303132333435363738#include<iostream>using namespace std;class Adder//求和类{ private: //对外隐藏的数据,数据隐藏 int total; public: Adder(int i=0) { total = i; } //对外接口 void addNum(int number) { total += number; } //对外接口 int getTotal() { return total; }};int main(){ Adder A; A.addNum(10); A.addNum(33); cout<<"Total: "<<A.getTotal()<<endl; return 0;}/*- 公有成员addNum和getTotal是对外的接口,用户需要知道他们以便使用类。- 私有成员total是对外的隐藏,用户不需要了解它,但它又是类能正常工作所必须的。*/ 接口(抽象类)如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。抽象类是一种只能定义,不能生成对象的类。 抽象类不能用于实例化对象,只能作为接口使用 如果一个抽象类的子类需要被实例化,则必须实现每个虚函数。即必须在派生类中重载虚函数 接口描述了类的行为和功能,而不需要完成类的特定实现 用于实例化对象的类被称为具体类 抽象类的派类依然可以不完善基类中的纯虚函数,继续作为抽象类被派生,知道给出所有的纯虚函数定义,则成为一个具体类,才可以实例化对象 抽象类因为抽象、无法具化,所以不能作为参数类型、返回值、强转类型 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455//example:#include<iostream>using namespace std;class Shape{ //基类 protected: int width; int height; public: //提供接口框架的纯虚函数 virtual int getArea() = 0; void setWidth(int w) { this->width = w; } void setHeight(int h) { this->height = h; }};//派生类class Rectangle:public Shape{ public: int getArea() { return width*height; }};class Triangle:public Shape{ public: int getArea() { return (width*height)/2; }};int main(){ Rectangle A; //矩形 Triangle B; //三角形 A.setHeight(3); A.setWidth(4); B.setHeight(3); B.setWidth(4); cout<<"Total Rectangle area: "<<A.getArea()<<endl; cout<<"Total Triangle area: "<<B.getArea()<<endl; return 0;} total 数据抽象是一种仅向用户暴露接口而把具体实现细节隐藏起来的一种机制 数据封装是一种把数据和操作数据的函数捆绑在一起的机制 抽象类作为接口使用,不能用于实例化对象","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"recording","slug":"recording","date":"2018-10-16T00:27:52.000Z","updated":"2018-10-16T00:27:52.000Z","comments":true,"path":"2018/10/16/recording/","permalink":"https://yeshan333.github.io/2018/10/16/recording/","excerpt":"辽宁一分钟harage","text":"辽宁一分钟harage 四川一分钟 湖北一分钟 西藏一分钟 云南一分钟 山东一分钟 河南一分钟 陕西一分钟 江西一分钟 深圳一分钟 宁夏一分钟 贵州一分钟 重庆一分钟 江苏一分钟","categories":[],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"定向爬虫-中国大学MOOC-python网络爬虫实例","slug":"定向爬虫-中国大学MOOC-python网络爬虫实例","date":"2018-10-15T23:48:56.000Z","updated":"2018-10-15T23:48:56.000Z","comments":true,"path":"2018/10/15/定向爬虫-中国大学MOOC-python网络爬虫实例/","permalink":"https://yeshan333.github.io/2018/10/15/%E5%AE%9A%E5%90%91%E7%88%AC%E8%99%AB-%E4%B8%AD%E5%9B%BD%E5%A4%A7%E5%AD%A6MOOC-python%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB%E5%AE%9E%E4%BE%8B/","excerpt":"定向爬虫:仅对输入URL进行爬取,不扩展爬取中国大学排名2018","text":"定向爬虫:仅对输入URL进行爬取,不扩展爬取中国大学排名2018 format格式化输出 看下所需信息位置 程序大体框架12345678910111213141516171819202122import requestsfrom bs4 import BeautifulSoupdef getHTMLText(url): return ""def fillUnivList(ulist,html): passdef printUnivList(ulist,num): print("Suc"+str(num))def main(): uinfo = [] url = "" html = getHTMLText(url) fillUnivList(uinfo,html) printUnivList(uinfo,10)main() getHTMLText()12345678def GetHTMLText(url): #获取网页内容 try: r = requests.get(url) r.raise_for_status() #用于捕获异常 r.encoding = r.apparent_encoding return r.text except: return "" fillUnivList()12345678def fillUnivList(ulist, html): # 把网页内容放到数据结构中 soup = BeautifulSoup(html,"html.parser") '''一个tr标签存放一所大学的信息''' for tr in soup.find("tbody").children: if isinstance(tr,bs4.element.Tag): #仅仅遍历标签,过滤掉非标签类型的其它信息 tds = tr('td') #将所有的td标签存放到列表tds中,等价于tr.find_all('td')返回一个列表类型 '''由于进行了遍历,使用print打印tds会得到多个列表''' ulist.append([tds[0].string, tds[1].string, tds[3].string])#向ulist中增加所需要的信息 printUnivList()12345def printUnivlist(ulist, num): print("{:^10}\\t{:^6}\\t{:^10}".format("排名","学校","总分")) for i in range(num): u = ulist[i] print("{:^10}\\t{:^6}\\t{:^10}".format(u[0],u[1],u[2])) main1234567891011121314151617181920212223242526272829303132333435363738import requestsimport bs4 # 用到instancefrom bs4 import BeautifulSoupdef GetHTMLText(url): #获取网页内容 try: r = requests.get(url) r.raise_for_status() #用于捕获异常 r.encoding = r.apparent_encoding return r.text except: return ""def fillUnivList(ulist, html): # 把网页内容放到数据结构中 soup = BeautifulSoup(html,"html.parser") '''一个tr标签存放一所大学的信息''' for tr in soup.find("tbody").children: if isinstance(tr,bs4.element.Tag): #仅仅遍历标签,过滤掉非标签类型的其它信息 tds = tr('td') #将所有的td标签存放到列表tds中,等价于tr.find_all('td')返回一个列表类型 '''由于进行了遍历,使用print打印tds会得到多个列表''' ulist.append([tds[0].string, tds[1].string, tds[3].string])#向ulist中增加所需要的信息def printUnivlist(ulist, num): print("{:^10}\\t{:^6}\\t{:^10}".format("排名","学校","总分")) for i in range(num): u = ulist[i] print("{:^10}\\t{:^6}\\t{:^10}".format(u[0],u[1],u[2]))def main(): uinfo = [] url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html" html = GetHTMLText(url) fillUnivList(uinfo,html) printUnivlist(uinfo,10)main() 代码优化,使用chr(12288)解决中文对齐问题1234567891011121314151617181920212223242526272829303132333435363738394041424344454647import requestsimport bs4 # 用到instancefrom bs4 import BeautifulSoupdef GetHTMLText(url): #获取网页内容 try: r = requests.get(url) r.raise_for_status() #用于捕获异常 r.encoding = r.apparent_encoding return r.text except: return ""def fillUnivList(ulist, html): # 把网页内容放到数据结构中 soup = BeautifulSoup(html,"html.parser") '''一个tr标签存放一所大学的信息''' for tr in soup.find("tbody").children: if isinstance(tr,bs4.element.Tag): #仅仅遍历标签,过滤掉非标签类型的其它信息 tds = tr('td') #将所有的td标签存放到列表tds中,等价于tr.find_all('td')返回一个列表类型 '''由于进行了遍历,使用print打印tds会得到多个列表''' ulist.append([tds[0].string, tds[1].string, tds[3].string])#向ulist中增加所需要的信息'''def printUnivlist(ulist, num): print("{:^10}\\t{:^6}\\t{:^10}".format("排名","学校","总分")) for i in range(num): u = ulist[i] print("{:^10}\\t{:^6}\\t{:^10}".format(u[0],u[1],u[2]))''''''优化输出格式,中文对齐问题,使用chr(12288)表示一个中文空格,utf-8编码'''def printUnivlist(ulist, num): tplt = "{0:^10}\\t{1:{3}^10}\\t{2:^10}" #输出模板,{3}使用format函数第三个变量进行填充,即使用中文空格进行填充 print(tplt.format("排名","学校","总分",chr(12288))) for i in range(num): u = ulist[i] print(tplt.format(u[0],u[1],u[2],chr(12288)))def main(): uinfo = [] url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html" html = GetHTMLText(url) fillUnivList(uinfo,html) printUnivlist(uinfo,10)main()","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"爬虫","slug":"爬虫","permalink":"https://yeshan333.github.io/tags/%E7%88%AC%E8%99%AB/"}]},{"title":"Eyes candy","slug":"Eyes-candy","date":"2018-10-15T23:28:16.000Z","updated":"2018-10-15T23:28:16.000Z","comments":true,"path":"2018/10/15/Eyes-candy/","permalink":"https://yeshan333.github.io/2018/10/15/Eyes-candy/","excerpt":"","text":"","categories":[],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"C++面向对象-6","slug":"C++-面向对象-6","date":"2018-10-14T23:30:27.000Z","updated":"2018-10-14T23:30:27.000Z","comments":true,"path":"2018/10/14/C++-面向对象-6/","permalink":"https://yeshan333.github.io/2018/10/14/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-6/","excerpt":"C++多态C++的多态意味着调用成员函数时,会根据调用的对象的类型来执行不同的函数 编译时的多态,编译时就确定了具体的操作过程。运行时的多态,程序运行过程中才确定的操作过程。操作的过程即称为联编,也称为绑定。","text":"C++多态C++的多态意味着调用成员函数时,会根据调用的对象的类型来执行不同的函数 编译时的多态,编译时就确定了具体的操作过程。运行时的多态,程序运行过程中才确定的操作过程。操作的过程即称为联编,也称为绑定。 静态联编(早绑定),在编译和连接时确认的。比如函数重载,函数模板。效率高 动态联编(后期绑定),运行的时候才能确定是哪块代码段。灵活 静态联编函数调用在程序执行前就准备好了 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include<iostream>#define PI 3.1415926using namespace std;class Point{ private: int x; int y; public: Point(int x=0,int y=0) { this->x=x; this->y=y; } double area() { return 0.0; }};class Circle: public Point{ private: int r; public: Circle(int x,int y,int R):Point(x,y)//基基类中有带参数的构造函数,派生类中的构造函数需要自定义 { this->r=R; } double area() { return r*r*PI; }};int main(){ Point A(3,3);//一个点 Circle B(3,3,3); //一个圆 cout<<A.area()<<endl; cout<<B.area()<<endl; Point *ptr; //Point类型的指针 ptr = &B; //指向了Circle类型 cout<<ptr->area()<<endl;//输出结果不理想 return 0;} 第三个cout输出0的原因:编译器在编译时就依据ptr的类型来执行那个are,指针ptr虽然指向了Circle类型的B,但是指针ptr为Point类型,所以执行Point类里的are方法。这里实行的即为静态编译。此时编译器看的是指针的类型而非内容。 动态编译使用虚函数进行动态联编。程序在任意点可以根据所调用的对象类型来选择调用的函数,这种操作即为动态联编,也成为后期绑定。 虚函数在基类中使用virtual关键字进行声明的函数。 virtual 函数返回值 函数名(形参) { 函数体 } 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include<iostream>#define PI 3.1415926using namespace std;class Point{ private: int x; int y; public: Point(int x=0,int y=0) { this->x=x; this->y=y; } virtual double area() { return 0.0; }};class Circle: public Point{ private: int r; public: Circle(int x,int y,int R):Point(x,y)//基基类中有带参数的构造函数,派生类中的构造函数需要自定义 { this->r=R; } double area() { return r*r*PI; }};int main(){ Point A(3,3);//一个点 Circle B(3,3,3); //一个圆 cout<<A.area()<<endl; cout<<B.area()<<endl; Point *ptr; //Point类型的指针 ptr = &B; cout<<ptr->area()<<endl; cout<<(*ptr).area()<<endl; return 0;} 纯虚函数在基类中不能对虚函数给出有意义的实现,这时侯就使用到了纯虚函数。包含纯虚函数的类是抽象类。抽象类至少包含一个纯虚函数。 定义方式: virtual 返回值 函数名(形参) = 0; 虚析构函数 在C++中,不能把构造函数定义为虚构造函数,因为在实例化一个对象时才会调用构造函数,而且虚函数的实现,其实际本质是通过一个虚函数表指针来调用的,还没有对象更没有没内存空间当然无法调用,故没有实例化一个对象之前的构造函数没有意义也不能实现。析构函数可以为虚函数,而且大多数时候都声明为虚析构函数。这样就可以在基类的指针指向派生类的对象在释放时,可以根据所指向的对象类型动态联编调用子类的析构函数,实现真正的对象内存释放。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include<iostream>using namespace std;class Point{ private: int x; int y; int *str; public: Point(int x=0,int y=0) { this->x=x; this->y=y; str = new int[100]; } ~Point() { delete []str; cout<<"Called Point's Destructor and Delete str !"<<endl; }};class Circle:public Point{ private: int r; int *str; public: Circle(int x,int y,int r):Point(x,y) { this->r=r; str = new int[100]; } ~Circle() { delete []str; cout<<"Called Circle's Destructor and Delete str !"<<endl; }};int main(){ Point *p; p = new Circle(10,10,20); delete p; return 0;} 仅调用了基类的析构函数,这样一来派生类中new出来的4*100字节的内存就会残留,造成内存泄漏!","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"Just relax","slug":"Just-relax","date":"2018-10-13T23:44:56.000Z","updated":"2018-10-13T23:44:56.000Z","comments":true,"path":"2018/10/13/Just-relax/","permalink":"https://yeshan333.github.io/2018/10/13/Just-relax/","excerpt":"","text":"![](https://i.imgur.com/SHZN1xr.jpg)","categories":[],"tags":[{"name":"Astronomy","slug":"Astronomy","permalink":"https://yeshan333.github.io/tags/Astronomy/"}]},{"title":"C++面向对象-5","slug":"C++-面向对象-5","date":"2018-10-12T18:54:32.000Z","updated":"2018-10-12T18:54:32.000Z","comments":true,"path":"2018/10/12/C++-面向对象-5/","permalink":"https://yeshan333.github.io/2018/10/12/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-5/","excerpt":"派生类的构造函数attention: 在创建一个派生类的时候,系统会先创建一个基类。 派生类会吸收基类的全部成员,但不包括构造函数和析构函数。 派生类在调用自己的构造函数之前,会先调用基类的构造函数。","text":"派生类的构造函数attention: 在创建一个派生类的时候,系统会先创建一个基类。 派生类会吸收基类的全部成员,但不包括构造函数和析构函数。 派生类在调用自己的构造函数之前,会先调用基类的构造函数。 1234567891011121314151617181920212223242526272829303132333435#include<iostream>using namespace std;class Clock{ private: int h; int m; int s; public: Clock() { cout<<"Clock's consturctor called !"<<endl; }};class AlarmClock:public Clock{ private: int ah; int am; int as; public: AlarmClock() { cout<<"AlarmClock's constructor called!"<<endl; }};int main(){ AlarmClock A; return 0;} 当基类的构造函数带参的时候,派生类的构造函数应该这么定义: 派生类狗制造函数名字(总形参表列):基类构造函数(实参表类) //注意这里基类的构造函数用了是实际参数 一但基类中有带参数的构造函数,派生类则必须有显式传参的派生类构造函数,来实现基类中参数的传递,完成初始化工作 1234567891011121314151617181920212223242526272829303132333435363738394041424344#include<iostream>using namespace std;class Clock{ private: int h; int m; int s; public: Clock() { cout<<"Clock's constructor called"<<endl; } Clock(int h,int m,int s) { cout<<"Clock's consturctor with paramter called !"<<endl; }};class AlarmClock:public Clock{ private: int ah; int am; int as; public: AlarmClock() { cout<<"AlarmClock's constructor called!"<<endl; } AlarmClock(int h,int m,int s):Clock(h,m,s) { cout<<"AlarmClock's constructor with paramter called!"<<endl; }};int main(){ AlarmClock A; AlarmClock B(20,47,55); return 0;} 派生类的析构函数构造函数调用顺序:基类->派生类析构函数调用顺序:派生类->基类 123456789101112131415161718192021222324252627282930313233343536373839404142#include<iostream>using namespace std;class Clock{ private: int h; int m; int s; public: Clock() { cout<<"Clock's consturctor called !"<<endl; } ~Clock() { cout<<"Clock's destructor called !"<<endl; }};class AlarmClock:public Clock{ private: int ah; int am; int as; public: AlarmClock() { cout<<"AlarmClock's constructor called !"<<endl; } ~AlarmClock() { cout<<"AlarmClock's destructor called !"<<endl; }};int main(){ AlarmClock A; return 0;} 虚基类,使用virtual进行声明 虚继承的出现成为了解决多继承中二义性问题的一种方式 如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员,这时就产生了二义性问题。 123456789101112131415161718192021222324252627282930#include<iostream>using namespace std;class grandfather{ public: int key;};class father_1:public grandfather{};class father_2:public grandfather{};class grandson:public father_1,public father_2{};int main(){ grandson A; A.key = 10; //[Error] return 0;} 在继承的时候在继承类型public之前用virtual修饰一下 虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。 为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类。否则仍然会出现对基类的多次继承。 1234567891011121314151617181920212223242526272829303132#include<iostream>#include<cstdio>using namespace std;class grandfather{ public: int key;};class father_1:virtual public grandfather{};class father_2:virtual public grandfather{};class grandson:public father_1,public father_2{};int main(){ grandson A; A.key = 10; printf("%d",A.key); return 0;} https://www.cnblogs.com/yiranlaobaitu/p/3764422.htmlhttps://blog.csdn.net/bxw1992/article/details/77726390","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"天文学学习记录","slug":"XXX","date":"2018-10-12T16:07:01.000Z","updated":"2018-10-12T16:07:01.000Z","comments":true,"path":"2018/10/12/XXX/","permalink":"https://yeshan333.github.io/2018/10/12/XXX/","excerpt":"图床已挂,需要跨越 G-F-W","text":"图床已挂,需要跨越 G-F-W","categories":[],"tags":[{"name":"Astronomy","slug":"Astronomy","permalink":"https://yeshan333.github.io/tags/Astronomy/"}]},{"title":"信息标记","slug":"信息标记","date":"2018-10-12T00:43:58.000Z","updated":"2019-01-01T00:00:00.000Z","comments":true,"path":"2018/10/12/信息标记/","permalink":"https://yeshan333.github.io/2018/10/12/%E4%BF%A1%E6%81%AF%E6%A0%87%E8%AE%B0/","excerpt":"信息标记的三种形式 XML(eXtensible Markup Language) YAML(YAML Ain’t Markup Language) JSON(JaveScript Object Notation)","text":"信息标记的三种形式 XML(eXtensible Markup Language) YAML(YAML Ain’t Markup Language) JSON(JaveScript Object Notation) XML使用标签标记信息的表达形式 1234567891011<people> <!--这是注释--> <firstname>Shan</firstname> <lastname>Ye</lastname> <address> <streetAddre>None</streetAddre> <city>Gui Lin</city> <zipcode>541004</zipcode> </address> <prof>boy</prof><prof>boring</prof></people> JSON有类型键值对标记信息的表达形式 1234567891011{ "firstname": "Shan", "lastname" : "Ye", "address": { "streetAddre":"None", "city": "Gui Lin", "zipcode": "541004" }} YML无类型键值对标记信息的表达形式 1234567891011121314firstname: Shanlastname: Yeaddress: #缩进表达所属关系 streetAddre: None city: Gui Lin zipcode: 541004prof: #this is a comment-boy #并列关系-boringtext: | #整块数据ACM国际大学生程序设计竞赛(英文全称:ACM International Collegiate Programming Contest(简称ACM-ICPC或ICPC))是由国际计算机协会(ACM)主办的,一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛。经过近40年的发展,ACM国际大学生程序设计竞赛已经发展成为全球最具影响力的大学生程序设计竞赛。赛事目前由IBM公司赞助。 123456789101112131415'''提取HTMl中的所有信息(1)搜索到所有的<a>标签(2)解析<a>标签格式,提取href后的链接内容'''import requestsfrom bs4 import BeautifulSoupurl = "http://python123.io/ws/demo.html"r = requests.get(url)demo = r.textsoup = BeautifulSoup(demo,"html.parser")for link in soup.find_all('a'): print(link.get("href")) 基于bs4库的信息提取的一般方法<>.find_all()方法<>.find_all(name,attrs,recursive,string,**kwargs) name: 对应标签名称的检索字符串 attrs:对应标签属性值的检索字符串,可标注属性检索 recursive:是否对子孙全部检索,默认为True string:<>…</>字符串区域的检索字符串 soup.find_all(…)等价于soup(…).find_all(…)等价于(…) 扩展方法 方法 说明 <>.find() 搜索且只返回一个结果,同.find_all()参数 <>.find_parents() 在先辈节点中搜索,返回列表类型,同.find_all()参数 <>.find_parent() 在先辈节点中返回一个结果,同.find()参数 <>.find_next_siblings() 在后续平行节点中搜索,返回一个列表,同.find_all()参数 <>.find_next_sibling() 在后续节点中返回一个结果,用.find()参数 <>find_previous_siblings() 在前续平行结点中搜索,返回列表类型,同.find_all()参数 <>find.previous_sibling() 在前续节点中返回一个节点,同.find()参数","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"爬虫","slug":"爬虫","permalink":"https://yeshan333.github.io/tags/%E7%88%AC%E8%99%AB/"},{"name":"信息标记","slug":"信息标记","permalink":"https://yeshan333.github.io/tags/%E4%BF%A1%E6%81%AF%E6%A0%87%E8%AE%B0/"}]},{"title":"C++面向对象-4","slug":"C++-面向对象-4","date":"2018-10-11T00:40:05.000Z","updated":"2018-10-11T00:40:05.000Z","comments":true,"path":"2018/10/11/C++-面向对象-4/","permalink":"https://yeshan333.github.io/2018/10/11/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-4/","excerpt":"继承和派生 新类拥有原有类的全部属性为继承!原有类产生新类的过程为派生。 原有类称为基类,产生的新类称为派生类。http://www.dotcpp.com/course/cpp/200027.html 继承方式(派生权限) 公有继承 私有继承 保护继承","text":"继承和派生 新类拥有原有类的全部属性为继承!原有类产生新类的过程为派生。 原有类称为基类,产生的新类称为派生类。http://www.dotcpp.com/course/cpp/200027.html 继承方式(派生权限) 公有继承 私有继承 保护继承 公有继承 基类中的公有成员,在派生类中仍然为公有成员。无论派生类的成员函数还是成员对象都可以访问。 基类中的私有成员,无论在派生类的成员还是派生类对象都不可以访问。 基类中的保护成员,在派生类中仍然是保护类型,可以通过派生类的成员函数访问,但派生类对象不可以访问! 私有继承 基类中的公有和受保护类型,被派生类私有吸收后,都变为派生类的私有类型,即在类的成员函数里可以访问,不能在类外访问。 基类的私有成员,在派生类类内和类外都不可以访问。 保护继承 基类的公共成员和保护类型成员在派生类中为保护成员。 基类的私有成员在派生类中不能被直接访问。 123456789101112131415161718192021222324252627282930313233343536373839404142434445#include<iostream>using namespace std;class Student //基类{ private: int number; public: int Set(int number) { this->number=number; return 0; } int Show() { cout<<"he or she number:"<<number<<endl; }};class Score:public Student //公有继承,派生类{ private: int score; public: int set_score(int score) { this->score=score; return 0; } int show_score() { cout<<"the score is :"<<score<<endl; return 0; }};int main(){ Score A; A.Set(17007101); A.Show(); A.set_score(99); A.show_score(); return 0;} 多继承一个子类可以有多个父类,继承多个父类的特性 class <派生类名>:<继承方式><基类名1>,<继承方式><基类名2>,…{派生类类体} 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657#include<iostream>using namespace std;class Shape{ public: void setWidth(int w) { width = w; } void setHight(int h) { height = h; } protected: int width; int height;};class PaintCost{ public: int GetCost(int area) { return area*70; }};class Rectangle: public Shape,public PaintCost //派生类{ public: int getArea() { return (width*height); }};int main(){ Rectangle Rect; int area; Rect.setWidth(10); Rect.setHight(3); area = Rect.getArea(); //输出对象面积 cout<<"Total area: "<<Rect.getArea()<<endl; //输出总花费 cout<<"Total paint cost: "<<Rect.GetCost(area)<<endl; return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"浅尝BeautifulSoup","slug":"浅尝BeautifulSoup","date":"2018-10-10T18:03:59.000Z","updated":"2018-10-10T18:03:59.000Z","comments":true,"path":"2018/10/10/浅尝BeautifulSoup/","permalink":"https://yeshan333.github.io/2018/10/10/%E6%B5%85%E5%B0%9DBeautifulSoup/","excerpt":"12345678910111213141516import requestsfrom bs4 import BeautifulSoup #引入BeautifulSoup类url = "https://python123.io/ws/demo.html"r = requests.get(url)print(r.status_code)print("\\n")#demo = r.text #html格式信息#soup = BeautifulSoup(demo,"html.parser")#使用html.parser对demo进行html解析soup = BeautifulSoup(open(r"C:\\Users\\Administrator\\Desktop\\beautifulsoup\\demo.html"))print(soup.prettify()) BeautifulSoup官方文档","text":"12345678910111213141516import requestsfrom bs4 import BeautifulSoup #引入BeautifulSoup类url = "https://python123.io/ws/demo.html"r = requests.get(url)print(r.status_code)print("\\n")#demo = r.text #html格式信息#soup = BeautifulSoup(demo,"html.parser")#使用html.parser对demo进行html解析soup = BeautifulSoup(open(r"C:\\Users\\Administrator\\Desktop\\beautifulsoup\\demo.html"))print(soup.prettify()) BeautifulSoup官方文档 BeautifulSoup库解析器 解析器 使用方法 条件 bs4的HTML解析器 beautiful(mk,”html.parser”) 安装bs4库 lxml的HTML解析器 BeautifulSoup(mk,”lxml”) 安装lxml库 lxml的xml解析器 BeautifulSoup(mk,”xml”) 安装lxml库 html5lib的解析器 BeautifulSoup(mk,”html5lib”) 安装html5lib库 BeautifulSoup库的基本元素 基本元素 说明 Tag 标签,最基本的信息组织单元,分别用<></>标明开头和结尾 Name 标签的名字,<p>...</p>的名字是‘p’,格式:<tag>.name Attributes 标签的属性,字典形式组织,格式:<tag>.attrs NavigableString 标签内非属性字符串,<>…</>中字符串,格式:<tag>.string Comment 标签内字符串的注释部分,一种特殊的Comment类型 123456789101112# Tag的Comment元素from bs4 import BeautifulSoupsoup = BeautifulSoup("<b><!--This is a comment--></b><p>This is not a comment</p>","html.parser")print(soup.b.string)print(type(soup.b.string))print(soup.p.string)print(type(soup.p.string)) BeautifulSoup对应一个HTML/XML文档的全部内容 任何存在于HTMl语法中的标签都可以用soup.<tag>访问获得,当HTML文档中存在多个相同<tag>对应内容时,soup.<tag>返回第一个 每个<tag>都有自己的名字,通过<tag>.name获取,字符串类型 一个<tag>可以有0或多个属性,字典类型 NavigableString可以跨越多个层次 基于bs4库的HTML内容遍历方法 标签数的下行遍历 属性 说明 .contents 子节点的列表,将所有儿子节点存人列表 .children 子节点的迭代类型,于.contents类似,用于循环遍历儿子节点 .descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历 12345678910111213141516171819# 标签树的下行遍历import requestsfrom bs4 import BeautifulSoupurl = "https://python123.io/ws/demo.html"r = requests.get(url)demo = r.textsoup = BeautifulSoup(demo,"html.parser")'''for child in soup.body.children: #遍历儿子节点 print(child)'''for child in soup.body.descendants: #遍历子孙节点 print(child) 标签树的上行遍历 属性 说明 .parent 节点的父亲标签 .parents 节点先辈标签的的迭代类型,用于循环遍历先辈节点 123456789101112131415161718# 标签树的上行遍历import requestsfrom bs4 import BeautifulSoupurl = "https://python123.io/ws/demo.html"r = requests.get(url)demo = r.textsoup = BeautifulSoup(demo,"html.parser")for parent in soup.a.parents: #遍历所有先辈节点,包括soup本身,soup的先辈不存在name信息 if parent is None: print(parent) else: print(parent.name) 标签树的平行遍历平行遍历发生在同一个父节点下的各节点之间 属性 说明 .next_sibling 返回按照HTML文本顺序的下一个平行节点标签 .previous_sibling 返回按照HTML文本顺序的上一个平行节点标签 .next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签 .previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签 123456789101112131415161718# 标签树的平行遍历import requestsfrom bs4 import BeautifulSoupurl = "https://python123.io/ws/demo.html"r = requests.get(url)demo = r.textsoup = BeautifulSoup(demo,"html.parser")for sibling in soup.a.next_sibling: print(sibling) #遍历后续节点'''for sibling in soup.a.previous_sibling: print(sibling) #遍历前续节点''' 基于bs4库的HTML格式输出—prettify()方法 .prettify()为HTML文本<>及其内容增加’\\n’ .prettify()可用于标签,方法:<tag>.perttify() bs4库将任何HTML输入都变成utf-8编码","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"爬虫","slug":"爬虫","permalink":"https://yeshan333.github.io/tags/%E7%88%AC%E8%99%AB/"},{"name":"BeautifulSoup","slug":"BeautifulSoup","permalink":"https://yeshan333.github.io/tags/BeautifulSoup/"}]},{"title":"C++面向对象-3","slug":"C++-面向对象-3","date":"2018-10-09T00:12:54.000Z","updated":"2018-10-09T00:12:54.000Z","comments":true,"path":"2018/10/09/C++-面向对象-3/","permalink":"https://yeshan333.github.io/2018/10/09/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-3/","excerpt":"友元函数和友元类 友元的对象可以是全局的一般函数,也可以是其它类里的成员函数,这种叫做友元函数。友元还可以是一个类,这种叫做友元类,这时整个类的所有成员都是友元","text":"友元函数和友元类 友元的对象可以是全局的一般函数,也可以是其它类里的成员函数,这种叫做友元函数。友元还可以是一个类,这种叫做友元类,这时整个类的所有成员都是友元 一、友元函数 类的友元函数定义在类的外部,但是有权访问类的所有私有成员和保护成员。但友元函数并不是成员函数。 有元函数的声明使用friend关键字 12345678910111213141516171819202122232425262728293031323334353637383940414243#include<iostream>#include<math.h>using namespace std;class Point{ private: double x; double y; public: Point(double a,double b) //Constructor { x=a; y=b; } int GetPoint() { cout<<"("<<x<<","<<y<<")"<<endl; return 0; } friend double Distance(Point &a,Point &b);//声明友元函数};double Distance(Point &a,Point&b){ double xx; double yy; xx = a.x-b.x; yy = a.y-b.y; return sqrt(xx*xx+yy*yy);}int main(){ Point A(2.0,3.0); Point B(1.0,2.0); A.GetPoint(); B.GetPoint(); double dis; dis = Distance(A,B); cout<<dis<<endl; return 0;} 友元函数没有this指针,参数的情况; 要访问非static成员时,需要对象做参数 要访问static成员或全局变量时,则不需要对象做参数 如果做参数的对象时全局对象,则不需要对象做参数,可直接调用友元函数,不需要通过对象或指针。 二、友元类把一个类A声明为另一个类B的友元类,则类A中的所有成员函数都可以访问类B中的成员。在类B中声明即可。 friend class A; 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include<iostream>#include<Cmath>using namespace std;class Point{ private: double x; double y; public: Point(double a,double b)//Constructor { x=a; y=b; } int GetPoint() { cout<<"("<<x<<","<<y<<")"<<endl; return 0; } friend class Tool;//声明友元类};class Tool{ public: double Get_x(Point &A ) { return A.x; } double Get_y(Point &A) { return A.y; } double Distance(Point &A) //求一点到原点的距离 { cout<<sqrt(A.x*A.x+A.y*A.y)<<endl; return sqrt(A.x*A.x+A.y*A.y); }} ;int main(){ Point A(3.0,3.0); A.GetPoint(); Tool T; T.Get_x(A); T.Get_y(A); T.Distance(A); return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"C++面向对象-2","slug":"C++-面向对象-2","date":"2018-10-06T16:20:16.000Z","updated":"2018-10-06T16:20:16.000Z","comments":true,"path":"2018/10/06/C++-面向对象-2/","permalink":"https://yeshan333.github.io/2018/10/06/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-2/","excerpt":"类的构造函数(Constructor)和析构函数(Destructor)","text":"类的构造函数(Constructor)和析构函数(Destructor) 构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。构造函数的名称与类的名称是完全相同的,并且不会反回任何类型,也不会反回void。 析构函数也是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。函数名称与类的名称完全相同,只是在前面加了个~波浪线作为前缀,它不会返回任何值,也不能带有任何参数。 1.构造函数(Constructor)  当我们定义一个类的对象时,系统就会自动调用它,进行专门的初始化对象用。如果我们没有定义构造函数,系统会默认生成一个默认形式,隐藏着的构造函数,这个构造函数的函数体是空的,它不具有任何功能。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include<iostream>#include<Cstring>using namespace std;class Student{ private: int num; char name[100]; int score; public: Student(int n,char *str,int s); int print(); int Set(int n,char *str,int s);};Student::Student(int n,char *str,int s)//定义了一个带默认参数的构造函数{ num=n; strcpy(name,str); score=s; cout<<"Constructor"<<endl;}int Student::print(){ cout<<num<<" "<<name<<" "<<score; return 0;}int Student::Set(int n,char *str,int s){ num=n; strcpy(name,str); score=s;}int main(){ Student A(1700710135,"yeshan",99); A.print(); //Student C;这样定义对象会报错,因为我们在类中定义了一个带默认参数的构造函数 cout<<endl; Student B(1700710134,"xu jie",100); B.print(); return 0;} 由于在程序中定义了一个带默认参数的构造函数,则系统不会再自动生成,这个时候定义对象时也要传入三个默认初始值,因为构造函数可以重载,可以有多个兄弟,系统会找最匹配的一个函数 2.析构函数(Destructor) 对象销毁时自动调用的一个函数,析构函数不能重载,一个类只能有一个析构函数,析构函数有助于跳出程序前释放内存。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include<iostream>#include<Cstring>using namespace std;class Student{ private: int num; char name[100]; int score; public: Student(int n,char *str,int s); ~Student(); int print(); int Set(int n,char *str,int s);};Student::Student(int n,char *str,int s)//构造函数{ num=n; strcpy(name,str); score=s; cout<<num<<" "<<name<<" "<<score<<" "; cout<<"Constructor"<<endl;}Student::~Student()//析构函数{ cout<<num<<" "<<name<<" "<<score<<" "; cout<<"destructor"<<endl;}int Student::print(){ cout<<num<<" "<<name<<" "<<score<<endl; return 0;}int Student::Set(int n,char *str,int s){ num=n; strcpy(name,str); score=s;}int main(){ Student A(100,"dot",11); Student B(101,"cpp",12); return 0;} 对象A和B的构造函数的调用顺序以及构造函数的调用顺序,完全相反!原因在于A和B对象同属局部对象,也在栈区存储,也遵循“先进后出”的顺序! 拷贝构造函数 拷贝构造函数是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。当定义一个新对象并用同一个类型的对象对它进行初始化时,将显示使用拷贝构造函。 只包含类类型成员或内置类型(但不是指针类型)成员的类,无须显式地定义拷贝构造函数也可以拷贝。 显示定义拷贝构造函数的情况: 类有数据成员是指针; 有成员表示在构造函数中分配的其他资源 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152#include<iostream>using namespace std;class Age{ public: int GetAge(void); Age(int age); //Constructor Age(const Age& A); //Copy Constructor ~Age(); //Desconstructor private: int *ptr;};Age::Age(int age){ cout<<"调用构造函数"<<endl; ptr = new int;//为指针分配内存 *ptr = age;}Age::Age(const Age& A){ cout<<"调用拷贝构造函数,并为指针ptr分配内存"<<endl; ptr = new int; *ptr = *A.ptr; //拷贝值}Age::~Age(){ cout<<"释放内存"<<endl; delete ptr;}int Age::GetAge(void){ return *ptr;}void print_age(Age A){ cout<<"the age: "<<A.GetAge()<<endl; //这里也调用了拷贝构造函数}int main(){ Age member_1(10); Age member_2(member_2);//相当于Age member_2 = member_1; return 0;} 成员变量中加一个了指针成员,初始化中需要动态开辟内存,如果不自定义拷贝构造函数,而是用默认生成的,则会出现极大的安全隐患。默认的拷贝构造函数仅仅是进行数值赋值,并不能为指针开辟内存空间。相当于代码This->str=str.本质上也就是两个指针指向了一块堆空间。程序结束回收对象的时候,会调用自己的析构函数,释放这块内存空间,由于两个对象要调用两次,即delete两次,就会出现错误 [引自](http://www.dotcpp.com/course/cpp/200020.html) C++中的this指针对象中隐藏的指针 每一个对象都能通过this指针来访问自己的地址。this指针是所有成员函数额隐含参数。因此在成员函数内部,它可以用来指向调用的对象。 如果程序中有多个属于同一类的对象,因成员函数的代码仅有一份,所以为了区分它们是哪个对象调用的成员函数,编译器也是转化成this->成员函数这种形式来使用的。 友元函数没有this指针,因为友元不是类的成员。只有成员函数才有this指针。 123456789101112131415161718192021222324252627282930313233343536#include<iostream>using namespace std;class Age{ public: Age(int your_age=18) //Constructor function { cout<<"Constructor now"<<endl; age=your_age; } int GetAge() { return age; } int compare(Age member) { return this->GetAge()>member.GetAge(); //看这里 } private: int age;};int main(){ Age member_1(20),member_2(24); if(member_1.compare(member_2)) { cout<<"member_1 is older than member_2"<<endl; } else { cout<<"member_1 is younger than member_2"<<endl; }} 关键字new和delete new(新建)用于新建一个对象。new 运算符总是返回一个指针。由 new 创建。 delete(删除)释放程序动态申请的内存空间。delete 后面通常是一个指针或者数组 [],并且只能 delete 通过 new 关键字申请的指针。","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"C++面向对象","slug":"C++-面向对象","date":"2018-10-05T23:15:07.000Z","updated":"2018-10-05T23:15:07.000Z","comments":true,"path":"2018/10/05/C++-面向对象/","permalink":"https://yeshan333.github.io/2018/10/05/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/","excerpt":"类 & 对象 类是对象的抽象和概括,而对象是类的具体和实例","text":"类 & 对象 类是对象的抽象和概括,而对象是类的具体和实例 类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。 类中的数据和方法称为类的成员。(成员有变量也有函数,分别成为类的属性和方法) 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include<iostream>#include<Cstring>using namespace std;/*class Student{ public: int num; char name[100]; int score; int print() { cout<<num<<" "<<name<<" "<<score; return 0; }};*/class Student{ public: int num; char name[100]; int score; int print();};int Student::print(){ cout<<num<<" "<<name<<" "<<score; return 0;}int main(){ Student A; A.num=1700710135; strcpy(A.name,"ye shan"); A.score=100; //A.print(); //Student *Ap; //Ap=&A; //Ap->print(); Student& A_reference=A; //引用定义时就要初始化 //A_reference=A; 错误 A_reference.print(); return 0;} 类的定义 定义一个类,本质上是定义一个数据类型的蓝图。它定义类的对象包括了什么,以及可以在这个对象上执行哪些操作。 类的定义以关键字class开头,后面跟类的名称。类的主体包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。 写法1成员函数定义在在类里 123456789101112class Student{ public: //声明公有成员,可被类的任何对象访问 int num; char name[100]; int score; int print() { cout<<num<<" "<<name<<" "<<score; return 0; }}; 写法2成员函数定义在类外,使用范围解析运算符(作用域限定符):: 在::限定符前必须使用类名 1234567891011121314class Student{ public: int num; char name[100]; int score; int print();};int Student::print(){ cout<<num<<" "<<name<<" "<<score; return 0;} 对象的建立和使用 类就是包含函数的结构体,是一种自定义数据类型,用它定义出来变量,就是对象,这就是所谓的“对象是类的具体和实例”,定义了一个这个类的对象,也可以说实例化了一个对象,就是这个意思! 声明类的对象,就像声明基本的变量类型一样 访问公共数据成员可以使用直接成员访问运算符.来访问 Student A; //声明A,类型为Student A.num=1700710135; strcpy(name,”ye shan”); A.score=100; A.print(); 类的访问修饰符 private protected public 成员和类的默认访问修饰符是private  私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员。 保护成员修饰符protected,保护成员变量或函数与私有成员十分相似,但有一点不同,保护成员变量在派生类(即子类)中是可以访问的。 公有成员在程序中类的外部是可以访问的。可以在不适用任何成员函数来设置和获取公有变量的值 1234567891011121314151617181920212223242526272829303132333435363738394041#include<iostream>#include<Cstring>using namespace std;class Student{ private: int num; protected: int score; public: char name[100]; int GetNum(int n); int GetScore(int s);};int Student::GetNum(int n){ num=n; return num;}int Student::GetScore(int s){ score=s; return score;}int main(){ Student A; strcpy(A.name,"yeshan"); cout<<"the name is"<<" "<<A.name<<endl; //A.num=1700710135,成员num是稀有的,不可这样用 cout<<"the num is"<<" "<<A.GetNum(1700710135)<<endl; cout<<"the score is"<<" "<<A.GetScore(100)<<endl; return 0;} 派生类中使用protected成员变量 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include<iostream>#include<Cstring>using namespace std;class Student{ private: int num; protected: int score; public: char name[100]; int GetNum(int n); int GetScore(int s);};class Small_Student:Student//Small_Student是派生类{ public: int Get_Score_1(int temp);};int Small_Student::Get_Score_1(int temp) //子类成员函数{ score=temp; return score;}int Student::GetNum(int n){ num=n; return num;}int Student::GetScore(int s){ score=s; return score;}int main(){ Student A; strcpy(A.name,"yeshan"); cout<<"the name is"<<" "<<A.name<<endl; //A.num=1700710135,成员num是稀有的,不可这样用 cout<<"the num is"<<" "<<A.GetNum(1700710135)<<endl; cout<<"the score is"<<" "<<A.GetScore(100)<<endl; Small_Student B; cout<<"the score is"<<" "<<B.Get_Score_1(520)<<endl; return 0;} 类的静态成员使用static关键字把类成员定义为静态的 静态成员数据 静态成员在类的所有对象中是共享的。如果不存在其它初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。 不能把静态成员放置在类的定义中,但是可以在类的外部通过使用范围解析运算符::来重新声明静态变量,从而对它进行初始化。 1234567891011121314151617181920212223242526272829303132#include<iostream>using namespace std;class Area{ private: double length; double width; public: static int object_count; Area(double x,double y) { length = x; width = y; object_count++;//每次创建对象时加一 } double Print_Area() { return length*width; }};int Area::object_count=0;//初始化类Area的静态成员int main(){ Area number_1(3,4); Area number_2(5,6); cout<<"creat "<<Area::object_count<<" object"<<endl; //使用 类名+范围解析运算符::+静态成员变量 访问静态成员数据 cout<<"the area of number_1 is "<<number_1.Print_Area();} 静态成员函数 静态成员函数即使在类对象不存在的情况下也能被调用。 静态成员函数只能访问静态数据成员,不能访问其他静态成员函数和类外部的函数 静态成员函数有一个类范围,他们不能访问类的this指针。可以用静态成员函数来判断某些对象是否已被创建。 调用时使用 类名+范围解析运算符+静态成员函数名 1234567891011121314151617181920212223242526272829303132333435363738#include<iostream>using namespace std;class Area{ private: double length; double width; public: static int object_count; //静态成员数据 static int get_count() //静态成员函数 { return object_count; } Area(double x,double y) { cout<<"Constructor"<<endl; length = x; width = y; object_count++;//每次创建对象时加一 } double Print_Area() { return length*width; }};int Area::object_count=0;//初始化类Area的静态成员int main(){ cout<<"number of objects:"<<Area::get_count()<<endl; Area number_1(3,4); Area number_2(5,6); cout<<"after creat object ,number of objects:"<<Area::get_count()<<endl; return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"C++入坑记(3)","slug":"C++-入坑记-3","date":"2018-10-04T20:44:06.000Z","updated":"2018-10-04T20:44:06.000Z","comments":true,"path":"2018/10/04/C++-入坑记-3/","permalink":"https://yeshan333.github.io/2018/10/04/C++-%E5%85%A5%E5%9D%91%E8%AE%B0-3/","excerpt":"变量初始化问题当局部变量被定义时,系统不会自动对其初始化;当全局变量被定义时,系统会初始化为下列值: 数据类型 初始化默认值 int 0 float 0 double 0 char ‘\\0’ pointer NULL","text":"变量初始化问题当局部变量被定义时,系统不会自动对其初始化;当全局变量被定义时,系统会初始化为下列值: 数据类型 初始化默认值 int 0 float 0 double 0 char ‘\\0’ pointer NULL C++储存类 auto static extern register mutable thread_local static储存类 用于指示编译器在程序的生命周期内保持局部变量的存在,而不需要每次在它进入和离开作用域时进行创建和销毁。 static修饰局部变量,可以在函数调用之间保持局部变量的值 static修饰全局变量,会使变量的作用域限制在生明它的文件内参考 1234567891011121314151617181920#include<iostream>using namespace std;static int count=10; //全局变量void func(){ static int i=5; //局部静态变量 i++; cout<<"变量i为:"<<i; cout<<",变量count为:"<<count<<endl;}int main(){ while(count--) { func(); } return 0;} extern储存类 用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。使用extern时,对于无法初始化的变量,会把变量名指向一个之前已经定义过的存储位置。当有多个文件且定义了一个就可在其他文件中使用的全局变量或函数时,可以在其他文件中使用extern来得到已定义的变量或函数的引用。 C++引用 引用变量是一个别名。它是某个已存在的变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量 引用与指针的差别 不存在空引用,引用必须连接到一块合法的内存。 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。 引用必须在创建时被初始化。指针可以在任何时间被初始化。 引用可以当成变量附属在内存的第二个标签 int i; //为i声明一个引用变量 int& r=i; 12345678910111213141516171819202122#include<iostream>using namespace std;int main(){ int i; double d; //声明引用变量 int& r=i; double& s=d; i=3; cout<<"Value of i:"<<i<<endl; cout<<"Value of i reference::"<<r<<endl; d=5.20; cout<<"d= "<<d<<endl; cout<<"Value of d reference:"<<s<<endl; return 0;} 用引用做函数形参12345678910111213141516171819202122#include<iostream>using namespace std;void swap(int& x,int& y){ int temp; temp = x; x = y; y = temp;}int main(){ int a,b; cin>>a>>b; cout<<"a="<<a<<" "<<"b="<<b<<endl; swap(a,b); cout<<"after exchange:"<<endl; cout<<"a="<<a<<" b="<<b<<endl; return 0;} 引用做返回值当函数返回一个引用时,则返回一个指向返回值的隐式指针。 1234567891011121314151617181920212223242526272829#include<iostream>#include<ctime>using namespace std;int vals[]={1,2,3,4,5};int& setValues(int i){ return vals[i];//返回第i个元素的引用}int main(){ cout<<"before change:"<<endl; for(int i=0;i<5;i++) { cout<<vals[i]<<" "; } setValues(1)=520; //change the second value setValues(3)=1314; //change the forth value cout<<endl<<"after change:"<<endl; for(int i=0;i<5;i++) { cout<<vals[i]<<" "; } return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"工具小整合","slug":"工具小整合","date":"2018-10-03T15:00:06.000Z","updated":"2018-10-03T15:00:06.000Z","comments":true,"path":"2018/10/03/工具小整合/","permalink":"https://yeshan333.github.io/2018/10/03/%E5%B7%A5%E5%85%B7%E5%B0%8F%E6%95%B4%E5%90%88/","excerpt":"","text":"百度文库、知网文章下载https://pan.baidu.com/s/1-BY2B4hBn_3wHgYlXkFLCg 百度云下载提速软件https://pan.baidu.com/s/1EYy5AN9JVv7m42f6NNmvlA 微软PE工具箱https://pan.baidu.com/s/1J1Nud9qTU6jSP6cTpk8Zlg window10数字权利激活工具 github: https://github.com/TGSAN/CMWTAT_Digital_Edition/releases https://github.com/vyvojar/slshim/releases 激活方法参考https://pan.baidu.com/s/1_VqJiuBeCHLyRp5Xcc562wkms激活工具win10下载 Gif制作工具https://pan.baidu.com/s/1Eu_O-7EPSB81cwmR-R1zvw提取码:q51n 录屏软件https://pan.baidu.com/s/1VsN5XClhZiRCqUyxbTJ_tg提取码:vlrb CamStudio汉化版提取码:kckg","categories":[],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"C++入坑记(2)","slug":"C++-入坑记-2","date":"2018-10-03T11:47:26.000Z","updated":"2018-10-03T11:47:26.000Z","comments":true,"path":"2018/10/03/C++-入坑记-2/","permalink":"https://yeshan333.github.io/2018/10/03/C++-%E5%85%A5%E5%9D%91%E8%AE%B0-2/","excerpt":"函数,默认参数的使用在C++中,允许在自定义函数的形参列表中,给形参一个默认的值,这样在调用的时候如果有实参,那么按照实参传递给形参的方法使用;若调用的时候没有指定对应的实参,则形参将使用默认值。由于参数的传递顺序是从右至左入栈,所以有默认值的参数必须在放在形参列表的最右边!","text":"函数,默认参数的使用在C++中,允许在自定义函数的形参列表中,给形参一个默认的值,这样在调用的时候如果有实参,那么按照实参传递给形参的方法使用;若调用的时候没有指定对应的实参,则形参将使用默认值。由于参数的传递顺序是从右至左入栈,所以有默认值的参数必须在放在形参列表的最右边! 12345678910111213#include<iostream>using namespace std;int Sum(int a=4,int b=5){ return a+b;}int main(){ cout<<Sum(5,7)<<endl; cout<<Sum()<<endl; cout<<Sum(9)<<endl; return 0;} 函数重载函数重载即两个或以上的函数,函数名相同,但形参类型或个数不同,编译器根据调用方传入的参数的类型和个数,自动选择最适合的一个函数来进行绑定调用,自动实现选择。 123456789101112131415161718192021222324252627282930#include<iostream>using namespace std;int sum(int a,int b){ return a+b;}double sum(double a,double b){ return a+b;}double sum(double a,int b){ return a+b;}double sum(int a,double b){ return a+b;}int main(){ cout<<sum(1,2)<<endl; cout<<sum(1.414,2.526)<<endl; cout<<sum(3.14,6)<<endl; cout<<sum(8,9.9)<<endl; return 0;} 函数模板(template)模板是创建泛型类或函数的蓝图或公式。是泛型编程的基础。函数模板,是可以创建一个通用的函数,可以支持多种形参。用关键字template来定义模板函数定义的一般形式 template<class 类型名1,class 类型名2> 返回值 函数名(形参列表) { 函数体 } 1234567891011121314151617#include<iostream>using namespace std;template<class T1,class T2>T1 sum(T1 a,T2 b)//模板函数中的T1和T2类型将根据实际传入的类型变成具体类型。这个化成就叫做模板的实例化。//T1、T2是函数所使用的数据类型的占位符名称。这个名称可以在函数定义中使用。{ cout<<sizeof(T1)<<","<<sizeof(T2)<<"\\t"; return a+b;}int main(){ cout<<sum(1,2)<<endl; cout<<sum(3.14,1.414)<<endl; cout<<sum('A',2)<<endl; return 0;} inline内联函数 内联函数的基本思想在于将每个函数调用都以它的代码体来替换 内联函数减少了不必要的函数栈帧的开销,节约内存 内联函数以空间换取了时间,但是inline对编译器只是一个建议,如果定义的函数体内有循环或递归等,编译器优化时会自动忽略掉内联 12345678910111213#include<iostream>using namespace std;inline int Max(int a,int b){ return a>b?a:b;}int main(){ cout<<Max(3,5)<<endl; cout<<Max(7,9)<<endl; return 0;} 内联函数的定义要在调用之前出现","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"ACM入门(占个位)","slug":"ACM入门","date":"2018-10-02T22:48:28.000Z","updated":"2018-10-02T22:48:28.000Z","comments":true,"path":"2018/10/02/ACM入门/","permalink":"https://yeshan333.github.io/2018/10/02/ACM%E5%85%A5%E9%97%A8/","excerpt":"A+B for Input-Output Practice(using C++)1. Problem Description Your task is to Calculate a + b. Too easy?! Of course! I specially designed the problem for acm beginners. You must have found that some problems have the same titles with this one, yes, all these problems were designed for the same aim Input The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line. Output For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input. Sample Input 1 61 20 Sample Output 721","text":"A+B for Input-Output Practice(using C++)1. Problem Description Your task is to Calculate a + b. Too easy?! Of course! I specially designed the problem for acm beginners. You must have found that some problems have the same titles with this one, yes, all these problems were designed for the same aim Input The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line. Output For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input. Sample Input 1 61 20 Sample Output 721 1234567891011#include<iostream>using namespace std;int main(){ int x,y; while(cin>>x>>y) { cout<<x+y<<endl; } return 0;} 2. Problem Description The first line integer means the number of input integer a and b. Your task is to Calculate a + b. Input Your task is to Calculate a + b. The first line integer means the numbers of pairs of input integers. Output For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input. Sample Input 210 2022 36 Sample Output 3058 1234567891011121314#include<iostream>using namespace std;int main(){ int n,i; int a,b; cin>>n; for(i=0;i<n;i++) { cin>>a>>b; cout<<a+b<<endl; } return 0;} 3. Problem Description Your task is to Calculate a + b. Input Input contains multiple test cases. Each test case contains a pair of integers a and b, one pair of integers per line. A test case containing 0 0 terminates the input and this test case is not to be processed. Output For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input. Sample Input 1 510 200 0 Sample Output 630 12345678910111213#include<iostream>using namespace std;int main(){ int a,b; while(cin>>a>>b) { if(a==0&&b==0)break; else cout<<a+b<<endl; } return 0;} 4. Problem Description Your task is to Calculate the sum of some integers. Input Input contains multiple test cases. Each test case contains a integer N, and then N integers follow in the same line. A test case starting with 0 terminates the input and this test case is not to be processed. Output For each group of input integers you should output their sum in one line, and with one line of output for each line in input. Sample Input 4 1 2 3 45 1 2 3 4 50 Sample Output 1015 123456789101112131415161718#include<iostream>using namespace std;int main(){ int n; while(cin>>n) { if(n==0)return 0; int x,sum=0; while(n--) { cin>>x; sum+=x; } cout<<sum<<endl; } return 0;} 5. Problem Description Your task is to calculate the sum of some integers. Input Input contains an integer N in the first line, and then N lines follow. Each line starts with a integer M, and then M integers follow in the same line. Output For each group of input integers you should output their sum in one line, and with one line of output for each line in input. Sample Input 24 1 2 3 45 1 2 3 4 5 Sample Output 1015 12345678910111213141516171819202122#include<iostream>using namespace std;int main(){ int N; int i; int n,x; cin>>N; for(i=0;i<N;i++) { int n; int x,sum=0; cin>>n; while(n--) { cin>>x; sum += x; } cout<<sum<<endl; } return 0;} 6. Problem Description Your task is to calculate the sum of some integers. Input Input contains multiple test cases, and one case one line. Each case starts with an integer N, and then N integers follow in the same line. Output For each test case you should output the sum of N integers in one line, and with one line of output for each line in input. Sample Input 4 1 2 3 4 55 1 2 3 4 5 Sample Output 1015 123456789101112131415161718#include<iostream>using namespace std;int main(){ int n; int x,sum=0; while(cin>>n) { while(n--) { cin>>x; sum +=x; } cout<<sum<<endl; sum=0; } return 0;} 7. Problem Description Your task is to Calculate a + b. Input The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line. Output For each pair of input integers a and b you should output the sum of a and b, and followed by a blank line. Sample Input 1 510 20 Sample Output 630 123456789101112#include<iostream>using namespace std;int main(){ int x,y; while(cin>>x>>y) { cout<<x+y<<endl; cout<<endl; } return 0;} 8. Problem Description Your task is to calculate the sum of some integers Input Input contains an integer N in the first line, and then N lines follow. Each line starts with a integer M, and then M integers follow in the same line Output For each group of input integers you should output their sum in one line, and you must note that there is a blank line between outputs. Sample Input 34 1 2 3 45 1 2 3 4 56 1 2 3 4 5 6 Sample Output 101521 12345678910111213141516171819202122#include<iostream>using namespace std;int main(){ int N; int n,x; int sum=0; cin>>N; while(N--) { cin>>n; while(n--) { cin>>x; sum +=x; } cout<<sum<<endl; cout<<endl; sum=0; } return 0;}","categories":[{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/categories/Algorithm/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"},{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/tags/Algorithm/"}]},{"title":"C++入坑记","slug":"C++-入坑记","date":"2018-10-02T00:40:03.000Z","updated":"2018-10-02T00:40:03.000Z","comments":true,"path":"2018/10/02/C++-入坑记/","permalink":"https://yeshan333.github.io/2018/10/02/C++-%E5%85%A5%E5%9D%91%E8%AE%B0/","excerpt":"C++关键字https://www.runoob.com/w3cnote/cpp-keyword-intro.html asm else new this auto enum operator throw bool explicit private true break export protected try case extern public typedef catch false register typeid char for return union const friend short unsigned const_cast goto signed using continue if sizeof virtual default inline static void delete int static_cast volatile do long struct wchar_t double mutable switch while dynamic_cast namespace template …","text":"C++关键字https://www.runoob.com/w3cnote/cpp-keyword-intro.html asm else new this auto enum operator throw bool explicit private true break export protected try case extern public typedef catch false register typeid char for return union const friend short unsigned const_cast goto signed using continue if sizeof virtual default inline static void delete int static_cast volatile do long struct wchar_t double mutable switch while dynamic_cast namespace template … 入坑C++1234567891011#include<iostream> //文件包含,包含iostream标准库using namespace std; //声明一个叫std的命名空间int main(){ string my_name; int age; cin>>my_name>>age; cout<<my_name<<' '<<age; cout<<"\\nHello C++ !"<<endl<<"Nice"<<"\\n\\n"; cout<<"Nice to meet you !";} 流提取运算符>>流插入运算符<< 什么是命名空间 命名空间(namespace)为防止名字冲突提供了更加可控的机制。 一个命名空间的定义包含两部分:首先是关键字namespace,随后是命名空间的名字。在命名空间名字后面是一系列由花括号括起来的声明和定义。只要能出现在全局作用域中的声明就能置于命名空间内,主要包括:类、变量(及其初始化操作)、函数(及其定义)、模板和其它命名空间。命名空间结束后无须分号,这一点与块类似。和其它名字一样,命名空间的名字也必须在定义它的作用域内保持唯一。命名空间既可以定义在全局作用域内,也可以定义在其它命名空间中,但是不能定义在函数或类的内部。命名空间作用域后面无须分号。 https://blog.csdn.net/fengbingchun/article/details/78575978?utm_source=copy只是新标准中使用不带.h的头文件包含时,必须要声明命名空间,并且包含头文件在前,声明使用的名字空间在后。 例如标准C++库提供的对象都存在std这个标准名字中,比如cin,cout,endl。 写法–1123456789101112#include<iostream>using namespace std;int main(){ int a; cin>>a; cout<<a<<endl; cout<<"**************************\\n"; cout<<"Hello World!"<<endl; cout<<"**************************\\n"; return 0;} 写法–2使用域限定符::来逐个制定,cout和endl前面分别用std::指明,表示来自std 1234567891011#include<iostream>int main(){ int a; std::cin>>a; std::cout<<a<<std::endl; std::cout<<"**************************\\n"; std::cout<<"Hello World!"<<std::endl; std::cout<<"**************************\\n"; return 0;} 写法–3用using和域限定符一起制定用哪些名字 1234567891011121314#include<iostream>using std::cin;using std::cout;using std::endl;int main(){ int a; cin>>a; cout<<a<<endl; cout<<"**************************\\n"; cout<<"Hello World!"<<endl; cout<<"**************************\\n"; return 0;} 在用cin和cout输入和输出数据时,不需要手动控制数据类型就可以使用 更新于2018/10/4 23:15:56 I/O库头文件 <iostream>、<iomanip>、<fstream> 头文件 函数和描述 iostream 该文件定义了cin、cout、cerr和clog对象,分别对应于标准输入流、标准输出流、非缓冲标准错误和缓冲标准错误流 iomanip 该文件通过所谓的参数化的流操纵器(比如setw和setprecision),来声明对执行标准化I/O有用的服务 fstream 该文件为用户控制的文件处理声明服务","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"Requests库入门(2)","slug":"Requests库入门-2","date":"2018-10-01T18:58:54.000Z","updated":"2018-10-01T18:58:54.000Z","comments":true,"path":"2018/10/01/Requests库入门-2/","permalink":"https://yeshan333.github.io/2018/10/01/Requests%E5%BA%93%E5%85%A5%E9%97%A8-2/","excerpt":"requests库入门实操 京东商品页面爬取 亚马逊商品页面的爬取 百度/360搜索关键字提交 IP地址归属地查询 网络图片的爬取和储存","text":"requests库入门实操 京东商品页面爬取 亚马逊商品页面的爬取 百度/360搜索关键字提交 IP地址归属地查询 网络图片的爬取和储存 1.京东商品页面的爬取华为nova3 123456789101112import requestsdef GetHTMLText(url): try: r = requests.get(url) r.raise_for_status() r.encoding = r.apparent_encoding return r.text[:1000] except: print("爬取失败")if __name__ == '__main__': url = "https://item.jd.com/30185690434.html" print(GetHTMLText(url)) 2.亚马孙商品页面的爬取某些网站可能有反爬机制。通常的反爬策略有: 通过Headers反爬虫 基于用户行为反爬虫 动态页面的反爬虫 参考 12345678910111213141516#如网站对Headers的User-Agent进行检测,可定制请求头伪装成浏览器import requestsdef GetHTMLText(url): try: #定制请求头 headers = {"user-agent":"Mozilla/5.0"} r = requests.get(url,headers = headers) r.raise_for_status() r.encoding = r.apparent_encoding return r.text[:1000] except: print("爬取失败")if __name__ == '__main__': url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y" print(GetHTMLText(url)) 3.百度/360搜索关键字提交使用params参数,利用接口keyword 1234567891011121314151617181920212223#百度搜索引擎关键词提交接口: http://www.baidu.com/s?wd=keyword#360搜索引擎关键词提交接口: http://www.so.com/s?q=keywordimport requestsdef Get(url): headers = {'user-agent':'Mozilla/5.0'} key_word = {'wd':'python'} try: r=requests.get(url,headers=headers,params=key_word) r.raise_for_status() r.encoding = r.apparent_encoding print(r.request.url) #return r.request.url return r.text except: return "爬取失败"if __name__ == '__main__': url = "http://www.baidu.com/s" #print(Get(url)) print(len(Get(url))) 4.IP地址归属地查询使用IP138的API接口http://m.ip138.com/ip.asp?ip=ipaddress 12345678910111213# ip地址查询import requestsurl ="http://m.ip138.com/ip.asp?ip="ip = str(input())try: r= requests.get(url+ip) r.raise_for_status() print(r.status_code) #r.encoding = r.apparent_encoding print(r.text[-500:])except: print("failed") 5.网络图片的爬取和储存123456789101112131415161718192021222324# spider_for_imgsimport requestsimport osurl = "http://n.sinaimg.cn/sinacn12/w495h787/20180315/1923-fyscsmv9949374.jpg"#C:\\Users\\Administrator\\Desktop\\spider\\first week\\imgs/root = "C://Users/Administrator/Desktop/spider/first week/imgs/"path = root + url.split('/')[-1]try: if not os.path.exists(root): os.mkdir(root) if not os.path.exists(path): r = requests.get(url) with open(path, 'wb') as f: f.write(r.content) f.close() print("save successfully!") else: print("file already exist!")except: print("spider fail")","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Requests","slug":"Requests","permalink":"https://yeshan333.github.io/tags/Requests/"},{"name":"爬虫","slug":"爬虫","permalink":"https://yeshan333.github.io/tags/%E7%88%AC%E8%99%AB/"}]},{"title":"优雅的Markdown(2)","slug":"优雅的Markdown(2)","date":"2018-09-30T23:25:53.000Z","updated":"2018-09-30T23:25:53.000Z","comments":true,"path":"2018/09/30/优雅的Markdown(2)/","permalink":"https://yeshan333.github.io/2018/09/30/%E4%BC%98%E9%9B%85%E7%9A%84Markdown%EF%BC%882%EF%BC%89/","excerpt":"Markdown编辑器使用-MarkdownPad2 imgur已被GFW干掉 快捷键 粗体 ctrl+B 斜体 ctrl+I 引用 ctrl+Q 代码 ctrl+K 超链接 ctrl+L 图片 ctrl+G 无序列表 ctrl+U 有序列表 ctrl+shift+O 水平标尺 ctrl+R 时间戳 ctrl+T 撤销 ctrl+Z 重做 ctrl+Y","text":"Markdown编辑器使用-MarkdownPad2 imgur已被GFW干掉 快捷键 粗体 ctrl+B 斜体 ctrl+I 引用 ctrl+Q 代码 ctrl+K 超链接 ctrl+L 图片 ctrl+G 无序列表 ctrl+U 有序列表 ctrl+shift+O 水平标尺 ctrl+R 时间戳 ctrl+T 撤销 ctrl+Z 重做 ctrl+Y 插入图片时间可使用MarkdownPad2默认的图床 MarkdownPad2使用的默认图床是imgur 插入视频演示戳这里","categories":[],"tags":[{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/tags/markdown/"}]},{"title":"简单爬虫","slug":"简单爬虫","date":"2018-09-29T01:17:32.000Z","updated":"2018-09-29T23:19:00.000Z","comments":true,"path":"2018/09/29/简单爬虫/","permalink":"https://yeshan333.github.io/2018/09/29/%E7%AE%80%E5%8D%95%E7%88%AC%E8%99%AB/","excerpt":"Requests库入门 http://www.python-requests.org/en/master/ requests Requests库的7个主要方法 方法 说明 requests.request() 构造一个请求,支撑以下各方法的基本方法 requests.get() 获取HTML网面的方法 requests.head() 获取HTML网页头部信息的方法 requests.post() 向HTML网页提交POST请求的方法 requests.put() 向HTML页面提交PUT请求的方法 requests.patch() 向HTML网页提交局部修改请求 requests.delete() 向HTML网页提交删除请求","text":"Requests库入门 http://www.python-requests.org/en/master/ requests Requests库的7个主要方法 方法 说明 requests.request() 构造一个请求,支撑以下各方法的基本方法 requests.get() 获取HTML网面的方法 requests.head() 获取HTML网页头部信息的方法 requests.post() 向HTML网页提交POST请求的方法 requests.put() 向HTML页面提交PUT请求的方法 requests.patch() 向HTML网页提交局部修改请求 requests.delete() 向HTML网页提交删除请求 Requests库的get()方法requests.get(url,params=None,**kwargs) url:拟获取页面的url链接 params:url中的额外参数,字典或字节流格式,可选 **kwargs:12个控制访问的参数 r = requests.get(url) r为一个包含服务器资源的Response对象(即为requests.get()返回内容) get()方法和url构造了一个向服务器请求资源的Request对象 Response对象Response对象包含服务器反回的所有信息,也包含请求的Request信息 Response对象的属性 属性 说明 r.stats_code HTTP请求的返回状态,200表示连接成功 r.txt HTTP响应的字符串形式 r.encoding 从HTTP header中猜测的响应方式的内容编码 r.apparent_enconding 从内容中分析出的响应内容编码方式(备选编码方式) r.content HTTP响应内容编码的二进制形式 r.encoding:如果charset不存在,则默认编码为ISO-8859-1,r.text根据r.encoding显示网页内容 r.apparent_encoding:根据网页内容分析出的编码方式 理解Response异常r.raise_for_status()如果不是200,产生异常requests.HTTPError异常 1r.raise_for_status()在方法内部判断r.statu_code是否等于200,不需要增加额外的if语句,该语句便于try-except进行异常处理 Requests库的异常 异常 说明 requests.ConnectonError 网路连接错误异常 requests.HTTPError HTTP错误异常 requests.URLRequire URL缺失异常 requests.TooManyRedirects 超过最大重定向次数,产生重定向异常 requests.ConnectTimeout 连接远程服务器异常 requests.Timeout 请求URL超时,产生超时异常 python爬取网页代码通用框架12345678910111213141516import requests#import timedef getHTMLText(url): try: r = requests.get(url,timeout = 30) r.raise_for_status()#如果状态不是200,产生HTTPError异常 #print(r.status_code) r.encoding = r.apparent_encoding return r.text except: return "产生异常"if __name__ == '__main__': url = "http://www.baidu.com" print(getHTMLText(url)) Requests库的request()方法requests.request(method, url, **kwargs) method: 请求方式,对应get/put/delete等7种 url:拟获取页面的url链接 **kwargs: 控制访问的参数 kwargs:控制访问参数,(可选)12345678910111213params:字典或字节序列,作为参数增加到URL中data:字典、字节序列或文章对象,作为Request的内容json:Json格式的数据headers:HTTP定制头cookies:字典或CookieJar,Request中的cookieauth:元组,支持HTTP认证功能file:字典类型,传输文件timeout:设置超时时间,单位为秒proxies:字典类型,设定访问代理服务器,可以增加登录认证allow_redirects:True/False,默认为True,重定向开关strem:True/False,默认为True,获取页面立即下载开关verify:True/False,默认为True,认证SSl证书开关cert:本地SSL证书","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Requests","slug":"Requests","permalink":"https://yeshan333.github.io/tags/Requests/"},{"name":"爬虫","slug":"爬虫","permalink":"https://yeshan333.github.io/tags/%E7%88%AC%E8%99%AB/"}]},{"title":"网易云音乐外链插入测试","slug":"music","date":"2018-09-28T22:37:08.000Z","updated":"2018-09-28T22:37:08.000Z","comments":true,"path":"2018/09/28/music/","permalink":"https://yeshan333.github.io/2018/09/28/music/","excerpt":"网易云音乐","text":"网易云音乐","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"优雅的Markdown","slug":"优雅的Markdown","date":"2018-09-28T16:49:47.000Z","updated":"2018-09-28T16:49:47.000Z","comments":true,"path":"2018/09/28/优雅的Markdown/","permalink":"https://yeshan333.github.io/2018/09/28/%E4%BC%98%E9%9B%85%E7%9A%84Markdown/","excerpt":"Markdown浅尝一、勾选框注意[]前后都要有空格 1234- [x] 干的漂亮- [x] 吃饭- [x] 写代码- [ ] 睡觉 干的漂亮 吃饭 写代码 睡觉","text":"Markdown浅尝一、勾选框注意[]前后都要有空格 1234- [x] 干的漂亮- [x] 吃饭- [x] 写代码- [ ] 睡觉 干的漂亮 吃饭 写代码 睡觉 二、列表12345#无序列列表 * 换成 - 也行* 你* 你好* 你好呀- 你很好啊 你 你好 你好呀 你很好啊 12345#有序列表 . 后面有个空格1. 我2. 是我3. 是我呀4. 还是我呀 我 是我 是我呀 还是我呀 1234567#多级列表* 数学 * 高等代数 * 解析几何 * 离散数学 * 数学分析 * 实变函数 数学 高等代数 解析几何 离散数学 数学分析 实变函数 表格1234| 姓名 | 性别 | 是否同性恋 || ---- |---- | --------- ||张三|男|否||李四|男|是| 姓名 性别 是否同性恋 张三 男 否 李四 男 是 可用:设置对齐方式1234| 姓名 | 性别 | 是否同性恋 || ---- |:----: | :---------:||张三|男|否||李四|男|是| 姓名 性别 是否同性恋 张三 男 否 李四 男 是 1234| 姓名 | 性别 | 是否同性恋 || ---- |----: | :---------:||张三|男|否||李四|男|是| 姓名 性别 是否同性恋 张三 男 否 李四 男 是 插入代码12#行内代码`printf("hello world!");` printf("hello world!"); 代码块 123#每行前四个空格或一个tab php:echo "Hello World" VBscript:Msgbox "Hello World" php:echo "Hello World" VBscript:Msgbox "Hello World" 有行标代码块 无行标 12for i in range(4): print(i) bash换成python使用语法高亮 123#下划线使用<u><u>bash换成python</u>#换行使用<br/>、<br> 瞬间发现没什么区别 更新于2018/10/1 11:05:19上下标,使用<sup>、<sub>12y=x<sup>2</sup>H<sub>2</sub>O<sub>2</sub> y=x2H2O2 反斜杠的使用使用反斜杠可以避免文本中的符号被当作markdown标识符而发生不必要的转换 例如 1234\\!\\()\\**不是粗体**\\# 不是一级标题 !()*不是粗体*# 不是一级标题 使用缩进1234567不断行的空白格 &nbsp; 或 &#160;半角的空格 &ensp; 或 &#8194;全角的空格 &emsp; 或 &#8195;示例:&ensp; &ensp今天天气好啊&emsp;&emsp;感觉倍爽啊   今天天气好啊  感觉倍爽啊 不要忘了英文的分号参考自zhouie","categories":[],"tags":[{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/tags/markdown/"}]},{"title":"博客搭建历程(4)","slug":"博客搭建历程(4)","date":"2018-09-27T16:35:56.000Z","updated":"2018-09-27T16:35:56.000Z","comments":true,"path":"2018/09/27/博客搭建历程(4)/","permalink":"https://yeshan333.github.io/2018/09/27/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E5%8E%86%E7%A8%8B%EF%BC%884%EF%BC%89/","excerpt":"博客评论系统的选择 怀念文:当时使用的主题是 yilla 其他评论系统参考经过一波折腾,最终选择了Valine我喜欢它的匿名评论,23333!!! 参考教程 作者的博客Valine文档 https://github.com/litten/hexo-theme-yilia/pull/646 https://www.xxwhite.com/2017/Valine.html https://panjunwen.com/diy-a-comment-system/","text":"博客评论系统的选择 怀念文:当时使用的主题是 yilla 其他评论系统参考经过一波折腾,最终选择了Valine我喜欢它的匿名评论,23333!!! 参考教程 作者的博客Valine文档 https://github.com/litten/hexo-theme-yilia/pull/646 https://www.xxwhite.com/2017/Valine.html https://panjunwen.com/diy-a-comment-system/ 安装过程简记 注册Leancloud 创建应用 获取appid和appkey 设置安全域名 部署云引擎 参考设置好环境变量 yilia主题修改1、修改themes\\yilia\\_config.ymlhttps://github.com/litten/hexo-theme-yilia/pull/646 12345678910#6、Valine https://valine.js.orgvaline: enable: true appid: #LeanCloud的appId appkey: #Leancloud的appKey verify: false #验证码 notifi: false #评论回复提醒 avatar: ' '#评论列表头像样式 placeholder: Just go go #评论占位框 pageSize: 15 #评论分页 2、修改themes\\yilia\\layout\\_partial\\article.ejs我是在尾部位添加的 123456789<% if (theme.valine && theme.valine.appid && theme.valine.appkey){ %> <section id="comments" style="margin:10px;padding:10px;background:#fff;"> <%- partial('post/valine', { key: post.slug, title: post.title, url: config.url+url_for(post.path) }) %> </section> <% } %> 在themes\\yilia\\layout\\_partial\\post下新建个·valine.ejs·文件添加如下代码 123456789101112131415161718<div id="vcomment" class="comment"></div><script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script><script src="//unpkg.com/valine/dist/Valine.min.js"></script><script> var notify = '<%= theme.valine.notify %>' == true ? true : false; var verify = '<%= theme.valine.verify %>' == true ? true : false; window.onload = function() { new Valine({ el: '#vcomment', notify: notify, verify: verify, app_id: "<%= theme.valine.appid %>", app_key: "<%= theme.valine.appkey %>", placeholder: "<%= theme.valine.placeholder %>", avatar:"<%= theme.valine.avatar %>" }); }</script> 测试下效果hexo g hexo s 预览 没问题就部署到github吧 hexo d -g 定时器添加https://github.com/zhaojun1998/Valine-Admin/issues/1","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"hexo","slug":"hexo","permalink":"https://yeshan333.github.io/tags/hexo/"}]},{"title":"Markdown(2)","slug":"Markdown-2","date":"2018-09-26T23:24:26.000Z","updated":"2018-09-26T23:24:26.000Z","comments":true,"path":"2018/09/26/Markdown-2/","permalink":"https://yeshan333.github.io/2018/09/26/Markdown-2/","excerpt":"兴奋于搭建了我的博客,兴奋于认识了markdown,终于可以甩开花里胡哨的word了,233333!!! 认识Markdown Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。 Markdown具有一系列衍生版本,用于扩展Markdown的功能(如表格、脚注、内嵌HTML等等),这些功能原初的Markdown尚不具备,它们能让Markdown转换成更多的格式,例LaTeX,Docbook。 Markdown增强版中比较有名的有Markdown Extra、MultiMarkdown、 Maruku等。这些衍生版本要么基于工具,如Pandoc;要么基于网站,如GitHub和Wikipedia,在语法上基本兼容,但在一些语法和渲染效果上有改动。 –引自百度百科","text":"兴奋于搭建了我的博客,兴奋于认识了markdown,终于可以甩开花里胡哨的word了,233333!!! 认识Markdown Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。 Markdown具有一系列衍生版本,用于扩展Markdown的功能(如表格、脚注、内嵌HTML等等),这些功能原初的Markdown尚不具备,它们能让Markdown转换成更多的格式,例LaTeX,Docbook。 Markdown增强版中比较有名的有Markdown Extra、MultiMarkdown、 Maruku等。这些衍生版本要么基于工具,如Pandoc;要么基于网站,如GitHub和Wikipedia,在语法上基本兼容,但在一些语法和渲染效果上有改动。 –引自百度百科 Windows常用Markdown编辑器 VSCode 下载 Atom 下载 CuteMarkEd 下载 MarkdownPad2 下载 MarkPad 下载 Miu 下载 Typora 下载 RStudio 下载 Markdown语法说明-中文版为什么使用Markdown 它使我更加专注于文字内容而不是排版样式 We believe that writing is about content, about what you want to say – not about fancy formatting. –Ulysses for Mac[高级应用](https://blog.mariusschulz.com/2014/12/16/how-to-set-up-sublime-text-for-a-vastly-better-markdown-writing-experience) Sublime Text3+Markdown Editing [参考](https://blog.csdn.net/u012195214/article/details/70544181)","categories":[{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/categories/markdown/"}],"tags":[{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/tags/markdown/"}]},{"title":"博客搭建历程(3)","slug":"博客搭建历程(3)","date":"2018-09-26T20:11:17.000Z","updated":"2018-09-26T20:11:17.000Z","comments":true,"path":"2018/09/26/博客搭建历程(3)/","permalink":"https://yeshan333.github.io/2018/09/26/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E5%8E%86%E7%A8%8B%EF%BC%883%EF%BC%89/","excerpt":"hexo生成工程文件介绍 hexo插件 主题yilia 默认目录结构具体参考","text":"hexo生成工程文件介绍 hexo插件 主题yilia 默认目录结构具体参考 |--.deploy |--public |--scaffolds |--source |--themes |--_config.yml |--package.json .deploy :部署到GitHub上的内容目录 public:输出的静态网页内容目录 scaffolds:layout模板文件目录 source:文件源码目录 themes:主题文件目录 —config.yml:全局配置文件 package.json:项目依赖声明文件 给主题yilia配置干货一、腾讯公益404公益404 hexo new page 404 #新建一个页面 1234567891011#在生成的index.md文件下添加以下代码<!DOCTYPE html><html lang="en"><head>]\\<meta charset="UTF-8"><title>404</title></head><body><script type="text/javascript" src="//qzonestyle.gtimg.cn/qzone/hybrid/app/404/search_children.js" charset="utf-8"></script></body></html> 1hexo d -g#直接部署到GitHub 参考 二、制作个网站ico戳这里 也可以不弄,直接用 把你的网站ico放在public\\img即可修改theme\\_config.yml 三、使用网站访问量统计(使用友盟)效果如下 注册账号友盟官网 获取代码 在hemes\\yilia\\layout\\_partial\\footer.ejs挑个位置放 12hexo ghexo s 看下效果 hexo d #部署到 github 若不想用CNZZ参考","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"hexo","slug":"hexo","permalink":"https://yeshan333.github.io/tags/hexo/"}]},{"title":"baidu收录测试","slug":"xuxu","date":"2018-09-26T17:13:00.000Z","updated":"2018-09-26T17:13:00.000Z","comments":true,"path":"2018/09/26/xuxu/","permalink":"https://yeshan333.github.io/2018/09/26/xuxu/","excerpt":"baidu收录测试hexo 插件:hexo-baidu-url-submit","text":"baidu收录测试hexo 插件:hexo-baidu-url-submit","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"博客搭建历程(2)","slug":"博客搭建历程(2)","date":"2018-09-25T23:31:27.000Z","updated":"2018-09-25T23:31:27.000Z","comments":true,"path":"2018/09/25/博客搭建历程(2)/","permalink":"https://yeshan333.github.io/2018/09/25/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E5%8E%86%E7%A8%8B%EF%BC%882%EF%BC%89/","excerpt":"本文大多数图片链接失效,建议阅读:https://cloud.tencent.com/developer/article/1656959 一、使用hexo deploy部署博客到Github 使用参考 ** 先安装个扩展$ npm install hexo-deployer-git --save ** 1.修改博客根目录下的_config_yml文件 123456# Deployment## Docs: https://hexo.io/docs/deployment.htmldeploy: type: git repo: git@github.com:yeshan333/yeshan333.github.io.git # 这个可到Github仓库拿 branch: master","text":"本文大多数图片链接失效,建议阅读:https://cloud.tencent.com/developer/article/1656959 一、使用hexo deploy部署博客到Github 使用参考 ** 先安装个扩展$ npm install hexo-deployer-git --save ** 1.修改博客根目录下的_config_yml文件 123456# Deployment## Docs: https://hexo.io/docs/deployment.htmldeploy: type: git repo: git@github.com:yeshan333/yeshan333.github.io.git # 这个可到Github仓库拿 branch: master 2.部署到GitHub repo生成ssh keys1ssh-keygen -t rsa -C "邮件地址@youremail.com" #生成新的key文件,邮箱地址填注册Github时用的 将生成的ssh keys添加到Github的deploy keys中 复制key ** 这里用到.ssh目录下,id_rsa.pub文件中的那串key** 到GitHub的yourname.hithub.io仓库添加那串key到deploy keys中 测试一下是否添加成功了: 1ssh -T git@github.com 部署博客 先配好git用户信息 12git config --global user.name "你的名字" # github用户名git config --global user.email "邮箱@邮箱.com" # github邮箱 部署博客到仓库 12hexo g # 生成静态文件hexo d # 部署到远程仓库 访问https://yourname.github.io查看结果 ** 到此,整个博客搭建完成了 ** 以下是写的是博客主题的更换,主题可以自己写,也可以使用别人写的,可去这里https://hexo.io/themes/找喜欢的主题,如果使用的是别人的主题,需要阅读主题使用文档进行相关配置。 二、Hexo主题设置 更换主题 cd进themes目录 12cd themesgit clone https://github.com/litten/hexo-theme-yilia.git themes/yilia 对根目录下的config_yml文件进行修改 12cd themes/yiliagit pull #更新主题 预览新主题 123hexo clean # 清楚缓存,删除public目录hexo g # 生成新的博客静态文件hexo s 去http://localhost:4000预览,没毛病就hexo d部署到远程仓库。","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"hexo","slug":"hexo","permalink":"https://yeshan333.github.io/tags/hexo/"}]},{"title":"博客搭建历程(1)","slug":"博客搭建历程(1)","date":"2018-09-25T22:40:31.000Z","updated":"2018-09-25T22:40:31.000Z","comments":true,"path":"2018/09/25/博客搭建历程(1)/","permalink":"https://yeshan333.github.io/2018/09/25/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E5%8E%86%E7%A8%8B%EF%BC%881%EF%BC%89/","excerpt":"本文大多数图片链接失效,建议阅读:https://cloud.tencent.com/developer/article/1656961 我为什么要搭建自己的博客:人嘛!总会有迷茫的时候。无聊了就搭建一个博客玩玩。借此思考下人生戳这里先洗下脑 [BetterExplained]为什么你应该(从现在开始就)写博客 使用Hexo+GitHub Pages搭建属于自己的博客依赖 安装Node.js 安装git 一个GitHub账号 hexo全家桶","text":"本文大多数图片链接失效,建议阅读:https://cloud.tencent.com/developer/article/1656961 我为什么要搭建自己的博客:人嘛!总会有迷茫的时候。无聊了就搭建一个博客玩玩。借此思考下人生戳这里先洗下脑 [BetterExplained]为什么你应该(从现在开始就)写博客 使用Hexo+GitHub Pages搭建属于自己的博客依赖 安装Node.js 安装git 一个GitHub账号 hexo全家桶 一、Node.js安装参考Node.js官网 nodejs版本越高越好,不然后面安装hexo时会出现问题,Hexo官网给的建议是6.9版本以上 官网windows 64bit 下载(v10.16.0) 二、git的安装参考安装需根据自己的实际情况,在cmd使用git --version指令可以查看安装的版本 windows 64 bit 下载(v2.19.0) 三、使用Github Pages 注册Github账号 创建一个repository,用于存放博客站点文件 开启Github Page 1、创建一个repository 仓库命名方式须注意下,这样命名会开启githubpage服务,代码仓库命名方式随意,如果以用户名+github.io的形式命名,会自动开启Github Pages服务,否则需要自己在仓库的设置那里手动开启GIthub Pages服务。 Github Pages 是 github 公司提供的免费的静态网站托管服务,用起来方便而且功能强大,不仅没有空间限制(为免费用户提供了500M空间),还可以绑定自己的域名,1GB空间限制(个人博客够用了),每月带宽限制100GB,自由绑定自己的域名。 2、开启GitHub PagesGitHub Pages官方介绍,Github的中文官方文档已推出https://help.github.com/cn/articles/what-is-github-pages(2019年7月11日更新) 点击choose a theme选完主题后即可到https://yourname.github.io/访问自己的个人主页了,yourname记得替换成你的用户名。 接下来需要使用Hexo在本地创建好博客,再将博客文件上传到刚刚创建的仓库。 四、Hexo配置 Hexo是一个静态站点生成器,如果想深入了解Hexo可以去Hexo的官网看看。https://hexo.io/zh-cn/docs/ 在本地搭建博客1.安装hexo插件套装以下两条命令直接打开windows cmd执行即可,用git bash执行也行 12# 安装hexo命令行工具npm install hexo-cli -g ~~安装hexo包到全局node_modules中,修改package.json文件,将模块名和版本号添加到dependencies部分npm install hexo –save~~~ 2.初始化hexo 这里需要新建个目录用于存放本地的博客文件 往后的命令均需要在此目录下执行,可用cd命令进入目录中执行往后的命令 1hexo init # 初始化目录,生成相关文件 目录中生成的文件如下 123456789101112.├── node_modules # 存放博客依赖的npm packages├── scaffolds # 存放生成博客文章、博客页面、草稿的模板目录├ ├── draft.md├ ├── page.md├ └── post.md├── source├ └── posts # 用于存放博客文章├── _config.yml # 博客全局配置文件├── .gitignore├── package.json # 记录当前目录下实际安装的各个npm package的具体来源和版本号└── package-lock.json # 存放锁定安装时的包的版本号,此文件一般会上传到git 12hexo g # 生成静态页面hexo s # 部署到本地服务器http://localhost:4000/ 预览效果http://localhost:4000/ 到这里本地的博客搭建完了,接下来就是将博客上传到刚刚创建的Github仓库,上传后就可以使用外网访问了 博客搭建历程(2) 博客搭建参考教程推荐 csdn w3cschool 博客园 思否","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"hexo","slug":"hexo","permalink":"https://yeshan333.github.io/tags/hexo/"}]},{"title":"Markdown","slug":"Markdown","date":"2018-09-25T18:34:13.000Z","updated":"2018-09-25T18:34:13.000Z","comments":true,"path":"2018/09/25/Markdown/","permalink":"https://yeshan333.github.io/2018/09/25/Markdown/","excerpt":"体验markdown有点意思,哈! 同级文件夹,的img文件夹下的图片 添加链接我的博客 添加图片","text":"体验markdown有点意思,哈! 同级文件夹,的img文件夹下的图片 添加链接我的博客 添加图片 一级引用 要判断一个人是否真正聪明,那就要看他能否根本不用动手,而工作却又能完成。 二级引用 在C++里, 想搬起石头砸自己的脚更为困难了。 不过一旦你真这么做了, 整条腿都得报销! 列表的使用一级列表 python Java c++ 多级列表 数学分析 高等代数 解析几何 插入代码行内代码printf(" hello world "); 块代码,每行代码前四个空格或一个tabWocao Nimei Fenced Code Block123for i in range(4): print(i) 划重点人生苦短 下划线干的漂亮 删除线这都什么鬼 这里是斜体这里是粗体这里是粗斜体 利用html标签换行有点意思 这里是表格 浏览器 好 坏 google 1 0 firefox 1 0 使用font标签控制字体颜色红色<br>自定义字体样式、颜色、大小","categories":[{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/categories/markdown/"}],"tags":[{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/tags/markdown/"}]},{"title":"hello my first blog in here !","slug":"hello-my-first-blog-in-here-!","date":"2018-09-19T23:14:15.000Z","updated":"2018-09-19T23:14:15.000Z","comments":true,"path":"2018/09/19/hello-my-first-blog-in-here-!/","permalink":"https://yeshan333.github.io/2018/09/19/hello-my-first-blog-in-here-%EF%BC%81/","excerpt":"","text":"新的开始,新的路线","categories":[],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]}],"categories":[{"name":"大模型","slug":"大模型","permalink":"https://yeshan333.github.io/categories/%E5%A4%A7%E6%A8%A1%E5%9E%8B/"},{"name":"LLMs","slug":"LLMs","permalink":"https://yeshan333.github.io/categories/LLMs/"},{"name":"Sider","slug":"Sider","permalink":"https://yeshan333.github.io/categories/Sider/"},{"name":"Jenkins","slug":"Jenkins","permalink":"https://yeshan333.github.io/categories/Jenkins/"},{"name":"Chaos","slug":"Chaos","permalink":"https://yeshan333.github.io/categories/Chaos/"},{"name":"vfox","slug":"vfox","permalink":"https://yeshan333.github.io/categories/vfox/"},{"name":"dotfiles","slug":"dotfiles","permalink":"https://yeshan333.github.io/categories/dotfiles/"},{"name":"浏览器插件开发","slug":"浏览器插件开发","permalink":"https://yeshan333.github.io/categories/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"},{"name":"设计工具","slug":"设计工具","permalink":"https://yeshan333.github.io/categories/%E8%AE%BE%E8%AE%A1%E5%B7%A5%E5%85%B7/"},{"name":"Tech-Weekly","slug":"Tech-Weekly","permalink":"https://yeshan333.github.io/categories/Tech-Weekly/"},{"name":"go-ycsb","slug":"go-ycsb","permalink":"https://yeshan333.github.io/categories/go-ycsb/"},{"name":"Github Codespaces","slug":"Github-Codespaces","permalink":"https://yeshan333.github.io/categories/Github-Codespaces/"},{"name":"music","slug":"music","permalink":"https://yeshan333.github.io/categories/music/"},{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"},{"name":"SSE","slug":"SSE","permalink":"https://yeshan333.github.io/categories/SSE/"},{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"},{"name":"Prometheus","slug":"Prometheus","permalink":"https://yeshan333.github.io/categories/Prometheus/"},{"name":"Go","slug":"Go","permalink":"https://yeshan333.github.io/categories/Go/"},{"name":"Performance","slug":"Performance","permalink":"https://yeshan333.github.io/categories/Performance/"},{"name":"Profiling","slug":"Performance/Profiling","permalink":"https://yeshan333.github.io/categories/Performance/Profiling/"},{"name":"Compile","slug":"Compile","permalink":"https://yeshan333.github.io/categories/Compile/"},{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"},{"name":"计算机网络","slug":"计算机网络","permalink":"https://yeshan333.github.io/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"},{"name":"Kubernetes","slug":"Kubernetes","permalink":"https://yeshan333.github.io/categories/Kubernetes/"},{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/categories/Linux/"},{"name":"性能优化","slug":"Linux/性能优化","permalink":"https://yeshan333.github.io/categories/Linux/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/"},{"name":"Monitoring","slug":"Monitoring","permalink":"https://yeshan333.github.io/categories/Monitoring/"},{"name":"Cryptography","slug":"Cryptography","permalink":"https://yeshan333.github.io/categories/Cryptography/"},{"name":"RSS","slug":"RSS","permalink":"https://yeshan333.github.io/categories/RSS/"},{"name":"math","slug":"math","permalink":"https://yeshan333.github.io/categories/math/"},{"name":"Architecture","slug":"Architecture","permalink":"https://yeshan333.github.io/categories/Architecture/"},{"name":"WSL","slug":"WSL","permalink":"https://yeshan333.github.io/categories/WSL/"},{"name":"DevOps","slug":"DevOps","permalink":"https://yeshan333.github.io/categories/DevOps/"},{"name":"中间件","slug":"中间件","permalink":"https://yeshan333.github.io/categories/%E4%B8%AD%E9%97%B4%E4%BB%B6/"},{"name":"Kafka","slug":"中间件/Kafka","permalink":"https://yeshan333.github.io/categories/%E4%B8%AD%E9%97%B4%E4%BB%B6/Kafka/"},{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"},{"name":"JavaScript","slug":"JavaScript","permalink":"https://yeshan333.github.io/categories/JavaScript/"},{"name":"操作系统","slug":"操作系统","permalink":"https://yeshan333.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"},{"name":"进/线程","slug":"操作系统/进-线程","permalink":"https://yeshan333.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E8%BF%9B-%E7%BA%BF%E7%A8%8B/"},{"name":"React","slug":"React","permalink":"https://yeshan333.github.io/categories/React/"},{"name":"docker","slug":"docker","permalink":"https://yeshan333.github.io/categories/docker/"},{"name":"设计模式","slug":"设计模式","permalink":"https://yeshan333.github.io/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/"},{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/categories/%E9%9A%8F%E7%AC%94/"},{"name":"memory","slug":"memory","permalink":"https://yeshan333.github.io/categories/memory/"},{"name":"函数式编程","slug":"函数式编程","permalink":"https://yeshan333.github.io/categories/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B/"},{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/categories/Flask/"},{"name":"HTML","slug":"HTML","permalink":"https://yeshan333.github.io/categories/HTML/"},{"name":"CSS","slug":"CSS","permalink":"https://yeshan333.github.io/categories/CSS/"},{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"},{"name":"数据结构","slug":"数据结构","permalink":"https://yeshan333.github.io/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"},{"name":"Memory","slug":"Memory","permalink":"https://yeshan333.github.io/categories/Memory/"},{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/categories/Algorithm/"},{"name":"Scrapy","slug":"Scrapy","permalink":"https://yeshan333.github.io/categories/Scrapy/"},{"name":"C","slug":"C","permalink":"https://yeshan333.github.io/categories/C/"},{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/categories/markdown/"}],"tags":[{"name":"Sider","slug":"Sider","permalink":"https://yeshan333.github.io/tags/Sider/"},{"name":"通义千问","slug":"通义千问","permalink":"https://yeshan333.github.io/tags/%E9%80%9A%E4%B9%89%E5%8D%83%E9%97%AE/"},{"name":"Jenkins","slug":"Jenkins","permalink":"https://yeshan333.github.io/tags/Jenkins/"},{"name":"Cloudflare","slug":"Cloudflare","permalink":"https://yeshan333.github.io/tags/Cloudflare/"},{"name":"Workers AI","slug":"Workers-AI","permalink":"https://yeshan333.github.io/tags/Workers-AI/"},{"name":"Langchain","slug":"Langchain","permalink":"https://yeshan333.github.io/tags/Langchain/"},{"name":"LLMs","slug":"LLMs","permalink":"https://yeshan333.github.io/tags/LLMs/"},{"name":"Chaos Testing","slug":"Chaos-Testing","permalink":"https://yeshan333.github.io/tags/Chaos-Testing/"},{"name":"etcd","slug":"etcd","permalink":"https://yeshan333.github.io/tags/etcd/"},{"name":"MongoDB","slug":"MongoDB","permalink":"https://yeshan333.github.io/tags/MongoDB/"},{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"},{"name":"Erlang","slug":"Erlang","permalink":"https://yeshan333.github.io/tags/Erlang/"},{"name":"vfox","slug":"vfox","permalink":"https://yeshan333.github.io/tags/vfox/"},{"name":"Erlang/OTP","slug":"Erlang-OTP","permalink":"https://yeshan333.github.io/tags/Erlang-OTP/"},{"name":"vfox-plugin","slug":"vfox-plugin","permalink":"https://yeshan333.github.io/tags/vfox-plugin/"},{"name":"vfox-erlang","slug":"vfox-erlang","permalink":"https://yeshan333.github.io/tags/vfox-erlang/"},{"name":"chezmoi","slug":"chezmoi","permalink":"https://yeshan333.github.io/tags/chezmoi/"},{"name":"dotfiles","slug":"dotfiles","permalink":"https://yeshan333.github.io/tags/dotfiles/"},{"name":"extension","slug":"extension","permalink":"https://yeshan333.github.io/tags/extension/"},{"name":"WXT","slug":"WXT","permalink":"https://yeshan333.github.io/tags/WXT/"},{"name":"设计工具","slug":"设计工具","permalink":"https://yeshan333.github.io/tags/%E8%AE%BE%E8%AE%A1%E5%B7%A5%E5%85%B7/"},{"name":"Tech-Weekly","slug":"Tech-Weekly","permalink":"https://yeshan333.github.io/tags/Tech-Weekly/"},{"name":"Go","slug":"Go","permalink":"https://yeshan333.github.io/tags/Go/"},{"name":"YCSB","slug":"YCSB","permalink":"https://yeshan333.github.io/tags/YCSB/"},{"name":"go-ycsb","slug":"go-ycsb","permalink":"https://yeshan333.github.io/tags/go-ycsb/"},{"name":"benchmark","slug":"benchmark","permalink":"https://yeshan333.github.io/tags/benchmark/"},{"name":"Elixir, Github Codespaces","slug":"Elixir-Github-Codespaces","permalink":"https://yeshan333.github.io/tags/Elixir-Github-Codespaces/"},{"name":"music","slug":"music","permalink":"https://yeshan333.github.io/tags/music/"},{"name":"Deps","slug":"Deps","permalink":"https://yeshan333.github.io/tags/Deps/"},{"name":"Mix","slug":"Mix","permalink":"https://yeshan333.github.io/tags/Mix/"},{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"Websocket","slug":"Websocket","permalink":"https://yeshan333.github.io/tags/Websocket/"},{"name":"SSE","slug":"SSE","permalink":"https://yeshan333.github.io/tags/SSE/"},{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"},{"name":"Test Coverage","slug":"Test-Coverage","permalink":"https://yeshan333.github.io/tags/Test-Coverage/"},{"name":"Elixir-Macros","slug":"Elixir-Macros","permalink":"https://yeshan333.github.io/tags/Elixir-Macros/"},{"name":"Prometheus","slug":"Prometheus","permalink":"https://yeshan333.github.io/tags/Prometheus/"},{"name":"json","slug":"json","permalink":"https://yeshan333.github.io/tags/json/"},{"name":"Marshal","slug":"Marshal","permalink":"https://yeshan333.github.io/tags/Marshal/"},{"name":"UnMarshal","slug":"UnMarshal","permalink":"https://yeshan333.github.io/tags/UnMarshal/"},{"name":"React","slug":"React","permalink":"https://yeshan333.github.io/tags/React/"},{"name":"Profiling","slug":"Profiling","permalink":"https://yeshan333.github.io/tags/Profiling/"},{"name":"Flame Graphs","slug":"Flame-Graphs","permalink":"https://yeshan333.github.io/tags/Flame-Graphs/"},{"name":"FSM","slug":"FSM","permalink":"https://yeshan333.github.io/tags/FSM/"},{"name":"Compiler","slug":"Compiler","permalink":"https://yeshan333.github.io/tags/Compiler/"},{"name":"Lexer","slug":"Lexer","permalink":"https://yeshan333.github.io/tags/Lexer/"},{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"},{"name":"Wireshark","slug":"Wireshark","permalink":"https://yeshan333.github.io/tags/Wireshark/"},{"name":"Kubernetes","slug":"Kubernetes","permalink":"https://yeshan333.github.io/tags/Kubernetes/"},{"name":"Kubeadm","slug":"Kubeadm","permalink":"https://yeshan333.github.io/tags/Kubeadm/"},{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/tags/Linux/"},{"name":"压力测试","slug":"压力测试","permalink":"https://yeshan333.github.io/tags/%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95/"},{"name":"CPU Bound","slug":"CPU-Bound","permalink":"https://yeshan333.github.io/tags/CPU-Bound/"},{"name":"IO Bound","slug":"IO-Bound","permalink":"https://yeshan333.github.io/tags/IO-Bound/"},{"name":"Grafana","slug":"Grafana","permalink":"https://yeshan333.github.io/tags/Grafana/"},{"name":"Federation","slug":"Federation","permalink":"https://yeshan333.github.io/tags/Federation/"},{"name":"Docker","slug":"Docker","permalink":"https://yeshan333.github.io/tags/Docker/"},{"name":"Monitoring","slug":"Monitoring","permalink":"https://yeshan333.github.io/tags/Monitoring/"},{"name":"MD5","slug":"MD5","permalink":"https://yeshan333.github.io/tags/MD5/"},{"name":"GPG","slug":"GPG","permalink":"https://yeshan333.github.io/tags/GPG/"},{"name":"RSS Reader","slug":"RSS-Reader","permalink":"https://yeshan333.github.io/tags/RSS-Reader/"},{"name":"math","slug":"math","permalink":"https://yeshan333.github.io/tags/math/"},{"name":"项目管理","slug":"项目管理","permalink":"https://yeshan333.github.io/tags/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/"},{"name":"Monorepo","slug":"Monorepo","permalink":"https://yeshan333.github.io/tags/Monorepo/"},{"name":"WSL","slug":"WSL","permalink":"https://yeshan333.github.io/tags/WSL/"},{"name":"GUI","slug":"GUI","permalink":"https://yeshan333.github.io/tags/GUI/"},{"name":"Github Actions","slug":"Github-Actions","permalink":"https://yeshan333.github.io/tags/Github-Actions/"},{"name":"DevOps","slug":"DevOps","permalink":"https://yeshan333.github.io/tags/DevOps/"},{"name":"Nginx","slug":"Nginx","permalink":"https://yeshan333.github.io/tags/Nginx/"},{"name":"Kafka","slug":"Kafka","permalink":"https://yeshan333.github.io/tags/Kafka/"},{"name":"消息引擎系统","slug":"消息引擎系统","permalink":"https://yeshan333.github.io/tags/%E6%B6%88%E6%81%AF%E5%BC%95%E6%93%8E%E7%B3%BB%E7%BB%9F/"},{"name":"流处理平台","slug":"流处理平台","permalink":"https://yeshan333.github.io/tags/%E6%B5%81%E5%A4%84%E7%90%86%E5%B9%B3%E5%8F%B0/"},{"name":"计算机网路","slug":"计算机网路","permalink":"https://yeshan333.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E8%B7%AF/"},{"name":"TCP","slug":"TCP","permalink":"https://yeshan333.github.io/tags/TCP/"},{"name":"tcpdump","slug":"tcpdump","permalink":"https://yeshan333.github.io/tags/tcpdump/"},{"name":"深拷贝与浅拷贝","slug":"深拷贝与浅拷贝","permalink":"https://yeshan333.github.io/tags/%E6%B7%B1%E6%8B%B7%E8%B4%9D%E4%B8%8E%E6%B5%85%E6%8B%B7%E8%B4%9D/"},{"name":"Load Balance","slug":"Load-Balance","permalink":"https://yeshan333.github.io/tags/Load-Balance/"},{"name":"Event-Loop","slug":"Event-Loop","permalink":"https://yeshan333.github.io/tags/Event-Loop/"},{"name":"JavaScript","slug":"JavaScript","permalink":"https://yeshan333.github.io/tags/JavaScript/"},{"name":"进程通信","slug":"进程通信","permalink":"https://yeshan333.github.io/tags/%E8%BF%9B%E7%A8%8B%E9%80%9A%E4%BF%A1/"},{"name":"进程","slug":"进程","permalink":"https://yeshan333.github.io/tags/%E8%BF%9B%E7%A8%8B/"},{"name":"线程","slug":"线程","permalink":"https://yeshan333.github.io/tags/%E7%BA%BF%E7%A8%8B/"},{"name":"docker","slug":"docker","permalink":"https://yeshan333.github.io/tags/docker/"},{"name":"服务编排","slug":"服务编排","permalink":"https://yeshan333.github.io/tags/%E6%9C%8D%E5%8A%A1%E7%BC%96%E6%8E%92/"},{"name":"加密","slug":"加密","permalink":"https://yeshan333.github.io/tags/%E5%8A%A0%E5%AF%86/"},{"name":"隐私","slug":"隐私","permalink":"https://yeshan333.github.io/tags/%E9%9A%90%E7%A7%81/"},{"name":"服务器进程管理","slug":"服务器进程管理","permalink":"https://yeshan333.github.io/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86/"},{"name":"工程化","slug":"工程化","permalink":"https://yeshan333.github.io/tags/%E5%B7%A5%E7%A8%8B%E5%8C%96/"},{"name":"译文","slug":"译文","permalink":"https://yeshan333.github.io/tags/%E8%AF%91%E6%96%87/"},{"name":"I/O模型","slug":"I-O模型","permalink":"https://yeshan333.github.io/tags/I-O%E6%A8%A1%E5%9E%8B/"},{"name":"架构设计","slug":"架构设计","permalink":"https://yeshan333.github.io/tags/%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/"},{"name":"消息队列","slug":"消息队列","permalink":"https://yeshan333.github.io/tags/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/"},{"name":"设计模式","slug":"设计模式","permalink":"https://yeshan333.github.io/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/"},{"name":"静态类型检查","slug":"静态类型检查","permalink":"https://yeshan333.github.io/tags/%E9%9D%99%E6%80%81%E7%B1%BB%E5%9E%8B%E6%A3%80%E6%9F%A5/"},{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/tags/Flask/"},{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"},{"name":"memory","slug":"memory","permalink":"https://yeshan333.github.io/tags/memory/"},{"name":"Json","slug":"Json","permalink":"https://yeshan333.github.io/tags/Json/"},{"name":"函数式编程","slug":"函数式编程","permalink":"https://yeshan333.github.io/tags/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B/"},{"name":"环境管理","slug":"环境管理","permalink":"https://yeshan333.github.io/tags/%E7%8E%AF%E5%A2%83%E7%AE%A1%E7%90%86/"},{"name":"Jupyter","slug":"Jupyter","permalink":"https://yeshan333.github.io/tags/Jupyter/"},{"name":"debug","slug":"debug","permalink":"https://yeshan333.github.io/tags/debug/"},{"name":"上下文","slug":"上下文","permalink":"https://yeshan333.github.io/tags/%E4%B8%8A%E4%B8%8B%E6%96%87/"},{"name":"协程","slug":"协程","permalink":"https://yeshan333.github.io/tags/%E5%8D%8F%E7%A8%8B/"},{"name":"Latex","slug":"Latex","permalink":"https://yeshan333.github.io/tags/Latex/"},{"name":"MATLAB","slug":"MATLAB","permalink":"https://yeshan333.github.io/tags/MATLAB/"},{"name":"HTML","slug":"HTML","permalink":"https://yeshan333.github.io/tags/HTML/"},{"name":"CSS","slug":"CSS","permalink":"https://yeshan333.github.io/tags/CSS/"},{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"},{"name":"C","slug":"C","permalink":"https://yeshan333.github.io/tags/C/"},{"name":"数据结构","slug":"数据结构","permalink":"https://yeshan333.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"},{"name":"Memory","slug":"Memory","permalink":"https://yeshan333.github.io/tags/Memory/"},{"name":"GDB","slug":"GDB","permalink":"https://yeshan333.github.io/tags/GDB/"},{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/tags/Algorithm/"},{"name":"Scrapy","slug":"Scrapy","permalink":"https://yeshan333.github.io/tags/Scrapy/"},{"name":"爬虫","slug":"爬虫","permalink":"https://yeshan333.github.io/tags/%E7%88%AC%E8%99%AB/"},{"name":"正则表达式","slug":"正则表达式","permalink":"https://yeshan333.github.io/tags/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/"},{"name":"Astronomy","slug":"Astronomy","permalink":"https://yeshan333.github.io/tags/Astronomy/"},{"name":"信息标记","slug":"信息标记","permalink":"https://yeshan333.github.io/tags/%E4%BF%A1%E6%81%AF%E6%A0%87%E8%AE%B0/"},{"name":"BeautifulSoup","slug":"BeautifulSoup","permalink":"https://yeshan333.github.io/tags/BeautifulSoup/"},{"name":"Requests","slug":"Requests","permalink":"https://yeshan333.github.io/tags/Requests/"},{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/tags/markdown/"},{"name":"hexo","slug":"hexo","permalink":"https://yeshan333.github.io/tags/hexo/"}]} \ No newline at end of file +{"meta":{"title":"ShanSan","subtitle":"个人博客","description":"ShanSan's Blog","author":"ShanSan","url":"https://yeshan333.github.io","root":"/"},"pages":[{"title":"","date":"2024-06-18T16:11:15.857Z","updated":"2024-06-18T16:11:15.857Z","comments":true,"path":"baidu_verify_XRNJycrlKL.html","permalink":"https://yeshan333.github.io/baidu_verify_XRNJycrlKL.html","excerpt":"","text":"XRNJycrlKL"},{"title":"","date":"2024-06-18T16:11:15.857Z","updated":"2024-06-18T16:11:15.857Z","comments":true,"path":"googlec01c2945d8a3c128.html","permalink":"https://yeshan333.github.io/googlec01c2945d8a3c128.html","excerpt":"","text":"google-site-verification: googlec01c2945d8a3c128.html"},{"title":"404 Not Found","date":"2024-06-18T16:11:15.845Z","updated":"2024-06-18T16:11:15.845Z","comments":false,"path":"/404.html","permalink":"https://yeshan333.github.io/404.html","excerpt":"","text":"]\\ 404"},{"title":"Astronomy","date":"2018-10-09T13:26:08.000Z","updated":"2018-10-09T13:26:08.000Z","comments":true,"path":"Astronomy/index.html","permalink":"https://yeshan333.github.io/Astronomy/index.html","excerpt":"","text":"北京天文馆每日天文一图NASA             天上的街市作者:郭沫若远远的街灯明了,好像闪着无数的明星。天上的明星现了,好像点着无数的街灯。我想那缥缈的空中,定然有美丽的街市。街市上陈列的一些物品,定然是世上没有的珍奇。你看,那浅浅的天河,定然是不甚宽广。那隔河的牛郎织女,定能够骑着牛儿来往。我想他们此刻,定然在天街闲游。不信,请看那朵流星,那怕是他们提着灯笼在走。 一天文单位(AU)=149,597,870.7公里(日地距离) 一光年=63241.1 AU=946e+12公里"},{"title":"Collect","date":"2019-01-08T22:39:26.000Z","updated":"2019-01-08T22:39:26.000Z","comments":true,"path":"Collect/index.html","permalink":"https://yeshan333.github.io/Collect/index.html","excerpt":"","text":"Tools小记 description tools Link 截屏工具 Snipaste https://zh.snipaste.com/ 录屏工具 oCam https://download.cnet.com/oCam/3000-13633_4-75758209.html 清理工具 CCleaner https://www.ccleaner.com/ccleaner 远程连接工具 Xshell https://www.netsarang.com/products/xsh_overview.html 搜索利器 Everything http://www.voidtools.com/ Markdown编辑器 typora https://www.typora.io/ Shadowsocks-Qt5 影梭 https://github.com/shadowsocks/shadowsocks-qt5 windows数字权利激活工具 CMWTAT_Digital_Edition https://tgsan.github.io/CMWTAT_Digital_Edition/ 镜像制作 WPE工具箱 http://udsdown.xyz/109.html 镜像制作 refus https://rufus.ie/ 启动项管理 EasyUEFI https://www.easyuefi.com/index-cn.html 压缩工具 7-zip https://www.7-zip.org/ 优质文章小记用GDB调试程序 https://blog.csdn.net/haoel/article/details/2879 https://blog.csdn.net/haoel/article/details/2880?utm_source=blogxgwz2 https://blog.csdn.net/haoel/article/details/2881 https://blog.csdn.net/haoel/article/details/2882 https://blog.csdn.net/haoel/article/details/2883/ https://blog.csdn.net/haoel/article/details/2884 https://blog.csdn.net/haoel/article/details/2885/ https://coolshell.cn/articles/3643.html 跟我一起写Makefile https://blog.csdn.net/haoel/article/details/2886 https://blog.csdn.net/haoel/article/details/2887/ https://blog.csdn.net/haoel/article/details/2888 https://blog.csdn.net/haoel/article/details/2889/ https://blog.csdn.net/haoel/article/details/2890 https://blog.csdn.net/haoel/article/details/2891 https://blog.csdn.net/haoel/article/details/2892 https://blog.csdn.net/haoel/article/details/2893/ https://blog.csdn.net/haoel/article/details/2894 https://blog.csdn.net/haoel/article/details/2895 https://blog.csdn.net/haoel/article/details/2896 https://blog.csdn.net/haoel/article/details/2897 https://blog.csdn.net/haoel/article/details/2898 https://blog.csdn.net/haoel/article/details/2899"},{"title":"我想对我说","date":"2019-06-28T20:37:16.000Z","updated":"2019-06-28T20:37:16.000Z","comments":true,"path":"I_want_to_tell_me/index.html","permalink":"https://yeshan333.github.io/I_want_to_tell_me/index.html","excerpt":"","text":""},{"title":"PyChina","date":"2024-06-18T16:11:15.845Z","updated":"2024-06-18T16:11:15.845Z","comments":true,"path":"PyChina/index.html","permalink":"https://yeshan333.github.io/PyChina/index.html","excerpt":"","text":""},{"title":"Statement","date":"2019-03-14T20:30:46.000Z","updated":"2019-03-14T20:30:46.000Z","comments":true,"path":"Statement/index.html","permalink":"https://yeshan333.github.io/Statement/index.html","excerpt":"","text":"声明: 本站文章基于 知识共享署名-相同方式共享 4.0 国际许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本站文章的署名 Shan San及链接。 作者: Shan San 出处: https://shansan.top/"},{"title":"About/关于我","date":"2018-09-20T13:37:03.000Z","updated":"2018-09-20T13:37:03.000Z","comments":true,"path":"about/index.html","permalink":"https://yeshan333.github.io/about/index.html","excerpt":"","text":"小 target 🚩:一个月至少一篇文章📌 聊一聊我是谁 在校 kubi 大四学生「毕业 she fei~ 人」,专业:「信息与计算科学」 略懂乐理🎹~ 目前在关注研究的技术领域 Cloud Native、DevOps、DevTest 『啥也不是🤨』 Pythonista、Elixirist、Gopher、Rustacean 关于博客博客的搭建和维护学了许多花里胡哨的东西😂,主要用来写写自己想写的东西(虽然现在大多是技术文章),emmm。。。有些话想到再说。 2018-09-19 博客诞生 1、其实具体日子我也不记得了,当初不熟悉 Git,Commit History 被我摧毁了很多次,难以追溯具体日期🤣🤦‍♂️2、基于 Hexo 搭建的静态博客,最初使用的博客主题为 yilia,使用 Github Pages 托管3、也曾玩过 WordPress、Typecho(曾剁手买了个主题-handsome)4、现在博客使用的 Hexo 博客主题是 xaoxuxu 大佬写的 volantis,曾经叫 Material-x 就开始用了 2018-09-29 使用顶级域名 shansan.top,CNAME 解析到 GitHub Pages 2018-12-24 启用备用域名 shan333.cn 将博客部署到腾讯云 CVM 服务器;Web 服务器使用到了 Nginx;使用宝塔面板进行 Ops;通过 Linux 定时任务同步博客到云服务器 2020-01-30 引入 GitHub Actions 使用 GitHub Actions 持续集成/部署 Hexo 博客到 GitHub Pages “workflow.yml🔗”,放弃云盘单独备份,使用 Git 做版本控制(回忆) 2020-03-11 Hexo 主题升级 主题升级至volantis@2.0.2(原material-x主题改名了),紧跟dalao更新步伐 2020-04-29 volantis@2.0.2 -> volantis@2.6.5 2021-01-18 云服务器博客同步引入 CI/CD 写了个基于 rsync 协议的 GitHub Action 用于 CD 博客到 CVM 服务器,博文👉使用 rsync-deploy-action 同步 Hexo 博客到个人服务器 2021-03-10 volantis@2.6.5 -> volantis@4.3.1,hexo@4.0.0 -> hexo@5.4.0 2021-06-25 切换评论系统 valine -> waline 2022-05-08 waline 升级 2022-11-05 volantis -> v5.7.6 升级 2024-02-06 hexo -> v7.0.0 升级 2024-03-14 volantis -> v2.6.3 升级 v2.8.3,API 不兼容,吐了🤮~ 博客加入了十年之约项目嗷~相信时间的力量。 加个微信吧加个 QQ 吧"},{"title":"所有分类","date":"2024-06-18T16:11:15.857Z","updated":"2024-06-18T16:11:15.857Z","comments":true,"path":"categories/index.html","permalink":"https://yeshan333.github.io/categories/index.html","excerpt":"","text":""},{"title":"云原生","date":"2021-02-21T13:37:03.000Z","updated":"2021-02-21T13:37:03.000Z","comments":true,"path":"cloud-native/index.html","permalink":"https://yeshan333.github.io/cloud-native/index.html","excerpt":"","text":"organization && communityCNCF 云原生基金会https://www.cncf.io/云原生技术社区中国云原生技术社区 dalaoJimmy Song中国云原生社区创始人米开朗基杨IBM Cloud Native 工程师"},{"title":"friends","date":"2018-09-19T22:18:33.000Z","updated":"2018-09-19T22:18:33.000Z","comments":true,"path":"friends/index.html","permalink":"https://yeshan333.github.io/friends/index.html","excerpt":"朋友们雨帆Java,C#xaoxuuvolantis作者,IOSMashiroWeb前端TRHX数据采集、逆向安全嗜血星空earthBIM学习者Librarius's BlogC#,HLSLhojunWeb开发Rinvay.H运维大佬教书先生Web开发Bert Liu's Blog室内设计情小北Web安全Hoe's Notes后端开发楓の街以有涯随无涯lvlv's blogWeb前端HONGWEI测试工程师辣椒の酱JavaMrGo123后端攻城狮炎忍Kolin,AndroidTanger加油加油LiZiWu李自伍的个人技术博客 & 期待与你相逢悲伤的吉子树Springboot果子酱Java,Golang 失踪的 dalao 们搅拌糖°技术不宅,Web开发HawkC++Don LexJava,Python一去二三遥Java,摄影清秋Python半叶子C云宝地Java残梦前端、JS洛尘曦Java,Python张雄向阳生长,触碰流云Nykee前端打杂狮/公路骑游党子翔一个努力学技术的小白(中学生)我爱吃土豆一个爱吃土豆的程序员","text":"朋友们雨帆Java,C#xaoxuuvolantis作者,IOSMashiroWeb前端TRHX数据采集、逆向安全嗜血星空earthBIM学习者Librarius's BlogC#,HLSLhojunWeb开发Rinvay.H运维大佬教书先生Web开发Bert Liu's Blog室内设计情小北Web安全Hoe's Notes后端开发楓の街以有涯随无涯lvlv's blogWeb前端HONGWEI测试工程师辣椒の酱JavaMrGo123后端攻城狮炎忍Kolin,AndroidTanger加油加油LiZiWu李自伍的个人技术博客 & 期待与你相逢悲伤的吉子树Springboot果子酱Java,Golang 失踪的 dalao 们搅拌糖°技术不宅,Web开发HawkC++Don LexJava,Python一去二三遥Java,摄影清秋Python半叶子C云宝地Java残梦前端、JS洛尘曦Java,Python张雄向阳生长,触碰流云Nykee前端打杂狮/公路骑游党子翔一个努力学技术的小白(中学生)我爱吃土豆一个爱吃土豆的程序员 友链🔗随缘添加哦","author":"yeshan333"},{"title":"所有标签","date":"2024-06-18T16:11:15.857Z","updated":"2024-06-18T16:11:15.857Z","comments":true,"path":"tags/index.html","permalink":"https://yeshan333.github.io/tags/index.html","excerpt":"","text":""}],"posts":[{"title":"(Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本","slug":"install-erlang-and-elixir-via-vfox-on-windows","date":"2024-06-18T22:58:39.000Z","updated":"2024-06-18T22:58:39.000Z","comments":true,"path":"2024/06/18/install-erlang-and-elixir-via-vfox-on-windows/","permalink":"https://yeshan333.github.io/2024/06/18/install-erlang-and-elixir-via-vfox-on-windows/","excerpt":"","text":"大概一个多月前, 我写了篇关于如何使用跨平台版本管理工具 vfox 在 Linux 系统下安装管理多个 Erlang/OTP 版本的文章 -> 通过 vfox 安装管理多版本 Erlang 和 Elixir. 文章使用的示范操作系统是 Ubuntu 20.04 Linux 操作系统. 最近 vfox-erlang 和 vfox-elixir 插件的最新版本已经支持了在 Windows 平台下安装管理多个 Erlang/OTP 和 Elixir 的版本. 且已经通过了 End to End 测试 -> Testing. 本篇文章将会以 Windows 10 操作系统为例, 教你如何在 Windows 平台安装和管理多个 Erlang/OTP 和 Elixir 版本. 123456> Get-ComputerInfoWindowsBuildLabEx : 22621.1.amd64fre.ni_release.220506-1250WindowsCurrentVersion : 6.3WindowsInstallationType : ClientWindowsProductName : Windows 10 Pro...... 1、安装 vfoxvfox (version-fox) 是最近比较热门的一个跨平台通用版本管理工具, 使用 Go 语言进行编写, 插件机制使用了 Lua 去实现扩展性. 目前 vfox 已经支持管理大多数主流编程语言的版本, 生态还算强大. 在这里你可以看到目前 vfox 所支持管理的编程语言版本和工具 -> vfox-Available Plugins. 请确安装 0.5.3 及以上版本的 vfox, 否则 vfox-erlang 和 vfox-elixir 将无法正常工作. 在这里我们通过 winget 安装 vfox: 12345> winget install vfox.......❯ vfox -versionvfox version 0.5.3 为了能让 vfox 找到已经安装的 Elixir 和 Erlang 版本, 需要将 vfox 默认挂载到 powershell 中: 打开 PowerShell 配置文件: 123456New-Item -Type File -Path $PROFILE # 无需在意 `文件已存在` 错误# 如果它提示未能找到路径, 那么你需要强制创建 profile. 添加 "-Force" 选项. # New-Item -Type File -Path $PROFILE –ForceInvoke-Item $PROFILE # 打开 profile 将下面一行添加到你的 $PROFILE 文件末尾并保存: 1Invoke-Expression "$(vfox activate pwsh)" 如果powershell提示: 在此系统上禁止运行脚本, 那么请你以管理员身份重新运行powershell输入如下命令 123Set-ExecutionPolicy -ExecutionPolicy RemoteSigned# 之后输入Y, 按回车y 你也可以参考官方文档安装 vfox -> https://vfox.lhan.me/guides/quick-start.html. 安装好 vfox 之后, 我们再安装下版本管理插件: 1234# 添加 vfox-erlang 插件vfox add erlang# 添加 vfox-elixir 插件vfox add elixir 安装完成后就可以使用这两个 vfox 插件 vfox-erlang 和 vfox-elixir 在 Windows 平台去安装管理多个 Erlang 和 Elixir 的版本了. 2、通过 vfox-erlang 插件安装 Erlang/OTP因为 Elixir 依赖于 Erlang/OTP, 所以在安装 Elixir 之前, 我们需要先安装下 Erlang/OTP. 如果你已经通过其他方式安装了 Erlang/OTP, 请确保后续通过 vfox-elixir 安装的 Elixir 版本与它是兼容的, 可以查看 Elixir 官方文档说明去确认这一点 between-elixir-and-erlang-otp. 12345678910111213141516# 通过 vfox search 找到你想要安装的版本❯ vfox search erlangPlease select a version of erlang [type to search]: -> v25.0.4 v24.3.4.16 v24.1.3 v24.0 v24.3 v24.3.2 v25.2 v27.0-rc2 v24.3.4.1Press ↑/↓ to select and press ←/→ to page, and press Enter to confirm# 当然你也可以指定安装一个版本, 比如vfox install erlang@26.2.2 理论上, 你可以安装任何一个出现在 https://github.com/erlang/otp/releases 中包含 exe 文件的发行版本. 当你看到如下信息, 就表明安装完成了. 1234compile info..........Install erlang@26.2.2 success! Please use vfox use erlang@26.2.2 to use it. 我们使用 vfox 切换下到刚才安装好的 Erlang/OTP 版本来验证下安装是否成功: 1234567❯ vfox use -g erlang@26.2.2Now using erlang@26.2.2.❯ erlErlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]Eshell V14.2.2 (press Ctrl+G to abort, type help(). for help)1> 如果能正确唤醒 REPL (Read-Eval-Print Loop) 交互式命令行, 那么安装就好啦. 接下来开始安装 Elixir 吧 3、 通过 vfox-elixir 插件安装 Elixir在开始安装指定的 Elixir 版本之前, 请确保当前安装的 shell 能找到已经安装好 Erlang/OTP 版本相关工具链 12345678910111213141516171819202122232425262728293031323334# 切换 Erlang/OTP 版本vfox use -g erlang@26.2.2# 安装一个与 Erlang/OTP 版本兼容的 Elixir 版本> vfox search elixirPlease select a version of elixir to install [type to search]:-> v1.16.2-elixir-otp-26 v1.16.2-elixir-otp-25 v1.16.2-elixir-otp-24 v1.16.1-elixir-otp-26 v1.16.1-elixir-otp-25 v1.16.1-elixir-otp-24 v1.16.0-rc.1-elixir-otp-26 v1.16.0-rc.1-elixir-otp-25 v1.16.0-rc.1-elixir-otp-24 v1.16.0-rc.0-elixir-otp-26 v1.16.0-rc.0-elixir-otp-25 v1.16.0-rc.0-elixir-otp-24 v1.16.0-elixir-otp-26 v1.16.0-elixir-otp-25 v1.16.0-elixir-otp-24 v1.15.7-elixir-otp-26 v1.15.7-elixir-otp-25 v1.15.7-elixir-otp-24 v1.15.6-elixir-otp-26 v1.15.6-elixir-otp-25Press ↑/↓ to select and press ←/→ to page, and press Enter to confirm# 比如vfox install elixir@v1.16.1-elixir-otp-26..........Install elixir@1.16.1-elixir-otp-26 success!Please use vfox use elixir@1.16.1-elixir-otp-26 to use it. 当你看到形如 Install elixir@1.16.1-elixir-otp-26 success! Please use vfox use elixir@1.16.1-elixir-otp-26 to use it. 相关信息, 就代表安装已经完成了, 接下来验证下可用性: 12345❯ vfox use -g elixir@1.16.1-elixir-otp-26Now using elixir@1.15.2.> iex.batErlang/OTP 26 [erts-14.2.5] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns] Interactive Elixir (1.16.1) - press Ctrl+C to exit (type h() ENTER for help)iex(1)> Elixir 的 REPL (Read-Eval-Print Loop) 交互式命令行能正常打开的话, 那么安装时成功且可用的. 最后vfox 的两个安装管理 Erlang/OTP 和 Elixir 版本的插件同时也支持在 Uinx-like (Linux & Darwin MacOS) 系统下管理多个版本. 你可以查看这个文档去了解更多信息: https://github.com/version-fox/vfox-elixir. 全平台操作系统支持~ Happy & funny!","categories":[{"name":"vfox","slug":"vfox","permalink":"https://yeshan333.github.io/categories/vfox/"}],"tags":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"},{"name":"Erlang","slug":"Erlang","permalink":"https://yeshan333.github.io/tags/Erlang/"},{"name":"vfox","slug":"vfox","permalink":"https://yeshan333.github.io/tags/vfox/"},{"name":"Windows","slug":"Windows","permalink":"https://yeshan333.github.io/tags/Windows/"}]},{"title":"手把手教你如何在 Sider (ChatGPT Sidebar) 中免费使用通义千问","slug":"free-to-use-sider-with-qwen","date":"2024-05-29T00:29:49.000Z","updated":"2024-05-29T00:29:49.000Z","comments":true,"path":"2024/05/29/free-to-use-sider-with-qwen/","permalink":"https://yeshan333.github.io/2024/05/29/free-to-use-sider-with-qwen/","excerpt":"","text":"最近国产大模型正在疯狂降价,推出了众多的免费策略,是时候该“白嫖”一手了。用过 Sider 的小伙伴应该很少有说不“妙”啊,用户体验也做得很棒。奈何它要开通使用全部的功能价格有可能不太能承受,且有些功能不一定用得上。但是免费,又有一定的额度和次数限制。Sider 其实是支持用户使用自己的 OpenAI 密钥的,但 OpenAI 的几个也不太低呐。 接下来本文将会介绍如何在 Sider 中“免费”使用通义千问。 什么是 Sider (ChatGPT Sidebar) Sider 是一款智能工具,可以添加到您的浏览器中,帮助您轻松完成各种在线任务。它使用 ChatGPT、GPT-4、Gemini 和 Claude 3 等 API,可以帮助您进行写作、阅读、聊天以及内容摘要等。以下是 Sider 的主要功能: 聊天任何话题、文件、图像 - 您可以就任何感兴趣的话题进行聊天, 甚至可以向 Sider 展示图片或文档,它会给出清晰的答复或建议,让每次聊天都很有趣且有帮助。 更快地阅读网页、选定文本、电子邮件 - Sider 可以帮助您更快地浏览网页、文本和电子邮件, 提供要点总结, 让您轻松快速地浏览长篇文章或消息。 更好地写作任何内容 - 无论是电子邮件、文章还是消息, Sider 都可以帮助您改善写作质量,提供建议以使您的写作更符合您的风格和目的。 等等 访问产品官网即可在浏览器快速安装 Sider 插件: https://sider.ai/zh-CN/ 在 Sider 浏览器插件中使用通义千问 “通义千问”是阿里云开发的一款大型语言模型. 如果你用过 Sider,应该知道能在通用配置处配置自己的 OpenAI 密钥的。要想在 Sider 中使用通义千问大模型,我们也需要用到这个配置。 最近阿里云的灵积模型服务开放 API 出了 OpenAI 的兼容模式接口 -> OpenAI接口兼容, 这意味着我们使用这个兼容接口作为 Sider 插件的配置即可使用通义千问。如下图,我们有三个配置需要填写: 1、API Key 从阿里云的模型服务灵积控制台获取 -> 获取 API Key 2、url 填写:https://dashscope.aliyuncs.com/compatible-mode 3、使用自定义模型名称,Model Name 填写你想使用的大模型名字,比如 qwen-turbo, 模型可以从这里找到: 通义前文-模型概览 配置完成之后,就可以直接使用它啦~","categories":[{"name":"大模型","slug":"大模型","permalink":"https://yeshan333.github.io/categories/%E5%A4%A7%E6%A8%A1%E5%9E%8B/"},{"name":"LLMs","slug":"LLMs","permalink":"https://yeshan333.github.io/categories/LLMs/"},{"name":"Sider","slug":"Sider","permalink":"https://yeshan333.github.io/categories/Sider/"}],"tags":[{"name":"Sider","slug":"Sider","permalink":"https://yeshan333.github.io/tags/Sider/"},{"name":"通义千问","slug":"通义千问","permalink":"https://yeshan333.github.io/tags/%E9%80%9A%E4%B9%89%E5%8D%83%E9%97%AE/"}]},{"title":"使用 vscode 插件 vscode-jenkins-pipeline-linter-connector 和 LLMs 大模型校验你的 Jenkinsfile","slug":"validate-jenkinsfile","date":"2024-05-25T17:05:12.000Z","updated":"2024-05-25T17:05:12.000Z","comments":true,"path":"2024/05/25/validate-jenkinsfile/","permalink":"https://yeshan333.github.io/2024/05/25/validate-jenkinsfile/","excerpt":"","text":"Jenkins 一直以来都是比较热门的用来做 CI/CD 的自动化工具, 如果你使用过 GitHub Action, 和它类似, 现在大多数的自动化工具都会提供 DSL(领域特定语言)去描述 & 编排自动化工作流, Jenkins 的 Pipeline Syntax 就是 Jenkins 提供的编排语言, 对应的编排文件一般称之为 Jenkinsfile, 语法规则和 Groovy 很类似. 我平常使用 Declarative Pipeline Syntax 比较多, Jenkinsfile 的管理一般都会使用一个 Git 仓库. 在本地编辑完成之后一直比较头疼的是语法的校验, 经常需要代码提交之后实际去跑 Pipeline 才能确认有没有语法问题. 其实这个语法校验在 Jenkins 的 UI 上配置是自带的, 但总不能每次在代码编辑器编辑之后再拷贝上去吧, Jenkins 的官方文档也有建议本地开发 Pipeline 的使用可以使用什么工具链 pipeline-development-tools. 可以使用命令行工具、Jenkins Open API、IDE 插件等可以去使用. 日常使用 Visual Studio Code 比较多, 所以最终选择了 vscode 的插件 vscode-jenkins-pipeline-linter-connector, 这个插件原理实现上还是通过将 Jenkinsfile 的内容通过 API 提交给 Jenkins 去校验的. 不过插件已经年久失修了, 代码比较久了, 实际的使用上遇到了不少的问题, 例如: Jenkinsfile 带有中文的话校验结果显示容易乱码, 比如这个 Jenkinsfile: 1234567891011pipeline { agent any stages { stage('Hello中文>>>>>') { steps { echo 'Hello Worl中文 } } }} 校验结果返回会有段乱码, 如下: 123Errors encountered validating Jenkinsfile:WorkflowScript: 6: unexpected char: 0xB8 @ line 6, column 36. echo 'Hello World'中æ�� 插件实现依赖的基础库也比较老了, 所以我 fork 了一下原来插件, 做了下代码重构和部分问题的修复 & 优化工作, 主要如下: 修复 Jenkinsfile 中文乱码问题. 可以在不保存 Jenkinsfile 的时候直接进行校验. 文件保存的时候立即自动触发校验. 支持控制什么样的文件名可以进行校验, 相当于一个白名单机制, 可能会有些人会将工作流定义写在另外的文件名下, 比如: workflows.jenkins 等, 所以才有了这个特性. 引入 langchain.js 和 Cloudflare 免费的 Workers AI REST API 配置大模型做 Review. … 插件现在已经同步发布到了 Visual Studio Code 商店和 Open VSX Registry 中, 理论上你可以在 Microsoft Visual Studio Code、code-server、VSCodium 等 vscode 系列 IDE 中使用到它, 链接如下: Microsoft Visual Studio Marketplace: https://marketplace.visualstudio.com/items?itemName=yeshan333.jenkins-pipeline-linter-connector-fork Open VSX Registry: https://marketplace.visualstudio.com/items?itemName=yeshan333.jenkins-pipeline-linter-connector-fork 现在你应该能在插件搜索里搜索到它, 使用 yeshan333.jenkins-pipeline-linter-connector-fork 去搜索安装即可: 配置插件插件的文档里已经给出了几个示例配置, 将配置填入你的 vscode 用户配置 json 文件中即可: 12345{ "jenkins.pipeline.linter.connector.url": "https://jenkins.shan333.cn/pipeline-model-converter/validate", "jenkins.pipeline.linter.connector.user": "jenkins_username", "jenkins.pipeline.linter.connector.pass": "jenkins_password"} 将 url、用户密码替换成你自己的 Jenkins 即可. 当然你也可以在插件配置处直接进行配置: 配置完成之后直接通过命令面板 (Command Pallette) 使用 Validate Jenkins 即可开启 Jenkinsfile 校验: 接下来介绍如何使用 LLM 去帮你评审 Jenkinsfile. 使用 LLM 大模型评审你的 Jenkinsfile这一功能默认是关闭的, 需要通过配置 jenkins.pipeline.linter.connector.llm.enable 去开启, 功能开启之后我们还需要几个填写几个关键配置, 如下: 123456{ "jenkins.pipeline.linter.connector.llm.enable": true, "jenkins.pipeline.linter.connector.llm.baseUrl": "https://api.cloudflare.com/client/v4/accounts/<CF_ACCOUNT_ID>/ai/v1", "jenkins.pipeline.linter.connector.llm.modelName": "@cf/meta/llama-2-7b-chat-fp16", "jenkins.pipeline.linter.connector.llm.apiKey": "<CF_API_TOKEN>",} 其中 baseUrl 和 apiKey 需要我们到 Cloudflare 用户管理后台申请. 插件默认会使用 Cloudflare Workers AI REST API 提供的文本生成模型去评审 review 我们的 Jenkinsfile, 目前它提供免费额度基本够日常使用. Step 1: 你需要先按照 Cloudflare 提供的文档去获取 API 访问的密钥 -> Get started with the Workers AI REST API, 将获取到的 API Token 填入配置 "jenkins.pipeline.linter.connector.llm.apiKey" 中. Step 2: 在上一步, 你在申请的时候也会拿到一个 Account ID, 这个 ACCOUNT ID 用于组装配置 "jenkins.pipeline.linter.connector.llm.baseUrl", 将 "https://api.cloudflare.com/client/v4/accounts/<CF_ACCOUNT_ID>/ai/v1" 的 <CF_ACCOUNT_ID> 替换为你的 Account ID 即可 配置 jenkins.pipeline.linter.connector.llm.modelName 是可选地, 你可以选用 https://developers.cloudflare.com/workers-ai/models/#text-generation 提到的任意一个文本生成模型去做评审. 将上述配置配置完成之后, 通过 vscode 命令面板 (Command Pallette) 使用 Validate Jenkins 开启 Jenkinsfile 校验的同时也会同时向大模型询问评审意见, 大致效果如下:","categories":[{"name":"Jenkins","slug":"Jenkins","permalink":"https://yeshan333.github.io/categories/Jenkins/"}],"tags":[{"name":"Jenkins","slug":"Jenkins","permalink":"https://yeshan333.github.io/tags/Jenkins/"},{"name":"Cloudflare","slug":"Cloudflare","permalink":"https://yeshan333.github.io/tags/Cloudflare/"},{"name":"Workers AI","slug":"Workers-AI","permalink":"https://yeshan333.github.io/tags/Workers-AI/"},{"name":"Langchain","slug":"Langchain","permalink":"https://yeshan333.github.io/tags/Langchain/"},{"name":"LLMs","slug":"LLMs","permalink":"https://yeshan333.github.io/tags/LLMs/"}]},{"title":"etcd 和 MongoDB 的混沌(故障)测试方法","slug":"etcd-and-mongodb-chaos-testing","date":"2024-05-18T15:02:09.000Z","updated":"2024-05-18T15:02:09.000Z","comments":true,"path":"2024/05/18/etcd-and-mongodb-chaos-testing/","permalink":"https://yeshan333.github.io/2024/05/18/etcd-and-mongodb-chaos-testing/","excerpt":"","text":"最近在对一些自建的数据库 driver/client 基础库的健壮性做混沌(故障)测试, 去验证了解业务的故障处理机制和恢复时长. 主要涉及到了 MongoDB 和 etcd 这两个基础组件. 本文会介绍下相关的测试方法. MongoDB 中的故障测试 MongoDB 是比较世界上热门的文档型数据库, 支持 ACID 事务、分布式等特性. 社区上大部分对 MongoDB 进行混沌(故障)测试的文章大多都是外围通过对 monogd 或 mongos 进行做处理进行模拟的. 比如如果想要让 MongoDB 自己触发副本集切换, 可以通过一下这样一段 shell 脚本: 123456# 将副本集主节点进程挂死kill -s STOP <mongodb-primary-pid># 挂死之后, 业务受损, MongoDB 在几秒到十几秒应该会进程主备切换# 切换完成后, 业务能自动将连接切换到新的工作正常的主节点, 无需人工干预, 业务恢复正常# 这里一般验证的是 Mongo Client Driver 的可靠性 上面提到的手段一般是系统层级的, 如果我们只是想要模拟某个 MongoDB command 命令遇到网络问题了, 怎么做?进一步想要进行更细粒度的测试. 其实 MongoDB 在 4.x 以上版本内部已经实现了一套可控的故障点模拟机制 -> failCommand. 在测试环境部署 MongoDB 副本集的时候, 一般可以通过以下方式启动这个特性: 1mongod --setParameter enableTestCommands=1 然后我们可以通过 mongo shell 针对特定的 command 开启故障点, 例如针对一次 find 操作让其返回错误码 2: 1234567db.adminCommand({ configureFailPoint: "failCommand", mode: { "times": 1, }, data: {errorCode: 2, failCommands: ["find"]}}); 这些故障点模拟是可控的, 成本相对于必直接在机器上搞破坏比较低, 也很适合融入持续集成自动化流程. MongoDB 内置的故障点机制还支持了很多的特性, 比如让某个故障概率发生、返回任意 MongoDB 支持的错误码类型等等, 通过该机制, 我们可以很方便的在单元测试和集成测试中验证我们自己实现的 MongoDB Client Driver 的可靠性. 如果想具体知道 MongoDB 支持哪些故障点, 可以详细查看 MongoDB 提供的 specification, 里面有提到针对 MongoDB 每一个特性, driver 可以使用哪些故障点进行测试. MongoDB 官方提供的 go 实现的 dirver 代码仓库中也有不少的例子可以参考 https://github.com/mongodb/mongo-go-driver/blob/345ea9574e28732ca4f9d7d3bb9c103c897a65b8/mongo/with_transactions_test.go#L122. etcd 中的故障测试 etcd 是一个开源的、高可用的分布式键值存储系统, 它主要用于共享配置和服务发现. 之前我们提到了 MongoDB 内置了可控的故障点注入机制方便我们做故障点测试, 那么 etcd 是否也提供了呢? 没错, etcd 官方也提供了内置的可控故障注入手段方便我们围绕 etcd 做故障模拟测试, 不过官方提供的可供部署的二进制分发默认是没有使用故障注入特性的, 区别于 MongoDB 提供了开关, etcd 需要我们手动从源码编译出包含故障注入特性的二进制出来去部署. etcd 官方实现了一个 Go 包 gofail 去做 “可控” 的故障点测试, 可以控制特定故障发生的概率和次数. gofail 可以用于任意 Go 实现的程序中. 原理上通过注释在源代码中通过注释 (// gofail:) 去对可能发生问题的地方埋藏一些故障注入点, 偏于进行测试验证, 例如: 12345if t.backend.hooks != nil { // gofail: var commitBeforePreCommitHook struct{} t.backend.hooks.OnPreCommitUnsafe(t) // gofail: var commitAfterPreCommitHook struct{}} 在使用 go build 构建出二进制之前, 使用 gofail 提供的命令行工具 gofail enable 可以取消这些故障注入相关代码的注释, 并生成故障点相关的代码,这样编译出的二进制可以用于故障场景的细粒度测试. 使用 gofail disable 去注释去除掉生成的故障点相关代码, 再使用 go build 编译出的二进制就可以在生产环境使用. 在执行二进制的时候, 可以通过环境变量 GOFAIL_FAILPOINTS 去唤醒故障点, 如果你的二进制程序是个永不停机的服务, 那么可以通过 GOFAIL_HTTP 环境变量在程序启动的同时, 启动一个 HTTP endpoint 去给外部测试工具唤醒埋藏的故障点. 具体的原理实现可以查看下 gofail 的设计文档 -> design. 值的一提的是 pingcap 重新基于 gofail 重新造了个轮子, 做了不少优化:failpoint 相关代码不应该有任何额外开销;不能影响正常功能逻辑,不能对功能代码有任何侵入;failpoint 代码必须是易读、易写并且能引入编译器检测;最终生成的代码必须具有可读性;生成代码中,功能逻辑代码的行号不能发生变化(便于调试);如果想要了解它的实现原理, 可以查看这篇官方文章: Golang Failpoint 的设计与实现这篇深度剖析的博客也值得一读: 在 Go 中使用 Failpoint 注入故障 接下来我们看看如何在 etcd 中启用这些故障埋点。 编译出可供进行故障测试的 etcdetcd 官方仓库的 Makefile 已经内置了对应的指令帮我们快速编译出包含故障点二进制 etcd server. 编译步骤大致如下: 12345678git clone git@github.com:etcd-io/etcd.gitcd etcd# 激活故障点注释make gofail-enablemake build# 还原代码make gofail-disable 经过如上步骤之后, 编译好的二进制文件直接可以在 bin 目录下可以看到, 让我们启动 etcd 看一下: 12# 开启通过 HTTP 激活故障点的方式GOFAIL_HTTP="127.0.0.1:22381" ./bin/etcd 使用 curl 看下有哪些故障点可以使用: 123456789101112131415161718192021222324252627282930313233343536curl http://127.0.0.1:22381afterCommit=afterStartDBTxn=afterWritebackBuf=applyBeforeOpenSnapshot=beforeApplyOneConfChange=beforeApplyOneEntryNormal=beforeCommit=beforeLookupWhenForwardLeaseTimeToLive=beforeLookupWhenLeaseTimeToLive=beforeSendWatchResponse=beforeStartDBTxn=beforeWritebackBuf=commitAfterPreCommitHook=commitBeforePreCommitHook=compactAfterCommitBatch=compactAfterCommitScheduledCompact=compactAfterSetFinishedCompact=compactBeforeCommitBatch=compactBeforeCommitScheduledCompact=compactBeforeSetFinishedCompact=defragBeforeCopy=defragBeforeRename=raftAfterApplySnap=raftAfterSave=raftAfterSaveSnap=raftAfterWALRelease=raftBeforeAdvance=raftBeforeApplySnap=raftBeforeFollowerSend=raftBeforeLeaderSend=raftBeforeSave=raftBeforeSaveSnap=walAfterSync=walBeforeSync= 知道了故障点, 就可以针对指定故障设置故障类型, 如下: 12345# beforeLookupWhenForwardLeaseTimeToLive 处 sleep 1 秒curl http://127.0.0.1:22381/beforeLookupWhenForwardLeaseTimeToLive -XPUT -d'sleep(10000)'# 查看故障点状态curl http://127.0.0.1:22381/beforeLookupWhenForwardLeaseTimeToLivesleep(1000) 故障点的描述语法见: https://github.com/etcd-io/gofail/blob/master/doc/design.md#syntax 至此, 已经可以利用 etcd 内置的故障点做一些故障模拟测试了, 具体怎么使用这些故障点可以参考下 etcd 官方的集成测试实现 -> etcd Robustness Testing. 通过故障点名称搜索相关代码即可. 除了上述这些 etcd 内置的故障点, etcd 的官方仓库也提供了一份系统级的集成测试例子 -> etcd local-tester, 它模拟了 etcd 集群模式下的节点宕机测试. 好了, 本文的分享, 到此暂时结束啦 ღ( ´・ᴗ・` )~ 小广告插播: 最近维护了可以维护多个 etcd server、etcdctl、etcductl 版本的工具 vfox-etcd, 你也可以用它来在机器上安装多个包含 failpoint 的 etcd 版本进行混沌 (故障模拟) 测试哦~","categories":[{"name":"Chaos","slug":"Chaos","permalink":"https://yeshan333.github.io/categories/Chaos/"}],"tags":[{"name":"Chaos Testing","slug":"Chaos-Testing","permalink":"https://yeshan333.github.io/tags/Chaos-Testing/"},{"name":"etcd","slug":"etcd","permalink":"https://yeshan333.github.io/tags/etcd/"},{"name":"MongoDB","slug":"MongoDB","permalink":"https://yeshan333.github.io/tags/MongoDB/"}]},{"title":"通过 vfox 安装管理多版本 Erlang 和 Elixir","slug":"install-erlang-and-elixir-via-vfox","date":"2024-04-27T15:36:31.000Z","updated":"2024-04-27T15:36:31.000Z","comments":true,"path":"2024/04/27/install-erlang-and-elixir-via-vfox/","permalink":"https://yeshan333.github.io/2024/04/27/install-erlang-and-elixir-via-vfox/","excerpt":"","text":"vfox (version-fox) 是最近比较热门的一个通用版本管理工具,使用 Go 语言进行编写,插件机制使用了 Lua 去实现扩展性. 目前 vfox 已经支持管理大多数主流编程语言的版本,生态还算强大。在这里你可以看到目前 vfox 所支持管理的编程语言版本和工具 -> vfox-Available Plugins Elixir 和 Erlang 社区一直以来都比较流行通过 asdf 去安装和管理多版本环境。asdf 也是一个通用的版本管理工具,生态非常的丰富。 vfox 的版本管理上和 asdf 很像,均通过 .tool-versions 文件去管理项目级和全局的版本信息。这意味着如果你之前使用了 asdf,那么切换到 vfox,不会很困难。因为 vfox 和 asdf 的核心实现有有点不一样,vfox 的执行速度比 asdf 快了将近 5 倍~,官方文档也给出了基准测试结果:version-fox Comparison with asdf-vm 如果你之前使用 asdf 去管理维护多个 Erlang 和 Elixir 的版本,那么 vfox 也是一个不错的选择,值的一试。 本篇文章将会介绍如果通过 vfox 去安装和管理多个 Erlang 和 Elixir 的版本。 安装 vfoxvfox (version-fox) 的跨操作系统支持上很友好,这意味可以 Windows 和 Unix-like 系统上使用它。本篇文章的核心是通过 vfox 去安装和管理多个 Erlang 和 Elixir 语言的版本。因为目前 vfox 的两个管理 Erlang 和 Elixir 版本的插件实现上还没有去支持在 Windows 操作系统下的管理,所以本篇文章的示例环境主要是 Ubuntu 20.04 Linux 环境。让我们开始吧~ 先安装下 vfox (version fox): 123echo "deb [trusted=yes] https://apt.fury.io/versionfox/ /" | sudo tee /etc/apt/sources.list.d/versionfox.listsudo apt-get updatesudo apt-get install vfox 为了能让 vfox 找到已经安装的 Elixir 和 Erlang 版本,需要将 vfox 默认挂载到 shell 中。接下来修改下 shell 的配置 (以 Bash 为例): 1echo 'eval "$(vfox activate bash)"' >> ~/.bashrc 你也可以参考这个官方文档安装 vfox -> https://vfox.lhan.me/guides/quick-start.html。安装好 vfox 之后,我们再安装下插件: 1234# 添加 vfox-erlang 插件vfox add erlang# 添加 vfox-elixir 插件vfox add elixir 接下来我们就可以通过上面安装好的两个 vfox 插件 vfox-erlang 和 vfox-elixir 去安装管理多个 Erlang 和 Elixir 的版本了。 通过 vfox-erlang 插件安装 Erlang/OTP因为 Elixir 依赖于 Erlang,所以在安装 Elixir 之前,我们需要先安装下 Erlang。Erlang 的安装是通过对应版本的源码进行安装的,所以我们需要有对应的编译工具链,这里以 Ubuntu 20.04 为例: 1sudo apt-get -y install build-essential autoconf m4 libncurses5-dev libwxgtk3.0-gtk3-dev libwxgtk-webview3.0-gtk3-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev openjdk-11-jdk 接下来可以安装 Erlang 了。 12345678910111213141516# 通过 vfox search 找到你想要安装的版本❯ vfox search erlangPlease select a version of erlang [type to search]: -> v25.0.4 v24.3.4.16 v24.1.3 v24.0 v24.3 v24.3.2 v25.2 v27.0-rc2 v24.3.4.1Press ↑/↓ to select and press ←/→ to page, and press Enter to confirm# 当然你也可以指定安装一个版本,比如vfox install erlang@26.2.2 理论上,你可以安装任何一个出现在 https://github.com/erlang/otp/releases 的版本。因为是从源码编译安装的, 所以安装过程会花费点时间。当你看到如下信息,就表明安装完成了。 1234compile info..........Install erlang@26.2.2 success! Please use vfox use erlang@26.2.2 to use it. 我们使用 vfox 切换下到刚才安装好的 Erlang/OTP 版本来验证下安装是否成功: 1234567❯ vfox use erlang@26.2.2Now using erlang@26.2.2.❯ erlErlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]Eshell V14.2.2 (press Ctrl+G to abort, type help(). for help)1> 如果能正确唤醒 REPL,那么安装就好啦。接下来开始安装 Elixir 吧 安装 Elixir因为安装 Elixir 也是从对应版本的源码进行编译安装的,Elixir 的编译需要依赖到 Erlang,我们先让当前使用的 shell 能找到刚才安装好的 Erlang。 123456789101112131415# 切换 Erlang 版本❯ vfox use erlang@26.2.2Now using erlang@26.2.2.# 安装 Elixir,将会使用对应的 erlc 编译器> vfox install elixir@1.15.2..................Generated ex_unit app==> logger (compile)Generated logger appGenerated eex app==> iex (compile)Generated iex appInstall elixir@1.15.2 success! Please use vfox use elixir@1.15.2 to use it. 当你看到 Install elixir@1.15.2 success!,也就意味着安装成功了。可以通过 iex 确认下安装彻底成功: 1234567❯ vfox use elixir@1.15.2Now using elixir@1.15.2.❯ iexErlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]Interactive Elixir (1.15.2) - press Ctrl+C to exit (type h() ENTER for help)iex(1)> 如果你想要安装其他版本的 Elixir,请确保当前使用的 Erlang/OTP 版本和 Elixir 版本是兼容的,可以查看这个文档去确认兼容性: 《compatibility-and-deprecations.html#between-elixir-and-erlang-otp》。 设置全局使用版本我们可以使用 vfox use -g xxx 设置默认使用的 Erlang 和 Elixir 版本。 1234567> vfox use -g erlang@26.2.2> vfox use -g elixir@1.15.2# 可以查看 .tool-versions 确认设置是否完成> cat ~/.version-fox/.tool-versions erlang 26.2.2elixir 1.15.2 最后vfox 的两个安装管理 Erlang/OTP 和 Elixir 版本的插件同时也支持在 MacOS Darwin 下管理多个版本。你可以查看这个文档去了解更多信息: https://github.com/version-fox/vfox-elixir?tab=readme-ov-file#install-in-darwin-macos-13. Happy & funny!","categories":[{"name":"vfox","slug":"vfox","permalink":"https://yeshan333.github.io/categories/vfox/"}],"tags":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"},{"name":"Erlang","slug":"Erlang","permalink":"https://yeshan333.github.io/tags/Erlang/"},{"name":"vfox","slug":"vfox","permalink":"https://yeshan333.github.io/tags/vfox/"}]},{"title":"使用 vfox-erlang 安装管理多个 Erlang/OTP 版本","slug":"using-vfox-erlang-to-manage-erlang-version","date":"2024-04-25T23:15:01.000Z","updated":"2024-04-25T23:15:01.000Z","comments":true,"path":"2024/04/25/using-vfox-erlang-to-manage-erlang-version/","permalink":"https://yeshan333.github.io/2024/04/25/using-vfox-erlang-to-manage-erlang-version/","excerpt":"","text":"vfox (version fox) 是一款跨平台、可拓展的通用版本管理器. 支持原生 Windows 以及 Unix-like 系统! 通过它, 可以快速安装和切换开发环境的软件版本. 最近给 vfox 水了几个插件, 其中就有管理多个 Erlang/OTP 版本的, 很喜欢他的插件管理机制. 之前也有使用过类似的工具 asdf, 不过 asdf 之前的使用体验不怎么好 (木有拉踩的意思~, asdf 的生态是非常强大的), vfox 现在支持的插件已经非常之多了, 已经可以管理大多数常见主流语言的版本. vfox 的版本管理工作流大体上是和 asdf 类似的, 不过性能要好一点 (5 倍左右), 毕竟 asdf 核心是 shell 写的. 官方文档也给出了一份基准测试, 参见 《Comparison with asdf-vm》: vfox 和 asdf 一样, 可以通过 .tool-version 配置文件设置全局和项目级使用到的版本, 这意味着如果你从 asdf 切换到 vfox, 相当的方便. vfox-erlang 的使用本篇文章主要介绍怎么使用 vfox-erlang 插件, 在同一台机器上管理多个 Erlang/OTP 的版本. 一般在开发环境拥有多个版本的 Erlang/OTP 供测试比对也是常见的需求. 目前插件的实现上实际的安装过程是通过从源码进行编译安装 Erlang/OTP 的, 所以暂时只支持在 Unix-like 系统 (比如 ubuntu、macos darwin 等) 上安装管理 Erlang/OTP 的版本 (官方其实提供了 exe 安装器在 windows, 还没时间去研究加上去 2333~, 不过在 windows 使用 Erlang 的场景一般也比较少)。 Erlang 是一种编程语言, 用于构建具有高可用性要求的大规模可扩展软实时系统。它的一些用途是电信、银行、电子商务、计算机电话和即时通讯。Erlang 的运行时系统内置了对并发、分布和容错的支持。OTP 是一组 Erlang 库和设计原则, 提供中间件来开发这些系统。它包括自己的分布式数据库、用于连接其他语言的应用程序、调试和发布处理工具。 安装 vfox 和 vfox-erlang 插件在使用 vfox-erlang 管理 Erlang/OTP 版本之前, 请确保你已经在你的机器上安装好了 vfox, 可以参考官方的文档 Quick Start, 本文以 Ubuntu 为例. 12345678910# 安装 vfoxecho "deb [trusted=yes] https://apt.fury.io/versionfox/ /" | sudo tee /etc/apt/sources.list.d/versionfox.listsudo apt-get update -ysudo apt-get install vfox -y# 让 vfox hook 你的 shell, 偏于 vfox 识别使用的 Erlang/OTP 版本echo 'eval "$(vfox activate bash)"' >> ~/.bashrc# 添加 vfox-erlang 插件vfox add erlang 安装使用指定版本 Erlang/OTP由于是是从源码编译安装的 Erlang/OTP, 所以我们需要有对应的构建工具链和依赖软件, 这里以 Ubuntu 20.04 下安装为例: 12# “无脑”安装依赖的软件sudo apt-get -y install build-essential autoconf m4 libncurses5-dev libwxgtk3.0-gtk3-dev libwxgtk-webview3.0-gtk3-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev openjdk-11-jdk 然后我们即可通过 vfox 管理安装多个 Erlang/OTP 版本了。 123456789101112# 可以使用 search 命令查找可供安装的版本❯ vfox search erlangPlease select a version of erlang [type to search]: -> v25.3.2.5 v24.0-rc3 v24.3 v23.3.4.18 v24.0.6 v24.3.2 v25.3 v24.1.4 v26.0.2 12345# 或者直接指定一个版本安装> vfox install erlang@26.2.2...Install erlang@26.2.2 success! Please use vfox use erlang@26.2.2 to use it. 当你看到类似 Install erlang@xxx success! 的信息, 就意味着安装完成了。接下来可以通过 vfox use 命令切换版本, 即可让当前 shell 会话可以使用对应的 Erlang/OTP 版本了. 1vfox use erlang@26.2.2 vfox 提供了三种视角的版本管理方法: shell 会话、项目级、全局, 通过一个 .tool-versions, 可以灵活的为不同的项目目录分配使用不同的 Erlang/OTP 版本, 跟多信息可以查看官方文档的介绍: vfox-Switch runtime. 本篇文章的使用示例主要以 Linux 系统为主, 但是 vfox-erlang 的使用文档上也给出了在 MacOS Darwin 系统下的使用指南 install-in-darwin-macos-13, 并提供了在 Linux 和 MacOS 下持续集成测试供参考: vfox-erlang E2E testing. Happy and funny~","categories":[{"name":"vfox","slug":"vfox","permalink":"https://yeshan333.github.io/categories/vfox/"}],"tags":[{"name":"vfox","slug":"vfox","permalink":"https://yeshan333.github.io/tags/vfox/"},{"name":"Erlang/OTP","slug":"Erlang-OTP","permalink":"https://yeshan333.github.io/tags/Erlang-OTP/"},{"name":"vfox-plugin","slug":"vfox-plugin","permalink":"https://yeshan333.github.io/tags/vfox-plugin/"},{"name":"vfox-erlang","slug":"vfox-erlang","permalink":"https://yeshan333.github.io/tags/vfox-erlang/"}]},{"title":"使用 chezmoi & vscode, 管理你的 dotfiles","slug":"using-chezmoi-to-manage-dotfiles","date":"2024-03-23T16:11:23.000Z","updated":"2024-03-23T16:11:23.000Z","comments":true,"path":"2024/03/23/using-chezmoi-to-manage-dotfiles/","permalink":"https://yeshan333.github.io/2024/03/23/using-chezmoi-to-manage-dotfiles/","excerpt":"","text":"什么是 dotfiles In Unix-like operating systems, any file or folder that starts with a dot character (for example, /home/user/.config), commonly called a dot file or dotfile.任何以 . 开头去命名的文件或者目录都可以称为 dotfile, 在 Unix-like 系统一般用的比较多, 但现在 dotfile 一般用于管理应用/软件的配置, 所以 Windows 平台上也可以看到 dotfile 的身影. 什么是 chezmoichezmoi 是使用 Go 编写的跨平台 dotfiles 管理工具, 使用同一的 Git 仓库进行配置同步, 可以很方便的帮助我们在多个开发环境共用一套配置, 免去一些同一工具链需要手工重新在多个机器配置的工作量. 开源社区流行的 dotfiles 管理工具很多, 我们可以在这个网站上可以看到: https://dotfiles.github.io/utilities/. 本篇文章主要介绍使用 chezmoi 进行 dotfiles 管理的一些基本流程, 还会介绍如何使用 vscode 配置 chezmoi 让配置管理体验更好的一些小技巧. chezmoi 管理 dotfile 工作流123456789# 在使用 chezmoi 时, 需要先安装 chezmoi, 可以参考: https://www.chezmoi.io/installsh -c "$(curl -fsLS get.chezmoi.io)"# 安装完后初始化 chezmoi 的工作目录chezmoi init# 使用 chezmoi cd 可以直接切换到工作目录chezmoi cd # 然后使用 git 将工作目录和代码仓库关联起来即可git initgit remote add origin <your-git-repo> 官方文档也给出了使用 chezmoi 管理 dotfile 的工作流大概是怎么样的, 这里稍作解释: 我们以 .bashrc 文件的管理为例子: 1234567891011121314# Step 1、将 .bashrc 文件纳入 chezmoi 管控范围# chezmoi 会将该文件拷贝到 chezmoi 工作目录下, 会重命名为 dot_bashrc, 使用 dot 替换 .chezmoi add .bashrc# .bashrc 文件纳入管控之后, 就不应该在修改配置的时候编辑 .bashrc 文件了, 而是编辑 chezmoi 工作目录下的 dot_bashrc 文件# 可以切换去工作目录查看下chezmoi cdls -al# Step 2、配置的修改我们可以使用如下命令去修改, chezmoi 会使用文本编辑器打开对应的 dot_bashrc 文件chezmoi edit ~/.bashrc# Step 3、配置修改后是还没有应用到 .bashrc 文件的, diff 命令可以用来查看修改情况chezmoi diff ~/.bashrc# Step 4、想应用修改后的配置可以使用 apply 命令chezmoi apply ~/.bashrc# 至此已经基本完成一次 dotfile 的管理, 但为了想要在其他机器也使用这此改动, 是需要使用 git 做一次配置同步的 chezmoi 使用的一些小技巧与配置建议1、替换 chezmoi edit 使用的默认编辑器为 vscodechezmoi edit 默认根据 $VISUAL 或 $EDITOR 环境变量决定使用什么编辑器打开文件, 我们可以修改 chezmoi 的配置文件改变 chezmoi 文件的行为, 配置文件一般在 ~/.config/chezmoi 目录下, 参考配置如下: 12345# 控制 chezmoi edit 命令使用的编辑器, code --wait 会确保文件关闭再继续# 配置文件在: ~/.config/chezmoi/chezmoi.toml[edit] command = "code" args = ["--wait"] tips: chezmoi apply 应用修改后的配置时, 会根据 chezmoi 工作目录的层级去覆盖 HOME 目录对应的文件 2、替换 chezmoi diff 使用的 diff 工具为 vscode万物皆可 vscode, 如果你想使用 vscode 的 dif 能力怎么办, 这里直接给出 chemoi 的参考配置: 1234567# https://github.com/twpayne/chezmoi/discussions/2424[diff]command = "code"args = ["--wait", "--diff", "{{ .Destination }}", "{{ .Target }}"][merge]command = "bash" 3、敏感数据存储如果你想用 chezmoi 管理你的密钥(例如: id_rsa ssh 密钥),同时又想把你的 dotfiles 配置在 GitHub 共享出来,chezmoi 自带了敏感数据存储的方案,可以使用 GPG、AGE 等对配置文件进行加密, 参考: https://www.chezmoi.io/user-guide/encryption/","categories":[{"name":"dotfiles","slug":"dotfiles","permalink":"https://yeshan333.github.io/categories/dotfiles/"}],"tags":[{"name":"chezmoi","slug":"chezmoi","permalink":"https://yeshan333.github.io/tags/chezmoi/"},{"name":"dotfiles","slug":"dotfiles","permalink":"https://yeshan333.github.io/tags/dotfiles/"}]},{"title":"使用 WXT 开发浏览器插件(上手使用篇)","slug":"develop-web-extension-with-wxt","date":"2024-03-15T07:47:53.000Z","updated":"2024-03-15T07:47:53.000Z","comments":true,"path":"2024/03/15/develop-web-extension-with-wxt/","permalink":"https://yeshan333.github.io/2024/03/15/develop-web-extension-with-wxt/","excerpt":"","text":"WXT (https://wxt.dev/), Next-gen Web Extension Framework. 号称下一代浏览器开发框架. 可一套代码 (code base) 开发支持多个浏览器的插件. 上路~WXT 提供了脚手架可以方便我们快速进行开发,但是我们得先安装好环境依赖,这里我们使用 npm, 所以需要安装下 node,可以参考 https://nodejs.org/en. 123456789# 直接基于脚手架创建项目npx wxt@latest init yeshan-bowser-extensoincd yeshan-bowser-extensoin# 安装依赖npm install --registry=https://registry.npmmirror.com# 开始调试插件npm run dev QAQ - WSL2 下开发遇到的问题使用 WSL2 进行开发的时候,npm run dev 在 wsl 是没办法自动打开浏览器的,会吐出如下问题: 1WARN Cannot open browser when using WSL. Load ".output/chrome-mv3" as an unpacked extension manually 大概看了下 wxt 的实现,它是通过 web-ext 跟进指定的浏览器的 bin 文件(默认为 chromium)启动浏览器装载开发好的插件. 曾经通过文章 chromium-in-wsl2 提到的办法直接在 wsl2 安装了 chromium,还是没能解决此问题😂😣. 翻了下官方仓库的 issue,有关联问题 https://github.com/wxt-dev/wxt/issues/55, 本质上是 web-ext 的 BUG issuecomment-1837565780,截至 2024/3/15 还未修复. 解决方法没办法了,如果还想继续用 wsl 做开发,只能手动加载插件了,在 windows 上打开 chrome 后,地址栏输入 chrome://extensions/ 转到插件管理页 (记得开启开发者模式) -> 加载已解压的扩展程序: 我们要加载的插件目录是在 wsl 中的(即: .output/chrome-mv3/),好在 Window 和 wsl2 的文件文件系统是打通的,可以相互访问,我们可以使用 wslutils 提供的工具获取在 Windows 下可以访问的路径 123# 获取 windows 文件管理器可以访问的地址❯ wslpath -w .output/chrome-mv3/\\\\wsl.localhost\\Ubuntu-20.04\\home\\yeshan333\\workspace\\github\\yeshan-bowser-extensoin\\.output\\chrome-mv3 Done , 搞定咯,可以愉快码代码了","categories":[{"name":"浏览器插件开发","slug":"浏览器插件开发","permalink":"https://yeshan333.github.io/categories/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"}],"tags":[{"name":"extension","slug":"extension","permalink":"https://yeshan333.github.io/tags/extension/"},{"name":"WXT","slug":"WXT","permalink":"https://yeshan333.github.io/tags/WXT/"}]},{"title":"Windows PowerToys:屏幕标尺,测量屏幕上任何内容的像素","slug":"markup-screen","date":"2024-03-13T03:23:55.000Z","updated":"2024-03-13T03:23:55.000Z","comments":true,"path":"2024/03/13/markup-screen/","permalink":"https://yeshan333.github.io/2024/03/13/markup-screen/","excerpt":"","text":"如果你是一名 web 开发者或者设计师,Windows 自带的 PowerToys 工具集提供了一个很不错的工具 -> 屏幕标尺。通过屏幕标尺,我们可以很方便的测量屏幕上任何内容的像素,无需再通过某种方式中转到专业软件进行编辑: 使用文档可以查看:https://learn.microsoft.com/zh-cn/windows/powertoys/screen-rulerhttps://learn.microsoft.com/zh-cn/windows/powertoys/screen-ruler。 如果你使用 MacOS,那个 xScope 是个不错的免费替代品。","categories":[{"name":"设计工具","slug":"设计工具","permalink":"https://yeshan333.github.io/categories/%E8%AE%BE%E8%AE%A1%E5%B7%A5%E5%85%B7/"}],"tags":[{"name":"设计工具","slug":"设计工具","permalink":"https://yeshan333.github.io/tags/%E8%AE%BE%E8%AE%A1%E5%B7%A5%E5%85%B7/"}]},{"title":"Awesome Technology Weekly Zh-Hans - 中文技术月/周/日刊一览","slug":"awesome-tech-weekly-zh","date":"2024-03-04T11:14:47.000Z","updated":"2024-03-04T11:14:47.000Z","comments":true,"path":"2024/03/04/awesome-tech-weekly-zh/","permalink":"https://yeshan333.github.io/2024/03/04/awesome-tech-weekly-zh/","excerpt":"","text":"作为开发者,我们每天都需要吸收大量的信息补充我们的知识体系. Awesome Technology Weekly Zh-Hans 项目收集了中文技术社区各个领域的高质量的中文技术月/周/日刊,定时刷新获取最新一期中文技术月/周/日刊进行展示. 访问网站开始关注吧~:https://shansan.top/awesome-tech-weekly-zh. Github 项目地址 -> https://github.com/yeshan333/awesome-tech-weekly-zh.","categories":[{"name":"Tech-Weekly","slug":"Tech-Weekly","permalink":"https://yeshan333.github.io/categories/Tech-Weekly/"}],"tags":[{"name":"Tech-Weekly","slug":"Tech-Weekly","permalink":"https://yeshan333.github.io/tags/Tech-Weekly/"}]},{"title":"使用 go-ycsb 对 etcd 进行基准 (benchmark) 性能测试","slug":"using-ycsb-benchmark-etcd","date":"2024-02-29T14:16:51.000Z","updated":"2024-02-29T14:16:51.000Z","comments":true,"path":"2024/02/29/using-ycsb-benchmark-etcd/","permalink":"https://yeshan333.github.io/2024/02/29/using-ycsb-benchmark-etcd/","excerpt":"","text":"最近在对一些存储组件做性能测试,主要使用到了 YCSB,💧篇文章记录下。 什么是 YCSBYCSB,全称为“Yahoo!Cloud Serving Benchmark”,是雅虎开发的用来对云服务进行基准 (benchmark) 性能测试的工具。可以用来对多种 NoSQL 数据库,如 MongoDB、Redis 等进行性能测试。官方内置了丰富的性能测试场景 (称之为: workload),压测场景可以通过文件进行配置,便于压测场景的复现重用。 go-ycsb雅虎的 YCSB 是 Java 语言实现的,且没有对 etcd 内置的支持,pingcap 使用 Go 仿照 Java 版本的 YCSB 实现了 go-ycsb,工作机制大体类似. 且支持的数据库类型更加丰富,其中就有 etcd. 本文主要介绍使用 go-ycsb 基于 etcd 官方提供的性能场景场景 -> Benchmarking etcd v3,做一下基准性能测试。 性能测试一般有三个主要阶段: 1数据准备(load phase) -> 压测执行(load run phase) -> 结果分析(load analysis phase) go-ycsb 使用上可覆盖前两个阶段,对应如下: 1、数据准备(load phase): ./bin/go-ycsb load etcd -P workloads/workloada 2、压测执行(load run phase): ./bin/go-ycsb run etcd -P workloads/workloada 这里针对 etcd 进行数据准备和压测执行. 两个阶段都依赖到了一个负载控制的配置文件 workloada, 接下来让我们看看它. workload 负载配置介绍在开始进行性能测试之前,我们对 go-ycsb 的 workload 负载配置简单介绍一下,以 go-ycsb 代码仓库提供的 workloads/workload_template 文件为例子: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798# 主要支持的配置项见: https://github.com/pingcap/go-ycsb/blob/master/pkg/prop/prop.go# 负责控制性能测试压力的核心实现# 这里可以指定为我们自己实现的压力控制器, 不过 ycsb 内置的 core 一般情况下够用了# 见:https://github.com/pingcap/go-ycsb/blob/f9c3dce045990bc03dac5092be2b00bef386b7c6/cmd/go-ycsb/main.go#L129workload=core# 指定了数据库中存在的数据条目数量# 在数据准备阶段 (load phase) 会据此创建指定条目的数据# 压测执行时 (load run phase) 可操作的数据条目总数recordcount=1000000# 压测执行阶段 (load run phase) 执行的数据库操作总数, 到达这个数量后一般压测即会停止执行operationcount=3000000# 执行数据库操作使用的线程数量threadcount=500# 控制目标吞吐量 OPStarget=1000# 插入操作总数, 如果与 recordcount 不一致, 会根据 insertstart 指定的位置开始插入数据#insertcount=# 第一次插入操作的位置偏移量insertstart=0# 一条数据库记录存在的字段数量# 在数据准备阶段 (load phase) 会据此创建每一条数据库数据fieldcount=10# 控制每个字段的大小 (单位: Byte 字节)fieldlength=100# 用于控制压测执行时, 读取操作是否会读取所有字段readallfields=true# 压测执行时, 控制数据库更新操作更新数据库记录时是否会更新所有字段writeallfields=false# The distribution used to choose the length of a fieldfieldlengthdistribution=constant#fieldlengthdistribution=uniform#fieldlengthdistribution=zipfian# 压测执行时, 读操作占总操作数 (operationcount) 的比例readproportion=0.95# 压测执行时, 写更新操作占总操作数 (operationcount) 的比例updateproportion=0.05# 压测执行时, 插入新数据操作占总操作数 (operationcount) 的比例insertproportion=0# 压测执行时, 先读取再写入操作占总操作数 (operationcount) 的比例readmodifywriteproportion=0# 扫描操作占总操作数 (operationcount) 的比例scanproportion=0# 每一次扫描操作, 扫描的记录总数maxscanlength=1000# 控制扫描操作的策略, 即每一次扫描操作的记录数策略# uniform:表示每次扫描的记录数是随机的# zipfian:根据 Zipfian 分布来选择记录数. 互联网常说的 80/20 原则, 也就是 20% 的 key, 会占有 80% 的访问量;scanlengthdistribution=uniform#scanlengthdistribution=zipfian# 控制数据是否是顺序插入的insertorder=hashed#insertorder=ordered# 数据库操作的策略# uniform:随机选择一个记录进行操作;# sequential:按顺序选择记录操作;# zipfian:二八原则;# latest:和 Zipfian 类似,但是倾向于访问新数据明显多于老数据;# hotspot:热点分布访问;# exponential:指数分布访问;requestdistribution=zipfian# 数据准备阶段,hotspot 热点分布策略下数据的占比hotspotdatafraction=0.2# 访问热点数据的数据库操作百分比hotspotopnfraction=0.8# 最大的执行时间 (单位为秒). 当操作数达到规定值或者执行时间达到规定最大值时基准测试会停止#maxexecutiontime=# 数据准备和压测执行阶段被操作的数据库表名称table=usertable# 控制压测结果的展现形式, 见: https://github.com/pingcap/go-ycsb/blob/fe11c4783b57703465ec7d36fcc4268979001d1a/pkg/measurement/measurement.go#L84measurementtype=histogram#measurementtype=csv#measurementtype=raw workload 负载文件支持的配置项以 pkg/prop/prop.go 声明的为准。 知道了 go-ycsb 的 workload 怎么配置,接下来我们开始使用它模拟下 etcd 官方的基准测试场景吧。 Benchmarking etcd v3 etcd 基准性能测试我们需要先准备下测试环境,并获取 go-ycsb 负载工具。 环境准备etcd 直接使用 docker 起就好,这里我们使用 docker-compose, 编排文件如下: 12345678910version: '3.0'services: etcd: image: 'bitnami/etcd:latest' environment: - ALLOW_NONE_AUTHENTICATION=yes ports: - 2379:2379 - 2380:2380 go-ycsb 可以直接从项目的 README 获取下载方式,或者我们基于源码构建出来即可. 1234567# 从源码构建,需要安装 Gogit clone https://github.com/pingcap/go-ycsb.gitcd go-ycsbmake# give it a try./bin/go-ycsb --help 性能测试好了,我们可以开始对 etcd 进行性能测试了,本地我们主要模拟 Benchmarking etcd v3 中的 reading one single key 场景. go-ycsb 的 workload 配置如下: 12345678910111213141516171819202122232425262728293031# scene ref: https://etcd.io/docs/v3.5/benchmarks/etcd-3-demo-benchmarks/#reading-one-single-key# etcd 官方给的场景 reading one single key# 单条 key-value 数据recordcount=1# benchmark 总共的操作次数operationcount=20000workload=core; threadcount=1# 控制 OPS 为 2000; target=2000fieldcount=1fieldlength=200# 控制 etcd 的 key 大小在 256 字节keyprefix=__3MKdVjJjpfz0tzfHtL4ycTztGas4lWVLJIlVNT8HjtWf6Picj3WYC3KE76nVNkdnvCv1gMiMO7PZUUkmlBODEkJDZTVqtpQbqJ5pNUnz3oEuNoieOTpvrvAVTgJ7myi3Z0ns5Y3TYk05gzmmPINKsP3zcpN1hY5eITitMz8SSxNGv0KKHDKhH370U9QOLhMI4bsClkSbvCWgQ98LiLIhfZukqlFVZPp__readallfields=truewriteallfields=true# 全部为读操作readproportion=1updateproportion=0scanproportion=0insertproportion=0dataintegrity=false# 顺序访问requestdistribution=sequential 上述 workload 配置可在这个仓库中找到: https://github.com/yeshan333/benchmark-etcd-with-go-ycsb. 接下来使用 go-ycsb 准备压测数据: 1./bin/go-ycsb load etcd -P workloads/etcd_offcial_workload 压测执行: 1./bin/go-ycsb load etcd -P workloads/etcd_offcial_workload 执行结果大致如下: 12345678910111213141516171819202122232425-> % ./bin/go-ycsb run etcd -P workloads/etcd_offcial_workloadUsing request distribution 'sequential' a keyrange of [0 0]***************** properties *****************"command"="run""scanproportion"="0""dotransactions"="true""operationcount"="20000""keyprefix"="__3MKdVjJjpfz0tzfHtL4ycTztGas4lWVLJIlVNT8HjtWf6Picj3WYC3KE76nVNkdnvCv1gMiMO7PZUUkmlBODEkJDZTVqtpQbqJ5pNUnz3oEuNoieOTpvrvAVTgJ7myi3Z0ns5Y3TYk05gzmmPINKsP3zcpN1hY5eITitMz8SSxNGv0KKHDKhH370U9QOLhMI4bsClkSbvCWgQ98LiLIhfZukqlFVZPp__"";"="target=2000""requestdistribution"="sequential""workload"="core""fieldlength"="200""readproportion"="1""recordcount"="1""readallfields"="true""insertproportion"="0""fieldcount"="1""writeallfields"="true""dataintegrity"="false""updateproportion"="0"********************************************************************************************Run finished, takes 9.134419329sREAD - Takes(s): 9.1, Count: 20000, OPS: 2190.0, Avg(us): 451, Min(us): 220, Max(us): 2453503, 50th(us): 322, 90th(us): 379, 95th(us): 396, 99th(us): 448, 99.9th(us): 1351, 99.99th(us): 1748TOTAL - Takes(s): 9.1, Count: 20000, OPS: 2189.9, Avg(us): 451, Min(us): 220, Max(us): 2453503, 50th(us): 322, 90th(us): 379, 95th(us): 396, 99th(us): 448, 99.9th(us): 1351, 99.99th(us): 1748 可以同一场景下看到 90 分位的 RTT 与 etcd 官方的压测结果相差不大. 上述执行结果由 github actions 跑出来,具体执行过程可观看 yeshan333/benchmark-etcd-with-go-ycsb/actions/runs/8091287653/job/22110155088. 参考 探究Go-YCSB做数据库基准测试 YCSB wiki - Running a Workload 中译版","categories":[{"name":"go-ycsb","slug":"go-ycsb","permalink":"https://yeshan333.github.io/categories/go-ycsb/"}],"tags":[{"name":"etcd","slug":"etcd","permalink":"https://yeshan333.github.io/tags/etcd/"},{"name":"Go","slug":"Go","permalink":"https://yeshan333.github.io/tags/Go/"},{"name":"YCSB","slug":"YCSB","permalink":"https://yeshan333.github.io/tags/YCSB/"},{"name":"go-ycsb","slug":"go-ycsb","permalink":"https://yeshan333.github.io/tags/go-ycsb/"},{"name":"benchmark","slug":"benchmark","permalink":"https://yeshan333.github.io/tags/benchmark/"}]},{"title":"使用 GitHub Codespaces 加速 Elixir 开发环境工作速度","slug":"elixir-github-codespace-dev","date":"2024-02-19T16:29:08.000Z","updated":"2024-02-19T19:29:08.000Z","comments":true,"path":"2024/02/19/elixir-github-codespace-dev/","permalink":"https://yeshan333.github.io/2024/02/19/elixir-github-codespace-dev/","excerpt":"","text":"前言使用 Elixir 开发点小玩意的时候,面对经常需要走外网下载依赖 (Elixir 的镜像站 UPYUN 使用有时候也经常抽风) 的时候,为了避免需要不断的进行网络代理配置,有想到之前经常使用 GitHub Codespaces 来在浏览器里面通过云环境来写博客文章,也可以做点开发: 第一次连接一般会看到:👋 Welcome to Codespaces! You are on our default image. It includes runtimes and tools for Python, Node.js, Docker, and more. See the full list here: https://aka.ms/ghcs-default-image Want to use a custom image instead? Learn more here: https://aka.ms/configure-codespace 🔍 To explore VS Code to its fullest, search using the Command Palette (Cmd/Ctrl + Shift + P or F1). 📝 Edit away, run your app as usual, and we’ll automatically make it available for you to access. 使用 GitHub Codespaces 甚至也能直接提交代码到 GitHub 仓库之中. 通过 vscode 插件 GitHub Codespaces,能通过本地 IDE 连接云端的环境进行开发. GitHub 提供了免费使用的额度,足够白嫖了🐏. 如果有将 vscode 的配置同步到 GitHub,也可以在一定程度复用本地 IDE 的配置. 通过 https://github.com/codespaces/new 我们能配置 GitHub 使用的环境规格和部署地区: 加速 Elixir 开发环境Elixir 应用构建拉依赖经常需要走外网,但 GitHub 默认创建的 Codespaces 环境默认一般都是 js 的开发环境 Dockerfile,并没有 Elixir 环境,需要我们自己单独配置一手,好在提供了 devcontainer 的形式供我们自定义自己的基础开发环境,我们只需要提供配置文件就好, 我们需要做的如下: 1、GitHub 仓库创建 .devcontainer 目录; 2、.devcontainer 下的 devcontainer.json 文件声明开发环境配置; 示范仓库如: https://github.com/yeshan333/erlang_elixir_asdf_ubuntu_container/tree/main/.devcontainer 123456789{ "image": "ghcr.io/yeshan333/erlang_elixir_asdf_ubuntu_container:latest", "customizations": { "vscode": { "extensions": ["jakebecker.elixir-ls"] } }, "postCreateCommand": "git config --global core.fileMode false"} 通过 image 字段,我们直接声明了 GitHub Codespaces 使用的 Docker 镜像,extensions 指定了要启用哪些 vscode 插件,postCreateCommand 制定了环境起来之后要跑的 shell 命令. 甚至于也可以指定我们自己写的 Dockerfile 来启动 GitHub Codespaces 环境,可参考:https://github.com/devcontainers/images/blob/main/src/go/.devcontainer/devcontainer.json. 基于以上,我们可以通过 https://github.com/codespaces/new 指定海外节点进行 GitHub Codespaces 创建即刻. 参考 create-dev-container GitHub Codespaces","categories":[{"name":"Github Codespaces","slug":"Github-Codespaces","permalink":"https://yeshan333.github.io/categories/Github-Codespaces/"}],"tags":[{"name":"Elixir, Github Codespaces","slug":"Elixir-Github-Codespaces","permalink":"https://yeshan333.github.io/tags/Elixir-Github-Codespaces/"}]},{"title":"乐理通识","slug":"become-a-romantic-muscian","date":"2024-02-07T18:40:24.000Z","updated":"2024-02-07T18:40:24.000Z","comments":true,"path":"2024/02/07/become-a-romantic-muscian/","permalink":"https://yeshan333.github.io/2024/02/07/become-a-romantic-muscian/","excerpt":"","text":"2023 年搞了台雅马哈 61 键的电子琴,顺手看了下啊 B 的上的课程 《零基础自学音乐学乐理合集-第一季》,这里是部分笔记(给博客加点不一样的东西👀)。 简谱各部分一览 C 表示音名 竖线为小节线 音名 完整钢琴键盘 88 键 9个组,一组 7 个白键,5 个黑键位 键位表示,音名对应的键位 1=C 的意思即简谱中 1 对应的键位,代表 1 从哪个键出发,1 的位置一旦确定,234567的位置,也跟着确定 1=C 到底是哪个 C对应钢琴的键即为 C4 的 C 61 键的电子琴是从大字组开始的 1=D对应的情况 C#-C升;Db-D降 全音与半音 全音与半音表示两个音的距离 C 到 C# 的距离即为一个半音距离 E 到 F 的距离为一个半音 C 到 D 为一个全音 从全音半音看 12345671 的规律 正因为满足了-全全半全全全半,才真正听出 do,re,me,fa,so,la,si,do 的味道 调式 调式简单来说即为一串音,按照一定的规则排列起来 (自然)大调 1=C 即为 C 大调 黑键开始的自然大调与白键开始对应的关系 音阶 1=C 的主音即为 C 按照-全全半全全全半的规律构造音阶 音符与节拍 竖线为小节线 节拍四拍子 拍子为时间单位, 图中的小方块仅表示一拍子,不表示四分音符。 四分音符为一拍,2 拍为一小节简谱例子: 传说中的动次打次律动 附点与休止符附点的意义 简谱打拍子练习唱四二拍,四分音符为一拍时,V表示一拍仅四分音符情况 有八分音符时 有十六分音符时 群魔乱舞 附点 唱八分音符的拍子 五线谱 多声部处理,一次发出多个声 谱号 用于确定要弹哪个音,大致范围 高音谱号 - 字母 g 的变体,小字一组的 g 从第二条线开始画,第二条线表示小字一组的 $ g^1 $ 低音谱号-F,小字组的 F 中音谱号-两个反着的 C,确定中央C,即小字一组的 C 次中音谱号第四线表示中央 C 度 度:一个音名到另一个音名要经过的音名个数 两个相邻组同音名即为一个 8 度 八度与十五度 通过八度(8va)与十五度标记,快速找到键位 音符 音高看符头,外观确认音符时间(几拍) 另一种写法,为了美观 附点音符 休止符 音值组合法-符尾连成一起,组成一拍,方便区一拍与另一拍,方便看谱 有一拍一拍的感觉,划分成了一个个音群 大于一拍的,就不连了 四分音符为一拍的音程组合法 八分音符为一拍的组合法,会将可以组成一小节的音符连在一起 调号 :::info五线谱中用调号提示哪些音需要升降,不用在谱中再标记,上图,对应下图::: 快速识别五线谱调号技巧 一、C 大调与 F 大调 二、升号 # 调 三、降号 b 掉 一拍子具体多少秒? 下图: 一个四分音符 1 秒 右边数字越大一般越快 下面的谱子大概在 33 秒内弹完 重(chong)升 X 与重降 bb 度 - 音程 度又称音程,即两个音之间的距离 度与升降号无关 音数、大二度、小二度 音数:相邻两个键的音数为 0.5,键包括黑键 同度数,近一点的为小度 纯八度 C1 - C1 为纯一度,音数为 0 自然音程 & 变化音程 自然音程:CDEFGAB 七个白键可以组成的所有音程 变化音程:自然音程外的音程 协和与不协和音程 和弦 和音:两个音 和弦:三个音及以上构成 常用和弦三和弦:::info三个音,三度叠置构建::: 三和弦转位:::warning 第一转位:根音提高一个八度,三音变为低音 第二转位:在第一转位基础上,三音提高八度 命名:根音与三音的距离 ,低音与三音的距离::: 七和弦:::info由四个音组合构建::: 七和弦命名(下左图): 七和弦转位","categories":[{"name":"music","slug":"music","permalink":"https://yeshan333.github.io/categories/music/"}],"tags":[{"name":"music","slug":"music","permalink":"https://yeshan333.github.io/tags/music/"}]},{"title":"Elixir 依赖 (deps) 调试的小技巧","slug":"elixir-deps-debug-skills","date":"2023-08-12T16:15:40.000Z","updated":"2023-08-12T16:15:40.000Z","comments":true,"path":"2023/08/12/elixir-deps-debug-skills/","permalink":"https://yeshan333.github.io/2023/08/12/elixir-deps-debug-skills/","excerpt":"","text":"许久未更博客,“微有所感”,小更一篇。 最近使用 Elixir 有点多, 经常需要观察一些依赖 (Deps) 的实现, 比如想加个日志打印点 IO.inspect 啥的观察下某个变量,才能更好的理解某个 Elixir 的依赖。这里介绍下一些调试的方式: 这里以 yeshan333/ex_integration_coveralls 为例子. 我们先 clone 项目到本地: 1234git clone git@github.com:yeshan333/ex_integration_coveralls.gitcd ex_integration_coveralls# 拉一下依赖mix deps.get 比如, 我们想看一下代码扫描的依赖 credo 这个扫描规则 Credo.Check.Design.TagTODO 的实现大概是怎么样的. 1、mix deps.compile找到它的实现 deps/credo/lib/credo/check/design/tag_todo.ex, 我们想要观察下变量 issue_meta 实际是怎么样的, IO.inspect 一下. 123456789101112@doc false@impl truedef run(%SourceFile{} = source_file, params) do issue_meta = IssueMeta.for(source_file, params) include_doc? = Params.get(params, :include_doc, __MODULE__) IO.inspect(issue_meta, label: "观察下 issue_meta 放的什么") source_file |> TagHelper.tags(@tag_name, include_doc?) |> Enum.map(&issue_for(issue_meta, &1))end 好了,接下来我们重编译一下 credo 模块即可: 123❯ mix deps.compile credo # 重编译下 credo==> credoCompiling 1 file (.ex) 调用下 credo 即可观察到我们埋下的变量打印点信息: 1mix credo 这样每次添加依赖观察点之后, 我们只需要 recompile 下依赖即可. 123# 如果想废弃掉我们对依赖的修改,只需要重新拉去依赖即可mix deps.clean credomix deps.get 2、mix.exs 使用 :path 引用依赖上面的方法经常需要手动重新编译指定的依赖, 这里还有个方式可以在我们使用任意 Mix Tasks 的时候,依赖都会自动重新编译, 我们只需要编译 mix.exs 将依赖指定为本地即可, 我们使用 path 指定依赖来源: 1{:credo, "~> 1.6", only: [:dev, :test], runtime: false, path: "deps/credo"},","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"},{"name":"Deps","slug":"Deps","permalink":"https://yeshan333.github.io/tags/Deps/"},{"name":"Mix","slug":"Mix","permalink":"https://yeshan333.github.io/tags/Mix/"}]},{"title":"(译) Server-Sent Events: the alternative to WebSockets you should be using","slug":"sse-websocket","date":"2023-03-11T14:26:29.000Z","updated":"2023-03-11T14:26:29.000Z","comments":true,"path":"2023/03/11/sse-websocket/","permalink":"https://yeshan333.github.io/2023/03/11/sse-websocket/","excerpt":"","text":"原文地址: https://germano.dev/sse-websockets/作者: Germano Gabbianelli 当开发实时 web 应用时,WebSockets 可能是我们首先想到的。然而,Server Sent Events (SSE) 是通常会是一种更简单的替代方案。 1. 序言最近我对实现实时 Web 应用程序的一些最佳方式很感兴趣。也就是一个应用程序包含一个或多个组件,这些组件会根据某些外部事件自动实时更新。这种应用程序的最常见例子是消息服务,我们希望每条消息都能立即广播到所有已经连接的人,而不需要进行任何的用户交互。 经过一些研究,我偶然发现了 Martin Chaov 的一个精彩分享,其比较了 Server Sent Events、WebSockets 和 Long Polling 几个技术的优劣。这个演讲也有篇对应的博客文章来辅助阅读 Using SSE Instead Of WebSockets For Unidirectional Data Flow Over HTTP/2,内容有趣而且非常有启发性。我真的很推荐大家去看一下。然而,它是 2018 年的内容,一些细节可能已经发生了改变,因此我决定写下这篇文章。 2. WebSockets?WebSockets 可以在浏览器和服务器之间创建 双向低延迟 的通信通道。 这使得它在某些场景中非常适用:比如双向通信的多人游戏,即浏览器和服务器都会一直在通道上发送消息,需要将这些消息以较低延迟进行传递。 在一款第一人称射击游戏中,浏览器可以持续地传输玩家的位置,同时从服务器接收所有其他玩家位置的更新。此外,我们肯定希望这些消息能够以尽可能花费少的开销进行传递,以避免游戏迟缓感,提升用户体验。 这与传统的 HTTP 请求-响应模型正好相反,其中浏览器始终是发起通信的一方,每个消息都具有显著的开销,因为要建立 TCP 连接和传输 HTTP 头部信息。 然而,许多应用程序的实现不需要这么严格的要求。即使在实时应用程序中,数据流也通常是不对称的:服务器发送了大部分的消息,而客户端大多只是负责监听,并且只是偶尔发送一些更新。例如,在实时的聊天应用程序中,用户可能会连接到许多聊天房间,每个房间都有几十个或几百个参与者。因此,接收到的消息数量远远超过发送的消息数量。 3. WebSockets 的问题在于哪里双向的通信通道和低延迟是非常好的功能特性。那么,我们为什么还要继续寻找其他解决方案呢? WebSockets 有一个主要缺点:它们不完全基于 HTTP 工作。它们需要自己的 TCP 连接。它们只需要使用 HTTP 建立连接,然后将其升级为一个独立的 TCP 连接,在其上可以使用 WebSocket 协议。 这可能看起来不是很重要,但这意味着 WebSockets 不能从任何已有的 HTTP 特性中受益。即: 不支持压缩 不支持 HTTP/2 的多路复用 可能存在代理问题 无跨站点劫持保护 至少,在 WebSocket 协议首次发布时是这种情况。现在,有一些补充标准试图改善这种情况。让我们更详细地了解当前的情况。 注意:如果您不关心细节,请随意跳过本节其余部分,直接转到 Server-Sent Events 或 demo 部分。 3.1 压缩 (Compression)在标准的连接上,每个浏览器都支持 HTTP 压缩技术,在服务器端启用也非常容易,只需在所选择的反向代理中开启切换一下开关。但是,对于使用 WebSockets 的情况这更加复杂,因为没有请求和响应,需要压缩各个独立的 WebSocket 帧 (frames)。 RFC 7692,于 2015 年 12 月发布,试图通过定义 “WebSocket 压缩扩展” 来改善这种情况。然而,据我所知,没有任何流行的反向代理服务(如 nginx、caddy)实现了这一功能,因此无法透明地启用压缩。 这意味着,如果要使用压缩,则必须在后端直接实现。幸运的是,我找到了一些支持 RFC 7692 的库。例如,Python 的 websockets 和 wsproto 库,以及 nodejs 的 ws 库。 然而,后者并不建议使用该功能: 该扩展在服务器上默认禁用,在客户端上默认启用。它在性能和内存消耗方面增加了显著的开销,因此我们建议只在确实需要时才启用它。 请注意,Node.js 在高性能压缩方面存在各种问题,尤其是在 Linux 上增加并发性可能会导致灾难性的内存碎片和性能下降。 在浏览器方面,Firefox 从 37 版本开始支持 WebSocket 的压缩。Chrome 也支持。然而,显然 Safari 和 Edge 不支持。 我没有验证移动设备上的支持情况如何。 3.2 多路复用 (Multiplexing)HTTP/2 引入了对多路复用的支持,意味着向同一主机发送的多个请求/响应对不再需要单独的 TCP 连接。相反,它们可以共享同一个 TCP 连接,每个请求在其自己独立的 HTTP/2 流上运行。 这也得到了每个浏览器的支持,而且在大多数反向代理上启用它也非常容易。 相比之下,WebSocket 协议默认不支持多路复用。向同一主机发送多个 WebSocket 将各自打开自己的独立的 TCP 连接。如果要使两个独立的 WebSocket 终端共享它们的基础连接,您必须自己在应用程序代码中添加多路复用能力支持。 RFC 8441 于 2018 年 9 月发布,尝试通过添加“使用 HTTP/2 引导 WebSocket”的支持来解决这个问题。它已在 Firefox 和 Chrome 中实现。然而,据我所知,没有主要的反向代理服务实现了它。不幸的是,我也找不到 Python 或 Javascript 的任何实现。 3.3 代理问题 (Issues with proxies)没有显式支持 WebSockets 的 HTTP 代理可能会阻止未加密的 WebSocket 连接正常工作。这是因为代理无法解析 WebSocket 帧 (frames) 并关闭连接。 但是,通过 HTTPS 发起的 WebSocket 连接应该不受此问题的影响,因为帧将被加密,代理应该只是转发所有内容而不会关闭连接。 要了解更多信息,请参见 Peter Lubbers 的“HTML5 Web Sockets 如何与代理服务器交互”。 3.4 跨站 WebSocket 劫持WebSocket 连接没有受到同源策略的保护,这使它们容易受到跨站 WebSocket 劫持攻击。 因此,如果 WebSocket 后端没有使用任何客户端缓存的身份验证方式(例如 cookie或 HTTP 身份验证),它们必须检查 Origin 头的正确性。 我在这里不会详细讨论,但是请考虑这个简短的例子。假设一个比特币交易所使用 WebSockets 提供其交易服务。当您登录时,交易所可能设置一个 cookie 来保持您的会话在一定时间内活动。现在,攻击者要偷取你珍贵的比特币所要做的就是让你访问她控制的站点,然后简单地打开一个 WebSocket 连接到交易所。恶意连接将被自动验证,除非交易所检查 Origin 头并阻止来自未授权域的连接。 我建议您阅读 Christian Schneider 关于跨站 WebSocket 劫持的精彩文章以了解更多信息。 4. Server-Sent Events现在我们对 WebSockets 有了更多的了解,包括它们的优点和缺点,让我们学习一下 Server-Sent Events 并了解它们是否是一个有效的替代方案。 Server-Sent Events 使服务器能够随时向客户端发送低延迟的推送事件。它们使用非常简单的协议,并且是 HTML 标准的一部分,受到每个浏览器的支持。 与 WebSockets 不同,Server-Sent Events 仅支持向客户端单向信息流动。这使得它们不适合一些需要处理特定场景的应用程序,即那些需要既是双向又是低延迟的通信通道,比如实时游戏。然而,这些权衡取舍也是它们相对于 WebSockets 的主要优势,因为单向流动使得 Server-Sent Events 可以在 HTTP 之上无缝的工作,而无需自定义协议。这使它们自动获得了所有 HTTP 的功能,例如压缩或 HTTP/2 多路复用能力,使它们成为大多数实时应用程序的非常方便的选择,其中大部分数据都来自服务器,并且由于 HTTP 头部的一些开销而导致一些请求的开销是可以接受的。 协议非常简单。它使用 text/event-stream 作为内容类型 (Content-Type) 和消息的形式如下: 123456789101112data: First messageevent: joindata: Second message. It has twodata: lines, a custom event type and an id.id: 5: comment. Can be used as keep-alivedata: Third message. I do not have more data.data: Please retry later.retry: 10 每个事件由两个换行符(\\n)分隔,并由多个可选字段组成。 可重复使用在多处出现的字段 data 通常用于表示事件数据的内容。 字段 event 允许指定自定义事件类型,如下一节所示,它可以用于在客户端上触发不同的事件处理程序。 另外两个字段 id 和 retry 用于配置自动重连机制的行为。这是 Server-Sent Events 最有趣的特性之一。它确保在连接断开或被服务器关闭时,无需用户干预,客户端将自动尝试重新连接。 retry 字段用于指定在尝试重新连接之前等待的最短时间(以秒为单位)。当服务器连接了太多客户端时,它也可以在立即关闭客户端连接之前发送该字段以减轻其负载。 id 字段将标识符与当前事件相关联。在重新连接时,客户端将使用 Last-Event-ID HTTP 请求头将上次看到的 id 传输给服务器。这使得我们可以从正确的失效点恢复通讯流。 最后,服务器可以通过返回 HTTP 204 No Content 响应来完全停止自动重连机制。 5. 来点实际代码 Demo现在,让我们将所学的内容付诸实践。在本节中,我们将使用 Server-Sent Events 和 WebSockets 实现一个简单的服务。这将使我们能够实际比较这两种技术。我们将了解到使用每种技术开始的难易程度,并手动验证前面讨论的功能。 我们将使用 Python 作为后端,Caddy 作为反向代理,当然还需要一些 JavaScript 代码用于前端。 为了让我们的示例尽可能简单,我们的后端将只包含两个端点 (endpoints),每个端点都会流式传输唯一的随机数字序列。从 /sse1 和 /sse2 进行 Server-Sent Events 访问,从 /ws1 和 /ws2 进行 WebSockets 的访问。我们的前端将仅由一个 index.html 文件组成,其中包含一些 JavaScript 代码,可以让我们启动和停止 WebSockets 和 Server-Sent Events 连接。 示例代码 - GitHub 5.1 反向代理使用反向代理,例如 Caddy 或 nginx,对于这种小例子中非常有用。它让我们很容易地开启很多我们所选择的后端可能缺少的功能。 更具体地说,它允许我们轻松地提供静态文件并自动压缩 HTTP 响应;提供 HTTP/2 支持,即使我们的后端仅支持 HTTP/1,也可以让我们受益于多路复用;最后还可以进行负载均衡。 我选择了Caddy,因为它可以自动为我们管理HTTPS证书,让我们跳过一个非常乏味的任务,尤其是对于一个快速实验 Demo。 基本配置位于项目根目录下的 Caddyfile 中,大致如下: 12345678localhostbind 127.0.0.1 ::1root ./staticfile_server browseencode zstd gzip 这指示 Caddy 监听本地接口的 80 和 443 端口,启用 HTTPS 支持并生成自签名证书。它还支持压缩和提供访问 static 目录下的静态文件。 最后一步,我们需要让 Caddy 代理到我们的后端服务。Server-Sent Events只是普通的HTTP请求,所以这里没有什么特别的: 12reverse_proxy /sse1 127.0.1.1:6001reverse_proxy /sse2 127.0.1.1:6002 要代理 Websocket,需要反向代理显式支持。幸运的是,Caddy 可以毫无障碍地处理这个问题,尽管配置有点冗长: 123456789101112@websockets { header Connection *Upgrade* header Upgrade websocket}handle /ws1 { reverse_proxy @websockets 127.0.1.1:6001}handle /ws2 { reverse_proxy @websockets 127.0.1.1:6002} 最后使用如下命令启动 Caddy: 1sudo caddy start 5.2 前端让我们从前端开始,比较 WebSockets 和 Server-Sent Events 的 JavaScript API。 WebSocket 的JavaScript API非常易于使用。首先,我们需要创建一个新的 WebSocket 对象,传递服务器的 URL。这里,wss 表示连接将在 HTTPS 上进行。如上所述,强烈建议使用 HTTPS 以避免代理问题。 然后,我们应该监听一些可能的事件(即打开 open、消息 message、关闭 close、错误 error),通过设置 on$event 属性或使用 addEventListener()。 123456const ws = new WebSocket("wss://localhost/ws");ws.onopen = e => console.log("WebSocket open");ws.addEventListener( "message", e => console.log(e.data)); JavaScript 的 Server-Sent Events API 非常类似。它要求我们创建一个新的 EventSource 对象,传递服务器的 URL,然后可以通过相同的方式订阅事件。 主要的区别在于,我们还可以订阅自定义事件。 1234567891011const es = new EventSource("https://localhost/sse");es.onopen = e => console.log("EventSource open");es.addEventListener( "message", e => console.log(e.data));// Event listener for custom event// 订阅自定义事件es.addEventListener( "join", e => console.log(`${e.data} joined`)) 我们现在可以使用所有这些关于 JS APIs 的新知识来构建我们实际的前端。 为了让事情尽可能简单,它只包含一个 index.html 文件,里面有一堆用来启动和停止 WebSockets 和 EventSources 的按钮。像这样: 12345<button onclick="startWS(1)">Start WS1</button><button onclick="closeWS(1)">Close WS1</button><br><button onclick="startWS(2)">Start WS2</button><button onclick="closeWS(2)">Close WS2</button> 我们需要多个 WebSocket/EventSource,这样我们就可以测试 HTTP/2 多路复用是否有效以及打开了多少连接。 现在让我们实现这些按钮工作所需的两个函数: 123456789101112131415161718const wss = [];function startWS(i) { if (wss[i] !== undefined) return; const ws = wss[i] = new WebSocket("wss://localhost/ws"+i); ws.onopen = e => console.log("WS open"); ws.onmessage = e => console.log(e.data); ws.onclose = e => closeWS(i);}function closeWS(i) { if (wss[i] !== undefined) { console.log("Closing websocket"); websockets[i].close(); delete websockets[i]; }} Server-Sent Events 的前端代码几乎相同。唯一的区别是 onerror 事件处理程序,它之所以存在,是因为一旦发生错误,浏览器就会记录一条消息,并尝试进行重连。 123456789101112131415161718const ess = [];function startES(i) { if (ess[i] !== undefined) return; const es = ess[i] = new EventSource("https://localhost/sse"+i); es.onopen = e => console.log("ES open"); es.onerror = e => console.log("ES error", e); es.onmessage = e => console.log(e.data);}function closeES(i) { if (ess[i] !== undefined) { console.log("Closing EventSource"); ess[i].close() delete ess[i] }} 5.3 后端现在我们来编写后端代码。我们将使用 Python 的异步 Web 框架 Starlette,使用 Uvicorn 作为服务器。为了使事情模块化,我们将分离数据生成过程和端点 (endpoints) 的实现。 我们希望两个端点中的每一个都生成一系列唯一的随机数。为了实现这一点,我们将使用流 ID(即1或2)作为随机种子 (random seed)的一部分。 理想情况下,我们也希望我们的流是可恢复的。也就是说,如果连接中断,客户端应该能够从它收到的最后一条消息恢复流,而不是重新读取整个序列。为了实现这一点,我们将为每个消息/事件分配一个 ID,并在生成每个消息之前使用它来初始化随机种子,以及流 ID。在我们的例子中,ID 将只是从 0 开始的计数器 (Counter)。 有了这些,我们就可以编写 get_data 函数来生成我们的随机数: 123456import randomdef get_data(stream_id: int, event_id: int) -> int: rnd = random.Random() rnd.seed(stream_id * event_id) return rnd.randrange(1000) 现在我们来写出实际的 endpoints。 Starlette 的入门非常简单。我们只需要初始化一个应用程序 app,然后注册一些路由给它: 123from starlette.applications import Starletteapp = Starlette() 为了编写 WebSocket 服务,我们选择的 web 服务器和框架都必须有明确的支持。幸运的是,Uvicorn 和 Starlette 可以胜任这个任务,编写 WebSocket 端点与编写普通路由一样方便。 这就是我们需要的所有代码: 1234567891011121314from websockets.exceptions import WebSocketException@app.websocket_route("/ws{id:int}")async def websocket_endpoint(ws): id = ws.path_params["id"] try: await ws.accept() for i in itertools.count(): data = {"id": i, "msg": get_data(id, i)} await ws.send_json(data) await asyncio.sleep(1) except WebSocketException: print("client disconnected") 上述代码将确保每当浏览器请求以 /ws 开头并后跟一个数字的路径时(例如 /ws1、/ws2),就会调用 websocket_endpoint 函数。 然后,对于每个匹配的请求,它将等待 WebSocket 连接建立,随后开始无限循环每秒发送随机数字,编码为 JSON 有效载荷。 对于 Server-Sent Events,代码非常相似,除了不需要任何特殊的框架支持。在这种情况下,我们注册一个路由,匹配以 /sse 开头并以数字结尾的 URL(例如 /sse1、/sse2)。但是,这次我们的端点只是设置适当的标头并返回 StreamingResponse: 123456789101112from starlette.responses import StreamingResponse@app.route("/sse{id:int}")async def sse_endpoint(req): return StreamingResponse( sse_generator(req), headers={ "Content-type": "text/event-stream", "Cache-Control": "no-cache", "Connection": "keep-alive", }, ) StreamingResponse 是 Starlette 提供的一个实用程序类,它接受一个生成器,并将其输出流式传输到客户端,保持连接处于打开状态。 下面为 sse_generator 的实现代码,几乎与 WebSocket 端点相同,只是消息按照 Server-Sent Events 协议进行编码: 1234567async def sse_generator(req): id = req.path_params["id"] for i in itertools.count(): data = get_data(id, i) data = b"id: %d\\ndata: %d\\n\\n" % (i, data) yield data await asyncio.sleep(1) 我们完成了! 最后,假设我们将所有代码放在名为 server.py 的文件中,我们可以使用 Uvicorn 启动我们的后端 endpoints,如下所示: 12$ uvicorn --host 127.0.1.1 --port 6001 server:app &$ uvicorn --host 127.0.1.1 --port 6002 server:app & 6. 彩蛋: SSE 很棒的特性好了,现在让我们来总结一下,实现我们之前吹嘘的那些漂亮的功能是多么容易。 可以通过修改端点中的几行代码来启用压缩: 123456789101112131415161718192021@@ -32,10 +33,12 @@ async def websocket_endpoint(ws): async def sse_generator(req): id = req.path_params["id"]+ stream = zlib.compressobj() for i in itertools.count(): data = get_data(id, i) data = b"id: %d\\ndata: %d\\n\\n" % (i, data)- yield data+ yield stream.compress(data)+ yield stream.flush(zlib.Z_SYNC_FLUSH) await asyncio.sleep(1) @@ -47,5 +50,6 @@ async def sse_endpoint(req): "Content-type": "text/event-stream", "Cache-Control": "no-cache", "Connection": "keep-alive",+ "Content-Encoding": "deflate", }, ) 然后,我们可以检查开发者工具 (DevTools) 来验证一切是否按预期工作: 因为 Cadd y支持 HTTP/2,所以多路复用是默认启用的。我们可以再次使用开发者工具来确认所有 SSE 请求都使用同一个连接: 自动重连: 在发生意外连接错误时自动重新连接很简单,只需在后端代码中读取 [Last-Event-ID](https://html.spec.whatwg.org/multipage/server-sent-events.html#last-event-id) 头信息: 1234< for i in itertools.count():---> start = int(req.headers.get("last-event-id", 0))> for i in itertools.count(start): 前端代码不需要任何改动。 我们可以通过启动到 SSE 端点的连接,然后关闭 uvicorn 来测试它是否正常工作。连接会断开,但浏览器会自动尝试重新连接。因此,如果重新启动服务器,我们会看到流从中断的地方恢复! 请注意流是如何从消息 243 恢复的。感觉就像魔法🔥 7. 总结WebSockets 是建立在 HTTP 和 TCP 之上的大型机制,提供了一套极其特定的功能,即双向低延迟通信。 为了实现这一点,它们引入了许多复杂性,最终使得客户端和服务器实现比完全基于 HTTP 的解决方案更加复杂。 这些复杂性和限制已经在新的规范(RFC 7692,RFC 8441)中得到了解决,并将逐渐在客户端和服务器库中实现。 然而,即使在没有技术缺陷的情况下,WebSockets 仍然是一项相当复杂的技术,涉及大量额外的客户端和服务器代码。因此,您应仔细考虑是否值得增加复杂性,或者是否可以通过更简单的解决方案(如 Server-Sent Events)去解决问题。 就这些内容了,朋友们!希望你们觉得这篇文章有趣,也能从中学到一些新东西。 如果你想尝试一下 Server-Sent Events 和 WebSockets,可以自由地在 GitHub 上查看演示 Demo 代码。 我也鼓励你们阅读下 SSE 的规范,因为它解释得非常清晰,包含了很多示例。","categories":[{"name":"SSE","slug":"SSE","permalink":"https://yeshan333.github.io/categories/SSE/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"Websocket","slug":"Websocket","permalink":"https://yeshan333.github.io/tags/Websocket/"},{"name":"SSE","slug":"SSE","permalink":"https://yeshan333.github.io/tags/SSE/"}]},{"title":"2022 | Summary","slug":"2022-annual-reviewed","date":"2023-02-26T15:59:12.000Z","updated":"2023-02-26T15:59:12.000Z","comments":true,"path":"2023/02/26/2022-annual-reviewed/","permalink":"https://yeshan333.github.io/2023/02/26/2022-annual-reviewed/","excerpt":"","text":"迟来的总结,2022 五味杂陈,最后的几个月,基本都在尝试着解决某些情绪,这一年有很多东西应该被记录。坚持是最反人性的一种东西,但长远来看,这应该也是最浪漫的东西。这一年,我真正感受到了什么叫信念的崩塌,原来没有了光是这种感觉。或许真正明白了一个道理:没有经历过,只是看过别人的经历,没有多大用的,路走过了才勉强懂了。 博客 & 技术-Blog & Techs看了眼归档 archives,貌似今年的文章水得有点差强人意😂,不过原创文得质量还阔以,就是少了点。时间本很多事哗啦呼啦冲走了,同时貌似没啥思路水点东西。 Techs & Coding2022 年的 GitHub 小绿点,还阔以,挺养眼。不过有些是 RSS 定时器打的,2333,质量不得。 22 年 public 了两个 Elixir 和 Java 的项目,虽然有点水,但是感觉还不错,比上一年稍微好点了 (今年多了几个 PR,2333~)。 yeshan333/ApacheJmeter_Schema_Assertionhttps://github.com/yeshan333/ApacheJmeter_Schema_Assertion yeshan333/ex_integration_coverallshttps://github.com/yeshan333/ex_integration_coveralls 曾收到过一封 invitation,奈何感觉口语不行,没敢回: 生活-LifeGames22 年稍微回归了下某王者,老躺平放松娱乐游戏了。值得纪念的是入手了 switch,开拓了玩耍范围。火焰纹章终于不用模拟器“白嫖”了,回顾了下经典的超级机器人大战。 switchreal switch Sports费体力的事 22 年也不能少。又徒了几次步 15 km+,爬了好几个山头 😀。22 年还完成了之前愣是没去学的自行车,学会了之后愣是从大学城穿越大街小巷硬骑回了住处附近。忽然觉得有点猛,haha: bicycleroad Reading貌似 22 年看的书稍微花了点,心里的波动不是特别大了,很多东西得经历下再回头看看才行。 技术类的下面看的几个都不错: 《Google 软件工程》:22 年出了中文本,好啃多了。 《数据密集型应用系统设计》:看着很香,没拿下, 23 年还得多看看。 《Google 的软件测试之道》:一些理念实践很 nice,Google N 年前就做了的事,国内还不太行,震惊。 《用 Go 语言自制编译器》:Continue …….一堆 Erlang & Elixir 相关的 2y220425那些天rose 这里本应该会写更多的东西,每一段经历都应该被记录,或许才能更坦然的去面对它。 未来-Future话虽少,事其实挺多。Time is waiting for me.","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"(译)Elixir Tip: Case vs. With","slug":"Elixir-Tip-Case-vs-With","date":"2022-11-26T23:10:46.000Z","updated":"2022-11-26T23:10:46.000Z","comments":true,"path":"2022/11/26/Elixir-Tip-Case-vs-With/","permalink":"https://yeshan333.github.io/2022/11/26/Elixir-Tip-Case-vs-With/","excerpt":"","text":"从 1.2 版本开始, with 运算符是需要点时间去理解的 ELixir 特性之一. 它经常在使用 case 的情形下使用, 反之亦然. 两者的不同在于如果没有可以匹配到的子句, with 将失败, 而 case 将抛出一个不匹配 (no-match) 的错误 (CaseClauseError). 是不是有一点点疑惑, 让我们从最基本的使用开始看看. 使用 case 进行精准匹配, 你非常确定至少有一个是可以被匹配到的: 123456case foo() do cond1 -> expression1 cond2 -> expression2 cond3 -> expression3 _ -> default_expressionend 一个常见的 case 使用情景是对潜在的错误进行模式匹配: 1234case foo() do {:ok, res} -> do_something_with_result(res) {:error, err} -> handle_error(err)end 目前为止, 一切都看起来很好. 让我们来看一个常见的日常工作场景案例. 试想一下, 我们有一个这样的操作 (它可以是外部的 API 调用、IO 或者数据库操作), 我们想执行第二个这样的操作, 但只有当第一个操作成功的时候才执行. 这个行为我们怎么实现? 回想一下, Elixir 中的条件语句也是函数. 它们可以被插入或链接到其他条件的表达式部分. 这允许我们使用链式的条件语句来解决上面的问题: 12345678case foo() do {:ok, res} -> case bar(res) do {:ok, res2} -> do_something_with_result(res2) {:error, err} -> handle_error(err) end {:error, err} -> handle_error(err)end 尽管只有两个类似的调用操作, 但代码的复杂度是急剧上升的. 如果再添加一个类似的调用操作, 代码将会变得不可读: 123456789101112case foo() do {:ok, res} -> case bar(res) do {:ok, res2} -> case baz(res2) do {:ok, res3} -> do_something_with_result(res3) {:error, err} -> handle_error(err) end {:error, err} -> handle_error(err) end {:error, err} -> handle_error(err)end 使用 with 去拯救一下这就是 with 运算符非常方便的地方. 它的基本形式类似于上面 case 的链式例子, 但在某种程度上, 它的功能也类似于管道操作符. 看看这个: 12345with {:ok, res} <- foo(), {:ok, re2} <- bar(res) {:ok, re3} <- baz(re2) do do_something_with_result(res3)end 这可以解释为, “按顺序执行所有以逗号分隔的操作, 如果前一个操作是匹配的, 则执行下一个操作. 最后, 运行 do/end 块中的代码”. 这看起来比之前的版本更简洁和可读, 而且它还有另一个很大的优势. 它允许工程师优先关注正常的业务场景. 有些人可能想知道, 如果任何以逗号分隔的操作返回的是 {:error, err} 元组, 会发生什么情况. 答案是, 将返回第一个不匹配的操作表达式. 简单地说, 如果我们不关心非 ok 的结果, 那么我们也可以留下正常的路径, 把它留给调用者来处理最终结果. 如果你使用过 Phoenix,你可能会想起,这正是它的 fallback actions 的工作方式. 12345678910111213defmodule MyController do use Phoenix.Controller action_fallback MyFallbackController def show(conn, %{"id" => id}, current_user) do with {:ok, post} <- Blog.fetch_post(id), :ok <- Authorizer.authorize(current_user, :view, post) do render(conn, "show.json", post: post) end endend 这个 Fallback Controller 的例子来源于 official Phoenix docs with/else如果我们想要自己关注这些副作用 (side effects), with 提供了一个扩展版本给我们使用: 12345678with {:ok, res} <- foo(), {:ok, res2} <- bar(res) do do_something_with_res(res2)else {:error, {:some_error, err}} -> handle_some_error(err) {:error, {:some_other_error, err}} -> handle_some__other_error(err) default -> handle_something_completely_unexpected(default)end NOTE: 请记住,虽然基础的 with 形式在匹配失败时不会抛出错误,但在使用 else 时,你必须详尽地匹配所有的情况. 什么使用不应该使用 with用 else 处理单个模式匹配的场景这将使代码比你需要的更难以阅读. 代码如下: 12345with {:ok, res} <- foo() do do_something_with_res(res)else {:error, {:some_error, err}} -> handle_some_error(err)end 可以使用更具有可读性的 case 块处理: 1234case foo() do {:ok, res} -> do_something_with_res(res) {:error, {:some_error, err}} -> handle_some_error(err)end 相关文章 Elixir: Thoughts on the with Statement","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"}]},{"title":"the-solution-of-elixir-continuous-runtime-system-code-coverage-collection","slug":"the-solution-of-elixir-continuous-runtime-system-code-coverage-collection","date":"2022-08-31T22:43:10.000Z","updated":"2022-08-31T22:43:10.000Z","comments":true,"path":"2022/08/31/the-solution-of-elixir-continuous-runtime-system-code-coverage-collection/","permalink":"https://yeshan333.github.io/2022/08/31/the-solution-of-elixir-continuous-runtime-system-code-coverage-collection/","excerpt":"","text":"zh_hans Code coverage is an effective means to assist software engineers in verifying code quality. The runtime environment’s ability to collect code coverage fully combines black and white box testing capabilities and greatly increases engineers’ confidence in software quality. This article introduces a solution for code coverage collection in the Elixir runtime environment, and provides an in-depth insight into its internal principles. 1. Brief talk on code coverageAs a SDET or a SWE, we often need to write unit tests or integration test cases to verify the correctness of the system/application, but at the same time we often question whether our tests are adequate. At this time, test coverage is a means of measuring the adequacy of our testing, enhancing the success rate and confidence of the software release, and giving us more reflective perspectives. The note of the value is that high code coverage does not indicate high code quality, but conversely, code coverage is low, and code quality will not be high. Most programming languages come with the ability to collect unit test coverage, and the same is true for Elixir, the official mix build tool comes with the ability to collect coverage, but it is currently only suitable for offline system, not for runtime system. This article will be based on Erlang’s cover module to give a solution for the Elixir runtime system. Since cover is Erlang’s built-in module, but why it works equally well with Elixir, we’ll unveil its mystery in a follow-up. Before we get started, let’s take a look at the two mainstream ways in which the open source community collects code coverage at runtime (here we look at the bytecode stubbing method of Java, which has a huge ecosystem of the language community): Next let’s focus on the core of elixir runtime coverage collection in this article - the cover module. 2. Delve into the Erlang Cover coverage collection implementation mechanism2.1. Introduction Erlang Covercover is part of Erlang’s built-in tools set, providing a powerful ability to collect code coverage. 2.2. Erlang code coverage collection implementation analysisAs you can see from Erlang’s official manual of the cover module, cover counts the number of times every executable line in the Erlang program is executed. From the introduction of the official documentation, cover can be used for code coverage collection of the runtime system. When the code is instrumented, it does not modify the code source files of any modules or the beam files generated after compilation (that is the industry calls the On-The-Fly mode). Every time the executable row is called, the runtime system updates the number of calls to cover in an in-memory database (erlang ets) for storing data for subsequent coverage analysis. Next, we’ll explore the details of the On-The-Fly mode under cover. 2.3. Learn about BEAM File FormatBefore we can further understand the details of the cover implementation, it is necessary to understand the format of the BEAM file after the elixir source code is compiled. The compiled product of the Elixir (.ex file), like the Erlang (.erl file), is a binary chunked file, which is divided into several sections to store information used when the program runs (such as virtual machine operation instructions). In Erlang/Elixir, each module will have a corresponding BEAM file. The approximate structure of the BEAM file is as follows: Let’s take a look at the approximate content of the beam file through an Elixir mini demo project: Step 1. Clone the project yeshan333/explore_ast_app to the local: 12git clone https://github.com/yeshan333/explore_ast_app.gitcd explore_ast_app Step 2. Build this project in OTP release format. (note: Elixir and Erlang need to be installed locally): 1MIX_ENV=prod mix distillery.release It can be noted that each Elixir module is compiled into a BEAM file (can be seen in the directory _build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin). Step 3. Next, let’s view the chunks in the Beam file through Erlang’s standard library beam_lib: 12# open the iex consoleiex -S mix View all chunks of the compiled BEAM file (Elixir.ExploreAstApp.beam): 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253$ iex -S mixErlang/OTP 24 [erts-12.1] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit] [dtrace]Interactive Elixir (1.12.3) - press Ctrl+C to exit (type h() ENTER for help)iex(1)> beam_file_path = "_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin/Elixir.ExploreAstApp.beam""_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin/Elixir.ExploreAstApp.beam"iex(2)> all_chunks = :beam_lib.all_chunks(String.to_charlist(beam_file_path)){:ok, ExploreAstApp, [ {'AtU8', <<0, 0, 0, 15, 20, 69, 108, 105, 120, 105, 114, 46, 69, 120, 112, 108, 111, 114, 101, 65, 115, 116, 65, 112, 112, 8, 95, 95, 105, 110, 102, 111, 95, 95, 10, 97, 116, 116, 114, 105, 98, 117, 116, 101, ...>>}, {'Code', <<0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, 0, 14, 0, 0, 0, 4, 1, 16, 153, 0, 2, 18, 34, 16, 1, 32, 59, 3, 21, 23, 8, 16, 50, 117, 66, 117, 82, 101, 98, ...>>}, {'StrT', ""}, {'ImpT', <<0, 0, 0, 2, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 1>>}, {'ExpT', <<0, 0, 0, 4, 0, 0, 0, 15, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 9, ...>>}, {'LitT', <<0, 0, 0, 52, 120, 156, 99, 96, 96, 96, 98, 96, 96, 16, 106, 206, 1, 146, 140, 25, 76, 229, 172, 25, 169, 57, 57, 249, 137, 12, 89, 64, 190, 88, 115, 46, 144, 20, 248, ...>>}, {'LocT', <<0, 0, 0, 0>>}, {'Attr', <<131, 108, 0, 0, 0, 1, 104, 2, 100, 0, 3, 118, 115, 110, 108, 0, 0, 0, 1, 110, 16, 0, 165, 236, 94, 47, 119, 160, 184, 33, 240, 28, 89, 11, 22, 130, 207, ...>>}, {'CInf', <<131, 108, 0, 0, 0, 3, 104, 2, 100, 0, 7, 118, 101, 114, 115, 105, 111, 110, 107, 0, 5, 56, 46, 48, 46, 51, 104, 2, 100, 0, 7, 111, 112, 116, 105, 111, ...>>}, {'Dbgi', <<131, 80, 0, 0, 1, 143, 120, 156, 117, 80, 203, 78, 3, 49, 12, 76, 233, 67, 162, 5, 113, 65, 124, 70, 87, 253, 2, 212, 67, 63, 129, 115, 148, 221, 120, ...>>}, {'Docs', <<131, 80, 0, 0, 0, 241, 120, 156, 93, 142, 205, 10, 194, 48, 16, 132, 215, 74, 91, 9, 248, 14, 129, 94, 244, 82, 241, 234, 65, 40, 88, 241, 45, 108, ...>>}, {'ExCk', <<131, 104, 2, 100, 0, 17, 101, 108, 105, 120, 105, 114, 95, 99, 104, 101, 99, 107, 101, 114, 95, 118, 49, 116, 0, 0, 0, 1, 100, 0, 7, 101, 120, ...>>}, {'Line', <<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 1, 18, 241, 0, 22, 108, 105, 98, 47, 101, 120, 112, 108, ...>>} ]} As you can see, the obtained chunks correspond to the previous diagram. We can also obtain the Erlang AST (abstract syntax tree) corresponding to the module (ExploreAstApp) through the beam_lib standard library: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475iex(3)> result = :beam_lib.chunks(String.to_charlist(beam_file_path), [:abstract_code]){:ok, {ExploreAstApp, [ abstract_code: {:raw_abstract_v1, [ {:attribute, 1, :file, {'lib/explore_ast_app.ex', 1}}, {:attribute, 1, :module, ExploreAstApp}, {:attribute, 1, :compile, [:no_auto_import]}, {:attribute, 1, :export, [__info__: 1, hello: 0]}, {:attribute, 1, :spec, {{:__info__, 1}, [ {:type, 1, :fun, [ {:type, 1, :product, [ {:type, 1, :union, [ {:atom, 1, :attributes}, {:atom, 1, :compile}, {:atom, 1, :functions}, {:atom, 1, :macros}, {:atom, 1, :md5}, {:atom, 1, :exports_md5}, {:atom, 1, :module}, {:atom, 1, :deprecated} ]} ]}, {:type, 1, :any, []} ]} ]}}, {:function, 0, :__info__, 1, [ {:clause, 0, [{:atom, 0, :module}], [], [{:atom, 0, ExploreAstApp}]}, {:clause, 0, [{:atom, 0, :functions}], [], [ {:cons, 0, {:tuple, 0, [{:atom, 0, :hello}, {:integer, 0, 0}]}, {nil, 0}} ]}, {:clause, 0, [{:atom, 0, :macros}], [], [nil: 0]}, {:clause, 0, [{:atom, 0, :exports_md5}], [], [ {:bin, 0, [ {:bin_element, 0, {:string, 0, [240, 105, 247, 119, 22, 50, 219, 207, 90, 95, 127, 92, ...]}, :default, :default} ]} ]}, {:clause, 0, [{:match, 0, {:var, 0, :Key}, {:atom, 0, :attributes}}], [], [ {:call, 0, {:remote, 0, {:atom, 0, :erlang}, {:atom, 0, :get_module_info}}, [{:atom, 0, ExploreAstApp}, {:var, 0, :Key}]} ]}, {:clause, 0, [{:match, 0, {:var, 0, :Key}, {:atom, 0, :compile}}], [], [ {:call, 0, {:remote, 0, {:atom, 0, :erlang}, {:atom, 0, :get_module_info}}, [{:atom, 0, ExploreAstApp}, {:var, 0, :Key}]} ]}, {:clause, 0, [{:match, 0, {:var, 0, :Key}, {:atom, 0, :md5}}], [], [ {:call, 0, {:remote, 0, {:atom, 0, :erlang}, {:atom, 0, :get_module_info}}, [{:atom, 0, ExploreAstApp}, {:var, 0, :Key}]} ]}, {:clause, 0, [{:atom, 0, :deprecated}], [], [nil: 0]} ]}, {:function, 15, :hello, 0, [{:clause, 15, [], [], [{:atom, 0, :world}]}]} ]} ]}} It can be seen that AST is expressed in the form of Erlang Terms (called Abstract Code), which is easy to read. The Abstract Code is very useful in the on-the-fly instrumentation process of cover. The above AST structure is simple and easy to read, and we can easily match it with the source code (lib/explore_ast_app.ex) before the module is compiled, although the AST structure is the final Erlang AST, and some extras information are added by the Erlang compiler, but does not affect reading: The second element in the tuple generally represents the number of source code lines. You can learn more about Erlang’s Abstract Format through the official documentation. By observing the Erlang AST structure of several BEAM files, you will be familiar with it. It is worth noting that the Abstract Code was stored in the Abstract Chunk of the BEAM file before OTP 20. If you want to learn more about BEAM files in detail, you can check out the following two documents: http://beam-wisdoms.clau.se/en/latest/indepth-beam-file.html#beam-term-format https://blog.stenmans.org/theBeamBook/#BEAM_files 2.4. Elixir source code compilation processAfter understanding BEAM File Format, we also need to understand the compilation process of Elixir code, which will help us better understand cover. The process of compiling Elixir source code into BEAM file may not be as you imagined In the same way, instead of directly from Elixir’s AST, it becomes executable BEAM Code after being processed by the compiler backend. There is also a process in the middle, as shown in the following figure: The above process can be described as: Step 1、The Elixir source code will be parsed by a custom lexical analyzer (elixir_tokenizer) and yacc to generate the initial version of Elixir AST, which is expressed in the form of Elixir Terms; if you are interested in Elixir’s AST, you can follow this Project arjan/ast_ninja; Step 2、In the Elixir AST stage, some custom and built-in Macros have not been expanded, and these Macros are expanded into the final Elixir AST in the Expanded Elixir AST stage; Step 3、Final Elixir AST will be converted into Erlang standard AST form (Erlang Abstract Format) after being processed by Elixir Compiler; Step 4、Finally, Elixir will use the Erlang Compiler to process the Erlang AST, converting it into BEAM bytecode executable by the BEAM Virtual Machine (VM). For details on the compiler, see: elixir_compiler.erl and elixir_erl.erl source code For more details on the Erlang Compiler, see theBeamBook/#CH-Compiler. 2.5. Cover On-The-Fly Instrumentation ImplementationNow it’s time for dinner. Let’s see how cover performs instrumentation and coverage collection. To use cover to complete code coverage collection, we must know three dragon-slaying swords: cover:start: Used to create the cover coverage collection process, it will complete the creation of the relevant ets table to store the coverage data, cover.erl#L159 & cover.erl#L632, and we can also start the cover process of the remote Erlang node. cover:compile_beam: For instrumentation, cover will read the content of the abstract_code of the BEAM file, namely Erlang AST. The key code is in cover.erl#L1541, and then transform and munge the Erlang AST From, it will call bump_call, after each executable line will insert the following abstract_code: 123456789{call,A,{remote,A,{atom,A,ets},{atom,A,update_counter}}, [{atom,A,?COVER_TABLE}, {tuple,A,[{atom,A,?BUMP_REC_NAME}, {atom,A,Vars#vars.module}, {atom,A,Vars#vars.function}, {integer,A,Vars#vars.arity}, {integer,A,Vars#vars.clause}, {integer,A,Line}]}, {integer,A,1}]}. From the previous understanding of Erlang AST, we know that this is equivalent to inserting the following line of code: 1ets:update_counter(?COVER_TABLE, #bump{module=Module, function=Function, arity=Arity, clause=Clause, line=Line}, 1). Then for the mungeed Erlang AST Form, cover uses the Erlang Compiler to obtain the Erlang Beam Code (also known as object code. i.e. bytecode, VM execution instructions) from the mungeed AST expression form. cover.erl#L1580. And then use the Erlang code server to replace the old object code with the new object code obtained, load_binary cover.erl#L1581 into ERTS (Erlang Run Time System). cover completes the Erlang AST instrumentation process, so that whenever the executable line is Executed, the corresponding ets storage table will update the number of times the code line was called. cover:analyze: Analyze the data stored in the ets table to obtain the number of times the executable line was executed (called), which can be used for statistical coverage data. munge: Used to make a series of potentially destructive or irreversible changes to data or files. 3. Elixir Application runtime coverage collection exampleThrough the above, after understanding the implementation details of the Erlang Cover module. Let us take a deployed and running Elixir Application (we will use the previous yesan333/explore_ast_app) as an example to perform large-scale tests (system & integration tests) of the Elixir application runtime of code line-level coverage collection. Here we will use a tool library: ex_integration_coveralls for coverage analysis, which is an Elixir Wrapper for the Erlang module cover to collection Elixir runtime system coverage. Let’s start: Step 1、Add ex_integration_coveralls dependency to mix.exs file: 123456defp deps do [ ..., {:ex_integration_coveralls, "~> 0.3.0"} ]end Pull the dependencies and rebuild the project: 12mix deps.getMIX_ENV=prod mix distillery.release Step 2、Start the project: 1_build/prod/rel/explore_ast_app/bin/explore_ast_app foreground Step 3、Connect to the remote_console of the Elixir runtime application node: 1_build/prod/rel/explore_ast_app/bin/explore_ast_app remote_console Step 4、Use ex_integration_coveralls (ExIntegrationCoveralls.execute) to start cover and perform code coverage collection: 12345678910111213141516iex(explore_ast_app@127.0.0.1)1> compiled_beam_dir_path = "/Users/yeshan/oss_github/explore_ast_app/_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin""/Users/yeshan/oss_github/explore_ast_app/_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin"iex(explore_ast_app@127.0.0.1)2> ExIntegrationCoveralls.execute(compiled_beam_dir_path)[ ok: ExploreAstApp.Router, ok: ExploreAstApp.Plug.VerifyRequest.IncompleteRequestError, ok: ExploreAstApp.Plug.VerifyRequest, ok: ExploreAstApp.Application, ok: ExploreAstApp]iex(explore_ast_app@127.0.0.1)3> compile_time_source_lib_abs_path = "/Users/yeshan/oss_github/explore_ast_app""/Users/yeshan/oss_github/explore_ast_app"iex(explore_ast_app@127.0.0.1)4> source_code_abs_path = "/Users/yeshan/oss_github/explore_ast_app""/Users/yeshan/oss_github/explore_ast_app"iex(explore_ast_app@127.0.0.1)5> ExIntegrationCoveralls.get_total_coverage(compile_time_source_lib_abs_path, source_code_abs_path)0 As you can see, the initial coverage is 0, because no code has been called yet. Step 5、Let’s execute the following cURL. Let code be called: 12$ curl --location --request GET 'http://localhost:8080/hello'hello % Check out the code coverage data again in iex console: 12iex(explore_ast_app@127.0.0.1)6> ExIntegrationCoveralls.get_total_coverage(compile_time_source_lib_abs_path, source_code_abs_path)17.1 As you can see, the cURL (test case) coverage for this project is 17.1%. We can also use the following methods to view more detailed code coverage, such as viewing the code coverage of lib/explore_ast_app/router.ex (nil means the line is not an executable line): 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132iex(explore_ast_app@127.0.0.1)7> result = ExIntegrationCoveralls.get_coverage_report(compile_time_source_lib_abs_path, source_code_abs_path).......iex(explore_ast_app@127.0.0.1)8> Enum.at(Map.get(result, :files), 3)%ExIntegrationCoveralls.Stats.Source{ coverage: 18.2, filename: "lib/explore_ast_app/router.ex", hits: 4, misses: 18, sloc: 22, source: [ %ExIntegrationCoveralls.Stats.Line{ coverage: 1, source: "defmodule ExploreAstApp.Router do" }, %ExIntegrationCoveralls.Stats.Line{coverage: 1, source: " use Plug.Router"}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " use Plug.ErrorHandler" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " import Plug.Conn" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " alias ExploreAstApp.Plug.VerifyRequest" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug Plug.Parsers, parsers: [:urlencoded, :multipart]" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug VerifyRequest, fields: [\\"content\\", \\"mimetype\\"], paths: [\\"/upload\\"]" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " plug :match"}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug Plug.Parsers, parsers: [:json], pass: [\\"application/json\\"], json_decoder: Jason" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug :dispatch" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " get \\"/welcome\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " send_resp(conn, 200, \\"Welcome\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " get \\"/upload\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " send_resp(conn, 201, \\"Uploaded\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 1, source: " get \\"/hello\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # query parameter is user like this:" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # http://localhost:4001/hello?name=John" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # which will create %{\\"name\\" => \\"John\\"}" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 1, source: " send_resp(conn, 200, \\"hello \\#{Map.get(conn.query_params, \\"name\\")}\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " get \\"/hello/:name\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " send_resp(conn, 200, \\"hello \\#{name}\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " post \\"/hello\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # json body of POST request {\\"name\\": \\"John\\"} is parsed to %{\\"name\\" => \\"John\\"}" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # so it can be accesable with e.g. Map.get(conn.body_params, \\"name\\") or with pattern matching" }, %ExIntegrationCoveralls.Stats.Line{coverage: 0, source: " name ="}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " case conn.body_params do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " %{\\"name\\" => a_name } -> a_name" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " _ -> \\"\\"" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, ...}, %ExIntegrationCoveralls.Stats.Line{...}, ... ]} Based on the post_cov_stats_to_ud_ci interface, it is possible to further interface with internal or external Codecov-like coverage systems. Based on this, we can realize the collection of code coverage with large-scale (integration & system) testing capabilities without stopping the Elixir Application. 4. Continuous runtime coverage collection solution for large-scale Elixir/Erlang Microservice clustersWith the continuous expansion of the Elixir/Erlang microservice system, the coverage collection method shown in the previous section needs further evolution. Referring to the design of Prometheus Pull-Base, the overall design (combination of Pull & Push mode) is as follows: We expand based on ex_integration_coveralls. After the Elixir Application is started, a http worker is started up to expose the code coverage data in real time, which is convenient for communication with heterogeneous systems. The Coverage Push Gateway is responsible for regularly pulling the coverage data (Gateway can be a OTP Application, which allows ex_integration_coveralls to directly start up the custom GenServer Worker for interactive integration test system in the distributed OTP system), after the integration/system test system informs the end of the test, the Gateway pushes the coverage data to the Cover Center for code coverage rate display. End (long way to go). References Code Coverage at Google Erlang cover A brief introduction to BEAM A peak into the Erlang compiler and BEAM bytecode Getting each stage of Elixir’s compilation all the way to the BEAM bytecode excoveralls BeamFile - A peek into the BEAM file https://github.com/KronicDeth/intellij-elixir#beam-files","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"},{"name":"Test Coverage","slug":"Test-Coverage","permalink":"https://yeshan333.github.io/tags/Test-Coverage/"}]},{"title":"Elixir 连续运行时代码覆盖率采集方案","slug":"elixir-run-time-code-line-level-coverage-collection","date":"2022-06-29T23:14:26.000Z","updated":"2022-06-29T23:14:26.000Z","comments":true,"path":"2022/06/29/elixir-run-time-code-line-level-coverage-collection/","permalink":"https://yeshan333.github.io/2022/06/29/elixir-run-time-code-line-level-coverage-collection/","excerpt":"","text":"1. 浅谈代码覆盖率作为 SET 和 SWE, 我们经常需要编写单元测试或集成测试用例来验证系统/应用的正确性, 但同时我们也常会质疑我们的测试是否充分了. 这时测试覆盖率是可以辅助用来衡量我们测试充分程度的一种手段, 增强发布成功率与信心, 同时给了我们更多可思考的视角. 值的注意的是代码覆盖率高不能说明代码质量高, 但是反过来看, 代码覆盖率低, 代码质量不会高到哪里去. 大部分的编程语言都自带了单元测试覆盖率的收集能力, Elixir 也同样如此, 官方提供的 mix 构建工具自带了覆盖率的收集能力, 但目前只适用于离线(offline)系统, 对于运行时系统, 并不适用. 本文将会基于 Erlang 的 cover 模块, 给出一个 Elixir 运行时系统的解决方案. 既然 cover 是 Erlang 的内置模块, 但为什么它也同样适用于 Elixir, 我们将会在后续的环节中揭开它神秘的面纱. 在开始之前, 让我们先看下开源社区进行运行时系统代码覆盖率采集的两种主流方式(这里我们看下语言社区生态庞大的 Java 的字节码插桩方式): 接下来让我们关注一下本文的 Elixir 运行时覆盖率收集的核心 - cover 模块. 2. 深度解析 Erlang Cover 覆盖率收集实现机制2.1 Erlang Cover 简介cover 是 Erlang 内置工具集(tools set)的一部分, 提供了代码覆盖率收集的能力. 2.2 Erlang 代码覆盖率收集实现分析从 Erlang 关于 cover 模块官方手册可以知道, cover 统计了 Erlang 程序中每一可执行(executable line)被执行的次数. 从官方文档的介绍来看, cover 可以用于运行时系统的代码覆盖率收集, cover 进行代码插桩时, 并不会对任何模块的代码源文件或编译后生成的 beam 文件进行修改(即业界所说的 On-The-Fly 模式). 运行时系统每次可执行行被调用一次, 都会更新调用次数到 cover 用于存储数据的内存数据库中, 用于后续的覆盖率分析. 接下来, 我们将会去探索下 cover 进行 On-The-Fly 插桩的细节. 2.3 了解 BEAM File Format在进一步了解 cover 实现细节之前, 我们有必要先了解下 Elixir 源码编译后的产物 BEAM 文件的格式. Elixir (.ex 文件)编译后的产物与 Erlang (.erl 文件)一样, 都是一个二进制分块文件(binary chunked file), 它被划分为了多个 section, 用于存储程序运行时用到的信息(如虚拟机操作指令). Erlang/Elixir 中, 每一个模块都会有一个对应的 BEAM 文件. BEAM 文件大致的结构如下图: 让我们来通过一个 Elixir mini demo 项目查看下 beam 文件大概内容: Step 1、clone 项目 yeshan333/explore_ast_app 到本地: 12git clone https://github.com/yeshan333/explore_ast_app.gitcd explore_ast_app Step 2、构建此项目为 OTP release 格式, 本地需要安装 Elixir 和 Erlang: 1MIX_ENV=prod mix distillery.release 可以关注到, 每一个 Elixir 模块, 都被编译成了一个 BEAM 文件(于目录_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin 中可以看到). Step 3、接下来让我们通过 Erlang 的标准库 beam_lib 文件查看 Beam 文件中的 chunk: 12# 打开 iex consoleiex -S mix 查看编译后 BEAM 文件 (Elixir.ExploreAstApp.beam) 的所有 chunks: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253$ iex -S mixErlang/OTP 24 [erts-12.1] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit] [dtrace]Interactive Elixir (1.12.3) - press Ctrl+C to exit (type h() ENTER for help)iex(1)> beam_file_path = "_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin/Elixir.ExploreAstApp.beam""_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin/Elixir.ExploreAstApp.beam"iex(2)> all_chunks = :beam_lib.all_chunks(String.to_charlist(beam_file_path)){:ok, ExploreAstApp, [ {'AtU8', <<0, 0, 0, 15, 20, 69, 108, 105, 120, 105, 114, 46, 69, 120, 112, 108, 111, 114, 101, 65, 115, 116, 65, 112, 112, 8, 95, 95, 105, 110, 102, 111, 95, 95, 10, 97, 116, 116, 114, 105, 98, 117, 116, 101, ...>>}, {'Code', <<0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, 0, 14, 0, 0, 0, 4, 1, 16, 153, 0, 2, 18, 34, 16, 1, 32, 59, 3, 21, 23, 8, 16, 50, 117, 66, 117, 82, 101, 98, ...>>}, {'StrT', ""}, {'ImpT', <<0, 0, 0, 2, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 1>>}, {'ExpT', <<0, 0, 0, 4, 0, 0, 0, 15, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 9, ...>>}, {'LitT', <<0, 0, 0, 52, 120, 156, 99, 96, 96, 96, 98, 96, 96, 16, 106, 206, 1, 146, 140, 25, 76, 229, 172, 25, 169, 57, 57, 249, 137, 12, 89, 64, 190, 88, 115, 46, 144, 20, 248, ...>>}, {'LocT', <<0, 0, 0, 0>>}, {'Attr', <<131, 108, 0, 0, 0, 1, 104, 2, 100, 0, 3, 118, 115, 110, 108, 0, 0, 0, 1, 110, 16, 0, 165, 236, 94, 47, 119, 160, 184, 33, 240, 28, 89, 11, 22, 130, 207, ...>>}, {'CInf', <<131, 108, 0, 0, 0, 3, 104, 2, 100, 0, 7, 118, 101, 114, 115, 105, 111, 110, 107, 0, 5, 56, 46, 48, 46, 51, 104, 2, 100, 0, 7, 111, 112, 116, 105, 111, ...>>}, {'Dbgi', <<131, 80, 0, 0, 1, 143, 120, 156, 117, 80, 203, 78, 3, 49, 12, 76, 233, 67, 162, 5, 113, 65, 124, 70, 87, 253, 2, 212, 67, 63, 129, 115, 148, 221, 120, ...>>}, {'Docs', <<131, 80, 0, 0, 0, 241, 120, 156, 93, 142, 205, 10, 194, 48, 16, 132, 215, 74, 91, 9, 248, 14, 129, 94, 244, 82, 241, 234, 65, 40, 88, 241, 45, 108, ...>>}, {'ExCk', <<131, 104, 2, 100, 0, 17, 101, 108, 105, 120, 105, 114, 95, 99, 104, 101, 99, 107, 101, 114, 95, 118, 49, 116, 0, 0, 0, 1, 100, 0, 7, 101, 120, ...>>}, {'Line', <<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 1, 18, 241, 0, 22, 108, 105, 98, 47, 101, 120, 112, 108, ...>>} ]} 可以看到, 获取到的 chunks 是和之前的图对应的. 我们还可以通过 beam_lib 标准库获取到模块(ExploreAstApp)对应的 Erlang AST(抽象语法树): 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475iex(3)> result = :beam_lib.chunks(String.to_charlist(beam_file_path), [:abstract_code]){:ok, {ExploreAstApp, [ abstract_code: {:raw_abstract_v1, [ {:attribute, 1, :file, {'lib/explore_ast_app.ex', 1}}, {:attribute, 1, :module, ExploreAstApp}, {:attribute, 1, :compile, [:no_auto_import]}, {:attribute, 1, :export, [__info__: 1, hello: 0]}, {:attribute, 1, :spec, {{:__info__, 1}, [ {:type, 1, :fun, [ {:type, 1, :product, [ {:type, 1, :union, [ {:atom, 1, :attributes}, {:atom, 1, :compile}, {:atom, 1, :functions}, {:atom, 1, :macros}, {:atom, 1, :md5}, {:atom, 1, :exports_md5}, {:atom, 1, :module}, {:atom, 1, :deprecated} ]} ]}, {:type, 1, :any, []} ]} ]}}, {:function, 0, :__info__, 1, [ {:clause, 0, [{:atom, 0, :module}], [], [{:atom, 0, ExploreAstApp}]}, {:clause, 0, [{:atom, 0, :functions}], [], [ {:cons, 0, {:tuple, 0, [{:atom, 0, :hello}, {:integer, 0, 0}]}, {nil, 0}} ]}, {:clause, 0, [{:atom, 0, :macros}], [], [nil: 0]}, {:clause, 0, [{:atom, 0, :exports_md5}], [], [ {:bin, 0, [ {:bin_element, 0, {:string, 0, [240, 105, 247, 119, 22, 50, 219, 207, 90, 95, 127, 92, ...]}, :default, :default} ]} ]}, {:clause, 0, [{:match, 0, {:var, 0, :Key}, {:atom, 0, :attributes}}], [], [ {:call, 0, {:remote, 0, {:atom, 0, :erlang}, {:atom, 0, :get_module_info}}, [{:atom, 0, ExploreAstApp}, {:var, 0, :Key}]} ]}, {:clause, 0, [{:match, 0, {:var, 0, :Key}, {:atom, 0, :compile}}], [], [ {:call, 0, {:remote, 0, {:atom, 0, :erlang}, {:atom, 0, :get_module_info}}, [{:atom, 0, ExploreAstApp}, {:var, 0, :Key}]} ]}, {:clause, 0, [{:match, 0, {:var, 0, :Key}, {:atom, 0, :md5}}], [], [ {:call, 0, {:remote, 0, {:atom, 0, :erlang}, {:atom, 0, :get_module_info}}, [{:atom, 0, ExploreAstApp}, {:var, 0, :Key}]} ]}, {:clause, 0, [{:atom, 0, :deprecated}], [], [nil: 0]} ]}, {:function, 15, :hello, 0, [{:clause, 15, [], [], [{:atom, 0, :world}]}]} ]} ]}} 可以看到 AST 以 Erlang Terms 的形式表示(称之为 Abstract Code), 方便阅读. 该 Abstract Code, 在 cover 进行 on-the-fly 插桩过程中大有妙用. 上述 AST 结构简单易读, 我们可以很简单的将其与模块编译前的源代码(lib/explore_ast_app.ex)对应起来, 虽然该 AST 结构是最终的 Erlang AST, 被 Erlang 编译器添加了部分额外的信息, 但不影响阅读: 元组(tuple)中的第二个元素一般表示所处的源码行数. 你可以通过官方文档详细了解下 Erlang 的 Abstract Format, 动手多观察几个 BEAM 文件的 Erlang AST 的结构, 便可了熟于心. 值得注意的是 Abstract Code 在 OTP 20 之前是存放在 BEAM 文件的 Abst Chunk 中的. 如果你想了解更多关于 BEAM 文件的细节, 可以查看以下两篇文档: http://beam-wisdoms.clau.se/en/latest/indepth-beam-file.html#beam-term-format https://blog.stenmans.org/theBeamBook/#BEAM_files 2.4 Elixir 源码编译过程了解了 BEAM File Format(BEAM 文件格式)之后, 我们还有必要了解下 Elixir 代码的编译过程, 有助于我们更好的理解 cover. Elixir 源码的编译为 BEAM 文件的过程可能和你想象的不太一样, 不直接从 Elixir 的 AST, 经过编译器后端的处理后成为可执行的 BEAM Code, 中间还有一个过程, 如下图所示: 上图的过程可以描述为: Step 1、Elixir 源代码会被自定义的词法分析器(elixir_tokenizer)和 yacc 进行语法分析生成初始版的 Elixir AST, AST 以 Elixir Terms 的形式表示;如果你对 Elixir 的 AST 感兴趣, 可以关注下这个项目 arjan/ast_ninja. Step 2、在 Elixir AST 阶段, 一些自定义的和内置的宏(Macros)还没有被展开, 这些宏在 Expanded Elixir AST 展开为最终的 Elixir AST(final Elixir AST); Step 3、final Elixir AST 经过 Elixir Compiler 处理会被转换为 Erlang 标准的 AST 形式(Erlang Abstract Format); Step 4、最后, Elixir 会使用 Erlang 的 Compiler 处理 Erlang AST, 将其转换为可被 BEAM 虚拟机(VM)执行的 BEAM 字节码. 关于 compiler 的细节, 可以查看: elixir_compiler.erl 和 elixir_erl.erl 源码, 如果你也想了解 Erlang Compiler 的细节, 可以查看 theBeamBook/#CH-Compiler. 2.5 Cover On-The-Fly 插桩实现现在该来到正餐环节了, 让我们来看看 cover 是如何进行插桩和覆盖率收集的, 使用 cover 完成代码覆盖率收集, 必须要知道三把屠龙利剑: cover:start: 用于创建 cover 覆盖率收集进程, 它会完成存储覆盖率数据的相关 ets 表的创建, cover.erl#L159 & cover.erl#L632, 还可以启动远程(remote) Erlang 节点的 cover 进程. cover:compile_beam: 进行插桩, cover 会读取 BEAM 文件的 abstract_code 的内容, 即 Erlang AST, 关键代码在 cover.erl#L1541, 然后对 Erlang AST From 进行 transform 和 munge, 它会调用 bump_call, 在每一个可执行行后插入如下 abstract_code: 123456789{call,A,{remote,A,{atom,A,ets},{atom,A,update_counter}}, [{atom,A,?COVER_TABLE}, {tuple,A,[{atom,A,?BUMP_REC_NAME}, {atom,A,Vars#vars.module}, {atom,A,Vars#vars.function}, {integer,A,Vars#vars.arity}, {integer,A,Vars#vars.clause}, {integer,A,Line}]}, {integer,A,1}]}. 通过前文对 Erlang AST 的了解, 我们知道这相当于插入了如下一行代码: 1ets:update_counter(?COVER_TABLE, #bump{module=Module, function=Function, arity=Arity, clause=Clause, line=Line}, 1). 然后对于被 munge 后的 Erlang AST Form, cover 使用了 Erlang Compiler 从被 munge 后的 AST 表达形式中获取 Erlang Beam Code(又称 object code, 即字节码, VM 执行指令)cover.erl#L1580, 然后利用 Erlang code server 将获取到的新 object code 替换旧的 object code, load_binary cover.erl#L1581 到了 ERTS(Erlang Run Time System)中 . cover 完成了 Erlang AST 插桩流程, 这样, 每当可执行行被执行, 对应的 ets 存储表都会更新该行被 call 的次数. cover:analyze: 分析 ets 表中存储的数据, 可获取可执行被执行(called)的次数, 可用于统计覆盖率数据. munge: 用于对数据或文件进行一系列可能具有破坏性或不可撤销的更改. 3. Elixir Application 运行时覆盖率采集示例通过前文, 在了解了 Erlang Cover 模块的实现细节之后, 让我们以一个部署运行的 Elixir Application(我们会使用之前的 yeshan333/explore_ast_app ) 为例, 进行Elixir 应用运行时的大型测试(系统 & 集成测试)代码行级覆盖率采集. 这里我们会使用到一个工具库: ex_integration_coveralls 进行覆盖率的分析, 它是 Erlang 模块 cover 的一个 Elixir Wrapper. 让我们开始: Step 1、添加 ex_integration_coveralls 依赖到 mix.exs 文件中: 123456defp deps do [ ..., {:ex_integration_coveralls, "~> 0.3.0"} ]end 拉取依赖, 重新构建项目: 12mix deps.getMIX_ENV=prod mix distillery.release Step 2、启动项目: 1_build/prod/rel/explore_ast_app/bin/explore_ast_app foreground Step 3、连接运行时应用节点的 remote_console: 1_build/prod/rel/explore_ast_app/bin/explore_ast_app remote_console Step 4、利用 ex_integration_coveralls (ExIntegrationCoveralls.execute) 启动 cover, 执行代码覆盖率收集: 12345678910111213141516iex(explore_ast_app@127.0.0.1)1> compiled_beam_dir_path = "/Users/yeshan/oss_github/explore_ast_app/_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin""/Users/yeshan/oss_github/explore_ast_app/_build/prod/rel/explore_ast_app/lib/explore_ast_app-0.1.0/ebin"iex(explore_ast_app@127.0.0.1)2> ExIntegrationCoveralls.execute(compiled_beam_dir_path)[ ok: ExploreAstApp.Router, ok: ExploreAstApp.Plug.VerifyRequest.IncompleteRequestError, ok: ExploreAstApp.Plug.VerifyRequest, ok: ExploreAstApp.Application, ok: ExploreAstApp]iex(explore_ast_app@127.0.0.1)3> compile_time_source_lib_abs_path = "/Users/yeshan/oss_github/explore_ast_app""/Users/yeshan/oss_github/explore_ast_app"iex(explore_ast_app@127.0.0.1)4> source_code_abs_path = "/Users/yeshan/oss_github/explore_ast_app""/Users/yeshan/oss_github/explore_ast_app"iex(explore_ast_app@127.0.0.1)5> ExIntegrationCoveralls.get_total_coverage(compile_time_source_lib_abs_path, source_code_abs_path)0 可以看到, 初始的覆盖率是 0, 还没有代码被调用. Step 5、让我们执行以下 cURL : 12 $ curl --location --request GET 'http://localhost:8080/hello'hello % 再次查看代码覆盖率数据: 12iex(explore_ast_app@127.0.0.1)6> ExIntegrationCoveralls.get_total_coverage(compile_time_source_lib_abs_path, source_code_abs_path)17.1 可以看到, cURL(测试)对该项目的覆盖率是 17.1%. 我们还可以使用如下方式查看更为详尽的代码覆盖情况, 比如查看 lib/explore_ast_app/router.ex 的代码覆盖情况(nil 表示该行不是 executable line): 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132iex(explore_ast_app@127.0.0.1)7> result = ExIntegrationCoveralls.get_coverage_report(compile_time_source_lib_abs_path, source_code_abs_path).......iex(explore_ast_app@127.0.0.1)8> Enum.at(Map.get(result, :files), 3)%ExIntegrationCoveralls.Stats.Source{ coverage: 18.2, filename: "lib/explore_ast_app/router.ex", hits: 4, misses: 18, sloc: 22, source: [ %ExIntegrationCoveralls.Stats.Line{ coverage: 1, source: "defmodule ExploreAstApp.Router do" }, %ExIntegrationCoveralls.Stats.Line{coverage: 1, source: " use Plug.Router"}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " use Plug.ErrorHandler" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " import Plug.Conn" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " alias ExploreAstApp.Plug.VerifyRequest" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug Plug.Parsers, parsers: [:urlencoded, :multipart]" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug VerifyRequest, fields: [\\"content\\", \\"mimetype\\"], paths: [\\"/upload\\"]" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " plug :match"}, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug Plug.Parsers, parsers: [:json], pass: [\\"application/json\\"], json_decoder: Jason" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " plug :dispatch" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " get \\"/welcome\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " send_resp(conn, 200, \\"Welcome\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " get \\"/upload\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " send_resp(conn, 201, \\"Uploaded\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 1, source: " get \\"/hello\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # query parameter is user like this:" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # http://localhost:4001/hello?name=John" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # which will create %{\\"name\\" => \\"John\\"}" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 1, source: " send_resp(conn, 200, \\"hello \\#{Map.get(conn.query_params, \\"name\\")}\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " get \\"/hello/:name\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " send_resp(conn, 200, \\"hello \\#{name}\\")" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " post \\"/hello\\" do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # json body of POST request {\\"name\\": \\"John\\"} is parsed to %{\\"name\\" => \\"John\\"}" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " # so it can be accesable with e.g. Map.get(conn.body_params, \\"name\\") or with pattern matching" }, %ExIntegrationCoveralls.Stats.Line{coverage: 0, source: " name ="}, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " case conn.body_params do" }, %ExIntegrationCoveralls.Stats.Line{ coverage: 0, source: " %{\\"name\\" => a_name } -> a_name" }, %ExIntegrationCoveralls.Stats.Line{ coverage: nil, source: " _ -> \\"\\"" }, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: " end"}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, source: ""}, %ExIntegrationCoveralls.Stats.Line{coverage: nil, ...}, %ExIntegrationCoveralls.Stats.Line{...}, ... ]} 基于 post_cov_stats_to_ud_ci 接口,可以进一步对接内部或外部的类似于 Codecov 的覆盖率系统. 基于此, 我们可以实现在 Elixir Application 不停止运行的情况下, 配合大型(集成 & 系统)测试能力, 完成代码覆盖率的收集. 4. 大规模 Elixir/Erlang 微服务集群连续运行时覆盖率收集方案随着 Elixir 微服务系统规模的不断扩大, 前一节所展现的覆盖率收集手段需要进一步的演进. 参考 Prometheus Pull-Base 的设计, 总体设计(Pull & Push 模式结合)如下: 我们基于 ex_integration_coveralls 做拓展, 在 Elixir Application 启动后, 拉起一个 http worker 将代码覆盖率数据实时暴露出去, 方便与异构系统的通信. 由 Coverage Push Gateway 负责定时拉取覆盖率数据(Gateway 可以是一个 OTP Application, 这让可以直接让ex_integration_coveralls 拉起 GenServer Worker 在分布式 OTP 系统进行交互集成), 在集成/系统测试系统告知测试结束后, Gateway 将覆盖率 push 给 Cover Center(覆盖率中心)进行代码覆盖率展示. End(long way to go). 参考 Code Coverage at Google Erlang cover A brief introduction to BEAM A peak into the Erlang compiler and BEAM bytecode Getting each stage of Elixir’s compilation all the way to the BEAM bytecode excoveralls BeamFile - A peek into the BEAM file https://github.com/KronicDeth/intellij-elixir#beam-files","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"},{"name":"Test Coverage","slug":"Test-Coverage","permalink":"https://yeshan333.github.io/tags/Test-Coverage/"}]},{"title":"(译) Understanding Elixir Macros, Part 6 - In-place Code Generation","slug":"understanding-elixir-macros-part-6-in-place-code-generation","date":"2022-06-19T17:47:21.000Z","updated":"2022-06-19T17:47:21.000Z","comments":true,"path":"2022/06/19/understanding-elixir-macros-part-6-in-place-code-generation/","permalink":"https://yeshan333.github.io/2022/06/19/understanding-elixir-macros-part-6-in-place-code-generation/","excerpt":"","text":"Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir Macros, Part 2 - Macro Theory [3] (译) Understanding Elixir Macros, Part 3 - Getting into the AST [4] (译) Understanding Elixir Macros, Part 4 - Diving Deeper [5] (译) Understanding Elixir Macros, Part 5 - Reshaping the AST [6] (译) Understanding Elixir Macros, Part 6 - In-place Code Generation原文 GitHub 仓库, 作者: Saša Jurić. 这是宏系列文章的最后一篇. 在开始之前, 我想提一下 Björn Rochel, 他已经将他的 Apex 库中的 deftraceable 宏改进了. 因为他发现系列文章中 deftraceable 的版本不能正确处理默认参数(arg \\ def_value), 于是做了一个修复 bugfix. 这次, 让我们结束这个宏的故事. 今天的文章知识点可能是整个系列中涉及最广的, 我们将讨论原地代码生成的相关技术, 以及它可能对宏的影响. 在模块 module 中生成代码正如我在第 1 章中提到的那样, 宏并不是 Elixir 中唯一的元编程机制. 我们也可以在模块中直接生成代码. 为了唤起你的记忆, 我们来看看下面的例子: 12345678910111213141516171819202122defmodule Fsm do fsm = [ running: {:pause, :paused}, running: {:stop, :stopped}, paused: {:resume, :running} ] # Dynamically generating functions directly in the module for {state, {action, next_state}} <- fsm do def unquote(action)(unquote(state)), do: unquote(next_state) end def initial, do: :runningendFsm.initial# :runningFsm.initial |> Fsm.pause# :pausedFsm.initial |> Fsm.pause |> Fsm.pause# ** (FunctionClauseError) no function clause matching in Fsm.pause/1 在这里, 我们直接在模块中动态生成函数子句(clause). 这允许我们针对某些输入(在本例中是关键字列表)进行元编程, 并生成代码, 而无需编写专门的宏. 注意, 在上面的代码中, 我们如何使用 unquote 将变量注入到函数子句定义中. 这与宏的工作方式完全一致. 请记住, def 也是一个宏, 并且宏接收的参数总是被 quoted. 因此, 如果您想要一个宏参数接收某个变量的值, 您必须在传递该变量时使用 unquote. 仅仅调用 def action 是不够的, 因为 def 宏接收到的是对 action 的 unquoted, 而不是变量 action 中的值. 当然, 您可以以这种动态的方式调用自己的宏, 原理是一样的. 然而, 有一个意想不到的情况 — 生成(evaluation) 的顺序与你的预期可能不符. 展开的顺序正如你所预料的那般, 模块级代码(不是任何函数的一部分的代码)在 Elixir 编译过程的展开阶段被执行. 有些令人意外的是, 这将发生在所有宏(除了 def)展开之后. 很容易去证明这一点: 1234567891011121314151617iex(1)> defmodule MyMacro do defmacro my_macro do IO.puts "my_macro called" nil end endiex(2)> defmodule Test do import MyMacro IO.puts "module-level expression" my_macro end# Output:my_macro calledmodule-level expression 从输出看出, 即使代码中相应的 IO.puts 调用在宏调用之前, 但 mymacro 还是在 IO.puts 之前被调用了. 这证明编译器首先解析所有标准宏. 然后开始生成模块, 也是在这个阶段, 模块级代码以及对 def 的调用被执行. 模块级友好宏这对我们自己的宏有一些重要的影响. 例如, 我们的 deftraceable 宏也可以动态调用. 但是, 现在它还不能工作: 123456789101112131415161718192021iex(1)> defmodule Tracer do ... endiex(2)> defmodule Test do import Tracer fsm = [ running: {:pause, :paused}, running: {:stop, :stopped}, paused: {:resume, :running} ] for {state, {action, next_state}} <- fsm do # Using deftraceable dynamically deftraceable unquote(action)(unquote(state)), do: unquote(next_state) end deftraceable initial, do: :running end** (MatchError) no match of right hand side value: :error expanding macro: Tracer.deftraceable/2 iex:13: Test (module) 出现一个有点神秘, 而且不是非常有帮助的错误提示. 那么出了什么问题?如上一节所述, 在 in-place 本地模块执行开始之前, 将进行宏展开. 对我们来说, 这意味着 deftraceable 被调用之前, for 语境甚至还没有执行. 因此, 即使它是从当前语境中调用, deftraceable 实际上将只被调用一次. 此外, 由于未对当前语境进行求值, 因此当我们的宏被调用时, 内部变量 state, action 和 next_state 都不存在. 怎么可以让它工作?本质上, 我们的宏将靠 unquote 来调用 - head 和 body 将分别包含代表 unquote(action)(unquote(state)) 和 unquote(next_state)的 AST. 现在, 回想一下当前版本的 deftraceable, 我们对宏中的输入做了一些假设. 这里是一段伪代码: 12345678defmacro deftraceable(head, body) do # 这里, 我们假设输入头部是什么样的, 并执行一些操作 # AST 转换基于这些假设. quote do ... endend 这就是我们的问题. 如果我们在原地生成代码的同时动态地调用 deftraceable, 那么这样的假设就不再成立. 延迟代码生成当宏执行时, 区分宏上下文和调用者的上下文是很重要的: 123456defmacro my_macro do # Macro context(宏上下文): 这里的代码是宏的正常部分, 并在宏运行时被执行 quote do # Caller's context(调用者上下文): 生成的代码在宏所在的位置运行 end 这就是让事情变得有点棘手的地方. 如果我们想支持对宏的模块级动态调用, 就不应该在宏上下文中做任何假定. 相反, 我们应该将代码生成推迟到调用方的上下文中. 用这段代码说明: 1234567defmacro deftraceable(head, body) do # Macro context: 我们不应该对输入 AST 做任何假设 quote do # Caller's context: 我们应该在这里转换输入的 AST, 然后在这里做出我们的假设 endend 为什么我们可以在调用者的上下文(Caller’s context)中进行假设? 因为这段代码将在所有宏展开后运行. 例如, 请记住, 即使我们的宏是从一个推导式中调用的, 它也只会被调用一次. 但是, 宏生成的代码将在推导式中运行 — 对每个元素运行一次. 因此, 这种方法相当于推迟了最终的代码生成. 我们生成的中间模块级语句将生成最终代码, 而不是立即生成目标代码. 这些中间语句将在扩展的最后时刻运行, 在所有其他宏都已处理之后: 1234567891011121314defmodule Test do ... for {state, {action, next_state}} <- fsm do # 在 deftraceable 扩展后, 这里我们将得到一个 # 生成在目标函数的代码, 此代码会被推导式执行. # 即在每一次 for 循环中被调用一次. # 此时, 我们在调用者的上下文中, # 并且可以访问 state、action和 next_state 变量 # 正确生成相应的函数. end ...end 在实现解决方案之前, 必须注意到这不是一个通用的模式, 你应该考虑是否真的需要这个方法. 如果你的宏不打算用于模块级别, 那么你可能应该避免使用这种技术. 否则, 如果从函数定义内部调用宏, 并且将代码生成操作移动到调用者的上下文中, 那么实际上将代码执行从编译时(compile-time)移动到了运行时(run-time), 这会影响到性能. 此外, 即使你的宏是在模块级别上运行的, 只要你对输入不做任何假定, 就没有必要使用这项技巧. 例如, 在第 2 章中, 我们模拟了 Plug 的 get 宏: 1234567defmacro get(route, body) do quote do defp do_match("GET", unquote(route), var!(conn)) do unquote(body[:do]) end endend 即使这个宏在模块级上工作, 它并没有假设 AST 的结构, 只是在调用者的上下文中注入输入片段, 并散布一些样板代码. 当然, 我们希望 body 会有一个 :do 选项, 但我们并没有对 body[:do] AST 的具体形状和结构作任何假定. 总结一下, 如果你的宏是在模块级别调用的, 这可能是通用的模式: 123456789defmacro ... # 宏上下文(Macro context): # 可以在这里做任何准备工作, # 只要不对输入的 AST 作任何假设 quote do # 调用者上下文(Caller's context): # 如果你需要分析或转换输入的 AST, 你应该在这里进行. end 由于调用者上下文(Caller’s context)是模块级的, 因此这种延迟转换仍将在编译时发生, 不会有运行时性能损失. 解决方案鉴于这些讨论, 解决方案相对简单, 但解释它相当复杂. 所以我将从展示最终的结果开始(注意注释): 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182defmodule Tracer do defmacro deftraceable(head, body) do # 这是最重要的更改, 让我们能正确传递 # 输入 AST 到调用者的上下文中. 我稍后会解释这是如何工作的. quote bind_quoted: [ head: Macro.escape(head, unquote: true), body: Macro.escape(body, unquote: true) ] do # Caller's context: 我们将从这里生成代码 # 由于代码生成被推迟到调用者上下文, # 我们现在可以对输入 AST 做出我们的假设. # 此代码大部分与以前的版本相同 # # 注意, 这些变量现在在调用者的上下文中创建 {fun_name, args_ast} = Tracer.name_and_args(head) {arg_names, decorated_args} = Tracer.decorate_args(args_ast) # 与以前的版本完全相同. head = Macro.postwalk(head, fn ({fun_ast, context, old_args}) when ( fun_ast == fun_name and old_args == args_ast ) -> {fun_ast, context, decorated_args} (other) -> other end) # 此代码与以前的版本完全相同. # Note: 但是, 请注意, 代码像前面三个表达式那样 # 在相同的上下文中执行. # # 因此, unquote(head) 在这里引用了 head 变量 # 在此上下文中计算, 而不是宏上下文. # 这同样适用于其它发生在函数体中的 unquote. # # 这就是延迟代码生成的意义所在. 我们的宏产生 # 此代码, 然后依次生成最终代码. def unquote(head) do file = __ENV__.file line = __ENV__.line module = __ENV__.module function_name = unquote(fun_name) passed_args = unquote(arg_names) |> Enum.map(&inspect/1) |> Enum.join(",") result = unquote(body[:do]) loc = "#{file}(line #{line})" call = "#{module}.#{function_name}(#{passed_args}) = #{inspect result}" IO.puts "#{loc} #{call}" result end end end # 与前一个版本相同, 但函数被导出, 因为它们 # 必须从调用方的上下文中调用. def name_and_args({:when, _, [short_head | _]}) do name_and_args(short_head) end def name_and_args(short_head) do Macro.decompose_call(short_head) end def decorate_args([]), do: {[],[]} def decorate_args(args_ast) do for {arg_ast, index} <- Enum.with_index(args_ast) do arg_name = Macro.var(:"arg#{index}", __MODULE__) full_arg = quote do unquote(arg_ast) = unquote(arg_name) end {arg_name, full_arg} end |> Enum.unzip endend 让我们试试这个宏:、 1234567891011121314151617181920212223iex(1)> defmodule Tracer do ... endiex(2)> defmodule Test do import Tracer fsm = [ running: {:pause, :paused}, running: {:stop, :stopped}, paused: {:resume, :running} ] for {state, {action, next_state}} <- fsm do deftraceable unquote(action)(unquote(state)), do: unquote(next_state) end deftraceable initial, do: :running endiex(3)> Test.initial |> Test.pause |> Test.resume |> Test.stopiex(line 15) Elixir.Test.initial() = :runningiex(line 13) Elixir.Test.pause(:running) = :pausediex(line 13) Elixir.Test.resume(:paused) = :runningiex(line 13) Elixir.Test.stop(:running) = :stopped 正如你所看到的那样, 修改并不复杂. 我们设法保持我们的大部分代码完整, 虽然我们不得不用一些技巧:bind_quoted:true 和 Macro.escape: 123456quote bind_quoted: [ head: Macro.escape(head, unquote: true), body: Macro.escape(body, unquote: true)] do ...end 让我们仔细看看它们是什么意思. bind_quoted记住, 我们的宏生成一个代码, 它将生成最终的代码. 在第一级生成的代码(由我们的宏返回的代码)的某处, 我们需要放置以下表达式: 1def unquote(head) do ... end 这个表达式将在调用者的上下文(客户端模块)中被调用, 它的任务是生成函数. 如在注释中提到的, 重要的是要理解 unquote(head) 在这里引用的是存在于调用者上下文中的 head 变量. 我们不是从宏上下文注入一个变量, 而是一个存在于调用者上下文中的变量. 但是, 我们不能使用简单的 quote 生成这样的表达式: 123quote do def unquote(head) do ... endend 记住 unquote 如何工作. 它往 unquote 调用里的 head 变量中注入了 AST. 这不是我们想要的. 我们想要的是生成表示对 unquote 的调用的 AST, 然后在调用者的上下文中执行, 并引用调用者的 head 变量. 这可以通过提供 unquote:false 选项来实现: 123quote unquote: false do def unquote(head) do ... endend 这里, 我们将生成代表 unquote 调用的代码. 如果这个代码被注入到正确的地方, 且其中变量 head 存在, 我们将最终调用 def 宏, 传递 head 变量中的任何值. 所以似乎使用 unquote: false 可以达到我们想要的效果, 但有一个缺点, 我们不能从宏上下文访问任何变量: 1234foo = :barquote unquote: false do unquote(foo) # <- 由于 unquote: false, 工作不正常end 使用 unquote: false 有效地阻止立即注入 AST, 并将 unquote 当作任意其它函数调用. 因此, 我们不能将某些东西注入到目标 AST. 这里 bind_quoted 派上了用场. 通过提供 bind_quoted: bindings, 我们可以禁用立即 unquoting, 同时仍然绑定我们想要传递到调用者上下文的任何数据: 123456789quote bind_quoted: [ foo: ..., bar: ...] do unquote(whatever) # <- 类似于 unquote: false 的作用 foo # <- 由于 bind_quoted 而可访问 bar # <- 由于 bind_quoted 而可访问end 代码注入 vs 数据传输我们要面临的另一个问题是: 从宏传递到调用者上下文的内容在默认情况下是注入的, 而不是传输的. 因此, 当你使用 unquote(som_ast) 时, 你正在将一个 AST 片段注入到用 quote expression 构建的另一个 AST 片段中. 有时候, 我们希望传输数据, 而不是注入数据. 我们来看一个例子. 假设我们有一些三元组, 我们想要传输到调用者的上下文中: 12iex(1)> data = {1, 2, 3}{1, 2, 3} 现在, 让我们尝试使用典型的 unquote 进行传输: 12iex(2)> ast = quote do IO.inspect(unquote(data)) end{{:., [], [{:__aliases__, [alias: false], [:IO]}, :inspect]}, [], [{1, 2, 3}]} 这似乎是有效的. 让我们用 eval_quoted 看下结果: 12iex(3)> Code.eval_quoted(ast)** (CompileError) nofile: invalid quoted expression: {1, 2, 3} 那么这里发生了什么? 问题是我们并没有真正传输 {1,2,3} 三元组. 我们将其注入到目标 AST 中, 注入意味着 {1,2,3} 本身被视为一个 AST 片段, 这显然是错误的. 在这种情况下, 我们真正想要的是数据传输. 在代码生成上下文中, 我们有一些数据要传输到调用者的上下文中. 这就是Macro.escape 作用所处. 通过转义一个 term, 我们可以确保它是被传输的, 而不是被注入的. 当我们调用 unquote(Macro.escape(term)) 时, 我们将注入一个 AST, 以 term 描述数据. 让我们试试: 123456iex(3)> ast = quote do IO.inspect(unquote(Macro.escape(data))) end{{:., [], [{:__aliases__, [alias: false], [:IO]}, :inspect]}, [], [{:{}, [], [1, 2, 3]}]}iex(4)> Code.eval_quoted(ast){1, 2, 3} 如你所见, 我们成功传送了未受影响的数据. 再看我们的延迟代码生成, 这正是我们需要的. 与注入目标 AST 不同, 我们想要传输输入 AST, 完全保留它的形状: 1234567defmacro deftraceable(head, body) do # 这里我们有 head 和 body 的 AST quote do # 我们在这里需要相同的 head和 body 的AST, 以便生成 # 最终代码. endend 通过使用 Macro.escape/1, 我们可以确保输入 AST 被原原本本地传输回调用者的上下文, 在那里我们将生成最终的代码. 正如前一节所讨论的, 我们使用了 bind_quoted, 但原理相同: 1234567quote bind_quoted: [ head: Macro.escape(head, unquote: true), body: Macro.escape(body, unquote: true)] do # 这里我们有了从宏上下文中得到的 # head 和 body 的精确副本.end Escaping 和 unquote: true注意我们传递给了 Macro.escape 一个欺骗性的 unquote: true 选项. 这是最难解释的. 为了能够理解它, 你必须清楚 AST 是如何传递给宏并返回到调用者的上下文中的. 首先, 记住我们如何调用我们的宏: 1deftraceable unquote(action)(unquote(state)) do ... end 现在, 由于宏实际上接收到的是 quoted 的参数, head 参数将等同于以下内容: 1234# 这是宏上下文中的 head 参数实际包含的内容quote unquote: false do unquote(action)(unquote(state))end 请记住, Macro.escape 会保存数据, 因此当你在其他 AST 中传输变量时, 其内容将保持不变. 考虑下上面的 head 形状, 这是我们在宏展开后最终会出现的情况: 123456789101112131415# 调用者的上下文for {state, {action, next_state}} <- fsm do # 这里是我们生成函数的代码. 由于 bind_quoted, 这里 # 我们可以使用 head 和 body 变量. # 变量 head 等效于 # quote unquote: false do # unquote(action)(unquote(state)) # end # 我们真正需要的是: # quote do # unquote(action)(unquote(state)) # endend 为什么我们需要 quoted head 的第二种形式? 因为这个 AST 现在是在调用者的上下文中形成的, 在这个上下文中我们有可用的 action 和 state 变量. 第二个表达式会用到这些变量的内容. 这就是所谓的 unquoted: true 的作用. 当我们调用 Macro.escape(input_ast, unquote: true) 时, 我们仍然(大部分)保留传输数据的形状, 但输入 AST 中的 unquote 片段(例如, unquote(action) )将在调用方的上下文中解析. 总的来说, 输入 AST 到调用者上下文的正确传输方式如下所示: 123456789defmacro deftraceable(head, body) do quote bind_quoted: [ head: Macro.escape(head, unquote: true), body: Macro.escape(body, unquote: true) ] do # Generate the code here end ...end 这并不算难, 但需要一些时间来理解这里到底发生了什么. 试着确保你不是盲目地做 escapes(和/或 unquote: true), 而不理解这是你真正想要的. 毕竟, 这不是默认的行为是有原因的. 在编写宏时, 要考虑你是否要注入一些 AST, 或者不加更改地传输数据. 在后一种情况, 你需要使用 Macro.escape. 如果传输的数据是一个 AST 且可能包含 unquote 片段, 那么您可能需要以 unquote: true 的方式使用 Macro.escape . 回顾关于 Elixir 宏的系列文章到此结束了. 我希望你觉得这些文章有趣且有学习意义, 并且对宏的工作机制有了更多的了解和使用信心. 一定要记住 — 在展开阶段, 宏相当于 AST 片段的普通组合. 如果你理解调用者的上下文和宏输入, 那么直接执行转换或在必要时通过延迟执行转换并不算难. 本系列绝不可能涵盖方方面面和所有的细节. 如果你想了解更多, quote/2 special form 的文档是一个不错的地方. 您还可以在 Macro 和 Code 模块中找到一些有用的帮助程序. Happy meta-programming! 原文: https://www.theerlangelist.com/article/macros_6","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir-Macros","slug":"Elixir-Macros","permalink":"https://yeshan333.github.io/tags/Elixir-Macros/"}]},{"title":"(译) Understanding Elixir Macros, Part 5 - Reshaping the AST","slug":"understanding-elixir-macros-part-5-reshaping-the-ast","date":"2022-06-19T16:56:29.000Z","updated":"2022-06-19T16:56:29.000Z","comments":true,"path":"2022/06/19/understanding-elixir-macros-part-5-reshaping-the-ast/","permalink":"https://yeshan333.github.io/2022/06/19/understanding-elixir-macros-part-5-reshaping-the-ast/","excerpt":"","text":"Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir Macros, Part 2 - Macro Theory [3] (译) Understanding Elixir Macros, Part 3 - Getting into the AST [4] (译) Understanding Elixir Macros, Part 4 - Diving Deeper [5] (译) Understanding Elixir Macros, Part 5 - Reshaping the AST [6] (译) Understanding Elixir Macros, Part 6 - In-place Code Generation原文 GitHub 仓库, 作者: Saša Jurić. 上次我介绍了一个基本版本的可追溯宏 deftraceable, 它允许我们编写可跟踪的函数. 这个宏的最终版本还有一些遗留的问题, 今天我们将解决其中一个 — 参数模式匹配. 从今天的练习应该认识到, 我们必须仔细考虑关于宏可能接收到的输入的所有假设情况. 问题所在正如我上次所暗示的那样, 当前版本的 deftraceable 不能使用模式匹配的参数. 让我们来演示一下这个问题: 12345678iex(1)> defmodule Tracer do ... endiex(2)> defmodule Test do import Tracer deftraceable div(_, 0), do: :error end** (CompileError) iex:5: unbound variable _ 发生了什么? deftraceable 宏盲目地假设输入参数是普通变量或常量. 因此, 当你调用 deftracable div(a, b) 时, deftracable div(a, b), do: ... 生成的代码将包含: 1passed_args = [a, b] |> Enum.map(&inspect/1) |> Enum.join(",") 上面这段会按预期工作, 但如果一个参数是匿名变量(_), 那么我们将生成以下代码: 1passed_args = [_, 0] |> Enum.map(&inspect/1) |> Enum.join(",") 这显然是不正确的, 因此我们得到了未绑定变量错误. 那么解决方案是什么呢? 我们不应该对输入参数做任何假设. 相反, 我们应该将每个参数放入宏生成的专用变量中. 或者用代码来表达, 如果宏被调用: 1deftraceable fun(pattern1, pattern2, ...) 我们会生成这样的函数头: 1def fun(pattern1 = arg1, pattern2 = arg2, ...) 这将允许我们将参数值代入内部临时变量, 并打印这些变量的内容. 解决方案让我们来实现它. 首先, 我将向你展示解决方案的顶层示意版: 1234567891011121314151617181920defmacro deftraceable(head, body) do {fun_name, args_ast} = name_and_args(head) # 通过给每个参数添加 "= argX"来装饰输入参数. # 返回参数名称列表 (arg1, arg2, ...) {arg_names, decorated_args} = decorate_args(args_ast) head = ?? # Replace original args with decorated ones quote do def unquote(head) do ... # 不变 # 使用临时变量构造追踪信息 passed_args = unquote(arg_names) |> Enum.map(&inspect/1) |> Enum.join(",") ... # 不变 end endend 首先, 我们从函数头(head)提取函数名称和 args (我们在前一篇文章中解决了这个问题). 然后, 我们必须将 = argX 注入到 args_ast 中, 并收回修改后的参数(我们将将其放入 decorated_args中). 我们还需要生成的变量的纯名称(或者更确切地说是它们的 AST), 因为我们将使用这些名称来收集参数值. 变量 arg_names 实际上包含 quote do [arg_1, arg_2, ....] end, 可以很容易地注入到 AST 树中. 我们来实现剩下的部分. 首先, 让我们看看如何修饰参数: 1234567891011121314defp decorate_args(args_ast) do for {arg_ast, index} <- Enum.with_index(args_ast) do # 动态生成 quoted 标识符 arg_name = Macro.var(:"arg#{index}", __MODULE__) # 为 patternX = argX 生成 AST full_arg = quote do unquote(arg_ast) = unquote(arg_name) end {arg_name, full_arg} end |> Enum.unzipend 大多数操作发生在 for 语句中. 本质上, 我们处理了每个变量输入的 AST 片段, 然后使用 Macro.var/2 函数计算临时名称(quoted 的 argX), 它能将一个原子变换成一个名称与其相同的 quoted 的变量. Macro.var/2 的第二个参数确保变量是hygienic 的. 尽管我们将 arg1, arg2, ... 变量注入到调用者上下文中, 但调用者不会看到这些变量. 事实上, deftraceable 的用户可以自由地使用这些名称作为一些局部变量, 不会干扰我们的宏引入的临时变量. 最后, 在推导式的末尾, 我们返回一个元组, 该元组由临时的名称和 quoted 的完整模式组成 - (例如 _ = arg1, 或 0 = arg2). 使用 unzip 和 to_tuple 进行推导之后确保 decorate_args以 {arg_names, decorated_args} 的形式返回结果. decorate_args 辅助变量就绪后, 我们就可以传递输入参数, 并获得修饰参数, 以及临时变量的名称. 现在我们需要将这些修饰过的参数注入到函数的头部, 以取代原始参数. 要注意, 我们需要做到以下几点: 递归遍历输入函数头的 AST 找到指定函数名和参数的位置 用修饰过的参数的 AST 替换原始(输入)参数 如果我们使用宏, Macro.postwalk/2 这个处理可以被合理地简化掉: 1234567891011121314151617181920212223242526defmacro deftraceable(head, body) do {fun_name, args_ast} = name_and_args(head) {arg_names, decorated_args} = decorate_args(args_ast) # 1. 递归地遍历 AST head = Macro.postwalk( head, # lambda 函数处理输入 AST 中的元素, 返回修改过的 AST fn # 2. 模式匹配函数名和参数所在的位置 ({fun_ast, context, old_args}) when ( fun_ast == fun_name and old_args == args_ast ) -> # 3. 将输入参数替换为修饰参数的 AST {fun_ast, context, decorated_args} # 头部 AST 中的其它元素(可能是 guards) # -> 我们让它保留不变 (other) -> other end ) ... # 不变end Macro.postwalk/2 递归地遍历 AST, 并且在所有节点的后代被访问之后, 为每个节点调用提供的 lambda 函数. lambda 函数接收元素的 AST, 这样我们有机会返回一些除了指定节点之外的东西. 我们在这个 lambda 里做的实际上是一个模式匹配, 我们在寻找 {fun_name, context, args}. 如第三篇文章中所述那样, 这是表达式 some_fun(arg1, arg2, ...) 的 quoted 表现形式. 一旦我们遇到匹配此模式的节点, 我们只需要用新的(修饰过的)输入参数替换掉旧的. 在所有其它情况下, 我们简单地返回输入的 AST, 使得树的其余部分不变. 这看着有点复杂了, 但它解决了我们的问题. 以下是 deftraceable 宏的最终版本: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859defmodule Tracer do defmacro deftraceable(head, body) do {fun_name, args_ast} = name_and_args(head) {arg_names, decorated_args} = decorate_args(args_ast) head = Macro.postwalk(head, fn ({fun_ast, context, old_args}) when ( fun_ast == fun_name and old_args == args_ast ) -> {fun_ast, context, decorated_args} (other) -> other end) quote do def unquote(head) do file = __ENV__.file line = __ENV__.line module = __ENV__.module function_name = unquote(fun_name) passed_args = unquote(arg_names) |> Enum.map(&inspect/1) |> Enum.join(",") result = unquote(body[:do]) loc = "#{file}(line #{line})" call = "#{module}.#{function_name}(#{passed_args}) = #{inspect result}" IO.puts "#{loc} #{call}" result end end end defp name_and_args({:when, _, [short_head | _]}) do name_and_args(short_head) end defp name_and_args(short_head) do Macro.decompose_call(short_head) end defp decorate_args([]), do: {[],[]} defp decorate_args(args_ast) do for {arg_ast, index} <- Enum.with_index(args_ast) do # 动态生成 quoted 标识符(identifier) arg_name = Macro.var(:"arg#{index}", __MODULE__) # 为 patternX = argX 构建 AST full_arg = quote do unquote(arg_ast) = unquote(arg_name) end {arg_name, full_arg} end |> Enum.unzip endend 让我们来试试: 1234567891011121314iex(1)> defmodule Tracer do ... endiex(2)> defmodule Test do import Tracer deftraceable div(_, 0), do: :error deftraceable div(a, b), do: a/b endiex(3)> Test.div(5, 2)iex(line 6) Elixir.Test.div(5,2) = 2.5iex(4)> Test.div(5, 0)iex(line 5) Elixir.Test.div(5,0) = :error 正如你所看到的那样, 可以进入 AST, 分解它, 并在其中散布一些自定义的注入代码, 这并不算很复杂. 缺点是, 编写的宏的代码会变得越来越复杂, 并且更难分析. 今天的话题到此结束. 下一次, 我将讨论原地代码生成技术 《(译) Understanding Elixir Macros, Part 6 - In-place Code Generation》. 原文: https://www.theerlangelist.com/article/macros_5","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir-Macros","slug":"Elixir-Macros","permalink":"https://yeshan333.github.io/tags/Elixir-Macros/"}]},{"title":"(译) Understanding Elixir Macros, Part 4 - Diving Deeper","slug":"understanding-elixir-macros-part-4-diving-deeper","date":"2022-06-19T12:02:19.000Z","updated":"2022-06-19T12:02:19.000Z","comments":true,"path":"2022/06/19/understanding-elixir-macros-part-4-diving-deeper/","permalink":"https://yeshan333.github.io/2022/06/19/understanding-elixir-macros-part-4-diving-deeper/","excerpt":"","text":"Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir Macros, Part 2 - Macro Theory [3] (译) Understanding Elixir Macros, Part 3 - Getting into the AST [4] (译) Understanding Elixir Macros, Part 4 - Diving Deeper [5] (译) Understanding Elixir Macros, Part 5 - Reshaping the AST [6] (译) Understanding Elixir Macros, Part 6 - In-place Code Generation原文 GitHub 仓库, 作者: Saša Jurić. 在前一篇文章中, 我向你展示了分析输入 AST 并对其进行处理的一些基本方法. 今天我们将研究一些更复杂的 AST 转换. 这将重提已经解释过的技术. 这样做的目的是为了表明深入研究 AST 并不是很难的, 尽管最终的结果代码很容易变得相当复杂, 而且有点黑科技(hacky). 追踪函数调用在本文中, 我们将创建一个宏 deftraceable, 它允许我们定义可跟踪的函数. 可跟踪函数的工作方式与普通函数一样, 但每当我们调用它时, 都会打印出调试信息. 大致思路是这样的: 1234567891011defmodule Test do import Tracer deftraceable my_fun(a,b) do a/b endendTest.my_fun(6,2)# => test.ex(line 4) Test.my_fun(6,2) = 3 这个例子当然是虚构的. 你不需要设计这样的宏, 因为 Erlang 已经有非常强大的跟踪功能, 而且有一个 Elixir 包可用. 然而, 这个例子很有趣, 因为它需要一些更深层次的 AST 转换技巧. 在开始之前, 我要再提一次, 你应该仔细考虑你是否真的需要这样的结构. 例如 deftraceable 这样的宏引入了一个每个代码维护者都需要了解的东西. 看着代码, 它背后发生的事不是显而易见的. 如果每个人都设计这样的结构, 每个 Elixir 项目都会很快地变成自定义语言的大锅汤. 当代码主要依赖于复杂的宏时, 即使对于有经验的开发人员, 即使是有经验的开发人员也很难理解严重依赖于复杂宏的底层代码的实际流程. 但是在适当使用宏的情况下, 你不应该仅仅因为有人声称宏是不好的, 就不使用它. 例如, 如果在 Erlang 中没有跟踪功能, 我们就需要设计一些宏来帮助我们(实际上不需要类似上述的例子, 但那是另外一个话题), 否则我们的代码就会有大量重复的模板代码. 在我看来, 模板代码太多是不好的, 因为代码中有了太多形式化的噪音, 因此更难阅读和理解. 宏有助于减少这些噪声, 但在使用宏之前, 请先考虑是否可以优先使用 Elixir 内置的运行时结构(函数, 模块, 协议)来解决重复代码. 看完这个长长的免责声明, 让我们开始实现 deftraceable吧. 首先, 手动生成对应的代码. 让我们回顾下用法: 123deftraceable my_fun(a,b) do a/bend 生成的代码类似于这样: 123456789101112131415def my_fun(a, b) do file = __ENV__.file line = __ENV__.line module = __ENV__.module function_name = "my_fun" passed_args = [a,b] |> Enum.map(&inspect/1) |> Enum.join(",") result = a/b loc = "#{file}(line #{line})" call = "#{module}.#{function_name}(#{passed_args}) = #{inspect result}" IO.puts "#{loc} #{call}" resultend 这个想法很简单. 我们从编译器环境中获取各种数据, 然后计算结果, 最后将所有内容打印到屏幕上. 该代码依赖于 __ENV__ 特殊形式, 可用于在最终 AST 中注入各种编译时信息(例如行号和文件). __ENV__ 是一个结构体, 每当你在代码中使用它时, 它将在编译时展开为适当的值. 因此, 只要在代码中写入 __ENV__.file. 文件生成的字节码将包含包含文件名的(二进制)字符串常量. 现在我们需要动态构建这个代码. 让我们来看看大概的样子(outline): 12345678910111213141516171819defmacro deftraceable(??) do quote do def unquote(head) do file = __ENV__.file line = __ENV__.line module = __ENV__.module function_name = ?? passed_args = ?? |> Enum.map(&inspect/1) |> Enum.join(",") result = ?? loc = "#{file}(line #{line})" call = "#{module}.#{function_name}(#{passed_args}) = #{inspect result}" IO.puts "#{loc} #{call}" result end endend 这里我们在需要基于输入参数动态注入 AST 片段的地方放置问号(??). 特别地, 我们必须从传递的参数中推导出函数名、参数名和函数体. 现在, 当我们调用宏 deftraceable my_fun(...) do ... end, 宏接收两个参数 — 函数头(函数名和参数列表)和包含函数体的关键字列表. 这些都是被 quote 过的. 我是如何知道的?其实我不知道. 我一般通过不断试错来获得的这些信息. 基本上, 我从定义一个宏开始: 1234defmacro deftraceable(arg1) do IO.inspect arg1 nilend 然后我尝试从一些测试模块或 shell 中调用宏. 我将通过向宏定义中添加另一个参数来测试. 一旦我得到结果, 我会试图找出参数表示什么, 然后开始构建宏. 宏结束处的 nil 确保我们不生成任何东西(我们生成的 nil 通常与调用者代码无关). 这允许我进一步构建片段而不注入代码. 我通常依靠 IO.inspect和 Macro.to_string/1 来验证中间结果, 一旦我满意了, 我会删除 nil 部分, 看看是否能工作. 此时 deftraceable 接收函数头和身体. 函数头将是一个我们之前描述的结构的 AST 片段: 1{function_name, context, [arg1, arg2, ...] 所以接下来我们需要: 从 quoted 的头中提取函数名和参数 将这些值注入我们的宏返回的 AST 中 将函数体注入同一个 AST 打印跟踪信息 我们可以使用模式匹配从这个 AST 片段中提取函数名和参数, 有一个 Macro.decompose_call/1 的辅助功能函数可以帮我们做到. 做完这些步骤, 宏的最终版本实现如下所示: 12345678910111213141516171819202122232425262728defmodule Tracer do defmacro deftraceable(head, body) do # 提取函数名和参数 {fun_name, args_ast} = Macro.decompose_call(head) quote do def unquote(head) do file = __ENV__.file line = __ENV__.line module = __ENV__.module # 注入函数名和参数到 AST 中 function_name = unquote(fun_name) passed_args = unquote(args_ast) |> Enum.map(&inspect/1) |> Enum.join(",") # 将函数体注入到 AST result = unquote(body[:do]) # 打印 trace 跟踪信息 loc = "#{file}(line #{line})" call = "#{module}.#{function_name}(#{passed_args}) = #{inspect result}" IO.puts "#{loc} #{call}" result end end endend 让我们试一下: 12345678910111213iex(1)> defmodule Tracer do ... endiex(2)> defmodule Test do import Tracer deftraceable my_fun(a,b) do a/b end endiex(3)> Test.my_fun(10,5)iex(line 4) Test.my_fun(10,5) = 2.0 # trace output2.0 这似乎起作用了. 然而, 我应该立即指出, 这种实现存在一些问题: 宏不能很好地处理带守卫(guards)的函数定义 模式匹配参数并不总是有效的(例如, 当使用 _ 来匹配任何 term 时) 在模块中直接动态生成代码时, 宏不起作用. 我将逐一解释这些问题, 首先从守卫(guards)开始, 其余问题留待以后的文章再讨论. 处理 guards (守卫)所有具有可追溯性的问题都源于我们对输入 AST 做了一些事实假设. 这是一个危险的领域, 我们必须小心地涵盖所有情况. 例如, 宏假设 head 只包含函数名称和参数列表. 因此, 如果我们想定义一个带守卫的可跟踪函数, deftraceable 将不起作用: 123deftraceable my_fun(a,b) when a < b do a/bend 在这种情况下, 我们的头部(宏的第一个参数)也将包含守卫(guards)的信息, 并且不能被 macro .decompose_call/1 解析. 解决方案是检测这种情况, 并以一种特殊的方式处理它. 首先, 让我们来看看这个 head 是如何被 quoted 的: 12345678iex(16)> quote do my_fun(a,b) when a < b end{:when, [], [ {:my_fun, [], [{:a, [if_undefined: :apply], Elixir}, {:b, [if_undefined: :apply], Elixir}]}, {:<, [context: Elixir, import: Kernel], [{:a, [if_undefined: :apply], Elixir}, {:b, [if_undefined: :apply], Elixir}]} ]} 所以实际上我们的 guard head 实际上是这样的: {:when, _, [name_and_args, ...]}, 我们可以依靠它来使用模式匹配提取函数名称和参数: 12345678910defmodule Tracer do ... defp name_and_args({:when, _, [short_head | _]}) do name_and_args(short_head) end defp name_and_args(short_head) do Macro.decompose_call(short_head) end ... 当然, 我们需要从宏中调用这个函数: 123456789defmodule Tracer do ... defmacro deftraceable(head, body) do {fun_name, args_ast} = name_and_args(head) ... # 不变 end ...end 如您所见, 可以定义额外的私有函数并从宏调用它们. 毕竟, 宏只是一个函数, 当调用它时, 包含的模块已经编译并加载到编译器的 VM 中(否则, 宏无法运行). 以下是宏 deftraceable 的完整版本: 1234567891011121314151617181920212223242526272829303132defmodule Tracer do defmacro deftraceable(head, body) do {fun_name, args_ast} = name_and_args(head) quote do def unquote(head) do file = __ENV__.file line = __ENV__.line module = __ENV__.module function_name = unquote(fun_name) passed_args = unquote(args_ast) |> Enum.map(&inspect/1) |> Enum.join(",") result = unquote(body[:do]) loc = "#{file}(line #{line})" call = "#{module}.#{function_name}(#{passed_args}) = #{inspect result}" IO.puts "#{loc} #{call}" result end end end defp name_and_args({:when, _, [short_head | _]}) do name_and_args(short_head) end defp name_and_args(short_head) do Macro.decompose_call(short_head) endend 让我们来试验一下: 1234567891011121314151617181920iex(1)> defmodule Tracer do ... endiex(2)> defmodule Test do import Tracer deftraceable my_fun(a,b) when a<b do a/b end deftraceable my_fun(a,b) do a/b end endiex(3)> Test.my_fun(5,10)iex(line 4) Test.my_fun(5,10) = 0.50.5iex(4)> Test.my_fun(10, 5)iex(line 7) Test.my_fun(10,5) = 2.0 这个练习的主要目的是说明可以从输入 AST 中推断出一些东西. 在这个例子中, 我们设法检测和处理带 guards 的函数. 显然, 因为它依赖于 AST 的内部结构, 代码变得更加复杂了. 在这种情况下, 代码依旧比较简单, 但你将在后面的文章 《(译) Understanding Elixir Macros, Part 5 - Reshaping the AST》 中看到我是如何解决 deftraceable 宏剩余的问题的, 事情可能很快变得复杂起来了. 原文: https://www.theerlangelist.com/article/macros_4","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir-Macros","slug":"Elixir-Macros","permalink":"https://yeshan333.github.io/tags/Elixir-Macros/"}]},{"title":"(译) Understanding Elixir Macros, Part 3 - Getting into the AST","slug":"understanding-elixir-macros-part-3-getting-into-the-ast","date":"2022-06-19T10:53:07.000Z","updated":"2022-06-19T10:53:07.000Z","comments":true,"path":"2022/06/19/understanding-elixir-macros-part-3-getting-into-the-ast/","permalink":"https://yeshan333.github.io/2022/06/19/understanding-elixir-macros-part-3-getting-into-the-ast/","excerpt":"","text":"Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir Macros, Part 2 - Macro Theory [3] (译) Understanding Elixir Macros, Part 3 - Getting into the AST [4] (译) Understanding Elixir Macros, Part 4 - Diving Deeper [5] (译) Understanding Elixir Macros, Part 5 - Reshaping the AST [6] (译) Understanding Elixir Macros, Part 6 - In-place Code Generation原文 GitHub 仓库, 作者: Saša Jurić. 是时候继续探索 Elixir 的宏了. 上次我介绍了一些关于宏的基本原理, 今天, 我将进入一个较少谈及的领域, 并讨论 Elixir AST 的一些细节. 跟踪函数调用到目前为止, 你只看到了接受输入 AST 片段并将它们组合在一起的基础宏, 并在输入片段周围或之间添加了一些额外的样板代码. 由于我们不分析或解析输入的 AST, 这可能是最干净(或最不 hackiest)的宏编写风格, 这样的宏相当简单且容易理解. 然而, 有时候我们需要解析输入的 AST 片段以获取某些特殊信息. 一个简单的例子是 ExUnit 的断言. 例如, 表达式 assert 1+1 == 2+2 会出现这个错误: 1234Assertion with == failedcode: 1+1 == 2+2lhs: 1rhs: 2 这个宏 assert 接收了整个表达式 1+1 == 2+2, 然后从中分出独立的表达式用来比较, 如果整个表达式返回 false, 则打印它们对应的结果. 所以, 宏的代码必须想办法将输入的 AST 分解为几个部分并分别计算子表达式. 更多时候, 我们调用了更复杂的 AST 变换. 例如, 你可以借助 ExActor 这样做: 1defcast inc(x), state: state, do: new_state(state + x) 它会被转换为大致如下的形 1234567def inc(pid, x) do :gen_server.cast(pid, {:inc, x})enddef handle_cast({:inc, x}, state) do {:noreply, state+x}end 和 assert 一样, 宏 defcast 需要深入分析输入的 AST 片段, 并找出每个子片段(例如, 函数名, 每个参数). 然后, ExActor 会执行一个精巧的变换, 将各个部分重组成一个更加复杂的代码. 今天, 我将想你展示构建这类宏的基础技术, 我也会在之后的文章中会将变换做得更复杂. 但在此之前, 我要请你认真考虑一下你的代码是否有有必要基于宏. 尽管宏十分强大, 但也有缺点. 首先, 就像之前我们看到的那样, 比起那些 “普通” 的运行时抽象 (函数, 模块, 协议), 宏的代码会很快地变得非常多. 你可以依赖 undocumented format (译注: 缺少文档解释, 寓意代码极其难以理解) 的 AST 来快速完成许多嵌套的 quote/unquoted 调用, 以及奇怪的模式匹配. 此外, 宏的滥用可能使你的客户端代码 (译注: 使用宏的代码) 极其难懂, 因为它将依赖于自定义的非标准习惯用法(例如 ExActor 的 defcast). 这使得理解代码和了解底层究竟发生了什么变得更加困难. 从好的方面来看, 宏在删除样板代码时非常有用(正如 ExActor 示例所展示的那样), 并且具有访问运行时不可用的信息的能力(正如您应该从 assert 示例中看到的那样). 最后, 由于宏在编译期间运行, 因此可以通过将计算转移到编译时来优化一些代码. 因此, 肯定会有适合宏的情景, 您不应该害怕使用它们. 但是, 您不应该仅仅为了获得一些可爱的 dsl 式语法而选择宏. 在使用宏之前, 应该考虑是否可以依靠“标准”语言抽象(如函数、模块和协议)在运行时有效地解决问题. 探索 AST 结构目前, 关于 AST 结构的文档不多. 然而, 在 shell 会话中可以很简单地探索和使用 AST, 我通常就是这样探索 AST 结构的. 例如, 这里有一个关于变量的 quoted 12iex(1)> quote do my_var end{:my_var, [if_undefined: :apply], Elixir} 在这里, 第一个元素代表变量的名称;第二个元素是上下文 Keyword 列表, 它包含了该 AST 片段的元数据(例如 imports 和 aliases). 通常你不会对上下文数据感兴趣;第三个元素通常代表 quoted 发生的模块, 同时也用于确保 quoted 变量的 hygienic. 如果该元素为 nil, 则该标识符是不 hygienic 的. 一个简单的表达式看起来包含了许多东西: 123iex(2)> quote do a+b end{:+, [context: Elixir, import: Kernel], [{:a, [if_undefined: :apply], Elixir}, {:b, [if_undefined: :apply], Elixir}]} 看起来可能很复杂, 但是如果我向你展示更高层次的表达模式, 就很容易理解了: 1{:+, context, [ast_for_a, ast_for_b]} 在我们的例子中, ast_for_a 和 ast_fot_b 遵循着你之前所看到的变量的形状(如 {:a, [if_undefined: :apply], Elixir}). 一般, quoted 的参数可以是任意复杂的, 因为它们描述了每个参数的表达式. 事实上, Elixir AST 是一个简单 quoted expression 的深层结构, 就像我给你展示的那样. 让我们看一个关于函数调用的例子: 12iex(3)> quote do div(5,4) end{:div, [context: Elixir, import: Kernel], [5, 4]} 这类似于 quoted + 的操作, 我们知道 + 实际上是一个函数. 事实上, 所有二进制运算符都会像函数调用一样被 quoted. 最后, 让我们来看一个被 quoted 的函数定义: 12345678910iex(4)> quote do def my_fun(arg1, arg2), do: :ok end{:def, [context: Elixir, import: Kernel], [ {:my_fun, [context: Elixir], [ {:arg1, [if_undefined: :apply], Elixir}, {:arg2, [if_undefined: :apply], Elixir} ]}, [do: :ok] ]} 看起来有点吓人, 但可以只看重要的部分来简化它. 事实上, 这种深层结构相当于: 1{:def, context, [fun_call, [do: body]]} fun_call 是一个函数调用的结构(正如之前你看过的那样). 如你所见, AST 背后通常有一些逻辑和意义. 我不会在这里写出所有 AST 的形状, 但会在 iex 中尝试你感兴趣的简单的结构来探索 AST. 这是一个逆向工程, 但不是火箭科学. 写一个 assert 宏为了快速演示, 让我们编写一个简化版的 assert 宏. 这是一个有趣的宏, 因为它重新定义了比较操作符的含义. 通常, 当你写下 a == b 表达式时, 你会得到一个布尔结果. 但是, 当将此表达式给 assert 宏时, 如果表达式的计算结果为 false, 则会打印详细的输出. 我将从简单的部分开始, 首先在宏里只支持 == 运算符. 可以知道, 我们调用 assert expected == required 时, 等同于调用 assert(expect == required), 这意味着我们的宏接收到一个表示比较的引用片段. 让我们来探索这个比较表达式的 AST 结果: 123456iex(1)> quote do 1 == 2 end{:==, [context: Elixir, import: Kernel], [1, 2]}iex(2)> quote do a == b end{:==, [context: Elixir, import: Kernel], [{:a, [if_undefined: :apply], Elixir}, {:b, [if_undefined: :apply], Elixir}]} 所以我们的结构本质上是 {:==, context, [quoted_lhs, quoted_rhs]}. 如果你记住了前几个系列中所演示的例子, 那么就不会感到意外, 因为我提到过二进制运算符是作为 2 个参数的函数被 quoted 的. 知道了 AST 的形状, 实现这个宏就很简单: 12345678910111213141516171819defmodule Assertions do defmacro assert({:==, _, [lhs, rhs]} = expr) do quote do left = unquote(lhs) right = unquote(rhs) result = (left == right) unless result do IO.puts "Assertion with == failed" IO.puts "code: #{unquote(Macro.to_string(expr))}" IO.puts "lhs: #{left}" IO.puts "rhs: #{right}" end result end endend 第一个有趣的事情发生在第 2 行. 注意我们是如何对输入表达式进行模式匹配的, 希望它符合某种结构. 这完全没问题, 因为宏是函数, 这意味着您可以依赖于模式匹配、guards(守卫), 甚至有多子句宏. 在我们的例子中, 我们依靠模式匹配将(被 quoted 的)比较表达式的每一边带入相应的变量. 然后, 在 quoted 的代码中, 我们通过分别计算左边和右边重新解释 == 操作(第 4 行和第 5 行), 然后是整个结果(第 7 行). 最后, 如果结果为假, 我们打印详细信息(第 9-14 行). 来试一下: 123456789iex(1)> defmodule Assertions do ... endiex(2)> import Assertionsiex(3)> assert 1+1 == 2+2Assertion with == failedcode: 1 + 1 == 2 + 2lhs: 2rhs: 4false 将代码实现通用化将之前的代码用到其他的运算操作符并不困难: 1234567891011121314151617181920defmodule Assertions do defmacro assert({operator, _, [lhs, rhs]} = expr) when operator in [:==, :<, :>, :<=, :>=, :===, :=~, :!==, :!=, :in] do quote do left = unquote(lhs) right = unquote(rhs) result = unquote(operator)(left, right) unless result do IO.puts("Assertion with #{unquote(operator)} failed") IO.puts("code: #{unquote(Macro.to_string(expr))}") IO.puts("lhs: #{left}") IO.puts("rhs: #{right}") end result end endend 这里只有一点点变化. 首先, 在模式匹配中, 硬编码(hard code) :== 被变量 operator 取代了(第 2 行). 我还引入(实际上, 是从 Elixir 源代码中复制粘贴了)guard 语句指定了宏能处理的运算符集(第 3 行). 这个检查有一个特殊原因. 还记得我之前提到的, quoted a + b(或任何其它的二进制操作)的形状等同于引用 fun(a, b). 因此, 没有这些 guard 语句, 任何双参数的函数调用都会在我们的宏中结束, 这可能是我们不想要的. 使用这个 guard 语句能将输入限制在已知的二进制运算符中. 有趣的事情发生在第 9 行. 在这里我使用了 unquote(operator)(left, right) 来对操作符进行简单的泛型分派. 你可能认为我可以使用 left unquote(operator) right 来替代, 但它并不能运算. 原因是 operator 变量保存的是一个原子(如:==). 因此, 这个天真的 quoted 会产生 left :== right, 这甚至不符合 Elixir 的语法规定. 记住, 在 quote 时, 我们不组装字符串, 而是组装 AST 片段. 所以, 当我们想生成一个二进制操作代码时, 我们需要注入一个正确的 AST, 它(如前所述)与双参数的函数调用相同. 因此, 我们可以简单地使用函数调用的方式 unquote(operator)(left, right). 这一点讲完了, 今天的这一章也该结束了. 它有点短, 但略微复杂些. 下一章 《(译) Understanding Elixir Macros, Part 4 - Diving Deeper》, 我将深入 AST 解析的话题. 原文: https://www.theerlangelist.com/article/macros_3","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir-Macros","slug":"Elixir-Macros","permalink":"https://yeshan333.github.io/tags/Elixir-Macros/"}]},{"title":"(译) Understanding Elixir Macros, Part 2 - Macro Theory","slug":"understanding-elixir-macros-part-2-macro-theory","date":"2022-06-19T00:36:03.000Z","updated":"2022-06-19T00:36:03.000Z","comments":true,"path":"2022/06/19/understanding-elixir-macros-part-2-macro-theory/","permalink":"https://yeshan333.github.io/2022/06/19/understanding-elixir-macros-part-2-macro-theory/","excerpt":"","text":"Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir Macros, Part 2 - Macro Theory [3] (译) Understanding Elixir Macros, Part 3 - Getting into the AST [4] (译) Understanding Elixir Macros, Part 4 - Diving Deeper [5] (译) Understanding Elixir Macros, Part 5 - Reshaping the AST [6] (译) Understanding Elixir Macros, Part 6 - In-place Code Generation原文 GitHub 仓库, 作者: Saša Jurić. 这是关于 Elixir 宏系列的第二篇. 上一次我们讨论了 Elixir 编译过程和 Elixir AST, 最后讲了一个基本的宏的例子 trace. 今天, 我们会更详细地讲解宏的机制. 可能有一些内容会和上一篇重复, 但我认为这对于理解运作原理和 AST 的生成很有帮助. 掌握了这些以后, 你对于自己编写的宏代码就更有信心了. 基础很重要, 因为随着更多地用到宏, 代码可能会由许多的 quote/unquote 结构组成. 调用一个宏我们最需要重视的是展开阶段. 编译器在这个阶段调用了各种宏(以及其它代码生成结构)来生成最终的 AST. 例如, 宏 trace 的典型用法是这样的: 1234567defmodule MyModule do require Tracer ... def some_fun(...) do Tracer.trace(...) endend 像之前所提到的那样, 编译器从一个类似于这段代码的 AST 开始. 这个 AST 之后会被展开, 然后生成最后的代码. 因此, 在这段代码的展开阶段, Tracer.trace/1 会被调用. 我们的宏接受了输入的 AST, 然后必须生成输出对应的 AST 结构. 之后编译器会简单地用输出的 AST 替换掉对宏的调用. 这个过程是渐进的 — 一个宏可以返回调用其他宏 (甚至它本身) 的 AST. 编译器会再次展开, 直到不可以展开为止. 调用宏使得我们有机会修改代码的含义. 一个典型的宏会获取输入的 AST 并修改它, 并在它周围添加一些代码. 那就是我们使用宏 trace 所做的事情. 我们得到了一个 quoted expression(例如 1+2), 然后返回了这个: 123result = 1 + 2Tracer.print("1 + 2", result)result 要在代码的任何地方调用宏(包括 shell 里), 你都必须先调用 require Tracer 或 import Tracer. 为什么呢?因为宏有两个看似矛盾的性质: 宏也是 Elixir 代码 宏在在最终的字节码生成之前的展开阶段运行 Elixir 代码是如何在被生成之前运行的?它不能. 要调用一个宏, 其容器模块(宏的定义所在的模块)必须已经被编译. 因此, 要运行 Tracer 模块中所定义的宏, 我们必须确认它已经被编译了. 也就是说, 我们必须向编译器提供一个关于我们所需求的模块的顺序. 当我们 require 了一个模块, 我们会让 Elixir 暂停当前模块的编译, 直到我们 require 的模块编译好并载入到了编译器的运行时(编译器所在的 Erlang VM 实例). 只有在 Tracer 模块完全编译好并对编译器可用的情况下, 我们才能调用 trace 宏. 使用 import 也有相同效果, 只不过它还在词法上引入了所有的公共函数和宏, 使得我们可以用 trace 替代 Tracer.trace. 由于宏也是函数, 而 Elixir 在调用函数时可以省略括号, 所以我们可以这样写: 1Tracer.trace 1+2 这很可能是 Elixir 之所以不在函数调用时要求括号的最主要原因. 记住, 大多数语言结构都是宏. 如果括号是必须的, 那么我们需要编写的代码将会更加嘈杂. 1234defmodule(MyModule, do: def(function_1, do: ...) def(function_2, do: ...)) Hygiene在上一篇文章中我们提到, 宏默认是整洁(Hygiene)的. 意思就是宏引入的变量有其自己的私有作用域, 不会影响代码的其他部分. 这就是我们能够在我们的 trace 宏中安全地引入 result 变量的原因: 1234quote do result = unquote(expression_ast) # result 是宏的私有变量 ...end 该变量不会干扰调用这个宏的代码. 在调用宏的地方, 可以随意的声明你自己的 result 变量, 它不会被 tracer 宏中的 result 变量隐藏覆盖. 大多数时候 hygiene 是我们想要的效果, 但是也有例外. 有时候, 可能需要创建在调用者作用域内可用的变量. 下面我们通过 Plug 库的一个用例来演示, 我们如何使用 Plug 来制定路由: 1234567get "/resource1" do send_resp(conn, 200, ...)endpost "/resource2" do send_resp(conn, 200, ...)end 注意, 上面这两个宏是如何使用并不存在的 conn 变量. 这是因为, get 宏在生成的代码中绑定了该变量. 可以想象一下, 产生的代码如下: 123456defp do_match("GET", "/resource1", conn) do ...enddefp do_match("POST", "/resource2", conn) do ...end 注意: Plug 生成的真实代码是不同的, 这里为了演示对其进行了简化. 这是一个例子, 宏引入了一个变量, 它必须不是 hygienic 的. 变量 conn 由 get 宏引入, 必须对调用者可见. 另一个例子是使用 ExActor 的. 看看下面的例子: 12345defmodule MyServer do ... defcall my_request(...), do: reply(result) ...end 如果你对 GenServer 很熟悉, 那么你知道一个 call 的结果必须是 {:reply, response, state} 的形式. 然而, 在上述代码中, 甚至没有提到 state. 那么我们是如何返回 state 的呢?这是因为 defcall 宏生成了一个隐藏的state 变量, 它之后将被 reply 宏明确使用. 在上面两种情况中, 宏都必须创建一个不 hygienic 的变量, 而且必须在宏所引用的代码之外可见. 为达到这个目的, 可以使用 var! 结构. 下面是 Plug的 get 宏的简化版本: 1234567defmacro get(route, body) do quote do defp do_match("GET", unquote(route), var!(conn)) do # put body AST here end endend 注意我们如何使用 var!(conn) 的. 通过这样做, 我们指定 conn 是一个对调用者可见的变量. 上述代码没有解释 body 是如何注入的. 在这之前, 你需要理解宏所接受的参数. 宏参数你要记住, 宏本质上是在 AST 展开阶段被导入的 Elixir 函数, 然后生成最终的 AST. 宏的特别之处在于它所接受的参数都是 quoted 的. 这就是我们之所以能够调用的原因: 123def my_fun do ...end 等同于: 1def(my_fun, do: (...)) 注意我们如何调用 def 宏, 传递 my_fun, 即使这个变量不存在. 这完全没问题, 因为我们实际上传递的是 quote(do: my_fun) 的结果, 而引用(quote)不要求变量存在. 在内部, def 宏会接收到包含了 :my_fun 的引用形式. def 宏会使用这个信息来生成对应名称的函数. 这里再提一下 do...end 块. 任何时候发送一个 do...end 块给一个宏, 都相当于发送一个带有 :do 键的 Keyword 列表(Keywords list). 所以如下调用: 1my_macro arg1, arg2 do ... end 等同于 1my_macro(arg1, arg2, do: ...) 这些只不过是 Elixir 中的语法糖. 解释器将 do ... end 转换成了 {:do, ...}. 现在, 我只提到了参数是被引用(quoted)的. 然而, 对于许多常量(原子, 数字, 字符串), 引用(quoted)形式和输入值完全一样. 此外, 二元元组和列表会在被引用(quoted)时保持它们的结构. 这意味着 quote(do: {a, b}) 将会返回一个二元元组, 它的两个值都是被引用(quoted)的. 1234567891011121314iex(1)> quote do :an_atom end:an_atomiex(2)> quote do "a string" end"a string"iex(3)> quote do 3.14 end3.14iex(4)> quote do {1,2} end{1, 2}iex(5)> quote do [1,2,3,4,5] end[1, 2, 3, 4, 5] 对三元元组的引用(quoted)不会保留它的形状: 12iex(6)> quote do {1,2,3} end{:{}, [], [1, 2, 3]} 由于列表和二元元组在被引用时能保留结构, 所以关键词列表(Keywords list)也可以: 12345iex(7)> quote do [a: 1, b: 2] end[a: 1, b: 2]iex(8)> quote do [a: x, b: y] end[a: {:x, [], Elixir}, b: {:y, [], Elixir}] 在第一个例子中, 你可以看到输入的关键词列表完全没变. 第二个例子证明了复杂的部分(例如调用 x和 y)会是 quoted 形式. 但是列表还保持着它的形状. 这仍然是一个键为 :a 和 :b 的关键词列表. 将它们放在一起为什么这些都很重要? 因为在宏代码中, 您可以很容易地从关键字列表 (Keyword list) 中获取所需要的选项, 而不需要分析一些令人费解的 AST. 之前, 我们留下了这个草图代码: 1234567defmacro get(route, body) do quote do defp do_match("GET", unquote(route), var!(conn)) do # put body AST here end endend 记住, do ... end 和 do: ... 是一样的, 所以当我们调用 get route do ... end 时, 我们实际上是在调用 get(route, do: ...) 记住宏参数是 quoted 的, 但也要知道 quoted 的关键字列表会保持它们的形状, 可以使用 body[:do]获取宏中引用的主体: 1234567defmacro get(route, body) do quote do defp do_match("GET", unquote(route), var!(conn)) do unquote(body[:do]) end endend 因此, 我们只需将 quoted 的输入主体注入到正在生成的 do_match 子句(clause)主体中. 如之前所述, 这就是宏的用途. 它接收一些 AST 片段, 并将它们与样板代码组合在一起, 以生成最终结果. 理想情况下, 当我们这样做时, 我们不需要关心输入 AST 的内容, 在我们的例子中, 我们只需要在生成的函数中注入函数体, 而不需要关心函数体中实际有什么. 测试这个宏很简单. 以下是所需代码的最小化: 1234567891011defmodule Plug.Router do # 宏 get 从客户端删除样板代码 # 确保生成的代码符合泛型逻辑所需的一些标准 defmacro get(route, body) do quote do defp do_match("GET", unquote(route), var!(conn)) do unquote(body[:do]) end end endend 现在, 我们可以实现一个客户端 (译注: 使用宏的代码) 模块: 123456789101112defmodule MyRouter do import Plug.Router # 多子句 dispatch 的通用代码 def match(type, route) do do_match(type, route, :dummy_connection) end # 使用宏最小化样板代码量 get "/hello", do: {conn, "Hi!"} get "/goodbye", do: {conn, "Bye!"}end 测试一下: 12345MyRouter.match("GET", "/hello") |> IO.inspect# {:dummy_connection, "Hi!"}MyRouter.match("GET", "/goodbye") |> IO.inspect# {:dummy_connection, "Bye!"} 注意 match/2 的代码. 它是通用的代码, 依赖于 do_match/3 的实现. 使用模块观察上述代码, 你可以看到 match/2 的胶水代码存在于客户端模块中. 这肯定算不上完美, 因为每个客户端都必须提供对这个函数的正确实现, 而且必须调用 do_match 函数. 更好的选择是, Plug.Router 能够将这个实现抽象提供给我们. 我们可以使用 use 宏, 大概就是其它语言中的 mixin. 总体思路如下: 1234567891011121314defmodule ClientCode do # 调用 mixin use GenericCode, option_1: value_1, option_2: value_2, ...enddefmodule GenericCode do # 在模块被使用的时候调用 defmacro __using__(options) do # 生成一个AST, 该 AST 将被插入到 use 的地方 quote do ... end endend 因此, 使用 use 机制允许我们向调用者的上下文中注入一些代码. 就像是替代了这些: 1234defmodule ClientCode do require GenericCode GenericCode.__using__(...)end 这可以通过查看 Elixir 的源代码来证明. 这证明了另一点 — 不断展开. use 宏生成调用另一个宏的代码. 或者更巧妙地说, 用生成代码来生成代码. 正如前面提到的, 编译器会递归地展开它所发现的所有宏定义, 直到没有可展开的宏为止.. 有了这些知识, 我们可以将 match 函数的实现转移到通用的 Plug.Router 模块: 123456789101112131415defmodule Plug.Router do defmacro __using__(_options) do quote do import Plug.Router def match(type, route) do do_match(type, route, :dummy_connection) end end end defmacro get(route, body) do ... # 这段代码保持不变 endend 这使得客户端代码 (译注: 使用宏的代码) 非常精简: 123456defmodule MyRouter do use Plug.Router get "/hello", do: {conn, "Hi!"} get "/goodbye", do: {conn, "Bye!"}end __using__ 宏生成的 AST 会简单地被注入到调用 use Plug.Router 的地方. 特别注意我们是如何从 __using__ 宏里使用 import Plug.Router 的, 这不是必要的. 但这让你可以使用 get 替代使用 Plug.Router.get. 那么我们得到了什么?各种样板代码汇集到了一个地方(Plug.Router). 不仅仅简化了客户端代码, 也让这个抽象正确闭合. 模块 Plug.Router确保了 get 宏所生成的任何东西都能适合使用 match 的通用代码. 在客户端中, 我们只要 use那个模块, 然后用它提供的宏来组合我们的 router. 总结一下本章的内容. 还有许多细节没有提到, 但希望你对于宏是如何与 Elixir 编译器相结合工作的有了更好的理解. 在下一部分 《Understanding Elixir Macros, Part 3 - Getting into the AST》, 我们会更深入, 并开始探索如何分解输入的 AST. 附注 mixin: Mixin 即 Mix-in, 常被译为 “混入”, 是一种编程模式, 在 Python 等面向对象语言中, 通常它是实现了某种功能单元的类, 用于被其他子类继承, 将功能组合到子类中. 12345678910# 例子class Mixin: def mixin_method(self): print("Mixin method called")class MyClass(Mixin): passobj = MyClass()obj.mixin_method() # 输出: Mixin method called 原文: https://www.theerlangelist.com/article/macros_2","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir-Macros","slug":"Elixir-Macros","permalink":"https://yeshan333.github.io/tags/Elixir-Macros/"}]},{"title":"(译) Understanding Elixir Macros, Part 1 Basics","slug":"understanding-elixir-macros-part-1-basics","date":"2022-06-18T14:13:45.000Z","updated":"2022-06-18T14:13:45.000Z","comments":true,"path":"2022/06/18/understanding-elixir-macros-part-1-basics/","permalink":"https://yeshan333.github.io/2022/06/18/understanding-elixir-macros-part-1-basics/","excerpt":"","text":"Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir Macros, Part 2 - Macro Theory [3] (译) Understanding Elixir Macros, Part 3 - Getting into the AST [4] (译) Understanding Elixir Macros, Part 4 - Diving Deeper [5] (译) Understanding Elixir Macros, Part 5 - Reshaping the AST [6] (译) Understanding Elixir Macros, Part 6 - In-place Code Generation原文 GitHub 仓库, 作者: Saša Jurić. 这是讨论 Elixir 宏 (Macros) 系列文章的第一篇. 我原本计划在我即将出版的《Elixir in Action》一书中讨论这个主题, 但最终决定不这么做, 因为这个主题不符合这本书的主题, 这本书更关注底层 VM 和 OTP 的关键部分. 就我个人而言, 我觉得宏的主题非常有趣, 在本系列文章中, 我将试图解释它们是如何工作的, 提供一些关于如何编写宏的基本技巧和建议. 虽然我确信编写宏不是很难, 但与普通的 Elixir 代码相比, 它确实需要更高视角的关注. 因此, 我认为这了解 Elixir 编译器的一些内部细节是非常有帮助的. 了解事情在幕后是如何运行之后, 就可以更容易地理解元编程代码. 这是篇中级水平的文章. 如果你很熟悉 Elixir 和 Erlang, 但对宏还感觉到困惑, 那么这些内容很适合你. 如果你刚开始接触 Elixir 和 Erlang, 那么最好从其它地方开始. 比如 Getting started guide, 或者一些可靠的书. 元编程 (Meta-programming)或许你已经对 Elixir 中的元编程有一点了解. 其主要的思想就是我们可以编写一些代码, 它们会根据某些输入来生成代码. 正因为有了宏 (Macros), 我们可以写出如下这段来自于 Plug 的代码: 1234567get "/hello" do send_resp(conn, 200, "world")endmatch _ do send_resp(conn, 404, "oops")end 或者是来自 ExActor 的 12345defmodule SumServer do use ExActor.GenServer defcall sum(x, y), do: reply(x+y)end 在以上两个例子中, 我们使用到了一些自定义的宏, 这些宏会在编译时 (compile time) 都转化成其它的代码. 调用 Plug 的 get 和 match 会创建一个函数, 而 ExActor 的 defcall 会生成两个函数和将参数正确从客户端进程传播给服务端进程的代码. Elixir 本身的实现上就非常多地用到了宏. 例如 defmodule, def, if, unless, 甚至 defmacro 都是宏. 这使得语言的核心能保持最小化, 日后对语言的扩展就会更加简单. 鲜为人知的是, 宏可以让我们可以有动态 (on the fly) 生成函数的可能性: 123456789101112131415161718192021defmodule Fsm do fsm = [ running: {:pause, :paused}, running: {:stop, :stopped}, paused: {:resume, :running} ] for {state, {action, next_state}} <- fsm do def unquote(action)(unquote(state)), do: unquote(next_state) end def initial, do: :runningendFsm.initial# :runningFsm.initial |> Fsm.pause# :pausedFsm.initial |> Fsm.pause |> Fsm.pause# ** (FunctionClauseError) no function clause matching in Fsm.pause/1 在这里, 我们定义了一个 Fsm module, 同样的, 它在编译时会转换成对应的多子句函数 (multi-clause functions). 类似的技术被 Elixir 用于生成 String.Unicode 模块. 本质上讲, 这个模块是通过读取 UnicodeData.txt 和SpecialCasing.txt 文件里对码位 (codepoints) 的描述来生成的. 基于文件中的数据, 各种函数 (例如 upcase, downcase) 会被生成. 无论是宏还是代码生成, 我们都在编译的过程中对抽象语法树做了某些变换. 为了理解它是如何工作的, 你需要学习一点Elixir 编译过程和 AST 的知识. 编译过程 (Compilation process) 输入的源代码被解析, 然后生成相应的抽象语法树 (AST1). AST1 会以嵌套的 Elixir Terms 的形式来表述你的代码. 然后进入展开阶段. 在这个阶段, 各种内置的和自定义的宏被转换成了最终版本. 一旦转换结束, Elixir 就可以生成最后的字节码, 即源程序的二进制表示. 这只是对整个编译过程的概述. 例如, Elixir 编译器还会生成 Erlang AST, 然后依赖 Erlang 函数将其转换为字节码, 但是我们还不需要知道这部分细节. 不过, 我认为这幅图对于理解元编程代码是有帮助的. 理解元编程魔法的关键点在于理解在展开阶段 (expansion phase) 发生了什么. 编译器会基于原始 Elixir 代码的 AST 展开为最终版本. 另外, 从这个图中可以得到另一个重要结论, Elixir 在生成了二进制之后, 元编程就停止了. 你可以确定你的代码不会被重新定义, 除非使用到了代码升级或是一些动态的代码插入技术 (这不在本文讨论范围). 元编程总是会引入一个隐形 (或不明显)的层, 在 Elixir 中这只发生在编译时, 并独立于程序的各种执行路径. 代码转换发生在编译时, 因此推导最终产品会相对简单, 而且元编程不会干扰例如 dialyzer 这样的静态分析工具. 编译时元编程 (Compile time meta-programming)也意味着我们不会有性能损失. 进入运行时 (run-time) 后, 代码就已经定型了, 代码中不会有元编程结构在运行. 创建 AST 片段什么是 Elixir AST? 它是一个 Elixir Term (译注: Elixir 中的所有数据都可以看成是 term), 一个深度嵌套的层次结构, 用于表述一个语法正确的 Elixir 代码. 为了说得更明白一些, 举个例子. 要生成某段代码的 AST, 可以使用 quote: 12iex(1)> quoted = quote do 1 + 2 end{:+, [context: Elixir, import: Kernel], [1, 2]} 使用 quote 可以获取任意一个复杂的 Elixir 表达式对应的 AST 片段. 在上面的例子中, 生成的 AST 片段用于描述一个简单的求和操作 (1+2). 这通常被称为 quoted expression. 大多数时候你不需要去理解 quoted 结构的具体细节, 让我们来看一个简单的例子. 在这种情况下, AST 片段是一个包含如下元素的三元组 (triplet): 一个原子 (atom) 表示所要进行的操作 (:+) 表达式上下文 (context, 例如 imports 和 aliases). 通常你并不需要理解这个数据 操作参数 要点: 这个 quoted expression 是一个描述代码的 Elixir term. 编译器会使用它生成最终的字节码. 虽然不常见, 但对一个 quoted expression 求值也是可以的: 12iex(2)> Code.eval_quoted(quoted){3, []} 返回的元组中包含了表达式的结果, 以及一个列表, 其中包含了构成表达式的变量. 但是, 在 AST 被求值前 (通常由编译器完成), quoted expression 并没有进行语义上的验证. 例如, 当我们书写如下表达式时: 12iex(3)> a + b** (CompileError) iex:3: undefined function a/0 (there is no such import) 我们会得到错误, 因为这里没有叫做一个叫做 a 的变量 (或函数). 相比而言, 如果 quote 这个表达式: 123iex(3)> quote do a + b end{:+, [context: Elixir, import: Kernel], [{:a, [if_undefined: :apply], Elixir}, {:b, [if_undefined: :apply], Elixir}]} 这个没有发生错误, 我们有了一个表达式 a+b 的 quoted 表现形式. 其意思是, 生成了一个描述该表达式 a+b 的 term, 不管表达式中的变量是否存在. 最终的代码并没有生成, 所以这里不会有错误抛出. 如果把该表述插入到某些 a 和 b 是有效标识符的 AST 中, 刚才发生错误的代码 a+b, 才是正确的. 下面来试一下, 首先 quote 一个求和 (sum)表达式: 123iex(4)> sum_expr = quote do a + b end{:+, [context: Elixir, import: Kernel], [{:a, [if_undefined: :apply], Elixir}, {:b, [if_undefined: :apply], Elixir}]} 然后创建一个 quoted 变量绑定表达式: 123456789iex(5)> bind_expr = quote do...(5)> a=1...(5)> b=2...(5)> end{:__block__, [], [ {:=, [], [{:a, [if_undefined: :apply], Elixir}, 1]}, {:=, [], [{:b, [if_undefined: :apply], Elixir}, 2]} ]} 记住, 它们只是 quoted 表达式. 它们只是在描述代码的简单数据, 并没有执行. 这时, 变量 a 和 b 并不存在于当前 Elixir shell 会话 (session)中. 要使这些片段能够一起工作, 必须把它们连接起来: 1234567891011121314iex(6)> final_expr = quote do...(6)> unquote(bind_expr)...(6)> unquote(sum_expr)...(6)> end{:__block__, [], [ {:__block__, [], [ {:=, [], [{:a, [if_undefined: :apply], Elixir}, 1]}, {:=, [], [{:b, [if_undefined: :apply], Elixir}, 2]} ]}, {:+, [context: Elixir, import: Kernel], [{:a, [if_undefined: :apply], Elixir}, {:b, [if_undefined: :apply], Elixir}]} ]} 这里我们生成了一个由 bind_expr 和 sum_expr 构成的新的 quoted expression -> final_expr. 实际上, 我们生成了一个新的 AST 片段, 它结合了这两个表达式. 暂不要关心 unquote 的部分 - 我稍后会解释这一点. 与此同时, 我们可以进行求值计算这个 AST 片段 (fragment): 12iex(7)> Code.eval_quoted(final_expr){3, [{{:b, Elixir}, 2}, {{:a, Elixir}, 1}]} 再次看到, 求值结果由一个表达式结果 (3), 一个变量绑定列表构成. 形如: 1234{expression, [{{:variable, Elixir}, value},...]}=========== ======== ====== | | |表达式结果 变量名称 变量的值 从这个绑定列表中我们可以看出, 该表达式绑定了两个变量 a 和 b, 对应的值分别为 1 和 2. 这就是在 Elixir 中元编程方法的核心. 当我们进行元编程的时候, 我们实际上是把各种 AST 片段组合起来生成新的我们需要的 AST. 我们通常对输入 AST 的内容和结构不感兴趣, 相反, 我们使用 quote 生成和组合输入片段, 并生成经过修饰后的代码. Unquotingunquote 在这里出现了. 注意, 无论 quote 块 (quote ... end) 里有什么, 它都会变成 AST 片段. 这意味着我们不可以简单地将外部的变量注入到我们的 quote 里. 例如, 这样是不能达到效果的: 123456789iex(8)> quote do...(8)> bind_expr...(8)> sum_expr...(8)> end{:__block__, [], [ {:bind_expr, [if_undefined: :apply], Elixir}, {:sum_expr, [if_undefined: :apply], Elixir} ]} 在这个例子中, quote 仅仅是简单的生成对 bind_expr 和 sum_expr 的变量引用, 它们必须存在于这个 AST 可以被理解的上下文环境里. 但这不是我们想要的结果. 我需要的效果是有一种方式能够直接注入 bind_expr 和 sum_expr 的内容到生成的 AST 的对应的位置. 这就是 unquote(...) 的目的 - 括号里的表达式会被立刻执行, 然后就地插入到调用了 unquote 的地方. 这意味着 unquote 的结果必须是合法的 AST 片段. 理解 unquote 的另一种方式是, 可以把它看做是字符串的插值 (#{}). 对于字符串你可以这样写: 1"....#{some_expression}...." 类似的, 对于 quote 可以这样写: 12345quote do ... unquote(some_expression) ...end 对此两种情况, 求值的表达式必须在当前上下文中是有效的, 并注入该结果到你构建的表达式中. (要么是 string, 或者是一个 AST 片段) 理解这一点很重要: unquote 并不是 quote 的反向过程. quote 将一段代码转换成 quoted 表达式 (quoted expression), unquote并没有做逆向操作. 如果需要把一个 quoted expression 转换为字符串, 可以使用 Macro.to_string/1. 123456iex(9)> Macro.to_string(bind_expr)"a = 1\\nb = 2"iex(10)> Macro.to_string(sum_expr)"a + b"iex(11)> Macro.to_string(final_expr)"(\\n a = 1\\n b = 2\\n)\\n\\na + b" 例子: tracing expression理论结合实践, 一个简单例子, 我们将编写一个帮助我们调试代码的宏. 这个宏可以这样用: 123iex(1)> Tracer.trace(1 + 2)Result of 1 + 2: 33 Tracer.trace 接受一个给定的表达式, 会打印其结果到屏幕上. 然后返回表达式的结果. 需要认识到这是一个宏, 它的输入(1+2)可以被转换成更复杂的形式 — 打印表达式的结果并返回它. 这个变换会发生在宏展开阶段, 产生的字节码为输入代码经过修饰的版本. 在查看它的实现之前, 想象一下最终的结果或许会很有帮助. 当我们调用 Tracer.trace(1+2), 对应产生的字节码类似于这样: 123mangled_result = 1 + 2Tracer.print("1+2", mangled_result)mangled_result mangled_result 表示 Elixir 编译器会销毁所有在宏里引用的临时变量. 这也被称为宏清洗 (macro hygiene), 让宏保持干净, 不会影响到使用宏的代码, 我们会在本系列之后的内容中讨论它(不在本文). 该宏的定义是这样的: 123456789101112131415defmodule Tracer do defmacro trace(expression_ast) do string_representation = Macro.to_string(expression_ast) quote do result = unquote(expression_ast) Tracer.print(unquote(string_representation), result) result end end def print(string_representation, result) do IO.puts "Result of #{string_representation}: #{inspect result}" endend 让我们来逐步分析这段代码. 首先, 我们用 defmacro 定义宏. 宏本质上是特殊形式的函数. 它的名字会被销毁, 并且只能在展开期调用它(尽管理论上你仍然可以在运行时调用). 我们的宏接收到了一个 quoted expression. 这一点非常重要 — 无论你发送了什么参数给一个宏, 它们都已经是 quoted 的. 所以, 当我们调用 Tracer.trace(1+2), 我们的宏(它是一个函数)不会接收到 3. 相反, expression_ast 的内容会是 quote(do: 1+2) 的结果. 在第三行, 我们使用 Macro.to_string/1 来求出我们所收到的 AST 片段的字符串表达形式. 这是你在运行时不能够对一个普通函数做的事之一. 虽然我们能在运行时调用 Macro.to_string/1, 但问题在于我们没办法再访问 AST 了, 因此不能够知道某些表达式的字符串形式了. 一旦我们拥有了字符串形式, 我们就可以生成并返回结果 AST 了, 这一步是在 quote do ... end 结构中完成的. 它的结果是用来替代原始的 Tracer.trace(...) 调用的 quoted expression. 让我们进一步观察这一部分: 如果你明白 unquote 的作用, 那么这个就很简单了. 实际上, 我们是在把 expression_ast(quoted 1+2)代入到我们生成的片段(fragment)中, 将表达式的结果放入 result 变量. 然后我们使用某种格式来打印它们(借助 Macro.to_string/1), 最后返回结果. 展开一个 AST在 Shell 观察其是如何连接起来是很容易的. 启动 iex Shell, 复制粘贴上面定义的 Tracer 模块: 123iex(1)> defmodule Tracer do ... end 然后, 必须 require Tracer: 1iex(2)> require Tracer 接下来, 对 trace 宏调用进行 quote 操作: 123iex(3)> quoted = quote do Tracer.trace(1+2) end{{:., [], [{:__aliases__, [alias: false], [:Tracer]}, :trace]}, [], [{:+, [context: Elixir, import: Kernel], [1, 2]}]} 现在, 输出看起来有点恐怖, 通常你不必需要理解它. 但是如果你仔细看, 在这个结构中你可以看到 Tracer 和 trace, 这证明了 AST 片段是何与源代码相对应的, 但还未展开. 现在, 该开始展开这个 AST 了, 使用 Macro.expand/2: 12345678910111213141516171819iex(4)> expanded = Macro.expand(quoted, __ENV__){:__block__, [], [ {:=, [], [ {:result, [counter: -576460752303423231, if_undefined: :apply], Tracer}, {:+, [context: Elixir, import: Kernel], [1, 2]} ]}, {{:., [], [ {:__aliases__, [counter: -576460752303423231, alias: false], [:Tracer]}, :print ]}, [], [ "1 + 2", {:result, [counter: -576460752303423231, if_undefined: :apply], Tracer} ]}, {:result, [counter: -576460752303423231, if_undefined: :apply], Tracer} ]} 这是我们的代码完全展开后的版本, 你可以看到其中提到了 result(由宏引入的临时变量), 以及对 Tracer.print/2 的调用. 你甚至可以将这个表达式转换成字符串: 1234567iex(5)> Macro.to_string(expanded)"result = 1 + 2\\nTracer.print(\\"1 + 2\\", result)\\nresult"iex(6)> Macro.to_string(expanded) |> IO.putsresult = 1 + 2Tracer.print("1 + 2", result)result:ok 这些说明了你对宏的调用已经展开成了别的东西. 这就是宏工作的原理. 尽管我们只是在 shell 中尝试, 但使用 mix 或elixirc 构建项目时也是一样的. 我想这些内容对于第一篇来说已经够了. 你已经对编译过程和 AST 有所了解, 也看过了一个简单的宏的例子. 在下一篇 《(译) Understanding Elixir Macros, Part 2 - Micro Theory》, 我们将更深入地讨论宏的一些机制. 译注 codepoints: 通常是一个数字, 用于表示 Unicode 字符. Terms: 任何数据类型中的一段数据都被称为 term. 原文:https://www.theerlangelist.com/article/macros_1","categories":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"}],"tags":[{"name":"Elixir-Macros","slug":"Elixir-Macros","permalink":"https://yeshan333.github.io/tags/Elixir-Macros/"}]},{"title":"(译) 理解 Prometheus 的范围向量 (Range Vector)","slug":"understanding-prometheus-range-vectors","date":"2022-04-23T15:38:37.000Z","updated":"2022-04-23T15:38:37.000Z","comments":true,"path":"2022/04/23/understanding-prometheus-range-vectors/","permalink":"https://yeshan333.github.io/2022/04/23/understanding-prometheus-range-vectors/","excerpt":"","text":"Prometheus 中 Range Vector 的概念是有一点不直观的,除非你彻底阅读并理解了官方提供的文档。谁会这样做呢,去读官方文档?大多的人应该会花些错误的时间去做了一些错误的事情,然后随机去寻找一篇像本文一样的文章去理解这个概念,不是吗? 什么是 Vector由于 Prometheus 是一个时序型的数据库,所以所有的数据都在基于时间戳的上下文中被定义。由时间戳到记录数据的映射(map)序列(series)被称之为时间序列(timeseries)。在 Prometheus 的术语中,关于时间序列的集合(即一组时序数据)被称之为 vector。让我们用一个示例去更好的说明这一点。 假设 http_requests_total 是一个表示服务受到的 http 请求总量的 vector。Vectors 允许我们更进一步的使用被称为 “labels” 的东西多维度去表示数据。 例: 1234567// the set of timeseries representing the number of requests with a `200` HTTP response code.// HTTP 状态码为 200 的请求数的一组时间序列http_requests_total{code="200"}// the set of timeseries representing the number of requests served by the `/api/v1/query` handler.// 表示' /api/v1/query '处理程序处理的请求数的一组时间序列http_requests_total{handler="/api/v1/query"} 这样,我们就拥有了所有与所服务的 HTTP 请求数量相关的细粒度的信息,同时还可以在需要时选择聚合这些信息。从语法上讲,http_requests_total 指的是命名为它的整个时间序列集。通过添加 {code="200"} 或 {handler="/api/v1/query"},我们选择了一个子集。 Vectors 的类型Prometheus 进一步定义了两种类型的 vector,取决于时间戳(timestamps)被映射为什么: Instant vector-一组时间序列,其中每个时间戳都映射到“瞬间(instant)”的单个数据点。在下面的响应中,我们可以看到在时间戳 1608481001 处记录的单个值。 12345678curl 'http://localhost:9090/api/v1/query' \\ --data 'query=http_requests_total{code="200"}' \\ --data time=1608481001{ "metric": {"__name__": "http_requests_total", "code": "200"}, "value": [1608481001, "881"]} Range vector-一组时间序列,其中每个时间戳映射到一个数据点的“范围(range)”,记录到过去的一段持续时间。如果没有称为 “range” 的指定持续时间,则这些值不能存在,该持续时间用于构建每个时间戳的值列表。 在下面的示例中,请注意带有时间戳的值列表,从 1608481001 到过去最多 30s。 123456789101112curl 'http://localhost:9090/api/v1/query' \\ --data 'query=http_requests_total{code="200"}[30s]' \\ --data time=1608481001{ "metric": {"__name__": "http_requests_total", "code": "200"}, "values": [ [1608480978, "863"], [1608480986, "874"], [1608480094, "881"] ]} 基于此,我们可以建立关于这两个 vector 类型的两个概念(ideas): Instant vectors 可以用直接被绘制; Range vectors 则不能。这是因为绘制图表需要在 y 轴上为 x 轴上的每个时间戳显示一个数据点。Instant vectors 的每个时间戳只有一个值,而 Range vectors 有很多。为了绘制指标(metric)图表,对于在时间序列中显示单个时间戳的多个数据点是没有被定义的。 Instant vectors 可以进行比较和运算; Range vectors 不能。这也是由于比较运算符和算术运算符的定义方式。对于每个时间戳,如果我们有多个值,我们不知道如何添加[1]或将它们与另一个性质类似的时间序列进行比较。 为什么我们还需要 Range Vectors我们现在知道,Range Vectors 不能直接用于图表或聚合。因此,很自然地要问它们为什么会存在? 答案很简单: counter。 counter 是监控系统的基本类型之一,除了 gauges 和 timings。我们将继续前面的示例,去试图理解 counters 和 range vectors 是如何相互作用的。 假设我们想知道我们的服务现在正在处理多少请求。我们的度量指标 http_requests_total{code="200",handler="/api/v1/query"} 是一个 instant vector,其值代表一个单调递增的 counter [2]。这个 counter 用于度量我们的服务接收到的请求总数。我们知道 Prometheus 在过去的不同时间里 “爬取(scraped)” 了这个 counter,所以我们可以简单地从请求 counter 的值开始: 1234567curl 'http://localhost:9090/api/v1/query' \\ --data 'query=http_requests_total{code="200",handler="/api/v1/query"}'{ "metric": {"__name__": "http_requests_total", "code": "200", "handler":"/api/v1/query"}, "value": [1608437313, "881"]} 但从响应中可以看到,这样做会得到我们不感兴趣的请求的总数,我们关注的是它在过去的有限时间内收到的请求的数量(上面表示的是过去所有时间的请求总量),例如,最近十五分钟。当我们只有一个不断增长的 counter 时,我们如何得到这个数字? 更好的方法是用 counter 的当前值减去 15 分钟前看到的 counter 值。这样我们就可以得到实例在这段时间内接收到的确切请求数。为了在 PromQL 中表示这一点,我们给 instant vector 附加持续时间 [15m]。这部分叫做 range selector,它把 instant vector 转换成 range vector。然后,我们使用像increase 这样的函数,它有效地[3]从 range 开始处的数据点减去 range 结束处的数据点。 123456789curl 'http://localhost:9090/api/v1/query' \\ --data 'query=increase(http_requests_total{code="200",handler="/api/v1/query"}[15m])'{ "metric": {"__name__": "http_requests_total", "code": "200", "handler":"/api/v1/query"}, "values": [ [1608437313, "18.4"] ]} 上面查询语句的解释:它表示过去 15 分钟内请求总数的增长量。上面的响应包含了我们想要拿到的期望之内的答案。结果以 instant vector 的形式出现,现在可以用于进一步绘制图表或汇总(aggregated)。 用于 Range Vector 的函数类似于 increase(range-vector),下面的 PromQL 函数只可用于 range vectors: changes(range-vector) absent_over_time(range-vector) delta(range-vector) deriv(range-vector) holt_winters(range-vector, scalar, scalar) idelta(range-vector) irate(range-vector) predict_linear(range-vector, scalar) rate(range-vector) resets(range-vector) avg_over_time(range-vector) min_over_time(range-vector) max_over_time(range-vector) sum_over_time(range-vector) count_over_time(range-vector) quantile_over_time(scalar, range-vector) stddev_over_time(range-vector) stdvar_over_time(range-vector) 上述的函数的计算结果返回都为 instant vector。因此,我们可以得出这样的结论: range vector 作为这些以 “range vector” 为输入值的函数是有用的。 除了上面的函数和 curls[^1],还有更多关于 range vectors 的内容,我们将在另一篇博文中介绍。 脚注[1] 未定义的行为并不意味着不可能定义一种使这些操作可以工作的方式。这意味着实现选择避免支持这一点。这样做可以简化实现,或者因为可能没有一种方法使它在各种情况 (cases)之间一致地工作。 [2] 单调递增 counter 的值永不减少;它要么增加要么保持不变。Prometheus 只允许一种 counter 减少的情况,即在目标重启期间。如果 counter 值低于之前记录的值,则 rate 和 increase 等 range vector 函数将假定目标重新启动并将整个值添加到它所知道的现有值。这也是为什么我们应该总是先 rate 后 sum,而不是先 sun 后 rate。Rate then sum, never sum then rate [3] “有效(effectively)”是这里的关键词。increase 实际上也可以进行外推,因为所请求的持续时间可能没有在范围(range)的“开始”和“结束”处精确对齐的数据点。 原文:https://satyanash.net/software/2021/01/04/understanding-prometheus-range-vectors.html作者:Satyajeet Kanetkar","categories":[{"name":"Prometheus","slug":"Prometheus","permalink":"https://yeshan333.github.io/categories/Prometheus/"}],"tags":[{"name":"Prometheus","slug":"Prometheus","permalink":"https://yeshan333.github.io/tags/Prometheus/"}]},{"title":"Go json Marshal & UnMarshal 的一点小 trick","slug":"Go-json-Marshal-UnMarshal-的一点小-trick","date":"2022-03-30T23:58:46.000Z","updated":"2022-03-30T23:58:46.000Z","comments":true,"path":"2022/03/30/Go-json-Marshal-UnMarshal-的一点小-trick/","permalink":"https://yeshan333.github.io/2022/03/30/Go-json-Marshal-UnMarshal-%E7%9A%84%E4%B8%80%E7%82%B9%E5%B0%8F-trick/","excerpt":"","text":"在编写 Web Service 等涉及数据序列化和反序列化的场景,对于 JSON 类型的数据,在 Go 中我们经常会使用到 encoding/json Package。最近微有所感,小水一篇 omitemptyJSON 数据的 UnMarshal 我们经常会配合 Struct Tags 使用,让 Struct 的 Filed 与 JSON 数据的指定 property 绑定。 如果要序列化为 Go Struct 的 JSON 数据对应的 Fields 相关的 JSON properties 是缺失的,我们经常会用 omitempty 标记 Go Fields,序列化时,JSON 数据中缺少的属性将会被设置为 Go 中对应的 zero-value,比如: 1234567891011121314151617181920212223package mainimport ( "encoding/json" "fmt")type Person struct { Name string `json:"name"` Age string `json:"age,omitempty"` Weak bool `json:"weak,omitempty"`}func main() { jsonData := `{"name":"ShanSan"}` req := Person{} _ = json.Unmarshal([]byte(jsonData), &req) fmt.Printf("%+v", req) fmt.Println(req.Age)}// output// {Name:ShanSan Age: Weak:false}// Go Playground Link 但上面的例子对于一些场景的处理可能会有问题。看下下面这个例子: 1234567891011121314151617181920212223package mainimport ( "encoding/json" "fmt")type Person struct { Name string `json:"name"` Age string `json:"age,omitempty"` Weak bool `json:"weak,omitempty"`}func main() { jsonData := `{"name":"ShanSan", "age": ""}` req := Person{} _ = json.Unmarshal([]byte(jsonData), &req) fmt.Printf("%+v", req) fmt.Println(req.Age)}// output// {Name:ShanSan Age: Weak:false}// 可以看到 age 为 "" 时,和缺省时的结果是一样的。很显然,上面的写法,缺省的字段和空字段是没有被区分开的。对于一些数据的 Update 操作,比如我们只想 Update Name 字段,对应的 JSON 数据为 {"name":"ShanSan"},执行上述的反序列化动作,Age 字段会被设置为 empty string,Waek 也被设置为了 false,这显然不是我们想看到的。 nil 一下我们可以指针类型(pointer type)对上面的情况区分一下: 123456789101112131415161718192021222324package mainimport ( "encoding/json" "fmt")type Person struct { Name *string `json:"name"` Age *string `json:"age,omitempty"` Weak *bool `json:"weak,omitempty"`}func main() { jsonData := `{"name":"ShanSan"}` jsonDataEmptyAge := `{"name":"ShanSan", "age": ""}` req := Person{} reqEmptyAge := Person{} _ = json.Unmarshal([]byte(jsonData), &req) _ = json.Unmarshal([]byte(jsonDataEmptyAge), &reqEmptyAge) fmt.Printf("%+v", req) fmt.Printf("%+v", reqEmptyAge)}// {Name:0xc000010390 Age:<nil> Weak:<nil>}{Name:0xc0000103c0 Age:0xc0000103d0 Weak:<nil>} emmm,缺省的字段为 nil 了。 Marshal 的时候序列化 struct 的时候,如果使用了 omitempty,也会出现类似上面反序列化的情况,对于缺省的 field 或者 zero-value,序列化得到的 JSON 数据也会缺省相关属性,此时我们也可以通过 pointer 保留相关字段,如下: 123456789101112131415161718192021222324252627282930313233343536package mainimport ( "encoding/json" "fmt")type Student struct { Name string `json:"name"` Score int `json:"score,omitempty"`}type StudentWithPointer struct { Name string `json:"name"` Score *int `json:"score,omitempty"`}func main() { student := Student{ Name: "ShanSan", Score: 0, } score := 0 studentWithPointer := StudentWithPointer{ Name: "ShanSan", Score: &score, } data, _ := json.Marshal(student) dataWithPointer, _ := json.Marshal(studentWithPointer) fmt.Println(string(data)) fmt.Println(string(dataWithPointer))}// {"name":"ShanSan"}// {"name":"ShanSan","score":0} Go Playground 参考 encoding/json Differentiate between empty and not-set fields with JSON in Golang Go’s “omitempty” explained","categories":[{"name":"Go","slug":"Go","permalink":"https://yeshan333.github.io/categories/Go/"}],"tags":[{"name":"json","slug":"json","permalink":"https://yeshan333.github.io/tags/json/"},{"name":"Marshal","slug":"Marshal","permalink":"https://yeshan333.github.io/tags/Marshal/"},{"name":"UnMarshal","slug":"UnMarshal","permalink":"https://yeshan333.github.io/tags/UnMarshal/"}]},{"title":"profiling & Flame Graphs","slug":"profiling-flame-graph","date":"2022-02-26T22:54:38.000Z","updated":"2022-02-26T22:54:38.000Z","comments":true,"path":"2022/02/26/profiling-flame-graph/","permalink":"https://yeshan333.github.io/2022/02/26/profiling-flame-graph/","excerpt":"","text":"忽然想起来还没怎么用过 profiling tools,这可是性能分析“杀器”啊,小水一波,兴许以后就用上了🙃。 profiling profiling,分析。有很多时候,我们都会相对处于 runtime 的程序进行指标 & 特征分析,比如 CPU 使用情况、内存使用情况,race 检测等。 Flame Graphs(火焰图) Flame Graph,火焰图。火焰图是一种常用的可视化分析性能数据的方式。不同类型火焰图适合不同的性能分析优化场景。 上图为 CPU 使用情况的 Flame Graph,来自 -> (https://github.com/brendangregg/FlameGraph。通过该图,我们可以找到 CPU 占用最多的函数,分析代码热路径。特征如下: 纵轴:表函数调用栈,上层函数时下层函数的子函数; 横轴:表示 CPU 占用时间,越长表示占用时间越多; 值得注意的是:横轴先后顺序是为了聚合,跟函数间依赖或调用关系无关;一般情况下,火焰图各种颜色是为方便区分,本身不具有特殊含义。 小试一下Elixir Phoenix Framework & Flame On根据这篇 Toturial -> Profiling Elixir Applications with Flame Graphs and Flame On,我们在 Phoenix App Telemetry Dashboard 中集成 Flame On,GET 到如下 Flame Graph: Go && pprofGo 内置了 profiling 工具 [pprof][https://github.com/google/pprof] 方便我们对程序进行分析,通过 runtime/pprof 包,我们可以在程序中指定位置埋下采集点。 123456789101112131415161718192021222324252627282930313233343536373839404142434445package mainimport ( "math/rand" "os" "runtime/pprof" "time")func generate(n int) []int { rand.Seed(time.Now().UnixNano()) nums := make([]int, 0) for i := 0; i < n; i++ { nums = append(nums, rand.Int()) } return nums}func insertionSort(nums []int) { var n = len(nums) for i := 1; i < n; i++ { j := i for j > 0 { if nums[j-1] > nums[j] { nums[j-1], nums[j] = nums[j], nums[j-1] } j = j - 1 } }}func main() { profileFile, _ := os.OpenFile("cpu.pprof", os.O_CREATE, 0644) defer profileFile.Close() pprof.StartCPUProfile(profileFile) defer pprof.StopCPUProfile() var n int = 10 for i := 0; i < 5; i++ { nums := generate(n) insertionSort(nums) n *= 100 }} 123go run main.go # 生成 cpu.pprof profiling 文件# 启动 http server 查看分析数据go tool pprof -http=:8080 cpu.pprof 然后可以 GET 到类似如下得 Flame Graphs,就挺不 Simplex 的,2333: ReactReact App 的 profiling 我们可以借助浏览器扩展 React DevTools 进行,也可以在使用官方提供的 Profiler API. 我们起个 Ant-Design Pro 来看看:https://github.com/ant-design/ant-design-pro 1yarn create umi 参考 Flame Graphs Profiling Elixir Applications with Flame Graphs and Flame On Go程序性能分析 pprof","categories":[{"name":"Performance","slug":"Performance","permalink":"https://yeshan333.github.io/categories/Performance/"},{"name":"Profiling","slug":"Performance/Profiling","permalink":"https://yeshan333.github.io/categories/Performance/Profiling/"}],"tags":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"},{"name":"React","slug":"React","permalink":"https://yeshan333.github.io/tags/React/"},{"name":"Go","slug":"Go","permalink":"https://yeshan333.github.io/tags/Go/"},{"name":"Profiling","slug":"Profiling","permalink":"https://yeshan333.github.io/tags/Profiling/"},{"name":"Flame Graphs","slug":"Flame-Graphs","permalink":"https://yeshan333.github.io/tags/Flame-Graphs/"}]},{"title":"状态机的一点儿事(fsm-smr-dfsm)","slug":"fsm-smr-dfsm","date":"2022-01-31T17:32:51.000Z","updated":"2022-01-31T17:32:51.000Z","comments":true,"path":"2022/01/31/fsm-smr-dfsm/","permalink":"https://yeshan333.github.io/2022/01/31/fsm-smr-dfsm/","excerpt":"","text":"有限状态机(Finite State Machine) 有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机(英语:finite-state automaton,缩写:FSA),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。- 维基百科 有限状态机的要素 状态:状态是有限个的,任一时刻,只处于一种状态 条件:用于触发状态转移动作的“事件”,条件被满足(输入)就会触发相应动作 动作:条件满足后,执行状态转移的行为 转换:从一个状态转换为另一个状态,转换一般由状态转换函数完成 让我们来看下有限状态机的经典例子:旋转闸机(这年代闸机基本不用硬币了😂) 使用状态图表示的话就是下面这样子: 状态:旋转闸机只有两种状态:锁定和解锁 条件、动作、转换:闸机的初始状态是锁定(Locked)的,当游客放置硬币(Coin)到闸机中时,闸机就会转换为解锁(Un-locked)状态,当游客执行推动作通过闸机后,闸机状态又会被转换为锁定(Locked)。 当闸机处于解锁(Un-locked)状态时,反复的放硬币是没有用的,状态不会变,同理,锁定态时,反复 Push 旋转门也是没用的,闸机状态不会变,游客通过不了。 用状态转换表表示如下图: Go 实现旋转门的 FSM基于 Go 语言,可实现旋转门闸机的 FSM 如下,StateTransitionTable 即为状态转换表: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889package mainimport ( "bufio" "fmt" "log" "os" "strings")const ( Locked = iota Unlocked)const ( InputCoin = "coin" InputPush = "push")type State uint32type StateTransitionTableDef struct { State State Input string}// Actiontype TransitionFunc func(state *State)var StateTransitionTable = map[StateTransitionTableDef]TransitionFunc{ {Locked, InputCoin}: func(state *State) { fmt.Println("Unlocks the turnstile so that the customer can push through.") *state = Unlocked }, {Locked, InputPush}: func(state *State) { fmt.Println("The turnstile has been locked.") }, {Unlocked, InputCoin}: func(state *State) { fmt.Println("The turnstile has been unlocked.") }, {Unlocked, InputPush}: func(state *State) { fmt.Println("When the customer has pushed through, locks the turnstile.") *state = Locked },}type TurnStile struct { State State}func (t *TurnStile) ExecuteAction(action string) { stateActionTupple := StateTransitionTableDef{ t.State, strings.TrimSpace(action), } if transFunc := StateTransitionTable[stateActionTupple]; transFunc == nil { fmt.Println("Unknown action, please try again!") } else { transFunc(&t.State) }}func main() { turnstileFSM := &TurnStile{ State: Locked, // Initial State } prompt(turnstileFSM.State) reader := bufio.NewReader(os.Stdin) for { action, err := reader.ReadString('\\n') if err != nil { log.Fatalln(err) } turnstileFSM.ExecuteAction(action) }}func prompt(s State) { m := map[State]string{ Locked: "Locked", Unlocked: "Unlocked", } fmt.Printf("current state is: [%s], please input action: [coin | push]: \\n", m[s])} FSM 应用-词法分析FSM 很典型的一个应用就是用于编译器前端->词法分析器(Lexer)的词法分析上(tokenize)。比如如下关系表达式语句的 tokenize 上: blogAge > 3 我们的 Lexer 扫描关系表达式时需要识别到 blogAge 为标识符(Identifier),> 为比较操作符(Greater),3 为数字字面量(NumericLiteral),对应的词法规则如下: 标识符(Identifier):首字符需要为字母,其他字符可为数字或字母或下划线 比较操作符(Greater):> 数字字面量(NumericLiteral):全部由数字组成 对应的 FSM 简化版状态图如下: 复制状态机(Replicated State Machine)在分布式系统领域,状态机被用于保证节点状态的一致性,分布式系统一致性算法是基于复制状态机(Replicated State Machine)提出来的。 每一个 Server 节点都会有一个状态机,这个状态机的输入来源为一份储存着命令序列的日志,对于相同的命令输入,每个节点状态机(确定有限自动机 DFA,Deterministic Finite Automata)的输出是确定的、相同的。 参考 复制状态机 Finite-state machine 使用 Golang 实现状态机","categories":[{"name":"Compile","slug":"Compile","permalink":"https://yeshan333.github.io/categories/Compile/"}],"tags":[{"name":"FSM","slug":"FSM","permalink":"https://yeshan333.github.io/tags/FSM/"},{"name":"Compiler","slug":"Compiler","permalink":"https://yeshan333.github.io/tags/Compiler/"},{"name":"Lexer","slug":"Lexer","permalink":"https://yeshan333.github.io/tags/Lexer/"}]},{"title":"2021 | 肆意随心","slug":"2021-annual-reviewed","date":"2022-01-01T12:55:00.000Z","updated":"2022-01-01T12:55:00.000Z","comments":true,"path":"2022/01/01/2021-annual-reviewed/","permalink":"https://yeshan333.github.io/2022/01/01/2021-annual-reviewed/","excerpt":"Yeah“兜兜转转”又一年了,又到了该水年度 Review 的时候啦✅❇️。 算下来,博客三年了,准备开启新的三年了。这篇总结也算是第三篇总结了,3 - 可以说是我很喜欢的数字,挺多网名(ShanSan、yeshan333),还有博客域名(shansan.top、shan333.cn、…)是和“三”有关的(and so on),也算是“谐音梗”啦😎? 回头看看之前写的几篇总结,还挺有意思的。21 年似乎并没有太多那么刻意去做的事,想到了就去试试了。这一次,不需要那么的有条理性,随手一记。","text":"Yeah“兜兜转转”又一年了,又到了该水年度 Review 的时候啦✅❇️。 算下来,博客三年了,准备开启新的三年了。这篇总结也算是第三篇总结了,3 - 可以说是我很喜欢的数字,挺多网名(ShanSan、yeshan333),还有博客域名(shansan.top、shan333.cn、…)是和“三”有关的(and so on),也算是“谐音梗”啦😎? 回头看看之前写的几篇总结,还挺有意思的。21 年似乎并没有太多那么刻意去做的事,想到了就去试试了。这一次,不需要那么的有条理性,随手一记。 博客 & 技术-Blog & Techs21 年的博客没有多大的变化,实现了个简单的 GitHub Action 做了下 CI/CD 到腾讯云的 CVM 服务器(对应域名 shan333.cn 下的一个备份 [backup] 博客),切换了下评论系统到 Waline,更有范了~。 仔细算算,博客的 PV 应该有 10w 了吧(算上我中途干掉的 PV 统计😂)?博客太水,之前没敢甩群被 dalao 一波吐槽 & 本来就写着玩的,不需要过多的 PV/UV。 BTW,当初甩下的一个月至少一篇文章的 🚩,好像完成的还可以,就二月份少了篇(那时候我应该在锤《Command & Conquer : Mental Omega》🤦‍♂️) 十年之约(2021.09.15-Begin) 十年之约,即从加入这个活动起,我们的博客十年不关闭,保持更新和活力。- 来自十年之约站点首页 写到这个我想起了最近一个月在看的斗破苍穹,就离谱。 十年之约 <www.foreverblog.cn>,印象之中好像是 18 年的时候在 Valine 的交流群知道的?我记得我申请过一次,被 reject 掉了(太水了,😶‍🌫️),回头看看归档页,那时候写得文章挺水的,挺想删掉,但是我在 20 年初的时候给博客套了下 Git -> ⌈actions-for-hexo-blog⌋,博客的变更历史已经追踪起来了,不删了不删了,费劲😊,我还每年都到互联网档案馆(Internet Archive)做下 Snapshot,多重手段保留回忆,我被自己制裁了😢。 十年,好像挺长啊,但它三年了,文章质量慢慢好起来了 <不过还是挺水,但我还能更“水”>,是时候了,Brother! 十年之约审核 Techs & Coding再看看 21 年 GitHub 的小绿点,有点差强人意啊,有很多小点是一个 rss-feed 的 CI 打的,21 年的 Coding 时间是少了点,挪了很多的时间去做点其他事情去了,最近编码量稍增,能感觉到代码质量越来越 low 了 <2333,好像原来就挺拉跨的🙃,裂开了>。我感觉 22 年差不多可以去“水”一下感兴趣的开源项目了吧? 在 Twitter 上看了一圈,dalao 们太恐怖了🤐。 GitHub 21 年折腾的新玩意好像不多,照旧耍着 Go、TypeScript、Kubernetes,“蜻蜓点水”般看了下 Prometheus。再想想看了啥技术相关的书,好像挺少有技术深度的,我看了很多和 DevOps、CloudNative 、工程化相关的书。打开自己本想专门用来 Reading 的“小平板子”,好像和上年没多大变化,电子书还是那几本,哈哈哈,吃灰了吃灰了~(^_^): iPads 上的电子书 如果说 21 年看过的印象最深刻的技术书是哪几本,那么应该就是《Go 语言设计与实现》和《凤凰架构-构建可靠的大型分布式系统》,《Go 语言设计与实现》作者的功底很强,膜了❤️,21 年我冒出了个想接触 Compile 技术的想法,就是因为这本书。 Geektime 用的时间减少了,不剁手了,回头看看一些老的东西。 忽然间想起来因为毕设还看了下《普林斯顿微积分读本》,虽然没用上,但我居然看得津津有味,我怕是个假的数学系学生,这本书是挺入门的,我还反手剁手到 App Store 买了下 MarginNote3 去看这本书,一直没怎么用上这个 App,2022 年应该能用上了吧😢? 校园-Campus2021,21 年最大的一件事应该就是毕业了,21 年的毕业季因为疫情的原因好像是那般的“常规”,好像没有做下过什么承诺,好像没有怎么和同学 & 老师聊过对未来的期待,因为经历过 2020 年的春招和秋招的摧残,好像并没有找工作的焦虑感,更多的我想因该还是迷惑,一切似都那么的“平淡”,并没有做什么“惊心动魄”的事,好像并没有电影中的那些桥段?🐇🐇🐇👀 离开学校前,微微整理了下那些年吹过的水,把 Speak 稍微整理了下,将之前的吹水站 slide.shan333.cn 迁移到了 React & Gastby 写的 slides.shan333.cn 上。 那些年的 Slides 12 月份在 koukou 空间捞了手学校的照片,越来越好看了😲: 学校风景 我还顺便拿抖音的剪映稍微理了个短视频,音视频技术 tql,真是“降维打击”,释放灵感:☁☁☁ 不得不承认,现在的确是个好的时代,很多东西不会都可以去搜索着学,就看自己想不想接触,有没有兴趣,愿不愿意花时间,想做得多专业。 工作-Work不知不觉已经来到 A 厂工作快六个月了,近距离从内网 yuque & 技术站观摩之前知道的一些 dalao 在做的事情 & 写的东西。瞬间发现这些人好像比想象中的还要强。 毕业后,我选择了比较感兴趣的一门行业,我觉得我选择的是一个极具创造力和思考力的职业。我觉得这里应该有很多的话记录才对,但在这写不出来了,我在另一个地方“写了”。 生活-Life2021 年的下半年我也经历了很多的事情,我也渐渐明白了一些事情,有些事真的得自己经历过,才会有更多得体会,一切似乎是那么得难以理解,又似乎那么的理所当然。我甚至觉得我似乎开始质疑起了某样东西,但又没全盘否定。于局中仍可保持清醒,于局外,又可以看到很多的东西。“当局者迷,旁观者清”有时候也可予以驳斥。这一年同样也认识了一些人, 缘起于那本《微习惯》,仔细回忆起来,我好像多了很多的习以为常的“小动作”,几乎是下意识的动作,上班的路途反手就是打开读书 App,看那么几页,没有多大的压力,一天想看多少看多少,哪怕只是一页。好了,当我敲出这行字的时候,顺便做了几个俯卧撑😂。 21 年 12 月中,来了次十多公里的徒步,相当的放松,博客首次贴张 chou 照🤗: kubi 游戏-Games真三国无双 7 帝国 回忆了一下,21 年一如既往的锤老游戏多一点,我把电脑给换了,锤 SC2 更爽了,但是 8 月份的时候国服差不多 GG 了,退出江湖选择养老游戏了。 火焰纹章-晓之女神 11 & 12 月有部分时间在和位 dalao 打,“真滴菜”: 阅读-Reading2021,阅读源更多还是语雀和书,知乎看得没有那么频繁了,我还接触了个叫做少数派的网站,内容质量很高。我与语雀🕊️的缘分应该起于大二的时候?我在这里了解了一波体验设计 & 交互 & 前端知识,见识了很多有“思考度”的文章还有dalao,疯狂 follow。好像那些年我对体验设计的兴起就是缘于这里,想起来拿教育邮箱薅的 Figma 还在“我的桌面”很久没打开过了,我还想着试着拿 iPad 试试插画(illustration)来着,Edge 的集锦功能真不错,存了很多插画网站,又多个收藏吃灰的地方🐕。 我的语雀 21年看的“闲书”多了起来,看着一些别人描述的事,想想自己是怎么样的人,如何去描述自己,再看看自己会变成什么样的人,可能会是什么样的人(in the future),我想要的是有更广的看问题的视角 & 锻炼下思考力?: 《活着》 《微习惯》 《蛤蟆先生去看心理医生》 《分寸感》 《杨绛:谈定从容,便是优雅》 《黑客与画家》 …… 可能是因为之前周刊看多了,我把 21 年阅读看到的一些内容(随手抄 & 一些碎片话思考)反手在语雀上开了个周刊记录了下来 👉记录这一周我 看/听 让我有感触的一些文字 ,颇有“万物皆可周刊”那意思了。 2021 年印象深刻的三句话 最恐怖的是你自己不知道你不知道;因为如果你不爱一件事,你不可能把它做得真正优秀;我们一生可能会做很多很多的事情,有些事情之所以去做,并非它是有多么大的意义,而是因为我们感兴趣。 但有些灵感和想法,总是那么的容易消逝。哪怕是我将它即刻记录下来了,可当我再看的时候,好像已经不是之前那个“味道”了。翻了下 Microsoft ToDo 这一年我好像积压了很多 Items。RSS Reed 阅读信息流似乎没那么好了,最近有试试 TG RSS Feed Robot + yuque 的想法,虽然在某推上看到了许多 dalao KM 管理的方式,但好像没有特别适合我的。Exploring! 折磨 看 & 听-See & Listen 21 年又关注了下 Red Bull BC One,Respect 一下那些年耍过的街舞,21 年没有我特别喜欢的 Style,这应该是第二次在 World Final 有 Bgirl 了,不知道啥时候能出现中国区的 dalao🙃。 21 年 10 月开始,我一个人开启了基本每周一场电影的模式(累计 10 场,人生目前累计 13 场?🏄),还挺有意思的,或许这就是传说中的成长了?相比之前,我有了更多的视角,我看懂了更多电影要描绘的故事,外加一些经历和看到或者听到过的故事,我可以更多的对个人的理解进行描述了。 21 年的电影 2021年,听技术 Podcast(播客)没有那么多了,还是一如既往的关注着捕蛇者说,转战某推围观 dalao 了,深夜听喜马拉雅催眠。 未来-Future2021 如果用一句话描述的话,那么应该是:有挺多的事是想到了,便去做了,不需要那么的有规划性。 2022 年,我想怎么操作:更有挑战,更有趣,更有思考,更有深度的事?2333,这里就不立 🚩 了,我还需要想段时间。 流年 关注思考的过程,终将更加卓越 | 2020 年总结 2019 年总结","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"Git 仓库瘦身与 LFS 大文件存储","slug":"git-lfs-and-thin-repo","date":"2021-12-26T16:26:23.000Z","updated":"2021-12-26T16:26:23.000Z","comments":true,"path":"2021/12/26/git-lfs-and-thin-repo/","permalink":"https://yeshan333.github.io/2021/12/26/git-lfs-and-thin-repo/","excerpt":"熟悉 Git 的小伙伴应该都知道随着 Git 仓库维护的时间越来越久,追踪的文件越来越多,git 存储的 objects 数量会极其庞大,每次从远程仓库 git clone 的时候都会墨迹很久。如果我们不小心 git add 了一个体积很大的文件,且 git push 到了远程仓库,那么我们 git clone 的时候也会很慢。 看一下 GitHub 上的 microsoft/vscode 仓库,都有 九万多个 commit 了,可想而知 objects 的数量应该很恐怖,尝试 clone 一下(一百多万个 objects):","text":"熟悉 Git 的小伙伴应该都知道随着 Git 仓库维护的时间越来越久,追踪的文件越来越多,git 存储的 objects 数量会极其庞大,每次从远程仓库 git clone 的时候都会墨迹很久。如果我们不小心 git add 了一个体积很大的文件,且 git push 到了远程仓库,那么我们 git clone 的时候也会很慢。 看一下 GitHub 上的 microsoft/vscode 仓库,都有 九万多个 commit 了,可想而知 objects 的数量应该很恐怖,尝试 clone 一下(一百多万个 objects): 这里微微记录下 Git 仓库瘦身和使用 Git LFS 进行大文件存储管理的几个常规操作。 Git 仓库瘦身 瘦身背景:错误把大文件 push 到了远程仓库 我们可以通过以下命令或者 du -mh 查看 Git 仓库的体积,git-count-objects: 12# 查看仓库体积情况git count-objects -vH 示例:可以看到当前仓库体积只有 12.00 KiB 左右 现在我们模拟错误的将大文件上传到远程 Git 仓库的动作: 1234567891011121314151617# 1、生成一个 90MB 大小的文件,Github 做了限制超过 100 MB 大小的文件建议使用 LFS,直接拒绝 push➜ dd if=/dev/zero of=bigfile bs=90MB count=1# 2、将这个文件 push 到远程仓库➜ git add bigfile➜ git commit -m "add 90MB bigfile"➜ git push origin masterEnumerating objects: 4, done.Counting objects: 100% (4/4), done.Delta compression using up to 16 threadsCompressing objects: 100% (3/3), done.Writing objects: 100% (3/3), 85.71 KiB | 306.00 KiB/s, done.Total 3 (delta 0), reused 0 (delta 0)remote: warning: See http://git.io/iEPt8g for more information.remote: warning: File bigfile is 85.83 MB; this is larger than GitHub's recommended maximum file size of 50.00 MBremote: warning: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.To github.com:yeshan333/git-lfs-prune-repo.git e3baf1a..f057313 master -> master 好,接下来我们假装这个仓库有很多文件,不知道具体是那个文件让 Git 仓库的体积突然变大,导致 clone 很慢🤣。就算知道了是哪里个文件造成的,我们直接删除那个文件是没有用的,我们还需要删除那个文件对应的 Git Object 文件。 接下来我们可以通过一下命令将本地 clone 的仓库历史提交过的体积较大的前 5 个文件名与对应的 Object 文件的 ID 罗列出来: 1git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')" 然后我们删除历史提交过的大文件 bigfile,从日志中我们可以看到本地仓库已经移除大文件成功了 1234567891011121314➜ git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch bigfile' --prune-empty --tag-name-filter cat -- --allWARNING: git-filter-branch has a glut of gotchas generating mangled history rewrites. Hit Ctrl-C before proceeding to abort, then use an alternative filtering tool such as 'git filter-repo' (https://github.com/newren/git-filter-repo/) instead. See the filter-branch manual page for more details; to squelch this warning, set FILTER_BRANCH_SQUELCH_WARNING=1.Proceeding with filter-branch...Rewrite e3baf1ac709ae54b60afac9038adcf26fd086748 (1/1) (0 seconds passed, remaining 0 predicted)WARNING: Ref 'refs/heads/master' is unchangedWARNING: Ref 'refs/remotes/origin/master' is unchangedWARNING: Ref 'refs/remotes/origin/main' is unchangedWARNING: Ref 'refs/remotes/origin/master' is unchanged 接下来我们使用 reflog 和 gc 压缩(清理和回收大文件占用的 objects 空间)看看瘦身效果,最后将变动推送到远程仓库即可: 123456789101112➜ git reflog expire --expire=now --all && git gc --prune=now --aggressive➜ git count-objects -vH➜ git push --mirrorTotal 0 (delta 0), reused 0 (delta 0)To github.com:yeshan333/git-lfs-prune-repo.git - [deleted] main + f057313...e3baf1a master -> master (forced update) * [new branch] origin/HEAD -> origin/HEAD * [new branch] origin/main -> origin/main * [new branch] origin/master -> origin/master What’s the difference between git clone –mirror and git clone –bare Git LFS 大文件存储如果我们之前生成的大文件 bigfile 大小超过 100 MB,那么 push 到 Github 的时候,会抛出个 error 错误,并会有条建议使用 LFS (Large File Storage):https://git-lfs.github.com/ 管理这个大文件: 1234567891011121314➜ git push origin mainEnumerating objects: 4, done.Counting objects: 100% (4/4), done.Delta compression using up to 16 threadsCompressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 1.85 MiB | 752.00 KiB/s, done.Total 3 (delta 0), reused 1 (delta 0)remote: error: Trace: 993cb74d30fdb2342e7243f5a7002c1892d00d3a216b80e64b43ef7e4382b947remote: error: See http://git.io/iEPt8g for more information.remote: error: File bigfile is 1907.35 MB; this exceeds GitHub's file size limit of 100.00 MBremote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.To github.com:yeshan333/git-lfs-prune-repo.git ! [remote rejected] main -> main (pre-receive hook declined)error: failed to push some refs to 'git@github.com:yeshan333/git-lfs-prune-repo.git' 1234567891011121314151617181920212223242526272829303132333435# 仓库初始化 LFS➜ git lfs installUpdated git hooks.Git LFS initialized.# 创建大文件➜ dd if=/dev/zero of=bigfile200 bs=200MB count=11+0 records in1+0 records out200000000 bytes (200 MB, 191 MiB) copied, 0.176594 s, 1.1 GB/s# 指定 LFS 追踪大文件➜ git lfs track "bigfile200"Tracking "“bigfile200”"# 被追踪的文件会记录再 .gitattributes 文件中我们将 .gitattributes 文件 push 到远程仓库即可➜ cat .gitattributes"bigfile200" filter=lfs diff=lfs merge=lfs -text➜ git add .gitattributes➜ git commit -m "add .gitattributes"➜ git push# 提交大文件➜ git add bigfile200➜ git commit -m "bigfile 200MB"[master 84fb90b] bigfile 200MB 1 file changed, 3 insertions(+) create mode 100644 bigfile200➜ git pushUploading LFS objects: 100% (1/1), 200 MB | 3.7 MB/s, done.Enumerating objects: 4, done.Counting objects: 100% (4/4), done.Delta compression using up to 16 threadsCompressing objects: 100% (3/3), done.Writing objects: 100% (3/3), 423 bytes | 423.00 KiB/s, done.Total 3 (delta 0), reused 0 (delta 0)To github.com:yeshan333/git-lfs-prune-repo.git aef9a0b..84fb90b master -> master 开启了 LFS 之后,对应大文件的内容存储在 LFS 服务器中,不再是存储在 Git 仓库中,Git 仓库中存储的是大文件的指针文件,LFS 的指针文件是一个文本文件。 Done? 参考 Push Mirroring-Gitlab git 瘦身 | Palance’s Blog 详解 Git 大文件存储(Git LFS)","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"}]},{"title":"Deserve","slug":"deserve","date":"2021-12-04T06:49:35.000Z","updated":"2021-12-04T06:49:35.000Z","comments":true,"path":"2021/12/04/deserve/","permalink":"https://yeshan333.github.io/2021/12/04/deserve/","excerpt":"今天凌晨五点就醒了,积累了好多好多的情绪啊!","text":"今天凌晨五点就醒了,积累了好多好多的情绪啊!","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"回环地址的一点儿破事","slug":"loopback-addr","date":"2021-11-27T11:41:50.000Z","updated":"2021-11-27T11:41:50.000Z","comments":true,"path":"2021/11/27/loopback-addr/","permalink":"https://yeshan333.github.io/2021/11/27/loopback-addr/","excerpt":"心血来潮,小水一篇! 回环地址(loopback address) loopback 在维基百科上有一段这样的解释:Loopback (also written loop-back) is the routing of electronic signals or digital data streams back to their source without intentional processing or modification. It is primarily a means of testing the communications infrastructure.通熟的说就是将由“源”发送出去的数据路由回“源”。","text":"心血来潮,小水一篇! 回环地址(loopback address) loopback 在维基百科上有一段这样的解释:Loopback (also written loop-back) is the routing of electronic signals or digital data streams back to their source without intentional processing or modification. It is primarily a means of testing the communications infrastructure.通熟的说就是将由“源”发送出去的数据路由回“源”。 作为划水选手,我们肯定会接触过这样一个东西 -> Virtual loopback interface。当我们写的应用/服务想在同一台机器上进行通信的时候,基本都会使用到它。 在类 Unix 系统中,虚拟回环接口(Virtual loopback interface)通常被命名为 lo 或者 lo0。我们可以使用 ipconfig 看一下: emmm,127.0.0.1,好家伙,没错,127.0.0.1 就是一个 IPv4 的回环地址。IETF 标准中(RFC1122、RFC5735)将 IPv4 CIDR 地址块 127.0.0.0/8 划为回环地址(即 127.0.0.0 ~ 127.255.255.255)。IPv6 下回环地址为 ::1/128。 IPv6 下 127.0.0.1 表示为 ::1 几个常见的小家伙OK, 回环地址简介完了,接下来让我们看下以下几个常用的“小家伙”: localhost 0.0.0.0 127.0.0.1 在这里,抛出几个问题?再自问自答!😎 这三个家伙有什么区别? 显而易见,0.0.0.0 和 127.0.0.1 是 IP 地址嘛,localhost 是 hostname。至于再具体点的东西,可以看下后面两个问题。 为什么断网后,我们还能 ping 通这三个东西? 断网的情况下,我们使用 ping 命令,ping 一下公网的 IP 地址,一般是不通的。但是 ping 127.0.0.1 却可以。因为 127.0.0.1 是一个回环地址(Loopback Address),操作系统对于走真实网卡的公网 IP 数据包的处理和走虚拟网卡的本机回环地址(之前介绍的 lo 和 lo0,Virtual loopback interface)的处理是不一样的。相对于目标是公网 IP 的数据包走的 ring buffer,回环地址的数据包走了一个数据结构 input_pkt_queue 触发软中断 ksoftirqd 处理,这篇文章有较为深入的介绍 👉🔗🐂。 至于 ping localhost 也是通的是因为 localhost DNS 解析到了回环地址 127.0.0.1,可以使用 cat /etc/hosts 查看 Linux hosts 文件。IETF 标准 RFC6761 将域名 localhost 默认保留给了回环地址 127.0.0.1。 123➜ cat /etc/hosts127.0.0.1 localhost::1 ip6-localhost ip6-loopback 至于为什么断网能 ping 通 0.0.0.0,可以结合下一个问题思考一下。 开发完后的 Web Service,我们一般会 listen 0.0.0.0,这有什么用? listen 0.0.0.0 会监听本机上的所有IPV4地址。让服务访问方就可以通过本机的多个 IP 地址(包括回环地址,只要服务访问方与本机处于同一个网络下)访问本机的 Web 服务。RFC 5735 对特殊的 0.0.0.0 地址做了介绍。 Wireshark 回环地址抓包在这里介绍下使用 Wireshark 抓取回环地址的数据包, Wireshark 如果想要抓取回环地址的包((loopback packets)),需要安装 Npcap。 1、我们本地使用 Go 的 Gin 起个粗糙版 Web 服务: 12345678910111213package mainimport "github.com/gin-gonic/gin"func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")} 2、打开 Wireshark,capture 回环地址的虚拟网卡: 3、过滤一下 TCP 端口,curl 一下 localhost:8080/ping: 1curl --location --request GET 'localhost:8080/ping' 水完,收工!😊 参考 LoopBack (Virtual loopback interface) - wikipedia Localhost - wikipedia 断网了,还能ping通 127.0.0.1 吗?为什么?","categories":[{"name":"计算机网络","slug":"计算机网络","permalink":"https://yeshan333.github.io/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"}],"tags":[{"name":"Wireshark","slug":"Wireshark","permalink":"https://yeshan333.github.io/tags/Wireshark/"}]},{"title":"回到十月-生活中的一点儿小确幸","slug":"back-to-october","date":"2021-11-14T10:21:37.000Z","updated":"2021-11-14T10:21:37.000Z","comments":true,"path":"2021/11/14/back-to-october/","permalink":"https://yeshan333.github.io/2021/11/14/back-to-october/","excerpt":"","text":"前言不知不觉,离开校园将近四个月了,正式工作(摸🐟~)也差不多四个多月了,最近经历了很多事,头发也掉了不少😂 {微微害怕了}。之前一直有想法想补充一些带有生活气息的博文到自己的博客中,印象中 2021 年的 reviewed 有提到过,总觉得自己的博客少了点味儿(生活的味道),毕竟我也是个活脱脱的人啊,也是有 “感觉” 的。 趁着周末,来一篇。略微回顾了下这几个月,觉得最应该写的就是 10 月(屁事多😄),虽然说现在都 11 月了,但也不妨碍我写 10 月的事。 10 月的那些小确幸 国庆 答辩 或许注定的遇见 国庆七天emmm,说到 10 月,首当其冲的当然是国庆七天的假期了。这七天我有下面的一个小总结,2333: Day 1,游戏(FPS); Day 2,游戏(FPS); Day 3,游戏(SRPG); Day 4,现代文学小说《活着》 + 电影《活着》; Day 5,爬个山; Day 6,动物园 & 北京路 & 书店; Day 7,看了个电影,写篇文章; Day 8,上了个班儿。 游戏:我在 7 月份换了个配置还可以电脑,终于能打点像样点的游戏了,之前那小破电脑,我只能打个《细胞分裂:断罪》意思一下,哦,还有《星际争霸 2》也能勉强玩玩,当初看着室友玩新出的游戏,那叫一个羡慕啊(那时候我一般只好甩个门出去卷了)。10 月前,《Sniper Elite 4》狙击精英 4 正好打折,反手在 Steam 入手了我的第二款游戏(之前老白嫖党了,花点钱,意思下)。BTW,国庆前一个同事推荐过我耍下《Hearts of Iron》钢铁雄心,玩了下,真复杂,不适合我。被某《王者荣耀》影响,打习惯学习成本没么高的游戏了(这就是传说中的迫于生活?)。于是机智的我,巧妙的避开了国庆前三天的人海,决定不出去,打开两天的《狙击精英 4》,唉,真香! 第三天,反手打开了海豚模拟器(没办法,条件它不允许),玩起了 SRPG 游戏 -> 《火焰纹章:晓之女神》,火焰纹章系列游戏玩了很多年了,不知道我什么时候能嫖上 2019 年出的《火焰之纹章:风花雪月》/(ㄒoㄒ)/~~,Google 了一遍,没翻到镜像,太难了😭。每次玩这种略微带点年代感的游戏,都会回忆起小时候玩插卡带游戏的那种快乐。 oh,这个月我还通过某小程序耍了下当初小时候玩过的《热血格斗》,快乐就这么简单😎? 小说:第四天,我尝试着看了下余华的长篇小说《活着》,丰富下自己的精神世界。所幸它的篇幅也没有那么长(想起来,当初我那套周易也没看完,虽然一小本挺薄的😢,但小本本堆起来就很多了)。小说在用死亡去“象征”活着,尽管主人公的一生是那么的不幸,但他最后仍然是那么的乐观豁达。仔细想想,我觉得福贵还是挺幸运的,遇到了那么多对自己好的人。尽管我没有生长在那个年代,但我在这小说中从一个平凡人的视角(相比于之前的经常看的抗战电视剧)又看到了的当初那些年代的不容易。第四天稍微晚些的时候,我顺便看了下张艺谋执导的同名电影,电影稍微美化了下小说,但不得不说 94 年的电影这么棒,那箱贯穿整部电影的皮影箱,让我印象很深刻,电影的虽然没有拍完整部小说,但描绘得很到位了。也许多年后的我再看会有更多得体会🤔,下面是我看小说的时候喜欢得一段话: 爬山:第五天的爬山其实并没有列入我的规划中(想了想,我的国庆当初也没规划🤣),这可以说是说走就走了,出去呼吸下新鲜空气。这天相当的 relax,这广州的白云山还挺矮,不过快到山顶的那段路也不好走啊。我以为过完一遍山上的景点了,但是和某个人聊的时候,我发现我居然还有那么多的地点没去,后面再去次(囧.jpg)。 动物园 & 北京路 & 电影:这里要特别提一下,我都是一个人去的,2333,我骄傲(😎)。吐槽一下,动物园 & 北京路 也就这了,不过如此🤣,感觉每个城市都有。电影看的是最近很火的《长津湖》,人生的第一次一个人去看的电影,只能说我太勇了,之前看电影一直是和同学去的,一直害怕一个人去看(有种想法一直围绕着我的脑海:一个人去不太好吧?周围都是小情侣?被暴击)。被朋友疯狂 push,悟了,想看就看,关注那么多别人的看法干嘛(别人也未必关注你)。 书店:谈到阅读,我经历了从纸质书到电子书再到纸质书 & 电子书混合双打的变换。最近几个月去书店的频率有点高了,被语雀上 dalao 们丰富的精神世界刺激到了🤣,我对自己精神世界的探索又更加热切了,去书店攒点“气”。自己之前是很多喜欢到知乎还有微信公众号去看别人写的文章的,奈何还是没有能够很好的把自己的想法真实写出来。我又悟了🤣,是我没有料,料储备不够多,Maybe,一本完整的书相比于片段化的文章能让我有更深刻的感受!那么就微微提高了下看书的频率,做点突破。 答辩这个月还有一件重要的事,就是我的转正答辩。不得不说写 PPT 是个很痛苦的事情,但是为了给自己个交代,必须得写一个。准备答辩的过程我也慢慢对自己有了更加清楚的认知。 直至现在,我仍然能很清楚得感受到自己的变化。 最近认识的同事 & 朋友都跟我说过一句话(Social 还得是你啊!),实际上,Social?我并没有那么的 Social。我觉得我以前是那么一个孤僻的人,哪怕是对家人也是如此。我是那么的喜欢一个人呆着(呆着?或许可以称之为独处),不愿意于太多的人接触,能自己做的事绝不找别人,就算不能自己做,也会继续坚持找着法去做,就是不太愿意找别人帮忙。我感觉知乎上的一个话题对我这一类人的描述是很到位的 -> 为什么说内向的人精神内耗很严重呢?。有些时候,我会觉得我是那么的不自信。工作上的事,最初是比较厌恶沟通的,周围的同事还是不错的,但我还是不愿意去沟通,总觉得我自己能解决😢,但这效率相对于合作来说,就没那么的好了。 现在感觉好多了,我慢慢的踏出了那一步,主动和别人沟通稍微多了点。但还是有种类似于“厌恶”的心理存在,不想别人知道太多。好了,这里我也不想写太多,我期待自己的下一步变化🙂。 这里的话可能有点乱,稍(日)后再理一理。 遇见…… Life is not over.","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"使用 Kubeadm 搭建个公网 k8s 集群(单控制平面集群)","slug":"create-k8s-cluster","date":"2021-10-24T13:51:19.000Z","updated":"2021-10-24T13:51:19.000Z","comments":true,"path":"2021/10/24/create-k8s-cluster/","permalink":"https://yeshan333.github.io/2021/10/24/create-k8s-cluster/","excerpt":"前言YY:国庆的时候趁着阿里云和腾讯云的轻量级服务器做促销一不小心剁了个手😎😢,2 Cores,4G RAM 还是阔以的,既然买了,那不能不用呀🚩,之前一直想着搭建个 k8s 集群玩玩,本地开发机虽然起了个 k8s(拿 Docker Desktop 起的,不 dei 劲),但就一个 Node,不爽,对 k8s 的体验不到位😒,1024,是时候用起来了,折腾一下,顺便让最近浮躁的心冷静一下。 这次拿官方的 Kubeadm 耍一下,以阿里云的轻量级应用服务器为 Control 节点,腾讯云的轻量级应用服务器为 Worker 节点,说干就干。","text":"前言YY:国庆的时候趁着阿里云和腾讯云的轻量级服务器做促销一不小心剁了个手😎😢,2 Cores,4G RAM 还是阔以的,既然买了,那不能不用呀🚩,之前一直想着搭建个 k8s 集群玩玩,本地开发机虽然起了个 k8s(拿 Docker Desktop 起的,不 dei 劲),但就一个 Node,不爽,对 k8s 的体验不到位😒,1024,是时候用起来了,折腾一下,顺便让最近浮躁的心冷静一下。 这次拿官方的 Kubeadm 耍一下,以阿里云的轻量级应用服务器为 Control 节点,腾讯云的轻量级应用服务器为 Worker 节点,说干就干。 Check 一下文档要求 - 准备工作Kubenetes 官方文档给出了 Kubeadm 起 k8s 集群的几点要求,在这里微微检查下两台轻量级云服务器: A compatible Linux host. The Kubernetes project provides generic instructions for Linux distributions based on Debian and Red Hat, and those distributions without a package manager.[我们用的 Ubuntu 20.04,那肯定符合 Debian 系的]. 2 GB or more of RAM per machine (any less will leave little room for your apps).[4G, 我们很 OK, 但感觉后面会拉跨]. 2 CPUs or more. [正好一台 2个 CPU, nice]. Full network connectivity between all machines in the cluster (public or private network is fine).[两台轻量级应用服务器都有公网 IP,那必须互通啊]. Unique hostname, MAC address, and product_uuid for every node.[这里得微微 check 一下两台服务器,cat /sys/class/net/eth0/address 看下 MAC 地址,sudo cat /sys/class/dmi/id/product_uuid 看下 product_uuid, hostname 看下主机名,emmm, correct!] Certain ports are open on your machines. [这里得到阿里云轻量级服务器 & 腾讯云的轻量级应用服务器的防火墙开放下相关 TCP 端口]。 阿里云轻量级应用服务器开启 Control(控制平面)节点的 TCP 端口,这里要对照下文档给出的需要开放的端口: Control Plane Open PortsAliyun Control Node 腾讯云轻量级应用服务器开启 Worker(工作)节点的 TCP 端口: Worker Node Open PortsTencent Cloud Worker Node Swap disabled. You MUST disable swap in order for the kubelet to work properly. [为了让 kubelet 起来,要把 Swap 分区关闭,使用 free -mh 看下 Swap 是否在使用, swapoff -a 关闭 Swap 分区]. 参考:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ 为什么需要关闭 Swap 分区,有 dalao 做了分析:https://www.jianshu.com/p/6f3268ce642f Letting iptables see bridged traffic. 这里照着文档,一波操作下两台服务器: 12345678910111213sudo modprobe br_netfiltercat <<EOF | sudo tee /etc/modules-load.d/k8s.confbr_netfilterEOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOFsudo sysctl --systemlsmod | grep br_netfilter Container Runtime Interface(CRI). [这里需要安装下 Pod 运行需要的容器运行时,我们选择 Docker]. 1234567891011apt-get updateapt-get install -y apt-transport-https \\ software-properties-common \\ ca-certificates \\ curl \\ gnupg \\ lsb-releasecurl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"apt-get updateapt-get install -y docker-ce docker-ce-cli containerd.io 安装完毕还需要将 Docker 的 cgroup driver 替换为 systemd,确保与 Kubeneters 使用的一致。 12345678cat>>/etc/docker/daemon.json<<EOF{ "exec-opts": ["native.cgroupdriver=systemd"]}EOFsystemctl daemon-reloadsystemctl restart docker 安装 kubeadm, kubelet, kubectl上面检查工作如果很顺利的话,接下来就可以准备 kubeadm, kubelet, kubectl 安装了,不过我们还得给 apt 添加 Kubenetest 软件源,官方文档中使用的如软件源是 Google 域名下的,国内云服务器访问会有问题(懂得都懂了😂),这里使用国内得源,这里两台服务器都操作一下: 123456# 1、添加 GPG Keysudo curl -fsSL http://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -# 2、添加 k8s 软件源sudo add-apt-repository "deb http://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main"3、update 一下apt-get update 上面执行没有问题的话,就可以开始安装 kubelet kubeadm kubectl了: 1234567sudo apt-get install -y kubelet kubeadm kubectl# 查看安装的版本, apt install apt-show-versionsapt-show-versions kubectl kubelet kubeadm# 让 kubelet 开机启动sudo systemctl start kubeletsudo systemctl enable kubelet kubeadm: 引导启动 Kubernate 集群的命令行工具。 kubelet: 在群集中的所有计算机上运行的组件, 并用来执行如启动 Pods 和 Containers 等操作。 kubectl: 用于操作运行中的集群的命令行工具。 初始化集群为了能够让集群初始化更快,我们可以先预拉取集群初始化依赖的镜像,emmm,官方文档给出的又是 Google 的网址,这里我们基于 GitHub -> AliyunContainerService/k8s-for-docker-desktop 项目做镜像的快速拉取。确保相关镜像版本与 kubelet 保持一致(这里是 v1.22.2), kubeadm config images list --kubernetes-version v1.22.2 可查看需要哪些镜像。 12345678910111213141516git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git && cd k8s-for-docker-desktoprm -f images.properties# 调整镜像版本cat>>images.properties<<EOFk8s.gcr.io/pause:3.5=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5k8s.gcr.io/kube-controller-manager:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.22.2k8s.gcr.io/kube-scheduler:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.22.2k8s.gcr.io/kube-proxy:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.22.2k8s.gcr.io/kube-apiserver:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.22.2k8s.gcr.io/etcd:3.5.0-0=registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.0-0k8s.gcr.io/coredns/coredns:v1.8.4=registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.4quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1=registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.26.1EOF# 拉取镜像./load_images.sh 初始化控制平面节点(Control Plane Node(s))控制(Control)节点 {阿里云轻量级应用服务器} 的镜像预拉取完毕后,可执行如下命令进行初始化操作: 12345# api server IPv4 地址使用公网 IPkubeadm init \\ --pod-network-cidr=10.244.0.0/16 \\ --kubernetes-version v1.22.2 # --apiserver-advertise-address 120.79.73.159 为当前 root 用户生成 kubeconfig: 123mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config 安装 CNI(Container Network Interface) -> Flannel 1curl --insecure -sfL https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml | kubectl apply -f - 查看节点状况,emmm,Ready 没毛病 123root@iZwz92a65mqaa8zwy83dpnZ:~/k8s-for-docker-desktop# kubectl get nodesNAME STATUS ROLES AGE VERSIONizwz92a65mqaa8zwy8 Ready control-plane,master 4m6s v1.22.2 添加工作节点(Worker Node(s))接下来我们将 Worker 节点加入到集群中,由于我们在初始化控制平面所在的主节点时并没有指定公网 IP,所以这里先做个 IP 转发,让 Worker 节点能够和控制平面节点间进行通信。 1iptables -t nat -A OUTPUT -d <初始化控制平面节点得到的 IP> -j DNAT --to-destination <阿里云轻量级服务器公网 IP> 然后我们将 Worker 节点 join 进集群中: 1kubeadm join <初始化控制平面节点得到的 IP>:6443 --token 4zicbp.d1wertghxdgcgz6y --discovery-token-ca-cert-hash sha256:1912dbf415da652f97b9fa728cb85dd338e17b24ee338ec48b073c8fa8sdfgth 顺利的话😊,那么结果如下: worker join 然后到控制节点看下集群节点状态,顺利的话结果如下🤣: 1234root@iZwz92a65mqdpnZ:~/k8s-for-docker-desktop# kubectl get nodesNAME STATUS ROLES AGE VERSIONizwz92a65mqaa8zwy83dpnz Ready control-plane,master 48m v1.22.2vm-8-4-ubuntu Ready <none> 8m9s v1.22.2 参考 Installing kubeadm 使用 Kubeadm 部署 解决阿里云ECS下kubeadm部署k8s无法指定公网IP","categories":[{"name":"Kubernetes","slug":"Kubernetes","permalink":"https://yeshan333.github.io/categories/Kubernetes/"}],"tags":[{"name":"Kubernetes","slug":"Kubernetes","permalink":"https://yeshan333.github.io/tags/Kubernetes/"},{"name":"Kubeadm","slug":"Kubeadm","permalink":"https://yeshan333.github.io/tags/Kubeadm/"}]},{"title":"从平均负载开始,这进程是 CPU Bound 还是 IO Bound 的?","slug":"io-bound-cpu-bound-with-average-load","date":"2021-10-07T16:12:38.000Z","updated":"2021-10-07T16:12:38.000Z","comments":true,"path":"2021/10/07/io-bound-cpu-bound-with-average-load/","permalink":"https://yeshan333.github.io/2021/10/07/io-bound-cpu-bound-with-average-load/","excerpt":"","text":"在排查性能问题的时候,我们经常会使用 top 或者 uptime 两个 Linux 命令,top 命令和 uptime 命令都会给出最近机器 1 min,5 min,15 min 的平均负载情况,一般平均负载值(Average Load)接近甚至超出 CPU cores (现在一般指 processors 的个数, 现在 CPU 的一个 core 一般有两个 processor, 可以处理两个进程) 时,系统会有性能瓶颈. 平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程. 造成平均负载升高的原因一般有以下几种: 1、有 IO Bound 进程(即存在 IO 密集型任务) 2、有 CPU Bound 进程(即存在 CPU 密集型任务) 3、处于就绪状态(Ready)的进程多 ….. 本篇文章主要记录下造成平均负载升高的两个场景. IO 密集型场景和 CPU 密集型场景. 这里的实验环境在一个操作系统为 Ubuntu 20.04.3 LTS 的容器内, 通过 stress 进行 IO Bound 与 CPU Bound 场景的模拟, 宿主机有 16 个 processors, 8G 运行内存. 123456789101112131415docker run --rm -it ubuntu:latestroot@bfdbc798879c:/# cat /etc/os-releaseNAME="Ubuntu"VERSION="20.04.3 LTS (Focal Fossa)"ID=ubuntuID_LIKE=debianPRETTY_NAME="Ubuntu 20.04.3 LTS"VERSION_ID="20.04"HOME_URL="https://www.ubuntu.com/"SUPPORT_URL="https://help.ubuntu.com/"BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"VERSION_CODENAME=focalUBUNTU_CODENAME=focal 123456789101112131415161718192021222324252627282930root@bfdbc798879c:/# toptop - 11:21:53 up 3:10, 0 users, load average: 0.66, 0.79, 0.46Tasks: 2 total, 1 running, 1 sleeping, 0 stopped, 0 zombie%Cpu0 : 1.0 us, 0.6 sy, 0.0 ni, 93.3 id, 0.0 wa, 0.0 hi, 5.1 si, 0.0 st%Cpu1 : 10.2 us, 0.3 sy, 0.0 ni, 88.1 id, 0.0 wa, 0.0 hi, 1.3 si, 0.0 st%Cpu2 : 10.4 us, 2.7 sy, 0.0 ni, 87.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu4 : 11.1 us, 0.7 sy, 0.0 ni, 88.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu5 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu6 : 0.7 us, 1.3 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu7 : 3.0 us, 0.0 sy, 0.0 ni, 97.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu8 : 0.3 us, 1.0 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu9 : 0.7 us, 0.0 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu10 : 0.0 us, 0.0 sy, 0.0 ni, 99.7 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu11 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu12 : 0.3 us, 0.3 sy, 0.0 ni, 99.0 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu13 : 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu14 : 10.7 us, 0.7 sy, 0.0 ni, 88.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu15 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stMiB Mem : 7829.4 total, 1913.4 free, 1582.2 used, 4333.7 buff/cacheMiB Swap: 2048.0 total, 2047.7 free, 0.3 used. 5582.8 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 4232 3504 2952 S 0.0 0.0 0:00.02 bash 12 root 20 0 6092 3332 2828 R 0.0 0.0 0:00.08 toproot@bfdbc798879c:/# free -mh total used free shared buff/cache availableMem: 7.6Gi 1.6Gi 1.8Gi 410Mi 4.3Gi 5.4GiSwap: 2.0Gi 0.0Ki 2.0Gi 让我们先安装一下 stress 压力测试工具和系统观测要用到的工具. 12apt-get updateapt-get install -y stress sysstat CPU Bound 场景这里我们让三个逻辑 CPU 满载: 12# 持续 10 min, 3 CPU 满载stress -c 3 -t 600 我们用 watch 命令持续观察平均负载情况, 平均负载在逐渐变高,此时我的电脑 CPU 风扇也很响了😂 1watch -d uptime 我们在使用 top 命令可以看到有三个 CPU 已经满载了,使用率百分百,还可以看到是哪个 COMMMAND 造成的, 但是上面不能很清楚的看到 IO 的情况,接下来我们用 mpstat 每隔 5 秒将所有 CPU 的观测情况打出来: 1mpstat -P ALL 5 可以很清楚的看到,的确有三个 CPU 的空闲状态为 0(满载),使用率百分百,且 IO Wait 等待时间是很低的,所以单单 CPU Bound 场景可造成 Average Load 的升高. 不使用 top 命令,使用 pidstat 每隔 5 秒, 三次打印进程的 CPU 情况可定位出是哪个进程造成的平均负载升高. 1234567root@bfdbc798879c:/# pidstat -u 5 3Linux 5.4.72-microsoft-standard-WSL2 (bfdbc798879c) 10/07/21 _x86_64_ (16 CPU)12:01:29 UID PID %usr %system %guest %wait %CPU CPU Command12:01:34 0 571 100.00 0.00 0.00 0.00 100.00 9 stress12:01:34 0 572 100.00 0.00 0.00 0.00 100.00 15 stress12:01:34 0 573 100.00 0.00 0.00 0.00 100.00 11 stress IO Bound 场景stress 压力工具也可以方便的进行 IO Bound 场景的模拟, 开始之前将上面 CPU Bound 场景给终止, 同样地, 我们先开好一个 Terminal 观察平均负载的变化: 1watch -d uptime 使用 strees 调起 50 个进程(这里要高于 CPU processors 的数量, 让进程争夺 CPU), 不断打 IO, 持续 10 min: 12root@bfdbc798879c:/# stress -i 50 -t 600stress: info: [1756] dispatching hogs: 0 cpu, 50 io, 0 vm, 0 hdd 可以观察到, 平均负载在不断升高, 再使用 mpstat 可以观测到 IO Wait 很高. 1mpstat -P ALL 5 可以 GET 到 IO Bound 任务的确会造成平均负载升高, 结合 iostat, 我们还可以观测磁盘设备的读写性能情况: 1iostat -d -x","categories":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/categories/Linux/"},{"name":"性能优化","slug":"Linux/性能优化","permalink":"https://yeshan333.github.io/categories/Linux/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/tags/Linux/"},{"name":"压力测试","slug":"压力测试","permalink":"https://yeshan333.github.io/tags/%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95/"},{"name":"CPU Bound","slug":"CPU-Bound","permalink":"https://yeshan333.github.io/tags/CPU-Bound/"},{"name":"IO Bound","slug":"IO-Bound","permalink":"https://yeshan333.github.io/tags/IO-Bound/"}]},{"title":"常用的 Linux 网络相关的命令","slug":"common-use-linux-network-command","date":"2021-09-25T16:34:52.000Z","updated":"2021-09-25T16:34:52.000Z","comments":true,"path":"2021/09/25/common-use-linux-network-command/","permalink":"https://yeshan333.github.io/2021/09/25/common-use-linux-network-command/","excerpt":"水文警告⚠😂,最近这些玩意用得多,微微记录一下,目前写的比较水,后面应该会补点实践经验🚩。","text":"水文警告⚠😂,最近这些玩意用得多,微微记录一下,目前写的比较水,后面应该会补点实践经验🚩。 netstatnetstat 一般用于查看 Socket 的使用情况。这命令在 Windows 下也可直接使用(但参数有一定的差异)。如使用 Ubuntu 需要安装 net-tools 12# ubuntu$ apt install net-tools 常用命令: 123456789101112131415161718# 1、查看 TCP Socket 情况,TCP 连接的状态$ netstat -atActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 0 172.25.239.216:51430 aerodent.canonical:http TIME_WAIT# 2、查看 TCP Socket 统计信息$ netstat -stTcp: 3 active connection openings 0 passive connection openings 0 failed connection attempts 0 connection resets received 0 connections established 248 segments received 195 segments sent out 5 segments retransmitted 0 bad segments received 0 resets sent 实践:在性能测试场景,我们可能需要观察 TCP 连接的状态、连接数等,我们可能会需要如下命令配合 grep 等命令对数据库连接、Web Service 连接状态问题进行排查: 1netstat -alnp ssss 的作用跟 netstat 很相似,但当服务器连接数非常多的时候,执行速度比 netstat 快很多,如果 man netstat 一下,netstat 的手册中也推荐使用 ss。 1234$ man netstatNOTES This program is mostly obsolete. Replacement for netstat is ss. Replacement for netstat -r is ip route. Replacement for netstat -i is ip -s link. Replacement for netstat -g is ip maddr. 常用命令: 12345678# 1、显示 TCP Socket 使用状况$ ss -t -aState Recv-Q Send-Q Local Address:Port Peer Address:PortESTABLISH 0 0 172.16.0.12:46148 13.229.188.59:https...# 2、列出所有打开的端口,配合 grep,可查看指定端口使用情况$ ss -pl | grep 8080 dig域名查询工具,一般用于查看主机 DNS 轮询解析状况。一般 Linux 系统都会自带这个命令。 12# 安装$ apt-get install dnsutils 常用: 1234567891011121314151617181920212223242526272829303132# 1、指定 DNS Server 查看域名 DNS 解析情况$ dig @8.8.8.8 shansan.top; <<>> DiG 9.16.1-Ubuntu <<>> @8.8.8.8 shansan.top; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44094;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 512;; QUESTION SECTION:;shansan.top. IN A;; ANSWER SECTION:shansan.top. 600 IN CNAME yeshan333.github.io.yeshan333.github.io. 3600 IN A 185.199.108.153yeshan333.github.io. 3600 IN A 185.199.109.153yeshan333.github.io. 3600 IN A 185.199.110.153yeshan333.github.io. 3600 IN A 185.199.111.153;; Query time: 160 msec;; SERVER: 8.8.8.8#53(8.8.8.8);; WHEN: Sat Sep 25 21:00:48 CST 2021;; MSG SIZE rcvd: 137# 2、查看指定 DNS 类型记录,如 CNAME$ dig shansan.top CNAME# 3、反向解析 IP 地址对应域名$ dig -x 8.8.8.8 +short nslookupnslookup 命令的作用和 dig 命令类似,在 Windows 下的 PowerShell & Linux 可以直接使用。 常用: 1234567# 1、指定 DNS Server 查询域名解析信息➜ nslookup shan333.cn f1g1ns1.dnspod.netServer: f1g1ns1.dnspod.netAddress: 61.151.180.44#53Name: shan333.cnAddress: 111.230.58.139 telnettelnet 可用于判断 TCP 端口是否可通。 12345➜ telnet github.com 22Trying 20.205.243.166...Connected to github.com.Escape character is '^]'.SSH-2.0-babeld-4f04c79d 与 telnet 作用差不多的有 netcat、nc。","categories":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/categories/Linux/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/tags/Linux/"}]},{"title":"基于 Docker 搭建一个最小化的 Prometheus Federation「联邦」集群","slug":"prometheus-federation","date":"2021-08-28T17:25:18.000Z","updated":"2021-08-28T17:25:18.000Z","comments":true,"path":"2021/08/28/prometheus-federation/","permalink":"https://yeshan333.github.io/2021/08/28/prometheus-federation/","excerpt":"一不小心就八月末了,我敲,最近大部分的时间都在了解 Prometheus,一直想“搂”篇文章出来,奈何一直在墨迹,是时候了,不然就九月了,完不成博客的 Flag 了,233333。 前言本篇文章主要介绍了 Promethues Federation 集群化机制 & 基于 Docker 搭建一个最小化的 Prometheus Federation 集群娱乐环境的相关操作。不是 Step By Step 的。","text":"一不小心就八月末了,我敲,最近大部分的时间都在了解 Prometheus,一直想“搂”篇文章出来,奈何一直在墨迹,是时候了,不然就九月了,完不成博客的 Flag 了,233333。 前言本篇文章主要介绍了 Promethues Federation 集群化机制 & 基于 Docker 搭建一个最小化的 Prometheus Federation 集群娱乐环境的相关操作。不是 Step By Step 的。 Prometheus先回顾一下 Prometheus 的各个生态组件,了解下它们各自承担的责任是是什么。基于下面一张来自 Prometheus 官方文档的架构 & 生态组件图做下简介: Prometheus targets(Jobs/exporters):提供监控 Metrics 的数据源,Prometheus 是基于拉(Pull-Based)模型的监控系统; Pushgateway:Metrics 推送网关,Prometheus 拉取 Metrics 是有时间间隔的,有时候一些短时任务(Short-lived jobs)没有等到 Prometheus 过来拉取其 Metrics 就没了,所以提供了一个这样的组件让 Jobs 主动推送 Metrics 到作为中介的 Pushgateway 组件; Prometheus Server:核心组件 Retrieval:Prometheus 的通过 yaml 配置文件进行配置的,可以配置 Prometheus 拉取 Metrics 的时间间隔,告警规则计算配置,爬取数据源配置等能力; TSDB:Prometheus 内置的本地存储时间序列数据库,该数据库经历了从原型到 V1 到现在 V2 版本的演进,做了许多的优化,想了解更多细节可以看看这篇文章 The Evolution of Prometheus Storage Layer;Exporters 是基于文本格式进行 Metrics 的暴露的, V2 版本Prometheus 放弃了原有的 Protocol Buffers 序列化协议,实现了 Text Decoder,优化了性能,官方对此更多的考虑可以看看这篇文档: protobuf_vs_text; HTTP Server:提供了与 TSDB 和 Prometheus 交互的 HTTP API,方便在更多的场景下做一些自定义操作; Service discovery:服务发现机制,Prometheus 内置了基于文本文件、DNS Server和 Consul 的服务发现机制(都可以在配置文件进行配置),规模化监控场景下,方便发现 Prometheus 的爬取对象进行 Metrics 拉取; Alertmanager:告警通知组件,提供了告警分组,告警抑制(Inhibit),告警静默(Silence),邮件通知,WebHook 等机制;值得注意的是 Prometheus Server 提供了告警规则的计算能力,但是通知并不由它完成,而是由 Alertmanager 完成。告警通知是个重活,并不简单。文章搞搞 Prometheus: Alertmanager 对 Alertmanager 进行了深层次的分析,可以微微看下; PromQL:Prometheus 提供的一个 DSL,同于用于时序数据的查询与聚合运算等操作,告警规则(Alerting Rules & Recording Rules)的计算也用到了 PromQL; Prometheus Web UI:Prometheus 自带的一个 Web UI,提供了许多的数据可视化能力,但其对可视化图表的支持有限,所以社区出现了 Grafana 可视化工具,其提供的 Dashboard 管理能力是很强大的,但仍然有缺点,比如这篇文章就说了一点 如何使 Grafana as code。 Federation 机制Pormetheus Federation(联邦)机制是 Promehteus 本身提供的一种集群化的扩展能力。当我们要监控的服务很多的时候,我们会部署很多的 Prometheus 节点分别 Pull 这些服务暴露的 Metrics,Federation 机制可以讲这些分别部署的 Prometheus 节点所获得的指标聚合起来,存放在一个中心点的 Prometheus。如下图: 在 Prometheus 的配置配置文件,调整如下字段即可使用 Federation 机制: 123456789101112131415161718192021scrape_configs: - job_name: 'federate' scrape_interval: 10s honor_labels: true metrics_path: '/federate' # 通过 match 参数,配置要拉取的 Metrics, # 不要 Pull full metrics params: 'match[]': - '{job="prometheus"}' - '{job="node"}' - '{job="blackbox"}' static_configs: # 其他 Prometheus 节点 - targets: - 'prometheus-follower-1:9090' - 'prometheus-follower-2:9090' 关于 Federation 联邦集群更多的讨论可以看看:别再乱用prometheus联邦了,分享一个multi_remote_read的方案来实现prometheus高可用 基于服务功能分区,我们可以通过 Federation 集群的特性在任务级别对 Prometheus 采集任务进行划分,以支持规模的扩展。 基于 Docker 搭建最小化的 Federation 集群上文微微 Recap 了一下 Prometheus「普罗米修斯」相关知识,现在回到最小化 Federation 的搭建,本次要搭建的一个最小化 Federation 集群(Architecture)如下图: 可以看到,这里我们使用了两个 Prometheus Follower Container 分别对 Node Exporter 和 Black Exporter 暴露的主机状态相关的 Metrics 和 网络状况相关的 Metrics 进行拉(Pull)取,然后通过一个中心的 Prometheus Leader 对上述指标进行聚合。我们还分别给 Leader 和 一个 Follower 部署了可视化面板 Grafana 用于查看 Metrics。Alertmanager 也通过容器化的方式启动。 告警的通知基于 WebHook,这里使用到了钉钉群机器人,配置了主机内存 & CPU 使用情况的告警,规则如下: 12345678910111213141516171819202122232425262728293031groups:- name: targets rules: - alert: monitor_service_down expr: up == 0 for: 30s labels: severity: critical annotations: summary: "Monitor service non-operational" description: "Service {{ $labels.instance }} is down."- name: host rules: - alert: high_cpu_load expr: node_load1 > 1.5 for: 30s labels: severity: warning annotations: summary: "Server under high load" description: "Docker host is under high load, the avg load 1m is at {{ $value}}. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}." - alert: high_memory_load expr: (sum(node_memory_MemTotal_bytes) - sum(node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) ) / sum(node_memory_MemTotal_bytes) * 100 > 45 for: 30s labels: severity: warning annotations: summary: "Server memory is almost full" description: "Docker host memory usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}." 我们通过 Docker Volume 挂载的方式讲 Prometheus 的配置文件和告警规则文件挂载到对应的识别路径;Grafana 的 Dashboard 与登陆相关的配置我们也基于此方式。Prometheus 的更多配置可参考 prometheus configuration:;Grafana 更多的配置参数可以参考:Grafana Provisioning。 Federation 集群的通信我们创建了一个 Docker Network「monitoring_network」。我们使用 Docker—Compose 进行容器的编排,编排文件内容如下: docker-compose.yml 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146version: '3.5'networks: monitoring_network:volumes: prometheus_leader_data: {} prometheus_follower_1_data: {} prometheus_follower_2_data: {} grafana_leader_data: {} grafana_follower_data: {}services: prometheus-leader: container_name: prometheus-leader image: prom/prometheus networks: - monitoring_network volumes: - ./configs/prometheus-leader/prometheus.yml:/etc/prometheus/prometheus.yml - ./configs/prometheus-leader/alerts/alert.rules:/etc/prometheus/alert.rules - prometheus_leader_data:/prometheus ports: - "9090:9090" command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' restart: unless-stopped prometheus-follower-1: container_name: prometheus-follower-1 image: prom/prometheus networks: - monitoring_network volumes: - ./configs/prometheus-follower-1/prometheus.yml:/etc/prometheus/prometheus.yml - ./configs/prometheus-follower-1/records/node_exporter_recording.rules:/etc/prometheus/node_exporter_recording.rules - ./configs/prometheus-follower-1/alerts/node_exporter_alert.rules:/etc/prometheus/node_exporter_alert.rules - prometheus_follower_1_data:/prometheus ports: - "9099:9090" command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' restart: unless-stopped prometheus-follower-2: container_name: prometheus-follower-2 image: prom/prometheus networks: - monitoring_network volumes: - ./configs/prometheus-follower-2/prometheus.yml:/etc/prometheus/prometheus.yml # - ./configs/prometheus-follower-2/records/node_exporter_recording.rules:/etc/prometheus/node_exporter_recording.rules # - ./configs/prometheus-follower-2/alerts/node_exporter_alert.rules:/etc/prometheus/node_exporter_alert.rules - prometheus_follower_2_data:/prometheus ports: - "9098:9090" command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' restart: unless-stopped grafana_leader: container_name: grafana_leader image: grafana/grafana networks: - monitoring_network volumes: - ./configs/grafana-leader/provisioning/dashboards:/etc/grafana/provisioning/dashboards - ./configs/grafana-leader/provisioning/datasources/config.yml:/etc/grafana/provisioning/datasources/config.yml - grafana_leader_data:/etc/grafana environment: - TERM=linux - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin123456 ports: - "3000:3000" restart: unless-stopped grafana_follower: container_name: grafana_follower image: grafana/grafana networks: - monitoring_network volumes: - ./configs/grafana-follower/provisioning/dashboards:/etc/grafana/provisioning/dashboards - ./configs/grafana-follower/provisioning/datasources/config.yml:/etc/grafana/provisioning/datasources/config.yml - grafana_follower_data:/etc/grafana environment: - TERM=linux - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin123456 ports: - "3001:3000" restart: unless-stopped node_exporter: image: quay.io/prometheus/node-exporter:latest container_name: node_exporter_stats networks: - monitoring_network ports: - "9100:9100" expose: - "9100" restart: unless-stopped blackbox_exporter: image: prom/blackbox-exporter container_name: blackbox_exporter networks: - monitoring_network ports: - "9115:9115" restart: unless-stopped alertmanager: image: prom/alertmanager container_name: alertmanager networks: - monitoring_network volumes: - ./configs/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml ports: - "9093:9093" restart: unless-stopped dingtalk-robot: image: timonwong/prometheus-webhook-dingtalk container_name: dingtalk-robot networks: - monitoring_network ports: - "8060:8060" volumes: - ./configs/dingtalk/config.yml:/etc/prometheus-webhook-dingtalk/config.yml restart: unless-stopped dingtalk 通知的配置参考了这篇文章:将钉钉接入 Prometheus AlertManager WebHook。 已经相关的配置文件和容器编排文件上传到了 GitHub,更多的配置细节可以到 GitHub 的项目仓库 yeshan333/prometheus-federation-minimal-demo 查看,也可将该项目 clone 到本地,跑一下看看: 1、git clone; 12git clone https://github.com/yeshan333/prometheus-federation-minimal-democd prometheus-federation-minimal-demo 2、更换钉钉机器人的 WebHook 地址,机器人配置的 Webhook 地址在 configs/dingtalk/config.yml 文件; 1vim configs/dingtalk/config.yml 123targets: webhook1: url: https://oapi.dingtalk.com/robot/send?access_token=<dingtalk-robaot-access-token> 3、通过 docker-compose 启动联邦集群,你可能需要安装 Docker & docker-compose,可参考:Get Docker; 1docker-compose up -d 4、期待的容器运行状况如下: 1234567891011$ docker-compose psNAME COMMAND SERVICE STATUS PORTSalertmanager "/bin/alertmanager -…" alertmanager running 0.0.0.0:9093->9093/tcp, :::9093->9093/tcpblackbox_exporter "/bin/blackbox_expor…" blackbox_exporter running 0.0.0.0:9115->9115/tcp, :::9115->9115/tcpdingtalk-robot "/bin/prometheus-web…" dingtalk-robot running 0.0.0.0:8060->8060/tcp, :::8060->8060/tcpgrafana_follower "/run.sh" grafana_follower running 0.0.0.0:3001->3000/tcp, :::3001->3000/tcpgrafana_leader "/run.sh" grafana_leader running 0.0.0.0:3000->3000/tcp, :::3000->3000/tcpnode_exporter_stats "/bin/node_exporter" node_exporter running 0.0.0.0:9100->9100/tcp, :::9100->9100/tcpprometheus-follower-1 "/bin/prometheus --c…" prometheus-follower-1 running 0.0.0.0:9099->9090/tcp, :::9099->9090/tcpprometheus-follower-2 "/bin/prometheus --c…" prometheus-follower-2 running 0.0.0.0:9098->9090/tcp, :::9098->9090/tcpprometheus-leader "/bin/prometheus --c…" prometheus-leader running 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp 5、查看 Grafana Leader:http://localhost:3000,Alertmanager UI:http://localhost:9093 End.","categories":[{"name":"Monitoring","slug":"Monitoring","permalink":"https://yeshan333.github.io/categories/Monitoring/"}],"tags":[{"name":"Prometheus","slug":"Prometheus","permalink":"https://yeshan333.github.io/tags/Prometheus/"},{"name":"Grafana","slug":"Grafana","permalink":"https://yeshan333.github.io/tags/Grafana/"},{"name":"Federation","slug":"Federation","permalink":"https://yeshan333.github.io/tags/Federation/"},{"name":"Docker","slug":"Docker","permalink":"https://yeshan333.github.io/tags/Docker/"},{"name":"Monitoring","slug":"Monitoring","permalink":"https://yeshan333.github.io/tags/Monitoring/"}]},{"title":"对下载软件/文件进行校验的工具(Checksum and GPG)","slug":"checksum-gpg-tools","date":"2021-07-10T18:23:57.000Z","updated":"2021-07-10T18:23:57.000Z","comments":true,"path":"2021/07/10/checksum-gpg-tools/","permalink":"https://yeshan333.github.io/2021/07/10/checksum-gpg-tools/","excerpt":"前言之前装软件一直都没有验证安装文件的习惯,信息安全意识不高,碰巧最近没啥事,微微写篇文章记录下校验工具(互联网http、https、ftp 服务并没有那么安全,是可以被劫持篡改。老装软件选手了,是该养成个校验文件的习惯了)。 在互联网下载软件/文件的时候经常会看到官方提供了一段⌈校验和(checksum)⌋或包含校验和的文件供校验。常见的校验和有 md5、SHA 家族等。还有部分软件/文件会提供 GPG 校验文件(signature file, SIG)给下载者进行校验。 来看看这两种校验方式相关的工具。","text":"前言之前装软件一直都没有验证安装文件的习惯,信息安全意识不高,碰巧最近没啥事,微微写篇文章记录下校验工具(互联网http、https、ftp 服务并没有那么安全,是可以被劫持篡改。老装软件选手了,是该养成个校验文件的习惯了)。 在互联网下载软件/文件的时候经常会看到官方提供了一段⌈校验和(checksum)⌋或包含校验和的文件供校验。常见的校验和有 md5、SHA 家族等。还有部分软件/文件会提供 GPG 校验文件(signature file, SIG)给下载者进行校验。 来看看这两种校验方式相关的工具。 校验和校验工具 校验和(英语:Checksum)是冗余校验的一种形式。 它是通过错误检测方法,对经过空间(如通信)或时间(如计算机存储)所传送数据的完整性进行检查的一种简单方法。 -来自维基百科 Windows CertUtilCertUtil 是 Windows 自带的文件校验和计算程序,我们可以通过它计算下载的软件/文件的 checksum 与官方提供的 checksum 作对比。 在 PowerShell 或 CMD 中可以执行 CertUtil -? 命令查看 CertUtil 支持的参数。CertUtil 的计算文件校验和命令的一般形式为 1CertUtil -hashfile <path to file> <hash algorithm> CertUtil 支持的校验和计算的哈希算法有 MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512 等。 1234567891011121314151617Usage: CertUtil [Options] -hashfile InFile [HashAlgorithm] Generate and display cryptographic hash over a fileOptions: -Unicode -- Write redirected output in Unicode -gmt -- Display times as GMT -seconds -- Display times with seconds and milliseconds -v -- Verbose operation -privatekey -- Display password and private key data -pin PIN -- Smart Card PIN -sid WELL_KNOWN_SID_TYPE -- Numeric SID 22 -- Local System 23 -- Local Service 24 -- Network ServiceHash algorithms: MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512 让我们看个例子,就装个 Go 吧(嘿嘿,最近在装系统,什么软件都没了),直接官方(https://golang.org/dl/)下载 Go 的安装程序,下载页面给出了 SHA256 Checksum。 Go 下载页 使用 Certutil 计算 go1.16.5.windows-amd64.msi 安装程序的校验和。 1CertUtil -hashfile go1.16.5.windows-amd64.msi SHA256 CertUtil 计算结果 CertUtil 计算结果(322dd8c585f37b62c9e603c84747b97a7a65b56fcef56b64e3021ccad90785b2)和下载页提供的校验和(322dd8c585f37b62c9e603c84747b97a7a65b56fcef56b64e3021ccad90785b2)比对,emmm,没毛病,微微放心安装了。 文档:microsoft windows-commands certutil Linux md5summd5sum 是大多数 Linux 系统都预装的校验 128 位 MD5 哈希值,用于检查文件完整性的校验和工具。 命令的一般形式如下,使用 md5sum --help 查看更多操作: 1md5sum <file-path or files-path> 输出格式一般示例如下(校验和 + 文件名) md5sum 计算校验和 部分软件下载时会拿到一个类似如下内容格式的 checksum 文件,姑且命名为 demo_hash.md5 12f4e81ade7d6f9fb342541152d08e7a97 .profile0f077c02d1303b89b9c5cb92e5d7d112 .bashrc 那么使用 md5sum 进行校验时可以这么操作,md5sum 会自动根据 demo_hash.md5 里面的文件逐个检查 md5: 123$ md5sum -c demo_hash.md5 # 加个 `-c` 参数.profile: OK.bashrc: OK 文档:md5sum-invocation GPG key 校验工具 GPG(GnuPG)是一个实现了 OpenPGP 标准的用于数据加密和数字签名的工具。 互联网上存在着部分软件/文件通过 GPG 密钥进行签名来证明其来源。GitHub 也有着一种使用 GPG 密钥来检验 Git Commit 来源可靠性的手段,如果可靠,会在前端页面 commit log 历史那里显示一个如下的小绿标: GitHub commit signature btw,之前微微写过一篇文章 -> 给 GitHub commit 加个小绿标。 使用 GPG key 进行软件/文件校验的一般步骤如下: step 1:获取软件/文件作者的公钥(public key),导入到 GPG key 管理器; step 2:根据作者的 gpg key 指纹(fingerprint)验证公钥(public key)的可靠性; step 3:根据软件/文件的签名文件(signature file,SIG)校验来源是否可靠。 Gpg4winGpg4win 是官方的 Windows GnuPG 发行版,全家桶软件,官网为 gpg4win.org。通过自带的 GUI 客户端 Kleopatra,我们可以很方便的完成文件的校验。直接官网下载安装即可 -> Download Page。 Kleopatra 这里我们以 Windows 下 Python 3.9.6 的安装为例,看下使用 Kleopatra 进行校验的过程是怎么样的 ⌈以下操作下载的文件均在同一个目录下⌋。 先到官方下载页release/python-396下载 Windows Python 3.9.6 的安装文件和对应的 GPG 密钥签名文件(sig): 安装文件和签名文件下载 12curl -sSlO https://www.python.org/ftp/python/3.9.6/python-3.9.6-amd64.execurl -O https://www.python.org/ftp/python/3.9.6/python-3.9.6-amd64.exe.asc 现在开始对着之前所的校验步骤操作一下。 Step 1:获取软件/文件作者的公钥(public key),导入到 GPG key 管理器; 从 https://www.python.org/downloads/ 页面大概四分之三的地方,我们可以看到之前下载的 Windows Banaries 的 release manager 是 Steve Dower,我们根据官网提供的链接获取公钥。 获取 Steve Dower 公钥keybase 上的公钥 下载公钥。 1curl -O https://keybase.io/stevedower/pgp_keys.asc 使用 Kleopatra 导入下载好的公钥 pgp_keys.asc。 导入公钥 Step 2:根据作者的 gpg key 指纹(fingerprint)验证公钥(public key)的可靠性; 验证指纹 导入的公钥指纹与提供的指纹一致,一般就无问题了。 Step 3:根据软件/文件的签名文件(signature file,SIG)校验来源是否可靠。 使用之前下载好的 signature file(python-3.9.6-amd64.exe.asc)进行校验,如下: SIG 校验 emmm,没问题。Good job! GnuPG(GPG)GnuPG 是之前提到的 Gpg4win 的后端,适合命令行选手。大部分 Linux 系统自带。下面我们在 WSL(Ubuntu-20.04)感受下。 这里我们以对 GnuPG(LTS) Tarball 的下载校验为例子。 123456mkdir gnupg_tarballcd gnupg_tarball# 下载 GnuPG(LTS) tarballcurl -O https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.2.29.tar.bz2# 下载校验文件curl -O https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.2.29.tar.bz2.sig Step 1:保存公钥,导入公钥。在 https://www.gnupg.org/signature_key.html 拿到作者的 signature key,保存到 gnupg-2.2.29.asc。 保存公钥 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667➜ cat>gnupg-2.2.29.asc<<EOF> -----BEGIN PGP PUBLIC KEY BLOCK----->> mQENBE0ti4EBCACqGtKlX9jI/enhlBdy2cyQP6Q7JoyxtaG6/ckAKWHYrqFTQk3I> Ue8TuDrGT742XFncG9PoMBfJDUNltIPgKFn8E9tYQqAOlpSA25bOb30cA2ADkrjg> jvDAH8cZ+fkIayWtObTxwqLfPivjFxEM//IdShFFVQj+QHmXYBJggWyEIil8Bje7> KRw6B5ucs4qSzp5VH4CqDr9PDnLD8lBGHk0x8jpwh4V/yEODJKATY0Vj00793L8u> qA35ZiyczUvvJSLYvf7STO943GswkxdAfqxXbYifiK2gjE/7SAmB+2jFxsonUDOB> 1BAY5s3FKqrkaxZr3BBjeuGGoCuiSX/cXRIhABEBAAG0Fldlcm5lciBLb2NoIChk> aXN0IHNpZymJAVUEEwEIAD8CGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAFiEE> 2GkhI8QGXepeDzq1JJs50k8l47YFAl4MxBkFCRShVzYACgkQJJs50k8l47YImQf9> HaqHWor+aSmaEwQnaAN0zRa4kPbAWya182aJtsFzLZJf6BbS0aoiMhwtREN/DMvB> jzxARKep/cELaM+mc7oDK4mEwqSX/u6BE8D7FaNA9sut8P+4xjpoLPU+UzILMg29> t1remjyT9rs6sbu8BqufIxueArkjoi4WCOSRiVTdw+YDd88volPkXlPfS8hg9Rct> wZ8kEEDywa+NrxiLx+kDgDNTNdk3PJdfcnesf8S1a+KLUTNRds5+xGTYz0JSQ9BZ> 7Q9r4VQ/NL55muQZi5W7lVxdp3HxQFUNjHzzBfGtkpS4xqZpJvNjW50Wh5Vi5RYZ> LZ3M1EuIHXHmRiY4dmqqcpkBDQRUUDsjAQgA5hBwN9F3OqKf+9mXCXUDK4lb5wMj> dti96xG04gAn7wWo7On6c5ntriZQuRdR5GHcdw73XC6CFehHeo/eSVYiWqBNBAfE> 9UzbkES+cY+4wDzqVacqhKxd70XmHQgyK7ppRG/MwkL1UyArCGGAKN6MV/2fzO6I> GQw3jntRue3/2PGGnGaisNAKlvttHWZ91uy4KY5fBM19uQCgZdx4v8/rP0+yQqsW> TwJUKvymx5GIfNaCJvgF+v+aPrwspxBMf9jpHXqDXnh4Lo8C/GsQMD6GClVfQjsv> vzUHKH2eoL4oNfku+Ua5BuAHYi+uAuzqV9TdpF9PCpQMyPfuuZclMPLdMwARAQAB> tDJOSUlCRSBZdXRha2EgKEdudVBHIFJlbGVhc2UgS2V5KSA8Z25paWJlQGZzaWou> b3JnPokBPAQTAQgAJgIbAwULBwgJAwQVCAkKBRYCAwEAAh4BAheABQJYDxRZBQkL> S5A2AAoJECBxsIozvT8GvG8IAMBIlGz9voYcSSXAdQOuvz2gM2kOjvMHzN6VlS9V> P06IjnTz2DnejFZwLmxJw8e8mZjUo0jw22uo1HREQhDrne3S1IazPMeTUCUNzpWF> MxXNc6SAyrw9apWa8gouGUWJv3HOwVs8EFA2E9UdtDJ2uG7MY/+eC5K/aeOAyudZ> EbvS8rgZypTFrBtBcNKUWZhz7FRn63HxEmYLE3p6I19ZDXrc1WTazF2oz18zym6c> uURr6waRbdSemUTshpLnKCBZXzJ82bXBgXNnfdmc3gtS24ZmM3ZfK/rYztEDkiTk> s2R1gwDwf5RtDpaf5LD2ufESdbLuT+8blAlscbgYLBcwDquZAY0EWMu6rgEMAKcz> vM1IhpUwBpxPCNdrlMZh7XeLqKUd7hUvQ1KHOuDONxCDnfXdxGCKKI0Ds5I7Kkyp> Wzvcl7PplRy2fYZWwcGtL+Kj01y4L2lXB/xrrVaVwRr4S0FrcbseUGYRafBpR0C1> Yo24CL1ef4ivsfbER2SyaZ3lrT9Ccv6xfvTluhU8X+2li1ssak/Frvy02u3EORLD> LxaaLQgANgsjnIjv/JQZ4l3xFIJT98tEoL18btg5lGrS2w4yFU1aa1SNsbp7vcu7> wsqcJmCzX98LyG8/IBGJ5JXmZ03yzWhZ3uhhy1+Avi4GV4Mi0ADwaGMp6O63Mc3w> SL8A/DoCKJLISOc+D5xNfw6C8sYlaOSzQfqY9l4HW/+QbJmEFL2+bnjSHb8yaVU3> ae2IIrlNkZ5Jamp12Kq6x9Vei0xGk3gd4sqhmHhECdxoJtkX9L5gt436QxdjiTcW> q3V+NNfq94UJu2Ej2kN0fNT0t9RU2n0P/mS0L+1gw5Ex6BX7BIzGL0bZhYomQwAR> AQABiQHOBB8BCAA4FiEEW4DFdUKY8MtV2O1qvO9+KUsJLigFAljLwN0XDIABlKXJco7CV2> oDwv5co7CV2OH99yPPRitrECBwAACgkQvO9+KUsJLig2Cgv/T4rXEjHwlbsuTkzp> tgK80Dh92URzBAhPhSJ0kUz2b6y7FgVYgZ95u8elGUS4lOB0GOQSK3y4sCgldTQF> GQpMuvNMX6oNQTv1Z/H9H7Sc6AntozKRA6LQC+7DMxjPh2DEhVLYNqi7gMXtuH8o> Xz5+quarw/xbVmuS4UNqcxakd4A/HW6PayRhuju4+oV2+UmGU0etzGVwKSN/UicC> 3Re3mUy8SwJFQ9/3EAfiY0SGzSWH1z7bTRg9Ga2ctYDNzUpyQsgLxD6ZRHcONkOoMEQ9> GUMEQ96BeSsjT4yW9ED70CcCbhg+pMxR+lnpk4BZ4WML/plBjEb8B1YaRvhYWKd3> OSVB/JsS6J6Q/y9TTsAJDBLAfw9h7RQKibViuVFSNftAuSdktah5mDwFnL0ZMzVS> 3tDVDa5PDqbHEhK55/5EWBg4eNbAukVZmmoLzzERGXuj+LOIRElG3/n3chy1uM73> B6da3al4gDDNHifPsuozpkVN1EAROZx1K9hGGDZC3yFQTjsJtCRBbmRyZSBIZWlu> ZWNrZSAoUmVsZWFzZSBTaWduaW5nIEtleSmJAdQEEwEIAD4WIQRbgMV1Qpjwy1XY> 7Wq8734pSwkuKAUCWMu6rgIbAwUJEswDAAULCQgHAgYVCAkKCwIEFgIDAQIeAQIX> gAAKCRC8734pSwkuKEL9DACEIL5IS9wUty62Bnwd9wK2hmwihXNkTLsOOoi8aCdO> ywPwcIucgAcIO+c/t0lbe4y4sJ1KrKbdyOUQiJAyxobLCSV/MkhIDAmsZB1ZIpF3> nfmNekRdCVcMpqX8jAwoBS3Q9m2UJz1LeDCLFCvLF0nbyUnqHZP19UOvxmzAyZMA> Ub3W5y1+GMo4yA+3xSFI8ZbjzhawixCCRs69/4p+zCXR4e7LBf6koAHllD/0ZULp> SDjF+t2IkvRrMlM+e+Mxjklinr8v1FRGzmE/kCcdHaP88+iwC2wUKOZtFs4yIBLO> SWdQk9tLPmR8uWgNZmatRJyNvOaxd6EbK3jfckbJGFkmXjH+M9vMqFpoAewZ359FUs7AX> qjq+Us7AXLAMNUynom7IrtR5Rvsjx6RNtKQYUD6XY5rc7r9js9iGruHDAAW5lyRg> j3wikc0IbV9L1bTsXIp29BsrU9sXUkVEp+xQJZgwqoOduoSjmOK88QdkibDqJiGF> dzIRiXx+Nxv1Pr9L7A4/tq+YMwRfQ+WJFgkrBgEEAdpHDwEBB0DPvkeV6RzXomGF> 8jQwp0RXEt2TGFwwI7RkbpYwECY2l7QfV2VybmVyIEtvY2ggKGRpc3Qgc2lnbmlu> ZyAyMDIwKYiaBBMWCgBCFiEEbapuZKdtKEBXG0kCUoiXuCZAOtoFAl9D7DUCGwMF> CRKFxxEFCwkIBwIDIgIBBhUKCQgLAgQWAgMBAh4HAheAAAoJEFKIl7gmQDraea4A> /24v8c50HSC/Basf4WlREkuzhudplo8iT0BGtTQRdGAmAP9gIZ8dBekg9PRlpe7A> l7ErThn6owVH9szWrUt6jkKOBg==> =h7e4> -----END PGP PUBLIC KEY BLOCK----->EOF 接下来导入公钥到 gpg。 1234567➜ cat gnupg-2.2.29.asc | gpg --importgpg: key 249B39D24F25E3B6: public key "Werner Koch (dist sig)" importedgpg: key 2071B08A33BD3F06: public key "NIIBE Yutaka (GnuPG Release Key) <gniibe@fsij.org>" importedgpg: key BCEF7E294B092E28: public key "Andre Heinecke (Release Signing Key)" importedgpg: key 528897B826403ADA: public key "Werner Koch (dist signing 2020)" importedgpg: Total number processed: 4gpg: imported: 4 Step 2:查看导入的公钥的指纹是否与官网上公布的一致 12345678➜ gpg --list-keys --keyid-format=long Werner Kochpub rsa2048/249B39D24F25E3B6 2011-01-12 [SC] [expires: 2021-12-31] D8692123C4065DEA5E0F3AB5249B39D24F25E3B6uid [ unknown] Werner Koch (dist sig)pub ed25519/528897B826403ADA 2020-08-24 [SC] [expires: 2030-06-30] 6DAA6E64A76D2840571B4902528897B826403ADAuid [ unknown] Werner Koch (dist signing 2020) 如果一致的话,信任此公钥。 123456789101112131415161718192021222324252627➜ gpg --edit-key D8692123C4065DEA5E0F3AB5249B39D24F25E3B6gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.pub rsa2048/249B39D24F25E3B6 created: 2011-01-12 expires: 2021-12-31 usage: SC trust: unknown validity: unknown[ unknown] (1). Werner Koch (dist sig)gpg> signpub rsa2048/249B39D24F25E3B6 created: 2011-01-12 expires: 2021-12-31 usage: SC trust: unknown validity: unknown Primary key fingerprint: D869 2123 C406 5DEA 5E0F 3AB5 249B 39D2 4F25 E3B6 Werner Koch (dist sig)This key is due to expire on 2021-12-31.Are you sure that you want to sign this key with yourkey "yeshan333 <1329441308@qq.com>" (582AAB66132A3FDA)Really sign? (y/N) ygpg> save 这玩意还需要一个指纹 sign 公钥,可通过下面的命令快速操作 1gpg --lsign-key "6DAA6E64A76D2840571B4902528897B826403ADA" Signing a key tells your software that you trust the key that you have been provided with and that you have verified that it is associated with the person in question. Step 3:使用 signature file 校验 Tarball 12345678910➜ gpg --verify gnupg-2.2.29.tar.bz2.siggpg: assuming signed data in 'gnupg-2.2.29.tar.bz2'gpg: Signature made Sun Jul 4 22:54:50 2021 CSTgpg: using EDDSA key 6DAA6E64A76D2840571B4902528897B826403ADAgpg: checking the trustdbgpg: marginals needed: 3 completes needed: 1 trust model: pgpgpg: depth: 0 valid: 2 signed: 2 trust: 0-, 0q, 0n, 0m, 0f, 2ugpg: depth: 1 valid: 2 signed: 0 trust: 2-, 0q, 0n, 0m, 0f, 0ugpg: next trustdb check due at 2021-12-31gpg: Good signature from "Werner Koch (dist signing 2020)" [full] emmm,问题不大。这里有一丢丢问号❓What is the exact meaning of this gpg output regarding trust? 微微提升下信任水平 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495➜ gpg --edit-key 6DAA6E64A76D2840571B4902528897B826403ADA D8692123C4065DEA5E0F3AB5249B39D24F25E3B6gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.pub ed25519/528897B826403ADA created: 2020-08-24 expires: 2030-06-30 usage: SC trust: undefined validity: full[ full ] (1). Werner Koch (dist signing 2020)Invalid command (try "help")gpg> trustpub ed25519/528897B826403ADA created: 2020-08-24 expires: 2030-06-30 usage: SC trust: undefined validity: full[ full ] (1). Werner Koch (dist signing 2020)Please decide how far you trust this user to correctly verify other users' keys(by looking at passports, checking fingerprints from different sources, etc.) 1 = I don't know or won't say 2 = I do NOT trust 3 = I trust marginally 4 = I trust fully 5 = I trust ultimately m = back to the main menuYour decision? 4pub ed25519/528897B826403ADA created: 2020-08-24 expires: 2030-06-30 usage: SC trust: full validity: full[ full ] (1). Werner Koch (dist signing 2020)Please note that the shown key validity is not necessarily correctunless you restart the program.gpg> saveKey not changed so no update needed.➜ gpg --edit-key D8692123C4065DEA5E0F3AB5249B39D24F25E3B6gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.gpg: checking the trustdbgpg: marginals needed: 3 completes needed: 1 trust model: pgpgpg: depth: 0 valid: 2 signed: 2 trust: 0-, 0q, 0n, 0m, 0f, 2ugpg: depth: 1 valid: 2 signed: 0 trust: 0-, 1q, 0n, 0m, 1f, 0ugpg: next trustdb check due at 2021-12-31pub rsa2048/249B39D24F25E3B6 created: 2011-01-12 expires: 2021-12-31 usage: SC trust: undefined validity: full[ full ] (1). Werner Koch (dist sig)gpg> trustpub rsa2048/249B39D24F25E3B6 created: 2011-01-12 expires: 2021-12-31 usage: SC trust: undefined validity: full[ full ] (1). Werner Koch (dist sig)Please decide how far you trust this user to correctly verify other users' keys(by looking at passports, checking fingerprints from different sources, etc.) 1 = I don't know or won't say 2 = I do NOT trust 3 = I trust marginally 4 = I trust fully 5 = I trust ultimately m = back to the main menuYour decision? 4pub rsa2048/249B39D24F25E3B6 created: 2011-01-12 expires: 2021-12-31 usage: SC trust: full validity: full[ full ] (1). Werner Koch (dist sig)Please note that the shown key validity is not necessarily correctunless you restart the program.gpg> save➜ gpg --verify gnupg-2.2.29.tar.bz2.siggpg: assuming signed data in 'gnupg-2.2.29.tar.bz2'gpg: Signature made Sun Jul 4 22:54:50 2021 CSTgpg: using EDDSA key 6DAA6E64A76D2840571B4902528897B826403ADAgpg: checking the trustdbgpg: marginals needed: 3 completes needed: 1 trust model: pgpgpg: depth: 0 valid: 2 signed: 2 trust: 0-, 0q, 0n, 0m, 0f, 2ugpg: depth: 1 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 2f, 0ugpg: next trustdb check due at 2021-12-31gpg: Good signature from "Werner Koch (dist signing 2020)" [full] 更多 GPG Key 校验工具查看 GnuPG 主页:https://www.gnupg.org/download/index.html","categories":[{"name":"Cryptography","slug":"Cryptography","permalink":"https://yeshan333.github.io/categories/Cryptography/"}],"tags":[{"name":"MD5","slug":"MD5","permalink":"https://yeshan333.github.io/tags/MD5/"},{"name":"GPG","slug":"GPG","permalink":"https://yeshan333.github.io/tags/GPG/"}]},{"title":"使用 osmosfeed 创建自己的 Web RSS 阅读器","slug":"osmosfeed-rss-reader","date":"2021-06-29T15:34:20.000Z","updated":"2021-06-29T15:34:20.000Z","comments":true,"path":"2021/06/29/osmosfeed-rss-reader/","permalink":"https://yeshan333.github.io/2021/06/29/osmosfeed-rss-reader/","excerpt":"之前一直用 App Store 上的一个 RSS 阅读器 RSS Reader Prime 订阅技术周刊和 dalao 的技术博客,不得不说挺好用的,奈何全线下架了,现在就平板上保留着这个 App,手机上没有(国区好用的 RSS 阅读器基本无了)。有时候又想着用手机读读技术文章(板子太大,不好拿),于是乎翻了下 GitHub rss-reader topic 下的相关阅读器项目,挑了手基于 Web 和 GitHub Pages 的 RSS 阅读器(Web 才是真的“跨端”,2333~),水篇文章微微记录下。","text":"之前一直用 App Store 上的一个 RSS 阅读器 RSS Reader Prime 订阅技术周刊和 dalao 的技术博客,不得不说挺好用的,奈何全线下架了,现在就平板上保留着这个 App,手机上没有(国区好用的 RSS 阅读器基本无了)。有时候又想着用手机读读技术文章(板子太大,不好拿),于是乎翻了下 GitHub rss-reader topic 下的相关阅读器项目,挑了手基于 Web 和 GitHub Pages 的 RSS 阅读器(Web 才是真的“跨端”,2333~),水篇文章微微记录下。 什么是 RSS RSS, Really Simple Syndication. 一种描述和同步网站内容的 XML 格式,一般网站都会提供 RSS,有利于让用户通过 RSS Feed(RSS源,一般即为站点的RSS地址) 获取网站内容的最新更新。 更多关于 RSS 的内容在 GitHub 上有个名为 ALL-about-RSS 的项目有介绍。 使用 osmosfeed 搭建 Web-based RSS 阅读器osmosfeed 是 GitHub 上开源的一个 RSS Web 版阅读器,可以使用 GitHub Pages 托管,主题可自定义。 1、首先根据 osmosfeed 的模板仓 osmosfeed-template 新建个人仓库。 戳此链接使用模板仓库:https://github.com/osmoscraft/osmosfeed-template/generate 通过模板库新建个人公共仓库 2、仓库建好后,GitHub Actions 会自动触发 RSS Web Reader 构建的 actionBuild site on schedule or main branch update,构建产物将会被推送到仓库的 gh-pages 分支。 3、最近 GitHub 更新了波,GitHub Pages 的开启有了新的选项卡,仓库顶部 Settings -> 左侧边栏 Pages,调整发布源分支gh-pages,反手一个 Save 就好了。 开启仓库 Pages,源分支为 gh-pages 4、订阅源可直接编辑根目录下的 osmosfeed.yaml 文件,反手把自己博客订阅上👻😎。preview: https://shansan.top/osmosfeed-rss-reader/ 1234# cacheUrl: https://GITHUB_USERNAME.github.io/REPO_NAME/cache.jsonsources: - href: https://github.com/osmoscraft/osmosfeed/releases.atom # Get new feature announcement via this feed - href: https://shansan.top/rss2.xml action 在没有对仓库 main 分支变动的情况下,会每天自动触发一次。 action schedule, crontab.guru 更多操作可参考 osmosfeed 项目的 README:https://github.com/osmoscraft/osmosfeed","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"},{"name":"RSS","slug":"RSS","permalink":"https://yeshan333.github.io/categories/RSS/"}],"tags":[{"name":"RSS Reader","slug":"RSS-Reader","permalink":"https://yeshan333.github.io/tags/RSS-Reader/"}]},{"title":"热传导方程非特征 Cauchy 问题的一些笔记","slug":"heat-conduction-equation","date":"2021-05-16T15:14:31.000Z","updated":"2021-05-16T15:14:31.000Z","comments":true,"path":"2021/05/16/heat-conduction-equation/","permalink":"https://yeshan333.github.io/2021/05/16/heat-conduction-equation/","excerpt":"毕设工作即将结束之际,附上一份笔记到博客-数学物理方程-热传导方程.","text":"毕设工作即将结束之际,附上一份笔记到博客-数学物理方程-热传导方程. 反问题与不适定问题反问题描述note quote 一对问题称为是互逆的 不适定问题的三个判断标准 问题的解是存在的; 问题的解是唯一的; 问题的解是稳定的; 该概念由现法国科学院院士 J.Hadamard 在耶鲁大学提出. 适定(well-posed)问题 & 不适定(ill-posed)问题. $$ Ax=y, A: X \\rightarrow Y 的线性紧算子 $$ 1、解的存在性:$ \\forall y \\in Y, \\exist x \\in X, $ 使得 $ Ax=y. $2、解的唯一性:$ \\forall y_1, y_2 \\in Y, y_1 \\neq y_2, $ 有 $ Ax_1=y_1, Ax_2=y_2, $ 使得 $ x_1 \\neq x_2. $3、解的稳定性(即解的连续性):若有 $ Ax_1=y_1, Ax_2=y_2, $ 则当 $ y_1 \\rightarrow y_2 $ 时, 使得 $ x_1 \\rightarrow x_2. $ note info 当定解条件(初值条件,边界条件)以及方程中的系数有微小变动时,相应的解也只有微小变动. 解的稳定性也称为解关于参数的连续依赖性. 微分方程 微分方程:包含导数的方程,常用于描述现实事物的变化. 微积分学是一门研究变化的学问. 微分应用包括对速度、加速度、曲线斜率、最优化等的计算. 微分方程的定解条件:即初值条件和边界条件; 三类边界条件 第一类:狄利克雷边界条件(Dirichlet boundary condition)也被称为常微分方程或偏微分方程的“第一类边界条件”,指定微分方程的解在边界处的值. 求出这样的方程的解的问题被称为狄利克雷问题. 第二类:诺伊曼边界条件(Neumann boundary condition) 也被称为常微分方程或偏微分方程的“第二类边界条件”. 诺伊曼边界条件指定了微分方程的解在边界处的微分. 第三类:Robbin条件/混合边界条件,未知函数在边界上的函数值和外法向导数的线性组合. 偏微分方程三大问题 初边值问题或混合问题:偏微分方程 + 初值条件 + 边界条件; 初值问题或 Cauchy 问题:偏微分方程 + 初值条件; 边值问题:偏微分方程 + 边界条件; 方程式与方程组 方程式:方程个数为 1; 方程组:方程个数大于 1; 欠定与超定 欠定:方程个数少于未知函数个数; 超定:方程个数多于未知函数个数; 方程(组)中出现的未知函数的最高阶偏导数的阶数称为方程(组)的阶数. 数学物理微分方程反问题的分类文献[1]根据以下一般形式的微分方程组,给出了数学物理反问题的五大分类. 其中 $ u(x,t) $ 为微分方程组的解;$ L, I, B, A $ 分别是微分算子,初始算子,边界算子和附加算子. $ \\Omega $ 为求解区域,$ \\partial \\Omega $ 为求解区域的边界. $ \\partial \\Omega^{\\prime} $ 为 $ \\Omega $ 的一部分. $ f(x,t) $ 为方程的右端项,$ \\varphi(x), \\psi(x,t), k(x,t) $ 分别为初始条件、边界条件和附加条件. 上述任一已量变为未知量,即为微分方程反问题. 参数识别问题:算子 $ L $ 未知(通常 $ L $ 的结构是已知的,未知的为算子中的参数); 寻源反问题:右端方程源项 $ f(x,t) $ 未知; 逆时反问题:$ \\varphi(x) $ 条件未知时,附加条件为系统某一时刻的状态,该反问题从后面的状态去确定初始状态; 边界控制问题:边界条件 $ \\psi(x,t) $ 未知; 几何反问题:区域边界 $ \\partial \\Omega $ 未知; 反问题通常是不适定的,即初始条件上的一个微小的扰动,将导致结果的巨大变化. 克服反问题不适定性是比较棘手的,这也是反问题研究的重要课题. 随机微分方程解的爆破:在大多数时间里,解是有解的。但存在某一时间点,解趋于 $ \\infty $. 任何一个物理现象都是处在特定条件下的. 关于反问题的更多描述 关于反问题的一个比较适用的数学定义是“由定解问题的解的部分信息去求定解问题中的未知成分”. 有效反问题的数值算法以正问题的高精度解法为基础.反问题的不适定性主要表现在两个方面: 一方面,由于客观条件限制的输入数据(即给定的解的部分已知信息)往往是欠定的或者是超定的,这就导致解的不唯一性或者是解的不存在性; 另一方面,反问题的解对输入数据往往不具有连续依赖性。由于输入数据中不可避免的测量误差,人们就必须提出由扰动数据求反问题在一定意义下近似解的稳定的方法. 因此,反问题和不适定问题是紧密联系在一起的.定解条件都是通过测量和统计而得到的,在测量和统计的过程中误差总是难免的,同时在建立数学模型的过程中也多次用了近似. 如果解的稳定性不成立,那么所建立的定解问题就失去了实际意义. 如果一个定解问题的适定性不成立,就要对定解问题作进一步地修改,直到它具有适定性[3]. 热传导方程 Direct heat conduction problems (DHCPs) 直接热传导问题, Inverse heat conduction problem (IHCPs) 逆热传导问题 热传导正/反问题 热传导反问题:在热交换情形下,通过研究物体内部或边界的一点或多点温度分布信息来反演热源项、初始条件、边界条件、物理的几何条件等未知量. 热传导方程非特征 Cauchy 问题的[4]:典型的热传导方程的非特征Cauchy问题是通过一部分边界上的或者内部的数据来判定另一部分边界的热流. 一维热传导方程初边值问题有限域上边界条件为第一类 Dirichlet 边界条件的数学模型: 求解区域: 处理热传导方程非特征 Cauchy 问题的相关方法基本解方法基本解方法(the method of fundamental solutions, MFS)使用微分算子的基本解去近似数值解. 热传导方程非特征 Cauchy 问题使用基本解方求解时,数值近似解由以下基本解的线性组合得到[5]: $$\\begin{array}{c}\\tilde{u}(x) = \\sum_{i = 1}^{N} a_{i} u^{*}\\left(x-\\mu_{i}\\right)\\end{array}$$ 待定系数 $ a_{i} $ 通过对求解区域边界和虚边界进行配置点配置得到. 基本解方法是一种无网格的径向基函数类方法. 因 Cauchy 问题的不适定性,基本解方法所得到的线性系统是高度病态的,常规方法求解已没有意义. 需要使用正则化方法处理线性系统的病态性. 正则化方法 正则化方法求解不适定问题的本质是, 对问题的解进行一定的限制, 考虑一个近似的适定问题来保证原问题近似解的稳定性. Tikhonov 正则化方法 正则化参数 $ \\alpha $ 的选取. 确定式方法 偏差原则 拟最优方法 启发式方法 广义交叉核式 L-曲线法则 参考 [1] 张智倍. 热传导方程反问题的若干方法研究[D]. 哈尔滨: 哈尔滨工业大学, 2010. [2] 臧顺全. 热传导方程正问题和反问题的数值解研究[D]. 西安: 西安理工大学, 2019. [3] 王明新. 数学物理方程[M]. 清华大学出版社, 2005: 1-171. [4] 贾现正. 热传导方程中的若干反问题[D]. 上海: 复旦大学, 2005. [5] 金邦梯. 一类椭圆型偏微分方程反问题的无网格方法[D]. 杭州: 浙江大学, 2005.","categories":[{"name":"math","slug":"math","permalink":"https://yeshan333.github.io/categories/math/"}],"tags":[{"name":"math","slug":"math","permalink":"https://yeshan333.github.io/tags/math/"}]},{"title":"简单了解波 Mono-repo & Multi-repo(Poly-repo)","slug":"term-monorepo-multirepo","date":"2021-04-30T23:30:00.000Z","updated":"2021-04-30T23:30:00.000Z","comments":true,"path":"2021/04/30/term-monorepo-multirepo/","permalink":"https://yeshan333.github.io/2021/04/30/term-monorepo-multirepo/","excerpt":"Mono-repo 和 Multi-repo 是软件开发中代码管理的两个不同策略。Mono-repo & Multi-repo 孰优孰劣是个老生常谈得话题了,这里就不 PK 了,“略微”看下两者区别。 当我们使用 Git 作为版本控制系统管理项目的代码时,那么 monorepo 与 multirepo 的定义表述如下: monorepo,使用一个 Git 仓库管理项目相关的多个 模块/包/功能/应用。 multirepo(又称为 polyrepo),使用多个 Git 仓库分别管理项目的每一个 模块/包/功能/应用。","text":"Mono-repo 和 Multi-repo 是软件开发中代码管理的两个不同策略。Mono-repo & Multi-repo 孰优孰劣是个老生常谈得话题了,这里就不 PK 了,“略微”看下两者区别。 当我们使用 Git 作为版本控制系统管理项目的代码时,那么 monorepo 与 multirepo 的定义表述如下: monorepo,使用一个 Git 仓库管理项目相关的多个 模块/包/功能/应用。 multirepo(又称为 polyrepo),使用多个 Git 仓库分别管理项目的每一个 模块/包/功能/应用。 Monorepo 的应用实例GitHub 有很多的使用 Monorepo 风格管理代码的开源项目,比如大名鼎鼎的 Babel,项目结构如下图: Babel GitHub Repo packages 目录下存放了很多个 Babel 相关的子项目。 googles-monorepo-demo给出了一个基于 Maven 构建工具的 Google 风格的 Monorepo 项目。 还有大佬给出了有 CI/CD pipeline 基于 Java, Maven, GitHub Actions 的 Demo 👉 monorepo-maven-example。 monorepo-maven-example-with-github-actions 使用工具快速搭建 Monorepo 风格的项目现今,有许多可以创建 Monorepo 风格项目的工具,在前端社区有 Lerna、Nx、Rush Stack、Yarn Workspaces 等,还有许多其它的构建工具可以用于创建 Monorepo 风格的项目,见项目 -> awesome-monorepo。这里让我们看看通过 Nx 创建的 Monorepo 风格的项目是怎么样的: Nx create project medium 上有篇文章简述了 11 种不同 Monorepo 构建工具的特点:11 Great Tools for a Monorepo in 2021 一图看 Monorepo 和 Multirepo 的区别这里我们用一张图来看下使用 Git 管理多个 package 时,Monorepo 和 Multirepo(Polyrepo) 的区别: Monorepo & Multirepo(Polyrepo) Don’t say so much. 就这样了🤨🕊️,又水了一篇文章。","categories":[{"name":"Architecture","slug":"Architecture","permalink":"https://yeshan333.github.io/categories/Architecture/"}],"tags":[{"name":"项目管理","slug":"项目管理","permalink":"https://yeshan333.github.io/tags/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/"},{"name":"Monorepo","slug":"Monorepo","permalink":"https://yeshan333.github.io/tags/Monorepo/"}]},{"title":"Windows Insiders WSLg Linux GUI App 支持尝鲜","slug":"enjoy-wslg","date":"2021-04-25T18:59:48.000Z","updated":"2021-04-25T18:59:48.000Z","comments":true,"path":"2021/04/25/enjoy-wslg/","permalink":"https://yeshan333.github.io/2021/04/25/enjoy-wslg/","excerpt":"2021 年 4 月 21 日,微软在 Developer Blogs 发布了 Windows 预览版 WSL(Windows Linux 子系统) 对 Linux GUI App 的支持的公告🔗,碰巧😀我最近重装了波电脑,系统换成了 Windows Insiders(Dev),正好可以感受波 Linux GUI App 的支持。btw,预览版的文件管理器支持访问 WSL 的文件了,6~ 的。 Windows new icons WSL 现在居然支持跑 Linux 图形应用了,真香(😎,虽然上一年 WSL 的 Roadmap 中有说过要支持,但我没关注,老二手知识党了)。Quickstart ->","text":"2021 年 4 月 21 日,微软在 Developer Blogs 发布了 Windows 预览版 WSL(Windows Linux 子系统) 对 Linux GUI App 的支持的公告🔗,碰巧😀我最近重装了波电脑,系统换成了 Windows Insiders(Dev),正好可以感受波 Linux GUI App 的支持。btw,预览版的文件管理器支持访问 WSL 的文件了,6~ 的。 Windows new icons WSL 现在居然支持跑 Linux 图形应用了,真香(😎,虽然上一年 WSL 的 Roadmap 中有说过要支持,但我没关注,老二手知识党了)。Quickstart -> WSLg 的架构WSLg 是支持 Windows 运行 Linux 图形应用的核心项目, Windows Subsystem for Linux GUI 的简写,看了眼 Git commit,8 天前开源的,🐂。README 里面有张 WSLg 的架构图,略微操作下帖到这里: WSLg Architecture 扫了眼,只有 RDP 和 X11 有点印象,这个 Wayland 在最近关于 Ubuntu 21.04 的新闻有看到过,具体原理这里就不了解了,骚就完事了,先跑个 Linux GUI App 感受波。 已有微软大佬对 WSLg 的架构做了详细的介绍,参见文章:WSLg Architecture Windows Insiders Dev 跑下 Linux GUI App这里又到了经典的环境配置环节(干啥啥不行,老装环境选手了)。不得不说,Windows 系统换成 Insiders 版本真香,WSL 安装一句命令就完事了。虽然又碰到了许久未见到的经典蓝屏问题,但还是阔以接受的,我 giao。 看波 WSLg 的 README,配下环境,操作系统版本要 21362+,还得微微更新波🤨: Upgrade Windows System Sometime later………………. Windows insiders version OK,可以操作了,之前我已经安装过 WSL,且切换到了 v2 版本,so,按照 README 所说,只需要进行如下操作即可。 以 Administrator 身份启动 Powershell 执行以下命令: 1234# 1、重启下 WSLwsl --shutdown# 2、Updatewsl --update WSL Update 然后随意装个 GUI App 感受下,装个 gedit 吧: 123# Nautilus 文件管理器,可在 Windows 开始菜单启动 Linux GUI Appsudo apt install nautilus -ysudo apt install gedit -y Windows Desktop Gedit 还阔以,虽然我是“命令行仔”了,但时不时用下 GUI App 还是香的。","categories":[{"name":"WSL","slug":"WSL","permalink":"https://yeshan333.github.io/categories/WSL/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/tags/Linux/"},{"name":"WSL","slug":"WSL","permalink":"https://yeshan333.github.io/tags/WSL/"},{"name":"GUI","slug":"GUI","permalink":"https://yeshan333.github.io/tags/GUI/"}]},{"title":"初探 Git Submodules","slug":"git-submodules","date":"2021-03-10T15:51:15.000Z","updated":"2021-03-10T15:51:15.000Z","comments":true,"path":"2021/03/10/git-submodules/","permalink":"https://yeshan333.github.io/2021/03/10/git-submodules/","excerpt":"之前一直想将一个 Git 仓库放到另一个 Git 仓库,有 Maven 多模块项目(Maven Multimodule Project)和 Gradle 多项目构建(Gradle Multiproject Build)那味儿。Git 这么骚,肯定也可以。“扫”了多个开源仓库,Get 到了 Git submodule 可以做这种操作,水篇文章记录波。","text":"之前一直想将一个 Git 仓库放到另一个 Git 仓库,有 Maven 多模块项目(Maven Multimodule Project)和 Gradle 多项目构建(Gradle Multiproject Build)那味儿。Git 这么骚,肯定也可以。“扫”了多个开源仓库,Get 到了 Git submodule 可以做这种操作,水篇文章记录波。 没有使用 Git Submodules 之前没有使用 submodule 之前,如果在一个 Git 项目追踪另一个 Git 项目,会报一个 warning「我敲,有暗示用 submodule,之前没注意」,操作如下: 1234mkdir git-submodulecd git-submodulegit initgit clone https://github.com/volantis-x/hexo-theme-volantis --depth 1 执行 git add hexo-theme-volantis,会出现如下 warning(adding embedded git repository): 追踪执行结果 然后使用 git status 查看,虽然 git add 成功了,但是并没有成功 add 到 hexo-theme-volantis 里面的内容。提示也说了(will not contain the contents of the embedded repository),提交到 GitHub 后,显示结果如下, folder 戳也戳不开。 push to GitHub 可以明显的看到,并不能保证 子目录/文件 的完整性。就我之前如果想在一个 Git 项目保留另一个 Git 项目,那么我只能将一个项目的 Git 版本库去掉,从后续的使用感受来看,此后我追踪另一个项目的更新会有点麻烦。从 yeshan333/actions-for-hexo-blog 项目的对 volantis 项目追踪的历史commit@3ce9316 可以看得出来 Git Submodules 的作用是时候该见识 submodule 的作用了,从官方文档可以看到,它可以解决之前上面提到的一些问题。略微概括下就是: Git的 submodule 可以将一个 Git 版本库作为一个子目录保存在另一个 Git 版本库中,并可以保留两个版本库之间 commit 的分离,保持父项目和子项目相互独立,实现更为精确的版本控制。 Git Submodules 的本质拿 actions-for-hexo-blog 项目来实践感受下 submodule。操作如下: 12git clone git@github.com:yeshan333/actions-for-hexo-blog.git && cd actions-for-hexo-bloggit submodule add git@github.com:volantis-x/hexo-theme-volantis.git themes/volantis 执行上述命令之后,会看到当前项目下生成了个 .gitmodules 文件,内容如下: 123[submodule "themes/volantis"] path = themes/volantis url = git@github.com:volantis-x/hexo-theme-volantis.git 同时,.git/config 文件也会被追加写入如下内容: 123[submodule "themes/volantis"] url = git@github.com:volantis-x/hexo-theme-volantis.git active = true 再看看 theme/volantis 目录,发现该项目的 Git 版本库不见了,之前提到 git submodule 可以保留两个版本库之间 commit 的分离,那么项目 volantis 的版本库放哪了?摸索下当前项目的版本库可以看到被放在了 .git/modules/themes/volantis 下。尝试提交到 GitHub 看看。 GitHub 提交结果 emm……,收工,目录名显示多个 commit 引用,可以进行跳转。 更多操作 与 submodule 类似的 subtree:Git Submodules vs Git Subtrees 子模块更新:git submodule update submodule 最佳实践 12345# 子模块删除- 删除.gitsubmodule文件中子模块的相关字段;- 删除.git/config文件中子模块的相关字段;- 删除模块目录:- git rm --cached <submodule-path>","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"}]},{"title":"使用 rsync-deploy-action 同步 Hexo 博客到个人服务器","slug":"hexo-blog-synchronization-with-rsync","date":"2021-01-19T20:02:51.000Z","updated":"2021-01-19T20:02:51.000Z","comments":true,"path":"2021/01/19/hexo-blog-synchronization-with-rsync/","permalink":"https://yeshan333.github.io/2021/01/19/hexo-blog-synchronization-with-rsync/","excerpt":"前几天写了个基于 rsync 进行文件同步的 Action -> rsync-deploy-action。目的有三个: 1、深入了解波 GitHub Actions,感受下 GitHub 的文档; 2、个人博客在我的腾讯云 CVM 服务器上是部署有一份的「域名:shan333.cn」,之前的博客同步方式是通过 Linux 的定时任务,觉得不太行,当前博客的更新并没有那么频繁,没必要每隔几个小时就 git pull 一下,且服务器还挂着其他东西,性能还是有点损耗的,换成通过 rsync 进行主动推送的方式好点; 3、熟悉波 SSH 协议和 rsync 协议。 今天撸一篇文章简单记录下这次折腾。","text":"前几天写了个基于 rsync 进行文件同步的 Action -> rsync-deploy-action。目的有三个: 1、深入了解波 GitHub Actions,感受下 GitHub 的文档; 2、个人博客在我的腾讯云 CVM 服务器上是部署有一份的「域名:shan333.cn」,之前的博客同步方式是通过 Linux 的定时任务,觉得不太行,当前博客的更新并没有那么频繁,没必要每隔几个小时就 git pull 一下,且服务器还挂着其他东西,性能还是有点损耗的,换成通过 rsync 进行主动推送的方式好点; 3、熟悉波 SSH 协议和 rsync 协议。 今天撸一篇文章简单记录下这次折腾。 rsync-deploy-action 的创建挑 rsync 协议,不挑 FTP 或 scp 的新建 GitHub Actions 的部分原因是 rsync 可以做增量备份。GitHub Action 有三种类别,即 Docker container、JavaScript 和 Composite run steps。这次手撸的 Action 归属于 GitHub 官方文档介绍的 Docker container action。rsync-deploy-action 已经发布到 GitHub 的 Marketplace。源仓库地址:https://github.com/yeshan333/rsync-deploy-action。 rsync 与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。 rsync-deploy-action 基于 SSH 协议进行文件的远程同步,从元数据文件 action.yml 可以看到,Action 支持 8 个参数「6个必选,2个可选」。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950name: 'rsync-deploy-action'description: 'Synchronize files to the remote server using the SSH private key'inputs: ssh_login_username: description: 'SSH login username' required: true remote_server_ip: description: 'remote server ip' required: true ssh_port: description: 'remote server SSH port' required: true default: "22" ssh_private_key: description: 'login user SSH private key' required: true source_path: description: 'The source storage path of the synchronous files' required: true destination_path: description: 'The destination storage path of the synchronous files' required: true ssh_args: description: 'SSH args' required: false rsync_args: description: 'rsync args' required: falseoutputs: start_time: description: 'Start time of synchronization' end_time: # id of output description: 'End time of synchronization'runs: using: 'docker' image: 'Dockerfile' args: - ${{ inputs.ssh_login_username }} - ${{ inputs.remote_server_ip }} - ${{ inputs.ssh_port }} - ${{ inputs.ssh_private_key }} - ${{ inputs.source_path }} - ${{ inputs.destination_path }} - ${{ inputs.ssh_args }} - ${{ inputs.rsync_args }}branding: icon: 'file' color: 'green' 利用 rsync-deploy-action 的 Dockerfile 文件配合 Action 执行日志可以一窥 GitHub Actions 背后是如何执行的。 Action 的 with 参数的传递在一定程度上利用了 Dockerfile 的 ENTRYPOINT。 12345678910111213141516# Container image that runs your codeFROM alpine:latestRUN apk update \\ && apk upgrade \\ && apk add --no-cache \\ rsync \\ openssh-client# Copies your code file from your action repository to the filesystem path `/` of the containerCOPY entrypoint.sh /entrypoint.shRUN chmod +x /entrypoint.sh# Code file to execute when the docker container starts up (`entrypoint.sh`)ENTRYPOINT ["/entrypoint.sh"] 接下来介绍下利用 rsync-deploy-action 进行 Hexo 博客同步到个人腾讯云 CVM 服务器的过程。 Hexo 博客同步到云服务器由于 rsync 是基于 SSH 协议的,rsync-deploy-action 需要使用到 SSH 私钥,所以需要先创建一个可以进行 SSH 远程登录的用户,不建议直接使用 root 用户。 SSH 密钥登录1、先配置好远程腾讯云 CVM 服务器 SSH 允许密钥登录。编辑 SSH 配置文件 /etc/ssh/sshd_config。 1vim /etc/ssh/sshd_config StrictModes yes 改成 StrictModes no (去掉注释后改成 no) 找到 #PubkeyAuthentication yes 改成 PubkeyAuthentication yes (去掉注释) 找到 #AuthorizedKeysFile .ssh/authorized_keys 改成 AuthorizedKeysFile .ssh/authorized_keys (去掉注释) 保存后,重启 sshd。 1systemctl restart sshd 2、新建用户 github,用于远程 SSH 免密登录。 在远程服务器执行如下命令: 12345# root 用户下创建用户 github 并且指定 HOME 目录useradd -d /home/github github# 也可以使用 adduser github,adduser会自动创建 HOME 目录等# 设置 github 用户密码,用于后续 SSH 登录公钥的上传passwd github 3、在本地 PC 执行如下命令,创建用于登录的密钥对。 123456# 生成密钥对ssh-keygen -t rsa -b 4096 -C "1329441308@qq.com"# 将生成的公钥上传到云服务器,server_ip 为服务器 IP 地址,ssh_port 为 SSH 端口号cat ~/.ssh/id_rsa.pub | ssh github@server_ip -p ssh_port "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"# ssh 密钥登录测试,server_ip 为服务器 IP 地址,ssh_port 为 SSH 端口号ssh -p ssh_port -i ~/.ssh/id_rsa github@server_ip 以上操作完成没问题之后,即可使用 rsync-deploy-action 了,后面以个人 Hexo 博客的同步为例子,简单看下如何使用此 Action。 Hexo 博客同步个人 Hexo 博客之前已经配置过 GitHub Action 的 workflows 进行博客的自动部署「博客源仓库:yeshan333/actions-for-hexo-blog」,所以再添加个 step 给 rsync-deploy-action 即可启用博客同步。step 声明如下: 123456789101112131415161718192021222324252627282930313233name: Site CIon: pull_request: branches: [master] push: branches: [master]jobs: build: runs-on: ubuntu-latest steps: ...... - name: Release to GitHub Pages run: | git config --global user.email "1329441308@qq.com" git config --global user.name "yeshan333" git clone git@github.com:yeshan333/yeshan333.github.io.git .deploy_git chmod 755 -R .deploy_git hexo clean hexo generate hexo deploy - name: Push to tencentyun CVM uses: yeshan333/rsync-deploy-action@v1.0.0 with: ssh_login_username: ${{ secrets.SSH_LOGIN_USERNAME }} remote_server_ip: ${{ secrets.REMOTE_SERVER_IP }} ssh_port: ${{ secrets.SSH_PORT }} ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} source_path: ./.deploy_git/* destination_path: ~/shan333.cn rsync_args: --exclude="./.deploy_git/.git/*" workflow 中名为 Push to tencentyun CVM 的 step 会将 .deploy_git 下的所有文件上传到云服务器「存放到 ~/shan333.cn 目录下」,熟悉 Hexo 的朋友应该知道 hexo deploy 生成的文件会放在 .deploy_git 目录下,这里用到了 Hexo 的一个 Plugin -> hexo-deployer-git。其实也可以将 hexo generate 生成的 public 目录下的所有文件同步到云服务器。 rsync-deploy-action 使用到的参数解释「有部分数据也算是隐私数据,这里意思下用了 GitHub 的 repository secrets」: ssh_login_username:可以进行 SSH 密钥登录的用户名,即之前配置好的 github 用户。 remote_server_ip:云服务器 IP ssh_private_key:SSH 登录用户的私钥,即之前的 ~/.ssh/id_rsa 文件的内容 source_path:博客相关所有文件路径 destination_path:同步到云服务器的目标路径~/shan333.cn,即/home/github/shan333.cn rsync_args:action 的可选参数,.git 目录是没必要同步上传的,排除掉 “大功告成”。rsync 协议的更多介绍可参考:WangDoc.com rsync。 More个人的腾讯云 CVM 服务器之前为了方便维护安装了个运维面板BT.CN,Hexo 博客是用过 Nginx Serving 的,但 Nginx 是通过运维面板安装的,默认的 user 为 www「宝塔对 Nginx 的配置文件进行了拆分」,但同步后的博客是放在 github 用户的 HOME 目录下的 shan333.cn 目录中的,www 无权限执行博客的相关文件(403 Forbidden),所以需要操作波给 www 用户可执行权限,让 Nginx Worker 可以 serving 博客: 1234# root 用户下执行,github 目录下的所有文件 755 权限chmod -R 755 /home/github# 将 www 用户添加到 github user groupusermod www -G -a github 参考 GitHub Actions-Creating actions GitHub Actions-Workflow syntax SSH 密钥登录-网道文档 nginx-split-large-configuration-file Dockerfile ENTRYPOINT","categories":[{"name":"DevOps","slug":"DevOps","permalink":"https://yeshan333.github.io/categories/DevOps/"}],"tags":[{"name":"Github Actions","slug":"Github-Actions","permalink":"https://yeshan333.github.io/tags/Github-Actions/"},{"name":"DevOps","slug":"DevOps","permalink":"https://yeshan333.github.io/tags/DevOps/"},{"name":"Nginx","slug":"Nginx","permalink":"https://yeshan333.github.io/tags/Nginx/"}]},{"title":"关注思考的过程,终将更加卓越 | 2020 年总结","slug":"2020-annual-reviewed","date":"2021-01-06T16:29:08.000Z","updated":"2021-01-06T16:29:08.000Z","comments":true,"path":"2021/01/06/2020-annual-reviewed/","permalink":"https://yeshan333.github.io/2021/01/06/2020-annual-reviewed/","excerpt":"","text":"开篇碎语2020 年末和 2021 年初在掘金社区和 Twitter 看了诸多大佬的 2020 年总结「顺便膜拜 dalao 的同时学习波文法😀,方便写自己的年度总结」。 2020 年 12 月 08 日,我在 QQ 空间发布了篇“预总结”,特地立了个 flag 🚩『2020年最后一周或者 2021 年第一周把年度总结写出来』,防止自己“赖账”😂。毕竟 2019 年都写了份总结了,2020 年的不能少吧!从那时候开始,就在磨磨唧唧的准备材料,写篇文章不容易啊 /(ㄒoㄒ)/~~。第二次写年度总结,今年写份长点的。 最近使用了“毕生的 EN 功力”去翻译一篇毕设相关的论文 -> 《Method of fundamental solutions with regularization techniques for Cauchy problems of elliptic operators》,敲打着一堆的数学公式「Latex 和 plain 混着用」,回顾着诸多偏微分方程(PDE)的知识「裂开了~」,瞬间感觉自己又是一个数学系的学生了。 话不多说,回到正题,总结来了! 回顾 2020可以注意到,在这篇年度总结的题目中我特别提到了思考,且这一年博客首页的 Banner 换了几次 Title 也是和“思考过程”有关的。可以引申出一点 - 这一年,相对于结果的产出,我更关注的是过程的收获-解决问题过程中的思考。校招时部分面试的背书式回答让我很不爽「自己太菜😒」,逼自己了解把某项技术出现的历史与原因,这算是部分原因。另一部分嘛,以前入门时一步一步跟着别人做 demo,跟着别人的思路走,按照别人的方法解决问题,现在深受其害库😥,缺少了点“独立思考”,太不爽了。So,2020 年关注了下解决问题的思考过程,方案如何高效高质产出。 学习 - 成长谈到学习,这一年看得书不算多,但是感觉还挺硬核。我汲取知识的方式不仅有读书 & 文档 & 博客,还会看一些 dalao 在极客时间开的技术专栏,略微看下我的极客时间 2020 年终报告: 极客时间 2020 年终报告 “有一天肝得太晚了,不得,以后好好摸鱼呀,啊 sir。” 跟着耗子叔认识了这个平台,剁了好几次手 2333~,不过到现在看来并不亏,相对于视频学习,个人还是比较喜欢这种文字形式的学习的,可以很方便的反复琢磨,通过这个平台还了解到了许多各个领域的 dalao。 Podcast从上一年(2019) GET 到的播客「捕蛇者说」汲取知识的姿势 2020 年仍然保持着,对个人来说又新颖、又有趣,可以听到 dalao 的声音『小声 bb,校招面试总感觉有个面试官声音在哪里听过🤣』。 Reading这一年看得书还真的不算多,略微罗列下: 在读,有部分差不多读完了 《React 设计模式与最佳实践》 《计算机是怎样跑起来的》 《网络是怎样连接的》 《Python 云原生:构建应对海量用户数据的高可扩展 Web 应用》 《现代操作系统 原书第四版》 《云原生 Java》 《Cloud Native Go 构建基于 Go 和 React 的云原生 Web 应用与微服务》 《Kubernetes Handbook》 《TypeScript Deep Dive》 《大型网站技术架构:核心原理与案例分析》 《Nginx 高性能与 Web 服务器详解》 今年准备了解下 《Go 语言设计与实现》 《程序员的自我修养 - 链接、装载与库》 …… 这一年,我关注了许多 CS 基础相关「深知与 CS 专业的 dalao 的差距还是很大的」的书籍,为了校招面试,更为了以后更好的发展。今年看的书有部分是和 Jimmy Song dalao 相关的,也因这位 dalao 关注上了 Cloud Native。感叹下《Go 语言设计与实现》作者深厚的功底,2021 年想再深入了解波编译原理。 Coding到了,Coding 相关的,不得不提 GitHub,作为“资深 GitHub 打卡混子”,除了 Gitee 上为了感受下 DevOps 做的 AI 相关的入门级项目的代码,今年写的大部分代码都以放到了 GitHub 个人公有仓或者私有仓上。看看我的 GitHub 年度报告,可以大致了解下我的 Coding 情况: 2020 GitHub annual report 再看看小绿点,这一年过得还算“充实”。 GitHub Card 诸多的第一次2020 年,有着诸多对于我来说特别有意义的第一次,认识了许多的朋友、dalao。 第一次一个人的远途2020 年的 21 届暑假实习春招,我最终接了一家杭州互联网大厂的 offer,大老远的从桂林跑去杭州实习。这还是我第一次一个人跑这么远,大学入学时还有父母陪同,这真的是第一次跑到杭州这么远的地方。哪个厂?看下图😀「学院社团,瞒天过海,嘿嘿嘿~(^_^),对不住-对不住」: HangZhou Netease 顺带一提,第一次白天坐“灰机”,见识了下祖国的大好河山「东南丘陵、江浙平原」。 第一次实习说起实习,这还是我第一次实习「“打工仔”」,不像有些大佬从大一就开始有实习机会了。三个月的实习期都在“混”一个平台的开发,复习巩固 & 学习了挺多的前端、服务端、性能优化相关的技术,这里有 Cloud Native 相关技术的落地,在这里痛快的玩了几下 Kubernetes 和 DevOps 元素周期表里面的东西,看了波“传说”中的 PingCAP dalao 的分享。在这里要非常感谢我的 mentor 给了我很多机会让我实践我的想法,将相关技术、规范融入到平台的开发中来。不得不提的是-我所在的部门归属于 Netease 的一个 AI Lab,很幸运能够了解到前沿 RL 相关技术的落地实践,具体就不展开港了。 在杭州实习认识了几个来自武大、浙大、北大、电子科大、HongKong 的朋友 & 策划dalao、动效dalao、美术dalao,有同厂的也有不同厂的,这些人真的强,我吐了,我一直想跟他们说能不能给点机会,别吊打我了,求放过,疯狂暗示+明示🤪抬几手。和几个大佬开了很多次小灶,涨了很多知识,只想感叹:差距咋这么大,不比了-不必了。 第一次校招2020 年,第一次参加校招(2021届春、秋招),也许是最后一次校招了,无读研打算(“菜”就一个字)。没想到我个菜鸡居然有机会大厂一轮游(BAT、TMD、菊厂、🐖厂等),非常感谢每个面试官给的机会,还顺带给了我非常多成长、沟通方面的建议,印象最深刻的就是美团和鹅厂的面试,知识面打满了,还顺带问了数理统计相关的知识,帮我打通了下知识体系。总得来说,这次校招不亏不亏,拿了几个不算好也不算差的 offer,可能因为我太菜,没能留🐖厂,最终选择了 A 厂,继续努力,期待以后更好的成长。 再次顺带一提,20 年凑(“白嫖”)了几个厂的小物件。 Gift 第一次支持杰哥的演唱会作为杰哥将近八年的歌迷,今年听了场网易云音乐的线上演唱会,2333~,终于支持了波杰哥,希望 2021 年有机会线下听一场杰哥的巡回演唱会。 WE LIVE 生日演唱会 第一次把自己的笔记本“干掉了”2020 年,安奈不住心中的“冲动”,把自己的渣渣笔记本电脑“解剖”了,「特别想换一下,奈何没资本,跑个 IDEA 真费劲,等我入职第一个月 salary 到手,反手“屠”了它」。 个人笔记本配置 展望 2021一波操作水下来,发现 2020 年过得还凑合。2021 年希望活得更精彩、更快乐。一波面试和实习下来,发现自己各方面的能力还是不行啊,希望今年能学好冰山上层的同时好好提升下冰山下层的能力。 网图-冰山模型 2020 年的开源技术社区参与程度还是不行,2021 年继续努力。2020 年末,有幸受赵老师邀请给上 Linux 课的学弟学妹做了次 Linux 相关的分享,特地回顾了下之前学到的东西,太多纰漏(“虽然我在吹水,而且我也没讲多少 Linux,对不住,哈哈哈,还白嫖了个小米手环~哈哈哈!”)。Slides 「Tip:下图可以拨动哦(^_^)」 2021 年,坚持输出,希望个人博客更有味道,不只是技术文章,能有点生活味儿~! 2019 年总结","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"2021 Happy New Year","slug":"2021-new-year","date":"2021-01-01T00:00:00.000Z","updated":"2021-01-01T00:00:00.000Z","comments":true,"path":"2021/01/01/2021-new-year/","permalink":"https://yeshan333.github.io/2021/01/01/2021-new-year/","excerpt":"","text":"","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"简单耍一下-Kafka","slug":"耍一下Kafka","date":"2020-12-13T20:30:14.000Z","updated":"2020-12-13T20:30:14.000Z","comments":true,"path":"2020/12/13/耍一下Kafka/","permalink":"https://yeshan333.github.io/2020/12/13/%E8%80%8D%E4%B8%80%E4%B8%8BKafka/","excerpt":"趁着毕设初期,还能摸会儿🐟,了解波 Kafka。 Kafka 术语一览 Kafka,分布式消息引擎系统,主要功能是提供一套完备的消息发布与订阅解决方案。Kafka 也是一个分布式的、分区的、多副本的多订阅者,基于 Zookeeper 协调的分布式日志系统,可用于处理 Web 日志和消息服务。 Topic:主题,承载消息(Record)的逻辑容器,每条发布到 Kafka 集群的消息都归属于某一个 Topic,实际应用中,不同的 topic 对应着不同的业务; Broker:Kafka 服务进程,一个 Kafka 集群由多个 Broker 服务进程组成,虽然多个 Broker 可在同一服务器上进行部署,但为了高可用,会将不同的 Broker 部署在不同的机器上; Partition:分区,一组有序的消息序列,一个 Topic 可以有多个分区,同一 Topic 下的 Partition 可以分布在不同的 Broker 中。Producer 生产的每一条消息都会被放到一个 Partition 中,每条消息在 Partition 中的位置信息由一个 Offset(偏移量)数据表征。Kafka 通过偏移量(Offset)来保证消息在分区内的顺序性;","text":"趁着毕设初期,还能摸会儿🐟,了解波 Kafka。 Kafka 术语一览 Kafka,分布式消息引擎系统,主要功能是提供一套完备的消息发布与订阅解决方案。Kafka 也是一个分布式的、分区的、多副本的多订阅者,基于 Zookeeper 协调的分布式日志系统,可用于处理 Web 日志和消息服务。 Topic:主题,承载消息(Record)的逻辑容器,每条发布到 Kafka 集群的消息都归属于某一个 Topic,实际应用中,不同的 topic 对应着不同的业务; Broker:Kafka 服务进程,一个 Kafka 集群由多个 Broker 服务进程组成,虽然多个 Broker 可在同一服务器上进行部署,但为了高可用,会将不同的 Broker 部署在不同的机器上; Partition:分区,一组有序的消息序列,一个 Topic 可以有多个分区,同一 Topic 下的 Partition 可以分布在不同的 Broker 中。Producer 生产的每一条消息都会被放到一个 Partition 中,每条消息在 Partition 中的位置信息由一个 Offset(偏移量)数据表征。Kafka 通过偏移量(Offset)来保证消息在分区内的顺序性; Leader:每个 Partition 下可以配置多个 Replica(副本),Replica 由一个 Leader 和多个 Follower 组成,Leader 负责当前 Partition 消息的读写; Follower:用于同步 Leader 中的数据,数据冗余,Leader 失效时会从 Followers 中选取; Producer:生产者即数据的发布者。Producer 将消息发送给 Kafka 对应的 Topic 中,Broker 接收到消息后,会将消息存储到 Partition 中; Consumer:消费者,消费者可以消费多个 Topic 中的消息,一个 Topic 中的消息也可以被多个消费者消费; Consumer Group:消费者组,每一个消费者都会归属于某一个消费者组,如果未指定,则取默认的 Group; Consumer Offset:消费者位移,用于表示消费者的消费进度; 与 Kafka 相关的几个问题: Kafka 实现高可用的手段Kafka 实现伸缩性的手段Zookeeper在Kafka中的作用Kafka如何实现消息的有序 Broker 分布式部署 备份机制(Replacation),把相同的数据拷贝到多台机器上。即 Kafka Replica,Leader Replica 提供数据的读写操作,Follower Replica 负责同步数据。 Partition 机制,一个 Topic 划分为多个 Partition,防止单台 Broker 机器无法容纳太多的数据,Partition 机制与 Replica 机制联系紧密,每个 Partition 可以有多个 Replica(1 Leader + N Followers)。 Zookeeper 可为分布式系统提供分布式配置服务、同步服务和命名注册服务。 Broker 注册; Topic 注册,Partition 与 Broker 信息的保存; 负载均衡服服务,Producer 与 Consumer 的负载均衡; 分区与消费者关系的管理; …等 源码解说zookeeper在kafka中的作用 从前文可知,Kafka 的消息存储在 Topic 中,一个 Topic 又可以划分为多个 Partition,多 Partition 时,Kafka 只能保证 Partition 内的消息有序(Offset保证有序),如需保证 Topic 消息的有序,那么只能使用单个Partition了。如果仍要使用多个 Partition,消息的分区写入策略应选择按键(Key)保存。 详细解析kafka之kafka分区和副本 通过 Go 体验一下 Kafka环境搭建既然只是玩一下,不如使用 Docker 搭建 Kafka 环境吧,“即用即焚”。 环境:Windows 10 Docker Desktop + WSL 这里通过 Docker-Compose 搭建个单机版的 kafka 集群,编排文件如下: 123456789101112131415161718192021222324252627282930313233343536version: '3.4'services: zoo1: container_name: zookeeper-one image: zookeeper:3.4.9 hostname: zoo1 ports: - "2181:2181" environment: ZOO_MY_ID: 1 ZOO_PORT: 2181 ZOO_SERVERS: server.1=zoo1:2888:3888 volumes: - ./zk-single-kafka-single/zoo1/data:/data - ./zk-single-kafka-single/zoo1/datalog:/datalog kafka1: container_name: kafka-one image: confluentinc/cp-kafka:5.3.1 hostname: kafka1 ports: - "9092:9092" environment: KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER_INTERNAL://kafka1:19092,LISTENER_DOCKER_EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER_INTERNAL:PLAINTEXT,LISTENER_DOCKER_EXTERNAL:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_DOCKER_INTERNAL KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181" KAFKA_BROKER_ID: 1 KAFKA_LOG4J_LOGGERS: "kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO" KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 volumes: - ./zk-single-kafka-single/kafka1/data:/var/lib/kafka/data depends_on: - zoo1 该编排文件来自:https://github.com/simplesteph/kafka-stack-docker-compose 的 zk-single-kafka-single.yml。使用 docker-compose up 启动容器。 编排文件中所使用到的镜像 confluentinc/cp-kafka:5.3.1 和 zookeeper:3.4.9 配置参考: https://hub.docker.com/_/zookeeper https://hub.docker.com/r/confluentinc/cp-kafka Kafka 和 Zookeeper 容器启动后,配合 IDEA 的两个插件 Kafkalytic 和 Zoolytic ,我们可以很方便的观察集群的情况: Cluster Management 通过 vscode 插件我们可以方便的对启动的容器进行管理(日志追踪、shell attach等): vscode docker plugin 通过 Kafka 自带的命令行工具可以查看 Topic:(先连接到 Kafka 容器:docker exec -it kafka-one bash) 12345root@kafka1:/# kafka-topics --describe --zookeeper zoo1:2181Topic:__confluent.support.metrics PartitionCount:1 ReplicationFactor:1 Configs:retention.ms=31536000000 Topic: __confluent.support.metrics Partition: 0 Leader: 1 Replicas: 1 Isr: 1Topic:__consumer_offsets PartitionCount:50 ReplicationFactor:1 Configs:s...... 使用 confluent-kafka-go 体验 KafkaGo 中有两个比较有名的 Go Client,即 kafka-go 和 confluent-kafka-go。我都不熟悉😂,但是前面编排时用到了 confluent 公司的 Kafka 镜像,所以这里选用 confluent-kafka-go 创建 Client。confluent-kafka-go 项目的 example 拿来即用。 1、创建 Go Module 1234mkdir go-kafka-democd go-kafka-demogo mod init github.com/yeshan333/go-kafka-demogo get -u github.com/confluentinc/confluent-kafka-go 2、创建 Consumer。这个 Consumer 订阅的 Topic 为 myTopic。 1234567891011121314151617181920212223242526272829303132333435// kafka_consumer.gopackage mainimport ( "fmt" "github.com/confluentinc/confluent-kafka-go/kafka")func main() { c, err := kafka.NewConsumer(&kafka.ConfigMap{ "bootstrap.servers": "localhost", "group.id": "myGroup", "auto.offset.reset": "earliest", }) if err != nil { panic(err) } c.SubscribeTopics([]string{"myTopic", "^aRegex.*[Tt]opic"}, nil) for { msg, err := c.ReadMessage(-1) if err == nil { fmt.Printf("Message on %s: %s\\n", msg.TopicPartition, string(msg.Value)) } else { // The client will automatically try to recover from all errors. fmt.Printf("Consumer error: %v (%v)\\n", err, msg) } } c.Close()} 3、创建 Producer。这个 Producer 向 myTopic Topic 发送了 7 条消息。 1234567891011121314151617181920212223242526272829303132333435363738394041424344// kafka_producer.gopackage mainimport ( "fmt" "github.com/confluentinc/confluent-kafka-go/kafka")func main() { p, err := kafka.NewProducer(&kafka.ConfigMap{"bootstrap.servers": "localhost"}) if err != nil { panic(err) } defer p.Close() // Delivery report handler for produced messages go func() { for e := range p.Events() { switch ev := e.(type) { case *kafka.Message: if ev.TopicPartition.Error != nil { fmt.Printf("Delivery failed: %v\\n", ev.TopicPartition) } else { fmt.Printf("Delivered message to %v\\n", ev.TopicPartition) } } } }() // Produce messages to topic (asynchronously) topic := "myTopic" for _, word := range []string{"Welcome", "to", "the", "Confluent", "Kafka", "Golang", "client"} { p.Produce(&kafka.Message{ TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny}, Value: []byte(word), }, nil) } // Wait for message deliveries before shutting down p.Flush(15 * 1000)} 4、两个 terminal,先跑 Consumer,再跑 Producer。 1234# terminal 1go run kafka_consumer.go# ternimal 2go run kafka_producer.go run result 收工,其他东西后续慢慢啃。本文源文件:https://github.com/yeshan333/go-kafka-demo 参考 CONFLUENT-Kafka Go Client Apache Kafka Operations kafka-stack-docker-compose","categories":[{"name":"中间件","slug":"中间件","permalink":"https://yeshan333.github.io/categories/%E4%B8%AD%E9%97%B4%E4%BB%B6/"},{"name":"Kafka","slug":"中间件/Kafka","permalink":"https://yeshan333.github.io/categories/%E4%B8%AD%E9%97%B4%E4%BB%B6/Kafka/"}],"tags":[{"name":"Kafka","slug":"Kafka","permalink":"https://yeshan333.github.io/tags/Kafka/"},{"name":"消息引擎系统","slug":"消息引擎系统","permalink":"https://yeshan333.github.io/tags/%E6%B6%88%E6%81%AF%E5%BC%95%E6%93%8E%E7%B3%BB%E7%BB%9F/"},{"name":"流处理平台","slug":"流处理平台","permalink":"https://yeshan333.github.io/tags/%E6%B5%81%E5%A4%84%E7%90%86%E5%B9%B3%E5%8F%B0/"}]},{"title":"使用tcpdump和Wireshark看下TCP握手","slug":"使用tcpdump和wireshark看下TCP握手","date":"2020-11-15T15:52:13.000Z","updated":"2020-11-15T15:52:13.000Z","comments":true,"path":"2020/11/15/使用tcpdump和wireshark看下TCP握手/","permalink":"https://yeshan333.github.io/2020/11/15/%E4%BD%BF%E7%94%A8tcpdump%E5%92%8Cwireshark%E7%9C%8B%E4%B8%8BTCP%E6%8F%A1%E6%89%8B/","excerpt":"tcpdump 和 Wireshark 是最常用的网络抓包和分析工具,作为经常和网络打交道的划水选手,怎么能不了解下呢?补篇博文回顾下相关操作。这里以 example.com 的一次 GET 请求为例,先使用 tcpdump 抓个包,再使用 Wireshark 看下 TCP 的握手。 操作环境:WSL2(Ubuntu 20.04 LTS) + Windows 10","text":"tcpdump 和 Wireshark 是最常用的网络抓包和分析工具,作为经常和网络打交道的划水选手,怎么能不了解下呢?补篇博文回顾下相关操作。这里以 example.com 的一次 GET 请求为例,先使用 tcpdump 抓个包,再使用 Wireshark 看下 TCP 的握手。 操作环境:WSL2(Ubuntu 20.04 LTS) + Windows 10 用 tcpdump 抓个包先在 WSL2 Ubuntu 安装下 tcpdump。 1234# 启动 wslwsl# 安装 tcpdumpapt-get install tcpdump 抓包需要使用两个终端,一个终端使用 curl 向 example.com 发送请求,一个用于 packets 的抓取。OK,抓包开始: 1、一个终端使用 tcpdump 监听 example.com。 12# terminal 1,监听 example.com 的网络包tcpdump -nn host example.com -w web.pcap 2、另一个终端使用 curl 发送网络请求。 12# terminal 2,发送网络请求curl example.com 请求发送完毕后,Ctrl + C 终止终端 1 的监听,将抓取结果 wep.pcap 拷贝到 Windows 10 桌面。 1mv web.pcap /mnt/c/Users/yeshan/Desktop/web.pcap 拿 Wireshark 看下包由于 tcpdump 的输出格式并不直观,所以之前将抓取结果写入到 web.pcap。然后这里使用有图形化界面的 Wireshark 去看下刚刚抓下来的网络包 web.pcap。 下载安装 Wireshark:https://www.wireshark.org/download.html 1、使用 Wireshark 打开 web.pcap。 2、使用 Wireshark 的统计工具可以看到 TCP 握手的流程。分析->流量图 123# 确定 example.com ip$ dig +short example.com93.184.216.34 完美,可以看到经典的 TCP 握手过程。「TCP三次握手,四次挥手:」 很香的是 Wireshark 提供了许多示例网络包『SampleCaptures 』,计网学习新世界?","categories":[{"name":"计算机网络","slug":"计算机网络","permalink":"https://yeshan333.github.io/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"}],"tags":[{"name":"Wireshark","slug":"Wireshark","permalink":"https://yeshan333.github.io/tags/Wireshark/"},{"name":"计算机网路","slug":"计算机网路","permalink":"https://yeshan333.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E8%B7%AF/"},{"name":"TCP","slug":"TCP","permalink":"https://yeshan333.github.io/tags/TCP/"},{"name":"tcpdump","slug":"tcpdump","permalink":"https://yeshan333.github.io/tags/tcpdump/"}]},{"title":"浅解shallow copy、deep copy","slug":"浅解shallow copy、deep copy","date":"2020-10-09T23:04:04.000Z","updated":"2020-10-09T23:04:04.000Z","comments":true,"path":"2020/10/09/浅解shallow copy、deep copy/","permalink":"https://yeshan333.github.io/2020/10/09/%E6%B5%85%E8%A7%A3shallow%20copy%E3%80%81deep%20copy/","excerpt":"“回👋掏”。最近做东西,有点儿玩不转复杂数据类型,写篇博文再回顾下深、浅拷贝相关知识。深、浅的区分主要在对复杂数据类型进行操作的时候。 By the way:时间过得很快,十月了,之前定了个小目标:一个月至少一篇文章产出。2020年的 $ \\frac{5}{6} $ 已经过去。很庆幸自己坚持了下来,学到了不少东西。实习期间其实有不少的文章主题的想法,但真正想动手写篇博文的时候,发现事情并没有想想中的那么简单,一个主题涉及到的知识点还是蛮多的,再加上实践经验的不足,有些东西很难写道点上,copy & paste 总是不太好的『努力提高文章质量,hhh~』。希望自己后续继续加油。","text":"“回👋掏”。最近做东西,有点儿玩不转复杂数据类型,写篇博文再回顾下深、浅拷贝相关知识。深、浅的区分主要在对复杂数据类型进行操作的时候。 By the way:时间过得很快,十月了,之前定了个小目标:一个月至少一篇文章产出。2020年的 $ \\frac{5}{6} $ 已经过去。很庆幸自己坚持了下来,学到了不少东西。实习期间其实有不少的文章主题的想法,但真正想动手写篇博文的时候,发现事情并没有想想中的那么简单,一个主题涉及到的知识点还是蛮多的,再加上实践经验的不足,有些东西很难写道点上,copy & paste 总是不太好的『努力提高文章质量,hhh~』。希望自己后续继续加油。 浅拷贝(shallow copy) 浅拷贝总结:新对象内容为原对象内第一层对象的引用。 Python 中的浅拷贝关键点就在于这第一层对象。让我们先看看 Python 中的浅拷贝。 先看看不含嵌套元素的情形: 12345678910111213141516l1 = [1, 2, 3]# 直接赋值,使用 is 比较地址l2 = l1print(l1 is l2) # True# 使用构造器l3 = list(l1)print(l1 is l3) # False# 切片l4 = l1[:]print(l1 is l4) # Falseprint(id(l1), id(l2), id(l3), id(l4)) # 查看内存地址# 2124445454144 2124445454144 2124445477568 2124445029248 含嵌套元素的情形: 12345678910111213141516171819202122232425262728293031l1 = [1, [2,3], 4]# 直接赋值l2 = l1# 构造器l3 = list(l1)# 切片l4 = l1[:]for first, second, third, fourth in zip(l1, l2, l3, l4): # 查看每层对象的地址 print("value", first, "address:", id(first), id(second), id(third), id(fourth))# value 1 address: 140729744430752 140729744430752 140729744430752 140729744430752# value [2, 3] address: 1924217248768 1924217248768 1924217248768 1924217248768# value 4 address: 140729744430848 140729744430848 140729744430848 140729744430848l4[1].append("new")print(l1) # [1, [2, 3, 'new'], 4]print(l2) # [1, [2, 3, 'new'], 4]print(l3) # [1, [2, 3, 'new'], 4]print(l4) # [1, [2, 3, 'new'], 4]for first, second, third, fourth in zip(l1, l2, l3, l4): # 查看每层对象的地址 print("value", first, "address:", id(first), id(second), id(third), id(fourth))# value 1 address: 140729744430752 140729744430752 140729744430752 140729744430752# value [2, 3, 'new'] address: 1639298767872 1639298767872 1639298767872 1639298767872# value 4 address: 140729744430848 140729744430848 140729744430848 140729744430848 从上面的示例可以看到,Python中切片操作、工厂函数和=操作均是浅拷贝,只拷贝了原对象的第一层对象的引用,对第一层对象的操作会影响到其它对元对象进行浅拷贝的对象。但=操作和切片、构造器(工厂函数)不同的是,=操作不会创建新的对象。 值得注意的是,Python 中 tuple 的 tuple() 和切片操作和=进行的拷贝一样,不会创建新的对象。字典的浅拷贝可以使用 dict.copy()。 JS 中的浅拷贝让我们再来看看 JS 中的浅拷贝操作。 老规矩,先看看简单对象: 123456789101112131415161718192021let obj1 = { a: 1, b: 2};// 赋值let obj2 = obj1; // { a: 1, b: 2 }// Object.assignlet obj3 = Object.assign({}, obj1); // { a: 1, b: 2 }console.log(obj3)// spreadlet obj4 = {...obj1}; // // { a: 1, b: 2 }obj2.a = "new";// { a: 'new', b: 2 } { a: 'new', b: 2 } { a: 1, b: 2 } { a: 1, b: 2 }console.log(obj1, obj2, obj3, obj4) 再看下复杂对象: 1234567891011121314151617181920212223let obj1 = { a: { b: 1, c: 2 }, d: 3};// 直接赋值let obj2 = obj1; // { a: { b: 1, c: 2 }, d: 3 }// Object.assignlet obj3 = Object.assign({}, obj1); // { a: { b: 1, c: 2 }, d: 3 }// Object Spreadlet obj4 = {...obj1}; // { a: { b: 1, c: 2 }, d: 3 }obj2.a.b = "new";console.log(obj1); // { a: { b: 'new', c: 2 }, d: 3 }console.log(obj2); // { a: { b: 'new', c: 2 }, d: 3 }console.log(obj3); // { a: { b: 'new', c: 2 }, d: 3 }console.log(obj4); // { a: { b: 'new', c: 2 }, d: 3 } 可以看到,JS 对象的=操作、Object.assign({}, originObject) 和对象扩展运算均是浅拷贝。但是 Object.assign和对象的扩展运算对只有一层的对象进行的是深拷贝。此外 JS 数组「array 也是 object」的 map、reduce、filter、slice 等方法对嵌套数组进行的也是浅拷贝操作。 可以明显的看到,JS 和 Python 中的浅拷贝拷贝的均是第一层对象的引用。 深拷贝(deep copy) 深拷贝总结:创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。 Python 中的深拷贝在 Python 中实现复杂对象的拷贝可以通过标准库copy 提供的 copy.deepcopy 实现,此外 copy 模块还提供了 copy.copy 进行对象的浅拷贝。 看下深拷贝的情况: 12345678import copyl1 = [1, [2, 3], 4]l2 = copy.deepcopy(l1)l2[1].append("new")print(l1) # [1, [2, 3], 4]print(l2) # [1, [2, 3, 'new'], 4] 可以看到,有别于浅拷贝,对深拷贝 l1 的新对象 l2 的子元素增加新元素,并不会影响到 l1。 JS 中的深拷贝在 JS 中进行复杂对象的深拷贝,可以使用 JSON.stringify 先将 JS 对象转成 JSON 再转 JS 对象,如下: 123456789101112131415let obj1 = { a: { b: 1, c: 2 }, d: 3};let obj2 = JSON.parse(JSON.stringify(obj1));obj2.a.b = "new";console.log(obj1); // { a: { b: 1, c: 2 }, d: 3 }console.log(obj2); // { a: { b: 'new', c: 2 }, d: 3 } 可以看到,深拷贝后对新对象深层次对象的更改不会使原对象发生变更。 手动实现深拷贝操作在某些情况下需要我们实现深拷贝操作,比如对自定义数据类型进行深拷贝。前面 JS 所述使用 JSON 进行的深拷贝方法仍有缺陷,比如:会忽略 undefined、会忽略 symbol、不能序列化函数、不能解决循环引用的对象。这时候就需要了解波深拷贝的实现了。 从前面所述可知,深拷贝与浅拷贝的区别主要在于 copy 的层次,浅拷贝 copy 的是第一层对象的引用,深拷贝需要 copy 深层次对象。So,以 deepcopy 层次 Object 为例子,要实现真正的深拷贝操作则需要通过遍历键来赋值对应的值,这个过程中如果遇到 Object 类型还需要再次进行遍历「同样的方法」。递归无疑了。来看波实现: 1234567891011121314151617181920212223242526function deepclone(obj) { let map = new WeakMap(); // 解决循环引用 function deep(data) { let result = {}; // 支持 Symbol 类型的属性 const keys = [...Object.getOwnPropertyNames(data), ...Object.getOwnPropertySymbols(data)] if (!keys.length) return data; const exist = map.get(data); if (exist) return exist; map.set(data, result); keys.forEach(key => { let item = data[key]; if (typeof item === 'object' && item) { result[key] = deep(item); } else { result[key] = item; } }) return result; } return deep(obj);} OK,再看些 Python 的 copy.deepcopy 的实现: 1234567891011121314def deepcopy(x, memo=None, _nil=[]): """Deep copy operation on arbitrary Python objects. See the module's __doc__ string for more info. """ if memo is None: memo = {} d = id(x) # 查询被拷贝对象x的id y = memo.get(d, _nil) # 查询字典里是否已经存储了该对象 if y is not _nil: return y # 如果字典里已经存储了将要拷贝的对象,则直接返回 ... emm…,实现思想也是使用递归,同时借助了 memo (备忘录)解决对象的循环引用问题,避免 StackOverflow。 参考 Object Spread Initializer Python copy.deepcopy JS Symbol 关于 JavaScript 的数据类型,你知多少? Python对象的比较、拷贝","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"},{"name":"JavaScript","slug":"JavaScript","permalink":"https://yeshan333.github.io/categories/JavaScript/"}],"tags":[{"name":"深拷贝与浅拷贝","slug":"深拷贝与浅拷贝","permalink":"https://yeshan333.github.io/tags/%E6%B7%B1%E6%8B%B7%E8%B4%9D%E4%B8%8E%E6%B5%85%E6%8B%B7%E8%B4%9D/"}]},{"title":"负载均衡技术小记","slug":"负载均衡技术小记","date":"2020-09-20T18:25:06.000Z","updated":"2020-09-20T18:25:06.000Z","comments":true,"path":"2020/09/20/负载均衡技术小记/","permalink":"https://yeshan333.github.io/2020/09/20/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E6%8A%80%E6%9C%AF%E5%B0%8F%E8%AE%B0/","excerpt":"OSI 模型 常见 OSI 模型负载均衡方案 2 层负载均衡:一般是用虚拟 MAC 地址方式,外部对虚拟 MAC 地址请求,负载均衡器接收后分配后端实际的 MAC 地址响应。 3 层负载均衡:一般采用虚拟 IP 地址方式,外部对虚拟的 IP 地址请求,负载均衡器接收后分配后端实际的 IP 地址响应。","text":"OSI 模型 常见 OSI 模型负载均衡方案 2 层负载均衡:一般是用虚拟 MAC 地址方式,外部对虚拟 MAC 地址请求,负载均衡器接收后分配后端实际的 MAC 地址响应。 3 层负载均衡:一般采用虚拟 IP 地址方式,外部对虚拟的 IP 地址请求,负载均衡器接收后分配后端实际的 IP 地址响应。 4 层负载均衡:基于 IP + 端口的负载均衡方案,对应于 OSI 七层模型的第四层。基于传输层的底层负载均衡方案,可以实现 TCP 连接层的会话保持。 7 层负载均衡:即应用层的负载均衡。7 层的负载均衡更加针对特定的应用协议。基于 HTTP 应用的负载均衡可以实现对 URL 的转发应用、HTTP 请求的处理、session 信息会话保持等等。 4 层与 7 层负载均衡 4 层的负载均衡更偏向底层能力的转发,相对于 7 层负载均衡,负载性能更好。7 层负载均衡能做更细微粒度的负载决策。常见负载均衡器(Load Balancer):F5:硬件负载均衡器;LVS:基于IP层和基于内容请求分发的负载均衡器;Nginx:轻量级负载均衡器,TCP/UDP、HTTP 负载均衡支持;HAProxy:支持 TCP/HTTP 的负载均衡; 常见负载均衡算法 轮询(Round Robin) 将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。 加权轮询(Weighted Round Robin) 根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。自动问询真实服务器的负载情况,并动态地调整其权值。 目标地址散列(Destination Hashing) “目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。 源地址散列(Source Hashing) “源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。 最少链接(Least Connections) 将请求分配到连接数最少的服务器上(目前处理请求最少的服务器)。根据服务器当前的请求处理情况,动态分配. 加权最少链接(Weighted Least Connections) 在集群系统中的服务器性能差异较大的情况下,负载均衡器采用”加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。负载均衡器可以自动问询真实服务器的负载情况,并动态地调整其权值。 随机法、加权随机(Random) 通过系统随机函数,根据后台服务器列表的大小值来随机选取其中一台进行访问。由概率概率统计理论可以得知,随着调用量的增大,其实际效果越来越接近于平均分配流量到后台的每一台服务器,也就是轮询法的效果。 加权随机法跟加权轮询法类似,根据后台服务器不同的配置和负载情况,配置不同的权重。不同的是,它是按照权重来随机选取服务器的,而非顺序。 参考 What Is Layer 7 Load Balancing? 常见负载均衡算法","categories":[{"name":"计算机网络","slug":"计算机网络","permalink":"https://yeshan333.github.io/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"}],"tags":[{"name":"Load Balance","slug":"Load-Balance","permalink":"https://yeshan333.github.io/tags/Load-Balance/"}]},{"title":"setTimeout 是到了xx ms 就执行吗,了解浏览器的 Event-Loop 机制","slug":"setTimeout是到了xx ms 就执行吗,了解 Event-Loop 机制","date":"2020-08-22T13:42:41.000Z","updated":"2020-08-22T13:42:41.000Z","comments":true,"path":"2020/08/22/setTimeout是到了xx ms 就执行吗,了解 Event-Loop 机制/","permalink":"https://yeshan333.github.io/2020/08/22/setTimeout%E6%98%AF%E5%88%B0%E4%BA%86xx%20ms%20%E5%B0%B1%E6%89%A7%E8%A1%8C%E5%90%97%EF%BC%8C%E4%BA%86%E8%A7%A3%20Event-Loop%20%E6%9C%BA%E5%88%B6/","excerpt":"要想 JavaScript 玩得溜,还得了解波 JavaScript 执行机制/(ㄒoㄒ)/~~。 前言最近看了波 JavaScript 相关的文章,不得不说,JavaScript 我还真没玩明白(给我哭~。。。😅)。也挺久没写文了,实习(“摸🐟”)之余小记一波。 回顾一句话:JavaScript 是一门单线程、非阻塞、异步、解释性脚本语言。 本文的标题是:setTimeout 是到了xx ms 就执行吗,了解 Event-Loop 机制。先回答波:不是。 来看下网上的一段经典 js 代码在浏览器中「Microsoft Edge 84.0.522.63(64位)」的执行结果。 12345678910console.log('script start');setTimeout(() => { console.log('setTimeout');},0);Promise.resolve().then(() => { console.log('promise1');}).then(() =>{ console.log("promise2");});console.log('script end');","text":"要想 JavaScript 玩得溜,还得了解波 JavaScript 执行机制/(ㄒoㄒ)/~~。 前言最近看了波 JavaScript 相关的文章,不得不说,JavaScript 我还真没玩明白(给我哭~。。。😅)。也挺久没写文了,实习(“摸🐟”)之余小记一波。 回顾一句话:JavaScript 是一门单线程、非阻塞、异步、解释性脚本语言。 本文的标题是:setTimeout 是到了xx ms 就执行吗,了解 Event-Loop 机制。先回答波:不是。 来看下网上的一段经典 js 代码在浏览器中「Microsoft Edge 84.0.522.63(64位)」的执行结果。 12345678910console.log('script start');setTimeout(() => { console.log('setTimeout');},0);Promise.resolve().then(() => { console.log('promise1');}).then(() =>{ console.log("promise2");});console.log('script end'); 可以明显看到 setTimeout 的 callback 并非在 0 ms 后立即执行。那么,这是问什么?要了解原因,需要了解后续介绍的 Event Loop 机制。 概念一览 浏览器的内核-多线程的渲染进程:页面的渲染、js 的执行、事件的循环都在渲染进程中进行。渲染进程主要包含以下几个线程: JS内核中的线程 Task:Task 有 MicroTask 和 MacroTask 之分,MicroTask 在 Promise 出现之后引入。MacroTask 和 MicroTask 分别在以下几种场景形成: MacroTask:主代码块、setTimeout、setInterval、IO 事件等。 MicroTask:Promise、process.nextTick 等。 浏览器中的Event Loop有了基础概念,让我们来了解一下文章开头给出的代码是怎么执行的,代码如下: 12345678910console.log('script start');setTimeout(() => { console.log('setTimeout');},0);Promise.resolve().then(() => { console.log('promise1');}).then(() =>{ console.log("promise2");});console.log('script end'); 1、首先,整个代码块作为第一个 MacroTask 被执行,同步的代码直接被压入执行栈被执行「同步任务在JS引擎线程上执行」,script start 和 script end 被打印; 2、setTimeout 被作为 MacroTask 处理,加入宏任务队列中; 3、Promise 被作为 MicroTask 处理,加入微任务队列中; 4、本次 MacroTask 处理完毕,检查微任务队列,发现 promise then 的 callback,promise1,promise2 先后打印; 5、接下来执行下一个 MacroTask,即 setTimeout 推送给任务队列的 callback,打印 setTimeout。 so,代码执行结果如下: 12345script startscript endpromise1promise2setTimeout 由此,可大致了解到浏览器下 Event-Loop 执行机制大致如下: Event-Loop 执行机制 1、一开始,整段脚本被当作 MacroTask 执行2、执行过程中,同步代码进入可执行栈中直接执行,MacroTask 进入宏任务队列,MicroTask 进入微任务队列3、当前 MacroTask 执行完就出队,检查微任务队列,如果不为空,则依次执行微任务队列中的 MicroTask,直到微任务队列为空4、执行浏览器的 UI 线程的渲染工作「两个 MicroTask 执行空隙,有次 render 工作」6、执行队首的 MacroTask,回到 2,依此循环,直至宏任务队列和微任务队列都为空可通过下图简单理解一波: 由此可知道,setTimeout 中的 callback 不能按时执行是因为 Event-Loop,导致 JS 引擎线程还有其它的 task (promise MicroTask)要处理,主线程还未空闲下来。 参考 What the heck is the event loop anyway?「很精彩的演讲🐂」 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理 精读《Tasks, microtasks, queues and schedules》 😇原生JS灵魂之问(下) 【THE LAST TIME】彻底吃透 JavaScript 执行机制","categories":[{"name":"JavaScript","slug":"JavaScript","permalink":"https://yeshan333.github.io/categories/JavaScript/"}],"tags":[{"name":"Event-Loop","slug":"Event-Loop","permalink":"https://yeshan333.github.io/tags/Event-Loop/"},{"name":"JavaScript","slug":"JavaScript","permalink":"https://yeshan333.github.io/tags/JavaScript/"}]},{"title":"操作系统笔记-IPC 机制","slug":"Process-IPC","date":"2020-08-02T14:53:41.000Z","updated":"2020-08-02T14:53:41.000Z","comments":true,"path":"2020/08/02/Process-IPC/","permalink":"https://yeshan333.github.io/2020/08/02/Process-IPC/","excerpt":"进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法。 总览IPC","text":"进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法。 总览IPC 进程间通信的问题 竞态条件(race condition):多个进程对共享数据进行修改,影响程序的正确运行。在计算机内存或者存储里,如果同时发出读写大量数据的指令的时候竞态条件可能发生,机器试图覆盖相同的或者旧的数据,而此时旧的数据仍然在被读取。 临界区(critical section):对共享资源进行访问的程序片段。 进程的同步与互斥 进程的同步与互斥 进程的同步(Synchronization)是解决进程间协作关系(直接制约关系) 的手段。进程同步指两个以上进程基于某个条件来协调它们的活动。一个进程的执行依赖于另一个协作进程的消息或信号,当一个进程没有得到来自于另一个进程的消息或信号时则需等待,直到消息或信号到达才被唤醒。进程互斥关系是一种特殊的进程同步关系。在系统中多个进程因争用临界资源(Critical Resource)而互斥执行。 互斥设计互斥设计 参考 现代操作系统 Inter-process communication 进程间通信","categories":[{"name":"操作系统","slug":"操作系统","permalink":"https://yeshan333.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"}],"tags":[{"name":"进程通信","slug":"进程通信","permalink":"https://yeshan333.github.io/tags/%E8%BF%9B%E7%A8%8B%E9%80%9A%E4%BF%A1/"}]},{"title":"操作系统笔记-进/线程模型","slug":"操作系统进-线程模型","date":"2020-07-22T20:22:41.000Z","updated":"2020-07-22T20:22:41.000Z","comments":true,"path":"2020/07/22/操作系统进-线程模型/","permalink":"https://yeshan333.github.io/2020/07/22/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E8%BF%9B-%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8B/","excerpt":"模型是指对于某个实际问题或客观事物、规律进行抽象后的一种形式化表达方式。- MBA 智库百科 - 模型 概念梳理进程 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。 一个进程是某种类型活动的一个活动,它有程序、输入、输出以及状态。进程是对正在运行程序的一个抽象。单个处理器可以被若干进程共享,它使用某种调度算法决定何时停止一个进程的工作,并转而为另一个进程提供服务。一个程序可对应多个进程。 系统资源以进程为单位分配,如内存、文件、每个进程拥有独立的地址空间。","text":"模型是指对于某个实际问题或客观事物、规律进行抽象后的一种形式化表达方式。- MBA 智库百科 - 模型 概念梳理进程 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。 一个进程是某种类型活动的一个活动,它有程序、输入、输出以及状态。进程是对正在运行程序的一个抽象。单个处理器可以被若干进程共享,它使用某种调度算法决定何时停止一个进程的工作,并转而为另一个进程提供服务。一个程序可对应多个进程。 系统资源以进程为单位分配,如内存、文件、每个进程拥有独立的地址空间。 进程表进程表(process table),也称进程控制块(PCB),是由操作系统维护的,每个进程占用其中一个表项。该表项包含了操作系统对进程进行描述和控制的全部信息,从而保证该进程换出后再次启动时,就像从未中断过一样。 典型进程表表项的一些字段 segment 段定义( segment ) 是用来区分或者划分范围区域的意思。汇编语言的 segment 伪指令表示段定义的起始,ends 伪指令表示段定义的结束。段定义是一段连续的内存空间。ref:程序员需要了解的硬核知识之汇编语言(全) 进程控制原语 原语 原语:完成某种特定功能的一段程序,具有不可分割性或不可中断性。即原语的执行必须是连续的,在执行过程中不允许被中断。也就是满足原子性。原子性操作,一组相关操作要么全部执行不可中断,要么就不执行。 进程创建原语 进程撤消原语 阻塞原语 唤醒原语 挂起原语 激活原语 改变进程优先级 上下文切换从一个进程切换到另一个进程需要一定的时间进行管理处理,包括保存寄存器的值和内存映射,更新不同的表格和列表、清除和重新调入内存高速缓存等。 进程间切换(process switch)又称上下文切换(context switch),它是一个存储和重建 CPU 状态的机制,要交换 CPU 上的进程时,必需先行存储当前进程的状态,然后再将进程状态读回 CPU 中。进程不运行时,将寄存器的值保存在进程控制块PCB中;当操作系统要运行一个新的进程时,会将PCB中的相关值送到对应的寄存器中。 地址空间地址空间是内存中可供程序或进程使用的有效地址范围。也就是说,它是程序或进程可以访问的内存。存储器可以是物理的,也可以是虚拟的,用于执行指令和存储数据。 线程线程,是进程中的一个运行实体,是 CPU 调度的基本单位。线程的下文环境是程序计数器等寄存器。线程拥有自己独立的栈和共享的堆。 线程引入解决的问题 降低上下文切换开销,线程的创建、撤销花费时间少于进程 多线程充分利用多核 CPU 的计算能力「内核线程」,在线程粒度进行阻塞而不是进程 降低通信难度,同一进程内的线程共享内存和文件 进程和线程各自持有的资源进程和线程各自持有的资源 多道程序设计中的进程模型 多道程序设计:允许多个程序同时进入内存并运行,其目的是为了提高系统效率。 多道程序设计中的进程模型 图例「来自《现代操作系统》」中多道程序设计计算机的内存中有 4 道程序,这 4 道程序被抽象为各自拥有自己控制流程的进程(每道程序都拥有自己的逻辑计数器)。图 c ,在任何一给定瞬间仅有一个进程真正在运行,进程运行时会将自己的逻辑程序计数器装入实际的物理程序计数器中,进程结束或暂停执行时,物理程序计数器将被保存在内存中该进程的逻辑程序计数器中。 常见线程模型 用户线程和内核线程之分 用户线程,是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全由库函数在用户空间完成,不需要内核的帮助。因此这种线程是极其低消耗和高效的。但同一进程下创建的用户线程对 CPU 的竞争是以进程的维度参与的,这会导致该进程下的用户线程只能分时复用所属进程被分配的 CPU 时间片,所以无法很好的利用 CPU 多核运算的优势。一般情况下说的线程指的是用户线程。内核线程,由操作系统进行管理和调度,能够直接操作计算机的底层资源,线程切换时 CPU 需要切换到内核态。内核级线程可以很好利用多核 CPU 的并行计算额优势,开发人员可以通过系统调用的方式使用内核线程。 用户空间管理线程,整个线程包放在用户空间,内核对线程包一无所知,内核管理的还是进程 每个线程有用自己的线程表,线程在一个运行时系统上执行(运行时系统时一个管理线程的过程的集合,常用过程有 pthread_create、pthread_yield等) 优点: 保存线程状态的过程和调度程序都只是本地过程,效率比进行内核调用高 线程切换不需要内核特权,线程调度非常快捷,调度算法可由应用程序特定 缺点 大多数系统调用都是阻塞的,我们需要避免被阻塞线程影响其他线程,此时阻塞系统调用如何实现? 内核只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上 用户空间管理线程 在内核空间管理线程 内核空间使用线程表记录所有的线程,线程的更新、线程创建、销毁通过系统调用实现 线程阻塞时,内核可选择运行处于就绪态的线程(同一个进程中的线程或其它进程中的线程) 问题: 多线程进程创建新的进程时会遇到到底是拥有与原进程相同数量的线程还是一个线程的问题 如果线程的创建、终止操作较为频繁,系统调用的开销还是不可忽视的 在内核空间实现线程 线程模型混合模型,即内核线程与用户线程间多路复用。 一个进程对应一个内核线程一个进程对应一个内核线程 此模型下(用户级线程模型),线程的创建、切换和同步等工作较为轻量与高效,依赖于编程语言实现。但同进程内的多线程无法很好的利用多核 CPU 优势,只能通过分时复用方式轮换执行。当进程内的任意线程阻塞,比如线程 A 请求 I/O 操作被阻塞,很可能导致整个进程范围内的阻塞,这是因为进程对应的内核线程因进程内的线程被阻塞而被剥夺 CPU 执行时间,导致整个进程丢失在 CPU 执行指令的机会。 进程中的每个线程都对应一个内核线程进程中的每个线程都对应一个内核线程 此模型下(内核级线程模型),线程的调度和管理由操作系统内核负责,每次上下文切换都会从用户态切换到内核态,会产生不小的资源消耗,用户空间创建的线程数量受限于操作系统内核可创建内核线程的数量。但此模型下,多线程可充分利用多核 CPU 的并行计算能力,因为每个线程可以独立地被操作系统调度分配到 CPU 上执行指令,某个线程的阻塞不会影响到进程内其他线程工作的执行。 两级线程模型此模型为用户级线程模型与内核级线程模型的混合,实现多个用户级线程与多个内核级线程的多路复用。此模型下,一个进程对应多个内核线程,有进程内的调度器决定进程内的线程如何与申请的内核线程对应。 两级线程模型 此线程模型可有效降低线程创建和管理的资源消耗,同时提供良好的并行能力。用户线程的调度和管理又进程的调度器负责,内核线程的调度和管理由操作系统负责。但此模型的线程的上下文信息的保存和恢复,栈空间的大小管理给开发人员带来的较大的技术挑战。 Go 中的 MPG 线程模型GO 语言的 MPG 线程模型基于两级线程模型进行了改造,提高了线程调度的灵活度。如图: MPG 线程模型 MPG 解释 M(Machine):一个 Machine 对应一个内核级线程,在 M 的生命周期内,它只会与一个内核线程进行绑定。P(Processor):一个 Processor 表示执行 Go 代码片段所需的上下文环境,在运行时一个 M 只能绑定一个 P,M 和 P 的组合为 G 提供运行环境。在单个 Go 语言进程中,P 的最大数量决定了程序的并发规模。G(Goroutine):Go 语言代码片段的封装(通常为一个方法,函数是 Go 的一等公民),一个待执行的任务,Go 协程。协程(coroutine),一种用户态轻量级线程,不同于之前所说的线程,协程实现的是非抢占式调度(即由当前协程切换到其他协程由当前协程决定),协程是语言级别的。「协作式调度」协程优缺点:coroutine协程详解Go 1.14 基于信号的抢占式调度实现原理 在实际运行过程中,M 和 P 的组合为 G 提供有效的运行环境,而多个可执行 G 将会顺序排成一个队列挂在某个 P 上面,等待调度和执行。M 和 P 会适时的组合和断开,以保证执行 G 队列能够得到及时运行。如下图: Goroutine 阻塞 上图右半部分,当 M 对应的内核线程被唤醒时,M 会尝试为 G0 捕获一个 P 上下文,可能是从空闲的 P 列表中获取,如果获取不成功,M 会把 G0 放入调度器的可执行 G 队列中,等待其他 P 的查找。 参考 现代操作系统 go1.14 基于信号的抢占式调度实现原理 Linux下的进程类别(内核线程、轻量级进程和用户进程) 操作系统原理-进程线程模型「进程状态转换模型」 Go 并发编程实战 coroutine协程详解","categories":[{"name":"Go","slug":"Go","permalink":"https://yeshan333.github.io/categories/Go/"},{"name":"操作系统","slug":"操作系统","permalink":"https://yeshan333.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"},{"name":"进/线程","slug":"操作系统/进-线程","permalink":"https://yeshan333.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E8%BF%9B-%E7%BA%BF%E7%A8%8B/"}],"tags":[{"name":"进程","slug":"进程","permalink":"https://yeshan333.github.io/tags/%E8%BF%9B%E7%A8%8B/"},{"name":"线程","slug":"线程","permalink":"https://yeshan333.github.io/tags/%E7%BA%BF%E7%A8%8B/"}]},{"title":"React Hooks 那些事儿","slug":"React-Hooks-那些事儿","date":"2020-07-08T14:33:31.000Z","updated":"2020-07-08T14:33:31.000Z","comments":true,"path":"2020/07/08/React-Hooks-那些事儿/","permalink":"https://yeshan333.github.io/2020/07/08/React-Hooks-%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF/","excerpt":"翻了波之前写的文章还有笔记,发现关于前端的文章并不多(好歹也划水做过点前端开发)。巧了,最近没什么好话题可写,做下 React Hooks 学习笔记吧。 Effect Hook不得不说 Hook 的出现降低了我们在 React 中处理副作用(side effect)的心智负担,通过 useEffect 就可以很好的完成之前需要使用几个生命周期函数配合才能完成的事。 Effect Hook 死循环请求问题由于 Effect Hook 不熟「官方文档没读透」,最近使用 useEffect 出现了异步请求发送了无限次的问题,翻🚗了。我有个组件大概是这么写的:","text":"翻了波之前写的文章还有笔记,发现关于前端的文章并不多(好歹也划水做过点前端开发)。巧了,最近没什么好话题可写,做下 React Hooks 学习笔记吧。 Effect Hook不得不说 Hook 的出现降低了我们在 React 中处理副作用(side effect)的心智负担,通过 useEffect 就可以很好的完成之前需要使用几个生命周期函数配合才能完成的事。 Effect Hook 死循环请求问题由于 Effect Hook 不熟「官方文档没读透」,最近使用 useEffect 出现了异步请求发送了无限次的问题,翻🚗了。我有个组件大概是这么写的: 12345678910111213141516171819202122232425262728293031323334353637383940import React, { useState, useEffect } from 'react';import request from 'umi-request';import logo from './logo.svg';import './App.css';function App() { const [data, setData] = useState([]); useEffect(() => { request('https://jsonplaceholder.typicode.com/todos/', { method: 'get', }) .then(response => { console.log('fetch data'); setData(response); }) .catch(error => { console.log("report error: ", error); }) }); return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <ul> {data.map(item => { return ( <li key={item.id}>{item.title}</li> ); })} </ul> </header> </div> );}export default App; 效果如下: 效果 https://zo2c2.csb.app/,可以很方便的从调试控制台看到,异步请求一直在发,陷入了死循环之中。这是为什么?因为 useEffect 会在组件 Mounting 和 Updating 阶段执行。每次 request 请求成功,我们都会设置一次组件的 state -> data,所以组件会更新,useEffect 会再次执行,循环往复,造成了无限重复请求问题。那么,如何解决这个问题?之前我忽略了 useEffect 第二个参数的存在,使用 useEffect 的第二个参数可以解决这个问题。一般情况下,我们希望组件只在 mounting 阶段异步获取数据,所以,我们可以这么设置 useEffect 的第二个参数,让它具有和 componentDidMount 生命周期函数类似的行为(组件第一次 mount 后执行): React 组件生命周期 来源:https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/ 123456789101112useEffect(() => { request('https://jsonplaceholder.typicode.com/todos/', { method: 'get', }) .then(response => { console.log('fetch data'); setData(response); }) .catch(error => { console.log("report error: ", error); })}, []); 我们传递了一个空数组作为 useEffect 的第二个参数,这样就能避免在组件 Updating 阶段执行 useEffect。这个数组成为依赖数组。依赖数组为空,表明 useEffect 不会因为某个变量的变化而再次执行。在组件需要根据某个变量变化进行渲染的时候,可以将此变量放到依赖数组中,一旦这个依赖的变量变动,useEffect 就会重新执行。 让组件卸载后做点事在 class 组件中,我们可以将组件卸载后要做的事放在 componentWillUnmount 中。引入 Hook 后,在 function 组件中,我们可以把组件卸载要做的事放在 useEffect 中,让它返回一个 callback 即可,如下: 1234567891011121314151617181920212223242526272829import React, { useState, useEffect } from "react";function Child({ visible }) { useEffect(() => { alert("组件已挂载"); return () => { // return 一个 callback alert("组件已被卸载!!"); }; }, []); return visible ? "true" : "false";}export default function App() { const [visible, changeVisible] = useState(true); return ( <div> {visible && <Child visible={visible} />} <button onClick={() => { changeVisible(!visible); }} > {visible ? "卸载组件" : "挂载组件"} </button> </div> );} effect 卸载组件做点事儿 参考 精读 useEffect 完全指南 useEffect 完整指南 useEffect 使用指南 How to fetch data with React Hooks? 看完这篇,你也能把 React Hooks 玩出花","categories":[{"name":"React","slug":"React","permalink":"https://yeshan333.github.io/categories/React/"}],"tags":[{"name":"React","slug":"React","permalink":"https://yeshan333.github.io/tags/React/"}]},{"title":"使用docker-compose编排前后端分离应用","slug":"使用docker-compose编排前后端分离应用","date":"2020-06-28T11:39:55.000Z","updated":"2020-06-28T11:39:55.000Z","comments":true,"path":"2020/06/28/使用docker-compose编排前后端分离应用/","permalink":"https://yeshan333.github.io/2020/06/28/%E4%BD%BF%E7%94%A8docker-compose%E7%BC%96%E6%8E%92%E5%89%8D%E5%90%8E%E7%AB%AF%E5%88%86%E7%A6%BB%E5%BA%94%E7%94%A8/","excerpt":"几个月过去了,是时候把当初的 🚩 干掉了。 顺便提高下 docker 的熟练度,得闲看下原理🚩(假期看过,没总结…)。 重装了波系统(Windows 2004 版本),这个版本下,Docker Desktop 是以 WSL2 为 backend 的,不用 Hyper -V 了,舒服了很多。 细品了下(又摸鱼搞 DevOps),跑这个前后端分离项目需要到的容器还挺多,4 个左右(后端 REST 服务、数据库服务、前端服务),前端服务上了两个容器『貌似没必要』,一个用来过渡,一个跑挂着 SPA 的 Nginx。 这次祭出了 Docker Compose,毕竟容器有点“小多”,单单用命令费劲。","text":"几个月过去了,是时候把当初的 🚩 干掉了。 顺便提高下 docker 的熟练度,得闲看下原理🚩(假期看过,没总结…)。 重装了波系统(Windows 2004 版本),这个版本下,Docker Desktop 是以 WSL2 为 backend 的,不用 Hyper -V 了,舒服了很多。 细品了下(又摸鱼搞 DevOps),跑这个前后端分离项目需要到的容器还挺多,4 个左右(后端 REST 服务、数据库服务、前端服务),前端服务上了两个容器『貌似没必要』,一个用来过渡,一个跑挂着 SPA 的 Nginx。 这次祭出了 Docker Compose,毕竟容器有点“小多”,单单用命令费劲。 Demo 实战 Demo 地址:https://github.com/yeshan333/Flask-React-ToDoList 123git clone https://github.com/yeshan333/Flask-React-ToDoListcd Flask-React-ToDoListgit checkout docker 1、先给后端服务写个 Dockerfile这个项目的后端服务是用 Flask 写的,Dockerfile 如下所示: 12345678910111213141516171819202122FROM python:3.8-alpineLABEL maintainer = "yeshan <yeshan1329441308@gmail.com>"EXPOSE 5000# Keeps Python from generating .pyc files in the containerENV PYTHONDONTWRITEBYTECODE 1# Turns off buffering for easier container loggingENV PYTHONUNBUFFERED 1# Install pip requirementsADD requirements.txt .RUN python -m pip install -r requirements.txtWORKDIR /appADD . /app# production web serverCMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]# CMD ["flask", "run", "--host", "0.0.0.0", "--port", "5000"] 生产环境下,Flask 自带的服务器不够骚,所以这里上 gunicorn。 2、再给前端 React-SPA 写个 Dockerfile前端使用 React 编写「想起初学那时候抽组件那叫一个痛苦」,Dockerfile 如下 12345678910111213141516171819FROM node:12.18-alpine as frontend-reactLABEL maintainer = "yeshan <yeshan1329441308@gmail.com>"ENV NODE_ENV productionWORKDIR /usr/src/appCOPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]RUN npm install && npm install -g serveCOPY . .RUN npm run buildEXPOSE 5000CMD ["serve", "-l", "tcp://0.0.0.0:5000", "-s", "build"] 原来想的是直接使用 react-script 自带的 HTTP 服务器的,前端应用也在容器跑,但是这个 HTTP 服务器不够骚,为了生产环境,还是上 Nginx 了。为了调试,使用 serve 套一下构建好的页面。 3、编写 docker-compose.yml 对容器进行编排接下来的编排文件才是大头,调试了半天『🤣连接 MongoDB😂』。这个 URI 连接字符串试了多种操作,比如:connection = MongoClient("mongodb://mongo:27017/")、connection = MongoClient("mongo:27017"),最后还是看文档解决的,这…,文档还是香的。 原来 compose v2 以上,使用 compose 进行编排时,会默认建立一个网络(bridge 类型),连接各个容器,主机名和容器名相同,后面指定了下container_name: flask_backend、container_name: mongo_database才在 flask_backend 容器 ping 通 MongoDB 服务。 文档原文如下: By default Compose sets up a single network for your app. Each container for a service joins the default network and is both reachable by other containers on that network, and discoverable by them at a hostname identical to the container name.🔗 OK,看下这个小 demo 的编排文件: 12345678910111213141516171819202122232425262728293031323334353637383940414243version: '3.4'services: backend: container_name: flask_backend image: backend build: context: ./backend dockerfile: Dockerfile ports: - "5000:5000" depends_on: - database database: container_name: mongo_database image: mongo volumes: - data:/data/db frontend: container_name: frontend-react image: frontend build: context: ./frontend dockerfile: Dockerfile volumes: - static:/usr/src/app/build ports: - "3000:5000" nginx: container_name: webserver-nginx image: nginx:latest ports: - "80:80" volumes: - static:/usr/share/nginx/html command: "/bin/bash -c "nginx -g 'daemon off;'"volumes: data: static: 可以明显的看到,之前为前端 SPA 创建的容器只是为了做下过渡「通过 static volumn 进行过渡」。最终的应用还是挂在 Nginx 上的。通过 volume 做下持久存储。 最后,跑下试试,看看效果如何。 1docker-compose up -d 12# 初始化数据库docker exec -i flask_backend flask create-database 开始编排容器创建的网络与卷效果 收工,下一步就是做下服务抽离,部署到云原生的操作系统上-Kubernetes!🚩 参考 Compose file version 3 reference Networking in Compose Python in a container docker-practice npm serve 使用 Docker 部署 NodeJS + MongoDB 项目 Docker Nginx 部署 React","categories":[{"name":"docker","slug":"docker","permalink":"https://yeshan333.github.io/categories/docker/"}],"tags":[{"name":"docker","slug":"docker","permalink":"https://yeshan333.github.io/tags/docker/"},{"name":"DevOps","slug":"DevOps","permalink":"https://yeshan333.github.io/tags/DevOps/"},{"name":"服务编排","slug":"服务编排","permalink":"https://yeshan333.github.io/tags/%E6%9C%8D%E5%8A%A1%E7%BC%96%E6%8E%92/"}]},{"title":"给 GitHub commit 加个小绿标","slug":"给 GitHub commit 加个小绿标","date":"2020-06-26T19:11:12.000Z","updated":"2020-06-26T19:11:12.000Z","comments":true,"path":"2020/06/26/给 GitHub commit 加个小绿标/","permalink":"https://yeshan333.github.io/2020/06/26/%E7%BB%99%20GitHub%20commit%20%E5%8A%A0%E4%B8%AA%E5%B0%8F%E7%BB%BF%E6%A0%87/","excerpt":"最近一波重装系统啥都没了,最常用的 Git 配置肯定得安排回来的。记得之前给 git 的 commit 加了个签名,回想下为什么要给 commit 做下签名?因为它能让 GitHub 的 commit 历史更帅?看下加签名之前是怎么样的: 对commit进行签名前","text":"最近一波重装系统啥都没了,最常用的 Git 配置肯定得安排回来的。记得之前给 git 的 commit 加了个签名,回想下为什么要给 commit 做下签名?因为它能让 GitHub 的 commit 历史更帅?看下加签名之前是怎么样的: 对commit进行签名前 再看下对 commit 签名后是怎么样的: 对commit进行签名后 这么一对比,是更帅了!但我好像不是因为这的才做的。我是为了更好的去混开源项目做的,这个绿标能更好的证明我的身份!!!(假装我很专业,2333~)。使用过 Git 的同学应该都晓得,我们的提交作者信息是可以自己设置的(这意味着我们可以使用他人身份信息),如下: 12$ git config user.name "tester"$ git config user.email "gg@qq.com" 冒用作者信息 我们可以看到,是可以 push 到 GitHub 的[没有小绿标而已]。这看起来就不太好,得让 GitHub 证明下自己得身份才行,从官方文档可以看到, GitHub 提供了一种使用 GPG 的方式可以让我们的 commit “戴”上小绿标。 忘了当初是怎么操作的了,在 Windows 下操作貌似还挺麻烦的,趁此捋一下过程,趁机水篇文章。 GNU Privacy Guard(GnuPG或GPG)是一个密码学软件,用于加密、签名通信内容及管理非对称密码学的密钥。 生成 GPG 密钥对第一步肯定就是通过 GPG 生成密钥对了。这时候需要到一个 GnuPG 软件,OK,去下载:🔐GnuPG。其实 Git fot windows 自带一个 gpg 命令行程序,但是命令行用多了,还是上 GUI 愉快点吧,我们选择使用带 GUI 的 Gpg4win🔗。 我们通过全家桶软件之 Kleopatra 新建立一对密钥,名字为 GitHub 用户名,邮箱为 GitHub 的注册邮箱(使用 4096 bits的密钥): 设置 passphrase (通行口令)来保护我们的密钥对,每次签名都会用它到。(也可以不设置,不用口令验证就可以直接使用密钥) 好了,密钥对生成完毕。下一步,就是把把公钥放到 GitHub 上,让 GitHub 对我们的提交进行验证,判断是否该给 commit “戴”上小绿标。[获取公钥:鼠标右键->细节->导出]、[GitHub 添加公钥:Settings->SSH and GPG keys]。 下一步就是开启 Git 提交签名。 启用 Git 提交签名首先,我们需要让 Git 知道 gpg 的可执行程序在哪里?gpg 的可执行程序位于Gpg4win🔗同级目录下的GnuPG/bin中(GnuPG 是 Gpg4win 组件之一),我们需要进行如下配置: 1$ git config --global gpg.program <path_to_gpg> 我的设置如下: 1234$ where gpgE:\\Git\\usr\\bin\\gpg.exe # 这个是 Git for windows 自带的E:\\GnuPG\\bin\\gpg.exe # 这个才是我们要用的$ git config --global gpg.program "E:\\GnuPG\\bin\\gpg.exe" 然后每次git commit时,加上-S即可启用签名。 每次都要多打个参数多麻烦,我们通过如下配置让 Git 默认启用 GPG 签名: 1$ git config --global commit.gpgsign true 最后我们git push一下看看有没有效果。https://github.com/yeshan333/anonymous-git-commit/commits/master 没问题,收工了。我的 Git 全局配置如下: 12345678$ cat ~/.gitconfig[user] name = yeshan333 email = 1329441308@qq.com[gpg] program = E:\\\\GnuPG\\\\bin\\\\gpg.exe[commit] gpgsign = true 参考 GunPG GitHub - Signing commits 给你的 Git commit 加上绿勾 - 一个简单但很多人没注意的细节","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"GPG","slug":"GPG","permalink":"https://yeshan333.github.io/tags/GPG/"},{"name":"加密","slug":"加密","permalink":"https://yeshan333.github.io/tags/%E5%8A%A0%E5%AF%86/"},{"name":"隐私","slug":"隐私","permalink":"https://yeshan333.github.io/tags/%E9%9A%90%E7%A7%81/"}]},{"title":"将 Web 应用丢给守护进程","slug":"将Web应用丢给守护进程","date":"2020-06-21T14:26:36.000Z","updated":"2020-06-21T14:26:36.000Z","comments":true,"path":"2020/06/21/将Web应用丢给守护进程/","permalink":"https://yeshan333.github.io/2020/06/21/%E5%B0%86Web%E5%BA%94%E7%94%A8%E4%B8%A2%E7%BB%99%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B/","excerpt":"最近老是要把 Web App/Service 部署在个人的服务器上进行测试,发现自己不怎么熟悉「前提:不上 docker ,逃~」,特写此文章来纪念下🤔👀(之前部署的 Web App/Service 都是丢给 Heroku、Netlify、GitHub 这样的 PaaS 平台运行,写个配置文件「action、yaml、toml」就完事了。自己整的玩意儿丢在自己服务器上跑的并不算多,今天费点劲,了解点基础设施。根据冰山模型,了解下 FaaS 能更好的了解 PaaS)。","text":"最近老是要把 Web App/Service 部署在个人的服务器上进行测试,发现自己不怎么熟悉「前提:不上 docker ,逃~」,特写此文章来纪念下🤔👀(之前部署的 Web App/Service 都是丢给 Heroku、Netlify、GitHub 这样的 PaaS 平台运行,写个配置文件「action、yaml、toml」就完事了。自己整的玩意儿丢在自己服务器上跑的并不算多,今天费点劲,了解点基础设施。根据冰山模型,了解下 FaaS 能更好的了解 PaaS)。 冰山的底部-基础在把 Web 应用丢给守护(daemon)进程前,应该了解部分基础概念。 守护进程是在后台运行不受终端控制的进程(如输入、输出等)。 插入个场景,我们之前在开发环境下,是如何运行 Web 服务的?对于 Spring Boot,我们可以在终端使用 mvn spring-boot:run 在前台跑 Web 服务;对于 React 前端应用,我们可以使用 npm script 即 npm start 启动前端 HTTP 服务器进行 view 层预览。问题来了,这样操作,服务进程是跑在前台的(所谓的前台任务/进程),当我们退出操作终端或者手动终止时,这些服务也就不能用了,而且前台任务独占了一个终端,使得我们不能再在此终端执行其他命令。在生产环境下,我们要让服务持久运行,这种情况明显不是我们想看到的,那么,如何解决这个问题? 所谓的前台任务是我们可以直接看得到的。 在了解如何解决问题前,我觉得有必要了解下为什么前台任务会随着 session 的退出而退出(收到了 SIGHUP)。Linux 系统对此的设计如下: 12341、用户准备退出 session2、系统向该 session 发出SIGHUP信号3、session 将SIGHUP信号发给所有子进程4、子进程收到SIGHUP信号后,自动退出 SIGHUP 是什么 SIGHUP(signal hang up) 信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一 session 内的各个作业, 这时它们与控制终端不再关联. 系统对 SIGHUP 信号的默认处理是终止收到该信号的进程。查看维基百科:Unix 信号 什么是进程组 进程组是一系列相互关联的进程集合,系统中的每一个进程必须从属于某一个进程组;每个进程组中都会有一个唯一的 ID(process group id),简称 PGID;PGID 一般等同于进程组的创建进程的 Process ID,而这个进程一般也会被称为进程组先导(process group leader),同一进程组中除了进程组先导外的其他进程都是其子进程;进程组的存在,方便了系统对多个相关进程执行某些统一的操作,例如,我们可以一次性发送一个信号量给同一进程组中的所有进程。 什么是 session 会话(session)是一个若干进程组的集合,同样的,系统中每一个进程组也都必须从属于某一个会话;一个会话只拥有最多一个控制终端(也可以没有),该终端为会话中所有进程组中的进程所共用。一个会话中前台进程组只会有一个,只有其中的进程才可以和控制终端进行交互;除了前台进程组外的进程组,都是后台进程组;和进程组先导类似,会话中也有会话先导(session leader)的概念,用来表示建立起到控制终端连接的进程。在拥有控制终端的会话中,session leader 也被称为控制进程(controlling process),一般来说控制进程也就是登入系统的 shell 进程(login shell); OK,回到我们的问题,如何让任务持久运行、不影响其他操作。这时,后台进程就该登场了,将任务丢在后台执行。一个任务要丢给守护进程的第一步就是要将他变为后台进程。变为后台进程后,一个进程是否就成为了守护进程呢?或者说,用户退出 session 以后,后台进程是否还会继续执行?答案是未必。看完后面就明白了。 冰山的上层-应用Linux 提供了很多种方法让我们将前台进程变为后台进程,挑几种介绍下。 将前台进程变为后台进程的几种方式位与运算符-&通过在命令的尾部加个符号&即可将进程启动为后台进程,后台进程的特点如下: 后台进程特点 1、继承当前 session (对话)的标准输出(stdout)和标准错误(stderr)。因此,后台任务的所有输出依然会同步地在命令行下显示。2、不再继承当前 session 的标准输入(stdin)。你无法向这个任务输入指令了。如果它试图读取标准输入,就会暂停执行(halt)。这个特点使得我们可以执行其他命令。 我们可以运行一个 FastAPI 编写的 Web 服务观察下。 1uvicorn main:app --reload & 可以很明显的看到,后台进程继承了当前 session (对话)的标准输出(stdout)。我们知道进程收到 SIGHUP 信号会被终止,那么后台进程是否会收到 SIGHUP 信号挂掉?掏出阿里云服务器实验下。 这。。。后台进程在我们退出 session 后挂掉了!!!,这是为啥?那是因为后台进程与标准 I/O 有交互(这个服务打日志了),后台进程的的标准 I/O 继承自当前 session,就算加个 & 符号也没有改变这一特点。我们想要的是服务在后台持久运行,怎么解决? Linux 提供了一个 nohup 命令可以帮我们解决这个问题。 FastAPI Web 服务代码 12345678910111213141516171819202122232425# -*- coding: utf-8 -*-from fastapi import FastAPIfrom pydantic import BaseModelapp = FastAPI()class People(BaseModel): name: str age: int country: str offer_call: bool = None@app.get('/')def root(): return {"status": "hello world"}@app.get('/person/{your_name}')def get_people_info(your_name: str, q: int = None): return {"your name": your_name, "query": q}@app.put('/person/{your_name}')def update_people_info(your_name: str, person: People): return {"people name": your_name, "locate": person.age} 阻断 SIGHUP 信号的 nohup 好了,就算结束了 session 此 Web 服务仍在运行。nohup 命令实际上将子进程与它所在的 session 分离了。OK,进程由后台进程变为守护进程了(有那味了,还不算真正的守护进程)。 守护进程在 session 关闭时不会受影响。守护进程的会话组和当前目录,文件描述符都是独立的。后台运行只是终端进行了一次fork,让程序在后台执行,这些都没改变。 nohup 做的那些事 阻止SIGHUP信号发到这个进程(PID:14229)。关闭标准输入。该进程不再能够接收任何输入,即使运行在前台。重定向标准输出和标准错误到文件nohup.out。 守护进程管理工具-systemdSystemd(System Daemon) 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。这里不做介绍,直接结合场景来玩耍。教程可看:Systemd 入门教程:命令篇。 是时候掏出 Spring-Boot 应用了(mvn clean package 构建好 jar 包)。先为这个应用写个 Systemd 的配置文件spring-boot-app.service,如下 12345678910111213[Unit]Description=Spring Boot RESTful APIs Services[Service]ExecStart=/usr/local/java/jdk1.8.0_221/bin/java -jar /home/www/body/target/bodymanagement-0.0.1-SNAPSHOT.jarRestart=alwaysUser=rootGroup=rootEnvironment=PATH=/usr/local/java/jdk1.8.0_221/bin/javaWorkingDirectory=/home/www/body/[Install]WantedBy=multi-user.target 然后执行如下命令: 123456# 将配置文件拷贝到 systemd 中cp spring-boot-app.service /etc/systemd/system# 重载配置文件$ sudo systemctl daemon-reload# 启动服务$ sudo systemctl start spring-boot-app.service 访问:http://47.92.4.141:8080/api/user/findLatestInf,即可看到网页显示[]。 12$ systemctl enable spring-boot-app.service # 设置开机启动Created symlink from /etc/systemd/system/multi-user.target.wants/spring-boot-app.service to /etc/systemd/system/spring-boot-app.service. 使用systemctl status spring-boot-app.service可以查看服务状态,使用journalctl -u spring-boot-app可以查看服务状态。 更多常用命令如下: 1234567891011121314151617181920212223242526272829# 查看某个 Unit 的日志$ sudo journalctl -u nginx.service# 查看某个 Unit 状态$ sudo systemctl status mongod# 让某个 Unit 开机时启动$ sudo systemctl enable mongod# 立即启动一个服务$ sudo systemctl start apache.service# 立即停止一个服务$ sudo systemctl stop apache.service# 重启一个服务$ sudo systemctl restart apache.service# 杀死一个服务的所有子进程$ sudo systemctl kill apache.service# 重新加载一个服务的配置文件, 一旦配置文件修改就需要使用$ sudo systemctl reload apache.service# 查看某个服务的配置文件$ systemctl cat sshd.service# 重新加载所有配置文件$ sudo systemctl daemon-reload 参考 网络编程的三个重要信号(SIGHUP ,SIGPIPE,SIGURG) Linux 守护进程的启动方法 什么是守护进程 Node 应用的 Systemd 的启动","categories":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/categories/Linux/"}],"tags":[{"name":"服务器进程管理","slug":"服务器进程管理","permalink":"https://yeshan333.github.io/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86/"}]},{"title":"(译)通过 Git 和 Angular 了解语义化提交信息","slug":"译-通过-Git-和-Angular-了解语义化提交信息","date":"2020-06-04T22:06:59.000Z","updated":"2020-06-04T22:06:59.000Z","comments":true,"path":"2020/06/04/译-通过-Git-和-Angular-了解语义化提交信息/","permalink":"https://yeshan333.github.io/2020/06/04/%E8%AF%91-%E9%80%9A%E8%BF%87-Git-%E5%92%8C-Angular-%E4%BA%86%E8%A7%A3%E8%AF%AD%E4%B9%89%E5%8C%96%E6%8F%90%E4%BA%A4%E4%BF%A1%E6%81%AF/","excerpt":"受传统提交规范和 Angular 约定的启发,让我们来解释语义化提交术语,并演示提交信息的实际示例。 许多项目决定以某种约定方式来标准化它们的提交信息。这种做法并不是新出现的,但在最近几年中越来越多地得到了应用。而且很可能您已经在某些项目中遇到过这样的提交消息。","text":"受传统提交规范和 Angular 约定的启发,让我们来解释语义化提交术语,并演示提交信息的实际示例。 许多项目决定以某种约定方式来标准化它们的提交信息。这种做法并不是新出现的,但在最近几年中越来越多地得到了应用。而且很可能您已经在某些项目中遇到过这样的提交消息。 最早出现的规范之一来自与 AngularJS 项目。这个项目团队创建了一个详细的文档,其中指定了他们应该提交的目标和方式。这些提交约定非常流行,有些您可能通过 Karma 指南遇到过。但是,还有一些不同的约定,像 jQuery, JSHint, Ember, Angular(一个受AngularJS 提交规范启发的增强版约定),甚至更多: 可以清楚地看到上面各种各样的提交约定,这无疑构成了一个标准化官方规范的正当理由。约定式提交就是这样一种规范,它在实践中简化了 Angular 约定,并简化指出了提交消息规范的要点。 在本文中,我们将介绍“语义化提交”背后的概念,并使用 Git 和 Angular 的提交约定来演示具体的例子。声明一下,我们使用它们只是为了澄清概念——意味着版本控制工具和规范的选择取决于您。 那我们就开始吧!👨🏻‍🏫 动机让我们从定义开始: 语义化提交是遵循着特定约定并具有人类和机器可读含义的提交消息 这意味着,它只是提交消息的指导方针,因此: 提交消息是语义化的:因为它们被划分为有意义的类型,标识了提交(commit)的意图 提交消息是约定俗成的:对于开发者和工具,它们有着统一的结构和良好的类型标识 此外,当我们通常需要执行以下操作时,语义化提交可能会派上用场: 允许维护人员和贡献者轻松地浏览项目历史并理解提交的意图,同时通过提交消息类型忽略不重要的更改 强制提交信息的结构,鼓励有针对特定目的的小型提交 直接提交信息的主体,不必话大段话去解说 根据提交信息类型自动更新包版本号(Bump the package version) 自动生成日志(CHANGELOGs)和 release 说明 最后,语义化提交致力于实现更好的可读性和自动化,以及速度的提高。 话虽如此,我们中的一些人可能不接受这些消息约定,认为它们是可读的或提供信息的,这显然是有意义的。所以如果我们也不需要这些附带的好处,那在项目中执行这样的规范显然是没有意义的。 好了,是时候了解我们如何实际遵循这些约定了。 免责声明:从这一刻起,我们将引用 Angular 提交信息约定及其好处。 提交信息的格式Angular 规范要求根据以下结构来构造提交消息(Commit Message): 上图向我们说明了提交消息由三个部分组成 —— header、body 和 footer 。 HeaderHeader 是强制要求的一行,它简单地描述了更改的目的(最多100个字符)。更好的是,它本身由三部分组成: 类型(Type):标识更改类型的短前缀 范围(Scope):可选项,表明 Commit 影响的范围 主体(Subject):表示对实际更改的简明描述 实际上,就 Git 而言,它就是提交消息的首行: 1git commit -m "fix(core): remove deprecated and defunct wtf* apis" 我们插入单行消息,并用 : 分隔。当 fix和 core(受影响的包)分别是类型和范围时,我们将左分区假设称为“前缀”。另一方面,右分区显然构成了主体(Subject)。 简而言之,上述消息含义是:“本次更改通过移除不推荐使用(deprecated)和不存在的 wtf * api 修复了来自Core软件包的错误”。 Body主体(Body)是可选行,用于介绍本次更改背后的动机或仅描述一些更详细的信息。 让我们以上述的例子为例,并添加一个主体: 1git commit -m "fix(core): remove deprecated and defunct wtf* apis" -m "These apis have been deprecated in v8, so they should stick around till v10, but since they are defunct we are removing them early so that they don't take up payload size." 现在,我们在消息上附加了几句话,详细说明了此提交(Commit)目的。 请注意以下几点: 我们使用了多个-m来连接段落而不是简单的行 头部和主体应该用空白行分隔(根据这些段落,这显然是正确的) 注意:尽管我们可以使用其他方式将消息分成几行,但为了简单起见,我们将在下一个示例中继续使用多个 -m(展示了一个与shell无关的解决方案)。 Footer尾部(Footer)是可选行,其中提到了由于更改而产生的影响,例如:宣布重大更改、链接关闭已解决的问题(issues)、提及贡献者等等。 这是上述带有尾部(footer)的提交消息: 1git commit -m "fix(core): remove deprecated and defunct wtf* apis" -m "These apis have been deprecated in v8, so they should stick around till v10, but since they are defunct we are removing them early so that they don't take up payload size." -m "PR Close #33949" 在本例中,我们只是简单地添加了对相关拉请求(pull request)的引用,而没有添加其他内容。 最后,让我们查看完整的提交日志: 正如您可能会推断的,此提交实际上是 Angular 存储库中存在的。 常见类型除了定义提交消息格式外,Angular 的提交消息约定还指定了一个有用的类型列表,其中包含了各种各样的更改。 在开始之前,我们应该区分如下两种类型: 开发(Development):一种维护类型,它对变更进行分类,面向开发人员,这些变更实际上并不影响产品代码,而是影响内部的开发环境和工作流程(workflows) 生产(Production):一种增强类型,用于对仅影响产品代码的最终用户(end users)进行更改分类 现在,让我们介绍和解释这些类型。 注意:以下示例直接取自Angular存储库的提交日志。 👷构建构建类型 build(以前称为chore)用于识别与构建系统相关的开发更改(涉及脚本、配置或工具)和包依赖项(dependencies)。 例子: 💚cici 类型用于识别与持续集成和部署系统相关的开发更改——包括脚本、配置或工具。 例子: 📝文档docs文档类型用于识别与项目相关的文档更改——无论是针对最终用户的外部更改(对于库)还是针对开发人员的内部更改。 例子: ✨特性该feat类型用于标识生产环境相关的新的向后兼容能力(backward-compatible)或功能的更改。 例子: 🐛修复fix类型用于标识生产环境相关向后兼容(backward-compatible)的 bug 修复(bug fixes) 例子: ⚡️性能perf类型用于标识生产环境相关向后兼容的性能(performance)改进相关的产品更改。 例子: ♻️重构refactor类型用于识别与修改代码库相关的开发更改,这些更改既没有添加功能,也没有修复 bug —— 例如删除冗余代码、简化代码、重命名变量等等。 例子: 🎨风格style类型用于标识代码样式变动相关的开发更改,而不考虑其含义——例如缩进、分号、引号、结尾逗号等等。 例子: ✅测试test类型用于标识与测试相关的开发更改——例如重构现有测试或添加新测试。 例子: 好处现在我们已经熟悉了这些约定,让我们看看从中收获的两种好处。 浏览历史变更记录Git 为我们提供了浏览存储库提交历史的能力,所以我们就可以知道实际发生了什么,谁做了贡献等等。 让我们看看这些约定是如何简化我们对这些记录的浏览: 1git log --oneline --grep "^feat\\|^fix\\|^perf" 我们使用提交消息类型来过滤,因此只显示生产更改(所有以 feat、fix 或 perf开头的消息)。 另一个例子: 1git log --oneline --grep "^feat" | wc -l 我们只打印 feat 更改的总数。 上述的关键是提交消息格式非常结构化,这使得我们在扫描或过滤提交历史记录时能够有效地依赖于此格式。 即,更加迅速!💪🏻 自动发布提交消息格式对于自动化发布过程的步骤也很有用。 事实上,这可能是因为像Standard Version和Semantic Versioning这样的工具严格遵循语义化的版本规范和特定的信息提交约定(分别是传统的提交约定和 Angular 约定)。它们之间的主要区别在于 approach,但是让我们关注语义化发布(Semantic Release)。 因此,基于提交信息(特别是类型)——语义化发布(Semantic Release)能够给我们提供以下能力: 转到下一个语义化包版本(发生重大变更时-补丁发布、监控到新特性和性能的优化) 创建一个包含生产环境相关发布信息的 CHANGELOG 文件 为新的发布版本创建一个 Git tag 将release artifact发布(Publish)到 npm 注册中心 酷吧? 例如,Ionic 的angular-toolkit项目,集成了语义化发布来自动化发布过程(在此遵循 Angular 的提交约定): 正如我们所注意到的,发布的版本是基于 tag 和注释生成的——但重点是,这是自动完成的。🤖 其它为了充分利用语义化提交(semantic commit),让我们来看一些东西。 使用Emojis将表情符号附加到提交消息可能会进一步提高可读性,这样我们就可以在浏览提交历史时非常快速和容易地识别它们。💯 请参阅以下链接: gitmoji Commit Message Emoji 👋 CLI工具Commitizen 是一个通过命令行强制格式化提交信息的工具: 检查器(Linter)commitlint 是一个保证提交消息格式符合约定的工具: VSCode扩展如果你想使用一个可定制的VScode扩展,那么下面的内容可能会让你感兴趣: 总结我们今天介绍了“语义化提交”这个术语,并通过遵循 Angular 提交消息约定的具体例子,解释了这种消息的结构。 概括要点: 语义化提交是对开发人员和工具都有重要意义的提交信息方式,它们遵循特定的约定 语义化提交(以及基于它的工具)有助于提高可读性、速度和自动化 Conventional Commits 是一个详细描述语义提交的规范,遵循轻量级约定 Angular 的指导原则详细描述了遵循项目约定的语义化提交,包括: 包含 header、body 和 footer 的信息格式 与开发和生产相关的提交更改的类型 我们可以利用信息约定轻松浏览提交历史 我们可以从这些规范收获自动化发布流程(release process)的好处 最后,不管您是否决定采用这些约定,您可能会偶尔遇到它们,所以请记住上面的几点。😉 原文地址:Understanding Semantic Commit Messages Using Git and Angular 原文作者:Nitay Neeman 译文首发于:Seven innovation base/Git-IN-ACTION-docs 译者:MrGo123 校对者:yeshan333","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"},{"name":"工程化","slug":"工程化","permalink":"https://yeshan333.github.io/tags/%E5%B7%A5%E7%A8%8B%E5%8C%96/"},{"name":"译文","slug":"译文","permalink":"https://yeshan333.github.io/tags/%E8%AF%91%E6%96%87/"}]},{"title":"了解一波经典的 I/O 模型","slug":"了解一波经典的-IO-模型","date":"2020-05-19T15:19:14.000Z","updated":"2020-05-19T15:19:14.000Z","comments":true,"path":"2020/05/19/了解一波经典的-IO-模型/","permalink":"https://yeshan333.github.io/2020/05/19/%E4%BA%86%E8%A7%A3%E4%B8%80%E6%B3%A2%E7%BB%8F%E5%85%B8%E7%9A%84-IO-%E6%A8%A1%E5%9E%8B/","excerpt":"最近读了波网络 I/O 相关的文章,做下总结、摘录。(未完) 经典 I/O 模型 阻塞式 I/O(blocking I/O) 非阻塞式 I/O(non-blocking I/O) I/O 多路复用(I/O multiplexing) 信号驱动式 I/O(signal driven I/O) 异步 I/O(asynchronous I/O) 阻塞式 I/O 模型对于阻塞式 I/O,以套接字(Socket)的输入操作为例。 1、首先应用进程发起 I/O 系统调用后,应用进程阻塞,转到内核空间处理。 2、之后,内核开始等待数据,等待数据到达之后,将内核中的数据拷贝到用户的缓冲区中,整个 I/O 处理完毕后返回进程。最后应用进程解除阻塞状态,处理数据。","text":"最近读了波网络 I/O 相关的文章,做下总结、摘录。(未完) 经典 I/O 模型 阻塞式 I/O(blocking I/O) 非阻塞式 I/O(non-blocking I/O) I/O 多路复用(I/O multiplexing) 信号驱动式 I/O(signal driven I/O) 异步 I/O(asynchronous I/O) 阻塞式 I/O 模型对于阻塞式 I/O,以套接字(Socket)的输入操作为例。 1、首先应用进程发起 I/O 系统调用后,应用进程阻塞,转到内核空间处理。 2、之后,内核开始等待数据,等待数据到达之后,将内核中的数据拷贝到用户的缓冲区中,整个 I/O 处理完毕后返回进程。最后应用进程解除阻塞状态,处理数据。 上图以 UDP 的 Socket 调用为例,进程调用 recvfrom 后,系统调用直到数据报到达且被复制到用户空间中或发生错误才返回。进程从调用开始到它返回的整段时间内是被阻塞的。recvfrom 成功返回后,应用进程开始处理数据报。 默认情形,Linux/Unix 的所有 Socket 是阻塞的。 附:基于 UDP 协议的 Socket 程序函数调用过程图 一般情况下,服务端需要管理多个客户端连接(处理并发连接),而 recvfrom 只能监视单个 Socket。上图的阻塞式 I/O 模型表示的是一对一沟通的情形,使用多线程/进程 + 阻塞式 I/O 我们可以管理多个 Socket ,实现一对多服务。 非阻塞式 I/O 模型在类 Unix 系统下,可以把一个 Socket 设置成非阻塞的。这意味着内核在数据报没有准备好时不会阻塞应用进程(睡眠态),而是返回一个错误。 上图以 UDP 的 Socket 调用为例,进程反复调用 recvfrom(polling,轮询),无数据返回 EWOULDBLOCK 错误,直至数据报准备好。 问题:单进程处理数据报,不同于阻塞I/O,由于需要反复 polling,非阻塞 I/O 会耗费大量的 CPU 资源,进程阻塞不耗费 CPU 资源。如果耍上了多进程,那耗费,是不可承受的。 关于阻塞的原理,这篇文章有简单介绍✔🔗。 I/O 多路复用模型什么是多路复用?多路指的是多个通道,一般就是多个网络连接的 I/O;复用指的是多个通道复用在一个复用器上。 引入多路复用机制的一个目的是为了处理多个网络连接 I/O。 I/O多路复用方法的演进历程:select 模型-> poll 模型-> epoll 模型 select 模型 上图所示的整个用户进程一般一直是被阻塞的(blocking),即被 select(复用器) 所阻塞,多个 Socket 被注册在 select 中。进程阻塞于 select 调用,等待数据报套接字变为可读,一但 select 返回套接字可读,系统调用 recvfrom 把所读数据报复制到应用进程缓冲区。 问题来了?为了处理多个网络连接 I/O,我们也可以通过多线程/进程的方式实现,多路复用的优势何在?这里的多路复用模型似乎比阻塞式 I/O 模型更为复杂,但它最大的优势在于用户可以在一个进程/线程内同时处理多个 socket 的 IO 请求。用户可以注册多个 socket,然后不断地调用 select 读取被激活的 socket,即可达到在同一个线程内同时处理多个 IO 请求的目的。(select 可接受的 socket 描述符数会有一定限制) 我们知道,操作系统多个进程/线程的开销维护还是蛮大的。对于高并发场景,如果一台机器要维护 1 万个连接(C10K问题),使用多线程/进程的方式处理,操作系统是无法承受的。如果维持 1 亿用户在线需要 10 万台服务器,成本那是相当的高。 $ 服务端单机最大 TCP 连接数=客户端 IP 数×客户端端口数 $,对于 IPv4,客户端的 IP 数最多为 2 的 32 次方,客户端的端口数最多为 2 的 16 次方。这只是理论上限,每个 TCP 连接的建立会受制于操作系统内存等因素的影响。 epoll 模型新模型的出现肯定是为了解决旧模型的问题,那么 select 模型有什么问题?每次 Socket 所在的文件描述符集合中有 Socket 发生变化的时候,select 都需要通过轮询的方式去检查,而 epoll 引入了 CallBack(回调)机制,当某个文件描述符发送变化的时候,主动通知。随着监听的 Socket 数据增加的时候,效率相比于 select 的轮询快多了。 了解 epoll 的本质 -> 如果这篇文章说不清epoll的本质,那就过来掐死我吧! (2) 参考 《UNIX网络编程 卷1:套接字联网API》 趣谈网络协议 RPC实战与核心原理 如果这篇文章说不清epoll的本质,那就过来掐死我吧! 5种网络IO模型(有图,很清楚) 《Nginx高性能Web服务器详解》","categories":[{"name":"操作系统","slug":"操作系统","permalink":"https://yeshan333.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"},{"name":"计算机网络","slug":"计算机网络","permalink":"https://yeshan333.github.io/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"}],"tags":[{"name":"I/O模型","slug":"I-O模型","permalink":"https://yeshan333.github.io/tags/I-O%E6%A8%A1%E5%9E%8B/"}]},{"title":"『笔记』可扩展架构设计之消息队列","slug":"可扩展架构设计之消息队列","date":"2020-04-06T19:44:09.000Z","updated":"2020-04-06T19:44:09.000Z","comments":true,"path":"2020/04/06/可扩展架构设计之消息队列/","permalink":"https://yeshan333.github.io/2020/04/06/%E5%8F%AF%E6%89%A9%E5%B1%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1%E4%B9%8B%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/","excerpt":"前言众所周知,开发低耦合系统是软件开发的终极目标之一。低耦合的系统更加容易扩展,低耦合的模块更加容易复用,更易于维护和管理。我们知道,消息队列的主要功能就是收发消息,但是它的作用不仅仅只是解决应用之间的通信问题这么简单。消息队列作为常用的中间件,经常被用来对系统解耦,对模块解耦。增强系统的可扩展性和模块的可复用性。 除了对用于对系统、模块解耦,消息队列还有以下几种通途: 服务异步处理 流量控制 作为发布 / 订阅系统实现一个微服务级系统间的观察者模式 连接流计算任务和数据 用于将消息广播给大量接收者 事物的存在总会有对立的一面,引入消息队列可能会带来延迟问题、产生数据不一致的问题、增加系统复杂度的问题等等。","text":"前言众所周知,开发低耦合系统是软件开发的终极目标之一。低耦合的系统更加容易扩展,低耦合的模块更加容易复用,更易于维护和管理。我们知道,消息队列的主要功能就是收发消息,但是它的作用不仅仅只是解决应用之间的通信问题这么简单。消息队列作为常用的中间件,经常被用来对系统解耦,对模块解耦。增强系统的可扩展性和模块的可复用性。 除了对用于对系统、模块解耦,消息队列还有以下几种通途: 服务异步处理 流量控制 作为发布 / 订阅系统实现一个微服务级系统间的观察者模式 连接流计算任务和数据 用于将消息广播给大量接收者 事物的存在总会有对立的一面,引入消息队列可能会带来延迟问题、产生数据不一致的问题、增加系统复杂度的问题等等。 EDA 架构之生产者与消费者模式 事件驱动架构(Event Driven Architecture, EDA) EDA 架构原理事件驱动架构由事件发起者和事件使用者组成。事件的发起者检测或感知事件,并以消息的形式来表示事件。它并不知道事件的使用者或事件引起的结果。 检测到事件后,系统会通过事件通道从事件发起者传输给事件使用者,而事件处理平台则会在该通道中以异步方式处理事件。事件发生时,需要通知事件使用者。他们可能会处理事件,也可能只是受事件的影响。 事件处理平台将对事件做出正确响应,并将活动下发给相应的事件使用者。通过这种下发活动,我们就可以看到事件的结果。 检测到事件后,系统会通过事件通道从事件发起者传输给事件使用者,而事件处理平台则会在该通道中以异步方式处理事件。事件发生时,需要通知事件使用者。他们可能会处理事件,也可能只是受事件的影响。 事件处理平台将对事件做出正确响应,并将活动下发给相应的事件使用者。通过这种下发活动,我们就可以看到事件的结果。 生产者-消费者模型操作系统中常见的 EDA 架构就是生产者-消费者模型。消息队列常用来作为生产者和消费者之间的缓冲带,平衡生产者和消费者的处理能同时对服务进行解耦。有了这层缓冲带,生产者和消费者可能都不知道对方的存在。 以下为生产者-消费者模型的简单实现,(内存消息队列) 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647import timefrom queue import Queuefrom random import randintfrom threading import Threadclass Producer(Thread): def __init__(self, queue): super().__init__() self.queue = queue def run(self): while True: productA = randint(0, 10) productB = randint(90, 100) print('Produce A「number」: {}, Produce B「number」: {}'.format(productA, productB)) self.queue.put((productA, productB)) time.sleep(2)class Consumer(Thread): def __init__(self, queue): super().__init__() self.queue = queue def run(self): while True: # block=True, if queue is empty, block(阻塞) products_tuple = self.queue.get(block=True) print(f'Consume products: {products_tuple[0]} & {products_tuple[1]}') time.sleep(randint(0, 10))def main(): queue = Queue() producer = Producer(queue) consumer = Consumer(queue) producer.start() consumer.start()main()"""Produce A「number」: 8, Produce B「number」: 95Consume products: 8 & 95Produce A「number」: 4, Produce B「number」: 92Consume products: 4 & 92Produce A「number」: 9, Produce B「number」: 90... """ 基于ZeroMQ PubSub模式的观察者模式实例 1234567891011121314151617181920# publisher1.pyimport timeimport zmqdef publisher1(): context = zmq.Context() socket = context.socket(zmq.PUB) socket.bind("tcp://*:5555") while True: count = 99 while True: time.sleep(1) socket.send_string('publisher1 pushes event %d' % count) print('push event %d' % count) count += 1if __name__ == "__main__": publisher1() 123456789101112131415161718192021# publisher2.pyimport timeimport zmqdef publisher2(): context = zmq.Context() socket = context.socket(zmq.PUB) socket.bind("tcp://*:5556") while True: count = 1 while True: time.sleep(1) socket.send_string('publisher2 pushes event %d' % count) print('push event %d' % count) count += 1if __name__ == "__main__": publisher2() 1234567891011121314151617# subscriber1.pyimport zmqdef subscriber1(): context = zmq.Context() socket = context.socket(zmq.SUB) socket.connect('tcp://127.0.0.1:5555') socket.connect('tcp://127.0.0.1:5556') socket.setsockopt_string(zmq.SUBSCRIBE, '') while True: message = socket.recv() print('message: %s' % message)if __name__ == "__main__": subscriber1() 1234567891011121314151617# subscriber2.pyimport zmqdef subscriber2(): context = zmq.Context() socket = context.socket(zmq.SUB) socket.connect('tcp://127.0.0.1:5555') socket.connect('tcp://127.0.0.1:5556') socket.setsockopt_string(zmq.SUBSCRIBE, '') while True: message = socket.recv() print('message: %s' % message)if __name__ == "__main__": subscriber2() 秒杀系统的架构设计与消息队列某秒杀系统的主要处理步骤如下: 风险控制 库存锁定 生成订单 短信通知 更新统计数据 使用消息队列进行异步处理由于秒杀成功的关键取决于风险控制、库存锁定这两步骤,所以 server 端处理了这两步之后可以给 client 端返回结果了,后续的步骤可放入消息队列中异步执行。不一定要在秒杀请求中完成。集中资源处理关键步骤(同步),碎片时间(全部秒杀请求处理结束)处理次要步骤(异步)。 使用消息队列进行流量控制(削峰)秒杀开始后,将超过 server 端处理上限(短时间内)的秒杀请求放入消息队列中,后续有能力处理时再对消息队列中消费请求进行处理。对于超时的请求可以直接丢弃(秒杀失败)。 参考 大型网站技术架构 什么是事件驱动架构 为什么需要消息队列-极客时间 ZeroMQ pyzmq","categories":[{"name":"Architecture","slug":"Architecture","permalink":"https://yeshan333.github.io/categories/Architecture/"}],"tags":[{"name":"架构设计","slug":"架构设计","permalink":"https://yeshan333.github.io/tags/%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/"},{"name":"消息队列","slug":"消息队列","permalink":"https://yeshan333.github.io/tags/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/"}]},{"title":"单例模式如何保证实例的唯一性","slug":"单例模式如何保证实例的唯一性","date":"2020-04-04T19:59:09.000Z","updated":"2020-04-04T19:59:09.000Z","comments":true,"path":"2020/04/04/单例模式如何保证实例的唯一性/","permalink":"https://yeshan333.github.io/2020/04/04/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E5%AE%9E%E4%BE%8B%E7%9A%84%E5%94%AF%E4%B8%80%E6%80%A7/","excerpt":"前言 最近面试发现自己不懂的东西还是很多的,写一波文章来巩固和挖掘欠缺的知识点以及加深对已有知识点原理的理解。","text":"前言 最近面试发现自己不懂的东西还是很多的,写一波文章来巩固和挖掘欠缺的知识点以及加深对已有知识点原理的理解。 什么是单例模式 指一个类只有一个实例,且该类能自行创建这个实例的一种创建型设计模式。 使用目的:确保在整个系统中只能出现类的一个实例,即一个类只有一个对象。对于频繁使用的对象,“忽略”创建时的开销。 特点: 单例类只有一个实例对象; 该单例对象必须由单例类自行创建; 单例类对外提供一个访问该单例的全局访问点; 如何保证实例的唯一性那么,如何保证实例的唯一性? Java 的解决方案之一对于 Java 来说,要确保类的构造方法是私有的,使用 static final 的私有成员变量存放这个唯一实例。我们还要提供一个获取实例的接口(由于我们要通过类名获取实例,所以接口方法是 static 的)。实现如下: 1234567public class Singleton { private static final Singleton instance=new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; }} 我们知道,对于 static 的变量,类所有的实例都可以共享这个变量,我们可以直接通过类名来访问它。再使用 final 修饰这个变量,使得它不能再被改变。 戳此处深入了解 → Python 的解决方案之一以下为 Python 使用装饰器实现的单例模式。这里将不可变的类地址存放在了 dict 中,值为那个唯一的实例。 123456789101112131415161718192021222324def Singleton(cls): _instance = {} def getInstance(*args, **kwargs): if cls not in _instance: _instance[cls] = cls() return _instance[cls] return getInstance@Singletonclass test_singleton: def __init__(self): passdef main(): class1 = test_singleton() class2 = test_singleton() print('class1 id: {}, class2 id: {}'.format( id(class1), id(class2))) print(class1 == class2)main()# class1 id: 1814844368152, class2 id: 1814844368152# True 参考 Creating a singleton in Python 单例模式(单例设计模式)详解","categories":[{"name":"设计模式","slug":"设计模式","permalink":"https://yeshan333.github.io/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/"}],"tags":[{"name":"设计模式","slug":"设计模式","permalink":"https://yeshan333.github.io/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/"}]},{"title":"使用 mypy 做 type check","slug":"使用-mypy-做type-check","date":"2020-03-06T11:29:17.000Z","updated":"2020-03-06T11:29:17.000Z","comments":true,"path":"2020/03/06/使用-mypy-做type-check/","permalink":"https://yeshan333.github.io/2020/03/06/%E4%BD%BF%E7%94%A8-mypy-%E5%81%9Atype-check/","excerpt":"前言完残!😂,最近看之前写的 Python 代码老得琢磨这比变量的类型是啥(Python 无类型系统xxx),不愧是我写的! 看段之前写的实现迭代器模式的代码:","text":"前言完残!😂,最近看之前写的 Python 代码老得琢磨这比变量的类型是啥(Python 无类型系统xxx),不愧是我写的! 看段之前写的实现迭代器模式的代码: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465# 抽象迭代器类class Iterator(object): def hasNext(): pass def next(): pass# 抽象聚集类class Aggregate(object): def iterator(): passclass BookShelf(Aggregate): def __init__(self): self._books = [] self._last = 0 def getBookAt(self, index): return self._books[index] def appendBook(self, book): self._books.append(book) self._last = self._last + 1 def getLength(self): return self._last def iterator(self): return BookShelfIterator(self)class BookShelfIterator(Iterator): def __init__(self, bookShelf): self._bookShelf = bookShelf self._index = 0 def hasNext(self): if self._index < self._bookShelf.getLength(): return True else: return False def next(self): book = self._bookShelf.getBookAt(self._index) self._index = self._index + 1 return bookclass Book(): def __init__(self, name): self._name = name def getName(self): return self._nameif __name__ == "__main__": bookShelf = BookShelf() bookShelf.appendBook(Book("A")) bookShelf.appendBook(Book("B")) bookShelf.appendBook(Book("C")) bookShelf.appendBook(Book("D")) it = bookShelf.iterator() while it.hasNext(): book = it.next() print(book.getName()) 有一丢丢难读(不通读的话,会乱猜某变量类型),回想之前在 PyCon China 2019 的大会资聊曾看到过类型检查相关的演讲主题,回顾下演讲视频。水一波,写篇文章了解下 Python 标准(PEP 3107 & PEP 484 )支持的 mypy。 类型系统:编译期的类型推导检查规则,类型系统属于一种轻量级的形式化方法(一种数学方法) 使用-mypy1234# 安装 mypypip install mypy# 使用 mypy 做类型检查mypy module_name.py 以下使用方式适用于 Python 3.6 及以上的版本。值得注意:mypy 默认的推导类型不可为 None 变量的类型注释12345678integer: int = 1string: str = "ShanSan"err_str: str = 1 # error: Incompatible types in assignmentchild: bool = True# mypy 默认的推导类型不可为 Nonenone: int - None # error: Invalid type comment or annotationprint(integer, string) 内建类型关于更多 mypy 的类型系统内建的类型可参考:https://mypy.readthedocs.io/en/stable/builtin_types.html 123456789101112131415161718192021from typing import Dict, Tuple, Optional, Iterable, Union# 对于映射(Map)数据结构,需要指定 key 和 value 的类型x: Dict[str, float] = {'field': 2.0}# Tuple 需要指定所有元素的类型x: Tuple[int, str, float] = (3, "yes", 7.5)# error: Incompatible types in assignment (expression has type "Tuple[int, str, float, int]", variable has type "Tuple[int, str, float]")y: Tuple[int, str, float] = (3, "yes", 7.5, 11)op: Optional[str] = None # 可为 str 或 None# 泛用可迭代对象l: Iterable = [1]t: Iterable = (1, 2)d: Iterable = {1: 1}# 可为 str 或 intstr_int1: Union[str, int] = 1str_int2: Union[str, int] = "ss"str_int3: Union[str, int] = None # error 函数注解12345678910111213141516171819from typing import NoReturndef f1() -> None: passdef f2() -> NoReturn: # 无返回值 passdef plus(num1: int, num2: int) -> int: return num1 + num2# 带默认值def plus_default(num1: int, num2: int = 3) -> int: return num1 + num2# 容器的参数类型def container_param(names: List[str]) -> None: for name in names: print(name) 类成员注解123456789101112131415class MyClass: attr: int # 带默认值的实例变量 charge_percent: int = 100 # 没有任何返回值应该注解为 None def __init__(self) -> None: pass # 忽略对 self 类型的注解 def my_method(self, num: int, str1: str) -> str: return num * str1# 支持自定义类型的注解x: MyClass = MyClass() 结尾OK, 差不多了,对之前的迭代器模式的代码改造一波 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667from typing import List, Iterable# 抽象迭代器类class Iterator(object): def hasNext(self): pass def next(self): pass# 抽象聚集类class Aggregate(object): def iterator(self): passclass BookShelf(Aggregate): def __init__(self) -> None: self._books: List[Book] = [] self._last: int = 0 def getBookAt(self, index: int) -> Book: return self._books[index] def appendBook(self, book: Book) -> None: self._books.append(book) self._last = self._last + 1 def getLength(self) -> int: return self._last def iterator(self) -> BookShelfIterator: return BookShelfIterator(self)class BookShelfIterator(Iterator): def __init__(self, bookShelf) -> None: self._bookShelf: BookShelf = bookShelf self._index: int = 0 def hasNext(self) -> bool: if self._index < self._bookShelf.getLength(): return True else: return False def next(self) -> Book: book: Book = self._bookShelf.getBookAt(self._index) self._index = self._index + 1 return bookclass Book(): def __init__(self, name) -> None: self._name: str = name def getName(self) -> str: return self._nameif __name__ == "__main__": bookShelf: BookShelf = BookShelf() bookShelf.appendBook(Book("A")) bookShelf.appendBook(Book("B")) bookShelf.appendBook(Book("C")) bookShelf.appendBook(Book("D")) it: Iterator = bookShelf.iterator() while it.hasNext(): book: Book = it.next() print(book.getName()) emmm, 舒服了一丢丢/(ㄒoㄒ)/~~ 参考 https://github.com/python/mypy PyCon China 2019 成都分会场-刘知杭-静态类型的 Python, video🔗 PyCon China 2019 北京分会场-依云-类型检查拯救粗心开发者, video🔗 Type hints cheat sheet (Python 3)","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"静态类型检查","slug":"静态类型检查","permalink":"https://yeshan333.github.io/tags/%E9%9D%99%E6%80%81%E7%B1%BB%E5%9E%8B%E6%A3%80%E6%9F%A5/"}]},{"title":"洞悉技术的本质-Git内部原理探索","slug":"Git内部原理探索","date":"2020-02-03T00:49:18.000Z","updated":"2020-02-03T00:49:18.000Z","comments":true,"path":"2020/02/03/Git内部原理探索/","permalink":"https://yeshan333.github.io/2020/02/03/Git%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86%E6%8E%A2%E7%B4%A2/","excerpt":"前言洞悉技术的本质,可以让我们在层出不穷的框架面前仍能泰然处之。用了那么久的 Git,不懂点内部原理,那可不行!懂点原理可以让我们遇到问题的时候能够更好更快的理清解决问题的思路。 要真正读懂本文可能需要以下基础: 有 Git 使用经验 对 Git 的三个分区有所了解 熟悉常用的 Linux 命令 对经典哈希算法有一定的了解,比如SHA-1、SHA-256、MD5等 在开始之前,让我们先抛出几个问题,然后一一解决、回答它们 .git版本库里的文件/目录是干什么的? Git是如何存储文件信息的? 当我们执行git add、git commit时,Git背后做了什么? Git分支的本质是什么?","text":"前言洞悉技术的本质,可以让我们在层出不穷的框架面前仍能泰然处之。用了那么久的 Git,不懂点内部原理,那可不行!懂点原理可以让我们遇到问题的时候能够更好更快的理清解决问题的思路。 要真正读懂本文可能需要以下基础: 有 Git 使用经验 对 Git 的三个分区有所了解 熟悉常用的 Linux 命令 对经典哈希算法有一定的了解,比如SHA-1、SHA-256、MD5等 在开始之前,让我们先抛出几个问题,然后一一解决、回答它们 .git版本库里的文件/目录是干什么的? Git是如何存储文件信息的? 当我们执行git add、git commit时,Git背后做了什么? Git分支的本质是什么? Git分区在真正开始之前,让我们先回顾下Git的三个分区(Workspace、Index / Stage、git repository) 工作区(Workspace):此处进行代码文件的编辑 索引或称暂存区(Index / Stage):存储文件状态信息,进行commit前会对此时的文件状态作快照(Snapshot) Git版本库(git repository):由Git Object持久记录每一次commit的快照和链式结构的commit变更历史 先看下从《Got Git》和网络上搬来的Git分区工作原理图和待remote的工作流再次感性回顾下之前使用Git自己时怎么操作的 相信看了这些,会对Git有新的认知,让我们正式开始🎉! .git版本库里的文件/目录是干什么的让我们通过一个从GitHub clone下来的一个实际项目的版本库来看下这些文件/目录,clone下来的repository 12345678910111213$ git clone https://github.com/yeshan333/Explore-Git$ ls -F1configdescriptionHEADhooks/indexinfo/logs/objects/packed-refsrefs/ 挑几个重要文件/目录的做下解释 HEAD文件:用于存放当前所在分支的引用,这个引用是个符号引用(symbolic reference) index文件:二进制文件,它就是暂存区(Stage Area)。它是一个目录树,记录了文件的时间戳、文件长度、SHA-1等 refs目录:基本所有的引用(references)文件都存放在这里,引用文件中的内容为SHA-1值,一般是commit object的SHA-1值 objects目录:用于存放数据的所有 Git Object均存放在这个目录下,每个 Git Object 对应一个目录,object对应的SHA-1值的前 2 位为目录名,后 38 位为文件名 抱着一些初步的认知,我们继续解决后面几个问题,加深对.git版本库内文件的理解 Git是如何存储文件信息的要知道Git如何存储信息,我们需要了解一下常见的Git对象,Git就是通过这些对象存储文件信息的。Git Object是Git存储文件信息的最小单元,如下为几种常见的Git Object以及它们的作用,它们一般是不可变的(immutable),这些对象使用40位的SHA-1值进行标识。 blob:用于存储文件内容,Git保存文件的时候不会保存文件名 tree object:当前目录结构的一个快照(Snapshot),它存储了一条或多条树记录(tree entries),每条记录含有一个指向数据对象(blob)或子树对象(子树木对象可理解为子目录)的SHA-1指针以及相应的文件模式、类型、文件名,用于表示内容之间的目录层次关系 commit object:存储顶层tree object的SHA-1值、作者/提交者信息+时间戳以及提交注释,如果有父commit object,还会保存有这个commit object对应的SHA-1值。对于merge commit可能会有多个父commit object tag object:用于标记commit object。关于tag object 让我们通过一个实际的版本库了解下这些对象,使用git log查看这个版本库详尽的历史提交记录 12345678910111213141516$ git log --pretty=rawcommit ee8a0dbc0c6fe89e6ff39b16c77543e8e2c6475btree fb12b3e52ce18ce281bfc2b11a5e4350c2d10358parent 7b94dcbe89c9534913854284b4af727a9a5dfc84author yeshan333 <1329441308@qq.com> 1580629391 +0800committer yeshan333 <1329441308@qq.com> 1580629391 +0800 final commitcommit 7b94dcbe89c9534913854284b4af727a9a5dfc84tree 8feb4afbab18e8d386413224a9e74f871c15a5caauthor yeshan333 <1329441308@qq.com> 1580629170 +0800committer GitHub <noreply@github.com> 1580629170 +0800 Initial commit Git提供了一把非常好用的瑞士军刀🔪给我们剖析这些对象,它是就是cat-file,通过-t参数可以查看object的类型,通过-p参数我们可以查看object存储的具体内容。查看信息时,我们需要使用到object对应的SHA-1值,可不必写完,从头开始的前几位不冲突即可。git cat-file 让我们通过它查看下SHA-1值ee8a0dbc0c6fe89e6ff39b16c77543e8e2c6475b对应的commit object的类型以及存放的内容。 1234567891011$ git cat-file -t ee8acommit$ git cat-file -p ee8atree fb12b3e52ce18ce281bfc2b11a5e4350c2d10358parent 7b94dcbe89c9534913854284b4af727a9a5dfc84author yeshan333 <1329441308@qq.com> 1580629391 +0800committer yeshan333 <1329441308@qq.com> 1580629391 +0800final commit 让我们再查看下这个commit object(ee8a)存储的tree object(fb12)的信息 1234567$ git cat-file -p fb12100644 blob 6116a7dd8f752dabff8730a46b46846b2d0a696b README.md040000 tree 41ed97c2adb97658107069582b6a27e474b4cc64 test$ git cat-file -t fb12tree 我们知道tree object存储了一条或多条树记录(tree entries),每条记录含有一个指向数据对象(blob)或子树对象(子树木对象可理解为子目录)的SHA-1指针以及相应的文件模式、类型、文件名。100644即为对应的文件模式,100644表示普通文本文件,040000表示目录文件。关于文件模式的一点疑问 让我们再看下tree object(fb12)存储的SHA-1指针(6116)对应的blob(6116)存放的内容 12345$ git cat-file -p 6116# Explore-Git$ git cat-file -t 6116blob Nice,很好的对应了之前对blob、tree object、commit object的描述。关于文件的大部分信息都存放在这些object中。 当我们执行git add、git commit时,Git背后做了什么解答这个问题,我们需要通过实践去一步步感受Git背后的操作。我们创建一个简单的例子感受下,我们需要时刻关注.git/objects这个目录 1234567891011$ mkdir demo$ cd demo$ git init # 初始化Git仓库$ find .git/objects -type f # 没有文件$ echo "test" > test.txt$ mkdir hi$ cd hi$ echo "Hello" > hello.txt$ cd ..$ find .git/objects -type f$ # 什么都没有 这里我们创建先了两个文件,test.txt、hello.txt,其中hello.txt文件放到了hi目录中,然后我们查看了.git/objects目录,没有文件。接下来就是重头戏了,我们要将当前目录的文件/目录(Linux一切皆文件)添加到暂存区(stage/index)。 1234$ git add .$ find .git/objects -type f.git/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4.git/objects/e9/65047ad7c57865823c7d992b1d046ea66edf78 我们可以看到,执行了git add之后生成了两个文件,让我们通过git cat-file看看这两个文件 12345678$ git cat-file -t 9daeblob$ git cat-file -p 9daetest # test.txt文件中的内容$ git cat-file -t e965blob$ git cat-file -p e965Hello # hi/hello.txt文件中的内容 哦,Git为我们生成了两个object,两个blob,存放的是test.txt、hello.txt的内容,让我们commit一下看看Git又做了什么 123456789101112131415161718192021222324$ find .git/objects -type f.git/objects/27/1c49aa4a2c8eb1b2ef503c19378aa6810fca1e.git/objects/2e/8ebea76975c98806e73c0b7aea6c40c58d427c.git/objects/8c/3c7fbcd903744b20fd7567a1fcefa99133b5bc.git/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4.git/objects/e9/65047ad7c57865823c7d992b1d046ea66edf78$ git cat-file -t 271ccommit$ git cat-file -t 2e8etree$ git cat-file -t 8c3ctree$$ git cat-file -p 271ctree 2e8ebea76975c98806e73c0b7aea6c40c58d427cauthor root <root@DESKTOP-CQ9JEC7.localdomain> 1580651827 +0800committer root <root@DESKTOP-CQ9JEC7.localdomain> 1580651827 +0800Hello Git$ git cat-file -p 8c3c100644 blob e965047ad7c57865823c7d992b1d046ea66edf78 hello.txt$ git cat-file -p 2e8e040000 tree 8c3c7fbcd903744b20fd7567a1fcefa99133b5bc hi100644 blob 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 test.txt 哦,commit后Git为我们新创建了3个object,分别是根树对象tree object(2e8e)、子树对象tree object(8c3c)、commit object(271c)。现在一共有5个Git Object。这些object存放的内容符合我们在解答Git是如何存储文件信息的时对它们的表述。Git在add、commit后有条不紊的把它们组织了起来。tql👍 让我们看下此次提交的日志 1234567$ git log --pretty=rawcommit 271c49aa4a2c8eb1b2ef503c19378aa6810fca1etree 2e8ebea76975c98806e73c0b7aea6c40c58d427cauthor root <root@DESKTOP-CQ9JEC7.localdomain> 1580651827 +0800committer root <root@DESKTOP-CQ9JEC7.localdomain> 1580651827 +0800 Hello Git 问题来了,Git是如何组织这些object的❓令人兴奋的是Git在提供给我们这些顶层API去愉快使用的同时还提供了一些较为底层的API让我们能够更深入的了解它。接下来我们将通过部分底层的API来重现本次commit log的创建过程。主要用到的底层API如下: git hash-object:生成blob git update-index:对暂存区进行操作 git write-tree:根据当前暂存区(index)状态创建一个tree object git read-tree:将tree object读入暂存区 git commit-tree:创建commit object 重现步骤如下: 1、先初始化版本库,再为内容分别为test的test.txt、Hello的hello.txt创建两个blob,blob不存储文件名 1234567$ mkdir test$ cd testgit init$ echo 'test' | git hash-object -w --stdin9daeafb9864cf43055ae93beb0afd6c7d144bfa4$ echo 'Hello' | git hash-object -w --stdine965047ad7c57865823c7d992b1d046ea66edf78 2、使用git update-index -add将blob(e965)加入暂存区,使用--cacheinfo参数指定文件模式、SHA-1值、文件名(hello.txt) 1$ git update-index --add --cacheinfo 100644 e965047ad7c57865823c7d992b1d046ea66edf78 hello.txt 3、使用git write-tree将当前暂存区状态写入一个tree object(8c3c) 12$ git write-tree8c3c7fbcd903744b20fd7567a1fcefa99133b5bc 4、将hello.txt移出暂存区,将blob(9dae)加入暂存区(即将test.txt加入暂存区) 12$ git update-index --remove hello.txt$ git update-index --add --cacheinfo 100644 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 test.txt 5、使用git read-tree将已有tree object作为子树对象加入暂存区,通过--prefix设置名称为hi 1$ git read-tree --prefix=hi 8c3c7fbcd903744b20fd7567a1fcefa99133b5bc 6、记录下当前暂存区状态到tree object 12$ git write-tree2e8ebea76975c98806e73c0b7aea6c40c58d427c 7、使用git commit-tree根据tree object的SHA-1值创建commit object 12$ echo 'Hello Git' | git commit-tree 2e8e2616a5b40ead79df23736f61b346080423f438fe 8、查看commit log,没多大毛病,收工🎉 123456789101112131415$ git log --pretty=raw 2616commit 2616a5b40ead79df23736f61b346080423f438fetree 2e8ebea76975c98806e73c0b7aea6c40c58d427cauthor root <root@DESKTOP-CQ9JEC7.localdomain> 1580660050 +0800committer root <root@DESKTOP-CQ9JEC7.localdomain> 1580660050 +0800 Hello Git$ git cat-file -p 2616tree 2e8ebea76975c98806e73c0b7aea6c40c58d427cauthor root <root@DESKTOP-CQ9JEC7.localdomain> 1580660050 +0800committer root <root@DESKTOP-CQ9JEC7.localdomain> 1580660050 +0800Hello Git 相信到了这里,已经对Git在我们git add、git commit时做了什么有了一定的了解。如果想了解Git Object对应的SHA-1值如何生成和如何复现并串联多个commit object形成一个提交历史链,可查看《Pro Git》的第十章第二小节或参看后面的参考资料。 Git分支的本质是什么Git分支的本质是指向某一系列提交之首的指针或引用。Git使用引用的一个好处就是我们不需要花心思去记那些Git Object长长的SHA-1值。引用是存放SHA-1值的文件,它们位于.git/refs目录中。Git提供了一个API让我们更新引用-update-ref,示例如下 123456789101112131415$ git update-ref refs/heads/master 2616 # 2616为之前浮现commit log创建的commit object的SHA-1值$ git logcommit 2616a5b40ead79df23736f61b346080423f438fe (HEAD -> master)Author: root <root@DESKTOP-CQ9JEC7.localdomain>Date: Mon Feb 3 00:14:10 2020 +0800 Hello Git$ git log mastercommit 2616a5b40ead79df23736f61b346080423f438fe (HEAD -> master)Author: root <root@DESKTOP-CQ9JEC7.localdomain>Date: Mon Feb 3 00:14:10 2020 +0800 Hello Git$ cat .git/refs/heads/master2616a5b40ead79df23736f61b346080423f438fe HEAD引用在介绍HEAD文件的时候我们说过它存放的是当前所在分支的引用,而且这个引用是个符号引用(symbolic reference)。那么什么是符号引用?它是一个指向其它引用的指针。我们可以查看之前clone下来的Explore-Git的HEAD文件 12$ cat .git/HEADref: refs/heads/master 当我们checkout到某个分支时,HEAD文件内容如下 123456$ git branch yeshan$ git checkout yeshanSwitched to branch 'yeshan'$ cat .git/HEADref: refs/heads/yeshan 至此,抛出的问题已解答完毕。 参考 Go Git:面向未来的代码平台,了解版本控制系统的发展和Git现存的问题,版本控制系统未来的走向 《Git权威指南》 - Git对象探秘 这才是真正的Git——Git内部原理揭秘! 《Pro Git》- Basic Snapshotting Git对象模型 你知道 Git 是如何做版本控制的吗 图解Git GitHub Developer REST API Git Blobs 如何读取git-ls-tree输出的模式字段 常用Git命令清单","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"}]},{"title":"React+Flask打造前后端分离项目开发环境","slug":"React-Flask打造前后端分离项目开发环境","date":"2020-01-13T12:56:16.000Z","updated":"2020-01-13T12:56:16.000Z","comments":true,"path":"2020/01/13/React-Flask打造前后端分离项目开发环境/","permalink":"https://yeshan333.github.io/2020/01/13/React-Flask%E6%89%93%E9%80%A0%E5%89%8D%E5%90%8E%E7%AB%AF%E5%88%86%E7%A6%BB%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/","excerpt":"前言 新的一年,开始水第一篇技术文。碰巧最近React玩得多,撸一篇文章纪念一下开发环境的搭建。🤔 开篇两问: 什么是React?:React,用于构建用户界面的 JavaScript 库(官网复制粘贴,真香,不用怎么写template了,舒服 什么是Flask?:一个使用Python编写的轻量级Web应用框架。用来写云原生应用很香! 先看下最终的项目结构,如下:《项目源码》 12345678910111213141516171819├── app.py├── env| ├── Include| ├── Lib| ├── LICENSE.txt| ├── Scripts| └── tcl├── frontend| ├── build| ├── node_modules| ├── package-lock.json| ├── package.json| ├── public| ├── README.md| └── src├── static| └── js└── templates └── index.html","text":"前言 新的一年,开始水第一篇技术文。碰巧最近React玩得多,撸一篇文章纪念一下开发环境的搭建。🤔 开篇两问: 什么是React?:React,用于构建用户界面的 JavaScript 库(官网复制粘贴,真香,不用怎么写template了,舒服 什么是Flask?:一个使用Python编写的轻量级Web应用框架。用来写云原生应用很香! 先看下最终的项目结构,如下:《项目源码》 12345678910111213141516171819├── app.py├── env| ├── Include| ├── Lib| ├── LICENSE.txt| ├── Scripts| └── tcl├── frontend| ├── build| ├── node_modules| ├── package-lock.json| ├── package.json| ├── public| ├── README.md| └── src├── static| └── js└── templates └── index.html 开发环境:Windows+Flask+React+Git Bash+vscode Backend-Flask 个人比较喜欢用CLI,So,项目开发依赖使用virtualenv+pip管理,pipenv也还行,虽然lock package有点久。听说比较新的poetry很香? 1234567891011# 1、安装virtualenvpip install virtualenv# 2、为项目(Flask_React)创建虚拟环境->envvirtualenv env# 3、激活虚拟环境envsource env/Scripts/activate# 4、安装项目依赖pip install -r requirments.txt# 5、创建好templates和static目录,用于存放React打包好的渲染模板和静态文件mkdir templatesmkdir static 后端服务的基础环境搭建好了,随手写个路由,看下能不能用先 1234567891011# app.pyfrom flask import Flaskapp = Flask(__name__)@app.route('/')def index(): return "<h1>Hello React+Flask!</h1>"if __name__ == '__main__': app.run('127.0.0.1', port=5000, debug=True) Frontend-React 前端React应用的开发环境使用官方提供的脚手架create-react-app搭建。 1234# 1、安装脚手架npm install -g create-react-app# 2、为Flask_React项目创建React App->frontendcreate-react-app frontend # 这里有点小久,喝杯咖啡☕摸下鱼 OK,前端开发环境搭建好了,清理掉src目录下的所有文件,自己写个组件,如下: 123cd frontend/srcrm -rf *touch index.js 1234567891011121314151617181920//index.jsimport React from 'react'import ReactDOM from 'react-dom'class App extends React.Component { render() { return ( <div className="container"> <h1 className="center-align"> 盒装一流弊<br/> <span className="waves-effect waves-light btn"> <i className="material-icons right">cloud</i>您说的都对 </span> </h1> </div> ); }}ReactDOM.render(<App />, document.getElementById('root')) OK,预览下效果,顺便调试(没啥可调试的/(ㄒoㄒ)/~~)。npm start。效果如下: 没多大问题的话,是时候打包写好的React App给后端服务了。 Done很舒服的是create-react-app封装好了 Babel 和 webpack,我们可以直接使用npm run build打包写好的App到frontend/build目录中。然后手动将生成的文件分别挪到Flask的templates和static目录中即可。等等?手动,能不能使用CLI,dang然阔以。 npm 允许我们在package.json文件里面,使用scripts字段自定义脚本命令。更舒服的是npm script提供了pre和post钩子。我们可以给build脚本命令提供两个钩子prebuild和postbuild。编辑后的package.json文件的Script命令如下如下: 12345678"scripts": { "start": "react-scripts start", "prebuild": "rm -rf ..\\\\templates\\\\index.html && rm -rf ..\\\\static", "build": "react-scripts build", "postbuild": "mv build\\\\index.html ..\\\\templates\\\\ && mv build\\\\static ..\\\\static", "test": "react-scripts test", "eject": "react-scripts eject"}, 这时候,我们执行npm run build命令时,会自动按照下面的顺序执行 123rm -rf ..\\\\templates\\\\index.html && rm -rf ..\\\\staticreact-scripts buildmv build\\\\index.html ..\\\\templates\\\\ && mv build\\\\static ..\\\\static OK,我们试试。如下: Nice,没毛病。🎉🎉🎉。改下app.py: 12345678910from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def index(): return render_template('index.html') # 渲染打包好的React App的页面if __name__ == '__main__': app.run('127.0.0.1', port=5000, debug=True) 冇问题啊!收工!!! References React Docs Create React App npm-scripts npm scripts 使用指南","categories":[{"name":"React","slug":"React","permalink":"https://yeshan333.github.io/categories/React/"}],"tags":[{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/tags/Flask/"},{"name":"React","slug":"React","permalink":"https://yeshan333.github.io/tags/React/"}]},{"title":"2019 年总结","slug":"2019年总结","date":"2019-12-31T11:15:07.000Z","updated":"2019-12-31T11:15:07.000Z","comments":true,"path":"2019/12/31/2019年总结/","permalink":"https://yeshan333.github.io/2019/12/31/2019%E5%B9%B4%E6%80%BB%E7%BB%93/","excerpt":"","text":"前言扯🥚终于考完试了(昨天下午终结了最后一科-“万恶”的复变函数🎈🎉),可以摩擦下年终总结了,花点时间想下2019年我干了什么🎁。完了写不下去了(此时中午12点59分30秒。 忆往昔-xxx~2019这一年过得无比的充实,个人感觉高中的时候都没对自己这么狠过,我怕是上了个假的大学(忽然想起高三临近高考那段时间,别人在复习,而我却趴在桌面上在睡觉<被“农药”毒害,趴了整个高三,挺对不起老师的,惭愧😥)。 以下开始略微总结下今年的操作、收获与遗憾。 阅读方面这一年看了很多的书,有技术方面的也有非技术方面的都有,我佛了,大三上一整个学期就没打过游戏,我都佩服我自己,ε=ε=ε=┏(゜ロ゜;)┛,略微罗列下: 没看完的,看了大部分,但是没再继续看 《Python密码学编程》 《Python从入门到实践》 《C++ Primer Plus》 《Python基础教程(第3版)》 《算法图解》 《啊哈!算法》 《HTTP权威指南》 《Flask Web开发:基于Python的Web应用开发实战》 《Flask 入门教程》 《Docker Deep Dive》 《Linux 就该这么学》 《How To Think Like A Computer Scientist》 可以说是看完了的 《Web全栈工程师的自我修养》 《Don’t Make Me Think》 《Growth: 全栈增长工程师指南》 《我的职业是前端工程师》 《RePractise》 …… 上图,emmm…我正在看的,希望开学前能看完大部分,又能“吹水”了,都是💪力量啊! 小声bb,我入手了套《周易》,看了那么多还是菜(太卑微了,总有那么种好高骛远的感觉!!!斑驳 技术实践与交流这一年,我喜欢上了开源社区,我的第一个issue。很幸运能够偷偷的在图灵读者群QQ当个混子,知道了Manjusaka(璈叔,一直在听大佬出《捕蛇者说》播客,收获满满),通过大佬又知道了PyCon China。今年Python30周年,PyCon China 2019大佬云集,太香了,路费太贵没能去成,没能线下见诸位大佬(太苦bi了/(ㄒoㄒ)/~~,还好有PPT和视频放出来,现在仍在反复的看一些感兴趣的Topic的Slide和视频,又get✅到了学习的新姿势。 这一年我做的都是一些小玩意,太卑微了,不敢列出来。不得不说GitHub真香,一些开源项目拿来即可用,可以快速集成到自己弄得东西上(此处吐槽😒文档写的不好或者连文档都没有的,看的太难受了)。虽然整的都是一些花里胡哨的小东西,至少我看到了自己在成长,不亏,此处上我的GitHub小绿点: 再看下大佬的,我透,我就是didi,我整的还贼水。 GitHub还有一点特别香,通过follow各领域的大佬,我能了解到一些“骚”技术(emmm。。。,有些东西我还用上了,不愧是终极程序员社交网站。此处艾特一位友链小伙伴TRHX🔗,嘿嘿嘿,你star的大部分项目我都拿来耍过几下。 emmm,很幸运的认识了友链里诸位大佬,无聊的时候经常去lu你们的文章,收获还是蛮多的。 缺憾与期待这一年有点难 自学太痛苦了(线下找不到倾诉的伙伴,院里找不到“真正”有共同兴趣、爱好、热情的伙伴,大部分人只是说说而已,行动上的弱者),真希望有个dalao带带我(枯了 我吐,一年多没跳舞了,我居然抛弃了我曾经热爱的Breaking,虽然仍在看一些街舞文化相关的节目和比赛->《这!就是街舞》、《Red Bull BC One》,但我已经不再是个纯粹的B-Boy了 感觉自己没能真正的融入开源社区,并未参与多人优质开源项目的开发 撸了一下董老师的《爱澎湃2019年度Python榜单》,发现我知道的东西还是太少,看来我对Python的热爱没有那么纯粹,信息的来源不太行 看了下我的GitHub年度报告,看来得好好养生了 期待 新的一年,我又立下了一丢丢flag🚩,不知道下学期结束前能不能操作完(☆▽☆) 稳住,别浪,Hello World -> Cloud Native, Meta Year 期待下一年能撸一个优秀的技术开源项目或者去为优秀的开源项目贡献代码 期待自己所待的科协在未来有真正强有力的积累,能发挥出“马太效应” 我似乎还没真正想明白我想要什么,不给力啊! 新一年对自己的要求:不只是要做思想上的强者,更要做行动上的强者;多思考、多折腾、多更新。很喜欢的一句话:I hear and I forget. I see and I remember. I do and I understand.","categories":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/categories/%E9%9A%8F%E7%AC%94/"}],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"愿和平永驻人间","slug":"愿和平永驻人间","date":"2019-12-13T12:25:33.000Z","updated":"2019-12-13T12:25:33.000Z","comments":true,"path":"2019/12/13/愿和平永驻人间/","permalink":"https://yeshan333.github.io/2019/12/13/%E6%84%BF%E5%92%8C%E5%B9%B3%E6%B0%B8%E9%A9%BB%E4%BA%BA%E9%97%B4/","excerpt":"","text":"","categories":[{"name":"memory","slug":"memory","permalink":"https://yeshan333.github.io/categories/memory/"}],"tags":[{"name":"memory","slug":"memory","permalink":"https://yeshan333.github.io/tags/memory/"}]},{"title":"❤Thanksgiving❤","slug":"heart","date":"2019-11-28T23:50:56.000Z","updated":"2019-11-28T23:50:56.000Z","comments":true,"path":"2019/11/28/heart/","permalink":"https://yeshan333.github.io/2019/11/28/heart/","excerpt":"","text":"","categories":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/categories/%E9%9A%8F%E7%AC%94/"}],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"Serialization and Deserialization","slug":"Serialization-and-Deserialization","date":"2019-11-25T16:25:23.000Z","updated":"2019-11-25T16:25:23.000Z","comments":true,"path":"2019/11/25/Serialization-and-Deserialization/","permalink":"https://yeshan333.github.io/2019/11/25/Serialization-and-Deserialization/","excerpt":"序列化与反序列化 Serialization:Data Structure/Object –> Binary StringDeserialization:Binary String –> Data Structure/ObjectGoals:Cross-platform Communication、Persistent Storage and More Python中对象的序列化与反序列化pickle module pickle 仅可用于 Python,pickle所使用的数据流格式仅可用于 Pythonpickle 模块可以将复杂对象转换为字节流,也可以将字节流转换为具有相同内部结构的对象。可被pickling和unpickling的对象:https://docs.python.org/zh-cn/3/library/pickle.html#what-can-be-pickled-and-unpickled pickle提供了优秀的方法方便我们对对象进行pickling(封存)和unpickling(解封)","text":"序列化与反序列化 Serialization:Data Structure/Object –> Binary StringDeserialization:Binary String –> Data Structure/ObjectGoals:Cross-platform Communication、Persistent Storage and More Python中对象的序列化与反序列化pickle module pickle 仅可用于 Python,pickle所使用的数据流格式仅可用于 Pythonpickle 模块可以将复杂对象转换为字节流,也可以将字节流转换为具有相同内部结构的对象。可被pickling和unpickling的对象:https://docs.python.org/zh-cn/3/library/pickle.html#what-can-be-pickled-and-unpickled pickle提供了优秀的方法方便我们对对象进行pickling(封存)和unpickling(解封) 使用dumps和loads方法进行序列化和反序列化123456789101112131415>>> import pickle>>> person = dict(name='shan', age=20, sex="man")>>> pickle.dumps(person) # dumps方法会将obj序列化为bytes返回b'\\x80\\x03}q\\x00(X\\x04\\x00\\x00\\x00nameq\\x01X\\x04\\x00\\x00\\x00shanq\\x02X\\x03\\x00\\x00\\x00ageq\\x03K\\x14X\\x03\\x00\\x00\\x00sexq\\x04X\\x03\\x00\\x00\\x00manq\\x05u.>>>>>> with open("dump.txt","wb") as f:... pickle.dump(person, f)...>>> f = open("dump.txt","rb")>>> d = pickle.load(f)>>> f.close()>>> d{'name': 'shan', 'age': 20, 'sex': 'man'}>>> pickle.loads(pickle.dumps(d)){'name': 'shan', 'age': 20, 'sex': 'man'} https://docs.python.org/zh-cn/3/library/pickle.html#pickle.dump bytes对象是由单个字节组成的不可变序列 使用dump方法可将序列化的对象写入file obj load用于还原封存生成的bytes_object,loads方法用于还原从文件中读取的封存对象 json module 相比于pickle,json只能表示内置类型的子集,不能表示自定义的类json格式的文件的易读性更好Python json模块提供的API与pickle模块很相似 使用dumps和loads进行序列化和反序列化12345678>>> import json>>> person = dict(name='shan', age=20, sex="man")>>> json.dumps(person)'{"name": "shan", "age": 20, "sex": "man"}'>>>>>> json_str = json.dumps(person)>>> json.loads(json_str){'name': 'shan', 'age': 20, 'sex': 'man'} dumps方法会将obj转换为标准格式的JSON str并返回 loads方法可将包含JSON文档的str、bytes或者bytearray反序列化为Python对象 自定义对象的序列化与反序列化 对于自定义对象的序列化和反序列化操作需要我们实现专门的encoder和decoder需要用到dumps方法的default参数和loads方法的object_hook参数https://docs.python.org/3/library/json.html#json.loadshttps://docs.python.org/3/library/json.html#json.loads 1234567891011121314151617181920212223242526272829>>> import json>>>>>> class Student(object):... def __init__(self, name, age, score):... self.name = name... self.age = age... self.score = score...>>> def student2dict(std):... return {... 'name': std.name,... 'age': std.age,... 'score': std.score... }...>>> def dict2student(d):... return Student(d['name'], d['age'], d['score'])...>>> s = Student('Bob', 20, 88)>>> print(json.dumps(s, default=student2dict)){"name": "Bob", "age": 20, "score": 88}>>> json_str = json.dumps(s, default=student2dict)>>> print(json.loads(json_str, object_hook=dict2student))<__main__.Student object at 0x000001B101675198>>>> json.loads(json_str, object_hook=dict2student)<__main__.Student object at 0x000001B101675128>>>> old = json.loads(json_str, object_hook=dict2student)>>> old.name'Bob' third-party module:marshmallow marshmallow is an ORM/ODM/framework-agnostic library for converting complex datatypes, such as objects, to and from native Python datatypes. 1234567891011121314151617181920212223>>> import datetime as dt>>> import marshmallow>>> from dataclasses import dataclass>>>>>> from marshmallow import Schema, fields>>>>>> @dataclass... class Album:... title: str... release_date: dt.date...>>> class AlbumSchema(Schema):... title = fields.Str()... release_date = fields.Date()...>>> album = Album("Seven Innovation Base", dt.date(2019, 11, 23))>>> schema = AlbumSchema()>>> data = schema.dump(album) # obj -> dict>>> data{'title': 'Seven Innovation Base', 'release_date': '2019-11-23'}>>> data_str = schema.dumps(album) # obj -> str>>> data_str'{"title": "Seven Innovation Base", "release_date": "2019-11-23"}' 使用 marshmallow 可以很方便的对自定义对象进行序列化和反序列化 对object进行在序列化之前,需要为object创建一个schema,schema中的字段名必须与自定义的object中的成员一致 dumps method:obj -> str, dump method:obj -> dict 反序列化的 dict -> obj 需要使用decorator:post_load自己实现 12345678910111213141516171819202122232425from marshmallow import Schema, fields, post_loadclass User: def __init__(self, name, email): self.name = name self.email = email def __repr__(self): return "<User(name={self.name!r})>".format(self=self)class UserSchema(Schema): name = fields.Str() email = fields.Email() @post_load def make_user(self, data, **kwargs): return User(**data)user_data = { "email": "ken@yahoo.com", "name": "Ken",}schema = UserSchema()result = schema.load(user_data)print(result) # 输出结果:<User(name='Ken')> References 序列化与反序列化 pickle module json module bytes RESTful API编写指南 Flask RESTful API开发之序列化与反序列化 marshmallow","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"Json","slug":"Json","permalink":"https://yeshan333.github.io/tags/Json/"}]},{"title":"map-filter-reduce","slug":"map-filter-reduce","date":"2019-11-14T21:49:41.000Z","updated":"2019-11-14T21:49:41.000Z","comments":true,"path":"2019/11/14/map-filter-reduce/","permalink":"https://yeshan333.github.io/2019/11/14/map-filter-reduce/","excerpt":"听说函数式编程很⑥,咱也不知道,咱也不晓得,还没实际用过。emmm。。。。,先mark下Python中和函数式编程有关的部分功能先,又开始水了,立个flag🚩:慢慢完善 map先看下Python官方文档的说法 map(function, iterable, …),返回一个将 function 应用于 iterable 中每一项并输出其结果的迭代器。 如果传入了额外的 iterable 参数,function 必须接受相同个数的实参并被应用于从所有可迭代对象中并行获取的项。 见识一下 123456789101112>>> def cook(something):... if something == "cow":... return "hamburger"... elif something == "tomato":... return "chips"... elif something == "chicken":... return "ddrumstick"... elif something == "corn":... return "popcorn"...>>> list(map(cook, ["cow", "tomato", "chicken", "corn"]))['hamburger', 'chips', 'ddrumstick', 'popcorn']","text":"听说函数式编程很⑥,咱也不知道,咱也不晓得,还没实际用过。emmm。。。。,先mark下Python中和函数式编程有关的部分功能先,又开始水了,立个flag🚩:慢慢完善 map先看下Python官方文档的说法 map(function, iterable, …),返回一个将 function 应用于 iterable 中每一项并输出其结果的迭代器。 如果传入了额外的 iterable 参数,function 必须接受相同个数的实参并被应用于从所有可迭代对象中并行获取的项。 见识一下 123456789101112>>> def cook(something):... if something == "cow":... return "hamburger"... elif something == "tomato":... return "chips"... elif something == "chicken":... return "ddrumstick"... elif something == "corn":... return "popcorn"...>>> list(map(cook, ["cow", "tomato", "chicken", "corn"]))['hamburger', 'chips', 'ddrumstick', 'popcorn'] filter也看下官方文档的说法 filter(function, iterable),用 iterable 中函数 function 返回真的那些元素,构建一个新的迭代器。iterable 可以是一个序列,一个支持迭代的容器,或一个迭代器。如果 function 是 None ,则会假设它是一个身份函数,即 iterable 中所有返回假的元素会被移除。 也见识下 123456789>>> def isVegetarian(food):... check = ['chips', 'popcorn']... if food in check:... return True... else:... return False...>>> list(filter(isVegetarian, ['hamburger', 'chips', 'ddrumstick', 'popcorn']))['chips', 'popcorn'] reduce再看下官方文档 Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to >reduce the iterable to a single value. 见识下 123>>> from functools import reduce>>> reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])15 一图胜千言 曾看到过一张把filter、map、reduce描述得很透彻得图,真滴六🐂 references Demonstrating map, filter, and reduce in Swift using food emoji 函数式编程指引 functools.reduce map","categories":[{"name":"函数式编程","slug":"函数式编程","permalink":"https://yeshan333.github.io/categories/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"函数式编程","slug":"函数式编程","permalink":"https://yeshan333.github.io/tags/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B/"}]},{"title":"git clone后如何checkout到remote branch","slug":"clone后如何checkout到remote-branch","date":"2019-10-27T00:36:10.000Z","updated":"2019-10-27T00:36:10.000Z","comments":true,"path":"2019/10/27/clone后如何checkout到remote-branch/","permalink":"https://yeshan333.github.io/2019/10/27/clone%E5%90%8E%E5%A6%82%E4%BD%95checkout%E5%88%B0remote-branch/","excerpt":"","text":"what/why通常情况使用git clone github_repository_address下载下来的仓库使用git branch查看当前所有分支时只能看到master分支,但是想要切换到其他分支进行工作怎么办❓ 其实使用git clone下载的repository没那么简单😥,clone得到的是仓库所有的数据,不仅仅是复制在Github repository所能看到的master分支下的所有文件,clone下来的是仓库下的每一个文件和每一个文件的版本(也就是说所有的分支都被搞下来了咯),那为啥看不到,其实remote branch被隐藏了,需要使用git branch -a才能看到。 howemmm…,现在看到了,那么怎么切换到remote branch呢?(我太难了🙃),又到了查文档的时候了,一波操作过后了解到git checkout是有restore working tree files的功能的,可以用来restore remote branch,比如使用以下命令在本地创建个新分支track远程分支: 1$ git checkout -b <branch> --track <remote>/<branch> 12# 例子,本地为远程分支CkaiGrac-PYMO创建的新分支名为yeshan,push时需要注意git checkout -b yeshan --track origin/CkaiGrac-PYMO tips:使用git checkout -t <remote/branch>默认会在本地建立一个和远程分支名字一样的分支 reference git-branch: https://git-scm.com/docs/git-branch git-checkout: https://git-scm.com/docs/git-checkout","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"}]},{"title":"使用Microsoft Edge Beta将网页变成应用","slug":"使用Microsoft-Edge-Beta将网页变成应用","date":"2019-10-11T23:50:56.000Z","updated":"2019-10-11T23:50:56.000Z","comments":true,"path":"2019/10/11/使用Microsoft-Edge-Beta将网页变成应用/","permalink":"https://yeshan333.github.io/2019/10/11/%E4%BD%BF%E7%94%A8Microsoft-Edge-Beta%E5%B0%86%E7%BD%91%E9%A1%B5%E5%8F%98%E6%88%90%E5%BA%94%E7%94%A8/","excerpt":"","text":"今天无聊的我打开了装了很久都没用的Microsoft Edge Beta,一波乱戳,惊讶的发现Microsoft Edge Beta居然有将网页打包为应用的功能😂 B站也有PC”客户端”了,真香😂","categories":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/categories/%E9%9A%8F%E7%AC%94/"}],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"简单感受下Python内置数据类型常用操作的性能","slug":"简单了解下Python内置数据类型常用操作的性能","date":"2019-10-02T19:01:46.000Z","updated":"2019-10-02T19:01:46.000Z","comments":true,"path":"2019/10/02/简单了解下Python内置数据类型常用操作的性能/","permalink":"https://yeshan333.github.io/2019/10/02/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3%E4%B8%8BPython%E5%86%85%E7%BD%AE%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E5%B8%B8%E7%94%A8%E6%93%8D%E4%BD%9C%E7%9A%84%E6%80%A7%E8%83%BD/","excerpt":"生成一个列表的几种方式的性能对比12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152# -*- coding: utf-8 -*-from timeit import Timerimport matplotlib.pyplot as plt# 列表常用操作性能测试# 迭代 + '+'def test1(): l = [] for i in range(1000): l = l + [i]# 迭代 + appenddef test2(): l = [] for i in range(1000): l.append(i)# 列表生成式def test3(): l = [i for i in range(1000)]# list构造函数 + rangedef test4(): l = list(range(1000))t1 = Timer("test1()", "from __main__ import test1")# print("concat %f seconds" % t1.timeit(number=1000))t2 = Timer("test2()", "from __main__ import test2")# print("concat %f seconds" % t2.timeit(number=1000))t3 = Timer("test3()", "from __main__ import test3")# print("concat %f seconds" % t3.timeit(number=1000))t4 = Timer("test4()", "from __main__ import test4")# print("concat %f seconds" % t4.timeit(number=1000))result = [t1.timeit(1000), t2.timeit(1000), t3.timeit(1000), t4.timeit(1000)]method = ["for+ '+'", "for + append", "list comprehension", "list + range"]plt.bar(method, result, color='rgby')# plt.legend('concat time')# print(zip(method, result))for x,y in zip(method, result): plt.text(x, y, "%fs" % y)plt.show()","text":"生成一个列表的几种方式的性能对比12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152# -*- coding: utf-8 -*-from timeit import Timerimport matplotlib.pyplot as plt# 列表常用操作性能测试# 迭代 + '+'def test1(): l = [] for i in range(1000): l = l + [i]# 迭代 + appenddef test2(): l = [] for i in range(1000): l.append(i)# 列表生成式def test3(): l = [i for i in range(1000)]# list构造函数 + rangedef test4(): l = list(range(1000))t1 = Timer("test1()", "from __main__ import test1")# print("concat %f seconds" % t1.timeit(number=1000))t2 = Timer("test2()", "from __main__ import test2")# print("concat %f seconds" % t2.timeit(number=1000))t3 = Timer("test3()", "from __main__ import test3")# print("concat %f seconds" % t3.timeit(number=1000))t4 = Timer("test4()", "from __main__ import test4")# print("concat %f seconds" % t4.timeit(number=1000))result = [t1.timeit(1000), t2.timeit(1000), t3.timeit(1000), t4.timeit(1000)]method = ["for+ '+'", "for + append", "list comprehension", "list + range"]plt.bar(method, result, color='rgby')# plt.legend('concat time')# print(zip(method, result))for x,y in zip(method, result): plt.text(x, y, "%fs" % y)plt.show() list和dict的检索效率对比123456789101112131415161718192021222324252627282930# -*- coding: utf-8 -*-import randomfrom timeit import Timerimport matplotlib.pyplot as pltlst_result = []d_result = []for i in range(10000,1000001,20000): t = Timer("random.randrange(%d) in x" % i, "from __main__ import random,x") x = list(range(i)) lst_time = t.timeit(number=1000) x = {j:None for j in range(i)} d_time = t.timeit(number=1000) lst_result.append(lst_time) d_result.append(d_time) print("%d,%10.3f,%10.3f" % (i, lst_time, d_time))test = [i for i in range(10000,1000001,20000)]plt.plot(test, lst_result, 'ro')plt.plot(test, d_result, 'bo')plt.legend(['List','Dictionary'])plt.show() del list[index]与del dict[key] 性能对比 average time complexity:$ O(n)\\ \\ vs\\ \\ O(1) $ 1234567891011121314151617181920212223242526272829303132# -*- coding: utf-8 -*-import randomfrom timeit import Timerimport matplotlib.pyplot as pltsize = 20000l_result = []d_result = []for i in range(size): test_list = [i for i in range(size)] list_t = Timer("del test_list[%d]" % i,"from __main__ import test_list") list_result = list_t.timeit(number=1) l_result.append(list_result) test_dict = {j:None for j in range(size)} dict_t = Timer("del test_dict[%d]" % i,"from __main__ import test_dict") dict_result = dict_t.timeit(number=1) d_result.append(dict_result) # print("%d,%f,%f" % (i, list_result, dict_result))plt.plot(range(size), l_result)plt.plot(range(size), d_result)plt.legend(['del list[index]', 'del dict[key]'])plt.show() 参考 matplotlib中文文档 TimeComplexity 北大数据结构与算法公开课 Python timeit","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"Python 环境管理与项目依赖管理","slug":"Python环境管理","date":"2019-09-02T13:07:13.000Z","updated":"2019-09-02T13:07:13.000Z","comments":true,"path":"2019/09/02/Python环境管理/","permalink":"https://yeshan333.github.io/2019/09/02/Python%E7%8E%AF%E5%A2%83%E7%AE%A1%E7%90%86/","excerpt":"个人简单记录下 virtualenv + pip virtualenv是一个用于创建”隔离的ython运行环境”的工具,Docspip是Python的包管理工具,Docs 1234567891011121314# 安装virtualenvpip install virtualenv# -------------------------------- ## 虚拟环境的创建与使用# 1、在当前工程目录下使用virtualenv创建一套独立的Python运行环境virtualenv venv # 环境名为venv(自由定义)# 2、cd 到创建好的虚拟环境的Scripts目录,执行如下命令可激活或者退出虚拟环境activate # 激活,激活后命令提示符会变成当前工程目录Python环境名deactivate # 退出# 3、激活虚拟环境后可使用pip为当前项目安装依赖,example:pip install numpy# 4、使用pip freeze > requirements.txt 可导出项目依赖到requirements.txt中# 为项目创建一个新的、干净的环境时,可使用 pip install -r requiremen.txt 为项目安装依赖","text":"个人简单记录下 virtualenv + pip virtualenv是一个用于创建”隔离的ython运行环境”的工具,Docspip是Python的包管理工具,Docs 1234567891011121314# 安装virtualenvpip install virtualenv# -------------------------------- ## 虚拟环境的创建与使用# 1、在当前工程目录下使用virtualenv创建一套独立的Python运行环境virtualenv venv # 环境名为venv(自由定义)# 2、cd 到创建好的虚拟环境的Scripts目录,执行如下命令可激活或者退出虚拟环境activate # 激活,激活后命令提示符会变成当前工程目录Python环境名deactivate # 退出# 3、激活虚拟环境后可使用pip为当前项目安装依赖,example:pip install numpy# 4、使用pip freeze > requirements.txt 可导出项目依赖到requirements.txt中# 为项目创建一个新的、干净的环境时,可使用 pip install -r requiremen.txt 为项目安装依赖 Pipenv Pipenv集包管理和虚拟环境管理于一身,使用Pipfile和Pipfile.lock管理项目依赖(Pipfile中保存着各个依赖包的版本信息,Pipfile.lock保存着依赖包的锁信息)。Docs Pipenv playground Pipfile and Pipfile.lock 123456789101112# 安装pip install pipenv# ------------------ ## Pipenv的使用# 1、为当前工程创建虚拟环境pipenv install # 这里会生成Pipfile和Pipfile.lock文件# 2、虚拟环境的激活pipenv shell # 激活虚拟环境# 3、安装依赖pipenv install [package_name]# 4、在虚拟环境中运行Python脚本pipenv run xxx.py Poetry Poetry是新一代的用来处理依赖项的安装、构建和打包成Python包的工具(2018年2月28日发布0.1.0版本),Poetry使用pyproject.toml管理项目依赖。Docs 12345678910111213# Poetry的安装pip install poetry# ---------------------- ## poetry的使用# 1、快速创建一个Python项目poetry new [project_name]# 2、以交互式的方式为当前项目创建pyproject.toml文件poetry init# 3、为当前项目添加依赖poetry add [package_name]# 4、构建源码并对当前项目进行wheels archive(打包成Python包)poetry build 拓展关于Wheel打包格式《PEP427》","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"环境管理","slug":"环境管理","permalink":"https://yeshan333.github.io/tags/%E7%8E%AF%E5%A2%83%E7%AE%A1%E7%90%86/"}]},{"title":"docker学习笔记","slug":"docker学习笔记","date":"2019-08-08T17:29:19.000Z","updated":"2019-08-08T17:29:19.000Z","comments":true,"path":"2019/08/08/docker学习笔记/","permalink":"https://yeshan333.github.io/2019/08/08/docker%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/","excerpt":"Play With Docker一个免费使用的基于web界面的Docker环境 常用docker命令可使用docker COMMAND --help查看命令的用法 Docker镜像相关 1、docker image pull:用于下载镜像,镜像从远程镜像仓库服务的仓库中下载,默认从Docker Hub的仓库中拉取 1234# 格式:docker pull [OPTIONS] NAME[:TAG|@DIGEST]# 说明:如果给出tag,一般拉取latest,name一般为username/repository,digest为镜像摘要可不给出docker image pull ubuntu:latest# 这个拉取标签为latest的ubuntu官方镜像,latest: Pulling from library/ubuntu,latest不一定是最新镜像","text":"Play With Docker一个免费使用的基于web界面的Docker环境 常用docker命令可使用docker COMMAND --help查看命令的用法 Docker镜像相关 1、docker image pull:用于下载镜像,镜像从远程镜像仓库服务的仓库中下载,默认从Docker Hub的仓库中拉取 1234# 格式:docker pull [OPTIONS] NAME[:TAG|@DIGEST]# 说明:如果给出tag,一般拉取latest,name一般为username/repository,digest为镜像摘要可不给出docker image pull ubuntu:latest# 这个拉取标签为latest的ubuntu官方镜像,latest: Pulling from library/ubuntu,latest不一定是最新镜像 2、docker image ls:列出本地Docker主机上存储的镜像 3、docker image inspect:查看镜像的细节,包括镜像层数据和元数据 12# docker image inspect [OPTIONS] IMAGE [IMAGE...]# inspect后一般跟repository name或image id 4、docker image rm:用于删除镜像。如果镜像存在关联的容器,并且容器处于运行(Up)或停止(Exit)状态时,不允许删除该镜像。rm后可跟repository或image id 5、dicker image search:从Docker Hub查找镜像 6、docker image build:根据Dockerfile构建镜像 12# 例如:使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。docker build -t yeshan333/ubuntu:latest . 7、docker image history:用于查看镜像构建的相关信息 Docker容器相关 1、docker container run:用于启动新容器 123456789101112# 格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]# 常用options:# -d: 后台运行容器,并返回容器ID;# -i: 以交互模式运行容器,通常与 -t 同时使用;# -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;# -P: 随机端口映射,容器内部端口随机映射到主机的高端口# -p: 指定端口映射,格式为:主机(宿主)端口:容器端口# --name="container-name": 为容器指定一个名称;# 示例docker container run -it ubuntu:latest /bin/bash# 说明:-it使容器具备交互性并与终端连接,命令最后表明运行容器中的Bash Shell程序 2、docker container ls:列出所有运行状态的容器可用docker ps代替,如果加个**-a*附加参数,会列出所有容器(包括处于停止状态的容器) 3、docker container stop:停止运行中的容器,并将其状态设置为Exited(0),stop后跟container name或container id 4、docker container rm:用于删除停止运行的容器,rm后跟container name或container id,使用-f参数可强制删除运行中的容器 5、docker container exec:用于连接一个处于运行状态的容器 123# 例如:docker container exec -t <container-name or container-id> bash# 该命令会将docker主机中的shell连接到一个运行中的容器,在容器内部启动一个新的bash shell进程 6、docker container start:用于重启处于停止(Exited)状态的容器,start后跟container name或container id 7、docker container inspect:查看容器的配置信息和运行时信息,inspect后跟container name或container id 8、快捷键Ctrl+PQ用于断开docker主机的shell终端与容器终端的连接,并在退出后保证容器在后台运行 应用容器化 (Containerizing|Dockerizing)即将应用整合到容器中并且运行的过程 应用容器化的一般步骤 1、编写应用代码 2、创建Dockerfile,其中包括当前应用的描述、依赖以及如何运行这个应用 3、对Dockerfile执行docker image build命令 4、等待Docker将应用程序构建到Docker镜像中 Once your app is containerized (made into a Docker image), you’re ready to ship it and run it as a container.《Docker Deep Dive》 使用Dockerfile定制镜像 Dockerfile最佳实践 使用Dockerfile定制镜像 Dockerfile中以#开头的都是注释行,除注释之外,每一行都是一条指令指令的的一般格式:INSTRUCTION argument,INSTRUCTION一般都为大写 示例Dockerfile:https://github.com/yeshan333/psweb 123456789101112131415161718FROM alpineLABEL maintainer="nigelpoulton@hotmail.com"# Install Node and NPMRUN apk add --update nodejs nodejs-npm# Copy app to /srcCOPY . /srcWORKDIR /src# Install dependenciesRUN npm installEXPOSE 8080ENTRYPOINT ["node", "./app.js"] 说明: 每个Dockerfile文件文件的第一行一般都是FROM指令。FROM指定的镜像会作为当前镜像的一个基础镜像层,当前应用的剩余内容会作为新的镜像层添加到基础镜像层之上。,FROM建议引用官方镜像 LABEL指定当前镜像维护者,给镜像使用者一个沟通渠道 RUN apk add --update nodejs nodejs-npm将当前应用的依赖安装到镜像中,RUN指令会新建一个镜像层存储这些内容 COPY . /src会将应用相关文件从构建上下文复制到当前镜像中,这会新建一个镜像层 WORKDIR /src会为Dockerfile中未执行的指令设置工作目录 RUN npm install在当前工作目录中为应用安装依赖,这会新建一个镜像层 EXPOSE 8080对外提供一个web服务端口 ENTRYPOINT ["node", "./app.js"]指定了当前镜像的入口程序,container运行时就会运行 构建镜像使用docker image build根据Dockerfile制作镜像,示例: 123# -t用于指定制作好的镜像的名字及标签,通常 name:tag 或者 name# 最后的 . 表示使用当前目录作为构建上下文docker image build -t web:latest . 使用docker image history web:latest可以查看构建镜像过程中执行了哪些指令 推送镜像到Docker Hub 推送镜像前建议使用以下命令给镜像打新标签12# new-tag建议以自己的 DockerHub ID/new-tag 的格式命名,方便推送到自己的repodocker image tag <current-tag> <new-tag> 使用docker image push <tag-name>推送镜像,推送前需要docker login,记得测试打包好的应用再推送!!! Dockerfile常用指令 指令 说明 FROM 指定要构建的镜像的基础镜像,一般为Dockerfile文件第一行 RUN 用于在镜像中执行命令,会新建一个镜像层 COPY 一般用于将应用代码copy到镜像中,这会新建一个镜像层 WORKDIR 用于设置Dockerfile中未执行的指令的工作目录 ENTRYPOINT 指定镜像以容器方式启动后默认运行的程序, ENTRYPOINT 的命令不会被docker run指定要执行的命令覆盖 CMD 指定容器启动时执行的命令,一个 Dockerfile 中只能有一个 CMD 指令,如果写了多个,那么只有最后一个会执行。CMD 和 ENTRYPOINT 同时存在时,CMD 中的内容会变成 ENTRYPOINT 中指令命令的默认参数,该参数可以被 docker run 时设置的命令覆盖 ENV 设置镜像中的环境变量 EXPOSE 记录应用所使用的网络端口 更多: Dockerfile指令详解 Dockerfile reference","categories":[{"name":"docker","slug":"docker","permalink":"https://yeshan333.github.io/categories/docker/"}],"tags":[{"name":"docker","slug":"docker","permalink":"https://yeshan333.github.io/tags/docker/"}]},{"title":"几个不错的Jupyter Notebook云端展示平台","slug":"几个不错的Jupyter Notebook云端展示平台","date":"2019-08-07T09:27:50.000Z","updated":"2019-08-07T09:27:50.000Z","comments":true,"path":"2019/08/07/几个不错的Jupyter Notebook云端展示平台/","permalink":"https://yeshan333.github.io/2019/08/07/%E5%87%A0%E4%B8%AA%E4%B8%8D%E9%94%99%E7%9A%84Jupyter%20Notebook%E4%BA%91%E7%AB%AF%E5%B1%95%E7%A4%BA%E5%B9%B3%E5%8F%B0/","excerpt":"jupyter nbviewerURL:https://nbviewer.jupyter.org/ 结合Github的示例用法:https://nbviewer.jupyter.org/github/ + <用户名或者用户名/存放ipynb文件的仓库或者Gist ID> 例如:https://nbviewer.jupyter.org/github/yeshan333/JupyterNotebook-Show-sample","text":"jupyter nbviewerURL:https://nbviewer.jupyter.org/ 结合Github的示例用法:https://nbviewer.jupyter.org/github/ + <用户名或者用户名/存放ipynb文件的仓库或者Gist ID> 例如:https://nbviewer.jupyter.org/github/yeshan333/JupyterNotebook-Show-sample 还行~~~ binderURL:https://mybinder.org 使用文档:https://mybinder.readthedocs.io/en/latest/index.html# 结合Github的示例用法:https://mybinder.org/v2/gh/ + <用户名/仓库名> + /分支名 + ?filepath= + ipynb文件名 例如:https://mybinder.org/v2/gh/yeshan333/JupyterNotebook-Show-sample/master?filepath=demo.ipynb 很nice啊,在线交互式环境,在线跑代码,就是渲染有点小慢 google colab官方介绍:https://colab.research.google.com/notebooks/welcome.ipynb,需要科学上网 结合Github的示例用法:https://colab.research.google.com/github/ + 用户名/ + 存放ipynb文件的仓库名/ + blob/ + 分支名 + 要展示的ipynb文件路径 示例:https://colab.research.google.com/github/yeshan333/JupyterNotebook-Show-sample/blob/master/demo.ipynb 也是个在线的交互式环境,很nice了","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"Jupyter","slug":"Jupyter","permalink":"https://yeshan333.github.io/tags/Jupyter/"}]},{"title":"pdb && cProfile","slug":"pdb-profile","date":"2019-07-28T15:55:48.000Z","updated":"2019-07-28T15:55:48.000Z","comments":true,"path":"2019/07/28/pdb-profile/","permalink":"https://yeshan333.github.io/2019/07/28/pdb-profile/","excerpt":"pdb https://docs.python.org/zh-cn/3.7/library/pdb.html#module-pdb 使用方式 1、在命令行下直接运行调试 1python -m pdb test.py 2、在需要被调试的代码中添加import pdb、pdb.set_trace()再运行代码进行调试","text":"pdb https://docs.python.org/zh-cn/3.7/library/pdb.html#module-pdb 使用方式 1、在命令行下直接运行调试 1python -m pdb test.py 2、在需要被调试的代码中添加import pdb、pdb.set_trace()再运行代码进行调试 1234567891011# test.pydef func(): print('enter func()')a = 1b = 2import pdbpdb.set_trace() # 运行到此处启动pdbfunc()c = 3print(a + b + c) 常用命令 简写 说明 p <变量名> 输出变量的值 l 列出源码,当前位置前后11行 n 执行吓一条语句 s 执行下一条语句,如果是函数,则会进入函数内,显示–call–,执行函数内第一条语句,执行完函数内语句后跳出显示–return– b 列出当前所有断点 b lineno 在某行添加断点 cl 清除断点 q 退出调试pdb help 帮助 cProfile-性能分析 https://docs.python.org/zh-cn/3.7/library/profile.html 123456789101112131415161718192021222324252627# test.pydef memoize(f): memo = {} def helper(x): if x not in memo: memo[x] = f(x) return memo[x] return helper@memoizedef fib(n): if n == 0: return 0 elif n == 1: return 1 else: return fib(n-1) + fib(n-2)def fib_seq(n): res = [] if n > 0: res.extend(fib_seq(n-1)) res.append(fib(n)) return resfib_seq(30) 1python -m cProfile test.py ncalls:相应代码/函数被调用的次数 tottime:相应代码/函数执行所需时间(不包括它调用的其他代码/函数的时间) tottime percall:tottime/ncalls的结果 cumtime:对应代码/函数执行所需时间,包含它调用的其他代码/函数的时间 cumtime percall:cumtime和ncall相除的平均结果","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"debug","slug":"debug","permalink":"https://yeshan333.github.io/tags/debug/"}]},{"title":"Python-自定义上下文管理器","slug":"Python-自定义上下文管理器","date":"2019-07-26T16:30:46.000Z","updated":"2019-07-26T16:30:46.000Z","comments":true,"path":"2019/07/26/Python-自定义上下文管理器/","permalink":"https://yeshan333.github.io/2019/07/26/Python-%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%8A%E4%B8%8B%E6%96%87%E7%AE%A1%E7%90%86%E5%99%A8/","excerpt":"上下文管理器 上下文管理器可以帮助我们自动分配和释放资源 上下文管理器需要配合with语句使用 比如进行文件操作的时候我们可能会忘记操作后关闭文件(file close),使用with open(filename, mode) as f不需要我们手动关闭文件,不管处理文件中是否有异常出现,都能保证with语句执行完毕后关闭文件,有效防止资源泄露,安全多了。 123# with 语句的一般格式with context_expression [as target(s)]: with-body 在执行with-body会调用上下文管理器的__enter__方法,执行完with-body之后再调用上下文管理器的__exit__方法","text":"上下文管理器 上下文管理器可以帮助我们自动分配和释放资源 上下文管理器需要配合with语句使用 比如进行文件操作的时候我们可能会忘记操作后关闭文件(file close),使用with open(filename, mode) as f不需要我们手动关闭文件,不管处理文件中是否有异常出现,都能保证with语句执行完毕后关闭文件,有效防止资源泄露,安全多了。 123# with 语句的一般格式with context_expression [as target(s)]: with-body 在执行with-body会调用上下文管理器的__enter__方法,执行完with-body之后再调用上下文管理器的__exit__方法 基与类的上下文管理器 基与类的上下文管理器需要我们实现对象的__enter()__和__exit()__方法 我们需要在__enter()__中管理资源对象,在__exit__()中释放资源 enter 方法在 with 语句体执行前调用,with 语句将该方法的返回值赋给 as 字句中的变量,如果有 as 字句的话 123456789101112131415161718192021222324# 模拟 Python 的打开文件、关闭文件操作class Filemanager: def __init__(self, name, mode): print('calling __init__ method') self.name = name self.mode = mode self.file = None def __enter__(self): print('caling __enter__ method') self.file = open(self.name, self.mode) return self.file def __exit__(self, exc_type, exc_val, exc_tb): print('caling __exit__ method') if self.file: self.file.close# Filemanager为上下文管理器# with Filemanager('test.txt', 'w') as f 是上下文表达式,f为资源对象with Filemanager('test.txt', 'w') as f: print('ready to write to file') f.write('Hello World') 运行结果解析: 1、with 语句调用__init__方法,初始化对象 2、with 语句先暂存了Filemanager的__exit__方法 3、然后调用__enter__方法,输出caling enter method,返回资源对象(这里是文件句柄)给f 4、输出ready to write to file,将Hello World写入文件 5、最后调用__exit__方法,输出caling exit method,关闭之前打开的文件流 注意:__exit__方法中的参数exc_type、exc_val、exc_tb分别表示exception type、exception value、traceback。进行资源回收时如果有异常抛出,那么异常的信息就会包含再这三个变量中,让我们可以再__exit__中处理这些异常。例如: 12345678910111213141516171819class Foo: def __init__(self): print('__init__ called') def __enter__(self): print('__enter__ called') return self def __exit__(self, exc_type, exc_value, exc_tb): print('__exit__ called') if exc_type: print(f'exc_type: {exc_type}') print(f'exc_value: {exc_value}') print(f'exc_traceback: {exc_tb}') print('exception handled') return Truewith Foo() as obj: raise Exception('exception raised').with_traceback(None) 123456789101112131415161718192021222324输出结果:---------------------------------------1、__exit__返回 True__init__ called__enter__ called__exit__ calledexc_type: <class 'Exception'>exc_value: exception raisedexc_traceback: <traceback object at 0x00000234AA532F08>exception handled---------------------------------------2、__exit__返回 False__init__ called__enter__ called__exit__ calledexc_type: <class 'Exception'>exc_value: exception raisedexc_traceback: <traceback object at 0x00000120D0324F88>exception handledTraceback (most recent call last): File "e:\\Blog\\shansan\\source\\_posts\\context.py", line 19, in <module> raise Exception('exception raised').with_traceback(None)Exception: exception raised--------------------------------------- 发生异常时,__exit__方法返回 True 表示不处理异常,否则会在退出该方法后重新抛出异常以由 with 语句之外的代码逻辑进行处理。 基与生成器的上下文管理器 基于生成器的上下文管理器的实现需要使用@contextmanage装饰器 我们需要在finally block 中释放资源 12345678910111213from contextlib import contextmanager@contextmanagerdef file_manager(name, mode): try: f = open(name, mode) yield f finally: f.close()with file_manager('test.txt', 'w') as f: f.write('hello world') 参考 浅谈Python的with语句 上下文管理器-极客学院 http://wiki.jikexueyuan.com/project/interpy-zh/context_managers/README.html 深入理解 Python 中的上下文管理器 Python核心技术与实战-极客时间","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"上下文","slug":"上下文","permalink":"https://yeshan333.github.io/tags/%E4%B8%8A%E4%B8%8B%E6%96%87/"}]},{"title":"Python协程-asyncio、async/await","slug":"Python协程(Coroutine)","date":"2019-07-19T14:58:48.000Z","updated":"2019-07-19T14:58:48.000Z","comments":true,"path":"2019/07/19/Python协程(Coroutine)/","permalink":"https://yeshan333.github.io/2019/07/19/Python%E5%8D%8F%E7%A8%8B%EF%BC%88Coroutine%EF%BC%89/","excerpt":"看到吐血 (´ཀ`」 ∠) 协程(Coroutine)本质上是一个函数,特点是在代码块中可以将执行权交给其他协程 众所周知,子程序(函数)都是层级调用的,如果在A中调用了B,那么B执行完毕返回后A才能执行完毕。协程与子程序有点类似,但是它在执行过程中可以中断,转而执行其他的协程,在适当的时候再回来继续执行。 协程与多线程相比的最大优势在于:协程是一个线程中执行,没有线程切换的开销;协程由用户决定在哪里交出控制权 这里用到的是asyncio库(Python 3.7),这个库包含了大部分实现协程的魔法工具 使用 async 修饰词声明异步函数 使用 await 语句执行可等待对象(Coroutine、Task、Future) 使用 asyncio.create_task 创建任务,将异步函数(协程)作为参数传入,等待event loop执行 使用 asyncio.run 函数运行协程程序,协程函数作为参数传入","text":"看到吐血 (´ཀ`」 ∠) 协程(Coroutine)本质上是一个函数,特点是在代码块中可以将执行权交给其他协程 众所周知,子程序(函数)都是层级调用的,如果在A中调用了B,那么B执行完毕返回后A才能执行完毕。协程与子程序有点类似,但是它在执行过程中可以中断,转而执行其他的协程,在适当的时候再回来继续执行。 协程与多线程相比的最大优势在于:协程是一个线程中执行,没有线程切换的开销;协程由用户决定在哪里交出控制权 这里用到的是asyncio库(Python 3.7),这个库包含了大部分实现协程的魔法工具 使用 async 修饰词声明异步函数 使用 await 语句执行可等待对象(Coroutine、Task、Future) 使用 asyncio.create_task 创建任务,将异步函数(协程)作为参数传入,等待event loop执行 使用 asyncio.run 函数运行协程程序,协程函数作为参数传入 解析协程运行时12345678910111213141516171819202122232425262728import asyncioimport timeasync def a(): print("欢迎使用 a !") await asyncio.sleep(1) print("欢迎回到 a !")async def b(): print("欢迎来到 b !") await asyncio.sleep(2) print("欢迎回到 b !")async def main(): task1 = asyncio.create_task(a()) task2 = asyncio.create_task(b()) print("准备开始") await task1 print("task1 结束") await task2 print("task2 结束")if __name__ == "__main__": start = time.perf_counter() asyncio.run(main()) print('花费 {} s'.format(time.perf_counter() - start)) 解释: 1、asyncio.run(main()),程序进入main()函数,开启事件循环 2、创建任务task1、task2并进入事件循环等待运行 3、输出准备开始 4、执行await task1,用户选择从当前主任务中切出,事件调度器开始调度 a 5、a 开始运行,输出欢迎使用a!,运行到await asyncio.sleep(1),从当前任务切出,事件调度器开始调度 b 6、b 开始运行,输出欢迎来到b!,运行到await asyncio.sleep(2),从当前任务切出 7、以上事件运行时间非常短(毫秒),事件调度器开始暂停调度 8、一秒钟后,a的sleep完成,事件调度器将控制权重新交给a,输出欢迎回到a!,task1完成任务,退出事件循环 9、await task1完成,事件调度器将控制权还给主任务,输出task1结束,然后在await task2处继续等待 10、两秒钟后,b的sleep完成,事件调度器将控制权重新传给 b,输出欢迎回到 b!,task2完成任务,从事件循环中退出 11、事件调度器将控制权交还给主任务,主任务输出task2结束,至此协程任务全部结束,事件循环结束。 上面的代码也可以这样写,将15到21行换成一行await asyncio.gather(a(), b())也能实现类似的效果,await asyncio.gather 会并发运行传入的可等待对象(Coroutine、Task、Future)。 12345678910111213141516171819202122import asyncioimport timeasync def a(): print("欢迎使用 a !") await asyncio.sleep(1) print("欢迎回到 a !")async def b(): print("欢迎来到 b !") await asyncio.sleep(2) print("欢迎回到 b !")async def main(): await asyncio.gather(a(), b())if __name__ == "__main__": start = time.perf_counter() asyncio.run(main()) print('花费 {} s'.format(time.perf_counter() - start)) 异步接口同步实现12345678910111213141516171819202122232425"""- 简单爬虫模拟- 这里用异步接口写了个同步代码"""import asyncioimport timeasync def crawl_page(url): print('crawling {}'.format(url)) sleep_time = int(url.split('_')[-1]) await asyncio.sleep(sleep_time) # 休眠 print('OK {}'.format(url))async def main(urls): for url in urls: await crawl_page(url) # await会将程序阻塞在这里,进入被调用的协程函数,执行完毕后再继续start = time.perf_counter()# pip install nest-asyncioasyncio.run(main(['url_1', 'url_2'])) # 协程接口print("Cost {} s".format(time.perf_counter() - start)) 使用 Task 实现异步1234567891011121314151617181920212223# 异步实现import asyncioimport timeasync def crawl_page(url): print('crawling {}'.format(url)) sleep_time = int(url.split('_')[-1]) await asyncio.sleep(sleep_time) print('OK {}'.format(url))async def main(urls): tasks = [asyncio.create_task(crawl_page(url)) for url in urls] for task in tasks: await task # 14、15行也可以换成这一行await asyncio.gather(*tasks) # *tasks 解包列表,将列表变成了函数的参数,与之对应的是,** dict 将字典变成了函数的参数start = time.perf_counter()asyncio.run(main(['url_1', 'url_2']))print("Cost {} s".format(time.perf_counter() - start)) 生产者消费者模型的协程版本 123456789101112131415161718192021222324252627282930313233343536373839404142434445# 极客时间:Python核心技术与实战import asyncioimport randomimport timeasync def consumer(queue, id): """消费者""" while True: val = await queue.get() print('{} get a val : {}'.format(id, val)) await asyncio.sleep(1)async def producer(queue, id): """生产者""" for _ in range(5): val = random.randint(1, 10) await queue.put(val) print('{} put a val: {}'.format(id, val)) await asyncio.sleep(1)async def main(): queue = asyncio.Queue() consumer_1 = asyncio.create_task(consumer(queue, 'consumer_1')) consumer_2 = asyncio.create_task(consumer(queue, 'consumer_2')) producer_1 = asyncio.create_task(producer(queue, 'producer_1')) producer_2 = asyncio.create_task(producer(queue, 'producer_2')) await asyncio.sleep(10) # cancel掉执行之间过长的consumer_1、consumer_2,while True consumer_1.cancel() consumer_2.cancel() # return_exceptions 设为True,不让异常throw到执行层,影响后续任务的执行 await asyncio.gather(consumer_1, consumer_2, producer_1, producer_2, return_exceptions=True)if __name__ == "__main__": start = time.perf_counter() asyncio.run(main()) print("Cost {} s".format(time.perf_counter() - start)) 12345678910111213141516171819202122# 输出结果producer_1 put a val: 7producer_2 put a val: 4consumer_1 get a val : 7consumer_2 get a val : 4producer_1 put a val: 6producer_2 put a val: 1consumer_2 get a val : 6consumer_1 get a val : 1producer_1 put a val: 8producer_2 put a val: 1consumer_1 get a val : 8consumer_2 get a val : 1producer_1 put a val: 6producer_2 put a val: 4consumer_2 get a val : 6consumer_1 get a val : 4producer_1 put a val: 7producer_2 put a val: 8consumer_1 get a val : 7consumer_2 get a val : 8Cost 10.0093015 s 拓展阅读:Python的生产者消费者模型,看这篇就够了 参考 https://docs.python.org/3/library/asyncio.html#module-asyncio 深入理解asyncio(一) 揭密Python协程","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"协程","slug":"协程","permalink":"https://yeshan333.github.io/tags/%E5%8D%8F%E7%A8%8B/"}]},{"title":"breaking一如既往的帅","slug":"breaking一如既往的帅","date":"2019-07-12T21:29:25.000Z","updated":"2019-07-12T21:29:25.000Z","comments":true,"path":"2019/07/12/breaking一如既往的帅/","permalink":"https://yeshan333.github.io/2019/07/12/breaking%E4%B8%80%E5%A6%82%E6%97%A2%E5%BE%80%E7%9A%84%E5%B8%85/","excerpt":"","text":"** 看到了就爱上了,(๑•̀ㅂ•́)و✧Cloud的style move真的帅~~~(虽然很久没玩breaking了。。。。。(ノへ ̄、))**","categories":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/categories/%E9%9A%8F%E7%AC%94/"}],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"Latex基本语法简记","slug":"latex基本语法简记","date":"2019-06-18T15:05:57.000Z","updated":"2019-06-18T15:05:57.000Z","comments":true,"path":"2019/06/18/latex基本语法简记/","permalink":"https://yeshan333.github.io/2019/06/18/latex%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95%E7%AE%80%E8%AE%B0/","excerpt":"备注:当前博客使用的 latex 渲染引擎有点问题,本篇文章更好的阅读体验:https://blog.csdn.net/qq_41022329/article/details/92798759 公式插入方式 行内公式可用\\(...\\)或$...$ 例如$ f(x)=x^2 $,显示为$ f(x)=x^2 $ 独立公式(单独另起一行,公式会居中),使用$$...$$或\\[...\\] 例如:$$ \\int{f(x)dx} $$或 $$ \\int_a^b{f(x)dx} $$,显示为: $$ \\int{f(x)dx} $$ $$ \\int_a^b{f(x)dx} $$","text":"备注:当前博客使用的 latex 渲染引擎有点问题,本篇文章更好的阅读体验:https://blog.csdn.net/qq_41022329/article/details/92798759 公式插入方式 行内公式可用\\(...\\)或$...$ 例如$ f(x)=x^2 $,显示为$ f(x)=x^2 $ 独立公式(单独另起一行,公式会居中),使用$$...$$或\\[...\\] 例如:$$ \\int{f(x)dx} $$或 $$ \\int_a^b{f(x)dx} $$,显示为: $$ \\int{f(x)dx} $$ $$ \\int_a^b{f(x)dx} $$ 大括号的使用1234567891011121314151617181920212223方法一:$$ f(x)=\\left\\{\\begin{aligned}x & = & \\cos(t) \\\\y & = & \\sin(t) \\\\z & = & \\frac xy\\end{aligned}\\right.$$方法二:$$ F^{HLLC}=\\left\\{\\begin{array}{rcl}F_L & & {0 < S_L}\\\\F^*_L & & {S_L \\leq 0 < S_M}\\\\F^*_R & & {S_M \\leq 0 < S_R}\\\\F_R & & {S_R \\leq 0}\\end{array} \\right. $$方法三:$$f(x)=\\begin{cases}0& \\text{x=0}\\\\1& \\text{x!=0}\\end{cases}$$ 方法一: $$ f(x)=\\left{\\begin{aligned}x & = & \\cos(t) \\y & = & \\sin(t) \\z & = & \\frac xy\\end{aligned}\\right.$$ 方法二: $$ F^{HLLC}=\\left{\\begin{array}{rcl}F_L & & {0 < S_L}\\F^*_L & & {S_L \\leq 0 < S_M}\\F^*_R & & {S_M \\leq 0 < S_R}\\F_R & & {S_R \\leq 0}\\end{array} \\right. $$ 方法三: $$f(x)=\\begin{cases}0& \\text{x=0}\\1& \\text{x!=0}\\end{cases}$$ 符号表要输出字符 空格 # $ % & _ { } ,用命令:\\空格 # \\$ \\% \\& _ { } 运算符表关系运算符 命令 显示 命令 显示 \\pm $\\pm$ \\times $\\times$ \\div $\\div$ \\mid $\\mid$ \\nmid $\\nmid$ \\cdot $\\cdot$ \\circ $\\circ$ \\ast $\\ast$ \\bigodot $\\bigodot$ \\bigotimes $\\bigotimes$ \\bigoplus $\\bigoplus$ \\leq $\\leq$ \\geq $\\geq$ \\neq $\\neq$ \\approx $\\approx$ \\equiv $\\equiv$ \\sum $\\sum$ \\prod $\\prod$ 集合运算符 命令 显示 命令 显示 \\emptyset $\\emptyset$ \\in $\\in$ \\notin $\\notin$ \\subset $\\subset$ \\supset $\\supset$ \\subseteq $\\subseteq$ \\supseteq $\\supseteq$ \\bigcap $\\bigcap$ \\bigcup $\\bigcup$ \\bigvee $\\bigvee$ \\bigwedge $\\bigwedge$ \\biguplus $\\biguplus$ \\bigsqcup $\\bigsqcup$     对数运算符 命令 显示 命令 显示 命令 显示 \\log $\\log$ \\lg $\\lg$ \\ln $\\ln$ 三角运算符 命令 显示 命令 显示 命令 显示 \\bot $\\bot$ \\angle $\\angle$ 30^\\circ $30^\\circ$ \\sin $\\sin$ \\cos $\\cos$ \\tan $\\tan$ \\cot $\\cot$ \\sec $\\sec$ \\csc $\\csc$ 微积分运算符 命令 显示 命令 显示 命令 显示 \\prime $\\prime$ \\int $\\int$ \\iint $\\iint$ \\iiint $\\iiint$ \\oint $\\oint$ \\lim $\\lim$ \\infty $\\infty$ \\nabla $\\nabla$     逻辑运算符 命令 显示 命令 显示 命令 显示 \\because $\\because$ \\therefore $\\therefore$ \\forall $\\forall$ \\exists $\\exists$ \\not= $\\not=$ \\not> $\\not>$ \\not< $\\not<$ \\not\\subset $\\not\\subset$     其它符号戴帽和连线符号 命令 显示 命令 显示 命令 显示 \\hat{y} $\\hat{y}$ \\check{y} $\\check{y}$ \\breve $\\breve{y}$ \\overline{a+b+c+d} $\\overline{a+b+c+d}$ \\underline{a+b+c+d} $\\underline{a+b+c+d}$ \\overbrace{a+\\underbrace{b+c}_{1.0}+d}^{2.0} $\\overbrace{a+\\underbrace{b+c}_{1.0}+d}^{2.0}$ 箭头符号 命令 显示 命令 显示 命令 显示 \\uparrow $\\uparrow$ \\downarrow $\\downarrow$ \\Uparrow $\\Uparrow$ \\Downarrow $\\Downarrow$ \\rightarrow $\\rightarrow$ \\leftarrow $\\leftarrow$ \\Rightarrow $\\Rightarrow$ \\Leftarrow $\\Leftarrow$ \\longrightarrow $\\longrightarrow$ \\Longrightarrow $\\Longrightarrow$ \\longleftarrow $\\longleftarrow$ \\Longleftarrow $\\Longleftarrow$ 矩阵基本语法 起始标记\\begin{matrix},结束标记\\end{matrix} 每一行末标记\\\\进行换行,行间元素以&分隔用于对齐。 12345$$\\begin{matrix}1&0&0\\\\0&1&0\\\\0&0&1\\\\\\end{matrix}$$ $$\\begin{matrix}1&0&0\\0&1&0\\0&0&1\\\\end{matrix}$$ 进阶 可用下列词替换matrix设置矩阵边框 pmatrix、bmatrix、Bmatrix:小括号、中括号、大括号边框 vmatrix、Vmatrix:单竖线、双竖线边框 省略元素 横省略号:\\cdots 竖省略号:\\vdots 斜省略号:\\ddots 123456$$\\begin{Bmatrix}{a_{11}}&{a_{12}}&{\\cdots}&{a_{1n}}\\\\{a_{21}}&{a_{22}}&{\\cdots}&{a_{2n}}\\\\{\\vdots}&{\\vdots}&{\\ddots}&{\\vdots}\\\\{a_{m1}}&{a_{m2}}&{\\cdots}&{a_{mn}}\\\\\\end{Bmatrix}$$ $$\\begin{Bmatrix}{a_{11}}&{a_{12}}&{\\cdots}&{a_{1n}}\\{a_{21}}&{a_{22}}&{\\cdots}&{a_{2n}}\\{\\vdots}&{\\vdots}&{\\ddots}&{\\vdots}\\{a_{m1}}&{a_{m2}}&{\\cdots}&{a_{mn}}\\\\end{Bmatrix}$$ 希腊字母表 命令 显示 命令 显示 \\alpha $\\alpha$ \\beta $\\beta$ \\gamma $\\gamma$ \\delta $\\delta$ \\epsilon $\\epsilon$ \\zeta $\\zeta$ \\eta $\\eta$ \\theta $\\theta$ \\iota $\\iota$ \\kappa $\\kappa$ \\lambda $\\lambda$ \\mu $\\mu$ \\nu $\\nu$ \\xi $\\xi$ \\pi $\\pi$ \\rho $\\rho$ \\sigma $\\sigma$ \\tau $\\tau$ \\upsilon $\\upsilon$ \\phi $\\phi$ \\chi $\\chi$ \\psi $\\psi$ \\omega $\\omega$     如果需要大写的希腊字母,将命令首字母大写即可 例如:\\Gamma,显示$ \\Gamma $ 如果要将字母斜体显示,使用\\var前缀即可 例如:\\varGamma,显示$ \\varGamma $ 杂项 分组: 使用{}将具有相同等级的内容扩入其中,成组处理。 比如:\\10^10呈现为$10^10$,10^{10}呈现为$10^{10}$。 空格: 单个空格:a\\ b,$a\\ b$ 四个空格:a\\quad b,$a\\quad b$ 上标^,下标_ 尖括号\\langle\\rangle:$\\langle\\rangle$ 使用\\left或\\right使符号大小与临近的公式符号相适应,对比如下: (\\frac{x}{y}):$(\\frac{x}{y})$ \\left(\\frac{x}{y}\\right):$\\left(\\frac{x}{y}\\right)$ 分式: \\frac{1}{3}:$\\frac{1}{3}$ 1 \\over 3:$1 \\over 3$ 开根\\sqrt[n]{3}:$\\sqrt[n]{3}$ 省略号: \\ldots:与文本底线对齐的省略号 \\cdots:与文本中线对齐的省略号 $f(x_1,x_2,\\ldots,x_n) = x_1^2 + x_2^2 + \\cdots + x_n^2$:$f(x_1,x_2,\\ldots,x_n) = x_1^2 + x_2^2 + \\cdots + x_n^2$ 综合运用示范123% 极限运算$$\\lim\\limits_{n \\rightarrow +\\infty} \\frac{1}{n(n+1)}$$$$\\lim_{n \\rightarrow +\\infty} \\frac{1}{n(n+1)}$$ $$\\lim\\limits_{n \\rightarrow +\\infty} \\frac{1}{n(n+1)}$$ $$\\lim_{n \\rightarrow +\\infty} \\frac{1}{n(n+1)}$$ 1$$ \\left[J_\\alpha(x) = \\sum_{m=0}^\\infty \\frac{(-1)^m}{m! \\Gamma (m + \\alpha + 1)} {\\left({ \\frac{x}{2} }\\right)}^{2m + \\alpha}\\right] $$ $$ \\left[J_\\alpha(x) = \\sum_{m=0}^\\infty \\frac{(-1)^m}{m! \\Gamma (m + \\alpha + 1)} {\\left({ \\frac{x}{2} }\\right)}^{2m + \\alpha}\\right] $$ 参考 MathJax使用LaTeX语法编写数学公式教程 MathJax 语法参考 基本数学公式语法(of MathJax) MathJax basic tutorial and quick reference","categories":[{"name":"math","slug":"math","permalink":"https://yeshan333.github.io/categories/math/"}],"tags":[{"name":"Latex","slug":"Latex","permalink":"https://yeshan333.github.io/tags/Latex/"}]},{"title":"MATLAB基操复习","slug":"MATLAB基操复习","date":"2019-06-17T19:51:57.000Z","updated":"2019-06-17T19:51:57.000Z","comments":true,"path":"2019/06/17/MATLAB基操复习/","permalink":"https://yeshan333.github.io/2019/06/17/MATLAB%E5%9F%BA%E6%93%8D%E5%A4%8D%E4%B9%A0/","excerpt":"MATLAB基本操作1. 对象定义使用sym定义单个对象、使用syms定义多个对象 2. 使用limit求极限 $$ \\lim_{v \\rightarrow a} f(x) $$ 1limit(f,v,a) % 使用limit(f,v,a,'left')可求左极限 3. 导数使用diff(f,v,n)对$ f(v)=v^{t-1} $求 $ n $ 阶导 $ \\frac{d^nf}{d^nv} $,n缺省时,默认为1,diff(f)默认求一阶导数。 4. 定积分和不定积分使用int(f,v)求f对变量v的不定积分,使用int(f,v,a,b)求f对变量v的定积分,a、b为积分上下标。$ \\int{f(v)dv} $、$ \\int^{a}_{b}{f(v)dv} $。","text":"MATLAB基本操作1. 对象定义使用sym定义单个对象、使用syms定义多个对象 2. 使用limit求极限 $$ \\lim_{v \\rightarrow a} f(x) $$ 1limit(f,v,a) % 使用limit(f,v,a,'left')可求左极限 3. 导数使用diff(f,v,n)对$ f(v)=v^{t-1} $求 $ n $ 阶导 $ \\frac{d^nf}{d^nv} $,n缺省时,默认为1,diff(f)默认求一阶导数。 4. 定积分和不定积分使用int(f,v)求f对变量v的不定积分,使用int(f,v,a,b)求f对变量v的定积分,a、b为积分上下标。$ \\int{f(v)dv} $、$ \\int^{a}_{b}{f(v)dv} $。 5. matlab函数文件定义形式 12function [输出形参列表] = 函数名(输入形参列表) 函数体 12345678910111213141516171819202122232425262728293031323334353637function spir_len = spirallength(d, n, lcolor)% SPIRALLENGTH plot a circle of radius as r in the provided color and calculate its area% 输入参数:% d: 螺旋的旋距% n: 螺旋的圈数% lcolor:画图线的颜色% 输出参数:% spir_len:螺旋的周长% 调用说明:% spirallength(d,n):以参数d,n画螺旋线,螺旋线默认为蓝色% spirallength(d,n,lcolor):以参数d,n,lcolor画螺旋线% spir_len = spirallength(d,n):计算螺旋线的周长,并以蓝色填充螺旋线% spir_len = spirallength(d,n,lcolor):计算螺旋线的周长,并以lcolor颜色填充螺旋线% 版本号V1.0,编写于1999年9月9号,修改于1999年9月10号,作者:亚索if nargin > 3 error('输入变量过多!');elseif nargin == 2 lcolor = 'b'; % 默认情况下为蓝色endj = sqrt(-1);phi = 0 : pi/1000 : n*2*pi;amp = 0 : d/2000 : n*d;spir = amp .* exp(j*phi);if nargout == 1 spir_len = sum(abs(diff(spir))); fill(real(spir), imag(spir), lcolor);elseif nargout == 0 plot(spir, lcolor);else error('输出变量过多!');endaxis('square'); 6. matlab程序设计语句 1234567891011121314151617181920212223242526272829303132333435363738% for循环for 循环变量=初值:步长:终值 循环体end% while循环while 条件 循环体end% if语句if 条件 语句组1elseif 语句组2else 语句组3end% switch语句switch 表达式 case 表达式1 语句组1 case 表达式2 语句组2 ... ... case 表达式m 语句组m otherwise 语句组end% try语句try 语句组1 %语句组1若正确则跳出该结构catch 语句组2end 7. 矩阵操作 操作 作用 size(A) 求矩阵A的行数和列数 length(x) 返回向量x的长度 A’ A的转置 A(:,n) 取矩阵A第n列数,A(n,:)取第n行 det(A) 求矩阵A的行列式 inv(A) 求A的逆 rank(A) 求A的秩 trace(A) 求A的迹 max(A)、min(A) 求A的各列最大、最小元素 mean(A) 求A各列的平均值 sum(A) 求A各列元素之和 8. matlab简单绘图  plot函数是MATLAB中最核心的二维绘图函数,有诸多语法格式,可实现多种功能。常用格式有: plot(x):缺省自变量的绘图格式,x可为向量或矩阵。 plot(x, y):基本格式,x和y可为向量或矩阵。 plot(x1, y1, x2, y2,…):多条曲线绘图格式,在同一坐标系中绘制多个图形。 plot(x, y,‘s’):开关格式,开关量字符串s设定了图形曲线的颜色、线型及标示符号(见下表)。 无约束优化问题求解fminbnd、fminunc函数输出变量解释 变量 描述 x 由优化函数求得的值. 若exitflag>0,则x为解; 否则,x不是最终解, 它只是迭代制止时优化过程的值 fval 解 x 处的目标函数值 exitflag 描述退出条件:exitflag>0,表目标函数收敛于解x处;exitflag=0,表已达到函数评价或迭代的最大次数;exitflag<0,表目标函数不收敛 output 包含优化结果信息的输出结构。Iterations:迭代次数;Algorithm:所采用的算法;FuncCount:函数评价次数 一元函数无约束优化问题-fminbnd常用格式$$ min f(x), x_1<x<x_2 $$ (1)x= fminbnd (fun, x1, x2)(2)x= fminbnd (fun, x1, x2 , options)(3)[x , fval]= fminbnd(…)(4)[x , fval , exitflag]= fminbnd(…)(5)[x , fval , exitflag , output]= fminbnd(…)函数fminbnd的算法基于黄金分割法和二次插值法,它要求目标函数必须是连续函数,并可能只给出局部最优解 例子求函数 $ f(x)=2e^{-x}sin(x) $ 在 $ 0<x<8 $ 时的最小值 12345% 如果求最大需要对f取反f = @(x) (2*exp(-x)*sin(x));[x,fval] = fminbnd(f,0,8);xfval 多元函数无约束优化问题-fminunc常用格式$$ min f(X),这里X为n维变量 $$fminunc常用格式为: (1)x= fminunc(fun, X0); (2)x= fminunc(fun, X0,options); (3)[x,fval]= fminunc(…); (4)[x,fval,exitflag]= fminunc(…); (5)[x,fval,exitflag,output]= fminunc(…)其中 X0为初始值 例子求函数$ f(x_1,x_2)=(4x_1^2+2x_2^2+4x_1x_2+2x_2^2+1)e^x $的最小值,$ X_0=[-1,1] $ 12345f = @(x) (4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1)*exp(x(1));x0 = [-1,1];[x,fval] = fminunc(f, x0);xfval 线性规划问题求解使用linprog求解一般线性规划问题常见问题(linprog默认求最小值)$$ minz=cX $$ $$ s.t. \\begin{cases}AX\\leq{b}\\Aeq\\cdot{X}=beq\\VLB\\leq{X}\\leq{VUB}\\end{cases}$$ 求解命令 1[x,fval] = linprog(c,A,b,Aeq,beq,VLB,VUB) 例子$$ min z=13x_1+9x_2+10x_3+11x_4+12x_5+8x_6 $$ $$ s.t.\\left{\\begin{aligned}& x_1+x_2=400\\& x_2+x_5=600\\& x_3+x_6=500\\& 0.4x_1+1.1x_2+x_3\\leq{800}\\& 0.5x_4+1.2x_5+1.3x_6\\leq{900}\\& x_i\\geq0,i=1,2,…,6\\end{aligned}\\right.$$ 1234567891011f = [13 9 10 11 12 8];A = [0.4 1.1 1 0 0 0 0 0 0 0.5 1.2 1.3];b = [800; 900];Aeq=[1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1];beq=[400 600 500];vlb = zeros(6,1);vub=[];[x,fval] = linprog(f,A,b,Aeq,beq,vlb,vub) 使用bintprog求解0-1规划问题matlab2014以上版本使用intlinprog求解0-1规划问题 $$ minz=cX $$ $$ s.t. \\begin{cases}AX\\leq{b}\\Aeq\\cdot{X}=beq\\X为0-1变量\\end{cases}$$ 12% 命令[x,fval] = bintprog(c,A,b,Aeq,beq) 例子$$ min z=3x_1+7x_2-x_3+x_4 $$$$ s.t.\\begin{cases}2x_1-x_2+x_3-x_4\\geq{1}\\x_1-x_2+6x_3+4x_4\\geq{8}\\5x_1+3x_2+x_4\\geq{5}\\x_i=0或1(i=1,2,3,4)\\end{cases}$$ 123456789z = [3;7;-1;1];A = [-2 1 -1 1; -1 1 -6 -4; -5 -3 0 -1];b = [-1;-8;-5];Aeq = [];beq = [];[x,fval] = bintprog(z,A,b,Aeq,beq) 数据插值与拟合数据插值,使用interpl进行一维插值matlab命令 1yi = interpl(X,Y,xi,method) 该命令用指定的算法找出一个一元函数,然后以该函数给出xi处的值。其中x=[x1,x2,…,xn]’和 y=[y1,y2,…,yn]’两个向量分别为给定的一组自变量和函数值,用来表示已知样本点数据;xi为待求插值点处横坐标,可以是一个标量,也可以是一个向量,是向量时,必须单调;yi得到返回的对应纵坐标。 method可以选取以下方法之一: ‘nearest’:最近邻点插值,直接完成计算; ‘spline’:三次样条函数插值; ‘linear’:线性插值(缺省方式),直接完成计算; ‘cubic’:三次函数插值; 例子作函数$ y=(x^2-3x+7)e^{-4x}sin(2x) $在[0,1]取间隔为0.1的点图,用插值进行实验 12345678910x=0:0.1:1;y=(x.^2-3*x+7).*exp(-4*x).*sin(2*x); %产生原始数据subplot(1,2,1);plot(x,y,x,y,'ro') %作图xx=0:0.02:1; %待求插值点yy=interp1(x,y,xx,'spline'); %此处可用nearest,cubic,spline分别试验subplot(1,2,2)plot(x,y,'ro',xx,yy,'b') %作图 曲线拟合拟合函数polyfit12p=polyfit(x,y,n)[p,s]= polyfit(x,y,n) 说明:x,y为数据点,n为多项式阶数,返回p为幂次从高到低的多项式系数向量p。p是n+1维参数向量p(1),p(2)….那么拟合后对应的多项式即为:$$ p(1)x^n+p(2)x^{n-1}+\\cdot\\cdot\\cdot+p(n)x+p(n+1) $$ x必须是单调的。矩阵s用于生成预测值的误差估计 多项式求值函数polyval12y=polyval(p,x)[y,DELTA]=polyval(p,x,s) 说明:y=polyval(p,x)为返回对应自变量x在给定系数p的多项式的值;[y,DELTA]=polyval(p,x,s) 使用polyfit函数的选项输出s得出误差估计DELTA。它假设polyfit函数数据输入的误差是独立正态的,并且方差为常数。则DELTA将至少包含50%的预测值。 例子求如下给定数据的拟合曲线x=[0.5,1.0,1.5,2.0,2.5,3.0],y=[1.75,2.45,3.81,4.80,7.00,8.60] 1234567x=[0.5,1.0,1.5,2.0,2.5,3.0];y=[1.75,2.45,3.81,4.80,7.00,8.60];plot(x,y,‘*r’) %先观察数据点的大致形态p=polyfit(x,y,2) %用二次多项式拟合x1=0.5:0.05:3.0; % 步长0.05y1=polyval(p,x1);plot(x,y,'*r',x1,y1,'-b')","categories":[{"name":"math","slug":"math","permalink":"https://yeshan333.github.io/categories/math/"}],"tags":[{"name":"MATLAB","slug":"MATLAB","permalink":"https://yeshan333.github.io/tags/MATLAB/"}]},{"title":"搜索技巧","slug":"搜索技巧","date":"2019-06-08T20:22:17.000Z","updated":"2019-06-08T20:22:17.000Z","comments":true,"path":"2019/06/08/搜索技巧/","permalink":"https://yeshan333.github.io/2019/06/08/%E6%90%9C%E7%B4%A2%E6%8A%80%E5%B7%A7/","excerpt":"搜索也是门学问啊,GFW之下,世道艰难。 (ノ~、)","text":"搜索也是门学问啊,GFW之下,世道艰难。 (ノ~、) 百度高级搜索技巧双引号精确匹配 格式:”搜索词” 在查询词两边加上双引号表示查询词不能被拆分。 减号(-)不含特定查询 格式:搜索词 -排除词 ** 减号后面紧跟的是需要排除的词,前面为要搜索的词(有个空格隔开) ** site,限制搜索范围在特定站点 格式:搜索词 site:站点域名 site:后面紧跟站点域名, 不要带协议头。site:和域名之前没有空格。 inurl,搜索范围限定在url链接中 格式:搜索词 inurl:url中必须存在的词 intitle,搜索范围限定在网页标题 格式:搜索词 intitle:标题必须含有的词 filetype,搜索范围限定在指定文件格式中 格式:搜索词 filetype:文件格式名 源于百度:https://jingyan.baidu.com/article/d621e8dae7593c2864913f7b.html","categories":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/categories/%E9%9A%8F%E7%AC%94/"}],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"Python面向对象","slug":"Python面向对象","date":"2019-05-24T12:54:40.000Z","updated":"2019-05-31T12:54:40.000Z","comments":true,"path":"2019/05/24/Python面向对象/","permalink":"https://yeshan333.github.io/2019/05/24/Python%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/","excerpt":"对象:一个自包含的实体,用一组可识别的特性和行为来标识 类:具有相同的属性和功能的对象的抽象的集合 实例:一个真实的对象,实例化就是创建对象的过程 多态:可对不同类型的对象执行相同的操作,而这些操作就像“被施了魔法”一样能够正常运行 封装:对外部隐藏有关对象工作原理的细节 继承:可基于通用类创建专用类 多态 多态可以让我们在不知道变量指向哪种对象时,也能够对其执行操作,且操作的行为将随对象所属的类型(类)而异。每当不知道对象是什么样就能对其执行操作,都是多态在起作用 多态以 继承 和 重写 父类方法 为前提 多态是调用方法的技巧,不会影响到类的内部设计 多态性即向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法) 听说Python天然就多态 12345678910111213141516171819202122232425class Person(object): def __init__(self,name,sex): self.name = name self.sex = sex def print_title(self): if self.sex == "male": print("man") elif self.sex == "female": print("woman")class Child(Person): # Child 继承 Person def print_title(self): if self.sex == "male": print("boy") elif self.sex == "female": print("girl")May = Child("May","female")Peter = Person("Peter","male")print(May.name,May.sex,Peter.name,Peter.sex)# 同一消息May.print_title()Peter.print_title()","text":"对象:一个自包含的实体,用一组可识别的特性和行为来标识 类:具有相同的属性和功能的对象的抽象的集合 实例:一个真实的对象,实例化就是创建对象的过程 多态:可对不同类型的对象执行相同的操作,而这些操作就像“被施了魔法”一样能够正常运行 封装:对外部隐藏有关对象工作原理的细节 继承:可基于通用类创建专用类 多态 多态可以让我们在不知道变量指向哪种对象时,也能够对其执行操作,且操作的行为将随对象所属的类型(类)而异。每当不知道对象是什么样就能对其执行操作,都是多态在起作用 多态以 继承 和 重写 父类方法 为前提 多态是调用方法的技巧,不会影响到类的内部设计 多态性即向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法) 听说Python天然就多态 12345678910111213141516171819202122232425class Person(object): def __init__(self,name,sex): self.name = name self.sex = sex def print_title(self): if self.sex == "male": print("man") elif self.sex == "female": print("woman")class Child(Person): # Child 继承 Person def print_title(self): if self.sex == "male": print("boy") elif self.sex == "female": print("girl")May = Child("May","female")Peter = Person("Peter","male")print(May.name,May.sex,Peter.name,Peter.sex)# 同一消息May.print_title()Peter.print_title() 封装 封装指的是向外部隐藏不必要的细节。与多态有点像,他们都是抽象的原则。多态让你无需知道对象所属的类(对象的类型)就能调用其方法。封装让你无需知道对象的构造就能够使用它。 实现封装可以对类内的属性和方法的访问加以限制。就像C++类使用private、protected一样对类的成员访问进行限制一样 默认情况下,Python中的属性和方法都是公开的,可以在对象外部访问 私有变量 Python并没有真正的私有化支持,但可用下划线得到伪私有。 在Python定义私有变量只需在变量名或函数名前加上两个下划线__,例如__name。那种仅限在一个对象内部访问的“私有”变量在Python中并不存在 使用双下划线将方法或属性变为私有时,在内部,Python将以双下划线开头的名字都进行转换,即在开头加上一个下划线和类名。但这样的私有变量或方法还是可以访问的,访问形式如:实例名._类名__变量名、实例名._类名__方法名() 以单下划线开头的时保护成员变量,只有本类和子类成员实例能访问这些变量 property装饰器、__slots__魔法 我们可以使用property装饰器对属性进行封装、通过getter和setter方法进行属性的访问和修改 Python是一门动态语言,可以在程序运行时给对象绑定属性和方法,也可以对已经绑定的属性和方法进行解绑定,我们可以使用__slots__魔法限定对象可以绑定的属性 继承&&派生 一个新类从已有类那里获得其已有特性,这种现象称为继承。从一个已有类(父类,Python叫超类)产生一个新的子类,称为类的派生。要指顶定超类,可在class语句中的类名后加上超类名,并将其用原括括起来 一个类可以继承多个类(多重继承)。但是,如果多个超类以不同的方式实现了同一个方法(即有多个同名的方法),必须在class语句中小心排列这些类,因为位于前面的类的方法将覆盖位于后面的类的方法 对子类的实例调用方法(或访问其属性)时,如果找不到该方法或者属性,将在父类中查找 在子类中可以重写超类的方法(包括构造函数),重写构造函数时,要确保在子类的构造函数中调用超类的构造函数,否则可能无法正确的初始化对象 Python中所有的方法实际上是virtual的 123456789class Person: def __init__(self,name): print("我叫{}".format(name))class Student(Person): def __init__(self,name): # 使用super函数调用父类构造函数 super().__init__(name) # 也可以写成这样:Person.__init__(self,name) print("我是一个学生!") 抽象基类 抽象基类是不能(至少是不应该)实例化的类,其职责是定义子类应该实现的一组抽象方法。Python可通过引入ABC模块实现抽象基类,使用@abstractmethod装饰器将方法标记为抽象的。例如: 1234class Basic{ public: virtual void talk() const = 0;//纯虚函数}; 123456from abc import ABC, abstractmethodclass Basic(ABC): @abstractmethod def talk(self): pass 抽象类(即包含抽象方法的类)最重要的特征是不能实例化。如果派生出的类没有重写talk方法,那么派生出的类也是抽象的,不能实例化。 鸭子类型 “鸭子类型”的语言是这么推断的:一只鸟走起来像鸭子、游起泳来像鸭子、叫起来也像鸭子,那它就可以被当做鸭子。也就是说,它不关注对象的类型,而是关注对象具有的行为(方法)。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的走和叫方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名 鸭子类型的关注点在对象的行为,而不在对象的类型 参考:https://zhuanlan.zhihu.com/p/59299729 类方法、静态方法 类方法:使用@classmethod装饰器定义。类方法将类本身作为对象进行操作,类方法的第一个参数必须是当前类对象(一般命名为cls,用于传递类的属性和方法),实例对象和类对象都可以调用类方法。 静态方法:使用@staticmethod装饰器定义。没有self和cls参数。在方法中不能使用类或实例任何属性和方法。实例和对象都可以调用静态方法。 参考: https://github.com/jackfrued/Python-100-Days/blob/master/Day01-15/Day09/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%BF%9B%E9%98%B6.md","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"Jupyter Notebooks的简单了解","slug":"Jupyter-Notebooks的简单了解","date":"2019-05-22T22:00:25.000Z","updated":"2019-05-22T22:00:25.000Z","comments":true,"path":"2019/05/22/Jupyter-Notebooks的简单了解/","permalink":"https://yeshan333.github.io/2019/05/22/Jupyter-Notebooks%E7%9A%84%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3/","excerpt":"撸一手Jupyter","text":"玩Python这么久了,连Jupyter都不会,有点捞,今天补一补这方面的操作。。。。 Jupyter Notebooks  Jupyter Notebooks 是一款开源的网络应用,我们可以将其用于创建和共享代码与文档。其提供了一个环境,你无需离开这个环境,就可以在其中编写你的代码、运行代码、查看输出、可视化数据并查看结果。因此,这是一款可执行端到端的数据科学工作流程的便捷工具,其中包括数据清理、统计建模、构建和训练机器学习模型、可视化数据等等。 安装pip install ipython jupyter 上手上手在终端输入jupyter notebook启动Jupyter notebooks,它会在默认浏览器中打开,地址是http://localhost:8888/tree。 新建个Python文件试试 Jupyter常用键盘快捷键esc和enter用于切换Jupyter的键盘输入模式,esc切换为命令模式(blue),enter切换为编辑模式(green) 命令模式(常用) 连续按两下D,删除当前活跃单元 按A在活跃单元上插入一个单元,按B在活跃单元下插入一个单元 按Z撤销被删除的单元 按Y将当前单元变为代码单元 按Shift+方向上下键选择多个单元,按Shift+M可以合并选择的单元 Ctrl+Shift+F用于打开命令面板 按H查看快捷键完整列表 编辑模式(常用) Ctrl+S保存(防死机(๑•̀ㅂ•́)و✧) Ctrl+Home回到单元起始位置 Ctrl+Enter运行整个单元块 Alt+Enter运行当前活跃单元块,并在当前活跃单元块下方创建新的单元块 emmm可以划水了。。。。 了解更多: 始于Jupyter Notebooks:一份全面的初学者实用指南 jupyter notebook使用技巧 Jupyter介绍和使用 中文版","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"Python多进程&&多线程(初步)","slug":"Python多进程-多线程","date":"2019-05-11T21:40:32.000Z","updated":"2019-05-11T21:40:32.000Z","comments":true,"path":"2019/05/11/Python多进程-多线程/","permalink":"https://yeshan333.github.io/2019/05/11/Python%E5%A4%9A%E8%BF%9B%E7%A8%8B-%E5%A4%9A%E7%BA%BF%E7%A8%8B/","excerpt":"进程 && 线程 进程:进程是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。进程可以通过fork或者wpawn的方式来创建新的进程执行其他任务,不过新的进程有自己独立的内存空间和数据栈,所以必须通过进程间的通信机制(IPC,Inter Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存等。 线程:进程的一个执行单元。线程在同一个进程中执行,共享程序的上下文。一个进程中的各个线程与主线程共享同一片数据空间,因而相比与独立的进程,线程间的信息共享和通信更为容易。线程一般是以并发的方式执行的。注意在单核CPU系统中,真正的并发是不可能的,所以新城的执行实际上是这样规划的:每个线程执行一小会,然后让步给其他线程的任务(再次排队等候更多的CPU执行时间)。在整个线程的执行过程中,每个线程执行它自己的特定的任务,在必要时和其他进程进行结果通信。 Python多进程(使用multiprocessing)1234567891011121314151617181920212223242526from time import time, sleepfrom random import randintfrom multiprocessing import Processdef my_task(name): sleep_time = randint(1,10) sleep(sleep_time) print("你叫了一声%s,它鸟你用了%d秒" % (name, sleep_time))def main(): start = time() process_1 = Process(target=my_task, args=["yeshan", ]) process_2 = Process(target=my_task, args=["foel", ]) # 启动进程 process_1.start() process_2.start() # 等待进程执行结束 process_1.join() process_2.join() end = time() print("一共花费了%f秒" % (end-start))if __name__ == '__main__': main()","text":"进程 && 线程 进程:进程是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。进程可以通过fork或者wpawn的方式来创建新的进程执行其他任务,不过新的进程有自己独立的内存空间和数据栈,所以必须通过进程间的通信机制(IPC,Inter Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存等。 线程:进程的一个执行单元。线程在同一个进程中执行,共享程序的上下文。一个进程中的各个线程与主线程共享同一片数据空间,因而相比与独立的进程,线程间的信息共享和通信更为容易。线程一般是以并发的方式执行的。注意在单核CPU系统中,真正的并发是不可能的,所以新城的执行实际上是这样规划的:每个线程执行一小会,然后让步给其他线程的任务(再次排队等候更多的CPU执行时间)。在整个线程的执行过程中,每个线程执行它自己的特定的任务,在必要时和其他进程进行结果通信。 Python多进程(使用multiprocessing)1234567891011121314151617181920212223242526from time import time, sleepfrom random import randintfrom multiprocessing import Processdef my_task(name): sleep_time = randint(1,10) sleep(sleep_time) print("你叫了一声%s,它鸟你用了%d秒" % (name, sleep_time))def main(): start = time() process_1 = Process(target=my_task, args=["yeshan", ]) process_2 = Process(target=my_task, args=["foel", ]) # 启动进程 process_1.start() process_2.start() # 等待进程执行结束 process_1.join() process_2.join() end = time() print("一共花费了%f秒" % (end-start))if __name__ == '__main__': main() 我们通过Process类创建了进程对象,通过target参数我们传入一个函数来表示进程启动后要执行的代码,后面的args是一个元组,它代表了传递给函数的参数。Process对象的start方法用来启动进程,join方法表示等待进程执行结束。 Python多线程(使用threading)123456789101112131415161718192021222324252627282930313233#!/usr/bin/env python#-*- coding:utf-8 -*-from time import time, sleepfrom random import randintfrom threading import Threaddef download(filename): print("开始下载 %s ..." % filename) download_time = randint(1,10) sleep(download_time) print("下载完成!耗时 %d 秒" % download_time)def main(): start = time() t1 = Thread(target=download, args=('黑暗地宫',)) t1.start() t2 = Thread(target=download, args=('通天',)) t2.start() t1.join() t2.join() end = time() print("下载总共耗时 %.3f 秒" % (end-start))if __name__ == '__main__': main() ** 继承Thread类,实现自定义线程类 ** 123456789101112131415161718192021222324252627282930313233343536373839#-*- coding:utf-8 -*-from time import time, sleepfrom random import randintfrom threading import Threadclass DownLoadTask(Thread): def __init__(self, filename): super().__init__() #初始化父类的构造函数 self._filename = filename # 私有的 def run(self): print("开始下载 %s ..." % self._filename) download_time = randint(1,10) sleep(download_time) print("%s下载完成!耗时 %d 秒" % (self._filename, download_time))def main(): strat = time() t1 = DownLoadTask("从菜鸟到菜鸡") t1.start() t2 = DownLoadTask("去哪里啊弟弟") t2.start() t1.join() t2.join() end = time() print("下载完成,总共耗费 %.3f 秒" % (end-strat))if __name__ == '__main__': main() 线程间的通信 因为多个线程可以共享进程的内存空间,因此要实现多个线程间的通信相对简单,大家能想到的最直接的办法就是设置一个全局变量,多个线程共享这个全局变量即可。但是当多个线程共享同一个变量(我们通常称之为“资源”)的时候,很有可能产生不可控的结果从而导致程序失效甚至崩溃。如果一个资源被多个线程竞争使用,那么我们通常称之为“临界资源”,对“临界资源”的访问需要加上保护,否则资源会处于“混乱”的状态。在这种情况下,“锁”就可以派上用场了。我们可以通过“锁”来保护“临界资源”,只有获得“锁”的线程才能访问“临界资源”,而其他没有得到“锁”的线程只能被阻塞起来,直到获得“锁”的线程释放了“锁”,其他线程才有机会获得“锁”,进而访问被保护的“临界资源”。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455from time import sleepfrom threading import Thread, Lockclass Account(object): def __init__(self): self._balance = 0 self._lock = Lock() def deposit(self, money): # 先获取锁才能获取后面的代码 self._lock.acquire() try: # 计算存款后的余额 new_balance = self._balance + money # 模拟受理存款业务需要0.01秒的时间 sleep(0.01) # 修改账户余额 self._balance = new_balance finally: self._lock.release() @property def balance(self): return self._balanceclass AddMoneyThread(Thread): def __init__(self, account, money): super().__init__() self._account = account self._money = money def run(self): self._account.deposit(self._money)def main(): account = Account() threads = [] # 创建100个存款的线程向同一个账户中存钱 for _ in range(100): t = AddMoneyThread(account, 1) threads.append(t) t.start() # 等所有存款的线程都执行完毕 for t in threads: t.join() print('账户余额为: ¥%d元' % account.balance)if __name__ == '__main__': main() 输出结果为100块,不用锁为2块 ** Python内置装饰器 property ** *** property装饰器一般存在于类中,可以将一个函数定义成一个属性,属性的值就是该函数return的内容 *** 1234567891011121314class Student(object): # 把一个方法变成属性 @property def score(self): return self._score # setter把一个方法变成一个可控属性用于赋值 @score.setter def score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') self._score = value 参考: 一篇文章搞懂装饰器的用法 https://github.com/jackfrued/Python-100-Days/blob/master/Day01-15/Day13/%E8%BF%9B%E7%A8%8B%E5%92%8C%E7%BA%BF%E7%A8%8B.md","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"HTTPie的使用","slug":"HTTPie的使用","date":"2019-04-23T23:47:48.000Z","updated":"2019-04-23T23:47:48.000Z","comments":true,"path":"2019/04/23/HTTPie的使用/","permalink":"https://yeshan333.github.io/2019/04/23/HTTPie%E7%9A%84%E4%BD%BF%E7%94%A8/","excerpt":"HTTPie","text":"HTTPie(发音为aitch-tee-tee-pie)是一个命令行HTTP客户端。其目标是使与Web服务的CLI交互尽可能人性化。它提供了一个简单的http命令,允许使用简单自然的语法发送任意HTTP请求,并显示彩色输出。HTTPie可用于测试,调试以及通常与HTTP服务器交互。 HTTPie官方文档 https://httpie.org/doc windows下安装 pip install --upgrade httpie HTTPie的简单使用一个完整的请求语句的大概样子http [选项(flags)] [方法] URL [查询字符串/数据字段/首部字段] HTTPie数据语法 类型 符号 示例 URL参数 == param==value 首部字段 : Name:value 数据字段 = field=value 原生JSON字段 := field:=json 表单上传字段 @ field@dir/file 示例1234567891011121314# 下载文件$ http --download www.jb51.net/my_file.zip# 提交表单$ http -f POST www.jb51.net name='Dan Nanni' comment='Hi there'# HTTPie的默认数据类型为JSON格式的$ http PUT example.org name=John email=john@example.org# 使用代理$ http --proxy=http:http://10.10.1.10:3128 --proxy=https:https://10.10.1.10:1080 example.org# 定制请求头$ http www.test.com User-Agent:Xmodulo/1.0 Referer:http://www.imike.me MyParam:Foo 放着先。。。。。。。。。占个位","categories":[],"tags":[]},{"title":"Git Branch Practice","slug":"Git-Branch-Practice","date":"2019-04-08T12:52:55.000Z","updated":"2019-04-08T12:52:55.000Z","comments":true,"path":"2019/04/08/Git-Branch-Practice/","permalink":"https://yeshan333.github.io/2019/04/08/Git-Branch-Practice/","excerpt":"Git Branch Practice","text":"最近在弄一个东西,基本的功能已经弄好了,现在想再扩展一起其他功能,但这样势必会改动原有代码,我又不想破坏原有的代码逻辑,方便以后查看。记得Git有个分支工作流可以很好的满足我的需求(๑•̀ㅂ•́)و✧。emmm,很久没发文了,record一下吧。(ノへ ̄、) 使用到的命令12345678910111213$ git branch # 显示所有本地分支$ git branch <new branch> # 创建新分支$ git checkout <branch> # 切换到指定分支$ git branch -d <branch> # 删除本地分支$ git push --set-upstream origin <branch> # 将本地分支与远程分支关联$ git push origin --delete <branch> # 删除远程分支$ git tag -n # 列出所有本地标签以及相关信息$ git tag <tagname> # 基于最新提交创建标签& git tag <tagname> -m "备注信息" # 基于最新提交创建含备注信息的标签$ git tag -d <tagname> # 删除标签$ git push orign <tagname> # 将指定信息推送到远程仓库$ git push --tags # 推送所有标签到远程仓库 操作~操作 emmm,顺便试试tag","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"}]},{"title":"吐槽","slug":"吐槽","date":"2019-03-22T00:51:31.000Z","updated":"2019-03-22T00:51:31.000Z","comments":true,"path":"2019/03/22/吐槽/","permalink":"https://yeshan333.github.io/2019/03/22/%E5%90%90%E6%A7%BD/","excerpt":"","text":"better and better","categories":[],"tags":[]},{"title":"我与vim的亲密接触(ˉ▽ ̄~)","slug":"我与vim的亲密接触","date":"2019-03-20T23:51:17.000Z","updated":"2019-03-20T23:51:17.000Z","comments":true,"path":"2019/03/20/我与vim的亲密接触/","permalink":"https://yeshan333.github.io/2019/03/20/%E6%88%91%E4%B8%8Evim%E7%9A%84%E4%BA%B2%E5%AF%86%E6%8E%A5%E8%A7%A6/","excerpt":"emmm,闲来无事,打算了解下神奇vim(用来zhuangbi)。在终端操作很帅(ˉ▽ ̄~)~~!什么是vim??Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 vi/vim的使用vi/vim有三种模式: 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。刚启动时就是这个模式。 输入模式:正常的文本录入。 末行模式:保存或退出文档,以及设置编辑环境。又可成为底线命令模式。","text":"emmm,闲来无事,打算了解下神奇vim(用来zhuangbi)。在终端操作很帅(ˉ▽ ̄~)~~!什么是vim??Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 vi/vim的使用vi/vim有三种模式: 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。刚启动时就是这个模式。 输入模式:正常的文本录入。 末行模式:保存或退出文档,以及设置编辑环境。又可成为底线命令模式。 常用命令命令模式常用命令: 命令 作用 dd 删除(剪切)光标所在整行 5dd 删除(剪切)从光标处开始的5行 yy 复制光标所在的整行 5yy 复制从光标处开始的5行 n 显示搜索命令定位到的下一个字符串 N 显示搜索命令定位到的上一个字符串 u 撤销上一步的操作 p 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面 末行模式可用命令: 命令 作用 :w 保存 :q 退出 :q! 强制退出(放弃对文档内容的修改) :wq! 强制保存退出 :set nu 显示行号 :set nonu 不显示行号 :命令 执行该命令 :整数 跳转到该行 :s/one/two 将当前光标所在行的第一个one替换成two :s/one/two/p 将当前光标所在行的所有one替换成two :%s/one/two/g 将全文中的所有one替换成two ?字符串 在文本中从下到上搜索该字符串 /字符串 在文本中从上到下搜索该字符串 我与它的亲密接触。。。。。 相关 vim官网:https://www.vim.org/ vim快捷键键位图:https://www.jianshu.com/p/8b986f572a61","categories":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/categories/Linux/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/tags/Linux/"}]},{"title":"SQLAlchemy建立数据库模型之间的关系","slug":"SQLAlchemy建立数据库模型之间的关系","date":"2019-03-20T17:45:17.000Z","updated":"2019-03-20T17:45:17.000Z","comments":true,"path":"2019/03/20/SQLAlchemy建立数据库模型之间的关系/","permalink":"https://yeshan333.github.io/2019/03/20/SQLAlchemy%E5%BB%BA%E7%AB%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E6%A8%A1%E5%9E%8B%E4%B9%8B%E9%97%B4%E7%9A%84%E5%85%B3%E7%B3%BB/","excerpt":"常见关系: 一对多关系 多对一关系 多对多关系 一对一关系 一对多关系(一个作者,多篇文章)123456789101112131415161718192021222324252627282930## 一对多关系,单作者-多文章,外键不可少## 外键(ForeignKey)总在多的那边定义,关系(relationship)总在单的那边定义class Author(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(70), unique=True) phone = db.Column(db.String(20)) # articles为关系属性(一个集合,可以像列表一样操作,在关系的出发侧定义 ## relationship()函数的第一个参数为关系另一侧的模型名称(Article) articles = db.relationship('Article')class Article(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(15), index=True) body = db.Column(db.Text) # 传入ForeignKey的参数形式为:"表名.字段名" ## 模型类对应的表名由Flask-SQLAlchemy生成,默认为类名称的小写形式,多个单词通过下划线分隔 author_id = db.Column(db.Integer, db.ForeignKey('author.id')) ## 外键字段(author_id)和关系属性(articles)的命名没有限制## 建立关系可通过操作关系属性进行>>>shansan = Author(name="shansan")>>>hello = Article(title="Hello world !")>>>boy = Article(title="Hello Boy !")>>>db.session.add(shansan) # 将创建的数据库记录添加到会话中>>>db.session.add(hello)>>>db.session.add(boy)>>>shansan.articles.append(hello) # 操作关系属性>>>shansan.articles.append(boy)>>>db.session.commit()","text":"常见关系: 一对多关系 多对一关系 多对多关系 一对一关系 一对多关系(一个作者,多篇文章)123456789101112131415161718192021222324252627282930## 一对多关系,单作者-多文章,外键不可少## 外键(ForeignKey)总在多的那边定义,关系(relationship)总在单的那边定义class Author(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(70), unique=True) phone = db.Column(db.String(20)) # articles为关系属性(一个集合,可以像列表一样操作,在关系的出发侧定义 ## relationship()函数的第一个参数为关系另一侧的模型名称(Article) articles = db.relationship('Article')class Article(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(15), index=True) body = db.Column(db.Text) # 传入ForeignKey的参数形式为:"表名.字段名" ## 模型类对应的表名由Flask-SQLAlchemy生成,默认为类名称的小写形式,多个单词通过下划线分隔 author_id = db.Column(db.Integer, db.ForeignKey('author.id')) ## 外键字段(author_id)和关系属性(articles)的命名没有限制## 建立关系可通过操作关系属性进行>>>shansan = Author(name="shansan")>>>hello = Article(title="Hello world !")>>>boy = Article(title="Hello Boy !")>>>db.session.add(shansan) # 将创建的数据库记录添加到会话中>>>db.session.add(hello)>>>db.session.add(boy)>>>shansan.articles.append(hello) # 操作关系属性>>>shansan.articles.append(boy)>>>db.session.commit() 基于一对多的双向关系(bidirectional relationship)在这里我们希望可以在Book类中存在这样一个属性:通过调用它可以获取对应的作者的记录,这类返回单个值的关系属性称为标量关系属性 1234567891011121314151617181920212223# 建立双向关系时,关系两边都有关系函数# 在关系函数中,我们使用back_populates参数连接对方,参数的值设置为关系另一侧的关系属性名class Writer(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) # back_populates的参数值为关系另一侧的关系属性名 books = db.relationship('Book', back_populates='writer') def __repr__(self): return '<Writer %r>' % self.nameclass Book(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), index=True) writer_id = db.Column(db.Integer, db.ForeignKey('writer.id')) writer = db.relationship('Writer', back_populates='books') def __repr__(self): return '<Book %r>' % self.name# 设置双向属性后,我们既可以通过集合属性操作关系,也可通过标量关系属性操作关系 多对一关系(多个市民都在同一个城市)123456789101112# 外键总在多的一侧定义## 多对一关系中,外键和关系属性都在多的一侧定义## 这里的关系属性是标量关系属性(返回单一数据)class Citizen(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20), unique=True) city_id = db.Column(db.Integer, db.ForeignKey('city.id')) city = db.relationship('City')class City(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20), unique=True) 一对一关系(国家和首都)12345678910111213## 一对一关系,将关系函数的uselist参数设为False,使得集合关系属性无法使用列表语义操作## 这里使用的是一对一双向关系class Country(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20), unique=True) capital = db.relationship('Capital', uselist=False)class Capital(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20), unique=True) country_id= db.Column(db.Integer, db.ForeignKey('country.id')) country = db.relationship('Country') 多对多双向关系(老师和学生) 多对多关系的建立需要使用关联表(association table)。关联表不存储数据,只用来存储关系两侧模型的外键对应关系 定义关系两侧的关系函数时,需要添加一个secondary参数,值设为关联表的名称 关联表由使用db.Table类定义,传入的第一个参数为关联表的名称 我们在关联表中将多对多的关系分化成了两个一对多的关系 123456789101112131415161718192021## 多对多关系,使用关联表(association table),关联表由db.Table定义## 关系函数需要设置secondary参数,值为关系表名association_table = db.Table('association_table', db.Column('student_id', db.Integer, db.ForeignKey('teacher.id')), db.Column('teacher_id', db.Integer, db.ForeignKey('student.id')) )class Student(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(70), unique=True) grade = db.Column(db.String(20)) teachers = db.relationship('Teacher', secondary=association_table,back_populates='students')class Teacher(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(70), unique=True) office = db.Column(db.String(20)) students = db.relationship('Student', secondary=association_table, back_populates='teachers') 常用的SQLAlchemy关系函数参数和常用的SQLAlchemy关系记录加载方式(lazy参数可选值) 使用关系函数定义的属性不是数据库字段,而是类似于特定的查询函数 当关系属性被调用时,关系函数会加载相应的记录 相关http://www.sqlalchemy.org/ https://github.com/sqlalchemy/sqlalchemy https://github.com/mitsuhiko/flask-sqlalchemy","categories":[{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/categories/Flask/"}],"tags":[{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/tags/Flask/"}]},{"title":"Flask的请求钩子与上下文简记","slug":"Flask的请求钩子与上下文简记","date":"2019-03-16T22:32:05.000Z","updated":"2019-03-16T22:32:05.000Z","comments":true,"path":"2019/03/16/Flask的请求钩子与上下文简记/","permalink":"https://yeshan333.github.io/2019/03/16/Flask%E7%9A%84%E8%AF%B7%E6%B1%82%E9%92%A9%E5%AD%90%E4%B8%8E%E4%B8%8A%E4%B8%8B%E6%96%87%E7%AE%80%E8%AE%B0/","excerpt":"请求钩子(Hook) 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:在请求开始时,建立数据库连接;在请求结束时,指定数据的交互格式。为了让>每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。通过请求钩子,我们可以对请求进行预处理(preprocessing)和后处理>(postprocessing)。 Flask的请求钩子通过装饰器实现,每个钩子可以注册任意多个处理函数,默认的五种请求钩子如下: 钩子 说明 before_first_request 注册一个函数,在处理请求前运行 before_request 注册一个函数,在处理每个请求前运行 after_request 注册一个函数,如果有未处理的一场抛出。会在每个请求结束后运行 teardown_request 注册一个函数,即使有未处理的异常抛出,会在每个请求介绍后执行。如果发生异常,会传入异常对象作为参数注册到函数中 after_this_request 在视图函数内注册一个函数,在这个请求结束后运行","text":"请求钩子(Hook) 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:在请求开始时,建立数据库连接;在请求结束时,指定数据的交互格式。为了让>每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。通过请求钩子,我们可以对请求进行预处理(preprocessing)和后处理>(postprocessing)。 Flask的请求钩子通过装饰器实现,每个钩子可以注册任意多个处理函数,默认的五种请求钩子如下: 钩子 说明 before_first_request 注册一个函数,在处理请求前运行 before_request 注册一个函数,在处理每个请求前运行 after_request 注册一个函数,如果有未处理的一场抛出。会在每个请求结束后运行 teardown_request 注册一个函数,即使有未处理的异常抛出,会在每个请求介绍后执行。如果发生异常,会传入异常对象作为参数注册到函数中 after_this_request 在视图函数内注册一个函数,在这个请求结束后运行 假如我们创建了三个视图函数A、B、C,其中视图C使用了after_this_request钩子,那么当请求A进入后,整个请求处理周期的请求处理函数调用流程如图: 上下文 什么是上下文?上下文相当于一个容器,它保存了程序运行过程中的一些信息,它是当前环境的一个快照(snapshot)。Flask中有两种上下文,程序上下文(application context)和请求上下文(request context)。程序上下文中包含了程序运行所必须的信息;请求上下文里包含了请求的各种信息,比如请求的URL、HTTP方法等 上下文全局变量我们知道,Flask将请求报文封装在request对象中。按照一般的思路,如果我们要在视图函数中使用它,就得把它作为参数传入视图函数,就像我们接收URL变量一样。但这样就会导致大量的重复,而且增加了的程序的负担。不一般的是,我们可以从Flask导入一个全局的request变量,在视图函数中直接调用request的属性获取数据。这是为什么?因为Flask会在每个请求产生后后自动激活当前请求的上下文,激活请求上下文后,request被临时设置为全局可访问。在每个请求结束后,Flask就会销毁对应的请求上下文。 Flask提供的四个上下文全局变量如下: 变量名 上下文类别 说明 current_app 程序上下文 指向处理请求的当前程序实例 g 程序上下文 替代Python的全局变量用法,确保仅在当前请求可用,用于存储全局数据,每次请求都会重设 request 请求上下文 封装客户端发出的请求报文数据 session 请求上下文 用于记住请求之间的数据,通过签名的Cookie实现 不同的视图函数中,request对象都表示和视图函数对应的请求,也就是当前请求 程序存在多个程序实例的情况,使用current_app可获取对应的实例 上下文的激活请求进入时,Flask会自动激活请求上下文,此时程序上下文也被自动激活。请求处理完毕后,请求上下文和程序上下文也会自动销毁。两者具有相同的生命周期。 Flask自动激活上下文的情况: 使用flask run命令启动程序时 使用旧的app.run()方法启动程序时 执行使用@app.cli.command()装饰器注册的flask命令时 使用flask shell命令启动Python Shell时 手动激活的方法: 使用with语句,程序上下文对象可通过app.app_context()获取 使用push()方法激活程序上下文 请求上下文可以通过test_request_context()方法临时创建 12345>>> from app import app>>> from flask import current_app>>> with app.app_context(): ... current_app.name'app' 1234567>>> from app import app>>> from flask import current_app>>> app_ctx = app.app_context()>>> app_ctx.push()>>> current_app.name'app'>>> app_ctx.pop() 12345>>> from app import app>>> from flask import request>>> with app.test_request_context('/hello'):... request.method'GET' 参考:https://book.douban.com/subject/30310340/","categories":[{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/categories/Flask/"}],"tags":[{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/tags/Flask/"}]},{"title":"将本地项目推送到GitHub远程仓库","slug":"将本地项目推送到GitHub远程仓库","date":"2019-03-08T23:59:28.000Z","updated":"2019-03-08T23:59:28.000Z","comments":true,"path":"2019/03/08/将本地项目推送到GitHub远程仓库/","permalink":"https://yeshan333.github.io/2019/03/08/%E5%B0%86%E6%9C%AC%E5%9C%B0%E9%A1%B9%E7%9B%AE%E6%8E%A8%E9%80%81%E5%88%B0GitHub%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93/","excerpt":"如何将本地项目推送到Github Tip:在本地要安装好Git,官网:https://git-scm.com/ 一个学习Git的好地方:https://try.github.io/ 在线闯关实战,边练边学的好地方:https://learngitbranching.js.org/ 方法一:使用https推送12345678910111213# 步骤# 1.创建一个目录mkdir Test# 2.将当前目录变为git管理仓库git init# 3.将文件添加到版本库,这里将目录下的所有文件都添加进去了git add .# 4.告诉git将文件提交到仓库git commit -m "first-commit"# 5.将当前仓库与远程仓库关联git remote add origin 远程仓库的https地址 # eg: git remote add https://github.com/ssmath/Test.git# 6.将仓库内master分支的所有内容推送到远程仓库,这里会使用到Github的账号密码git push -u origin master","text":"如何将本地项目推送到Github Tip:在本地要安装好Git,官网:https://git-scm.com/ 一个学习Git的好地方:https://try.github.io/ 在线闯关实战,边练边学的好地方:https://learngitbranching.js.org/ 方法一:使用https推送12345678910111213# 步骤# 1.创建一个目录mkdir Test# 2.将当前目录变为git管理仓库git init# 3.将文件添加到版本库,这里将目录下的所有文件都添加进去了git add .# 4.告诉git将文件提交到仓库git commit -m "first-commit"# 5.将当前仓库与远程仓库关联git remote add origin 远程仓库的https地址 # eg: git remote add https://github.com/ssmath/Test.git# 6.将仓库内master分支的所有内容推送到远程仓库,这里会使用到Github的账号密码git push -u origin master 方法二:使用ssh推送 生成ssh密钥 12ssh-keygen -t rsa -C "your email address"# eg: ssh-keygen -t rsa -C "1329441308@qq.com" 找到生成的文件,复制id_rsa.pub文件中的内容,文件一般在用户目录下的.ssh目录中 使用密钥与远程仓库配对,检验能否成功通讯 ssh -T git@github.com # 检验能否成功通讯 推送本地文件到github","categories":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"}]},{"title":"vscode配置Pipenv工作环境","slug":"vscode配置Pipenv工作环境","date":"2019-03-03T23:25:30.000Z","updated":"2019-03-03T23:25:30.000Z","comments":true,"path":"2019/03/03/vscode配置Pipenv工作环境/","permalink":"https://yeshan333.github.io/2019/03/03/vscode%E9%85%8D%E7%BD%AEPipenv%E5%B7%A5%E4%BD%9C%E7%8E%AF%E5%A2%83/","excerpt":"让vscode使用Pipenv工作环境1、查看Pipenv的位置1234# 先激活Pipenv环境pipenv shell# 获取当前虚拟环境的位置pipenv --venv 2、打开setting.json配置文件 Ctrl+Shift+P,输入settings,选择Open Settings(JSon) 将之前得到的Pipenv环境路径添加进去 “python.venvPath”: “C:\\Users\\Algorithm\\.virtualenvs”","text":"让vscode使用Pipenv工作环境1、查看Pipenv的位置1234# 先激活Pipenv环境pipenv shell# 获取当前虚拟环境的位置pipenv --venv 2、打开setting.json配置文件 Ctrl+Shift+P,输入settings,选择Open Settings(JSon) 将之前得到的Pipenv环境路径添加进去 “python.venvPath”: “C:\\Users\\Algorithm\\.virtualenvs” 3、重启vscode 参考https://segmentfault.com/a/1190000017558652 https://blog.csdn.net/weixin_34294649/article/details/87518937","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"Happy New Year !","slug":"Happy-New-Year","date":"2019-02-05T00:00:00.000Z","updated":"2019-02-05T00:00:00.000Z","comments":true,"path":"2019/02/05/Happy-New-Year/","permalink":"https://yeshan333.github.io/2019/02/05/Happy-New-Year/","excerpt":"","text":"12345678910111213141516171819202122232425262728C:printf("Happy New Year");C++ : cout<<"Happy New Year";Objectivec: NSLog(@"Happy New Year!");QBasic : Print "Happy New Year"Asp : Response.Write "Happy New Year"PHP : echo "Happy New Year";Ruby: puts "Happy New Year!"JavaScript: alert("Happy New Year")VBScript:MsgBox "Happy New Year"JavaScript: document.write("Happy New Year")JavaScript: console.log(' Happy New Year');xml <TextView android:text="Happy New Year! " />Delphi: ShowMessage('Happy New Year!');VB: Msg("Happy New Year!")VC: MessageBox("Happy New Year!");shell: echo Happy New Yearperl: print 'Happy New Year'java: System.out.println("Happy New Year");LISP:(format t "Happy New Year!~%")powerBuilder:messagebox("Happy New Year")C#:System.Console.WriteLine("Happy New Year!")COBOL:DISPLAY 'Happy New Year!'Python:print("Happy New Year!")aswing:JOptionPane.showMessageDialog("happy","Happy New Year!")flex:Alert.show("Happy New Year!");Clojure: (println "Happy New Year")verilog/systemverilog/e $display("Happy New Year")as:trace("Happy New Year!");","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"HTML&&CSS(划水~~~)","slug":"HTML-CSS-划水","date":"2019-01-22T17:09:40.000Z","updated":"2019-01-22T17:09:40.000Z","comments":true,"path":"2019/01/22/HTML-CSS-划水/","permalink":"https://yeshan333.github.io/2019/01/22/HTML-CSS-%E5%88%92%E6%B0%B4/","excerpt":"HTML(超文本标记语言)HTML标签不区分大小写。 HTML属性 ID属性指定一个标识符,用于唯一标识页面元素,这些标识符主要供Javascript和CSS使用 class属性是一个全局属性,可用于建立元素编组。可以给多个元素指定相同的class属性,以便在CSS或Javascript中将这些元素作为一个编组来引用它们 style属性用于定义标签的样式。任何标签中都可以指定属性style。使用style属性可以为标签指定一个或多个样式规则,** 在style定义多条规则的方法是用分号将他们分开 **","text":"HTML(超文本标记语言)HTML标签不区分大小写。 HTML属性 ID属性指定一个标识符,用于唯一标识页面元素,这些标识符主要供Javascript和CSS使用 class属性是一个全局属性,可用于建立元素编组。可以给多个元素指定相同的class属性,以便在CSS或Javascript中将这些元素作为一个编组来引用它们 style属性用于定义标签的样式。任何标签中都可以指定属性style。使用style属性可以为标签指定一个或多个样式规则,** 在style定义多条规则的方法是用分号将他们分开 ** HTML的列表列表标签的特征: 每个列表都有一个指定列表类型的外部元素。 每个列表项都有自己的标签。 12345无序列表:<ul></ul>有序列表:<ol></ol>定义列表:<dl></dl>词汇列表的列表项为<dt><dd>其他列表的列表项为<li> 有序列表(ol)有序列表默认的编号为罗马数字,可以使用属性style指定列表的编号样式,使用CSS属性list-style-type进行修改 1234567eg:<ol style="list-style-type: upper-roman"> <li>罗马假日</li> <li>平凡的世界</li> <li>封神榜</li> <li>无间道</li></ol> 罗马假日 平凡的世界 封神榜 无间道 有序列表的编号样式 CSS属性list-style-type 描述 decimal(默认) 标准阿拉伯数字 lower-alpha 小写字母 upper-alpha 大写字母 lower-roman 小写罗马数字 upper-roman 大写罗马数字 无序列表(ul)无序列表编号样式 CSS属性list-style-type 描述 disc 圆盘,默认样式 square 实心正方形 circle 空心圆 123456eg:<ul style="list-style-type: square"> <li>正方体</li> <li>长方体</li> <li>圆柱体</li></ul> 正方体 长方体 圆柱体 定义列表(dl)定义列表的每个列表项都包含两部分 术语,标签为<dt> 术语的定义,标签为<dt> 1234567eg:<dl> <dt>HTML</dt> <dd>超文本标记语言,标准通用标记语言下的一个应用。是 网页制作必备的编程语言。</dd> <dt>CSS</dt> <dd>层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。</dd></dl> HTML 超文本标记语言,标准通用标记语言下的一个应用。是 网页制作必备的编程语言。 CSS 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。 链接和锚链接到另一个页面的特定位置** 方法: 使用锚,即在链接的URL中指定要链接到的元素的ID ** 12345678910eg:另一个页面2.html:<h2 id="part4">Part four</h2>当前页面1.html:<a href="2.html#part4">go to part four</a> 链接到当前页面的其他元素** 方法: 省略页面名就行,使用#号和ID ** 12eg:go to<a href="#section5">the fifth setion</a> span标签span标签和style属性结合使用时,可取代很多标签,效果很nice 1234<p>Here is some<span style="text-decoration: underline"> underline text</span></p><p>Here is some<span style="font-style:oblique"> oblique text</span></p><p>Here is some<span style="text-decoration:line-through">line-through text</span></p><p>Here is some<span style="font-weight:120"> bolder text</span></p> Here is some underline text Here is some oblique text Here is someline-through text Here is some bolder text HTML表格 标签 用途 <table></table> 定义表格 <caption></caption> 创建表题(可选) <tr></tr> 定义一个表格行,其中可包含表头单元格或数据单元格 <th></th> 定义一个表头单元格。表头单元格得内容通常显示为粗体,且在水平和竖直方向上都居中 <td></td> 定义一个数据单元格。数据单元格得内容通常显示为常规字体,在水平方向上左对齐,而且在垂直方向上居中 <colgroup></colgroup> 将一列或多列编组 <col></col> 用于定义表格列属性 <thead></thead> 创建表示表头的行编组。一个表格只能有一个表头 <tfoot></tfoot> 创建表示表尾的行编组。一个表格只能有一个表尾,它必须在表体前定义 <tbody></tbody> 定义一个或多个表示表体的行编组。一个表格可包含多个表头部分 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465<!DOCTYPE html><html><head> <title>Table</title></head><body> <table border="1" style="width: 100%;"> <caption><b>Science and Mathematic Class Schedules</b></caption> <colgroup style="width: 20%; text-align: center; vertical-align: top; background-color: #fcf;"> <colgroup span="2" style="width: 40%; vertical-align: top; background-color: #ccf;"> <!-- span属性指定了列编组包含的列数,默认为1 --> <thead style="background-color: red;"> <tr> <th>Class</th> <th>Room</th> <th>Time</th> </tr> </thead> <tbody style="background-color: yellow;"> <tr> <td>Biology</td> <td>Science Wing, Room 102</td> <td>8:00 AM to 9:45 AM</td> </tr> <tr> <td>Science</td> <td>Science Wing, Room 110</td> <td>9:50 AM to 11:30 AM</td> </tr> <tr> <td>Physics</td> <td>Science Wing, Room 107</td> <td>1:00 PM to 2:45 PM</td> </tr> </tbody> <tbody style="background-color: gray;"> <tr> <td>Geometry</td> <td>Mathematics Wing, Room 236</td> <td>8:00 AM to 9:45 Am</td> </tr> <tr> <td>Algebra</td> <td>Mathematics Wing, Room 239</td> <td>9:50 AM to 11:30 AM</td> </tr> <tr> <td>Trigonometry</td> <td>Mathematics Wing, Room 245</td> <td>1:00 PM to 2:45 PM</td> </tr> </tbody> <!-- tfoot一般放在tbody之前 --> <tfoot style="background-color: blue;"> <tr> <th>Class</th> <th>Room</th> <th>Time</th> </tr> </tfoot> </table></body></html> text-align:指定水平对齐方式,可能取值:left、center、right vertical-align:指定垂直对齐方式,可能取值:top、middle、bottom 表格属性 属性 适用元素 用途 border table 指定表格是否带边框,默认不带。这个属性指定了表格边框的宽度 span col和colgroup 指定列编组包含多少列,必须是大于0的整数 colspan th或td 指定单元格将向右延伸横跨多少列 rowspan th或td 指定单元格将向下延伸横跨多少行 123456789101112131415161718192021222324252627<!DOCTYPE html><html><head> <title>colspan and rowspan</title></head><body> <table border="10" style="width: 100%"> <caption><b>跨行跨列表格</b></caption> <!-- 跨列 --> <tr> <th colspan="2">性别</th> </tr> <tr> <td>男</td> <td>女</td> </tr> <!-- 跨行 --> <tr> <th rowspan="2">辣椒</th> <td>牛角椒</td> </tr> <tr> <td>灯笼椒</td> </tr> </table></body></html> HTML表单 标签/属性 用途 <form> 创建HTML表单。一个文档可包含多个表单,但是不可嵌套 action 标签<form>的一个属性,使用URL路径指定负责处理表单数据的服务器脚本 enctype <form>的一个属性,指定将表单数据发送给服务器前如何对其进行编码 method <form>的一个属性,指定如何将表单数据发送给服务器 <input> 一个用于创建表单控件以收集用户输入的信息 <button> 创建一个可包含HTML内容的按钮 <textarea> 创建多行的文本输入字段 <select> 创建一个菜单或可滚动列表,列表项由<option>创建 <progress> 显示任务完成进度的进度条 <label> 创建与表单控件配套的标签 <fieldset> 将表单控件编组 type 标签<input的一个属性>,指定了表单控件的类型,可能取值:text:创建一个单行文本输入字段password: 创建一个可遮挡用户输入的单行文本输入字段hidden: 创建一个隐藏的表单控件checkbox: 创建一个复选框search: 创建一个搜索关键字输入字段file: 创建一个文件上传控件让用户能够选择要随表单数据一起上传到服务器的文件color、date、datetime、email、url、reset等等 其它 items 说明 HTML语义标签 http://www.w3school.com.cn/html/html5_semantic_elements.asp pre标签 http://www.w3school.com.cn/tags/tag_pre.asp HTML字符实体 http://www.w3school.com.cn/html/html_entities.asp CSS(层叠样式表)样式表由一系列规则组成,大致结构如下 selector { property1: value1; property } 每条规则都以选择器(selector)打头,后面是一系列有花括号括起来的属性(property)和值(value)。 每个选择器可以指定任意数量的属性,但属性之间必须用分号分隔。 在最后一个属性/值对后面,可以有分号,也可以没有。 选择器(selector) 任何标签都可以用作CSS选择器,与这种选择器相关联的规则将应用于页面中所有指定的元素 可使用单个选择器将样式应用于多种元素,元素间用逗号间隔,比如: 123p, ul { color: blue} 下面这个规则与上面那个等价 1234567p { color: blue;}ul { color: blue;} 上下文选择器  使用上下文选择器可以将样式应用于嵌套在指定元素内的元素 123ol em { color: red;} 上面那条规则应用于嵌套在有序列表中的em元素 123cite { font-style: inherit; font-weight: 200;}p cite { font-style: italic; font-weight: 500;}li cite{ font-style: normal; font-weight: bolder;} 第一条为应用于所有cite标签的规则对于嵌套的cite标签,后两条规则说明了他们应该应用的样式 类 && ID 选择器 将选择器应用于类,使用.+类名 将选择器应用于ID,使用#+ID,ID是独一无二的 给多个元素指定相同的样式可以使用类名,给单个元素指定样式可以使用ID 12345678910111213141516171819<!-- 使用类型名 --><div class="shan">test</div><!-- CSS -->.shan { color: red;}<!-- ------------------------------------ --><!-- 使用ID --><div id="footer">Copyright 2019</div><!-- CSS -->#footer { font-size: small;} 子选择器1p > span.important { fot-weight: bold; } 这个选择器只与p标签,属于important类的span标签匹配,与下面的span标签不匹配 1<p>This is a paragraph. <em>This is an <span class="important">important</span> sentence.</em></p> 这里的span为p的孙子 伪类http://www.w3school.com.cn/css/css_pseudo_classes.asp 锚伪类 1234a:link {color: #FF0000} /* 未访问的链接 */a:visited {color: #00FF00} /* 已访问的链接 */a:hover {color: #FF00FF} /* 鼠标移动到链接上 */a:active {color: #0000FF} /* 选定的链接 */ 更多 http://www.w3school.com.cn/css/css_selector_descendant.asp CSS度量单位 http://www.w3school.com.cn/cssref/css_units.asp CSS颜色 http://www.w3school.com.cn/cssref/css_colors.asp 盒子模型 element: 元素/内容 padding: 内边距 border: 边框 margin: 外边距 边框的属性 属性 说明 border-style 指定显示的边框类型。可能取值包括:none、dotted、dashed、solid、double、groove、ridge、inset、outset、inherit。 border-width 指定边框的宽度,单位通常为像素(px)。 border-color 指定边框颜色。 同时设置多个边框属性时,形式如下 1selector { border: style width color; } eg: 1a { border: dashed 3px red; } 内边距和外边距 内边距(padding)是边框里面的空白区域 外边距(margin)是边框外面的空白区域 123456789101112131415161718192021222324<!DOCTYPE html><html><head> <title>test</title> <style type="text/css"> .outer { border: 2px solid black; } .inner { border: 2px dotted black; padding: 15px; margin: 15px; } </style></head><body> 工程狮 <div class="outer"> <div class="inner"> 攻城狮(谐音)工程师,来源于腾讯QQ手机管家于2012年3月1日16:53在发布了一条微博:<br/> 声称腾讯公司一名保安经过一层层技术面试进入了腾讯研究院,成为一名攻城狮(工程师)。<br/> 这种事儿看起来相信很多人的第一反应都是恶搞,不过不久,腾讯老大马化腾亲自出面,核实了这一事件的真实性,并且称这是个“很励志的故事”。<br/> </div> </div></body></html> 内容(element)盒子 块式盒子 内嵌盒子 块级元素前后都换行,而内嵌元素的尺寸取决于其包含的内容以及外边距、内边距和边框的设置。CSS提供了属性display来修改元素的默认行为,属性display的可能取值有三个:block、inline和none。 边框显示了在样式表中指定的盒子的尺寸。但文本太多的时候,盒子可能无法容纳,多出来的文本可能会跑到边框的下方。这时,可以通过CSS属性overflow告诉浏览器要如何做。overflow的可能取值包括:visible(默认)、hidden、scroll、auto和inherit。 浮动(修改块级元素的排列方式) 属性float,指出浮动位置,取值:right、left、none 属性clear,消除浮动的影响,取值:none、left、right、both See the Pen 1 by Mr.Ye (@yeshan333) on CodePen.   浮动的p元素移到了页面右边,而第二个段落出现在它的左边。通过将属于right类的元素p的样式属性float设置为right,指出了页面其他元素应沿元素绕排。我们将第三个段落的clear属性设置为both,消除了前面浮动的影响。 如果想要将第二段浮动到第一段的下方,可设置第二段的属性float为right,属性clear设置为right。仅仅设置float属性时,两个段落会并排。 12345678.main { border: 3px solid black; padding: 10px; margin: 10px; float: right; clear: right; width: 33%;}","categories":[{"name":"HTML","slug":"HTML","permalink":"https://yeshan333.github.io/categories/HTML/"},{"name":"CSS","slug":"CSS","permalink":"https://yeshan333.github.io/categories/CSS/"}],"tags":[{"name":"HTML","slug":"HTML","permalink":"https://yeshan333.github.io/tags/HTML/"},{"name":"CSS","slug":"CSS","permalink":"https://yeshan333.github.io/tags/CSS/"}]},{"title":"你所拥有的知识并不取决于你记得多少,而在于它们能否在恰当的时候被回忆起来。","slug":"你所拥有的知识并不取决于你记得多少,而在于它们能否在恰当的时候被回忆起来。","date":"2019-01-16T23:08:36.000Z","updated":"2019-01-16T23:08:36.000Z","comments":true,"path":"2019/01/16/你所拥有的知识并不取决于你记得多少,而在于它们能否在恰当的时候被回忆起来。/","permalink":"https://yeshan333.github.io/2019/01/16/%E4%BD%A0%E6%89%80%E6%8B%A5%E6%9C%89%E7%9A%84%E7%9F%A5%E8%AF%86%E5%B9%B6%E4%B8%8D%E5%8F%96%E5%86%B3%E4%BA%8E%E4%BD%A0%E8%AE%B0%E5%BE%97%E5%A4%9A%E5%B0%91%EF%BC%8C%E8%80%8C%E5%9C%A8%E4%BA%8E%E5%AE%83%E4%BB%AC%E8%83%BD%E5%90%A6%E5%9C%A8%E6%81%B0%E5%BD%93%E7%9A%84%E6%97%B6%E5%80%99%E8%A2%AB%E5%9B%9E%E5%BF%86%E8%B5%B7%E6%9D%A5%E3%80%82/","excerpt":"","text":"","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"Jinja2语法小记","slug":"Jinja2语法小记","date":"2019-01-09T23:26:59.000Z","updated":"2019-01-09T23:26:59.000Z","comments":true,"path":"2019/01/09/Jinja2语法小记/","permalink":"https://yeshan333.github.io/2019/01/09/Jinja2%E8%AF%AD%E6%B3%95%E5%B0%8F%E8%AE%B0/","excerpt":"jinja2模板语法小记 Jinja2模板中文文档 三种常见界定符 表达式{{ ... }} 用于装载字符串、变量、函数调用等 语句{% ... %} 用于装载控制语句,比如if判断、for循环等 注释{# ... #} 用于装载一个注释,模板渲染的时候会被忽略掉","text":"jinja2模板语法小记 Jinja2模板中文文档 三种常见界定符 表达式{{ ... }} 用于装载字符串、变量、函数调用等 语句{% ... %} 用于装载控制语句,比如if判断、for循环等 注释{# ... #} 用于装载一个注释,模板渲染的时候会被忽略掉 变量 在模板中,我们可以使用“**.**”获取变量的属性 1234user = { 'username' : 'shansan', 'bio': '我佛了',} 如果user为传入模板中的字典变量,则我们可通过”.“获取它的键值。eg:user.usernameuser.username等价于user[‘username’] 我们可以用set标签在模板中定义变量 1{% set navigation = [('/','Home'),('/about','关于我')] %} 使用endset声明结束 过滤器(filter) 过滤器(filter)是一些可以用来修改和过滤特殊变量值的函数。过滤器和变量用一个竖线“**|**”(管道符号)隔开,需要参数的过滤器可以像函数一样使用括号传递 eg: 对一个movies列表使用length过滤器获取其长度 1movies|length 下面是Jinja2常用的内置过滤器 过滤器 说明 default(value,default_value,boolean=False) 设置默认值,默认值作为参数传入,别名为d escap(s) 转义HTML文本,别名为e first(seq) 返回序列的第一个元素 last(seq) 返回列表的最后一个元素 length(object) 返回变量的长度 safe(value) 将变量标记为安全,避免转义 wordcount(s) 计算单词数量 过滤器函数的第一个参数表示被过滤的变量值(value)或字符串(s),即竖线符号左侧的值其他参数可以使用括号传入 测试器(Test) 测试器主要用来判断一个值是否满足某种变量类型,返回布尔值(True or False)的特殊函数语法为:if…is… is的左侧是测试器函数的第一个参数(value) 其他参数可以通过添加括号传入,也可以在右侧使用空格连接 Jinja2常用内置测试器 测试器 说明 callable(object) 判断对象是否可调用 defined(value) 判断变量是否已定义 none(value) 判断变量是否为None number(value) 判断变量是否为数字 string(value) 判断变量是否为字符串 sequence(value) 判断变量是否为序列,比如字符串、列表、元组 iterable(value) 判断变量是否可迭代 mapping(value) 判断变量是否是匹配对象,比如字典 smeas(value,other) 判断变量与other是否指向相同的内存地址 123{% if foo is smeas(bar) %}{# 等价于 #}{% if foo is smeas bar %} 判断foo和bar所以指向的内存地址是否相同 语句 在Jinja2中,语句使用**{% ... %}**标识在语句结束的地方,必须添加结束标签 if语句使用endif for语句使用endfor 12345{% if user.name == 'shansan' %} <h1>you are right!</h1>{% else %} <h1>you are wrong!</h1>{% endif %} 123{% for g in ga %} <li>{{ g.name }} - {{ g.year }}</li>{% endfor %} 不可使用break和continue控制循环的执行 模板局部模板 当多个独立模板中使用到同一块HTML代码时,可以把这部分代码抽离出来,放到局部模板中 局部模板的命名一般以一个下划线开始 使用include标签插入一个局部模板 1{% include '_banner.html' %} 宏 宏,类似于Python中的函数。使用宏可以封装一部分模板代码 一般把宏寄存在即存在名为macros.html或_macros.html文件中 使用macro和endmacro标签声明宏的开始和结束 在开始标签中定义宏的名称和接收的参数 1234567{% macro qux(amount=1) %} {% if amount==1 %} I am qux. {% elif amount>1 %} We are qux. {% endif %}{% endmacro %} 就像从Python模块中导入函数一样,我们可以使用import导入宏 1{% from 'macros.html' import qux %} PS:默认情况下,使用include导入一个局部模板会传递上下文到局部模板中,但使用import却不会 模板继承 模板继承允许我们构建一个包含站点共同元素的基本模板”骨架”,并定义子模版可以覆盖的块 基模板 base.html ** 在基模板中定义的块(block),可以让子模版通过定义同名的块来执行继承操作 ** 块的开始和结束分别使用block和endblock标签,不同的块允许嵌套以下示例代码中使用head、title、styles、content、footer和scripts划分了不同的标签块 123456789101112131415161718192021<!DOCTYPE html><html><head> {% block head %} <meta charset="utf-8"> <title>{% block title %}Template - HelloFlask{% endblock %}</title> {% block styles %}{% endblock styles %} {% endblock head %}</head><body> <ul><li><a href="{{ url_for('index') }}">Home</a></li></ul> <main> {% block content %}{% endblock content %} </main> <footer> {% block footer %} {% endblock footer %} </footer> {% block scripts %}{% endblock scripts %}</body></html> 子模版 index.html 当在子模版创建同名的块时,会使用字块的内容覆盖父块的内容 这里子模版的content块的内容覆盖了基模板content块的内容 extends 标签必须是模板中的第一个 标签 1234567891011121314{% extends 'base.html' %}{% from 'macros.html' import qux %}{% block content %}{% set name='baz' %}<h1>Template</h1><ul> <li><a href="{{ url_for('watchlist') }}">Watchlist</a></li> <li>Filter: {{ foo|musical }}</li> <li>Global: {{ bar() }}</li> <li>Test: {% if name == 'baz' %}I am baz.{% endif %}</li> <li>Macro: {{ qux(amount=5) }}</li></ul>{% endblock content %} *** 如需要向基模板中追加内容,可以使用Jinja2的super()函数 *** 如向基模板的styles块追加一行样式 12345678{% block styles %}{{ super() }}<style> html{ color: red; }</style>{% endblock %} 参考: https://book.douban.com/subject/30310340/ https://www.cnblogs.com/yanzi-meng/p/8342798.html http://docs.jinkan.org/docs/jinja2/templates.html#id21","categories":[{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/categories/Flask/"}],"tags":[{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/tags/Flask/"}]},{"title":"泛型算法-1","slug":"泛型算法-1","date":"2019-01-03T18:41:00.000Z","updated":"2019-01-03T18:41:00.000Z","comments":true,"path":"2019/01/03/泛型算法-1/","permalink":"https://yeshan333.github.io/2019/01/03/%E6%B3%9B%E5%9E%8B%E7%AE%97%E6%B3%95-1/","excerpt":"泛型算法-1 泛型算法实现了一些经典算法的公共接口,如排序和搜索;称它们是“泛型的”,是因为它们可以用于不同类型的元素的和多种容器类型(不仅包括标准库类型,还包括内置的数组类型),以及其它类型的序列。 ** 大多数算法都定义在头文件algorithm中 ** 算法永远不会执行容器的操作","text":"泛型算法-1 泛型算法实现了一些经典算法的公共接口,如排序和搜索;称它们是“泛型的”,是因为它们可以用于不同类型的元素的和多种容器类型(不仅包括标准库类型,还包括内置的数组类型),以及其它类型的序列。 ** 大多数算法都定义在头文件algorithm中 ** 算法永远不会执行容器的操作 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105/*算法find*//*- find将范围内中的所有元素与给定值进行比较,返回指向第一个等于给定值的迭代器- 如果范围内无匹配元素,则find返回第二个参数来表示搜索失败*/void find_value(){ //find函数的返回值类型是迭代器类型 //在vector中查找值 int val = 7; vector<int> v{1,2,3,4,5,6,7,8}; auto result = find(v.begin(),v.end(),val); cout<<*result<<endl; //在数组中查找值 int nums[10] = {1,2,3,4,5,6,7,8,9,10}; auto search = find(begin(nums),end(nums),11);//值不存在,返回尾后迭代器 cout<<*search<<endl;}/*算法count*//*- 返回给定值在序列中出现的次数*/void value_count(){ //count函数返回给定值在序列中出现的次数 int a[]={1,1,1,1,1,2,3,4,5,6}; auto c = count(a,a+10,1); cout<<"1出现的次数:"<<c<<endl;}/*算法accumulate*//*- accumulate将第三个参数作为求和起点- 注意序列中的元素的类型必须与第三个参数匹配*/void sum_num(){ //accumulate函数用去求给定元素范围内元素的和 vector<int> v={1,2,3,4,5,6,7,8,9,10}; auto sum = accumulate(v.begin(),v.end(),0); vector<int> v_compare{1,2,3,4,5,6,7,8,9,10,11}; if( equal(v.begin(),v.end(),v_compare.begin()) ) cout<<"yeah"<<endl; cout<<sum<<endl;}/*算法fill*//*- 用于确定两个序列中是否保存相同的值- 第二个序列至少与第一个序列一样长*/void init_fill(){ vector<int> v{1,2,3,4,5,6,7,8}; fill(v.begin(),v.end(),1);//不要对空容器使用此操作 for(auto a:v) cout<<a<<" ";}void elimDups(vector<string> &words){ void print(vector<string> v); sort(words.begin(),words.end()); //使用sort算法按字典序重排序列 //unique重排了输入范围,使得每个单词只出现一次, //unique返回指向不重复区域之后一个位置的迭代器 auto end_unique = unique(words.begin(),words.end()); //删除重复元素 words.erase(end_unique,words.end()); print(words);}void print(vector<string> v){ for(auto a:v) cout<<a<<" "; cout<<endl;}//定制操作,按照长度重新排vectorbool isShorter(const string &s1,const string &s2){ return s1.size() > s2.size();}//按长度进行排序void length_sort(vector<string> &words){ sort(words.begin(),words.end(),isShorter); print(words); //使用算法stable_sort来保持等长元素间的字典序 stable_sort(v.begin(),v.end(),isShorter); print(v);} 向算法传递函数算法谓词 算法谓词即标准库算法传递的参数, 可以指定算法的操作,它是一个可以调用的表达式,其返回结果是一个能用作条件的值 接受谓词参数的算法对输入序列中的元素调用谓词。因此元素类型必须能转换成谓词的参数类型 标准库算法所使用的谓词分为两类:1.一元谓词:它们只接受一个参数2.二元谓词:它们接受两个参数 12345678910111213141516//定制操作,按照长度重新排vectorbool isShorter(const string &s1,const string &s2){ return s1.size() > s2.size();}//按长度进行排序void length_sort(vector<string> &words){ sort(words.begin(),words.end(),isShorter); print(words); //使用算法stable_sort来保持等长元素间的字典序 stable_sort(v.begin(),v.end(),isShorter); print(v);} 这里向算法stable_sort传递的第三个参数就是一个谓词 lambda表达式(匿名函数) lambda表达式与其它函数的区别是:lambda表达式可定义在函数内部 基本形式: 1[capture lsit](parameter list) -> return type {function body} capture list(捕获列表): 一个lambda所在函数中的定义的局部变量的列表(通常为空) parameter list(参数列表) return type(返回类型) function body(函数体) ** 我们可以忽略形参列表和返回类型,但是必须永远包含捕获列表和函数体 ** 12 auto f = []{return 44;} ;cout<<f()<<endl;//打印44 上面的向算法stable_sort传递的实参可以改写为,效果还是一样的 1stable_sort(v.begin(), v.end(), [](const string &a,const string s&b){return a.size()<b.size()}); 捕获列表的使用一个lambda可以出现在一个函数内部,使用其局部变量,但它只能使用那些指明的变量。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include<iostream>#include<algorithm>#include<vector>using namespace std;void biggies(vector<string> &words,vector<string>::size_type sz){ //使用sort算法按字典序重排序列 s sort(words.begin(),words.end()); //unique重排了输入范围,使得每个单词只出现一次, //unique返回指向不重复区域之后一个位置的迭代器 auto end_unique = unique(words.begin(),words.end()); //删除重复元素 words.erase(end_unique,words.end()); //按长度排序,长度相同的按字典序排 stable_sort(words.begin(),words.end(), [](const string &a,const string &b){return a.size() < b.size();}); //算法find_if返回一个迭代器,这个迭代器指向第一个满足size()>=sz的元素 //这里用到了捕获列表,使用局部变量sz auto wc = find_if(words.begin(),words.end(), [sz](const string &a){return a.size()>sz; }); //计算满足size >= sz 的元素的个数 auto count = words.end() - wc; cout<<"the numbers of word longer than "<<sz<<": "<<count<<endl; //打印长度大于等于给定值sz的单词 //算法for_earch接受一个可调用对象,并对输入序列中的每个元素调用此对象 for_each(wc,words.end(),[](const string &s){ cout<<s<<" "; });}int main(){ vector<string> words; string str; while(cin>>str) words.push_back(str); for(auto a:words) cout<<a<<" "; cout<<endl; biggies(words,6);//打印长度大于或等于给定值的单词 return 0;} ** 捕获列表只用于局部非静态(static)变量,lambda可以直接使用局部static变量和在它所在函数之外声明的名字 ** lambada捕获和返回 变量的捕获方式有两种:值捕获、引用捕获 使用引用捕获变量时,必须确保被引用的对象在lambda执行的时候是存在的 lambda捕获的是局部变量,这些变量在函数结束后就不复存在了 我们可以从一个函数返回lambda,函数可以直接返回一个可调用对象,或者返回一个类对象,该类含有可调用对象的数据成员。如果函数返回一个lambda,则与函数不能返回一个局部变量类似,此lambda也不能包含引用捕获 使用***&、=***进行隐式捕获我们可以让编译器根据lambda体中的代码来推断我们要使用哪些变量 **&**告诉编译器采用引用捕获方式 **=**告诉编译器采用值捕获方式 混合使用显式捕获和隐式捕获时,显示捕获必须使用与隐式捕获不同的方式 1234567891011121314151617181920212223242526272829#include<iostream>#include<vector>#include<algorithm>using namespace std;void biggies(vector<string> &words, ostream &os=cout, char c=' '){ //os隐式捕获,c显式捕获 for_each(words.begin(), words.end(), [&, c](const string &s){ os<<s<<c;} ); printf("\\n"); //c隐式捕获,os显示捕获 for_each(words.begin(), words.end(), [=, &os](const string &s){ os<<s<<c;} );}int main(){ vector<string> str; string temp; while(cin>>temp) str.push_back(temp); biggies(str); return 0;} 指定lambda的返回类型 要为一个lambda定义返回类型时,必须使用尾置返回类型 尾置返回类型跟在形参列表后面,并以一个->符号开头 12auto f = [](int i)->int{ return i+1;};cout<<f(3)<<endl;//输出结果为:4 可变lambada使用关键字mutable改变一个被捕获变量的值 1234int i=1;auto f = [i]()mutable{ return ++i;};i=0;cout<<f();//输出结果为2 lambda捕获列表   说明 [] 空捕获列表。lambda不能使用所在函数中的变量。一个lambda只有捕获变量后才能使用它们 [names] names是一个逗号分隔的名字列表,这些名字都是lambda所在函数的局部变量。默认情况下,捕获列表中的变量都被拷贝 [&] 隐式捕获列表,采用隐式捕获方式 [=] 隐式捕获列表,采用值捕获方式 [&, identifier_list] identifier_list是一个逗号分隔的列表,包含0个或多个来自所在函数的变量,这些变量采用值捕获方式。任何隐式捕获的变量都采用引用方式捕获 [=, identifier_list] identifier_list是一个逗号分隔的列表,包含0个或多个来自所在函数的变量,这些变量采用引用捕获方式,且变量名字前必须使用&。任何隐式捕获的变量都采用值方式捕获","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"装饰器--python","slug":"装饰器-python","date":"2019-01-03T18:39:32.000Z","updated":"2019-01-03T18:39:32.000Z","comments":true,"path":"2019/01/03/装饰器-python/","permalink":"https://yeshan333.github.io/2019/01/03/%E8%A3%85%E9%A5%B0%E5%99%A8-python/","excerpt":"python装饰器回顾返回函数","text":"python装饰器回顾返回函数 什么是装饰器 python装饰器就是用于拓展原来函数功能的一种函数,目的是在不改变原函数定义的情况下,给函数增加新的功能。这个函数的特殊之处在于它的返回值也是一个函数,这个函数是内嵌“原”函数的函数 在代码运行期间动态的增加功能装饰器(decorator)是修改其它函数功能的函数,是返回函数的高阶函数 demo12345678910111213141516171819202122232425# -*- coding: utf-8 -*-'''- 这是一个decorator- 使用一个函数作为参数- 它返回一个函数'''def a_new_decorator(a_func): def wrapTheFunction(): print("I am doing some boring work before executing a_func()") a_func() print("I am doing some boring work after executing a_func()") return wrapTheFunction''''''- 使用a_new_decorator装饰a_function_requiring_decoration- @a_new_decorator 等价于 a_function_requiring_decoration = a_new_decorator(a_function_requiring_decoration)''''''@a_new_decoratordef a_function_requiring_decoration(): print("I am the function which needs some decoration remove my foul smell")a_function_requiring_decoration() 运行结果 @a_new_decorator 等价于 a_function_requiring_decoration = a_new_decorator(a_function_requiring_decoration) 下面这段程序和上面那段等价 1234567891011121314151617181920212223242526# -*- coding: utf-8 -*-def a_new_decorator(a_func): def wrapTheFunction(): print("I am doing some boring work before executing a_func()") a_func() print("I am doing some boring work after executing a_func()") return wrapTheFunctiondef a_function_requiring_decoration(): print("I am the function which needs some decoration to remove my foul smell")#a_function_requiring_decoration()#outputs: "I am the function which needs some decoration to remove my foul smell"a_function_requiring_decoration = a_new_decorator(a_function_requiring_decoration)#now a_function_requiring_decoration is wrapped by wrapTheFunction()a_function_requiring_decoration()#outputs:I am doing some boring work before executing a_func()# I am the function which needs some decoration to remove my foul smell# I am doing some boring work after executing a_func() 应用:日志打印 在wrap函数内,首先打印日志,再调用原始函数*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict PS对于上面的demo >>>print(a_function_requiring_decoration.__name__) #输出结果为 wrapTheFunction 明显不是我们想要的,我们函数的名字和注释文档被重写了预期应该为 a_function_requiring_decoration 使用functools.warps可以解决这个问题 上面的demo应该这样写 参考 http://www.runoob.com/w3cnote/python-func-decorators.html https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000 https://eastlakeside.gitbooks.io/interpy-zh/content/decorators/ https://www.cnblogs.com/yuzhanhong/p/9180212.html","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"博客搭建参考汇总","slug":"博客搭建参考汇总","date":"2019-01-01T21:20:28.000Z","updated":"2019-01-01T21:20:28.000Z","comments":true,"path":"2019/01/01/博客搭建参考汇总/","permalink":"https://yeshan333.github.io/2019/01/01/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E5%8F%82%E8%80%83%E6%B1%87%E6%80%BB/","excerpt":"","text":"以下是我搭建博客参考的一些教程 hexo博客搭建教程https://blog.csdn.net/gdutxiaoxu/article/details/53576018 https://m.w3cschool.cn/hexo_blog/hexo_blog-tvpu244e.html https://www.cnblogs.com/jackyroc/p/7681938.html https://blog.csdn.net/u010820857/article/details/82027535 Yilia主题配置https://github.com/litten/hexo-theme-yilia https://www.jianshu.com/p/517263426abd 404公益页面http://www.qq.com/404/ https://blog.csdn.net/liu1340308350/article/details/81744824 使用valine评论https://panjunwen.com/diy-a-comment-system/ https://www.xxwhite.com/2017/Valine.html valine头像https://en.gravatar.com/emails?auto-applied=1 版权设置https://blog.zscself.com/2017/01/25/ee4d9ecb/ http://tc9011.com/2017/02/02/hexo%E6%96%87%E7%AB%A0%E6%B7%BB%E5%8A%A0%E7%89%88%E6%9D%83%E5%A3%B0%E6%98%8E%E5%8F%8A%E4%B8%80%E4%BA%9B%E7%89%B9%E6%95%88/ 访问量统计https://blog.csdn.net/qq_40910541/article/details/80659193 https://blog.csdn.net/zxlvxj/article/details/77720934 https://ruider.github.io/2018/06/11/%E6%B7%BB%E5%8A%A0hexo-yilia%E4%B8%BB%E9%A2%98%E7%9A%84%E8%AE%BF%E9%97%AE%E6%95%B0%E9%87%8F/ http://easydo.work/2017/10/26/hexo-yilia-page-view.html 域名绑定https://blog.csdn.net/yucicheung/article/details/79560027 https://www.jianshu.com/p/d92ea8542673?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq 添加目录https://blog.csdn.net/u013082989/article/details/70212008 http://lawlite.me/2017/04/17/Hexo-yilia%E4%B8%BB%E9%A2%98%E5%AE%9E%E7%8E%B0%E6%96%87%E7%AB%A0%E7%9B%AE%E5%BD%95%E5%92%8C%E6%B7%BB%E5%8A%A0%E8%A7%86%E9%A2%91/","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"2019你好","slug":"2019你好","date":"2019-01-01T00:00:00.000Z","updated":"2019-01-01T00:00:00.000Z","comments":true,"path":"2019/01/01/2019你好/","permalink":"https://yeshan333.github.io/2019/01/01/2019%E4%BD%A0%E5%A5%BD/","excerpt":"","text":"","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"致敬2018","slug":"致敬2018","date":"2018-12-31T16:20:16.000Z","updated":"2018-12-31T16:20:16.000Z","comments":true,"path":"2018/12/31/致敬2018/","permalink":"https://yeshan333.github.io/2018/12/31/%E8%87%B4%E6%95%AC2018/","excerpt":"","text":"博客 2018 使用的图床(imgur)已挂掉,大部分 2018 年的文章配的图需要使用 proxy 才能看到","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"基于Typecho搭建个人博客","slug":"memory","date":"2018-12-31T12:40:34.000Z","updated":"2018-12-31T12:40:34.000Z","comments":true,"path":"2018/12/31/memory/","permalink":"https://yeshan333.github.io/2018/12/31/memory/","excerpt":"","text":"**本页图片已挂,需跨越 G-F?W ** 搭建依托于我的个人服务器的博客emmm。。。 2018年12月24日0点10分,忽然觉得无聊,打开某云,手一贱租了台云服务器(233~~~~)。嗯,既然都租了,那就再来个博客吧。 基于typecho搭建的个人博客宝塔面板安装1yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh 网站搭建点击添加,创建网站 嗯,接下来访问自己域名(公网ip地址),看看是否创建成功 接下来配置伪静态规则 嗯,接下来搭建博客,这里使用宝塔后台无脑安装(不好意思,我太菜),还是用命令行操作吧 记得填写常用邮箱、管理员名和密码 http://typecho.org/download 嗯,接下来访问自己的域名就ok了 emm,是不是少了什么,SSL证书没有,少了小绿锁 那就去申请吧 站点管理,设置 因为我的web服务器是nigix","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"线性表的链式存储-单链表","slug":"线性表的链式存储-单链表","date":"2018-12-15T00:28:59.000Z","updated":"2018-12-15T00:28:59.000Z","comments":true,"path":"2018/12/15/线性表的链式存储-单链表/","permalink":"https://yeshan333.github.io/2018/12/15/%E7%BA%BF%E6%80%A7%E8%A1%A8%E7%9A%84%E9%93%BE%E5%BC%8F%E5%AD%98%E5%82%A8-%E5%8D%95%E9%93%BE%E8%A1%A8/","excerpt":"单链表操作 单链表的创建(尾插法、头插法) 单链表的查找操作 单链表的删除操作 单链表的逆置操作(使用头插法) 单链表表长的计算 打印单链表","text":"单链表操作 单链表的创建(尾插法、头插法) 单链表的查找操作 单链表的删除操作 单链表的逆置操作(使用头插法) 单链表表长的计算 打印单链表 单链表的创建头插法12345678910111213141516forward_list* creat_3() //头插法{ forward_list *head,*s; int num; head = NULL;//链表初始状态为空 while(scanf("%d",&num) && num) { s = (forward_list*)malloc(sizeof(forward_list)); s->data = num; s->next = head; head = s;//将新结点插入到表头 } return head;} 尾插法(不含头结点)1234567891011121314151617181920212223//尾插法建表forward_list* creat_1(){ forward_list *head=NULL;//头指针,初始状态为空 forward_list *rear=NULL;//尾指针,初始状态为空 int num; forward_list *s; while(scanf("%d",&num) == 1 && num)//输入0结束 { s = (forward_list*)malloc(sizeof(forward_list)); s->data = num; if(head == NULL)//将新节点加入空表 head = s; else //原表非空,将新节点链接到表尾之后 rear->next = s; rear = s;//尾指针指向新的表尾 } if(rear!= NULL)//对于非空表,将尾结点的下一个结点置空 rear->next = NULL; return head;} 尾插法(含头结点)12345678910111213141516171819202122//尾插法建表,包含头结点forward_list* creat_2(){ forward_list *s; forward_list *head, *rear; int num; head = (forward_list*)malloc(sizeof(forward_list)); rear = head; while(scanf("%d",&num)==1 && num) { s = (forward_list*)malloc(sizeof(forward_list)); s->data = num; rear->next = s; rear = s;//表指针指向新的表尾 } rear->next = NULL; return head;} 单链表的查找操作按值查找123456789101112131415void search_1(forward_list *s, int x){ forward_list *p; p = s; while(p != NULL) { if(p->data == x) { printf("\\nthe value : %d is exist !\\n",x); return ; } p = p->next; } printf("\\nthe value : %d is not fonud !\\n",x);} 按值查找(包含头结点)123456789101112131415void search_2(forward_list *s, int x)//带头节点{ forward_list *p; p = s->next;//emmmm while(p != NULL) { if(p->data == x) { printf("\\nthe value : %d is exist !\\n",x); return ; } p = p->next; } printf("\\nthe value : %d is not fonud !\\n",x);} 单链表的删除操作按给定结点的位置删除(带头结点)1234567891011121314151617181920void delete_1(forward_list *head,int i) //删除第i个节点(单链表包含头节点){ int j=0; forward_list *p,*q; p=head; j=0; while((p->next!=NULL)&&(j<i-1)) { p=p->next; j++; } if(p->next!=NULL) { q=p->next; p->next=p->next->next; free(q); } else printf("illegal delete position,delete failed!");} 按照指定值删除结点(不带头结点)123456789101112131415161718192021222324void forward_list_delete_1(forward_list *s,int x)//删除链表(不带头节点)中指定值的元素{ forward_list *p; forward_list *temp;//用来存放被删除元素的前一个结点 p = s; if(x == p->data) free(p); temp = p; p = p->next; while(p != NULL) { if(p->data == x) { temp->next = p->next; free(p); return ; } temp = p; p = p->next; } printf("\\n你要删除的元素 %d 不在表中\\n",x); return ;} 单链表的逆置头插法逆置(带头结点)12345678910111213void reverse_2(forward_list *head)//头插法逆置,带头节点{ forward_list *p,*q; p=head->next; head->next=NULL; while(p) { q=p; p=p->next; q->next=head->next; head->next=q; }} 计算单链表的表长*** 带头结点 *** 1234567891011void list_length_2(forward_list *s){ int count; forward_list *p=s->next; while(p) { count++; p = p->next; } printf("\\nlist length: %d\\n",count);} *** 不带头结点 *** 1234567891011void list_length_1(forward_list *s){ int count; forward_list *p=s; while(p) { count++; p = p->next; } printf("\\nlist length: %d\\n",count);} 打印单链表*** 带头结点 *** 1234567891011void print_forward_list_2(forward_list *s)//打印含头节点的单链表{ forward_list *p; p = s->next;//因为含有头节点,head->data的数据域的数据未知 while(p != NULL) { printf("%-3d",p->data); p = p->next; } return ;} *** 不带头结点 *** 1234567891011void print_forward_list_1(forward_list *s)//打印单链表{ forward_list *p; p = s; while(p != NULL) { printf("%4d",p->data); p = p->next; } return ;} 试试源程序123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311#include<stdio.h>#include<malloc.h>#include<stdlib.h>//定义单链表结点类型typedef struct node{ int data; //结点数据域 struct node *next; //结点指针域}forward_list;//尾插法建表forward_list* creat_1(){ forward_list *head=NULL;//头指针,初始状态为空 forward_list *rear=NULL;//尾指针,初始状态为空 int num; forward_list *s; while(scanf("%d",&num) == 1 && num)//输入0结束 { s = (forward_list*)malloc(sizeof(forward_list)); s->data = num; if(head == NULL)//将新节点加入空表 head = s; else //原表非空,将新节点链接到表尾之后 rear->next = s; rear = s;//尾指针指向新的表尾 } if(rear!= NULL)//对于非空表,将尾结点的下一个结点置空 rear->next = NULL; return head;}//尾插法建表,包含头结点forward_list* creat_2(){ forward_list *s; forward_list *head, *rear; int num; head = (forward_list*)malloc(sizeof(forward_list)); rear = head; while(scanf("%d",&num)==1 && num) { s = (forward_list*)malloc(sizeof(forward_list)); s->data = num; rear->next = s; rear = s;//表指针指向新的表尾 } rear->next = NULL; return head;}forward_list* creat_3() //头插法{ forward_list *head,*s; int num; head = NULL;//链表初始状态为空 while(scanf("%d",&num) && num) { s = (forward_list*)malloc(sizeof(forward_list)); s->data = num; s->next = head; head = s;//将新结点插入到表头 } return head;}void search_1(forward_list *s, int x){ forward_list *p; p = s; while(p != NULL) { if(p->data == x) { printf("\\nthe value : %d is exist !\\n",x); return ; } p = p->next; } printf("\\nthe value : %d is not fonud !\\n",x);}void search_2(forward_list *s, int x)//带头节点{ forward_list *p; p = s->next;//emmmm while(p != NULL) { if(p->data == x) { printf("\\nthe value : %d is exist !\\n",x); return ; } p = p->next; } printf("\\nthe value : %d is not fonud !\\n",x);}void reverse_1(forward_list *head)//头插法逆置单链表{ forward_list *p; forward_list *temp; p = head;//存好之前的单链表 //printf("\\n%d\\n",p->data); head->next = NULL; while(p) { temp = p; //printf("1"); p = p->next; temp->next = head->next; head = temp; printf("\\n%d\\n",head->data); }}void reverse_2(forward_list *head)//头插法逆置,带头节点{ forward_list *p,*q; p=head->next; head->next=NULL; while(p) { q=p; p=p->next; q->next=head->next; head->next=q; }}void forward_list_delete_1(forward_list *s,int x)//删除链表(不带头节点)中指定值的元素{ forward_list *p; forward_list *temp;//用来存放被删除元素的前一个结点 p = s; if(x == p->data) free(p); temp = p; p = p->next; while(p != NULL) { if(p->data == x) { temp->next = p->next; free(p); return ; } temp = p; p = p->next; } printf("\\n你要删除的元素 %d 不在表中\\n",x); return ;}void delete_1(forward_list *head,int i) //删除第i个节点(单链表包含头节点){ int j=0; forward_list *p,*q; p=head; j=0; while((p->next!=NULL)&&(j<i-1)) { p=p->next; j++; } if(p->next!=NULL) { q=p->next; p->next=p->next->next; free(q); } else printf("illegal delete position,delete failed!");}/*//不对void list_delete(forward_list *s, int i)//删除单链表(不带头节点)的第i个结点{ int count=1; forward_list *p,*q; p=s; //将p移动到被删除结点的前一个结点 while((p!=NULL)&&(count<i-1)) { p=p->next; count++; } if(i == count) { q = p; p = p->next; free(q); return ; } if(p->next!=NULL) { q=p->next; p->next=p->next->next; free(q); } else printf("illegal delete position,delete failed!");}*/void list_length_1(forward_list *s){ int count; forward_list *p=s; while(p) { count++; p = p->next; } printf("\\nlist length: %d\\n",count);}void list_length_2(forward_list *s){ int count; forward_list *p=s->next; while(p) { count++; p = p->next; } printf("\\nlist length: %d\\n",count);}void print_forward_list_1(forward_list *s)//打印单链表{ forward_list *p; p = s; while(p != NULL) { printf("%4d",p->data); p = p->next; } return ;}void print_forward_list_2(forward_list *s)//打印含头节点的单链表{ forward_list *p; p = s->next;//因为含有头节点,head->data的数据域的数据未知 while(p != NULL) { printf("%-3d",p->data); p = p->next; } return ;}int main(){ /*不带头结点的单链表*/ printf("使用不带头结点的单链表:\\n"); forward_list *p; printf("尾插法建表:\\n"); p = creat_1();//尾插法建表 print_forward_list_1(p); list_length_1(p); //查找是否存在值为6的结点 search_1(p,6); printf("\\n删了个5后,表变为\\n"); forward_list_delete_1(p,5); print_forward_list_1(p); //头插法建表 forward_list *s; printf("\\n头插法建表:\\n"); s = creat_3(); print_forward_list_1(s); list_length_1(s); /*带头结点的单链表*/ printf("\\n\\n使用带头结点的单链表:\\n"); forward_list *t; t = creat_2(); print_forward_list_2(t); search_2(t,6); list_length_2(t); printf("\\n逆置:\\n"); reverse_2(t); print_forward_list_2(t); list_length_2(t); return 0;} 运行结果","categories":[{"name":"数据结构","slug":"数据结构","permalink":"https://yeshan333.github.io/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"}],"tags":[{"name":"C","slug":"C","permalink":"https://yeshan333.github.io/tags/C/"},{"name":"数据结构","slug":"数据结构","permalink":"https://yeshan333.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"}]},{"title":"线性表之顺序存储-顺序表","slug":"线性表之顺序存储-顺序表","date":"2018-12-14T12:14:59.000Z","updated":"2018-12-14T12:14:59.000Z","comments":true,"path":"2018/12/14/线性表之顺序存储-顺序表/","permalink":"https://yeshan333.github.io/2018/12/14/%E7%BA%BF%E6%80%A7%E8%A1%A8%E4%B9%8B%E9%A1%BA%E5%BA%8F%E5%AD%98%E5%82%A8-%E9%A1%BA%E5%BA%8F%E8%A1%A8/","excerpt":"顺序表的操作 向有序顺序表插入一个元素 顺序表的冒泡排序 顺序表的删除操作 顺序表中元素的查找 顺序表的逆置 删除顺序表中的相同元素 向顺序表的指定位置插入元素 打印顺序表","text":"顺序表的操作 向有序顺序表插入一个元素 顺序表的冒泡排序 顺序表的删除操作 顺序表中元素的查找 顺序表的逆置 删除顺序表中的相同元素 向顺序表的指定位置插入元素 打印顺序表 顺序表的存储结构1234567#define maxsize 100 //存储空间的分配量//定义顺序表数据类型typedef struct{ int data[maxsize]; int last; //存放表中最后一个元素的下标}sequenlist; 顺序表的冒泡排序1234567891011121314151617void list_bubble_sort(sequenlist *p)//max to min{ int i,j; int temp; for(i=0; i< p->last; i++)//attention { for(j=0; j< p->last-i; j++) { if(p->data[j] < p->data[j+1]) { temp = p->data[j]; p->data[j] = p->data[j+1]; p->data[j+1] = temp; } } }} 顺序表的删除操作12345678910111213141516171819nt delete_1(sequenlist *s,int del) //删除函数{ int temp; for(int i=0; i <= s->last; i++) { if(del == s->data[i]) { temp = i; for(int j=i; j<s->last; j++) { s->data[j] = s->data[j+1]; } s->last = s->last - 1; return 0;//删除第一个与del相同的元素,函数结束 } } //要删的那个元素不在表中 printf("the element you want to delete is not in the sequenlist!\\n");} 顺序表中元素的查找12345678910111213int search(sequenlist *s,int key) //查找函数{ for(int i=0; i<= s->last; i++) { if(key == s->data[i]) { printf("exist !\\n"); return 0; } } printf("not found !\\n"); return 0;} 顺序表的逆置12345678910111213void reverse(sequenlist *s)//逆置函数{ int i,j; int temp; int last_temp = s->last; for(i=0; i<= s->last/2; i++) { temp = s->data[i]; s->data[i] = s->data[last_temp]; s->data[last_temp] = temp; last_temp--; }} 删除顺序表中的相同元素12345678910111213141516171819void delete_same(sequenlist *s)//删除表中相同的元素{ int i,j; int temp; for(i=0; i<=s->last; i++) { for(j=1; j<=s->last; j++) { if(s->data[j] == s->data[i])//元素相同 { for(int k=j; k<s->last; k++) { s->data[k] = s->data[k+1]; } s->last = s->last - 1; } } }} 向顺序表的指定位置插入元素123456789101112131415161718192021222324252627int insert(sequenlist *L,int i,int x) //指定位置,插入{ int j; if(((*L).last) >= maxsize-1) { printf("the list is overflow!\\n"); return (0); } else { if((i<1)||(i>(*L).last+2)) { printf("position is not correct!\\n"); return (0); } else { for(j=(*L).last;j>=i-1;j--) { (*L).data[j+1]=(*L).data[j]; } (*L).last=(*L).last+1; (*L).data[i-1]=x; return (0); } }} 向顺序表的指定位置插入元素123456789101112131415161718192021222324252627int insert(sequenlist *L,int i,int x) //指定位置,插入{ int j; if(((*L).last) >= maxsize-1) { printf("the list is overflow!\\n"); return (0); } else { if((i<1)||(i>(*L).last+2)) { printf("position is not correct!\\n"); return (0); } else { for(j=(*L).last;j>=i-1;j--) { (*L).data[j+1]=(*L).data[j]; } (*L).last=(*L).last+1; (*L).data[i-1]=x; return (0); } }} 打印顺序表12345678void print_list(sequenlist *s) //打印顺序表{ int i; for(i=0; i<=s->last; i++) { printf("%3d",s->data[i]); }} 试着煲下汤123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247/** author: shansan.top* date: 2018/12/12* version: 1.0*/#include<stdio.h>#define maxsize 100//定义顺序表数据类型typedef struct{ int data[maxsize]; int last;}sequenlist;int search(sequenlist *s,int key) //查找函数{ for(int i=0; i<= s->last; i++) { if(key == s->data[i]) { printf("exist !\\n"); return 0; } } printf("not found !\\n"); return 0;}int delete_1(sequenlist *s,int del) //删除函数{ int temp; for(int i=0; i <= s->last; i++) { if(del == s->data[i]) { temp = i; for(int j=i; j<s->last; j++) { s->data[j] = s->data[j+1]; } s->last = s->last - 1; return 0;//删除第一个与del相同的元素,函数结束 } } //要删的那个元素不在表中 printf("the element you want to delete is not in the sequenlist!\\n");}void print_list(sequenlist *s) //打印顺序表{ int i; for(i=0; i<=s->last; i++) { printf("%3d",s->data[i]); }}void reverse(sequenlist *s)//逆置函数{ int i,j; int temp; int last_temp = s->last; for(i=0; i<= s->last/2; i++) { temp = s->data[i]; s->data[i] = s->data[last_temp]; s->data[last_temp] = temp; last_temp--; }}void list_bubble_sort(sequenlist *p)//max to min{ int i,j; int temp; for(i=0; i< p->last; i++)//attention { for(j=0; j< p->last-i; j++) { if(p->data[j] < p->data[j+1]) { temp = p->data[j]; p->data[j] = p->data[j+1]; p->data[j+1] = temp; } } }}void insert_in_order_list(sequenlist *s,int value)//有序表中插入元素{ int i,j; int count=0; //int temp = s->last+1; for(i=0; i<=s->last; i++) { count++; if( value <= s->data[i]) { s->last = s->last + 1; for(j=s->last; j>i; j--) { s->data[j] = s->data[j-1]; } s->data[i] = value; return ;//结束函数 } } //printf("i=%d",i); //printf("s->last=%d\\n",s->last); if(i > s->last-1) { s->last = s->last + 1; s->data[s->last] = value; }}int insert(sequenlist *L,int i,int x) //指定位置,插入{ int j; if(((*L).last) >= maxsize-1) { printf("the list is overflow!\\n"); return (0); } else { if((i<1)||(i>(*L).last+2)) { printf("position is not correct!\\n"); return (0); } else { for(j=(*L).last;j>=i-1;j--) { (*L).data[j+1]=(*L).data[j]; } (*L).last=(*L).last+1; (*L).data[i-1]=x; return (0); } }}void delete_same(sequenlist *s)//删除表中相同的元素{ int i,j; int temp; for(i=0; i<=s->last; i++) { for(j=1; j<=s->last; j++) { if(s->data[j] == s->data[i])//元素相同 { for(int k=j; k<s->last; k++) { s->data[k] = s->data[k+1]; } s->last = s->last - 1; } } }}int main(){ sequenlist p={{1,3,2,6,5,4,9,7,8},8}; //这里有9个数,但数组下表是从0开始的,所以 p.last = 8 print_list(&p); printf("\\n"); //查找 printf("please input a value which you want: "); int value;//C++语法可以临时定义一个变量,C语言不可以(需放在开头)。 scanf("%d",&value); //search(&p,10); search(&p,value); print_list(&p); printf("\\n\\n"); //删除表中的指定元素 delete_1(&p,8); printf("after delete:\\n"); print_list(&p); //逆置顺序表 printf("\\n\\nafter reverse:\\n"); reverse(&p); print_list(&p); //冒泡排序 printf("\\nafter sort:\\n"); printf("\\n"); //list_bubble_sort(&try_1); list_bubble_sort(&p); print_list(&p); //往有序顺序表中插入一个元素 printf("\\n\\n"); sequenlist try_1 = {{1,2,3,5,6,7},5}; print_list(&try_1); printf("\\n"); printf("please input the value that you wan to insert into the sequenlist: "); int data; scanf("%d",&data); insert_in_order_list(&try_1,data); //insert_in_order_list(&try_1,9); print_list(&try_1); //删除表中相同的元素 printf("\\n\\n"); sequenlist try_2= {{1,1,2,2,3,3,4,4},7}; print_list(&try_2); printf("\\ndelete the same element:\\n"); delete_same(&try_2); print_list(&try_2); printf("\\n"); //另一种玩法 int n; int i; printf("\\nplease input the number of elements: "); scanf("%d",&n); printf("please input %d values:\\n",n); sequenlist try_3; try_3.last = n-1;//注意,数组的小标从0开始 for(i=0; i<=try_3.last; i++) { scanf("%d",&try_3.data[i]); } print_list(&try_3); printf("\\n\\n"); //在指定位置插入 insert(&try_3,1,22); print_list(&try_3); return 0;} 程序运行结果","categories":[{"name":"数据结构","slug":"数据结构","permalink":"https://yeshan333.github.io/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"}],"tags":[{"name":"C","slug":"C","permalink":"https://yeshan333.github.io/tags/C/"},{"name":"数据结构","slug":"数据结构","permalink":"https://yeshan333.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"}]},{"title":"勿忘国耻,吾辈自强!","slug":"勿忘国耻,吾辈自强!","date":"2018-12-13T00:17:58.000Z","updated":"2018-12-13T00:17:58.000Z","comments":true,"path":"2018/12/13/勿忘国耻,吾辈自强!/","permalink":"https://yeshan333.github.io/2018/12/13/%E5%8B%BF%E5%BF%98%E5%9B%BD%E8%80%BB%EF%BC%8C%E5%90%BE%E8%BE%88%E8%87%AA%E5%BC%BA%EF%BC%81/","excerpt":"","text":"","categories":[{"name":"Memory","slug":"Memory","permalink":"https://yeshan333.github.io/categories/Memory/"}],"tags":[{"name":"Memory","slug":"Memory","permalink":"https://yeshan333.github.io/tags/Memory/"}]},{"title":"Biu一下GDB","slug":"biu一下GDB","date":"2018-12-03T23:51:52.000Z","updated":"2018-12-03T23:51:52.000Z","comments":true,"path":"2018/12/03/biu一下GDB/","permalink":"https://yeshan333.github.io/2018/12/03/biu%E4%B8%80%E4%B8%8BGDB/","excerpt":"gcc常见编译选项 ** -c **:只激活预处理、编译和汇编,也就是生成obj文件 ** -S **:只激活处理和编译,把文件编译成汇编代码 ** -o **:定制目标名称,缺省的时候编译出来的可执行程序名为a.exe(windows)或a.out(linux) ** -Wall **:打开一些很有用的编译警告 ** -std **:指定C标准,如-std=99,使用C99标准 ** -g **:指示编译器,编译的时候添加调试信息 ** -O0 -O1 -O2 -O3 **:编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高","text":"gcc常见编译选项 ** -c **:只激活预处理、编译和汇编,也就是生成obj文件 ** -S **:只激活处理和编译,把文件编译成汇编代码 ** -o **:定制目标名称,缺省的时候编译出来的可执行程序名为a.exe(windows)或a.out(linux) ** -Wall **:打开一些很有用的编译警告 ** -std **:指定C标准,如-std=99,使用C99标准 ** -g **:指示编译器,编译的时候添加调试信息 ** -O0 -O1 -O2 -O3 **:编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高 1234567891011121314151617181920/*file_name: swap.c*/#include<stdio.h>void swap(int a, int b){ int t; t = a; a = b; b = t;}int main(){ int a=3, b=4; swap(a,b); printf("%d %d",a,b); return 0;} GDB的使用 什么是GDBhttps://www.bing.com/knows/search?q=gdb&mkt=zh-cn&FORM=BKACAIhttp://www.gnu.org/software/gdb/ 一般来说,GDB主要帮助你完成以下四个方面的内容1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序2、可以让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事4、你可以改变你的程序,将一个BUG产生的影响修正,从而测试其他BUG GDB常见命令 简称 全称 备注 l list 显示指定行号或者指定函数附近的源代码 b break 在指定行号或指定函数开头设置断点 r run 运行程序,直到程序结束或遇到断点 c continue 在程序中断后继续执行程序,直到程序结束或遇到断点停下。注意在程序开始执行前只能用r,而不能用c n next 执行一条语句。如果有函数调用,则把它当做一个整体 s step 执行一条语句。如果有函数调用,则进入函数内部 u until 执行到指定行号或指定函数的开头 p print 显示变量或表达式的值 disp display 把一个表达式设置为display,当程序每次停下来时都会显示其值 cl clear 取消断点,和b格式相同,如果该位置有多个断点,将同时取消 i info 显示各种信息,如i b显示所有断点,i disp显示display,而i lo显示所有局部变量 bt backtrace 打印所有栈帧信息 调用栈(Call Stack)调用栈描述的是函数之间的调用关系。调用栈由栈帧(Stack Frame)组成,每个栈帧对应着一个未运行完的函数。在GDB中可以用backtrace(简称bt)命令打印所有栈帧信息。若要用p命令打印一个非当前栈帧的局部变量,可以用frame命令选择另一个栈帧 拿个程序来玩玩,swap.c文件1234567891011#include<stdio.h>void swap(int a, int b){ int t;t = a;a = b;b = t;}int main(){ int a=3, b=4; swap(a,b); printf("%d %d",a,b); return 0;} *** 程序的目的是交换a和b的值,然而并没有交换交换成功 *** 原因: 函数的形参和在函数内部声明的变量都是该函数的局部变量。无法访问其他函数的局部变量。 局部变量的存储空间是临时分配的,函数执行完毕时,局部变量的空间将被释放,其中的值无法保留到下次使用。 如果要实现真正的交换,我们应该传入的是存储变量的地址,此时函数swap的形参类型应该为指针类型 PS:C语言的变量都是放在内存中的,而内存中间的每一个字节都有一个称为地址(address)的编号。每一个变量都占有一定数目的字节(可以用sizeof运算符获得),其中第一个字节的地址称为变量的地址。 o(*≧▽≦)ツ┏━┓拿个递归程序来玩玩1234567891011#include<stdio.h>int f(int n){ return n == 0 ? 1 : f(n-1)*n;}int main(){ printf("%d\\n",f(3)); return 0;} 在C语言的函数中,调用自己和调用其他函数没有任何本质区别,都是建立新栈帧,传递参数并修改当前代码行。在函数执行体完毕后删除栈帧,处理返回值,并修改当前代码行数。 以上调用栈的一个比喻 皇帝(拥有main函数的栈帧):大臣,你给我算下f(3)大臣(拥有f(3)的栈帧):知府,你给我算下f(2)知府(拥有f(2)的栈帧):县令,你给我算下f(1)县令(拥有f(1)的栈帧):师爷,你给我算下f(0)师爷(拥有f(0)的栈帧):回老爷,f(0)=1县令(心算f(1)=f(0)*1=1):回知府大人,f(1)=1知府(心算f(2)=f(1)*2=2):回大人,f(2)=2大臣(心算f(3)=f(2)*3=6):回皇上,f(3)=6皇上满意了 emmmmmm。。。。。。。。。。。。","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"GDB","slug":"GDB","permalink":"https://yeshan333.github.io/tags/GDB/"}]},{"title":"标准库容器","slug":"标准库容器","date":"2018-12-01T17:45:46.000Z","updated":"2018-12-01T17:45:46.000Z","comments":true,"path":"2018/12/01/标准库容器/","permalink":"https://yeshan333.github.io/2018/12/01/%E6%A0%87%E5%87%86%E5%BA%93%E5%AE%B9%E5%99%A8/","excerpt":"","text":"标准库容器是模板类型,用来保存给定类型的对象。一个容器就是一些特定类型对象的集合。 顺序容器 顺序容器我们提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器时的位置对应。 一般来说,每个容器都定义在一个都文件中 顺序元素几乎可以保存任意类型的元素 顺序容器类型 说明 vector 可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢 array 固定大小数组,支持快速随机访问,不能添加或删除元素 string 与vector相似的容器,但专门用于保存字符。随机访问块。在尾部插入或删除快 deque 双端队列。支持快速随机访问。在头尾位置插入或删除速度很快 list 双向链表。只支持双向顺序访问,在list中任何位置进行插入或删除操作的速度都很快 forward_list 单向链表。只支持单向顺序访问,在链表的任何位置进行插入或删除操作的速度都很快 forward_list、array是新C++标准增加的类型与内置数组相比,array是一种更安全、更容易使用的数组类型。array对象的大小不是固定的,因此,他支持插入和删除元素以及改变容器大小的操作 容器类型成员每个容器都定义了多个类型 类型别名 说明 iterator 容器的迭代器类型成员 const_iterator 可以读取元素,但不能修改元素的迭代器类型 size_type 无符号整数类型,足够保存此种容器类型最大可能容器的大小 differrnce_type 带符号整数类型,足够保存两个迭代器之间的距离 value_type 元素类型 reference_type 元素左值类型,与value_type&含义相同 const_reference 元素的const左值类型,(即const value_type&) ** 通过类型别名,我们可以在不了解容器中元素类型的情况下使用它 ** 为了使用这些类型,我们必须显示的使用其类型名 vector::iterator iter;//iter是通过vector定义的迭代器类型 容器的begin成员和end成员begin成员生成一个指向容器中第一个元素位置的迭代器end成员生成指向尾元素之后的位置的迭代器 容器定义和初始化 每个容器都定义了一个默认的构造函数。容器的默认的构造函数都会创建一个指定类型的空容器,他们都可以接受指定容器大小和元素初始值的参数 由于array是固定大小的数组。定义一个array时,除了制定元素类型外,还要指定容器的大小 创建一个容器为另一个容器的拷贝时,两个容器的类型以及元素的类型必须相同 当传递迭代器参数来拷贝一个范围时,不要求容器的类型必须相同,且新容器和原容器的元素类型也可以不同,只要能将要拷贝的元素的类型转换为要初始化的容器的元素类型即可 定义&初始化方式 说明 C a 默认构造函数,如果C是一个array,则a中元素按默认方式初始化,否则a为空 C a(b)C a=b a初始化为b的拷贝。**a和b必须是相同的类型(它们必须是相同的容器类型,且保存的是相同的元素类型)**,对于array我们还要定义它的大小 C a{b,c,d,e,f,…}C a={b,c,d,e,f,…} a初始化为初始化列表中元素的拷贝。列表中的元素类型必须与a的元素类型相容。对于array来说,列表元素的数目必须小于或等于array的大小,任何遗漏的元素直接进行值初始化 C a(b_iterator,c_iterator) a初始化为迭代器b_iterator和c_iterator指定范围中元素的拷贝,范围中元素的类型必须与a的元素类型相容 C a(n) a包含n个元素,这些元素进行了值初始化,此构造函数explicit的,string和array不适用 C a(n,value) a包含n个初始化为值value的元素 123456789101112131415161718192021222324252627#include<iostream>#include<vector>#include<list>#include<forward_list>using namespace std;int main(){ list<string> svec(10,"shan"); for(auto i:svec) { cout<<i<<endl; } //vector<string> vec = svec;//#错误,容器类型不匹配 forward_list<string> fvec(svec.begin(),svec.end());//使用迭代器范围进行拷贝初始化 for(auto temp:fvec) { cout<<temp<<endl; } return 0;} 标准库array的使用 定义一个array时,我们要指定元素的类型,还要指定容器的大小 由于大小是array类型的一部分,array不支持不同容器类型的构造函数 对array进行列表初始化的时候,初始值的数目必须等于或小于array的大小 array要求初始值的类型必须要与创建的容器类型相一致 虽然我们不能对内置的数组进行拷贝或对象赋值操作,但是array并无此限制 123456789101112131415161718192021222324252627#include<iostream>#include<array>using namespace std;int main(){ array<int ,10> num_1;//定义了一个保存10个int的数组 for(auto i:num_1) cout<<i<<" "; cout<<endl; array<int ,10> num_2={1,2,3,4,5,6,7,8,9,10}; for(auto i:num_2) cout<<i<<" "; cout<<endl; int d[5]={3,6,9,12,15}; //int b[5]=d; 这是错误的,内置数组不支持拷贝和赋值 array<int ,6> try_1={4,5,6,7,8,9}; array<int ,6> try_2=try_1; for(auto temp:try_2) cout<<temp<<" "; return 0;} 容器操作swap和assign a.swap(b):用于交换两个容器中的元素,两个容器必须具有相同的类型 swap(a,b):用于交换两个相同类型的容器中的元素 a.assign(1_iterator,2_iterator):将a中的元素替换为迭代器1_iterator和2_iterator范围中的元素,迭代器不能指向a中的元素 a.assign(value_list): 将a中的元素初始化为初始化列表value_list中的元素 a.assign(n,value):将a中的元素替换为n个值为value的元素 123456789101112131415161718192021222324252627282930313233343536373839404142#include<iostream>#include<vector>using namespace std;int main(){ vector<int> a={1,2,3,4,5,6}; vector<int> b; b.assign({6,7,8,9,10,11}); cout<<endl; for(auto temp:b) cout<<temp<<" "; cout<<endl; b.assign(a.begin(),a.end()); for(auto temp:b) cout<<temp<<" "; cout<<endl; /* * swap操作交换两个相同类型容器的内容 * assing操作用参数所指定的元素(即拷贝)替换左边容器中的所有元素。 * assign允许我们从不同但相容的类型赋值,或者从一个容器的子序列赋值 * 除了string外,指向容器的迭代器、引用和指针在swap操作后都不会失效 */ vector<int> temp={11,22,33,44,55,66,77,88}; b.swap(temp); cout<<"temp: "; cout<<"size-"<<temp.size()<<" "; for(auto i=temp.begin();i != temp.end();i++) cout<<*i<<" "; cout<<endl; cout<<endl; cout<<"b: "; cout<<"size-"<<b.size()<<" "; for(auto j=b.begin();j != b.end();j++) cout<<*j<<" "; return 0;} 向容器中添加元素(array不支持这些操作)   说明 C.push_back(t)C.emplace_back(args) 在C的尾部创建一个值为t或由args创建的元素。返回void类型 C.push_front(t)C.emplace_front(args) 在C的头部创建一个值为t或由args创建的元素,返回指向新添加的元素的迭代器 C.insert(p_iterator,t)C.emplace(p_iterator,args) 在迭代器p_iterator之前插入一个值为t或由args创建的元素,返回指向新添加的元素的迭代器 C.insert(p_iterator,n,t) 在迭代器p_iterator指向的元素之前插入n个值为t的元素,返回指向新插入的第一个元素的迭代器,若n为0,则返回p_iterator C.insert(p_iterator,a_iterator,b_iterator) 将迭代器a_iterator和b_iterator指定的范围内的元素插入到迭代器p_iterator指向的元素之前,迭代器范围不能指向C中的元素。返回指向第一个新添加的元素的迭代器,若范围为空,则返回p_iterator C.insert(p_iterator,li) 将由花括号括起来的元素值列表li插入待迭代器p_iterator所指的元素之前。返回新添加的第一个元素的迭代器,若列表为空,则返回p_iterator 向一个vector、string或deque中插入元素会使所有指向容器的迭代器、引用和指针失效 记住,insert函数将元素插入到迭代器所指定的位置之前 当我们用一个对象来初始化容器时,或将一个对象插入到容器中的时,实际上放入到容器中的是对象的值的拷贝,而不是对象本身 vector、list、deque、string都支持insert成员,forward_list提供了特殊版本的insert成员 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253#include<iostream>#include<vector>#include<list>using namespace std;void operated_1(){ vector<string> ss{"shansan","wocao","yeshan"}; vector<string> v; for(auto i:ss) v.push_back(i); for(auto temp:v) cout<<temp<<" ";}void operated_2(){ list<int> ls; for(int num=3;num>=0;num--) ls.push_front(num); for(int i=5;i<8;i++) ls.push_back(i); for(auto i=ls.begin();i != ls.end(); i++) cout<<*i<<" ";}void operated_3(){ vector<int> v_1{1,2,3,4,5}; vector<int> v_2{6,7,8,9,10}; v_1.insert(v_1.begin(),66);//在迭代器v_1.begin()所指的元素之前插入一个元素66 for(auto temp: v_1) cout<<temp<<" "; cout<<endl; v_1.insert(v_1.begin(),v_2.begin(),v_2.end()); //在迭代器v_1.begin()所指的元素之前,插入迭代器v_2.begin()到v_2.end()指顶范围内的元素 for(auto temp:v_1) cout<<temp<<" ";}int main(){ operated_1(); cout<<endl; operated_2(); cout<<endl; operated_3(); return 0;} emplace操作 当调用一个insert或push成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中当调用一个emplace函数时,则是将参数传递给元素类型的构造函数。emplace成员直接使用这些参数在容器管理的内存空间中直接构造函数 emplace函数在容器中直接构造函数。传递给emplace函数的参数必须与元素类型的构造函数相匹配 12345678910111213141516171819202122232425262728293031323334#include<iostream>#include<vector>using namespace std;class student{ public: student(string str,int a):name(str),age(a){} void print_1() { cout<<"name: "<<this->name<<","<<"Age: "<<this->age<<endl; } private: int age; string name;};int main(){ vector<student> s;//我们将student存到了vector中 s.emplace_back("shansan",18);//使用student对象的构造函数 auto temp=s.begin(); (*temp).print_1(); cout<<endl; //s.push_back("try",66);//error:没有接受两个参数的push_back版本 s.push_back(student("try",66));//创建一个临时的student对象传递给push_back for(auto i:s) i.print_1(); return 0;} 访问容器中的元素 访问操作 说明 c.back() 返回c中尾元素的引用。若c为空,函数行为未定义 c.front() 返回c中首元素的引用。若c为空,函数行为未定义 c[n] 返回c中下标为n的元素的引用,n是一个无符号整数。若n>=c.size(),则函数行为未定义 c.at(n) 返回下标为n的元素的引用。如果下标越界,则抛出一个out_of_range异常 123456789101112131415161718192021#include<iostream>#include<vector>using namespace std;int main(){ /* * 不要对一个空的容器使用front和back操作 * at和下标操作只适用于string、vector、deque和array * back不适用于forward_list */ vector<int> v{1,6}; int a = v.front(); a=33; cout<<"v[0]="<<v[0]<<endl; int &refer = v.front(); refer =33;//改变了v[0]的值 cout<<"v[0]="<<v[0]; return 0;} 由于访问成员函数的返回值是引用类型,如果是非const的,我们可以使用它来改变元素的值 删除容器中的元素 删除操纵 说明 c.pop_back() 删除c的尾元素,如果c是空的,则函数行为未定义。函数返回void c.pop_front() 删除c的首元素,如果c是空的,则函数行为未定义。函数返回void c.erase(p_iterator) 删除迭代器p_iterator所指定的元素,返回一个指向被删除的元素之后元素的迭代器,若p_iterator指向尾元素,则返回尾后迭代器,若p_iterator是尾后迭代器,则函数行为未定义 c.erase(a_iterator,b_iterator) 删除迭代器a_iterator和b_iterator所指定范围内的元素,返回一个指向最后一个被删元素之后元素的迭代器,若b_iterator本身就是尾后迭代器,则返回尾后迭代器 c.clear() 删除c中所有的元素 删除deque中除首尾位置之外的任何元素都会使迭代器、引用和指针失效。指向vector或string中删除点位置之后的迭代器、引用和指针都会失效 1234567891011121314151617181920212223242526272829303132#include<iostream>#include<vector>#include<list>using namespace std;int main(){ vector<string> str{"shansan","wocao","555"}; for(auto temp:str) cout<<temp<<" "; str.pop_back(); cout<<endl; for(auto temp:str) cout<<temp<<" "; cout<<endl; str.erase(str.begin(),str.end()); for(auto temp:str) cout<<temp<<" "; list<int> lst={0,1,2,3,4,5,6,7,8,9,10}; auto it = lst.begin(); while(it != lst.end()) { if(*it%2) it = lst.erase(it);//删除奇数元素,返回指向被删除元素的下一个元素的迭代器 else it++; } for(auto temp:lst) cout<<temp<<" "; return 0;} 改变容器大小 c.resize(n):调整c的大小为n个元素。若n<c.size(),则多出的元素被丢弃;若必须添加新元素,对新元素进行值初始化 c.resize(n,t):调整c的大小为n个元素,任何新添加的元素都初始化为值t 1234567891011121314151617181920212223242526#include<iostream>#include<vector>#include<deque>using namespace std;int main(){ vector<int> v{22,33,3}; cout<<"v capacity:"<<v.capacity()<<endl; v.resize(6,1); cout<<"v size:"<<v.size()<<endl; cout<<"v capacity:"<<v.capacity()<<endl; for(auto i:v) cout<<i<<" "; /* - 使用reserve操作通知容器应该为我们预留多少空间 - resize成员函数只改变容器中成员函数的数目,不改变容器的容量 - 容器的size操作指的是它已经保存的元素的数目 - capacity则是在不不分配新的内存空间的前提下知道它最多可以保存多少个元素 */ v.reserve(100); cout<<endl<<"v capacity:"<<v.capacity()<<endl; cout<<"v size:"<<v.size()<<endl; return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"Keep on moving !","slug":"Keep-on-moving-!","date":"2018-11-27T00:35:22.000Z","updated":"2018-11-27T00:35:22.000Z","comments":true,"path":"2018/11/27/Keep-on-moving-!/","permalink":"https://yeshan333.github.io/2018/11/27/Keep-on-moving-%EF%BC%81/","excerpt":"","text":"比赛终于完了!又可以安心打代码看书了emmmmmmm","categories":[],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"再探函数","slug":"再探函数","date":"2018-11-22T00:16:21.000Z","updated":"2018-11-22T00:16:21.000Z","comments":true,"path":"2018/11/22/再探函数/","permalink":"https://yeshan333.github.io/2018/11/22/%E5%86%8D%E6%8E%A2%E5%87%BD%E6%95%B0/","excerpt":"main:处理命令行//main函数的两种定义形式 int main(int argc,char **argv[]) int main(int argc,char *argv[]) argc:指的是命令行中输入参数的个数 argv:一个数组,它存储了所有的命令行参数","text":"main:处理命令行//main函数的两种定义形式 int main(int argc,char **argv[]) int main(int argc,char *argv[]) argc:指的是命令行中输入参数的个数 argv:一个数组,它存储了所有的命令行参数 参数使用示例子: 1234567891011121314//file_name:test.cpp//author:shansan#include<iostream>#include<stdio.h>using namespace std;int main(int argc,char **argv){ int i; for(i=0;i<argc;i++) { printf("argv[%d]=%s\\n",i,argv[i]); } return 0;} 含有可变形参的函数initializer_list形参 initializer_list是一种标准库类型,用于表示某种特定类型的值的数组 initializer_list也是一种模板类型 支持size(),begin(),end()等操作 向initializer_list形参中传递一个值的序列,则必须把序列放在花括号中 123456789101112131415161718192021222324252627282930313233#include<iostream>using namespace std;void print_1(initializer_list<string> str){ //遍历实参表列,使用initializer_list对象的成员begin和end进行遍历 cout<<"parameter nums: "<<str.size()<<endl; for(auto temp = str.begin();temp != str.end(); ++temp) { cout<<*temp<<endl; } cout<<endl; //用范围for语句遍历表列 for(auto beg : str) { cout<<beg<<endl; }}int main(){ const string a = "shansan"; string b = "yeshan333"; string c = "wocao"; //向initializer_list形参中传递一个值的序列需放在花括号内部 print_1({a,b,c}); return 0;} 函数返回值—–列表初始化返回值 函数可以返回花括号包围的值的列表 如果函数返回的是内置类型,则花括号包围的列表最多包含一个值,而且该值所占空间不应该大于目标类型的空间 如果函数返回的是类类型,由类本身定义初始值如何使用 1234567891011121314151617181920#include<iostream>#include<vector>using namespace std;vector<string> process(){ return {"shansan","yeshan333"};}int main(){ vector<string> v; v = process(); //遍历vector对象 for(auto temp : v) { cout<<temp<<endl; } return 0;} 调试帮助,预定义跟踪调试编译器为我们定义的 func:存放当前调试函数的名字 FILE:存放文件名的字符串字面值常量 LINE:存放文件当前行号的整型字面值 TIME:存放文件编译时间的字符串字面值常量 DATE:存放文件编译日期的字符串字面值常量","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"IO类型","slug":"IO类型","date":"2018-11-22T00:13:54.000Z","updated":"2018-11-22T00:13:54.000Z","comments":true,"path":"2018/11/22/IO类型/","permalink":"https://yeshan333.github.io/2018/11/22/IO%E7%B1%BB%E5%9E%8B/","excerpt":"IO库** IO库设施: ** istream类型:提供输入操作 ostream类型:提供输出操作 cin:一个istream对象,从标准输入读取数据 cout:一个ostream对象,从标准输出写入数据 cerr:一个ostream对象,通常用于输出程序错误信息,写入到标准错误 >>运算符:用来从一个istream对象读取输入数据 <<运算符:用来向一个ostream对象写入数据 getline函数:从一个给定的istream读取一行数据,存入一个给定的string对象中","text":"IO库** IO库设施: ** istream类型:提供输入操作 ostream类型:提供输出操作 cin:一个istream对象,从标准输入读取数据 cout:一个ostream对象,从标准输出写入数据 cerr:一个ostream对象,通常用于输出程序错误信息,写入到标准错误 >>运算符:用来从一个istream对象读取输入数据 <<运算符:用来向一个ostream对象写入数据 getline函数:从一个给定的istream读取一行数据,存入一个给定的string对象中 IO类 头文件 IO库类型 iostream istream,wistream从流读取数据ostream,wostream向流写入数据iostream,wiostream读写流 fstream ifstream,wistream从文件读取数据ofstream,wofstream向文件写入数据fstream,wfstream读写文件 sstream istringstream,wistringstream从string读取数据ostringstream,wostringstream向string写入数据stringstream,wstringstream读写string IO对象没有拷贝或赋值 定义函数时不能将形参设置为流类型 进行IO操作的函数通常使用引用方式传递和返回流 因为读写一个IO对象会改变其状态,因此传递和返回的引用不能是const类型的 一个流一旦发生错误,其后续的IO操作都会失败 1234567891011121314151617181920#include<iostream>using namespace std;istream& read_print(istream &s){ int score; while(s>>score) { cout<<score<<endl; } s.clear();//流复位,清楚所有错误标志位 return s;}int main(){ read_print(cin); cout<<"shansan"; return 0;} 输出缓冲管理cout<<"shansan" 文本串可能立即打印出来,但也有可能被操作系统保存在操作系统的缓冲区中,随后再打印。缓冲机制的存在可以让操作系统将程序的多个输出操作组合成单一的系统级写操作由于设备写操作可能很耗时间,允许操作系统将多个输出操作组合为单一的设备写操作可以带来很大的便利 ** 使用操纵符刷新缓冲区 ** endl:完成换行机制并且刷新缓冲区 ends:仅刷新缓冲区 flush:仅刷新缓冲区 程序崩溃,输出缓冲区不会刷新 文件IOhttps://shansan.top/2018/10/22/%E5%9D%91%E4%BA%BA%E7%9A%84C++-2/#%E5%86%99%E5%85%A5%E6%96%87%E4%BB%B6-amp-amp-%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6头文件定义了三个文件类型来支持文件IO ifstream:从文件读取数据 ofstream:向文件写入数据 fstream:读和写操作都能进行 每一个文件流对象都定义了一个名为open的成员函数,它完成了一些系统相关的操作,来定位给定的文件,并视情况打开为读或写模式一旦一个文件流已经打开,它就保持与对应文件的关联。对一个已经打开的文件流调用open会失败,并会导致failbit被置位,随后试图使用文件流的操作都会失败 ** ifstream、ofstream、fstream对象上的操作,以下操作都适用 操作 说明 fstream file 创建一个未绑定的文件流 fstream file(file_name) 创建一个fstream对象,并打开名字为file_name的文件。file_name可以是一个指向C风格的字符串,也可以是一个string类型 fstream file(file_name,mode) mode为指定的打开模式 fstream.close() 关闭与fstream绑定的文件 fstream.is_open() 返回一个bool值,指出与fstream关联的文件是否成功被打开且尚未被关闭 123456789101112131415161718192021222324252627282930313233343536#include<iostream>#include<fstream>#include<vector>using namespace std;void write(){ ofstream file; file.open("shansan.txt"); //等价于fstream file("shanshan.txt"); //像文件写入数据 file<<"shansan"<<endl; file<<"shansan.top"<<endl; file<<"yeshan333.github.io"<<endl; file.close();}void read_print(){ string buffer; ifstream read_file("shansan.txt"); vector<string> v; while(getline(read_file,buffer))//每次从read_file读取一行给buffer v.push_back(buffer);//将buffer存到vector对象v中 for(auto temp:v) cout<<temp<<endl;}int main(){ write(); read_print(); return 0;} 文件模式每一个流都有一个关联的文件模式,用来指出如何使用文件。每一个文件流都定义了一个默认的文件模式 与ifstream关联的文件默认以in模式打开 与ofstream关联的文件默认以out模式打开 与fstream关联的文件默认以in和out模式打开 文件模式 说明 in 以读方式打开文件 out 以写方式打开文件 app 每次写操作前均定位到文件末尾 ate 打开文件后立即定位到文件末尾 trunc 截断文件 binary 以二进制方式进行IO","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"排序算法","slug":"排序算法","date":"2018-11-20T00:35:20.000Z","updated":"2018-11-20T00:35:20.000Z","comments":true,"path":"2018/11/20/排序算法/","permalink":"https://yeshan333.github.io/2018/11/20/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/","excerpt":"稳定的直接插入排序基本思想:我们将一个待排序序列分为有序区和无序区(一般开始的时候将第一个元素作为有序区,剩下的元素作为无序区),每次将无序区的第一个元素作为待插入记录,按大小插入到前面已经排好的有序区中的适当位置,直到记录全部插入完成为止。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面)","text":"稳定的直接插入排序基本思想:我们将一个待排序序列分为有序区和无序区(一般开始的时候将第一个元素作为有序区,剩下的元素作为无序区),每次将无序区的第一个元素作为待插入记录,按大小插入到前面已经排好的有序区中的适当位置,直到记录全部插入完成为止。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面) C++ 实现 1234567891011121314151617void insert_sort_1(int a[],int n)//对n个元素从小到大排序{ int i,j; int temp; for(i=1;i<n;i++) { temp = a[i];//待插入元素 j = i-1; while(temp<a[j] && j) { a[j+1] = a[j];//将大的往后挪 j--;//顺利的话可以减到-1,要么就是减到可以插入的位置的前一个位置 //所以后面的j需要加1 } a[j+1]=temp; }} Python 实现 1234567891011def insert_sort(arr: List[int], n: int) -> None: for i in range(1, n): j: int = i - 1 wait_insert_ele: int = arr[i] while j >= 0: if arr[j] > wait_insert_ele: arr[j+1] = arr[j] # 将大于待插入元素的往后移 else: break j -= 1 arr[j + 1] = wait_insert_ele # 插入数据 稳定的冒泡排序基本思想:我们把待排序元素序列竖直放置,每趟对相邻的元素进行两两比较,顺序相反则进行交换,每趟会将最小或最大的元素“浮”到元素序列的顶端,最终元素序列达到有序 实现示例 1234567891011121314151617void bubble_sort(int array[],int n)// 对 n 个数从小到大排序,注意数组下标从 0 开始{ int i,j; int temp; for(i=0;i<n-1;i++)// 进行 n-1 趟比较 { for(j=0;j<n-1-i;j++)// 每趟进行 n-1-i 次比较 { if(array[j+1]<array[j]) { temp = array[j+1]; array[j+1] = array[j]; array[j] = temp; } } }} 优化(一但有一趟不需要比较,就表明可以结束了) 123456789def bubble_sort(arr: List[int], n: int) -> None: for i in range(n): flag: bool = False # 标记某趟是否还需要比较 for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j+1], arr[j] = arr[j], arr[j+1] flag = True if not flag: # 一但有一趟不需要比较,就表明可以结束了 break 不稳定的快速排序快速排序是分治思想在排序算法上的应用,从本质上来讲快速排序应该是在冒泡排序基础上的递归分治法。 算法步骤: 从待排数列中选出一个元素作为基准,一般选第一个元素 重新排序待排数列,所有元素比基准小的摆放在基准前面,所有元素比基准大的摆放在基准后面(相同的数可以放在任意一边)。在这个分区退出后,该基准就处于中间位置。(这个即为分区操作(partion))。 递归地把小于基准元素的子数列和大于基准元素的子数列进行排序。 实现 123456789101112131415161718def quick_sort(arr: List[int], left: int, right: int) -> None: if left >= right: return index = partition(arr, left, right) quick_sort(arr, left, index - 1) quick_sort(arr, index + 1, right)def partition(arr: List[int], left: int, right: int) -> None: pivot = arr[right] index = left for j in range(left, right): if arr[j] < pivot: arr[j], arr[index] = arr[index], arr[j] index += 1 arr[index], arr[right] = arr[right], arr[index] return index 另类 C 实现 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566#include<stdio.h>int a[101],n;void quick_sort(int left, int right){ int i,j,temp; int t; if(left > right) { return ; } temp = a[left];//基准数 i = left; j = right; while(i != j) { //顺序很重要,先从右往左找 while( a[j] >= temp && i<j) { j--; } //再从左边往右找 while( a[j] <= temp && i<j) { i++; } //交换两个数在数组中的位置 if(i<j)//两个哨兵没有相遇 { t = a[i]; a[i] = a[j]; a[j] = t; } } //最终将基准数归位, a[left] = a[i]; a[i] = temp;//归位 quick_sort(left,i-1);//继续处理左边的数 quick_sort(i+1,right);//继续处理右边的数 return ;}int main(){ int i,j; scanf("%d",&n); for(i=1; i<=n; i++)//下表从1开始 scanf("%d",&a[i]); quick_sort(1,n);//sort for(j=1; j<=n; j++) printf("%d ",a[j]); return 0;} 参考 https://blog.csdn.net/adusts/article/details/80882649 https://github.com/hustcc/JS-Sorting-Algorithm 极客时间-数据结构与算法之美","categories":[{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/categories/Algorithm/"}],"tags":[{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/tags/Algorithm/"}]},{"title":"二分查找","slug":"二分查找","date":"2018-11-19T00:30:43.000Z","updated":"2018-11-19T00:30:43.000Z","comments":true,"path":"2018/11/19/二分查找/","permalink":"https://yeshan333.github.io/2018/11/19/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE/","excerpt":"","text":"二分查找算法 二分查找的基本思想: 将 n 个元素分成大致相等的两部分,取 a[n/2] 与 x(查找目标值) 做比较,如果x == a[n/2] ,则找到 x,算法中止;否则,如果x < a[n/2],则只要在数组 a 的左半部分继续搜索 x,如果x > a[n/2], 则只要在数组 a 的右半部搜索 x。 使用二分查找算法的前提:待查找序列是有序的 时间复杂度分析由算法核心思想可知:每次对比都将下一步的比对范围缩小一半。每次比对后剩余数据项如下表: 最好情况即要找的元素正好在初始查找序列的中间一次比较出结果,时间复杂度为 $ O(1) $。 最坏情况即比对范围只剩下 1 个数据项的情况这个数据项即为正要找的元素。这时,可求解如下方程组($ i $ 为比较次数): $$ \\frac{n}{2^i}=1 $$ 时间复杂度为 $ O(log(n)) $ 平均时间复杂度进行平均时间复杂度分析时需要讨论:随着元素个数n的增多,需要几步算法才能终止?查找成功有多少种情况?查找失败有多少种情况? 设 $ n=2^k-1 $, $ k $ 为比较次数。易知,对于 $$ t=1,2,…, \\lfloor log(n) \\rfloor + 1 $$, 会有 $ 2^{t-1} $ 个元素在 $ t $ 步之后使算法成功终止。总共有 $ (2n+1) $ 种情况,$ n $ 种情况为成功结束,$ (n+1) $ 种情况为失败终止。 由此可得二分搜索的平均比较次数为 $ (k = \\lfloor log(n) \\rfloor + 1) $:$$ A(n)= \\frac{1}{2n+1}(\\sum_{i=1}^{k}i2^{i-1} + k(n+1)) $$根据初等数学等差乘等比数列求和的错位相减法/裂项相消法。易知,$$ \\sum_{i=1}^{k}i2^{i-1} = 2^k(k-1)+1 $$ 使用裂项相消法由 $ \\sum_{i=1}^{k}i2^{i-1} $,设 $ a_i=i2^{i-1},(i=1,…,k) $。注意到,$ a_i=(k-1)2^k-(k-2)2^{k-1} $。$$ \\sum_{i=1}^{k}i2^{i-1}=0\\times2^1+1+1\\times2^2-0\\times2^1+2\\times2^3-1\\times2^2+…+(k-1)2^k-(k-2)2^{k-1}=2^k(k-1)+1 $$ $$ A(n)= \\frac{1}{2n+1}(\\sum_{i=1}^{k}i2^{i-1} + k(n+1)) $$$$ \\sum_{i=1}^{k}i2^{i-1} = 2^k(k-1)+1 $$综上可得,$$ A(n) = \\frac{1}{2n+1}((k-1)2^{k}+1+k2^k) $$ 当 $ n $ 非常大时,可得$$ A(n) \\approx \\frac{1}{2^{k+1}}((k-1)2^{k}+k2^k)=\\frac{(k-1)}{2}+\\frac{k}{2}=k-\\frac{1}{2} $$所以 $ A(n)<k=O(log(n)) $ ,平均时间复杂度为$ O(log(n)) $。 代码实现123456789101112131415161718192021222324252627282930# -*- coding: utf-8 -*-# binary_searchdef binary_search(list_1, item): low = 0 high = len(list_1)-1 while low <= high: '''使用 // 整除运算符可以不用int进行类型转换''' #每次都检查中间的元素 mid = (low + high)/2 guess = list_1[int(mid)] if guess == item: return int(mid)#返回所在位置的索引 if guess < item: #猜的数字小了,修改low low = mid+1 if guess > item: #猜的数字大了,修改high high = mid-1 return Nonedef main(): list_2 = [1,2,3,4,5,6,7,8,9] print(binary_search(list_2, 8)) print(binary_search(list_2, 10))main() 1234567891011121314151617181920212223242526272829303132333435363738#include<iostream>#include<typeinfo>using namespace std;int binary_search(int a[9],int n,int x)//n为元素个数{ int mid; int high,low=0; int guess; high = n-1;//数组下标从0开始 while(low <= high) { mid = (high+low)/2; guess = a[mid]; if(guess == x) return mid; if(guess > x) high = mid-1; if(guess < x) low = mid+1; } return -1;}int main(){ int temp; int a[9] = {1,2,3,4,5,6,7,8,9}; cout<<sizeof(a)/sizeof(int)<<endl; cout<<typeid(sizeof(a)/sizeof(int)).name()<<endl; temp = binary_search(a,sizeof(a)/sizeof(int),5); cout<<temp<<endl; return 0;} 附:C++ 使用头文件typeinfo下的typeid(parameter).name()可获取参数获取类型名","categories":[{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/categories/Algorithm/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"},{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/tags/Algorithm/"},{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"C++面向对象-8","slug":"C++-面向对象-8","date":"2018-11-15T23:40:22.000Z","updated":"2018-11-15T23:40:22.000Z","comments":true,"path":"2018/11/15/C++-面向对象-8/","permalink":"https://yeshan333.github.io/2018/11/15/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-8/","excerpt":"","text":"使用struct关键字定义类*** 使用class和struct定义类的唯一区别就是默认的访问权限 ***] 使用struct关键字,定义在第一个访问说明符之前的成员是public 使用class关键字,定义在第一个访问说明符之前的成员是private 定义在类内的成员函数是自动inline的 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475#include<cstring>#include<iostream>using namespace std;struct Sales_data{ /* - isbn成员函数用于返回对象的ISBN编号 - combine成员函数,用于将一个Sales_data对象加到另一个对象上 - avg_price成员函数,用于返回售出书籍的平均价格 */ string isbn() const{return bookNo;}//这是一个常量成员函数,不能改变调用它的对象的内容 Sales_data& combine(const Sales_data&); double avg_price() const; string bookNo; //ISBN unsigned units_sold = 0; //销售总数 double revenue = 0.0; //收益};double Sales_data::avg_price() const{ if(units_sold) return revenue/units_sold; else return 0;}Sales_data& Sales_data::combine(const Sales_data &rhs){ units_sold += rhs.units_sold; revenue += rhs.revenue; return *this;//返回调用该函数的对象}/** Salse_data的非成员接口函数:- add函数,执行两个Sales_data对象的加法- read函数,将数据从istream读入到Sales_data对象中- print函数,将Sales_data对象的值输出到ostream*/Sales_data add(const Sales_data& ,const Sales_data&);ostream &print(ostream& , const Sales_data&);istream &read(istream& , const Sales_data&);//输入的交易信息包括ISBN、售出总数、售出价格istream &read(istream &is, Sales_data &item){ double price = 0.0; is>>item.bookNo>>item.units_sold>>price;}ostream &print(ostream &os, const Sales_data &item){ os<<item.isbn()<<" "<<item.units_sold<<" " <<item.revenue<<" "<<item.avg_price(); return os;}Sales_data add(const Sales_data &lhs, const Sales_data &rhs){ Sales_data sum = lhs;//把lhs的数据成员拷贝给sum sum.combine(rhs); return sum;}int main(){ Sales_data total; string temp; temp = "shansan"; total.bookNo = temp; //total.bookNo = "shansan"; cout<<total.bookNo<<endl; cout<<total.isbn()<<endl; return 0;} 使用=default保留默认的构造函数 & 构造函数初始值列表 当我们需要其他构造函数的时,同时也希望保留默认的构造函数时候,可以使用= default 构造函数初始值是成员函数的一个列表,每个名字后面紧跟括号括起来的(或则在花括号内的)成员初始值。不同成员的初始值通过逗号分隔 构造函数初始值列表只说明用于初始化成员的值,而不限定初始化的具体执行顺序 但是如果一个成员是用另一个成员来初始化的,那么这两个成员的初始化顺序就很重要 consturctor(parameter):initializer_list,注意那个冒号,构造函数不能被声明成const的 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798#include<cstring>#include<iostream>using namespace std;struct Sales_data{ //新增构造函数 //使用构造函数初始值列表,注意那个冒号 //这两个构造函数的函数体都是空的,构造函数没有返回类型 Sales_data() = default;//保留默认构造函数 Sales_data(const string &s) :bookNo(s) {} Sales_data(const string &s, unsigned n, double p):bookNo(s),units_sold(n),revenue(p*n) {} //声明一个constructor,定义放在类外了 Sales_data(istream&); string isbn() const{return bookNo;}//这是一个常量成员函数,不能改变调用它的对象的内容 Sales_data& combine(const Sales_data&); double avg_price() const; string bookNo; unsigned units_sold = 0; double revenue = 0.0;};double Sales_data::avg_price() const{ if(units_sold) return revenue/units_sold; else return 0;}Sales_data& Sales_data::combine(const Sales_data &rhs){ units_sold += rhs.units_sold; revenue += rhs.revenue; return *this;//返回调用该函数的对象}/** Salse_data的非成员接口函数:- add函数,执行两个Sales_data对象的加法- read函数,将数据从istream读入到Sales_data对象中- print函数,将Sales_data对象的值输出到ostream*/Sales_data add(const Sales_data& ,const Sales_data&);ostream &print(ostream& , const Sales_data&);istream &read(istream& , const Sales_data&);//输入的交易信息包括ISBN、售出总数、售出价格istream &read(istream &is, Sales_data &item){ double price = 0.0; is>>item.bookNo>>item.units_sold>>price;}ostream &print(ostream &os, const Sales_data &item){ os<<item.isbn()<<" "<<item.units_sold<<" " <<item.revenue<<" "<<item.avg_price()<<endl; return os;}Sales_data add(const Sales_data &lhs, const Sales_data &rhs){ Sales_data sum = lhs;//把lhs的数据成员拷贝给sum sum.combine(rhs); return sum;}//类外定义新的构造函数Sales_data::Sales_data(istream &is){ read(is,*this);//从is中读入一条信息存到this对象中}int main(){ Sales_data total;//调用默认的构造函数 string temp; temp = "shansan"; total.bookNo = temp; //total.bookNo = "shansan"; cout<<total.bookNo<<endl; cout<<total.isbn()<<endl; Sales_data let("shansan.top",33,33);//调用构造函数Sales_data(const string &s, unsigned n, double p) cout<<let.bookNo<<" "<<let.units_sold<<" "<<let.revenue<<endl; Sales_data read_print;//调用默认的构造函数 read(cin,read_print); print(cout,read_print); Sales_data dada(cin);//调用构造函数Sales_data(istream &is) print(cout,dada); return 0;} 委托构造函数 一个委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程 它把自己的一些或全部职责委托给了其他构造函数 一个委托构造函数和其他构造函数一样也有一个成员初始值列表和一个函数体 委托构造函数的成员初始值列表只有一个入口,就是类名本身。类名后面紧跟圆括号括起来的初始值列表,参数列表必须与另一个构造函数匹配 当一个构造函数委托给另一个构造函数时,受委托的构造函数的初始值列表和函数体被依次执行 12345678910111213141516171819202122232425262728293031323334353637383940#include<iostream>using namespace std;class People{ public: //非委托构造函数使用对应的实参初始化成员 People(string m,string x,int n):first_name(m),last_name(x),age(n) {} //其余构造函数全部委托给另一个构造函数 //注意使用冒号 People(): People("li","lei",18){} People(string insert): People(insert,"wan",33){} People(int a): People("wu","ge",a){} int print_info(People temp) { cout<<temp.first_name<<" "<<temp.last_name<<" "<<temp.age<<endl; return 0; } private: string first_name; string last_name; int age;};int main(){ People num_1("shan","san",18);//调用构造函数 People(string m,string x,int n) num_1.print_info(num_1); People num_2;//调用委托构造函数 People("li","lei",18) num_2.print_info(num_2); People num_3("six");//调用委托构造函数 People(string insert) num_3.print_info(num_3); People num_4(100);//调用委托构造函数 People(int a) num_4.print_info(num_4); return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"精度(precision)控制","slug":"精度-precision-控制","date":"2018-11-06T23:50:56.000Z","updated":"2018-11-06T23:50:56.000Z","comments":true,"path":"2018/11/06/精度-precision-控制/","permalink":"https://yeshan333.github.io/2018/11/06/%E7%B2%BE%E5%BA%A6-precision-%E6%8E%A7%E5%88%B6/","excerpt":"C++输出精度(precision)控制,格式化输出使用cout对象的成员 setprecision() setf() width() fill() flags(ios::fixed)","text":"C++输出精度(precision)控制,格式化输出使用cout对象的成员 setprecision() setf() width() fill() flags(ios::fixed) 123456789101112131415161718192021222324252627282930313233#include<iostream>using namespace std;int main(){ double a=3.1415926; double c=66.666666; cout.precision(3); //控制输出流显示的有效数字个数 cout<<a<<endl; cout<<c<<endl; cout<<endl; cout.width(8); //控制输出宽度 cout.setf(ios::right); //设置对齐方式 cout<<a<<endl; cout<<endl; cout.setf(ios::right); cout.fill('#'); //设置填充字符 cout.width(8); cout<<a<<endl; cout<<endl; cout.flags(ios::fixed); //flags(ios::fixed)和precision()配合使用控制精度 cout.precision(4); cout<<a<<endl; return 0;} 使用头文件iomanip中的setprecision()和setiosflags(ios::fixed)进行精度控制1234567891011121314#include<iostream>#include<iomanip>using namespace std;int main(){ double e = 2.7182818; cout<<setprecision(3)<<e<<endl; cout<<setiosflags(ios::fixed)<<endl; cout<<setprecision(3)<<e<<endl; return 0;} 参考自:https://blog.csdn.net/yanglingwell/article/details/49507463","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"C++标准库类型","slug":"C++-标准库类型","date":"2018-11-05T23:24:19.000Z","updated":"2018-11-05T23:24:19.000Z","comments":true,"path":"2018/11/05/C++-标准库类型/","permalink":"https://yeshan333.github.io/2018/11/05/C++-%E6%A0%87%E5%87%86%E5%BA%93%E7%B1%BB%E5%9E%8B/","excerpt":"标准库类型string 标准库类型string表示可变长的字符序列 使用string类型必须包含string头文件,string定义在命名空间std中 定义和初始化string对象初始化string对象的方式 初始化方式 说明 string s1 默认初始化,s1是一个空字符串 string s2(s1) s2是s1的副本 string s2=s1 等价于s2(s1),s2是s1的副本 string s3(“shansan”) s3是字面值”shansan”的副本,除了字面值最后的那个空字符串外 string s3=”shansan” 等价于s3(“shansan”) string s4(n,’c’) 把s4初始化为由连续n个字符c组成的串","text":"标准库类型string 标准库类型string表示可变长的字符序列 使用string类型必须包含string头文件,string定义在命名空间std中 定义和初始化string对象初始化string对象的方式 初始化方式 说明 string s1 默认初始化,s1是一个空字符串 string s2(s1) s2是s1的副本 string s2=s1 等价于s2(s1),s2是s1的副本 string s3(“shansan”) s3是字面值”shansan”的副本,除了字面值最后的那个空字符串外 string s3=”shansan” 等价于s3(“shansan”) string s4(n,’c’) 把s4初始化为由连续n个字符c组成的串 1234567891011121314151617181920#include<iostream>using namespace std;int main(){ string s1; cout<<s1<<endl; cout<<"1"<<endl; string s2 = "shansan"; cout<<s2<<endl; string s3(s2); cout<<s3<<endl; string s4(6,'s'); cout<<s4<<endl; return 0;} string对象上的操作 getline(is,s):从is中读取一行赋给s,返回is s.empty():s为空返回true s.size():返回s中字符的个数 12345678910111213141516171819202122232425#include<iostream>using namespace std;//empty(),getline(),size()int main(){ string s; cin>>s; //* 读取时string对象会默认忽略掉开头的空白(即空格符、换行符、制表符等) //* 从第一个真正的字符开始读起,直到遇见下一处空白为止 cout<<s<<endl; cout<<s.size()<<endl; if(!s.empty())//如果string对象非空 { cout<<"the string is not empty !"<<endl; } string line; //每次读取一整行,遇到换行符结束 while(getline(cin,line)) cout<<line<<endl; return 0;} 标准库类型vector** #include ** 标准库类型表示对象的集合,其中所有的对象类型都相同 集合中的每一个对象都有一个与之对应的索引,索引用于访问对象 定义和初始化vector对象 定义和初始化vector对象的方法 说明 vector v1 v1是一个空vector,它潜在的元素是T类型的,执行默认初始化 vector v2(v1) v2中包含有v1所有元素的副本 vector v2=v1 等价于v2(v1) vector v3(n,value) v3包含了n个重复的元素,每个元素的值都是value vector v4(n) v4包含了n个重复地执行了值初始化的对象 vector v5{a,b,c,…} v5包含了初始值的个数的元素,每元素被赋予相应的初始值 vector v5={a,b,c,…} 等价于v5 vector对象上的操作 v.empty():如果v不含有任何元素,返回真,否者返回假 v.size():返回v中元素的个数 v.push_back(t):向v的尾端添加一个值为t的元素 1234567891011121314151617181920212223242526272829#include<iostream>#include<vector>using namespace std;int main(){ vector<int> s={1,2,3,4,5};;//列表初始化vector对象s //- 可使用下标访问vector对象 cout<<s[0]<<endl; vector<int> a(8,1); for(auto i:a) { cout<<i<<" "; } cout<<endl; string word; vector<string> text; while(cin>>word) { text.push_back(word);//push_back() } for(auto str:text) { cout<<str<<" "; } return 0;} 使用范围for语句处理vector对象12345678910111213141516171819202122232425#include<iostream>#include<vector>using namespace std;int main(){ int num; vector<int> v; while(cin>>num)//获取元素值 { v.push_back(num); } for(auto &i:v)//求元素值的平方 { i = i*i; } for(auto temp:v)//输出v中每一个元素 { cout<<temp<<" "; } return 0;} 不可用下标形式为vector对象添加元素12345678910111213141516#include<iostream>#include<vector>using namespace std;int main(){ vector<int> v;//空的vector对象 for(decltype(v.size()) i =0;i!=6;i++) { v[i] = i; } // -v是一个空的vector,不存在任何元素,不能通过下标去访问 // -应该使用vector对象的成员函数push_back()为vector对象添加元素较为安全 cout<<v[0]<<endl; return 0;} vector对象(以及string对象)的下标运算符可用于访问已存在的元素,而不能用于添加元素 使用标准库函数begin()和end()遍历数组123456789101112131415#include<iostream>using namespace std;//库函数begin和end,以数组名作为参数int main(){ int sums[]={1,2,3,4,5,6,7,8,9,10}; int *beg = begin(sums); //指向sums首元素的指针 int *last = end(sums); //指向sums尾元素的下一位置的指针 int *temp; for(temp = beg;temp != last;temp++) { cout<<*temp<<" "; } return 0;} begin()函数返回指向数组sums首元素的指针 end()函数返回指向数组sums尾元素下一位置的指针 使用可迭代对象(容器||string对象)的成员begin()和end()进行遍历 end成员返回指向容器(string对象)“尾元素下一位置(one past the end)”的迭代器(尾后迭代器) begin成员负责返回指向第一个元素(或者第一个字符的迭代器) 123456789101112131415161718192021222324252627282930313233343536#include<iostream>#include<vector>#include<string.h>using namespace std;int main(){ string s="shan san";//s("shan san"); cout<<s<<endl; //首字母改成大写形式 if(s.begin() != s.end()) { auto it = s.begin();//令it指向s的第一个元素 *it = toupper(*it); } cout<<s<<endl; //全部字母改成大写形式,&& !isspace(*temp) //temp是个迭代器,通过 * 运算符解引用迭代器获得迭代器所指的对象 for(auto temp=s.begin();temp != s.end() ; temp++) { *temp = toupper(*temp); } cout<<s<<endl; const int a=8; //a=0; cout<<a<<endl; char c[10]="123456789"; char b[10]; strcpy(b,c); cout<<b[1]<<endl; return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"C++11特性-1","slug":"C++-11特性-1","date":"2018-11-05T23:19:57.000Z","updated":"2018-11-05T23:19:57.000Z","comments":true,"path":"2018/11/05/C++-11特性-1/","permalink":"https://yeshan333.github.io/2018/11/05/C++-11%E7%89%B9%E6%80%A7-1/","excerpt":"c++11特性列表初始化 使用花括号来初始化对象 使用列表初始化内置类型的变量,可能会存在丢失信息的风险","text":"c++11特性列表初始化 使用花括号来初始化对象 使用列表初始化内置类型的变量,可能会存在丢失信息的风险 auto类型说明符号decltype类型说明符auto auto让编译器通过初始值来推算变量的类型 使用auto也能在一条语句中声明多个变量。因为一条声明语句只能有一个基本数据类型,所以该语句中的所有变量的初始基本数据类型都必须一样 编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则 123456789101112131415161718#include<iostream>#include<typeinfo>using namespace std;int main(){ int a = 33; double pi = 3.1415926; auto b=a; //auto c=1.414,d=1;//[Error] inconsistent deduction for 'auto': 'double' and then 'int' cout<<typeid(pi).name()<<endl; cout<<typeid(a).name()<<endl; //cout<<typeid(c).name()<<endl; return 0;} delctype 从表达式的类型推断出要定义的变量的类型,不使用该表达式的值初始化变量 编译器分析表达式并得到它的类型,却不实际计算表达式的值 如果decltype使用的表达式不是一个变量,则返回表达式结果对用的类型 1234567891011121314151617181920#include<iostream>#include<typeinfo>using namespace std;int main(){ int a=1,b=3; int &refer_a=a; decltype(a+b) temp=33; decltype(refer_a) en=b;//引用类型定义时就必须初始化 decltype((a)) refer=b;//decltype((variable))的结果永远是引用,使用了双层括号 cout<<temp<<" "<<"it's type:'"<<typeid(temp).name()<<endl; cout<<refer_a; cout<<en<<endl; cout<<refer<<endl; return 0;} 范围for语句基本形式: for(declaration : expression) statement expression部分是一个对象,用于表示一个序列 declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,declaration部分的变量都会被初始化为expression部分的下一个元素值 使用范围for语句遍历string对象1234567891011121314151617181920212223242526272829303132333435#include<iostream>using namespace std;int main(){ string str("shan san"); //通过编译器来决定变量的类型 for(auto s : str) { cout<<s<<" "; } cout<<endl; for(auto temp : str) { cout<<temp; } cout<<endl; //使用引用,使字符串对象str变为大写 for(auto &a : str) { a = toupper(a); } cout<<str<<endl; //使用下标进行迭代,改变字符串对象str的大小写状态 for(decltype(str.size()) index = 0; index != str.size(); ++index) { str[index] = toupper(str[index]); } cout<<str; return 0;} 使用范围for语句遍历二维数组*** 使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型 *** 1234567891011121314151617181920212223242526272829#include<iostream>#include<cstddef>using namespace std;int main(){ constexpr size_t rowCnt = 3,colCnt = 4; int a[rowCnt][colCnt]; //二位数组初始化 for(size_t i = 0; i != rowCnt; i++) { for(size_t j=0; j != colCnt;j++) { //将元素的位置索引作为它的值 a[i][j] = i*colCnt + j; } } for(auto &temp : a) //对于外层数组的每一个元素 { for(auto lim :temp) //对于内层数组的每一个元素 { cout<<lim<<endl; } } return 0;} 使用范围for语句遍历vector对象1234567891011121314151617181920#include<iostream>#include<vector>using namespace std;int main(){ int scores; vector<int> v; while(cin>>scores) { v.push_back(scores); } for(auto temp : v) { cout<<temp<<" "; } return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"python生成器回顾","slug":"python生成器回顾","date":"2018-11-02T23:25:44.000Z","updated":"2018-11-02T23:25:44.000Z","comments":true,"path":"2018/11/02/python生成器回顾/","permalink":"https://yeshan333.github.io/2018/11/02/python%E7%94%9F%E6%88%90%E5%99%A8%E5%9B%9E%E9%A1%BE/","excerpt":"python生成器(generator) 生成器是一种使用普通函数语法定义的迭代器 包含yield语句的函数都是生成器,它是一个不断产生值的函数 生成器每次使用yield产生一个值后,函数都将冻结,即在此处停止执行,等待重新被唤醒。被唤醒后从停止的地方开始继续执行 生成器推导(生成器表达式)*** 使用圆括号()创建一个生成器推导 ***,它创建了一个可迭代的对象使用next()函数可以获得生成器推导的下一个返回值 g = (i**2 for i in range(10))","text":"python生成器(generator) 生成器是一种使用普通函数语法定义的迭代器 包含yield语句的函数都是生成器,它是一个不断产生值的函数 生成器每次使用yield产生一个值后,函数都将冻结,即在此处停止执行,等待重新被唤醒。被唤醒后从停止的地方开始继续执行 生成器推导(生成器表达式)*** 使用圆括号()创建一个生成器推导 ***,它创建了一个可迭代的对象使用next()函数可以获得生成器推导的下一个返回值 g = (i**2 for i in range(10)) simple generator** demo_1 ** 斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到 ** demo_2_generator ** recursive generator处理多层嵌套列表 123456789101112131415def flagtten(nested): try: for sublist in nested: for element in flagtten(sublist): yield element except TypeError:#处理迭代单个对象引起的typeerror异常 yield nesteddef main(): s = list(flagtten([1,[2,3]])) print(s)main() 12345678910111213141516171819202122def flagtten(nested): try: #不迭代类似于字符串的对象 try: nested + '' except TypeError: pass else: raise TypeError for sublist in nested: for temp in flagtten(sublist): yield temp except TypeError: yield nesteddef main(): s = list(flagtten(["haha",["shan","san"]])) print(s)main()","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"}]},{"title":"Scrapy爬虫框架","slug":"Scrapy爬虫框架","date":"2018-10-31T23:13:19.000Z","updated":"2018-10-31T23:13:19.000Z","comments":true,"path":"2018/10/31/Scrapy爬虫框架/","permalink":"https://yeshan333.github.io/2018/10/31/Scrapy%E7%88%AC%E8%99%AB%E6%A1%86%E6%9E%B6/","excerpt":"","text":"网络爬虫框架scrapy(配置型爬虫) 什么是爬虫框架? 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合 爬虫框架是个半成品,帮助用户实现专业网络爬虫 scrapy框架结构(“5+2”结构) spider: 解析downloader返回的响应(Response) 产生爬取项(scraped item) 产生额外的爬去请求(Request)需要用户编写配置代码 engine(引擎): 控制所有模块之间的数据流 根据条件触发事件不需要用户修改 scheduler(调度器): 对所有爬取请求进行调度处理不需要用户修改 downloader(下载器): 根据请求下载网页不需要用户修改 item pipelines(): 以流水线处理spider产生的爬取项 由一组操作顺序组成,类似流水线,每个操作是一个Item Pipeline类型 可能操作包括:清理、检验和查重爬取项中的HTML数据,将数据存储到数据库中需要用户编写配置代码 downloader middleware(中间件): 目的:实施engine、scheduler和downloader之间进行用户可配置的控制 功能:修改、丢弃、新增请求或响应用户可以编写配置代码 spider middleware(中间件): 目的:对请求和爬去项的再处理 功能:修改、丢弃、新增请求或爬取项用户可以编写配置代码 数据流 1.Engine从Spider处获得爬取请求(Request) 2.Engine将爬取请求转发给Scheduler,用于调度 3.Engine从Scheduler处获得下一个爬取的请求 4.Engine将爬取请求通过中间件发送给Downloader 5.爬取网页后,Downloader形成响应(Response),通过中间件(Middleware)发给Engine 6.Engine将收到的响应通过中间件发送给Spider处理 7.Spider处理响应后产生爬取项(scraped item)和新的爬取请求(Requests)给Engine 8.Engine将爬取项发送给Item Pipeline(框架出口) 9.Engine将爬取请求发送给Scheduler Engine控制各模块数据流,不间断从Scheduler处获得爬取请求,直到请求为空 框架入口:Spider的初始爬取请求 框架出口:Item Pipeline scrapy命令行格式 scrapy <command> [options] [args] ** 常用命令 ** 命令 说明 格式 startproject 创建一个新工程 scrapy startproject [dir] genspider 创建一个爬虫 scrapy genspider [options] [domain] settings 获得爬虫配置信息 scrapy settings [options] crawl 运行一个爬虫 scrapy crawl list 列出工程中所有的爬虫 scrapy list shell 启动URL调试命令行 scrapy shell [url] demohttps://python123.io/ws/demo.html创建工程scrapy startproject python123demo 创建爬虫scrapy genspider demo python123.io //生成了一个名为demo的spider //在spider目录下增加代码文件demo.py(该文件也可以手工生成) ** demo.py文件 ** 1234567891011# -*- coding: utf-8 -*-import scrapyclass DemoSpider(scrapy.Spider): name = 'demo' allowed_domains = ['python123.io'] start_urls = ['http://python123.io/'] def parse(self, response): pass 配置产生的spider爬虫12345678910111213141516# -*- coding: utf-8 -*-import scrapyclass DemoSpider(scrapy.Spider): name = 'demo' #allowed_domains = ['python123.io'] start_urls = ['http://python123.io/ws/demo.html'] def parse(self, response): #存储文件名demo.html file_name = response.url.split('/')[-1] with open(file_name,"wb") as f: f.write(response.body) self.log('Saved file %s' % file_name)#日志 *** 另一个版本 ** 12345678910111213141516171819202122# -*- coding: utf-8 -*-import scrapyclass DemoSpider(scrapy.Spider): name = 'demo' #allowed_domains = ['python123.io'] #start_urls = ['http://python123.io/ws/demo.html'] def start_requests(self): urls = [ 'http://python123.io/ws/demo.html' ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): #存储文件名demo.html file_name = response.url.split('/')[-1] with open(file_name,"wb") as f: f.write(response.body) self.log('Saved file %s' % file_name)#日志 运行爬虫scrapy crawl demo Scrapy爬虫数据类型 Request类 Response类 Item类 Request类class scrapy.http.Request() Request对象表示一个HTTP请求 由Spider生成,由Downloader执行 属性 方法 .url Requests对应的请求URL地址 .method 对应的请求方法,’GEt’、’POST’等 .headers 字典类型风格的请求头 .body 请求内容主体,字符串类型 .meta 用户添加的扩展信息,在Scrapy内部模块间传递信息使用 .copy 复制该请求 Response类class scrapy.http.Response() Response对象表示一个HTTp响应 由Downloader生成,由Spider处理 属性或方法 说明 .url Response对应的URL地址 .status HTTP状态码,默认是200 .headers Response对应的头部信息 .body Response对应的内容信息,字符串类型 .flags 一组标记 .request 产生Response类型对应的Request对象 .copy() 复制该响应 Item类class scrapy.item.Item() Item对象表示一个从HTML页面中提取的信息内容 由Spider生成,由Item Pipeline处理 Item类似字典类型,可以按照字典类型操作 Scrapy爬虫的使用步骤 创建一个工程和Spider模板 编写Spider 编写Item Pipeline 优化配置策略 scrapy爬虫信息提取方法 Beautifui Soup lxml re XPath Selector CSS Selector","categories":[{"name":"Scrapy","slug":"Scrapy","permalink":"https://yeshan333.github.io/categories/Scrapy/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"Scrapy","slug":"Scrapy","permalink":"https://yeshan333.github.io/tags/Scrapy/"}]},{"title":"HTML试水","slug":"HTML试水","date":"2018-10-30T23:39:10.000Z","updated":"2018-10-30T23:39:10.000Z","comments":true,"path":"2018/10/30/HTML试水/","permalink":"https://yeshan333.github.io/2018/10/30/HTML%E8%AF%95%E6%B0%B4/","excerpt":"一级标题 二级标题","text":"一级标题 二级标题 倚天屠龙记张无忌这是另一段 锚点这是我的个人博客这是我的个人博客,新标签页打开 邮箱联系我 图像** img是自关标记,不需要结束标记 ** 文本这里是粗体 这里是斜体 what 这里还是斜体 插入字体,下划线 删除线 下标&&上标 H<sub>2</sub>O<sub>2</sub> 嗯<sup>我飘了</sup> <code>#include<stdio.h> int main() { printf("wocao!"); }</code> 正常字 <small>小号字</small> <q>短引用,双引号包围</q> <blockquote>长引用 土地是以它的肥沃和收获而被估价的;才能也是土地,不过它生产的不是粮食,而是真理。 如果只能滋生瞑想和幻想的话,即使再大的才能也只是砂地或盐池,那上面连小草也长不出来的。 —— 别林斯基 </blockquote> 22222222222 22222222222222 2222 ## 表格 <table>...</table>:定义表格 <th>...</th>:定义表格的标题栏(文字加粗体) <tr>...</tr>:定义表格的行 <td>...</td>:定义表格的列 <table border="1"> <tr> <td>row 1, cell 1</td> <td>row 1, cell 2</td> </tr> <tr> <td>row 2, cell 1</td> <td>row 2, cell 2</td> </tr> </table> ### 跨列表格 <table border="1"> <tr> <th>姓名</th> <th colspan="2">电话</th> </tr> <tr> <td>shansan</td> <td>1329441308</td> <td>164354491</td> </tr> <table> <h3>跨行表格</h3> <table border="1"> <tr> <th>姓名</th> <td>shansan</td> </tr> <tr> <th rowspan="2">电话</th> <td>1329441308</td> </tr> <tr> <td>164354491</td> </tr> </table> ## syntax 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104# HTML试水<h1> 一级标题 </h1><h2> 二级标题 </h2><!-- more --><p>倚天屠龙记</p><p>张无忌</p><p>这是另一段</p>## 锚点<a href = "https://shansan.top">这是我的个人博客</a><a href = "https://shansan.top" target="_blank">这是我的个人博客,新标签页打开</a><a href="mailto:1329441308@qq.com" target="_top">邮箱联系我</a># 图像** img是自关标记,不需要结束标记 **<img src="https://www.baidu.com/img/bd_logo1.png" width="500" height="500">## 文本<b>这里是粗体</b><i>这里是斜体</i><strong>what</strong><em>这里还是斜体</em><ins>插入字体,下划线</ins><del>删除线</del>~~~ 还是删除线 ~~~下标&&上标H<sub>2</sub>O<sub>2</sub>嗯<sup>我飘了</sup><code>#include<stdio.h>int main(){ printf("wocao!");}</code>正常字<small>小号字</small><q>短引用,双引号包围</q><blockquote>长引用土地是以它的肥沃和收获而被估价的;才能也是土地,不过它生产的不是粮食,而是真理。如果只能滋生瞑想和幻想的话,即使再大的才能也只是砂地或盐池,那上面连小草也长不出来的。 —— 别林斯基</blockquote>22222222222222222222222222222## 表格<table border="1"><tr><td>row 1, cell 1</td><td>row 1, cell 2</td></tr><tr><td>row 2, cell 1</td><td>row 2, cell 2</td></tr></table>### 跨列表格<table border="1"><tr> <th>姓名</th> <th colspan="2">电话</th></tr><tr> <td>shansan</td> <td>1329441308</td> <td>164354491</td></tr><table><h3>跨行表格</h3><table border="1"><tr> <th>姓名</th> <td>shansan</td></tr><tr> <th rowspan="2">电话</th> <td>1329441308</td></tr><tr> <td>164354491</td></tr></table> ---","categories":[{"name":"HTML","slug":"HTML","permalink":"https://yeshan333.github.io/categories/HTML/"}],"tags":[{"name":"HTML","slug":"HTML","permalink":"https://yeshan333.github.io/tags/HTML/"}]},{"title":"竖式问题","slug":"竖式问题","date":"2018-10-24T23:59:00.000Z","updated":"2018-10-24T23:59:00.000Z","comments":true,"path":"2018/10/24/竖式问题/","permalink":"https://yeshan333.github.io/2018/10/24/%E7%AB%96%E5%BC%8F%E9%97%AE%E9%A2%98/","excerpt":"字符串处理函数strchr() && 竖式问题 竖式问题","text":"字符串处理函数strchr() && 竖式问题 竖式问题 题目描述 找出所有形如abc*de(三位数乘两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。 输入: 输入一个数字集合(相邻数字之间没有空格) 输出: 输出所有竖式.每个竖式前应该编号,之后应该有一个空行。最后输出解的总数。 样例输入: 2357 样例输出: (1)  775x  33—– 23252325 —–25575The number of solution = 1 分析小学的乘法运算 1234567891011121314151617181920212223242526272829303132#include<stdio.h>#include<string.h>int main(){ int count; char s[20],buf[99]; scanf("%s",s); for(int abc = 111;abc <= 999;abc++) { for(int de = 11;de <= 99;de++) { int x = abc*(de%10),y = abc*(de/10),z = abc*de; sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z); /* - 使用sprintf()把信息输出到字符串 - strchr()函数的作用是在一个字符串中查找单个字符 */ int ok = 1; for(int i = 0;i<strlen(buf);i++) { if(strchr(s,buf[i])==NULL) ok = 0; } if(ok) { printf("(%d)\\n",++count); printf("%5d\\nx%4d\\n-----\\n%5d\\n%4d\\n-----\\n%5d\\n\\n",abc,de,x,y,z); } } } printf("The number of solutions = %d\\n",count); return 0;} 字符处理函数strchr()strchr() 用来查找某字符在字符串中首次出现的位置,其原型为: char * strchr (const char *str, int c); strchr() 将会找出 str 字符串中第一次出现的字符 c 的地址,然后将该地址返回。 如果找到指定的字符则返回该字符所在地址,否则返回 NULL。 12345678910#include<stdio.h>#include<string.h>int main(){ char *s="666shansan"; char *p; p = strchr(s,'s'); printf("%s",p); return 0;} 输出结果 shansan","categories":[{"name":"C","slug":"C","permalink":"https://yeshan333.github.io/categories/C/"}],"tags":[{"name":"C","slug":"C","permalink":"https://yeshan333.github.io/tags/C/"}]},{"title":"坑人的C++-2","slug":"坑人的C++-2","date":"2018-10-22T23:41:19.000Z","updated":"2018-10-22T23:41:19.000Z","comments":true,"path":"2018/10/22/坑人的C++-2/","permalink":"https://yeshan333.github.io/2018/10/22/%E5%9D%91%E4%BA%BA%E7%9A%84C++-2/","excerpt":"C++文件和流在C++中进行文件处理,可使用标准库fstream 它定义了三个新的数据类型,用于从文件写入流和从文件读取流 数据类型 描述 ofstream 该数据类型表示输出文件流,用于创建文件并向文件中写入信息 ifstream 该数据类型表示输入文件流,用于从文件中读取信息 fstream 该数据类型通常表示文件流,同时具有ofstream和ifstream两种功能,他可以创建文件,向文件中写入信息,从文件中读取信息","text":"C++文件和流在C++中进行文件处理,可使用标准库fstream 它定义了三个新的数据类型,用于从文件写入流和从文件读取流 数据类型 描述 ofstream 该数据类型表示输出文件流,用于创建文件并向文件中写入信息 ifstream 该数据类型表示输入文件流,用于从文件中读取信息 fstream 该数据类型通常表示文件流,同时具有ofstream和ifstream两种功能,他可以创建文件,向文件中写入信息,从文件中读取信息 打开文件ofstream和ifstream对象都可以open()函数打开文件进行写操作。open()函数是ofstream、ifstream、fstream对象的一个成员。open()函数标准语法 void open(const char *filename,ios::openmode mode) 第一个参数为要打开的文件名称和位置 第二个参数为文件打开的模式 模式标志 描述 ios::app 追加模式。所有写入都追加到文件末尾 ios::ate 文件打开后定位到文件末尾 ios::in 打开文件用于读取 ios::out 打开文件用于写入 ios::trunc 如果文件已经存在,其内容在打开文件之前被截断,即把文件长度设为0 打开模式可以两个或者多个结合使用 ofstream outfile; outfile.open("file.data",ios::out|ios::trunc) //outfile.open("file.data",ios::out|ios::in) 关闭文件C++程序终止时,它会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件。听说优秀的程序员会在程序终止前关闭打开的文件 使用close()函数 写入文件 && 读取文件 使用流插入运算符(<<)向文件写入信息,就像使用该运算符输出信息到屏幕上一样,但用的不是cout对象,而是ofstream或者fstream对象 -使用流提取运算符(>>)从文件中读取信息。这里使用的是ifstream或者fstream对象 demo12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include<iostream>#include<fstream>using namespace std;int main(){ char data[100]; //以写模式打开文件 ofstream outfile; outfile.open("afile.data");//这里使用了相对路径 cout<<"writing to the file"<<endl; cout<<"enter your name:"; cin.getline(data,100);//cin对象的附加函数,getline()从外部读取一行 //向文件写入用户输入的数据 outfile<<data<<endl; cout<<"enter your age:"; cin>>data; cin.ignore();//忽略掉之前读语句留下的多余字符 //再次向文件写入用户输入的数据 outfile<<data<<endl; outfile.close(); //以读模式打开文件 ifstream infile; infile.open("afile.data"); cout<<"reading from the file"<<endl; infile>>data; //在屏幕上读取数据 cout<<data<<endl; //再次从文件中读取数据并显示它 infile>>data; cout<<data<<endl; infile.close(); return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"坑人的C++","slug":"坑人的C++","date":"2018-10-22T23:38:58.000Z","updated":"2018-10-22T23:38:58.000Z","comments":true,"path":"2018/10/22/坑人的C++/","permalink":"https://yeshan333.github.io/2018/10/22/%E5%9D%91%E4%BA%BA%E7%9A%84C++/","excerpt":"C++自定义命名空间使用关键字namespace namespace namespace_name { //代码声明 }","text":"C++自定义命名空间使用关键字namespace namespace namespace_name { //代码声明 } 123456789101112131415161718192021222324252627282930#include<iostream>using namespace std;using std::cout;namespace print_myname{ void func() { cout<<"myname: shansan"<<endl; }}namespace print_font{ void func_1() { std::cout<<"什么鬼 !"<<endl; }}using namespace print_myname;using namespace print_font;int main(){ //print_myname::func(); func(); //print_font::func_1(); func_1(); return 0;} 不连续的命名空间 命名空间可以定义在几个不同的部分中,因此命名空间是由几个单独定义的部分组成的。一个命名空间的组成部分可以分布在多个文件中所以,如果命名空间中某个组成部分需要请求定义在另一个文件中的名称,仍然需要声明该名称。下面的命名空间可以定义一个新的命名空间,也可以是为已有的命名空间增加新的元素。 namespace namespace_name { //代码生明 } 嵌套的命名空间可以在一个命名空间中定义另一个命名空间 1234567891011121314151617181920212223242526272829#include<iostream>using namespace std;namespace my_firstname{ void print_firstname() { cout<<"shan "; } namespace my_lastname { void print_lastname() { cout<<"san"<<endl; } }}//using namespace my_firstname;using namespace my_firstname::my_lastname;int main(){ //print_firstname(); //my_lastname::print_lastname(); print_lastname(); return 0;} C++异常处理 异常是在程序执行期间产生的问题。 C++异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。 异常提供了一种转移程序控制权的方式。 C++异常处理关键字 throw:当问题出现时,程序会抛出一个异常。通过throw关键字来完成。 catch:在想要处理问题的地方,通过异常处理程序捕获异常。catch关键字用于捕获异常。 try:try块中的代码标识将被激活的特定异常。他后面通常跟着一个或者多个catch块如果您想让 catch 块能够处理 try 块抛出的任何类型的异常,则必须在异常声明的括号内使用省略号... 12345678try { //被保护代码块 } catch(...) { //能处理任何异常代码 } 12345678910111213141516171819202122232425262728293031#include<iostream>using namespace std;double division(double a,double b){ if(b == 0) { throw "Division by zero condition!"; } return (a/b);}int main(){ int a,b; double temp; scanf("%d%d",&a,&b); try { temp = division(a,b); cout<<temp<<endl; } /*由于我们抛出了一个类型为 const char* 的异常, 因此,当捕获该异常时,我们必须在 catch 块中使用 const char*。*/ catch(const char *msg) { cerr<<msg<<endl; } return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"丘一丘正则表达式","slug":"丘一丘正则表达式","date":"2018-10-18T01:51:46.000Z","updated":"2018-10-18T01:51:46.000Z","comments":true,"path":"2018/10/18/丘一丘正则表达式/","permalink":"https://yeshan333.github.io/2018/10/18/%E4%B8%98%E4%B8%80%E4%B8%98%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/","excerpt":"正则表达式(regular expression,regex,RE) 正则表达式是一种用来简洁表达一组字符串的表达式 正则表达式是一种通用的字符串表达框架 正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具 正则表达式可以用来判断某字符串的特征归属","text":"正则表达式(regular expression,regex,RE) 正则表达式是一种用来简洁表达一组字符串的表达式 正则表达式是一种通用的字符串表达框架 正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具 正则表达式可以用来判断某字符串的特征归属 正则表达式常用操作符 操作符 说明 实例 . 表示任意单个字符 py. 可以匹配pyc,pyy,py!等等 [ ] 字符集,对单个字符给出取值范围 [abc]可以匹配a或b或c;[0-9a-zA-z\\_]可以匹配一个数字、一个字母或者一个下划线 [^ ] 非字符集,对单个字符给出排除范围 [^abc]可以匹配非a或非b或非c的单个字符 * 前一个字符0次或多次扩展 abc* 可以匹配ab、abc、abcc、abccc等等 + 前一个字符的1次或多次扩展 abc+可以匹配abc、abcc、abccc等等 ? 前一个字符0次或1次扩展 abc?可以匹配ab、abc | 左右表达式任意一个 abc|def表示abc、def {m} 扩展前一个字符m次 ab{2}c匹配abbc {m,n} 扩展前一个字符m至n次数(含n) ab{1,2}c可以匹配abc、abbc ^ 匹配字符串开头 ^abc表示abc且在一个字符串的开头,^\\d表示必须以数字开头 $ 匹配字符串结尾 abc表示abc且在一个字符串的结尾、\\d$白哦是必须以数字结尾 ( ) 分组标记,内部只能使用|操作符 (abc|def)表示abc、def \\d 可以匹配一个数字,相当于[0-9] \\d{3}表示匹配3个数字,如010 \\w 可以匹配一个字母或者数字或者下划线,相当于[a-zA-Z0-9_] \\w\\w\\d可以匹配’py3’ \\s 可以匹配一个空格(也包括Tab等空白字符) \\s+表示至少有一个空格,如’ ‘、’ ‘ 精确匹配在正则表达式中,如果直接给出字符,就是精确匹配 ‘pyt’ 匹配’pyt’ ‘00\\d’ 可以匹配’007’ ‘\\w\\d’ 可以匹配’!5’ ‘ye.’ 可以匹配’yes’ ‘(P|p)python’ 可以匹配’Python’、’python’ 高阶精确匹配,经典实例 ^[A-Za-z]+$ 匹配由26个英文字母组成的字符串,如’abrg’、’abgsfsfga’ [a-zA-Z\\][0-9a-zA-Z\\]* 可以匹配由字母或者下划线开头、后接任意一个由字母、数字或者下划线组成的字符串,也就是python的合法变量 ^-?\\d+$ 匹配整数形式的字符串 ^[0-9][1-9][0-9]$ 匹配正整数形式的字符串 [1-9]\\d{5} 中国境内邮政编码,6位 [\\u4e00-\\u9fa5] 匹配中文字符 \\d{3}-\\d{8}|\\d{4}-\\d{7} 国内电话号码,010-68913536 python正则表达式模块,(Re模块) re是python的标准库,主要用于字符串匹配 re库采用raw string类型(原生字符串类型)表示正则表达式,例如r'[1-9]\\d{5}',raw string是不包含对转义符再次转义的字符串 re库也可以采用string类型表示正则表达,但是较为繁琐,例如'[1-9]\\\\d{5}' re库功能函数 函数 说明 re.search() 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象 re.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象 re.findall() 搜索字符串,以列表类型返回全部能匹配的子串 re.split() 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型 re.finditer 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象 re.sub() 在字符串中替换所有匹配正则表达式的子串,返回替换后的字符串 1. re.search(pattern,string,flags=0) 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象 pattern:正则表达式的字符串或原生字符串表示 string:待匹配字符串 flags: 正则表达式使用时的控制标记 常用标记 说明 re.I re.IGNORECASE 忽略正则表达式的大小写,[A-Z]能够匹配小写字符 re.M re.MULTILINE 正则表达式中的^操作符能够将给定字符串的每行当做匹配开始 re.s re.DOTALL 正则表达式中的.操作符能够匹配所有字符串,默认匹配除换行外的所有字符串 2. re.match(pattern,string,flags=0) 从一个字符串的开始位置起匹配正则表达式,返回match对象 pattern:正则表达式的字符串或者原生字符串表示 string:待匹配字符串 flags:正则表达式使用时的控制标记 3. re.findall(pattern,string,flags=0) 搜索字符串,以列表类型返回全部能匹配的字符串 4. re.split(pattern,string,maxsplit=0,flags=0) 将一个字符串按照正则匹配结果进行分割,返回列表类型 maxsplt:最大分割数,剩余部分作为最后一个元素输出 5. re.finditer(pattern,string,flags=0) 搜索字符串,返回一个匹配结果的迭代类型,每个迭代类型是match对象 6. re.sub(pattern,repl,string,cout=0,flags=0) 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串 repl:替换匹配字符串的字符串 cout:匹配的最大替换次数 re库的面向对象用法在python中使用正则表达式的时候,re模块内部会做两件事: 编译正则表达式,如果正则表达式本身不合法,会报错 用编译后的正则表达式去匹配字符串 regex = re.compile(pattern,flags=0) 将正则表达式的字符串形式编译成正则表达式对象 pattern:正则表达式的字符串或原生字符串表示 flags:正则表达式使用时的控制标记 compile后生成了regular expression对象,由于该1对象包含了正则表达式,所以调用对应的方法不用给出正则字符串 re库的Match对象 Match对象是一次匹配的结果,包含很多信息 Match对象的属性 属性 说明 .string 待匹配的文本 .re 匹配使用的pattern对象(正则表达式) .pos 正则表达式搜索文本的开始位置 .endpos 正则表达式搜索文本的结束位置 Match对象的方法 方法 说明 .group(0) 获得匹配后的字符串 .start() 匹配字符串在原始字符串的开始位置 .end() 匹配字符串在原始字符串的结束位置 .span() 返回(.start(),.end())一个元组 re库的贪婪匹配和最小匹配re库默认使用贪婪匹配,即匹配最长的子串 最小匹配 ** 最小匹配操作符 ** 操作符 说明 *? 前一个字符0次或者无限次扩展,最小匹配 +? 前一个字符1次或者无限次扩展,最小匹配 ?? 前一个字符0次或1次扩展,最小匹配 {m,n}? 扩展前一个字符m至n次(包含n),最小匹配 只要输出长度可能不同的,都可以通过在操作符后面加?变成最小匹配 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143193331387014ccd1040c814dee8b2164bb4f064cff000","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"爬虫","slug":"爬虫","permalink":"https://yeshan333.github.io/tags/%E7%88%AC%E8%99%AB/"},{"name":"正则表达式","slug":"正则表达式","permalink":"https://yeshan333.github.io/tags/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/"}]},{"title":"C++面向对象-7","slug":"C++-面向对象-7","date":"2018-10-16T23:39:00.000Z","updated":"2018-10-16T23:39:00.000Z","comments":true,"path":"2018/10/16/C++-面向对象-7/","permalink":"https://yeshan333.github.io/2018/10/16/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-7/","excerpt":"数据抽象 数据抽象(data abstraction)是与面向对象(object-oriented)并列的一种编程范式(programming paradigm)。数据抽象也成为抽象数据类型(abstract data type/ADT)。数据抽象是一种依赖于接口和实现分离的编程(设计)技术。 https://wizardforcel.gitbooks.io/sicp-py/content/2.2.htmlhttp://wj196.iteye.com/blog/860303https://blog.csdn.net/Solstice/article/details/6707148 C++类为数据抽象提供了可能。它们向外界提供了大量用于操作对象数据的公共方法,也就是说,外界实际上并不清楚类的内部实现。数据抽象仅为用户暴露接口,而把具体的实现隐藏了起来","text":"数据抽象 数据抽象(data abstraction)是与面向对象(object-oriented)并列的一种编程范式(programming paradigm)。数据抽象也成为抽象数据类型(abstract data type/ADT)。数据抽象是一种依赖于接口和实现分离的编程(设计)技术。 https://wizardforcel.gitbooks.io/sicp-py/content/2.2.htmlhttp://wj196.iteye.com/blog/860303https://blog.csdn.net/Solstice/article/details/6707148 C++类为数据抽象提供了可能。它们向外界提供了大量用于操作对象数据的公共方法,也就是说,外界实际上并不清楚类的内部实现。数据抽象仅为用户暴露接口,而把具体的实现隐藏了起来 数据抽象的两个优势 类的内部受到保护,不会因为无意的用户级错误导致对象状态受损。 类实现可能随着时间的推移而发生变化,以便应对不断变化的需求,或者应对哪些不改变用户级代码的错误报告。 1234567891011121314151617181920212223242526272829303132333435363738//example://demo#include<iostream>using namespace std;class Student{ private: //对外隐藏的数据 int num; int score; public: //构造函数 Student() { cout<<"Constructor called !"<<endl; } //对外的接口 int SetNum(int number) { this->num = number; return num; } //对外的接口 int SetScore(int s) { this->score = s; return score; }};int main(){ Student A; cout<<A.SetScore(20)<<endl; cout<<A.SetNum(17001)<<endl; return 0;} 数据封装 数据封装是一种把数据和操作数据的函数捆绑在一起的机制。C++程序中,任何带有公有和私有成员的类都可以作为数据封装和数据抽象的实例 1234567891011121314151617181920212223242526272829303132333435363738#include<iostream>using namespace std;class Adder//求和类{ private: //对外隐藏的数据,数据隐藏 int total; public: Adder(int i=0) { total = i; } //对外接口 void addNum(int number) { total += number; } //对外接口 int getTotal() { return total; }};int main(){ Adder A; A.addNum(10); A.addNum(33); cout<<"Total: "<<A.getTotal()<<endl; return 0;}/*- 公有成员addNum和getTotal是对外的接口,用户需要知道他们以便使用类。- 私有成员total是对外的隐藏,用户不需要了解它,但它又是类能正常工作所必须的。*/ 接口(抽象类)如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。抽象类是一种只能定义,不能生成对象的类。 抽象类不能用于实例化对象,只能作为接口使用 如果一个抽象类的子类需要被实例化,则必须实现每个虚函数。即必须在派生类中重载虚函数 接口描述了类的行为和功能,而不需要完成类的特定实现 用于实例化对象的类被称为具体类 抽象类的派类依然可以不完善基类中的纯虚函数,继续作为抽象类被派生,知道给出所有的纯虚函数定义,则成为一个具体类,才可以实例化对象 抽象类因为抽象、无法具化,所以不能作为参数类型、返回值、强转类型 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455//example:#include<iostream>using namespace std;class Shape{ //基类 protected: int width; int height; public: //提供接口框架的纯虚函数 virtual int getArea() = 0; void setWidth(int w) { this->width = w; } void setHeight(int h) { this->height = h; }};//派生类class Rectangle:public Shape{ public: int getArea() { return width*height; }};class Triangle:public Shape{ public: int getArea() { return (width*height)/2; }};int main(){ Rectangle A; //矩形 Triangle B; //三角形 A.setHeight(3); A.setWidth(4); B.setHeight(3); B.setWidth(4); cout<<"Total Rectangle area: "<<A.getArea()<<endl; cout<<"Total Triangle area: "<<B.getArea()<<endl; return 0;} total 数据抽象是一种仅向用户暴露接口而把具体实现细节隐藏起来的一种机制 数据封装是一种把数据和操作数据的函数捆绑在一起的机制 抽象类作为接口使用,不能用于实例化对象","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"recording","slug":"recording","date":"2018-10-16T00:27:52.000Z","updated":"2018-10-16T00:27:52.000Z","comments":true,"path":"2018/10/16/recording/","permalink":"https://yeshan333.github.io/2018/10/16/recording/","excerpt":"辽宁一分钟harage","text":"辽宁一分钟harage 四川一分钟 湖北一分钟 西藏一分钟 云南一分钟 山东一分钟 河南一分钟 陕西一分钟 江西一分钟 深圳一分钟 宁夏一分钟 贵州一分钟 重庆一分钟 江苏一分钟","categories":[],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"定向爬虫-中国大学MOOC-python网络爬虫实例","slug":"定向爬虫-中国大学MOOC-python网络爬虫实例","date":"2018-10-15T23:48:56.000Z","updated":"2018-10-15T23:48:56.000Z","comments":true,"path":"2018/10/15/定向爬虫-中国大学MOOC-python网络爬虫实例/","permalink":"https://yeshan333.github.io/2018/10/15/%E5%AE%9A%E5%90%91%E7%88%AC%E8%99%AB-%E4%B8%AD%E5%9B%BD%E5%A4%A7%E5%AD%A6MOOC-python%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB%E5%AE%9E%E4%BE%8B/","excerpt":"定向爬虫:仅对输入URL进行爬取,不扩展爬取中国大学排名2018","text":"定向爬虫:仅对输入URL进行爬取,不扩展爬取中国大学排名2018 format格式化输出 看下所需信息位置 程序大体框架12345678910111213141516171819202122import requestsfrom bs4 import BeautifulSoupdef getHTMLText(url): return ""def fillUnivList(ulist,html): passdef printUnivList(ulist,num): print("Suc"+str(num))def main(): uinfo = [] url = "" html = getHTMLText(url) fillUnivList(uinfo,html) printUnivList(uinfo,10)main() getHTMLText()12345678def GetHTMLText(url): #获取网页内容 try: r = requests.get(url) r.raise_for_status() #用于捕获异常 r.encoding = r.apparent_encoding return r.text except: return "" fillUnivList()12345678def fillUnivList(ulist, html): # 把网页内容放到数据结构中 soup = BeautifulSoup(html,"html.parser") '''一个tr标签存放一所大学的信息''' for tr in soup.find("tbody").children: if isinstance(tr,bs4.element.Tag): #仅仅遍历标签,过滤掉非标签类型的其它信息 tds = tr('td') #将所有的td标签存放到列表tds中,等价于tr.find_all('td')返回一个列表类型 '''由于进行了遍历,使用print打印tds会得到多个列表''' ulist.append([tds[0].string, tds[1].string, tds[3].string])#向ulist中增加所需要的信息 printUnivList()12345def printUnivlist(ulist, num): print("{:^10}\\t{:^6}\\t{:^10}".format("排名","学校","总分")) for i in range(num): u = ulist[i] print("{:^10}\\t{:^6}\\t{:^10}".format(u[0],u[1],u[2])) main1234567891011121314151617181920212223242526272829303132333435363738import requestsimport bs4 # 用到instancefrom bs4 import BeautifulSoupdef GetHTMLText(url): #获取网页内容 try: r = requests.get(url) r.raise_for_status() #用于捕获异常 r.encoding = r.apparent_encoding return r.text except: return ""def fillUnivList(ulist, html): # 把网页内容放到数据结构中 soup = BeautifulSoup(html,"html.parser") '''一个tr标签存放一所大学的信息''' for tr in soup.find("tbody").children: if isinstance(tr,bs4.element.Tag): #仅仅遍历标签,过滤掉非标签类型的其它信息 tds = tr('td') #将所有的td标签存放到列表tds中,等价于tr.find_all('td')返回一个列表类型 '''由于进行了遍历,使用print打印tds会得到多个列表''' ulist.append([tds[0].string, tds[1].string, tds[3].string])#向ulist中增加所需要的信息def printUnivlist(ulist, num): print("{:^10}\\t{:^6}\\t{:^10}".format("排名","学校","总分")) for i in range(num): u = ulist[i] print("{:^10}\\t{:^6}\\t{:^10}".format(u[0],u[1],u[2]))def main(): uinfo = [] url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html" html = GetHTMLText(url) fillUnivList(uinfo,html) printUnivlist(uinfo,10)main() 代码优化,使用chr(12288)解决中文对齐问题1234567891011121314151617181920212223242526272829303132333435363738394041424344454647import requestsimport bs4 # 用到instancefrom bs4 import BeautifulSoupdef GetHTMLText(url): #获取网页内容 try: r = requests.get(url) r.raise_for_status() #用于捕获异常 r.encoding = r.apparent_encoding return r.text except: return ""def fillUnivList(ulist, html): # 把网页内容放到数据结构中 soup = BeautifulSoup(html,"html.parser") '''一个tr标签存放一所大学的信息''' for tr in soup.find("tbody").children: if isinstance(tr,bs4.element.Tag): #仅仅遍历标签,过滤掉非标签类型的其它信息 tds = tr('td') #将所有的td标签存放到列表tds中,等价于tr.find_all('td')返回一个列表类型 '''由于进行了遍历,使用print打印tds会得到多个列表''' ulist.append([tds[0].string, tds[1].string, tds[3].string])#向ulist中增加所需要的信息'''def printUnivlist(ulist, num): print("{:^10}\\t{:^6}\\t{:^10}".format("排名","学校","总分")) for i in range(num): u = ulist[i] print("{:^10}\\t{:^6}\\t{:^10}".format(u[0],u[1],u[2]))''''''优化输出格式,中文对齐问题,使用chr(12288)表示一个中文空格,utf-8编码'''def printUnivlist(ulist, num): tplt = "{0:^10}\\t{1:{3}^10}\\t{2:^10}" #输出模板,{3}使用format函数第三个变量进行填充,即使用中文空格进行填充 print(tplt.format("排名","学校","总分",chr(12288))) for i in range(num): u = ulist[i] print(tplt.format(u[0],u[1],u[2],chr(12288)))def main(): uinfo = [] url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html" html = GetHTMLText(url) fillUnivList(uinfo,html) printUnivlist(uinfo,10)main()","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"爬虫","slug":"爬虫","permalink":"https://yeshan333.github.io/tags/%E7%88%AC%E8%99%AB/"}]},{"title":"Eyes candy","slug":"Eyes-candy","date":"2018-10-15T23:28:16.000Z","updated":"2018-10-15T23:28:16.000Z","comments":true,"path":"2018/10/15/Eyes-candy/","permalink":"https://yeshan333.github.io/2018/10/15/Eyes-candy/","excerpt":"","text":"","categories":[],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"C++面向对象-6","slug":"C++-面向对象-6","date":"2018-10-14T23:30:27.000Z","updated":"2018-10-14T23:30:27.000Z","comments":true,"path":"2018/10/14/C++-面向对象-6/","permalink":"https://yeshan333.github.io/2018/10/14/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-6/","excerpt":"C++多态C++的多态意味着调用成员函数时,会根据调用的对象的类型来执行不同的函数 编译时的多态,编译时就确定了具体的操作过程。运行时的多态,程序运行过程中才确定的操作过程。操作的过程即称为联编,也称为绑定。","text":"C++多态C++的多态意味着调用成员函数时,会根据调用的对象的类型来执行不同的函数 编译时的多态,编译时就确定了具体的操作过程。运行时的多态,程序运行过程中才确定的操作过程。操作的过程即称为联编,也称为绑定。 静态联编(早绑定),在编译和连接时确认的。比如函数重载,函数模板。效率高 动态联编(后期绑定),运行的时候才能确定是哪块代码段。灵活 静态联编函数调用在程序执行前就准备好了 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include<iostream>#define PI 3.1415926using namespace std;class Point{ private: int x; int y; public: Point(int x=0,int y=0) { this->x=x; this->y=y; } double area() { return 0.0; }};class Circle: public Point{ private: int r; public: Circle(int x,int y,int R):Point(x,y)//基基类中有带参数的构造函数,派生类中的构造函数需要自定义 { this->r=R; } double area() { return r*r*PI; }};int main(){ Point A(3,3);//一个点 Circle B(3,3,3); //一个圆 cout<<A.area()<<endl; cout<<B.area()<<endl; Point *ptr; //Point类型的指针 ptr = &B; //指向了Circle类型 cout<<ptr->area()<<endl;//输出结果不理想 return 0;} 第三个cout输出0的原因:编译器在编译时就依据ptr的类型来执行那个are,指针ptr虽然指向了Circle类型的B,但是指针ptr为Point类型,所以执行Point类里的are方法。这里实行的即为静态编译。此时编译器看的是指针的类型而非内容。 动态编译使用虚函数进行动态联编。程序在任意点可以根据所调用的对象类型来选择调用的函数,这种操作即为动态联编,也成为后期绑定。 虚函数在基类中使用virtual关键字进行声明的函数。 virtual 函数返回值 函数名(形参) { 函数体 } 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include<iostream>#define PI 3.1415926using namespace std;class Point{ private: int x; int y; public: Point(int x=0,int y=0) { this->x=x; this->y=y; } virtual double area() { return 0.0; }};class Circle: public Point{ private: int r; public: Circle(int x,int y,int R):Point(x,y)//基基类中有带参数的构造函数,派生类中的构造函数需要自定义 { this->r=R; } double area() { return r*r*PI; }};int main(){ Point A(3,3);//一个点 Circle B(3,3,3); //一个圆 cout<<A.area()<<endl; cout<<B.area()<<endl; Point *ptr; //Point类型的指针 ptr = &B; cout<<ptr->area()<<endl; cout<<(*ptr).area()<<endl; return 0;} 纯虚函数在基类中不能对虚函数给出有意义的实现,这时侯就使用到了纯虚函数。包含纯虚函数的类是抽象类。抽象类至少包含一个纯虚函数。 定义方式: virtual 返回值 函数名(形参) = 0; 虚析构函数 在C++中,不能把构造函数定义为虚构造函数,因为在实例化一个对象时才会调用构造函数,而且虚函数的实现,其实际本质是通过一个虚函数表指针来调用的,还没有对象更没有没内存空间当然无法调用,故没有实例化一个对象之前的构造函数没有意义也不能实现。析构函数可以为虚函数,而且大多数时候都声明为虚析构函数。这样就可以在基类的指针指向派生类的对象在释放时,可以根据所指向的对象类型动态联编调用子类的析构函数,实现真正的对象内存释放。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include<iostream>using namespace std;class Point{ private: int x; int y; int *str; public: Point(int x=0,int y=0) { this->x=x; this->y=y; str = new int[100]; } ~Point() { delete []str; cout<<"Called Point's Destructor and Delete str !"<<endl; }};class Circle:public Point{ private: int r; int *str; public: Circle(int x,int y,int r):Point(x,y) { this->r=r; str = new int[100]; } ~Circle() { delete []str; cout<<"Called Circle's Destructor and Delete str !"<<endl; }};int main(){ Point *p; p = new Circle(10,10,20); delete p; return 0;} 仅调用了基类的析构函数,这样一来派生类中new出来的4*100字节的内存就会残留,造成内存泄漏!","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"Just relax","slug":"Just-relax","date":"2018-10-13T23:44:56.000Z","updated":"2018-10-13T23:44:56.000Z","comments":true,"path":"2018/10/13/Just-relax/","permalink":"https://yeshan333.github.io/2018/10/13/Just-relax/","excerpt":"","text":"![](https://i.imgur.com/SHZN1xr.jpg)","categories":[],"tags":[{"name":"Astronomy","slug":"Astronomy","permalink":"https://yeshan333.github.io/tags/Astronomy/"}]},{"title":"C++面向对象-5","slug":"C++-面向对象-5","date":"2018-10-12T18:54:32.000Z","updated":"2018-10-12T18:54:32.000Z","comments":true,"path":"2018/10/12/C++-面向对象-5/","permalink":"https://yeshan333.github.io/2018/10/12/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-5/","excerpt":"派生类的构造函数attention: 在创建一个派生类的时候,系统会先创建一个基类。 派生类会吸收基类的全部成员,但不包括构造函数和析构函数。 派生类在调用自己的构造函数之前,会先调用基类的构造函数。","text":"派生类的构造函数attention: 在创建一个派生类的时候,系统会先创建一个基类。 派生类会吸收基类的全部成员,但不包括构造函数和析构函数。 派生类在调用自己的构造函数之前,会先调用基类的构造函数。 1234567891011121314151617181920212223242526272829303132333435#include<iostream>using namespace std;class Clock{ private: int h; int m; int s; public: Clock() { cout<<"Clock's consturctor called !"<<endl; }};class AlarmClock:public Clock{ private: int ah; int am; int as; public: AlarmClock() { cout<<"AlarmClock's constructor called!"<<endl; }};int main(){ AlarmClock A; return 0;} 当基类的构造函数带参的时候,派生类的构造函数应该这么定义: 派生类狗制造函数名字(总形参表列):基类构造函数(实参表类) //注意这里基类的构造函数用了是实际参数 一但基类中有带参数的构造函数,派生类则必须有显式传参的派生类构造函数,来实现基类中参数的传递,完成初始化工作 1234567891011121314151617181920212223242526272829303132333435363738394041424344#include<iostream>using namespace std;class Clock{ private: int h; int m; int s; public: Clock() { cout<<"Clock's constructor called"<<endl; } Clock(int h,int m,int s) { cout<<"Clock's consturctor with paramter called !"<<endl; }};class AlarmClock:public Clock{ private: int ah; int am; int as; public: AlarmClock() { cout<<"AlarmClock's constructor called!"<<endl; } AlarmClock(int h,int m,int s):Clock(h,m,s) { cout<<"AlarmClock's constructor with paramter called!"<<endl; }};int main(){ AlarmClock A; AlarmClock B(20,47,55); return 0;} 派生类的析构函数构造函数调用顺序:基类->派生类析构函数调用顺序:派生类->基类 123456789101112131415161718192021222324252627282930313233343536373839404142#include<iostream>using namespace std;class Clock{ private: int h; int m; int s; public: Clock() { cout<<"Clock's consturctor called !"<<endl; } ~Clock() { cout<<"Clock's destructor called !"<<endl; }};class AlarmClock:public Clock{ private: int ah; int am; int as; public: AlarmClock() { cout<<"AlarmClock's constructor called !"<<endl; } ~AlarmClock() { cout<<"AlarmClock's destructor called !"<<endl; }};int main(){ AlarmClock A; return 0;} 虚基类,使用virtual进行声明 虚继承的出现成为了解决多继承中二义性问题的一种方式 如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员,这时就产生了二义性问题。 123456789101112131415161718192021222324252627282930#include<iostream>using namespace std;class grandfather{ public: int key;};class father_1:public grandfather{};class father_2:public grandfather{};class grandson:public father_1,public father_2{};int main(){ grandson A; A.key = 10; //[Error] return 0;} 在继承的时候在继承类型public之前用virtual修饰一下 虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。 为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类。否则仍然会出现对基类的多次继承。 1234567891011121314151617181920212223242526272829303132#include<iostream>#include<cstdio>using namespace std;class grandfather{ public: int key;};class father_1:virtual public grandfather{};class father_2:virtual public grandfather{};class grandson:public father_1,public father_2{};int main(){ grandson A; A.key = 10; printf("%d",A.key); return 0;} https://www.cnblogs.com/yiranlaobaitu/p/3764422.htmlhttps://blog.csdn.net/bxw1992/article/details/77726390","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"天文学学习记录","slug":"XXX","date":"2018-10-12T16:07:01.000Z","updated":"2018-10-12T16:07:01.000Z","comments":true,"path":"2018/10/12/XXX/","permalink":"https://yeshan333.github.io/2018/10/12/XXX/","excerpt":"图床已挂,需要跨越 G-F-W","text":"图床已挂,需要跨越 G-F-W","categories":[],"tags":[{"name":"Astronomy","slug":"Astronomy","permalink":"https://yeshan333.github.io/tags/Astronomy/"}]},{"title":"信息标记","slug":"信息标记","date":"2018-10-12T00:43:58.000Z","updated":"2019-01-01T00:00:00.000Z","comments":true,"path":"2018/10/12/信息标记/","permalink":"https://yeshan333.github.io/2018/10/12/%E4%BF%A1%E6%81%AF%E6%A0%87%E8%AE%B0/","excerpt":"信息标记的三种形式 XML(eXtensible Markup Language) YAML(YAML Ain’t Markup Language) JSON(JaveScript Object Notation)","text":"信息标记的三种形式 XML(eXtensible Markup Language) YAML(YAML Ain’t Markup Language) JSON(JaveScript Object Notation) XML使用标签标记信息的表达形式 1234567891011<people> <!--这是注释--> <firstname>Shan</firstname> <lastname>Ye</lastname> <address> <streetAddre>None</streetAddre> <city>Gui Lin</city> <zipcode>541004</zipcode> </address> <prof>boy</prof><prof>boring</prof></people> JSON有类型键值对标记信息的表达形式 1234567891011{ "firstname": "Shan", "lastname" : "Ye", "address": { "streetAddre":"None", "city": "Gui Lin", "zipcode": "541004" }} YML无类型键值对标记信息的表达形式 1234567891011121314firstname: Shanlastname: Yeaddress: #缩进表达所属关系 streetAddre: None city: Gui Lin zipcode: 541004prof: #this is a comment-boy #并列关系-boringtext: | #整块数据ACM国际大学生程序设计竞赛(英文全称:ACM International Collegiate Programming Contest(简称ACM-ICPC或ICPC))是由国际计算机协会(ACM)主办的,一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛。经过近40年的发展,ACM国际大学生程序设计竞赛已经发展成为全球最具影响力的大学生程序设计竞赛。赛事目前由IBM公司赞助。 123456789101112131415'''提取HTMl中的所有信息(1)搜索到所有的<a>标签(2)解析<a>标签格式,提取href后的链接内容'''import requestsfrom bs4 import BeautifulSoupurl = "http://python123.io/ws/demo.html"r = requests.get(url)demo = r.textsoup = BeautifulSoup(demo,"html.parser")for link in soup.find_all('a'): print(link.get("href")) 基于bs4库的信息提取的一般方法<>.find_all()方法<>.find_all(name,attrs,recursive,string,**kwargs) name: 对应标签名称的检索字符串 attrs:对应标签属性值的检索字符串,可标注属性检索 recursive:是否对子孙全部检索,默认为True string:<>…</>字符串区域的检索字符串 soup.find_all(…)等价于soup(…).find_all(…)等价于(…) 扩展方法 方法 说明 <>.find() 搜索且只返回一个结果,同.find_all()参数 <>.find_parents() 在先辈节点中搜索,返回列表类型,同.find_all()参数 <>.find_parent() 在先辈节点中返回一个结果,同.find()参数 <>.find_next_siblings() 在后续平行节点中搜索,返回一个列表,同.find_all()参数 <>.find_next_sibling() 在后续节点中返回一个结果,用.find()参数 <>find_previous_siblings() 在前续平行结点中搜索,返回列表类型,同.find_all()参数 <>find.previous_sibling() 在前续节点中返回一个节点,同.find()参数","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"爬虫","slug":"爬虫","permalink":"https://yeshan333.github.io/tags/%E7%88%AC%E8%99%AB/"},{"name":"信息标记","slug":"信息标记","permalink":"https://yeshan333.github.io/tags/%E4%BF%A1%E6%81%AF%E6%A0%87%E8%AE%B0/"}]},{"title":"C++面向对象-4","slug":"C++-面向对象-4","date":"2018-10-11T00:40:05.000Z","updated":"2018-10-11T00:40:05.000Z","comments":true,"path":"2018/10/11/C++-面向对象-4/","permalink":"https://yeshan333.github.io/2018/10/11/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-4/","excerpt":"继承和派生 新类拥有原有类的全部属性为继承!原有类产生新类的过程为派生。 原有类称为基类,产生的新类称为派生类。http://www.dotcpp.com/course/cpp/200027.html 继承方式(派生权限) 公有继承 私有继承 保护继承","text":"继承和派生 新类拥有原有类的全部属性为继承!原有类产生新类的过程为派生。 原有类称为基类,产生的新类称为派生类。http://www.dotcpp.com/course/cpp/200027.html 继承方式(派生权限) 公有继承 私有继承 保护继承 公有继承 基类中的公有成员,在派生类中仍然为公有成员。无论派生类的成员函数还是成员对象都可以访问。 基类中的私有成员,无论在派生类的成员还是派生类对象都不可以访问。 基类中的保护成员,在派生类中仍然是保护类型,可以通过派生类的成员函数访问,但派生类对象不可以访问! 私有继承 基类中的公有和受保护类型,被派生类私有吸收后,都变为派生类的私有类型,即在类的成员函数里可以访问,不能在类外访问。 基类的私有成员,在派生类类内和类外都不可以访问。 保护继承 基类的公共成员和保护类型成员在派生类中为保护成员。 基类的私有成员在派生类中不能被直接访问。 123456789101112131415161718192021222324252627282930313233343536373839404142434445#include<iostream>using namespace std;class Student //基类{ private: int number; public: int Set(int number) { this->number=number; return 0; } int Show() { cout<<"he or she number:"<<number<<endl; }};class Score:public Student //公有继承,派生类{ private: int score; public: int set_score(int score) { this->score=score; return 0; } int show_score() { cout<<"the score is :"<<score<<endl; return 0; }};int main(){ Score A; A.Set(17007101); A.Show(); A.set_score(99); A.show_score(); return 0;} 多继承一个子类可以有多个父类,继承多个父类的特性 class <派生类名>:<继承方式><基类名1>,<继承方式><基类名2>,…{派生类类体} 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657#include<iostream>using namespace std;class Shape{ public: void setWidth(int w) { width = w; } void setHight(int h) { height = h; } protected: int width; int height;};class PaintCost{ public: int GetCost(int area) { return area*70; }};class Rectangle: public Shape,public PaintCost //派生类{ public: int getArea() { return (width*height); }};int main(){ Rectangle Rect; int area; Rect.setWidth(10); Rect.setHight(3); area = Rect.getArea(); //输出对象面积 cout<<"Total area: "<<Rect.getArea()<<endl; //输出总花费 cout<<"Total paint cost: "<<Rect.GetCost(area)<<endl; return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"浅尝BeautifulSoup","slug":"浅尝BeautifulSoup","date":"2018-10-10T18:03:59.000Z","updated":"2018-10-10T18:03:59.000Z","comments":true,"path":"2018/10/10/浅尝BeautifulSoup/","permalink":"https://yeshan333.github.io/2018/10/10/%E6%B5%85%E5%B0%9DBeautifulSoup/","excerpt":"12345678910111213141516import requestsfrom bs4 import BeautifulSoup #引入BeautifulSoup类url = "https://python123.io/ws/demo.html"r = requests.get(url)print(r.status_code)print("\\n")#demo = r.text #html格式信息#soup = BeautifulSoup(demo,"html.parser")#使用html.parser对demo进行html解析soup = BeautifulSoup(open(r"C:\\Users\\Administrator\\Desktop\\beautifulsoup\\demo.html"))print(soup.prettify()) BeautifulSoup官方文档","text":"12345678910111213141516import requestsfrom bs4 import BeautifulSoup #引入BeautifulSoup类url = "https://python123.io/ws/demo.html"r = requests.get(url)print(r.status_code)print("\\n")#demo = r.text #html格式信息#soup = BeautifulSoup(demo,"html.parser")#使用html.parser对demo进行html解析soup = BeautifulSoup(open(r"C:\\Users\\Administrator\\Desktop\\beautifulsoup\\demo.html"))print(soup.prettify()) BeautifulSoup官方文档 BeautifulSoup库解析器 解析器 使用方法 条件 bs4的HTML解析器 beautiful(mk,”html.parser”) 安装bs4库 lxml的HTML解析器 BeautifulSoup(mk,”lxml”) 安装lxml库 lxml的xml解析器 BeautifulSoup(mk,”xml”) 安装lxml库 html5lib的解析器 BeautifulSoup(mk,”html5lib”) 安装html5lib库 BeautifulSoup库的基本元素 基本元素 说明 Tag 标签,最基本的信息组织单元,分别用<></>标明开头和结尾 Name 标签的名字,<p>...</p>的名字是‘p’,格式:<tag>.name Attributes 标签的属性,字典形式组织,格式:<tag>.attrs NavigableString 标签内非属性字符串,<>…</>中字符串,格式:<tag>.string Comment 标签内字符串的注释部分,一种特殊的Comment类型 123456789101112# Tag的Comment元素from bs4 import BeautifulSoupsoup = BeautifulSoup("<b><!--This is a comment--></b><p>This is not a comment</p>","html.parser")print(soup.b.string)print(type(soup.b.string))print(soup.p.string)print(type(soup.p.string)) BeautifulSoup对应一个HTML/XML文档的全部内容 任何存在于HTMl语法中的标签都可以用soup.<tag>访问获得,当HTML文档中存在多个相同<tag>对应内容时,soup.<tag>返回第一个 每个<tag>都有自己的名字,通过<tag>.name获取,字符串类型 一个<tag>可以有0或多个属性,字典类型 NavigableString可以跨越多个层次 基于bs4库的HTML内容遍历方法 标签数的下行遍历 属性 说明 .contents 子节点的列表,将所有儿子节点存人列表 .children 子节点的迭代类型,于.contents类似,用于循环遍历儿子节点 .descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历 12345678910111213141516171819# 标签树的下行遍历import requestsfrom bs4 import BeautifulSoupurl = "https://python123.io/ws/demo.html"r = requests.get(url)demo = r.textsoup = BeautifulSoup(demo,"html.parser")'''for child in soup.body.children: #遍历儿子节点 print(child)'''for child in soup.body.descendants: #遍历子孙节点 print(child) 标签树的上行遍历 属性 说明 .parent 节点的父亲标签 .parents 节点先辈标签的的迭代类型,用于循环遍历先辈节点 123456789101112131415161718# 标签树的上行遍历import requestsfrom bs4 import BeautifulSoupurl = "https://python123.io/ws/demo.html"r = requests.get(url)demo = r.textsoup = BeautifulSoup(demo,"html.parser")for parent in soup.a.parents: #遍历所有先辈节点,包括soup本身,soup的先辈不存在name信息 if parent is None: print(parent) else: print(parent.name) 标签树的平行遍历平行遍历发生在同一个父节点下的各节点之间 属性 说明 .next_sibling 返回按照HTML文本顺序的下一个平行节点标签 .previous_sibling 返回按照HTML文本顺序的上一个平行节点标签 .next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签 .previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签 123456789101112131415161718# 标签树的平行遍历import requestsfrom bs4 import BeautifulSoupurl = "https://python123.io/ws/demo.html"r = requests.get(url)demo = r.textsoup = BeautifulSoup(demo,"html.parser")for sibling in soup.a.next_sibling: print(sibling) #遍历后续节点'''for sibling in soup.a.previous_sibling: print(sibling) #遍历前续节点''' 基于bs4库的HTML格式输出—prettify()方法 .prettify()为HTML文本<>及其内容增加’\\n’ .prettify()可用于标签,方法:<tag>.perttify() bs4库将任何HTML输入都变成utf-8编码","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"爬虫","slug":"爬虫","permalink":"https://yeshan333.github.io/tags/%E7%88%AC%E8%99%AB/"},{"name":"BeautifulSoup","slug":"BeautifulSoup","permalink":"https://yeshan333.github.io/tags/BeautifulSoup/"}]},{"title":"C++面向对象-3","slug":"C++-面向对象-3","date":"2018-10-09T00:12:54.000Z","updated":"2018-10-09T00:12:54.000Z","comments":true,"path":"2018/10/09/C++-面向对象-3/","permalink":"https://yeshan333.github.io/2018/10/09/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-3/","excerpt":"友元函数和友元类 友元的对象可以是全局的一般函数,也可以是其它类里的成员函数,这种叫做友元函数。友元还可以是一个类,这种叫做友元类,这时整个类的所有成员都是友元","text":"友元函数和友元类 友元的对象可以是全局的一般函数,也可以是其它类里的成员函数,这种叫做友元函数。友元还可以是一个类,这种叫做友元类,这时整个类的所有成员都是友元 一、友元函数 类的友元函数定义在类的外部,但是有权访问类的所有私有成员和保护成员。但友元函数并不是成员函数。 有元函数的声明使用friend关键字 12345678910111213141516171819202122232425262728293031323334353637383940414243#include<iostream>#include<math.h>using namespace std;class Point{ private: double x; double y; public: Point(double a,double b) //Constructor { x=a; y=b; } int GetPoint() { cout<<"("<<x<<","<<y<<")"<<endl; return 0; } friend double Distance(Point &a,Point &b);//声明友元函数};double Distance(Point &a,Point&b){ double xx; double yy; xx = a.x-b.x; yy = a.y-b.y; return sqrt(xx*xx+yy*yy);}int main(){ Point A(2.0,3.0); Point B(1.0,2.0); A.GetPoint(); B.GetPoint(); double dis; dis = Distance(A,B); cout<<dis<<endl; return 0;} 友元函数没有this指针,参数的情况; 要访问非static成员时,需要对象做参数 要访问static成员或全局变量时,则不需要对象做参数 如果做参数的对象时全局对象,则不需要对象做参数,可直接调用友元函数,不需要通过对象或指针。 二、友元类把一个类A声明为另一个类B的友元类,则类A中的所有成员函数都可以访问类B中的成员。在类B中声明即可。 friend class A; 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include<iostream>#include<Cmath>using namespace std;class Point{ private: double x; double y; public: Point(double a,double b)//Constructor { x=a; y=b; } int GetPoint() { cout<<"("<<x<<","<<y<<")"<<endl; return 0; } friend class Tool;//声明友元类};class Tool{ public: double Get_x(Point &A ) { return A.x; } double Get_y(Point &A) { return A.y; } double Distance(Point &A) //求一点到原点的距离 { cout<<sqrt(A.x*A.x+A.y*A.y)<<endl; return sqrt(A.x*A.x+A.y*A.y); }} ;int main(){ Point A(3.0,3.0); A.GetPoint(); Tool T; T.Get_x(A); T.Get_y(A); T.Distance(A); return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"C++面向对象-2","slug":"C++-面向对象-2","date":"2018-10-06T16:20:16.000Z","updated":"2018-10-06T16:20:16.000Z","comments":true,"path":"2018/10/06/C++-面向对象-2/","permalink":"https://yeshan333.github.io/2018/10/06/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-2/","excerpt":"类的构造函数(Constructor)和析构函数(Destructor)","text":"类的构造函数(Constructor)和析构函数(Destructor) 构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。构造函数的名称与类的名称是完全相同的,并且不会反回任何类型,也不会反回void。 析构函数也是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。函数名称与类的名称完全相同,只是在前面加了个~波浪线作为前缀,它不会返回任何值,也不能带有任何参数。 1.构造函数(Constructor)  当我们定义一个类的对象时,系统就会自动调用它,进行专门的初始化对象用。如果我们没有定义构造函数,系统会默认生成一个默认形式,隐藏着的构造函数,这个构造函数的函数体是空的,它不具有任何功能。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include<iostream>#include<Cstring>using namespace std;class Student{ private: int num; char name[100]; int score; public: Student(int n,char *str,int s); int print(); int Set(int n,char *str,int s);};Student::Student(int n,char *str,int s)//定义了一个带默认参数的构造函数{ num=n; strcpy(name,str); score=s; cout<<"Constructor"<<endl;}int Student::print(){ cout<<num<<" "<<name<<" "<<score; return 0;}int Student::Set(int n,char *str,int s){ num=n; strcpy(name,str); score=s;}int main(){ Student A(1700710135,"yeshan",99); A.print(); //Student C;这样定义对象会报错,因为我们在类中定义了一个带默认参数的构造函数 cout<<endl; Student B(1700710134,"xu jie",100); B.print(); return 0;} 由于在程序中定义了一个带默认参数的构造函数,则系统不会再自动生成,这个时候定义对象时也要传入三个默认初始值,因为构造函数可以重载,可以有多个兄弟,系统会找最匹配的一个函数 2.析构函数(Destructor) 对象销毁时自动调用的一个函数,析构函数不能重载,一个类只能有一个析构函数,析构函数有助于跳出程序前释放内存。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include<iostream>#include<Cstring>using namespace std;class Student{ private: int num; char name[100]; int score; public: Student(int n,char *str,int s); ~Student(); int print(); int Set(int n,char *str,int s);};Student::Student(int n,char *str,int s)//构造函数{ num=n; strcpy(name,str); score=s; cout<<num<<" "<<name<<" "<<score<<" "; cout<<"Constructor"<<endl;}Student::~Student()//析构函数{ cout<<num<<" "<<name<<" "<<score<<" "; cout<<"destructor"<<endl;}int Student::print(){ cout<<num<<" "<<name<<" "<<score<<endl; return 0;}int Student::Set(int n,char *str,int s){ num=n; strcpy(name,str); score=s;}int main(){ Student A(100,"dot",11); Student B(101,"cpp",12); return 0;} 对象A和B的构造函数的调用顺序以及构造函数的调用顺序,完全相反!原因在于A和B对象同属局部对象,也在栈区存储,也遵循“先进后出”的顺序! 拷贝构造函数 拷贝构造函数是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。当定义一个新对象并用同一个类型的对象对它进行初始化时,将显示使用拷贝构造函。 只包含类类型成员或内置类型(但不是指针类型)成员的类,无须显式地定义拷贝构造函数也可以拷贝。 显示定义拷贝构造函数的情况: 类有数据成员是指针; 有成员表示在构造函数中分配的其他资源 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152#include<iostream>using namespace std;class Age{ public: int GetAge(void); Age(int age); //Constructor Age(const Age& A); //Copy Constructor ~Age(); //Desconstructor private: int *ptr;};Age::Age(int age){ cout<<"调用构造函数"<<endl; ptr = new int;//为指针分配内存 *ptr = age;}Age::Age(const Age& A){ cout<<"调用拷贝构造函数,并为指针ptr分配内存"<<endl; ptr = new int; *ptr = *A.ptr; //拷贝值}Age::~Age(){ cout<<"释放内存"<<endl; delete ptr;}int Age::GetAge(void){ return *ptr;}void print_age(Age A){ cout<<"the age: "<<A.GetAge()<<endl; //这里也调用了拷贝构造函数}int main(){ Age member_1(10); Age member_2(member_2);//相当于Age member_2 = member_1; return 0;} 成员变量中加一个了指针成员,初始化中需要动态开辟内存,如果不自定义拷贝构造函数,而是用默认生成的,则会出现极大的安全隐患。默认的拷贝构造函数仅仅是进行数值赋值,并不能为指针开辟内存空间。相当于代码This->str=str.本质上也就是两个指针指向了一块堆空间。程序结束回收对象的时候,会调用自己的析构函数,释放这块内存空间,由于两个对象要调用两次,即delete两次,就会出现错误 [引自](http://www.dotcpp.com/course/cpp/200020.html) C++中的this指针对象中隐藏的指针 每一个对象都能通过this指针来访问自己的地址。this指针是所有成员函数额隐含参数。因此在成员函数内部,它可以用来指向调用的对象。 如果程序中有多个属于同一类的对象,因成员函数的代码仅有一份,所以为了区分它们是哪个对象调用的成员函数,编译器也是转化成this->成员函数这种形式来使用的。 友元函数没有this指针,因为友元不是类的成员。只有成员函数才有this指针。 123456789101112131415161718192021222324252627282930313233343536#include<iostream>using namespace std;class Age{ public: Age(int your_age=18) //Constructor function { cout<<"Constructor now"<<endl; age=your_age; } int GetAge() { return age; } int compare(Age member) { return this->GetAge()>member.GetAge(); //看这里 } private: int age;};int main(){ Age member_1(20),member_2(24); if(member_1.compare(member_2)) { cout<<"member_1 is older than member_2"<<endl; } else { cout<<"member_1 is younger than member_2"<<endl; }} 关键字new和delete new(新建)用于新建一个对象。new 运算符总是返回一个指针。由 new 创建。 delete(删除)释放程序动态申请的内存空间。delete 后面通常是一个指针或者数组 [],并且只能 delete 通过 new 关键字申请的指针。","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"C++面向对象","slug":"C++-面向对象","date":"2018-10-05T23:15:07.000Z","updated":"2018-10-05T23:15:07.000Z","comments":true,"path":"2018/10/05/C++-面向对象/","permalink":"https://yeshan333.github.io/2018/10/05/C++-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/","excerpt":"类 & 对象 类是对象的抽象和概括,而对象是类的具体和实例","text":"类 & 对象 类是对象的抽象和概括,而对象是类的具体和实例 类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。 类中的数据和方法称为类的成员。(成员有变量也有函数,分别成为类的属性和方法) 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include<iostream>#include<Cstring>using namespace std;/*class Student{ public: int num; char name[100]; int score; int print() { cout<<num<<" "<<name<<" "<<score; return 0; }};*/class Student{ public: int num; char name[100]; int score; int print();};int Student::print(){ cout<<num<<" "<<name<<" "<<score; return 0;}int main(){ Student A; A.num=1700710135; strcpy(A.name,"ye shan"); A.score=100; //A.print(); //Student *Ap; //Ap=&A; //Ap->print(); Student& A_reference=A; //引用定义时就要初始化 //A_reference=A; 错误 A_reference.print(); return 0;} 类的定义 定义一个类,本质上是定义一个数据类型的蓝图。它定义类的对象包括了什么,以及可以在这个对象上执行哪些操作。 类的定义以关键字class开头,后面跟类的名称。类的主体包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。 写法1成员函数定义在在类里 123456789101112class Student{ public: //声明公有成员,可被类的任何对象访问 int num; char name[100]; int score; int print() { cout<<num<<" "<<name<<" "<<score; return 0; }}; 写法2成员函数定义在类外,使用范围解析运算符(作用域限定符):: 在::限定符前必须使用类名 1234567891011121314class Student{ public: int num; char name[100]; int score; int print();};int Student::print(){ cout<<num<<" "<<name<<" "<<score; return 0;} 对象的建立和使用 类就是包含函数的结构体,是一种自定义数据类型,用它定义出来变量,就是对象,这就是所谓的“对象是类的具体和实例”,定义了一个这个类的对象,也可以说实例化了一个对象,就是这个意思! 声明类的对象,就像声明基本的变量类型一样 访问公共数据成员可以使用直接成员访问运算符.来访问 Student A; //声明A,类型为Student A.num=1700710135; strcpy(name,”ye shan”); A.score=100; A.print(); 类的访问修饰符 private protected public 成员和类的默认访问修饰符是private  私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员。 保护成员修饰符protected,保护成员变量或函数与私有成员十分相似,但有一点不同,保护成员变量在派生类(即子类)中是可以访问的。 公有成员在程序中类的外部是可以访问的。可以在不适用任何成员函数来设置和获取公有变量的值 1234567891011121314151617181920212223242526272829303132333435363738394041#include<iostream>#include<Cstring>using namespace std;class Student{ private: int num; protected: int score; public: char name[100]; int GetNum(int n); int GetScore(int s);};int Student::GetNum(int n){ num=n; return num;}int Student::GetScore(int s){ score=s; return score;}int main(){ Student A; strcpy(A.name,"yeshan"); cout<<"the name is"<<" "<<A.name<<endl; //A.num=1700710135,成员num是稀有的,不可这样用 cout<<"the num is"<<" "<<A.GetNum(1700710135)<<endl; cout<<"the score is"<<" "<<A.GetScore(100)<<endl; return 0;} 派生类中使用protected成员变量 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include<iostream>#include<Cstring>using namespace std;class Student{ private: int num; protected: int score; public: char name[100]; int GetNum(int n); int GetScore(int s);};class Small_Student:Student//Small_Student是派生类{ public: int Get_Score_1(int temp);};int Small_Student::Get_Score_1(int temp) //子类成员函数{ score=temp; return score;}int Student::GetNum(int n){ num=n; return num;}int Student::GetScore(int s){ score=s; return score;}int main(){ Student A; strcpy(A.name,"yeshan"); cout<<"the name is"<<" "<<A.name<<endl; //A.num=1700710135,成员num是稀有的,不可这样用 cout<<"the num is"<<" "<<A.GetNum(1700710135)<<endl; cout<<"the score is"<<" "<<A.GetScore(100)<<endl; Small_Student B; cout<<"the score is"<<" "<<B.Get_Score_1(520)<<endl; return 0;} 类的静态成员使用static关键字把类成员定义为静态的 静态成员数据 静态成员在类的所有对象中是共享的。如果不存在其它初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。 不能把静态成员放置在类的定义中,但是可以在类的外部通过使用范围解析运算符::来重新声明静态变量,从而对它进行初始化。 1234567891011121314151617181920212223242526272829303132#include<iostream>using namespace std;class Area{ private: double length; double width; public: static int object_count; Area(double x,double y) { length = x; width = y; object_count++;//每次创建对象时加一 } double Print_Area() { return length*width; }};int Area::object_count=0;//初始化类Area的静态成员int main(){ Area number_1(3,4); Area number_2(5,6); cout<<"creat "<<Area::object_count<<" object"<<endl; //使用 类名+范围解析运算符::+静态成员变量 访问静态成员数据 cout<<"the area of number_1 is "<<number_1.Print_Area();} 静态成员函数 静态成员函数即使在类对象不存在的情况下也能被调用。 静态成员函数只能访问静态数据成员,不能访问其他静态成员函数和类外部的函数 静态成员函数有一个类范围,他们不能访问类的this指针。可以用静态成员函数来判断某些对象是否已被创建。 调用时使用 类名+范围解析运算符+静态成员函数名 1234567891011121314151617181920212223242526272829303132333435363738#include<iostream>using namespace std;class Area{ private: double length; double width; public: static int object_count; //静态成员数据 static int get_count() //静态成员函数 { return object_count; } Area(double x,double y) { cout<<"Constructor"<<endl; length = x; width = y; object_count++;//每次创建对象时加一 } double Print_Area() { return length*width; }};int Area::object_count=0;//初始化类Area的静态成员int main(){ cout<<"number of objects:"<<Area::get_count()<<endl; Area number_1(3,4); Area number_2(5,6); cout<<"after creat object ,number of objects:"<<Area::get_count()<<endl; return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"C++入坑记(3)","slug":"C++-入坑记-3","date":"2018-10-04T20:44:06.000Z","updated":"2018-10-04T20:44:06.000Z","comments":true,"path":"2018/10/04/C++-入坑记-3/","permalink":"https://yeshan333.github.io/2018/10/04/C++-%E5%85%A5%E5%9D%91%E8%AE%B0-3/","excerpt":"变量初始化问题当局部变量被定义时,系统不会自动对其初始化;当全局变量被定义时,系统会初始化为下列值: 数据类型 初始化默认值 int 0 float 0 double 0 char ‘\\0’ pointer NULL","text":"变量初始化问题当局部变量被定义时,系统不会自动对其初始化;当全局变量被定义时,系统会初始化为下列值: 数据类型 初始化默认值 int 0 float 0 double 0 char ‘\\0’ pointer NULL C++储存类 auto static extern register mutable thread_local static储存类 用于指示编译器在程序的生命周期内保持局部变量的存在,而不需要每次在它进入和离开作用域时进行创建和销毁。 static修饰局部变量,可以在函数调用之间保持局部变量的值 static修饰全局变量,会使变量的作用域限制在生明它的文件内参考 1234567891011121314151617181920#include<iostream>using namespace std;static int count=10; //全局变量void func(){ static int i=5; //局部静态变量 i++; cout<<"变量i为:"<<i; cout<<",变量count为:"<<count<<endl;}int main(){ while(count--) { func(); } return 0;} extern储存类 用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。使用extern时,对于无法初始化的变量,会把变量名指向一个之前已经定义过的存储位置。当有多个文件且定义了一个就可在其他文件中使用的全局变量或函数时,可以在其他文件中使用extern来得到已定义的变量或函数的引用。 C++引用 引用变量是一个别名。它是某个已存在的变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量 引用与指针的差别 不存在空引用,引用必须连接到一块合法的内存。 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。 引用必须在创建时被初始化。指针可以在任何时间被初始化。 引用可以当成变量附属在内存的第二个标签 int i; //为i声明一个引用变量 int& r=i; 12345678910111213141516171819202122#include<iostream>using namespace std;int main(){ int i; double d; //声明引用变量 int& r=i; double& s=d; i=3; cout<<"Value of i:"<<i<<endl; cout<<"Value of i reference::"<<r<<endl; d=5.20; cout<<"d= "<<d<<endl; cout<<"Value of d reference:"<<s<<endl; return 0;} 用引用做函数形参12345678910111213141516171819202122#include<iostream>using namespace std;void swap(int& x,int& y){ int temp; temp = x; x = y; y = temp;}int main(){ int a,b; cin>>a>>b; cout<<"a="<<a<<" "<<"b="<<b<<endl; swap(a,b); cout<<"after exchange:"<<endl; cout<<"a="<<a<<" b="<<b<<endl; return 0;} 引用做返回值当函数返回一个引用时,则返回一个指向返回值的隐式指针。 1234567891011121314151617181920212223242526272829#include<iostream>#include<ctime>using namespace std;int vals[]={1,2,3,4,5};int& setValues(int i){ return vals[i];//返回第i个元素的引用}int main(){ cout<<"before change:"<<endl; for(int i=0;i<5;i++) { cout<<vals[i]<<" "; } setValues(1)=520; //change the second value setValues(3)=1314; //change the forth value cout<<endl<<"after change:"<<endl; for(int i=0;i<5;i++) { cout<<vals[i]<<" "; } return 0;}","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"工具小整合","slug":"工具小整合","date":"2018-10-03T15:00:06.000Z","updated":"2018-10-03T15:00:06.000Z","comments":true,"path":"2018/10/03/工具小整合/","permalink":"https://yeshan333.github.io/2018/10/03/%E5%B7%A5%E5%85%B7%E5%B0%8F%E6%95%B4%E5%90%88/","excerpt":"","text":"百度文库、知网文章下载https://pan.baidu.com/s/1-BY2B4hBn_3wHgYlXkFLCg 百度云下载提速软件https://pan.baidu.com/s/1EYy5AN9JVv7m42f6NNmvlA 微软PE工具箱https://pan.baidu.com/s/1J1Nud9qTU6jSP6cTpk8Zlg window10数字权利激活工具 github: https://github.com/TGSAN/CMWTAT_Digital_Edition/releases https://github.com/vyvojar/slshim/releases 激活方法参考https://pan.baidu.com/s/1_VqJiuBeCHLyRp5Xcc562wkms激活工具win10下载 Gif制作工具https://pan.baidu.com/s/1Eu_O-7EPSB81cwmR-R1zvw提取码:q51n 录屏软件https://pan.baidu.com/s/1VsN5XClhZiRCqUyxbTJ_tg提取码:vlrb CamStudio汉化版提取码:kckg","categories":[],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"}]},{"title":"C++入坑记(2)","slug":"C++-入坑记-2","date":"2018-10-03T11:47:26.000Z","updated":"2018-10-03T11:47:26.000Z","comments":true,"path":"2018/10/03/C++-入坑记-2/","permalink":"https://yeshan333.github.io/2018/10/03/C++-%E5%85%A5%E5%9D%91%E8%AE%B0-2/","excerpt":"函数,默认参数的使用在C++中,允许在自定义函数的形参列表中,给形参一个默认的值,这样在调用的时候如果有实参,那么按照实参传递给形参的方法使用;若调用的时候没有指定对应的实参,则形参将使用默认值。由于参数的传递顺序是从右至左入栈,所以有默认值的参数必须在放在形参列表的最右边!","text":"函数,默认参数的使用在C++中,允许在自定义函数的形参列表中,给形参一个默认的值,这样在调用的时候如果有实参,那么按照实参传递给形参的方法使用;若调用的时候没有指定对应的实参,则形参将使用默认值。由于参数的传递顺序是从右至左入栈,所以有默认值的参数必须在放在形参列表的最右边! 12345678910111213#include<iostream>using namespace std;int Sum(int a=4,int b=5){ return a+b;}int main(){ cout<<Sum(5,7)<<endl; cout<<Sum()<<endl; cout<<Sum(9)<<endl; return 0;} 函数重载函数重载即两个或以上的函数,函数名相同,但形参类型或个数不同,编译器根据调用方传入的参数的类型和个数,自动选择最适合的一个函数来进行绑定调用,自动实现选择。 123456789101112131415161718192021222324252627282930#include<iostream>using namespace std;int sum(int a,int b){ return a+b;}double sum(double a,double b){ return a+b;}double sum(double a,int b){ return a+b;}double sum(int a,double b){ return a+b;}int main(){ cout<<sum(1,2)<<endl; cout<<sum(1.414,2.526)<<endl; cout<<sum(3.14,6)<<endl; cout<<sum(8,9.9)<<endl; return 0;} 函数模板(template)模板是创建泛型类或函数的蓝图或公式。是泛型编程的基础。函数模板,是可以创建一个通用的函数,可以支持多种形参。用关键字template来定义模板函数定义的一般形式 template<class 类型名1,class 类型名2> 返回值 函数名(形参列表) { 函数体 } 1234567891011121314151617#include<iostream>using namespace std;template<class T1,class T2>T1 sum(T1 a,T2 b)//模板函数中的T1和T2类型将根据实际传入的类型变成具体类型。这个化成就叫做模板的实例化。//T1、T2是函数所使用的数据类型的占位符名称。这个名称可以在函数定义中使用。{ cout<<sizeof(T1)<<","<<sizeof(T2)<<"\\t"; return a+b;}int main(){ cout<<sum(1,2)<<endl; cout<<sum(3.14,1.414)<<endl; cout<<sum('A',2)<<endl; return 0;} inline内联函数 内联函数的基本思想在于将每个函数调用都以它的代码体来替换 内联函数减少了不必要的函数栈帧的开销,节约内存 内联函数以空间换取了时间,但是inline对编译器只是一个建议,如果定义的函数体内有循环或递归等,编译器优化时会自动忽略掉内联 12345678910111213#include<iostream>using namespace std;inline int Max(int a,int b){ return a>b?a:b;}int main(){ cout<<Max(3,5)<<endl; cout<<Max(7,9)<<endl; return 0;} 内联函数的定义要在调用之前出现","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"ACM入门(占个位)","slug":"ACM入门","date":"2018-10-02T22:48:28.000Z","updated":"2018-10-02T22:48:28.000Z","comments":true,"path":"2018/10/02/ACM入门/","permalink":"https://yeshan333.github.io/2018/10/02/ACM%E5%85%A5%E9%97%A8/","excerpt":"A+B for Input-Output Practice(using C++)1. Problem Description Your task is to Calculate a + b. Too easy?! Of course! I specially designed the problem for acm beginners. You must have found that some problems have the same titles with this one, yes, all these problems were designed for the same aim Input The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line. Output For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input. Sample Input 1 61 20 Sample Output 721","text":"A+B for Input-Output Practice(using C++)1. Problem Description Your task is to Calculate a + b. Too easy?! Of course! I specially designed the problem for acm beginners. You must have found that some problems have the same titles with this one, yes, all these problems were designed for the same aim Input The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line. Output For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input. Sample Input 1 61 20 Sample Output 721 1234567891011#include<iostream>using namespace std;int main(){ int x,y; while(cin>>x>>y) { cout<<x+y<<endl; } return 0;} 2. Problem Description The first line integer means the number of input integer a and b. Your task is to Calculate a + b. Input Your task is to Calculate a + b. The first line integer means the numbers of pairs of input integers. Output For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input. Sample Input 210 2022 36 Sample Output 3058 1234567891011121314#include<iostream>using namespace std;int main(){ int n,i; int a,b; cin>>n; for(i=0;i<n;i++) { cin>>a>>b; cout<<a+b<<endl; } return 0;} 3. Problem Description Your task is to Calculate a + b. Input Input contains multiple test cases. Each test case contains a pair of integers a and b, one pair of integers per line. A test case containing 0 0 terminates the input and this test case is not to be processed. Output For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input. Sample Input 1 510 200 0 Sample Output 630 12345678910111213#include<iostream>using namespace std;int main(){ int a,b; while(cin>>a>>b) { if(a==0&&b==0)break; else cout<<a+b<<endl; } return 0;} 4. Problem Description Your task is to Calculate the sum of some integers. Input Input contains multiple test cases. Each test case contains a integer N, and then N integers follow in the same line. A test case starting with 0 terminates the input and this test case is not to be processed. Output For each group of input integers you should output their sum in one line, and with one line of output for each line in input. Sample Input 4 1 2 3 45 1 2 3 4 50 Sample Output 1015 123456789101112131415161718#include<iostream>using namespace std;int main(){ int n; while(cin>>n) { if(n==0)return 0; int x,sum=0; while(n--) { cin>>x; sum+=x; } cout<<sum<<endl; } return 0;} 5. Problem Description Your task is to calculate the sum of some integers. Input Input contains an integer N in the first line, and then N lines follow. Each line starts with a integer M, and then M integers follow in the same line. Output For each group of input integers you should output their sum in one line, and with one line of output for each line in input. Sample Input 24 1 2 3 45 1 2 3 4 5 Sample Output 1015 12345678910111213141516171819202122#include<iostream>using namespace std;int main(){ int N; int i; int n,x; cin>>N; for(i=0;i<N;i++) { int n; int x,sum=0; cin>>n; while(n--) { cin>>x; sum += x; } cout<<sum<<endl; } return 0;} 6. Problem Description Your task is to calculate the sum of some integers. Input Input contains multiple test cases, and one case one line. Each case starts with an integer N, and then N integers follow in the same line. Output For each test case you should output the sum of N integers in one line, and with one line of output for each line in input. Sample Input 4 1 2 3 4 55 1 2 3 4 5 Sample Output 1015 123456789101112131415161718#include<iostream>using namespace std;int main(){ int n; int x,sum=0; while(cin>>n) { while(n--) { cin>>x; sum +=x; } cout<<sum<<endl; sum=0; } return 0;} 7. Problem Description Your task is to Calculate a + b. Input The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line. Output For each pair of input integers a and b you should output the sum of a and b, and followed by a blank line. Sample Input 1 510 20 Sample Output 630 123456789101112#include<iostream>using namespace std;int main(){ int x,y; while(cin>>x>>y) { cout<<x+y<<endl; cout<<endl; } return 0;} 8. Problem Description Your task is to calculate the sum of some integers Input Input contains an integer N in the first line, and then N lines follow. Each line starts with a integer M, and then M integers follow in the same line Output For each group of input integers you should output their sum in one line, and you must note that there is a blank line between outputs. Sample Input 34 1 2 3 45 1 2 3 4 56 1 2 3 4 5 6 Sample Output 101521 12345678910111213141516171819202122#include<iostream>using namespace std;int main(){ int N; int n,x; int sum=0; cin>>N; while(N--) { cin>>n; while(n--) { cin>>x; sum +=x; } cout<<sum<<endl; cout<<endl; sum=0; } return 0;}","categories":[{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/categories/Algorithm/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"},{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/tags/Algorithm/"}]},{"title":"C++入坑记","slug":"C++-入坑记","date":"2018-10-02T00:40:03.000Z","updated":"2018-10-02T00:40:03.000Z","comments":true,"path":"2018/10/02/C++-入坑记/","permalink":"https://yeshan333.github.io/2018/10/02/C++-%E5%85%A5%E5%9D%91%E8%AE%B0/","excerpt":"C++关键字https://www.runoob.com/w3cnote/cpp-keyword-intro.html asm else new this auto enum operator throw bool explicit private true break export protected try case extern public typedef catch false register typeid char for return union const friend short unsigned const_cast goto signed using continue if sizeof virtual default inline static void delete int static_cast volatile do long struct wchar_t double mutable switch while dynamic_cast namespace template …","text":"C++关键字https://www.runoob.com/w3cnote/cpp-keyword-intro.html asm else new this auto enum operator throw bool explicit private true break export protected try case extern public typedef catch false register typeid char for return union const friend short unsigned const_cast goto signed using continue if sizeof virtual default inline static void delete int static_cast volatile do long struct wchar_t double mutable switch while dynamic_cast namespace template … 入坑C++1234567891011#include<iostream> //文件包含,包含iostream标准库using namespace std; //声明一个叫std的命名空间int main(){ string my_name; int age; cin>>my_name>>age; cout<<my_name<<' '<<age; cout<<"\\nHello C++ !"<<endl<<"Nice"<<"\\n\\n"; cout<<"Nice to meet you !";} 流提取运算符>>流插入运算符<< 什么是命名空间 命名空间(namespace)为防止名字冲突提供了更加可控的机制。 一个命名空间的定义包含两部分:首先是关键字namespace,随后是命名空间的名字。在命名空间名字后面是一系列由花括号括起来的声明和定义。只要能出现在全局作用域中的声明就能置于命名空间内,主要包括:类、变量(及其初始化操作)、函数(及其定义)、模板和其它命名空间。命名空间结束后无须分号,这一点与块类似。和其它名字一样,命名空间的名字也必须在定义它的作用域内保持唯一。命名空间既可以定义在全局作用域内,也可以定义在其它命名空间中,但是不能定义在函数或类的内部。命名空间作用域后面无须分号。 https://blog.csdn.net/fengbingchun/article/details/78575978?utm_source=copy只是新标准中使用不带.h的头文件包含时,必须要声明命名空间,并且包含头文件在前,声明使用的名字空间在后。 例如标准C++库提供的对象都存在std这个标准名字中,比如cin,cout,endl。 写法–1123456789101112#include<iostream>using namespace std;int main(){ int a; cin>>a; cout<<a<<endl; cout<<"**************************\\n"; cout<<"Hello World!"<<endl; cout<<"**************************\\n"; return 0;} 写法–2使用域限定符::来逐个制定,cout和endl前面分别用std::指明,表示来自std 1234567891011#include<iostream>int main(){ int a; std::cin>>a; std::cout<<a<<std::endl; std::cout<<"**************************\\n"; std::cout<<"Hello World!"<<std::endl; std::cout<<"**************************\\n"; return 0;} 写法–3用using和域限定符一起制定用哪些名字 1234567891011121314#include<iostream>using std::cin;using std::cout;using std::endl;int main(){ int a; cin>>a; cout<<a<<endl; cout<<"**************************\\n"; cout<<"Hello World!"<<endl; cout<<"**************************\\n"; return 0;} 在用cin和cout输入和输出数据时,不需要手动控制数据类型就可以使用 更新于2018/10/4 23:15:56 I/O库头文件 <iostream>、<iomanip>、<fstream> 头文件 函数和描述 iostream 该文件定义了cin、cout、cerr和clog对象,分别对应于标准输入流、标准输出流、非缓冲标准错误和缓冲标准错误流 iomanip 该文件通过所谓的参数化的流操纵器(比如setw和setprecision),来声明对执行标准化I/O有用的服务 fstream 该文件为用户控制的文件处理声明服务","categories":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"}],"tags":[{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"}]},{"title":"Requests库入门(2)","slug":"Requests库入门-2","date":"2018-10-01T18:58:54.000Z","updated":"2018-10-01T18:58:54.000Z","comments":true,"path":"2018/10/01/Requests库入门-2/","permalink":"https://yeshan333.github.io/2018/10/01/Requests%E5%BA%93%E5%85%A5%E9%97%A8-2/","excerpt":"requests库入门实操 京东商品页面爬取 亚马逊商品页面的爬取 百度/360搜索关键字提交 IP地址归属地查询 网络图片的爬取和储存","text":"requests库入门实操 京东商品页面爬取 亚马逊商品页面的爬取 百度/360搜索关键字提交 IP地址归属地查询 网络图片的爬取和储存 1.京东商品页面的爬取华为nova3 123456789101112import requestsdef GetHTMLText(url): try: r = requests.get(url) r.raise_for_status() r.encoding = r.apparent_encoding return r.text[:1000] except: print("爬取失败")if __name__ == '__main__': url = "https://item.jd.com/30185690434.html" print(GetHTMLText(url)) 2.亚马孙商品页面的爬取某些网站可能有反爬机制。通常的反爬策略有: 通过Headers反爬虫 基于用户行为反爬虫 动态页面的反爬虫 参考 12345678910111213141516#如网站对Headers的User-Agent进行检测,可定制请求头伪装成浏览器import requestsdef GetHTMLText(url): try: #定制请求头 headers = {"user-agent":"Mozilla/5.0"} r = requests.get(url,headers = headers) r.raise_for_status() r.encoding = r.apparent_encoding return r.text[:1000] except: print("爬取失败")if __name__ == '__main__': url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y" print(GetHTMLText(url)) 3.百度/360搜索关键字提交使用params参数,利用接口keyword 1234567891011121314151617181920212223#百度搜索引擎关键词提交接口: http://www.baidu.com/s?wd=keyword#360搜索引擎关键词提交接口: http://www.so.com/s?q=keywordimport requestsdef Get(url): headers = {'user-agent':'Mozilla/5.0'} key_word = {'wd':'python'} try: r=requests.get(url,headers=headers,params=key_word) r.raise_for_status() r.encoding = r.apparent_encoding print(r.request.url) #return r.request.url return r.text except: return "爬取失败"if __name__ == '__main__': url = "http://www.baidu.com/s" #print(Get(url)) print(len(Get(url))) 4.IP地址归属地查询使用IP138的API接口http://m.ip138.com/ip.asp?ip=ipaddress 12345678910111213# ip地址查询import requestsurl ="http://m.ip138.com/ip.asp?ip="ip = str(input())try: r= requests.get(url+ip) r.raise_for_status() print(r.status_code) #r.encoding = r.apparent_encoding print(r.text[-500:])except: print("failed") 5.网络图片的爬取和储存123456789101112131415161718192021222324# spider_for_imgsimport requestsimport osurl = "http://n.sinaimg.cn/sinacn12/w495h787/20180315/1923-fyscsmv9949374.jpg"#C:\\Users\\Administrator\\Desktop\\spider\\first week\\imgs/root = "C://Users/Administrator/Desktop/spider/first week/imgs/"path = root + url.split('/')[-1]try: if not os.path.exists(root): os.mkdir(root) if not os.path.exists(path): r = requests.get(url) with open(path, 'wb') as f: f.write(r.content) f.close() print("save successfully!") else: print("file already exist!")except: print("spider fail")","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Requests","slug":"Requests","permalink":"https://yeshan333.github.io/tags/Requests/"},{"name":"爬虫","slug":"爬虫","permalink":"https://yeshan333.github.io/tags/%E7%88%AC%E8%99%AB/"}]},{"title":"优雅的Markdown(2)","slug":"优雅的Markdown(2)","date":"2018-09-30T23:25:53.000Z","updated":"2018-09-30T23:25:53.000Z","comments":true,"path":"2018/09/30/优雅的Markdown(2)/","permalink":"https://yeshan333.github.io/2018/09/30/%E4%BC%98%E9%9B%85%E7%9A%84Markdown%EF%BC%882%EF%BC%89/","excerpt":"Markdown编辑器使用-MarkdownPad2 imgur已被GFW干掉 快捷键 粗体 ctrl+B 斜体 ctrl+I 引用 ctrl+Q 代码 ctrl+K 超链接 ctrl+L 图片 ctrl+G 无序列表 ctrl+U 有序列表 ctrl+shift+O 水平标尺 ctrl+R 时间戳 ctrl+T 撤销 ctrl+Z 重做 ctrl+Y","text":"Markdown编辑器使用-MarkdownPad2 imgur已被GFW干掉 快捷键 粗体 ctrl+B 斜体 ctrl+I 引用 ctrl+Q 代码 ctrl+K 超链接 ctrl+L 图片 ctrl+G 无序列表 ctrl+U 有序列表 ctrl+shift+O 水平标尺 ctrl+R 时间戳 ctrl+T 撤销 ctrl+Z 重做 ctrl+Y 插入图片时间可使用MarkdownPad2默认的图床 MarkdownPad2使用的默认图床是imgur 插入视频演示戳这里","categories":[],"tags":[{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/tags/markdown/"}]},{"title":"简单爬虫","slug":"简单爬虫","date":"2018-09-29T01:17:32.000Z","updated":"2018-09-29T23:19:00.000Z","comments":true,"path":"2018/09/29/简单爬虫/","permalink":"https://yeshan333.github.io/2018/09/29/%E7%AE%80%E5%8D%95%E7%88%AC%E8%99%AB/","excerpt":"Requests库入门 http://www.python-requests.org/en/master/ requests Requests库的7个主要方法 方法 说明 requests.request() 构造一个请求,支撑以下各方法的基本方法 requests.get() 获取HTML网面的方法 requests.head() 获取HTML网页头部信息的方法 requests.post() 向HTML网页提交POST请求的方法 requests.put() 向HTML页面提交PUT请求的方法 requests.patch() 向HTML网页提交局部修改请求 requests.delete() 向HTML网页提交删除请求","text":"Requests库入门 http://www.python-requests.org/en/master/ requests Requests库的7个主要方法 方法 说明 requests.request() 构造一个请求,支撑以下各方法的基本方法 requests.get() 获取HTML网面的方法 requests.head() 获取HTML网页头部信息的方法 requests.post() 向HTML网页提交POST请求的方法 requests.put() 向HTML页面提交PUT请求的方法 requests.patch() 向HTML网页提交局部修改请求 requests.delete() 向HTML网页提交删除请求 Requests库的get()方法requests.get(url,params=None,**kwargs) url:拟获取页面的url链接 params:url中的额外参数,字典或字节流格式,可选 **kwargs:12个控制访问的参数 r = requests.get(url) r为一个包含服务器资源的Response对象(即为requests.get()返回内容) get()方法和url构造了一个向服务器请求资源的Request对象 Response对象Response对象包含服务器反回的所有信息,也包含请求的Request信息 Response对象的属性 属性 说明 r.stats_code HTTP请求的返回状态,200表示连接成功 r.txt HTTP响应的字符串形式 r.encoding 从HTTP header中猜测的响应方式的内容编码 r.apparent_enconding 从内容中分析出的响应内容编码方式(备选编码方式) r.content HTTP响应内容编码的二进制形式 r.encoding:如果charset不存在,则默认编码为ISO-8859-1,r.text根据r.encoding显示网页内容 r.apparent_encoding:根据网页内容分析出的编码方式 理解Response异常r.raise_for_status()如果不是200,产生异常requests.HTTPError异常 1r.raise_for_status()在方法内部判断r.statu_code是否等于200,不需要增加额外的if语句,该语句便于try-except进行异常处理 Requests库的异常 异常 说明 requests.ConnectonError 网路连接错误异常 requests.HTTPError HTTP错误异常 requests.URLRequire URL缺失异常 requests.TooManyRedirects 超过最大重定向次数,产生重定向异常 requests.ConnectTimeout 连接远程服务器异常 requests.Timeout 请求URL超时,产生超时异常 python爬取网页代码通用框架12345678910111213141516import requests#import timedef getHTMLText(url): try: r = requests.get(url,timeout = 30) r.raise_for_status()#如果状态不是200,产生HTTPError异常 #print(r.status_code) r.encoding = r.apparent_encoding return r.text except: return "产生异常"if __name__ == '__main__': url = "http://www.baidu.com" print(getHTMLText(url)) Requests库的request()方法requests.request(method, url, **kwargs) method: 请求方式,对应get/put/delete等7种 url:拟获取页面的url链接 **kwargs: 控制访问的参数 kwargs:控制访问参数,(可选)12345678910111213params:字典或字节序列,作为参数增加到URL中data:字典、字节序列或文章对象,作为Request的内容json:Json格式的数据headers:HTTP定制头cookies:字典或CookieJar,Request中的cookieauth:元组,支持HTTP认证功能file:字典类型,传输文件timeout:设置超时时间,单位为秒proxies:字典类型,设定访问代理服务器,可以增加登录认证allow_redirects:True/False,默认为True,重定向开关strem:True/False,默认为True,获取页面立即下载开关verify:True/False,默认为True,认证SSl证书开关cert:本地SSL证书","categories":[{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"}],"tags":[{"name":"Requests","slug":"Requests","permalink":"https://yeshan333.github.io/tags/Requests/"},{"name":"爬虫","slug":"爬虫","permalink":"https://yeshan333.github.io/tags/%E7%88%AC%E8%99%AB/"}]},{"title":"网易云音乐外链插入测试","slug":"music","date":"2018-09-28T22:37:08.000Z","updated":"2018-09-28T22:37:08.000Z","comments":true,"path":"2018/09/28/music/","permalink":"https://yeshan333.github.io/2018/09/28/music/","excerpt":"网易云音乐","text":"网易云音乐","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"优雅的Markdown","slug":"优雅的Markdown","date":"2018-09-28T16:49:47.000Z","updated":"2018-09-28T16:49:47.000Z","comments":true,"path":"2018/09/28/优雅的Markdown/","permalink":"https://yeshan333.github.io/2018/09/28/%E4%BC%98%E9%9B%85%E7%9A%84Markdown/","excerpt":"Markdown浅尝一、勾选框注意[]前后都要有空格 1234- [x] 干的漂亮- [x] 吃饭- [x] 写代码- [ ] 睡觉 干的漂亮 吃饭 写代码 睡觉","text":"Markdown浅尝一、勾选框注意[]前后都要有空格 1234- [x] 干的漂亮- [x] 吃饭- [x] 写代码- [ ] 睡觉 干的漂亮 吃饭 写代码 睡觉 二、列表12345#无序列列表 * 换成 - 也行* 你* 你好* 你好呀- 你很好啊 你 你好 你好呀 你很好啊 12345#有序列表 . 后面有个空格1. 我2. 是我3. 是我呀4. 还是我呀 我 是我 是我呀 还是我呀 1234567#多级列表* 数学 * 高等代数 * 解析几何 * 离散数学 * 数学分析 * 实变函数 数学 高等代数 解析几何 离散数学 数学分析 实变函数 表格1234| 姓名 | 性别 | 是否同性恋 || ---- |---- | --------- ||张三|男|否||李四|男|是| 姓名 性别 是否同性恋 张三 男 否 李四 男 是 可用:设置对齐方式1234| 姓名 | 性别 | 是否同性恋 || ---- |:----: | :---------:||张三|男|否||李四|男|是| 姓名 性别 是否同性恋 张三 男 否 李四 男 是 1234| 姓名 | 性别 | 是否同性恋 || ---- |----: | :---------:||张三|男|否||李四|男|是| 姓名 性别 是否同性恋 张三 男 否 李四 男 是 插入代码12#行内代码`printf("hello world!");` printf("hello world!"); 代码块 123#每行前四个空格或一个tab php:echo "Hello World" VBscript:Msgbox "Hello World" php:echo "Hello World" VBscript:Msgbox "Hello World" 有行标代码块 无行标 12for i in range(4): print(i) bash换成python使用语法高亮 123#下划线使用<u><u>bash换成python</u>#换行使用<br/>、<br> 瞬间发现没什么区别 更新于2018/10/1 11:05:19上下标,使用<sup>、<sub>12y=x<sup>2</sup>H<sub>2</sub>O<sub>2</sub> y=x2H2O2 反斜杠的使用使用反斜杠可以避免文本中的符号被当作markdown标识符而发生不必要的转换 例如 1234\\!\\()\\**不是粗体**\\# 不是一级标题 !()*不是粗体*# 不是一级标题 使用缩进1234567不断行的空白格 &nbsp; 或 &#160;半角的空格 &ensp; 或 &#8194;全角的空格 &emsp; 或 &#8195;示例:&ensp; &ensp今天天气好啊&emsp;&emsp;感觉倍爽啊   今天天气好啊  感觉倍爽啊 不要忘了英文的分号参考自zhouie","categories":[],"tags":[{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/tags/markdown/"}]},{"title":"博客搭建历程(4)","slug":"博客搭建历程(4)","date":"2018-09-27T16:35:56.000Z","updated":"2018-09-27T16:35:56.000Z","comments":true,"path":"2018/09/27/博客搭建历程(4)/","permalink":"https://yeshan333.github.io/2018/09/27/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E5%8E%86%E7%A8%8B%EF%BC%884%EF%BC%89/","excerpt":"博客评论系统的选择 怀念文:当时使用的主题是 yilla 其他评论系统参考经过一波折腾,最终选择了Valine我喜欢它的匿名评论,23333!!! 参考教程 作者的博客Valine文档 https://github.com/litten/hexo-theme-yilia/pull/646 https://www.xxwhite.com/2017/Valine.html https://panjunwen.com/diy-a-comment-system/","text":"博客评论系统的选择 怀念文:当时使用的主题是 yilla 其他评论系统参考经过一波折腾,最终选择了Valine我喜欢它的匿名评论,23333!!! 参考教程 作者的博客Valine文档 https://github.com/litten/hexo-theme-yilia/pull/646 https://www.xxwhite.com/2017/Valine.html https://panjunwen.com/diy-a-comment-system/ 安装过程简记 注册Leancloud 创建应用 获取appid和appkey 设置安全域名 部署云引擎 参考设置好环境变量 yilia主题修改1、修改themes\\yilia\\_config.ymlhttps://github.com/litten/hexo-theme-yilia/pull/646 12345678910#6、Valine https://valine.js.orgvaline: enable: true appid: #LeanCloud的appId appkey: #Leancloud的appKey verify: false #验证码 notifi: false #评论回复提醒 avatar: ' '#评论列表头像样式 placeholder: Just go go #评论占位框 pageSize: 15 #评论分页 2、修改themes\\yilia\\layout\\_partial\\article.ejs我是在尾部位添加的 123456789<% if (theme.valine && theme.valine.appid && theme.valine.appkey){ %> <section id="comments" style="margin:10px;padding:10px;background:#fff;"> <%- partial('post/valine', { key: post.slug, title: post.title, url: config.url+url_for(post.path) }) %> </section> <% } %> 在themes\\yilia\\layout\\_partial\\post下新建个·valine.ejs·文件添加如下代码 123456789101112131415161718<div id="vcomment" class="comment"></div><script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script><script src="//unpkg.com/valine/dist/Valine.min.js"></script><script> var notify = '<%= theme.valine.notify %>' == true ? true : false; var verify = '<%= theme.valine.verify %>' == true ? true : false; window.onload = function() { new Valine({ el: '#vcomment', notify: notify, verify: verify, app_id: "<%= theme.valine.appid %>", app_key: "<%= theme.valine.appkey %>", placeholder: "<%= theme.valine.placeholder %>", avatar:"<%= theme.valine.avatar %>" }); }</script> 测试下效果hexo g hexo s 预览 没问题就部署到github吧 hexo d -g 定时器添加https://github.com/zhaojun1998/Valine-Admin/issues/1","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"hexo","slug":"hexo","permalink":"https://yeshan333.github.io/tags/hexo/"}]},{"title":"Markdown(2)","slug":"Markdown-2","date":"2018-09-26T23:24:26.000Z","updated":"2018-09-26T23:24:26.000Z","comments":true,"path":"2018/09/26/Markdown-2/","permalink":"https://yeshan333.github.io/2018/09/26/Markdown-2/","excerpt":"兴奋于搭建了我的博客,兴奋于认识了markdown,终于可以甩开花里胡哨的word了,233333!!! 认识Markdown Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。 Markdown具有一系列衍生版本,用于扩展Markdown的功能(如表格、脚注、内嵌HTML等等),这些功能原初的Markdown尚不具备,它们能让Markdown转换成更多的格式,例LaTeX,Docbook。 Markdown增强版中比较有名的有Markdown Extra、MultiMarkdown、 Maruku等。这些衍生版本要么基于工具,如Pandoc;要么基于网站,如GitHub和Wikipedia,在语法上基本兼容,但在一些语法和渲染效果上有改动。 –引自百度百科","text":"兴奋于搭建了我的博客,兴奋于认识了markdown,终于可以甩开花里胡哨的word了,233333!!! 认识Markdown Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。 Markdown具有一系列衍生版本,用于扩展Markdown的功能(如表格、脚注、内嵌HTML等等),这些功能原初的Markdown尚不具备,它们能让Markdown转换成更多的格式,例LaTeX,Docbook。 Markdown增强版中比较有名的有Markdown Extra、MultiMarkdown、 Maruku等。这些衍生版本要么基于工具,如Pandoc;要么基于网站,如GitHub和Wikipedia,在语法上基本兼容,但在一些语法和渲染效果上有改动。 –引自百度百科 Windows常用Markdown编辑器 VSCode 下载 Atom 下载 CuteMarkEd 下载 MarkdownPad2 下载 MarkPad 下载 Miu 下载 Typora 下载 RStudio 下载 Markdown语法说明-中文版为什么使用Markdown 它使我更加专注于文字内容而不是排版样式 We believe that writing is about content, about what you want to say – not about fancy formatting. –Ulysses for Mac[高级应用](https://blog.mariusschulz.com/2014/12/16/how-to-set-up-sublime-text-for-a-vastly-better-markdown-writing-experience) Sublime Text3+Markdown Editing [参考](https://blog.csdn.net/u012195214/article/details/70544181)","categories":[{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/categories/markdown/"}],"tags":[{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/tags/markdown/"}]},{"title":"博客搭建历程(3)","slug":"博客搭建历程(3)","date":"2018-09-26T20:11:17.000Z","updated":"2018-09-26T20:11:17.000Z","comments":true,"path":"2018/09/26/博客搭建历程(3)/","permalink":"https://yeshan333.github.io/2018/09/26/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E5%8E%86%E7%A8%8B%EF%BC%883%EF%BC%89/","excerpt":"hexo生成工程文件介绍 hexo插件 主题yilia 默认目录结构具体参考","text":"hexo生成工程文件介绍 hexo插件 主题yilia 默认目录结构具体参考 |--.deploy |--public |--scaffolds |--source |--themes |--_config.yml |--package.json .deploy :部署到GitHub上的内容目录 public:输出的静态网页内容目录 scaffolds:layout模板文件目录 source:文件源码目录 themes:主题文件目录 —config.yml:全局配置文件 package.json:项目依赖声明文件 给主题yilia配置干货一、腾讯公益404公益404 hexo new page 404 #新建一个页面 1234567891011#在生成的index.md文件下添加以下代码<!DOCTYPE html><html lang="en"><head>]\\<meta charset="UTF-8"><title>404</title></head><body><script type="text/javascript" src="//qzonestyle.gtimg.cn/qzone/hybrid/app/404/search_children.js" charset="utf-8"></script></body></html> 1hexo d -g#直接部署到GitHub 参考 二、制作个网站ico戳这里 也可以不弄,直接用 把你的网站ico放在public\\img即可修改theme\\_config.yml 三、使用网站访问量统计(使用友盟)效果如下 注册账号友盟官网 获取代码 在hemes\\yilia\\layout\\_partial\\footer.ejs挑个位置放 12hexo ghexo s 看下效果 hexo d #部署到 github 若不想用CNZZ参考","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"hexo","slug":"hexo","permalink":"https://yeshan333.github.io/tags/hexo/"}]},{"title":"baidu收录测试","slug":"xuxu","date":"2018-09-26T17:13:00.000Z","updated":"2018-09-26T17:13:00.000Z","comments":true,"path":"2018/09/26/xuxu/","permalink":"https://yeshan333.github.io/2018/09/26/xuxu/","excerpt":"baidu收录测试hexo 插件:hexo-baidu-url-submit","text":"baidu收录测试hexo 插件:hexo-baidu-url-submit","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]},{"title":"博客搭建历程(2)","slug":"博客搭建历程(2)","date":"2018-09-25T23:31:27.000Z","updated":"2018-09-25T23:31:27.000Z","comments":true,"path":"2018/09/25/博客搭建历程(2)/","permalink":"https://yeshan333.github.io/2018/09/25/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E5%8E%86%E7%A8%8B%EF%BC%882%EF%BC%89/","excerpt":"本文大多数图片链接失效,建议阅读:https://cloud.tencent.com/developer/article/1656959 一、使用hexo deploy部署博客到Github 使用参考 ** 先安装个扩展$ npm install hexo-deployer-git --save ** 1.修改博客根目录下的_config_yml文件 123456# Deployment## Docs: https://hexo.io/docs/deployment.htmldeploy: type: git repo: git@github.com:yeshan333/yeshan333.github.io.git # 这个可到Github仓库拿 branch: master","text":"本文大多数图片链接失效,建议阅读:https://cloud.tencent.com/developer/article/1656959 一、使用hexo deploy部署博客到Github 使用参考 ** 先安装个扩展$ npm install hexo-deployer-git --save ** 1.修改博客根目录下的_config_yml文件 123456# Deployment## Docs: https://hexo.io/docs/deployment.htmldeploy: type: git repo: git@github.com:yeshan333/yeshan333.github.io.git # 这个可到Github仓库拿 branch: master 2.部署到GitHub repo生成ssh keys1ssh-keygen -t rsa -C "邮件地址@youremail.com" #生成新的key文件,邮箱地址填注册Github时用的 将生成的ssh keys添加到Github的deploy keys中 复制key ** 这里用到.ssh目录下,id_rsa.pub文件中的那串key** 到GitHub的yourname.hithub.io仓库添加那串key到deploy keys中 测试一下是否添加成功了: 1ssh -T git@github.com 部署博客 先配好git用户信息 12git config --global user.name "你的名字" # github用户名git config --global user.email "邮箱@邮箱.com" # github邮箱 部署博客到仓库 12hexo g # 生成静态文件hexo d # 部署到远程仓库 访问https://yourname.github.io查看结果 ** 到此,整个博客搭建完成了 ** 以下是写的是博客主题的更换,主题可以自己写,也可以使用别人写的,可去这里https://hexo.io/themes/找喜欢的主题,如果使用的是别人的主题,需要阅读主题使用文档进行相关配置。 二、Hexo主题设置 更换主题 cd进themes目录 12cd themesgit clone https://github.com/litten/hexo-theme-yilia.git themes/yilia 对根目录下的config_yml文件进行修改 12cd themes/yiliagit pull #更新主题 预览新主题 123hexo clean # 清楚缓存,删除public目录hexo g # 生成新的博客静态文件hexo s 去http://localhost:4000预览,没毛病就hexo d部署到远程仓库。","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"hexo","slug":"hexo","permalink":"https://yeshan333.github.io/tags/hexo/"}]},{"title":"博客搭建历程(1)","slug":"博客搭建历程(1)","date":"2018-09-25T22:40:31.000Z","updated":"2018-09-25T22:40:31.000Z","comments":true,"path":"2018/09/25/博客搭建历程(1)/","permalink":"https://yeshan333.github.io/2018/09/25/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E5%8E%86%E7%A8%8B%EF%BC%881%EF%BC%89/","excerpt":"本文大多数图片链接失效,建议阅读:https://cloud.tencent.com/developer/article/1656961 我为什么要搭建自己的博客:人嘛!总会有迷茫的时候。无聊了就搭建一个博客玩玩。借此思考下人生戳这里先洗下脑 [BetterExplained]为什么你应该(从现在开始就)写博客 使用Hexo+GitHub Pages搭建属于自己的博客依赖 安装Node.js 安装git 一个GitHub账号 hexo全家桶","text":"本文大多数图片链接失效,建议阅读:https://cloud.tencent.com/developer/article/1656961 我为什么要搭建自己的博客:人嘛!总会有迷茫的时候。无聊了就搭建一个博客玩玩。借此思考下人生戳这里先洗下脑 [BetterExplained]为什么你应该(从现在开始就)写博客 使用Hexo+GitHub Pages搭建属于自己的博客依赖 安装Node.js 安装git 一个GitHub账号 hexo全家桶 一、Node.js安装参考Node.js官网 nodejs版本越高越好,不然后面安装hexo时会出现问题,Hexo官网给的建议是6.9版本以上 官网windows 64bit 下载(v10.16.0) 二、git的安装参考安装需根据自己的实际情况,在cmd使用git --version指令可以查看安装的版本 windows 64 bit 下载(v2.19.0) 三、使用Github Pages 注册Github账号 创建一个repository,用于存放博客站点文件 开启Github Page 1、创建一个repository 仓库命名方式须注意下,这样命名会开启githubpage服务,代码仓库命名方式随意,如果以用户名+github.io的形式命名,会自动开启Github Pages服务,否则需要自己在仓库的设置那里手动开启GIthub Pages服务。 Github Pages 是 github 公司提供的免费的静态网站托管服务,用起来方便而且功能强大,不仅没有空间限制(为免费用户提供了500M空间),还可以绑定自己的域名,1GB空间限制(个人博客够用了),每月带宽限制100GB,自由绑定自己的域名。 2、开启GitHub PagesGitHub Pages官方介绍,Github的中文官方文档已推出https://help.github.com/cn/articles/what-is-github-pages(2019年7月11日更新) 点击choose a theme选完主题后即可到https://yourname.github.io/访问自己的个人主页了,yourname记得替换成你的用户名。 接下来需要使用Hexo在本地创建好博客,再将博客文件上传到刚刚创建的仓库。 四、Hexo配置 Hexo是一个静态站点生成器,如果想深入了解Hexo可以去Hexo的官网看看。https://hexo.io/zh-cn/docs/ 在本地搭建博客1.安装hexo插件套装以下两条命令直接打开windows cmd执行即可,用git bash执行也行 12# 安装hexo命令行工具npm install hexo-cli -g ~~安装hexo包到全局node_modules中,修改package.json文件,将模块名和版本号添加到dependencies部分npm install hexo –save~~~ 2.初始化hexo 这里需要新建个目录用于存放本地的博客文件 往后的命令均需要在此目录下执行,可用cd命令进入目录中执行往后的命令 1hexo init # 初始化目录,生成相关文件 目录中生成的文件如下 123456789101112.├── node_modules # 存放博客依赖的npm packages├── scaffolds # 存放生成博客文章、博客页面、草稿的模板目录├ ├── draft.md├ ├── page.md├ └── post.md├── source├ └── posts # 用于存放博客文章├── _config.yml # 博客全局配置文件├── .gitignore├── package.json # 记录当前目录下实际安装的各个npm package的具体来源和版本号└── package-lock.json # 存放锁定安装时的包的版本号,此文件一般会上传到git 12hexo g # 生成静态页面hexo s # 部署到本地服务器http://localhost:4000/ 预览效果http://localhost:4000/ 到这里本地的博客搭建完了,接下来就是将博客上传到刚刚创建的Github仓库,上传后就可以使用外网访问了 博客搭建历程(2) 博客搭建参考教程推荐 csdn w3cschool 博客园 思否","categories":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"}],"tags":[{"name":"hexo","slug":"hexo","permalink":"https://yeshan333.github.io/tags/hexo/"}]},{"title":"Markdown","slug":"Markdown","date":"2018-09-25T18:34:13.000Z","updated":"2018-09-25T18:34:13.000Z","comments":true,"path":"2018/09/25/Markdown/","permalink":"https://yeshan333.github.io/2018/09/25/Markdown/","excerpt":"体验markdown有点意思,哈! 同级文件夹,的img文件夹下的图片 添加链接我的博客 添加图片","text":"体验markdown有点意思,哈! 同级文件夹,的img文件夹下的图片 添加链接我的博客 添加图片 一级引用 要判断一个人是否真正聪明,那就要看他能否根本不用动手,而工作却又能完成。 二级引用 在C++里, 想搬起石头砸自己的脚更为困难了。 不过一旦你真这么做了, 整条腿都得报销! 列表的使用一级列表 python Java c++ 多级列表 数学分析 高等代数 解析几何 插入代码行内代码printf(" hello world "); 块代码,每行代码前四个空格或一个tabWocao Nimei Fenced Code Block123for i in range(4): print(i) 划重点人生苦短 下划线干的漂亮 删除线这都什么鬼 这里是斜体这里是粗体这里是粗斜体 利用html标签换行有点意思 这里是表格 浏览器 好 坏 google 1 0 firefox 1 0 使用font标签控制字体颜色红色<br>自定义字体样式、颜色、大小","categories":[{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/categories/markdown/"}],"tags":[{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/tags/markdown/"}]},{"title":"hello my first blog in here !","slug":"hello-my-first-blog-in-here-!","date":"2018-09-19T23:14:15.000Z","updated":"2018-09-19T23:14:15.000Z","comments":true,"path":"2018/09/19/hello-my-first-blog-in-here-!/","permalink":"https://yeshan333.github.io/2018/09/19/hello-my-first-blog-in-here-%EF%BC%81/","excerpt":"","text":"新的开始,新的路线","categories":[],"tags":[{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"}]}],"categories":[{"name":"vfox","slug":"vfox","permalink":"https://yeshan333.github.io/categories/vfox/"},{"name":"大模型","slug":"大模型","permalink":"https://yeshan333.github.io/categories/%E5%A4%A7%E6%A8%A1%E5%9E%8B/"},{"name":"LLMs","slug":"LLMs","permalink":"https://yeshan333.github.io/categories/LLMs/"},{"name":"Sider","slug":"Sider","permalink":"https://yeshan333.github.io/categories/Sider/"},{"name":"Jenkins","slug":"Jenkins","permalink":"https://yeshan333.github.io/categories/Jenkins/"},{"name":"Chaos","slug":"Chaos","permalink":"https://yeshan333.github.io/categories/Chaos/"},{"name":"dotfiles","slug":"dotfiles","permalink":"https://yeshan333.github.io/categories/dotfiles/"},{"name":"浏览器插件开发","slug":"浏览器插件开发","permalink":"https://yeshan333.github.io/categories/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"},{"name":"设计工具","slug":"设计工具","permalink":"https://yeshan333.github.io/categories/%E8%AE%BE%E8%AE%A1%E5%B7%A5%E5%85%B7/"},{"name":"Tech-Weekly","slug":"Tech-Weekly","permalink":"https://yeshan333.github.io/categories/Tech-Weekly/"},{"name":"go-ycsb","slug":"go-ycsb","permalink":"https://yeshan333.github.io/categories/go-ycsb/"},{"name":"Github Codespaces","slug":"Github-Codespaces","permalink":"https://yeshan333.github.io/categories/Github-Codespaces/"},{"name":"music","slug":"music","permalink":"https://yeshan333.github.io/categories/music/"},{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/categories/Elixir/"},{"name":"SSE","slug":"SSE","permalink":"https://yeshan333.github.io/categories/SSE/"},{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/categories/blog/"},{"name":"Prometheus","slug":"Prometheus","permalink":"https://yeshan333.github.io/categories/Prometheus/"},{"name":"Go","slug":"Go","permalink":"https://yeshan333.github.io/categories/Go/"},{"name":"Performance","slug":"Performance","permalink":"https://yeshan333.github.io/categories/Performance/"},{"name":"Profiling","slug":"Performance/Profiling","permalink":"https://yeshan333.github.io/categories/Performance/Profiling/"},{"name":"Compile","slug":"Compile","permalink":"https://yeshan333.github.io/categories/Compile/"},{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/categories/Git/"},{"name":"计算机网络","slug":"计算机网络","permalink":"https://yeshan333.github.io/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"},{"name":"Kubernetes","slug":"Kubernetes","permalink":"https://yeshan333.github.io/categories/Kubernetes/"},{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/categories/Linux/"},{"name":"性能优化","slug":"Linux/性能优化","permalink":"https://yeshan333.github.io/categories/Linux/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/"},{"name":"Monitoring","slug":"Monitoring","permalink":"https://yeshan333.github.io/categories/Monitoring/"},{"name":"Cryptography","slug":"Cryptography","permalink":"https://yeshan333.github.io/categories/Cryptography/"},{"name":"RSS","slug":"RSS","permalink":"https://yeshan333.github.io/categories/RSS/"},{"name":"math","slug":"math","permalink":"https://yeshan333.github.io/categories/math/"},{"name":"Architecture","slug":"Architecture","permalink":"https://yeshan333.github.io/categories/Architecture/"},{"name":"WSL","slug":"WSL","permalink":"https://yeshan333.github.io/categories/WSL/"},{"name":"DevOps","slug":"DevOps","permalink":"https://yeshan333.github.io/categories/DevOps/"},{"name":"中间件","slug":"中间件","permalink":"https://yeshan333.github.io/categories/%E4%B8%AD%E9%97%B4%E4%BB%B6/"},{"name":"Kafka","slug":"中间件/Kafka","permalink":"https://yeshan333.github.io/categories/%E4%B8%AD%E9%97%B4%E4%BB%B6/Kafka/"},{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/categories/Python/"},{"name":"JavaScript","slug":"JavaScript","permalink":"https://yeshan333.github.io/categories/JavaScript/"},{"name":"操作系统","slug":"操作系统","permalink":"https://yeshan333.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"},{"name":"进/线程","slug":"操作系统/进-线程","permalink":"https://yeshan333.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E8%BF%9B-%E7%BA%BF%E7%A8%8B/"},{"name":"React","slug":"React","permalink":"https://yeshan333.github.io/categories/React/"},{"name":"docker","slug":"docker","permalink":"https://yeshan333.github.io/categories/docker/"},{"name":"设计模式","slug":"设计模式","permalink":"https://yeshan333.github.io/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/"},{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/categories/%E9%9A%8F%E7%AC%94/"},{"name":"memory","slug":"memory","permalink":"https://yeshan333.github.io/categories/memory/"},{"name":"函数式编程","slug":"函数式编程","permalink":"https://yeshan333.github.io/categories/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B/"},{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/categories/Flask/"},{"name":"HTML","slug":"HTML","permalink":"https://yeshan333.github.io/categories/HTML/"},{"name":"CSS","slug":"CSS","permalink":"https://yeshan333.github.io/categories/CSS/"},{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/categories/CPP/"},{"name":"数据结构","slug":"数据结构","permalink":"https://yeshan333.github.io/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"},{"name":"Memory","slug":"Memory","permalink":"https://yeshan333.github.io/categories/Memory/"},{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/categories/Algorithm/"},{"name":"Scrapy","slug":"Scrapy","permalink":"https://yeshan333.github.io/categories/Scrapy/"},{"name":"C","slug":"C","permalink":"https://yeshan333.github.io/categories/C/"},{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/categories/markdown/"}],"tags":[{"name":"Elixir","slug":"Elixir","permalink":"https://yeshan333.github.io/tags/Elixir/"},{"name":"Erlang","slug":"Erlang","permalink":"https://yeshan333.github.io/tags/Erlang/"},{"name":"vfox","slug":"vfox","permalink":"https://yeshan333.github.io/tags/vfox/"},{"name":"Windows","slug":"Windows","permalink":"https://yeshan333.github.io/tags/Windows/"},{"name":"Sider","slug":"Sider","permalink":"https://yeshan333.github.io/tags/Sider/"},{"name":"通义千问","slug":"通义千问","permalink":"https://yeshan333.github.io/tags/%E9%80%9A%E4%B9%89%E5%8D%83%E9%97%AE/"},{"name":"Jenkins","slug":"Jenkins","permalink":"https://yeshan333.github.io/tags/Jenkins/"},{"name":"Cloudflare","slug":"Cloudflare","permalink":"https://yeshan333.github.io/tags/Cloudflare/"},{"name":"Workers AI","slug":"Workers-AI","permalink":"https://yeshan333.github.io/tags/Workers-AI/"},{"name":"Langchain","slug":"Langchain","permalink":"https://yeshan333.github.io/tags/Langchain/"},{"name":"LLMs","slug":"LLMs","permalink":"https://yeshan333.github.io/tags/LLMs/"},{"name":"Chaos Testing","slug":"Chaos-Testing","permalink":"https://yeshan333.github.io/tags/Chaos-Testing/"},{"name":"etcd","slug":"etcd","permalink":"https://yeshan333.github.io/tags/etcd/"},{"name":"MongoDB","slug":"MongoDB","permalink":"https://yeshan333.github.io/tags/MongoDB/"},{"name":"Erlang/OTP","slug":"Erlang-OTP","permalink":"https://yeshan333.github.io/tags/Erlang-OTP/"},{"name":"vfox-plugin","slug":"vfox-plugin","permalink":"https://yeshan333.github.io/tags/vfox-plugin/"},{"name":"vfox-erlang","slug":"vfox-erlang","permalink":"https://yeshan333.github.io/tags/vfox-erlang/"},{"name":"chezmoi","slug":"chezmoi","permalink":"https://yeshan333.github.io/tags/chezmoi/"},{"name":"dotfiles","slug":"dotfiles","permalink":"https://yeshan333.github.io/tags/dotfiles/"},{"name":"extension","slug":"extension","permalink":"https://yeshan333.github.io/tags/extension/"},{"name":"WXT","slug":"WXT","permalink":"https://yeshan333.github.io/tags/WXT/"},{"name":"设计工具","slug":"设计工具","permalink":"https://yeshan333.github.io/tags/%E8%AE%BE%E8%AE%A1%E5%B7%A5%E5%85%B7/"},{"name":"Tech-Weekly","slug":"Tech-Weekly","permalink":"https://yeshan333.github.io/tags/Tech-Weekly/"},{"name":"Go","slug":"Go","permalink":"https://yeshan333.github.io/tags/Go/"},{"name":"YCSB","slug":"YCSB","permalink":"https://yeshan333.github.io/tags/YCSB/"},{"name":"go-ycsb","slug":"go-ycsb","permalink":"https://yeshan333.github.io/tags/go-ycsb/"},{"name":"benchmark","slug":"benchmark","permalink":"https://yeshan333.github.io/tags/benchmark/"},{"name":"Elixir, Github Codespaces","slug":"Elixir-Github-Codespaces","permalink":"https://yeshan333.github.io/tags/Elixir-Github-Codespaces/"},{"name":"music","slug":"music","permalink":"https://yeshan333.github.io/tags/music/"},{"name":"Deps","slug":"Deps","permalink":"https://yeshan333.github.io/tags/Deps/"},{"name":"Mix","slug":"Mix","permalink":"https://yeshan333.github.io/tags/Mix/"},{"name":"Python","slug":"Python","permalink":"https://yeshan333.github.io/tags/Python/"},{"name":"Websocket","slug":"Websocket","permalink":"https://yeshan333.github.io/tags/Websocket/"},{"name":"SSE","slug":"SSE","permalink":"https://yeshan333.github.io/tags/SSE/"},{"name":"blog","slug":"blog","permalink":"https://yeshan333.github.io/tags/blog/"},{"name":"Test Coverage","slug":"Test-Coverage","permalink":"https://yeshan333.github.io/tags/Test-Coverage/"},{"name":"Elixir-Macros","slug":"Elixir-Macros","permalink":"https://yeshan333.github.io/tags/Elixir-Macros/"},{"name":"Prometheus","slug":"Prometheus","permalink":"https://yeshan333.github.io/tags/Prometheus/"},{"name":"json","slug":"json","permalink":"https://yeshan333.github.io/tags/json/"},{"name":"Marshal","slug":"Marshal","permalink":"https://yeshan333.github.io/tags/Marshal/"},{"name":"UnMarshal","slug":"UnMarshal","permalink":"https://yeshan333.github.io/tags/UnMarshal/"},{"name":"React","slug":"React","permalink":"https://yeshan333.github.io/tags/React/"},{"name":"Profiling","slug":"Profiling","permalink":"https://yeshan333.github.io/tags/Profiling/"},{"name":"Flame Graphs","slug":"Flame-Graphs","permalink":"https://yeshan333.github.io/tags/Flame-Graphs/"},{"name":"FSM","slug":"FSM","permalink":"https://yeshan333.github.io/tags/FSM/"},{"name":"Compiler","slug":"Compiler","permalink":"https://yeshan333.github.io/tags/Compiler/"},{"name":"Lexer","slug":"Lexer","permalink":"https://yeshan333.github.io/tags/Lexer/"},{"name":"Git","slug":"Git","permalink":"https://yeshan333.github.io/tags/Git/"},{"name":"Wireshark","slug":"Wireshark","permalink":"https://yeshan333.github.io/tags/Wireshark/"},{"name":"Kubernetes","slug":"Kubernetes","permalink":"https://yeshan333.github.io/tags/Kubernetes/"},{"name":"Kubeadm","slug":"Kubeadm","permalink":"https://yeshan333.github.io/tags/Kubeadm/"},{"name":"Linux","slug":"Linux","permalink":"https://yeshan333.github.io/tags/Linux/"},{"name":"压力测试","slug":"压力测试","permalink":"https://yeshan333.github.io/tags/%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95/"},{"name":"CPU Bound","slug":"CPU-Bound","permalink":"https://yeshan333.github.io/tags/CPU-Bound/"},{"name":"IO Bound","slug":"IO-Bound","permalink":"https://yeshan333.github.io/tags/IO-Bound/"},{"name":"Grafana","slug":"Grafana","permalink":"https://yeshan333.github.io/tags/Grafana/"},{"name":"Federation","slug":"Federation","permalink":"https://yeshan333.github.io/tags/Federation/"},{"name":"Docker","slug":"Docker","permalink":"https://yeshan333.github.io/tags/Docker/"},{"name":"Monitoring","slug":"Monitoring","permalink":"https://yeshan333.github.io/tags/Monitoring/"},{"name":"MD5","slug":"MD5","permalink":"https://yeshan333.github.io/tags/MD5/"},{"name":"GPG","slug":"GPG","permalink":"https://yeshan333.github.io/tags/GPG/"},{"name":"RSS Reader","slug":"RSS-Reader","permalink":"https://yeshan333.github.io/tags/RSS-Reader/"},{"name":"math","slug":"math","permalink":"https://yeshan333.github.io/tags/math/"},{"name":"项目管理","slug":"项目管理","permalink":"https://yeshan333.github.io/tags/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/"},{"name":"Monorepo","slug":"Monorepo","permalink":"https://yeshan333.github.io/tags/Monorepo/"},{"name":"WSL","slug":"WSL","permalink":"https://yeshan333.github.io/tags/WSL/"},{"name":"GUI","slug":"GUI","permalink":"https://yeshan333.github.io/tags/GUI/"},{"name":"Github Actions","slug":"Github-Actions","permalink":"https://yeshan333.github.io/tags/Github-Actions/"},{"name":"DevOps","slug":"DevOps","permalink":"https://yeshan333.github.io/tags/DevOps/"},{"name":"Nginx","slug":"Nginx","permalink":"https://yeshan333.github.io/tags/Nginx/"},{"name":"Kafka","slug":"Kafka","permalink":"https://yeshan333.github.io/tags/Kafka/"},{"name":"消息引擎系统","slug":"消息引擎系统","permalink":"https://yeshan333.github.io/tags/%E6%B6%88%E6%81%AF%E5%BC%95%E6%93%8E%E7%B3%BB%E7%BB%9F/"},{"name":"流处理平台","slug":"流处理平台","permalink":"https://yeshan333.github.io/tags/%E6%B5%81%E5%A4%84%E7%90%86%E5%B9%B3%E5%8F%B0/"},{"name":"计算机网路","slug":"计算机网路","permalink":"https://yeshan333.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E8%B7%AF/"},{"name":"TCP","slug":"TCP","permalink":"https://yeshan333.github.io/tags/TCP/"},{"name":"tcpdump","slug":"tcpdump","permalink":"https://yeshan333.github.io/tags/tcpdump/"},{"name":"深拷贝与浅拷贝","slug":"深拷贝与浅拷贝","permalink":"https://yeshan333.github.io/tags/%E6%B7%B1%E6%8B%B7%E8%B4%9D%E4%B8%8E%E6%B5%85%E6%8B%B7%E8%B4%9D/"},{"name":"Load Balance","slug":"Load-Balance","permalink":"https://yeshan333.github.io/tags/Load-Balance/"},{"name":"Event-Loop","slug":"Event-Loop","permalink":"https://yeshan333.github.io/tags/Event-Loop/"},{"name":"JavaScript","slug":"JavaScript","permalink":"https://yeshan333.github.io/tags/JavaScript/"},{"name":"进程通信","slug":"进程通信","permalink":"https://yeshan333.github.io/tags/%E8%BF%9B%E7%A8%8B%E9%80%9A%E4%BF%A1/"},{"name":"进程","slug":"进程","permalink":"https://yeshan333.github.io/tags/%E8%BF%9B%E7%A8%8B/"},{"name":"线程","slug":"线程","permalink":"https://yeshan333.github.io/tags/%E7%BA%BF%E7%A8%8B/"},{"name":"docker","slug":"docker","permalink":"https://yeshan333.github.io/tags/docker/"},{"name":"服务编排","slug":"服务编排","permalink":"https://yeshan333.github.io/tags/%E6%9C%8D%E5%8A%A1%E7%BC%96%E6%8E%92/"},{"name":"加密","slug":"加密","permalink":"https://yeshan333.github.io/tags/%E5%8A%A0%E5%AF%86/"},{"name":"隐私","slug":"隐私","permalink":"https://yeshan333.github.io/tags/%E9%9A%90%E7%A7%81/"},{"name":"服务器进程管理","slug":"服务器进程管理","permalink":"https://yeshan333.github.io/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86/"},{"name":"工程化","slug":"工程化","permalink":"https://yeshan333.github.io/tags/%E5%B7%A5%E7%A8%8B%E5%8C%96/"},{"name":"译文","slug":"译文","permalink":"https://yeshan333.github.io/tags/%E8%AF%91%E6%96%87/"},{"name":"I/O模型","slug":"I-O模型","permalink":"https://yeshan333.github.io/tags/I-O%E6%A8%A1%E5%9E%8B/"},{"name":"架构设计","slug":"架构设计","permalink":"https://yeshan333.github.io/tags/%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/"},{"name":"消息队列","slug":"消息队列","permalink":"https://yeshan333.github.io/tags/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/"},{"name":"设计模式","slug":"设计模式","permalink":"https://yeshan333.github.io/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/"},{"name":"静态类型检查","slug":"静态类型检查","permalink":"https://yeshan333.github.io/tags/%E9%9D%99%E6%80%81%E7%B1%BB%E5%9E%8B%E6%A3%80%E6%9F%A5/"},{"name":"Flask","slug":"Flask","permalink":"https://yeshan333.github.io/tags/Flask/"},{"name":"随笔","slug":"随笔","permalink":"https://yeshan333.github.io/tags/%E9%9A%8F%E7%AC%94/"},{"name":"memory","slug":"memory","permalink":"https://yeshan333.github.io/tags/memory/"},{"name":"Json","slug":"Json","permalink":"https://yeshan333.github.io/tags/Json/"},{"name":"函数式编程","slug":"函数式编程","permalink":"https://yeshan333.github.io/tags/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B/"},{"name":"环境管理","slug":"环境管理","permalink":"https://yeshan333.github.io/tags/%E7%8E%AF%E5%A2%83%E7%AE%A1%E7%90%86/"},{"name":"Jupyter","slug":"Jupyter","permalink":"https://yeshan333.github.io/tags/Jupyter/"},{"name":"debug","slug":"debug","permalink":"https://yeshan333.github.io/tags/debug/"},{"name":"上下文","slug":"上下文","permalink":"https://yeshan333.github.io/tags/%E4%B8%8A%E4%B8%8B%E6%96%87/"},{"name":"协程","slug":"协程","permalink":"https://yeshan333.github.io/tags/%E5%8D%8F%E7%A8%8B/"},{"name":"Latex","slug":"Latex","permalink":"https://yeshan333.github.io/tags/Latex/"},{"name":"MATLAB","slug":"MATLAB","permalink":"https://yeshan333.github.io/tags/MATLAB/"},{"name":"HTML","slug":"HTML","permalink":"https://yeshan333.github.io/tags/HTML/"},{"name":"CSS","slug":"CSS","permalink":"https://yeshan333.github.io/tags/CSS/"},{"name":"CPP","slug":"CPP","permalink":"https://yeshan333.github.io/tags/CPP/"},{"name":"C","slug":"C","permalink":"https://yeshan333.github.io/tags/C/"},{"name":"数据结构","slug":"数据结构","permalink":"https://yeshan333.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"},{"name":"Memory","slug":"Memory","permalink":"https://yeshan333.github.io/tags/Memory/"},{"name":"GDB","slug":"GDB","permalink":"https://yeshan333.github.io/tags/GDB/"},{"name":"Algorithm","slug":"Algorithm","permalink":"https://yeshan333.github.io/tags/Algorithm/"},{"name":"Scrapy","slug":"Scrapy","permalink":"https://yeshan333.github.io/tags/Scrapy/"},{"name":"爬虫","slug":"爬虫","permalink":"https://yeshan333.github.io/tags/%E7%88%AC%E8%99%AB/"},{"name":"正则表达式","slug":"正则表达式","permalink":"https://yeshan333.github.io/tags/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/"},{"name":"Astronomy","slug":"Astronomy","permalink":"https://yeshan333.github.io/tags/Astronomy/"},{"name":"信息标记","slug":"信息标记","permalink":"https://yeshan333.github.io/tags/%E4%BF%A1%E6%81%AF%E6%A0%87%E8%AE%B0/"},{"name":"BeautifulSoup","slug":"BeautifulSoup","permalink":"https://yeshan333.github.io/tags/BeautifulSoup/"},{"name":"Requests","slug":"Requests","permalink":"https://yeshan333.github.io/tags/Requests/"},{"name":"markdown","slug":"markdown","permalink":"https://yeshan333.github.io/tags/markdown/"},{"name":"hexo","slug":"hexo","permalink":"https://yeshan333.github.io/tags/hexo/"}]} \ No newline at end of file diff --git a/friends/index.html b/friends/index.html index 90be5b9478..0ec2a7bb96 100644 --- a/friends/index.html +++ b/friends/index.html @@ -1912,7 +1912,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], diff --git a/index.html b/index.html index 5f3bd18e63..dc13970e9d 100644 --- a/index.html +++ b/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3185,9 +3185,82 @@ + + + + + + +
    +
    + + + + + + +
    + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + +
    + + + +

    + +

    + +
    +

    通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本

    +
    + +
    +
    + + + + + + + + + vfox + + + + +
    + +
    + +
    + +
    + + +
    + +
    +
    @@ -3834,77 +3907,6 @@

    - -
    -
    - - - - - - -
    - - 使用 go-ycsb 对 etcd 进行基准 (benchmark) 性能测试 - -
    - - - -

    - -

    - -
    - -

    using go-ycsb to benchmark etcd.

    - -
    - -
    -
    - - - - - - - - - go-ycsb - - - - -
    - -
    - -
    - -
    - - -
    - -
    - - @@ -4028,7 +4030,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -4063,7 +4065,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4414,7 +4416,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/page-sitemap.xml b/page-sitemap.xml index 86228c7434..ee5a468463 100644 --- a/page-sitemap.xml +++ b/page-sitemap.xml @@ -11,7 +11,7 @@ https://yeshan333.github.io/categories/ - 2024-06-15T17:04:52.538Z + 2024-06-18T16:11:15.857Z weekly 0.8 @@ -20,7 +20,7 @@ https://yeshan333.github.io/tags/ - 2024-06-15T17:04:52.538Z + 2024-06-18T16:11:15.857Z weekly 0.8 @@ -29,7 +29,7 @@ https://yeshan333.github.io/404.html - 2024-06-15T17:04:52.526Z + 2024-06-18T16:11:15.845Z weekly 0.8 @@ -38,7 +38,7 @@ https://yeshan333.github.io/PyChina/ - 2024-06-15T17:04:52.526Z + 2024-06-18T16:11:15.845Z weekly 0.8 diff --git a/page/10/index.html b/page/10/index.html index 4b3f5a81d2..d75991972a 100644 --- a/page/10/index.html +++ b/page/10/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2847,6 +2847,81 @@ +
    +
    + + + + + + + + + + +

    + +

    + +
    + +

    常见关系:

      +
    • 一对多关系
    • +
    • 多对一关系
    • +
    • 多对多关系
    • +
    • 一对一关系
    • +
    +

    一对多关系(一个作者,多篇文章)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    ## 一对多关系,单作者-多文章,外键不可少
    ## 外键(ForeignKey)总在多的那边定义,关系(relationship)总在单的那边定义

    class Author(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(70), unique=True)
    phone = db.Column(db.String(20))
    # articles为关系属性(一个集合,可以像列表一样操作,在关系的出发侧定义
    ## relationship()函数的第一个参数为关系另一侧的模型名称(Article)
    articles = db.relationship('Article')

    class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(15), index=True)
    body = db.Column(db.Text)
    # 传入ForeignKey的参数形式为:"表名.字段名"
    ## 模型类对应的表名由Flask-SQLAlchemy生成,默认为类名称的小写形式,多个单词通过下划线分隔
    author_id = db.Column(db.Integer, db.ForeignKey('author.id')) #

    # 外键字段(author_id)和关系属性(articles)的命名没有限制
    ## 建立关系可通过操作关系属性进行
    >>>shansan = Author(name="shansan")
    >>>hello = Article(title="Hello world !")
    >>>boy = Article(title="Hello Boy !")
    >>>db.session.add(shansan) # 将创建的数据库记录添加到会话中
    >>>db.session.add(hello)
    >>>db.session.add(boy)
    >>>shansan.articles.append(hello) # 操作关系属性
    >>>shansan.articles.append(boy)
    >>>db.session.commit()
    + +
    + +
    +
    + + + + + + + + + Flask + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3548,83 +3623,6 @@

    - - - - - - - - - - -

    - -

    - -
    - - - -以下是我搭建博客参考的一些教程 - -hexo博客搭建教程https://blog.csdn.net/gdutxiaoxu/article/details/53576018 -https://m.w3cschool.cn/hexo_blog/hexo_blog-tvpu244e.html -https://www.cnblogs.com/jackyroc/p/7681938.html -h... - - -
    - -
    -
    - - - - - - - - - blog - - - - -
    - - - -
    - - -

    - -
    - - @@ -3754,7 +3752,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3789,7 +3787,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4140,7 +4138,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/page/11/index.html b/page/11/index.html index 5af442dafb..eddbd29cfe 100644 --- a/page/11/index.html +++ b/page/11/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2847,6 +2847,83 @@ +
    +
    + + + + + + + + + + +

    + +

    + +
    + + + +以下是我搭建博客参考的一些教程 + +hexo博客搭建教程https://blog.csdn.net/gdutxiaoxu/article/details/53576018 +https://m.w3cschool.cn/hexo_blog/hexo_blog-tvpu244e.html +https://www.cnblogs.com/jackyroc/p/7681938.html +h... + + +
    + +
    +
    + + + + + + + + + blog + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3497,82 +3574,6 @@

    - -
    -
    - - - - - - - - - - -

    - -

    - -
    - -

    main:处理命令行

    //main函数的两种定义形式
    -int main(int argc,char **argv[])
    -int main(int argc,char *argv[])
    -
    -
      -
    • argc:指的是命令行中输入参数的个数
    • -
    • argv:一个数组,它存储了所有的命令行参数
    • -
    - -
    - -
    -
    - - - - - - - - - CPP - - - - -
    - - - -
    - - -
    - -
    - - @@ -3702,7 +3703,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇

    @@ -3737,7 +3738,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4088,7 +4089,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/page/12/index.html b/page/12/index.html index c4ca0aa310..7799a96a56 100644 --- a/page/12/index.html +++ b/page/12/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2847,6 +2847,82 @@ +
    +
    + + + + + + + + + + +

    + +

    + +
    + +

    main:处理命令行

    //main函数的两种定义形式
    +int main(int argc,char **argv[])
    +int main(int argc,char *argv[])
    +
    +
      +
    • argc:指的是命令行中输入参数的个数
    • +
    • argv:一个数组,它存储了所有的命令行参数
    • +
    + +
    + +
    +
    + + + + + + + + + CPP + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3561,77 +3637,6 @@

    - -
    -
    - - - - - - - - - - -

    - -

    - -
    - -

    一级标题

    - -

    二级标题

    - -
    - -
    -
    - - - - - - - - - HTML - - - - -
    - - - -
    - - -
    - -
    - - @@ -3761,7 +3766,7 @@

    二级标题

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3796,7 +3801,7 @@

    二级标题

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4147,7 +4152,7 @@

    二级标题

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 二级标题
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/page/13/index.html b/page/13/index.html index 78b52a054a..c55b39279f 100644 --- a/page/13/index.html +++ b/page/13/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2847,6 +2847,77 @@ +
    +
    + + + + + + + + + + +

    + +

    + +
    + +

    一级标题

    + +

    二级标题

    + +
    + +
    +
    + + + + + + + + + HTML + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3491,67 +3562,6 @@

    C

    - -
    -
    - - - - - - - - - - -

    - -

    - -
    - - - -
    - -
    -
    - - - - - - - -
    - - - -
    - - -
    - -
    - - @@ -3681,7 +3691,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3716,7 +3726,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -4067,7 +4077,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/page/14/index.html b/page/14/index.html index 7e84fc289a..c7be827ce3 100644 --- a/page/14/index.html +++ b/page/14/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2847,6 +2847,67 @@ +
    +
    + + + + + + + + + + +

    + +

    + +
    + + + +
    + +
    +
    + + + + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3519,67 +3580,6 @@

    - - - - - - - - - - -

    - -

    - -
    - -

    - -
    - -
    -
    - - - - - - - -
    - - - -
    - - -

    - -
    - - @@ -3709,7 +3709,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3744,7 +3744,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4095,7 +4095,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/page/15/index.html b/page/15/index.html index a975fbf6dc..0ee3be36d9 100644 --- a/page/15/index.html +++ b/page/15/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2847,6 +2847,67 @@ +
    +
    + + + + + + + + + + +

    + +

    + +
    + +

    + +
    + +
    +
    + + + + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3700,80 +3761,6 @@

    - -
    -
    - - - - - - - - - - -

    - -

    - -
    - -

    兴奋于搭建了我的博客,兴奋于认识了markdown,终于可以甩开花里胡哨的word了,233333!!!

    -

    认识Markdown

    -

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。

    -

    Markdown具有一系列衍生版本,用于扩展Markdown的功能(如表格、脚注、内嵌HTML等等),这些功能原初的Markdown尚不具备,它们能让Markdown转换成更多的格式,例LaTeX,Docbook。

    -

    Markdown增强版中比较有名的有Markdown Extra、MultiMarkdown、 Maruku等。这些衍生版本要么基于工具,如Pandoc;要么基于网站,如GitHub和Wikipedia,在语法上基本兼容,但在一些语法和渲染效果上有改动。
    –引自百度百科

    -
    - -
    - -
    -
    - - - - - - - - - markdown - - - - -
    - - - -
    - - -
    - -
    - - @@ -3903,7 +3890,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇

    @@ -3938,7 +3925,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -4289,7 +4276,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/page/16/index.html b/page/16/index.html index f058d4f4cf..4a7fe4f525 100644 --- a/page/16/index.html +++ b/page/16/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2847,6 +2847,80 @@ +
    +
    + + + + + + + + + + +

    + +

    + +
    + +

    兴奋于搭建了我的博客,兴奋于认识了markdown,终于可以甩开花里胡哨的word了,233333!!!

    +

    认识Markdown

    +

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。

    +

    Markdown具有一系列衍生版本,用于扩展Markdown的功能(如表格、脚注、内嵌HTML等等),这些功能原初的Markdown尚不具备,它们能让Markdown转换成更多的格式,例LaTeX,Docbook。

    +

    Markdown增强版中比较有名的有Markdown Extra、MultiMarkdown、 Maruku等。这些衍生版本要么基于工具,如Pandoc;要么基于网站,如GitHub和Wikipedia,在语法上基本兼容,但在一些语法和渲染效果上有改动。
    –引自百度百科

    +
    + +
    + +
    +
    + + + + + + + + + markdown + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3412,7 +3486,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3447,7 +3521,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -3798,7 +3872,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/page/2/index.html b/page/2/index.html index 805797d7f1..2ca1ac4d0e 100644 --- a/page/2/index.html +++ b/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2847,6 +2847,77 @@ +
    +
    + + + + + + +
    + + 使用 go-ycsb 对 etcd 进行基准 (benchmark) 性能测试 + +
    + + + +

    + +

    + +
    + +

    using go-ycsb to benchmark etcd.

    + +
    + +
    +
    + + + + + + + + + go-ycsb + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3521,82 +3592,6 @@

    - -
    -
    - - - - - - - - - - -

    - -

    - -
    - - - -Elixir Macros 系列文章译文 - -[1] (译) Understanding Elixir Macros, Part 1 Basics -[2] (译) Understanding Elixir Macros, Part 2 - Macro Theory -[3] (译) Understanding Elixir Macros, Part 3 - Getting into the A... - - -
    - -
    -
    - - - - - - - - - Elixir - - - - -
    - - - -
    - - -
    - -
    - - @@ -3726,7 +3721,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3761,7 +3756,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -4112,7 +4107,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/page/3/index.html b/page/3/index.html index dc1bdd9d97..637f0e04ab 100644 --- a/page/3/index.html +++ b/page/3/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2847,6 +2847,82 @@ +
    +
    + + + + + + + + + + +

    + +

    + +
    + + + +Elixir Macros 系列文章译文 + +[1] (译) Understanding Elixir Macros, Part 1 Basics +[2] (译) Understanding Elixir Macros, Part 2 - Macro Theory +[3] (译) Understanding Elixir Macros, Part 3 - Getting into the A... + + +
    + +
    +
    + + + + + + + + + Elixir + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3527,77 +3603,6 @@

    Yeah

    - -
    -
    - - - - - - - - - - -

    - -

    - -
    - -

    熟悉 Git 的小伙伴应该都知道随着 Git 仓库维护的时间越来越久,追踪的文件越来越多,git 存储的 objects 数量会极其庞大,每次从远程仓库 git clone 的时候都会墨迹很久。如果我们不小心 git add 了一个体积很大的文件,且 git push 到了远程仓库,那么我们 git clone 的时候也会很慢。

    -

    看一下 GitHub 上的 microsoft/vscode 仓库,都有 九万多个 commit 了,可想而知 objects 的数量应该很恐怖,尝试 clone 一下(一百多万个 objects):

    -

    github vscode repo

    - -
    - -
    -
    - - - - - - - - - Git - - - - -
    - - - -
    - - -
    - -
    - - @@ -3727,7 +3732,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3762,7 +3767,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -4113,7 +4118,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/page/4/index.html b/page/4/index.html index ae4fb4366a..bb112791f3 100644 --- a/page/4/index.html +++ b/page/4/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2850,6 +2850,77 @@ +
    +
    + + + + + + + + + + +

    + +

    + +
    + +

    熟悉 Git 的小伙伴应该都知道随着 Git 仓库维护的时间越来越久,追踪的文件越来越多,git 存储的 objects 数量会极其庞大,每次从远程仓库 git clone 的时候都会墨迹很久。如果我们不小心 git add 了一个体积很大的文件,且 git push 到了远程仓库,那么我们 git clone 的时候也会很慢。

    +

    看一下 GitHub 上的 microsoft/vscode 仓库,都有 九万多个 commit 了,可想而知 objects 的数量应该很恐怖,尝试 clone 一下(一百多万个 objects):

    +

    github vscode repo

    + +
    + +
    +
    + + + + + + + + + Git + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -2883,13 +2954,13 @@

    -
    -
    @@ -3519,77 +3590,6 @@

    - -
    -
    - - - - - - -
    - - 热传导方程非特征 Cauchy 问题的一些笔记 - -
    - - - -

    - -

    - -
    - -

    毕设工作即将结束之际,附上一份笔记到博客-数学物理方程-热传导方程.

    - -
    - -
    -
    - - - - - - - - - math - - - - -
    - - - -
    - - -
    - -
    - - @@ -3719,7 +3719,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3754,7 +3754,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -4105,7 +4105,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/page/5/index.html b/page/5/index.html index ed55a76b43..2486a72c09 100644 --- a/page/5/index.html +++ b/page/5/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2847,6 +2847,77 @@ +
    +
    + + + + + + +
    + + 热传导方程非特征 Cauchy 问题的一些笔记 + +
    + + + +

    + +

    + +
    + +

    毕设工作即将结束之际,附上一份笔记到博客-数学物理方程-热传导方程.

    + +
    + +
    +
    + + + + + + + + + math + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3518,86 +3589,6 @@

    - -
    -
    - - - - - - - - - - -

    - -

    - -
    - -
    OSI 模型 -
    -

    网络模型

    -
    -
    - -

    常见 OSI 模型负载均衡方案

      -
    • 2 层负载均衡:一般是用虚拟 MAC 地址方式,外部对虚拟 MAC 地址请求,负载均衡器接收后分配后端实际的 MAC 地址响应。

      -
    • -
    • 3 层负载均衡:一般采用虚拟 IP 地址方式,外部对虚拟的 IP 地址请求,负载均衡器接收后分配后端实际的 IP 地址响应。

      -
    • -
    - -
    - -
    -
    - - - - - - - - - 计算机网络 - - - - -
    - - - -
    - - -
    - -
    - - @@ -3727,7 +3718,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇

    @@ -3762,7 +3753,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4113,7 +4104,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/page/6/index.html b/page/6/index.html index ab1be36600..e8b56622e8 100644 --- a/page/6/index.html +++ b/page/6/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2847,6 +2847,86 @@ +
    +
    + + + + + + + + + + +

    + +

    + +
    + +
    OSI 模型 +
    +

    网络模型

    +
    +
    + +

    常见 OSI 模型负载均衡方案

      +
    • 2 层负载均衡:一般是用虚拟 MAC 地址方式,外部对虚拟 MAC 地址请求,负载均衡器接收后分配后端实际的 MAC 地址响应。

      +
    • +
    • 3 层负载均衡:一般采用虚拟 IP 地址方式,外部对虚拟的 IP 地址请求,负载均衡器接收后分配后端实际的 IP 地址响应。

      +
    • +
    + +
    + +
    +
    + + + + + + + + + 计算机网络 + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3528,84 +3608,6 @@

    - -
    -
    - - - - - - - - - - -

    - -

    - -
    - -

    前言

    众所周知,开发低耦合系统是软件开发的终极目标之一。低耦合的系统更加容易扩展,低耦合的模块更加容易复用,更易于维护和管理。我们知道,消息队列的主要功能就是收发消息,但是它的作用不仅仅只是解决应用之间的通信问题这么简单。消息队列作为常用的中间件,经常被用来对系统解耦,对模块解耦。增强系统的可扩展性和模块的可复用性。

    -

    除了对用于对系统、模块解耦,消息队列还有以下几种通途:

    -
      -
    • 服务异步处理
    • -
    • 流量控制
    • -
    • 作为发布 / 订阅系统实现一个微服务级系统间的观察者模式
    • -
    • 连接流计算任务和数据
    • -
    • 用于将消息广播给大量接收者
    • -
    -

    事物的存在总会有对立的一面,引入消息队列可能会带来延迟问题、产生数据不一致的问题、增加系统复杂度的问题等等。

    - -
    - -
    -
    - - - - - - - - - Architecture - - - - -
    - - - -
    - - -
    - -
    - - @@ -3735,7 +3737,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇

    @@ -3770,7 +3772,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -4121,7 +4123,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/page/7/index.html b/page/7/index.html index 13fa5e632e..e701345463 100644 --- a/page/7/index.html +++ b/page/7/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2847,6 +2847,84 @@ +
    +
    + + + + + + + + + + +

    + +

    + +
    + +

    前言

    众所周知,开发低耦合系统是软件开发的终极目标之一。低耦合的系统更加容易扩展,低耦合的模块更加容易复用,更易于维护和管理。我们知道,消息队列的主要功能就是收发消息,但是它的作用不仅仅只是解决应用之间的通信问题这么简单。消息队列作为常用的中间件,经常被用来对系统解耦,对模块解耦。增强系统的可扩展性和模块的可复用性。

    +

    除了对用于对系统、模块解耦,消息队列还有以下几种通途:

    +
      +
    • 服务异步处理
    • +
    • 流量控制
    • +
    • 作为发布 / 订阅系统实现一个微服务级系统间的观察者模式
    • +
    • 连接流计算任务和数据
    • +
    • 用于将消息广播给大量接收者
    • +
    +

    事物的存在总会有对立的一面,引入消息队列可能会带来延迟问题、产生数据不一致的问题、增加系统复杂度的问题等等。

    + +
    + +
    +
    + + + + + + + + + Architecture + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3518,79 +3596,6 @@

    map

    先看

    - -
    -
    - - - - - - - - - - -

    - -

    - -
    - - - what/why通常情况使用git clone github_repository_address下载下来的仓库使用git branch查看当前所有分支时只能看到master分支,但是想要切换到其他分支进行工作怎么办❓ - -其实使用git clone下载的repository没那么简单😥,clone得到的是仓库所有的数据,不仅仅是复制在Github repository所能看到的m... - - -
    - -
    -
    - - - - - - - - - Git - - - - -
    - - - -
    - - -
    - -
    - - @@ -3720,7 +3725,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3755,7 +3760,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -4106,7 +4111,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/page/8/index.html b/page/8/index.html index 3901062b37..12cbc141fc 100644 --- a/page/8/index.html +++ b/page/8/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2847,6 +2847,79 @@ +
    +
    + + + + + + + + + + +

    + +

    + +
    + + + what/why通常情况使用git clone github_repository_address下载下来的仓库使用git branch查看当前所有分支时只能看到master分支,但是想要切换到其他分支进行工作怎么办❓ + +其实使用git clone下载的repository没那么简单😥,clone得到的是仓库所有的数据,不仅仅是复制在Github repository所能看到的m... + + +
    + +
    +
    + + + + + + + + + Git + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3532,91 +3605,6 @@

    - -
    -
    - - - - - - - - - - -

    - -

    - -
    - -
    -

    备注:当前博客使用的 latex 渲染引擎有点问题,本篇文章更好的阅读体验:https://blog.csdn.net/qq_41022329/article/details/92798759

    -
    -

    公式插入方式

      -
    1. 行内公式可用\(...\)$...$
    2. -
    -
      -
    • 例如$ f(x)=x^2 $,显示为$ f(x)=x^2 $
    • -
    -
      -
    1. 独立公式(单独另起一行,公式会居中),使用$$...$$\[...\]
    2. -
    -
      -
    • 例如:$$ \int{f(x)dx} $$$$ \int_a^b{f(x)dx} $$,显示为:
    • -
    -

    $$ \int{f(x)dx} $$

    -

    $$ \int_a^b{f(x)dx} $$

    - -
    - -
    -
    - - - - - - - - - math - - - - -
    - - - -
    - - -
    - -
    - - @@ -3746,7 +3734,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇

    @@ -3781,7 +3769,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4132,7 +4120,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/page/9/index.html b/page/9/index.html index f8460ed19f..eeca05b150 100644 --- a/page/9/index.html +++ b/page/9/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2847,6 +2847,91 @@ +
    +
    + + + + + + + + + + +

    + +

    + +
    + +
    +

    备注:当前博客使用的 latex 渲染引擎有点问题,本篇文章更好的阅读体验:https://blog.csdn.net/qq_41022329/article/details/92798759

    +
    +

    公式插入方式

      +
    1. 行内公式可用\(...\)$...$
    2. +
    +
      +
    • 例如$ f(x)=x^2 $,显示为$ f(x)=x^2 $
    • +
    +
      +
    1. 独立公式(单独另起一行,公式会居中),使用$$...$$\[...\]
    2. +
    +
      +
    • 例如:$$ \int{f(x)dx} $$$$ \int_a^b{f(x)dx} $$,显示为:
    • +
    +

    $$ \int{f(x)dx} $$

    +

    $$ \int_a^b{f(x)dx} $$

    + +
    + +
    +
    + + + + + + + + + math + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3491,81 +3576,6 @@

    - - - - - - - - - - -

    - -

    - -
    - -

    常见关系:

      -
    • 一对多关系
    • -
    • 多对一关系
    • -
    • 多对多关系
    • -
    • 一对一关系
    • -
    -

    一对多关系(一个作者,多篇文章)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    ## 一对多关系,单作者-多文章,外键不可少
    ## 外键(ForeignKey)总在多的那边定义,关系(relationship)总在单的那边定义

    class Author(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(70), unique=True)
    phone = db.Column(db.String(20))
    # articles为关系属性(一个集合,可以像列表一样操作,在关系的出发侧定义
    ## relationship()函数的第一个参数为关系另一侧的模型名称(Article)
    articles = db.relationship('Article')

    class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(15), index=True)
    body = db.Column(db.Text)
    # 传入ForeignKey的参数形式为:"表名.字段名"
    ## 模型类对应的表名由Flask-SQLAlchemy生成,默认为类名称的小写形式,多个单词通过下划线分隔
    author_id = db.Column(db.Integer, db.ForeignKey('author.id')) #

    # 外键字段(author_id)和关系属性(articles)的命名没有限制
    ## 建立关系可通过操作关系属性进行
    >>>shansan = Author(name="shansan")
    >>>hello = Article(title="Hello world !")
    >>>boy = Article(title="Hello Boy !")
    >>>db.session.add(shansan) # 将创建的数据库记录添加到会话中
    >>>db.session.add(hello)
    >>>db.session.add(boy)
    >>>shansan.articles.append(hello) # 操作关系属性
    >>>shansan.articles.append(boy)
    >>>db.session.commit()
    - -
    - -
    -
    - - - - - - - - - Flask - - - - -
    - - - -
    - - -

    - -
    - - @@ -3695,7 +3705,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3730,7 +3740,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4081,7 +4091,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/post-sitemap.xml b/post-sitemap.xml index c985f054cc..2d29e19f42 100644 --- a/post-sitemap.xml +++ b/post-sitemap.xml @@ -8,6 +8,14 @@ + + https://yeshan333.github.io/2024/06/18/install-erlang-and-elixir-via-vfox-on-windows/ + 2024-06-18T22:58:39.000Z + weekly + 0.6 + + + https://yeshan333.github.io/2024/05/29/free-to-use-sider-with-qwen/ 2024-05-29T00:29:49.000Z diff --git a/rss2.xml b/rss2.xml index 0348d38ac3..08992b3a04 100644 --- a/rss2.xml +++ b/rss2.xml @@ -15,9 +15,36 @@ ShanSan's Blog - Wed, 29 May 2024 00:29:49 GMT + Tue, 18 Jun 2024 22:58:39 GMT http://hexo.io/ + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + https://yeshan333.github.io/2024/06/18/install-erlang-and-elixir-via-vfox-on-windows/ + https://yeshan333.github.io/2024/06/18/install-erlang-and-elixir-via-vfox-on-windows/ + Tue, 18 Jun 2024 22:58:39 GMT + + 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + + + + vfox + + + Elixir + + Erlang + + vfox + + Windows + + + https://yeshan333.github.io/2024/06/18/install-erlang-and-elixir-via-vfox-on-windows/#disqus_thread + + + 手把手教你如何在 Sider (ChatGPT Sidebar) 中免费使用通义千问 https://yeshan333.github.io/2024/05/29/free-to-use-sider-with-qwen/ @@ -850,13 +877,13 @@ <!-- 我们都一样 --> - <div id="aplayer-yULaxNlS" class="aplayer aplayer-tag-marker meting-tag-marker" + <div id="aplayer-MpmIKHIo" class="aplayer aplayer-tag-marker meting-tag-marker" data-id="1340001174" data-server="netease" data-type="song" data-mode="circulation" data-autoplay="true" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#ad7a86" ></div> - <div id="aplayer-HYSIWtzu" class="aplayer aplayer-tag-marker meting-tag-marker" + <div id="aplayer-aWWWsblK" class="aplayer aplayer-tag-marker meting-tag-marker" data-id="191252" data-server="netease" data-type="song" data-mode="circulation" data-autoplay="false" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#ad7a86" ></div> @@ -897,32 +924,5 @@ - - 回到十月-生活中的一点儿小确幸 - https://yeshan333.github.io/2021/11/14/back-to-october/ - https://yeshan333.github.io/2021/11/14/back-to-october/ - Sun, 14 Nov 2021 10:21:37 GMT - - - - - - <link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="前言"><a href="#前言" class="headerlink" - - - - - - - blog - - - blog - - - https://yeshan333.github.io/2021/11/14/back-to-october/#disqus_thread - - - diff --git a/search.xml b/search.xml index 1c7ddcfafa..1d060f91a1 100644 --- a/search.xml +++ b/search.xml @@ -3,6 +3,37 @@ + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + + /2024/06/18/install-erlang-and-elixir-via-vfox-on-windows/ + +

    大概一个多月前, 我写了篇关于如何使用跨平台版本管理工具 vfox 在 Linux 系统下安装管理多个 Erlang/OTP 版本的文章 -> 通过 vfox 安装管理多版本 Erlang 和 Elixir. 文章使用的示范操作系统是 Ubuntu 20.04 Linux 操作系统.

    最近 vfox-erlangvfox-elixir 插件的最新版本已经支持了在 Windows 平台下安装管理多个 Erlang/OTP 和 Elixir 的版本. 且已经通过了 End to End 测试 -> Testing.

    E2E testing

    本篇文章将会以 Windows 10 操作系统为例, 教你如何在 Windows 平台安装和管理多个 Erlang/OTP 和 Elixir 版本.

    1
    2
    3
    4
    5
    6
    > Get-ComputerInfo
    WindowsBuildLabEx : 22621.1.amd64fre.ni_release.220506-1250
    WindowsCurrentVersion : 6.3
    WindowsInstallationType : Client
    WindowsProductName : Windows 10 Pro
    ......

    1、安装 vfox

    vfox (version-fox) 是最近比较热门的一个跨平台通用版本管理工具, 使用 Go 语言进行编写, 插件机制使用了 Lua 去实现扩展性. 目前 vfox 已经支持管理大多数主流编程语言的版本, 生态还算强大. 在这里你可以看到目前 vfox 所支持管理的编程语言版本和工具 -> vfox-Available Plugins.

    请确安装 0.5.3 及以上版本的 vfox, 否则 vfox-erlangvfox-elixir 将无法正常工作. 在这里我们通过 winget 安装 vfox:

    1
    2
    3
    4
    5
    > winget install vfox
    .......

    ❯ vfox -version
    vfox version 0.5.3

    为了能让 vfox 找到已经安装的 Elixir 和 Erlang 版本, 需要将 vfox 默认挂载到 powershell 中:

    打开 PowerShell 配置文件:

    1
    2
    3
    4
    5
    6
    New-Item -Type File -Path $PROFILE # 无需在意 `文件已存在` 错误

    # 如果它提示未能找到路径, 那么你需要强制创建 profile. 添加 "-Force" 选项.
    # New-Item -Type File -Path $PROFILE –Force

    Invoke-Item $PROFILE # 打开 profile

    将下面一行添加到你的 $PROFILE 文件末尾并保存:

    1
    Invoke-Expression "$(vfox activate pwsh)"

    如果powershell提示: 在此系统上禁止运行脚本, 那么请你以管理员身份重新运行powershell输入如下命令

    1
    2
    3
    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
    # 之后输入Y, 按回车
    y

    你也可以参考官方文档安装 vfox -> https://vfox.lhan.me/guides/quick-start.html. 安装好 vfox 之后, 我们再安装下版本管理插件:

    1
    2
    3
    4
    # 添加 vfox-erlang 插件
    vfox add erlang
    # 添加 vfox-elixir 插件
    vfox add elixir

    安装完成后就可以使用这两个 vfox 插件 vfox-erlangvfox-elixir 在 Windows 平台去安装管理多个 Erlang 和 Elixir 的版本了.

    2、通过 vfox-erlang 插件安装 Erlang/OTP

    因为 Elixir 依赖于 Erlang/OTP, 所以在安装 Elixir 之前, 我们需要先安装下 Erlang/OTP. 如果你已经通过其他方式安装了 Erlang/OTP, 请确保后续通过 vfox-elixir 安装的 Elixir 版本与它是兼容的, 可以查看 Elixir 官方文档说明去确认这一点 between-elixir-and-erlang-otp.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 通过 vfox search 找到你想要安装的版本
    ❯ vfox search erlang
    Please select a version of erlang [type to search]:
    -> v25.0.4
    v24.3.4.16
    v24.1.3
    v24.0
    v24.3
    v24.3.2
    v25.2
    v27.0-rc2
    v24.3.4.1
    Press ↑/↓ to select and press ←/→ to page, and press Enter to confirm

    # 当然你也可以指定安装一个版本, 比如
    vfox install erlang@26.2.2

    理论上, 你可以安装任何一个出现在 https://github.com/erlang/otp/releases 中包含 exe 文件的发行版本. 当你看到如下信息, 就表明安装完成了.

    1
    2
    3
    4
    compile info.......
    ...
    Install erlang@26.2.2 success!
    Please use vfox use erlang@26.2.2 to use it.

    我们使用 vfox 切换下到刚才安装好的 Erlang/OTP 版本来验证下安装是否成功:

    1
    2
    3
    4
    5
    6
    7
    ❯ vfox use -g erlang@26.2.2
    Now using erlang@26.2.2.
    ❯ erl
    Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

    Eshell V14.2.2 (press Ctrl+G to abort, type help(). for help)
    1>

    如果能正确唤醒 REPL (Read-Eval-Print Loop) 交互式命令行, 那么安装就好啦. 接下来开始安装 Elixir 吧

    3、 通过 vfox-elixir 插件安装 Elixir

    在开始安装指定的 Elixir 版本之前, 请确保当前安装的 shell 能找到已经安装好 Erlang/OTP 版本相关工具链

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    # 切换 Erlang/OTP 版本
    vfox use -g erlang@26.2.2

    # 安装一个与 Erlang/OTP 版本兼容的 Elixir 版本
    > vfox search elixir
    Please select a version of elixir to install [type to search]:
    -> v1.16.2-elixir-otp-26
    v1.16.2-elixir-otp-25
    v1.16.2-elixir-otp-24
    v1.16.1-elixir-otp-26
    v1.16.1-elixir-otp-25
    v1.16.1-elixir-otp-24
    v1.16.0-rc.1-elixir-otp-26
    v1.16.0-rc.1-elixir-otp-25
    v1.16.0-rc.1-elixir-otp-24
    v1.16.0-rc.0-elixir-otp-26
    v1.16.0-rc.0-elixir-otp-25
    v1.16.0-rc.0-elixir-otp-24
    v1.16.0-elixir-otp-26
    v1.16.0-elixir-otp-25
    v1.16.0-elixir-otp-24
    v1.15.7-elixir-otp-26
    v1.15.7-elixir-otp-25
    v1.15.7-elixir-otp-24
    v1.15.6-elixir-otp-26
    v1.15.6-elixir-otp-25
    Press ↑/↓ to select and press ←/→ to page, and press Enter to confirm

    # 比如
    vfox install elixir@v1.16.1-elixir-otp-26
    .....
    .....
    Install elixir@1.16.1-elixir-otp-26 success!
    Please use vfox use elixir@1.16.1-elixir-otp-26 to use it.

    当你看到形如 Install elixir@1.16.1-elixir-otp-26 success! Please use vfox use elixir@1.16.1-elixir-otp-26 to use it. 相关信息, 就代表安装已经完成了, 接下来验证下可用性:

    1
    2
    3
    4
    5
    ❯ vfox use -g elixir@1.16.1-elixir-otp-26
    Now using elixir@1.15.2.
    > iex.bat
    Erlang/OTP 26 [erts-14.2.5] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns] Interactive Elixir (1.16.1) - press Ctrl+C to exit (type h() ENTER for help)
    iex(1)>

    Elixir 的 REPL (Read-Eval-Print Loop) 交互式命令行能正常打开的话, 那么安装时成功且可用的.

    最后

    vfox 的两个安装管理 Erlang/OTP 和 Elixir 版本的插件同时也支持在 Uinx-like (Linux & Darwin MacOS) 系统下管理多个版本. 你可以查看这个文档去了解更多信息: https://github.com/version-fox/vfox-elixir. 全平台操作系统支持~

    Happy & funny!

    ]]>
    + + + + + vfox + + + + + + + Elixir + + Erlang + + vfox + + Windows + + + +
    + + + 手把手教你如何在 Sider (ChatGPT Sidebar) 中免费使用通义千问 @@ -101,7 +132,7 @@ /2024/04/27/install-erlang-and-elixir-via-vfox/ -

    vfox (version-fox) 是最近比较热门的一个通用版本管理工具,使用 Go 语言进行编写,插件机制使用了 Lua 去实现扩展性. 目前 vfox 已经支持管理大多数主流编程语言的版本,生态还算强大。在这里你可以看到目前 vfox 所支持管理的编程语言版本和工具 -> vfox-Available Plugins

    Elixir 和 Erlang 社区一直以来都比较流行通过 asdf 去安装和管理多版本环境。asdf 也是一个通用的版本管理工具,生态非常的丰富。

    vfox 的版本管理上和 asdf 很像,均通过 .tool-versions 文件去管理项目级和全局的版本信息。这意味着如果你之前使用了 asdf,那么切换到 vfox,不会很困难。因为 vfox 和 asdf 的核心实现有有点不一样,vfox 的执行速度比 asdf 快了将近 5 倍~,官方文档也给出了基准测试结果:version-fox Comparison with asdf-vm

    https://vfox.lhan.me/performence.png

    如果你之前使用 asdf 去管理维护多个 ErlangElixir 的版本,那么 vfox 也是一个不错的选择,值的一试。

    本篇文章将会介绍如果通过 vfox 去安装和管理多个 Erlang 和 Elixir 的版本。

    安装 vfox

    vfox (version-fox) 的跨操作系统支持上很友好,这意味可以 Windows 和 Unix-like 系统上使用它。本篇文章的核心是通过 vfox 去安装和管理多个 Erlang 和 Elixir 语言的版本。因为目前 vfox 的两个管理 Erlang 和 Elixir 版本的插件实现上还没有去支持在 Windows 操作系统下的管理,所以本篇文章的示例环境主要是 Ubuntu 20.04 Linux 环境。让我们开始吧~

    先安装下 vfox (version fox):

    1
    2
    3
    echo "deb [trusted=yes] https://apt.fury.io/versionfox/ /" | sudo tee /etc/apt/sources.list.d/versionfox.list
    sudo apt-get update
    sudo apt-get install vfox

    为了能让 vfox 找到已经安装的 Elixir 和 Erlang 版本,需要将 vfox 默认挂载到 shell 中。接下来修改下 shell 的配置 (以 Bash 为例):

    1
    echo 'eval "$(vfox activate bash)"' >> ~/.bashrc

    你也可以参考这个官方文档安装 vfox -> https://vfox.lhan.me/guides/quick-start.html。安装好 vfox 之后,我们再安装下插件:

    1
    2
    3
    4
    # 添加 vfox-erlang 插件
    vfox add erlang
    # 添加 vfox-elixir 插件
    vfox add elixir

    接下来我们就可以通过上面安装好的两个 vfox 插件 vfox-erlangvfox-elixir 去安装管理多个 Erlang 和 Elixir 的版本了。

    通过 vfox-erlang 插件安装 Erlang/OTP

    因为 Elixir 依赖于 Erlang,所以在安装 Elixir 之前,我们需要先安装下 Erlang。Erlang 的安装是通过对应版本的源码进行安装的,所以我们需要有对应的编译工具链,这里以 Ubuntu 20.04 为例:

    1
    sudo apt-get -y install build-essential autoconf m4 libncurses5-dev libwxgtk3.0-gtk3-dev libwxgtk-webview3.0-gtk3-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev openjdk-11-jdk

    接下来可以安装 Erlang 了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 通过 vfox search 找到你想要安装的版本
    ❯ vfox search erlang
    Please select a version of erlang [type to search]:
    -> v25.0.4
    v24.3.4.16
    v24.1.3
    v24.0
    v24.3
    v24.3.2
    v25.2
    v27.0-rc2
    v24.3.4.1
    Press ↑/↓ to select and press ←/→ to page, and press Enter to confirm

    # 当然你也可以指定安装一个版本,比如
    vfox install erlang@26.2.2

    理论上,你可以安装任何一个出现在 https://github.com/erlang/otp/releases 的版本。因为是从源码编译安装的, 所以安装过程会花费点时间。当你看到如下信息,就表明安装完成了。

    1
    2
    3
    4
    compile info.......
    ...
    Install erlang@26.2.2 success!
    Please use vfox use erlang@26.2.2 to use it.

    我们使用 vfox 切换下到刚才安装好的 Erlang/OTP 版本来验证下安装是否成功:

    1
    2
    3
    4
    5
    6
    7
    ❯ vfox use erlang@26.2.2
    Now using erlang@26.2.2.
    ❯ erl
    Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

    Eshell V14.2.2 (press Ctrl+G to abort, type help(). for help)
    1>

    如果能正确唤醒 REPL,那么安装就好啦。接下来开始安装 Elixir 吧

    安装 Elixir

    因为安装 Elixir 也是从对应版本的源码进行编译安装的,Elixir 的编译需要依赖到 Erlang,我们先让当前使用的 shell 能找到刚才安装好的 Erlang。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 切换 Erlang 版本
    ❯ vfox use erlang@26.2.2
    Now using erlang@26.2.2.
    # 安装 Elixir,将会使用对应的 erlc 编译器
    > vfox install elixir@1.15.2
    .........
    .........
    Generated ex_unit app
    ==> logger (compile)
    Generated logger app
    Generated eex app
    ==> iex (compile)
    Generated iex app
    Install elixir@1.15.2 success!
    Please use vfox use elixir@1.15.2 to use it.

    当你看到 Install elixir@1.15.2 success!,也就意味着安装成功了。可以通过 iex 确认下安装彻底成功:

    1
    2
    3
    4
    5
    6
    7
    ❯ vfox use elixir@1.15.2
    Now using elixir@1.15.2.
    ❯ iex
    Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

    Interactive Elixir (1.15.2) - press Ctrl+C to exit (type h() ENTER for help)
    iex(1)>

    如果你想要安装其他版本的 Elixir,请确保当前使用的 Erlang/OTP 版本和 Elixir 版本是兼容的,可以查看这个文档去确认兼容性: 《compatibility-and-deprecations.html#between-elixir-and-erlang-otp》

    设置全局使用版本

    我们可以使用 vfox use -g xxx 设置默认使用的 Erlang 和 Elixir 版本。

    1
    2
    3
    4
    5
    6
    7
    > vfox use -g erlang@26.2.2
    > vfox use -g elixir@1.15.2

    # 可以查看 .tool-versions 确认设置是否完成
    > cat ~/.version-fox/.tool-versions
    erlang 26.2.2
    elixir 1.15.2

    最后

    vfox 的两个安装管理 Erlang/OTP 和 Elixir 版本的插件同时也支持在 MacOS Darwin 下管理多个版本。你可以查看这个文档去了解更多信息: https://github.com/version-fox/vfox-elixir?tab=readme-ov-file#install-in-darwin-macos-13.

    Happy & funny!

    ]]>
    +

    vfox (version-fox) 是最近比较热门的一个通用版本管理工具,使用 Go 语言进行编写,插件机制使用了 Lua 去实现扩展性. 目前 vfox 已经支持管理大多数主流编程语言的版本,生态还算强大。在这里你可以看到目前 vfox 所支持管理的编程语言版本和工具 -> vfox-Available Plugins

    Elixir 和 Erlang 社区一直以来都比较流行通过 asdf 去安装和管理多版本环境。asdf 也是一个通用的版本管理工具,生态非常的丰富。

    vfox 的版本管理上和 asdf 很像,均通过 .tool-versions 文件去管理项目级和全局的版本信息。这意味着如果你之前使用了 asdf,那么切换到 vfox,不会很困难。因为 vfox 和 asdf 的核心实现有有点不一样,vfox 的执行速度比 asdf 快了将近 5 倍~,官方文档也给出了基准测试结果:version-fox Comparison with asdf-vm

    https://vfox.lhan.me/performence.png

    如果你之前使用 asdf 去管理维护多个 ErlangElixir 的版本,那么 vfox 也是一个不错的选择,值的一试。

    本篇文章将会介绍如果通过 vfox 去安装和管理多个 Erlang 和 Elixir 的版本。

    安装 vfox

    vfox (version-fox) 的跨操作系统支持上很友好,这意味可以 Windows 和 Unix-like 系统上使用它。本篇文章的核心是通过 vfox 去安装和管理多个 Erlang 和 Elixir 语言的版本。因为目前 vfox 的两个管理 Erlang 和 Elixir 版本的插件实现上还没有去支持在 Windows 操作系统下的管理,所以本篇文章的示例环境主要是 Ubuntu 20.04 Linux 环境。让我们开始吧~

    先安装下 vfox (version fox):

    1
    2
    3
    echo "deb [trusted=yes] https://apt.fury.io/versionfox/ /" | sudo tee /etc/apt/sources.list.d/versionfox.list
    sudo apt-get update
    sudo apt-get install vfox

    为了能让 vfox 找到已经安装的 Elixir 和 Erlang 版本,需要将 vfox 默认挂载到 shell 中。接下来修改下 shell 的配置 (以 Bash 为例):

    1
    echo 'eval "$(vfox activate bash)"' >> ~/.bashrc

    你也可以参考这个官方文档安装 vfox -> https://vfox.lhan.me/guides/quick-start.html。安装好 vfox 之后,我们再安装下插件:

    1
    2
    3
    4
    # 添加 vfox-erlang 插件
    vfox add erlang
    # 添加 vfox-elixir 插件
    vfox add elixir

    接下来我们就可以通过上面安装好的两个 vfox 插件 vfox-erlangvfox-elixir 去安装管理多个 Erlang 和 Elixir 的版本了。

    通过 vfox-erlang 插件安装 Erlang/OTP

    因为 Elixir 依赖于 Erlang,所以在安装 Elixir 之前,我们需要先安装下 Erlang。Erlang 的安装是通过对应版本的源码进行安装的,所以我们需要有对应的编译工具链,这里以 Ubuntu 20.04 为例:

    1
    sudo apt-get -y install build-essential autoconf m4 libncurses5-dev libwxgtk3.0-gtk3-dev libwxgtk-webview3.0-gtk3-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev openjdk-11-jdk

    接下来可以安装 Erlang 了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 通过 vfox search 找到你想要安装的版本
    ❯ vfox search erlang
    Please select a version of erlang [type to search]:
    -> v25.0.4
    v24.3.4.16
    v24.1.3
    v24.0
    v24.3
    v24.3.2
    v25.2
    v27.0-rc2
    v24.3.4.1
    Press ↑/↓ to select and press ←/→ to page, and press Enter to confirm

    # 当然你也可以指定安装一个版本,比如
    vfox install erlang@26.2.2

    理论上,你可以安装任何一个出现在 https://github.com/erlang/otp/releases 的版本。因为是从源码编译安装的, 所以安装过程会花费点时间。当你看到如下信息,就表明安装完成了。

    1
    2
    3
    4
    compile info.......
    ...
    Install erlang@26.2.2 success!
    Please use vfox use erlang@26.2.2 to use it.

    我们使用 vfox 切换下到刚才安装好的 Erlang/OTP 版本来验证下安装是否成功:

    1
    2
    3
    4
    5
    6
    7
    ❯ vfox use erlang@26.2.2
    Now using erlang@26.2.2.
    ❯ erl
    Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

    Eshell V14.2.2 (press Ctrl+G to abort, type help(). for help)
    1>

    如果能正确唤醒 REPL,那么安装就好啦。接下来开始安装 Elixir 吧

    安装 Elixir

    因为安装 Elixir 也是从对应版本的源码进行编译安装的,Elixir 的编译需要依赖到 Erlang,我们先让当前使用的 shell 能找到刚才安装好的 Erlang。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 切换 Erlang 版本
    ❯ vfox use erlang@26.2.2
    Now using erlang@26.2.2.
    # 安装 Elixir,将会使用对应的 erlc 编译器
    > vfox install elixir@1.15.2
    .........
    .........
    Generated ex_unit app
    ==> logger (compile)
    Generated logger app
    Generated eex app
    ==> iex (compile)
    Generated iex app
    Install elixir@1.15.2 success!
    Please use vfox use elixir@1.15.2 to use it.

    当你看到 Install elixir@1.15.2 success!,也就意味着安装成功了。可以通过 iex 确认下安装彻底成功:

    1
    2
    3
    4
    5
    6
    7
    ❯ vfox use elixir@1.15.2
    Now using elixir@1.15.2.
    ❯ iex
    Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

    Interactive Elixir (1.15.2) - press Ctrl+C to exit (type h() ENTER for help)
    iex(1)>

    如果你想要安装其他版本的 Elixir,请确保当前使用的 Erlang/OTP 版本和 Elixir 版本是兼容的,可以查看这个文档去确认兼容性: 《compatibility-and-deprecations.html#between-elixir-and-erlang-otp》

    设置全局使用版本

    我们可以使用 vfox use -g xxx 设置默认使用的 Erlang 和 Elixir 版本。

    1
    2
    3
    4
    5
    6
    7
    > vfox use -g erlang@26.2.2
    > vfox use -g elixir@1.15.2

    # 可以查看 .tool-versions 确认设置是否完成
    > cat ~/.version-fox/.tool-versions
    erlang 26.2.2
    elixir 1.15.2

    最后

    vfox 的两个安装管理 Erlang/OTP 和 Elixir 版本的插件同时也支持在 MacOS Darwin 下管理多个版本。你可以查看这个文档去了解更多信息: https://github.com/version-fox/vfox-elixir?tab=readme-ov-file#install-in-darwin-macos-13.

    Happy & funny!

    ]]>
    @@ -828,7 +859,7 @@ /2021/12/04/deserve/ -

    今天凌晨五点就醒了,积累了好多好多的情绪啊!

    ]]>
    +

    今天凌晨五点就醒了,积累了好多好多的情绪啊!

    ]]>
    diff --git a/sitemap.xml b/sitemap.xml index 6b1c01cb5b..e43257f7c0 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -4,12 +4,12 @@ https://yeshan333.github.io/post-sitemap.xml - 2024-05-29T00:29:49.000Z + 2024-06-18T22:58:39.000Z https://yeshan333.github.io/page-sitemap.xml - 2024-06-15T17:04:52.538Z + 2024-06-18T16:11:15.857Z diff --git a/tags/Algorithm/index.html b/tags/Algorithm/index.html index b667f1ebbb..0f32d1c2e1 100644 --- a/tags/Algorithm/index.html +++ b/tags/Algorithm/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3216,7 +3216,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3251,7 +3251,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3602,7 +3602,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Astronomy/index.html b/tags/Astronomy/index.html index 2331c820fd..bdac81df16 100644 --- a/tags/Astronomy/index.html +++ b/tags/Astronomy/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3092,7 +3092,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3127,7 +3127,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3478,7 +3478,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/BeautifulSoup/index.html b/tags/BeautifulSoup/index.html index 48df2a47c4..66a28012ed 100644 --- a/tags/BeautifulSoup/index.html +++ b/tags/BeautifulSoup/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3035,7 +3035,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3070,7 +3070,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3421,7 +3421,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/C/index.html b/tags/C/index.html index f6e923dee8..858342de5c 100644 --- a/tags/C/index.html +++ b/tags/C/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3193,7 +3193,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3228,7 +3228,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3579,7 +3579,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/CPP/index.html b/tags/CPP/index.html index 282be0063b..f16fe731b6 100644 --- a/tags/CPP/index.html +++ b/tags/CPP/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3788,7 +3788,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3823,7 +3823,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4174,7 +4174,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/CPP/page/2/index.html b/tags/CPP/page/2/index.html index b3ce4d49fd..8dc5e1ca78 100644 --- a/tags/CPP/page/2/index.html +++ b/tags/CPP/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3732,7 +3732,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3767,7 +3767,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4118,7 +4118,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/CPP/page/3/index.html b/tags/CPP/page/3/index.html index f5ced67397..62266f57cd 100644 --- a/tags/CPP/page/3/index.html +++ b/tags/CPP/page/3/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3239,7 +3239,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3274,7 +3274,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3625,7 +3625,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/CPU-Bound/index.html b/tags/CPU-Bound/index.html index 70d22a84ea..51bee5da6e 100644 --- a/tags/CPU-Bound/index.html +++ b/tags/CPU-Bound/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/CSS/index.html b/tags/CSS/index.html index 87385abe05..57e0d583d5 100644 --- a/tags/CSS/index.html +++ b/tags/CSS/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3043,7 +3043,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3078,7 +3078,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3429,7 +3429,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Chaos-Testing/index.html b/tags/Chaos-Testing/index.html index 4156cba55c..4cce13a3c1 100644 --- a/tags/Chaos-Testing/index.html +++ b/tags/Chaos-Testing/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Cloudflare/index.html b/tags/Cloudflare/index.html index 81d6b9cb18..7875d63964 100644 --- a/tags/Cloudflare/index.html +++ b/tags/Cloudflare/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Compiler/index.html b/tags/Compiler/index.html index ae9411cb75..8187870eed 100644 --- a/tags/Compiler/index.html +++ b/tags/Compiler/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Deps/index.html b/tags/Deps/index.html index 4895e2466e..69aac8e672 100644 --- a/tags/Deps/index.html +++ b/tags/Deps/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3034,7 +3034,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3069,7 +3069,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3420,7 +3420,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/DevOps/index.html b/tags/DevOps/index.html index 6eb444d4ba..db7ea0b384 100644 --- a/tags/DevOps/index.html +++ b/tags/DevOps/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3117,7 +3117,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3152,7 +3152,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3503,7 +3503,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Docker/index.html b/tags/Docker/index.html index 19a60988b4..2d56ab23dc 100644 --- a/tags/Docker/index.html +++ b/tags/Docker/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Elixir-Github-Codespaces/index.html b/tags/Elixir-Github-Codespaces/index.html index 8955afadfd..498a5c490a 100644 --- a/tags/Elixir-Github-Codespaces/index.html +++ b/tags/Elixir-Github-Codespaces/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Elixir-Macros/index.html b/tags/Elixir-Macros/index.html index b0d35c22ba..52764f05e7 100644 --- a/tags/Elixir-Macros/index.html +++ b/tags/Elixir-Macros/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3431,7 +3431,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3466,7 +3466,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3817,7 +3817,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Elixir/index.html b/tags/Elixir/index.html index b2cf514a14..c3dd5c8c54 100644 --- a/tags/Elixir/index.html +++ b/tags/Elixir/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2861,9 +2861,82 @@ + + + + +
    +
    + + + + + + +
    + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + +
    + + + +

    + +

    + +
    + +

    通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本

    + +
    + +
    +
    + + + + + + + + + vfox + + + + +
    + +
    + +
    + +
    + + +
    + +
    +
    @@ -3420,7 +3493,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3455,7 +3528,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -3806,7 +3879,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Erlang-OTP/index.html b/tags/Erlang-OTP/index.html index 42c2085d86..e606323cc1 100644 --- a/tags/Erlang-OTP/index.html +++ b/tags/Erlang-OTP/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Erlang/index.html b/tags/Erlang/index.html index 7fd3ab7c21..6ad42e83c1 100644 --- a/tags/Erlang/index.html +++ b/tags/Erlang/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2851,11 +2851,84 @@ + + +
    +
    + + + + + + +
    + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + +
    + + + +

    + +

    + +
    + +

    通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本

    + +
    + +
    +
    + + + + + + + + + vfox + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3036,7 +3109,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3144,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -3422,7 +3495,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Event-Loop/index.html b/tags/Event-Loop/index.html index 4ebd42f11c..f0a05919a3 100644 --- a/tags/Event-Loop/index.html +++ b/tags/Event-Loop/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3043,7 +3043,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3078,7 +3078,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3429,7 +3429,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/FSM/index.html b/tags/FSM/index.html index 2dd158da6e..92f8fc9ae0 100644 --- a/tags/FSM/index.html +++ b/tags/FSM/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Federation/index.html b/tags/Federation/index.html index 00bc37b40b..e4140a464c 100644 --- a/tags/Federation/index.html +++ b/tags/Federation/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Flame-Graphs/index.html b/tags/Flame-Graphs/index.html index 0beca55755..e07bf74c85 100644 --- a/tags/Flame-Graphs/index.html +++ b/tags/Flame-Graphs/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3047,7 +3047,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3082,7 +3082,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3433,7 +3433,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Flask/index.html b/tags/Flask/index.html index 6fbe77d573..c42e46249e 100644 --- a/tags/Flask/index.html +++ b/tags/Flask/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3309,7 +3309,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3344,7 +3344,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3695,7 +3695,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/GDB/index.html b/tags/GDB/index.html index 8ecc3b6226..d39d2f9193 100644 --- a/tags/GDB/index.html +++ b/tags/GDB/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/GPG/index.html b/tags/GPG/index.html index e209c88b32..c5f79f6452 100644 --- a/tags/GPG/index.html +++ b/tags/GPG/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3110,7 +3110,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3145,7 +3145,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3496,7 +3496,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/GUI/index.html b/tags/GUI/index.html index 9afe72906d..01d5a7d31b 100644 --- a/tags/GUI/index.html +++ b/tags/GUI/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3039,7 +3039,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3074,7 +3074,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3425,7 +3425,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Git/index.html b/tags/Git/index.html index e6d7267ee0..55692e77d5 100644 --- a/tags/Git/index.html +++ b/tags/Git/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3491,7 +3491,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3526,7 +3526,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3877,7 +3877,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Github-Actions/index.html b/tags/Github-Actions/index.html index 17c437980d..3726b01031 100644 --- a/tags/Github-Actions/index.html +++ b/tags/Github-Actions/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Go/index.html b/tags/Go/index.html index 3636daca5f..613822f881 100644 --- a/tags/Go/index.html +++ b/tags/Go/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3120,7 +3120,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3155,7 +3155,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3506,7 +3506,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Grafana/index.html b/tags/Grafana/index.html index d5b1e39b01..b1b93646b3 100644 --- a/tags/Grafana/index.html +++ b/tags/Grafana/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/HTML/index.html b/tags/HTML/index.html index 1ff0dd4235..560374a0ea 100644 --- a/tags/HTML/index.html +++ b/tags/HTML/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3116,7 +3116,7 @@

    二级标题

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3151,7 +3151,7 @@

    二级标题

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3502,7 +3502,7 @@

    二级标题

  • vfox
    (2)
  • + >
    vfox
    (3)
  • 二级标题
    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/I-O\346\250\241\345\236\213/index.html" "b/tags/I-O\346\250\241\345\236\213/index.html" index b2fdd2a886..565c423c08 100644 --- "a/tags/I-O\346\250\241\345\236\213/index.html" +++ "b/tags/I-O\346\250\241\345\236\213/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3060,7 +3060,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3095,7 +3095,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3446,7 +3446,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/IO-Bound/index.html b/tags/IO-Bound/index.html index 8536b84938..ef11b5c68f 100644 --- a/tags/IO-Bound/index.html +++ b/tags/IO-Bound/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/JavaScript/index.html b/tags/JavaScript/index.html index 003fa9b168..0b2c483389 100644 --- a/tags/JavaScript/index.html +++ b/tags/JavaScript/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3043,7 +3043,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3078,7 +3078,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3429,7 +3429,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Jenkins/index.html b/tags/Jenkins/index.html index ef348a172c..b8f4fc78e0 100644 --- a/tags/Jenkins/index.html +++ b/tags/Jenkins/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Json/index.html b/tags/Json/index.html index 8ba35f2882..91ccfc4cd3 100644 --- a/tags/Json/index.html +++ b/tags/Json/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Jupyter/index.html b/tags/Jupyter/index.html index 26aeff10e6..a8a76d0d1a 100644 --- a/tags/Jupyter/index.html +++ b/tags/Jupyter/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3037,7 +3037,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3072,7 +3072,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3423,7 +3423,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Kafka/index.html b/tags/Kafka/index.html index 656a7a655b..1d5837ac12 100644 --- a/tags/Kafka/index.html +++ b/tags/Kafka/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3048,7 +3048,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3083,7 +3083,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3434,7 +3434,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Kubeadm/index.html b/tags/Kubeadm/index.html index 4dda37989d..6911603313 100644 --- a/tags/Kubeadm/index.html +++ b/tags/Kubeadm/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3037,7 +3037,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3072,7 +3072,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3423,7 +3423,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Kubernetes/index.html b/tags/Kubernetes/index.html index 6288169e02..6798d84f0a 100644 --- a/tags/Kubernetes/index.html +++ b/tags/Kubernetes/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3037,7 +3037,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3072,7 +3072,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3423,7 +3423,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/LLMs/index.html b/tags/LLMs/index.html index f03547164e..2c42ffabe5 100644 --- a/tags/LLMs/index.html +++ b/tags/LLMs/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Langchain/index.html b/tags/Langchain/index.html index 1bc43ffd6f..ef3b25eb14 100644 --- a/tags/Langchain/index.html +++ b/tags/Langchain/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Latex/index.html b/tags/Latex/index.html index b6de1cb1fe..2b8e1b25f5 100644 --- a/tags/Latex/index.html +++ b/tags/Latex/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3050,7 +3050,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3085,7 +3085,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3436,7 +3436,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Lexer/index.html b/tags/Lexer/index.html index 777b5d584d..c6b5a446dd 100644 --- a/tags/Lexer/index.html +++ b/tags/Lexer/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Linux/index.html b/tags/Linux/index.html index 1f2645feb2..cad7956503 100644 --- a/tags/Linux/index.html +++ b/tags/Linux/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3266,7 +3266,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3301,7 +3301,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3652,7 +3652,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Load-Balance/index.html b/tags/Load-Balance/index.html index 3ec41f16c6..8eb5b27081 100644 --- a/tags/Load-Balance/index.html +++ b/tags/Load-Balance/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3045,7 +3045,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3080,7 +3080,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3431,7 +3431,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/MATLAB/index.html b/tags/MATLAB/index.html index 3fca65d5c8..497dc22407 100644 --- a/tags/MATLAB/index.html +++ b/tags/MATLAB/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/MD5/index.html b/tags/MD5/index.html index 0f691ac091..8caefacaf7 100644 --- a/tags/MD5/index.html +++ b/tags/MD5/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3038,7 +3038,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3073,7 +3073,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3424,7 +3424,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Marshal/index.html b/tags/Marshal/index.html index 6c433facca..04d0af57b9 100644 --- a/tags/Marshal/index.html +++ b/tags/Marshal/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3038,7 +3038,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3073,7 +3073,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3424,7 +3424,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Memory/index.html b/tags/Memory/index.html index 905e4abda6..60644e2298 100644 --- a/tags/Memory/index.html +++ b/tags/Memory/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3038,7 +3038,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3073,7 +3073,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3424,7 +3424,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Mix/index.html b/tags/Mix/index.html index 173121f496..3eb55965bd 100644 --- a/tags/Mix/index.html +++ b/tags/Mix/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3034,7 +3034,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3069,7 +3069,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3420,7 +3420,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/MongoDB/index.html b/tags/MongoDB/index.html index c2ef22cafe..d67ef86a11 100644 --- a/tags/MongoDB/index.html +++ b/tags/MongoDB/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Monitoring/index.html b/tags/Monitoring/index.html index 1d41b0df50..9132309381 100644 --- a/tags/Monitoring/index.html +++ b/tags/Monitoring/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Monorepo/index.html b/tags/Monorepo/index.html index a91c7d124b..576dc07c6d 100644 --- a/tags/Monorepo/index.html +++ b/tags/Monorepo/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3041,7 +3041,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3076,7 +3076,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3427,7 +3427,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Nginx/index.html b/tags/Nginx/index.html index a88dab8a04..4afee1b8b4 100644 --- a/tags/Nginx/index.html +++ b/tags/Nginx/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Profiling/index.html b/tags/Profiling/index.html index 42c4c1fc71..14fa68133b 100644 --- a/tags/Profiling/index.html +++ b/tags/Profiling/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3047,7 +3047,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3082,7 +3082,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3433,7 +3433,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Prometheus/index.html b/tags/Prometheus/index.html index 9bc68669b0..beffec4c50 100644 --- a/tags/Prometheus/index.html +++ b/tags/Prometheus/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3114,7 +3114,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3149,7 +3149,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3500,7 +3500,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Python/index.html b/tags/Python/index.html index 99c9749d0b..055006c456 100644 --- a/tags/Python/index.html +++ b/tags/Python/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3753,7 +3753,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3788,7 +3788,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4139,7 +4139,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Python/page/2/index.html b/tags/Python/page/2/index.html index 802eebc35c..ee9c524561 100644 --- a/tags/Python/page/2/index.html +++ b/tags/Python/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3659,7 +3659,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3694,7 +3694,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4045,7 +4045,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/RSS-Reader/index.html b/tags/RSS-Reader/index.html index 6e72b19d80..8db86f4388 100644 --- a/tags/RSS-Reader/index.html +++ b/tags/RSS-Reader/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/React/index.html b/tags/React/index.html index 320dbcba1e..cdc99dfe12 100644 --- a/tags/React/index.html +++ b/tags/React/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3202,7 +3202,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3237,7 +3237,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3588,7 +3588,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/Requests/index.html b/tags/Requests/index.html index a6d9564520..e82dfa5f46 100644 --- a/tags/Requests/index.html +++ b/tags/Requests/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3152,7 +3152,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3187,7 +3187,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3538,7 +3538,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/SSE/index.html b/tags/SSE/index.html index 14c259e33d..816c0c3ef0 100644 --- a/tags/SSE/index.html +++ b/tags/SSE/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Scrapy/index.html b/tags/Scrapy/index.html index daec99ebca..a3f38cebcb 100644 --- a/tags/Scrapy/index.html +++ b/tags/Scrapy/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3052,7 +3052,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3087,7 +3087,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3438,7 +3438,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Sider/index.html b/tags/Sider/index.html index 610ee1bece..6e7ce92972 100644 --- a/tags/Sider/index.html +++ b/tags/Sider/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3044,7 +3044,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3079,7 +3079,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3430,7 +3430,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/TCP/index.html b/tags/TCP/index.html index 30281d9106..bc684dd2a4 100644 --- a/tags/TCP/index.html +++ b/tags/TCP/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3039,7 +3039,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3074,7 +3074,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3425,7 +3425,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Tech-Weekly/index.html b/tags/Tech-Weekly/index.html index cea254b0d3..7d1f083a43 100644 --- a/tags/Tech-Weekly/index.html +++ b/tags/Tech-Weekly/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Test-Coverage/index.html b/tags/Test-Coverage/index.html index d684031285..0e928e848e 100644 --- a/tags/Test-Coverage/index.html +++ b/tags/Test-Coverage/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3115,7 +3115,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3150,7 +3150,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3501,7 +3501,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/UnMarshal/index.html b/tags/UnMarshal/index.html index 3666a66d04..3fc25355cf 100644 --- a/tags/UnMarshal/index.html +++ b/tags/UnMarshal/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3038,7 +3038,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3073,7 +3073,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3424,7 +3424,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/WSL/index.html b/tags/WSL/index.html index f754c7e072..617f8eb773 100644 --- a/tags/WSL/index.html +++ b/tags/WSL/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3039,7 +3039,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3074,7 +3074,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3425,7 +3425,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/WXT/index.html b/tags/WXT/index.html index aa4610c25e..ba86f60059 100644 --- a/tags/WXT/index.html +++ b/tags/WXT/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Websocket/index.html b/tags/Websocket/index.html index 4e1cf75ffd..cec89b068b 100644 --- a/tags/Websocket/index.html +++ b/tags/Websocket/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Windows/index.html b/tags/Windows/index.html new file mode 100644 index 0000000000..457ef9dbea --- /dev/null +++ b/tags/Windows/index.html @@ -0,0 +1,4966 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 标签:Windows - ShanSan + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    + +
    +
    + + +
    + + + +
    + + + + + + + + + + +
    +
    + + + + + + +
    + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + +
    + + + +

    + +

    + +
    + +

    通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本

    + +
    + +
    +
    + + + + + + + + + vfox + + + + +
    + + + +
    + + +
    + +
    + + + +
    + + + + + + + +
    + + + + + + + + + +
    + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + diff --git a/tags/Wireshark/index.html b/tags/Wireshark/index.html index 19f11b9ed7..08ab705ada 100644 --- a/tags/Wireshark/index.html +++ b/tags/Wireshark/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3115,7 +3115,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3150,7 +3150,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3501,7 +3501,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/Workers-AI/index.html b/tags/Workers-AI/index.html index 964d06e29c..bac7234d55 100644 --- a/tags/Workers-AI/index.html +++ b/tags/Workers-AI/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/YCSB/index.html b/tags/YCSB/index.html index 1b9e209dc6..f27c53c223 100644 --- a/tags/YCSB/index.html +++ b/tags/YCSB/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/benchmark/index.html b/tags/benchmark/index.html index 480e8ce9f7..edfc138dc2 100644 --- a/tags/benchmark/index.html +++ b/tags/benchmark/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/blog/index.html b/tags/blog/index.html index f0a4ab4395..bd66fdf573 100644 --- a/tags/blog/index.html +++ b/tags/blog/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3057,13 +3057,13 @@

    -
    -
    @@ -3737,7 +3737,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3772,7 +3772,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -4123,7 +4123,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/blog/page/2/index.html b/tags/blog/page/2/index.html index 16e5a436c3..e154ba681f 100644 --- a/tags/blog/page/2/index.html +++ b/tags/blog/page/2/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3323,7 +3323,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3358,7 +3358,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3709,7 +3709,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/chezmoi/index.html b/tags/chezmoi/index.html index 2f062f0a21..8f933c6fe1 100644 --- a/tags/chezmoi/index.html +++ b/tags/chezmoi/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/debug/index.html b/tags/debug/index.html index 579cc04000..3d1cca77df 100644 --- a/tags/debug/index.html +++ b/tags/debug/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3045,7 +3045,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3080,7 +3080,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3431,7 +3431,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/docker/index.html b/tags/docker/index.html index 5b0d012dbd..e6ec82f7c0 100644 --- a/tags/docker/index.html +++ b/tags/docker/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3116,7 +3116,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3151,7 +3151,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3502,7 +3502,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/dotfiles/index.html b/tags/dotfiles/index.html index 8840cc4466..2423410abb 100644 --- a/tags/dotfiles/index.html +++ b/tags/dotfiles/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/etcd/index.html b/tags/etcd/index.html index 1df8ce3896..13ce8e6a36 100644 --- a/tags/etcd/index.html +++ b/tags/etcd/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3109,7 +3109,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3144,7 +3144,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3495,7 +3495,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/extension/index.html b/tags/extension/index.html index d44fd11cb9..6022e002e2 100644 --- a/tags/extension/index.html +++ b/tags/extension/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/go-ycsb/index.html b/tags/go-ycsb/index.html index f6bec80510..0254b70aa6 100644 --- a/tags/go-ycsb/index.html +++ b/tags/go-ycsb/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/hexo/index.html b/tags/hexo/index.html index 39b0b954fa..70d444dd0a 100644 --- a/tags/hexo/index.html +++ b/tags/hexo/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3286,7 +3286,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3321,7 +3321,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3672,7 +3672,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/index.html b/tags/index.html index 86565c172d..c87342059c 100644 --- a/tags/index.html +++ b/tags/index.html @@ -43,8 +43,8 @@ - - + + @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2849,7 +2849,7 @@

    所有标签

    - +

    @@ -4082,7 +4082,7 @@

    所有标签

    - + diff --git a/tags/json/index.html b/tags/json/index.html index 52e88bd6fa..ef253221b5 100644 --- a/tags/json/index.html +++ b/tags/json/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3038,7 +3038,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3073,7 +3073,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3424,7 +3424,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/markdown/index.html b/tags/markdown/index.html index e911532691..f406eadc68 100644 --- a/tags/markdown/index.html +++ b/tags/markdown/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3304,7 +3304,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3339,7 +3339,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3690,7 +3690,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git a/tags/math/index.html b/tags/math/index.html index 5766541289..1b7debf835 100644 --- a/tags/math/index.html +++ b/tags/math/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/memory/index.html b/tags/memory/index.html index 3461e71e2a..4fc8d352f1 100644 --- a/tags/memory/index.html +++ b/tags/memory/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3039,7 +3039,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3074,7 +3074,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3425,7 +3425,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/music/index.html b/tags/music/index.html index d11dcb52de..761efdccfd 100644 --- a/tags/music/index.html +++ b/tags/music/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3050,7 +3050,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3085,7 +3085,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3436,7 +3436,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/tcpdump/index.html b/tags/tcpdump/index.html index 40d9521fce..9dc0f4d53a 100644 --- a/tags/tcpdump/index.html +++ b/tags/tcpdump/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3039,7 +3039,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3074,7 +3074,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3425,7 +3425,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/vfox-erlang/index.html b/tags/vfox-erlang/index.html index a346b3ee5e..292c2aea4a 100644 --- a/tags/vfox-erlang/index.html +++ b/tags/vfox-erlang/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/vfox-plugin/index.html b/tags/vfox-plugin/index.html index 79b6ab9f0d..4cac749041 100644 --- a/tags/vfox-plugin/index.html +++ b/tags/vfox-plugin/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3036,7 +3036,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3071,7 +3071,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3422,7 +3422,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git a/tags/vfox/index.html b/tags/vfox/index.html index 4df0bc8199..4cbd2c2106 100644 --- a/tags/vfox/index.html +++ b/tags/vfox/index.html @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -2853,11 +2853,84 @@ + + +
    +
    + + + + + + +
    + + (Amazing!) 通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本 + +
    + + + +

    + +

    + +
    + +

    通过 vfox 安装在 Windows 上管理多个 Erlang/OTP 和 Elixir 的版本

    + +
    + +
    +
    + + + + + + + + + vfox + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    @@ -3109,7 +3182,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3144,7 +3217,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日

    @@ -3495,7 +3568,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\344\270\212\344\270\213\346\226\207/index.html" "b/tags/\344\270\212\344\270\213\346\226\207/index.html" index c99b9511de..928f4ee3bb 100644 --- "a/tags/\344\270\212\344\270\213\346\226\207/index.html" +++ "b/tags/\344\270\212\344\270\213\346\226\207/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\344\277\241\346\201\257\346\240\207\350\256\260/index.html" "b/tags/\344\277\241\346\201\257\346\240\207\350\256\260/index.html" index 3d7704940d..94f29579a8 100644 --- "a/tags/\344\277\241\346\201\257\346\240\207\350\256\260/index.html" +++ "b/tags/\344\277\241\346\201\257\346\240\207\350\256\260/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3039,7 +3039,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3074,7 +3074,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3425,7 +3425,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\345\207\275\346\225\260\345\274\217\347\274\226\347\250\213/index.html" "b/tags/\345\207\275\346\225\260\345\274\217\347\274\226\347\250\213/index.html" index 30eea61e9e..4bf0624634 100644 --- "a/tags/\345\207\275\346\225\260\345\274\217\347\274\226\347\250\213/index.html" +++ "b/tags/\345\207\275\346\225\260\345\274\217\347\274\226\347\250\213/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3042,7 +3042,7 @@

    map

    先看

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3077,7 +3077,7 @@

    map

    先看

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3428,7 +3428,7 @@

    map

    先看

  • vfox
    (2)
  • + >
    vfox
    (3)
  • map

    先看

    - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\345\212\240\345\257\206/index.html" "b/tags/\345\212\240\345\257\206/index.html" index dce3ce3d22..ac1c076bda 100644 --- "a/tags/\345\212\240\345\257\206/index.html" +++ "b/tags/\345\212\240\345\257\206/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3035,7 +3035,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3070,7 +3070,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3421,7 +3421,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\345\215\217\347\250\213/index.html" "b/tags/\345\215\217\347\250\213/index.html" index 3d4ef421b1..3f6119c610 100644 --- "a/tags/\345\215\217\347\250\213/index.html" +++ "b/tags/\345\215\217\347\250\213/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3048,7 +3048,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3083,7 +3083,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3434,7 +3434,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\345\216\213\345\212\233\346\265\213\350\257\225/index.html" "b/tags/\345\216\213\345\212\233\346\265\213\350\257\225/index.html" index 1eda65d52f..c4448b6fda 100644 --- "a/tags/\345\216\213\345\212\233\346\265\213\350\257\225/index.html" +++ "b/tags/\345\216\213\345\212\233\346\265\213\350\257\225/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\345\267\245\347\250\213\345\214\226/index.html" "b/tags/\345\267\245\347\250\213\345\214\226/index.html" index 7dc3bf54a4..4da364e786 100644 --- "a/tags/\345\267\245\347\250\213\345\214\226/index.html" +++ "b/tags/\345\267\245\347\250\213\345\214\226/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3035,7 +3035,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3070,7 +3070,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3421,7 +3421,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" "b/tags/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" index 317c519aa6..4eac03e31d 100644 --- "a/tags/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" +++ "b/tags/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3121,7 +3121,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3156,7 +3156,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3507,7 +3507,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\346\234\215\345\212\241\345\231\250\350\277\233\347\250\213\347\256\241\347\220\206/index.html" "b/tags/\346\234\215\345\212\241\345\231\250\350\277\233\347\250\213\347\256\241\347\220\206/index.html" index 09b5c34a88..86399ce9a8 100644 --- "a/tags/\346\234\215\345\212\241\345\231\250\350\277\233\347\250\213\347\256\241\347\220\206/index.html" +++ "b/tags/\346\234\215\345\212\241\345\231\250\350\277\233\347\250\213\347\256\241\347\220\206/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3034,7 +3034,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3069,7 +3069,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3420,7 +3420,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\346\234\215\345\212\241\347\274\226\346\216\222/index.html" "b/tags/\346\234\215\345\212\241\347\274\226\346\216\222/index.html" index e135eb3446..219f456cf6 100644 --- "a/tags/\346\234\215\345\212\241\347\274\226\346\216\222/index.html" +++ "b/tags/\346\234\215\345\212\241\347\274\226\346\216\222/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3038,7 +3038,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3073,7 +3073,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3424,7 +3424,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\346\236\266\346\236\204\350\256\276\350\256\241/index.html" "b/tags/\346\236\266\346\236\204\350\256\276\350\256\241/index.html" index 1a2e624c26..cc8466f6e2 100644 --- "a/tags/\346\236\266\346\236\204\350\256\276\350\256\241/index.html" +++ "b/tags/\346\236\266\346\236\204\350\256\276\350\256\241/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3043,7 +3043,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3078,7 +3078,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3429,7 +3429,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217/index.html" "b/tags/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217/index.html" index 8ae62a9271..cbc3a1be5d 100644 --- "a/tags/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217/index.html" +++ "b/tags/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3039,7 +3039,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3074,7 +3074,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3425,7 +3425,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\346\265\201\345\244\204\347\220\206\345\271\263\345\217\260/index.html" "b/tags/\346\265\201\345\244\204\347\220\206\345\271\263\345\217\260/index.html" index b0a931b926..4c7ed663be 100644 --- "a/tags/\346\265\201\345\244\204\347\220\206\345\271\263\345\217\260/index.html" +++ "b/tags/\346\265\201\345\244\204\347\220\206\345\271\263\345\217\260/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3048,7 +3048,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3083,7 +3083,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3434,7 +3434,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\346\266\210\346\201\257\345\274\225\346\223\216\347\263\273\347\273\237/index.html" "b/tags/\346\266\210\346\201\257\345\274\225\346\223\216\347\263\273\347\273\237/index.html" index 491a79e10c..5a11e8c77f 100644 --- "a/tags/\346\266\210\346\201\257\345\274\225\346\223\216\347\263\273\347\273\237/index.html" +++ "b/tags/\346\266\210\346\201\257\345\274\225\346\223\216\347\263\273\347\273\237/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3048,7 +3048,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3083,7 +3083,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3434,7 +3434,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\346\266\210\346\201\257\351\230\237\345\210\227/index.html" "b/tags/\346\266\210\346\201\257\351\230\237\345\210\227/index.html" index 56f7ef885a..506629d634 100644 --- "a/tags/\346\266\210\346\201\257\351\230\237\345\210\227/index.html" +++ "b/tags/\346\266\210\346\201\257\351\230\237\345\210\227/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3043,7 +3043,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3078,7 +3078,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3429,7 +3429,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\346\267\261\346\213\267\350\264\235\344\270\216\346\265\205\346\213\267\350\264\235/index.html" "b/tags/\346\267\261\346\213\267\350\264\235\344\270\216\346\265\205\346\213\267\350\264\235/index.html" index 4633510c10..de484ae321 100644 --- "a/tags/\346\267\261\346\213\267\350\264\235\344\270\216\346\265\205\346\213\267\350\264\235/index.html" +++ "b/tags/\346\267\261\346\213\267\350\264\235\344\270\216\346\265\205\346\213\267\350\264\235/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3041,7 +3041,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3076,7 +3076,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3427,7 +3427,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\347\210\254\350\231\253/index.html" "b/tags/\347\210\254\350\231\253/index.html" index 6122ef5e3e..180bb08824 100644 --- "a/tags/\347\210\254\350\231\253/index.html" +++ "b/tags/\347\210\254\350\231\253/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3448,7 +3448,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3483,7 +3483,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3834,7 +3834,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\347\216\257\345\242\203\347\256\241\347\220\206/index.html" "b/tags/\347\216\257\345\242\203\347\256\241\347\220\206/index.html" index 241f95bd18..c31426ef64 100644 --- "a/tags/\347\216\257\345\242\203\347\256\241\347\220\206/index.html" +++ "b/tags/\347\216\257\345\242\203\347\256\241\347\220\206/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3040,7 +3040,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3075,7 +3075,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3426,7 +3426,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\347\272\277\347\250\213/index.html" "b/tags/\347\272\277\347\250\213/index.html" index 056ff3e0c8..a84b7d4da8 100644 --- "a/tags/\347\272\277\347\250\213/index.html" +++ "b/tags/\347\272\277\347\250\213/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3049,7 +3049,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3084,7 +3084,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3435,7 +3435,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\350\256\241\347\256\227\346\234\272\347\275\221\350\267\257/index.html" "b/tags/\350\256\241\347\256\227\346\234\272\347\275\221\350\267\257/index.html" index f665f86378..90eb1a126b 100644 --- "a/tags/\350\256\241\347\256\227\346\234\272\347\275\221\350\267\257/index.html" +++ "b/tags/\350\256\241\347\256\227\346\234\272\347\275\221\350\267\257/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3039,7 +3039,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3074,7 +3074,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3425,7 +3425,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\350\256\276\350\256\241\345\267\245\345\205\267/index.html" "b/tags/\350\256\276\350\256\241\345\267\245\345\205\267/index.html" index ca02a9263a..1b7f12ec6d 100644 --- "a/tags/\350\256\276\350\256\241\345\267\245\345\205\267/index.html" +++ "b/tags/\350\256\276\350\256\241\345\267\245\345\205\267/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3034,7 +3034,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3069,7 +3069,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3420,7 +3420,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\350\256\276\350\256\241\346\250\241\345\274\217/index.html" "b/tags/\350\256\276\350\256\241\346\250\241\345\274\217/index.html" index 0359fbfa81..58d24be695 100644 --- "a/tags/\350\256\276\350\256\241\346\250\241\345\274\217/index.html" +++ "b/tags/\350\256\276\350\256\241\346\250\241\345\274\217/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3037,7 +3037,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3072,7 +3072,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3423,7 +3423,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\350\257\221\346\226\207/index.html" "b/tags/\350\257\221\346\226\207/index.html" index b503e4a79d..731282ac60 100644 --- "a/tags/\350\257\221\346\226\207/index.html" +++ "b/tags/\350\257\221\346\226\207/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3035,7 +3035,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3070,7 +3070,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3421,7 +3421,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\350\277\233\347\250\213/index.html" "b/tags/\350\277\233\347\250\213/index.html" index 8c9e828da2..ba01c985a5 100644 --- "a/tags/\350\277\233\347\250\213/index.html" +++ "b/tags/\350\277\233\347\250\213/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3049,7 +3049,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3084,7 +3084,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3435,7 +3435,7 @@

    vfox
    (2)

  • + >
    vfox
    (3)
  • Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\350\277\233\347\250\213\351\200\232\344\277\241/index.html" "b/tags/\350\277\233\347\250\213\351\200\232\344\277\241/index.html" index 2182650398..798fa736e1 100644 --- "a/tags/\350\277\233\347\250\213\351\200\232\344\277\241/index.html" +++ "b/tags/\350\277\233\347\250\213\351\200\232\344\277\241/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3037,7 +3037,7 @@

    总览
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3072,7 +3072,7 @@

    总览
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3423,7 +3423,7 @@

    总览
    vfox
    (2)

  • + >
    vfox
    (3)
  • 总览 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\351\200\232\344\271\211\345\215\203\351\227\256/index.html" "b/tags/\351\200\232\344\271\211\345\215\203\351\227\256/index.html" index 61b1441d84..cb9efcc5fa 100644 --- "a/tags/\351\200\232\344\271\211\345\215\203\351\227\256/index.html" +++ "b/tags/\351\200\232\344\271\211\345\215\203\351\227\256/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3044,7 +3044,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3079,7 +3079,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3430,7 +3430,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\351\232\217\347\254\224/index.html" "b/tags/\351\232\217\347\254\224/index.html" index c7b2bada94..bf63cda311 100644 --- "a/tags/\351\232\217\347\254\224/index.html" +++ "b/tags/\351\232\217\347\254\224/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3593,7 +3593,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3628,7 +3628,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3979,7 +3979,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\351\232\220\347\247\201/index.html" "b/tags/\351\232\220\347\247\201/index.html" index 1429cbab11..e8908abed1 100644 --- "a/tags/\351\232\220\347\247\201/index.html" +++ "b/tags/\351\232\220\347\247\201/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3035,7 +3035,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3070,7 +3070,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3421,7 +3421,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理
    diff --git "a/tags/\351\235\231\346\200\201\347\261\273\345\236\213\346\243\200\346\237\245/index.html" "b/tags/\351\235\231\346\200\201\347\261\273\345\236\213\346\243\200\346\237\245/index.html" index e9c973cb4f..7f897020ea 100644 --- "a/tags/\351\235\231\346\200\201\347\261\273\345\236\213\346\243\200\346\237\245/index.html" +++ "b/tags/\351\235\231\346\200\201\347\261\273\345\236\213\346\243\200\346\237\245/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3035,7 +3035,7 @@

    前言
    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3070,7 +3070,7 @@

    前言
    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3421,7 +3421,7 @@

    前言
    vfox
    (2)

  • + >
    vfox
    (3)
  • 前言 - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 diff --git "a/tags/\351\241\271\347\233\256\347\256\241\347\220\206/index.html" "b/tags/\351\241\271\347\233\256\347\256\241\347\220\206/index.html" index 11fc371e79..7279512c5d 100644 --- "a/tags/\351\241\271\347\233\256\347\256\241\347\220\206/index.html" +++ "b/tags/\351\241\271\347\233\256\347\256\241\347\220\206/index.html" @@ -1910,7 +1910,7 @@ debug: "env", cdn: {"js":{"app":"/js/app.js","parallax":"/js/plugins/parallax.js","rightMenu":"/js/plugins/rightMenu.js","rightMenus":"/js/plugins/rightMenus.js","sites":"/js/plugins/tags/sites.js","friends":"/js/plugins/tags/friends.js","contributors":"/js/plugins/tags/contributors.js","search":"/js/search/hexo.js"},"css":{"style":"/css/style.css"}}, default: {"avatar":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/avatar/round/3442075.svg","link":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/link/8f277b4ee0ecd.svg","cover":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/cover/76b86c0226ffd.svg","image":"https://unpkg.com/volantis-static@0.0.1654736714924/media/placeholder/image/2659360.svg"}, - lastupdate: new Date(1718471124079), + lastupdate: new Date(1718727107963), sidebar: { for_page: ["blogger","webinfo","my_follow","category","tagcloud","wonderful_link"], for_post: ["toc"], @@ -3041,7 +3041,7 @@

    文章数目:
    -
    156 篇
    +
    157 篇
    @@ -3076,7 +3076,7 @@

    最后活动时间:
    -
    2024-06-15 日
    +
    2024-06-18 日
    @@ -3427,7 +3427,7 @@

  • vfox
    (2)
  • + >
    vfox
    (3)

  • - Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理 + Algorithm Astronomy BeautifulSoup C CPP CPU Bound CSS Chaos Testing Cloudflare Compiler Deps DevOps Docker Elixir Elixir, Github Codespaces Elixir-Macros Erlang Erlang/OTP Event-Loop FSM Federation Flame Graphs Flask GDB GPG GUI Git Github Actions Go Grafana HTML I/O模型 IO Bound JavaScript Jenkins Json Jupyter Kafka Kubeadm Kubernetes LLMs Langchain Latex Lexer Linux Load Balance MATLAB MD5 Marshal Memory Mix MongoDB Monitoring Monorepo Nginx Profiling Prometheus Python RSS Reader React Requests SSE Scrapy Sider TCP Tech-Weekly Test Coverage UnMarshal WSL WXT Websocket Windows Wireshark Workers AI YCSB benchmark blog chezmoi debug docker dotfiles etcd extension go-ycsb hexo json markdown math memory music tcpdump vfox vfox-erlang vfox-plugin 上下文 信息标记 函数式编程 加密 协程 压力测试 工程化 数据结构 服务器进程管理 服务编排 架构设计 正则表达式 流处理平台 消息引擎系统 消息队列 深拷贝与浅拷贝 爬虫 环境管理 线程 计算机网路 设计工具 设计模式 译文 进程 进程通信 通义千问 随笔 隐私 静态类型检查 项目管理