{"@attributes":{"version":"2.0"},"channel":{"title":"Greycode's Blog","link":"https:\/\/blog.greycode.top\/","description":"Recent content on Greycode's Blog","generator":"Hugo -- gohugo.io","language":"en-us","lastBuildDate":"Sat, 25 Mar 2023 14:39:37 +0800","item":[{"title":"Create a simple kernel module","link":"https:\/\/blog.greycode.top\/posts\/create-simple-kernel-programer\/","pubDate":"Sat, 25 Mar 2023 14:39:37 +0800","guid":"https:\/\/blog.greycode.top\/posts\/create-simple-kernel-programer\/","description":"\u7f16\u5199\u6a21\u5757\u4ee3\u7801 \u521b\u5efa\u4e00\u4e2a\u6587\u4ef6\u5939\uff0c\u547d\u540d\u4e3ahello\uff0c\u5e76\u5728\u8be5\u6587\u4ef6\u5939\u4e0b\u521b\u5efa\u4e00\u4e2a\u540d\u4e3ahello.c\u7684\u6587\u4ef6\uff0c\u8f93\u5165\u4ee5\u4e0b\u4ee3\u7801\uff1a\n#include &lt;linux\/init.h&gt; #include &lt;linux\/module.h&gt; #include &lt;linux\/kernel.h&gt; MODULE_LICENSE(&#34;GPL&#34;); MODULE_AUTHOR(&#34;Your Name&#34;); MODULE_DESCRIPTION(&#34;A simple Hello World module&#34;); static int __init hello_init(void) { printk(KERN_INFO &#34;Hello, world!\\n&#34;); return 0; } static void __exit hello_exit(void) { printk(KERN_INFO &#34;Goodbye, world!\\n&#34;); } module_init(hello_init); module_exit(hello_exit); \u7f16\u5199Makefile obj-m += hello.o all: make -C \/lib\/modules\/$(shell uname -r)\/build M=$(PWD) modules clean: make -C \/lib\/modules\/$(shell uname -r)\/build M=$(PWD) clean \u7f16\u8bd1 \u5728\u7ec8\u7aef\u4e2d\u8fdb\u5165hello\u6587\u4ef6\u5939\uff0c\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4\u7f16\u8bd1\u5185\u6838\u6a21\u5757\uff1a\nmake -C \/lib\/modules\/$(uname -r)\/build M=$(pwd) modules \u7f16\u8bd1\u6210\u529f\u540e\uff0c\u4f1a\u751f\u6210\u4e00\u4e2a\u540d\u4e3ahello.ko\u7684\u5185\u6838\u6a21\u5757\u6587\u4ef6\u3002\n\u4f7f\u7528\u6a21\u5757 \u52a0\u8f7d\u5185\u6838\u6a21\u5757\uff0c\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4\uff1a\nsudo insmod hello."},{"title":"\u5982\u4f55\u4f7f\u7528gin\u4e2d\u95f4\u4ef6\u3010\u672c\u7bc7\u6587\u7ae0\u7531chatgpt\u751f\u6210\u3011","link":"https:\/\/blog.greycode.top\/posts\/how_to_use_gin_middleware\/","pubDate":"Wed, 22 Mar 2023 16:44:51 +0800","guid":"https:\/\/blog.greycode.top\/posts\/how_to_use_gin_middleware\/","description":"\u672c\u7bc7\u6587\u7ae0\u7531chatgpt\u751f\u6210\n\u4ec0\u4e48\u662f\u4e2d\u95f4\u4ef6 \u4e2d\u95f4\u4ef6\u662f\u4e00\u79cd\u5e38\u89c1\u7684Web\u5f00\u53d1\u6a21\u5f0f\uff0c\u5b83\u662f\u4e00\u79cd\u7279\u6b8a\u7684\u5904\u7406\u51fd\u6570\uff0c\u7528\u4e8e\u5728\u8bf7\u6c42\u5904\u7406\u524d\u6216\u5904\u7406\u540e\u6267\u884c\u4e00\u4e9b\u516c\u5171\u7684\u903b\u8f91\uff0c\u4f8b\u5982\u65e5\u5fd7\u8bb0\u5f55\u3001\u8ba4\u8bc1\u3001\u6743\u9650\u63a7\u5236\u7b49\u3002\u4e2d\u95f4\u4ef6\u53ef\u4ee5\u5728\u5168\u5c40\u548c\u5c40\u90e8\u8303\u56f4\u5185\u6ce8\u518c\uff0c\u4ee5\u5b9e\u73b0\u5bf9\u4e0d\u540c\u8bf7\u6c42\u7684\u4e0d\u540c\u5904\u7406\u3002\nGin\u4e2d\u95f4\u4ef6\u7684\u4f7f\u7528 Gin\u662f\u4e00\u79cd\u57fa\u4e8eGo\u8bed\u8a00\u7684\u8f7b\u91cf\u7ea7Web\u6846\u67b6\uff0c\u5b83\u652f\u6301\u4f7f\u7528\u4e2d\u95f4\u4ef6\u6765\u6269\u5c55\u6846\u67b6\u7684\u529f\u80fd\u3002\u5728Gin\u6846\u67b6\u4e2d\uff0c\u4e2d\u95f4\u4ef6\u662f\u4e00\u4e2a\u51fd\u6570\uff0c\u5b83\u63a5\u6536\u4e00\u4e2aContext\u5bf9\u8c61\u4f5c\u4e3a\u53c2\u6570\uff0c\u8be5\u5bf9\u8c61\u5305\u542b\u4e86\u8bf7\u6c42\u548c\u54cd\u5e94\u7684\u76f8\u5173\u4fe1\u606f\uff0c\u540c\u65f6\u8fd8\u5305\u62ec\u4e86\u4e00\u4e2aNext\u65b9\u6cd5\u3002\u5f53\u4e00\u4e2a\u8bf7\u6c42\u5230\u8fbe\u65f6\uff0cGin\u6846\u67b6\u4f1a\u5c06\u8fd9\u4e9b\u4e2d\u95f4\u4ef6\u51fd\u6570\u6309\u7167\u987a\u5e8f\u4e32\u8054\u8d77\u6765\uff0c\u5f62\u6210\u4e00\u4e2a\u51fd\u6570\u8c03\u7528\u94fe\u3002\u5f53\u8bf7\u6c42\u88ab\u5904\u7406\u65f6\uff0cGin\u6846\u67b6\u4f1a\u4ece\u8c03\u7528\u94fe\u7684\u7b2c\u4e00\u4e2a\u4e2d\u95f4\u4ef6\u51fd\u6570\u5f00\u59cb\u6267\u884c\uff0c\u6267\u884c\u5230\u67d0\u4e2a\u4e2d\u95f4\u4ef6\u51fd\u6570\u65f6\uff0c\u5982\u679c\u9700\u8981\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u7684\u4e2d\u95f4\u4ef6\u51fd\u6570\uff0c\u5219\u8c03\u7528Next\u65b9\u6cd5\uff0c\u5426\u5219\u76f4\u63a5\u8fd4\u56de\u54cd\u5e94\u7ed3\u679c\u3002\n\u5168\u5c40\u4e2d\u95f4\u4ef6 Gin\u6846\u67b6\u652f\u6301\u4f7f\u7528Use\u65b9\u6cd5\u5c06\u4e2d\u95f4\u4ef6\u51fd\u6570\u6ce8\u518c\u5230\u5168\u5c40\u4e2d\u95f4\u4ef6\u94fe\u4e2d\uff0c\u4f8b\u5982\uff1a\nfunc Logger() gin.HandlerFunc { return func(c *gin.Context) { t := time.Now() c.Next() latency := time.Since(t) log.Print(latency) } } func main() { r := gin.Default() r.Use(Logger()) r.GET(&#34;\/ping&#34;, func(c *gin.Context) { c.JSON(200, gin.H{ &#34;message&#34;: &#34;pong&#34;, }) }) r.Run() } \u4e0a\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u5b9a\u4e49\u4e86\u4e00\u4e2a\u540d\u4e3aLogger\u7684\u4e2d\u95f4\u4ef6\u51fd\u6570\uff0c\u5b83\u7528\u4e8e\u8bb0\u5f55\u6bcf\u4e2a\u8bf7\u6c42\u7684\u54cd\u5e94\u65f6\u95f4\u3002\u7136\u540e\u6211\u4eec\u4f7f\u7528Use\u65b9\u6cd5\u5c06\u8be5\u4e2d\u95f4\u4ef6\u51fd\u6570\u6ce8\u518c\u5230\u5168\u5c40\u4e2d\u95f4\u4ef6\u94fe\u4e2d\u3002\u6700\u540e\u6211\u4eec\u5b9a\u4e49\u4e86\u4e00\u4e2a\u7b80\u5355\u7684\u8def\u7531\u5904\u7406\u51fd\u6570\uff0c\u7528\u4e8e\u8fd4\u56de\u4e00\u4e2aJSON\u683c\u5f0f\u7684\u54cd\u5e94\u3002\u5f53\u6211\u4eec\u8bbf\u95ee\u8def\u7531\/ping\u65f6\uff0cGin\u6846\u67b6\u4f1a\u81ea\u52a8\u8c03\u7528\u4e2d\u95f4\u4ef6\u51fd\u6570Logger\uff0c\u8bb0\u5f55\u8bf7\u6c42\u54cd\u5e94\u65f6\u95f4\u3002\n\u5c40\u90e8\u4e2d\u95f4\u4ef6 Gin\u6846\u67b6\u8fd8\u652f\u6301\u4f7f\u7528Group\u65b9\u6cd5\u5c06\u4e2d\u95f4\u4ef6\u51fd\u6570\u6ce8\u518c\u5230\u7279\u5b9a\u7684\u8def\u7531\u7ec4\u4e2d\uff0c\u4f8b\u5982\uff1a\nfunc Auth() gin.HandlerFunc { return func(c *gin.Context) { token := c.GetHeader(&#34;Authorization&#34;) if token == &#34;&#34; { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{&#34;error&#34;: &#34;authorization required&#34;}) return } \/\/ TODO: validate token c."},{"title":"LuaJIT Introduction","link":"https:\/\/blog.greycode.top\/posts\/luajit-introduction\/","pubDate":"Mon, 02 Jan 2023 14:55:38 +0800","guid":"https:\/\/blog.greycode.top\/posts\/luajit-introduction\/","description":"What&rsquo;s JIT? Just-In-Time or JIT \u662f\u6307\u5728\u7a0b\u5e8f\u8fd0\u884c\u65f6\u8fdb\u884c\u4ee3\u7801\u7f16\u8bd1\u7684\u6280\u672f\uff0c\u50cf Java\uff0cPython\uff08\u8fd9\u91cc\u6307PyPy\uff09\u3001LuaJIT \u90fd\u5f15\u5165\u4e86\u8fd9\u79cd\u6280\u672f\u3002\n\u4e00\u822c JIT \u7f16\u8bd1\u5668\u4e0e\u89e3\u91ca\u5668\u4e00\u540c\u5de5\u4f5c\uff0c\u5927\u90e8\u5206\u65f6\u95f4\u4ee3\u7801\u7531\u89e3\u91ca\u5668\u8fdb\u884c\u8f6c\u6362\u6210\u673a\u5668\u7801\u8fdb\u884c\u8fd0\u884c\uff0c\u5f53\u67d0\u4e9b\u4ee3\u7801\u8fd0\u884c\u7684\u6b21\u6570\u8d85\u8fc7\u8bbe\u5b9a\u7684\u9608\u503c\u65f6\uff0c\u5c31\u4f1a\u89e6\u53d1 JIT \u7f16\u8bd1\u8fdb\u884c\u5de5\u4f5c\uff0cJIT \u7f16\u8bd1\u5668\u4f1a\u628a\u8fd9\u4e9b\u70ed\u70b9\u4ee3\u7801\u7f16\u8bd1\u4e3a\u673a\u5668\u7801\uff0c\u5f53\u4e0b\u6b21\u8fd0\u884c\u5230\u8fd9\u4e9b\u4ee3\u7801\u65f6\uff0c\u5c31\u4e0d\u7528\u89e3\u6790\u5668\u8fdb\u884c\u89e3\u91ca\u8f6c\u6362\u4e86\uff0c\u53ef\u4ee5\u76f4\u63a5\u8fd0\u884c\u673a\u5668\u7801\u6765\u63d0\u9ad8\u7a0b\u5e8f\u7684\u8fd0\u884c\u901f\u5ea6\u3002\nHow does work of LuaJIT? \u987e\u540d\u601d\u4e49\uff0cLuaJIT \u662f\u4e00\u79cd\u5373\u65f6(JIT) \u7f16\u8bd1\u5668\u3002\u8fd9\u610f\u5473\u7740\u51fd\u6570\u662f\u6309\u9700\u7f16\u8bd1\u7684\uff0c\u5373\u5f53\u5b83\u4eec\u9996\u5148\u8fd0\u884c\u65f6\u3002\u8fd9\u65e2\u786e\u4fdd\u4e86\u5e94\u7528\u7a0b\u5e8f\u7684\u5feb\u901f\u542f\u52a8\uff0c\u4e5f\u6709\u52a9\u4e8e\u907f\u514d\u65e0\u7528\u7684\u5de5\u4f5c\u3002\u4f8b\u5982\uff0c\u672a\u4f7f\u7528\u7684\u51fd\u6570\u6839\u672c\u4e0d\u4f1a\u88ab\u7f16\u8bd1\u3002\n\u53e6\u4e00\u79cd\u7f16\u8bd1\u65b9\u6cd5\u79f0\u4e3a\u63d0\u524d(AOT) \u7f16\u8bd1\u3002\u8fd9\u91cc\u6240\u6709\u7684\u4e1c\u897f\u90fd\u662f\u5728\u8fd0\u884c\u4efb\u4f55\u51fd\u6570\u4e4b\u524d\u7f16\u8bd1\u7684\u3002\u8fd9\u662f\u8bb8\u591a\u8bed\u8a00\u7684\u7ecf\u5178\u65b9\u5f0f\uff0c\u4f8b\u5982 C\u3001C++\u3001Go\u3001Rust \u7b49\u7b49\u3002\n\u5f53\u542f\u52a8 LuaJIT \u65f6\uff0c\u4e00\u5207\u90fd\u50cf\u5728\u6807\u51c6 Lua \u4e2d\u4e00\u6837\u8fdb\u884c\uff1a\u521d\u59cb\u5316 Lua \u6838\u5fc3\uff0c\u52a0\u8f7d\u6807\u51c6\u5e93\u5e76\u5206\u6790\u547d\u4ee4\u884c\u3002\u7136\u540e\u901a\u5e38\u4f1a\u52a0\u8f7d\u7b2c\u4e00\u4e2a Lua \u6e90\u4ee3\u7801\u6587\u4ef6\u5e76\u5c06\u5176\u8f6c\u6362\u4e3a Lua \u5b57\u8282\u7801\u3002\u6700\u540e\u8fd0\u884c\u521d\u59cb\u4e3b\u5757\u7684\u51fd\u6570&hellip;&hellip;\nexample.lua:\nlocal s = &#34;hello,world!&#34; for i=1,10000 do for j=1,10000 do string.find(s, &#34;ll&#34;, 1, true) end end \u4e0a\u9762\u4ee3\u7801\u4e2d\uff0c\u5b83\u4f1a\u88ab\u5148\u8f6c\u6362\u6210 LuaJIT \u81ea\u5df1\u5b9a\u4e49\u7684\u5b57\u8282\u7801\uff0c\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u547d\u4ee4\u6765\u67e5\u770b\uff1a\n$ luajit -bl example.lua -- BYTECODE -- example.lua:0-8 0001 KSTR 0 0 ; &#34;hello,world!"},{"title":"Understand Rust Ownership","link":"https:\/\/blog.greycode.top\/posts\/rust-ownership\/","pubDate":"Fri, 30 Dec 2022 14:37:51 +0800","guid":"https:\/\/blog.greycode.top\/posts\/rust-ownership\/","description":"what&rsquo;s ownership? \u5e38\u89c1\u7684\u9ad8\u7ea7\u8bed\u8a00\u90fd\u6709\u81ea\u5df1\u7684 Garbage Collection\uff08GC\uff09\u673a\u5236\u6765\u7ba1\u7406\u7a0b\u5e8f\u8fd0\u884c\u7684\u5185\u5b58\uff0c\u4f8b\u5982 Java\u3001Go \u7b49\u3002\u800c Rust \u5f15\u5165\u4e86\u4e00\u79cd\u5168\u65b0\u7684\u5185\u5b58\u7ba1\u7406\u673a\u5236\uff0c\u5c31\u662f ownership\uff08\u6240\u6709\u6743\uff09\u3002\u5b83\u5728\u7f16\u8bd1\u65f6\u5c31\u80fd\u591f\u4fdd\u8bc1\u5185\u5b58\u5b89\u5168\uff0c\u800c\u4e0d\u9700\u8981 GC \u6765\u8fdb\u884c\u8fd0\u884c\u65f6\u7684\u5185\u5b58\u56de\u6536\u3002\n\u5728 Rust \u4e2d ownership \u6709\u4ee5\u4e0b\u51e0\u4e2a\u89c4\u5219\uff1a\n\u6bcf\u4e2a\u503c\u90fd\u6709\u4e00\u4e2a woner\uff08\u6240\u6709\u8005\uff09 \u5728\u540c\u4e00\u65f6\u95f4\uff0c\u6bcf\u4e2a\u503c\u53ea\u80fd\u6709\u4e00\u4e2a owner \u5f53 owner \u79bb\u5f00\u4f5c\u7528\u57df\uff0c\u8fd9\u4e2a\u503c\u5c31\u4f1a\u88ab\u4e22\u5f03 Scope (\u4f5c\u7528\u57df) \u901a\u8fc7\u4f5c\u7528\u57df\u6765\u5212\u5206 owner \u7684\u751f\u547d\u5468\u671f\uff0c\u4f5c\u7528\u57df\u662f\u4e00\u6bb5\u4ee3\u7801\u7684\u8303\u56f4\uff0c\u4f8b\u5982\u51fd\u6570\u4f53\u3001\u4ee3\u7801\u5757\u3001if \u8bed\u53e5\u7b49\u3002\u5f53 owner \u79bb\u5f00\u4f5c\u7528\u57df\uff0c\u8fd9\u4e2a\u503c\u5c31\u4f1a\u88ab\u4e22\u5f03\u3002\nexample:\nfn main() { let s = String::from(&#34;hello&#34;); \/\/ \u53d8\u91cf s \u8fdb\u5165\u4f5c\u7528\u57df\uff0c\u5206\u914d\u5185\u5b58 \/\/ s \u5728\u8fd9\u91cc\u53ef\u7528 } \/\/ \u51fd\u6570\u4f53\u7ed3\u675f\uff0c\u53d8\u91cf s \u79bb\u5f00\u4f5c\u7528\u57df\uff0cs \u88ab\u4e22\u5f03\uff0c\u5185\u5b58\u88ab\u56de\u6536 ownership transfer\uff08\u6240\u6709\u6743\u8f6c\u79fb\uff09 \u548c\u5927\u591a\u6570\u8bed\u8a00\u4e00\u6837\uff0cRust \u5728\u6808\u4e0a\u5206\u914d\u57fa\u672c\u7c7b\u578b\u7684\u503c\uff0c\u4f8b\u5982\u6574\u578b\u3001\u6d6e\u70b9\u578b\u3001\u5e03\u5c14\u578b\u7b49\u3002\u800c\u5728\u5806\u4e0a\u5206\u914d\u590d\u6742\u7c7b\u578b\u7684\u503c\uff0c\u4f8b\u5982 String\u3001Vec \u7b49\u3002\u6240\u4ee5\uff0c\u8fd9\u91cc\u5c31\u5f15\u5165\u4e86\u4e24\u4e2a\u6982\u5ff5\uff0cmove \u548c clone\u3002\nmove move \u64cd\u4f5c\u4f1a\u5c06\u53d8\u91cf\u7684\u6240\u6709\u6743\u8f6c\u79fb\u7ed9\u53e6\u4e00\u4e2a\u53d8\u91cf\uff0c\u8fd9\u6837\u539f\u6765\u7684\u53d8\u91cf\u5c31\u4e0d\u80fd\u518d\u4f7f\u7528\u4e86\u3002\u8fd9\u91cc\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cmove \u64cd\u4f5c\u53ea\u4f1a\u53d1\u751f\u5728\u6808\u4e0a\u7684\u503c\uff0c\u56e0\u4e3a\u5728\u5806\u4e0a\u7684\u503c\u662f\u4e0d\u53ef\u590d\u5236\u7684\uff0c\u6240\u4ee5\u53ea\u80fd\u901a\u8fc7 clone \u64cd\u4f5c\u6765\u590d\u5236\u3002\nexample:\nfn main(){ let s1 = String::from(&#34;hello&#34;); let s2 = s1; print!"},{"title":"\u7a0b\u5e8f\u6267\u884c\u8fc7\u7a0b\u7b80\u8ff0","link":"https:\/\/blog.greycode.top\/posts\/program-exec-process\/","pubDate":"Wed, 28 Dec 2022 14:37:51 +0800","guid":"https:\/\/blog.greycode.top\/posts\/program-exec-process\/","description":"\u4ee3\u7801\u7f16\u8bd1\u8fc7\u7a0b #include &lt;stdio.h&gt; int main(){ printf(&#34;hello world\\n&#34;); return 0; } \u4e00\u4e2a C \u8bed\u8a00\u7684\u7a0b\u5e8f\uff0c\u4ece\u4ee3\u7801\u5230\u4e00\u4e2a\u53ef\u6267\u884c\u6587\u4ef6\uff0c\u5176\u4e2d\u8981\u7ecf\u5386 4 \u4e2a\u9636\u6bb5\u7a0b\u5e8f\n\u9884\u5904\u7406 \u7f16\u8bd1\u5668 \u6c47\u7f16\u5668 \u94fe\u63a5\u5668 \u8fd9\u56db\u4e2a\u9636\u6bb5\u4e00\u8d77\u6784\u6210\u4e86\u7f16\u8bd1\u7cfb\u7edf \u9884\u5904\u7406\u9636\u6bb5\uff1a\u76f4\u63a5\u4fee\u6539\u539f\u59cb\u7a0b\u5e8f\uff0c\u8fdb\u884c\u4e00\u4e9b\u6587\u672c\u66ff\u6362\u65b9\u9762\u7684\u64cd\u4f5c\uff0c\u4f8b\u5982\u5b8f\u5c55\u5f00\u3001\u6587\u4ef6\u5305\u542b\u3001\u5220\u9664\u90e8\u5206\u4ee3\u7801\u7b49\u3002 \u53ef\u4ee5\u7528\u4e0b\u9762\u8fd9\u4e2a\u547d\u4ee4\u6765\u4f7f\u7528 gcc \u7f16\u8bd1\u5668\u6765\u751f\u6210\u9884\u5904\u7406\u7684\u6587\u4ef6 main.i , \u7136\u540e\u53ef\u4ee5\u76f4\u63a5\u7528\u4f60\u7684 vscode \u6216\u6587\u672c\u7f16\u8f91\u5668\u6765\u6253\u5f00\u67e5\u770b\u5b83\n$ gcc -E main.c -o main.i \u7f16\u8bd1\u9636\u6bb5\uff1a\u5c06\u6e90\u4ee3\u7801\u6587\u4ef6\u7f16\u8bd1\u6210\u6c47\u7f16\u8bed\u8a00 \u53ef\u4ee5\u901a\u8fc7\u6267\u884c\u4e0b\u9762\u8fd9\u4e2a\u547d\u4ee4\u6765\u7f16\u8bd1\u9884\u5904\u7406\u9636\u6bb5\u751f\u6210\u7684 main.i \u6587\u4ef6\u6765\u751f\u6210\u6c47\u7f16\u4ee3\u7801\u6587\u4ef6 main.s\n$ gcc -S main.i -o main.s .file &#34;main.c&#34; .text .section .rodata .LC0: .string &#34;hello world&#34; .text .globl main .type main, @function main: .LFB0: .cfi_startproc endbr64 pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp ."},{"title":"\u8ba1\u7b97\u673a\u7ec4\u6210\u7b80\u8ff0","link":"https:\/\/blog.greycode.top\/posts\/computer-system-introduction\/","pubDate":"Wed, 28 Dec 2022 14:37:51 +0800","guid":"https:\/\/blog.greycode.top\/posts\/computer-system-introduction\/","description":"\u7cfb\u7edf\u786c\u4ef6\u7ec4\u6210 \u8ba1\u7b97\u673a\u4e3b\u8981\u7531 4 \u4e2a\u90e8\u5206\u7ec4\u6210\n\u603b\u7ebf\uff1a\u8d2f\u7a7f\u6574\u4e2a\u7cfb\u7edf\u7684\u662f\u4e00\u7ec4\u7535\u5b50\u7ba1\u9053\uff0c\u79f0\u4f5c\u603b\u7ebf\uff0c\u5b83\u643a\u5e26\u4fe1\u606f\u5b57\u8282\u5e76\u8d1f\u8d23\u5728\u5404\u4e2a\u90e8\u4ef6\u95f4\u4f20\u9012\u3002\u901a\u5e38\u603b\u7ebf\u88ab\u8bbe\u8ba1\u6210\u4f20\u9001\u5b9a\u957f\u7684\u5b57\u8282\u5757 \uff0c\u4e5f\u5c31\u662f\u5b57\uff08word)\u3002\u5b57\u4e2d\u7684\u5b57\u8282\u6570\uff08\u5373\u5b57\u957f\uff09\u662f\u4e00\u4e2a\u57fa\u672c\u7684\u7cfb\u7edf\u53c2\u6570 \uff0c\u5404\u4e2a\u7cfb\u7edf\u4e2d\u90fd\u4e0d\u5c3d\u76f8\u540c\u3002\u73b0\u5728\u7684\u5927\u591a\u6570\u673a\u5668\u5b57\u957f\u8981\u4e48\u662f 4 \u4e2a\u5b57\u8282\uff0832\u4f4d\uff09\uff0c \u8981\u4e48\u662f 8 \u4e2a\u5b57\u8282\uff0864\u4f4d\uff09\u3002 I\/O \u8bbe\u5907\uff1a(Input\/Output)\u8f93\u5165\u8f93\u51fa\u8bbe\u5907\uff0c\u5305\u62ec\u952e\u76d8\u3001\u663e\u793a\u5668\u3001\u78c1\u76d8\u3001\u7b49\u3002 \u4e3b\u5b58\uff1a\u4e3b\u5b58\u662f\u8ba1\u7b97\u673a\u4e2d\u7684\u4e34\u65f6\u5b58\u50a8\u5668\uff0c\u7528\u6765\u5b58\u653e\u6b63\u5728\u8fd0\u884c\u7684\u7a0b\u5e8f\u548c\u6570\u636e\uff0c\u65ad\u7535\u6570\u636e\u5c31\u4f1a\u4e22\u5931\u3002\u5b83\u7684\u5bb9\u91cf\u6bd4\u8f83\u5c0f\uff0c\u901f\u5ea6\u6bd4\u8f83\u5feb\uff0c\u4f46\u662f\u6bd4\u8f83\u6602\u8d35\u3002\u4e3b\u5b58\u662f\u7531\u4e00\u7ec4\u52a8\u6001\u968f\u673a\u5b58\u53d6\u5b58\u50a8\u5668\uff08DRAM\uff09\u82af\u7247\u7ec4\u6210\u7684\u3002 CPU\uff1a\u5904\u7406\u5668\uff0c\u662f\u8ba1\u7b97\u673a\u7684\u6838\u5fc3\uff0c\u5b83\u8d1f\u8d23\u6267\u884c\u7a0b\u5e8f\u4e2d\u7684\u6307\u4ee4\uff0c\u63a7\u5236\u5176\u4ed6\u90e8\u4ef6\u7684\u5de5\u4f5c\u3002\u5b83\u7684\u4e3b\u8981\u7ec4\u6210\u90e8\u5206\u6709\u7b97\u672f\u903b\u8f91\u5355\u5143\uff08ALU\uff09\u3001\u63a7\u5236\u5355\u5143\uff08CU\uff09\u3001\u5bc4\u5b58\u5668\u548c\u603b\u7ebf\u3002 \u5176\u4e2d\uff0cCPU \u4e3b\u8981\u505a\u4ee5\u4e0b\u51e0\u4e2a\u64cd\u4f5c\uff1a\n\u52a0\u8f7d\uff1a\u5c06\u6570\u636e\u4ece\u4e3b\u5b58\u590d\u5236\u5230 CPU \u7684\u5bc4\u5b58\u5668\u4e2d \u5b58\u50a8\uff1a\u5c06\u6570\u636e\u4ece CPU \u7684\u5bc4\u5b58\u5668\u590d\u5236\u5230\u4e3b\u5b58\u4e2d \u7b97\u672f\u8fd0\u7b97\uff1a\u628a\u4e24\u4e2a\u5bc4\u5b58\u5668\u7684\u5185\u5bb9\u590d\u5236\u5230 ALU \u4e2d\uff0cALU \u5bf9\u6570\u636e\u8fdb\u884c\u7b97\u672f\u8fd0\u7b97\uff0c\u7136\u540e\u5c06\u7ed3\u679c\u5b58\u50a8\u5230\u5bc4\u5b58\u5668\u4e2d \u8df3\u8f6c\uff1a\u4ece\u6307\u4ee4\u4e2d\u53d6\u51fa\u4e00\u4e2a\u5730\u5740\uff0c\u7136\u540e\u628a\u8fd9\u4e2a\u5730\u5740\u590d\u5236\u5230 PC \u4e2d\uff0c\u4ece\u800c\u6539\u53d8\u7a0b\u5e8f\u7684\u6267\u884c\u987a\u5e8f \u9ad8\u901f\u7f13\u5b58 \u7531\u4e8e CPU \u4ece\u5bc4\u5b58\u5668\u4e2d\u8bfb\u53d6\u6570\u636e\u7684\u901f\u5ea6\u662f\u4ece\u4e3b\u5b58\u4e2d\u8bfb\u53d6\u6570\u636e\u901f\u5ea6\u51e0\u767e\u500d\u3002\u6240\u4ee5\u4e3b\u5b58\u6210\u4e86\u62d6\u6162 CPU \u901f\u5ea6\u7684\u4e3b\u8981\u539f\u56e0\uff0c\u4e3a\u4e86\u63d0\u9ad8 CPU \u7684\u901f\u5ea6\uff0c\u5f15\u5165\u4e86\u9ad8\u901f\u7f13\u5b58\uff08Cache\uff09\u7684\u6982\u5ff5\u3002\n\u9ad8\u901f\u7f13\u5b58\uff08Cache\uff09\u662f\u4e00\u79cd\u5b58\u50a8\u5668\uff0c\u5b83\u4f4d\u4e8e\u4e3b\u5b58\u548c CPU \u4e4b\u95f4\uff0c\u7528\u6765\u5b58\u653e\u6700\u8fd1\u4f7f\u7528\u7684\u6570\u636e\u548c\u6307\u4ee4\u3002\u9ad8\u901f\u7f13\u5b58\u7684\u5bb9\u91cf\u6bd4\u4e3b\u5b58\u5c0f\uff0c\u4f46\u662f\u901f\u5ea6\u6bd4\u4e3b\u5b58\u5feb\uff0c\u6240\u4ee5 CPU \u53ef\u4ee5\u4ece\u9ad8\u901f\u7f13\u5b58\u4e2d\u8bfb\u53d6\u6570\u636e\u548c\u6307\u4ee4\uff0c\u800c\u4e0d\u5fc5\u6bcf\u6b21\u90fd\u5230\u4e3b\u5b58\u4e2d\u8bfb\u53d6\u3002\u9ad8\u901f\u7f13\u5b58\u7684\u5bb9\u91cf\u548c\u901f\u5ea6\u90fd\u6bd4\u8f83\u6602\u8d35\uff0c\u6240\u4ee5\u4e00\u822c\u53ea\u6709\u5c11\u91cf\u7684\u9ad8\u901f\u7f13\u5b58\u3002\n\u73b0\u5728\u4e00\u822c\u6bd4\u8f83\u65b0\u7684\u5904\u7406\u5668\u6709\u6709\u4e09\u7ea7\u9ad8\u901f\u7f13\u5b58\uff1aL1\u3001L2\u3001L3\uff0c\u5b83\u4eec\u662f\u7528\u4e00\u79cd\u53eb\u505a\u9759\u6001\u968f\u673a\u8bbf\u95ee\u5b58\u50a8\u5668\uff08SRAM\uff09\u7684\u786c\u4ef6\u6280\u672f\u5b9e\u73b0\u7684\u3002\nCPU \u8bbf\u95ee L1 \u7684\u901f\u5ea6\u548c\u8bbf\u95ee\u5bc4\u5b58\u5668\u4e00\u6837\u5feb\uff0c\u540e\u9762\u7684 L2\u3001L3 \u7f13\u5b58\u7531\u4e8e\u79bb CPU \u66f4\u8fdc\uff0c\u6240\u4ee5\u901f\u5ea6\u4f1a\u6162\u4e00\u4e9b\u3002\n\u5b58\u50a8\u8bbe\u5907\u5c42\u6b21\u7ed3\u6784 \u6bcf\u4e2a\u8ba1\u7b97\u673a\u7cfb\u7edf\u4e2d\u7684\u5b58\u50a8\u8bbe\u5907\u90fd\u88ab\u7ec4\u7ec7\u6210\u4e86\u4e00\u4e2a\u5b58\u50a8\u5668\u5c42\u6b21\u7ed3\u6784\u3002\u5728\u8fd9\u4e2a\u5c42\u6b21\u7ed3\u6784\u4e2d\uff0c\u4ece\u4e0a\u81f3\u4e0b\uff0c\u8bbe\u5907\u7684\u8bbf\u95ee\u901f\u5ea6\u8d8a\u6765\u8d8a\u6162\u3001\u5bb9\u91cf\u8d8a\u6765\u8d8a\u5927\uff0c\u5e76\u4e14\u6bcf\u5b57\u8282\u7684\u9020\u4ef7\u4e5f\u8d8a\u6765\u8d8a\u4fbf\u5b9c\u3002\u5bc4\u5b58\u5668\u6587\u4ef6\u5728\u5c42\u6b21\u7ed3\u6784\u4e2d\u4f4d\u4e8e\u6700\u9876\u90e8 \uff0c\u4e5f\u5c31\u662f\u7b2c 0 \u7ea7\u6216\u8bb0\u4e3a L0\u3002\u8fd9\u91cc\u6211\u4eec\u5c55\u793a\u7684\u662f\u4e09\u5c42\u9ad8\u901f\u7f13\u5b58 L1 \u5230 L3,\u5360\u636e\u5b58\u50a8\u5668\u5c42\u6b21\u7ed3\u6784\u7684\u7b2c 1 \u5c42\u5230\u7b2c 3 \u5c42\u3002\u4e3b\u5b58\u5728\u7b2c 4 \u5c42\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\n\u591a\u6838 CPU \u591a\u6838 CPU \u662f\u6307\u4e00\u4e2a CPU \u5305\u542b\u591a\u4e2a\u6838\u5fc3\uff0c\u6bcf\u4e2a\u6838\u5fc3\u90fd\u6709\u81ea\u5df1\u7684\u5bc4\u5b58\u5668\u6587\u4ef6\u548c\u9ad8\u901f\u7f13\u5b58\u3002\u591a\u6838 CPU \u7684\u4e3b\u8981\u4f18\u70b9\u662f\u53ef\u4ee5\u540c\u65f6\u6267\u884c\u591a\u4e2a\u7a0b\u5e8f\uff0c\u4ece\u800c\u63d0\u9ad8 CPU \u7684\u5229\u7528\u7387\u3002"},{"title":"\u9ad8\u6027\u80fd\u7f51\u5173\u57fa\u77f3\u2014\u2014OpenResty","link":"https:\/\/blog.greycode.top\/posts\/openresty-instruction\/","pubDate":"Tue, 27 Dec 2022 15:08:48 +0800","guid":"https:\/\/blog.greycode.top\/posts\/openresty-instruction\/","description":"\u4ec0\u4e48\u662f OpenResty OpenResty \u4e00\u4e2a\u57fa\u4e8e Nginx \u7684\u9ad8\u6027\u80fd Web \u5e73\u53f0\uff0c\u80fd\u591f\u65b9\u4fbf\u5730\u642d\u5efa\u5904\u7406\u8d85\u9ad8\u5e76\u53d1\u7684\u52a8\u6001 Web \u5e94\u7528\u3001 Web \u670d\u52a1\u548c\u52a8\u6001\u7f51\u5173\u3002\u4f8b\u5982\u6709\u540d\u7684 Kong \u7f51\u5173\u548c\u56fd\u4ea7\u65b0\u79c0 ApiSIX \u7f51\u5173\u90fd\u662f\u57fa\u4e8e OpenResty \u6765\u8fdb\u884c\u6253\u9020\u7684\u3002\nOpenResty \u901a\u8fc7\u5b9e\u73b0 ngx_lua \u548c stream_lua \u7b49 Nginx \u6a21\u5757\uff0c\u628a Lua\/LuaJIT \u5b8c\u7f8e\u5730\u6574\u5408\u8fdb\u4e86 Nginx\uff0c\u4ece\u800c\u8ba9\u6211\u4eec\u80fd\u591f\u5728 Nginx \u5185\u90e8\u91cc\u5d4c\u5165 Lua \u811a\u672c\uff0c\u7528 Lua \u8bed\u8a00\u6765\u5b9e\u73b0\u590d\u6742\u7684 HTTP\/TCP\/UDP \u4e1a\u52a1\u903b\u8f91\uff0c\u540c\u65f6\u4f9d\u7136\u4fdd\u6301\u7740\u9ad8\u5ea6\u7684\u5e76\u53d1\u670d\u52a1\u80fd\u529b\u3002\n\u5904\u7406\u9636\u6bb5 \u4e00\u4e2a\u6b63\u5e38\u7684 Web \u670d\u52a1\u7684\u751f\u547d\u5468\u671f\u53ef\u4ee5\u5206\u6210\u4e09\u4e2a\u9636\u6bb5\uff1a\niniting\uff1a\u670d\u52a1\u542f\u52a8\uff0c\u8bfb\u53d6\u914d\u7f6e\u6587\u4ef6\uff0c\u521d\u59cb\u5316\u5185\u90e8\u6570\u636e\u7ed3\u6784 running\uff1a\u670d\u52a1\u8fd0\u884c\uff0c\u63a5\u53d7\u5ba2\u6237\u7aef\u7684\u8bf7\u6c42\uff0c\u8fd4\u56de\u54cd\u5e94\u7ed3\u679c exiting\uff1a\u670d\u52a1\u505c\u6b62\uff0c\u505a\u4e00\u4e9b\u5fc5\u8981\u7684\u6e05\u7406\u5de5\u4f5c\uff0c\u5982\u5173\u95ed\u76d1\u542c\u7aef\u53e3 OpenResty \u4e3b\u8981\u5173\u6ce8\u7684\u662f initing \u548c running \u8fd9\u4e24\u4e2a\u9636\u6bb5\uff0c\u5e76\u505a\u4e86\u66f4\u7ec6\u81f4\u7684\u5212\u5206\nOpenResty \u7684 initing \u9636\u6bb5 configuration\uff1a\u8bfb\u53d6\u914d\u7f6e\u6587\u4ef6\uff0c\u89e3\u6790\u914d\u7f6e\u6307\u4ee4\uff0c\u8bbe\u7f6e\u8fd0\u884c\u53c2\u6570 master-initing\uff1a\u914d\u7f6e\u6587\u4ef6\u89e3\u6790\u5b8c\u6bd5\uff0cmaster \u8fdb\u7a0b\u521d\u59cb\u5316\u516c\u7528\u7684\u6570\u636e worker-initing\uff1aworker \u8fdb\u7a0b\u521d\u59cb\u5316\u81ea\u5df1\u4e13\u7528\u7684\u6570\u636e OpenResty \u7684 running \u9636\u6bb5 \u5728 running \u9636\u6bb5\uff0c\u6536\u5230\u5ba2\u6237\u7aef\u7684\u8bf7\u6c42\u540e\uff0cOpenResty \u5bf9\u6bcf\u4e2a\u8bf7\u6c42\u90fd\u4f1a\u4f7f\u7528\u4e0b\u9762\u8fd9\u6761\u6d41\u6c34\u7ebf\u8fdb\u884c\u5904\u7406\uff1a\nssl\uff1aSSL\/TLS \u5b89\u5168\u901a\u4fe1\u548c\u9a8c\u8bc1 preread\uff1a \u5728\u6b63\u5f0f\u5904\u7406\u4e4b\u524d\u9884\u8bfb\u6570\u636e\uff0c\u63a5\u6536 HTTP \u8bf7\u6c42\u5934 rewrite\uff1a\u68c0\u67e5\u3001\u6539\u5199 URI \uff0c\u5b9e\u73b0\u8df3\u8f6c\u91cd\u5b9a\u5411 access\uff1a\u8bbf\u95ee\u6743\u9650\u63a7\u5236 content\uff1a\u4ea7\u751f\u54cd\u5e94\u5185\u5bb9 filter\uff1a\u5bf9 content \u9636\u6bb5\u4ea7\u751f\u7684\u5185\u5bb9\u8fdb\u884c\u8fc7\u6ee4\u52a0\u5de5\u5904\u7406 log\uff1a \u8bf7\u6c42\u5904\u7406\u5b8c\u6bd5\uff0c\u8bb0\u5f55\u65e5\u5fd7\uff0c\u6216\u8005\u5176\u4ed6\u7684\u6536\u5c3e\u5de5\u4f5c\u3002 OpenResty \u6267\u884c\u7a0b\u5e8f OpenResty \u6839\u636e\u4e0a\u9762\u7684\u5904\u7406\u9636\u6bb5\u63d0\u4f9b\u4e86\u4e00\u4e9b\u6307\u4ee4\uff0c\u5728\u5f00\u53d1\u65f6\u4f7f\u7528\u5b83\u4eec\u5c31\u53ef\u4ee5\u5728\u8fd9\u4e9b\u9636\u6bb5\u91cc\u9762\u63d2\u5165 Lua \u4ee3\u7801\uff0c\u6267\u884c\u4e1a\u52a1\u903b\u8f91\uff1a"},{"title":"Nginx Model Instroction","link":"https:\/\/blog.greycode.top\/posts\/nginx_model_instroction\/","pubDate":"Fri, 02 Dec 2022 11:31:54 +0800","guid":"https:\/\/blog.greycode.top\/posts\/nginx_model_instroction\/","description":"Introduction Nginx adopts a unique master and multi workers process pool mechanism, which guarantees stable operation and flexible configuration of Nginx.\nUsually, Nginx will start a master process and multiple worker processes to provide external services. The master process, known as the monitoring process, did not handle specific TCP\/HTTP requests and received only the Unix signal.\nWorker processes compete equally for accepting client connections, executing the main business logic of Nginx, and Using epoll, kqueue, and other mechanisms to process TCP\/HTTP requests efficiently."},{"title":"Log of Sep 26, 2022","link":"https:\/\/blog.greycode.top\/posts\/log-of-220926\/","pubDate":"Mon, 26 Sep 2022 16:54:19 +0800","guid":"https:\/\/blog.greycode.top\/posts\/log-of-220926\/","description":"Hello, guys!\nI am a backend developer, I like to write code, and I want to write blogs.\nRecently, I have felt very depressed, and I don&rsquo;t know why I feel very depressed.\nI can&rsquo;t study, write a blog, or do anything because I can&rsquo;t come down my heart."},{"title":"\u7528 manim \u5199\u4e00\u4e2a\u6392\u5e8f\u7b97\u6cd5\u52a8\u753b","link":"https:\/\/blog.greycode.top\/posts\/76cbbd57-2cb7-4934-ba99-a7773ec05759\/","pubDate":"Thu, 11 Aug 2022 10:35:24 +0800","guid":"https:\/\/blog.greycode.top\/posts\/76cbbd57-2cb7-4934-ba99-a7773ec05759\/","description":"\u672c\u6587\u4e0d\u4ecb\u7ecd manim \u7684\u5b89\u88c5\u6559\u7a0b\uff0c\u9700\u8981\u5b89\u88c5\u6559\u7a0b\u7684\u8bf7\u53c2\u8003\uff1ahttps:\/\/docs.manim.org.cn\/getting_started\/installation.html\n\u4ec0\u4e48\u662f manim Manim \u662f\u4e00\u4e2a\u7528\u4e8e\u7cbe\u786e\u7f16\u7a0b\u52a8\u753b\u7684\u5f15\u64ce\uff0c\u4e13\u4e3a\u521b\u5efa\u89e3\u91ca\u6027\u6570\u5b66\u89c6\u9891\u800c\u8bbe\u8ba1\u3002\n\u6ce8\u610f\uff0c\u6709\u4e24\u4e2a\u4e3b\u8981\u7248\u672c\u7684 manim\u3002\u8be5\u5b58\u50a8\u5e93\u6700\u521d\u662f 3Blue1Brown \u7684\u4f5c\u8005\u7684\u4e2a\u4eba\u9879\u76ee\uff0c\u76ee\u7684\u662f\u4e3a\u8fd9\u4e9b\u89c6\u9891\u5236\u4f5c\u52a8\u753b\uff0c\u6b64\u5904\u63d0\u4f9b\u4e86\u89c6\u9891\u4e13\u7528\u4ee3\u7801\u30022020 \u5e74\uff0c\u4e00\u7fa4\u5f00\u53d1\u4eba\u5458\u5c06\u5176\u5206\u53c9\u6210\u73b0\u5728\u7684\u793e\u533a\u7248\uff0c\u76ee\u6807\u662f\u66f4\u7a33\u5b9a\u3001\u66f4\u597d\u5730\u6d4b\u8bd5\u3001\u66f4\u5feb\u5730\u54cd\u5e94\u793e\u533a\u8d21\u732e\uff0c\u4ee5\u53ca\u66f4\u53cb\u597d\u5730\u5f00\u59cb\u4f7f\u7528\u3002\n\u4e3b\u8981\u7248\u672c\u5982\u4e0b\uff1a\n3b1b\/manim \u3010\u6700\u65b0\u7248\u3011 cairo-backend\u3010\u65e7\u7248\u3011 ManimCommunity\/manim \u3010\u793e\u533a\u7248\u3011 \u5192\u6ce1\u6392\u5e8f\u4ecb\u7ecd \u672c\u6587\u5c31\u4f7f\u7528 manim \u6765\u5b9e\u73b0\u4e00\u4e2a\u5192\u6ce1\u6392\u5e8f\u7684\u52a8\u753b\uff0c\u9996\u5148\u6765\u4e86\u89e3\u4e0b\u4ec0\u4e48\u662f\u5192\u6ce1\u6392\u5e8f\n\u5192\u6ce1\u6392\u5e8f\uff08Bubble Sort\uff09\u4e5f\u662f\u4e00\u79cd\u7b80\u5355\u76f4\u89c2\u7684\u6392\u5e8f\u7b97\u6cd5\u3002\u5b83\u91cd\u590d\u5730\u8d70\u8bbf\u8fc7\u8981\u6392\u5e8f\u7684\u6570\u5217\uff0c\u4e00\u6b21\u6bd4\u8f83\u4e24\u4e2a\u5143\u7d20\uff0c\u5982\u679c\u4ed6\u4eec\u7684\u987a\u5e8f\u9519\u8bef\u5c31\u628a\u4ed6\u4eec\u4ea4\u6362\u8fc7\u6765\u3002\u8d70\u8bbf\u6570\u5217\u7684\u5de5\u4f5c\u662f\u91cd\u590d\u5730\u8fdb\u884c\u76f4\u5230\u6ca1\u6709\u518d\u9700\u8981\u4ea4\u6362\uff0c\u4e5f\u5c31\u662f\u8bf4\u8be5\u6570\u5217\u5df2\u7ecf\u6392\u5e8f\u5b8c\u6210\u3002\u8fd9\u4e2a\u7b97\u6cd5\u7684\u540d\u5b57\u7531\u6765\u662f\u56e0\u4e3a\u8d8a\u5c0f\u7684\u5143\u7d20\u4f1a\u7ecf\u7531\u4ea4\u6362\u6162\u6162&quot;\u6d6e&quot;\u5230\u6570\u5217\u7684\u9876\u7aef\u3002\n\u7b97\u6cd5\u6b65\u9aa4 \u6bd4\u8f83\u76f8\u90bb\u7684\u5143\u7d20\u3002\u5982\u679c\u7b2c\u4e00\u4e2a\u6bd4\u7b2c\u4e8c\u4e2a\u5927\uff0c\u5c31\u4ea4\u6362\u4ed6\u4eec\u4e24\u4e2a\u3002\n\u5bf9\u6bcf\u4e00\u5bf9\u76f8\u90bb\u5143\u7d20\u4f5c\u540c\u6837\u7684\u5de5\u4f5c\uff0c\u4ece\u5f00\u59cb\u7b2c\u4e00\u5bf9\u5230\u7ed3\u5c3e\u7684\u6700\u540e\u4e00\u5bf9\u3002\u8fd9\u6b65\u505a\u5b8c\u540e\uff0c\u6700\u540e\u7684\u5143\u7d20\u4f1a\u662f\u6700\u5927\u7684\u6570\u3002\n\u9488\u5bf9\u6240\u6709\u7684\u5143\u7d20\u91cd\u590d\u4ee5\u4e0a\u7684\u6b65\u9aa4\uff0c\u9664\u4e86\u6700\u540e\u4e00\u4e2a\u3002\n\u6301\u7eed\u6bcf\u6b21\u5bf9\u8d8a\u6765\u8d8a\u5c11\u7684\u5143\u7d20\u91cd\u590d\u4e0a\u9762\u7684\u6b65\u9aa4\uff0c\u76f4\u5230\u6ca1\u6709\u4efb\u4f55\u4e00\u5bf9\u6570\u5b57\u9700\u8981\u6bd4\u8f83\u3002\n\u521d\u59cb\u5316\u5143\u7d20 \u6bd4\u5982\u6211\u4eec\u9700\u8981\u6392\u5e8f\u6570\u7ec4\u4e3a: [4,2,3,1,5]\n\u9996\u5148\uff0c\u9700\u8981\u5728 manim \u573a\u666f\u4e0a\u521d\u59cb\u5316\u6211\u4eec\u7684\u9700\u8981\u6392\u5e8f\u7684\u6240\u6709\u5143\u7d20,\u8fd9\u91cc\u7528\u77e9\u5f62\u6765\u8868\u793a\u3002\n\u5728 manim \u4e2d\uff0c\u53ef\u4ee5\u7528 Rectangle \u6765\u521d\u59cb\u5316\u77e9\u5f62\uff0c\u7136\u540e\u6211\u4eec\u901a\u8fc7\u8bbe\u7f6e\u5143\u7d20\u4e0d\u540c\u7684\u9ad8\u5ea6\u6765\u8868\u793a\u4e0d\u540c\u7684\u5143\u7d20\u5927\u5c0f\u3002\nmain.py from manimlib import * class Test(Scene): def construct(self): COLOR = [BLUE, GREEN, RED, PINK, ORANGE, MAROON_B, TEAL, PURPLE_B, GREY_BROWN] arr = [4,2,3,1,5] g = VGroup() for i in range(len(arr)): r1=Rectangle(width=1,height=arr[i],fill_color=COLOR[i%len(COLOR)],fill_opacity=1) t1=Text(str(arr[i]))."},{"title":"\u89e3\u5bc6\u5b89\u5353\u5fae\u4fe1\u804a\u5929\u4fe1\u606f\u5b58\u50a8","link":"https:\/\/blog.greycode.top\/posts\/android-wechat-bak\/","pubDate":"Mon, 20 Jun 2022 14:19:48 +0800","guid":"https:\/\/blog.greycode.top\/posts\/android-wechat-bak\/","description":"\u51c6\u5907\u5de5\u4f5c \uff08\u5f53\u524d\u5fae\u4fe1\u7248\u672c\u662f\uff1a8.0.18\uff09\n\u4e00\u53f0 Root \u7684\u624b\u673a\uff08\u624b\u673a\u4e0d\u80fd Root \u7684\u8bdd\u7528\u5b89\u5353\u6a21\u62df\u5668\uff0c\u7136\u540e\u5b89\u5353\u6a21\u62df\u5668\u83b7\u53d6 Root \u5e94\u8be5\u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u4e0d\u8fc7\u6211\u6ca1\u8bd5\u8fc7\uff09 DB Browser for SQLite SQLCipher silk-v3-decoder \u6536\u96c6\u6570\u636e \u9700\u8981\u6536\u96c6\u7684\u6570\u636e\u6709\uff1a\nimage2 \u6587\u4ef6\u5939\uff1a\u91cc\u9762\u5b58\u653e\u7740\u6240\u6709\u7684\u5fae\u4fe1\u804a\u5929\u56fe\u7247\uff0c\u4f4d\u7f6e\u5728\uff1a\/data\/data\/com.tencent.mm\/MicroMsg\/[32\u4f4d\u5b57\u6bcd]\/image2 voice2 \u6587\u4ef6\u5939\uff1a\u91cc\u9762\u5b58\u653e\u7740\u6240\u6709\u7684\u5fae\u4fe1\u8bed\u97f3\uff0c\u4f4d\u7f6e\u5728\uff1a\/sdcard\/Android\/data\/com.tencent.mm\/MicroMsg\/[32\u4f4d\u5b57\u6bcd]\/voice2 voide \u6587\u4ef6\u5939\uff1a\u91cc\u9762\u5b58\u653e\u7740\u6240\u6709\u7684\u5fae\u4fe1\u89c6\u9891\uff0c\u4f4d\u7f6e\u5728\uff1a\/sdcard\/Android\/data\/com.tencent.mm\/MicroMsg\/[32\u4f4d\u5b57\u6bcd]\/voide avatar \u6587\u4ef6\u5939\uff1a\u91cc\u9762\u5b58\u653e\u7740\u6240\u6709\u7684\u5fae\u4fe1\u5934\u50cf\uff0c\u4f4d\u7f6e\u5728\uff1a\/data\/data\/com.tencent.mm\/MicroMsg\/[32\u4f4d\u5b57\u6bcd]\/avatar Download \u6587\u4ef6\u5939: \u5fae\u4fe1\u7684\u804a\u5929\u53d1\u9001\u7684\u6587\u4ef6\u5b58\u653e\u5728\u8fd9\u91cc\uff0c\u4f4d\u7f6e\u5728\uff1a\/sdcard\/Android\/data\/com.tencent.mm\/MicroMsg\/Download EnMicroMsg.db: \u5fae\u4fe1\u7684\u6570\u636e\u5e93\u6587\u4ef6\uff0c\u4f4d\u7f6e\u5728\uff1a\/data\/data\/com.tencent.mm\/MicroMsg\/[32\u4f4d\u5b57\u6bcd]\/EnMicroMsg.db WxFileIndex.db: \u5fae\u4fe1\u7684\u6587\u4ef6\u7d22\u5f15\u6570\u636e\u5e93\u6587\u4ef6\uff0c\u4f4d\u7f6e\u5728\uff1a\/data\/data\/com.tencent.mm\/MicroMsg\/[32\u4f4d\u5b57\u6bcd]\/WxFileIndex.db \u5728\u4e0a\u9762\u7684\u8fd9\u4e9b\u6587\u4ef6\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u7684\u662f\u8def\u5f84\u4e2d\u6709\u4e2a 32 \u4f4d\u5b57\u6bcd\u7684\u8def\u5f84\uff0c\u8fd9\u4e2a\u662f\u5fae\u4fe1\u901a\u8fc7\u67d0\u79cd\u7b97\u6cd5\u751f\u6210\u7684\uff0c\u6bcf\u4e2a\u53f7\u7684\u8def\u5f84\u90fd\u4e0d\u4e00\u6837\u3002 \u5176\u4e2d voice2\u3001voide\u3001Download \u8fd9\u4e09\u4e2a\u6587\u4ef6\u5939\u5728 \/sdcard \u76ee\u5f55\u4e0b\uff0c\u5176\u4ed6\u7684\u5728\u7cfb\u7edf\u76ee\u5f55 \/data \u4e0b\u3002 Download \u6587\u4ef6\u5939\u5b58\u653e\u7740\u5f53\u524d\u624b\u673a\u4e0a\u6240\u6709\u5fae\u4fe1\u804a\u5929\u65f6\u53d1\u9001\u7684\u6587\u4ef6\uff0c\u8fd9\u91cc\u6587\u4ef6\u4f8b\u5982\uff1a\u6587\u6863\uff0c\u5b89\u88c5\u5305\u3001\u538b\u7f29\u5305\u7b49\u3002\u9700\u8981\u901a\u8fc7 WxFileIndex.db \u6765\u7d22\u5f15\u5230\u8fd9\u4e2a\u6587\u4ef6\u5939\u3002\n\u628a\u4e0a\u9762\u6536\u96c6\u7684\u6240\u6709\u6587\u4ef6\u653e\u5728\u7535\u8111\u7684\u540c\u4e00\u4e2a\u6587\u4ef6\u5939\u4e2d\uff0c\u63a5\u4e0b\u6765\u5bf9\u8fd9\u4e9b\u6570\u636e\u8fdb\u884c\u5904\u7406\u3002\n\u83b7\u53d6 DB \u8bbf\u95ee\u5bc6\u7801 \u5728\u4e0a\u9762\u83b7\u53d6\u5230\u7684 EnMicroMsg.db\u3001WxFileIndex.db \u662f\u7ecf\u8fc7\u52a0\u5bc6\u7684\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u83b7\u5f97\u8fd9\u4e2a\u7684\u8bbf\u95ee\u5bc6\u7801\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5bc6\u7801\u6765\u89e3\u5bc6\u6570\u636e\u5e93\u3002\n\u65b9\u6cd5\u4e00 \u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7 MD5(IMEI+uin) \u53d6\u524d 7 \u4f4d\u5373\u662f\u8bbf\u95ee\u5bc6\u7801\uff0c\u5982\u679c\u662f\u5927\u5199\u7684\u8981\u8f6c\u6362\u6210\u5c0f\u5199\u5b57\u6bcd\u3002(\u6ce8\u610f\uff1a\u62fc\u63a5\u4e24\u4e2a\u6570\u636e\u65f6\u4e0d\u9700\u8981\u7528 + \u53f7) \u5176\u4e2dIMEI \u662f\u624b\u673a\u7684 IMEI \u7801\uff0c\u53ef\u4ee5\u67e5\u8be2\u624b\u673a\u7684\u8bbe\u7f6e\uff0c\u5728\u8bbe\u7f6e\u4e2d\u53ef\u4ee5\u67e5\u770b\u5230\u3002\u5982\u679c\u4f60\u624b\u673a\u5237\u8fc7\u673a\uff0c\u90a3\u4e48 IMEI \u6709\u53ef\u80fd\u662f\u7a7a\u767d\u7684\u3002\u6216\u8005\u50cf MIUI \u7cfb\u7edf\u4e00\u6837\uff0c\u5e94\u7528\u65e0\u6cd5\u771f\u6b63\u83b7\u53d6\u5230\u624b\u673a\u7684 IMEI\u3002\u8fd9\u65f6\u5c31\u53ef\u4ee5\u7528 1234567890ABCDEF \u8fd9\u4e2a\u5b57\u7b26\u4e32\u6765\u4ee3\u66ff IMEI\u3002 uin \u53ef\u4ee5\u901a\u8fc7 adb \u6765\u67e5\u770b\u5f53\u524d\u767b\u9646\u5fae\u4fe1\u7684 uin \u6570\u636e\uff1a"},{"title":"\u3010\u8bd1\u3011\u4e3a\u4ec0\u4e48 Web 3.0 \u5f88\u91cd\u8981\uff0c\u4f60\u5e94\u8be5\u77e5\u9053","link":"https:\/\/blog.greycode.top\/posts\/7f482d9706354a288702dccb66c81bf2\/","pubDate":"Sat, 16 Apr 2022 10:42:57 +0000","guid":"https:\/\/blog.greycode.top\/posts\/7f482d9706354a288702dccb66c81bf2\/","description":"\u539f\u6587\u94fe\u63a5\uff1ahttps:\/\/medium.com\/@essentia1\/why-the-web-3-0-matters-and-you-should-know-about-it-a5851d63c949\nWeb 3.0 \u53ca\u5176\u5c06\u7ed9\u884c\u4e1a\u5e26\u6765\u7684\u5de8\u5927\u53d8\u5316\u5f15\u8d77\u4e86\u5f88\u591a\u5173\u6ce8\uff0c\u4f46\u5f88\u5c11\u6709\u4eba\u771f\u6b63\u77e5\u9053\u5b83\u4e3a\u4ec0\u4e48\u4f1a\u4ea7\u751f\u4ee5\u53ca\u5b83\u4f1a\u5e26\u6765\u4ec0\u4e48\u3002\u8981\u7406\u89e3\u8fd9\u4e00\u70b9\uff0c\u6709\u5fc5\u8981\u56de\u5230\u8fc7\u53bb\u5e76\u68c0\u67e5\u5b83\u7684\u524d\u8eab\uff0cWeb 1.0 \u548c 2.0\u3002\n\u5c31\u50cf\u4e2d\u4e16\u7eaa\u4e00\u6837\uff0cWeb 1.0 \u76f4\u5230\u5c18\u57c3\u843d\u5b9a\u624d\u88ab\u547d\u540d\u3002\u4f17\u6240\u5468\u77e5\uff0c\u201c\u4e07\u7ef4\u7f51\u201d\u53ea\u662f\u4e00\u7ec4\u9759\u6001\u7f51\u7ad9\uff0c\u5305\u542b\u5927\u91cf\u4fe1\u606f\uff0c\u6ca1\u6709\u4e92\u52a8\u5185\u5bb9\u3002\u8fde\u63a5\u610f\u5473\u7740\u901a\u8fc7\u6447\u6447\u6643\u6643\u7684\u8c03\u5236\u89e3\u8c03\u5668\u62e8\u53f7\u5e76\u963b\u6b62\u623f\u5b50\u91cc\u7684\u4efb\u4f55\u4eba\u4f7f\u7528\u7535\u8bdd\u3002\u5b83\u662f AOL \u804a\u5929\u5ba4\u548c MSN Messenger\u3001AltaVista \u548c Ask Jeeves \u7684\u7f51\u7edc\u3002\u5b83\u6162\u5f97\u4ee4\u4eba\u53d1\u6307\u3002\u6d41\u5a92\u4f53\u89c6\u9891\u548c\u97f3\u4e50\uff1f\u5fd8\u4e86\u5b83\u3002\u4e0b\u8f7d\u4e00\u9996\u6b4c\u66f2\u81f3\u5c11\u9700\u8981\u4e00\u5929\u65f6\u95f4\u3002\n\u7136\u540e\u662f 2.0 \u4ee4\u4eba\u6bdb\u9aa8\u609a\u7136\u7684\u8c03\u5236\u89e3\u8c03\u5668\u548c\u65e0\u804a\u7684\u63a5\u53e3\u7684\u5185\u5b58\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u5df2\u7ecf\u6d88\u5931\u4e86\u3002\u66f4\u5feb\u7684\u4e92\u8054\u7f51\u901f\u5ea6\u4e3a\u4e92\u52a8\u5185\u5bb9\u94fa\u5e73\u4e86\u9053\u8def\uff0c\u7f51\u7edc\u4e0d\u518d\u662f\u4e3a\u4e86\u89c2\u5bdf\uff0c\u800c\u662f\u4e3a\u4e86\u53c2\u4e0e\u3002\u5168\u7403\u4fe1\u606f\u5171\u4eab\u50ac\u751f\u4e86\u201c\u793e\u4ea4\u5a92\u4f53\u201d\u65f6\u4ee3\u3002Youtube\u3001\u7ef4\u57fa\u767e\u79d1\u3001Flickr \u548c Facebook \u4e3a\u65e0\u58f0\u8005\u53d1\u58f0\uff0c\u5e76\u4e3a\u5fd7\u540c\u9053\u5408\u7684\u793e\u533a\u63d0\u4f9b\u4e86\u84ec\u52c3\u53d1\u5c55\u7684\u9014\u5f84\u3002\n\u53d1\u5e03\u8fd9\u7bc7\u535a\u6587\u5c06\u82b1\u8d39\u6211 30 \u79d2\u7684\u65f6\u95f4\uff0c\u8fd9\u4e0e\u8bbe\u8ba1\u5e08\u3001\u5f00\u53d1\u4eba\u5458\u548c\u7ba1\u7406\u5458\u5171\u540c\u52aa\u529b\u8fdb\u884c\u7b80\u5355\u7684\u7f51\u7ad9\u7f16\u8f91\u76f8\u6bd4\uff0c\u8fd9\u662f\u4e00\u4e2a\u4e0d\u53ef\u4f30\u91cf\u7684\u6539\u8fdb\u3002\u6211\u4eec\u53ef\u4ee5\u79f0\u4e4b\u4e3a\u201c\u8bfb\u5199\u53d1\u5e03\u201d\u65f6\u4ee3\u2014\u2014\u4fe1\u606f\u7684\u4f20\u64ad\u5c31\u50cf\u8fd9\u4e09\u4e2a\u8bcd\u4e00\u6837\u7b80\u5355\u3002\u90a3\u4e48\u95ee\u9898\u6765\u4e86\uff0cweb 2.0 \u5f88\u68d2\uff0c\u54ea\u91cc\u51fa\u4e86\u95ee\u9898\uff1f\n\u4fe1\u606f\u5c31\u662f\u91d1\u94b1 \u8054\u5408\u56fd\u4f30\u8ba1\uff0c\u4ece 2000 \u5e74\u5230 2015 \u5e74\uff0c\u4e92\u8054\u7f51\u7528\u6237\u4ece 7.38 \u4ebf\u589e\u52a0\u5230 32 \u4ebf\u3002\u8fd9\u662f\u4e00\u4e2a\u4e0d\u53ef\u4f30\u91cf\u7684\u6570\u636e\uff0c\u6b63\u5982\u5927\u578b\u6570\u5b57\u516c\u53f8\u6240\u610f\u8bc6\u5230\u7684\u90a3\u6837\uff0c\u4e2a\u4eba\u4fe1\u606f\u662f\u4e00\u9879\u975e\u5e38\u6709\u4ef7\u503c\u7684\u8d44\u4ea7\u3002\u4e8e\u662f\u5f00\u59cb\u5728\u96c6\u4e2d\u5f0f\u670d\u52a1\u5668\u4e2d\u5927\u91cf\u5b58\u50a8\u6570\u636e\uff0c\u4e9a\u9a6c\u900a\u3001Facebook \u548c Twitter \u662f\u6700\u5927\u7684\u6258\u7ba1\u65b9\u3002\u4eba\u4eec\u4e3a\u4e86\u8fd9\u4e9b\u670d\u52a1\u7684\u4fbf\u5229\u800c\u727a\u7272\u4e86\u5b89\u5168\u6027\uff1b\u4e0d\u7ba1\u4ed6\u4eec\u662f\u5426\u77e5\u9053\uff0c\u4ed6\u4eec\u7684\u8eab\u4efd\u3001\u6d4f\u89c8\u4e60\u60ef\u3001\u641c\u7d22\u548c\u5728\u7ebf\u8d2d\u7269\u4fe1\u606f\u90fd\u88ab\u5356\u7ed9\u51fa\u4ef7\u6700\u9ad8\u7684\u4eba\u3002\n3.0 \u9769\u547d \u5230\u4e86\u8fd9\u4e2a\u9636\u6bb5\uff0cWeb 2.0 \u7684\u5021\u5bfc\u8005\u5df2\u7ecf\u5728\u6784\u60f3\u7ee7\u4efb\u8005\u4e86\u3002\u4ed6\u4eec\u8bbe\u60f3\uff0c\u4e0b\u4e00\u4e2a\u7f51\u7edc\u5c06\u6000\u65e7\u5730\u8f6c\u5411\u7f51\u7edc 1.0 \u7684\u613f\u666f\uff1a\u66f4\u201c\u4eba\u6027\u5316\u201d\u548c\u66f4\u591a\u9690\u79c1\u3002\u4e0e\u5176\u5c06\u6743\u529b\uff08\u548c\u6570\u636e\uff09\u96c6\u4e2d\u5728\u52a8\u673a\u53ef\u7591\u7684\u5e9e\u7136\u5927\u7269\u624b\u4e2d\uff0c\u4e0d\u5982\u5f52\u8fd8\u7ed9\u5408\u6cd5\u6240\u6709\u8005\u3002\n\u4e00\u4e2a\u66f4\u516c\u5e73\u3001\u66f4\u900f\u660e\u7684\u7f51\u7edc\u7684\u613f\u666f\u53ef\u4ee5\u8ffd\u6eaf\u5230 2006 \u5e74\u5de6\u53f3\uff0c\u4f46\u5f53\u65f6\u8fd8\u6ca1\u6709\u5de5\u5177\u548c\u6280\u672f\u6765\u5b9e\u73b0\u5b83\u3002\u6bd4\u7279\u5e01\u8fd8\u6709\u4e09\u5e74\u7684\u65f6\u95f4\uff0c\u5b83\u5e26\u6765\u4e86\u5206\u5e03\u5f0f\u8d26\u672c\u6216\u533a\u5757\u94fe\u7684\u6982\u5ff5\uff0c\u7528\u4e8e\u70b9\u5bf9\u70b9\u6570\u5b57\u5b58\u50a8\u3002\u53bb\u4e2d\u5fc3\u5316\u662f\u4e00\u4e2a\u60f3\u6cd5\u3002\u533a\u5757\u94fe\u662f\u624b\u6bb5\u3002\u73b0\u5728\u6211\u4eec\u6709\u4e86\u6240\u8c13\u7684\u4ee5\u4eba\u4e3a\u672c\u7684\u4e92\u8054\u7f51\u3002\n\u652f\u6301\u9690\u79c1\u3001\u53cd\u5784\u65ad\u7684\u7f51\u7edc \u867d\u7136 Web 2.0 \u4f7f\u8bb8\u591a\u6743\u529b\u7ed3\u6784\u6c11\u4e3b\u5316\u5e76\u521b\u9020\u4e86\u65b0\u7684\u673a\u4f1a\uff0c\u4f46\u7ecf\u6d4e\u5f15\u64ce\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u662f\u79c1\u6709\u5316\u548c\u5784\u65ad\u7684\u3002Facebook\u3001Uber \u548c AirBnB \u5df2\u7ecf\u4e3a\u5b83\u4eec\u4e3b\u5bfc\u7684\u516c\u5171\u57fa\u7840\u8bbe\u65bd\u521b\u5efa\u4e86\u4e13\u7528\u7f51\u7edc\u3002Web 3.0 \u4e0e\u6b64\u76f8\u53cd\uff0c\u5b83\u662f\u5173\u4e8e\u901a\u8fc7\u5f00\u653e\u7f51\u7edc\u5171\u4eab\u4ef7\u503c\u7684\u591a\u4e2a\u5229\u6da6\u4e2d\u5fc3\u3002\n\u5f88\u5bb9\u6613\u60f3\u8c61\u5728\u4e0d\u4e45\u7684\u5c06\u6765\uff0c\u57fa\u4e8e\u52a0\u5bc6\u7684\u624b\u673a\u3001VPN\u3001\u53bb\u4e2d\u5fc3\u5316\u5b58\u50a8\u548c\u52a0\u5bc6\u8d27\u5e01\u94b1\u5305\u5c06\u5e7f\u6cdb\u666e\u53ca\u3002\u672a\u6765\u4e0d\u9700\u8981\u6682\u505c\u6216\u76d1\u89c6\u6211\u4eec\u4fe1\u606f\u7684\u7f51\u7edc\u548c\u8702\u7a9d\u63d0\u4f9b\u5546\u3002\u5982\u679c\u6211\u4eec\u8981\u907f\u514d\u68a6\u6e38\u8fdb\u5165\u9ed1\u955c\u5f0f\u7684\u9690\u79c1\u53cd\u4e4c\u6258\u90a6\uff0c\u8fd9\u4e9b\u5c31\u662f\u6211\u4eec\u9700\u8981\u7684\u5de5\u5177\u3002Web 3.0 \u63d0\u4f9b\u4e86\u8bb8\u591a\u4f18\u52bf\uff1a\n**\u6ca1\u6709\u4e2d\u5fc3\u63a7\u5236\u70b9\uff1a**\u4e2d\u95f4\u4eba\u88ab\u4ece\u7b49\u5f0f\u4e2d\u5220\u9664\uff0c\u50cf\u4ee5\u592a\u574a\u8fd9\u6837\u7684\u533a\u5757\u94fe\u63d0\u4f9b\u4e86\u4e00\u4e2a\u65e0\u9700\u4fe1\u4efb\u7684\u5e73\u53f0\uff0c\u5176\u4e2d\u7684\u89c4\u5219\u662f\u7262\u4e0d\u53ef\u7834\u7684\uff0c\u6570\u636e\u662f\u5b8c\u5168\u52a0\u5bc6\u7684\u3002Alphabet \u548c Apple \u5c06\u4e0d\u518d\u63a7\u5236\u7528\u6237\u6570\u636e\u3002\u4efb\u4f55\u653f\u5e9c\u6216\u5b9e\u4f53\u90fd\u6ca1\u6709\u80fd\u529b\u627c\u6740\u7f51\u7ad9\u548c\u670d\u52a1\uff1b\u6ca1\u6709\u4e00\u4e2a\u4eba\u53ef\u4ee5\u63a7\u5236\u4ed6\u4eba\u7684\u8eab\u4efd\u3002"},{"title":"Redis\u662f\u600e\u6837\u901a\u8baf\u7684\uff1f","link":"https:\/\/blog.greycode.top\/posts\/8b135153fd9d41de928df42f84ad1eca\/","pubDate":"Tue, 29 Mar 2022 13:41:40 +0000","guid":"https:\/\/blog.greycode.top\/posts\/8b135153fd9d41de928df42f84ad1eca\/","description":"\u6a21\u578b Redis \u534f\u8bae\u6a21\u578b\u5c31\u662f\u7b80\u5355\u7684\u8bf7\u6c42-\u54cd\u5e94\u6a21\u578b\uff0c\u548c\u5e73\u5e38\u7684 Http \u534f\u8bae\u6709\u70b9\u7c7b\u4f3c\u3002\u5ba2\u6237\u7aef\u53d1\u9001 Redis \u547d\u4ee4\uff0c\u7136\u540e\u670d\u52a1\u7aef\u5904\u7406\u547d\u4ee4\u5e76\u8fd4\u56de\u7ed3\u679c\u7ed9\u5ba2\u6237\u7aef\u3002Redis \u5b98\u65b9\u8bf4\u8fd9\u53ef\u80fd\u662f\u6700\u7b80\u5355\u7684\u7f51\u7edc\u534f\u8bae\u6a21\u578b\u4e86\u3002\n\u6709\u4e24\u79cd\u60c5\u51b5\u4e0b\u4e0d \u4e0d\u9002\u7528\u8fd9\u4e2a\u6a21\u578b\uff0c\u4e00\u4e2a\u662f\u6279\u91cf\u6d41\u6c34\u7ebf\u547d\u4ee4\uff0c\u4e00\u4e2a\u662f\u53d1\u5e03\/\u8ba2\u9605\u529f\u80fd\u3002\n\u534f\u8bae\u63cf\u8ff0 Redis \u534f\u8bae\u4e00\u822c\u7b80\u5355\u7684\u5206\u4e3a 5 \u7c7b\u6570\u636e\u7ed3\u6784\uff0c\u7b80\u5355\u5b57\u7b26\u4e32\u3001\u9519\u8bef\u4fe1\u606f\u3001\u6570\u503c\u3001\u5927\u5b57\u7b26\u4e32\u3001\u6570\u7ec4\u3002\u6bcf\u79cd\u6570\u636e\u7c7b\u578b\u5728\u7b2c\u4e00\u4e2a\u5b57\u8282\u7528\u4e0d\u540c\u7684\u7b26\u53f7\u6765\u533a\u5206\uff1a\n\u7b80\u5355\u5b57\u7b26\u4e32(Simple Strings)\uff1a\u5f00\u5934\u7b2c\u4e00\u4e2a\u7b26\u53f7\u4e3a +\uff0c\u5bf9\u5e94 HEX \u503c\u4e3a\uff1a0x2b \u9519\u8bef\u4fe1\u606f(Errors)\uff1a\u7b2c\u4e00\u4e2a\u5b57\u8282\u7b26\u53f7\u4e3a -\uff0c\u5bf9\u5e94 HEX \u503c\u4e3a\uff1a0x2d \u6570\u503c(Integers)\uff1a\u7b2c\u4e00\u4e2a\u5b57\u8282\u7b26\u53f7\u4e3a :\uff0c\u5bf9\u5e94 HEX \u503c\u4e3a\uff1a0x3a \u5927\u5b57\u7b26\u4e32(Bulk Strings)\uff1a\u7b2c\u4e00\u4e2a\u5b57\u8282\u7b26\u53f7\u4e3a $\uff0c\u5bf9\u5e94 HEX \u503c\u4e3a\uff1a0x24 \u6570\u7ec4(Arrays)\uff1a\u7b2c\u4e00\u4e2a\u5b57\u8282\u7b26\u53f7\u4e3a *\uff0c\u5bf9\u5e94 HEX \u503c\u4e3a\uff1a0x2a \u8fd9 5 \u79cd\u6570\u636e\u7c7b\u578b\u53ef\u4ee5\u7ec4\u5408\u8d77\u6765\u4f7f\u7528\uff0c\u6bcf\u79cd\u6570\u636e\u7c7b\u578b\u901a\u8fc7 CRLF \u7ed3\u5c3e\uff0c\u5c31\u662f\u5e73\u5e38\u7684 \\r\\n\uff0c\u5bf9\u5e94\u7684 HEX \u503c\u4e3a\uff1a0x0d,0x0a\u3002\u4e00\u822c\u6211\u4eec\u5224\u65ad\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u662f\u5426\u7ed3\u675f\u65f6\uff0c\u53ea\u8981\u5224\u65ad\u662f\u5426\u6709 \\r \u51fa\u73b0\u5c31\u53ef\u4ee5\u4e86\u3002Redis \u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef\u4e4b\u95f4\u5c31\u662f\u901a\u8fc7\u8fd9\u4e9b\u89c4\u5219\u6765\u8fdb\u884c\u901a\u4fe1\u7684\u3002\n\u7b80\u5355\u5b57\u7b26\u4e32 \u4e00\u822c\u7b80\u5355\u5b57\u7b26\u4e32\u7528\u4e8e\u8fd4\u56de Redis \u670d\u52a1\u7aef\u7684\u7cfb\u7edf\u54cd\u5e94\uff0c\u5982\u679c\u8981\u54cd\u5e94\u7528\u6237\u5b58\u50a8\u7684\u6570\u636e\u65f6\uff0c\u4e00\u822c\u4f1a\u7528\u5927\u5b57\u7b26\u4e32(Bulk Strings)\u7684\u6570\u636e\u7c7b\u578b\u6765\u8fd4\u56de\u3002\n\u6bd4\u5982\u8bf4\u5ba2\u6237\u7aef\u53d1\u9001 set \u547d\u4ee4\u65b0\u589e\u4e00\u4e2a Key \u6765\u5b58\u50a8\u5b57\u7b26\u4e32\uff0c\u6b64\u65f6\u5ba2\u6237\u7aef\u5c31\u4f1a\u8fd4\u56de +OK\u3002\u8fd9\u79cd\u65b9\u5f0f\u8fd4\u56de\u7684\u6570\u636e\u4e0d\u80fd\u6709\u7a7a\u683c\u548c\u6362\u884c\uff0c\u56e0\u4e3a\u7a7a\u683c\u548c\u6362\u884c\u8868\u793a\u8be5\u7c7b\u578b\u7684\u6570\u636e\u7ed3\u5c3e\u3002\nredis:0&gt;set name \u7070\u7070 &#34;OK&#34; # Redis \u670d\u52a1\u7aef\u54cd\u5e94\u6570\u636e 0000 2b 4f 4b 0d 0a +OK\u00b7\u00b7 \u9519\u8bef\u4fe1\u606f \u5f53\u6211\u4eec\u6267\u884c\u7684\u547d\u4ee4\u53d1\u751f\u9519\u8bef\u65f6\uff0cRedis \u670d\u52a1\u7aef\u5c31\u4f1a\u8fd4\u56de\u9519\u8bef\u4fe1\u606f"},{"title":"MySQL\u662f\u600e\u6837\u901a\u8baf\u7684\uff1f","link":"https:\/\/blog.greycode.top\/posts\/2852f14d7d13471798ce28c544741e89\/","pubDate":"Sun, 27 Mar 2022 23:51:51 +0000","guid":"https:\/\/blog.greycode.top\/posts\/2852f14d7d13471798ce28c544741e89\/","description":"\u524d\u8a00 \u6211\u4eec\u5e73\u5e38\u4f7f\u7528\u6570\u636e\u5e93\u7684\u573a\u666f\u4e00\u822c\u662f\u7a0b\u5e8f\u91cc\u9762\u4ee3\u7801\u76f4\u63a5\u8fde\u63a5\u4f7f\u7528\uff0c\u7136\u540e\u8fdb\u884c CRUD \u64cd\u4f5c\u3002\u6216\u8005\u4f7f\u7528\u6709 GUI \u754c\u9762\u7684\u6570\u636e\u5e93\u8f6f\u4ef6\u6765\u624b\u52a8\u64cd\u4f5c\u6570\u636e\u5e93\uff0c \u8fd9\u7c7b\u8f6f\u4ef6\u6709 DataGrip\u3001Navicat\u7b49\u7b49&hellip;\u3002\u5e73\u5e38\u5f88\u5c11\u5173\u5fc3\u5b83\u4eec\u7684\u5e95\u5c42\u6570\u636e\u4ea4\u4e92\u662f\u600e\u4e48\u6837\u7684\uff0c\u76f8\u4fe1\u4f60\u770b\u4e86\u8fd9\u7bc7\u6587\u7ae0\u4e00\u5b9a\u80fd\u6709\u5927\u6982\u7684\u4e86\u89e3\u3002\u672c\u7bc7\u6587\u7ae0\u7684\u4ee3\u7801\u4f7f\u7528 Go \u8bed\u8a00\u6765\u5b9e\u73b0 MySQL \u7684\u534f\u8bae\u3002\n\u534f\u8bae\u7b80\u4ecb MySQL \u534f\u8bae\u4e00\u822c\u5206\u4e3a\u4e24\u4e2a\u9636\u6bb5\uff0c\u4e00\u4e2a\u662f\u8fde\u63a5\u9636\u6bb5\uff0c\u4e00\u4e2a\u662f\u547d\u4ee4\u9636\u6bb5\u3002 \u8fde\u63a5\u9636\u6bb5\u4e3b\u8981\u662f\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef\u8fdb\u884c\u76f8\u4e92\u8ba4\u8bc1\u7684\u9636\u6bb5\uff0c\u5c31\u50cf\u6211\u4eec\u5e73\u5e38\u767b\u9646\u67d0\u4e2a\u7f51\u7ad9\u7684\u4e00\u4e2a\u64cd\u4f5c\u3002 \u547d\u4ee4\u9636\u6bb5\u4e3b\u8981\u662f\u5ba2\u6237\u7aef\u5411\u670d\u52a1\u7aef\u8fdb\u884c\u7684\u4e00\u4e9b\u6307\u4ee4\u7684\u53d1\u9001\uff0c\u7136\u540e\u670d\u52a1\u7aef\u5904\u7406\u6307\u4ee4\u5e76\u8fd4\u56de\u7ed3\u679c\u7684\u4e00\u4e2a\u8fc7\u7a0b\u3002 \u5728\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef\u53d1\u9001\u7684\u6570\u636e\u5305\u4e2d\uff0c\u524d 3 \u4e2a\u5b57\u8282\u8868\u793a\u8fd9\u4e2a\u6570\u636e\u5305\u7684\u5927\u5c0f\uff0c\u6240\u4ee5\u8fd9\u91cc\u5c31\u6709\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5b83\u6709\u4e00\u4e2a\u5927\u5c0f\u7684\u9650\u5236\uff0c\u6570\u636e\u5305\u5927\u5c0f\u4e0d\u80fd\u8d85\u8fc716777215 ($2^{24}-1$) bytes\uff0c\u4e5f\u5c31\u662f 16M \u5927\u5c0f\uff0816\u8fdb\u5236\u8868\u793a\uff1aff ff ff\uff0c\u521a\u521a 3 \u4e2a\u5b57\u8282\uff09\u3002\u8fd9\u5c31\u4f1a\u6709\u4e09\u79cd\u60c5\u51b5\u51fa\u73b0\uff0c\u4e00\u79cd\u662f\u6570\u636e\u5305\u5c0f\u4e8e 16M\uff0c\u4e00\u79cd\u662f\u7b49\u4e8e\uff0c\u4e00\u79cd\u662f\u5927\u4e8e\u3002\u6240\u4ee5\u5728 MySQL \u534f\u8bae\u4e2d\u662f\u8fd9\u6837\u5904\u7406\u7684\uff1a\n\u5c0f\u4e8e 16M\uff1a\u53d1\u9001\u4e00\u4e2a\u6570\u636e\u5305\u5c31\u53ef\u4ee5\u4e86 \u7b49\u4e8e 16M\uff1a\u53d1\u9001\u4e24\u4e2a\u6570\u636e\u5305\uff0c\u7b2c\u4e8c\u4e2a\u5305\u4e3a\u7a7a\u5305 \u5927\u4e8e 16M\uff1a\u53d1\u9001\u591a\u4e2a\u6570\u636e\u5305\uff0c\u6bcf\u4e2a\u6570\u636e\u5305\u5927\u5c0f\u6700\u5927\u4e3a 16M\uff0c\u5f53\u6700\u540e\u4e00\u4e2a\u6570\u636e\u5305\u7b49\u4e8e 16M \u65f6\uff0c\u518d\u591a\u53d1\u9001\u4e00\u4e2a\u7a7a\u6570\u636e\u5305 \u6bcf\u4e2a\u6570\u636e\u5305\u4e2d\u7684\u7b2c 4 \u4e2a\u5b57\u8282\u8868\u793a\u8fd9\u4e2a\u6570\u636e\u5305\u7684\u5e8f\u53f7ID\uff0c\u8fd9\u4e2a ID \u5728\u4e0d\u540c\u9636\u6bb5\u4f1a\u9012\u589e\uff0c\u6bd4\u5982\u5728\u8fde\u63a5\u9636\u6bb5\uff0c\u8fd9\u4e2a ID \u4f1a\u968f\u7740\u5305\u7684\u6570\u91cf\u800c\u9012\u589e\uff0c\u5f53\u8fde\u63a5\u9636\u6bb5\u5b8c\u6210\u540e\u8fdb\u5165\u547d\u4ee4\u9636\u6bb5\uff0c\u8fd9\u4e2a ID \u53c8\u4f1a\u4ece 0 \u5f00\u59cb\u9012\u589e\uff0c\u76f4\u5230\u8fd9\u4e2a\u547d\u4ee4\u7684\u751f\u547d\u5468\u671f\u7ed3\u675f\u3002\n\u521d\u59cb\u63e1\u624b\u5305 \u5f53\u5ba2\u6237\u7aef\u8fdb\u884c\u5c1d\u8bd5\u4f7f\u7528 TCP \u8fde\u63a5 MySQL \u670d\u52a1\u7aef\u65f6\uff0c\u670d\u52a1\u7aef\u5c31\u4f1a\u54cd\u5e94\u4e00\u4e2a\u521d\u59cb\u7684\u63e1\u624b\u5305\uff0c\u8fd9\u4e2a\u63e1\u624b\u5305\u6709 V9\u3001V10 \u4e24\u4e2a\u7248\u672c\u3002\u4e0d\u8fc7\u73b0\u5728\u4e00\u822c\u7528\u7684\u90fd\u662f V10 \u7248\u672c\uff0c\u5982\u679c MySQL \u7684\u7248\u672c\u5728 3.21.0 \u4e4b\u524d\uff0c\u90a3\u4e48\u670d\u52a1\u7aef\u54cd\u5e94\u7684\u662f V9 \u7248\u672c\u7684\u521d\u59cb\u63e1\u624b\u5305\u3002\u672c\u7bc7\u6587\u7ae0\u5c31\u8bb2\u8bb2\u73b0\u5728\u5e38\u7528\u7684 V10 \u7248\u672c\u7684\u521d\u59cb\u63e1\u624b\u5305\u3002\n\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u4ee3\u7801\u6765\u5c1d\u8bd5\u8fde\u63a5\u6211\u4eec\u672c\u5730\u7684 MySQL \u670d\u52a1:"},{"title":"centos \u591a\u7f51\u5361\u914d\u7f6e\u4f18\u5148\u7ea7","link":"https:\/\/blog.greycode.top\/posts\/0a5a3927baea4155849c174e4c613913\/","pubDate":"Wed, 01 Sep 2021 15:47:14 +0000","guid":"https:\/\/blog.greycode.top\/posts\/0a5a3927baea4155849c174e4c613913\/","description":"\u8fc7\u7a0b \u67e5\u770b\u7f51\u5361\u914d\u7f6e\n[root@localhost ~]# ip addr 1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link\/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1\/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1\/128 scope host valid_lft forever preferred_lft forever 2: em1: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP group default qlen 1000 link\/ether 34:17:eb:f0:18:8f brd ff:ff:ff:ff:ff:ff inet 192.168.0.84\/24 brd 192.168.0.255 scope global noprefixroute em1 valid_lft forever preferred_lft forever inet6 240e:390:c6a:c3a0:3617:ebff:fef0:188f\/64 scope global noprefixroute dynamic valid_lft 259182sec preferred_lft 172782sec inet6 fe80::3617:ebff:fef0:188f\/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: em2: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP group default qlen 1000 link\/ether 34:17:eb:f0:18:90 brd ff:ff:ff:ff:ff:ff inet 192."},{"title":"\u7528 Json-Schema \u6765\u9a8c\u8bc1\u4f60\u7684\u8bf7\u6c42\u53c2\u6570","link":"https:\/\/blog.greycode.top\/posts\/775ff9a0ce4940ebbb45fed3fad7ab5b\/","pubDate":"Thu, 19 Aug 2021 16:40:05 +0000","guid":"https:\/\/blog.greycode.top\/posts\/775ff9a0ce4940ebbb45fed3fad7ab5b\/","description":"\u7b80\u4ecb Json-Schema \u662f\u4e00\u4e2a\u7528\u6765\u9a8c\u8bc1\u3001\u63cf\u8ff0 Json \u6570\u636e\u7684\u4e00\u4e2a\u6807\u51c6\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u9a8c\u8bc1\u4f60\u7684\u8bf7\u6c42\u6570\u636e\u662f\u5426\u548c\u4f60\u5b9a\u4e49\u7684 Schema \u662f\u5426\u4e00\u81f4\u3002\u6bd4\u5982\u4e0b\u9762\u7684 Json \u6570\u636e\u4e2d\uff1a\n{ &#34;name&#34;:&#34;greycode&#34;, &#34;desc&#34;:&#34;coder&#34; } \u5982\u679c\u4e0d\u9884\u5148\u544a\u8bc9\u4f60\u5b57\u6bb5\u7684\u542b\u4e49\uff0c\u4f60\u77e5\u9053 name \u662f\u4ec0\u4e48\u610f\u601d\u5417\uff1f\u5b83\u5230\u5e95\u662f\u6307\u4eba\u540d\u8fd8\u662f\u4e00\u4e2a\u7269\u54c1\u7684\u540d\u5b57\u8fd8\u662f\u5176\u4ed6\uff1fdesc \u53c8\u662f\u4ec0\u4e48\u610f\u601d\u5462\uff1f\n\u8fd9\u65f6\u5019\uff0c\u5c31\u53ef\u4ee5\u7528 Json-Schema \u6765\u63cf\u8ff0\u5b83\u4e86\n{ &#34;$schema&#34;: &#34;http:\/\/json-schema.org\/draft-07\/schema&#34;, &#34;$id&#34;: &#34;http:\/\/example.com\/example.json&#34;, &#34;type&#34;: &#34;object&#34;, &#34;title&#34;: &#34;\u8fd9\u662f\u4e00\u4e2aJson\u6570\u636e&#34;, &#34;description&#34;: &#34;\u63cf\u8ff0\u4e2a\u4eba\u4fe1\u606f\u7684\u6570\u636e&#34;, &#34;required&#34;: [ &#34;name&#34;, &#34;desc&#34; ], &#34;properties&#34;: { &#34;name&#34;: { &#34;type&#34;: &#34;string&#34;, &#34;description&#34;: &#34;\u4eba\u7684\u59d3\u540d&#34;, }, &#34;desc&#34;: { &#34;type&#34;: &#34;string&#34;, &#34;description&#34;: &#34;\u4e2a\u4eba\u7b80\u4ecb&#34;, } } } \u4e0a\u9762\u6211\u4eec\u7528 Json-Schema \u6765\u63cf\u8ff0\u4e86\u521a\u5f00\u59cb\u7684 Json \u6570\u636e\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u6e05\u695a\u7684\u77e5\u9053 name \u662f\u4eba\u7684\u59d3\u540d\uff0cdesc \u662f\u4e2a\u4eba\u7b80\u4ecb\uff0c\u5728\u4e5f\u4e0d\u7528\u81ea\u5df1\u53bb\u731c\u4e86\u3002\nJson Schema \u5b57\u6bb5\u8bf4\u660e \u5728\u4e0a\u9762\u7684 Json-Schema \u6570\u636e\u4e2d\uff0c\u6bcf\u4e2a\u5b57\u6bb5\u90fd\u6709\u5176\u7684\u542b\u4e49\n$schema \uff1a\u4e3b\u8981\u7528\u4e8e\u7248\u672c\u63a7\u5236 $id \uff1a\u5b9a\u4e49\u5b57\u6bb5\u5728 schema \u4e2d\u7684\u5730\u5740 title \u548c description \uff1a\u7528\u4e8e\u63cf\u8ff0\u548c\u8bf4\u660e Schema \u7684\u4f5c\u7528 type \uff1a\u5b9a\u4e49\u5b57\u6bb5\u7684\u6570\u636e\u7c7b\u578b required \uff1aJson \u6570\u636e\u4e2d\u5305\u542b\u7684\u5b57\u6bb5 &hellip;&hellip; \u7531\u4e8e Json-Schema \u6709\u8bb8\u591a\u8349\u6848\uff0c\u6bcf\u4e2a\u8349\u6848\u7684\u5b57\u6bb5\u90fd\u6709\u4e00\u70b9\u533a\u522b\uff0c\u5177\u4f53\u53ef\u4ee5\u770b\u4e00\u4e0b\u7684\u8349\u6848\u8d44\u6599\uff1a"},{"title":"AviatorScript\u8f7b\u91cf\u7ea7\u9ad8\u6027\u80fd\u811a\u672c\u8bed\u8a00","link":"https:\/\/blog.greycode.top\/posts\/ca3ab1d58ea74b76a5fd69f79dd5ec79\/","pubDate":"Tue, 17 Aug 2021 16:10:53 +0000","guid":"https:\/\/blog.greycode.top\/posts\/ca3ab1d58ea74b76a5fd69f79dd5ec79\/","description":"\u7b80\u4ecb \u5728 5.0 \u7248\u672c\u4ee5\u524d\uff0c\u5b83\u7684\u540d\u5b57\u662f\u53eb Aviator \uff0c\u5b9a\u4f4d\u4e00\u76f4\u53ea\u662f\u4e00\u4e2a\u8868\u8fbe\u5f0f\u5f15\u64ce\uff0c\u4e0d\u652f\u6301 if\/else \u6761\u4ef6\u8bed\u53e5\uff08\u4ec5\u6709\u4e09\u5143\u8fd0\u7b97\u7b26\u652f\u6301 ?: \uff09\uff0c\u6ca1\u6709\u5185\u7f6e\u7684 for\/while \u5faa\u73af\u652f\u6301\uff08\u867d\u7136\u4f60\u53ef\u4ee5\u7528 seq \u5e93\u7c7b\u4f3c\u51fd\u6570\u5f0f\u7684\u65b9\u5f0f\u6765\u5904\u7406\u96c6\u5408\uff09\uff0c\u4e5f\u6ca1\u6709\u8d4b\u503c\uff08\u540e\u6765\u5728 4.0 \u5f15\u5165\uff09\uff0c\u6ca1\u6709\u4f5c\u7528\u57df\u7684\u6982\u5ff5\uff08\u4e5f\u5728 4.0 \u5f15\u5165 lambda \u51fd\u6570\u540e\u90e8\u5206\u5b9e\u73b0\uff09\u7b49\u7b49\u4e00\u822c\u8bed\u8a00\u5e38\u89c1\u7684\u80fd\u529b\u3002\u5728 5.0 \u7248\u672c\u540e\uff0c\u5b83\u53d8\u6210\u4e86\u4e00\u95e8\u811a\u672c\u8bed\u8a00\uff0c\u53eb\uff1aAviatorScript \u3002\n\u5728 5.0 \uff0c\u65b0\u52a0\u4e86\u5982\u4e0b\u65b0\u7279\u6027\uff1a\n\u5927\u62ec\u53f7 { ... } \u62ec\u8d77\u6765\u7684\u8bcd\u6cd5\u4f5c\u7528\u57df\u3002\nlet \u8bed\u53e5\u7528\u4e8e\u5b9a\u4e49\u5c40\u90e8\u53d8\u91cf\u3002\n\u6761\u4ef6\u8bed\u53e5 if\/elsif\/else \u3002\n\u5faa\u73af\u8bed\u53e5 for \u548c while \uff0c\u4ee5\u53ca\u76f8\u5e94\u7684 break \u548c continue \u8bed\u53e5\u652f\u6301\u3002\nreturn \u8bed\u53e5\u7528\u4e8e\u4ece\u811a\u672c\u6216\u8005\u51fd\u6570\u4e2d\u8fd4\u56de\u503c\u3002\nfn hello() { println(&quot;hello&quot;); } \u65b0\u7684 fn \u8bed\u6cd5\u7528\u4e8e\u5b9a\u4e49\u547d\u540d\u51fd\u6570\u3002\n## \u5355\u884c\u6ce8\u91ca \u6ce8\u91ca\u652f\u6301\n\u6a21\u5757\u7cfb\u7edf\nnew \u8bed\u6cd5\u7528\u4e8e\u521b\u5efa\u5bf9\u8c61\n\u5f02\u5e38\u5904\u7406\n\u547d\u4ee4\u884c\u5de5\u5177 aviator\n\u4f7f\u7528 AviatorScript \u53ef\u4ee5\u5355\u7eaf\u7684\u4f5c\u4e3a\u811a\u672c\u8bed\u8a00\u4f7f\u7528\uff0c\u4e5f\u53ef\u4ee5\u548c Java \u914d\u5408\u4f7f\u7528\u3002\n\u5355\u7eaf\u7684\u4f5c\u4e3a\u811a\u672c\u8bed\u8a00\u4f7f\u7528 \u4f5c\u4e3a\u811a\u672c\u8bed\u8a00\u4f7f\u7528\u65f6\uff0c\u9700\u8981\u4e0b\u8f7d\u4e00\u4e2a aviator\uff0c\u7136\u540e\u7528\u5b83\u53bb\u6267\u884c\u811a\u672c\u6587\u4ef6\u3002"},{"title":"ZooKeeper\u5ba2\u6237\u7aef\u8be6\u89e3\u53ca\u53ef\u89c6\u5316\u5ba2\u6237\u7aef","link":"https:\/\/blog.greycode.top\/posts\/8b8235def437432c99c81e97d68d0644\/","pubDate":"Mon, 09 Aug 2021 14:54:39 +0000","guid":"https:\/\/blog.greycode.top\/posts\/8b8235def437432c99c81e97d68d0644\/","description":"\u4e0b\u8f7d \u6211\u4eec\u53ef\u4ee5\u53bb ZooKeeper \u5b98\u7f51 \u4e0b\u8f7d\uff0c\u8fd9\u91cc\u6211\u4e0b\u8f7d\u4e86 ZooKeeper 3.7.0 \u7248\u672c\u3002\n\u4e0b\u8f7d\u89e3\u538b\u540e\uff0c\u8fdb\u5165 apache-zookeeper-3.7.0-bin\/bin \u76ee\u5f55\uff0c\u8fd9\u91cc\u6709\u5ba2\u6237\u7aef\u3001\u670d\u52a1\u7aef\u548c\u4e00\u4e9b\u5de5\u5177\u3002\u5728 Windows \u4e2d\u53ef\u4ee5\u6267\u884c.cmd \u7ed3\u5c3e\u7684\u6267\u884c\u6587\u4ef6\uff0c\u5728 Mac \u6216 Linux \u4e2d\u53ef\u4ee5\u6267\u884c .sh \u7ed3\u5c3e\u7684\u53ef\u6267\u884c\u6587\u4ef6\u3002\u540d\u4e3a zkCli \u7684\u6587\u4ef6\u5c31\u662f ZooKeeper \u7684\u5ba2\u6237\u7aef\u4e86\uff0c\u6211\u4eec\u53ef\u4ee5\u7528\u8fd9\u4e2a\u5ba2\u6237\u7aef\u6765\u8fde\u63a5\u5230 ZooKeeper \u6ce8\u518c\u4e2d\u5fc3\uff0c\u6765\u5bf9\u8282\u70b9\u8fdb\u884c\u67e5\u770b\u6216\u589e\u5220\u64cd\u4f5c\u3002\n\u4f7f\u7528 \u6211\u662f\u5728 Mac \u73af\u5883\u4e0b\u6f14\u793a\u4f7f\u7528\u7684\n\u63a5\u4e0b\u6765\u5c31\u8bf4\u4e0b\u8fd9\u4e2a\u5ba2\u6237\u7aef\u600e\u4e48\u4f7f\u7528\u3002\n\u8fde\u63a5 \u7b2c\u4e00\u6b65\u5c31\u662f\u8981\u8fde\u63a5\u5230 ZooKeeper \u670d\u52a1\uff0c\u5f53\u4f60\u6267\u884c zkCli.sh \u4e0d\u5e26\u4efb\u4f55\u53c2\u6570\u65f6\uff0c\u5b83\u9ed8\u8ba4\u662f\u8fde\u63a5\u5230\u672c\u5730\u7684 localhost:2181 \u5730\u5740\u3002\u5982\u679c\u4f60\u8981\u8fde\u63a5\u5230\u6307\u5b9a\u5730\u5740\uff0c\u53ef\u4ee5\u4f7f\u7528 -server \u914d\u7f6e\uff1a\n.\/zkCli.sh -server localhost:2181 # \u8fd8\u53ef\u4ee5\u52a0\u4e0a\u8fde\u63a5\u8d85\u65f6\u65f6\u95f4\uff08\u5355\u4f4d\uff1a\u6beb\u79d2\uff09 .\/zkCli.sh -timeout 3000 -server localhost:2181 \u8fde\u63a5\u4e0a\u540e\uff0c\u7ec8\u7aef\u5c31\u4f1a\u53d8\u6210\u8fd9\u6837\uff1a\n[zk: localhost:2181(CONNECTED) 0] \u7136\u540e\u4f60\u53ef\u4ee5\u8f93\u5165 help \u6765\u67e5\u770b\u6267\u884c\u7684\u547d\u4ee4\uff1a\nZooKeeper -server host:port -client-configuration properties-file cmd args addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE addauth scheme auth close config [-c] [-w] [-s] connect host:port create [-s] [-e] [-c] [-t ttl] path [data] [acl] delete [-v version] path deleteall path [-b batch size] delquota [-n|-b|-N|-B] path get [-s] [-w] path getAcl [-s] path getAllChildrenNumber path getEphemerals path history listquota path ls [-s] [-w] [-R] path printwatches on|off quit reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,."},{"title":"\u5c0f\u767d\u5b66\u524d\u7aef\u4e4bTypeScript\u4f7f\u7528Vuex 4.0","link":"https:\/\/blog.greycode.top\/posts\/2ca7c67d02e74713a030f09651a5f164\/","pubDate":"Thu, 29 Jul 2021 16:45:15 +0000","guid":"https:\/\/blog.greycode.top\/posts\/2ca7c67d02e74713a030f09651a5f164\/","description":"\u7b80\u4ecb \u5b98\u65b9\u4ecb\u7ecd\uff1aVuex \u662f\u4e00\u4e2a\u4e13\u4e3a Vue.js \u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u7684\u72b6\u6001\u7ba1\u7406\u6a21\u5f0f\u3002\u5b83\u91c7\u7528\u96c6\u4e2d\u5f0f\u5b58\u50a8\u7ba1\u7406\u5e94\u7528\u7684\u6240\u6709\u7ec4\u4ef6\u7684\u72b6\u6001\uff0c\u5e76\u4ee5\u76f8\u5e94\u7684\u89c4\u5219\u4fdd\u8bc1\u72b6\u6001\u4ee5\u4e00\u79cd\u53ef\u9884\u6d4b\u7684\u65b9\u5f0f\u53d1\u751f\u53d8\u5316\u3002\n\u7b80\u5355\u6765\u8bf4\uff0cVuex \u5c31\u50cf\u662f\u524d\u7aef\u7684\u6570\u636e\u5e93\u6216\u7f13\u5b58\uff0c\u4e0d\u7ba1\u4ec0\u4e48\u9875\u9762\uff0c\u53ea\u8981 Vuex \u91cc\u9762\u6709\u7684\u6570\u636e\uff0c\u90fd\u53ef\u4ee5\u53bb\u62ff\u3002\nVuex \u5206\u4e3a 5 \u4e2a\u90e8\u5206\uff1a\nState\uff1a\u662f\u6570\u636e\u6e90\uff0c\u5b58\u653e\u6570\u636e Getters\uff1a\u53ef\u4ee5\u53d6\u5f97 State \u7684\u6570\u636e\uff0c\u7136\u540e\u81ea\u5b9a\u4e49\u7ec4\u88c5\u8fd4\u56de\u65b0\u7684\u6570\u636e Mutations\uff1a\u53ef\u4ee5\u6539\u53d8 State \u7684\u6570\u636e\uff0c\u5efa\u8bae\u65b9\u6cd5\u6267\u884c\u662f\u540c\u6b65\u7684 Actions\uff1a\u53ef\u4ee5\u5f02\u6b65\u6267\u884c Mutations \u91cc\u7684\u65b9\u6cd5 Modules\uff1a\u6bcf\u4e2a Module \u90fd\u6709\u5404\u81ea\u7684 State\u3001Getters\u3001Mutations\u3001Actions \u8fd9 5 \u4e2a\u90e8\u5206\u76f8\u8f85\u76f8\u6210\u3002\nTypeScript \u4f7f\u7528 \u5728 vue \u9879\u76ee\u6839\u76ee\u5f55\u6267\u884c\u547d\u4ee4\u6765\u8fdb\u884c vuex \u6a21\u5757\u7684\u5b89\u88c5\nnpm install vuex@next --save \u5b89\u88c5\u597d\u540e\u6211\u4eec\u65b0\u5efa\u6587\u4ef6 \/src\/store\/store.ts ,\u7136\u540e\u5728\u91cc\u9762\u5b9a\u4e49 InjectionKey \u548c Store\nimport { InjectionKey } from &#39;vue&#39; import { createStore, useStore as baseUseStore, Store } from &#39;vuex&#39; \/\/ \u5b9a\u4e49 State \u6570\u636e\u7c7b\u578b\u7684\u63a5\u53e3 interface IState{ } \/\/ \u7c7b\u578b\u4f20\u9012 export const key: InjectionKey&lt;Store&lt;IState&gt;&gt; = Symbol() export const store = createStore&lt;IState&gt; ({ }) \/\/ \u7528\u4e8e\u7ec4\u5408\u5f0fAPI setup() \u91cc\uff0c\u7701\u7684\u6bcf\u6b21\u90fd\u4f20\u5165 key export function useStore() { return baseUseStore(key) } \u7136\u540e\u5728 main."},{"title":"\u5229\u7528\u817e\u8baf\u4f4d\u7f6eAPI\u8fdb\u884c\u7684\u963f\u91cc\u4e91DDNS\u5de5\u5177","link":"https:\/\/blog.greycode.top\/posts\/9acf61395a77470ca029d24aec2ca42f\/","pubDate":"Mon, 26 Jul 2021 16:08:12 +0000","guid":"https:\/\/blog.greycode.top\/posts\/9acf61395a77470ca029d24aec2ca42f\/","description":"\u4ecb\u7ecd \u672c\u5e94\u7528\u662f\u57fa\u4e8e\u963f\u91cc\u4e91SDK\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u53ef\u4ee5\u52a8\u6001\u66f4\u65b0\u963f\u91cc\u4e91\u57df\u540d\u7684DNS\u89e3\u6790\uff0c\u8fd0\u884c\u73af\u5883\u662f Python 3\n\u5229\u7528\u817e\u8baf\u4f4d\u7f6e\u63d0\u4f9b\u7684 API \u8fdb\u884c\u516c\u7f51 IP \u7684\u83b7\u53d6\uff0c\u53ef\u4ee5\u67e5\u770b\u5982\u4f55\u83b7\u53d6\u817e\u8baf\u4f4d\u7f6e\u7684 API \u5bc6\u94a5\n\u7531\u4e8e\u817e\u8baf\u4f4d\u7f6e\u7684 API \u514d\u8d39\u914d\u989d\u4e3a\u6bcf\u65e5 10000 \u6b21\uff0c\u8bf7\u5408\u7406\u4f7f\u7528\n\u5feb\u901f\u5f00\u59cb \u7a0b\u5e8f\u4ece\u73af\u5883\u53d8\u91cf\u4e2d\u83b7\u53d6\u914d\u7f6e\uff0c\u8fd0\u884c\u524d\u5148\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\n\u73af\u5883\u53d8\u91cf \u8bf4\u660e ALI_ACCESS_KEY_ID \u963f\u91cc\u4e91 ACCESS_KEY_ID\uff08\u5fc5\u586b\uff09 ALI_ACCESS_KEY_SECRET \u963f\u91cc\u4e91 ACCESS_KEY_SECRET\uff08\u5fc5\u586b\uff09 ALI_REGION_ID \u963f\u91cc\u4e91\u533a\u57df ID\uff08\u9ed8\u8ba4\uff1acn-hangzhou\uff09 DNS_TYPE \u89e3\u6790\u7c7b\u578b\uff08\u9ed8\u8ba4\uff1aA\uff09 DNS_DOMAIN \u57df\u540d\uff08\u5fc5\u586b\uff09 DNS_SUB_DOMAIN \u4e8c\u7ea7\u57df\u540d\uff08\u9ed8\u8ba4\uff1a@\uff09 TENCENT_LBS_KEY \u817e\u8baf\u4f4d\u7f6e\u5e94\u7528 KEY TENCENT_LBS_SK \u817e\u8baf\u4f4d\u7f6e\u5e94\u7528\u7b7e\u540d\u52a0\u5bc6 SK \u73af\u5883\u5b57\u6bb5\u8bf4\u660e DNS_TYPE \u652f\u6301\u7684\u89e3\u6790\u7c7b\u578b\uff1a\n\u70b9\u51fb\u67e5\u770b\u5b98\u65b9\u8be6\u7ec6\u8bf4\u660e\nA\uff1a\u5c06\u57df\u540d\u6307\u5411\u4e00\u4e2aIPV4\u5730\u5740 CNAME\uff1a\u5c06\u57df\u540d\u6307\u5411\u53e6\u5916\u4e00\u4e2a\u57df\u540d AAAA\uff1a\u5c06\u57df\u540d\u6307\u5411\u4e00\u4e2aIPV6\u5730\u5740 DNS_SUB_DOMAIN \u57df\u540d\u524d\u7f00\uff0c\u5e38\u89c1\u7528\u6cd5\u6709\uff1a\nwww\uff1a\u89e3\u6790\u540e\u7684\u57df\u540d\u4e3awww.aliyun.com\u3002\n@\uff1a\u76f4\u63a5\u89e3\u6790\u4e3b\u57df\u540d aliyun.com\u3002\n*\uff1a\u6cdb\u89e3\u6790\uff0c\u5339\u914d\u5176\u4ed6\u6240\u6709\u57df\u540d *.aliyun.com\u3002\nmail\uff1a\u5c06\u57df\u540d\u89e3\u6790\u4e3amail.aliyun.com\uff0c\u901a\u5e38\u7528\u4e8e\u89e3\u6790\u90ae\u7bb1\u670d\u52a1\u5668\u3002\n\u4e8c\u7ea7\u57df\u540d\uff1a\u5982\uff1aabc.aliyun.com\uff0c\u586b\u5199abc\u3002\n\u624b\u673a\u7f51\u7ad9\uff1a\u5982\uff1am.aliyun.com\uff0c\u586b\u5199m\u3002\n\u663e\u6027URL\uff1a\u4e0d\u652f\u6301\u6cdb\u89e3\u6790\uff08\u6cdb\u89e3\u6790\uff1a\u5c06\u6240\u6709\u5b50\u57df\u540d\u89e3\u6790\u5230\u540c\u4e00\u5730\u5740\uff09\n\u8fd0\u884c \u5f53\u8bbe\u7f6e\u597d\u73af\u5883\u53d8\u91cf\u540e\uff0c\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5b89\u88c5\u4f9d\u8d56\npip install -r requeirments.txt \u5b89\u88c5\u4f9d\u8d56\u540e\uff0c\u76f4\u63a5\u8fd0\u884c main.py\npython main.py \u4ee5 Docker \u8fd0\u884c \u5982\u679c\u4f60\u672c\u5730\u6ca1\u6709 python \u73af\u5883\uff0c\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528 docker \u6765\u8fd0\u884c\u672c\u7a0b\u5e8f"},{"title":"UML\u7bad\u5934\u5728Java\u4e2d\u7684\u542b\u4e49","link":"https:\/\/blog.greycode.top\/posts\/234c81b9931c44cb9b88e0e53210bb48\/","pubDate":"Sun, 18 Jul 2021 20:17:38 +0000","guid":"https:\/\/blog.greycode.top\/posts\/234c81b9931c44cb9b88e0e53210bb48\/","description":"\u6cdb\u5316 \u5728 Java \u4e2d\u8868\u793a\u7ee7\u627f\u5173\u7cfb\uff0c\u7a7a\u5fc3\u7bad\u5934\u6307\u5411\u7236\u7c7b\n\u793a\u4f8b\uff1a\nclass Parent { } class Son extends Parent { } \u5b9e\u73b0 \u8868\u793a\u5b9e\u73b0\u63a5\u53e3\uff0c\u7bad\u5934\u6307\u5411\u63a5\u53e3\u7c7b\n\u793a\u4f8b\uff1a\ninterface Iter { } class TerImpl implements Iter { } \u4f9d\u8d56 \u8868\u793a\u4f9d\u8d56\u5173\u7cfb\uff0c\u67d0\u4e2a\u7c7b\u7684\u65b9\u6cd5\u5fc5\u987b\u4f9d\u8d56\u53e6\u4e00\u4e2a\u7c7b\u624d\u53ef\u4ee5\u6267\u884c\uff0c\u7bad\u5934\u6307\u5411\u88ab\u4f9d\u8d56\u7684\u7c7b\n\u793a\u4f8b\uff1a\nclass A { public void testA(){ System.out.println(&#34;\u8fd9\u662f A \u7c7b&#34;); } } class B { public void testB(A a){ a.testA(); } } \u5173\u8054\u5173\u7cfb \u5173\u8054 \u8868\u793a\u5173\u8054\u5173\u7cfb\uff0c\u4e24\u4e2a\u7c7b\u7684\u5173\u7cfb\u662f\u5e73\u7b49\u7684\n\u53ef\u4ee5\u53cc\u5411\u5173\u8054\uff0cA \u53ef\u4ee5\u5173\u8054 B\uff0cB \u4e5f\u53ef\u4ee5\u5173\u8054 A\n\u7bad\u5934\u6307\u5411\u88ab\u5173\u8054\u7684\u7c7b\n\u793a\u4f8b\uff1a\nclass A { public void testA(){ System.out.println(&#34;\u8fd9\u662f A \u7c7b&#34;); } } class B { private A a; public B(A a) { this."},{"title":"\u8bb0\u4e00\u6b21\u5f88\u4e45\u4ee5\u524d\u505a\u7684\u68a6\u3010\u52a0\u5bc6\u3011","link":"https:\/\/blog.greycode.top\/posts\/8b40046c17644103bd2a256eb938884c\/","pubDate":"Thu, 15 Jul 2021 08:14:37 +0000","guid":"https:\/\/blog.greycode.top\/posts\/8b40046c17644103bd2a256eb938884c\/","description":"\u65f6\u95f4\uff1a2019-12-19 07:23 RGwc3OqLQr\/FK7bX9qFgbl1FD1WZLruNkeFBP4vHyDejXpJhzV309eABiP0e+YiX5wKAD0GaALo74u1B39tyIUFaMrQAVV5M60sGphzkL2hf0ad5\/0JAqGXgDy01ustT\/w+bAGA8As3jc+3CexZ8CfqJsrOp7vt0aE8zzqKV0IbSL3b5u4wpBfp4Rb7+4b7lES9sbZmD37mXP5bJ0X94Z6W38oSSUj6aiLpDI9kllGxSWavZK+hQk1eWuAThn833cjXVtaxq7Mruglvc+eo4ok2Fm56uCdnq2RiUi5nu9e0bkGXyv8ELwr3RcVjMQdHQB8CK\/OFuNXltCRWNKlH6G2fyrPO+D+Sg6zbolkLHl326Ja3co0fDuLm6MxbLLwubwjfci0\/ZXjGOCKodAfvEtrDmkd0l2HYaOTbH6nOu+3GwXr+3QwdoxhFrVPjpkvjWcs4VNieiqiynXeNBflPR66ZrscQtZRVX77DUXT3jZdQ5rV7a6ZyWDr9ZgET86YQlGFxcW62wsBnMBt9STCFCUhbhYdccrBOAMJuZXfccIDuBgqelngufQRinLHRJiv0ihN2QhNuJFKkkTxSgswrMjLWhMGgKs8fbfnK82myiWIgqRnF6geCydTX8UAS3dTR1f0XJKEJuUNzc87uzszP+EZIcZ+JnCLjLNnJXJG9XVlLKElLmiwXNi4zDnP6NHGa7ikvac7mHR2SsWGL3\/v4pZtSNiwoZW3pPaK6Id+eg+srKoB7GTQNKZIsDuJh8cMziJF7cr1KvH7LZRMpB4MpeyvLmgz8oo3soLiGFVhl5wMrcqbc8H4qtnC4mI9iT5Z1lPBtq13+bYyplOY+G0soMOvbtkei7nWxIz3fh17gqMZvlTikEGcMNHGTs+wwgtsbreqR54iWEVuOxfYD+eYArFujw+iJRCsUCYWepGeVGNpZwlsuKQ+EH0sIJ1c4srVN73BYyE9nHw34W9CHY1MkOhUmXflbaBxz7E+AWfiUiZEWpWwvXOfTtWRuJV0htuCPmA63XgHn6JAHadlf5OY4l1BNewOWXVDPYEChsONoPSmTFxjq\/Qop83AqoOtxoaPqfWLXM+s8AqMjfWDQkzDMuxUnMO9fxiEze7J+qMZw7y2W+37NgPQHZBcG3Q8Vd\/ArxjfMQaZO11cYsW+RQkhuXj6lvsbs31+j\/Od4mA0XPpJ2rKIVC\/ueVAP8BuTBAzMN8ndDHXkKctT17eCUXz7w+t9n4h4MZxQQPegz9d3ULLabcdCJ167fpJ+8\/iXQhcJXihJeNXefkPcVrkxF+Tfj\/r73rSbTgtK+LseIedY1u17\/8itWpPlPqlVDC6dzSECBofynwSHADsXl+CBFpkstT3JPiSRTnVmWcta4H9kHthp4yG8Hqc2O6fJnodDIjwa6uzS0N8o95wHz79dDtDHKSpGsjtjotT54qCeI9z3T9FMSwKrN2AJn\/1fQdRA56QjnGFLeE8EkYY5Ix6tsk9XFcqAeLC1UbWIoaEqUdILSo9e\/TAUizEf+01YBHrsec+o2lEGl8QjthfxhlEFDNgTD0Lt4Cb2ytqpMJZXxFrqqUYOOc2+Lq0\/xJPHCKHYf8vLZEfx7LzcLbwLk+BVnxm6JqQVXXWMM2BblrFCX2CAIuhd8m0lztKUrK5OVG0TyEeLrOpB6\/YfXm6MPIOttooJFzCBZAKpWt70Xwwfwxrr7r0qMZziWv8oTiFG4lSvGE0VvCwN9hZoLvFh6bMFpnz\/bv0L8HMSxBmOyanQm01HhX6KXcyNSbW9Ep2Qxkw+eC034r+HQzV2t+qFkbpNFMb0DatDetvdBZyvlTvlPNcxJCcxEqe\/gxb9DRzKNPyy8eM\/P4Wem+NW7GFZTfXZQ6uj712J\/vQddDF9ukf\/jXJkEShhLTs9+JFhR9zjnOljLfNhmB8UzIUBno1d+qqzlC+ZiHzkaRbMnATdOYqW0dBIf5f5wIq31M4GC5mkQzxBVQ8Zqxxu5LCLGRrm+2dro8O27\/B5D74h0s\/rUmbj8Qxxf32rNjj0+TAZIIFh\/3pQjdbwNiABQZUpLBtYWSiZSZ5ivKAgzK6H1uVAlrillqMWJDjLsU6yO1sGb6lMBgKiIuGD2MWHj6moa+JUygW+gWo9m7XVe0q6y6CveMERblK4nXsgurUqH4j91uqyu6c0kccGY8Oei6opdzG49\/53IJg8YQo6TnK+plLdg1ezfanf20QwHBV1IHNYFWiTUHVO88EJuvLSAPgDdiVCOzO0KjXxjqOiq7lDw+OFbYaYyUoE1nwywhgE1TbBJdR54em\/CC4lY+14GNDTTAaN9ATWLCSPJWQnsDR799HCBZcGumWHB303Zcti4\/hKKmUW1JH59XxL4dtLup7fER05tm7vtVJ5ZCd0r1+R7QOzPIszOqZ+B2OifcYLVAelM7OGtIZbOmIWQbU11K45P16Y6GVZicmSTPSKXrvAB6nhOD0\/we\/UbqpU6iNu5ZRTgcZcxyrgU2TzWaKgfcX5ynMjk0TAqvYKYHAXMhMIUE6tEMMithQ1WkasGcv0+r6Hu8jPrc9\/Gvlf4u+4fl9knAf7JCgONAi4ds\/p6rwGAGtZbvzcAvxF7p04RcX0MY6A53z0tsFIcE46Uu\/KuxhWVyufVwlrHfIek6k8hHTspNH8bztwUJLU6gBRP9SpRrZrZIhDPII19VXNFVWdujdwcu7dcNuuoXPofulrbbHSyYaSaxK\/RdHh7yjViodnoUp3WaTNDZtzRlICXyZm73kD7qqHyR6nyqnVFG43Zd+Xcic2HJzEhSMYG6Ddlyc6AzYSCJeoDCY9M6dpPFKplBpQRL8g4LjOLHwd7BMlXqqcvjAmJpfHSlByX5KEml7a3V4jVKoIhoq1B5EvoNELDwUah8nnJjh8CKJevnuNx2NRUr\/QNzIfHTRGKCYHua70wUQX7m+lcNMc\/EG3TLqr+qyXMFjXihPxRLL+Uc9LBDbCIMh1Zpirr\/0+6U4twTr\/ipWU5SmOxf0O+OFl2NjOH7u8MwkXT1yWTS09Nfu3tLHFA0EmqJxgceNea8uegh+KFo4Fnf4oTd1wwg6c3cE8RX7okJ5ZDMzWCifUEwzdturrhnaarzbZT\/aCIAn4Epu4\/G0wgJSZL5oos889CaEJcmGkkJ6XSTd87ArxLOu143GSoSxVj6dlMGYLfcnJIjX3NJ0kHJdSROY9f6Kd0Moh\/3fupqbLxtyP9bKQKPtpfw4pT2\/Kd2nmPeBhxMIqIap4b3zKL5PzBF\/t6faSIMANeUoU9+oD1LU5FVfkoz5Icd7aW73SNLnwFxvXXUkuR\/Dkcry3vJVOeKuxV6m6L6qqplQtCiyYzTc01Zllr4e34dYU0\/QOfId3TI4Ork17iAHGGu+JY8Kud55p2Ph3NZN9nLryFzyjAsgaRY5YJnrJ0\/vs+0yS3wLYvXWIy1rhJHytZRS7AzR+TjX+GRAFAajy5zkouA7owJbn1L8UFvzlbDTLFHzhxVMI+DsTddmNqU70wOP2Goh8c3HnOLf77Sn6l6qS+eL18+ZcTm8RhXN8+tT2\/id+GLg60kgFIQggJVgQV8qKOqfSnyE4v1szSmSnGxrlZHNSzBg18XppzmNxAbNHjPiauLVGw\/qPWvm4ZGvtYv23rLsA0cdLnjnmnlCg\/oh\/8juTf3GsX5VVS7sGIFZCJh\/RRzLmwvXq2LZgBhhdD607xq7AFhuazYpVXcP6axrAWl3ikqYYGzAtesSzc\/yK9hhhvPcO+UhhkfWrlLdubzSBP60ycIhCSMG+OhG2U5XZLaSpMZghnpf8tu2uFiH6xkiFHAunxseHecrBstXQZ4jzVL3aFv3TpyQG19dgKIlukZDpSFuLZLFW\/fe5So5mNfp\/zgezEXaZz\/TIkD\/HMpm18nov2oPuIOi2HFNwSZoExvORHzRCXcfci8\/+m8VH9aF31EwiapPfFmjBWTAtcUI6s+T5Xf55d245Mi0XYQtWkqxLhIXfN0uyJBekVBNCKS7A2J0qjR5weYpAz\/mnLX7xVfIGBanizxcag1GsOS70iPp4WuVTMrwVH9RvsCP+3n3wrMFkfrtQnjMx+GWJx3v3vl4fk1o5istwlrT3R3Z630OIgn6Wsdz43OWI4MIp8sJuKqQYntU7XkmSwxerSSOOr64+u9H3WKyUxzgQ8bEqH+i8xjRajjlrYQ8iZGr85c2JEE6HB7QcxbA6IpDz0WI7WdA2WBM\/c5lGWNE+gMg7abztKO9CPnQscEvCZGr85c2JEE6HB7QcxbA6IpDz0WI7WdA2WBM\/c5lGWNE+gMg7abztKO9CPnQscEvCZGr85c2JEE6HB7QcxbA6IpDz0WI7WdA2WBM\/c5lGWNE+gMg7abztKO9CPnQscEvCZGr85c2JEE6HB7QcxbA6IpDz0WI7WdA2WBM\/c5lGWNE+gMg7abztKO9CPnQscEvCZGr85c2JEE6HB7QcxbA6IpDz0WI7WdA2WBM\/c5lGWNE+gMg7abztKO9CPnQscEvCZGr85c2JEE6HB7QcxbA6IpDz0WI7WdA2WBM\/c5lGWNE+gMg7abztKO9CPnQscEvCZGr85c2JEE6HB7QcxbA6IpDz0WI7WdA2WBM\/c5lGWNE+gMg7abztKO9CPnQscEvCZGr85c2JEE6HB7QcxbA6IpDz0WI7WdA2WBM\/c5lGWNE+gMg7abztKO9CPnQscEvCZGr85c2JEE6HB7QcxbA6IpDz0WI7WdA2WBM\/c5lGWNE+gMg7abztKO9CPnQscEvP0OhWvdMO2k9oBXJJ5MV\/g="},{"title":"Quarkus\u9879\u76ee\u914d\u7f6e\u65b9\u5f0f\u8be6\u89e3","link":"https:\/\/blog.greycode.top\/posts\/3ec6e900cdcb4bceba3b0be40c9aadbb\/","pubDate":"Mon, 12 Jul 2021 17:29:23 +0000","guid":"https:\/\/blog.greycode.top\/posts\/3ec6e900cdcb4bceba3b0be40c9aadbb\/","description":"\u914d\u7f6e\u52a0\u8f7d\u6d41\u7a0b Quarkus \u53ef\u4ee5\u4ece\u591a\u4e2a\u5730\u65b9\u83b7\u53d6\u9879\u76ee\u7684\u914d\u7f6e\uff0c\u5b83\u8bfb\u53d6\u914d\u7f6e\u4f18\u5148\u7ea7\u5165\u4e0b\u56fe\uff0c\u5728\u4e0b\u9762\u7684\u4f18\u5148\u7ea7\u4e2d\uff0c\u4e00\u65e6\u8bfb\u53d6\u5230\u67d0\u4e2a\u914d\u7f6e\uff0c\u5c31\u4e0d\u4f1a\u518d\u7ee7\u7eed\u8bfb\u53d6\u540e\u9762\u914d\u7f6e\u4e2d\u7684\u8fd9\u4e2a\u914d\u7f6e\u4e86\u3002\n0x1 System Properties \u7cfb\u7edf\u5c5e\u6027\u53ef\u4ee5\u5728\u542f\u52a8\u671f\u95f4\u901a\u8fc7 -D \u6807\u5fd7\u4f20\u9012\u7ed9\u5e94\u7528\u7a0b\u5e8f\u3002\n\u6bd4\u5982\u8981\u8bbe\u7f6e http \u670d\u52a1\u7684\u8fd0\u884c\u7aef\u53e3\uff0c\u5404\u4e2a\u8fd0\u884c\u65b9\u5f0f\u4f20\u9012\u7cfb\u7edf\u53c2\u6570\u7684\u65b9\u5f0f\u5982\u4e0b\uff1a\nQuarkus dev\u6a21\u5f0f\uff1amvn quarkus:dev -Dquarkus.http.port=8888 \u8fd0\u884c jar \u5305\uff1ajava -Dquarkus.http.port=8888 -jar quarkus-run.jar \u8fd0\u884c native-image\uff1aapp-runner -Dquarkus.http.port=8888 0x2 Environment variables \u73af\u5883\u53d8\u91cf\u7684\u540d\u5b57\u9075\u5faa MicroProfile Config\nEnvironment Variables Mapping Rules Some operating systems allow only alphabetic characters or an underscore, _, in environment variables. Other characters such as ., \/, etc may be disallowed. In order to set a value for a config property that has a name containing such disallowed characters from an environment variable, the following rules are used."},{"title":"Quarkus\u6784\u5efanative-image\u9047\u5230\u7684\u95ee\u9898\u53ca\u89e3\u51b3","link":"https:\/\/blog.greycode.top\/posts\/5756337c1cea4b599e678a3380dcfe00\/","pubDate":"Fri, 09 Jul 2021 17:44:33 +0000","guid":"https:\/\/blog.greycode.top\/posts\/5756337c1cea4b599e678a3380dcfe00\/","description":"\u672c\u673a\u6784\u5efa native-image \u5982\u679c\u4f60\u672c\u5730\u5b89\u88c5\u4e86 Graal VM \u7684\u8bdd\uff0c\u53ef\u4ee5\u5728\u9879\u76ee\u76ee\u5f55\u4e0b\u76f4\u63a5\u6267\u884c\uff1a\nmvn clean package -Pnative \u6784\u5efa\u7684\u65f6\u95f4\u6bd4\u8f83\u957f\uff0c\u6784\u5efa\u5b8c\u6210\u540e\u5c31\u4f1a\u5728 .\/target \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u4e8c\u8fdb\u5236\u6267\u884c\u6587\u4ef6\uff0c\u4e00\u822c\u540d\u5b57\u662f quarkus-demo-1.0-runner\uff0c\u76f4\u63a5\u6267\u884c\u8fd9\u4e2a\u4e8c\u8fdb\u5236\u6587\u4ef6\u5c31\u53ef\u4ee5\u8fd0\u884c\u9879\u76ee\u4e86\u3002\n\u279c target: .\/quarkus-demo-1.0-runner __ ____ __ _____ ___ __ ____ ______ --\/ __ \\\/ \/ \/ \/ _ | \/ _ \\\/ \/\/_\/ \/ \/ \/ __\/ -\/ \/_\/ \/ \/_\/ \/ __ |\/ , _\/ ,&lt; \/ \/_\/ \/\\ \\ --\\___\\_\\____\/_\/ |_\/_\/|_\/_\/|_|\\____\/___\/ 2021-07-09 16:54:10,812 INFO [io.quarkus] (main) quarkus-demo 1.0 native (powered by Quarkus 2.0.1.Final) started in 0."},{"title":"\u4f7f\u7528Maven\u5de5\u5177\u521b\u5efaQuarkus\u9879\u76ee","link":"https:\/\/blog.greycode.top\/posts\/5870388109c640649633fa0bb2f5c9c1\/","pubDate":"Fri, 09 Jul 2021 15:22:39 +0000","guid":"https:\/\/blog.greycode.top\/posts\/5870388109c640649633fa0bb2f5c9c1\/","description":"\u73af\u5883 \u6211\u8fd9\u8fb9\u4f7f\u7528\u7684\u662f Maven 3.8.1 \u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528 Quarkus \u5b98\u65b9\u63d0\u4f9b\u7684 io.quarkus:quarkus-maven-plugin:2.0.1.Final \u63d2\u4ef6\u6765\u5feb\u901f\u7a7f\u4ef6 Quarkus \u9879\u76ee\u3002\n\u521b\u5efa\u9879\u76ee \u4f7f\u7528\u4ee5\u4e0b Maven \u547d\u4ee4\u6765\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee\uff1a\nmvn io.quarkus:quarkus-maven-plugin:2.0.1.Final:create \\ -DprojectGroupId=top.mjava \\ -DprojectArtifactId=quarkus-demo \\ -DprojectVersion=1.0 \\ -DclassName=&#34;top.mjava.demo.Application&#34; \u5728\u6267\u884c\u547d\u4ee4\u7684\u5f53\u524d\u76ee\u5f55\u4e0b\u4f1a\u4e3a\u9879\u76ee\u751f\u6210\u548c ArtifactId \u540c\u540d\u7684\u6587\u4ef6\u5939\uff0c\u5982\u679c\u5df2\u5b58\u5728\u8be5\u540c\u540d\u6587\u4ef6\u5939\uff0c\u5219\u9879\u76ee\u4f1a\u521b\u5efa\u5931\u8d25\u3002\n\u5728 src\/main\/docker \u76ee\u5f55\u4e0b\u8fd8\u751f\u6210\u4e86 native \u548c jvm \u6a21\u5f0f\u7684 Dockerfile\uff0c\u6784\u5efa\u955c\u50cf\u548c\u8fd0\u884c\u5bb9\u5668\u7684\u6307\u4ee4\u5199\u5728\u8fd9\u4e9b Dockerfile \u4e2d\u3002\n\u547d\u4ee4\u63cf\u8ff0 \u5c5e\u6027 \u9ed8\u8ba4\u503c \u63cf\u8ff0 projectGroupId org.acme.sample \u9879\u76ee\u7684 GroupId projectArtifactId \u6ca1\u6709\u9ed8\u8ba4\u503c\uff0c\u4f46\u662f\u5fc5\u586b \u9879\u76ee\u7684 ArtifactId projectVersion 1.0.0-SNAPSHOT \u9879\u76ee\u7248\u672c platformGroupId io.quarkus \u76ee\u6807\u5e73\u53f0\u7684\u7ec4 ID\u3002\u9274\u4e8e\u6240\u6709\u73b0\u6709\u5e73\u53f0\u90fd\u6765\u81ea io.quarkus\uff0c\u5b9e\u9645\u4e0a\u4e0d\u4f1a\u660e\u786e\u4f7f\u7528\u8fd9\u4e00\u5e73\u53f0\u3002\u4f46\u5b83\u4ecd\u7136\u662f\u4e00\u4e2a\u9009\u62e9\u3002 platformArtifactId quarkus-universe-bom \u76ee\u6807\u5e73\u53f0 BOM \u7684\u5de5\u4ef6 ID\u3002\u4e3a\u4e86\u4f7f\u7528\u672c\u5730\u6784\u5efa\u7684 Quarkus\uff0c\u5b83\u5e94\u8be5\u662f quarkus-bom\u3002 platformVersion \u5982\u679c\u672a\u6307\u5b9a\uff0c\u5c06\u89e3\u6790\u6700\u65b0\u7684\u3002 \u60a8\u5e0c\u671b\u9879\u76ee\u4f7f\u7528\u7684\u5e73\u53f0\u7248\u672c\u3002\u5b83\u8fd8\u53ef\u4ee5\u63a5\u53d7\u7248\u672c\u8303\u56f4\uff0c\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5c06\u4f7f\u7528\u6307\u5b9a\u8303\u56f4\u4e2d\u7684\u6700\u65b0\u7248\u672c\u3002 className \u5982\u679c\u7701\u7565\u5219\u4e0d\u521b\u5efa \u751f\u6210\u7684\u8d44\u6e90\u7684\u5b8c\u5168\u9650\u5b9a\u540d\u79f0 path \/hello \u8d44\u6e90\u8def\u5f84\uff0c\u4ec5\u5728\u8bbe\u7f6e\u4e86 className \u65f6\u751f\u6548\u3002 extensions [] \u8981\u6dfb\u52a0\u5230\u9879\u76ee\u7684\u6269\u5c55\u5217\u8868\uff08\u9017\u53f7\u5206\u9694\uff09 \u7ba1\u7406\u6269\u5c55 \u521b\u5efa\u9879\u76ee\u540e\u5c31\u53ef\u4ee5\u8fdb\u5165\u5230\u9879\u76ee\u6587\u4ef6\u5939\uff0c\u53ef\u4ee5\u4f7f\u7528\u7b80\u77ed\u7684\u547d\u4ee4\u6765\u64cd\u4f5c\u9879\u76ee\u4e86\uff0c\u4f8b\u5982\uff1amvn quarkus:[command]"},{"title":"\u5f00\u53d1SaaS\u5e94\u7528\u768412\u6761\u51c6\u5219\u3010\u8f6c\u3011","link":"https:\/\/blog.greycode.top\/posts\/ffc3580d7e244b5282e3fdd7f3eb8e95\/","pubDate":"Wed, 07 Jul 2021 17:33:40 +0000","guid":"https:\/\/blog.greycode.top\/posts\/ffc3580d7e244b5282e3fdd7f3eb8e95\/","description":"\u5f00\u53d1SaaS\u5e94\u7528\u768412\u6761\u51c6\u5219\u3010\u8f6c\u3011 \u539f\u6587\u5730\u5740\uff1ahttps:\/\/12factor.net\/\n\u7b80\u4ecb \u5982\u4eca\uff0c\u8f6f\u4ef6\u901a\u5e38\u4f1a\u4f5c\u4e3a\u4e00\u79cd\u670d\u52a1\u6765\u4ea4\u4ed8\uff0c\u5b83\u4eec\u88ab\u79f0\u4e3a\u7f51\u7edc\u5e94\u7528\u7a0b\u5e8f\uff0c\u6216\u8f6f\u4ef6\u5373\u670d\u52a1\uff08SaaS\uff09\u300212-Factor \u4e3a\u6784\u5efa\u5982\u4e0b\u7684 SaaS \u5e94\u7528\u63d0\u4f9b\u4e86\u65b9\u6cd5\u8bba\uff1a\n\u4f7f\u7528\u6807\u51c6\u5316\u6d41\u7a0b\u81ea\u52a8\u914d\u7f6e\uff0c\u4ece\u800c\u4f7f\u65b0\u7684\u5f00\u53d1\u8005\u82b1\u8d39\u6700\u5c11\u7684\u5b66\u4e60\u6210\u672c\u52a0\u5165\u8fd9\u4e2a\u9879\u76ee\u3002 \u548c\u64cd\u4f5c\u7cfb\u7edf\u4e4b\u95f4\u5c3d\u53ef\u80fd\u7684\u5212\u6e05\u754c\u9650\uff0c\u5728\u5404\u4e2a\u7cfb\u7edf\u4e2d\u63d0\u4f9b\u6700\u5927\u7684\u53ef\u79fb\u690d\u6027\u3002 \u9002\u5408\u90e8\u7f72\u5728\u73b0\u4ee3\u7684\u4e91\u8ba1\u7b97\u5e73\u53f0\uff0c\u4ece\u800c\u5728\u670d\u52a1\u5668\u548c\u7cfb\u7edf\u7ba1\u7406\u65b9\u9762\u8282\u7701\u8d44\u6e90\u3002 \u5c06\u5f00\u53d1\u73af\u5883\u548c\u751f\u4ea7\u73af\u5883\u7684\u5dee\u5f02\u964d\u81f3\u6700\u4f4e\uff0c\u5e76\u4f7f\u7528\u6301\u7eed\u4ea4\u4ed8\u5b9e\u65bd\u654f\u6377\u5f00\u53d1\u3002 \u53ef\u4ee5\u5728\u5de5\u5177\u3001\u67b6\u6784\u548c\u5f00\u53d1\u6d41\u7a0b\u4e0d\u53d1\u751f\u660e\u663e\u53d8\u5316\u7684\u524d\u63d0\u4e0b\u5b9e\u73b0\u6269\u5c55\u3002 \u8fd9\u5957\u7406\u8bba\u9002\u7528\u4e8e\u4efb\u610f\u8bed\u8a00\u548c\u540e\u7aef\u670d\u52a1\uff08\u6570\u636e\u5e93\u3001\u6d88\u606f\u961f\u5217\u3001\u7f13\u5b58\u7b49\uff09\u5f00\u53d1\u7684\u5e94\u7528\u7a0b\u5e8f\u3002\n\u80cc\u666f \u672c\u6587\u7684\u8d21\u732e\u8005\u53c2\u4e0e\u8fc7\u6570\u4ee5\u767e\u8ba1\u7684\u5e94\u7528\u7a0b\u5e8f\u7684\u5f00\u53d1\u548c\u90e8\u7f72\uff0c\u5e76\u901a\u8fc7 Heroku \u5e73\u53f0\u95f4\u63a5\u89c1\u8bc1\u4e86\u6570\u5341\u4e07\u5e94\u7528\u7a0b\u5e8f\u7684\u5f00\u53d1\uff0c\u8fd0\u4f5c\u4ee5\u53ca\u6269\u5c55\u7684\u8fc7\u7a0b\u3002\n\u672c\u6587\u7efc\u5408\u4e86\u6211\u4eec\u5173\u4e8e SaaS \u5e94\u7528\u51e0\u4e4e\u6240\u6709\u7684\u7ecf\u9a8c\u548c\u667a\u6167\uff0c\u662f\u5f00\u53d1\u6b64\u7c7b\u5e94\u7528\u7684\u7406\u60f3\u5b9e\u8df5\u6807\u51c6\uff0c\u5e76\u7279\u522b\u5173\u6ce8\u4e8e\u5e94\u7528\u7a0b\u5e8f\u5982\u4f55\u4fdd\u6301\u826f\u6027\u6210\u957f\uff0c\u5f00\u53d1\u8005\u4e4b\u95f4\u5982\u4f55\u8fdb\u884c\u6709\u6548\u7684\u4ee3\u7801\u534f\u4f5c\uff0c\u4ee5\u53ca\u5982\u4f55 \u907f\u514d\u8f6f\u4ef6\u6c61\u67d3 \u3002\n\u6211\u4eec\u7684\u521d\u8877\u662f\u5206\u4eab\u5728\u73b0\u4ee3\u8f6f\u4ef6\u5f00\u53d1\u8fc7\u7a0b\u4e2d\u53d1\u73b0\u7684\u4e00\u4e9b\u7cfb\u7edf\u6027\u95ee\u9898\uff0c\u5e76\u52a0\u6df1\u5bf9\u8fd9\u4e9b\u95ee\u9898\u7684\u8ba4\u8bc6\u3002\u6211\u4eec\u63d0\u4f9b\u4e86\u8ba8\u8bba\u8fd9\u4e9b\u95ee\u9898\u65f6\u6240\u9700\u7684\u5171\u4eab\u8bcd\u6c47\uff0c\u540c\u65f6\u4f7f\u7528\u76f8\u5173\u672f\u8bed\u7ed9\u51fa\u4e00\u5957\u9488\u5bf9\u8fd9\u4e9b\u95ee\u9898\u7684\u5e7f\u4e49\u89e3\u51b3\u65b9\u6848\u3002\u672c\u6587\u683c\u5f0f\u7684\u7075\u611f\u6765\u81ea\u4e8e Martin Fowler \u7684\u4e66\u7c4d\uff1a Patterns of Enterprise Application Architecture \uff0c Refactoring \u3002\n\u8bfb\u8005\u5e94\u8be5\u662f\u54ea\u4e9b\u4eba\uff1f \u4efb\u4f55 SaaS \u5e94\u7528\u7684\u5f00\u53d1\u4eba\u5458\u3002\u90e8\u7f72\u548c\u7ba1\u7406\u6b64\u7c7b\u5e94\u7528\u7684\u8fd0\u7ef4\u5de5\u7a0b\u5e08\u3002\nI. \u57fa\u51c6\u4ee3\u7801 \u4e00\u4efd\u57fa\u51c6\u4ee3\u7801\uff08Codebase\uff09\uff0c\u591a\u4efd\u90e8\u7f72\uff08deploy\uff09\n12-Factor\u5e94\u7528(\u8bd1\u8005\u6ce8\uff1a\u5e94\u8be5\u662f\u8bf4\u4e00\u4e2a\u4f7f\u7528\u672c\u6587\u6982\u5ff5\u6765\u8bbe\u8ba1\u7684\u5e94\u7528\uff0c\u4e0b\u540c)\u901a\u5e38\u4f1a\u4f7f\u7528\u7248\u672c\u63a7\u5236\u7cfb\u7edf\u52a0\u4ee5\u7ba1\u7406\uff0c\u5982Git, Mercurial, Subversion\u3002\u4e00\u4efd\u7528\u6765\u8ddf\u8e2a\u4ee3\u7801\u6240\u6709\u4fee\u8ba2\u7248\u672c\u7684\u6570\u636e\u5e93\u88ab\u79f0\u4f5c \u4ee3\u7801\u5e93\uff08code repository, code repo, repo\uff09\u3002\n\u5728\u7c7b\u4f3c SVN \u8fd9\u6837\u7684\u96c6\u4e2d\u5f0f\u7248\u672c\u63a7\u5236\u7cfb\u7edf\u4e2d\uff0c\u57fa\u51c6\u4ee3\u7801 \u5c31\u662f\u6307\u63a7\u5236\u7cfb\u7edf\u4e2d\u7684\u8fd9\u4e00\u4efd\u4ee3\u7801\u5e93\uff1b\u800c\u5728 Git \u90a3\u6837\u7684\u5206\u5e03\u5f0f\u7248\u672c\u63a7\u5236\u7cfb\u7edf\u4e2d\uff0c\u57fa\u51c6\u4ee3\u7801 \u5219\u662f\u6307\u6700\u4e0a\u6e38\u7684\u90a3\u4efd\u4ee3\u7801\u5e93\u3002\n\u57fa\u51c6\u4ee3\u7801\u548c\u5e94\u7528\u4e4b\u95f4\u603b\u662f\u4fdd\u6301\u4e00\u4e00\u5bf9\u5e94\u7684\u5173\u7cfb\uff1a\n\u4e00\u65e6\u6709\u591a\u4e2a\u57fa\u51c6\u4ee3\u7801\uff0c\u5c31\u4e0d\u80fd\u79f0\u4e3a\u4e00\u4e2a\u5e94\u7528\uff0c\u800c\u662f\u4e00\u4e2a\u5206\u5e03\u5f0f\u7cfb\u7edf\u3002\u5206\u5e03\u5f0f\u7cfb\u7edf\u4e2d\u7684\u6bcf\u4e00\u4e2a\u7ec4\u4ef6\u90fd\u662f\u4e00\u4e2a\u5e94\u7528\uff0c\u6bcf\u4e00\u4e2a\u5e94\u7528\u53ef\u4ee5\u5206\u522b\u4f7f\u7528 12-Factor \u8fdb\u884c\u5f00\u53d1\u3002 \u591a\u4e2a\u5e94\u7528\u5171\u4eab\u4e00\u4efd\u57fa\u51c6\u4ee3\u7801\u662f\u6709\u6096\u4e8e 12-Factor \u539f\u5219\u7684\u3002\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u5171\u4eab\u7684\u4ee3\u7801\u62c6\u5206\u4e3a\u72ec\u7acb\u7684\u7c7b\u5e93\uff0c\u7136\u540e\u4f7f\u7528 \u4f9d\u8d56\u7ba1\u7406 \u7b56\u7565\u53bb\u52a0\u8f7d\u5b83\u4eec\u3002 \u5c3d\u7ba1\u6bcf\u4e2a\u5e94\u7528\u53ea\u5bf9\u5e94\u4e00\u4efd\u57fa\u51c6\u4ee3\u7801\uff0c\u4f46\u53ef\u4ee5\u540c\u65f6\u5b58\u5728\u591a\u4efd\u90e8\u7f72\u3002\u6bcf\u4efd \u90e8\u7f72 \u76f8\u5f53\u4e8e\u8fd0\u884c\u4e86\u4e00\u4e2a\u5e94\u7528\u7684\u5b9e\u4f8b\u3002\u901a\u5e38\u4f1a\u6709\u4e00\u4e2a\u751f\u4ea7\u73af\u5883\uff0c\u4e00\u4e2a\u6216\u591a\u4e2a\u9884\u53d1\u5e03\u73af\u5883\u3002\u6b64\u5916\uff0c\u6bcf\u4e2a\u5f00\u53d1\u4eba\u5458\u90fd\u4f1a\u5728\u81ea\u5df1\u672c\u5730\u73af\u5883\u8fd0\u884c\u4e00\u4e2a\u5e94\u7528\u5b9e\u4f8b\uff0c\u8fd9\u4e9b\u90fd\u76f8\u5f53\u4e8e\u4e00\u4efd\u90e8\u7f72\u3002\n\u6240\u6709\u90e8\u7f72\u7684\u57fa\u51c6\u4ee3\u7801\u76f8\u540c\uff0c\u4f46\u6bcf\u4efd\u90e8\u7f72\u53ef\u4ee5\u4f7f\u7528\u5176\u4e0d\u540c\u7684\u7248\u672c\u3002\u6bd4\u5982\uff0c\u5f00\u53d1\u4eba\u5458\u53ef\u80fd\u6709\u4e00\u4e9b\u63d0\u4ea4\u8fd8\u6ca1\u6709\u540c\u6b65\u81f3\u9884\u53d1\u5e03\u73af\u5883\uff1b\u9884\u53d1\u5e03\u73af\u5883\u4e5f\u6709\u4e00\u4e9b\u63d0\u4ea4\u6ca1\u6709\u540c\u6b65\u81f3\u751f\u4ea7\u73af\u5883\u3002\u4f46\u5b83\u4eec\u90fd\u5171\u4eab\u4e00\u4efd\u57fa\u51c6\u4ee3\u7801\uff0c\u6211\u4eec\u5c31\u8ba4\u4e3a\u5b83\u4eec\u53ea\u662f\u76f8\u540c\u5e94\u7528\u7684\u4e0d\u540c\u90e8\u7f72\u800c\u5df2\u3002\nII. \u4f9d\u8d56 \u663e\u5f0f\u58f0\u660e\u4f9d\u8d56\u5173\u7cfb\uff08 dependency \uff09"},{"title":"vertx\u7684web\u5f00\u53d1\u5b66\u4e60\u7b14\u8bb0","link":"https:\/\/blog.greycode.top\/posts\/10ef2e95447c468cb55bd7bd0675c090\/","pubDate":"Mon, 05 Jul 2021 15:31:02 +0000","guid":"https:\/\/blog.greycode.top\/posts\/10ef2e95447c468cb55bd7bd0675c090\/","description":"\u521b\u5efa\u4e00\u4e2a Http \u670d\u52a1 \/\/ \u521b\u5efa\u8def\u7531 Router router = Router.router(vertx); \/\/ \u521b\u5efa Http \u670d\u52a1 vertx.createHttpServer() \/\/ \u7ed1\u5b9a\u8def\u7531 .requestHandler(router) \/\/ \u76d1\u542c\u7aef\u53e3 .listen(8888) \/\/ Http \u670d\u52a1\u542f\u52a8\u6210\u529f\u540e\u8c03\u7528 .onSuccess(server -&gt; System.out.println(&#34;HTTP server started on port &#34; + server.actualPort()) ); Router \u4f7f\u7528 \u76f4\u63a5\u4f7f\u7528\u4e0a\u9762\u7684\u8def\u7531\u5b9e\u4f8b\n\u521b\u5efa\u8bf7\u6c42\u8def\u7531 \u521b\u5efa Get \u8bf7\u6c42\u8def\u7531\nrouter .get(&#34;\/test&#34;) .respond( \/\/ \u54cd\u5e94\u903b\u8f91 ) \/\/ \u6216\u8005 router .route(HttpMethod.GET, &#34;\/test&#34;) .respond( \/\/ \u54cd\u5e94\u903b\u8f91 ) \u521b\u5efa Post \u8bf7\u6c42\u8def\u7531\nrouter .post(&#34;\/test&#34;) .respond( \/\/ \u54cd\u5e94\u903b\u8f91 ) \/\/ \u6216\u8005 router .post(HttpMethod.POST, &#34;\/test&#34;) ."},{"title":"Java\u5220\u9664\u6587\u4ef6\u540e\u7535\u8111\u78c1\u76d8\u7a7a\u95f4\u6ca1\u6709\u6062\u590d","link":"https:\/\/blog.greycode.top\/posts\/74caaafd610241a1b8ecdb5f3bb33ee4\/","pubDate":"Sat, 03 Jul 2021 17:12:41 +0000","guid":"https:\/\/blog.greycode.top\/posts\/74caaafd610241a1b8ecdb5f3bb33ee4\/","description":"\u95ee\u9898 \u5f53\u7528\u4e00\u4e0b\u547d\u4ee4\u5220\u9664\u6587\u4ef6\u540e\uff0c\u7535\u8111\u78c1\u76d8\u5185\u5b58\u6ca1\u6709\u6062\u590d\uff0c\u8fd8\u662f\u539f\u6765\u7684\u5927\u5c0f\nFile folder = new File(&#34;\/tmp\/file.mp4&#34;) file.delete(); \u89e3\u51b3 \u539f\u6765\u662f FileOutputStream \u6587\u4ef6\u6d41\u5fd8\u4e86\u5173\u4e86\uff0c\u5bfc\u81f4\u4e00\u76f4\u5360\u7528\u8fd9\u4e2a\u8d44\u6e90\u3002\u6240\u4ee5\u4f7f\u7528\u5b8c\u540e\u4e00\u5b9a\u8bb0\u5f97\u5173\u6587\u4ef6\u6d41\uff0c\u4f7f\u7528\u4e0b\u9762\u7684\u4ee3\u7801\u5173\u95ed\u6587\u4ef6\u6d41\uff1a\nFileOutputStream fileOutputStream = new FileOutputStream(new File()); fileOutputStream.close(); Linux \u91cc\u7684\u6587\u4ef6\u88ab\u5220\u9664\u540e\uff0c\u7a7a\u95f4\u6ca1\u6709\u88ab\u91ca\u653e\u662f\u56e0\u4e3a\u5728 Linux \u7cfb\u7edf\u4e2d\uff0c\u901a\u8fc7 rm \u6216\u8005\u6587\u4ef6\u7ba1\u7406\u5668\u5220\u9664\u6587\u4ef6\u5c06\u4f1a\u4ece\u6587\u4ef6\u7cfb\u7edf\u7684\u76ee\u5f55\u7ed3\u6784\u4e0a\u89e3\u9664\u94fe\u63a5(unlink).\u7136\u800c\u5982\u679c\u6587\u4ef6\u662f\u88ab\u6253\u5f00\u7684(\u6709\u4e00\u4e2a\u8fdb\u7a0b\u6b63\u5728\u4f7f\u7528)\uff0c\u90a3\u4e48\u8fdb\u7a0b\u5c06\u4ecd\u7136\u53ef\u4ee5\u8bfb\u53d6\u8be5\u6587\u4ef6\uff0c\u78c1\u76d8\u7a7a\u95f4\u4e5f\u4e00\u76f4\u88ab\u5360\u7528\u3002\n\u53ef\u4ee5\u4f7f\u7528 lsof +L1 |grep delete \u547d\u4ee4\u6765\u67e5\u770b\u72b6\u6001\u4e3a deleted \u7684\u6587\u4ef6\uff0c\u72b6\u6001\u4e3a deleted \u4e3a\u6807\u8bb0\u88ab\u5220\u9664\uff0c\u5176\u5b9e\u8be5\u6587\u4ef6\u5e76\u6ca1\u6709\u4ece\u78c1\u76d8\u4e2d\u5220\u9664\uff0c\u7c7b\u4f3cwindows\u4e0b\u7684\u56de\u6536\u7ad9\u72b6\u6001\u3002\n\u6240\u4ee5\u5f53\u8fdb\u7a0b\u7ed3\u675f\u540e\uff0c\u78c1\u76d8\u7a7a\u95f4\u5c31\u4f1a\u88ab\u91ca\u653e\u3002\n\u53c2\u8003\u8d44\u6599 http:\/\/www.cxyzjd.com\/article\/su4416160\/78212934 https:\/\/www.jianshu.com\/p\/fcb80c878d04"},{"title":"\u7a0b\u5e8f\u5458\u7684\u9152\u540e\u771f\u8a00","link":"https:\/\/blog.greycode.top\/posts\/a98d5ec3509f483e80919ca2e09bda1b\/","pubDate":"Tue, 29 Jun 2021 11:24:25 +0000","guid":"https:\/\/blog.greycode.top\/posts\/a98d5ec3509f483e80919ca2e09bda1b\/","description":"\u8f6c\u81f3\uff1ahttp:\/\/www.ruanyifeng.com\/blog\/2021\/06\/drunk-post-of-a-programmer.html\n\u51fa\u81f3\uff1ahttps:\/\/old.reddit.com\/r\/ExperiencedDevs\/comments\/nmodyl\/drunk_post_things_ive_learned_as_a_sr_engineer\/\n(1) \u804c\u4e1a\u53d1\u5c55\u7684\u6700\u597d\u65b9\u6cd5\u662f\u6362\u516c\u53f8\u3002\n(2\uff09\u6280\u672f\u6808\u4e0d\u91cd\u8981\u3002\u6280\u672f\u9886\u57df\u6709\u5927\u7ea6 10-20 \u6761\u6838\u5fc3\u539f\u5219\uff0c\u91cd\u8981\u7684\u662f\u8fd9\u4e9b\u539f\u5219\uff0c\u6280\u672f\u6808\u53ea\u662f\u843d\u5b9e\u5b83\u4eec\u7684\u65b9\u6cd5\u3002\u4f60\u5982\u679c\u4e0d\u719f\u6089\u67d0\u4e2a\u6280\u672f\u6808\uff0c\u4e0d\u9700\u8981\u8fc7\u5ea6\u62c5\u5fc3\u3002\n(3\uff09\u5de5\u4f5c\u548c\u4eba\u9645\u5173\u7cfb\u662f\u4e24\u56de\u4e8b\u3002\u6709\u4e00\u4e9b\u516c\u53f8\uff0c\u6211\u4ea4\u5230\u4e86\u597d\u670b\u53cb\uff0c\u4f46\u662f\u5de5\u4f5c\u5f97\u5e76\u4e0d\u5f00\u5fc3\uff1b\u53e6\u4e00\u4e9b\u516c\u53f8\uff0c\u6211\u6ca1\u6709\u4e0e\u4efb\u4f55\u540c\u4e8b\u5efa\u7acb\u53cb\u8c0a\uff0c\u4f46\u662f\u5de5\u4f5c\u5f97\u5f88\u5f00\u5fc3\u3002\n(4\uff09\u6211\u603b\u662f\u5bf9\u7ecf\u7406\u5b9e\u8bdd\u5b9e\u8bf4\u3002\u6015\u4ec0\u4e48\uff1f\u4ed6\u5f00\u9664\u6211\uff1f\u6211\u4f1a\u5728\u4e24\u5468\u5185\u627e\u5230\u4e00\u4efd\u65b0\u5de5\u4f5c\u3002\n(5\uff09\u5982\u679c\u4e00\u5bb6\u516c\u53f8\u7684\u5de5\u7a0b\u5e08\u8d85\u8fc7 100 \u4eba\uff0c\u5b83\u7684\u671f\u6743\u53ef\u80fd\u5728\u672a\u6765\u5341\u5e74\u5185\u53d8\u5f97\u5f88\u6709\u4ef7\u503c\u3002\u5bf9\u4e8e\u5de5\u7a0b\u5e08\u4eba\u6570\u5f88\u5c11\u7684\u516c\u53f8\uff0c\u671f\u6743\u4e00\u822c\u90fd\u662f\u6beb\u65e0\u4ef7\u503c\u3002\n(6\uff09\u597d\u7684\u4ee3\u7801\u662f\u521d\u7ea7\u5de5\u7a0b\u5e08\u53ef\u4ee5\u7406\u89e3\u7684\u4ee3\u7801\u3002\u4f1f\u5927\u7684\u4ee3\u7801\u53ef\u4ee5\u88ab\u7b2c\u4e00\u5e74\u7684 CS \u4e13\u4e1a\u7684\u65b0\u751f\u7406\u89e3\u3002\n(7\uff09\u4f5c\u4e3a\u4e00\u540d\u5de5\u7a0b\u5e08\uff0c\u6700\u88ab\u4f4e\u4f30\u7684\u6280\u80fd\u662f\u8bb0\u5f55\u3002\u8bf4\u771f\u7684\uff0c\u5982\u679c\u6709\u4eba\u53ef\u4ee5\u6559\u6211\u600e\u4e48\u5199\u6587\u6863\uff0c\u6211\u4f1a\u4ed8\u94b1\uff0c\u4e5f\u8bb8\u662f 1000 \u7f8e\u5143\u3002\n(8\uff09\u7f51\u4e0a\u7684\u53e3\u6c34\u6218\uff0c\u51e0\u4e4e\u90fd\u65e0\u5173\u7d27\u8981\uff0c\u522b\u53bb\u53c2\u4e0e\u3002\n(9\uff09\u5982\u679c\u6211\u53d1\u73b0\u81ea\u5df1\u662f\u516c\u53f8\u91cc\u9762\u6700\u5389\u5bb3\u7684\u5de5\u7a0b\u5e08\uff0c\u90a3\u5c31\u8be5\u79bb\u5f00\u4e86\u3002\n(10\uff09\u6211\u4eec\u5e94\u8be5\u96c7\u4f63\u66f4\u591a\u7684\u5b9e\u4e60\u751f\uff0c\u4ed6\u4eec\u5f88\u68d2\u3002\u90a3\u4e9b\u7cbe\u529b\u5145\u6c9b\u7684\u5c0f\u5bb6\u4f19\u7528\u4ed6\u4eec\u7684\u60f3\u6cd5\u4e71\u641e\u3002\u5982\u679c\u4ed6\u4eec\u516c\u5f00\u8d28\u7591\u6216\u6279\u8bc4\u67d0\u4e8b\uff0c\u90a3\u5c31\u66f4\u597d\u4e86\u3002\u6211\u559c\u6b22\u5b9e\u4e60\u751f\u3002\n(11\uff09\u6280\u672f\u6808\u5f88\u91cd\u8981\u3002\u5982\u679c\u4f60\u4f7f\u7528 Python \u6216 C++ \u8bed\u8a00\uff0c\u5c31\u4f1a\u5fcd\u4e0d\u4f4f\u60f3\u505a\u4e00\u4e9b\u975e\u5e38\u4e0d\u540c\u7684\u4e8b\u60c5\u3002\u56e0\u4e3a\u67d0\u4e9b\u5de5\u5177\u786e\u5b9e\u64c5\u957f\u67d0\u4e9b\u5de5\u4f5c\u3002\n(12\uff09\u5982\u679c\u4f60\u4e0d\u786e\u5b9a\u81ea\u5df1\u60f3\u505a\u4ec0\u4e48\u4e1c\u897f\uff0c\u8bf7\u4f7f\u7528 Java\u3002\u8fd9\u662f\u4e00\u79cd\u7cdf\u7cd5\u7684\u7f16\u7a0b\u8bed\u8a00\uff0c\u4f46\u51e0\u4e4e\u65e0\u6240\u4e0d\u80fd\u3002\n(13\uff09\u5bf9\u4e8e\u521d\u5b66\u8005\u6765\u8bf4\uff0c\u6700\u8d5a\u94b1\u7684\u7f16\u7a0b\u8bed\u8a00\u662f SQL\uff0c\u5e72\u7ffb\u6240\u6709\u5176\u4ed6\u8bed\u8a00\u3002\u4f60\u53ea\u4e86\u89e3 SQL \u800c\u4e0d\u4f1a\u505a\u5176\u4ed6\u4e8b\u60c5\uff0c\u7167\u6837\u8d5a\u94b1\u3002\u4eba\u529b\u8d44\u6e90\u4e13\u5bb6\u7684\u5e74\u85aa\uff1f\u4e5f\u8bb85\u4e07\u7f8e\u5143\u3002\u61c2 SQL \u7684\u4eba\u529b\u8d44\u6e90\u4e13\u5bb6\uff1f9\u4e07\u7f8e\u5143\u3002\n(14\uff09\u6d4b\u8bd5\u5f88\u91cd\u8981\uff0c\u4f46 TDD \uff08\u6d4b\u8bd5\u9a71\u52a8\u7684\u5f00\u53d1\uff09\u51e0\u4e4e\u53d8\u6210\u4e86\u4e00\u4e2a\u90aa\u6559\u3002\n(15\uff09 \u653f\u5e9c\u5355\u4f4d\u5f88\u8f7b\u677e\uff0c\u4f46\u5e76\u4e0d\u50cf\u4eba\u4eec\u8bf4\u7684\u90a3\u6837\u597d\u3002\u5bf9\u4e8e\u804c\u4e1a\u751f\u6daf\u65e9\u671f\u5230\u4e2d\u671f\u7684\u5de5\u7a0b\u5e08\uff0c12 \u4e07\u7f8e\u5143\u7684\u5e74\u85aa + \u5404\u79cd\u798f\u5229 + \u517b\u8001\u91d1\u542c\u8d77\u6765\u4e0d\u9519\uff0c\u4f46\u662f\u4f60\u5c06\u88ab\u7981\u9522\u5728\u6df1\u5965\u7684\u4e13\u7528\u5de5\u5177\u91cc\u9762\uff0c\u79bb\u5f00\u653f\u5e9c\u5355\u4f4d\u4ee5\u540e\uff0c\u8fd9\u4e9b\u77e5\u8bc6\u5c31\u6ca1\u7528\u4e86\u3002\u6211\u975e\u5e38\u5c0a\u91cd\u653f\u5e9c\u5de5\u4f5c\u4eba\u5458\uff0c\u4f46\u8bf4\u771f\u7684\uff0c\u8fd9\u4e9b\u5730\u65b9\u7684\u5de5\u7a0b\u5e08\uff0c\u5e74\u9f84\u4e2d\u4f4d\u6570\u5728 50 \u5c81\u4ee5\u4e0a\u662f\u6709\u539f\u56e0\u7684\u3002\n(16\uff09\u518d\u5012\u4e00\u676f\u9152\u3002\n(17\uff09\u5927\u591a\u6570\u5934\u8854\u90fd\u65e0\u5173\u7d27\u8981\uff0c\u968f\u4fbf\u4ec0\u4e48\u516c\u53f8\u90fd\u53ef\u4ee5\u6709\u9996\u5e2d\u5de5\u7a0b\u5e08\u3002\n(18\uff09\u624b\u8155\u548c\u80cc\u90e8\u7684\u5065\u5eb7\u95ee\u9898\u53ef\u4e0d\u662f\u5f00\u73a9\u7b11\u7684\uff0c\u597d\u7684\u8bbe\u5907\u503c\u5f97\u82b1\u94b1\u3002\n(19\uff09\u5f53\u4e00\u4e2a\u8f6f\u4ef6\u5de5\u7a0b\u5e08\uff0c\u6700\u597d\u7684\u4e8b\u60c5\u662f\u4ec0\u4e48\uff1f\u4f60\u53ef\u4ee5\u7ed3\u8bc6\u5f88\u591a\u60f3\u6cd5\u76f8\u540c\u7684\u4eba\uff0c\u5927\u5bb6\u4e92\u76f8\u4ea4\u6d41\uff0c\u4e0d\u4e00\u5b9a\u6709\u76f8\u540c\u7684\u5174\u8da3\uff0c\u4f46\u662f\u5bf9\u65b9\u4f1a\u7528\u8ddf\u4f60\u76f8\u540c\u7684\u65b9\u5f0f\u601d\u8003\u95ee\u9898\uff0c\u8fd9\u5f88\u9177\u3002\n(20\uff09\u6709\u4e9b\u6280\u672f\u592a\u6d41\u884c\uff0c\u6211\u4e0d\u5f97\u4e0d\u7528\u5b83\u3002\u6211\u5fc3\u91cc\u5c31\u4f1a\u5f88\u8ba8\u538c\u8fd9\u79cd\u6280\u672f\uff0c\u4f46\u4f1a\u628a\u5b83\u63a8\u8350\u7ed9\u5ba2\u6237\uff0c\u6bd4\u5982\u6211\u6068 Jenkins\uff0c\u4f46\u628a\u5b83\u63a8\u8350\u7ed9\u65b0\u5ba2\u6237\uff0c\u6211\u4e0d\u89c9\u5f97\u505a\u9519\u4e86\u3002\n(21\uff09\u6210\u4e3a\u4e00\u540d\u4f18\u79c0\u7684\u5de5\u7a0b\u5e08\u610f\u5473\u7740\u4e86\u89e3\u6700\u4f73\u5b9e\u8df5\uff0c\u6210\u4e3a\u9ad8\u7ea7\u5de5\u7a0b\u5e08\u610f\u5473\u7740\u77e5\u9053\u4f55\u65f6\u6253\u7834\u6700\u4f73\u5b9e\u8df5\u3002\n(22\uff09\u53d1\u751f\u4e8b\u6545\u65f6\uff0c\u5982\u679c\u5468\u56f4\u7684\u4eba\u8bd5\u56fe\u5c06\u8d23\u4efb\u5f52\u548e\u4e8e\u5916\u90e8\u9519\u8bef\u6216\u5e95\u5c42\u670d\u52a1\u4e2d\u65ad\uff0c\u90a3\u4e48\u662f\u65f6\u5019\u79bb\u5f00\u8fd9\u5bb6\u516c\u53f8\uff0c\u7ee7\u7eed\u524d\u8fdb\u4e86\u3002\n(23\uff09\u6211\u9047\u5230\u7684\u6700\u597d\u7684\u9886\u5bfc\uff0c\u540c\u610f\u6211\u7684\u4e00\u90e8\u5206\u89c2\u70b9\uff0c\u540c\u65f6\u8010\u5fc3\u8ddf\u6211\u89e3\u91ca\uff0c\u4e3a\u4ec0\u4e48\u4e0d\u540c\u610f\u6211\u7684\u53e6\u4e00\u90e8\u5206\u89c2\u70b9\u3002\u6211\u6b63\u5728\u52aa\u529b\u6210\u4e3a\u50cf\u4ed6\u4eec\u4e00\u6837\u7684\u4eba\u3002\n(24\uff09\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u786e\u5b9e\u91cd\u8981\uff0c\u4f46\u4e0d\u5e94\u8be5\u65e0\u9650\u5938\u5927\uff0c\u5c24\u5176\u662f\u9762\u8bd5\u7684\u65f6\u5019\u3002\u6211\u6ca1\u89c1\u8fc7\u836f\u5242\u5e08\u9762\u8bd5\u65f6\uff0c\u8fd8\u8981\u6d4b\u8bd5\u6709\u673a\u5316\u5b66\u7684\u7ec6\u8282\u3002\u8fd9\u4e2a\u884c\u4e1a\u7684\u9762\u8bd5\u8fc7\u7a0b\u6709\u65f6\u5019\u5f88\u7cdf\u7cd5\u3002\n(25\uff09\u505a\u81ea\u5df1\u559c\u6b22\u7684\u4e8b\u60c5\u5e76\u4e0d\u91cd\u8981\uff0c\u4e0d\u8981\u8ba9\u6211\u505a\u8ba8\u538c\u7684\u4e8b\u60c5\u66f4\u91cd\u8981\u3002\n(26\uff09\u8d8a\u63a5\u8fd1\u4ea7\u54c1\uff0c\u5c31\u8d8a\u63a5\u8fd1\u63a8\u52a8\u6536\u5165\u589e\u957f\u3002\u65e0\u8bba\u5de5\u4f5c\u7684\u6280\u672f\u6027\u5982\u4f55\uff0c\u53ea\u8981\u5b83\u63a5\u8fd1\u4ea7\u54c1\uff0c\u6211\u90fd\u611f\u5230\u8d8a\u6709\u4ef7\u503c\u3002\n(27\uff09\u5373\u4f7f\u6211\u5e73\u65f6\u7528 Windows \u5de5\u4f5c\uff0cLinux \u4e5f\u5f88\u91cd\u8981\u3002\u4e3a\u4ec0\u4e48\uff1f\u56e0\u4e3a\u670d\u52a1\u5668\u662f Linux \u7cfb\u7edf\uff0c\u4f60\u6700\u7ec8\u5728 Linux \u7cfb\u7edf\u4e0a\u5de5\u4f5c\u3002\n(28\uff09\u4eba\u6b7b\u4e86\u4ee5\u540e\uff0c\u4f60\u60f3\u8ba9\u4ee3\u7801\u6210\u4e3a\u4f60\u7684\u9057\u4ea7\u5417\uff1f\u5982\u679c\u662f\u90a3\u6837\uff0c\u5c31\u82b1\u5f88\u591a\u65f6\u95f4\u5728\u4ee3\u7801\u4e0a\u9762\u5427\uff0c\u56e0\u4e3a\u90a3\u662f\u4f60\u7684\u9057\u4ea7\u3002\u4f46\u662f\uff0c\u5982\u679c\u4f60\u50cf\u6211\u4e00\u6837\uff0c\u66f4\u770b\u91cd\u4e0e\u5bb6\u4eba\u3001\u670b\u53cb\u548c\u751f\u6d3b\u4e2d\u5176\u4ed6\u4eba\u76f8\u5904\u7684\u65f6\u5149\uff0c\u800c\u4e0d\u662f\u5199\u7684\u4ee3\u7801\uff0c\u90a3\u5c31\u522b\u5bf9\u5b83\u592a\u5728\u610f\u3002\n(29\uff09\u6211\u6323\u7684\u94b1\u8fd8\u4e0d\u9519\uff0c\u5bf9\u6b64\u5fc3\u5b58\u611f\u6fc0\uff0c\u4f46\u8fd8\u662f\u9700\u8981\u7701\u94b1\u3002\n(30\uff09\u7cdf\u7cd5\uff0c\u6211\u6ca1\u9152\u4e86\u3002"},{"title":"\u514d\u8d39\u5168\u81ea\u52a8SEO\u4f18\u5316","link":"https:\/\/blog.greycode.top\/posts\/21324399fbdc41cba815d2069bb62168\/","pubDate":"Sun, 20 Jun 2021 22:27:32 +0000","guid":"https:\/\/blog.greycode.top\/posts\/21324399fbdc41cba815d2069bb62168\/","description":"0x1 \u7b80\u4ecb \u600e\u4e48\u8ba9\u5404\u5927\u7ad9\u957f\u5feb\u901f\u6536\u5f55\u4f60\u81ea\u5df1\u7f51\u7ad9\u7684\u94fe\u63a5\uff1f\u90a3\u5c31\u662f\u4e3b\u52a8\u7684\u63a8\u9001\u4f60\u81ea\u5df1\u7f51\u7ad9\u7684 URL \u5230\u5404\u5927\u7ad9\u957f\u4e0a\u53bb\u3002\u524d\u51e0\u5929\u6211\u5199\u4e86\u4e00\u4e2a\u4e00\u952e\u63d0\u4ea4\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u4e00\u952e\u63d0\u4ea4\u4f60\u7684\u94fe\u63a5\u5230\u5404\u5927\u7ad9\u957f\u4e0a\u53bb\u3002\u4f60\u4e5f\u53ef\u4ee5\u5355\u72ec\u4f7f\u7528\u5de5\u5177\u6765\u63a8\u9001\u4f60\u7684 URL\u3001\u6279\u91cf URL \u6587\u4ef6\u3001SiteMap \u7ad9\u70b9\u5730\u56fe\u3002\u5de5\u5177\u7684github\u5730\u5740\u662f\uff1ahttps:\/\/github.com\/greycodee\/seo-tools\n\u4eca\u5929\u6211\u518d\u6559\u5927\u5bb6\u5982\u4f55\u8ba9\u7f51\u7ad9\u81ea\u52a8\u63d0\u4ea4\u6700\u65b0\u7684 URL \u5230\u5404\u5927\u7ad9\u957f\u4e0a\u53bb\uff0c\u8ba9\u5404\u5927\u7ad9\u957f\u7b2c\u4e00\u65f6\u95f4\u6536\u5f55\u4f60\u7684\u94fe\u63a5\u3002\n0x2 \u51c6\u5907 \u5728\u5f00\u59cb\u524d\uff0c\u4f60\u9700\u8981\u51c6\u5907\u5982\u4e0b\u4e1c\u897f\uff1a\nIFTTT \u8d26\u53f7\nGithub \u8d26\u53f7\n\u4f60\u4e2a\u4eba\u7f51\u7ad9\u5f00\u901a RSS \u8ba2\u9605\n\u5177\u4f53\u539f\u7406\u5c31\u662f\u901a\u8fc7 IFTTT \u8ba2\u9605\u4f60\u7f51\u7ad9\u7684 RSS\uff0c\u7136\u540e\u5f53\u6709\u65b0\u7684\u7f51\u5740\u53d1\u5e03\u540e\uff0cIFTTT \u4f1a\u89e6\u53d1\u4e8b\u4ef6\u56de\u8c03 Github\uff0cGithub \u6536\u5230\u56de\u8c03\u540e Github Action \u4f1a\u8fdb\u884c\u8fd0\u8f6c\uff0c\u7136\u540e\u5728\u91cc\u9762\u4f7f\u7528\u5de5\u5177\u8fdb\u884c\u63a8\u9001\u3002"},{"title":"\u767e\u5ea6\u3001\u8c37\u6b4c\u3001\u5fc5\u5e94\u4e09\u5927\u7ad9\u957fAPI\u5bc6\u94a5\u7533\u8bf7\u6d41\u7a0b","link":"https:\/\/blog.greycode.top\/posts\/c334612cbdce41e79f7ea6a2f3f4c10c\/","pubDate":"Thu, 17 Jun 2021 21:40:11 +0000","guid":"https:\/\/blog.greycode.top\/posts\/c334612cbdce41e79f7ea6a2f3f4c10c\/","description":"Google \u7d22\u5f15 API \u5f00\u901a\u6b65\u9aa4 \u70b9\u51fb\u6b64\u94fe\u63a5\uff0c\u7136\u540e\u9009\u62e9\u521b\u5efa\u9879\u76ee\uff0c\u70b9\u51fb\u7ee7\u7eed\u3002\u7136\u540e\u518d\u70b9\u51fb\u8f6c\u5230\u201c\u51ed\u636e\u201d\u9875\u9762\n\u5230\u51ed\u636e\u9875\u9762\u5148\u70b9\u51fb\u5de6\u4fa7\u7684\u51ed\u636e\u9009\u9879\uff0c\u7136\u540e\u518d\u70b9\u51fb\u7ba1\u7406\u670d\u52a1\u8d26\u53f7\n\u7136\u540e\u518d\u70b9\u51fb\u521b\u5efa\u670d\u52a1\u8d26\u53f7\n\u7136\u540e\u518d\u586b\u5199\u76f8\u5173\u4fe1\u606f\uff0c\u6700\u540e\u70b9\u51fb\u5b8c\u6210\uff08\u7b2c\u4e09\u6b65\u53ef\u4e0d\u586b\uff09\n\u70b9\u51fb\u56fe\u4e2d\u7684\u7535\u5b50\u90ae\u4ef6\uff0c\u7136\u540e\u5f00\u59cb\u521b\u5efa\u5bc6\u94a5\uff0c\u9009\u62e9JSON\u683c\u5f0f\uff0c\u6b64\u65f6\u5c31\u4f1a\u4e0b\u8f7d\u5bc6\u94a5\u6587\u4ef6\u5230\u4f60\u7535\u8111\u4e86\n\u6253\u5f00 Google Search Console\uff0c\u4f9d\u6b21\u70b9\u51fb\u8bbe\u7f6e-&gt;\u7528\u6237\u548c\u6743\u9650-&gt;\u62e5\u6709\u8005\u8d26\u6237\u53f3\u8fb9\u4e09\u4e2a\u70b9-&gt;\u7ba1\u7406\u8d44\u6e90\u6240\u6709\u8005-&gt;\u6dfb\u52a0\u6240\u6709\u8005-&gt;\u586b\u5165\u4e0a\u9762\u5bc6\u94a5\u4e2d\u7684client_email \u7684\u503c\n\u73b0\u5728\u53ef\u4ee5\u7528\u4f5c\u4e3a\u670d\u52a1\u5e10\u53f7\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\u7684\u6b65\u9aa4\u6765\u4f7f\u7528\u5bc6\u94a5\u4e86\nBing \u7d22\u5f15 API \u5f00\u901a\u6b65\u9aa4 \u70b9\u51fb\u5bfc\u822a\u680f\u7684\u9f7f\u8f6e\u56fe\u6807\n\u70b9\u51fb API \u8bbf\u95ee\uff0c\u7136\u540e\u70b9\u51fb API \u5bc6\u94a5\uff0c\u5c31\u53ef\u4ee5\u5f97\u5230 API \u5bc6\u94a5\u4e86\n\u7136\u540e\u5c31\u53ef\u4ee5\u6309\u7167\u5fc5\u5e94\u6587\u6863\u6765\u8fdb\u884cAPI\u7684\u8c03\u7528\u4e86\nBaidu \u7d22\u5f15 API \u5f00\u901a\u6b65\u9aa4 \u767e\u5ea6\u5c31\u6bd4\u8f83\u7b80\u5355\u7c97\u66b4\u4e86\uff0c\u76f4\u63a5\u70b9\u51fb\u8fd9\u4e2a\u94fe\u63a5\u5c31\u53ef\u4ee5\u76f4\u63a5\u5f97\u5230 Token \u4e86\uff0c\u8fd9\u4e2a\u9875\u9762\u4e0b\u4e5f\u6709\u5bf9\u5e94\u7684 API \u8c03\u7528\u65b9\u6cd5\u793a\u4f8b\uff0c\u8fd9\u8fb9\u5c31\u4e0d\u518d\u91cd\u590d\u53d9\u8ff0\u4e86"},{"title":"\u540e\u7aef\u670d\u52a1\u5668\u65f6\u95f4\u4e0d\u4e00\u81f4\u95ee\u9898\u89e3\u51b3\u624b\u518c","link":"https:\/\/blog.greycode.top\/posts\/9afc3efaec15479bb5fbc6f670594a94\/","pubDate":"Tue, 15 Jun 2021 10:32:50 +0000","guid":"https:\/\/blog.greycode.top\/posts\/9afc3efaec15479bb5fbc6f670594a94\/","description":"\u65f6\u533a\u95ee\u9898 \u4e00\u822c\u5feb 8 \u5c0f\u65f6\uff0c\u6162 8 \u5c0f\u65f6\u7684\u95ee\u9898\u90fd\u662f\u65f6\u533a\u95ee\u9898\uff0c\u76f4\u63a5\u628a\u65f6\u533a\u6539\u6210 CST \u65f6\u533a\n\u7f16\u8f91\u7cfb\u7edf\u73af\u5883\u53d8\u91cf\u6587\u4ef6 \/etc\/profile\nexport TZ=&#39;CST-8&#39; Linux \u7cfb\u7edf\u65f6\u95f4\u4e0d\u540c\u6b65\u95ee\u9898 Linux \u7cfb\u7edf\u65f6\u95f4\u6bd4\u6b63\u5e38\u65f6\u95f4\u5feb\u51e0\u5206\u4e2d\u6216\u6162\u51e0\u5206\u949f\uff0c\u4f46\u662f\u65f6\u533a\u662f\u6b63\u786e\u7684 CST \u65f6\u533a\uff0c\u8fd9\u662f\u5c31\u8981\u7528\u5230 ntpdate \u8fd9\u4e2a\u547d\u4ee4\u4e86\n\u5b89\u88c5 #centos,redhat\u7cfb\u5217 yum install ntpdate #debian,ubuntu\u7cfb\u5217 apt install ntpdate #archlinux\u7cfb\u5217 pacman -S ntpdate 2\u3001\u901a\u8fc7ntpdate\u547d\u4ee4\u4ece\u65f6\u949f\u670d\u52a1\u5668\u540c\u6b65\n\u6211\u4eec\u8fd9\u91cc\u9009\u7528\u4e2d\u56fdntp\u670d\u52a1\u5668cn.pool.ntp.org\u6765\u4f5c\u4e3a\u65f6\u949f\u540c\u6b65\u7684\u6765\u6e90\u3002\u4e3a\u80fd\u6b63\u5e38\u8bbf\u95ee\u5230cn.pool.ntp.org\uff0c\u4f60\u7684Linux\u7cfb\u7edf\u5e94\u8be5\u80fd\u8bbf\u95ee\u5916\u7f51\u624d\u884c\u3002\n\u6267\u884c\u547d\u4ee4\u5982\u4e0b\uff1a\nntpdate cn.pool.ntp.org 3\u3001\u914d\u7f6ecrontab\u81ea\u52a8\u6267\u884c\u540c\u6b65\n\u5982\u679c\u6bcf\u6b21\u624b\u52a8\u6267\u884c\uff0c\u663e\u7136\u662f\u5f88\u9ebb\u70e6\u7684\u3002\u8fd9\u91cc\uff0c\u6211\u4eec\u4f7f\u7528crontab\u5b9a\u65f6\u4efb\u52a1\u6765\u5b9a\u671f\u6267\u884cntpdate\u540c\u6b65\u547d\u4ee4\uff0c\u4f8b\u5982\u6211\u4eec\u6bcf10\u5206\u949f\u6216\u4e00\u5c0f\u65f6\u6267\u884c\u4e00\u6b21\uff0c\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u65b9\u5f0f\u5b9e\u73b0\u3002\n\u9996\u5148\u5728\u547d\u4ee4\u7ec8\u7aef\u4e2d\u8f93\u5165crontab -e\u547d\u4ee4\uff0c\u7136\u540e\u8f93\u5165\u5982\u4e0b\u547d\u4ee4\u4fdd\u5b58\u5373\u53ef\u3002\ncrontab -e \u5f00\u59cb\u7f16\u8f91\u6587\u4ef6\u5185\u5bb9\uff0c\u8f93\u5165\u5b9a\u65f6\u6267\u884c\u547d\u4ee4\uff1a\n#\u6bcf10\u5206\u949f\u6267\u884c\u4e00\u6b21 *\/10 * * * * \/usr\/sbin\/ntpdate cn.pool.ntp.org \u6216\u8005\n#\u6bcf\u4e00\u4e2a\u5c0f\u65f6\u6267\u884c\u4e00\u6b21 0 * * * * \/usr\/sbin\/ntpdate cn.pool.ntp.org \u53c2\u8003\u8d44\u6599 https:\/\/linux265.com\/news\/6009.html"},{"title":"\u7528Darabonba\u4e00\u952e\u751f\u62107\u79cd\u8bed\u8a00\u7684\u4ee3\u7801","link":"https:\/\/blog.greycode.top\/posts\/0d992236ec6b4e5ead15886d992ff84b\/","pubDate":"Sat, 05 Jun 2021 18:08:19 +0000","guid":"https:\/\/blog.greycode.top\/posts\/0d992236ec6b4e5ead15886d992ff84b\/","description":"0x1 \u4ecb\u7ecd \u6700\u8fd1\u5728\u770b\u963f\u91cc\u7684SDK\u7684\u65f6\u5019\uff0c\u7a81\u7136\u770b\u5230\u4e86\u4e00\u4e2a\u597d\u73a9\u7684\u4e1c\u897f\uff0c\u8fd9\u73a9\u610f\u53eb Darabonba\u3002\u662f\u4e00\u79cd OpenAPI \u5e94\u7528\u7684\u9886\u57df\u7279\u5b9a\u8bed\u8a00\u3002\u53ef\u4ee5\u5229\u7528\u5b83\u4e3a\u4efb\u610f\u98ce\u683c\u7684\u63a5\u53e3\u751f\u6210\u591a\u8bed\u8a00\u7684 SDK\u3001\u4ee3\u7801\u793a\u4f8b\u3001\u6d4b\u8bd5\u7528\u4f8b\u3001\u63a5\u53e3\u7f16\u6392\u7b49\u3002\u73b0\u5728\u963f\u91cc\u4e91\u7684\u591a\u8bed\u8a00 SDK \u5c31\u662f\u7528\u8fd9\u4e2a\u751f\u6210\u7684\u3002\u4e0b\u9762\u662f\u5b98\u65b9\u7684\u4ecb\u7ecd\u6d41\u7a0b\u56fe\u3002\n0x2 \u5b89\u88c5 \u6211\u4eec\u6309\u7167\u5b98\u65b9\u7684\u6b65\u9aa4\u6765\u5b89\u88c5\u5b83\uff0c\u56e0\u4e3a\u662f\u7528 Nodejs \u5199\u7684\uff0c\u6240\u4ee5\u53ef\u4ee5\u7528 npm \u6765\u5b89\u88c5\u5b83\nsudo npm install -g @darabonba\/cli \u5b89\u88c5\u5b8c\u6210\u540e\u53ef\u4ee5\u5728\u7ec8\u7aef\u8f93\u5165 dara \uff0c\u5982\u679c\u8f93\u51fa\u7248\u672c\u53f7\u5c31\u662f\u8bf4\u660e\u5b89\u88c5\u6210\u529f\u4e86\n\u279c dara The CLI for Darabonba 1.1.8 0x3 \u4f7f\u7528 \u5b89\u88c5\u5b8c\u6210\u540e\u5c31\u53ef\u4ee5\u4f7f\u7528\u4e86\uff0c\u9996\u5148\u521b\u5efa\u4e00\u4e2a\u6587\u4ef6\u5939\u6765\u5b58\u653e\u8fd9\u4e2a\u9879\u76ee\nmkdir demo &amp;&amp; cd demo \u7136\u540e\u7528 dara \u547d\u4ee4\u6765\u8fdb\u884c\u521d\u59cb\u5316\u6a21\u5757\uff0c\u7136\u540e\u4f9d\u6b21\u8f93\u5165\u5305\u540d\u7b49\u4fe1\u606f\u3002\n\u279c dara init package scope: demo package name: demo package version: 1.0.0 main entry: .\/demo.dara \u521d\u59cb\u5316\u5b8c\u6210\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5728 demo.dara \u6587\u4ef6\u91cc\u8fdb\u884c Darabonba DSL \u8868\u8fbe\u5f0f\u7684\u7f16\u5199\u91cc\n\u6bd4\u5982\u6211\u4eec\u7f16\u5199\u4e00\u4e2a\u7ecf\u5178\u7684\u8f93\u51fa hello world\uff01\n\u7f16\u5199 Darabonba DSL \u8868\u8fbe\u5f0f \u5728 demo."},{"title":"\u4ec0\u4e48\u662fHTTP\u534f\u8bae\uff1f","link":"https:\/\/blog.greycode.top\/posts\/0143cd7666cd44389fe6f565e10eee1a\/","pubDate":"Fri, 04 Jun 2021 11:44:00 +0000","guid":"https:\/\/blog.greycode.top\/posts\/0143cd7666cd44389fe6f565e10eee1a\/","description":"\u7248\u672c\u4ecb\u7ecd HTTP \u534f\u8bae\u4e0d\u7528\u6211\u591a\u8bf4\u4e86\u5427\uff0c\u5927\u5bb6\u90fd\u77e5\u9053\uff0c\u73b0\u5728\u6211 web \u5f00\u53d1\u4e00\u822c\u90fd\u662f\u4f7f\u7528 HTTP \u534f\u8bae\u6765\u8fdb\u884c\u901a\u4fe1\u7684\u3002\u5230\u76ee\u524d\u4e3a\u6b62\uff0cHTTP \u8fdb\u884c\u4e86\u51e0\u6b21\u7248\u672c\u66f4\u65b0\uff0cHTTP 1.1 \u5c31\u662f\u8868\u793aHTTP \u7684 1.1 \u7248\u672c\u30021.1 \u7248\u672c\u4e5f\u662f\u76ee\u524d\u5927\u90e8\u5206\u7f51\u7ad9\u6240\u7528\u7684\u7248\u672c\u3002\nHTTP 0.9 \u53d1\u5e03\u65f6\u95f4\uff1a1991 \u5e74 \u7b80\u4ecb\uff1a\u68a6\u5f00\u59cb\u7684\u5730\u65b9\uff0c\u53ea\u63a5\u53d7GET\u4e00\u79cd\u8bf7\u6c42\u65b9\u6cd5\uff0c\u6ca1\u6709\u5728\u901a\u8baf\u4e2d\u6307\u5b9a\u7248\u672c\u53f7\uff0c\u4e14\u4e0d\u652f\u6301\u8bf7\u6c42\u5934\u3002\u7531\u4e8e\u8be5\u7248\u672c\u4e0d\u652f\u6301POST\u65b9\u6cd5\uff0c\u56e0\u6b64\u5ba2\u6237\u7aef\u65e0\u6cd5\u5411\u670d\u52a1\u5668\u4f20\u9012\u592a\u591a\u4fe1\u606f\u3002 HTTP 1.0 \u53d1\u5e03\u65f6\u95f4\uff1a1996 \u5e74 5 \u6708 \u7b80\u4ecb\uff1a\u8fd9\u662f\u7b2c\u4e00\u4e2a\u5728\u901a\u8baf\u4e2d\u6307\u5b9a\u7248\u672c\u53f7\u7684HTTP\u534f\u8bae\u7248\u672c\u3002\u540c\u65f6\u6bd4 0.9 \u7248\u672c\u589e\u52a0\u5927\u91cf\u65b0\u7279\u6027\u3002\u975e\u6301\u7eed\u8fde\u63a5\uff0c\u6bcf\u6b21\u90fd\u8981\u91cd\u65b0\u4e0e\u670d\u52a1\u5668\u5efa\u7acb\u8fde\u63a5\u3002 HTTP 1.1 \u53d1\u5e03\u65f6\u95f4\uff1a1997 \u5e741\u6708 \u7b80\u4ecb\uff1a\u9ed8\u8ba4\u91c7\u7528\u6301\u7eed\u8fde\u63a5\uff08Connection: keep-alive\uff09\uff0c\u80fd\u5f88\u597d\u5730\u914d\u5408\u4ee3\u7406\u670d\u52a1\u5668\u5de5\u4f5c\u3002\u8fd8\u652f\u6301\u4ee5\u7ba1\u9053\u65b9\u5f0f\u5728\u540c\u65f6\u53d1\u9001\u591a\u4e2a\u8bf7\u6c42\uff0c\u4ee5\u4fbf\u964d\u4f4e\u7ebf\u8def\u8d1f\u8f7d\uff0c\u63d0\u9ad8\u4f20\u8f93\u901f\u5ea6\u3002\u540c\u65f6\u8fd9\u4e5f\u662f\u76ee\u524d\u6700\u6d41\u884c\u7684\u7248\u672c\u3002 HTTP\/1.1\u76f8\u8f83\u4e8eHTTP\/1.0\u534f\u8bae\u7684\u533a\u522b\u4e3b\u8981\u4f53\u73b0\u5728\uff1a\n\u7f13\u5b58\u5904\u7406 \u5e26\u5bbd\u4f18\u5316\u53ca\u7f51\u7edc\u8fde\u63a5\u7684\u4f7f\u7528 \u9519\u8bef\u901a\u77e5\u7684\u7ba1\u7406 \u6d88\u606f\u5728\u7f51\u7edc\u4e2d\u7684\u53d1\u9001 \u4e92\u8054\u7f51\u5730\u5740\u7684\u7ef4\u62a4 \u5b89\u5168\u6027\u53ca\u5b8c\u6574\u6027 HTTP 2.0 \u53d1\u5e03\u65f6\u95f4\uff1a2015 \u5e74 5 \u6708 \u7b80\u4ecb\uff1aHTTP\/2 \u662f HTTP \u534f\u8bae\u81ea 1999 \u5e74 HTTP 1.1 \u7684\u6539\u8fdb\u7248 RFC 2616 \u53d1\u5e03\u540e\u7684\u9996\u4e2a\u66f4\u65b0\uff0c\u4e3b\u8981\u57fa\u4e8e SPDY \u534f\u8bae\u3002\u5b83\u7531\u4e92\u8054\u7f51\u5de5\u7a0b\u4efb\u52a1\u7ec4\uff08IETF\uff09\u7684Hypertext Transfer Protocol Bis\uff08httpbis\uff09\u5de5\u4f5c\u5c0f\u7ec4\u8fdb\u884c\u5f00\u53d1\u3002\u8be5\u7ec4\u7ec7\u4e8e 2014 \u5e74 12 \u6708\u5c06 HTTP\/2 \u6807\u51c6\u63d0\u8bae\u9012\u4ea4\u81f3 IESG \u8fdb\u884c\u8ba8\u8bba\uff0c\u4e8e 2015 \u5e74 2 \u6708 17 \u65e5\u88ab\u6279\u51c6\u3002 \u62a5\u6587\u683c\u5f0f \u8bf7\u6c42\u62a5\u6587 \u8bf7\u6c42\u62a5\u6587\u5206\u4e3a 4 \u4e2a\u90e8\u5206\uff0c\u5206\u522b\u662f\u8bf7\u6c42\u884c\u3001\u8bf7\u6c42\u5934\u3001\u6362\u884c\u884c\u3001\u8bf7\u6c42\u6570\u636e\uff0c\u6bcf\u4e2a\u90e8\u5206\u7684\u672b\u5c3e\u90fd\u4f1a\u5e26\u4e0a\u56de\u8f66\u7b26\uff08CR\uff0cASCII\uff1a0d\uff09\u548c\u6362\u884c\u7b26\uff08LF\uff0cASCII\uff1a0a\uff09"},{"title":"\u4f7f\u7528Nacos\u5b9e\u73b0\u7f51\u5173\u52a8\u6001\u8def\u7531","link":"https:\/\/blog.greycode.top\/posts\/eef92888390b4e7c866fe7ada6a0b42b\/","pubDate":"Sat, 08 May 2021 22:47:54 +0000","guid":"https:\/\/blog.greycode.top\/posts\/eef92888390b4e7c866fe7ada6a0b42b\/","description":"\u80cc\u666f \u7f51\u5173\u4f5c\u4e3a\u4e00\u4e2a\u4e3b\u8981\u7684\u5916\u90e8\u6d41\u91cf\u5165\u53e3\uff0c\u5176\u91cd\u542f\u7684\u6b21\u6570\u5f53\u7136\u662f\u8d8a\u5c11\u8d8a\u597d\uff0c\u6240\u4ee5\u4e0d\u80fd\u6709\u65f6\u5019\u4e3a\u4e86\u4fee\u6539\u4e00\u4e2a\u8def\u7531\u5c31\u91cd\u542f\u6574\u4e2a\u7f51\u5173\u670d\u52a1\uff0c\u8fd9\u6837\u7684\u8bdd\u7f51\u5173\u5c31\u4e0d\u662f\u4e00\u4e2a\u9ad8\u53ef\u7528\u7684\u7f51\u5173\u3002\u5f53\u7136\uff0c\u6709\u65f6\u5019\u8981\u65b0\u589e\u6216\u4fee\u6539\u4ee3\u7801\u5c42\u9762\u7684\u81ea\u5b9a\u4e49\u7684\u8fc7\u6ee4\u5668\u65f6\u8fd8\u662f\u8981\u91cd\u542f\u7f51\u5173\u7684\uff0c\u6240\u4ee5\u6211\u4eec\u80fd\u505a\u7684\u5c31\u662f\u5c3d\u53ef\u80fd\u51cf\u5c11\u4e0d\u5fc5\u8981\u7684\u91cd\u542f\u3002\u8fd9\u91cc\u5c31\u53ef\u4ee5\u5f15\u5165\u963f\u91cc\u5df4\u5df4\u5f00\u6e90\u7684 Nacos \u4e86\u3002\n\u4ec0\u4e48\u662f Nacos\uff1f Naocs \u662f\u963f\u91cc\u5df4\u5df4\u5f00\u6e90\u7684\u4e00\u6b3e\u5fae\u670d\u52a1\u7ec4\u4ef6\uff0c\u5b83\u63d0\u4f9b\u6ce8\u518c\u4e2d\u5fc3\u548c\u914d\u7f6e\u4e2d\u5fc3\u6765\u4f9b\u6211\u4eec\u4f7f\u7528\u3002\u5e76\u4e14 Nacos \u540c\u65f6\u652f\u6301 AP \u6a21\u5f0f\u548c CP \u6a21\u5f0f\u6765\u4f9b\u6211\u4eec\u9009\u62e9\u4f7f\u7528\u3002\u5177\u4f53\u53ef\u4ee5\u67e5\u770b\u5b98\u65b9\u6587\u6863\u6765\u8fdb\u4e00\u6b65\u4e86\u89e3\u3002\n\u5b89\u88c5 Nacos \u672c\u5730\u7684\u8bdd\u6211\u8fd9\u8fb9\u5efa\u8bae\u76f4\u63a5\u7528 Docker \u6765\u5b89\u88c5Nacos\uff0c\u7701\u5fc3\u7701\u529b\u3002\u6309\u7167\u5b98\u65b9\u63d0\u4f9b\u7684\u65b9\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4e0b\u8f7d\u5b98\u65b9\u63d0\u4f9b\u7684 docker-compose \u6587\u4ef6\u6765\u542f\u52a8 Nacos\u3002\n# \u514b\u9686\u9879\u76ee git clone https:\/\/github.com\/nacos-group\/nacos-docker.git ## \u8fdb\u5165\u9879\u76ee\u76ee\u5f55 \u7136\u540e\u542f\u52a8 cd nacos-docker docker-compose -f example\/standalone-mysql-5.7.yaml up \u6211\u8fd9\u8fb9\u662f\u542f\u52a8\u4e86\u4e00\u4e2a\u4f7f\u7528 MySQL 5.7 \u7684\u5355\u673a Nacos\uff0c\u5982\u679c\u4f60\u60f3\u4f7f\u7528\u5176\u4ed6\u7684\u6570\u636e\u5e93\u6216\u8005\u542f\u52a8\u96c6\u7fa4\u7684\u8bdd\u53ef\u4ee5\u53c2\u7167\u4e00\u4e0b\u5b98\u65b9\u6587\u6863\n\u5f85\u542f\u52a8\u5b8c\u6210\u540e\uff0c\u5c31\u53ef\u4ee5\u7528\u6d4f\u89c8\u5668\u6253\u5f00 http:\/\/localhost:8848\/nacos \u8fdb\u5165 Nacos\u7684\u7ba1\u7406\u53f0\u4e86\u3002\u9ed8\u8ba4\u7684\u767b\u9646\u8d26\u53f7\u5bc6\u7801\u90fd\u662f nacos\n\u7f51\u5173\u4f7f\u7528 Nacos \u6211\u8fd9\u8fb9 Spring Cloud \u4f7f\u7528\u7684\u7248\u672c\u53f7\u662f 2020.0.2\nNacos \u521b\u5efa\u914d\u7f6e \u5728\u5f00\u59cb\u914d\u7f6e\u7f51\u5173\u9879\u76ee\u524d\uff0c\u6211\u4eec\u5148\u5728 Nacos \u91cc\u521b\u5efa\u4e00\u4e2a\u914d\u7f6e\uff0c\u7b49\u4e0b\u7f51\u5173\u542f\u52a8\u7684\u65f6\u5019\u5c31\u7528\u8fd9\u4e2a\u914d\u7f6e\u3002\nserver: port: 8989 spring: cloud: gateway: routes: - id: route-demo uri: https:\/\/baidu.com predicates: - Path=\/** \u5728\u4e0a\u9762\u914d\u7f6e\u4e2d\uff0c\u6211\u4eec\u5b9a\u4e49\u4e86\u9879\u76ee\u542f\u52a8\u7aef\u53e3\u4e3a 8989\uff0c\u7136\u540e\u521b\u5efa\u4e86\u4e00\u4e2a\u8def\u7531\uff0c\u8fd9\u4e2a\u8def\u7531\u63a5\u6536\u6240\u6709\u8bf7\u6c42\uff0c\u7136\u540e\u8f6c\u53d1\u5230\u767e\u5ea6\u3002"},{"title":"Dubbo\u9879\u76ee\u53cc\u6ce8\u518c\u4e2d\u5fc3","link":"https:\/\/blog.greycode.top\/posts\/c2e28aa517aa45768b679d93f248b5de\/","pubDate":"Fri, 07 May 2021 13:29:00 +0000","guid":"https:\/\/blog.greycode.top\/posts\/c2e28aa517aa45768b679d93f248b5de\/","description":"\ud83e\udd14\u4e3a\u4ec0\u4e48\u8981\u53cc\u6ce8\u518c\u4e2d\u5fc3\uff1f \u5f53\u524d Dubbo \u7248\u672c\u6ce8\u518c\u7c92\u5ea6\u662f\u4ee5\u63a5\u53e3\u7c92\u5ea6\u6765\u6ce8\u518c\u7684\uff0c\u800c SpringBoot \u662f\u4ee5\u670d\u52a1\u4e3a\u7c92\u5ea6\u6765\u6ce8\u518c\u7684\u3002\u800c\u4e14 Dubbo \u6709\u81ea\u5df1\u7684\u6ce8\u518c\u4e2d\u5fc3\uff08\u5f53\u7136 Spring Cloud Alibaba Dubbo \u7684\u6ce8\u518c\u4e2d\u5fc3\u53ef\u4ee5\u6302\u9760\u5728 Spring \u4e0a\uff09\u3002\u6240\u4ee5\u5f53\u4e00\u4e2a\u9879\u76ee\u65e2\u8981\u8c03\u7528 Dubbo \u670d\u52a1\uff0c\u53c8\u8981\u63d0\u4f9b\u81ea\u5df1\u7684 Web \u63a5\u53e3\u7ed9\u7f51\u5173\u8c03\u7528\u65f6\uff0c\u5c31\u8981\u4e3a\u8be5\u9879\u76ee\u8bbe\u7f6e\u4e24\u4e2a\u6ce8\u518c\u4e2d\u5fc3\uff0c\u4e00\u4e2a Dubbo\uff0c\u4e00\u4e2a SpringBoot\u7684\uff08\u5f53\u7136\u53ef\u4ee5\u6ce8\u518c\u5230\u540c\u4e00\u4e2a\u6ce8\u518c\u4e2d\u5fc3\u4e0a\uff09\u3002\n\ud83d\udee0\ufe0f\u521b\u5efa\u4e00\u4e2a Dubbo \u670d\u52a1\u63d0\u4f9b\u8005 \u6211\u4eec\u5148\u521b\u5efa\u4e00\u4e2a Dubbo \u670d\u52a1\u63d0\u4f9b\u8005\uff0c\u7136\u540e\u628a\u5b83\u6ce8\u518c\u5230 Zoookeeper \u4e0a\u3002\u6211\u8fd9\u8fb9\u7528\u5230\u662f 2.7.10 \u7248\u672c\u5230 Dubbo\uff0c\u4e0d\u540c Dubbo \u7248\u672c\u5230\u914d\u7f6e\u6709\u6240\u5dee\u5f02\u5316\u3002\npom \u4f9d\u8d56\uff1a\n&lt;dependency&gt; &lt;groupId&gt;org.apache.dubbo&lt;\/groupId&gt; &lt;artifactId&gt;dubbo-spring-boot-starter&lt;\/artifactId&gt; &lt;version&gt;2.7.10&lt;\/version&gt; &lt;\/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.apache.dubbo&lt;\/groupId&gt; &lt;artifactId&gt;dubbo-dependencies-zookeeper&lt;\/artifactId&gt; &lt;version&gt;2.7.10&lt;\/version&gt; &lt;type&gt;pom&lt;\/type&gt; &lt;\/dependency&gt; \u7136\u540e\u6211\u4eec\u5b9a\u4e49\u4e00\u4e2a\u63a5\u53e3\uff0c\u8fd4\u56de\u4e00\u4e9b\u6587\u5b57\uff0c\u8bb0\u5f97\u52a0\u4e0a @DubboService \u6ce8\u89e3\uff0c\u8ba9 Dubbo \u5e94\u7528\u53d1\u73b0\u8fd9\u4e2a\u63a5\u53e3\u5e76\u6ce8\u518c\u5230\u6ce8\u518c Zookeeper \u4e0a\u3002\u540c\u65f6\u5728\u542f\u52a8\u7c7b\u4e0a\u9762\u8fd8\u8981\u52a0\u4e0a @EnableDubbo \u6ce8\u89e3\u3002\u5f53\u7136\u4f60\u4e5f\u53ef\u4ee5\u7528\u914d\u7f6e\u5230\u65b9\u5f0f\u6765\u914d\u7f6e\u8fd9\u4e9b\u3002\n@DubboService public class DemoServiceImpl implements DemoService { @Override public String hello() { return &#34;hello! This is Dubbo&#39;s demo&#34;; } } \u5b9a\u4e49\u597d\u63a5\u53e3\u540e\uff0c\u6211\u4eec\u5728\u914d\u7f6e\u6587\u4ef6\u52a0\u4e0a\u5982\u4e0b\u914d\u7f6e\uff1a"},{"title":"\u5feb\u901f\u642d\u5efa\u4e00\u4e2aSpringGateway\u7f51\u5173","link":"https:\/\/blog.greycode.top\/posts\/9944cc0febd34a3ebd04eaa1564f4c3a\/","pubDate":"Fri, 07 May 2021 13:05:58 +0000","guid":"https:\/\/blog.greycode.top\/posts\/9944cc0febd34a3ebd04eaa1564f4c3a\/","description":"\u261d\ufe0f\u642d\u5efa\u811a\u624b\u67b6 \u6211\u4eec\u53ef\u4ee5\u53bb Spring initializer \u7f51\u7ad9\u6216\u8005\u7528 IDEA \u6765\u5feb\u901f\u521b\u5efa\u51fa\u4e00\u4e2a Spring Cloud Gateway \u9879\u76ee\u3002\n\u8fd9\u91cc\u6211\u4eec\u9009\u62e9\u7684\u6ce8\u518c\u4e2d\u5fc3\u662f Zookeeper\uff0c\u4f60\u4e5f\u53ef\u4ee5\u81ea\u5df1\u9009\u62e9\u5176\u4ed6\u7684\u6ce8\u518c\u4e2d\u5fc3\u6765\u6ce8\u518c\u4f60\u7684\u9879\u76ee\uff0c\u6bd4\u5982\u963f\u91cc\u5df4\u5df4\u7684 Nacos \u7b49\u3002\n\u914d\u7f6e\u5b8c\u76f8\u5173\u4fe1\u606f\u540e\uff0c\u70b9\u51fb\u4e0b\u9762\u7684 GENERATE \u6309\u94ae\u5c31\u53ef\u4ee5\u5bfc\u51fa\u9879\u76ee\u7684 zip \u538b\u7f29\u5305\uff0c\u89e3\u538b\u540e\u7528 IDE \u6253\u5f00\u3002\n\u6253\u5f00\u540e\u5c31\u662f\u8fd9\u4e2a\u6837\u5b50\uff1a\n\u270c\ufe0f\u914d\u7f6e\u8def\u7531 Ymal \u65b9\u5f0f\u914d\u7f6e \u4e3a\u4e86\u65b9\u4fbf\u914d\u7f6e\uff0c\u6211\u4eec\u628a application.properties \u6539\u6210 application.yml \u3002\n\u7136\u540e\u914d\u7f6e\u4e00\u4e2a\u8f6c\u53d1\u5230\u767e\u5ea6\u5230\u8def\u7531\u3002\nspring: cloud: gateway: routes: - id: route-demo uri: https:\/\/baidu.com predicates: - Path=\/** \u5728\u914d\u7f6e\u4e2d\uff0c\u6211\u52a0\u6765\u4e00\u4e2a\u8c13\u8bcd Path \uff0c\u8868\u793a\u6240\u6709\u5f53\u8bf7\u6c42\u90fd\u4f1a\u5339\u914d\u5230\u8fd9\u4e2a\u8def\u7531\u4e0b\uff0c\u7136\u540e\u8f6c\u53d1\u5230 uri \u914d\u7f6e\u5230\u7f51\u5740\u91cc\u3002\u6240\u4ee5\u5f53\u6211\u4eec\u6253\u5f00\u6d4f\u89c8\u5668\u8bbf\u95ee [http:\/\/localhost:8080\/](http:\/\/localhost:8080\/) \u662f\u5c31\u4f1a\u81ea\u52a8\u8df3\u8f6c\u5230\u767e\u5ea6\u5230\u9996\u9875\u3002\nJava \u4ee3\u7801\u65b9\u5f0f\u914d\u7f6e \u9664\u4e86\u7528\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u8def\u7531\u5916\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u7528\u4ee3\u7801\u7684\u65b9\u5f0f\u6765\u914d\u7f6e\u8def\u7531\u3002\n\u4e0b\u9762\u6765\u5c55\u793a\u4e00\u4e0b\u4ee3\u7801\u65b9\u5f0f\u914d\u7f6e\u7684\u8def\u7531\uff1a\n@Bean public RouteLocator routesConfig(RouteLocatorBuilder builder){ return builder.routes() .route(&#34;route-demo&#34;,r -&gt; r.path(&#34;\/**&#34;).uri(&#34;https:\/\/baidu.com&#34;)) .build(); } \u8fd9\u51e0\u884c\u4ee3\u7801\u5b9e\u73b0\u7684\u662f\u548c\u4e0a\u9762\u914d\u7f6e\u4e00\u6837\u7684\u529f\u80fd\uff0c\u5f53\u8bbf\u95ee [http:\/\/localhost:8080\/](http:\/\/localhost:8080\/) \u65f6\u4e5f\u4f1a\u8df3\u8f6c\u5230\u767e\u5ea6\u9996\u9875\u3002"},{"title":"telnet\u4f7f\u7528smtp\u534f\u8bae\u53d1\u9001qq\u90ae\u4ef6","link":"https:\/\/blog.greycode.top\/posts\/4dd3868b-e23e-4446-b7ec-fd95e98612f4\/","pubDate":"Tue, 23 Mar 2021 10:36:44 +0000","guid":"https:\/\/blog.greycode.top\/posts\/4dd3868b-e23e-4446-b7ec-fd95e98612f4\/","description":"\u64cd\u4f5c\u6b65\u9aa4 telnet\u547d\u4ee4\u8c03\u8bd5QQ\u90ae\u7bb1\u7684smtp\u670d\u52a1\u5668\ntelnet smtp.qq.com 25 # \u54cd\u5e94 Trying 183.3.225.42... Connected to smtp.qq.com. Escape character is &#39;^]&#39;. 220 newxmesmtplogicsvrsza5.qq.com XMail Esmtp QQ Mail Server. \u4f7f\u7528EHLO\u547d\u4ee4\uff0c\u6307\u793aESMTP\u4f1a\u8bdd\u5f00\u59cb\u3002\u670d\u52a1\u5668\u53ef\u4ee5\u5728\u5b83\u5bf9 EHLO \u7684\u54cd\u5e94\u4e2d\u8868\u660e\u81ea\u5df1\u652f\u6301 ESMTP \u547d\u4ee4\nEHLO smtp.qq.com # \u54cd\u5e94 250-newxmesmtplogicsvrsza5.qq.com 250-PIPELINING 250-SIZE 73400320 250-STARTTLS 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN 250-MAILCOMPRESS 250 8BITMIME \u4f7f\u7528AUTH\u5173\u952e\u5b57\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\uff0c\u8fd9\u91cc\u4f7f\u7528AUTH LOGIN\uff0c\u7136\u540e\u8f93\u5165Base64\u7f16\u7801\u7684\u7528\u6237\u540d\u548cQQ\u90ae\u7bb1\u6388\u6743\u7801\nAUTH LOGIN \/\/ base64\u7f16\u7801\u7684`Username:` $ 334 VXNlcm5hbWU6 \/\/ base64\u7f16\u7801\u7684`Password:` $ 334 UGFzc3dvcmQ6 # \u54cd\u5e94 235 Authentication successful \u4f7f\u7528MAIL\u547d\u4ee4\uff0c\u901a\u8fc7\u6807\u8bc6\u90ae\u4ef6\u7684\u53d1\u4ef6\u4eba\u6765\u6807\u8bc6\u90ae\u4ef6\u4f20\u8f93\u5f00\u59cb\uff1b\u4ee5 MAIL FROM \u7684\u5f62\u5f0f\u4f7f\u7528\u3002\nMAIL FROM:&lt;211019847@qq.com&gt; # \u54cd\u5e94 250 OK."},{"title":"\u3010go\u5e93\u3011\u9489\u9489\u673a\u5668\u4eba","link":"https:\/\/blog.greycode.top\/posts\/47ca1795-f020-44a6-9847-02ef3955f6c9\/","pubDate":"Fri, 19 Mar 2021 14:18:58 +0000","guid":"https:\/\/blog.greycode.top\/posts\/47ca1795-f020-44a6-9847-02ef3955f6c9\/","description":"\u9489\u9489\u673a\u5668\u4eba go\u5e93\ngithub\u5730\u5740\uff1ahttps:\/\/github.com\/greycodee\/dingbot\n\u9489\u9489\u5b98\u65b9\u6587\u6863\n\u5feb\u901f\u5f00\u59cb go get github.com\/greycodee\/dingbot \u793a\u4f8b\u7a0b\u5e8f\uff1a\npackage main import ( &#34;fmt&#34; &#34;github.com\/greycodee\/dingbot&#34; &#34;github.com\/greycodee\/dingbot\/message&#34; &#34;time&#34; ) func main() { bot:= dingbot.DingBot{ Secret: &#34;\u4f60\u7684\u52a0\u7b7e\u79d8\u94a5&#34;, AccessToken: &#34;\u4f60\u7684AccessToken\u3010\u4ece\u9489\u9489\u673a\u5668\u4eba\u7684url\u4e0a\u83b7\u53d6\u3011&#34;, } msg := message.Message{ MsgType: message.TextStr, Text: message.Text_{ Content: &#34;go-\u9489\u9489\u673a\u5668\u4eba\u6d4b\u8bd5&#34;, }, } bot.Send(msg) } \u6d88\u606f\u652f\u6301 text\u7c7b\u578b link\u7c7b\u578b markdown\u7c7b\u578b \u6574\u4f53\u8df3\u8f6cActionCard\u7c7b\u578b \u72ec\u7acb\u8df3\u8f6cActionCard\u7c7b\u578b FeedCard\u7c7b\u578b \u4f7f\u7528 \u53d1\u9001Text\u6d88\u606f func send() { bot:= dingbot.DingBot{ Secret: &#34;\u4f60\u7684\u52a0\u7b7e\u79d8\u94a5&#34;, AccessToken: &#34;\u4f60\u7684AccessToken\u3010\u4ece\u9489\u9489\u673a\u5668\u4eba\u7684url\u4e0a\u83b7\u53d6\u3011&#34;, } msg := message.Message{ MsgType: message.TextStr, Text: message.Text_{ Content: &#34;go-\u9489\u9489\u673a\u5668\u4eba\u6d4b\u8bd5&#34;, At: message."},{"title":"go\u81ea\u5b9a\u4e49\u5e93\u4e0a\u4f20github\u4e0b\u8f7d\u4e0d\u4e86\u95ee\u9898","link":"https:\/\/blog.greycode.top\/posts\/e1273901-26b1-4cfb-a55c-a9f5047855a5\/","pubDate":"Fri, 19 Mar 2021 11:39:50 +0000","guid":"https:\/\/blog.greycode.top\/posts\/e1273901-26b1-4cfb-a55c-a9f5047855a5\/","description":"\u81ea\u5b9a\u4e49\u5e93\u4e0a\u4f20github\u6807\u7b7e\u89c4\u8303 \u5f53\u81ea\u5df1\u5199\u7684\u5e93\u8981\u4e0a\u4f20\u5230github\u65f6,\u6807\u7b7e\u53f7\u8981\u7b26\u5408vX.Y.Z\u7684\u683c\u5f0f\uff0c\u4f8b\u5982v1.0.0\n\u5982\u679c\u5b9a\u4e49\u5176\u4ed6\u7684\u6807\u7b7e\u683c\u5f0f\uff0c\u5219go\u4f1a\u4e0b\u8f7d\u4e0d\u5230\uff0c\u4f8b\u5982v1.0,\u6b64\u65f6\u5982\u679c\u7528go get\u547d\u4ee4\u4e0b\u8f7d\u7684\u8bdd\uff0c\u5219\u4e0b\u8f7d\u4e0d\u5230\u6b64\u7248\u672c"},{"title":"gitalk\u66f4\u6362\u81ea\u5b9a\u4e49\u4ee3\u7406","link":"https:\/\/blog.greycode.top\/posts\/33f09b03-a5a7-4d66-93d3-7063905f9b81\/","pubDate":"Thu, 11 Mar 2021 12:10:04 +0000","guid":"https:\/\/blog.greycode.top\/posts\/33f09b03-a5a7-4d66-93d3-7063905f9b81\/","description":"\u9996\u5148\u6ce8\u518c\u4e00\u4e2ahttps:\/\/dash.cloudflare.com\/ \u7684\u8d26\u53f7\n\u7136\u540e\u521b\u5efa\u4e00\u4e2aWorkers\u3002\n\u7136\u540e\u5c06\u4ee3\u7801\u590d\u5236\u5230\u8f93\u5165\u6846\u91cc\uff1a\n\/* CORS Anywhere as a Cloudflare Worker! (c) 2019 by Zibri (www.zibri.org) email: zibri AT zibri DOT org https:\/\/github.com\/Zibri\/cloudflare-cors-anywhere *\/ \/* whitelist = [ &#34;^http.?:\/\/www.zibri.org$&#34;, &#34;zibri.org$&#34;, &#34;test\\\\..*&#34; ]; \/\/ regexp for whitelisted urls *\/ blacklist = [ ]; \/\/ regexp for blacklisted urls whitelist = [ &#34;.*&#34; ]; \/\/ regexp for whitelisted origins function isListed(uri,listing) { var ret=false; if (typeof uri == &#34;string&#34;) { listing.forEach((m)=&gt;{ if (uri."},{"title":"Java\u7684NIO\u7f16\u7a0b-Channel","link":"https:\/\/blog.greycode.top\/posts\/534d0985-a4a0-4239-ae81-d76378f64552\/","pubDate":"Mon, 01 Mar 2021 10:07:09 +0000","guid":"https:\/\/blog.greycode.top\/posts\/534d0985-a4a0-4239-ae81-d76378f64552\/","description":"0x1 \u4e3b\u8981\u7c7b\u578b \u5728Java\u4e2d\u6709\u8bb8\u591aNIO Channel\u5b9e\u73b0\uff0c\u672c\u6587\u53ea\u9009\u6700\u4e3b\u8981\u7684\u56db\u79cdChannel\uff1a\nFileChannel\uff1a\u6587\u4ef6\u901a\u9053\uff0c\u7528\u4e8e\u6587\u4ef6\u7684\u6570\u636e\u8bfb\u5199 SocketChannel\uff1a\u5957\u63a5\u5b57\u901a\u9053\uff0c\u7528\u4e8eSocket\u5957\u63a5\u5b57TCP\u8fde\u63a5\u7684\u6570\u636e\u8bfb\u5199\u3002 ServerSocketChannel\uff1a\u670d\u52a1\u5668\u5d4c\u5957\u5b57\u901a\u9053\uff08\u6216\u670d\u52a1\u5668\u76d1\u542c\u901a\u9053\uff09\uff0c\u5141\u8bb8\u6211\u4eec\u76d1\u542cTCP\u8fde\u63a5\u8bf7\u6c42\uff0c\u4e3a\u6bcf\u4e2a\u76d1\u542c\u5230\u7684\u8bf7\u6c42\uff0c\u521b\u5efa\u4e00\u4e2aSocketChannel\u5957\u63a5\u5b57\u901a\u9053\u3002 DatagramChannel\uff1a\u6570\u636e\u62a5\u901a\u9053\uff0c\u7528\u4e8eUDP\u534f\u8bae\u7684\u6570\u636e\u8bfb\u5199\u3002 0x2 \u4f7f\u7528 FileChannel \u8bfb\u53d6\u901a\u9053\u6570\u636e \u9996\u5148\u5728\u672c\u5730\u521b\u5efa\u6587\u4ef6\/home\/zheng\/channeltest\uff0c\u5728\u91cc\u9762\u7f16\u5199\u5185\u5bb9\uff1ahello,world!\npublic class ChannelTest { public static void main(String[] args) throws IOException { \/\/ \u521b\u5efa\u8f93\u5165\u6d41 File file = new File(&#34;\/home\/zheng\/channeltest&#34;); FileInputStream fis = new FileInputStream(file); \/\/ \u83b7\u53d6\u901a\u9053 FileChannel fileChannel = fis.getChannel(); \/\/ \u521b\u5efa\u7f13\u51b2\u533a ByteBuffer byteBuffer = ByteBuffer.allocate(1024); int length = -1; \/\/ \u8bfb\u53d6\u901a\u9053\u6570\u636e\u5230\u7f13\u51b2\u533a while ((length=fileChannel.read(byteBuffer))!=-1){ System.out.println(&#34;\u7f13\u51b2\u533asize\uff1a&#34;+length); } fis.close(); fileChannel.close(); \/\/ \u8bfb\u53d6Buffer\u7f13\u5b58\u6570\u636e byteBuffer.flip(); StringBuilder str = new StringBuilder(); while (byteBuffer."},{"title":"Java\u7684NIO\u7f16\u7a0b-Selector","link":"https:\/\/blog.greycode.top\/posts\/2571330c-67ef-4d4c-8717-6c96768009c7\/","pubDate":"Mon, 01 Mar 2021 10:07:07 +0000","guid":"https:\/\/blog.greycode.top\/posts\/2571330c-67ef-4d4c-8717-6c96768009c7\/","description":"0x1 \u76d1\u63a7 \u901a\u9053\u548c\u9009\u62e9\u5668\u4e4b\u95f4\u7684\u5173\u7cfb\uff0c\u901a\u8fc7register\uff08\u6ce8\u518c\uff09\u7684\u65b9\u5f0f\u5b8c\u6210\u3002\u8c03\u7528\u901a\u9053\u7684Channel.register\uff08Selector sel, int ops\uff09\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5c06\u901a\u9053\u5b9e\u4f8b\u6ce8\u518c\u5230\u4e00\u4e2a\u9009\u62e9\u5668\u4e2d\u3002register\u65b9\u6cd5\u6709\u4e24\u4e2a\u53c2\u6570\uff1a\u7b2c\u4e00\u4e2a\u53c2\u6570\uff0c\u6307\u5b9a\u901a\u9053\u6ce8\u518c\u5230\u7684\u9009\u62e9\u5668\u5b9e\u4f8b\uff1b\u7b2c\u4e8c\u4e2a\u53c2\u6570\uff0c\u6307\u5b9a\u9009\u62e9\u5668\u8981\u76d1\u63a7\u7684IO\u4e8b\u4ef6\u7c7b\u578b\u3002\nIO\u4e8b\u4ef6\u7c7b\u578b\u6709\uff1a\n\u53ef\u8bfb\uff1aSelectionKey.OP_READ \u53ef\u5199\uff1aSelectionKey.OP_WRITE \u8fde\u63a5\uff1aSelectionKey.OP_CONNECT \u63a5\u6536\uff1aSelectionKey.OP_ACCEPT \u5982\u679c\u4e00\u4e0b\u8981\u76d1\u63a7\u591a\u4e2a\u4e8b\u4ef6\u7684\u8bdd\u53ef\u4ee5\u7528\u4f4d\u6216\u8fd0\u7b97\u7b26\u6765\u5b9e\u73b0\nint key = SelectionKey.OP_READ | SelectionKey.OP_WRITE; 0x2 SelectionKey\u9009\u62e9\u952e \u9009\u62e9\u952e\u7684\u529f\u80fd\u662f\u5f88\u5f3a\u5927\u7684\u3002\u901a\u8fc7SelectionKey\u9009\u62e9\u952e\uff0c\u4e0d\u4ec5\u4ec5\u53ef\u4ee5\u83b7\u5f97\u901a\u9053\u7684IO\u4e8b\u4ef6\u7c7b\u578b\uff0c\u6bd4\u65b9\u8bf4SelectionKey.OP_READ\uff1b\u8fd8\u53ef\u4ee5\u83b7\u5f97\u53d1\u751fIO\u4e8b\u4ef6\u6240\u5728\u7684\u901a\u9053\uff1b\u53e6\u5916\uff0c\u4e5f\u53ef\u4ee5\u83b7\u5f97\u9009\u51fa\u9009\u62e9\u952e\u7684\u9009\u62e9\u5668\u5b9e\u4f8b\u3002\n\u5e38\u7528\u65b9\u6cd5 isAcceptable()\uff1a\u5224\u65adIO\u4e8b\u4ef6\u7c7b\u578b\u662f\u5426\u662fSelectionKey.OP_ACCEPT isReadable()\uff1a\u5224\u65adIO\u4e8b\u4ef6\u662f\u5426\u662fSelectionKey.OP_READ isConnectable():\u5224\u65adIO\u4e8b\u4ef6\u662f\u5426\u662fSelectionKey.OP_CONNECT isWritable()\uff1a\u5224\u65adIO\u4e8b\u4ef6\u662f\u5426\u662fSelectionKey.OP_WRITE 0x3 \u4f7f\u7528\u6761\u4ef6 \u5e76\u4e0d\u662f\u6240\u6709\u7684Channel\u90fd\u53ef\u4ee5\u4f7f\u7528Selector\uff0c\u5224\u65ad\u4e00\u4e2a\u901a\u9053\u80fd\u5426\u88ab\u9009\u62e9\u5668\u76d1\u63a7\u6216\u9009\u62e9\uff0c\u6709\u4e00\u4e2a\u524d\u63d0\uff1a\u5224\u65ad\u5b83\u662f\u5426\u7ee7\u627f\u4e86\u62bd\u8c61\u7c7bSelectableChannel\uff08\u53ef\u9009\u62e9\u901a\u9053\uff09\u3002\u5982\u679c\u7ee7\u627f\u4e86SelectableChannel\uff0c\u5219\u53ef\u4ee5\u88ab\u9009\u62e9\uff0c\u5426\u5219\u4e0d\u80fd\u3002\n\u7b80\u5355\u5730\u8bf4\uff0c\u4e00\u6761\u901a\u9053\u82e5\u80fd\u88ab\u9009\u62e9\uff0c\u5fc5\u987b\u7ee7\u627fSelectableChannel\u7c7b\u3002\nFileChannel\u5c31\u6ca1\u6709\u7ee7\u627fSelectableChannel\u7c7b\uff0c\u6240\u4ee5\u4e0d\u80fd\u4f7f\u7528Selector\n0x4 \u4f7f\u7528\u6d41\u7a0b \u4f7f\u7528\u9009\u62e9\u5668\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u4e09\u6b65\uff1a\n\u83b7\u53d6\u9009\u62e9\u5668\u5b9e\u4f8b\uff1b \u5c06\u901a\u9053\u6ce8\u518c\u5230\u9009\u62e9\u5668\u4e2d\uff1b \u8f6e\u8be2\u611f\u5174\u8da3\u7684IO\u5c31\u7eea\u4e8b\u4ef6\uff08\u9009\u62e9\u952e\u96c6\u5408\uff09\u3002 0x5 Demo \u6e90\u7801\u5730\u5740\uff1a https:\/\/github.com\/GreyCode9\/nio-demo\/tree\/main\/src\/io\/selector"},{"title":"Java\u7684NIO\u7f16\u7a0b-Buffer","link":"https:\/\/blog.greycode.top\/posts\/8d2049e3-3eb1-46ed-a44b-57398964eb21\/","pubDate":"Mon, 01 Mar 2021 10:07:05 +0000","guid":"https:\/\/blog.greycode.top\/posts\/8d2049e3-3eb1-46ed-a44b-57398964eb21\/","description":"0x1 \u5b50\u7c7b Buffer\u662f\u4e00\u4e2a\u62bd\u8c61\u7c7b\uff0c\u6240\u4ee5\u4e00\u822c\u4f7f\u7528\u4ed6\u7684\u5b50\u7c7b\u6765\u8fdb\u884c\u7f16\u7a0b\uff0c\u5e38\u7528\u7684\u5b50\u7c7b\u6709\uff1a\nByteBuffer\nIntBuffer\nLongBuffer\nCharBuffer\nDoubleBufffer\nFloatBuffer\nShortBuffer\nMappedByteBuffer\n0x2 \u5c5e\u6027 Buffer\u4e2d\u6709\u56db\u4e2a\u91cd\u8981\u7684\u5c5e\u6027\uff0c\u5206\u522b\u662f\uff1a\ncapacity\uff1aBuffer\u7c7b\u7684capacity\u5c5e\u6027\uff0c\u8868\u793a\u5185\u90e8\u5bb9\u91cf\u7684\u5927\u5c0f position\uff1aBuffer\u7c7b\u7684position\u5c5e\u6027\uff0c\u8868\u793a\u5f53\u524d\u7684\u4f4d\u7f6e limit\uff1aBuffer\u7c7b\u7684limit\u5c5e\u6027\uff0c\u8868\u793a\u8bfb\u5199\u7684\u6700\u5927\u4e0a\u9650\u3002 mark\uff1a\u6682\u5b58\u5c5e\u6027\uff0c\u6682\u65f6\u4fdd\u5b58position\u7684\u503c\uff0c\u65b9\u4fbf\u540e\u9762\u7684\u91cd\u590d\u4f7f\u7528position\u503c\u3002 0x3 \u65b9\u6cd5 Buffer\u4e2d\u51e0\u4e2a\u91cd\u8981\u7684\u65b9\u6cd5\u6709\uff1a\nallocate()\uff1a\u521b\u5efa\u7f13\u5b58\u533a\uff08BUffer\u521b\u5efa\u7f13\u5b58\u533a\u4e0d\u662f\u7528new\uff0c\u800c\u662f\u7528\u8fd9\u4e2a\u65b9\u6cd5\u6765\u521b\u5efa) put()\uff1a\u5411\u7f13\u51b2\u5668\u63d2\u5165\u6570\u636e filp()\uff1a\u7ffb\u8f6c\u6a21\u5f0f\uff0c\u5c06\u7f13\u51b2\u533a\u6539\u4e3a\u8bfb\u6a21\u5f0f\uff08\u7f13\u51b2\u533a\u9ed8\u8ba4\u6a21\u5f0f\u4e3a\u5199\u6a21\u5f0f\uff09\u3002\u5176\u5b9e\u5c31\u6539\u53d8\u4e86limit\uff0cposition\uff0cmark\u5c5e\u6027\u7684\u503c\u3002 get()\uff1a\u4ece\u7f13\u51b2\u533a\u8bfb\u53d6\u6570\u636e\uff0c\u4eceposition\u4f4d\u7f6e\u5f00\u59cb\u8bfb rewind()\uff1a\u5012\u5e26\uff08\u91cd\u590d\u8bfb\u53d6\uff09\uff0c\u5c31\u662f\u5c06position\u7684\u4f4d\u7f6e\u91cd\u7f6e\u4e3a0 mark()\uff1amark()\u65b9\u6cd5\u7684\u4f5c\u7528\u5c31\u662f\u5c06\u5f53\u524dposition\u7684\u4f4d\u7f6e\u6682\u5b58\u8d77\u6765\uff0c\u653e\u5728mark\u5c5e\u6027\u4e2d\u3002 reset()\uff1a\u5c06position\u91cd\u7f6e\u4e3amark\u5c5e\u6027\u7684\u4f4d\u7f6e\u3002 clean()\uff1a\u6e05\u7a7a\u7f13\u5b58\u533a\uff0c\u91cd\u7f6eposition\uff0climit\uff0cmark\u5c5e\u6027\u4e3a\u521d\u59cb\u503c"},{"title":"Java\u7684NIO\u7f16\u7a0b-Reactor\u6a21\u5f0f","link":"https:\/\/blog.greycode.top\/posts\/0702ff46-16cd-4520-9d33-0794cfda4b09\/","pubDate":"Mon, 01 Mar 2021 10:07:04 +0000","guid":"https:\/\/blog.greycode.top\/posts\/0702ff46-16cd-4520-9d33-0794cfda4b09\/","description":"0x1 Reactor\u6a21\u578b 0x1 \u5355Reactor\u5355\u7ebf\u7a0b"},{"title":"Disruptor-\u6d88\u8d39\u6a21\u5f0f\u7b80\u4ecb(\u6c60\u5316)","link":"https:\/\/blog.greycode.top\/posts\/c16646bf-1474-42a7-a5cd-84b99669062c\/","pubDate":"Mon, 01 Mar 2021 10:02:15 +0000","guid":"https:\/\/blog.greycode.top\/posts\/c16646bf-1474-42a7-a5cd-84b99669062c\/","description":"\u5e76\u884c\u6a21\u5f0f(\u6c60\u5316) \u6bcf\u4e2a\u6d88\u8d39\u7aef\u6709\u4e24\u4e2a\u7ebf\u7a0b\u5b9e\u4f8b\ndisruptor.handleEventsWithWorkerPool(new A1Handler(),new A1Handler()); disruptor.handleEventsWithWorkerPool(new A2Handler(),new A2Handler()); \u7ed3\u679c\u793a\u4f8b \u53ef\u4ee5\u770b\u5230\u6bcf\u6b21\u6267\u884c\u7684\u7ebf\u7a0b\u662f\u4e0d\u4e00\u6837\u7684\n++++++++++++++++++++++++++++++++++++++++++++++++ ************************** DisruptorWorker-0 ************************** 1605100167571+A1Handler:10 ************************** DisruptorWorker-2 1605100167572+A2Handler:30 ************************** ++++++++++++++++++++++++++++++++++++++++++++++++ ************************** DisruptorWorker-1 1605100168572+A1Handler:11 ************************** ************************** DisruptorWorker-3 1605100168573+A2Handler:31 ************************** \u4e32\u884c\u6a21\u5f0f\uff08\u6c60\u5316\uff09 \u6bcf\u4e2a\u6d88\u8d39\u7aef\u6709\u4e24\u4e2a\u7ebf\u7a0b\u5b9e\u4f8b\ndisruptor.handleEventsWithWorkerPool(new A1Handler(),new A1Handler()) .then(new A2Handler(),new A2Handler()); \u7ed3\u679c\u793a\u4f8b ++++++++++++++++++++++++++++++++++++++++++++++++ ************************** DisruptorWorker-0 1605100492248+A1Handler:10 ************************** ************************** DisruptorWorker-2 1605100492249+A2Handler:30 ************************** ++++++++++++++++++++++++++++++++++++++++++++++++ ************************** DisruptorWorker-1 1605100493249+A1Handler:11 ************************** ************************** DisruptorWorker-3 1605100493249+A2Handler:31 **************************"},{"title":"Disruptor-\u7f13\u5b58\u884c\u586b\u5145","link":"https:\/\/blog.greycode.top\/posts\/18e3fbd6-ff4b-4a0a-b82f-a547dbef8d0c\/","pubDate":"Mon, 01 Mar 2021 10:02:08 +0000","guid":"https:\/\/blog.greycode.top\/posts\/18e3fbd6-ff4b-4a0a-b82f-a547dbef8d0c\/","description":"\u4f2a\u5171\u4eab\u6982\u5ff5 CPU\u67b6\u6784 \u5e38\u89c1\u7684CPU\u67b6\u6784\u5982\u4e0b\u56fe\uff1a\n\u5728\u67d0\u4e2aCPU\u6838\u5fc3\u4e0a\u8fd0\u884c\u4e00\u4e2a\u7ebf\u7a0b\u65f6\uff0c\u4ed6\u83b7\u53d6\u6570\u636e\u662f\u5148\u4eceL1\u7f13\u5b58\u4e0a\u9762\u627e\uff0c\u6ca1\u6709\u547d\u4e2d\u6570\u636e\u65f6\uff0c\u518d\u4eceL2\u7f13\u5b58\u4e0a\u9762\u627e\u3001\u8fd8\u662f\u6ca1\u6709\u547d\u4e2d\u65f6\u518d\u4eceL3\u7f13\u5b58\u4e0a\u627e\uff0c\u5982\u679c\u8fd8\u6ca1\u6709\u7684\u8bdd\u5c31\u518d\u4ece\u4e3b\u5185\u5b58\u91cc\u9762\u627e\u3002\u627e\u5230\u540e\u518d\u4e00\u5c42\u4e00\u5c42\u7684\u4f20\u9012\u6570\u636e\u3002\n\u6240\u4ee5\u67e5\u627e\u6570\u636e\u7684\u987a\u5e8f\u4e3a\uff1a\nL1 \u300bL2 \u300b L3 \u300b\u4e3b\u5185\u5b58\n\u5237\u65b0\u7f13\u5b58\u7684\u987a\u5e8f\u4e3a\uff1a\n\u4e3b\u5185\u5b58 \u300bL3 \u300bL2 \u300bL1\n\u7f13\u5b58\u5b58\u50a8\u7ed3\u6784 \u5728\u8ba1\u7b97\u673a\u7f13\u5b58\u4e2d\uff0c\u5b58\u50a8\u6570\u636e\u662f\u4ee5\u7f13\u5b58\u884c\u4e3a\u5355\u4f4d\u7684\uff0c\u4e0d\u540c\u7684\u7cfb\u7edf\u7f13\u5b58\u884c\u7684\u5927\u5c0f\u4e5f\u4e0d\u4e00\u6837\uff0c\u73b0\u5728\u5e38\u89c1\u768464\u4f4d\u64cd\u4f5c\u7cfb\u7edf\uff0c\u4ed6\u6bcf\u884c\u53ef\u4ee5\u5b58\u50a864\u5b57\u8282\u6570\u636e\u3002\u6bd4\u5982Java\u4e2dLong\u7c7b\u578b\u7684\u6570\u636e\u53608\u4e2a\u5b57\u8282\uff0c\u6240\u4ee5\u4e00\u884c\u53ef\u4ee5\u5b588\u4e2aLong\u6570\u636e\u7c7b\u578b\u7684\u6570\u636e\u3002\n\u6240\u4ee5\u5f53\u52a0\u8f7d\u7f13\u5b58\u884c\u4e2d\u4efb\u610f\u4e00\u4e2a\u6570\u636e\u65f6\uff0c\u5176\u4ed6\u5728\u5f53\u524d\u7f13\u5b58\u884c\u91cc\u7684\u6570\u636e\u4e5f\u4f1a\u4e00\u8d77\u52a0\u8f7d\n\u7ebf\u7a0b\u6570\u636e\u5171\u4eab \u5f53\u7ebf\u7a0b\u5171\u4eab\u4e00\u4e2a\u53d8\u91cf\u65f6\uff0c\u6bcf\u4e2a\u7ebf\u7a0b\u7684\u66f4\u6539\u90fd\u4f1a\u628a\u6700\u65b0\u6570\u636e\u5237\u65b0\u56de\u4e3b\u5185\u5b58\uff0c\u5982\u679c\u5904\u7406\u5668\u53d1\u73b0\u81ea\u5df1\u7f13\u5b58\u884c\u5bf9\u5e94\u7684\u5185\u5b58\u5730\u5740\u5457\u4fee\u6539\uff0c\u5c31\u4f1a\u5c06\u5f53\u524d\u5904\u7406\u5668\u7684\u7f13\u5b58\u884c\u8bbe\u7f6e\u65e0\u6548\u72b6\u6001\uff0c\u5f53\u5904\u7406\u5668\u5bf9\u8fd9\u4e2a\u6570\u636e\u8fdb\u884c\u4fee\u6539\u64cd\u4f5c\u7684\u65f6\u5019\uff0c\u4f1a\u91cd\u65b0\u4ece\u7cfb\u7edf\u5185\u5b58\u4e2d\u628a\u6570\u636e\u5e93\u8bfb\u5230\u5904\u7406\u5668\u7f13\u5b58\u4e2d\uff08\u55c5\u63a2\u673a\u5236\uff09\u3002\n\u4f2a\u5171\u4eab \u4e0a\u9762\u8bf4\u7684\u662f\u5171\u4eab\u4e00\u4e2a\u7f13\u5b58\u884c\u7684\u4e00\u4e2a\u6570\u636e\uff0c\u8fd9\u6837\u662f\u5b8c\u5168\u6ca1\u95ee\u9898\u7684\u3002\u53ef\u662f\u5f53\u4e0d\u540c\u7ebf\u7a0b\u8981\u4f7f\u7528\u4e00\u4e2a\u7f13\u5b58\u884c\u91cc\u7684\u4e0d\u540c\u6570\u636e\u65f6\uff0c\u8fd9\u6837\u5c31\u4f1a\u51fa\u73b0\u4e00\u79cd\u4f2a\u5171\u4eab\u7684\u60c5\u51b5:\n\u5c3d\u7ba1\u53d8\u91cfa\u6ca1\u6709\u88ab\u5176\u4ed6\u7ebf\u7a0b\u66f4\u6539\uff0c\u53ef\u4ee5\u7531\u4e8e\u4ed6\u548c\u53d8\u91cfd\u5728\u540c\u4e00\u7f13\u5b58\u884c\u91cc\uff0c\u6240\u4ee5\u6bcf\u6b21\u90fd\u4f1a\u53d7\u53d8\u91cfd\u7684\u5f71\u54cd,\u7f13\u5b58\u90fd\u4f1a\u88ab\u8bbe\u7f6e\u4e3a\u65e0\u6548\u72b6\u6001\uff0c\u6240\u4ee5\u6bcf\u6b21\u4f7f\u7528\u65f6\u90fd\u4f1a\u4ece\u4e3b\u5185\u5b58\u91cc\u91cd\u65b0\u62c9\u53d6\u3002\u8fd9\u6837\u901f\u5ea6\u5c31\u4f1a\u5927\u5927\u7684\u6253\u6298\u6263\u3002\nRingBuffer\u7684\u89e3\u51b3\u65b9\u6cd5 \u5728RingBuffer\u89e3\u51b3\u4f2a\u5171\u4eab\u7684\u65b9\u6cd5\u5c31\u662f\u7f13\u5b58\u884c\u586b\u5145\nabstract class RingBufferPad { protected long p1, p2, p3, p4, p5, p6, p7; }"},{"title":"Disruptor-\u7b49\u5f85\u7b56\u7565","link":"https:\/\/blog.greycode.top\/posts\/ff51336d-70d4-449c-9214-fff2542bef1f\/","pubDate":"Mon, 01 Mar 2021 10:02:06 +0000","guid":"https:\/\/blog.greycode.top\/posts\/ff51336d-70d4-449c-9214-fff2542bef1f\/","description":"BlockingWaitStrategy Disruptor\u9ed8\u8ba4\u7b56\u7565\n\u5bf9EventProcessor\u4f7f\u7528\u7b49\u5f85\u6761\u4ef6\u7684\u9501\u548c\u6761\u4ef6\u53d8\u91cf\u7684\u963b\u585e\u7b56\u7565\u3002\n\u5f53\u541e\u5410\u91cf\u548c\u4f4e\u5ef6\u8fdf\u4e0d\u5982CPU\u8d44\u6e90\u90a3\u4e48\u91cd\u8981\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528\u6b64\u7b56\u7565\u3002\nLiteBlockingWaitStrategy BlockingWaitStrategy\u7684\u53d8\u4f53\uff0c\u5728\u65e0\u7ade\u4e89\u7684\u60c5\u51b5\u4e0b\u5c1d\u8bd5\u6d88\u9664\u6761\u4ef6\u5524\u9192\u3002 \u663e\u793a\u5fae\u57fa\u51c6\u6d4b\u8bd5\u7684\u6027\u80fd\u6539\u8fdb\u3002\n\u4f46\u662f\uff0c\u7531\u4e8e\u6211\u5c1a\u672a\u5b8c\u5168\u8bc1\u660e\u9501\u7701\u7565\u7801\u7684\u6b63\u786e\u6027\uff0c\u56e0\u6b64\u5e94\u5c06\u8fd9\u79cd\u7b49\u5f85\u7b56\u7565\u89c6\u4e3a\u5b9e\u9a8c\u6027\u7684\u3002\nBusySpinWaitStrategy \u7e41\u5fd9\u65cb\u8f6c\u7b56\u7565\uff0c\u8be5\u7e41\u5fd9\u65cb\u8f6c\u7b56\u7565\u5bf9EventProcessor\u7684\u969c\u788d\u4f7f\u7528\u7e41\u5fd9\u7684\u65cb\u8f6c\u5faa\u73af\u3002\n\u6b64\u7b56\u7565\u5c06\u4f7f\u7528CPU\u8d44\u6e90\u6765\u907f\u514d\u53ef\u80fd\u5bfc\u81f4\u5ef6\u8fdf\u6296\u52a8\u7684\u7cfb\u7edf\u8c03\u7528\u3002 \u6700\u597d\u5f53\u7ebf\u7a0b\u53ef\u4ee5\u7ed1\u5b9a\u5230\u7279\u5b9a\u7684CPU\u5185\u6838\u65f6\u4f7f\u7528\u3002\nTimeoutBlockingWaitStrategy LiteTimeoutBlockingWaitStrategy TimeoutBlockingWaitStrategy\u7684\u53d8\u4f53\uff0c\u5728\u65e0\u7ade\u4e89\u7684\u60c5\u51b5\u4e0b\u5c1d\u8bd5\u6d88\u9664\u6761\u4ef6\u5524\u9192\u3002\nPhasedBackoffWaitStrategy \u5728\u5c4f\u969c\u4e0a\u7b49\u5f85EventProcessor\u7684\u5206\u9636\u6bb5\u7b49\u5f85\u7b56\u7565\u3002\n\u5f53\u541e\u5410\u91cf\u548c\u4f4e\u5ef6\u8fdf\u4e0d\u5982CPU\u8d44\u6e90\u90a3\u4e48\u91cd\u8981\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528\u6b64\u7b56\u7565\u3002 \u65cb\u8f6c\uff0c\u7136\u540e\u5c48\u670d\uff0c\u7136\u540e\u4f7f\u7528\u914d\u7f6e\u7684\u540e\u5907WaitStrategy\u7b49\u5f85\u3002\nSleepingWaitStrategy \u6700\u521d\u542f\u52a8\u7684\u4f11\u7720\u7b56\u7565\uff0c\u7136\u540e\u4f7f\u7528Thread.yield\uff08\uff09\uff0c\u6700\u540e\u5728EventProcessor\u7b49\u5f85\u5c4f\u969c\u65f6\uff0c\u4f11\u7720\u64cd\u4f5c\u7cfb\u7edf\u548cJVM\u5c06\u5141\u8bb8\u7684\u6700\u5c0f\u6570\u91cf\u7684nanos\u3002\n\u6b64\u7b56\u7565\u662f\u6027\u80fd\u548cCPU\u8d44\u6e90\u4e4b\u95f4\u7684\u826f\u597d\u6298\u8877\u3002 \u5b89\u9759\u65f6\u6bb5\u540e\u53ef\u80fd\u4f1a\u51fa\u73b0\u5ef6\u8fdf\u5cf0\u503c\u3002 \u8fd9\u4e5f\u5c06\u51cf\u5c11\u5bf9\u751f\u4ea7\u7ebf\u7a0b\u7684\u5f71\u54cd\uff0c\u56e0\u4e3a\u5b83\u4e0d\u9700\u8981\u53d1\u51fa\u4fe1\u53f7\u901a\u77e5\u4efb\u4f55\u6761\u4ef6\u53d8\u91cf\u6765\u5524\u9192\u4e8b\u4ef6\u5904\u7406\u7ebf\u7a0b\u3002\nYieldingWaitStrategy \u5728\u521d\u59cb\u65cb\u8f6c\u540e\uff0c\u4f7f\u7528Thread.yield\uff08\uff09\u7684EventProcessor\u5728\u5c4f\u969c\u4e0a\u7b49\u5f85\u3002\n\u5982\u679c\u5176\u4ed6\u7ebf\u7a0b\u9700\u8981CPU\u8d44\u6e90\uff0c\u5219\u6b64\u7b56\u7565\u5c06\u4f7f\u7528100\uff05CPU\uff0c\u4f46\u6bd4\u5fd9\u788c\u7684\u81ea\u65cb\u7b56\u7565\u66f4\u5bb9\u6613\u653e\u5f03CPU\u3002"},{"title":"Disruptor-\u6d88\u8d39\u6a21\u5f0f\u7b80\u4ecb(\u5355\u4e2a\u5b9e\u4f8b)","link":"https:\/\/blog.greycode.top\/posts\/9a1bdb74-8ed3-4905-88bc-7b3b4e0a4af2\/","pubDate":"Mon, 01 Mar 2021 10:01:00 +0000","guid":"https:\/\/blog.greycode.top\/posts\/9a1bdb74-8ed3-4905-88bc-7b3b4e0a4af2\/","description":"\u5e76\u884c\u6a21\u5f0f \u5e76\u884c\u6a21\u5f0f\u4e0b\u4e24\u4e2aHandler\u540c\u65f6\u6267\u884c\uff0c\u4e92\u4e0d\u5f71\u54cd\ndisruptor.handleEventsWith(new A1Handler(),new B1Handler()); \u7ed3\u679c\u793a\u4f8b ++++++++++ 1605084168915+B1Handler:5 1605084168915+A1Handler:1 ++++++++++ 1605084169915+B1Handler:6 1605084169915+A1Handler:2 \u4e32\u884c\u6a21\u5f0f \u4e32\u884c\u6a21\u5f0f\u4e0b\uff0cHandler\u6267\u884c\u5fc5\u987b\u662f\u4ece\u524d\u5f80\u540e\uff0c\u6309\u987a\u5e8f\u6267\u884c\u3002\ndisruptor.handleEventsWith(new A1Handler()).then(new B1Handler()); \/\/ or disruptor.handleEventsWith(new B1Handler()).then(new A1Handler()); \u7ed3\u679c\u793a\u4f8b \u7ed3\u679c\u548chandler\u653e\u7f6e\u7684\u987a\u5e8f\u6709\u5173\uff0c\u540e\u9762\u7684handler\u8981\u7b49\u524d\u9762\u7684\u6267\u884c\u5b8c\u624d\u4f1a\u6267\u884c\n++++++++++ 1605084411462+A1Handler:1 1605084411467+B1Handler:5 ++++++++++ 1605084412463+A1Handler:2 1605084412463+B1Handler:6 \/\/ or ++++++++++ 1605084638285+B1Handler:5 1605084638289+A1Handler:1 ++++++++++ 1605084639286+B1Handler:6 1605084639286+A1Handler:2 \u83f1\u5f62\u6a21\u5f0f \u83f1\u5f62\u6a21\u5f0f\u5176\u5b9e\u5c31\u662f\u5e76\u884c\u548c\u4e32\u884c\u7684\u7ed3\u5408\u4f53\uff0c\u5148\u5e76\u884c\u6267\u884c\uff0c\u518d\u4e32\u884c\u6267\u884c\ndisruptor.handleEventsWith(new A1Handler(), new A2Handler()).then(new B1Handler()); \u7ed3\u679c\u793a\u4f8b B1Handler\u8981\u7b49A1Handler\u548cA2Handler\u5168\u90e8\u6267\u884c\u5b8c\uff0c\u5b83\u624d\u4f1a\u6267\u884c\u3002\n++++++++++ 1605085280283+A1Handler:1 1605085280283+A2Handler:3 1605085280287+B1Handler:5 ++++++++++ 1605085281283+A1Handler:2 1605085281283+A2Handler:4 1605085281283+B1Handler:6 \u94fe\u5f0f\u6a21\u5f0f \u94fe\u5f0f\u6a21\u5f0f\u4e5f\u662f\u5e76\u884c\u548c\u4e32\u884c\u7684\u7ed3\u5408\uff0c\u5e76\u884c\u6a21\u5f0f\u6267\u884c\u4e32\u884c\u6a21\u5f0f\ndisruptor.handleEventsWith(new A1Handler()).then(new A2Handler()); disruptor.handleEventsWith(new B1Handler()).then(new B2Handler()); \u7ed3\u679c\u793a\u4f8b ++++++++++ 1605085843558+B1Handler:5 1605085843558+A1Handler:1 1605085843563+A2Handler:3 1605085843563+B2Handler:7 ++++++++++ 1605085844558+B1Handler:6 1605085844558+A1Handler:2 1605085844558+B2Handler:8 1605085844559+A2Handler:4 \u603b\u7ed3 \u6240\u6709\u7684\u6a21\u5f0f\u90fd\u53ef\u4ee5\u6839\u636e\u5e76\u884c\u548c\u4e32\u884c\u6765\u884d\u751f\u51fa\u5404\u79cd\u6a21\u5f0f\uff0c\u73a9\u6cd5\u591a\u79cd\u591a\u6837\u3002"},{"title":"Disruptor-\u5b9e\u4f8b\u5316\u65b9\u6cd5","link":"https:\/\/blog.greycode.top\/posts\/b3025291-ae52-4d26-a70c-66a79bda07d7\/","pubDate":"Mon, 01 Mar 2021 09:58:05 +0000","guid":"https:\/\/blog.greycode.top\/posts\/b3025291-ae52-4d26-a70c-66a79bda07d7\/","description":"\u521b\u5efa\u4e00\u4e2a\u4e8b\u4ef6\u5b9e\u4f53 public class LongEvent{ private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } } \u521b\u5efa\u4e00\u4e2a\u4e8b\u4ef6\u5b9e\u4f53\u5de5\u5382 public class LongEventFactory implements EventFactory&lt;LongEvent&gt; { public LongEvent newInstance() { return new LongEvent(); } } \u521b\u5efa\u4e24\u4e2a\u4e8b\u4ef6\u5904\u7406\u7c7b \/** * EventHandler&lt;LongEvent&gt; \u662f\u6ca1\u6709\u6c60\u5316\u7684\u5b9e\u73b0\u65b9\u5f0f,\u6bcf\u4e2a\u6d88\u8d39\u8005\u4e2d\u53ea\u6709\u4e00\u4e2a\u793a\u4f8b * WorkHandler&lt;LongEvent&gt; \u662f\u6c60\u5316\u7684\u5b9e\u73b0\u65b9\u5f0f\uff0c\u6bcf\u4e2a\u6d88\u8d39\u8005\u4e2d\u53ef\u4ee5\u4ee5\u7c7b\u4f3c\u7ebf\u7a0b\u6c60\u7684\u65b9\u5f0f\u53bb\u6267\u884c\u8fd9\u4e2a\u4e8b\u4ef6 * \u5b9e\u9645\u6839\u636e\u4e1a\u52a1\u573a\u666f \u5b9e\u73b0\u5176\u4e2d\u4e00\u4e2a\u63a5\u53e3\u5c31\u53ef\u4ee5 *\/ public class A1Handler implements EventHandler&lt;LongEvent&gt; , WorkHandler&lt;LongEvent&gt; { public void onEvent(LongEvent longEvent, long l, boolean b) throws Exception { long id = longEvent."},{"title":"Disruptor-\u5feb\u901f\u5f00\u59cb","link":"https:\/\/blog.greycode.top\/posts\/a552f7f0-4cbe-4628-8fcf-02f8b8730b56\/","pubDate":"Mon, 01 Mar 2021 09:58:03 +0000","guid":"https:\/\/blog.greycode.top\/posts\/a552f7f0-4cbe-4628-8fcf-02f8b8730b56\/","description":"\u521b\u5efa\u4e00\u4e2a\u4e8b\u4ef6\u5b9e\u4f53 public class LongEvent{ private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } } \u521b\u5efa\u4e00\u4e2a\u4e8b\u4ef6\u5b9e\u4f53\u5de5\u5382 public class LongEventFactory implements EventFactory&lt;LongEvent&gt; { public LongEvent newInstance() { return new LongEvent(); } } \u521b\u5efa\u4e24\u4e2a\u4e8b\u4ef6\u5904\u7406\u7c7b \/** * EventHandler&lt;LongEvent&gt; \u662f\u6ca1\u6709\u6c60\u5316\u7684\u5b9e\u73b0\u65b9\u5f0f,\u6bcf\u4e2a\u6d88\u8d39\u8005\u4e2d\u53ea\u6709\u4e00\u4e2a\u793a\u4f8b * WorkHandler&lt;LongEvent&gt; \u662f\u6c60\u5316\u7684\u5b9e\u73b0\u65b9\u5f0f\uff0c\u6bcf\u4e2a\u6d88\u8d39\u8005\u4e2d\u53ef\u4ee5\u4ee5\u7c7b\u4f3c\u7ebf\u7a0b\u6c60\u7684\u65b9\u5f0f\u53bb\u6267\u884c\u8fd9\u4e2a\u4e8b\u4ef6 * \u5b9e\u9645\u6839\u636e\u4e1a\u52a1\u573a\u666f \u5b9e\u73b0\u5176\u4e2d\u4e00\u4e2a\u63a5\u53e3\u5c31\u53ef\u4ee5 *\/ public class A1Handler implements EventHandler&lt;LongEvent&gt; , WorkHandler&lt;LongEvent&gt; { public void onEvent(LongEvent longEvent, long l, boolean b) throws Exception { long id = longEvent."},{"title":"Disruptor-\u751f\u4ea7\u8005\u53d1\u5e03\u65b9\u5f0f","link":"https:\/\/blog.greycode.top\/posts\/926f33f0-651d-471a-ad0c-b632fcce8c0f\/","pubDate":"Mon, 01 Mar 2021 09:57:58 +0000","guid":"https:\/\/blog.greycode.top\/posts\/926f33f0-651d-471a-ad0c-b632fcce8c0f\/","description":"\u65e7\u7248\u672cAPI\u53d1\u5e03\u65b9\u5f0f import com.lmax.disruptor.RingBuffer; public class LongEventProducer{ private final RingBuffer&lt;LongEvent&gt; ringBuffer; public LongEventProducer(RingBuffer&lt;LongEvent&gt; ringBuffer){ this.ringBuffer = ringBuffer; } public void onData(ByteBuffer bb){ long sequence = ringBuffer.next(); \/\/ Grab the next sequence try{ LongEvent event = ringBuffer.get(sequence); \/\/ Get the entry in the Disruptor \/\/ for the sequence event.set(bb.getLong(0)); \/\/ Fill with data } finally{ ringBuffer.publish(sequence); } } } \u4f7f\u7528 RingBuffer&lt;LongEvent&gt; ringBuffer = disruptor.start(); LongEventProducer producer = new LongEventProducer(ringBuffer); ByteBuffer bb = ByteBuffer."},{"title":"Dubbo\u7684Telnet\u8c03\u8bd5\u4e09\u90e8\u66f2","link":"https:\/\/blog.greycode.top\/posts\/dcf9d2d8-9c11-404a-874d-57834303dcac\/","pubDate":"Fri, 05 Feb 2021 14:04:54 +0000","guid":"https:\/\/blog.greycode.top\/posts\/dcf9d2d8-9c11-404a-874d-57834303dcac\/","description":"\u7b2c\u4e00\u6b65 \u627e\u5230Dubbo\u670d\u52a1\u7684IP\u5730\u5740\uff0c\u6bd4\u5982\u6211\u7684Dubbo\u670d\u52a1\u5730\u5740\u662f192.168.1.11\n\u7b2c\u4e8c\u6b65 \u4f7f\u7528\u547d\u4ee4\u8fde\u63a5Dubbo\u670d\u52a1\ntelnet 192.168.1.11 20880 \u7b2c\u4e09\u6b65 \u76f4\u63a5\u8c03\u8bd5\u65b9\u6cd5\n# \u8c03\u8bd5TestService\u7c7b\u4e0b\u7684get\u65b9\u6cd5 invoke com.example.test.service.TestService.get(1132359) \u8d44\u6599 https:\/\/dubbo.apache.org\/zh\/docs\/v2.7\/user\/references\/telnet\/"},{"title":"Hexo\u4f7f\u7528UUID\u751f\u6210\u6587\u7ae0\u8def\u5f84","link":"https:\/\/blog.greycode.top\/posts\/79b5fe12-9c60-4b93-be92-dffb00fa39c7\/","pubDate":"Wed, 27 Jan 2021 17:51:05 +0000","guid":"https:\/\/blog.greycode.top\/posts\/79b5fe12-9c60-4b93-be92-dffb00fa39c7\/","description":"\u6559\u7a0b \u7f16\u5199\u4e00\u4e2a\u540d\u4e3ahexoN\u7684\u811a\u672c\u6587\u4ef6 #!\/bin\/bash uuid=$(sudo cat \/proc\/sys\/kernel\/random\/uuid) echo $uuid hexo new $uuid \u6dfb\u52a0\u6267\u884c\u6743\u9650 chmod +x hexoN \u5728\u7528\u6237\u6839\u76ee\u5f55\u7684.zshrc(\u56e0\u4e3a\u6211\u7528\u7684\u662fohmyzsh\uff0c\u6240\u4ee5\u662f\u8fd9\u4e2a\u6587\u4ef6\uff0c\u4e00\u822c\u662f.bashrc\uff0c\u4e5f\u53ef\u76f4\u63a5\u52a0\u8f7d\u7cfb\u7edf\u6587\u4ef6\/etc\/profile\u4e2d)\u8ffd\u52a0\u4e00\u6761 # \u540e\u9762\u5730\u5740\u662f\u5b58\u653e\u8fd9\u4e2a\u811a\u672c\u7684\u6587\u4ef6\u5939\u8def\u5f84 \u6839\u636e\u5b9e\u9645\u66f4\u6539 export PATH=$PATH:\/home\/zheng\/software\/shell \u6267\u884c\u547d\u4ee4\u662f\u521a\u624d\u8ffd\u52a0\u7684\u5185\u5bb9\u751f\u6548 source .zshrc \u4f7f\u7528 \u5230Hexo\u535a\u5ba2\u7684\u6839\u76ee\u5f55\u6267\u884c"},{"title":"\u4f7f\u7528GitHub Actions\u7f16\u8bd1\u6811\u8393\u6d3e\u5185\u6838","link":"https:\/\/blog.greycode.top\/posts\/github-actions-build-pi-kernerl\/","pubDate":"Tue, 26 Jan 2021 15:56:07 +0000","guid":"https:\/\/blog.greycode.top\/posts\/github-actions-build-pi-kernerl\/","description":"\u4ed3\u5e93\u5730\u5740 \u4ed3\u5e93\u5730\u5740\uff1ahttps:\/\/github.com\/GreyCode9\/make-raspberrypi-kernel\n\u521b\u5efa\u79d8\u94a5 \u70b9\u51fbGithub\u53f3\u4e0a\u89d2\u5934\u50cf -&gt; Settings -&gt; Developer settings -&gt; Personal access tokens -&gt; Generate new token \u6216\u8005\u76f4\u63a5\u70b9\u8fd9\u4e2a\u94fe\u63a5\u8fdb\u5165\uff1a https:\/\/github.com\/settings\/tokens\n\u521b\u5efa\u540e\u4fdd\u5b58\u8fd9\u4e2a\u79d8\u94a5(\u79d8\u94a5\u53ea\u663e\u793a\u4e00\u6b21)\n\u521b\u5efa\u4ed3\u5e93 \u521b\u5efa\u4ed3\u5e93**make-raspberrypi-kernel**\n\u7136\u540e\u70b9\u51fb\u4ed3\u5e93\u7684Settings -&gt; Secrets -&gt;New repository secret\n\u7136\u540e\u586b\u5165\u521a\u624d\u751f\u6210\u7684\u79d8\u94a5\n\u521b\u5efaActions \u63a5\u7740\u70b9\u51fbActions ,\u521b\u5efa\u4e00\u4e2aActions\uff0c\u7136\u540e\u586b\u5165\u5982\u4e0b\u5185\u5bb9\nname: Make RaspberryPi Kernel on: push: tags: - &#39;v*&#39; # \u5f53\u63a8\u9001\u7684Tag\u4e3av\u5f00\u5934\u7684\uff0c\u5c31\u4f1a\u89e6\u53d1\u6784\u5efa env: USE_SSH_CONFIG: true # \u662f\u5426\u4f7f\u7528ssh\u8fde\u63a5\u8fdb\u884c true:\u4f7f\u7528 false:\u4e0d\u4f7f\u7528 jobs: build: runs-on: ubuntu-18.04 steps: - uses: actions\/checkout@v2 - name: pull RaspberryPi Kernel linux run: | cd ..\/ git clone https:\/\/github."},{"title":"Git\u5e38\u7528\u547d\u4ee4","link":"https:\/\/blog.greycode.top\/posts\/git-commend-note\/","pubDate":"Wed, 16 Sep 2020 15:16:56 +0000","guid":"https:\/\/blog.greycode.top\/posts\/git-commend-note\/","description":"Git\u7b80\u4ecb Git \u662f\u7528\u4e8e Linux\u5185\u6838\u5f00\u53d1\u7684\u7248\u672c\u63a7\u5236\u5de5\u5177\u3002\u4e0e\u5e38\u7528\u7684\u7248\u672c\u63a7\u5236\u5de5\u5177 CVS, Subversion \u7b49\u4e0d\u540c\uff0c\u5b83\u91c7\u7528\u4e86\u5206\u5e03\u5f0f\u7248\u672c\u5e93\u7684\u65b9\u5f0f\uff0c\u4e0d\u5fc5\u670d\u52a1\u5668\u7aef\u8f6f\u4ef6\u652f\u6301\uff08wingeddevil\u6ce8\uff1a\u8fd9\u5f97\u5206\u662f\u7528\u4ec0\u4e48\u6837\u7684\u670d\u52a1\u7aef\uff0c\u4f7f\u7528http\u534f\u8bae\u6216\u8005git\u534f\u8bae\u7b49\u4e0d\u592a\u4e00\u6837\u3002\u5e76\u4e14\u5728push\u548cpull\u7684\u65f6\u5019\u548c\u670d\u52a1\u5668\u7aef\u8fd8\u662f\u6709\u4ea4\u4e92\u7684\u3002\uff09\uff0c\u4f7f\u6e90\u4ee3\u7801\u7684\u53d1\u5e03\u548c\u4ea4\u6d41\u6781\u5176\u65b9\u4fbf\u3002 Git \u7684\u901f\u5ea6\u5f88\u5feb\uff0c\u8fd9\u5bf9\u4e8e\u8bf8\u5982 Linux kernel \u8fd9\u6837\u7684\u5927\u9879\u76ee\u6765\u8bf4\u81ea\u7136\u5f88\u91cd\u8981\u3002 Git \u6700\u4e3a\u51fa\u8272\u7684\u662f\u5b83\u7684\u5408\u5e76\u8ddf\u8e2a\uff08merge tracing\uff09\u80fd\u529b\u3002\ngit\u5bf9\u4e8e\u5f88\u591a\u4eba\u6765\u8bf4,\u771f\u7684\u662f\u53c8\u7231\u53c8\u6068,\u7528\u7684\u597d\u53ef\u4ee5\u63d0\u793a\u5f00\u53d1\u6548\u7387;\u7528\u4e0d\u597d,\u89e3\u51b3\u5404\u79cd\u51b2\u7a81\u5c31\u8981\u7d2f\u7684\u4f60\u534a\u6b7b\ngit\u7ed3\u6784 \u7f51\u4e0a\u6709 \u6211\u5c31\u4e0d\u753b\u4e86\nworkspace \u76f8\u5f53\u4e8e\u5c31\u662f\u6211\u4eec\u7684\u672c\u5730\u7535\u8111\u4e0a\u7684\u6587\u4ef6\nIndex \u7f13\u5b58\u533a\nRepository \u672c\u5730\u4ed3\u5e93\nRemote \u8fdc\u7a0b\u4ed3\u5e93(github\/gitlab\/gitee)\ngit\u547d\u4ee4 git\u5b98\u65b9\u63d0\u4f9b\u7684\u547d\u4ee4\u591a\u8fbe\u51e0\u767e\u4e2a,\u53ef\u662f\u6211\u4eec\u65e5\u5e38\u5374\u7528\u4e0d\u5230\u8fd9\u4e48\u591a\n\u6240\u4ee5\u6211\u5c31\u6574\u7406\u4e86\u4e00\u4e0b\u65e5\u5e38\u4f7f\u7528\u7684\u547d\u4ee4\n\u73b0\u5728\u5173\u6ce8\u5fae\u4fe1\u516c\u62db:\u7070\u8272Code\n\u56de\u590d\u5173\u952e\u5b57:git\n\u5c31\u53ef\u4ee5\u83b7\u53d6\u601d\u7ef4\u5bfc\u56fe\u9ad8\u6e05\u56fe\u7247\u53ca\u5bfc\u56fe\u6e90\u5730\u5740"},{"title":"Fegin\u548cRestTemplate\u6dfb\u52a0\u5168\u5c40\u8bf7\u6c42\u5934","link":"https:\/\/blog.greycode.top\/posts\/fegin-resttemplate-addheard\/","pubDate":"Wed, 16 Sep 2020 15:14:43 +0000","guid":"https:\/\/blog.greycode.top\/posts\/fegin-resttemplate-addheard\/","description":"Fegin\u6dfb\u52a0\u5168\u5c40\u8bf7\u6c42\u5934 \u5b9e\u73b0RequestInterceptor\u63a5\u53e3 \/** * \u5b9e\u73b0RequestInterceptor\u63a5\u53e3\u7684apply\u65b9\u6cd5 *\/ @Configuration public class FeignRequestInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder .getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); Enumeration&lt;String&gt; headerNames = request.getHeaderNames(); if (headerNames != null) { while (headerNames.hasMoreElements()) { String name = headerNames.nextElement(); String values = request.getHeader(name); requestTemplate.header(name, values); } } } } \u5728@FeginClient\u6ce8\u91ca\u91ccconfiguration\u6240\u586b\u5165\u7684\u7c7b\u6587\u4ef6\u4e2d\u6dfb\u52a0\u4e0a\u9762\u7684\u62e6\u622a\u5668\n\u6bd4\u5982\n\/\/ configuration\u6307\u5b9a\u7684\u7c7b\u4e3aFeignConfig @FeignClient(name = &#34;${TinyConfigServiceName}&#34;,path=&#34;\/config&#34;,configuration = FeignConfig.class) \u5728FeignConfig\u7c7b\u4e2d\u6dfb\u52a0\u62e6\u622a\u5668\n@Configuration public class FeignConfig { @Bean public RequestInterceptor requestInterceptor(){ return new FeignRequestInterceptor(); } } RestTemplate\u6dfb\u52a0\u5168\u5c40\u8bf7\u6c42\u5934 \u7f16\u5199\u62e6\u622a\u5668,\u5b9e\u73b0ClientHttpRequestInterceptor\u63a5\u53e3\u7684intercept\u65b9\u6cd5"},{"title":"\u6d45\u8c08MDC","link":"https:\/\/blog.greycode.top\/posts\/mdc-test\/","pubDate":"Wed, 16 Sep 2020 15:10:47 +0000","guid":"https:\/\/blog.greycode.top\/posts\/mdc-test\/","description":"MDC\u662f\u4ec0\u4e48\uff1f MDC \u5168\u62fc Mapped Diagnostic Contexts\uff0c\u662fSLF4J\u7c7b\u65e5\u5fd7\u7cfb\u7edf\u4e2d\u5b9e\u73b0\u5206\u5e03\u5f0f\u591a\u7ebf\u7a0b\u65e5\u5fd7\u6570\u636e\u4f20\u9012\u7684\u91cd\u8981\u5de5\u5177\uff1b\u53ef\u5229\u7528MDC\u5c06\u4e00\u4e9b\u8fd0\u884c\u65f6\u7684\u4e0a\u4e0b\u6587\u6570\u636e\u6253\u5370\u51fa\u6765\u3002\u76ee\u524d\u53ea\u6709log4j\u548clogback\u63d0\u4f9b\u539f\u751f\u7684MDC\u652f\u6301\uff1b\n\u7b80\u5355\u4f7f\u7528 MDC\u91cc\u9762\u63d0\u4f9b\u7684\u90fd\u662f\u9759\u6001\u65b9\u6cd5\uff0c\u6240\u4ee5\u53ef\u4ee5\u76f4\u63a5\u8c03\u7528\n\/\/ \u8bbe\u7f6e\u4e00\u4e2akey MDC.put(&#34;name&#34;,&#34;\u7070\u8272Code&#34;); \/\/ \u83b7\u53d6\u4e00\u4e2akey\u7684\u503c MDC.get(&#34;name&#34;); \/\/ \u5220\u9664\u4e00\u4e2akey MDC.remove(&#34;name&#34;); \/\/ \u6e05\u7a7aMDC\u91cc\u7684\u5185\u5bb9 MDC.clear(); \/\/ \u83b7\u53d6\u4e0a\u4e0b\u6587\u4e2d\u7684map Map&lt;String,String&gt; map = MDC.getCopyOfContextMap(); \/\/ \u8bbe\u7f6eMDC\u7684map MDC.setContextMap(map); \u6e90\u7801\u89e3\u6790 MDC \u901a\u8fc7\u9605\u8bfbMDC\u7684\u6e90\u7801\u53ef\u4ee5\u53d1\u73b0\uff0c\u5b83\u5176\u5b9e\u662f\u8c03\u7528\u4e86MDCAdapter\u7684\u63a5\u53e3\u6765\u5b9e\u73b0\u7684\nMDCAdapter MDCAdapter\u63a5\u53e3\u6709\u4e09\u4e2a\u5b9e\u73b0\u7c7b\uff0c\u800cMDC\u662f\u8c03\u7528\u4e86LogbackMDCAdapter\u91cc\u7684\u65b9\u6cd5(\u5728MDC\u91cc\u6709\u4e00\u4e2a\u9759\u6001\u4ee3\u7801\u5757\uff0c\u5b9e\u4f8b\u5316\u4e86\u8fd9\u4e2a\u5bf9\u8c61)\nLogbackMDCAdapter \u800cLogbackMDCAdapter\u4e3b\u8981\u662f\u7528ThreadLocal\u5728\u7ebf\u7a0b\u4e0a\u4e0b\u6587\u4e2d\u7ef4\u62a4\u4e00\u4e2aHashMap\u6765\u5b9e\u73b0\u7684\n\u603b\u7ed3 \u600e\u4e48\u6837,\u5b9e\u73b0\u539f\u7406\u662f\u4e0d\u662f\u5f88\u7b80\u5355\uff0c\u5c31\u8fd9\u4e48\u77ed\u77ed\u51e0\u884c\u4ee3\u7801\uff0c\u5c31\u5b9e\u73b0\u4e86\u542c\u8d77\u6765\u5f88\u9ad8\u5927\u4e0a\u7684MDC\u3002\n\u6240\u4ee5\u7b80\u5355\u6765\u8bf4\uff0cMDC\u5c31\u662f\u5229\u7528ThreadLocal\u5728\u7ebf\u7a0b\u4e2d\u7ef4\u62a4\u4e86\u4e00\u4e2aHashMap\uff0c\u5229\u7528HashMap\u6765\u5b58\u653e\u6570\u636e"},{"title":"JDKproxy\u548cCglib\u521d\u63a2","link":"https:\/\/blog.greycode.top\/posts\/jdkproxy-cglib\/","pubDate":"Wed, 16 Sep 2020 15:09:47 +0000","guid":"https:\/\/blog.greycode.top\/posts\/jdkproxy-cglib\/","description":"JDKproxy\u548cCglib\u521d\u63a2 \u7b80\u4ecb \u5728Java\u4e2d\uff0c\u52a8\u6001\u4ee3\u7406\u673a\u5236\u7684\u51fa\u73b0\uff0c\u4f7f\u5f97Java\u5f00\u53d1\u4eba\u5458\u4e0d\u7528\u624b\u5de5\u7f16\u5199\u4ee3\u7406\u7c7b\uff0c\u53ea\u8981\u7b80\u5355\u5730\u5236\u5b9a\u4e00\u7ec4\u63a5\u53e3\u53ca\u59d4\u6258\u7c7b\u5bf9\u8c61\uff0c\u4fbf\u80fd\u52a8\u6001\u5730\u83b7\u5f97\u4ee3\u7406\u7c7b\u3002\u52a8\u6001\u4ee3\u7406\u5728Java\u4e2d\u6709\u7740\u5e7f\u6cdb\u7684\u5e94\u7528\uff0c\u6bd4\u5982Spring AOP\uff0cHibernate\u6570\u636e\u67e5\u8be2\u3001\u6d4b\u8bd5\u6846\u67b6\u7684\u540e\u7aefmock\u3001RPC\uff0cJava\u6ce8\u89e3\u5bf9\u8c61\u83b7\u53d6\u7b49\u3002\nJDK\u539f\u751f\u52a8\u6001\u4ee3\u7406(JDKProxy) JDKProxy\u53ea\u80fd\u5bf9\u5b9e\u73b0\u4e86\u63a5\u53e3\u7684\u7c7b\u751f\u6210\u4ee3\u7406\uff0c\u800c\u4e0d\u80fd\u9488\u5bf9\u666e\u901a\u7c7b \u3002JDKProxy\u539f\u751f\u7684\u53cd\u5c04API\u8fdb\u884c\u64cd\u4f5c\uff0c\u5728\u751f\u6210\u7c7b\u4e0a\u6bd4\u8f83\u9ad8\u6548\u3002\n\u4f7f\u7528 interface TestInterface{ void test(); } class TestClass implements TestInterface{ @Override public void test(){ System.out.println(&#34;JDK\u52a8\u6001\u4ee3\u7406&#34;); } } \/\/\u4e3b\u65b9\u6cd5 public class JDKProxy { public static void main(String[] args) { TestClass testClass=new TestClass(); ProxyHandle proxyHandle=new ProxyHandle(testClass); \/\/\u4f7f\u7528\u63a5\u53e3 TestInterface testClass1= (TestInterface) Proxy.newProxyInstance( testClass.getClass().getClassLoader(), testClass.getClass().getInterfaces(),proxyHandle); testClass1.test(); System.out.println(&#34;\u4ee3\u7406\u7c7b\u540d\u79f0\uff1a&#34;+testClass1.getClass()); } } \/\/\u4ee3\u7406 class ProxyHandle implements InvocationHandler{ private Object originaObj; public ProxyHandle(Object o){ this.originaObj=o; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System."},{"title":"Java\u5305\u88c5\u7c7b\u7f13\u5b58\u673a\u5236","link":"https:\/\/blog.greycode.top\/posts\/java-base-data-pack\/","pubDate":"Wed, 16 Sep 2020 15:08:18 +0000","guid":"https:\/\/blog.greycode.top\/posts\/java-base-data-pack\/","description":"\u9762\u8bd5\u9898 \u9996\u5148,\u6765\u770b\u4e00\u9053\u5e38\u89c1\u7684\u9762\u8bd5\u9898,\u4e0b\u9762\u4ee3\u7801\u8fd0\u884c\u540e\u4f1a\u8f93\u51fa\u4ec0\u4e48?\n\u4e0a\u9762\u4ee3\u7801\u8fd0\u884c\u540e,\u6700\u7ec8\u4f1a\u8f93\u51fafalse\u548ctrue;\u4e3a\u4ec0\u4e48\u4f1a\u8fd9\u6837\u5462?\n\u6309\u9053\u7406\u6765\u8bf4,\u5728Java\u4e2d==\u662f\u6bd4\u8f83\u4e24\u4e2a\u5bf9\u8c61\u7684\u5730\u5740,\u4e0a\u9762\u4ee3\u7801\u4e2di3\u548ci4\u662f\u4e24\u4e2a\u4e0d\u540c\u7684\u5bf9\u8c61,\u7406\u5e94\u4e5f\u5e94\u8be5\u8fd4\u56de\u662ffalse,\u600e\u4e48\u8fd4\u56de\u662ftrue\u5462?\u8ba9\u6211\u4eec\u6162\u6162\u5f80\u4e0b\u770b\nInteger\u7684\u7f13\u5b58\u673a\u5236 \u8ba9\u6211\u4eec\u6765\u770b\u770b\u4ed6\u7684\u6e90\u4ee3\u7801.\n\u5f53\u6267\u884cInteger i=128;\u8fd9\u4e2a\u8bed\u53e5\u65f6,Java\u4f1a\u8c03\u7528valueOf(int i)\u65b9\u6cd5,\u7136\u540e\u81ea\u52a8\u88c5\u7bb1\u7684\u65b9\u5f0f,\u8ba9\u5176\u53d8\u6210Integer i=new Integer(128),\u5177\u4f53\u6e90\u7801\u5982\u4e0b:\npublic static Integer valueOf(int i) { if (i &gt;= IntegerCache.low &amp;&amp; i &lt;= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; \/\/\u88c5\u7bb1 return new Integer(i); } \u4ece\u4e0a\u9762\u7684\u6e90\u7801\u4e2d\u53ef\u4ee5\u770b\u5230,\u5728\u88c5\u7bb1\u4e4b\u524d\u4f1a\u6267\u884c\u4e00\u4e2aif\u8bed\u53e5,\u8fd9\u4e2aif\u8bed\u53e5\u5c31\u662f\u5224\u65ad\u4f20\u5165\u7684\u503c\u662f\u5426\u5728\u7f13\u5b58\u5185,\u5982\u679c\u5728\u7f13\u5b58\u5185,\u5c31\u76f4\u63a5\u8fd4\u56de\u7f13\u5b58\u5185\u7684\u503c,\u5982\u679c\u4e0d\u5728\u7f13\u5b58\u5185,\u5c31\u88c5\u7bb1,\u5728\u5806\u5185\u521b\u5efa\u4e00\u4e2a\u65b0\u7a7a\u95f4\u6765\u5b58\u653e.\n\/\/Integer\u5305\u88c5\u7c7b\u7f13\u5b58\u6e90\u7801 private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { \/\/ high value may be configured by property int h = 127; String integerCacheHighPropValue = sun."},{"title":"JVM\u8fd0\u884c\u65f6\u6808\u5e27","link":"https:\/\/blog.greycode.top\/posts\/java-jvm-stack-1\/","pubDate":"Wed, 16 Sep 2020 15:06:15 +0000","guid":"https:\/\/blog.greycode.top\/posts\/java-jvm-stack-1\/","description":"\u5728JVM\u4e2d\uff0c\u6bcf\u4e2a\u7ebf\u7a0b\u90fd\u5305\u542bn\u4e2a\u6808\u5e27\uff0c\u6bcf\u4e00\u4e2a\u6808\u5e27\u90fd\u5305\u62ec\u4e86\u5c40\u90e8\u53d8\u91cf\u8868\u3001\u64cd\u4f5c\u6570\u6808\u3001\u52a8\u6001\u8fde\u63a5\u3001\u65b9\u6cd5\u8fd4\u56de\u5730\u5740\u548c\u4e00\u4e9b\u989d\u5916\u7684\u9644\u52a0\u4fe1\u606f\u3002\n\u6808\u5e27\u7684\u751f\u547d\u5468\u671f\u968f\u7740\u65b9\u6cd5\u7684\u521b\u5efa\u800c\u521b\u5efa\uff0c\u968f\u7740\u65b9\u6cd5\u7684\u7ed3\u675f\u800c\u9500\u6bc1\uff0c\u65e0\u8bba\u65b9\u6cd5\u662f\u6b63\u5e38\u5b8c\u6210\u8fd8\u662f\u5f02\u5e38\u5b8c\u6210\uff08\u629b\u51fa\u4e86\u5728\u65b9\u6cd5\u5185\u672a\u88ab\u6355\u83b7\u7684\u5f02\u5e38\uff09\u90fd\u7b97\u65b9\u6cd5\u7684\u7ed3\u675f\u3002\n\u5728\u67d0\u6761\u7ebf\u7a0b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u67d0\u4e2a\u65f6\u95f4\u70b9\u4e0a\uff0c\u53ea\u6709\u76ee\u524d\u6b63\u5728\u6267\u884c\u7684\u90a3\u4e2a\u65b9\u6cd5\u7684\u6808\u5e27\u662f\u6d3b\u52a8\u7684\u3002\u8fd9\u4e2a\u6808\u5e27\u79f0\u4e3a\u5f53\u524d\u6808\u5e27\uff0c\u8fd9\u4e2a\u6808\u5e27\u5bf9\u5e94\u7684\u65b9\u6cd5\u79f0\u4e3a\u5f53\u524d\u65b9\u6cd5\uff0c\u5b9a\u4e49\u8fd9\u4e2a\u65b9\u6cd5\u7684\u7c7b\u79f0\u4e3a\u5f53\u524d\u7c7b\u3002\u5bf9\u5c40\u90e8\u53d8\u91cf\u8868\u548c\u64cd\u4f5c\u6570\u6808\u7684\u5404\u79cd\u64cd\u4f5c\uff0c\u901a\u5e38\u90fd\u6307\u7684\u662f\u5bf9\u5f53\u524d\u6808\u5e27\u7684\u5c40\u90e8\u53d8\u91cf\u8868\u548c\u64cd\u4f5c\u6570\u6808\u6240\u8fdb\u884c\u7684\u64cd\u4f5c\u3002\n**\u6ce8\u610f:**\u6808\u5e27\u662f\u7ebf\u7a0b\u672c\u5730\u79c1\u6709\u7684\u6570\u636e\uff0c\u4e0d\u53ef\u80fd\u5728\u4e00\u4e2a\u6808\u5e27 \u4e4b\u4e2d\u5f15\u7528\u53e6\u5916\u4e00\u4e2a\u7ebf\u7a0b\u7684\u6808\u5e27\n\u5c40\u90e8\u53d8\u91cf\u8868 \u5c40\u90e8\u53d8\u91cf\u8868\uff08Local Variables Table\uff09\u662f\u4e00\u7ec4\u53d8\u91cf\u503c\u7684\u5b58\u50a8\u7a7a\u95f4\uff0c\u7528\u4e8e\u5b58\u653e\u65b9\u6cd5\u53c2\u6570\u548c\u65b9\u6cd5\u5185\u90e8\u5b9a\u4e49\u7684\u5c40\u90e8\u53d8\u91cf\u3002\n\u5b58\u50a8\u65b9\u6cd5 \u5c40\u90e8\u53d8\u91cf\u8868\u7684\u5bb9\u91cf\u4ee5\u53d8\u91cf\u69fd\uff08Variable Slot\uff09\u4e3a\u6700\u5c0f\u5355\u4f4d\uff0c\u4e00\u822c\u5728\u865a\u62df\u673a\u4e2d\uff0c\u4e00\u4e2aSlot\u5360\u752832\u4f4d\u5b58\u50a8\u7a7a\u95f4(\u8fd9\u4e0d\u662f\u56fa\u5b9a\u7684\uff0c\u865a\u62df\u673a\u53ef\u4ee5\u81ea\u884c\u6539\u53d8\u6bcf\u4e2a\u69fd\u5360\u7528\u7a7a\u95f4\u7684\u5927\u5c0f,\u4f46\u4e00\u822c\u90fd\u662f32\u4f4d)\u3002\nJava\u865a\u62df\u673a\u901a\u8fc7\u7d22\u5f15\u5b9a\u4f4d\u7684\u65b9\u5f0f\u4f7f\u7528\u5c40\u90e8\u53d8\u91cf\u8868\uff0c\u7d22\u5f15\u503c\u7684\u8303\u56f4\u662f\u4ece0\u5f00\u59cb\u81f3\u5c40\u90e8\u53d8\u91cf\u8868\u6700\u5927\u7684\u53d8\u91cf\u69fd\u6570\u91cf\u3002\u5982\u679c\u8bbf\u95ee\u7684\u662f32\u4f4d\u6570\u636e\u7c7b\u578b\u7684\u53d8\u91cf\uff0c\u7d22\u5f15N\u5c31\u4ee3\u8868\u4e86\u4f7f\u7528\u7b2cN\u4e2a\u53d8\u91cf\u69fd\uff0c\u5982\u679c\u8bbf\u95ee\u7684\u662f64\u4f4d\u6570\u636e\u7c7b\u578b\u7684\u53d8\u91cf\uff0c\u5219\u8bf4\u660e\u4f1a\u540c\u65f6\u4f7f\u7528\u7b2cN\u548cN+1\u4e24\u4e2a\u53d8\u91cf\u69fd\u3002\neg: \u5728Java\u4e2d\uff0clong\u5728\u5185\u5b58\u536064\u4f4d\uff0c\u6240\u4ee5\u5c40\u90e8\u53d8\u91cf\u8868\u75282\u4e2aslot\u6765\u5b58\u50a8\n\u5bf9\u4e8e\u4e24\u4e2a\u76f8\u90bb\u7684\u5171\u540c\u5b58\u653e\u4e00\u4e2a64\u4f4d\u6570\u636e\u7684\u4e24\u4e2a\u53d8\u91cf\u69fd\uff0c\u865a\u62df\u673a\u4e0d\u5141\u8bb8\u91c7\u7528\u4efb\u4f55\u65b9\u5f0f\u5355\u72ec\u8bbf\u95ee\u5176\u4e2d\u7684\u67d0\u4e00\u4e2a\uff0c\u300aJava\u865a\u62df\u673a\u89c4\u8303\u300b\u4e2d\u660e\u786e\u8981\u6c42\u4e86\u5982\u679c\u9047\u5230\u8fdb\u884c\u8fd9\u79cd\u64cd\u4f5c\u7684\u5b57\u8282\u7801\u5e8f\u5217\uff0c\u865a\u62df\u673a\u5c31\u5e94\u8be5\u5728\u7c7b\u52a0\u8f7d\u7684\u6821\u9a8c\u9636\u6bb5\u4e2d\u629b\u51fa\u5f02\u5e38\u3002\nlong\u548cdouble\u7684\u975e\u539f\u5b50\u6027\u534f\u5b9a \u5728Java\u5185\u5b58\u6a21\u578b\u4e2d\uff0c\u5bf9\u4e8e64\u4f4d\u7684\u6570\u636e\u7c7b\u578b\uff08long\u548cdouble\uff09\uff0c\u5728\u6a21\u578b\u4e2d\u7279\u522b\u5b9a\u4e49\u4e86\u4e00\u6761\u5bbd\u677e\u7684\u89c4\u5b9a\uff1a\u5141\u8bb8\u865a\u62df\u673a\u5c06\u6ca1\u6709\u88abvolatile\u4fee\u9970\u768464\u4f4d\u6570\u636e\u7684\u8bfb\u5199\u64cd\u4f5c\u5212\u5206\u4e3a\u4e24\u6b2132\u4f4d\u7684\u64cd\u4f5c\u6765\u8fdb\u884c\uff0c\u5373\u5141\u8bb8\u865a\u62df\u673a\u5b9e\u73b0\u81ea\u884c\u9009\u62e9\u662f\u5426\u8981\u4fdd\u8bc164\u4f4d\u6570\u636e\u7c7b\u578b\u7684load\u3001store\u3001read\u548cwrite\u8fd9\u56db\u4e2a\u64cd\u4f5c\u7684\u539f\u5b50\u6027\uff0c\u8fd9\u5c31\u662f\u6240\u8c13\u7684**\u201clong\u548cdouble\u7684\u975e\u539f\u5b50\u6027\u534f\u5b9a\u201d\uff08Non-Atomic Treatment of doubleand long Variables\uff09**\u3002\n\u867d\u7136\u6709\u8fd9\u4e2a\u534f\u5b9a\uff0c\u4f46\u662f\uff0c\u7531\u4e8e\u5c40\u90e8\u53d8\u91cf\u8868(Local Variable Table)\u662f\u5efa\u7acb\u5728\u7ebf\u7a0b\u5806\u6808\u4e2d\u7684\uff0c\u5c5e\u4e8e\u7ebf\u7a0b\u79c1\u6709\u7684\u6570\u636e\uff0c\u65e0\u8bba\u8bfb\u5199\u4e24\u4e2a\u8fde\u7eed\u7684\u53d8\u91cf\u69fd\u662f\u5426\u4e3a\u539f\u5b50\u64cd\u4f5c\uff0c\u90fd\u4e0d\u4f1a\u5f15\u8d77\u6570\u636e\u7ade\u4e89\u548c\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898\u3002\n\u521d\u59cb\u503c\u95ee\u9898 \u6211\u4eec\u5df2\u7ecf\u77e5\u9053\u7c7b\u7684\u5b57\u6bb5\u53d8\u91cf\u6709\u4e24\u6b21\u8d4b\u521d\u59cb\u503c\u7684\u8fc7\u7a0b\uff0c\u4e00\u6b21\u5728\u51c6\u5907\u9636\u6bb5\uff0c\u8d4b\u4e88\u7cfb\u7edf\u521d\u59cb\u503c\uff1b\u53e6\u5916\u4e00\u6b21\u5728\u521d\u59cb\u5316\u9636\u6bb5\uff0c\u8d4b\u4e88\u7a0b\u5e8f\u5458\u5b9a\u4e49\u7684\u521d\u59cb\u503c\u3002\n\u4f46\u5c40\u90e8\u53d8\u91cf\u5c31\u4e0d\u4e00\u6837\u4e86\uff0c\u5982\u679c\u4e00\u4e2a\u5c40\u90e8\u53d8\u91cf\u5b9a\u4e49\u4e86\u4f46\u6ca1\u6709\u8d4b\u521d\u59cb\u503c\uff0c\u90a3\u5b83\u662f\u5b8c\u5168\u4e0d\u80fd\u4f7f\u7528\u7684\u3002\u6240\u4ee5\u4e0d\u8981\u8ba4\u4e3aJava\u4e2d\u4efb\u4f55\u60c5\u51b5\u4e0b\u90fd\u5b58\u5728\u8bf8\u5982\u6574\u578b\u53d8\u91cf\u9ed8\u8ba4\u4e3a0\u3001\u5e03\u5c14\u578b\u53d8\u91cf\u9ed8\u8ba4\u4e3afalse\u7b49\u8fd9\u6837\u7684\u9ed8\u8ba4\u503c\u89c4\u5219\u3002\neg\uff1a \/\/ \u8fd9\u4e2a\u65b9\u6cd5\u4f1a\u62a5\uff1a \/\/ Error:(12, 28) java: variable y might not have been initialized public class JVMTest { public static void main(String[] args) { int y; int z=3; System.out.println(y+z); } } \/\/ \u8fd9\u4e2a\u4f1a\u6b63\u5e38\u8f93\u51fa 3\uff1b \u56e0\u4e3aint\u7684\u521d\u59cb\u503c\u4e3a0 public class JVMTest { private static int y; public static void main(String[] args) { int z=3; System."},{"title":"JVM\u7c7b\u52a0\u8f7d\u8fc7\u7a0b","link":"https:\/\/blog.greycode.top\/posts\/java-class-load-2\/","pubDate":"Wed, 16 Sep 2020 15:04:22 +0000","guid":"https:\/\/blog.greycode.top\/posts\/java-class-load-2\/","description":"\u52a0\u8f7d \u901a\u8fc7\u4e00\u4e2a\u7c7b\u7684\u5168\u9650\u5b9a\u540d(\u4f8b\u5982\uff1ajava.lang.String)\u6765\u83b7\u53d6\u5b9a\u4e49\u6b64\u7c7b\u7684\u4e8c\u8fdb\u5236\u5b57\u8282\u6d41\u3002\n\u5c06\u8fd9\u4e2a\u5b57\u8282\u6d41\u6240\u4ee3\u8868\u7684\u9759\u6001\u5b58\u50a8\u7ed3\u6784\u8f6c\u5316\u4e3a\u65b9\u6cd5\u533a\u7684\u8fd0\u884c\u65f6\u6570\u636e\u7ed3\u6784\u3002\n\u5728\u5185\u5b58\u4e2d\u751f\u6210\u4e00\u4e2a\u4ee3\u8868\u8fd9\u4e2a\u7c7b\u7684java.lang.Class\u5bf9\u8c61\uff0c\u4f5c\u4e3a\u65b9\u6cd5\u533a\u8fd9\u4e2a\u7c7b\u7684\u5404\u79cd\u6570\u636e\u7684\u8bbf\u95ee\u5165\u53e3\u3002\n\u5bf9\u4e8e\u6570\u7ec4\u7c7b\u800c\u8a00\uff0c\u60c5\u51b5\u5c31\u6709\u6240\u4e0d\u540c\uff0c\u6570\u7ec4\u7c7b\u672c\u8eab\u4e0d\u901a\u8fc7\u7c7b\u52a0\u8f7d\u5668\u521b\u5efa\uff0c\u5b83\u662f\u7531Java\u865a\u62df\u673a\u76f4\u63a5\u5728\u5185\u5b58\u4e2d\u52a8\u6001\u6784\u9020\u51fa\u6765\u7684\u3002\n\u4eceZIP\u538b\u7f29\u5305\u4e2d\u8bfb\u53d6\uff0c\u8fd9\u5f88\u5e38\u89c1\uff0c\u6700\u7ec8\u6210\u4e3a\u65e5\u540eJAR\u3001EAR\u3001WAR\u683c\u5f0f\u7684\u57fa\u7840\u3002\n\u4ece\u7f51\u7edc\u4e2d\u83b7\u53d6\uff0c\u8fd9\u79cd\u573a\u666f\u6700\u5178\u578b\u7684\u5e94\u7528\u5c31\u662fWeb Applet\u3002\n\u8fd0\u884c\u65f6\u8ba1\u7b97\u751f\u6210\uff0c\u8fd9\u79cd\u573a\u666f\u4f7f\u7528\u5f97\u6700\u591a\u7684\u5c31\u662f\u52a8\u6001\u4ee3\u7406\u6280\u672f\uff0c\u5728java.lang.reflect.Proxy\u4e2d\uff0c\u5c31\u662f\u7528\u4e86ProxyGenerator.generateProxyClass()\u6765\u4e3a\u7279\u5b9a\u63a5\u53e3\u751f\u6210\u5f62\u5f0f\u4e3a\u201c*$Proxy\u201d\u7684\u4ee3\u7406\u7c7b\u7684\u4e8c\u8fdb\u5236\u5b57\u8282\u6d41\u3002\n\u7531\u5176\u4ed6\u6587\u4ef6\u751f\u6210\uff0c\u5178\u578b\u573a\u666f\u662fJSP\u5e94\u7528\uff0c\u7531JSP\u6587\u4ef6\u751f\u6210\u5bf9\u5e94\u7684Class\u6587\u4ef6\u3002\n\u4ece\u6570\u636e\u5e93\u4e2d\u8bfb\u53d6\uff0c\u8fd9\u79cd\u573a\u666f\u76f8\u5bf9\u5c11\u89c1\u4e9b\uff0c\u4f8b\u5982\u6709\u4e9b\u4e2d\u95f4\u4ef6\u670d\u52a1\u5668\uff08\u5982SAP Netweaver\uff09\u53ef\u4ee5\u9009\u62e9\u628a\u7a0b\u5e8f\u5b89\u88c5\u5230\u6570\u636e\u5e93\u4e2d\u6765\u5b8c\u6210\u7a0b\u5e8f\u4ee3\u7801\u5728\u96c6\u7fa4\u95f4\u7684\u5206\u53d1\u3002\n\u53ef\u4ee5\u4ece\u52a0\u5bc6\u6587\u4ef6\u4e2d\u83b7\u53d6\uff0c\u8fd9\u662f\u5178\u578b\u7684\u9632Class\u6587\u4ef6\u88ab\u53cd\u7f16\u8bd1\u7684\u4fdd\u62a4\u63aa\u65bd\uff0c\u901a\u8fc7\u52a0\u8f7d\u65f6\u89e3\u5bc6Class\u6587\u4ef6\u6765\u4fdd\u969c\u7a0b\u5e8f\u8fd0\u884c\u903b\u8f91\u4e0d\u88ab\u7aa5\u63a2\u3002\n\u9a8c\u8bc1 \u6587\u4ef6\u683c\u5f0f\u9a8c\u8bc1 \u662f\u5426\u4ee5\u9b54\u65700xCAFEBABE\u5f00\u5934\u3002 \u4e3b\u3001\u6b21\u7248\u672c\u53f7\u662f\u5426\u5728\u5f53\u524dJava\u865a\u62df\u673a\u63a5\u53d7\u8303\u56f4\u4e4b\u5185 \u5e38\u91cf\u6c60\u7684\u5e38\u91cf\u4e2d\u662f\u5426\u6709\u4e0d\u88ab\u652f\u6301\u7684\u5e38\u91cf\u7c7b\u578b\uff08\u68c0\u67e5\u5e38\u91cftag\u6807\u5fd7\uff09\u3002 \u6307\u5411\u5e38\u91cf\u7684\u5404\u79cd\u7d22\u5f15\u503c\u4e2d\u662f\u5426\u6709\u6307\u5411\u4e0d\u5b58\u5728\u7684\u5e38\u91cf\u6216\u4e0d\u7b26\u5408\u7c7b\u578b\u7684\u5e38\u91cf\u3002 CONSTANT_Utf8_info\u578b\u7684\u5e38\u91cf\u4e2d\u662f\u5426\u6709\u4e0d\u7b26\u5408UTF-8\u7f16\u7801\u7684\u6570\u636e\u3002 \u00b7Class\u6587\u4ef6\u4e2d\u5404\u4e2a\u90e8\u5206\u53ca\u6587\u4ef6\u672c\u8eab\u662f\u5426\u6709\u88ab\u5220\u9664\u7684\u6216\u9644\u52a0\u7684\u5176\u4ed6\u4fe1\u606f &hellip;&hellip; \u5143\u6570\u636e\u9a8c\u8bc1 \u8fd9\u4e2a\u7c7b\u662f\u5426\u6709\u7236\u7c7b\uff08\u9664\u4e86java.lang.Object\u4e4b\u5916\uff0c\u6240\u6709\u7684\u7c7b\u90fd\u5e94\u5f53\u6709\u7236\u7c7b\uff09\u3002 \u8fd9\u4e2a\u7c7b\u7684\u7236\u7c7b\u662f\u5426\u7ee7\u627f\u4e86\u4e0d\u5141\u8bb8\u88ab\u7ee7\u627f\u7684\u7c7b\uff08\u88abfinal\u4fee\u9970\u7684\u7c7b\uff09\u3002 \u5982\u679c\u8fd9\u4e2a\u7c7b\u4e0d\u662f\u62bd\u8c61\u7c7b\uff0c\u662f\u5426\u5b9e\u73b0\u4e86\u5176\u7236\u7c7b\u6216\u63a5\u53e3\u4e4b\u4e2d\u8981\u6c42\u5b9e\u73b0\u7684\u6240\u6709\u65b9\u6cd5\u3002 \u7c7b\u4e2d\u7684\u5b57\u6bb5\u3001\u65b9\u6cd5\u662f\u5426\u4e0e\u7236\u7c7b\u4ea7\u751f\u77db\u76fe\uff08\u4f8b\u5982\u8986\u76d6\u4e86\u7236\u7c7b\u7684final\u5b57\u6bb5\uff0c\u6216\u8005\u51fa\u73b0\u4e0d\u7b26\u5408\u89c4\u5219\u7684\u65b9\u6cd5\u91cd\u8f7d\uff0c\u4f8b\u5982\u65b9\u6cd5\u53c2\u6570\u90fd\u4e00\u81f4\uff0c\u4f46\u8fd4\u56de\u503c\u7c7b\u578b\u5374\u4e0d\u540c\u7b49\uff09\u3002 &hellip;&hellip; \u5b57\u8282\u7801\u9a8c\u8bc1 \u4fdd\u8bc1\u4efb\u610f\u65f6\u523b\u64cd\u4f5c\u6570\u6808\u7684\u6570\u636e\u7c7b\u578b\u4e0e\u6307\u4ee4\u4ee3\u7801\u5e8f\u5217\u90fd\u80fd\u914d\u5408\u5de5\u4f5c\uff0c\u4f8b\u5982\u4e0d\u4f1a\u51fa\u73b0\u7c7b\u4f3c\u4e8e\u201c\u5728\u64cd\u4f5c\u6808\u653e\u7f6e\u4e86\u4e00\u4e2aint\u7c7b\u578b\u7684\u6570\u636e\uff0c\u4f7f\u7528\u65f6\u5374\u6309long\u7c7b\u578b\u6765\u52a0\u8f7d\u5165\u672c\u5730\u53d8\u91cf\u8868\u4e2d\u201d\u8fd9\u6837\u7684\u60c5\u51b5\u3002 \u4fdd\u8bc1\u4efb\u4f55\u8df3\u8f6c\u6307\u4ee4\u90fd\u4e0d\u4f1a\u8df3\u8f6c\u5230\u65b9\u6cd5\u4f53\u4ee5\u5916\u7684\u5b57\u8282\u7801\u6307\u4ee4\u4e0a\u3002 \u4fdd\u8bc1\u65b9\u6cd5\u4f53\u4e2d\u7684\u7c7b\u578b\u8f6c\u6362\u603b\u662f\u6709\u6548\u7684\uff0c\u4f8b\u5982\u53ef\u4ee5\u628a\u4e00\u4e2a\u5b50\u7c7b\u5bf9\u8c61\u8d4b\u503c\u7ed9\u7236\u7c7b\u6570\u636e\u7c7b\u578b\uff0c\u8fd9\u662f\u5b89\u5168\u7684\uff0c\u4f46\u662f\u628a\u7236\u7c7b\u5bf9\u8c61\u8d4b\u503c\u7ed9\u5b50\u7c7b\u6570\u636e\u7c7b\u578b\uff0c\u751a\u81f3\u628a\u5bf9\u8c61\u8d4b\u503c\u7ed9\u4e0e\u5b83\u6beb\u65e0\u7ee7\u627f\u5173\u7cfb\u3001\u5b8c\u5168\u4e0d\u76f8\u5e72\u7684\u4e00\u4e2a\u6570\u636e\u7c7b\u578b\uff0c\u5219\u662f\u5371\u9669\u548c\u4e0d\u5408\u6cd5\u7684\u3002 &hellip;&hellip; \u7b26\u53f7\u5f15\u7528\u9a8c\u8bc1 \u7b26\u53f7\u5f15\u7528\u4e2d\u901a\u8fc7\u5b57\u7b26\u4e32\u63cf\u8ff0\u7684\u5168\u9650\u5b9a\u540d\u662f\u5426\u80fd\u627e\u5230\u5bf9\u5e94\u7684\u7c7b \u5728\u6307\u5b9a\u7c7b\u4e2d\u662f\u5426\u5b58\u5728\u7b26\u5408\u65b9\u6cd5\u7684\u5b57\u6bb5\u63cf\u8ff0\u7b26\u53ca\u7b80\u5355\u540d\u79f0\u6240\u63cf\u8ff0\u7684\u65b9\u6cd5\u548c\u5b57\u6bb5\u3002 \u7b26\u53f7\u5f15\u7528\u4e2d\u7684\u7c7b\u3001\u5b57\u6bb5\u3001\u65b9\u6cd5\u7684\u53ef\u8bbf\u95ee\u6027\uff08private\u3001protected\u3001public\u3001\uff09\u662f\u5426\u53ef\u88ab\u5f53\u524d\u7c7b\u8bbf\u95ee\u3002 &hellip;&hellip; \u51c6\u5907 \u51c6\u5907\u9636\u6bb5\u662f\u6b63\u5f0f\u4e3a\u7c7b\u4e2d\u5b9a\u4e49\u7684\u53d8\u91cf\uff08\u5373\u9759\u6001\u53d8\u91cf\uff0c\u88abstatic\u4fee\u9970\u7684\u53d8\u91cf\uff09\u5206\u914d\u5185\u5b58\u5e76\u8bbe\u7f6e\u7c7b\u53d8\u91cf\u521d\u59cb\u503c\u7684\u9636\u6bb5\n\u4f8b\u5b50\uff1a\n\/\/ \u53d8\u91cfvalue\u5728\u51c6\u5907\u9636\u6bb5\u8fc7\u540e\u7684\u521d\u59cb\u503c\u4e3a0\u800c\u4e0d\u662f123 \/\/ \u56e0\u4e3a\u8fd9\u65f6\u5c1a\u672a\u5f00\u59cb\u6267\u884c\u4efb\u4f55Java\u65b9\u6cd5 value\u8d4b\u503c\u4e3a123\u7684\u52a8\u4f5c\u8981\u5230\u7c7b\u7684\u521d\u59cb\u5316\u9636\u6bb5\u624d\u4f1a\u88ab\u6267\u884c public static int value = 123 \u89e3\u6790 \u89e3\u6790\u9636\u6bb5\u662fJava\u865a\u62df\u673a\u5c06\u5e38\u91cf\u6c60\u5185\u7684\u7b26\u53f7\u5f15\u7528\u66ff\u6362\u4e3a\u76f4\u63a5\u5f15\u7528\u7684\u8fc7\u7a0b\n\u7b26\u53f7\u5f15\u7528\uff08Symbolic References\uff09\uff1a\u7b26\u53f7\u5f15\u7528\u4ee5\u4e00\u7ec4\u7b26\u53f7\u6765\u63cf\u8ff0\u6240\u5f15\u7528\u7684\u76ee\u6807\uff0c\u7b26\u53f7\u53ef\u4ee5\u662f\u4efb\u4f55\u5f62\u5f0f\u7684\u5b57\u9762\u91cf\uff0c\u53ea\u8981\u4f7f\u7528\u65f6\u80fd\u65e0\u6b67\u4e49\u5730\u5b9a\u4f4d\u5230\u76ee\u6807\u5373\u53ef\u3002\u7b26\u53f7\u5f15\u7528\u4e0e\u865a\u62df\u673a\u5b9e\u73b0\u7684\u5185\u5b58\u5e03\u5c40\u65e0\u5173\uff0c\u5f15\u7528\u7684\u76ee\u6807\u5e76\u4e0d\u4e00\u5b9a\u662f\u5df2\u7ecf\u52a0\u8f7d\u5230\u865a\u62df\u673a\u5185\u5b58\u5f53\u4e2d\u7684\u5185\u5bb9\u3002\u5404\u79cd\u865a\u62df\u673a\u5b9e\u73b0\u7684\u5185\u5b58\u5e03\u5c40\u53ef\u4ee5\u5404\u4e0d\u76f8\u540c\uff0c\u4f46\u662f\u5b83\u4eec\u80fd\u63a5\u53d7\u7684\u7b26\u53f7\u5f15\u7528\u5fc5\u987b\u90fd\u662f\u4e00\u81f4\u7684\uff0c\u56e0\u4e3a\u7b26\u53f7\u5f15\u7528\u7684\u5b57\u9762\u91cf\u5f62\u5f0f\u660e\u786e\u5b9a\u4e49\u5728\u300aJava\u865a\u62df\u673a\u89c4\u8303\u300b\u7684Class\u6587\u4ef6\u683c\u5f0f\u4e2d\u3002\n\u4e0b\u9762\u7ea2\u6846\u4e2d\u7684\u90fd\u5c5e\u4e8e\u7b26\u53f7\u5f15\u7528\n\u76f4\u63a5\u5f15\u7528\uff08Direct References\uff09\uff1a\u76f4\u63a5\u5f15\u7528\u662f\u53ef\u4ee5\u76f4\u63a5\u6307\u5411\u76ee\u6807\u7684\u6307\u9488\u3001\u76f8\u5bf9\u504f\u79fb\u91cf\u6216\u8005\u662f\u4e00\u4e2a\u80fd\u95f4\u63a5\u5b9a\u4f4d\u5230\u76ee\u6807\u7684\u53e5\u67c4\u3002\u76f4\u63a5\u5f15\u7528\u662f\u548c\u865a\u62df\u673a\u5b9e\u73b0\u7684\u5185\u5b58\u5e03\u5c40\u76f4\u63a5\u76f8\u5173\u7684\uff0c\u540c\u4e00\u4e2a\u7b26\u53f7\u5f15\u7528\u5728\u4e0d\u540c\u865a\u62df\u673a\u5b9e\u4f8b\u4e0a\u7ffb\u8bd1\u51fa\u6765\u7684\u76f4\u63a5\u5f15\u7528\u4e00\u822c\u4e0d\u4f1a\u76f8\u540c\u3002\u5982\u679c\u6709\u4e86\u76f4\u63a5\u5f15\u7528\uff0c\u90a3\u5f15\u7528\u7684\u76ee\u6807\u5fc5\u5b9a\u5df2\u7ecf\u5728\u865a\u62df\u673a\u7684\u5185\u5b58\u4e2d\u5b58\u5728\u3002\n\u521d\u59cb\u5316 \u53c2\u8003\uff1ajvm\u7c7b\u521d\u59cb\u5316"},{"title":"JVM\u4e2d\u7684\u53cc\u4eb2\u59d4\u6d3e\u673a\u5236","link":"https:\/\/blog.greycode.top\/posts\/java-class-load-1\/","pubDate":"Wed, 16 Sep 2020 15:02:34 +0000","guid":"https:\/\/blog.greycode.top\/posts\/java-class-load-1\/","description":"\u56db\u79cd\u7c7b\u52a0\u8f7d\u5668 \u542f\u52a8\u7c7b\u52a0\u8f7d\u5668(Bootstrap Class Loader )\uff1a\u52a0\u8f7d$JAVA_HOME\/jre\/lib\u76ee\u5f55\u4e0b\u7684jar\u5305 \u62d3\u5c55\u7c7b\u52a0\u8f7d\u5668(Extension Class Loader)\uff1a\u52a0\u8f7d$JAVA_HOME\/jre\/lib\/ext\u76ee\u5f55\u4e0b\u7684jar\u5305 \u5e94\u7528\u7a0b\u5e8f\u7c7b\u52a0\u8f7d\u5668(Application Class Loader)\uff1a\u52a0\u8f7dClassPath\u76ee\u5f55\u4e0b\u7684jar\u5305 \u81ea\u5b9a\u4e49\u7c7b\u52a0\u8f7d\u5668(User Class Loader)\uff1a\u52a0\u8f7d\u81ea\u5b9a\u4e49\u6307\u5b9a\u76ee\u5f55\u4e0b\u7684jar\u5305 \u53cc\u4eb2\u59d4\u6d3e\u673a\u5236 \u5982\u679c\u4e00\u4e2a\u7c7b\u52a0\u8f7d\u5668\u6536\u5230\u4e86\u7c7b\u52a0\u8f7d\u7684\u8bf7\u6c42\uff0c\u5b83\u9996\u5148\u4e0d\u4f1a\u81ea\u5df1\u53bb\u5c1d\u8bd5\u52a0\u8f7d\u8fd9\u4e2a\u7c7b\uff0c\u800c\u662f\u628a\u8fd9\u4e2a\u8bf7\u6c42\u59d4\u6d3e\u7ed9\u7236\u7c7b\u52a0\u8f7d\u5668\u53bb\u5b8c\u6210\uff0c\u6bcf\u4e00\u4e2a\u5c42\u6b21\u7684\u7c7b\u52a0\u8f7d\u5668\u90fd\u662f\u5982\u6b64\uff0c\u56e0\u6b64\u6240\u6709\u7684\u52a0\u8f7d\u8bf7\u6c42\u6700\u7ec8\u90fd\u5e94\u8be5\u4f20\u9001\u5230\u6700\u9876\u5c42\u7684\u542f\u52a8\u7c7b\u52a0\u8f7d\u5668\u4e2d\uff0c\u53ea\u6709\u5f53\u7236\u52a0\u8f7d\u5668\u53cd\u9988\u81ea\u5df1\u65e0\u6cd5\u5b8c\u6210\u8fd9\u4e2a\u52a0\u8f7d\u8bf7\u6c42\uff08\u5b83\u7684\u641c\u7d22\u8303\u56f4\u4e2d\u6ca1\u6709\u627e\u5230\u6240\u9700\u7684\u7c7b\uff09\u65f6\uff0c\u5b50\u52a0\u8f7d\u5668\u624d\u4f1a\u5c1d\u8bd5\u81ea\u5df1\u53bb\u5b8c\u6210\u52a0\u8f7d\u3002\n\u4ee3\u7801\u793a\u4f8b \u5f53\u83b7\u53d6Bootstrap class loader\u7684\u65f6\u5019\uff0c\u8f93\u51fa\u4e86null\uff0c\u8bf4\u660e\u5f00\u53d1\u8005\u65e0\u6cd5\u901a\u8fc7\u5f15\u7528\u64cd\u4f5c\u542f\u52a8\u7c7b\u52a0\u8f7d\u5668\n\u53cc\u4eb2\u59d4\u6d3e\u673a\u5236\u7684\u4f5c\u7528 \u6bcf\u4e2a\u52a0\u8f7d\u5668\u90fd\u53ea\u9700\u8981\u56fa\u5b9a\u7684\u52a0\u8f7d\u81ea\u5df1\u7ba1\u7406\u8303\u56f4\u5185\u7684\u7c7b\uff0c\u8fd9\u6837\u7684\u597d\u5904\u5c31\u662f\u4fdd\u8bc1\u4e86Java\u4f53\u7cfb\u7684\u7a33\u5b9a\uff0c\u4e0d\u7136\u7684\u8bdd\u4f60\u81ea\u5df1\u5b9a\u4e49\u4e00\u4e2aString\u7c7b\u7684\u8bdd\uff0c\u8fd9\u6837\u7cfb\u7edf\u4e2d\u5c31\u4f1a\u6709\u4e24\u4e2aString\u7c7b\uff0c\u5982\u679c\u6ca1\u6709\u53cc\u4eb2\u59d4\u6d3e\u673a\u5236\u7684\u8bdd\uff0c\u7cfb\u7edf\u5c31\u4e0d\u77e5\u9053\u5230\u5e95\u8be5\u52a0\u8f7d\u54ea\u4e00\u4e2a\uff0c\u8fd9\u6837\u7cfb\u7edf\u5c31\u53d8\u5f97\u4e00\u7247\u6df7\u4e71\u4e86\u3002\n\u7834\u574f\u53cc\u4eb2\u59d4\u6d3e\u673a\u5236 \u53cc\u4eb2\u59d4\u6d3e\u673a\u5236\u662fJava\u8bbe\u8ba1\u8005\u63a8\u8350\u7ed9\u5f00\u53d1\u8005\u4eec\u7684\u7c7b\u52a0\u8f7d\u5b9e\u73b0\u65b9\u5f0f\uff0c\u5e76\u4e0d\u662f\u4e00\u4e2a\u5f3a\u5236\u6027\u7ea6\u675f\u7684\u6a21\u578b\uff0c\u6240\u4ee5\u4e5f\u53ef\u4ee5\u4eba\u4e3a\u7684\u7834\u574f\u8fd9\u4e2a\u673a\u5236\u3002\n\u6e90\u7801 \u6e90\u7801\u5728java.lang.ClassLoader\u6709\u5174\u8da3\u7684\u53ef\u4ee5\u53bb\u770b\u4e0b\n\u53ef\u4ee5\u770b\u5230\uff0c\u5c31\u8fd9\u77ed\u77ed\u7684\u51e0\u884c\u4ee3\u7801\uff0c\u5c31\u5b9e\u73b0\u4e86\u542c\u8d77\u6765\u5f88\u9ad8\u5927\u4e0a\u7684\u53cc\u4eb2\u59d4\u6d3e\u673a\u5236\uff0c\u6240\u4ee5\u7834\u574f\u53cc\u4eb2\u59d4\u6d3e\u673a\u5236\u7684\u8bdd\uff0c\u5c31\u76f4\u63a5\u91cd\u5199loadClass\u65b9\u6cd5\u5c31\u53ef\u4ee5\u4e86\u3002"},{"title":"Java\u7c7b\u521d\u59cb\u5316","link":"https:\/\/blog.greycode.top\/posts\/java-class-init\/","pubDate":"Wed, 16 Sep 2020 15:01:03 +0000","guid":"https:\/\/blog.greycode.top\/posts\/java-class-init\/","description":"\u4ee3\u7801\u7ed3\u679c\uff1f \u9996\u5148\uff0c\u6211\u4eec\u6765\u770b\u770b\u4e0b\u9762\u7684\u4ee3\u7801\u7684\u8f93\u51fa\u7684\u7ed3\u679c\uff0c\u53ef\u4ee5\u5148\u8bd5\u7740\u60f3\u4e00\u4e0b\n\/\/\u7ed3\u679c Code \u516c\u4f17\u53f7 \u8fd9\u65f6\u5019\u6709\u540c\u5b66\u5c31\u4f1a\u60f3\uff0c\u4ee5\u524d\u4e0d\u662f\u8bf4\u7c7b\u52a0\u8f7d\u65f6\uff0c\u9759\u6001\u4ee3\u7801\u5757\u90fd\u4f1a\u52a0\u8f7d\u7684\u561b\uff01\u600e\u4e48Test1\u91cc\u7684\u9759\u6001\u4ee3\u7801\u5757\u6ca1\u6709\u52a0\u8f7d\u5462\uff1f\u4e0b\u9762\u5c31\u6765\u770b\u770b\u5230\u5e95\u600e\u4e48\u56de\u4e8b\n\u7c7b\u7684\u751f\u547d\u5468\u671f \u4e86\u89e3\u7c7b\u52a0\u8f7d\u524d\uff0c\u9996\u5148\u719f\u6089\u4e00\u4e0b\u7c7b\u7684\u751f\u547d\u5468\u671f\n\u8fd9\u91cc\u6ce8\u610f\u51e0\u4e2a\u70b9\uff1a\n\u89e3\u6790\u9636\u6bb5\u53ef\u4ee5\u5728\u521d\u59cb\u5316\u9636\u6bb5\u4e4b\u540e\uff0c\u8fd9\u662f\u4e3a\u4e86\u652f\u6301Java\u8bed\u8a00\u7684\u8fd0\u884c\u65f6\u7ed1\u5b9a\u7279\u6027\uff08\u4e5f\u79f0\u4e3a\u52a8\u6001\u7ed1\u5b9a\u6216\u665a\u671f\u7ed1\u5b9a\uff09 \u8fd9\u4e9b\u9636\u6bb5\u901a\u5e38\u90fd\u662f\u4e92\u76f8\u4ea4\u53c9\u5730\u6df7\u5408\u8fdb\u884c\u7684\uff0c\u4f1a\u5728\u4e00\u4e2a\u9636\u6bb5\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u8c03\u7528\u3001\u6fc0\u6d3b\u53e6\u4e00\u4e2a\u9636\u6bb5\u3002 \u521d\u59cb\u5316\u548c\u5b9e\u4f8b\u5316 \u6211\u76f8\u4fe1\u5f88\u591a\u4eba\u8ddf\u6211\u521a\u5f00\u59cb\u4e00\u6837\uff0c\u641e\u4e0d\u6e05\u4ed6\u4eec\u4e24\u4e2a\u7684\u533a\u522b\uff0c\u641e\u4e0d\u6e05new\u4e00\u4e2a\u5bf9\u8c61\uff0c\u5230\u5e95\u662f\u5bf9\u8fd9\u4e2a\u5bf9\u8c61\u8fdb\u884c\u4e86\u521d\u59cb\u5316\u8fd8\u662f\u5b9e\u4f8b\u5316\u5462\uff1f\n\u521d\u59cb\u5316\uff1a\u662f\u5b8c\u6210\u7a0b\u5e8f\u6267\u884c\u524d\u7684\u51c6\u5907\u5de5\u4f5c\u3002\u5728\u8fd9\u4e2a\u9636\u6bb5\uff0c\u9759\u6001\u7684\uff08\u53d8\u91cf\uff0c\u65b9\u6cd5\uff0c\u4ee3\u7801\u5757\uff09\u4f1a\u88ab\u6267\u884c\u3002\u540c\u65f6\u5728\u4f1a\u5f00\u8f9f\u4e00\u5757\u5b58\u50a8\u7a7a\u95f4\u7528\u6765\u5b58\u653e\u9759\u6001\u7684\u6570\u636e\u3002\u521d\u59cb\u5316\u53ea\u5728\u7c7b\u52a0\u8f7d\u7684\u65f6\u5019\u6267\u884c\u4e00\u6b21\u3002\n\u5b9e\u4f8b\u5316\uff1a\u662f\u6307\u521b\u5efa\u4e00\u4e2a\u5bf9\u8c61\u7684\u8fc7\u7a0b\u3002\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\u4f1a\u5728\u5806\u4e2d\u5f00\u8f9f\u5185\u5b58\uff0c\u5c06\u4e00\u4e9b\u975e\u9759\u6001\u7684\u65b9\u6cd5\uff0c\u53d8\u91cf\u5b58\u653e\u5728\u91cc\u9762\u3002\u5728\u7a0b\u5e8f\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u53ef\u4ee5\u521b\u5efa\u591a\u4e2a\u5bf9\u8c61\uff0c\u65e2\u591a\u6b21\u5b9e\u4f8b\u5316\u3002\u6bcf\u6b21\u5b9e\u4f8b\u5316\u90fd\u4f1a\u5f00\u8f9f\u4e00\u5757\u65b0\u7684\u5185\u5b58\u3002\n\u7c7b\u7684\u521d\u59cb\u5316 \u300aJava\u865a\u62df\u673a\u89c4\u8303\u300b\u4e2d\u5e76\u6ca1\u6709\u5bf9\u52a0\u8f7d\u8fdb\u884c\u5f3a\u5236\u7ea6\u675f\uff0c\u8fd9\u70b9\u53ef\u4ee5\u4ea4\u7ed9\u865a\u62df\u673a\u7684\u5177\u4f53\u5b9e\u73b0\u6765\u81ea\u7531\u628a\u63e1\u3002\u4f46\u662f\u5bf9\u4e8e\u521d\u59cb\u5316\u9636\u6bb5\uff0c\u300aJava\u865a\u62df\u673a\u89c4\u8303\u300b\u5219\u662f\u4e25\u683c\u89c4\u5b9a\u4e86\u6709\u4e14\u53ea\u6709\u516d\u79cd\u60c5\u51b5\u5fc5\u987b\u7acb\u5373\u5bf9\u7c7b\u8fdb\u884c\u201c\u521d\u59cb\u5316\u201d\uff08\u800c\u52a0\u8f7d\u3001\u9a8c\u8bc1\u3001\u51c6\u5907\u81ea\u7136\u9700\u8981\u5728\u6b64\u4e4b\u524d\u5f00\u59cb\uff09\uff1a\n\u9047\u5230new\u3001getstatic\u3001putstatic\u6216invokestatic\u8fd9\u56db\u6761\u5b57\u8282\u7801\u6307\u4ee4\u65f6\uff0c\u5982\u679c\u7c7b\u578b\u6ca1\u6709\u8fdb\u884c\u8fc7\u521d\u59cb\u5316\uff0c\u5219\u9700\u8981\u5148\u89e6\u53d1\u5176\u521d\u59cb\u5316\u9636\u6bb5\u3002\u90a3\u5230\u5e95\u4ec0\u4e48\u65f6\u5019\u80fd\u591f\u751f\u6210\u8fd9\u4e9b\u6307\u4ee4\u5462\uff1f\u5176\u5b9e\u770b\u4e0b\u5b57\u8282\u7801\u5c31\u90fd\u660e\u767d\u4e86\n\u4f7f\u7528java.lang.reflect\u5305\u7684\u65b9\u6cd5\u5bf9\u7c7b\u578b\u8fdb\u884c\u53cd\u5c04\u8c03\u7528\u7684\u65f6\u5019\uff0c\u5982\u679c\u7c7b\u578b\u6ca1\u6709\u8fdb\u884c\u8fc7\u521d\u59cb\u5316\uff0c\u5219\u9700\u8981\u5148\u89e6\u53d1\u5176\u521d\u59cb\u5316\u3002\n\u5f53\u521d\u59cb\u5316\u7c7b\u7684\u65f6\u5019\uff0c\u5982\u679c\u53d1\u73b0\u5176\u7236\u7c7b\u8fd8\u6ca1\u6709\u8fdb\u884c\u8fc7\u521d\u59cb\u5316\uff0c\u5219\u9700\u8981\u5148\u89e6\u53d1\u5176\u7236\u7c7b\u7684\u521d\u59cb\u5316\u3002\n\u5f53\u865a\u62df\u673a\u542f\u52a8\u65f6\uff0c\u7528\u6237\u9700\u8981\u6307\u5b9a\u4e00\u4e2a\u8981\u6267\u884c\u7684\u4e3b\u7c7b\uff08\u5305\u542bmain()\u65b9\u6cd5\u7684\u90a3\u4e2a\u7c7b\uff09\uff0c\u865a\u62df\u673a\u4f1a\u5148\u521d\u59cb\u5316\u8fd9\u4e2a\u4e3b\u7c7b\u3002\n\u5f53\u4f7f\u7528JDK 7\u65b0\u52a0\u5165\u7684\u52a8\u6001\u8bed\u8a00\u652f\u6301\u65f6\uff0c\u5982\u679c\u4e00\u4e2ajava.lang.invoke.MethodHandle\u5b9e\u4f8b\u6700\u540e\u7684\u89e3\u6790\u7ed3\u679c\u4e3aREF_getStatic\u3001REF_putStatic\u3001REF_invokeStatic\u3001REF_newInvokeSpecial\u56db\u79cd\u7c7b\u578b\u7684\u65b9\u6cd5\u53e5\u67c4\uff0c\u5e76\u4e14\u8fd9\u4e2a\u65b9\u6cd5\u53e5\u67c4\u5bf9\u5e94\u7684\u7c7b\u6ca1\u6709\u8fdb\u884c\u8fc7\u521d\u59cb\u5316\uff0c\u5219\u9700\u8981\u5148\u89e6\u53d1\u5176\u521d\u59cb\u5316\u3002\n\u5f53\u4e00\u4e2a\u63a5\u53e3\u4e2d\u5b9a\u4e49\u4e86JDK 8\u65b0\u52a0\u5165\u7684\u9ed8\u8ba4\u65b9\u6cd5\uff08\u88abdefault\u5173\u952e\u5b57\u4fee\u9970\u7684\u63a5\u53e3\u65b9\u6cd5\uff09\u65f6\uff0c\u5982\u679c\u6709\u8fd9\u4e2a\u63a5\u53e3\u7684\u5b9e\u73b0\u7c7b\u53d1\u751f\u4e86\u521d\u59cb\u5316\uff0c\u90a3\u8be5\u63a5\u53e3\u8981\u5728\u5176\u4e4b\u524d\u88ab\u521d\u59cb\u5316\u3002\njava.lang.invoke.MethodHandle \u662fJDK7\u4e2d\u65b0\u52a0\u5165\u7c7b\u4f3c\u53cd\u5c04\u529f\u80fd\u7684\u4e00\u4e2a\u7c7b\n\u88ab\u52a8\u5f15\u7528 \u5bf9\u4e8e\u4ee5\u4e0a\u8fd9\u516d\u79cd\u4f1a\u89e6\u53d1\u7c7b\u578b\u8fdb\u884c\u521d\u59cb\u5316\u7684\u573a\u666f\uff0c\u300aJava\u865a\u62df\u673a\u89c4\u8303\u300b\u4e2d\u4f7f\u7528\u4e86\u4e00\u4e2a\u975e\u5e38\u5f3a\u70c8\u7684\u9650\u5b9a\u8bed\u2014\u2014\u201c\u6709\u4e14\u53ea\u6709\u201d\uff0c\u8fd9\u516d\u79cd\u573a\u666f\u4e2d\u7684\u884c\u4e3a\u79f0\u4e3a\u5bf9\u4e00\u4e2a\u7c7b\u578b\u8fdb\u884c\u4e3b\u52a8\u5f15\u7528\u3002\u9664\u6b64\u4e4b\u5916\uff0c\u6240\u6709\u5f15\u7528\u7c7b\u578b\u7684\u65b9\u5f0f\u90fd\u4e0d\u4f1a\u89e6\u53d1\u521d\u59cb\u5316\uff0c\u79f0\u4e3a\u88ab\u52a8\u5f15\u7528\u3002\n\u50cf\u6587\u7ae0\u4e00\u5f00\u59cb\u7684\u4ee3\u7801\uff0c\u5c31\u5c5e\u4e8e\u88ab\u52a8\u5f15\u7528\uff0c\u5bf9\u4e8e\u9759\u6001\u5b57\u6bb5\uff0c\u53ea\u6709\u76f4\u63a5\u5b9a\u4e49\u8fd9\u4e2a\u5b57\u6bb5\u7684\u7c7b\u624d\u4f1a\u88ab\u521d\u59cb\u5316\uff0c\u56e0\u6b64\u901a\u8fc7\u5176\u5b50\u7c7b\u6765\u5f15\u7528\u7236\u7c7b\u4e2d\u5b9a\u4e49\u7684\u9759\u6001\u5b57\u6bb5\uff0c\u53ea\u4f1a\u89e6\u53d1\u7236\u7c7b\u7684\u521d\u59cb\u5316\u800c\u4e0d\u4f1a\u89e6\u53d1\u5b50\u7c7b\u7684\u521d\u59cb\u5316\u3002\n\u4f8b\u5b501&ndash;\u5bf9\u8c61\u6570\u7ec4 \u76f4\u63a5\u4e0a\u56fe\n\u4ee5\u4e0a\u4ee3\u7801\u6267\u884c\u540e\u5e76\u4e0d\u4f1a\u8f93\u51fa\u7070\u8272\u4e24\u4e2a\u5b57\uff0c\u56e0\u4e3a\u521b\u5efa\u5bf9\u8c61\u6570\u7ec4\u65f6\u5e76\u6ca1\u6709\u53bb\u521d\u59cb\u5316Test1\u8fd9\u4e2a\u7c7b\uff0c\u800c\u662f\u7528anewarray\u5b57\u8282\u7801\u6307\u4ee4\u53bb\u521d\u59cb\u5316\u4e86\u53e6\u5916\u4e00\u4e2a\u7c7b\uff0c\u5b83\u662f\u4e00\u4e2a\u7531\u865a\u62df\u673a\u81ea\u52a8\u751f\u6210\u7684\u3001\u76f4\u63a5\u7ee7\u627f\u4e8ejava.lang.Object\u7684\u5b50\u7c7b\u3002\n\u62d3\u5c55\uff1a\u6570\u7ec4\u8d8a\u754c\u68c0\u67e5\u6ca1\u6709\u5c01\u88c5\u5728\u6570\u7ec4\u5143\u7d20\u7684\u8bbf\u95ee\u7c7b\u4e2d\uff0c\u800c\u662f\u5c01\u88c5\u5728\u6570\u7ec4\u8bbf\u95ee\u7684xaload,xastore\u5b57\u8282\u7801\u6307\u4ee4\u4e2d\n\u4f8b\u5b502&ndash;final\u4fee\u9970\u7684\u9759\u6001\u5b57\u6bb5 \u88abfinal\u4fee\u9970\u7684\u9759\u6001\u5b57\u6bb5 \u6b64\u65f6\u8fd0\u884c\u8be5\u4ee3\u7801\u65f6\uff0c\u53ea\u4f1a\u8f93\u51fa\u7070\u8272Code\u5b57\u6837\uff0cTest1\u5e76\u6ca1\u6709\u89e6\u53d1\u521d\u59cb\u5316\u9636\u6bb5\u3002\u8fd9\u662f\u56e0\u4e3a\u5728\u7f16\u8bd1\u9636\u6bb5\u901a\u8fc7\u5e38\u91cf\u4f20\u64ad\u4f18\u5316\uff0c\u5df2\u7ecf\u5c06\u6b64\u5e38\u91cf\u7684\u503c\u7070\u8272Code\u76f4\u63a5\u5b58\u50a8\u5728ClassLoadTest\u7c7b\u7684\u5e38\u91cf\u6c60\u4e2d\uff0c\u6240\u4ee5\u5f53ClassLoadTest\u7c7b\u8c03\u7528Test1\u91cc\u7684value\u65f6\uff0c\u90fd\u53d8\u6210\u4e86\u5bf9\u81ea\u8eab\u5e38\u91cf\u6c60\u7684\u8c03\u7528\uff0c\u548cTest1\u7c7b\u6ca1\u6709\u4efb\u4f55\u5173\u7cfb\u3002\n\u6ca1\u6709final\u4fee\u9970\u7684\u9759\u6001\u5b57\u6bb5\n\u6ca1\u6709\u4f7f\u7528final\u4fee\u9970\u7684\u9759\u6001\u53d8\u91cf\uff0c\u5b57\u8282\u7801\u51fa\u73b0\u4e86getstatic\uff0c\u6240\u4ee5\u89e6\u53d1Test1\u7684\u521d\u59cb\u5316\u9636\u6bb5\uff0c\u6b64\u65f6\u8fd0\u884c\u7ed3\u679c\u5c06\u4f1a\u8f93\u51fa\u7070\u8272\u548c\u7070\u8272Code"},{"title":"\u521b\u5efa\u7ebf\u7a0b\u76843\u79cd\u65b9\u5f0f","link":"https:\/\/blog.greycode.top\/posts\/create-thread-3\/","pubDate":"Mon, 22 Jun 2020 16:29:38 +0000","guid":"https:\/\/blog.greycode.top\/posts\/create-thread-3\/","description":"Java\u7ebf\u7a0b\u72b6\u6001\u53d8\u8fc1\u56fe \u6784\u9020\u4e00\u4e2a\u7ebf\u7a0b \u5728\u7ebf\u7a0b\u6267\u884cstart()\u65b9\u6cd5\u4e4b\u524d,\u9996\u5148\u9700\u8981\u521d\u59cb\u5316(NEW)\u4e00\u4e2a\u7ebf\u7a0b,\u521d\u59cb\u5316\u7684\u65f6\u5019,\u53ef\u4ee5\u8bbe\u7f6e\u7ebf\u7a0b\u540d\u79f0,\u7ebf\u7a0b\u6240\u5c5e\u7684\u7ebf\u7a0b\u7ec4\u3001\u7ebf\u7a0b\u4f18\u5148\u7ea7\u3001\u662f\u5426\u662fDaemon\u7ebf\u7a0b\u7b49\u4fe1\u606f\u3002\nThread\u5e38\u89c1\u53c2\u6570\u53ca\u8bbe\u7f6e\u65b9\u6cd5:\n\/\/\u7ebf\u7a0b\u662f\u5426\u662f\u5b88\u62a4\u7ebf\u7a0b \u9ed8\u8ba4false private boolean daemon = false; \/\/\u8bbe\u7f6e\u65b9\u6cd5 Thread thread=new Thread(); thread.setDaemon(true); \/\/\u7ebf\u7a0b\u540d\u5b57 \u9ed8\u8ba4&#34;Thread-&#34; + nextThreadNum() private volatile String name; \/\/\u8bbe\u7f6e\u65b9\u6cd5 Thread thread=new Thread(); thread.setName(&#34;myThread&#34;); \/\/\u4e0d\u80fd\u8bbe\u7f6e\u4e3anull,\u4f1a\u62a5\u5f02\u5e38 \/\/\u7ebf\u7a0b\u4f18\u5148\u7ea7 \u662f\u5426\u8d77\u4f5c\u7528\u548c\u64cd\u4f5c\u7cfb\u7edf\u53ca\u865a\u62df\u673a\u7248\u672c\u76f8\u5173 private int priority; \/\/\u8bbe\u7f6e\u65b9\u6cd5 \u8303\u56f4:1-10 \u9ed8\u8ba45 myThread.setPriority(1); Thread\u6e90\u7801\u6784\u9020\u65b9\u6cd5 \u5728Thread\u6e90\u7801\u4e2d,\u4e00\u5171\u63d0\u4f9b\u4e869\u79cd\u6784\u9020\u65b9\u6cd5.\n\u4ece\u8fd9\u4e9b\u6784\u9020\u65b9\u6cd5\u4e2d,\u5927\u81f4\u53ef\u4ee5\u5206\u4e3a\u6709Runnable\u6784\u9020\u53c2\u6570\u7684,\u548c\u65e0Runnable\u6784\u9020\u53c2\u6570\u4e24\u5927\u7c7b,\u65e0Runnable\u6784\u9020\u53c2\u6570\u7684\u5c31\u9700\u8981\u53bb\u7ee7\u627fThread\u6765\u91cd\u5199run()\u65b9\u6cd5(\u6ce8:Thread\u4e5f\u5b9e\u73b0\u4e86Runnable\u63a5\u53e3),\u6709Runnable\u6784\u9020\u53c2\u6570\u7684,\u5c31\u5b9e\u73b0Runnable\u63a5\u53e3\u7684run\u65b9\u6cd5,\u7136\u540e\u901a\u8fc7\u6784\u9020\u53c2\u6570,\u628a\u5b9e\u73b0Runnable\u63a5\u53e3\u7684\u5b9e\u4f8b\u4f20\u5165Thread.\n\u65e0\u8fd4\u56de\u503c\u7684\u7ebf\u7a0b \u53ef\u4ee5\u770b\u5230,\u901a\u8fc7\u96c6\u6210Thread\u7c7b\u548c\u5b9e\u73b0Runnable\u63a5\u53e3\u7684run()\u65b9\u6cd5\u8fd4\u56de\u503c\u90fd\u662fvoid.\u8fd9\u7c7b\u662f\u6ca1\u6709\u8fd4\u56de\u503c\u7684\n\u65b9\u6cd5\u4e00:\u7ee7\u627fThread\u7c7b\u521b\u5efa\u4e00\u4e2a\u7ebf\u7a0b \/\/\u7ee7\u627fThread\u7c7b,\u91cd\u5199run\u65b9\u6cd5 class MyThread extends Thread{ @Override public void run() { System.out.println(&#34;\u7ee7\u627fThread,\u91cd\u5199run\u65b9\u6cd5&#34;); } } public class ThreadTest{ public static void main(String[] args){ MyThread myThread=new MyThread(); myThread.start(); } } \u65b9\u6cd5\u4e8c:\u5b9e\u73b0Runnable\u63a5\u53e3\u521b\u5efa\u7ebf\u7a0b \/\/\u5b9e\u73b0Runnable\u63a5\u53e3\u7684run\u65b9\u6cd5,\u7136\u540e\u4ee5\u6784\u9020\u53c2\u6570\u7684\u5f62\u5f0f\u8bbe\u7f6eThread\u7684target class MyRun implements Runnable{ @Override public void run() { System."},{"title":"\u5410\u8840\u6574\u7406Git\u5e38\u7528\u547d\u4ee4","link":"https:\/\/blog.greycode.top\/posts\/git-tool-command\/","pubDate":"Mon, 22 Jun 2020 16:27:25 +0000","guid":"https:\/\/blog.greycode.top\/posts\/git-tool-command\/","description":"Git\u5e38\u7528\u547d\u4ee4 Git\u7b80\u4ecb Git \u662f\u7528\u4e8e Linux\u5185\u6838\u5f00\u53d1\u7684\u7248\u672c\u63a7\u5236\u5de5\u5177\u3002\u4e0e\u5e38\u7528\u7684\u7248\u672c\u63a7\u5236\u5de5\u5177 CVS, Subversion \u7b49\u4e0d\u540c\uff0c\u5b83\u91c7\u7528\u4e86\u5206\u5e03\u5f0f\u7248\u672c\u5e93\u7684\u65b9\u5f0f\uff0c\u4e0d\u5fc5\u670d\u52a1\u5668\u7aef\u8f6f\u4ef6\u652f\u6301\uff08wingeddevil\u6ce8\uff1a\u8fd9\u5f97\u5206\u662f\u7528\u4ec0\u4e48\u6837\u7684\u670d\u52a1\u7aef\uff0c\u4f7f\u7528http\u534f\u8bae\u6216\u8005git\u534f\u8bae\u7b49\u4e0d\u592a\u4e00\u6837\u3002\u5e76\u4e14\u5728push\u548cpull\u7684\u65f6\u5019\u548c\u670d\u52a1\u5668\u7aef\u8fd8\u662f\u6709\u4ea4\u4e92\u7684\u3002\uff09\uff0c\u4f7f\u6e90\u4ee3\u7801\u7684\u53d1\u5e03\u548c\u4ea4\u6d41\u6781\u5176\u65b9\u4fbf\u3002 Git \u7684\u901f\u5ea6\u5f88\u5feb\uff0c\u8fd9\u5bf9\u4e8e\u8bf8\u5982 Linux kernel \u8fd9\u6837\u7684\u5927\u9879\u76ee\u6765\u8bf4\u81ea\u7136\u5f88\u91cd\u8981\u3002 Git \u6700\u4e3a\u51fa\u8272\u7684\u662f\u5b83\u7684\u5408\u5e76\u8ddf\u8e2a\uff08merge tracing\uff09\u80fd\u529b\u3002\ngit\u5bf9\u4e8e\u5f88\u591a\u4eba\u6765\u8bf4,\u771f\u7684\u662f\u53c8\u7231\u53c8\u6068,\u7528\u7684\u597d\u53ef\u4ee5\u63d0\u793a\u5f00\u53d1\u6548\u7387;\u7528\u4e0d\u597d,\u89e3\u51b3\u5404\u79cd\u51b2\u7a81\u5c31\u8981\u7d2f\u7684\u4f60\u534a\u6b7b\ngit\u7ed3\u6784 \u7f51\u4e0a\u6709 \u6211\u5c31\u4e0d\u753b\u4e86\nworkspace \u76f8\u5f53\u4e8e\u5c31\u662f\u6211\u4eec\u7684\u672c\u5730\u7535\u8111\u4e0a\u7684\u6587\u4ef6\nIndex \u7f13\u5b58\u533a\nRepository \u672c\u5730\u4ed3\u5e93\nRemote \u8fdc\u7a0b\u4ed3\u5e93(github\/gitlab\/gitee)\ngit\u547d\u4ee4 git\u5b98\u65b9\u63d0\u4f9b\u7684\u547d\u4ee4\u591a\u8fbe\u51e0\u767e\u4e2a,\u53ef\u662f\u6211\u4eec\u65e5\u5e38\u5374\u7528\u4e0d\u5230\u8fd9\u4e48\u591a\n\u6240\u4ee5\u6211\u5c31\u6574\u7406\u4e86\u4e00\u4e0b\u65e5\u5e38\u4f7f\u7528\u7684\u547d\u4ee4\n\u73b0\u5728\u5173\u6ce8\u5fae\u4fe1\u516c\u62db:\u7070\u8272Code\n\u56de\u590d\u5173\u952e\u5b57:git\n\u5c31\u53ef\u4ee5\u83b7\u53d6\u601d\u7ef4\u5bfc\u56fe\u9ad8\u6e05\u56fe\u7247\u53ca\u5bfc\u56fe\u6e90\u5730\u5740"},{"title":"\u521b\u5efa\u4e00\u4e2a\u81ea\u5b9a\u4e49\u6ce8\u89e3","link":"https:\/\/blog.greycode.top\/posts\/apring-aop-ann\/","pubDate":"Mon, 22 Jun 2020 16:23:56 +0000","guid":"https:\/\/blog.greycode.top\/posts\/apring-aop-ann\/","description":"\u524d\u8a00 \u5e73\u65f6\u5728\u7528springBoot\u7684\u4f7f\u7528\uff0c\u5e38\u5e38\u4f1a\u7528\u5230@Service\uff0c@Compent\u7b49\u7b49\u6ce8\u89e3\uff0c\u7b80\u5316\u4e86\u6211\u4eec\u7684\u5f00\u53d1\u6d41\u7a0b\uff0c\u63d0\u5347\u4e86\u5f00\u53d1\u6548\u7387.\u90a3\u5982\u4f55\u81ea\u5df1\u6765\u5199\u4e00\u4e2a\u6ce8\u89e3\u5462\uff1f\u4e0b\u9762\u5c31\u6765\u4ecb\u7ecd\u4e00\u4e0b\u3002\n\u5199\u4e00\u4e2a\u6ce8\u89e3 \u521b\u5efa\u4e00\u4e2a\u6ce8\u89e3\u4e3b\u8981\u5206\u4e24\u90e8\u5206\uff0c\u4e00\u90e8\u5206\u662f\u521b\u5efa\u6ce8\u89e3\u7c7b\uff0c\u4e00\u90e8\u5206\u662f\u521b\u5efa\u4e00\u4e2a\u5207\u9762\u7c7b\u3002\n\u521b\u5efa\u6ce8\u89e3\u7c7b @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnn { String value() default &#34;d&#34;; } \u521b\u5efa\u6ce8\u89e3\u7c7b\u7684\u5173\u952e\u5b57\u5c31\u662f@interface\uff0c\u8fd9\u4e2a\u6ce8\u89e3\u7c7b\u8bbe\u7f6e\u4e86\u4e00\u4e2avalue\u53d8\u91cf\uff0c\u9ed8\u8ba4\u503c\u4e3ad\uff1b\n\u5728\u6ce8\u89e3\u7c7b\u4e0a\u9762\u8fd8\u6709@Target\u548c@Retention\u6ce8\u89e3\uff0c\u4e0b\u9762\u6765\u8bf4\u8bf4\u521b\u5efa\u6ce8\u89e3\u7c7b\u65f6\u9700\u8981\u7528\u5230\u7684\u51e0\u4e2a\u6ce8\u89e3\uff1a\n@Target \u7528\u6765\u6807\u8bb0\u8fd9\u4e2a\u6ce8\u89e3\u53ef\u4ee5\u7528\u4e8e\u54ea\u4e9b\u5730\u65b9\uff0c\u4e0eElementType\u679a\u4e3e\u7c7b\u642d\u914d\u4f7f\u7528\uff0c\u90a3\u8fd9\u4e2a\u679a\u4e3e\u7c7b\u91cc\u9762\u6709\u4ec0\u4e48\u5185\u5bb9\u5462\uff1f\npublic enum ElementType { \/** \u7c7b\uff0c\u63a5\u53e3\uff08\u5305\u62ec\u6ce8\u91ca\u7c7b\u578b\uff09\u6216\u679a\u4e3e\u58f0\u660e*\/ TYPE, \/** \u5b57\u6bb5\u58f0\u660e\uff08\u5305\u62ec\u679a\u4e3e\u5e38\u91cf\uff09*\/ FIELD, \/** \u65b9\u6cd5\u58f0\u660e*\/ METHOD, \/** \u5f62\u5f0f\u53c2\u6570\uff08\u5f62\u53c2-\u8c03\u7528\u65b9\u6cd5\u65f6\u4f20\u5165\u7684\u53c2\u6570\uff09\u58f0\u660e *\/ PARAMETER, \/** \u6784\u9020\u51fd\u6570\u58f0\u660e *\/ CONSTRUCTOR, \/** \u5c40\u90e8\u53d8\u91cf\u58f0\u660e *\/ LOCAL_VARIABLE, \/** \u6ce8\u91ca\u7c7b\u578b\u58f0\u660e *\/ ANNOTATION_TYPE, \/** \u5305\u58f0\u660e *\/ PACKAGE, \/** * \u7c7b\u578b\u53c2\u6570\u58f0\u660e * java8\u65b0\u7279\u6027\uff1a * @since 1.8 *\/ TYPE_PARAMETER, \/** * \u4efb\u4f55\u7c7b\u578b\u58f0\u660e * java8\u65b0\u7279\u6027\uff1a * @since 1."},{"title":"JVM4\u79cd\u5783\u573e\u6536\u96c6\u7b97\u6cd5","link":"https:\/\/blog.greycode.top\/posts\/jvm-gc-alg\/","pubDate":"Fri, 29 May 2020 10:31:30 +0000","guid":"https:\/\/blog.greycode.top\/posts\/jvm-gc-alg\/","description":"\u7b80\u4ecb \u5783\u573e\u6536\u96c6\u7b97\u6cd5\u53ef\u4ee5\u5212\u5206\u4e3a\u201c\u5f15\u7528\u8ba1\u6570\u5f0f\u5783\u573e\u6536\u96c6\u201d\uff08Reference Counting GC\uff09\u548c\u201c\u8ffd\u8e2a\u5f0f\u5783\u573e\u6536\u96c6\u201d\uff08Tracing GC\uff09\u4e24\u5927\u7c7b\uff0c\u8fd9\u4e24\u7c7b\u4e5f\u5e38\u88ab\u79f0\u4f5c\u201c\u76f4\u63a5\u5783\u573e\u6536\u96c6\u201d\u548c\u201c\u95f4\u63a5\u5783\u573e\u6536\u96c6\u201d\u3002\n\u6807\u8bb0-\u6e05\u9664\u7b97\u6cd5 \u6807\u8bb0\u8fc7\u7a0b\u5c31\u662f\u5bf9\u8c61\u662f\u5426\u5c5e\u4e8e\u5783\u573e\u7684\u5224\u5b9a\u8fc7\u7a0b(\u91c7\u7528\u53ef\u8fbe\u5206\u6790\u7b97\u6cd5GC Roots) \u7b97\u6cd5\u5206\u4e3a**\u201c\u6807\u8bb0\u201d\u548c\u201c\u6e05\u9664\u201d**\u4e24\u4e2a\u9636\u6bb5\uff1a\u9996\u5148\u6807\u8bb0\u51fa\u6240\u6709\u9700\u8981\u56de\u6536\u7684\u5bf9\u8c61\uff0c\u5728\u6807\u8bb0\u5b8c\u6210\u540e\uff0c\u7edf\u4e00\u56de\u6536\u6389\u6240\u6709\u88ab\u6807\u8bb0\u7684\u5bf9\u8c61\uff0c\u4e5f\u53ef\u4ee5\u53cd\u8fc7\u6765\uff0c\u6807\u8bb0\u5b58\u6d3b\u7684\u5bf9\u8c61\uff0c\u7edf\u4e00\u56de\u6536\u6240\u6709\u672a\u88ab\u6807\u8bb0\u7684\u5bf9\u8c61\u3002 \u7f3a\u70b9 \u6267\u884c\u6548\u7387\u4e0d\u7a33\u5b9a\uff0c\u5982\u679cJava\u5806\u4e2d\u5305\u542b\u5927\u91cf\u5bf9\u8c61\uff0c\u800c\u4e14\u5176\u4e2d\u5927\u90e8\u5206\u662f\u9700\u8981\u88ab\u56de\u6536\u7684\uff0c\u8fd9\u65f6\u5fc5\u987b\u8fdb\u884c\u5927\u91cf\u6807\u8bb0\u548c\u6e05\u9664\u7684\u52a8\u4f5c\uff0c\u5bfc\u81f4\u6807\u8bb0\u548c\u6e05\u9664\u4e24\u4e2a\u8fc7\u7a0b\u7684\u6267\u884c\u6548\u7387\u90fd\u968f\u5bf9\u8c61\u6570\u91cf\u589e\u957f\u800c\u964d\u4f4e\uff1b \u7b2c\u4e8c\u4e2a\u662f\u5185\u5b58\u7a7a\u95f4\u7684\u788e\u7247\u5316\u95ee\u9898\uff0c\u6807\u8bb0\u3001\u6e05\u9664\u4e4b\u540e\u4f1a\u4ea7\u751f\u5927\u91cf\u4e0d\u8fde\u7eed\u7684\u5185\u5b58\u788e\u7247\uff0c\u7a7a\u95f4\u788e\u7247\u592a\u591a\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5f53\u4ee5\u540e\u5728\u7a0b\u5e8f\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u5206\u914d\u8f83\u5927\u5bf9\u8c61\u65f6\u65e0\u6cd5\u627e\u5230\u8db3\u591f\u7684\u8fde\u7eed\u5185\u5b58\u800c\u4e0d\u5f97\u4e0d\u63d0\u524d\u89e6\u53d1\u53e6\u4e00\u6b21\u5783\u573e\u6536\u96c6\u52a8\u4f5c\u3002 \u6807\u8bb0-\u590d\u5236\u7b97\u6cd5 \u6807\u8bb0\u8fc7\u7a0b\u5c31\u662f\u5bf9\u8c61\u662f\u5426\u5c5e\u4e8e\u5783\u573e\u7684\u5224\u5b9a\u8fc7\u7a0b(\u91c7\u7528\u53ef\u8fbe\u5206\u6790\u7b97\u6cd5GC Roots)\n\u5b83\u5c06\u53ef\u7528\u5185\u5b58\u6309\u5bb9\u91cf\u5212\u5206\u4e3a\u5927\u5c0f\u76f8\u7b49\u7684\u4e24\u5757\uff0c\u6bcf\u6b21\u53ea\u4f7f\u7528\u5176\u4e2d\u7684\u4e00\u5757\u3002\n\u5f53\u8fd9\u4e00\u5757\u7684\u5185\u5b58\u7528\u5b8c\u4e86\uff0c\u5c31\u5c06\u8fd8\u5b58\u6d3b\u7740\u7684\u5bf9\u8c61\u590d\u5236\u5230\u53e6\u5916\u4e00\u5757\u4e0a\u9762\uff0c\u7136\u540e\u518d\u628a\u5df2\u4f7f\u7528\u8fc7\u7684\u5185\u5b58\u7a7a\u95f4\u4e00\u6b21\u6e05\u7406\u6389\u3002\n\u7f3a\u70b9 \u5982\u679c\u5185\u5b58\u4e2d\u591a\u6570\u5bf9\u8c61\u90fd\u662f\u5b58\u6d3b\u7684\uff0c\u8fd9\u79cd\u7b97\u6cd5\u5c06\u4f1a\u4ea7\u751f\u5927\u91cf\u7684\u5185\u5b58\u95f4\u590d\u5236\u7684\u5f00\u9500 \u4ee3\u4ef7\u662f\u5c06\u53ef\u7528\u5185\u5b58\u7f29\u5c0f\u4e3a\u4e86\u539f\u6765\u7684\u4e00\u534a,\u7a7a\u95f4\u6d6a\u8d39\u672a\u514d\u592a\u591a\u4e86\u4e00\u70b9. \u6807\u8bb0-\u6574\u7406\u7b97\u6cd5 \u6807\u8bb0\u8fc7\u7a0b\u5c31\u662f\u5bf9\u8c61\u662f\u5426\u5c5e\u4e8e\u5783\u573e\u7684\u5224\u5b9a\u8fc7\u7a0b(\u91c7\u7528\u53ef\u8fbe\u5206\u6790\u7b97\u6cd5GC Roots) \u5728\u6807\u8bb0-\u6e05\u9664\u7684\u7b97\u6cd5\u57fa\u7840\u4e0a\u6539\u8fdb,\u540e\u7eed\u6b65\u9aa4\u4e0d\u662f\u76f4\u63a5\u5bf9\u53ef\u56de\u6536\u5bf9\u8c61\u8fdb\u884c\u6e05\u7406\uff0c\u800c\u662f\u8ba9\u6240\u6709\u5b58\u6d3b\u7684\u5bf9\u8c61\u90fd\u5411\u5185\u5b58\u7a7a\u95f4\u4e00\u7aef\u79fb\u52a8\uff0c\u7136\u540e\u76f4\u63a5\u6e05\u7406\u6389\u8fb9\u754c\u4ee5\u5916\u7684\u5185\u5b58\uff0c \u7f3a\u70b9 \u5728\u6709\u5927\u91cf\u5b58\u6d3b\u5bf9\u8c61\u7684\u8001\u5e74\u4ee3\u533a\u57df,\u79fb\u52a8\u5b58\u6d3b\u5bf9\u8c61\u5e76\u66f4\u65b0\u6240\u6709\u5f15\u7528\u8fd9\u4e9b\u5bf9\u8c61\u7684\u5730\u65b9\u5c06\u4f1a\u662f\u4e00\u79cd\u6781\u4e3a\u8d1f\u91cd\u7684\u64cd\u4f5c,\u800c\u4e14\u8fd9\u79cd\u5bf9\u8c61\u79fb\u52a8\u64cd\u4f5c\u5fc5\u987b\u5168\u7a0b\u6682\u505c\u7528\u6237\u5e94\u7528\u7a0b\u5e8f\u624d\u80fd\u8fdb\u884c,\u6bd4\u6807\u8bb0-\u6e05\u9664\u7b97\u6cd5\u505c\u987f\u65f6\u95f4\u957f. \u5206\u4ee3\u6536\u96c6\u7b97\u6cd5 \u73b0\u4ee3\u5546\u7528\u865a\u62df\u673a\u57fa\u4e8e\u4ee5\u4e0a\u7b97\u6cd5\u7684\u4f18\u7f3a\u70b9,\u6839\u636e\u5206\u4ee3\u6536\u96c6\u7406\u8bba,\u5728\u4e0d\u540c\u7684\u533a\u57df\u91c7\u7528\u4e86\u4e0d\u540c\u7684\u6536\u96c6\u7b97\u6cd5.\n\u8001\u5e74\u4ee3:\u65b0\u751f\u4ee3=2:1\n\u65b0\u751f\u4ee3 \u5806\u5927\u5c0f\u9ed8\u8ba4\u6bd4\u4f8b:Eden:S0:S1=8:1:1\n\u91c7\u7528\u6807\u8bb0-\u590d\u5236\u7b97\u6cd5\n\u65b0\u751f\u4ee3\u5206\u4e3aEden\u533a\u548cSurvior\u533a,\u800cSurvior\u533a\u53c8\u5206\u4e3aFrom Survior\u533a(S0)\u548cTo Survior\u533a(S1).\u6b64\u533a\u57df\u91c7\u7528\u6807\u8bb0-\u590d\u5236\u7b97\u6cd5.\u6bcf\u6b21Minor GC\/Young GC\u65f6,\u4f1a\u628aEden\u533a\u5b58\u6d3b\u7684\u5bf9\u8c61\u590d\u5236\u5230S0\u533a,\u7136\u540e\u6e05\u7a7aEden\u533a,\u5f53S0\u533a\u6ee1\u65f6,Eden\u533a\u548cS0\u533a\u5b58\u6d3b\u7684\u5bf9\u8c61\u4f1a\u590d\u5236\u5230S1\u533a,\u7136\u540eS0\u548cS0\u8fdb\u884c\u4ea4\u6362,\u6c38\u8fdc\u4fdd\u6301S1\u4e3a\u7a7a\u72b6\u6001,\u5f53\u65b0\u751f\u4ee3\u7684\u5bf9\u8c61\u7ecf\u8fc7\u4e00\u5b9a\u6b21\u6570\u7684Minor GC\u8fd8\u672a\u88ab\u56de\u6536\u65f6,\u5c31\u4f1a\u628a\u8fd9\u4e2a\u5bf9\u8c61\u79fb\u5230\u8001\u5e74\u4ee3.\n\u8001\u5e74\u4ee3 \u91c7\u7528\u6807\u8bb0-\u6574\u7406\u6cd5\u6216\u6807\u8bb0-\u6e05\u7406\u6cd5\n\u5f53\u8001\u5e74\u4ee3Old\u533a\u57df\u6ee1\u65f6,\u4f1a\u89e6\u53d1Full GC,\u540c\u65f6\u56de\u6536\u65b0\u751f\u4ee3\u548c\u8001\u751f\u4ee3\u7684\u6240\u6709\u533a\u57df.\u56de\u6536\u540e\u8bfa\u5185\u5b58\u8fd8\u662f\u4e0d\u8db3\u65f6,\u4f1a\u5f15\u53d1OOM\u5f02\u5e38;"},{"title":"Java\u56db\u79cd\u5f15\u7528\u65b9\u6cd5\u4f7f\u7528\u548c\u5bf9\u6bd4","link":"https:\/\/blog.greycode.top\/posts\/jvm-object-four-quote\/","pubDate":"Fri, 29 May 2020 10:22:07 +0000","guid":"https:\/\/blog.greycode.top\/posts\/jvm-object-four-quote\/","description":"\n\u5f3a\u5f15\u7528\uff08Strongly Reference\uff09 \u65e0\u8bba\u4efb\u4f55\u60c5\u51b5\u4e0b\uff0c\u53ea\u8981\u5f3a\u5f15\u7528\u5173\u7cfb\u8fd8\u5b58\u5728\uff0c\u5783\u573e\u6536\u96c6\u5668\u5c31\u6c38\u8fdc\u4e0d\u4f1a\u56de\u6536\u6389\u88ab\u5f15\u7528\u7684\u5bf9\u8c61\u3002\n\u56de\u6536\u65f6\u673a:\u5f3a\u5f15\u7528\u5173\u7cfb\u4e0d\u5b58\u5728\u65f6\nObject obj=new Object(); \u8f6f\u5f15\u7528\uff08Soft Reference\uff09 \u8f6f\u5f15\u7528\u662f\u7528\u6765\u63cf\u8ff0\u4e00\u4e9b\u8fd8\u6709\u7528\uff0c\u4f46\u975e\u5fc5\u987b\u7684\u5bf9\u8c61\u3002\u53ea\u88ab\u8f6f\u5f15\u7528\u5173\u8054\u7740\u7684\u5bf9\u8c61\uff0c\u5728\u7cfb\u7edf\u5c06\u8981\u53d1\u751f\u5185\u5b58\u6ea2\u51fa\u5f02\u5e38\u524d\uff0c\u4f1a\u628a\u8fd9\u4e9b\u5bf9\u8c61\u5217\u8fdb\u56de\u6536\u8303\u56f4\u4e4b\u4e2d\u8fdb\u884c\u7b2c\u4e8c\u6b21\u56de\u6536\uff0c\u5982\u679c\u8fd9\u6b21\u56de\u6536\u8fd8\u6ca1\u6709\u8db3\u591f\u7684\u5185\u5b58\uff0c\u624d\u4f1a\u629b\u51fa\u5185\u5b58\u6ea2\u51fa\u5f02\u5e38\u3002\n\u56de\u6536\u65f6\u673a:\u53d1\u9001\u5185\u5b58\u6ea2\u51fa\u5f02\u5e38\u524d\n\/\/\u8f6f\u5f15\u7528 SoftReference&lt;Object&gt; srf = new SoftReference&lt;Object&gt;(new Object()); \/\/or Object obj=new Object(); SoftReference&lt;Object&gt; srf = new SoftReference&lt;Object&gt;(obj); obj=null; \/\/\u8fd9\u79cd\u65b9\u6cd5\u4e00\u5b9a\u8981\u8bbe\u7f6eobj\u4e3anull,\u5426\u5219\u8fd9\u4e2a\u5bf9\u8c61\u9664\u4e86\u8f6f\u5f15\u7528\u53ef\u8fbe\u5916,\u8fd8\u6709\u539f\u6765\u5f3a\u5f15\u7528\u4e5f\u53ef\u8fbe \u5f31\u5f15\u7528\uff08Weak Reference\uff09 \u5f31\u5f15\u7528\u4e5f\u662f\u7528\u6765\u63cf\u8ff0\u90a3\u4e9b\u975e\u5fc5\u987b\u5bf9\u8c61\uff0c\u4f46\u662f\u5b83\u7684\u5f3a\u5ea6\u6bd4\u8f6f\u5f15\u7528\u66f4\u5f31\u4e00\u4e9b\uff0c\u88ab\u5f31\u5f15\u7528\u5173\u8054\u7684\u5bf9\u8c61\u53ea\u80fd\u751f\u5b58\u5230\u4e0b\u4e00\u6b21\u5783\u573e\u6536\u96c6\u53d1\u751f\u4e3a\u6b62\u3002\u5f53\u5783\u573e\u6536\u96c6\u5668\u5f00\u59cb\u5de5\u4f5c\uff0c\u65e0\u8bba\u5f53\u524d\u5185\u5b58\u662f\u5426\u8db3\u591f\uff0c\u90fd\u4f1a\u56de\u6536\u6389\u53ea\u88ab\u5f31\u5f15\u7528\u5173\u8054\u7684\u5bf9\u8c61\u3002\n\u56de\u6536\u65f6\u673a:\u4e0b\u4e00\u6b21\u5783\u573e\u56de\u6536\u65f6\n\/\/\u5f31\u5f15\u7528 WeakReference&lt;Object&gt; wrf = new WeakReference&lt;Object&gt;(new Object()); \/\/or Object obj=new Object(); WeakReference&lt;Object&gt; wrf = new WeakReference&lt;Object&gt;(new Object()); obj=null; \u865a\u5f15\u7528\uff08Phantom Reference\uff09 \u865a\u5f15\u7528\u4e5f\u79f0\u4e3a\u201c\u5e7d\u7075\u5f15\u7528\u201d\u6216\u8005\u201c\u5e7b\u5f71\u5f15\u7528\u201d\uff0c\u5b83\u662f\u6700\u5f31\u7684\u4e00\u79cd\u5f15\u7528\u5173\u7cfb\u3002\u4e00\u4e2a\u5bf9\u8c61\u662f\u5426\u6709\u865a\u5f15\u7528\u7684\u5b58\u5728\uff0c\u5b8c\u5168\u4e0d\u4f1a\u5bf9\u5176\u751f\u5b58\u65f6\u95f4\u6784\u6210\u5f71\u54cd\uff0c\u4e5f\u65e0\u6cd5\u901a\u8fc7\u865a\u5f15\u7528\u6765\u53d6\u5f97\u4e00\u4e2a\u5bf9\u8c61\u5b9e\u4f8b\u3002\n\u56de\u6536\u65f6\u673a:\u968f\u65f6\n\/\/\u865a\u5f15\u7528 PhantomReference&lt;Object&gt; prf = new PhantomReference&lt;Object&gt;(new Object(), new ReferenceQueue&lt;&gt;()); \/\/or Object obj=new Object(); PhantomReference&lt;Object&gt; prf = new PhantomReference&lt;Object&gt;(obj, new ReferenceQueue&lt;&gt;()); obj=null;"},{"title":"JVM\u5224\u65ad\u5bf9\u8c61\u662f\u5426\u8fd8\u6d3b\u7740\u7684\u4e24\u79cd\u65b9\u6cd5","link":"https:\/\/blog.greycode.top\/posts\/jvm-object-is-alive\/","pubDate":"Fri, 29 May 2020 10:18:30 +0000","guid":"https:\/\/blog.greycode.top\/posts\/jvm-object-is-alive\/","description":"\u5f15\u7528\u8ba1\u6570\u6cd5 Java\u865a\u62df\u673a\u5e76\u4e0d\u662f\u901a\u8fc7\u5f15\u7528\u8ba1\u6570\u7b97\u6cd5\u6765\u5224\u65ad\u5bf9\u8c61\u662f\u5426\u5b58\u6d3b\u7684\u3002\n\u5728\u5bf9\u8c61\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u5f15\u7528\u8ba1\u6570\u5668\uff0c\u6bcf\u5f53\u6709\u4e00\u4e2a\u5730\u65b9\u5f15\u7528\u5b83\u65f6\uff0c\u8ba1\u6570\u5668\u503c\u5c31\u52a0\u4e00\uff1b\u5f53\u5f15\u7528\u5931\u6548\u65f6\uff0c\u8ba1\u6570\u5668\u503c\u5c31\u51cf\u4e00\uff1b\u4efb\u4f55\u65f6\u523b\u8ba1\u6570\u5668\u4e3a\u96f6\u7684\u5bf9\u8c61\u5c31\u662f\u4e0d\u53ef\u80fd\u518d\u88ab\u4f7f\u7528\u7684\u3002\n\u4f18\u70b9 \u539f\u7406\u7b80\u5355,\u5224\u5b9a\u6548\u7387\u9ad8 \u7f3a\u70b9 \u4e0d\u80fd\u7528\u4e8e\u590d\u6742\u7684\u73af\u5883\u4e2d,\u6bd4\u5982\u5bf9\u8c61\u7684\u4e92\u76f8\u5f15\u7528\u95ee\u9898 \u53ef\u8fbe\u6027\u5206\u6790\u7b97\u6cd5 Java\u865a\u62df\u673a\u4f7f\u7528\u6b64\u7b97\u6cd5\u6765\u5224\u65ad\u5bf9\u8c61\u662f\u5426\u5b58\u6d3b\n\u8fd9\u4e2a\u7b97\u6cd5\u7684\u57fa\u672c\u601d\u8def\u5c31\u662f\u901a\u8fc7\u4e00\u7cfb\u5217\u79f0\u4e3a\u201cGC Roots\u201d\u7684\u6839\u5bf9\u8c61\u4f5c\u4e3a\u8d77\u59cb\u8282\u70b9\u96c6\uff0c\u4ece\u8fd9\u4e9b\u8282\u70b9\u5f00\u59cb\uff0c\u6839\u636e\u5f15\u7528\u5173\u7cfb\u5411\u4e0b\u641c\u7d22\uff0c\u641c\u7d22\u8fc7\u7a0b\u6240\u8d70\u8fc7\u7684\u8def\u5f84\u79f0\u4e3a\u201c\u5f15\u7528\u94fe\u201d\uff08Reference Chain\uff09\uff0c\u5982\u679c\u67d0\u4e2a\u5bf9\u8c61\u5230GCRoots\u95f4\u6ca1\u6709\u4efb\u4f55\u5f15\u7528\u94fe\u76f8\u8fde\uff0c\u6216\u8005\u7528\u56fe\u8bba\u7684\u8bdd\u6765\u8bf4\u5c31\u662f\u4eceGC Roots\u5230\u8fd9\u4e2a\u5bf9\u8c61\u4e0d\u53ef\u8fbe\u65f6\uff0c\u5219\u8bc1\u660e\u6b64\u5bf9\u8c61\u662f\u4e0d\u53ef\u80fd\u518d\u88ab\u4f7f\u7528\u7684\u3002\nJava\u4e2d\u4f5c\u4e3aGC Roots\u7684\u5bf9\u8c61:\n\u5728\u865a\u62df\u673a\u6808\uff08\u6808\u5e27\u4e2d\u7684\u672c\u5730\u53d8\u91cf\u8868\uff09\u4e2d\u5f15\u7528\u7684\u5bf9\u8c61\uff0c\u8b6c\u5982\u5404\u4e2a\u7ebf\u7a0b\u88ab\u8c03\u7528\u7684\u65b9\u6cd5\u5806\u6808\u4e2d\u4f7f\u7528\u5230\u7684\u53c2\u6570\u3001\u5c40\u90e8\u53d8\u91cf\u3001\u4e34\u65f6\u53d8\u91cf\u7b49\u3002\n\u5728\u65b9\u6cd5\u533a\u4e2d\u7c7b\u9759\u6001\u5c5e\u6027\u5f15\u7528\u7684\u5bf9\u8c61\uff0c\u8b6c\u5982Java\u7c7b\u7684\u5f15\u7528\u7c7b\u578b\u9759\u6001\u53d8\u91cf\u3002\n\u5728\u65b9\u6cd5\u533a\u4e2d\u5e38\u91cf\u5f15\u7528\u7684\u5bf9\u8c61\uff0c\u8b6c\u5982\u5b57\u7b26\u4e32\u5e38\u91cf\u6c60\uff08String Table\uff09\u91cc\u7684\u5f15\u7528\u3002\n\u5728\u672c\u5730\u65b9\u6cd5\u6808\u4e2dJNI\uff08\u5373\u901a\u5e38\u6240\u8bf4\u7684Native\u65b9\u6cd5\uff09\u5f15\u7528\u7684\u5bf9\u8c61\u3002\nJava\u865a\u62df\u673a\u5185\u90e8\u7684\u5f15\u7528\uff0c\u5982\u57fa\u672c\u6570\u636e\u7c7b\u578b\u5bf9\u5e94\u7684Class\u5bf9\u8c61\uff0c\u4e00\u4e9b\u5e38\u9a7b\u7684\u5f02\u5e38\u5bf9\u8c61\uff08\u6bd4\u5982NullPointExcepiton\u3001OutOfMemoryError\uff09\u7b49\uff0c\u8fd8\u6709\u7cfb\u7edf\u7c7b\u52a0\u8f7d\u5668\u3002\n\u6240\u6709\u88ab\u540c\u6b65\u9501\uff08synchronized\u5173\u952e\u5b57\uff09\u6301\u6709\u7684\u5bf9\u8c61\u3002\n\u53cd\u6620Java\u865a\u62df\u673a\u5185\u90e8\u60c5\u51b5\u7684JMXBean\u3001JVMTI\u4e2d\u6ce8\u518c\u7684\u56de\u8c03\u3001\u672c\u5730\u4ee3\u7801\u7f13\u5b58\u7b49\u3002\n\u5176\u4ed6\u5bf9\u8c61\u4e34\u65f6\u6027\u5730\u52a0\u5165,\u5171\u540c\u6784\u6210GC Roots"},{"title":"JVM\u8fd0\u884c\u65f6\u6570\u636e\u533a\u57df","link":"https:\/\/blog.greycode.top\/posts\/jvm-running-data-area\/","pubDate":"Tue, 26 May 2020 16:35:47 +0000","guid":"https:\/\/blog.greycode.top\/posts\/jvm-running-data-area\/","description":"JVM\u8fd0\u884c\u65f6\u6570\u636e\u533a\u57df \u7a0b\u5e8f\u8ba1\u6570\u5668 \u7ebf\u7a0b\u79c1\u6709\n\u552f\u4e00\u4e00\u4e2a\u6ca1\u6709\u89c4\u5b9a OutOfMemoryError \u5f02\u5e38 \u7684\u533a\u57df\n\u5b83\u53ef\u4ee5\u770b\u4f5c\u662f\u5f53\u524d\u7ebf\u7a0b\u6240\u6267\u884c\u7684\u5b57\u8282\u7801\u7684\u884c\u53f7\u6307\u793a\u5668\n\u5982\u679c\u7ebf\u7a0b\u6b63\u5728\u6267\u884c\u7684\u662f\u4e00\u4e2aJava\u65b9\u6cd5\uff0c\u8fd9\u4e2a\u8ba1\u6570\u5668\u8bb0\u5f55\u7684\u662f\u6b63\u5728\u6267\u884c\u7684\u865a\u62df\u673a\u5b57\u8282\u7801\u6307\u4ee4\u7684\u5730\u5740\uff1b\u5982\u679c\u6b63\u5728\u6267\u884c\u7684\u662f\u672c\u5730\uff08Native\uff09\u65b9\u6cd5\uff0c\u8fd9\u4e2a\u8ba1\u6570\u5668\u503c\u5219\u5e94\u4e3a\u7a7a\uff08Undefined\uff09\n(\u6458\u81ea\u7f51\u4e0a)\u6211\u4eec\u60f3\u8c61\u4e0b\uff0cCPU\u662f\u600e\u4e48\u77e5\u9053\u8bb0\u4f4f\u4e4b\u524dA\u7ebf\u7a0b\uff0c\u6267\u884c\u5230\u54ea\u4e00\u5904\u7684\uff1f\n\u7b54\u6848\u662f\uff0cCPU\u6839\u672c\u5c31\u4e0d\u4f1a\u8bb0\u4f4f\u4e4b\u524d\u6267\u884c\u5230\u54ea\u91cc\u4e86\uff0c\u5b83\u53ea\u662f\u57cb\u5934\u82e6\u5e72\uff1b\u90a3\u662f\u4ec0\u4e48\u4fdd\u8bc1\u4e86\u5207\u6362\u7ebf\u7a0b\u7684\u7a0b\u5e8f\u53ef\u4ee5\u6b63\u5e38\u6267\u884c\u7684\uff1b\u7b54\u6848\u662f \uff1a \u7a0b\u5e8f\u8ba1\u6570\u5668 \uff1b\u7a0b\u5e8f\u8ba1\u6570\u5668\u91cc\u9762\u4fdd\u5b58\u7684\u662f \u5f53\u524d\u7ebf\u7a0b\u6267\u884c\u7684\u5b57\u8282\u7801\u7684\u884c\u53f7\uff08\u770b\u7740\u50cf\u884c\u53f7\uff0c\u5176\u5b9e\u662f\u6307\u4ee4\u5730\u5740\uff09\uff1b\n\u90a3\u4e48\uff0c\u6211\u4eec\u9700\u8981\u51e0\u4e2a\u7a0b\u5e8f\u8ba1\u6570\u5668\u5462\uff1f\u5982\u679c\uff0c\u6211\u4eec\u53ea\u6709\u4e00\u4e2a\u7684\u8bdd\uff0c\u5207\u6362B\u7ebf\u7a0b\u4ee5\u540e\uff0c\u7a0b\u5e8f\u8ba1\u6570\u5668\u91cc\u9762\u4fdd\u5b58\u7684\u5c31\u662fB\u7ebf\u7a0b\u6240\u6267\u884c\u7684\u5b57\u8282\u7801\u7684\u884c\u53f7\u4e86\uff0c\u518d\u5207\u6362\u56deA\u7ebf\u7a0b\uff0c\u5c31\u8499\u5708\u4e86\uff0c\u4e0d\u77e5\u9053\u6267\u884c\u5230\u54ea\u91cc\u4e86\uff0c\u56e0\u4e3a\uff0c\u7a0b\u5e8f\u8ba1\u6570\u5668\u91cc\u9762\u4fdd\u5b58\u7684\u662fB\u7ebf\u7a0b\u5f53\u524d\u6267\u884c\u7684\u5b57\u8282\u7801\u5730\u5740 \uff1b\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u60f3\u8c61\u51fa\uff0c\u8981\u4e3a\u6bcf\u4e2a\u7ebf\u7a0b\u90fd\u5206\u914d\u4e00\u4e2a\u7a0b\u5e8f\u8ba1\u6570\u5668\uff0c\u56e0\u6b64\uff0c\u7a0b\u5e8f\u8ba1\u6570\u5668\u7684\u5185\u5b58\u7a7a\u95f4\u662f\u7ebf\u7a0b\u79c1\u6709\u7684 \uff1b\u8fd9\u6837\u5373\u4f7f\u7ebf\u7a0b A \u88ab\u6302\u8d77\uff0c\u4f46\u662f\u7ebf\u7a0b A \u91cc\u9762\u7684\u7a0b\u5e8f\u8ba1\u6570\u5668\uff0c\u8bb0\u4f4f\u4e86A\u7ebf\u7a0b\u5f53\u524d\u6267\u884c\u5230\u7684\u5b57\u8282\u7801\u7684\u6307\u4ee4\u5730\u5740\u4e86 \uff0c\u7b49\u518d\u6b21\u5207\u56de\u5230A\u7ebf\u7a0b\u7684\u65f6\u5019\uff0c\u770b\u4e00\u4e0b\u7a0b\u5e8f\u8ba1\u6570\u5668\uff0c\u5c31\u77e5\u9053\u4e4b\u524d\u6267\u884c\u5230\u54ea\u91cc\u4e86\uff01\n\u90a3\u4e48\u7a0b\u5e8f\u8ba1\u6570\u5668\uff0c\u4ec0\u4e48\u65f6\u5019\u5206\u914d\u5185\u5b58\u5462\uff1f\u6211\u4eec\u8bd5\u60f3\u4e0b\uff0c\u4e00\u4e2a\u7ebf\u7a0b\u5728\u6267\u884c\u7684\u4efb\u4f55\u671f\u95f4\uff0c\u90fd\u4f1a\u5931\u53bbCPU\u6267\u884c\u6743\uff0c\u56e0\u6b64\uff0c\u6211\u4eec\u8981\u4ece\u4e00\u4e2a\u7ebf\u7a0b\u88ab\u521b\u5efa\u5f00\u59cb\u6267\u884c\uff0c\u5c31\u8981\u65e0\u65f6\u65e0\u523b\u7684\u8bb0\u5f55\u7740\u8be5\u7ebf\u7a0b\u5f53\u524d\u6267\u884c\u5230\u54ea\u91cc\u4e86\uff01\u56e0\u6b64\uff0c\u7ebf\u7a0b\u8ba1\u6570\u5668\uff0c\u5fc5\u987b\u662f\u7ebf\u7a0b\u88ab\u521b\u5efa\u5f00\u59cb\u6267\u884c\u7684\u65f6\u5019\uff0c\u5c31\u8981\u4e00\u540c\u88ab\u521b\u5efa\uff1b\n\u7a0b\u5e8f\u8ba1\u6570\u5668\uff0c\u4fdd\u5b58\u7684\u662f\u5f53\u524d\u6267\u884c\u7684\u5b57\u8282\u7801\u7684\u504f\u79fb\u5730\u5740\uff08\u4e5f\u5c31\u662f\u4e4b\u524d\u8bf4\u7684\u884c\u53f7\uff0c\u5176\u5b9e\u90a3\u4e0d\u662f\u884c\u53f7\uff0c\u662f\u6307\u4ee4\u7684\u504f\u79fb\u5730\u5740\uff0c\u53ea\u662f\u4e3a\u4e86\u597d\u7406\u89e3\uff0c\u624d\u8bf4\u662f\u884c\u53f7\u7684\uff0c\uff09\uff0c\u5f53\u6267\u884c\u5230\u4e0b\u4e00\u6761\u6307\u4ee4\u7684\u65f6\u5019\uff0c\u6539\u53d8\u7684\u53ea\u662f\u7a0b\u5e8f\u8ba1\u6570\u5668\u4e2d\u4fdd\u5b58\u7684\u5730\u5740\uff0c\u5e76\u4e0d\u9700\u8981\u7533\u8bf7\u65b0\u7684\u5185\u5b58\u6765\u4fdd\u5b58\u65b0\u7684\u6307\u4ee4\u5730\u5740\uff1b\u56e0\u6b64\uff0c\u6c38\u8fdc\u90fd\u4e0d\u53ef\u80fd\u5185\u5b58\u6ea2\u51fa\u7684\uff1b\u56e0\u6b64\uff0cjvm\u865a\u62df\u673a\u89c4\u8303\uff0c\u4e5f\u5c31\u6ca1\u6709\u89c4\u5b9a\uff0c\u4e5f\u662f\u552f\u4e00\u4e00\u4e2a\u6ca1\u6709\u89c4\u5b9a OutOfMemoryError \u5f02\u5e38 \u7684\u533a\u57df;\n\u5f53\u7ebf\u7a0b\u6267\u884c\u7684\u662f\u672c\u5730\u65b9\u6cd5\u7684\u65f6\u5019\uff0c\u7a0b\u5e8f\u8ba1\u6570\u5668\u4e2d\u4fdd\u5b58\u7684\u503c\u662f\u7a7a\uff08undefined\uff09\uff1b\u539f\u56e0\u5f88\u7b80\u5355\uff1a\u672c\u5730\u65b9\u6cd5\u662fC++\/C \u5199\u7684\uff0c\u7531\u7cfb\u7edf\u8c03\u7528\uff0c\u6839\u672c\u4e0d\u4f1a\u4ea7\u751f\u5b57\u8282\u7801\u6587\u4ef6\uff0c\u56e0\u6b64\uff0c\u7a0b\u5e8f\u8ba1\u6570\u5668\u4e5f\u5c31\u4e0d\u4f1a\u505a\u4efb\u4f55\u8bb0\u5f55\nJava\u865a\u62df\u673a\u6808 \u7ebf\u7a0b\u79c1\u6709 \u5982\u679c\u7ebf\u7a0b\u8bf7\u6c42\u7684\u6808\u6df1\u5ea6\u5927\u4e8e\u865a\u62df\u673a\u6240\u5141\u8bb8\u7684\u6df1\u5ea6\uff0c\u5c06\u629b\u51faStackOverflowError\u5f02\u5e38\uff1b \u5982\u679cJava\u865a\u62df\u673a\u6808\u5bb9\u91cf\u53ef\u4ee5\u52a8\u6001\u6269\u5c55\uff0c\u5f53\u6808\u6269\u5c55\u65f6\u65e0\u6cd5\u7533\u8bf7\u5230\u8db3\u591f\u7684\u5185\u5b58\u4f1a\u629b\u51faOutOfMemoryError\u5f02\u5e38\uff1b(HotSpot\u865a\u62df\u673a\u7684\u6808\u5bb9\u91cf\u662f\u4e0d\u53ef\u4ee5\u52a8\u6001\u6269\u5c55\u7684\uff0c\u4ee5\u524d\u7684Classic\u865a\u62df\u673a\u5012\u662f\u53ef\u4ee5\u3002\u6240\u4ee5\u5728HotSpot\u865a\u62df\u673a\u4e0a\u662f\u4e0d\u4f1a\u7531\u4e8e\u865a\u62df\u673a\u6808\u65e0\u6cd5\u6269\u5c55\u800c\u5bfc\u81f4OutOfMemoryError\u5f02\u5e38\u2014\u2014\u53ea\u8981\u7ebf\u7a0b\u7533\u8bf7\u6808\u7a7a\u95f4\u6210\u529f\u4e86\u5c31\u4e0d\u4f1a\u6709OOM\uff0c\u4f46\u662f\u5982\u679c\u7533\u8bf7\u65f6\u5c31\u5931\u8d25\uff0c\u4ecd\u7136\u662f\u4f1a\u51fa\u73b0OOM\u5f02\u5e38\u7684) -Xss5m: \u8bbe\u7f6e5m\u7684\u6808\u5bb9\u91cf \u6bcf\u4e2a\u65b9\u6cd5\u6267\u884c\u90fd\u4f1a\u521b\u5efa\u4e00\u4e2a\u6808\u5e27\uff0c\u6808\u5e27\u5305\u542b\u5c40\u90e8\u53d8\u91cf\u8868\u3001\u64cd\u4f5c\u6570\u6808\u3001\u52a8\u6001\u8fde\u63a5\u3001\u65b9\u6cd5\u51fa\u53e3\u7b49 \u672c\u5730\u65b9\u6cd5\u6808 \u7ebf\u7a0b\u79c1\u6709\n\u4e0eJava\u865a\u62df\u673a\u6808\u76f8\u4f3c\n\u4e0eJava\u865a\u62df\u673a\u6808\u533a\u522b: Java\u865a\u62df\u673a\u6808\u4e3a\u865a\u62df\u673a\u6267\u884cJava\u65b9\u6cd5\uff08\u4e5f\u5c31\u662f\u5b57\u8282\u7801\uff09\u670d\u52a1\uff0c\u800c\u672c\u5730\u65b9\u6cd5\u6808\u5219\u662f\u4e3a\u865a\u62df\u673a\u4f7f\u7528\u5230\u7684\u672c\u5730\uff08Native\uff09\u65b9\u6cd5\u670d\u52a1\u3002\nHot-Spot\u865a\u62df\u673a\u76f4\u63a5\u5c31\u628a\u672c\u5730\u65b9\u6cd5\u6808\u548c\u865a\u62df\u673a\u6808\u5408\u4e8c\u4e3a\u4e00\n\u4e0e\u865a\u62df\u673a\u6808\u4e00\u6837\uff0c\u672c\u5730\u65b9\u6cd5\u6808\u4e5f\u4f1a\u5728\u6808\u6df1\u5ea6\u6ea2\u51fa\u6216\u8005\u6808\u6269\u5c55\u5931\u8d25\u65f6\u5206\u522b\u629b\u51faStackOverflowError\u548cOutOfMemoryError\u5f02\u5e38\nJava\u5806 \u7ebf\u7a0b\u5171\u4eab \u6240\u6709\u7684Java\u5bf9\u8c61\u5b9e\u4f8b\u4e0d\u4e00\u5b9a\u90fd\u5728Java\u5806\u4e0a\u5206\u914d\u5185\u5b58 Java\u5806\u65e2\u53ef\u4ee5\u88ab\u5b9e\u73b0\u6210\u56fa\u5b9a\u5927\u5c0f\u7684\uff0c\u4e5f\u53ef\u4ee5\u662f\u53ef\u6269\u5c55\u7684\uff0c\u4e0d\u8fc7\u5f53\u524d\u4e3b\u6d41\u7684Java\u865a\u62df\u673a\u90fd\u662f\u6309\u7167\u53ef\u6269\u5c55\u6765\u5b9e\u73b0\u7684\uff08\u901a\u8fc7\u53c2\u6570-Xmx\u548c-Xms\u8bbe\u5b9a\uff09\u3002 \u5982\u679c\u5728Java\u5806\u4e2d\u6ca1\u6709\u5185\u5b58\u5b8c\u6210\u5b9e\u4f8b\u5206\u914d\uff0c\u5e76\u4e14\u5806\u4e5f\u65e0\u6cd5\u518d\u6269\u5c55\u65f6\uff0cJava\u865a\u62df\u673a\u5c06\u4f1a\u629b\u51faOutOfMemoryError\u5f02\u5e38\u3002 Java\u5806\u662f\u5783\u573e\u6536\u96c6\u5668(Garbage Collected)\u7ba1\u7406\u7684\u5185\u5b58\u533a\u57df \u65b9\u6cd5\u533a \u7ebf\u7a0b\u5171\u4eab\n\u7528\u4e8e\u5b58\u50a8\u5df2\u88ab\u865a\u62df\u673a\u52a0\u8f7d\u7684\u7c7b\u578b\u4fe1\u606f\u3001\u5e38\u91cf\u3001\u9759\u6001\u53d8\u91cf\u3001\u5373\u65f6\u7f16\u8bd1\u5668\u7f16\u8bd1\u540e\u7684\u4ee3\u7801\u7f13\u5b58\u7b49\u6570\u636e\u3002\n\u867d\u7136\u300aJava\u865a\u62df\u673a\u89c4\u8303\u300b\u4e2d\u628a\u65b9\u6cd5\u533a\u63cf\u8ff0\u4e3a\u5806\u7684\u4e00\u4e2a\u903b\u8f91\u90e8\u5206\uff0c\u4f46\u662f\u5b83\u5374\u6709\u4e00\u4e2a\u522b\u540d\u53eb\u4f5c**\u201c\u975e\u5806\u201d\uff08Non-Heap\uff09\uff0c\u76ee\u7684\u662f\u4e0eJava\u5806\u533a\u5206\u5f00\u6765**\u3002\n\u5728JDK1.6\u53ca\u4e4b\u524d,\u4f7f\u7528\u6c38\u4e45\u4ee3\u6765\u5b9e\u73b0\u65b9\u6cd5\u533a.\n-XX:MaxPermSize \u8bbe\u7f6e\u6c38\u4e45\u4ee3\u5185\u5b58\u4e0a\u9650 -XX:PermSize \u8bbe\u7f6e\u6c38\u4e45\u4ee3\u5185\u5b58 JDK1.7\u628a\u5b57\u7b26\u4e32\u5e38\u91cf\u6c60\u3001\u7c7b\u7684\u9759\u6001\u53d8\u91cf(class statics)\u8f6c\u79fb\u5230\u4e86java heap,\u4f46\u662f\u6c38\u4e45\u4ee3\u8fd8\u662f\u5b58\u5728,\u4e3b\u8981\u653e\u4e00\u4e9b\u7c7b\u4fe1\u606f(\u8fd0\u7b97\u65f6\u5e38\u91cf\u6c60)\u7b49.\nJDK1.8\u5f7b\u5e95\u79fb\u9664\u6c38\u4e45\u4ee3,\u65b9\u6cd5\u533a\u91c7\u7528\u672c\u5730\u5185\u5b58\u4e2d\u5b9e\u73b0\u7684\u5143\u7a7a\u95f4\uff08Meta-space\uff09\u6765\u4ee3\u66ff,\u5c06JDK1.7\u4e2d\u6c38\u4e45\u4ee3\u7684\u4fe1\u606f\u79fb\u5230\u4e86\u5143\u7a7a\u95f4,\u50cf\u5b57\u7b26\u4e32\u5e38\u91cf\u6c60\u548c\u9759\u6001\u53d8\u91cf\u8fd8\u662f\u5b58\u5728Java Heap\u4e2d\n\u5982\u679c\u65b9\u6cd5\u533a\u65e0\u6cd5\u6ee1\u8db3\u65b0\u7684\u5185\u5b58\u5206\u914d\u9700\u6c42\u65f6\uff0c\u5c06\u629b\u51faOutOfMemoryError\u5f02\u5e38\u3002"},{"title":"JVM\u9003\u9038\u5206\u6790\u6280\u672f","link":"https:\/\/blog.greycode.top\/posts\/jvm-javastack-escapeanalysis\/","pubDate":"Tue, 26 May 2020 16:02:00 +0000","guid":"https:\/\/blog.greycode.top\/posts\/jvm-javastack-escapeanalysis\/","description":"\u9003\u9038\u5206\u6790\u6280\u672f\u7684\u65e5\u6e10\u6210\u719f,\u4fc3\u4f7f\u6240\u6709\u7684Java\u5bf9\u8c61\u5b9e\u4f8b\u4e0d\u4e00\u5b9a\u90fd\u5728Java\u5806\u4e0a\u5206\u914d\u5185\u5b58\n\u7b80\u5355\u6765\u8bb2\u5c31\u662f\uff0cJava Hotspot \u865a\u62df\u673a\u53ef\u4ee5\u5206\u6790\u65b0\u521b\u5efa\u5bf9\u8c61\u7684\u4f7f\u7528\u8303\u56f4\uff0c\u5e76\u51b3\u5b9a\u662f\u5426\u5728 Java \u5806\u4e0a\u5206\u914d\u5185\u5b58\u7684\u4e00\u9879\u6280\u672f\u3002\n\u4f7f\u7528 \u5f00\u542f\u9003\u9038\u5206\u6790\uff1a-XX:+DoEscapeAnalysis \u5173\u95ed\u9003\u9038\u5206\u6790\uff1a-XX:-DoEscapeAnalysis \u663e\u793a\u5206\u6790\u7ed3\u679c\uff1a-XX:+PrintEscapeAnalysis \u9003\u9038\u5206\u6790\u6280\u672f\u5728 Java SE 6u23+ \u5f00\u59cb\u652f\u6301,\u5e76\u9ed8\u8ba4\u8bbe\u7f6e\u4e3a\u542f\u7528\u72b6\u6001 \u9003\u9038\u7a0b\u5ea6 \u9038\u5206\u6790\u7684\u57fa\u672c\u884c\u4e3a\u5c31\u662f\u5206\u6790\u5bf9\u8c61\u52a8\u6001\u4f5c\u7528\u57df,\u4ece\u4e0d\u9003\u9038\u3001\u65b9\u6cd5\u9003\u9038\u5230\u7ebf\u7a0b\u9003\u9038\uff0c\u79f0\u4e3a\u5bf9\u8c61\u7531\u4f4e\u5230\u9ad8\u7684\u4e0d\u540c\u9003\u9038\u7a0b\u5ea6\u3002\n\u65b9\u6cd5\u9003\u9038 \u5f53\u4e00\u4e2a\u5bf9\u8c61\u5728\u65b9\u6cd5\u4e2d\u88ab\u5b9a\u4e49\u540e\uff0c\u5b83\u53ef\u80fd\u88ab\u5916\u90e8\u65b9\u6cd5\u6240\u5f15\u7528\uff0c\u4f8b\u5982\u4f5c\u4e3a\u8c03\u7528\u53c2\u6570\u4f20\u9012\u5230\u5176\u4ed6\u5730\u65b9\u4e2d\uff0c\u79f0\u4e3a\u65b9\u6cd5\u9003\u9038\u3002\n\/*StringBuffer sb\u662f\u4e00\u4e2a\u65b9\u6cd5\u5185\u90e8\u53d8\u91cf\uff0c\u4e0a\u8ff0\u4ee3\u7801\u4e2d\u76f4\u63a5\u5c06sb\u8fd4\u56de\uff0c\u8fd9\u6837\u8fd9\u4e2aStringBuffer\u6709\u53ef\u80fd\u88ab\u5176\u4ed6\u65b9\u6cd5\u6240 *\u6539\u53d8\uff0c\u8fd9\u6837\u5b83\u7684\u4f5c\u7528\u57df\u5c31\u4e0d\u53ea\u662f\u5728\u65b9\u6cd5\u5185\u90e8\uff0c\u867d\u7136\u5b83\u662f\u4e00\u4e2a\u5c40\u90e8\u53d8\u91cf\uff0c\u79f0\u5176\u9003\u9038\u5230\u4e86\u65b9\u6cd5\u5916\u90e8\u3002\u751a\u81f3\u8fd8\u6709\u53ef\u80fd\u88ab\u5916\u90e8\u7ebf *\u7a0b\u8bbf\u95ee\u5230\uff0c\u8b6c\u5982\u8d4b\u503c\u7ed9\u7c7b\u53d8\u91cf\u6216\u53ef\u4ee5\u5728\u5176\u4ed6\u7ebf\u7a0b\u4e2d\u8bbf\u95ee\u7684\u5b9e\u4f8b\u53d8\u91cf\uff0c\u79f0\u4e3a\u7ebf\u7a0b\u9003\u9038\u3002 *\/ public static StringBuffer craeteStringBuffer(String s1, String s2) { StringBuffer sb = new StringBuffer(); sb.append(s1); sb.append(s2); return sb; } \/\/\u4e0a\u8ff0\u4ee3\u7801\u5982\u679c\u60f3\u8981StringBuffer sb\u4e0d\u9003\u51fa\u65b9\u6cd5\uff0c\u53ef\u4ee5\u8fd9\u6837\u5199\uff1a public static String createStringBuffer(String s1, String s2) { StringBuffer sb = new StringBuffer(); sb.append(s1); sb.append(s2); return sb.toString(); } \u7ebf\u7a0b\u9003\u9038 \u5f53\u4e00\u4e2a\u5bf9\u8c61\u5728\u65b9\u6cd5\u4e2d\u88ab\u5b9a\u4e49\u540e\uff0c\u5b83\u53ef\u80fd\u88ab\u5916\u90e8\u7ebf\u7a0b\u8bbf\u95ee\u5230\uff0c\u8b6c\u5982\u8d4b\u503c\u7ed9\u53ef\u4ee5\u5728\u5176\u4ed6\u7ebf\u7a0b\u4e2d\u8bbf\u95ee\u7684\u5b9e\u4f8b\u53d8\u91cf\uff0c\u8fd9\u79cd\u79f0\u4e3a\u7ebf\u7a0b\u9003\u9038\u3002 \u9003\u9038\u5206\u6790\u4f18\u5316 \u5982\u679c\u80fd\u8bc1\u660e\u4e00\u4e2a\u5bf9\u8c61\u4e0d\u4f1a\u9003\u9038\u5230\u65b9\u6cd5\u6216\u7ebf\u7a0b\u4e4b\u5916\uff08\u6362\u53e5\u8bdd\u8bf4\u662f\u522b\u7684\u65b9\u6cd5\u6216\u7ebf\u7a0b\u65e0\u6cd5\u901a\u8fc7\u4efb\u4f55\u9014\u5f84\u8bbf\u95ee\u5230\u8fd9\u4e2a\u5bf9\u8c61\uff09\uff0c\u6216\u8005\u9003\u9038\u7a0b\u5ea6\u6bd4\u8f83\u4f4e\uff08\u53ea\u9003\u9038\u51fa\u65b9\u6cd5\u800c\u4e0d\u4f1a\u9003\u9038\u51fa\u7ebf\u7a0b\uff09\uff0c\u5219\u53ef\u80fd\u4e3a\u8fd9\u4e2a\u5bf9\u8c61\u5b9e\u4f8b\u91c7\u53d6\u4e0d\u540c\u7a0b\u5ea6\u7684\u4f18\u5316\n\u6808\u4e0a\u5206\u914d\uff08Stack Allocations\uff09 \u5982\u679c\u786e\u5b9a\u4e00\u4e2a\u5bf9\u8c61\u4e0d\u4f1a\u9003\u9038\u51fa\u7ebf\u7a0b\u4e4b\u5916\uff0c\u90a3\u8ba9\u8fd9\u4e2a\u5bf9\u8c61\u5728\u6808\u4e0a\u5206\u914d\u5185\u5b58\u5c06\u4f1a\u662f\u4e00\u4e2a\u5f88\u4e0d\u9519\u7684\u4e3b\u610f\uff0c\u5bf9\u8c61\u6240\u5360\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u5c31\u53ef\u4ee5\u968f\u6808\u5e27\u51fa\u6808\u800c\u9500\u6bc1\u3002 \u7531\u4e8e\u590d\u6742\u5ea6\u7b49\u539f\u56e0\uff0cHotSpot\u4e2d\u76ee\u524d\u6682\u65f6\u8fd8\u6ca1\u6709\u505a\u8fd9\u9879\u4f18\u5316\uff0c\u4f46\u4e00\u4e9b\u5176\u4ed6\u7684\u865a\u62df\u673a\uff08\u5982Excelsior JET\uff09\u4f7f\u7528\u4e86\u8fd9\u9879\u4f18\u5316\u3002 \u6808\u4e0a\u5206\u914d\u53ef\u4ee5\u652f\u6301\u65b9\u6cd5\u9003\u9038\uff0c\u4f46\u4e0d\u80fd\u652f\u6301\u7ebf\u7a0b\u9003\u9038\u3002 \u6807\u91cf\u66ff\u6362\uff08Scalar Replacement\uff09 \u82e5\u4e00\u4e2a\u6570\u636e\u5df2\u7ecf\u65e0\u6cd5\u518d\u5206\u89e3\u6210\u66f4\u5c0f\u7684\u6570\u636e\u6765\u8868\u793a\u4e86\uff0cJava\u865a\u62df\u673a\u4e2d\u7684\u539f\u59cb\u6570\u636e\u7c7b\u578b\uff08int\u3001long\u7b49\u6570\u503c\u7c7b\u578b\u53careference\u7c7b\u578b\u7b49\uff09\u90fd\u4e0d\u80fd\u518d\u8fdb\u4e00\u6b65\u5206\u89e3\u4e86\uff0c\u90a3\u4e48\u8fd9\u4e9b\u6570\u636e\u5c31\u53ef\u4ee5\u88ab\u79f0\u4e3a\u6807\u91cf\u3002\u76f8\u5bf9\u7684\uff0c\u5982\u679c\u4e00\u4e2a\u6570\u636e\u53ef\u4ee5\u7ee7\u7eed\u5206\u89e3\uff0c\u90a3\u5b83\u5c31\u88ab\u79f0\u4e3a\u805a\u5408\u91cf\uff08Aggregate\uff09\uff0cJava\u4e2d\u7684\u5bf9\u8c61\u5c31\u662f\u5178\u578b\u7684\u805a\u5408\u91cf\u3002 -XX:+EliminateAllocations \u5f00\u542f\u6807\u91cf\u66ff\u6362(jdk8\u9ed8\u8ba4\u5f00\u542f) -XX:+PrintEliminateAllocations \u67e5\u770b\u6807\u91cf\u7684\u66ff\u6362\u60c5\u51b5 \u5982\u679c\u628a\u4e00\u4e2aJava\u5bf9\u8c61\u62c6\u6563\uff0c\u6839\u636e\u7a0b\u5e8f\u8bbf\u95ee\u7684\u60c5\u51b5\uff0c\u5c06\u5176\u7528\u5230\u7684\u6210\u5458\u53d8\u91cf\u6062\u590d\u4e3a\u539f\u59cb\u7c7b\u578b\u6765\u8bbf\u95ee\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u5c31\u79f0\u4e3a\u6807\u91cf\u66ff\u6362 \u5047\u5982\u9003\u9038\u5206\u6790\u80fd\u591f\u8bc1\u660e\u4e00\u4e2a\u5bf9\u8c61\u4e0d\u4f1a\u88ab\u65b9\u6cd5\u5916\u90e8\u8bbf\u95ee\uff0c\u5e76\u4e14\u8fd9\u4e2a\u5bf9\u8c61\u53ef\u4ee5\u88ab\u62c6\u6563\uff0c\u90a3\u4e48\u7a0b\u5e8f\u771f\u6b63\u6267\u884c\u7684\u65f6\u5019\u5c06\u53ef\u80fd\u4e0d\u53bb\u521b\u5efa\u8fd9\u4e2a\u5bf9\u8c61\uff0c\u800c\u6539\u4e3a\u76f4\u63a5\u521b\u5efa\u5b83\u7684\u82e5\u5e72\u4e2a\u88ab\u8fd9\u4e2a\u65b9\u6cd5\u4f7f\u7528\u7684\u6210\u5458\u53d8\u91cf\u6765\u4ee3\u66ff\u3002 \u6807\u91cf\u66ff\u6362\u53ef\u4ee5\u89c6\u4f5c\u6808\u4e0a\u5206\u914d\u7684\u4e00\u79cd\u7279\u4f8b\uff0c\u5b9e\u73b0\u66f4\u7b80\u5355\uff08\u4e0d\u7528\u8003\u8651\u6574\u4e2a\u5bf9\u8c61\u5b8c\u6574\u7ed3\u6784\u7684\u5206\u914d\uff09\uff0c\u4f46\u5bf9\u9003\u9038\u7a0b\u5ea6\u7684\u8981\u6c42\u66f4\u9ad8\uff0c\u5b83\u4e0d\u5141\u8bb8\u5bf9\u8c61\u9003\u9038\u51fa\u65b9\u6cd5\u8303\u56f4\u5185\u3002 \u540c\u6b65\u6d88\u9664\uff08Synchronization Elimination\uff09 \u4e5f\u53eb\u9501\u6d88\u9664"},{"title":"\u57fa\u4e8eSpringCloud\u642d\u5efaSpring-security-oauth\u8ba4\u8bc1\u670d\u52a1\u5668","link":"https:\/\/blog.greycode.top\/posts\/spring-security-oauth-server-demo\/","pubDate":"Tue, 19 May 2020 20:25:06 +0000","guid":"https:\/\/blog.greycode.top\/posts\/spring-security-oauth-server-demo\/","description":"\u51c6\u5907\u9636\u6bb5 \u8fd9\u91cc\u642d\u5efa\u4e00\u4e2a\u7528OAuth2.0\u5bc6\u7801\u6a21\u5f0f\u8ba4\u8bc1\u7684\u670d\u52a1\u5668\uff0ctoken\u5b58\u5165redis\uff0cclient\u5b58\u5165Mysql\uff1b\n\u6240\u4ee5\u4e8b\u5148\u8981\u51c6\u5907\u597d\uff1a\nRedis Mysql \u5e76\u4e14Mysql\u6267\u884cSpring-security-oauth\u521d\u59cb\u5316Sql\u8fd9\u4e2aSQL\uff0c\u521d\u59cb\u5316Spring-security-oauth\u6240\u9700\u8981\u7684\u8868\u3002\u7136\u540e\u6267\u884c\n-- \u63d2\u5165client_id\u548cclient_secret\u90fd\u4e3asunline\u7684\u5ba2\u6237\u7aef insert into oauth_client_details (client_id, client_secret, authorized_grant_types , autoapprove) values (&#34;sunline&#34;,&#34; {bcrypt}$2a$10$G1CFd535SiyOtvi6ckbZWexQy.hW5x\/I\/fLBPiW\/E4UmctCfKYbgG&#34;,&#34;password&#34;,&#34;true&#34;); client_secret\u4e3anew BCryptPasswordEncoder().encode(&quot;sunline&quot;)\u65b9\u6cd5\u52a0\u5bc6\u540e\uff0c\u7136\u540e\u5728\u52a0\u4e0a{bcrypt}\n\u5f00\u59cb\u642d\u5efa \u5bfc\u5165pom\u4f9d\u8d56 &lt;!--security-oauth--&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.cloud&lt;\/groupId&gt; &lt;artifactId&gt;spring-cloud-starter-oauth2&lt;\/artifactId&gt; &lt;\/dependency&gt; &lt;!--redis--&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt; &lt;artifactId&gt;spring-boot-starter-data-redis&lt;\/artifactId&gt; &lt;\/dependency&gt; &lt;!--mysql--&gt; &lt;dependency&gt; &lt;groupId&gt;mysql&lt;\/groupId&gt; &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt; &lt;version&gt;8.0.17&lt;\/version&gt; &lt;scope&gt;compile&lt;\/scope&gt; &lt;\/dependency&gt; \u914d\u7f6eapplication.properties #datasource spring.datasource.url=jdbc:mysql:\/\/localhost:3307\/grey_code?useUnicode=true&amp;characterEncoding=UTF-8&amp;autoReconnect=true&amp;serverTimezone=Asia\/Shanghai spring.datasource.username=zmh spring.datasource.password=zmh #redis spring.redis.host=127.0.0.1 spring.redis.port=6379 server.port=9991 server.servlet.context-path=\/oauthServer \u521b\u5efa\u7528\u6237\u8be6\u60c5\u670d\u52a1\u7c7b \u521b\u5efa\u6743\u9650\u63a7\u5236\u7c7b \u521b\u5efa\u8ba4\u8bc1\u6388\u6743\u7c7b \u83b7\u53d6\u4ee4\u724c \u8bbf\u95ee:\/oauth\/token\u5c31\u53ef\u4ee5\u83b7\u53d6\u5230\u4ee4\u724c\n{ &#34;accessToken&#34;: &#34;e28f9a99-e60d-4693-b6c3-73e06a1d14f5ZMH10086&#34;, &#34;expiration&#34;: &#34;2020-05-19T21:11:39.883+0000&#34;, &#34;scope&#34;: [ &#34;all&#34; ], &#34;tokenType&#34;: &#34;bearer&#34; } \u8bbf\u95ee\u8d44\u6e90 \u5e26\u4e0a\u83b7\u53d6\u5230\u7684\u4ee4\u724c"},{"title":"SSO\u5355\u70b9\u767b\u5f55\u548cCAS\u6846\u67b6","link":"https:\/\/blog.greycode.top\/posts\/sso-and-cas\/","pubDate":"Thu, 14 May 2020 19:27:14 +0000","guid":"https:\/\/blog.greycode.top\/posts\/sso-and-cas\/","description":"SSO\u5355\u70b9\u767b\u5f55 \u5355\u70b9\u767b\u5f55\uff08\u82f1\u8bed\uff1aSingle sign-on\uff0c\u7f29\u5199\u4e3a SSO\uff09\uff0c\u53c8\u8bd1\u4e3a\u5355\u4e00\u7b7e\u5165\uff0c\u4e00\u79cd\u5bf9\u4e8e\u8bb8\u591a\u76f8\u4e92\u5173\u8fde\uff0c\u4f46\u662f\u53c8\u662f\u5404\u81ea\u72ec\u7acb\u7684\u8f6f\u4ef6\u7cfb\u7edf\uff0c\u63d0\u4f9b\u8bbf\u95ee\u63a7\u5236\u7684\u5c5e\u6027\u3002\u5f53\u62e5\u6709\u8fd9\u9879\u5c5e\u6027\u65f6\uff0c\u5f53\u7528\u6237\u767b\u5f55\u65f6\uff0c\u5c31\u53ef\u4ee5\u83b7\u53d6\u6240\u6709\u7cfb\u7edf\u7684\u8bbf\u95ee\u6743\u9650\uff0c\u4e0d\u7528\u5bf9\u6bcf\u4e2a\u5355\u4e00\u7cfb\u7edf\u90fd\u9010\u4e00\u767b\u5f55\u3002\u8fd9\u9879\u529f\u80fd\u901a\u5e38\u662f\u4ee5\u8f7b\u578b\u76ee\u5f55\u8bbf\u95ee\u534f\u8bae\uff08LDAP\uff09\u6765\u5b9e\u73b0\uff0c\u5728\u670d\u52a1\u5668\u4e0a\u4f1a\u5c06\u7528\u6237\u4fe1\u606f\u5b58\u50a8\u5230LDAP\u6570\u636e\u5e93\u4e2d\u3002\u76f8\u540c\u7684\uff0c\u5355\u4e00\u9000\u51fa\uff08single sign-off\uff09\u5c31\u662f\u6307\uff0c\u53ea\u9700\u8981\u5355\u4e00\u7684\u9000\u51fa\u52a8\u4f5c\uff0c\u5c31\u53ef\u4ee5\u7ed3\u675f\u5bf9\u4e8e\u591a\u4e2a\u7cfb\u7edf\u7684\u8bbf\u95ee\u6743\u9650\u3002\n\u4f18\u70b9 \u4f7f\u7528\u5355\u70b9\u767b\u5f55\u7684\u597d\u5904\u5305\u62ec\uff1a\n\u964d\u4f4e\u8bbf\u95ee\u7b2c\u4e09\u65b9\u7f51\u7ad9\u7684\u98ce\u9669\uff08\u4e0d\u5b58\u50a8\u7528\u6237\u5bc6\u7801\uff0c\u6216\u5728\u5916\u90e8\u7ba1\u7406\uff09\u3002 \u51cf\u5c11\u56e0\u4e0d\u540c\u7684\u7528\u6237\u540d\u548c\u5bc6\u7801\u7ec4\u5408\u800c\u5e26\u6765\u7684\u5bc6\u7801\u75b2\u52b3\u3002 \u51cf\u5c11\u4e3a\u76f8\u540c\u7684\u8eab\u4efd\u91cd\u65b0\u8f93\u5165\u5bc6\u7801\u6240\u82b1\u8d39\u7684\u65f6\u95f4\u3002 \u56e0\u51cf\u5c11\u4e0e\u5bc6\u7801\u76f8\u5173\u7684\u8c03\u7528IT\u670d\u52a1\u53f0\u7684\u6b21\u6570\u800c\u964d\u4f4eIT\u6210\u672c\u3002[1] SSO\u4e3a\u6240\u6709\u5176\u5b83\u5e94\u7528\u7a0b\u5e8f\u548c\u7cfb\u7edf\uff0c\u4ee5\u96c6\u4e2d\u7684\u9a8c\u8bc1\u670d\u52a1\u5668\u63d0\u4f9b\u8eab\u4efd\u9a8c\u8bc1\uff0c\u5e76\u7ed3\u5408\u6280\u672f\u4ee5\u786e\u4fdd\u7528\u6237\u4e0d\u5fc5\u9891\u7e41\u8f93\u5165\u5bc6\u7801\u3002\nCAS\u6846\u67b6 CAS \u534f\u8bae\u57fa\u4e8e\u5728\u5ba2\u6237\u7aefWeb\u6d4f\u89c8\u5668\u3001Web\u5e94\u7528\u548cCAS\u670d\u52a1\u5668\u4e4b\u95f4\u7684\u7968\u636e\u9a8c\u8bc1\u3002\u5f53\u5ba2\u6237\u7aef\u8bbf\u95ee\u8bbf\u95ee\u5e94\u7528\u7a0b\u5e8f\uff0c\u8bf7\u6c42\u8eab\u4efd\u9a8c\u8bc1\u65f6\uff0c\u5e94\u7528\u7a0b\u5e8f\u91cd\u5b9a\u5411\u5230CAS\u3002CAS\u9a8c\u8bc1\u5ba2\u6237\u7aef\u662f\u5426\u88ab\u6388\u6743\uff0c\u901a\u5e38\u901a\u8fc7\u5728\u6570\u636e\u5e93\u5bf9\u7528\u6237\u540d\u548c\u5bc6\u7801\u8fdb\u884c\u68c0\u67e5\u3002\u5982\u679c\u8eab\u4efd\u9a8c\u8bc1\u6210\u529f\uff0cCAS\u4e00\u6b21\u6027\u5728\u5ba2\u6237\u7aef\u4ee5Cookie\u5f62\u5f0f\u53d1\u653eTGT\u7968\u636e\uff0c\u5728\u5176\u6709\u6548\u671fCAS\u5c06\u4e00\u76f4\u4fe1\u4efb\u7528\u6237\uff0c\u540c\u65f6\u5c06\u5ba2\u6237\u7aef\u81ea\u52a8\u8fd4\u56de\u5230\u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u5411\u5e94\u7528\u4f20\u9012\u8eab\u4efd\u9a8c\u8bc1\u7968\uff08Service ticket\uff09\u3002\u7136\u540e\uff0c\u5e94\u7528\u7a0b\u5e8f\u901a\u8fc7\u5b89\u5168\u8fde\u63a5\u8fde\u63a5CAS\uff0c\u5e76\u63d0\u4f9b\u81ea\u5df1\u7684\u670d\u52a1\u6807\u8bc6\u548c\u9a8c\u8bc1\u7968\u3002\u4e4b\u540eCAS\u7ed9\u51fa\u4e86\u5173\u4e8e\u7279\u5b9a\u7528\u6237\u662f\u5426\u5df2\u6210\u529f\u901a\u8fc7\u8eab\u4efd\u9a8c\u8bc1\u7684\u5e94\u7528\u7a0b\u5e8f\u6388\u4fe1\u4fe1\u606f\u3002\n\u5386\u53f2 CAS\u662f\u7531\u8036\u9c81\u5927\u5b66[1]\u7684Shawn Bayern\u521b\u59cb\u7684\uff0c\u540e\u6765\u7531\u8036\u9c81\u5927\u5b66\u7684Drew Mazurek\u7ef4\u62a4\u3002CAS1.0\u5b9e\u73b0\u4e86\u5355\u70b9\u767b\u5f55\u3002 CAS2.0\u5f15\u5165\u4e86\u591a\u7ea7\u4ee3\u7406\u8ba4\u8bc1\uff08Multi-tier proxy authentication\uff09\u3002CAS\u5176\u4ed6\u51e0\u4e2a\u7248\u672c\u5df2\u7ecf\u6709\u4e86\u65b0\u7684\u529f\u80fd\u3002\n2004\u5e7412\u6708\uff0cCAS\u6210\u4e3aJasig[2]\u7684\u4e00\u4e2a\u9879\u76ee\uff0c2008\u5e74\u8be5\u7ec4\u7ec7\u8d1f\u8d23CAS\u7684\u7ef4\u62a4\u548c\u53d1\u5c55\u3002CAS\u539f\u540d\u201c\u8036\u9c81\u5927\u5b66CAS\u201d\uff0c\u6b64\u540e\u88ab\u79f0\u4e3a\u201cJasig CAS\u201d\u3002\n2005\u5e745\u6708\uff0cCAS\u534f\u8bae\u7248\u672c2\u53d1\u5e03\uff0c\u5f15\u5165\u4ee3\u7406\u548c\u670d\u52a1\u9a8c\u8bc1\u3002\n2006\u5e7412\u6708\uff0c\u5b89\u5fb7\u9c81\u00b7W\u00b7\u6885\u9686\u57fa\u91d1\u4f1a\u6388\u4e88\u8036\u9c81\u5927\u5b66\u7b2c\u4e00\u5c4a\u6885\u9686\u6280\u672f\u534f\u4f5c\u5956\uff0c\u9881\u53d150000\u7f8e\u5143\u7684\u5956\u91d1\u5bf9\u8036\u9c81\u5927\u5b66\u5f00\u53d1CAS\u8fdb\u884c\u5956\u52b1\u3002[3]\u9881\u5956\u4e4b\u65f6\uff0cCAS\u5728\u201c\u6570\u4ee5\u767e\u8ba1\u7684\u5927\u5b66\u6821\u56ed\u201d\u4e2d\u4f7f\u7528\u3002\n2012\u5e7412\u6708\uff0cJASIG\u4e0eSakai\u57fa\u91d1\u5408\u5e76\uff0cCAS\u6539\u540d\u4e3aApereo CAS\u3002\n2016\u5e7411\u6708\uff0c\u57fa\u4e8eSpring Boot\u7684CAS\u8f6f\u4ef6\u7248\u672c5\u53d1\u5e03\u3002"},{"title":"OAuth2.0\u4e0eJWT","link":"https:\/\/blog.greycode.top\/posts\/oauth-and-jwt\/","pubDate":"Tue, 12 May 2020 14:59:43 +0000","guid":"https:\/\/blog.greycode.top\/posts\/oauth-and-jwt\/","description":"OAuth2.0 OAuth2.0\u662f\u4e00\u4e2a\u6388\u6743\u534f\u8bae\uff0c\u5b83\u5141\u8bb8\u8f6f\u4ef6\u5e94\u7528\u4ee3\u8868\u8d44\u6e90\u62e5\u6709\u8005\u53bb\u8bbf\u95ee\u8d44\u6e90\u62e5\u6709\u8005\u7684\u8d44\u6e90\u3002\u5e94\u7528\u5411\u8d44\u6e90\u62e5\u6709\u8005\u8bf7\u6c42\u4ee4\u724c\uff0c\u5e76\u7528\u8fd9\u4e2a\u4ee4\u724c\u6765\u8bbf\u95ee\u8d44\u6e90\u62e5\u6709\u8005\u7684\u8d44\u6e90\u3002\n\u89d2\u8272 \u5ba2\u6237\u7aef\uff1a\u76f8\u5f53\u4e8e\u8bbf\u95ee\u53d7\u4fdd\u62a4\u8d44\u6e90\u7684\u8f6f\u4ef6 \u6388\u6743\u670d\u52a1\u5668\uff1a\u6388\u4e88\u5ba2\u6237\u7aef\u4ee4\u724c\u7684\u670d\u52a1 \u8d44\u6e90\u62e5\u6709\u8005\uff1a\u53d7\u4fdd\u62a4\u7684\u8d44\u6e90\u62e5\u6709\u8005\uff0c\u6709\u6743\u51b3\u5b9a\u5c06\u4e0d\u5c06\u4ee4\u724c\u6388\u6743\u7ed9\u5ba2\u6237\u7aef \u53d7\u4fdd\u62a4\u7684\u8d44\u6e90\uff1a\u9664\u8d44\u6e90\u62e5\u6709\u8005\u5916\uff0c\u8981\u8bbf\u95ee\u6b64\u8d44\u6e90\u5fc5\u987b\u8981\u6709\u6388\u6743\u670d\u52a1\u5668\u9881\u53d1\u7684\u6709\u6548\u7684\u4ee4\u724c \u6388\u6743\u7c7b\u578b \u6388\u6743\u7801\u8bb8\u53ef\u7c7b\u578b \u9690\u5f0f\u8bb8\u53ef\u7c7b\u578b \u5ba2\u6237\u7aef\u51ed\u8bc1\u8bb8\u53ef\u7c7b\u578b \u8d44\u6e90\u62e5\u6709\u8005\u51ed\u8bc1\u8bb8\u53ef\u7c7b\u578b(\u8d26\u53f7\u5bc6\u7801\u6a21\u5f0f) \u65ad\u8a00\u8bb8\u53ef\u7c7b\u578b JWT JWT\u5168\u79f0\uff1aJSON Web Token\uff0c\u662f\u4e00\u79cd\u4ee4\u724c\u683c\u5f0f\u3002\u5176\u683c\u5f0f\u7c7b\u4f3c\u4e3axxxxx.yyyyy.zzzzz,\u5206\u4e3a\u4e09\u90e8\u5206\uff0c\u6bcf\u4e2a\u90e8\u5206\u90fd\u7528Base64\u8fdb\u884c\u7f16\u7801\uff0c\u4e4b\u95f4\u7528.\u5206\u9694\u3002\n\u7b2c\u4e00\u90e8\u5206\uff1a\u4e3aHeader\u90e8\u5206\uff0c\u6807\u5934\u901a\u5e38\u7531\u4e24\u90e8\u5206\u7ec4\u6210\uff1a\u4ee4\u724c\u7684\u7c7b\u578b\uff08\u5373JWT\uff09\u548c\u6240\u4f7f\u7528\u7684\u7b7e\u540d\u7b97\u6cd5\uff0c\u4f8b\u5982HMAC SHA256\u6216RSA\u3002\n{ &#34;alg&#34;: &#34;HS256&#34;, &#34;typ&#34;: &#34;JWT&#34; } \u7b2c\u4e8c\u90e8\u5206\uff1a\u4ee4\u724c\u7684\u7b2c\u4e8c\u90e8\u5206\u662f\u6709\u6548\u8d1f\u8f7d\uff0c\u5176\u4e2d\u5305\u542b\u58f0\u660e\u3002 \u58f0\u660e\u662f\u6709\u5173\u5b9e\u4f53\uff08\u901a\u5e38\u662f\u7528\u6237\uff09\u548c\u5176\u4ed6\u6570\u636e\u7684\u58f0\u660e\u3002 \u5171\u6709\u4e09\u79cd\u7c7b\u578b\u7684\u58f0\u660e\uff1a\u6ce8\u518c\u7684\uff0c\u516c\u5171\u7684\u548c\u79c1\u6709\u7684\u4e09\u79cd\u58f0\u660e\u3002\u5f53\u7136\u91cc\u9762\u53ef\u4ee5\u5b58\u653e\u4efb\u4f55\u6709\u6548\u7684\u5b57\u6bb5\u4fe1\u606f\uff08\u79c1\u6709\u58f0\u660e\uff09\u3002\u4f46\u662f\u4e3a\u4e86\u907f\u514d\u4e0d\u540c\u5b9e\u73b0\u4e4b\u95f4\u4e0d\u517c\u5bb9\uff0c\u53ef\u4ee5\u51c6\u5b88JWT\u5b98\u65b9\u63d0\u4f9b\u7684\u58f0\u660e\u5b57\u6bb5\u3002\n\u6ce8\u518c\u58f0\u660e\uff1aJWT\u5b98\u65b9\u63d0\u4f9b\u7684\u58f0\u660e\uff0c\u53c2\u8003\u8d44\u6599:https:\/\/tools.ietf.org\/html\/rfc7519#section-4.1 \u516c\u5171\u58f0\u660e\uff1a\u7528\u6237\u53d1\u90ae\u4ef6\u7ed9JWT\u5b98\u65b9\u8fdb\u884c\u6ce8\u518c\u7684\u58f0\u660e\u5b57\u6bb5\uff0c\u53c2\u8003\u8d44\u6599\uff1ahttps:\/\/tools.ietf.org\/html\/rfc7519#section-4.2 \u79c1\u6709\u58f0\u660e\uff1a\u5b8c\u5168\u7528\u6237\u81ea\u5b9a\u4e49\uff0c\u53c2\u8003\u8d44\u6599https:\/\/tools.ietf.org\/html\/rfc7519#section-4.3 \u7b2c\u4e09\u90e8\u5206\uff1a\u4e3a\u4ee4\u724c\u7b7e\u540d\u90e8\u5206\uff0c\u4f7f\u7528\u8fd9\u4e2a\u5b57\u6bb5\u540e\uff0c\u8d44\u6e90\u670d\u52a1\u5668\u53ea\u4f1a\u63a5\u53d7\u7b7e\u540d\u6b63\u786e\u7684\u4ee4\u724c\u3002"},{"title":"fastDFS\u5b89\u88c5\u4f7f\u7528\u6559\u7a0b","link":"https:\/\/blog.greycode.top\/posts\/linux-fastdfs-install\/","pubDate":"Thu, 07 May 2020 13:34:10 +0000","guid":"https:\/\/blog.greycode.top\/posts\/linux-fastdfs-install\/","description":"FastDFS\u7b80\u4ecb FastDFS \u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u9ad8\u6027\u80fd\u5206\u5e03\u5f0f\u6587\u4ef6\u7cfb\u7edf\uff08DFS\uff09\u3002 \u5b83\u7684\u4e3b\u8981\u529f\u80fd\u5305\u62ec\uff1a\u6587\u4ef6\u5b58\u50a8\uff0c\u6587\u4ef6\u540c\u6b65\u548c\u6587\u4ef6\u8bbf\u95ee\uff0c\u4ee5\u53ca\u9ad8\u5bb9\u91cf\u548c\u8d1f\u8f7d\u5e73\u8861\u3002\u4e3b\u8981\u89e3\u51b3\u4e86\u6d77\u91cf\u6570\u636e\u5b58\u50a8\u95ee\u9898\uff0c\u7279\u522b\u9002\u5408\u4ee5\u4e2d\u5c0f\u6587\u4ef6\uff08\u5efa\u8bae\u8303\u56f4\uff1a4KB &lt; file_size &lt;500MB\uff09\u4e3a\u8f7d\u4f53\u7684\u5728\u7ebf\u670d\u52a1\u3002\nFastDFS \u7cfb\u7edf\u6709\u4e09\u4e2a\u89d2\u8272\uff1a\u8ddf\u8e2a\u670d\u52a1\u5668(Tracker Server)\u3001\u5b58\u50a8\u670d\u52a1\u5668(Storage Server)\u548c\u5ba2\u6237\u7aef(Client)\u3002\nTracker Server\uff1a\u8ddf\u8e2a\u670d\u52a1\u5668\uff0c\u4e3b\u8981\u505a\u8c03\u5ea6\u5de5\u4f5c\uff0c\u8d77\u5230\u5747\u8861\u7684\u4f5c\u7528\uff1b\u8d1f\u8d23\u7ba1\u7406\u6240\u6709\u7684 storage server\u548c group\uff0c\u6bcf\u4e2a storage \u5728\u542f\u52a8\u540e\u4f1a\u8fde\u63a5 Tracker\uff0c\u544a\u77e5\u81ea\u5df1\u6240\u5c5e group \u7b49\u4fe1\u606f\uff0c\u5e76\u4fdd\u6301\u5468\u671f\u6027\u5fc3\u8df3\u3002\nStorage Server\uff1a\u5b58\u50a8\u670d\u52a1\u5668\uff0c\u4e3b\u8981\u63d0\u4f9b\u5bb9\u91cf\u548c\u5907\u4efd\u670d\u52a1\uff1b\u4ee5 group \u4e3a\u5355\u4f4d\uff0c\u6bcf\u4e2a group \u5185\u53ef\u4ee5\u6709\u591a\u53f0 storage server\uff0c\u6570\u636e\u4e92\u4e3a\u5907\u4efd\u3002\nClient\uff1a\u5ba2\u6237\u7aef\uff0c\u4e0a\u4f20\u4e0b\u8f7d\u6570\u636e\u7684\u670d\u52a1\u5668\uff0c\u4e5f\u5c31\u662f\u6211\u4eec\u81ea\u5df1\u7684\u9879\u76ee\u6240\u90e8\u7f72\u5728\u7684\u670d\u52a1\u5668\u3002\n\u7ed3\u6784\u56fe\n\u4e0a\u4f20\u6587\u4ef6\u6d41\u7a0b\n\u5b89\u88c5\u73af\u5883 \u7cfb\u7edf\u53ca\u8f6f\u4ef6\u7248\u672c Git\u5f00\u6e90\u5730\u5740 Centos 7 # libfastcommon V1.0.43 https:\/\/github.com\/happyfish100\/fastdfs fastdfs V6.06 https:\/\/github.com\/happyfish100\/libfastcommon \u6211\u865a\u62df\u673a\u88c5\u7684Centos7\u7684ip\u5730\u5740\u662f172.16.54.137\n\u5b89\u88c5\u524d\u5de5\u4f5c \u5173\u95ed\u9632\u706b\u5899 \u4e3a\u4e86\u65b9\u4fbf\uff0c\u5148\u5173\u95ed\u9632\u706b\u5899\u3002\u7ebf\u4e0a\u73af\u5883\u5b89\u88c5\u53ef\u5b89\u88c5\u540e\u5f00\u653e\u5bf9\u5e94\u7aef\u53e3\u3002\nservice firewalld stop \u4e0b\u8f7d\u6240\u9700\u5b89\u88c5\u5305 libfastcommon wget https:\/\/github.com\/happyfish100\/libfastcommon\/archive\/V1.0.43.tar.gz -O libfastcommon.tar.gz fastDFS wget https:\/\/github.com\/happyfish100\/fastdfs\/archive\/V6.06.tar.gz -O fastdfs.tar.gz \u5b89\u88c5fastDFS\u73af\u5883 \u89e3\u538b\u5b89\u88c5libfastcommon tar -zxvf libfastcommon.tar.gz &amp;&amp; cd libfastcommon-1.0.43\/ &amp;&amp; ."},{"title":"\u63d2\u5165emoji\u5230mysql\u65f6\u63d0\u793a\u4e86\u4e00\u4e2a\u8868\u91cc\u4e0d\u5b58\u5728\u7684\u5b57\u6bb5\u7684\u9519\u8bef","link":"https:\/\/blog.greycode.top\/posts\/mysql-utf8mb4-error\/","pubDate":"Wed, 29 Apr 2020 17:16:27 +0000","guid":"https:\/\/blog.greycode.top\/posts\/mysql-utf8mb4-error\/","description":"1.\u95ee\u9898\u63cf\u8ff0 \u7531\u4e8e\u516c\u53f8\u524d\u7aef\u6709\u9700\u6c42\uff0c\u9700\u8981\u5728tiny_user_info\u8868\u7684nickname\u8fd9\u4e2a\u5b57\u6bb5\u91cc\u5b58\u5165emoji\u8868\u60c5\uff0c\u4e8e\u662f\u6211\u719f\u7ec3\u5730\u5c06\u8fd9\u4e2a\u5b57\u6bb5\u4fee\u6539\u4e3autf8mb4\uff0c\u6539\u597d\u540e\u6d4b\u8bd5\u63d2\u5165\u4e00\u6761\u5e26emoji\u6570\u636e\u3002\u4e8e\u662f\u62a5\u4e86\u8fd9\u4e2a\u9519\u8bef\uff1a\n[2020-04-29 15:57:25] [HY000][1366] Incorrect string value: &#39;\\xF0\\x9F\\x98\\x98&#39; for column &#39;user_name&#39; at row 14 \u5f53\u65f6\u6211\u5c31\u50bb\u4e86\uff0c\u6211\u8fd9\u4e2a\u8868\u91cc\u4e5f\u6ca1\u6709user_name\u8fd9\u4e2a\u5b57\u6bb5\u554a\uff0c\u600e\u4e48\u4f1a\u62a5\u8fd9\u4e2a\u5b57\u6bb5\u9519\u8bef,\u6211\u660e\u660e\u4fee\u6539\u7684\u662fnickname\u8fd9\u4e2a\u5b57\u6bb5\u554a\u3002\u4e8e\u662fgoogle\u548c\u767e\u5ea6\u641c\u4e86\u4e00\u5708\uff0c\u65e0\u89e3\u3002\n\uff12.\u89e3\u51b3\u65b9\u6848 \u8bd5\u4e86\u597d\u51e0\u79cd\u65b9\u6cd5\uff0c\u5220\u5b57\u6bb5\uff0c\u91cd\u65b0\u5efa\u3002\u5220\u8868\uff0c\u91cd\u65b0\u5efa\u3002\u90fd\u4e0d\u884c\u3002\u3002\u3002\u3002\u3002\u9759\u4e0b\u5fc3\u6765\uff0c\u4e8e\u662f\u6253\u7b97\u4ecemysql\u670d\u52a1\u5668\u5165\u624b\u3002\u8fdb\u5165\u5230mysql\u5bf9\u5e94\u5e93\u7684\u6587\u4ef6\u5939\uff0c\u53d1\u73b0tiny_user_info\u8fd9\u4e2a\u8868\u6709\u4e09\u4e2a\u6587\u4ef6\n\u548c\u5e38\u89c1\u7684\u591a\u4e86\u4e00\u4e2aTRG\u6587\u4ef6\u3002\u8fd9\u662f\u4e00\u4e2a\u89e6\u53d1\u5668\u6587\u4ef6\uff0c\u6253\u5f00\u4e00\u770b\uff0c\u53d1\u73b0\u4e86user_name\u5b57\u6bb5\u3002\u3002\u3002\u3002\u3002\u3002\n\u539f\u6765\u662f\u540c\u4e8b\u5728\u8fd9\u4e2a\u8868\u91cc\u52a0\u4e86\u4e2a\u89e6\u53d1\u5668\uff0c\u5f53tiny_user_info\u91cc\u65b0\u589e\u6570\u636e\u65f6\uff0c\u4f1a\u89e6\u53d1\u65b0\u589e\u5230\u53e6\u4e00\u5f20\u8868\u91cc\uff0cnickname\u7684\u503c\u540c\u65f6\u4f1a\u63d2\u5165\u5230\u53e6\u4e00\u5f20\u8868\u7684user_name\u5b57\u6bb5\uff0c\u800c\u4ed6\u90a3\u5f20\u8868\u7684\u5b57\u6bb5\u6ca1\u6709\u8bbe\u7f6eutf8mb4\u7f16\u7801,\u6240\u4ee5\u5bfc\u81f4\u63d2\u5165\u5931\u8d25\u3002\u4e8e\u662f\u53eb\u540c\u4e8b\u628a\u4ed6\u90a3\u5f20\u8868\u8bbe\u7f6e\u4e00\u4e0butf8mb4\u7f16\u7801\u540e\uff0c\u5c31\u53ef\u4ee5\u6b63\u5e38\u63d2\u5165\u4e86\u3002"},{"title":"\u3010\u6570\u636e\u7ed3\u6784\u3011\u624b\u5199\u5e73\u8861\u4e8c\u53c9\u6811\uff08AVL\uff09","link":"https:\/\/blog.greycode.top\/posts\/algorithm-avltree-01\/","pubDate":"Sat, 01 Feb 2020 15:56:00 +0000","guid":"https:\/\/blog.greycode.top\/posts\/algorithm-avltree-01\/","description":"\u3010\u6570\u636e\u7ed3\u6784\u3011\u624b\u5199\u5e73\u8861\u4e8c\u53c9\u6811\uff08AVL\uff09 \u79ef\u5343\u91cc\u8dec\u6b65\uff0c\u6c47\u4e07\u91cc\u6c5f\u6cb3\u3002\u6bcf\u5929\u8fdb\u6b65\u4e00\u70b9\u70b9\uff0c\u7ec8\u6709\u4e00\u5929\u5c06\u6210\u5927\u4f6c\n\u672c\u6587\u6e90\u4ee3\u7801\uff1a\u624b\u5199AVL\u6811\n\u4ec0\u4e48\u662f\u5e73\u8861\u4e8c\u53c9\u6811\uff1f \u5e73\u8861\u4e8c\u53c9\u6811\uff0c\u53c8\u79f0\u4e3aAVL\u6811\uff0c\u5f53\u6811\u4e0d\u662f\u7a7a\u6811\u65f6\uff0c\u5b83\u7684\u5de6\u53f3\u4e24\u4e2a\u5b50\u6811\u7684\u9ad8\u5ea6\u5dee\u7684\u7edd\u5bf9\u503c\u4e0d\u8d85\u8fc71\uff0c\u5e76\u4e14\u5de6\u53f3\u4e24\u4e2a\u5b50\u6811\u90fd\u662f\u4e00\u68f5\u5e73\u8861\u4e8c\u53c9\u6811\u3002AVL\u6811\u67e5\u627e\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3aO(logN)\u3002\n\u5e73\u8861\u4e8c\u53c9\u6811\u57fa\u672c\u7279\u70b9 \u5de6\u53f3\u5b50\u6811\u6df1\u5ea6\u5dee\u4e0d\u80fd\u5927\u4e8e1 \u5de6\u8fb9\u5b50\u6811\u6c38\u8fdc\u6bd4\u6839\u8282\u70b9\u5c0f \u53f3\u8fb9\u5b50\u6811\u6c38\u8fdc\u6bd4\u6839\u8282\u70b9\u5927 \u5e73\u8861\u4e8c\u53c9\u6811\u57fa\u672c\u7ed3\u6784\u53ca\u64cd\u4f5c \u5de6\u5de6\u7ed3\u6784\u2014\u2014\u53f3\u65cb \u53f3\u53f3\u7ed3\u6784\u2014\u2014\u5de6\u65cb \u5de6\u53f3\u7ed3\u6784\u2014\u2014\u5de6\u5b50\u5148\u5de6\u65cb\uff0c\u7136\u540e\u6574\u4f53\u53f3\u65cb \u53f3\u5de6\u7ed3\u6784\u2014\u2014\u53f3\u5b50\u5148\u53f3\u65cb\uff0c\u7136\u540e\u6574\u4f53\u5de6\u65cb \u4ee3\u7801\u5b9e\u73b0 \u5148\u521b\u5efa\u4e00\u4e2a\u5185\u90e8\u7c7bNode\uff0c\u6765\u8868\u793a\u6811\u7684\u6bcf\u4e2a\u8282\u70b9\npublic class AVLTree { private Node rootNode; \/\/\u4e8c\u53c9\u6811\u8282\u70b9 private class Node{ public Node parent; \/\/\u7236 public Node left; \/\/\u5de6\u5b50\u6811 public Node right; \/\/\u53f3\u5b50\u6811 @NotNull public int data; \/\/\u5b58\u653e\u7684\u6570\u636e private int depth; \/\/\u6df1\u5ea6 private int balance; \/\/\u5e73\u8861\u56e0\u5b50 \/\/\u6709\u53c2\u6784\u9020\u65b9\u6cd5 public Node(int data){ this.data=data; this.depth=1; this.balance=0; } } } \u63d2\u5165\u6570\u636e \u66b4\u9732\u4e00\u4e2a\u65b9\u6cd5\u7ed9\u5916\u90e8\u8c03\u7528\n\/**\u6dfb\u52a0\u6570\u636e\u65b9\u6cd5*\/ public void add(int data){ if (this."},{"title":"\u3010\u8f6c\u3011\u514d\u8d39\u53ef\u5546\u7528\uff0c\u6700\u503c\u5f97\u6536\u85cf\u768410\u4e2a\u63d2\u753b\u7d20\u6750\u7f51\u7ad9","link":"https:\/\/blog.greycode.top\/posts\/recommend-tool-1\/","pubDate":"Thu, 16 Jan 2020 09:24:52 +0000","guid":"https:\/\/blog.greycode.top\/posts\/recommend-tool-1\/","description":"\u8f6c\u81ea\u51ef\u51ef\u5218\n\u73b0\u5728\u63d2\u753b\u98ce\u683c\u7684\u754c\u9762\u8d8a\u6765\u8d8a\u591a\uff0c\u7f51\u4e0a\u63d0\u4f9b\u7684\u514d\u8d39\u63d2\u56fe\u4e5f\u8d8a\u6765\u8d8a\u4e30\u5bcc\u3002\u8fd9\u4e9b\u63d2\u56fe\u4f18\u70b9\u662f\u8868\u8fbe\u7684\u5185\u5bb9\u66f4\u4e30\u5bcc\uff0c\u5305\u62ec\uff1a\u4eba\u7269\u3001\u5546\u4e1a\u3001\u8fd0\u52a8\u3001\u81ea\u7136\u3001\u5de5\u4f5c\u3001\u5e7d\u9ed8\u7b49\u7b49\u3002\u4e5f\u66f4\u9002\u5408\u4ea7\u54c1\u7c7b\u7684\u5ba3\u4f20\u7f51\u7ad9\u6216\u8005\u843d\u5730\u9875\u3002\u53e6\u5916\uff0c\u77e2\u91cf\u56fe\u7684\u4e0d\u5931\u771f\u5728\u4e0d\u540c\u5c3a\u5bf8\u7684\u663e\u793a\u6548\u679c\u4e0a\u66f4\u80dc\u4e00\u7b79\u3002\u82b1\u65f6\u95f4\u6574\u7406\u4e86\u5f53\u524d\u5168\u7f51\u90a3\u4e9b\u4f18\u79c0\u768410\u4e2a\u514d\u8d39\u63d2\u56fe\u7f51\u7ad9\uff0c\u7ed9\u505a\u4ea7\u54c1\u7684\u4eba\u4eec\u8282\u7701\u70b9\u67e5\u627e\u7684\u65f6\u95f4\uff0c\u5efa\u8bae\u6536\u85cf\u4ee5\u5907\u540e\u7528\u3002\u8fd9\u4e9b\u7ad9\u70b9\u7684\u7d20\u6750\u90fd\u662f\u514d\u8d39\u4e0b\u8f7d\u53ef\u7528\u7684\uff0c\u800c\u4e14\u53ef\u4ee5\u514d\u8d39\u5546\u7528\u3002\nIRA Design \u7f51\u7ad9\uff1ahttps:\/\/iradesign.io\/ \u4ecb\u7ecd\uff1a\u53ef\u4ee5\u5c06\u5143\u7d20\u8fdb\u884c\u7ec4\u5408\u5f62\u6210\u81ea\u5df1\u559c\u6b22\u7684\u56fe\u7247\uff0c\u6709png\u548csvg\u683c\u5f0f\nAbsurd Design \u7f51\u7ad9\uff1ahttps:\/\/absurd.design\/ \u4ecb\u7ecd\uff1a\u6709\u4e9b\u8352\u8bde\u98ce\u683c\u7684\u77e2\u91cf\u56fe\uff0c\u9002\u7528\u7f51\u7ad9\u7684\u843d\u5730\u9875\u3001APP\u7b49\nOuch! \u7f51\u7ad9\uff1ahttps:\/\/icons8.com\/ouch \u4ecb\u7ecd\uff1a\u5f88\u591a\u7684\u514d\u8d39\u56fe\uff0c\u5404\u79cd\u5206\u7c7b\nunDraw \u7f51\u7ad9\uff1ahttps:\/\/undraw.co\/ \u5185\u5bb9\uff1a\u5f00\u6e90\u7684\u77e2\u91cf\u56fe\u5e93\uff0c\u5404\u79cd\u4f60\u80fd\u60f3\u5230\u7684\u57fa\u672c\u90fd\u6709\nPngtree \u7f51\u7ad9\uff1ahttps:\/\/pngtree.com\/ \u4ecb\u7ecd\uff1a\u4e0a\u767e\u4e07\u7684\u7d20\u6750\u8d44\u6e90\u53ef\u4e0b\u8f7d\nDrawkit \u7f51\u7ad9\uff1ahttps:\/\/www.drawkit.io\/ \u4ecb\u7ecd\uff1a\u6709\u514d\u8d39\u7684\u4e0b\u8f7d\u8d44\u6e90\u96c6\u5408\nHumaaans \u7f51\u7ad9\uff1ahttps:\/\/www.humaaans.com \u5185\u5bb9\uff1a\u5173\u4e8e\u4eba\u7269\u7684\u63d2\u753b\u56fe\u7247\u7ad9\nManypixels \u7f51\u7ad9\uff1ahttps:\/\/www.manypixels.co\/gallery\/ \u4ecb\u7ecd\uff1a\u5efa\u7b51\u3001\u4eba\u7269\u3001\u79d1\u6280\u3001\u5929\u6c14\u3001\u8fd0\u52a8\uff0c\u5546\u4e1a\u7b49\u7c7b\u578b\u7684\u63d2\u753b\nLukaszadam \u7f51\u7ad9\uff1ahttps:\/\/lukaszadam.com\/illustrations \u4ecb\u7ecd\uff1a\u4e00\u4e9b\u6709\u8da3\u7684\u5c0f\u56fe\u6807\u7684\u63d2\u753b\nPixabay \u7f51\u7ad9\uff1ahttps:\/\/pixabay.com\/illustrations\/search\/ \u4ecb\u7ecd\uff1a\u6536\u96c6\u4e86\u5f88\u591a\u514d\u8d39\u7684\u63d2\u56fe\u7d20\u6750\uff0c\u6839\u636e\u5173\u952e\u5b57\u53ef\u4efb\u610f\u641c\u7d22"},{"title":"\u3010\u6e90\u7801\u89e3\u6790\u3011\u4f60\u771f\u7684\u4e86\u89e3ArrayDeque\u561b\uff1f","link":"https:\/\/blog.greycode.top\/posts\/java-arraydeque-source-1\/","pubDate":"Wed, 08 Jan 2020 14:00:51 +0000","guid":"https:\/\/blog.greycode.top\/posts\/java-arraydeque-source-1\/","description":{}},{"title":"\u3010\u6e90\u7801\u89e3\u6790\u3011\u60f3\u4e86\u89e3LinkedList\uff1f\u770b\u8fd9\u7bc7\u6587\u7ae0\u5c31\u5bf9\u4e86","link":"https:\/\/blog.greycode.top\/posts\/java-linkedlist-source-1\/","pubDate":"Sun, 05 Jan 2020 00:21:43 +0000","guid":"https:\/\/blog.greycode.top\/posts\/java-linkedlist-source-1\/","description":{}},{"title":"\u3010\u6e90\u7801\u89e3\u6790\u3011\u6252\u5f00ArrayList\u7684\u5916\u8863","link":"https:\/\/blog.greycode.top\/posts\/java-arraylist-source-1\/","pubDate":"Fri, 03 Jan 2020 19:13:31 +0000","guid":"https:\/\/blog.greycode.top\/posts\/java-arraylist-source-1\/","description":"\u79ef\u5343\u91cc\u8dec\u6b65\uff0c\u6c47\u4e07\u91cc\u6c5f\u6cb3\uff1b\u6bcf\u5929\u8fdb\u6b65\u4e00\u70b9\u70b9\uff0c\u7ec8\u6709\u4e00\u5929\u5c06\u6210\u5927\u4f6c\u3002\n\u672c\u6587\u5185\u5bb9 \u5f53\u7136ArrayList\u91cc\u7684\u65b9\u6cd5\u4e0d\u6b62\u8fd9\u4e9b\uff0c\u672c\u6587\u4e3b\u8981\u8bb2\u4e00\u4e9b\u5e38\u7528\u7684\u65b9\u6cd5\n\u65b9\u6cd5\u53d8\u91cf Arraylist\u91cc\u7684\u65b9\u6cd5\u53d8\u91cf\u4e3b\u8981\u6709\u4ee5\u4e0b\u51e0\u4e2a\n\u6784\u9020\u65b9\u6cd5 \u6709\u53c2\u6784\u9020 \u4f20\u5165\u6570\u7ec4\u7684\u5927\u5c0f \u4ee3\u7801\u5b9e\u73b0 List&lt;String&gt; list=new ArrayList&lt;&gt;(5); \u6e90\u7801\u89e3\u6790 \u4f20\u5165\u4e00\u4e2alist\u5bf9\u8c61 \u5176\u5b9e\u8fd9\u4e2a\u5c31\u76f8\u5f53\u4e8e\u628a\u4f20\u5165\u7684list\u5bf9\u8c61\u91cc\u7684\u6570\u636e\u590d\u5236\u5230\u65b0\u7684ArrayList\u5bf9\u8c61\n\u4ee3\u7801\u5b9e\u73b0 List&lt;String&gt; list=new ArrayList&lt;&gt;(Arrays.asList(&#34;z&#34;,&#34;m&#34;,&#34;h&#34;)); \u8fd9\u91cc\u7528\u6765Arrays\u5de5\u5177\u7c7b\u91cc\u7684asList\u65b9\u6cd5\uff0c\u5b83\u7684\u6e90\u7801\u91cc\u662f\u76f4\u63a5\u8fd4\u56de\u4e00\u4e2aList\uff0c\u6709\u5174\u8da3\u7684\u53ef\u4ee5\u53bb\u770b\u770b\uff0c\u8fd9\u91cc\u5c31\u4e0d\u4ecb\u7ecd\u4e86\n\u6e90\u7801\u89e3\u6790 \u65e0\u53c2\u6784\u9020 \u8fd9\u4e2a\u6bd4\u8f83\u7b80\u5355\uff0c\u76f4\u63a5\u8d4b\u503c\u4e00\u4e2a\u7a7a\u6570\u7ec4\n\u4ee3\u7801\u5b9e\u73b0 List&lt;String&gt; list=new ArrayList&lt;&gt;(); \u6e90\u7801\u89e3\u6790 add\u65b9\u6cd5 add\u4e00\u822c\u5e38\u7528\u7684\u6709\u4e24\u4e2a\u65b9\u6cd5\uff0c\u4e00\u4e2a\u5c31\u662fadd(E e)\u5728\u5c3e\u90e8\u6dfb\u52a0\u6570\u636e\uff0c\u4e00\u4e2a\u5c31\u662fadd(int index,E element)\u5728\u6307\u5b9a\u4f4d\u7f6e\u63d2\u5165\u5143\u7d20\nadd(E e) \u8fd9\u4e2a\u662fArrayist\u7684\u4e3b\u8981\u65b9\u6cd5\uff0c\u5e73\u65f6\u7528\u7684\u4e5f\u662f\u6700\u591a\u7684\u65b9\u6cd5\u4e4b\u4e00\uff0c\u6240\u4ee5\u6e90\u7801\u6bd4\u8f83\u590d\u6742\uff0c\u6bd4\u8f83\u957f\n\u4ee3\u7801\u5b9e\u73b0 List&lt;String&gt; list=new ArrayList&lt;&gt;(); list.add(&#34;\u7070\u7070HK&#34;); \u6e90\u7801\u89e3\u6790 ensureCapacityInternal(int minCapacity)\u786e\u4fdd\u6570\u7ec4\u5bb9\u91cf\u5145\u8db3 calculateCapacity(Object[] elementData, int minCapacity) \u518d\u56de\u5230ensureExplicitCapacity(int minCapacity)\u8fd9\u4e2a\u65b9\u6cd5\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u5148\u4fee\u6539\u6b21\u6570\u52a01\uff0c\u7136\u540e\u5224\u65adsize+1\u662f\u4e0d\u662f\u6bd4\u5f53\u524d\u7684\u6570\u7ec4\u5bb9\u91cf\u5927\uff0c\u5982\u679c\u6bd4\u5f53\u524d\u7684\u6570\u7ec4\u5bb9\u91cf\u5927\uff0c\u5219\u8fdb\u884c\u6269\u5bb9\u64cd\u4f5c\uff0c\u6269\u5927\u5bb9\u91cf\u4e3a\u539f\u6570\u7ec4\u76841.5\u500d \u6bd4\u5982\u7b2c\u4e8c\u6b21\u8c03\u7528add\u65b9\u6cd5\uff0c\u6b64\u65f6size+1=2, elementData.length=10,\u4e3a\u4ec0\u4e48\u7b49\u4e8e10\u5462\uff1f\u56e0\u4e3a\u7b2c\u4e00\u6b21\u9ed8\u8ba4\u628a\u6570\u7ec4\u5bb9\u91cf\u4ece0\u6269\u5927\u5230\u4e8610,\u8fd9\u65f6size+1\u6bd4elementData.length\u5c0f\uff0c\u5c31\u4e0d\u4f1a\u8fdb\u884c\u6269\u5bb9\u64cd\u4f5c\ngrow(int minCapacity)\u6269\u5bb9 \u8fd9\u91cc\u8c03\u7528Arrays.copyOf()\u65b9\u6cd5\u8fdb\u884c\u590d\u5236\u64cd\u4f5c\uff0c\u5f53\u8fdb\u4e00\u6b65\u6df1\u5165\u8fd9\u4e2a\u65b9\u6cd5\u65f6\uff0c\u53d1\u73b0\u662f\u7531System.arraycopy()\u8fd9\u4e2a\u65b9\u6cd5\u5b9e\u73b0\u590d\u5236\u529f\u80fd\u7684\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u7531native\u5173\u952e\u5b57\u4fee\u9970\uff0c\u8868\u793a\u4e0d\u662f\u7531Java\u8bed\u8a00\u5b9e\u73b0\u7684\uff0c\u4e00\u822c\u662fc\/cpp\u5b9e\u73b0\n\u5c0f\u7ed3 \u5230\u8fd9\u91cc\uff0cadd\u7684\u65b9\u6cd5\u6d41\u7a0b\u5c31\u8d70\u5b8c\u4e86\uff0c\u5176\u6838\u5fc3\u6b65\u9aa4\uff1a\n\u6bcf\u6b21\u6dfb\u52a0\u5143\u7d20\u65f6\u5224\u65ad\u6570\u7ec4\u5bb9\u91cf\u662f\u5426\u5145\u8db3\n\u7b2c\u4e00\u6b21\u6dfb\u52a0\u5143\u7d20\uff0c\u628a\u6570\u7ec4\u5bb9\u91cf\u6269\u5bb9\u523010\n\u6269\u5bb9\u65f6\uff0c\u9664\u7b2c\u4e00\u6b21\uff0c\u4ee5\u540e\u7684\u6bcf\u6b21\u6269\u5bb9\u4e3a\u539f\u5927\u5c0f\u76841.5\u500d\n\u6269\u5bb9\u540e\u8c03\u7528System.arraycopy()\u65b9\u6cd5\u628a\u539f\u6570\u7ec4\u7684\u5143\u7d20\u590d\u5236\u5230\u6269\u5bb9\u540e\u7684\u65b0\u6570\u7ec4\nadd(int index, E element) \u8be5\u65b9\u6cd5\u4e3a\u5728\u6307\u5b9a\u4f4d\u7f6e\u63d2\u5165\u5143\u7d20\uff0c\u8be5\u4f4d\u7f6e\u53ca\u540e\u9762\u6240\u6709\u5143\u7d20\u540e\u79fb\n\u4ee3\u7801\u5b9e\u73b0 List&lt;String&gt; list=new ArrayList&lt;&gt;(); list."},{"title":"\u3010\u56fe\u3011\u7528\u56fe\u7247\u544a\u8bc9\u4f60Java\u4e2d\u7684\u4f4d\u8fd0\u7b97","link":"https:\/\/blog.greycode.top\/posts\/java-base-wei\/","pubDate":"Mon, 30 Dec 2019 22:17:30 +0000","guid":"https:\/\/blog.greycode.top\/posts\/java-base-wei\/","description":"\u524d\u8a00 \u200b \u867d\u7136\u4f4d\u8fd0\u7b97\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d\u5e76\u4e0d\u5e38\u7528,\u4f46\u662f\u5728\u5404\u79cd\u7b97\u6cd5\u4e2d\u5374\u5e38\u5e38\u89c1\u5230\u5b83\u4eec\u7684\u8eab\u5f71.\u56e0\u4e3a\u662f\u76f4\u63a5\u64cd\u4f5c\u4e8c\u8fdb\u5236\u7684,\u6240\u4ee5\u673a\u5668\u6267\u884c\u8d77\u6765\u5c31\u5feb\u5f88\u591a,\u6240\u4ee5\u5c3d\u7ba1\u5b9e\u9645\u4e1a\u52a1\u4e2d\u4e0d\u5e38\u7528,\u4f46\u5982\u679c\u4f60\u4e0d\u60f3\u53ea\u505a\u4e2a\u7801\u519c,\u8fd9\u4e2a\u57fa\u7840\u8fd8\u662f\u8981\u638c\u63e1\u7684;\n\u8bb2\u4f4d\u64cd\u4f5c\u4e4b\u524d,\u5c31\u5fc5\u987b\u8981\u77e5\u9053\u539f\u7801\u3001\u53cd\u7801\u3001\u8865\u7801\n\u5176\u4e2d\u6b63\u6570\u7684\u539f\u7801=\u53cd\u7801=\u8865\u7801\n\u539f\u7801\u3001\u53cd\u7801\u3001\u8865\u7801 \u5728\u673a\u5668\u7684\u5185\u5b58\u4e2d,\u4e00\u4e2a\u8d1f\u6570\u7684\u8868\u793a\u662f\u8fd9\u4e2a\u8d1f\u6570\u7684\u7edd\u5bf9\u503c\u53d6\u539f\u7801,\u518d\u53d6\u53cd\u7801,\u518d\u52a0\u4e00,\u6700\u540e\u51fa\u73b0\u7684\u5c31\u662f\u8fd9\u4e2a\u8d1f\u6570\u5728\u5185\u5b58\u4e2d\u7684\u8868\u793a\u7684\u4e8c\u8fdb\u5236\u6570\u503c\n\u6bd4\u5982\u8bf4-9\u5728\u5185\u5b58\u4e2d\u7684\u4e8c\u8fdb\u5236\u7801,\u8fd9\u91cc\u75288\u4f4d\u8868\u793a:\n\u6700\u540e-9\u5728\u5185\u5b58\u4e2d\u7684\u4e8c\u8fdb\u5236\u503c\u4e3a11110111\n\u5728\u4e8c\u8fdb\u5236\u4e2d,\u6700\u9ad8\u4f4d\u4e3a\u7b26\u53f7\u4f4d,0\u4ee3\u8868\u6b63,1\u4ee3\u8868\u8d1f\n\u4f4d\u8fd0\u7b97 \u5de6\u79fb\u548c\u53f3\u79fb \u5728Java\u4e2d\u7684int\u7c7b\u578b\u67094\u5b57\u8282,\u4e00\u4e2a\u5b57\u8282\u67098\u4f4d,\u6240\u4ee5\u8fd9\u8fb9\u752832\u4f4d\u8868\u793a\u4e00\u4e2a\u6570\n\u8d1f\u6570\u7684\u5de6\u79fb\u548c\u53f3\u79fb \u8fd9\u8fb9\u8d1f\u6570\u8868\u793a\u662f\u5728\u5185\u5b58\u4e2d\u8868\u793a\u7684\u4e8c\u8fdb\u5236\u503c\n\u53f3\u79fb\u65f6:\u6700\u9ad8\u4f4d\u8865\u7b26\u53f7\u4f4d1\n\u5de6\u79fb\u65f6:\u672b\u5c3e\u88650\n\u6b63\u6570\u7684\u5de6\u79fb\u548c\u53f3\u79fb \u53f3\u79fb\u65f6:\u6700\u9ad8\u4f4d\u8865\u7b26\u53f7\u4f4d0\n\u5de6\u79fb\u65f6:\u672b\u5c3e\u88650\n\u65e0\u7b26\u53f7\u53f3\u79fb \u65e0\u8bba\u662f\u6b63\u6570\u8fd8\u662f\u8d1f\u6570,\u53f3\u79fb\u6700\u9ad8\u4f4d\u4e00\u5f8b\u88650\n&amp;(\u4f4d\u4e0e) \u5f53\u76f8\u5bf9\u5e94\u7684\u4f4d\u90fd\u4e3a1\u65f6,\u7b49\u4e8e1,\u5426\u5219\u7b49\u4e8e0\n\u4e3a\u4e86\u65b9\u4fbf\u8868\u793a,\u63a5\u4e0b\u6765\u5168\u90e8\u90fd\u75288\u4f4d\u8868\u793a\u4e00\u4e2a\u6570\n|(\u4f4d\u6216) \u5f53\u76f8\u5bf9\u5e94\u7684\u4f4d\u6709\u4e00\u4e2a\u4e3a1\u65f6,\u7b49\u4e8e1,\u5426\u5219\u7b49\u4e8e0\n^(\u5f02\u6216) \u5f53\u76f8\u5bf9\u5e94\u7684\u4f4d\u4e0d\u540c\u65f6,\u7b49\u4e8e1,\u76f8\u540c\u65f6\u7b49\u4e8e0\n~(\u53d6\u53cd) 1\u7b49\u4e8e0,0\u7b49\u4e8e1\n\u603b\u7ed3 \u542b\u4e49 \u8fd0\u7b97\u7b26 \u8bf4\u660e \u5de6\u79fb &laquo; \u672b\u5c3e\u88650 \u53f3\u79fb &gt;&gt; \u8d1f\u6570:\u6700\u9ad8\u4f4d\u8865\u7b26\u53f7\u4f4d1 \u6b63\u6570:\u6700\u9ad8\u4f4d\u8865\u7b26\u53f7\u4f4d0 \u65e0\u7b26\u53f7\u53f3\u79fb &gt;&raquo; \u65e0\u8bba\u662f\u6b63\u6570\u8fd8\u662f\u8d1f\u6570,\u53f3\u79fb\u6700\u9ad8\u4f4d\u4e00\u5f8b\u88650 &amp;(\u4f4d\u4e0e) &amp; \u5f53\u76f8\u5bf9\u5e94\u7684\u4f4d\u90fd\u4e3a1\u65f6,\u7b49\u4e8e1,\u5426\u5219\u7b49\u4e8e0 |(\u4f4d\u6216) | \u5f53\u76f8\u5bf9\u5e94\u7684\u4f4d\u6709\u4e00\u4e2a\u4e3a1\u65f6,\u7b49\u4e8e1,\u5426\u5219\u7b49\u4e8e0 ^(\u5f02\u6216) ^ \u5f53\u76f8\u5bf9\u5e94\u7684\u4f4d \u4e0d\u540c\u65f6,\u7b49\u4e8e1 \u76f8\u540c\u65f6,\u7b49\u4e8e0 ~(\u53d6\u53cd) ~ 1\u7b49\u4e8e0,0\u7b49\u4e8e1 \u6700\u540e\u6709\u4e2a\u5c0f\u6280\u5de7,\u5411\u5de6\u4f4d\u79fb\u51e0\u4f4d\u5c31\u662f\u4e58\u4ee52\u7684\u51e0\u6b21\u65b9,\u6bd4\u59829\u5411\u5de6\u79fbn\u4f4d,\u5c31\u662f\n$$ 9\u5411\u5de6\u79fbn\u4f4d=9*2^n $$\n\u5411\u53f3\u79fb\u51e0\u4f4d\u5c31\u662f\u9664\u4ee52\u7684\u51e0\u6b21\u65b9\u7136\u540e\u5411\u4e0b\u53d6\u6574,\u6bd4\u59829\u5411\u53f3\u79fb\u52a8n\u4f4d,\u5c31\u662f\n$$ 9\u5411\u53f3\u79fbn\u4f4d=\u230a9\/2^n\u230b $$\n\u6ce8:\u230a\u230b\u662f\u6570\u5b66\u7b26\u53f7\u5411\u4e0b\u53d6\u6574,\u4f8b\u5982:2.25\u5411\u4e0b\u53d6\u6574\u662f2;\u00a0-2.25\u5411\u4e0b\u53d6\u6574\u662f-3; \u5177\u4f53\u7684\u8bdd\u53ef\u4ee5\u770b\u770b\u8fd9\u7bc7\u6587\u7ae0\u5411\u4e0a\u53d6\u6574\u4e0e\u5411\u4e0b\u53d6\u6574\u51fd\u6570;\u8be5\u6280\u5de7\u4e0d\u9002\u7528\u65e0\u7b26\u53f7\u53f3\u79fb"},{"title":"\u8bbe\u8ba1\u6a21\u5f0f\u4e4b\u5efa\u9020\u8005\u6a21\u5f0f\u3010\u7528\u597d\u73a9\u7684\u6545\u4e8b\u8bb2\u6e05\u695a\u8bbe\u8ba1\u6a21\u5f0f\u3011","link":"https:\/\/blog.greycode.top\/posts\/gof-builder\/","pubDate":"Fri, 27 Dec 2019 06:50:31 +0000","guid":"https:\/\/blog.greycode.top\/posts\/gof-builder\/","description":"\u79ef\u5343\u91cc\u8dec\u6b65,\u6c47\u4e07\u91cc\u6c5f\u6cb3;\u6bcf\u5929\u8fdb\u6b65\u4e00\u70b9\u70b9,\u7ec8\u6709\u4e00\u5929\u5c06\u6210\u5927\u4f6c\n\u6240\u6709\u6e90\u4ee3\u7801\u90fd\u5728\u8fd9:https:\/\/github.com\/z573419235\/GofDemo\n\u5404\u4f4d\u5927\u4f6c\u8bb0\u5f97\u70b9\u4e2a\u661f\u661f\u54e6\n\u524d\u8a00 \u5efa\u9020\u8005\u6a21\u5f0f\u7528\u4e8e\u5b9e\u4f8b\u5316\u4e00\u4e2a\u6bd4\u8f83\u590d\u6742\u7684\u5b9e\u4f53\u7c7b,\u5f53\u4f60\u5b9e\u4f8b\u5316\u4e00\u4e2a\u7c7b\u65f6,\u5b83\u7684\u6784\u9020\u53c2\u6570\u6bd4\u8f83\u591a\u65f6,\u5c31\u53ef\u4ee5\u7528\u5efa\u9020\u8005\u6a21\u5f0f\u6765\u7b80\u5316\u5b9e\u4f8b\u5316\u8fc7\u7a0b;\u524d\u51e0\u7bc7\u5de5\u5382\u6a21\u5f0f\u7684\u6587\u7ae0\u6211\u4eec\u8bf4\u9053\u4e70\u8f66,\u90a3\u53ea\u662f\u7b80\u5355\u7684\u533a\u5de5\u5382\u4e70\u8f66,\u6211\u4eec\u4e0d\u5173\u7cfb\u5de5\u5382\u662f\u600e\u4e48\u9020\u51fa\u6765\u7684.\u53ef\u662f\u5b9e\u9645\u5de5\u5382\u9020\u4e00\u8f86\u8f66\u9700\u8981\u6709\u65b9\u5411\u76d8\u3001\u53d1\u52a8\u673a\u3001\u8f66\u67b6\u3001\u8f6e\u80ce\u7b49\u90e8\u4ef6,\u800c\u4e14\u4e0d\u540c\u54c1\u724c\u7684\u8f66\u7684\u90e8\u4ef6\u90fd\u662f\u4e0d\u540c\u7684,\u90e8\u4ef6\u867d\u7136\u4e0d\u540c,\u4f46\u662f\u9020\u8f66\u7684\u65b9\u5f0f\u57fa\u672c\u90fd\u662f\u5dee\u4e0d\u591a\u7684\u6b65\u9aa4,\u8fd9\u65f6\u5019\u5c31\u53ef\u4ee5\u7528\u5efa\u9020\u8005\u6a21\u5f0f\u6765\u9020\u4e00\u8f86\u8f66\u4e86;\n\u5efa\u9020\u8005\uff08Builder\uff09\u6a21\u5f0f\u7531\u4ea7\u54c1\u3001\u62bd\u8c61\u5efa\u9020\u8005\u3001\u5177\u4f53\u5efa\u9020\u8005\u3001\u6307\u6325\u8005\u7b49 4 \u4e2a\u8981\u7d20\u6784\u6210\n\u571f\u8c6a\u670b\u53cb\u5f00\u8f66\u5382 \u571f\u8c6a\u670b\u53cb\u4e0a\u6b21\u4e70\u4e86\u8f66\u4e4b\u540e,\u53d1\u73b0\u9020\u8f66\u5356\u8fd8\u633a\u8d5a\u94b1,\u4e8e\u662f\u51b3\u5b9a\u6d89\u8db3\u6c7d\u8f66\u9886\u57df,\u771f\u662f\u5f88\u6709\u5546\u4e1a\u5934\u8111\u554a,\u4e0d\u6127\u662f\u6211\u7684\u7389\u6811\u4e34\u98ce,\u75af\u8a00\u75af\u8bed,\u8bed\u901f\u60ca\u4eba,\u4eba\u6a21\u72d7\u6837\u7684\u571f\u8c6a\u670b\u53cb\u554a. \u4e00\u5929,\u524d\u53bb\u5411\u4ed6\u8ba8\u6559\u6c7d\u8f66\u7684\u77e5\u8bc6,\u4ed6\u7ed9\u6211\u8bb2\u4e86\u6c7d\u8f66\u7684\u5927\u81f4\u6784\u6210:\n\/** * \u6c7d\u8f66 \u4ea7\u54c1\u7c7b \u5b9a\u4e49\u6c7d\u8f66\u7684\u6784\u6210 * *\/ @Data public class Car { \/** * \u65b9\u5411\u76d8 * *\/ private String steering; \/** * \u53d1\u52a8\u673a * *\/ private String engine; \/** * \u8f66\u67b6 * *\/ private String frame; \/** * \u8f6e\u80ce * *\/ private String tire; \/** * \u5c55\u793a\u4e00\u4e0b\u6c7d\u8f66\u914d\u7f6e * *\/ public String show() { return &#34;{&#34; + &#34;steering=&#39;&#34; + steering + &#39;\\&#39;&#39; + &#34;, engine=&#39;&#34; + engine + &#39;\\&#39;&#39; + &#34;, frame=&#39;&#34; + frame + &#39;\\&#39;&#39; + &#34;, tire=&#39;&#34; + tire + &#39;\\&#39;&#39; + &#39;}&#39;; } } \u679c\u771f\u662f\u5927\u81f4\u554a,\u5ffd\u60a0\u6211\u4e0d\u61c2\u8f66\u662f\u5427,\u5c31\u7ed9\u6211\u8bb24\u4e2a\u4e1c\u897f,\u8fd9\u8c01\u4e0d\u77e5\u9053\u554a,\u54fc!"},{"title":"\u4e00\u4e2a\u6545\u4e8b\u4e00\u4e2a\u6a21\u5f0f-\u539f\u578b\u6a21\u5f0f","link":"https:\/\/blog.greycode.top\/posts\/gof-prototype\/","pubDate":"Wed, 25 Dec 2019 23:34:48 +0000","guid":"https:\/\/blog.greycode.top\/posts\/gof-prototype\/","description":"\u79ef\u5343\u91cc\u8dec\u6b65,\u6c47\u4e07\u91cc\u6c5f\u6cb3;\u6bcf\u5929\u8fdb\u6b65\u4e00\u70b9\u70b9,\u7ec8\u6709\u4e00\u5929\u5c06\u6210\u5927\u4f6c\n\u6240\u6709\u6e90\u4ee3\u7801\u90fd\u5728\u8fd9:https:\/\/github.com\/z573419235\/GofDemo\n\u5404\u4f4d\u5927\u4f6c\u8bb0\u5f97\u70b9\u4e2a\u661f\u661f\u54e6\n\u524d\u8a00 \u524d\u51e0\u5929\u751f\u75c5\u4e86,\u6bcf\u5929\u5934\u660f\u8111\u80c0\u7684,\u8bf6,\u751f\u75c5\u7684\u65f6\u5019\u624d\u77e5\u9053\u8eab\u4f53\u5065\u5eb7\u7684\u91cd\u8981\u6027,\u4ee5\u540e\u8fd8\u662f\u8981\u52a0\u5f3a\u953b\u70bc,\u8eab\u4f53\u662f\u9769\u547d\u7684\u672c\u94b1; \u9694\u4e86\u5dee\u4e0d\u591a\u6709\u4e94\u516d\u5929\u6ca1\u5199\u65e5\u5fd7\u4e86,\u7f6a\u8fc7\u7f6a\u8fc7;\u597d\u4e86,\u4eca\u5929\u8981\u8bf4\u7684\u662f\u539f\u578b\u6a21\u5f0f,\u539f\u578b\u6a21\u5f0f\u5728`Java`\u4e2d\u6838\u5fc3\u79d8\u5bc6\u5c31\u662f`clone`\u8fd9\u4e2a\u65b9\u6cd5,\u901a\u8fc7\u91cd\u65b0`Object`\u4e2d\u7684`clone`\u65b9\u6cd5.\u6765\u8fbe\u5230\u539f\u578b\u6a21\u5f0f;\u800c\u8981\u91cd\u65b0`clone`\u65b9\u6cd5\u5c31\u5fc5\u987b\u8981\u5b9e\u73b0`Cloneable`\u8fd9\u4e2a\u63a5\u53e3,\u4e0d\u5b9e\u73b0\u8fd9\u4e2a\u63a5\u53e3\u7684\u8bdd\u5c31\u4f1a\u62a5`java.lang.CloneNotSupportedException`\u5f02\u5e38; \u6211\u662f\u9e23\u4eba \u9e23\u4eba\u6700\u559c\u6b22\u7684\u5c31\u662f\u5403\u62c9\u9762,\u5c31\u7b97\u662f\u4e0a\u8bfe\u7684\u65f6\u5019\u4e5f\u662f\u5fc3\u5fc3\u5ff5\u5ff5\u7684\u60f3\u7740\u4e00\u4e50\u5927\u53d4\u7684\u62c9\u9762 \u5148\u6765\u770b\u770b\u9e23\u4eba\u7684\u539f\u578b\u5b9e\u4f53\u7c7b:\n\/** * @author zheng * * \u6211\u662f\u9e23\u4eba\u5b9e\u4f53\u7c7b *\/ @Data public class Naruto implements Cloneable{ \/** * \u59d3\u540d * *\/ private String name=&#34;\u9e23\u4eba&#34;; \/** * \u5e74\u9f84 * *\/ private int age=13; \/** * \u4efb\u52a1 * *\/ private String task; \/** *\u7231\u597d * *\/ private ArrayList&lt;String&gt; hobby=new ArrayList&lt;&gt;(); \/** * \u6784\u9020\u65b9\u6cd5 * *\/ public Naruto(){ this.hobby.add(&#34;\u5403\u62c9\u9762&#34;); this.hobby.add(&#34;\u6ce1\u6e29\u6cc9&#34;); } \/** * \u91cd\u5199Object\u7c7b\u7684clone\u65b9\u6cd5 * *\/ @Override public Naruto clone(){ Naruto naruto=null; try { naruto=(Naruto)super."},{"title":"\u66f4\u65b0\u9a71\u52a8\u5230mysql-connector-java-8\u9047\u5230\u7684\u4e00\u4e9b\u95ee\u9898","link":"https:\/\/blog.greycode.top\/posts\/mysql-update-driver-connector-8\/","pubDate":"Wed, 25 Dec 2019 17:07:12 +0000","guid":"https:\/\/blog.greycode.top\/posts\/mysql-update-driver-connector-8\/","description":"\u66f4\u65b0\u9a71\u52a8\u5230mysql-connector-java-8\u9047\u5230\u7684\u4e00\u4e9b\u95ee\u9898 \u95ee\u9898 POM &lt;dependency&gt; &lt;groupId&gt;mysql&lt;\/groupId&gt; &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt; &lt;version&gt;8.0.16&lt;\/version&gt; &lt;\/dependency&gt; application.properties spring.datasource.driver-class-name=com.mysql.jdbc.Driver \u9879\u76ee\u662fSpringBoot\u6784\u5efa\u7684,\u6570\u636e\u5e93\u7248\u672c\u662f:MySQL5.7,\u7528\u4e86mysql-connector-java-8\u6765\u94fe\u63a5\u6570\u636e\u5e93,application.properties\u4e5f\u914d\u7f6e\u6210spring.datasource.driver-class-name=com.mysql.jdbc.Driver,\u4e2d\u95f4\u9047\u5230\u4e86\u51e0\u4e2a\u95ee\u9898;\n\u95ee\u9898\u4e00 \u63cf\u8ff0 \u5982\u4e0a\u914d\u7f6e\u540e,\u63a7\u5236\u53f0\u62a5\u4e86\u4e00\u4e0b\u9519\u8bef:\nLoading class `com.mysql.jdbc.Driver&#39;. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver&#39;. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary. \u7ffb\u8bd1\u8fc7\u6765\u540e\u5c31\u662f:\n\u52a0\u8f7d\u7c7b com.mysql.jdbc.Driver\u3002 \u4e0d\u63a8\u8350\u4f7f\u7528\u3002 \u65b0\u7684\u9a71\u52a8\u7a0b\u5e8f\u7c7b\u4e3a com.mysql.cj.jdbc.Driver\u3002 \u901a\u8fc7SPI\u81ea\u52a8\u6ce8\u518c\u9a71\u52a8\u7a0b\u5e8f\uff0c\u901a\u5e38\u4e0d\u9700\u8981\u624b\u52a8\u52a0\u8f7d\u9a71\u52a8\u7a0b\u5e8f\u7c7b\u3002\n\u89e3\u51b3 \u6839\u636e\u63d0\u793a,\u89e3\u51b3\u65b9\u6cd5\u6709\u4e24\u79cd:\n\u66f4\u6539application.properties\u6587\u4ef6 spring.datasource.driver-class-name=com.mysql.jdbc.Driver \/\/\u6539\u6210\u4e0b\u9762\u8fd9\u6837 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver \u53bb\u6389application.properties\u6587\u4ef6\u4e2d\u7684spring.datasource.driver-class-name,\u56e0\u4e3a\u5b83\u8bf4\u4f1a\u901a\u8fc7SPI\u81ea\u52a8\u6ce8\u518c\u7684; \u95ee\u9898\u4e8c \u63cf\u8ff0 \u6570\u636e\u5e93\u7684\u6570\u636e\u65f6\u95f4\u603b\u662f\u548c\u5b9e\u9645\u65f6\u95f4\u5dee8\u4e2a\u5c0f\u65f6\n\u89e3\u51b3 \u5728\u6570\u636e\u5e93url\u6dfb\u52a0serverTimezone=GMT%2B8\nspring.datasource.url=jdbc:mysql:\/\/10.25.0.01:3307\/db?useUnicode=true&amp;autoReconnect=true&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8 \u603b\u7ed3 mysql-connector-java5.X\u7684\u7248\u672c\u9a71\u52a8\u540d\u662f:com.mysql.jdbc.Driver; 6.X\u53ca\u4ee5\u4e0a\u7248\u672c\u7684\u9a71\u52a8\u540d\u662f:com.mysql.cj.jdbc.Driver"},{"title":"Docker\u8fc1\u79fb\u6839\u76ee\u5f55\u5bfc\u81f4mysql\u6743\u9650\u95ee\u9898","link":"https:\/\/blog.greycode.top\/posts\/docker-transfer-pit\/","pubDate":"Fri, 20 Dec 2019 15:04:16 +0000","guid":"https:\/\/blog.greycode.top\/posts\/docker-transfer-pit\/","description":"\u95ee\u9898\u63cf\u8ff0 \u6700\u8fd1\u7531\u4e8e\u516c\u53f8\u670d\u52a1\u5668\u786c\u76d8\u8001\u662f\u7206\u6ee1\uff0c\u5bfc\u81f4\u7ecf\u5e38\u8981\u6e05\u786c\u76d8\u7a7a\u95f4\uff0e\u6700\u540e\u53d1\u73b0\/var\/lib\/docker\u76ee\u5f55\u5360\u4e8625G,\u4ee5\u524d\u5206kvm\u5206\u533a\u7684\u65f6\u5019\uff0c\u4ed6\u4eec\u5206\u4e86\u4e24\u4e2a\u533a\uff1a\u6839\u76ee\u5f55\uff02\/\uff02,\u548c\uff02\/home\uff02\u76ee\u5f55\uff0c\u53d1\u73b0home\u76ee\u5f55\u4f7f\u7528\u51e0\u4e4e\u4e3a\u96f6\uff0c\u4e8e\u662f\u51c6\u5907\u8fc1\u79fbDocker\u7684\u6839\u76ee\u5f55\uff1a\n\u8fc1\u79fb\u6839\u76ee\u5f55\u6211\u770b\u7684\u662f\u8fd9\u4e2a\u6587\u7ae0\uff1adocker\u7684\u5b58\u50a8\u76ee\u5f55\u8fc1\u79fb,\u3000\u4e0d\u8fc7\u8fc1\u79fb\u7684\u65f6\u5019\u6211\u6ca1\u6709\u4f7f\u7528rsync\u8fd9\u4e2a\u547d\u4ee4\uff0c\u800c\u662f\u4f7f\u7528cp -R;\n\u6587\u4ef6\u590d\u5236\u8fc7\u53bb\u540e\uff0c\u6309\u7167\u6559\u7a0b\uff0c\u91cd\u65b0\u542f\u52a8docker\u670d\u52a1\uff0c\u53ef\u662f\u5176\u4e2dmysql\u5bb9\u5668\u8dd1\u4e0d\u8d77\u6765\u4e86\uff0c\u62a5mysqld: Can&rsquo;t create\/write to file &lsquo;\/tmp\/ibTCv7Rw&rsquo; (Errcode: 13 - Permission denied)\n\u671f\u95f4\u6309\u7167\u7f51\u4e0a\u7684\u65b9\u6cd5\uff1a\u8bf4docker\u5bb9\u5668\u542f\u52a8\u662f\u6dfb\u52a0&ndash;privileged=true,\u8bbe\u7f6e\/tmp\u76ee\u5f55\u7684\u6743\u9650\uff0c\u5173\u95edselinux\uff0c\u8fd9\u4e9b\u65b9\u6cd5\u90fd\u6ca1\u7528\uff01\uff01\uff01\uff01\uff01\uff01\n\u5176\u4e2d\u8bbe\u7f6e\/tmp\u6587\u4ef6\u6743\u9650\u8fd9\u4e2a\u65b9\u6cd5\uff0c\u6211\u628a\u91cc\u9762\u7684\/tmp\u6587\u4ef6\u6302\u8f7d\u51fa\u6765\u540e\uff0c\u8bbe\u7f6e\u4e86\u6743\u9650\uff0c\u62a5\u8fd9\u4e2a\u7684\u95ee\u9898\u662f\u89e3\u51b3\u4e86\uff0c\u53ef\u662f\u53c8\u51fa\u73b0\u4e86\u65b0\u7684\u95ee\u9898\uff0c\u53c8\u62a5Version: &lsquo;5.7.27&rsquo; socket: &lsquo;\/var\/run\/mysqld\/mysqld.sock&rsquo;\n\u770b\u6765\u8fd8\u662f\u5f97\u4ece\u6839\u6e90\u4e0a\u89e3\u51b3\u95ee\u9898\u554a\uff01\n\u6211\u7684\u89e3\u51b3\u529e\u6cd5 \u6211\u60f3\uff0c\u65e2\u7136\u662f\u6743\u9650\u95ee\u9898\uff0c\u90a3\u80af\u5b9a\u662f\u590d\u5236\u6587\u4ef6\u7684\u65f6\u5019\u6743\u9650\u4e22\u5931\u4e86\uff0c\u4e8e\u662f\u67e5\u4e86\u4e0bcp\u547d\u4ee4\u4fdd\u6301\u6743\u9650\u7684\u547d\u4ee4\uff08cp -p\uff09: \u4e8e\u662f\u6211\u53c8\u91cd\u65b0\u5173\u95ed\u7684docker\u670d\u52a1\uff0c\u7136\u540e\u5220\u9664\u4e86\u6240\u6709\u590d\u5236\u5230home\u6587\u4ef6\u7684\u76ee\u5f55\uff0c\u91cd\u65b0\u7528cp -p -R \/var\/lib\/docker \/home\/docker\/lib\/\u6765\u91cd\u65b0\u590d\u5236\u4e86\u6587\u4ef6\uff1b\n\u590d\u5236\u540e\uff0c\u91cd\u542fdocker\u670d\u52a1\uff0c\u542f\u52a8docker\u5bb9\u5668\uff0cok,\u4e00\u5207\u6b63\u5e38\uff1b\u7528docker info\u67e5\u770b\uff0c\u770b\u5230\u5df2\u6210\u529f\u8f6c\u79fb\u5230\/home\u4e0b\uff0e"},{"title":"\u8bbe\u8ba1\u6a21\u5f0f\u7cfb\u5217-\u6a21\u677f\u65b9\u6cd5\u6a21\u5f0f","link":"https:\/\/blog.greycode.top\/posts\/gof-taemplate-method\/","pubDate":"Fri, 20 Dec 2019 00:04:28 +0000","guid":"https:\/\/blog.greycode.top\/posts\/gof-taemplate-method\/","description":"\u79ef\u5343\u91cc\u8dec\u6b65\uff0c\u6c47\u4e07\u91cc\u6c5f\u6cb3\uff0e\u6bcf\u5929\u8fdb\u6b65\u4e00\u70b9\u70b9\uff0c\u7ec8\u6709\u4e00\u5929\u5c06\u6210\u5927\u4f6c\n\u6587\u524d\u5e38\u89c4\u53d1\u8a00 \u6a21\u677f\u65b9\u6cd5\u7684\u8bbe\u8ba1\u7b26\u5408\u8fea\u7c73\u7279\u6cd5\u5219\uff0c\u4e5f\u5c31\u662f\u6700\u5c11\u77e5\u9053\u539f\u5219\uff0c\u4ed6\u901a\u8fc7\u5bf9\u4e00\u4e9b\u91cd\u590d\u65b9\u6cd5\u7684\u5c01\u88c5\uff0c\u51cf\u5c11\u7c7b\u4e4b\u95f4\u7684\u8026\u5408\uff0c\u8ba9\u8c03\u7528\u8005\u4e5f\u66f4\u7701\u5fc3\uff0c\u539f\u6765\u8981\u8c03\u4e24\u4e09\u4e2a\u65b9\u6cd5\u624d\u80fd\u5b9e\u73b0\u7684\u529f\u80fd\uff0c\u73b0\u5728\u8c03\u4e00\u4e2a\u5c31\u53ef\u4ee5\u4e86\uff1b\u5c31\u50cf\u6211\u4eec\u4f1f\u5927\u7684\u7956\u56fd\uff0c\u73b0\u5728\u4e5f\u5728\u63a8\u884c\u8fd9\u79cd\u6a21\u5f0f\u5462\uff0e\u4ee5\u524d\u533a\u529e\u4e00\u4e9b\u8bc1\u660e\u4ec0\u4e48\u7684\uff0c\u8981\u8dd1\u4e09\u56db\u4e2a\u5730\u65b9\uff0c\u8fd8\u8981\u4fdd\u8bc1\u8fd9\u4e09\u56db\u4e2a\u5730\u65b9\u90fd\u6b63\u5e38\u5e2e\u4f60\u529e\u7406\uff0c\u5982\u679c\u5176\u4e2d\u4e00\u4e2a\u5730\u65b9\u6ca1\u529e\u7406\uff0c\u90a3\u4e48\u6574\u4e2a\u6d41\u7a0b\u5c31\u90fd\u4f5c\u5e9f\u4e86\uff0e\u73b0\u5728\u597d\u4e86\uff0c\u63d0\u5021\u6700\u591a\u8dd1\u4e00\u6b21\uff0c\u53ea\u8981\u53bb\u4e00\u4e2a\u5730\u65b9\u529e\u4e00\u6b21\u624b\u7eed\u5c31\u53ef\u4ee5\u4e86\uff0c\u4f60\u53ea\u8981\u77e5\u9053\u8fd9\u4e2a\u5730\u65b9\u80fd\u529e\u597d\u5c31\u884c\uff0c\u5176\u4ed6\u7684\u5c31\u4e0d\u7528\u70e6\u5fc3\u4e86\uff1b\n\u963f\u72d7\u5356\u7535\u8111 \u963f\u72d7\u662f\u4e00\u4e2a\u4e09\u5341\u4e94\u5c81\u6ca1\u4e86\u5934\u53d1\u7684\u5e74\u8f7b\u5c0f\u4f19\uff0c\u5f53\u95ee\u53ca\u4e3a\u4ec0\u4e48\u6ca1\u4e86\u5934\u53d1\uff0c\u963f\u72d7\u6478\u6478\u5934\uff0c\u773c\u91cc\u5145\u6ee1\u4e86\u6094\u6068\u7684\u6cea\u6c34\uff1b\u8981\u4e0d\u662f\u5c0f\u65f6\u5019\u6ca1\u542c\u5927\u4eba\u7684\u8bdd\uff0c\u957f\u5927\u4e86\u4e5f\u4e0d\u81f3\u4e8e\u505a\u7a0b\u5e8f\u5458\u554a\uff0d\uff0d\uff0d\u963f\u72d7\u5509\u58f0\u53f9\u6c14\u7684\u8bf4\u9053\uff0e\u542c\u5230\u8fd9\u91cc\uff0c\u6211\u4eff\u4f5b\u5df2\u7ecf\u77e5\u9053\u4e86\u7b54\u6848\uff0e\u5f53\u6211\u95ee\u4ed6\u4e3a\u4ec0\u4e48\u73b0\u5728\u6539\u884c\u5356\u7535\u8111\u4e86\uff0c\u4ed6\u8bf4\u5916\u9762\u7684\u4e16\u754c\u5f88\u5927\uff0c\u60f3\u8d81\u5e74\u8f7b\uff0c\u591a\u95ef\u95ef\uff08\u5b9e\u5219\u662f\u88ab\u516c\u53f8\u88c1\u5458\uff0c\u88ab\u8feb\u6765\u5356\u7535\u8111\u4e86\uff09\uff1b\n\u770b\u770b\u4ed6\u7684\u7535\u8111\u5e97\u91cc\u90fd\u6709\u4ec0\u4e48\n\/** * \u963f\u72d7\u7535\u8111\u5e97 * *\/ abstract class AGouShop { \/** *\u663e\u5361 * *\/ abstract void xianKa(); \/** *cpu * *\/ abstract void cpu(); \/** *\u7535\u6e90 * *\/ abstract void dianYuan(); \/** *\u4e3b\u677f * *\/ abstract void zhuBan(); \/** *\u786c\u76d8 * *\/ abstract void yingPan(); \/** *\u5185\u5b58\u6761 * *\/ abstract void neiCun(); \/** *\u673a\u7bb1 * *\/ abstract void jiXiang(); } \u8fd8\u4e0d\u9519\uff0c\u8be5\u6709\u7684\u90fd\u6709\u4e86\uff0e\u5f53\u6211\u4eec\u6b63\u5728\u5e97\u91cc\u901b\u7740\u65f6\uff0c\u6765\u4e86\u4e24\u4e2a\u987e\u5ba2\uff0c\u963f\u732b\u548c\u5927\u725b\uff0c\u4ed6\u4eec\u90fd\u6765\u5230\u963f\u72d7\u5e97\u7535\u8111\u5e97\uff0c\u6311\u9009\u7684\u7535\u8111\u914d\u4ef6\uff0c\u51c6\u5907\u7ec4\u88c5\u7535\u8111\uff0e\n\u770b\u770b\u963f\u732b\uff1a\n\u5728\u770b\u770b\u5927\u725b\u7684\uff1a\n\u518d\u770b\u770b\u4ed6\u4eec\u600e\u4e48\u7ec4\u88c5\u7684\u5427\uff1a"},{"title":"\u604d\u7136\u5927\u609f\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u7684\u533a\u522b","link":"https:\/\/blog.greycode.top\/posts\/array-vs-linked\/","pubDate":"Wed, 18 Dec 2019 13:50:52 +0000","guid":"https:\/\/blog.greycode.top\/posts\/array-vs-linked\/","description":"\n\u79ef\u5343\u91cc\u8dec\u6b65\uff0c\u6c47\u4e07\u91cc\u6c5f\u6cb3\uff0e\u6bcf\u5929\u8fdb\u6b65\u4e00\u70b9\u70b9\uff0c\u7ec8\u6709\u4e00\u5929\u5c06\u6210\u5927\u4f6c\n\u6587\u524d\u53d1\u8a00 \u5728Java\u4e2d\uff0c\u5f88\u591a\u5730\u65b9\u90fd\u4f7f\u7528\u4e86\u6570\u7ec4\u548c\u94fe\u8868\uff0c\u8fd8\u6709\u4e24\u79cd\u7ec4\u5408\u7684\u53eb\u6570\u7ec4\u94fe\u8868\u7ed3\u6784\uff0c\u5c31\u662f\u5e38\u8bf4\u7684\u54c8\u5e0c\u8868\uff0cHashMap\u5e95\u5c42\u7684\u6570\u636e\u7ed3\u6784\u5c31\u662f\u54c8\u5e0c\u8868\uff0e\u8fdc\u4e86\uff0c\u8fdc\u4e86\uff0c\u8fd9\u91cc\u4e0d\u8bb2HashMap,\u8fd9\u91cc\u8bb2\u6570\u7ec4\u548c\u94fe\u8868\uff1b\n\u6570\u7ec4 \u6570\u7ec4\u662f\u6211\u4eec\u5e73\u65f6\u7528\u7684\u6700\u591a\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5b83\u7684\u7279\u70b9\u662f\u67e5\u8be2\u6570\u636e\u5feb\uff0c\u63d2\u5165\u6570\u636e\u6162\uff0c\u67e5\u8be2\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662fO(1),\u63d2\u5165\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662fO(n).\n\u725b\uff0a\u4e00\u65cf\u53bb\u5b66\u6821\u8bfb\u4e66\uff0c\u5b66\u6821\u6709\u56db\u4eba\u5bdd\u548c\u4e94\u4eba\u5bdd\uff0c\u5927\u725b\uff0c\u4e8c\u725b\uff0c\u4e09\u725b\uff0c\u56db\u725b\u4e00\u540c\u4f4f\u8fdb\u4e86\u56db\u4eba\u5bdd\u91cc\uff0c\u6bcf\u5929\u90fd\u4e94\u7f3a\u4e00\uff1b\u6709\u4e00\u5929\uff0c\u4ed6\u4eec\u5728\u6e38\u620f\u91cc\u8ba4\u8bc6\u4e86\u5c0f\u725b\uff0c\u5f97\u77e5\u5c0f\u725b\u4e5f\u662f\u4ed6\u4eec\u5b66\u6821\u7684\uff0c\u4e8e\u662f\u9080\u8bf7\u5c0f\u725b\u548c\u4ed6\u4eec\u4e00\u8d77\u4f4f\uff0c\u53ef\u662f\u4ed6\u4eec\u4eec\u5bdd\u5ba4\u53ea\u80fd\u4f4f\u56db\u4e2a\u4eba\uff0c\u8fd9\u4e2a\u600e\u4e48\u529e\u5462\uff1f\u4e8e\u662f\u4ed6\u4eec\u5411\u5b66\u6821(\u7cfb\u7edf)\u7533\u8bf7\uff0c\u8981\u6c42\u5b66\u6821\u7ed9\u4ed6\u4eec\u4e00\u4e2a\u65b0\u7684\u516d\u4eba\u5bdd(\u65b0\u7684\u5185\u5b58\u7a7a\u95f4)\uff0c\u4e8e\u662f\u5b66\u6821\u5c31\u7ed9\u4e86\u4ed6\u4eec\u65b0\u7684\u516d\u4eba\u5bdd\uff0c\u4e8e\u662f\u4ed6\u4eec\u5168\u90e8\u90fd\u642c\u53bb\u4e86\u516d\u4eba\u5bdd\u91cc\uff0c\u5c0f\u725b\u4e5f\u529e\u4e86\u8fdb\u53bb\uff0c\u4e4b\u540e\u6bcf\u5929\u4e94\u9ed1\uff0c\u597d\u4e0d\u5feb\u6d3b\uff1b\n\u4e4b\u540e\u6709\u5176\u4ed6\u5b66\u751f\u770b\u5230\u725b\uff0a\u4ed6\u4eec\u7684\u505a\u6cd5\uff0c\u4e8e\u662f\u4e5f\u901a\u901a\u5411\u5b66\u6821\u7533\u8bf7\uff1b\u6700\u540e\u5b66\u6821\u53d1\u73b0\u4e86\u4e00\u4e2a\u95ee\u9898\uff1a\u5c31\u662f\u5b66\u751f\u4eec\u4e3a\u4e86\u4f4f\u8fdb\u65b0\u5bdd\u5ba4\uff0c\u82b1\u8d39\u4e86\u5927\u91cf\u7684\u65f6\u95f4\u5728\u4ece\u65e7\u5bdd\u5ba4\u5230\u65b0\u5bdd\u5ba4\u7684\u8def\u4e0a(\u63d2\u5165\u6570\u636e\u6162)\n\u6709\u7684\u4eba\u4f1a\u8bf4\uff0c\u90a3\u4e00\u5f00\u59cb\u5c31\u5b89\u6392\u5927\u725b\uff0c\u4e8c\u725b\uff0c\u4e09\u725b\uff0c\u56db\u725b\u4f4f\uff15\u4eba\u5bdd\u4e0d\u5c31\u597d\u4e86\u5417\uff1f\u8fd9\u6837\u4ed6\u4eec\u5c31\u4e0d\u7528\u642c\u4e86(\u8fd9\u5c31\u76f8\u5f53\u4e8e\u6211\u4eec\u521d\u59cb\u5316\u6570\u7ec4\u65f6\uff0c\u7ed9\u6570\u7ec4\u6307\u5b9a\u4e86\u4e00\u4e2a\u5927\u5c0f)\uff1b\u8fd9\u6837\u7684\u60f3\u6cd5\u662f\u597d\u7684\uff0c\u4f46\u662f\u5982\u679c\u4ed6\u4eec\u6ca1\u6709\u6ca1\u6709\u8ba4\u8bc6\u5c0f\u725b\uff0c\u5c0f\u725b\u4e5f\u4e0d\u4f1a\u642c\u8fdb\u53bb\uff0c\u8fd9\u6837\u4ed6\u4eec\u56db\u4e2a\u4eba\u5c31\u4e00\u76f4\u4f4f\u7740\uff15\u4eba\u5bdd\uff0c\u5c31\u9020\u6210\u4e86\u7a7a\u95f4\u8d44\u6e90\u6d6a\u8d39\uff1b\n\u6709\u4e00\u5929\uff0c\u8001\u5e08\u53bb\u627e\u8fdb\u5165\u65b0\u5bdd\u5ba4\u7684\u5c0f\u725b\u8c08\u8bdd\uff0c\u4e00\u770b\u5f97\u77e5\u5c0f\u725b\u5728\uff14\u53f7\u5e8a\uff0c\u4e00\u4e0b\u5c31\u627e\u5230\u4e86\u5c0f\u725b\uff08\u67e5\u8be2\u6570\u636e\u5feb\uff09\uff0c\u95ee\u4ed6\u5728\u8fd9\u4e2a\u5bdd\u5ba4\u4f4f\u7684\u4e60\u4e0d\u4e60\u60ef\uff0c\u5c0f\u725b\u5fc3\u60f3\uff0c\u6bcf\u5929\u90fd\u4e94\u9ed1\uff0c\u4f60\u8bf4\u6211\u4e60\u4e0d\u4e60\u60ef\uff01\uff01\n\u94fe\u8868 \u94fe\u8868\u6211\u4eec\u5e73\u65f6\u7528\u7684\u6bd4\u8f83\u5c11\uff0c\u5b83\u7684\u7279\u70b9\u662f:\u63d2\u5165\u6570\u636e\u5feb\uff0c\u67e5\u8be2\u6570\u636e\u6162\uff0c\u67e5\u8be2\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f\uff1aO(n)\uff0c\u63d2\u5165\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f\uff1aO(1)\uff0c\u5b83\u7684\u7279\u70b9\u662f\u548c\u6570\u7ec4\u76f8\u53cd\u7684\uff1b\n\u7ecf\u8fc7\u65e0\u6570\u65e5\u591c\u7684\u594b\u6218\uff0c\u725b\uff0a\u4e00\u5bdd\u4eba\u89c9\u5f97\u662f\u65f6\u5019\u8be5\u51fa\u53bb\u73a9\u73a9\u4e86\uff0c\u81ea\u4ece\u5c0f\u725b\u642c\u8fc7\u6765\u540e\uff0c\u5c31\u4e00\u76f4\u6ca1\u65e5\u6ca1\u591c\u7684\u4e94\u9ed1\uff0c\u90fd\u5feb\u4e0d\u77e5\u9053\u5916\u9762\u7684\u4e16\u754c\u957f\u4ec0\u4e48\u6837\u5b50\u4e86\uff1b\u4ed6\u4eec\u4e00\u884c\u4eba\u51c6\u5907\u53bb\u6e38\u4e50\u56ed\u8f6c\u8f6c\uff0e\n\u6765\u5230\u6e38\u4e50\u56ed\u540e\uff0c\u4e00\u7fa4\u4eba\u50cf\u521a\u653e\u51fa\u6765\u7684\u4e00\u6837\uff0c\u5bf9\u4e00\u5207\u90fd\u5145\u6ee1\u4e86\u65b0\u9c9c\u611f\uff0c\u5230\u5904\u8f6c\u60a0\uff0e\u5c31\u5728\u8f6c\u60a0\u7684\u65f6\u5019\uff0c\u7ec6\u5fc3\u7684\u5927\u725b\u53d1\u73b0\u4e86\u5730\u4e0a\u6709\u4e00\u5f20\u7eb8\u6761\uff0c\u6253\u5f00\u4e00\u770b\uff0c\u4e0a\u9762\u5199\u7740\uff1a\uff02\u5c11\u5e74\uff0c\u4f60\u6e34\u671b\u529b\u91cf\u5417\uff1f\u60f3\u83b7\u5f97\u529b\u91cf\u5c31\u6765\u6d77\u76d7\u8239\u627e\u6211\uff01\uff02\uff0c\u5927\u725b\u8d76\u7d27\u627e\u6765\u5176\u4ed6\u5c0f\u4f19\u4f34\uff0c\u4e00\u540c\u524d\u5f80\uff1b\u5230\u4e86\u6d77\u76d7\u8239\u7684\u5730\u65b9\uff0c\u53d1\u73b0\u8239\u4e0a\u5199\u7740\uff1a\uff02\u529b\u91cf\u6e90\u81ea\u6469\u5929\u8f6e\uff0c\u8bf7\u524d\u5f80\u6469\u5929\u8f6e\uff02\uff0c\u4e8e\u662f\u4e00\u7fa4\u4eba\u5c31\u53c8\u524d\u5f80\u6469\u5929\u8f6e\uff0c\u5728\u90a3\u91cc\uff0c\u7ec8\u4e8e\u8fc7\u5f97\u4e86\u795e\u79d8\u529b\u91cf\uff0d\uff0d\uff0d\u6bd2\u9e21\u6c64\uff1a\u4f60\u7684\u5185\u5fc3\u6709\u591a\u5f3a\u5927\uff0c\u4f60\u7684\u529b\u91cf\u5c31\u6709\u591a\u5f3a\u5927\uff1b\u5c0f\u725b\u4ed6\u4eec\u4e3a\u4e86\u5bfb\u627e\u8fd9\u4e2a\u529b\u91cf\uff0c\u53ef\u8c13\u8d39\u5c3d\u4e5d\u725b\u4e8c\u864e\u4e4b\u529b\u554a\uff08\u67e5\u8be2\u6570\u636e\u6162\uff09\uff1b\n\u53ef\u4ee5\u53d1\u73b0\uff0c\u6bcf\u4e2a\u5143\u7d20\u5b58\u7740\u4e0b\u4e2a\u5143\u7d20\u7684\u5730\u5740\uff0c\u6240\u4ee5\u5982\u679c\u8981\u67e5\u627e\u5176\u4e2d\u67d0\u4e2a\u5143\u7d20\uff0c\u5c31\u5fc5\u987b\u8981\u4ece\u5934\u5f00\u59cb\uff0c\u624d\u80fd\u627e\u5230\uff0e\u8fd9\u5c31\u6bd4\u8f83\u6162\u4e86\uff0e\u4f46\u662f\uff0c\u4ed6\u4eec\u6dfb\u52a0\u5143\u7d20\u5f88\u5feb,\u5143\u7d20\u53ef\u4ee5\u968f\u673a\u51fa\u73b0\u5728\u6e38\u4e50\u56ed\u7684\u67d0\u4e2a\u5730\u65b9\uff0c\u53ea\u8981\u5728\u65b0\u6dfb\u52a0\u5143\u7d20\u7684\u524d\u4e00\u4e2a\u5143\u7d20\u6307\u660e\u65b0\u5143\u7d20\u7684\u5730\u5740\u5728\u54ea\u91cc\u5c31\u53ef\u4ee5\u4e86\uff1b\n\u53d1\u4e2a\u5bf9\u6bd4\u8868\u683c\u5427 \u65f6\u95f4\u590d\u6742\u5ea6\u5bf9\u6bd4\u8868 \u6570\u7ec4 \u94fe\u8868 \u63d2\u5165 O(n) \u6162 O(1) \u5feb \u5220\u9664 O(n) \u6162 O(1) \u5feb \u67e5\u8be2 O(1) \u5feb O(n) \u6162"},{"title":"\u8bbe\u8ba1\u6a21\u5f0f\u7cfb\u5217-\u62bd\u8c61\u5de5\u5382\u6a21\u5f0f","link":"https:\/\/blog.greycode.top\/posts\/gof-abstract-factory\/","pubDate":"Mon, 16 Dec 2019 21:17:23 +0000","guid":"https:\/\/blog.greycode.top\/posts\/gof-abstract-factory\/","description":"\u79ef\u5343\u91cc\u8dec\u6b65\uff0c\u6c47\u4e07\u91cc\u6c5f\u6cb3\uff1b\u6bcf\u5929\u8fdb\u6b65\u4e00\u70b9\u70b9\uff0c\u7ec8\u6709\u4e00\u5929\u5c06\u6210\u5927\u4f6c\n\u7a81\u7136\u5f00\u59cb\u7684\u6b63\u6587 \u7d27\u63a5\u7740\u4e0a\u4e00\u7ae0\u7684\u5de5\u5382\u65b9\u6cd5\u6a21\u5f0f\uff0c\u5176\u5b9e\u62bd\u8c61\u5de5\u5382\u7684\u6982\u5ff5\u548c\u5de5\u5382\u65b9\u6cd5\u7684\u6982\u5ff5\u90fd\u662f\u5dee\u4e0d\u591a\u7684\uff0c\u62bd\u8c61\u5de5\u5382\u6a21\u5f0f\u662f\u5bf9\u5de5\u5382\u65b9\u6cd5\u6a21\u5f0f\u7684\u66f4\u9ad8\u7ea7\uff0c\u6bd4\u5982\u4e0a\u6b21\u6211\u4eec\u8bf4\u7684\u90a3\u4e2a\u6c7d\u8f66\u5de5\u5382\u603b\u90e8\u7c7bAllCarFactory\uff0c\u672c\u6765\u4ed6\u53ea\u5b9a\u4e49\u4e86\u751f\u4ea7\u6c7d\u8f66\u8fd9\u4e2a\u65b9\u6cd5\uff0c\u4e0b\u9762\u7684\u5404\u4e2a\u54c1\u724c\u7684\u6c7d\u8f66\u5382\u4e5f\u53ea\u80fd\u751f\u4ea7\u8fd9\u4e2a\u6c7d\u8f66\uff0c\u73b0\u5728\u7531\u4e8e\u5e02\u573a\u9700\u6c42\uff0c\u9700\u8981\u751f\u4ea7\u6469\u6258\u8f66\uff0c\u7136\u540eAllCarFactory\u5b9a\u4e49\u4e86\u4e00\u4e2a\u751f\u4ea7\u6469\u6258\u8f66\u7684\u63a5\u53e3\uff0c\u8fd9\u6837\u8fd9\u4e2a\u63a5\u53e3\u4e0b\u9762\u7684\u6c7d\u8f66\u5382\u5c31\u53ef\u4ee5\u751f\u4ea7\u6469\u6258\u8f66\u4e86\uff0e\u5c31\u5728\u8fd9\u65f6\u4ed6\u4eec\u7684\u751f\u4ea7\u6a21\u5f0f\u4e5f\u4ece\u5de5\u5382\u65b9\u6cd5\u6a21\u5f0f\u5347\u7ea7\u5230\u4e86\u62bd\u8c61\u5de5\u5382\u6a21\u5f0f\uff1b\n\u8bdd\u4e0d\u591a\u8bf4\uff0c\u770b\u4e24\u4e2a\u6a21\u5f0f\u7684\u7c7b\u56fe\u4f60\u5c31\u660e\u767d\u4e86\uff1a\n\u539f\u672c\u7684\u5de5\u5382\u65b9\u6cd5\u6a21\u5f0f\u7c7b\u56fe\uff1a \u5347\u7ea7\u540e\u7684\u62bd\u8c61\u5de5\u5382\u6a21\u5f0f\uff1a \u53ef\u4ee5\u770b\u5230\uff0c\u62bd\u8c61\u5de5\u5382\u53ea\u662f\u6bd4\u5de5\u5382\u65b9\u6cd5\u6a21\u5f0f\u591a\u751f\u4ea7\u4e86\u4e00\u4e2a\u4ea7\u54c1\uff0c\u5f53\u62bd\u8c61\u5de5\u5382\u6a21\u5f0f\u7684\u4ea7\u54c1\u51cf\u5230\u53ea\u6709\u4e00\u4e2a\u7684\u65f6\u5019\uff0c\u4ed6\u5c31\u53c8\u56de\u5230\u4e86\u5de5\u5382\u65b9\u6cd5\u6a21\u5f0f\uff1b\n\u597d\u8272\u7684\u670b\u53cb\u4e70\u8f66\u4e86 \u4e0a\u6b21\u6211\u670b\u53cb\u770b\u89c1\u6211\u4e70\u8f66\u4e4b\u540e\uff0c\u5f97\u77e5\u662f\u4e2a\u5c0f\u59d0\u59d0\u5e26\u6211\u533a\u4e70\u8f66\u7684\uff0c\u4e8e\u662f\u4ed6\u53eb\u6211\u8054\u7cfb\u4e86\u4e0b\u90a3\u4e2a\u5c0f\u59d0\u59d0\uff0c\u8bf4\u4ed6\u4e5f\u8981\u4e70\u8f66\uff0c\u70b9\u540d\u8981\u53eb\u5c0f\u59d0\u59d0\u5e26\u4ed6\u53bb\uff0c\u7531\u4e8e\u8d44\u91d1\u6709\u9650\uff0c\u4ed6\u53ea\u5356\u4e86\u5954\u9a70\u548c\u4e94\u83f1\u7cfb\u5217\u7684\u4ea7\u54c1\uff0c\u6ca1\u6709\u4e70\u83b1\u65af\u83b1\u65af\u7684\uff1b\u770b\u770b\u4ed6\u662f\u600e\u4e48\u4e70\u7684\u5427\uff1a\n\u53ef\u4ee5\u770b\u5230\uff0c\u7531\u4e8e\u8981\u5728\u4e00\u4e2a\u5de5\u5382\u4e70\u4e24\u4e2a\u4e1c\u897f\uff0c\u4ed6\u662f\u5148\u627e\u5230\u4e86\u5de5\u5382\uff0c\u7136\u540e\u518d\u4e00\u4ef6\u4e00\u4ef6\u7684\u4ece\u5de5\u5382\u4e70\uff0e\u6211\u4eec\u4e0a\u6b21\u662f\u4e00\u4e2a\u5de5\u5382\u4e70\u4e00\u4ef6\u4e1c\u897f\uff0c\u6240\u4ee5\u662f\u76f4\u63a5\u53bb\u5de5\u5382\u4e70\u7684\uff1b\n\u63aa\u4e0d\u53ca\u9632\u7684\u7ed3\u675f\u4e86 \u4e0d\u662f\u6211\u4e0d\u60f3\u8bb2\uff0c\u800c\u662f\u62bd\u8c61\u5de5\u5382\u5c31\u662f\u8fd9\u6837\u7684\u4e1c\u897f\uff0e\u4ece\u4e0a\u9762\u53ef\u4ee5\u770b\u51fa\uff0c\u62bd\u8c61\u5de5\u5382\u6bcf\u5f53\u589e\u52a0\u4e00\u4e2a\u4ea7\u54c1\u65f6\uff0c\u540e\u9762\u76f8\u5173\u7684\u7684\u54c1\u724c\u5de5\u5382\u4e5f\u5168\u90e8\u8981\u5b9e\u73b0\u4ed6\u8fd9\u4e2a\u4ea7\u54c1\uff0c\u8fd9\u5c31\u8fdd\u80cc\u4e86\u5f00\u95ed\u539f\u5219\u4e86\uff0e\u6240\u4ee5\uff0c\u5728\u5b9e\u9645\u8bbe\u8ba1\u4e2d\uff0c\u4e00\u4e2a\u4e1a\u52a1\u573a\u666f\u662f\u7a33\u5b9a\u7684,\u7528\u62bd\u8c61\u5de5\u5382\u662f\u6bd4\u8f83\u597d\u7684\uff0c\u56e0\u4e3a\u4e00\u6b21\u8bbe\u8ba1,\u540e\u9762\u5c31\u4e0d\u7528\u6539\u4e86,\u8fd9\u6837\u5c31\u4e0d\u4f1a\u8fdd\u53cd\u5f00\u95ed\u539f\u5219\u4e86\uff0e\u4f46\u662f\u5982\u679c\u4e00\u4e2a\u4e1a\u52a1\u573a\u666f\u662f\u7a33\u5b9a\u7684\u662f\u4e0d\u7a33\u5b9a\u7684\uff0c\u90a3\u4e48\u5c31\u4e0d\u9002\u5408\u4f7f\u7528\u8fd9\u4e2a\u6a21\u5f0f\u4e86\uff0c\u56e0\u4e3a\u540e\u671f\u9700\u8981\u591a\u6b21\u4fee\u6539\uff0c\u8fd9\u5c31\u8fdd\u53cd\u4e86\u5f00\u95ed\u539f\u5219\uff0c\u540c\u65f6\u4e5f\u53ca\u5176\u96be\u7ef4\u62a4\uff0c\u5e94\u4e3a\u4f60\u4e0d\u77e5\u9053\u4fee\u6539\u4e86\u4ee3\u7801\uff0c\u5230\u5e95\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\uff1b"},{"title":"\u8bbe\u8ba1\u6a21\u5f0f\u7cfb\u5217-\u5de5\u5382\u6a21\u5f0f","link":"https:\/\/blog.greycode.top\/posts\/gof-factory-method\/","pubDate":"Sun, 15 Dec 2019 17:25:00 +0000","guid":"https:\/\/blog.greycode.top\/posts\/gof-factory-method\/","description":"\u79ef\u5343\u91cc\u8dec\u6b65\uff0c\u6c47\u4e07\u91cc\u6c5f\u6cb3\uff0e\u6bcf\u5929\u8fdb\u6b65\u4e00\u70b9\u70b9\uff0c\u7ec8\u6709\u4e00\u5929\u5c06\u6210\u5927\u4f6c\n\u524d\u8a00 \u5de5\u5382\u6a21\u5f0f\u6709\u4e00\u4e0b\u4e09\u79cd\n\u7b80\u5355\u5de5\u5382\u6a21\u5f0f \u5de5\u5382\u65b9\u6cd5\u6a21\u5f0f \u62bd\u8c61\u5de5\u5382\u6a21\u5f0f \u5176\u4e2d\u7b80\u5355\u5de5\u5382\u6a21\u5f0f\u4e0d\u572823\u4e2d\u6a21\u5f0f\u4e4b\u4e2d\uff0c\u66f4\u591a\u7684\u662f\u4e00\u79cd\u7f16\u7a0b\u4e60\u60ef\uff0c\u800c\u6211\u4eec\u5e73\u5e38\u6240\u8bf4\u7684\u5de5\u5382\u6a21\u5f0f\u4e00\u822c\u6307\u7684\u662f\u5de5\u5382\u65b9\u6cd5\u6a21\u5f0f\uff0c\u62bd\u8c61\u5de5\u5382\u5728\u5b9e\u9645\u7684\u4e1a\u52a1\u5f00\u53d1\u4e2d\u4e5f\u7528\u7684\u6bd4\u8f83\u5c11\uff0c\u56e0\u4e3a\u5b83\u6709\u65f6\u5019\u8fdd\u80cc\u4e86\u5f00\u95ed\u539f\u5219\uff0e\u7531\u4e8e\u7bc7\u5e45\u6709\u9650\uff0c\u62bd\u8c61\u5de5\u5382\u672c\u6587\u5c31\u4e0d\u8bb2\u4e86\uff0c\u4ee5\u540e\u5355\u72ec\u8bb2\uff1b\n\u7b80\u5355\u5de5\u5382\u6a21\u5f0f \u7b80\u5355\u5de5\u5382\u5230\u5e95\u6709\u591a\u7b80\u5355\u5462\uff1f\u7b80\u5355\u5230\u53ea\u6709\u4e00\u4e2a\u5de5\u5382\uff0c\u8fd9\u4e2a\u5de5\u5382\u76f8\u5f53\u4e8e\u662f\u4e07\u80fd\u5de5\u5382\uff0c\u4f60\u60f3\u8981\u4ec0\u4e48\uff0c\u53ea\u8981\u548c\u5b83\u8bf4\u4e00\u58f0\uff0c\u5b83\u5c31\u4f1a\u60f3\u65b9\u8bbe\u6cd5\u7684\u53bb\u62b1\u4f60\u521b\u5efa\uff0c\u7136\u540e\u7ed9\u4f60\uff1b\u4e3e\u4e2a\u4e70\u8f66\u7684\u7b80\u5355\u7684\u4f8b\u5b50\uff1a\n\u5f53\u6211\u8981\u4e70\u8f66\u7684\u65f6\u5019\uff0c\u6211\u9009\u4e86\u8fd9\u4e24\u79cd\u8f66\uff0e\n\/** * \u521b\u5efa\u4e00\u4e2a\u6c7d\u8f66\u63a5\u53e3 * *\/ public interface Car { \/** * \u6c7d\u8f66\u80fd\u52a8 * *\/ void run(); } \/** * \u5954\u9a70\u8f66 * *\/ public class Benz implements Car { @Override public void run() { System.out.println(&#34;\u5927\u5954\u5f00\u52a8\u4e86&#34;); } } \/** * \u4e94\u83f1\u795e\u8f66 * *\/ public class Wuling implements Car { @Override public void run() { System.out.println(&#34;\u4e94\u83f1\u795e\u8f66\u5f00\u52a8\u4e86&#34;); } } \u9009\u662f\u9009\u597d\u4e86\uff0c\u53ef\u662f\u8981\u600e\u4e48\u5f97\u5230\u5462\uff1f\u662f\u4e0d\u662f\u4e0b\u610f\u8bc6\u7684new\u4e00\u4e2a\u51fa\u6765\uff1f\n\/\/\u6211\u8981\u5954\u9a70\u8f66 Benz\u3000myCar=new Benz(); \u5982\u679c\u662f\u8fd9\u6837\u7684\u8bdd\uff0c\u5c31\u76f8\u5f53\u4e8e\u81ea\u5df1\u4eb2\u624b\u9020\u4e86\u4e00\u8f86\u5954\u9a70\u8f66\u51fa\u6765\uff0c\u56e0\u4e3a\u662f\u4f60\u81ea\u5df1new\u51fa\u6765\u7684\u561b\uff01\uff01\uff01\uff01\uff01"},{"title":"OOP\u7a0b\u5e8f\u4e03\u5927\u539f\u5219","link":"https:\/\/blog.greycode.top\/posts\/gof-oop-7-all\/","pubDate":"Sun, 15 Dec 2019 10:45:04 +0000","guid":"https:\/\/blog.greycode.top\/posts\/gof-oop-7-all\/","description":"\u5f00\u95ed\u539f\u5219 \u5f00\u95ed\u539f\u5219\u76f8\u5f53\u4e8e\u6240\u6709\u539f\u5219\u7684\u7956\u5148\uff0c\u4e3b\u5f20\u5bf9\u4fee\u6539\u5173\u95ed\uff0c\u5bf9\u62d3\u5c55\u5f00\u653e\uff0e\n\u91cc\u6c0f\u66ff\u6362\u539f\u5219 \u5f53\u4e24\u4e2a\u7c7b\u6709\u7ee7\u627f\u5173\u7cfb\u65f6\uff0c\u5b50\u7c7b\u4e0d\u80fd\u4fee\u6539\u7236\u7c7b\u7684\u65b9\u6cd5\u548c\u53d8\u91cf. \u91cc\u6c0f\u66ff\u6362\u4e2d\u7684\u66ff\u6362\u6307\u7684\u662f\uff1a\u5f53\u6709\u7236\u7c7b\u51fa\u73b0\u7684\u5730\u65b9\uff0c\u8fd9\u4e2a\u7236\u7c7b\u53ef\u4ee5\u66ff\u6362\u6210\u5b50\u7c7b\uff0c\u800c\u4e14\u5bf9\u7a0b\u5e8f\u6ca1\u6709\u5f71\u54cd\uff0c\u8fd9\u5c31\u9075\u5faa\u4e86\u91cc\u6c0f\u66ff\u6362\u539f\u5219\uff1b\u5f53\u66ff\u6362\u6210\u5b50\u7c7b\u65f6\u5bf9\u7a0b\u5e8f\u6709\u5f71\u54cd\uff0c\u8bf4\u660e\u5b50\u7c7b\u4fee\u6539\u4e86\u7236\u7c7b\u7684\u65b9\u6cd5\uff0c\u5c31\u6ca1\u6709\u9075\u5faa\u91cc\u6c0f\u66ff\u6362\u539f\u5219\u4e86\uff1b\n\u4f9d\u8d56\u5012\u7f6e\u539f\u5219 \u4f9d\u8d56\u5012\u7f6e\u539f\u5219\u662f\u5bf9\u5f00\u95ed\u539f\u5219\u7684\u4e00\u4e2a\u5b9e\u73b0\uff0c\u4e5f\u662f\u4e3b\u5f20\u5bf9\u62d3\u5c55\u5f00\u653e\uff0c\u5bf9\u4fee\u6539\u5173\u95ed\uff0e\u5b83\u7684\u6838\u5fc3\u601d\u60f3\u662f\u9762\u5bf9\u63a5\u53e3\u7f16\u7a0b\uff0c\u4e0d\u8981\u9762\u5bf9\u5177\u4f53\u5b9e\u73b0\u7f16\u7a0b\uff0e\n\u8fd9\u662f\u4e00\u4e2a\u9075\u5b88\u4f9d\u8d56\u5012\u7f6e\u539f\u5219\u7684UML\u56fe\uff0c\u539f\u6765\u7684\u8bdd\u5f53\u5ba2\u6237\u8d2d\u4e70\u5546\u54c1\u65f6,shopping\u8fd9\u4e2a\u65b9\u6cd5\u8981\u4f20\u5165\u76f8\u5e94\u7684\u7f51\u5e97\u8fdb\u53bb\uff0c\u5f53\u8981\u66f4\u6539\u5e97\u94fa\u65f6\uff0c\u5c31\u8981\u4fee\u6539Cusromer\u8fd9\u4e2a\u7c7b\u91cc\u7684shopping\u65b9\u6cd5\uff0c\u800c\u73b0\u5728\uff0c\u53ea\u8981\u5b9a\u4e49\u4e00\u4e2aShop\u63a5\u53e3\uff0c\u6240\u6709\u7684\u5e97\u94fa\u90fd\u5b9e\u73b0\u8fd9\u4e2a\u63a5\u53e3\u7684\u65b9\u6cd5\uff0c\u987e\u5ba2\u7c7b\u7684shopping\u65b9\u6cd5\u53ea\u8981\u4f20\u5165Shop\u8fd9\u4e2a\u63a5\u53e3\u7c7b\u5c31\u53ef\u4ee5\u4e86\uff0e\u7136\u540e\u5177\u4f53\u5b9e\u73b0\u7684\u65f6\u5019\uff0c\u8981\u5230\u54ea\u91cc\u4e70\uff0c\u5c31\u4f20\u5165\u54ea\u4e00\u4e2a\u7f51\u5e97\u5c31\u53ef\u4ee5\u4e86\uff0c\u800c\u4e0d\u7528\u4fee\u6539Cusromer\u8fd9\u4e2a\u7c7b\u7684\u65b9\u6cd5\uff1b\n\/\/\u4ee3\u7801\u6765\u4e4b\uff07C\u8bed\u8a00\u4e2d\u6587\u7f51\uff07 public class DIPtest { public static void main(String[] args) { Customer wang=new Customer(); System.out.println(&#34;\u987e\u5ba2\u8d2d\u4e70\u4ee5\u4e0b\u5546\u54c1\uff1a&#34;); wang.shopping(new ShaoguanShop()); wang.shopping(new WuyuanShop()); } } \/\/\u5546\u5e97 interface Shop { public String sell(); \/\/\u5356 } \/\/\u97f6\u5173\u7f51\u5e97 class ShaoguanShop implements Shop { public String sell() { return &#34;\u97f6\u5173\u571f\u7279\u4ea7\uff1a\u9999\u83c7\u3001\u6728\u8033\u2026\u2026&#34;; } } \/\/\u5a7a\u6e90\u7f51\u5e97 class WuyuanShop implements Shop { public String sell() { return &#34;\u5a7a\u6e90\u571f\u7279\u4ea7\uff1a\u7eff\u8336\u3001\u9152\u7cdf\u9c7c\u2026\u2026&#34;; } } \/\/\u987e\u5ba2 class Customer { public void shopping(Shop shop) { \/\/\u8d2d\u7269 System."},{"title":"Jenkins\u6559\u7a0b-\u96c6\u6210SonarQube","link":"https:\/\/blog.greycode.top\/posts\/build-jenkins-sonarqube\/","pubDate":"Fri, 13 Dec 2019 15:38:02 +0000","guid":"https:\/\/blog.greycode.top\/posts\/build-jenkins-sonarqube\/","description":"\u4ec0\u4e48\u662fSonarQube? \u770b\u770b\u7ef4\u57fa\u767e\u79d1\u7684\u8bf4\u660e\uff1a SonarQube\u4e0eCI\/CD\u67b6\u6784\u56fe Docker\u8fd0\u884cSonarQube \u7b80\u5355\u4e86\u89e3\u4e4b\u540e\uff0c\u5f00\u59cb\u5b89\u88c5SonarQube.\u8fd9\u91cc\u7528Docker\u5b89\u88c5\n\u6ce8\uff1a\u8fd9\u91cc\u7528mysql\u6765\u5b58\u50a8SonarQube\u7684\u6570\u636e\uff0cSonarQube7.9\u8d77\u5df2\u7ecf\u4e0d\u5728\u652f\u6301mysql\u4e86\uff0c\u53ef\u4ee5\u5b89\u88c5\u5b98\u65b9\u63a8\u8350\u7684PostgreSQL\nSonarQube 6.7.7 Docker-CE 19.03.1 Mysql 5.7 \u5b89\u88c5 \u76f4\u63a5\u8fd0\u884c\u8fd9\u4e2adocker\u547d\u4ee4\u6765\u5b89\u88c5\uff0c\u7f51\u4e0a\u5176\u4ed6\u7684\u6559\u7a0b\u6709\u4ec0\u4e48\u6302\u8f7d\u6587\u4ef6\u4ec0\u4e48\u7684\uff0c\u6211\u8bd5\u4e86\u90fd\u4f1a\u5b89\u88c5\u5931\u8d25\uff0c\u539f\u56e0\u8fd8\u662f\u56e0\u4e3a\u6743\u9650\u539f\u56e0\uff0c\u56e0\u4e3aSonarQube\u4e0d\u662f\u4ee5root\u7528\u6237\u8fd0\u884c\u7684\uff0c\u5bfc\u81f4\u6ca1\u6743\u9650\u8bfb\u5199\u6302\u8f7d\u51fa\u6765\u7684\u6587\u4ef6\u5939\uff0e\n\u6ce8\u610f\uff1a\u521b\u5efa\u5bb9\u5668\u524d\u4e00\u5b9a\u8981\u5148\u4fdd\u8bc1\u4f60\u8fde\u7684\u5bb9\u5668\u6709\u5bf9\u5e94\u7684\u6570\u636e\u5e93\ndocker run -d --name sonarqube -p 9099:9000 -p 9092:9092 --link=dev_mysql:mysql -e SONARQUBE_JDBC_USERNAME=app -e SONARQUBE_JDBC_PASSWORD=app -e SONARQUBE_JDBC_URL=&#34;jdbc:mysql:\/\/mysql:3306\/sonar?useUnicode=true&amp;characterEncoding=utf8&amp;rewriteBatchedStatements=true&amp;useConfigs=maxPerformance&amp;useSSL=false&#34; --restart=always sonarqube:6.7.7-community &ndash;link=dev_mysql:mysql \u8fd9\u4e2a\u547d\u4ee4\u6211\u94fe\u63a5\u5230\u4e86\u6211\u7684mysql\u5bb9\u5668\uff0cdev_mysql\u662f\u5bb9\u5668\u7684\u540d\u5b57\uff0cmysql\u662f\u5728SonarQube\u5bb9\u5668\u91cc\u7684\u522b\u540d\uff0c\u6240\u4ee5\u94fe\u63a5\u6570\u636e\u5e93\u65f6\u76f4\u63a5\u7528mysql\u8fd9\u4e2a\u522b\u540d\u5c31\u53ef\u4e86\uff0e\nSONARQUBE_JDBC_USERNAME \uff1a\u6570\u636e\u5e93\u7684\u8d26\u6237\nSONARQUBE_JDBC_PASSWORD \uff1a\u6570\u636e\u5e93\u5bc6\u7801\n\u8bbf\u95ee \u5b89\u88c5\u597d\u540e\u76f4\u63a5\u8bbf\u95ee9099\u7aef\u53e3\uff0c\u767b\u5f55\u7684\u8d26\u6237\u548c\u5bc6\u7801\u9ed8\u8ba4\u90fd\u662fadmin\uff0e\u9996\u9875\u5c31\u662f\u8fd9\u4e2a\u6837\u5b50\u7684\uff0e\nJenkins\u96c6\u6210SonarQube Jenkins\u548cSonarQube\u90fd\u662f\u8fd0\u884c\u5728Docker\u5bb9\u5668\u91cc\u7684\n\u4e0b\u8f7d\u548c\u5b89\u88c5\u63d2\u4ef6 \u76f4\u63a5\u4e0b\u8f7d\u6700\u65b0\u7248\u7684\uff0c\u7136\u540e\u5bfc\u5165\uff0c\u5bfc\u5165\u7684\u65b9\u6cd5\u53ef\u4ee5\u770b\u63d2\u4ef6\u5bfc\u5165\u65b9\u6cd5\n\u63d2\u4ef6\u4e0b\u8f7d\u5730\u5740\uff1ahttps:\/\/updates.jenkins.io\/download\/plugins\/sonar\/ SonarQube\u751f\u6210Token \u8fdb\u5165SonarQube\u7ba1\u7406\u754c\u9762\nAdministration-&gt;Security-&gt;Users\n\u7136\u540e\u968f\u4fbf\u8f93\u5165\u4e00\u4e2a\u540d\u5b57\uff0c\u70b9\u51fb\u751f\u6210\uff0c\u8bb0\u4e0bToken\n\u6dfb\u52a0\u5168\u5c40\u51ed\u8bc1 \u7c7b\u578b\u9009Secret text,\u7136\u540eSecret\u548cID\u8f93\u5165\u6846\u90fd\u586b\u5165\u521a\u624d\u751f\u6210\u7684Token\n\u8bbe\u7f6eSonarQube servers \u8fdb\u5165\u3000\u7cfb\u7edf\u7ba1\u7406-&gt;\u7cfb\u7edf\u8bbe\u7f6e-&gt;SonarQube servers\u3000\u8bbe\u7f6e\u597d\u540e\u70b9\u4fdd\u5b58\n\u56e0\u4e3a\u6211SonarQube\u548cJenkins\u5b89\u88c5\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0d\u540c\u7684Docker\u5bb9\u5668\u91cc\u7684,\u6240\u4ee5\u8fd9\u91ccURL\u76f4\u63a5\u586bSonarQube\u7684Docker\u5bb9\u5668\u7684IP\u548c\u7aef\u53e3\n\u5b89\u88c5SonarQube Scanner \u4e0b\u8f7d\u538b\u7f29\u5305 \u4e0b\u8f7dSonarQube Scanner\u538b\u7f29\u5305\uff1aSonarQube Scanner \u89e3\u538b\u5230Jenkins\u6302\u8f7d\u51fa\u6765\u7684\u76ee\u5f55\u91cc \u53ea\u6709\u89e3\u538b\u5230\u6302\u8f7d\u51fa\u6765\u7684Jenkins\u7684\u76ee\u5f55\u91cc\uff0cDocker\u5bb9\u5668\u5b89\u88c5\u7684Jenkins\u624d\u80fd\u8bfb\u53d6\u5230,\u6211\u8fd9\u91cc\u662f\u5bbf\u4e3b\u673a\u7684\/opt\/jenkins\u6302\u8f7d\u5230\u4e86Jenkins\u5bb9\u5668\u91cc\u7684\/var\/jenkins_home\u76ee\u5f55\u4e0a\uff0c\u6240\u4ee5\u6211\u53ea\u8981\u89e3\u538b\u5230\u5bbf\u4e3b\u673a\u7684\/opt\/jenkins\u76ee\u5f55\u4e2d\u5c31\u53ef\u4ee5\u4e86\nJenkins\u914d\u7f6e\u5168\u5c40\u5de5\u5177 \u8fdb\u5165\u3000\u7cfb\u7edf\u7ba1\u7406-&gt;\u5168\u5c40\u5de5\u5177\u914d\u7f6e-&gt;SonarQube Scanner \u627e\u5230\u6a21\u5757\u540e\u70b9\u51fb\u65b0\u589eSonarQube Scanner"},{"title":"Java8 Stream\u65b9\u6cd5\u5927\u5168","link":"https:\/\/blog.greycode.top\/posts\/java-8-stream-method\/","pubDate":"Tue, 10 Dec 2019 09:53:34 +0000","guid":"https:\/\/blog.greycode.top\/posts\/java-8-stream-method\/","description":{}},{"title":"Java\u6570\u7ec4\u7684\u51e0\u79cd\u521d\u59cb\u5316\u65b9\u5f0f","link":"https:\/\/blog.greycode.top\/posts\/java-array-init\/","pubDate":"Mon, 09 Dec 2019 10:22:12 +0000","guid":"https:\/\/blog.greycode.top\/posts\/java-array-init\/","description":"\u4e00\u7ef4\u6570\u7ec4 \u521d\u59cb\u5316\u5bb9\u91cf \/** * \u5b9a\u4e49\u5bb9\u91cf\u4e3a5,\u521d\u59cb\u503c\u4e3a0\u7684int\u4e00\u7ef4\u6570\u7ec4 *\/ int array[]=new int[5]; int[] array2=new int[5]; \u521d\u59cb\u5316\u503c \/** * \u521d\u59cb\u5316\u4e00\u7ef4\u5bb9\u91cf\u4e3a5\u7684\u4e00\u7ef4\u6570\u7ec4\u7684\u503c *\/ int[] array10={1,2,3,4,5}; int aray12[]={1,2,3,4,5}; \u4e8c\u7ef4\u6570\u7ec4 \u4e8c\u7ef4\u6570\u7ec4\u521d\u59cb\u5316\u65f6\u5fc5\u987b\u8981\u58f0\u660e\u884c\u6570,\u5217\u6570\u53ef\u968f\u610f\n\u521d\u59cb\u5316\u5bb9\u91cf \u58f0\u660e\u4e86\u5217\u6570\u7684 \/** * \u521d\u59cb\u5316\u4e00\u4e2a5\u884c5\u5217\u7684\u4e8c\u7ef4\u6570\u7ec4 *\/ int[][] array3=new int[5][5]; int []array4[]=new int[5][5]; int array5[][]=new int[5][5]; \u672a\u58f0\u660e\u5217\u6570\u7684 \u6b64\u79cd\u65b9\u6cd5\u521d\u59cb\u5316\u540e\u5982\u679c\u8981\u8d4b\u503c\u7684\u8bdd\u8981new\u4e00\u4e2a\u6570\u7ec4,\u5982\u679c\u6309\u7167\u5e38\u89c4\u7684\u65b9\u6cd5\u8d4b\u503c\u7136\u540e\u53d6\u503c\u4f1a\u62a5\u7a7a\u6307\u9488\u5f02\u5e38\n\/** * \u521d\u59cb\u5316\u4e00\u4e2a5\u884c\u7a7a\u5217\u7684\u4e8c\u7ef4\u6570\u7ec4 *\/ int[][] array6=new int[5][]; int []arra7[]=new int[5][]; int array8[][]=new int[5][]; \/** * \u8d4b\u503c\u65b9\u6cd5 *\/ int[][] array6=new int[5][]; array6[0]=new int[]{1,2,3}; System.out.println(array6[0][0]); \/\/\u8f93\u51fa:1 \u521d\u59cb\u5316\u503c \/** * \u521d\u59cb\u5316\u5e76\u8d4b\u503c\u4e00\u4e2a2\u884c3\u5217\u7684\u4e8c\u7ef4\u6570\u7ec4 *\/ int[][] array13={{1,2,3},{4,5,6}}; int []array14[]={{1,2,3},{4,5,6}}; int array15[][]={{1,2,3},{4,5,6}}; \u603b\u7ed3 \u200b \u5176\u4ed6\u50cf\u4ec0\u4e48\u4e09\u7ef4\u6570\u7ec4,\u591a\u7ef4\u6570\u7ec4\u521d\u59cb\u5316\u7684\u65b9\u5f0f\u90fd\u5dee\u4e0d\u591a,\u53ef\u4ee5\u81ea\u5df1\u5728IDE\u5de5\u5177\u4e2d\u8bd5\u4e00\u4e0b;"},{"title":"RestTemplate\u7b80\u5355\u4f7f\u7528","link":"https:\/\/blog.greycode.top\/posts\/spring-boot-resttemplate-example\/","pubDate":"Wed, 20 Nov 2019 17:32:18 +0000","guid":"https:\/\/blog.greycode.top\/posts\/spring-boot-resttemplate-example\/","description":"\u524d\u8a00 \u672c\u6587\u53ea\u8bb2\u5e38\u7528\u7684**GET** \u548c**POST**\u8bf7\u6c42,\u5176\u4ed6\u7c7b\u578b\u7684\u8bf7\u6c42(\u5982**PUT**\uff0c**PATCH**)\u8bf7\u6c42\u65b9\u5f0f\u90fd\u5dee\u4e0d\u591a\uff0c\u6709\u5174\u8da3\u7684\u53ef\u4ee5\u67e5\u770bRestTemplate\u6e90\u7801\u3002 GET GET\u5b98\u65b9\u7ed9\u4e86getForEntity\u548cgetForObject\u4e24\u79cd\u79cd\u65b9\u6cd5\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u53c8\u6709\u4e09\u4e2a\u91cd\u8f7d\u65b9\u6cd5\n\u5b98\u65b9\u6e90\u7801\u63a5\u53e3 @Nullable &lt;T&gt; T getForObject(String url, Class&lt;T&gt; responseType, Object... uriVariables) throws RestClientException; @Nullable &lt;T&gt; T getForObject(String url, Class&lt;T&gt; responseType, Map&lt;String, ?&gt; uriVariables) throws RestClientException; @Nullable &lt;T&gt; T getForObject(URI url, Class&lt;T&gt; responseType) throws RestClientException; &lt;T&gt; ResponseEntity&lt;T&gt; getForEntity(String url, Class&lt;T&gt; responseType, Object... uriVariables) throws RestClientException; &lt;T&gt; ResponseEntity&lt;T&gt; getForEntity(String url, Class&lt;T&gt; responseType, Map&lt;String, ?&gt; uriVariables) throws RestClientException; &lt;T&gt; ResponseEntity&lt;T&gt; getForEntity(URI url, Class&lt;T&gt; responseType) throws RestClientException; \u4f7f\u7528 API\u63a5\u53e3 \u9996\u5148\u6211\u5199\u4e86\u4e24\u4e2a\u63a5\u53e3\u4f9bRestTemplate\u8c03\u7528"},{"title":"Nacos\u62a5[NACOS HTTP-POST]","link":"https:\/\/blog.greycode.top\/posts\/nacos-post-error\/","pubDate":"Thu, 14 Nov 2019 23:50:58 +0000","guid":"https:\/\/blog.greycode.top\/posts\/nacos-post-error\/","description":"\u95ee\u9898 \u7531\u4e8e\u9879\u76ee\u4f7f\u7528\u963f\u91cc\u7684Nacos\u6765\u7ba1\u7406\u9879\u76ee\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u4eca\u5929\u6240\u6709\u4f7f\u7528Nacos\u7684\u9879\u76ee\u7684\u65e5\u5fd7\u90fd\u62a5[NACOS HTTP-POST] The maximum number of tolerable server reconnection errors has been reached\u8fd9\u4e2a\u9519\u8bef\u3002\n\u89e3\u51b3\u65b9\u6cd5 \u67e5\u9605\u8d44\u6599\u540e\u8bf4\u662f\u8fde\u63a5\u8d85\u8fc7\u4e86\u6700\u5927\u91cd\u8bd5\u6b21\u6570\u3002Nacos\u6709\u4e2amaxRetry\u8fd9\u4e2a\u914d\u7f6e\u53c2\u6570\uff0c\u9ed8\u8ba4\u662f3;\u53ef\u662f\u548cSpringCloud\u6574\u5408\u540e\u5728application\u6587\u4ef6\u4e2d\u627e\u4e0d\u5230\u8fd9\u4e2a\u53c2\u6570\uff0c\u53ea\u597d\u53e6\u5bfb\u65b9\u6cd5\uff1b\n\u7531\u4e8e\u9879\u76ee\u90fd\u662fDocker\u5bb9\u5668\u5316\u7684\uff0c\u5148\u524d\u51fa\u73b0\u8fc7\u8fde\u63a5\u4e0d\u5230Nacos\u7684\u95ee\u9898,\u4e8e\u662f\u5c31\u67e5\u770b\u4e86\u5404\u4e2aDocker\u5bb9\u5668\u7684IP\u3002\n\u4fee\u6b63Nacos\u7684\u5730\u5740 \u67e5\u9605\u540e\u53d1\u73b0\uff0c\u662f\u56e0\u4e3a\u540c\u4e8b\u5427\u670d\u52a1\u5668\u91cd\u542f\u4e86\u4e00\u904d\uff0c\u5bfc\u81f4Docker\u670d\u52a1\u4e5f\u91cd\u542f\u4e86\uff0c\u7136\u540eDocker\u5bb9\u5668\u91cc\u7684IP\u5168\u90e8\u90fd\u53d8\u4e86\u3002\u56e0\u4e3a\u540c\u4e00\u53f0\u670d\u52a1\u5668\u4e0a\u6211\u4eec\u5404\u4e2a\u5bb9\u5668\u95f4\u7684\u8bbf\u95ee\u662f\u901a\u8fc7Docker\u5bb9\u5668\u5185\u90e8IP\u7684\uff0c\u4e5f\u5c31\u662f172.16.x.x\u8fd9\u4e2aIP\u6bb5\u3002\u6240\u4ee5\u5bfc\u81f4\u8bbf\u95ee\u4e0d\u5230\u62a5\u9519\u3002\nspring.cloud.nacos.config.server-addr=172.16.X.X \/\/\u66f4\u6539\u5230\u6700\u65b0nacos\u7684\u5730\u5740"},{"title":"Jenkins\u63d2\u4ef6\u7248\u672c\u592a\u65e7\u7684\u66f4\u65b0\u65b9\u6cd5","link":"https:\/\/blog.greycode.top\/posts\/problem-jenkins-01\/","pubDate":"Tue, 12 Nov 2019 17:27:27 +0000","guid":"https:\/\/blog.greycode.top\/posts\/problem-jenkins-01\/","description":"\u524d\u8a00 Jenkins\u7684\u63d2\u4ef6\u597d\u591a\u90fd\u662f\u4e92\u76f8\u4f9d\u8d56\u7684\uff0c\u5982\u679c\u6709\u7684\u63d2\u4ef6\u7248\u672c\u592a\u4f4e\uff0c\u800c\u53e6\u4e00\u4e2a\u63d2\u4ef6\u5c31\u4f1a\u5bfc\u81f4\u7528\u4e0d\u4e86\uff0c\u5c31\u4f1a\u51fa\u73b0\u4e0b\u9762\u7684\u60c5\u51b5\uff1a Durable Task Plugin version 1.29 is older than required. To fix, install version 1.33 or later.\n\u67e5\u770b\u672c\u5730\u5df2\u5b89\u88c5\u7248\u672c \u53ef\u4ee5\u770b\u5230\uff0c\u672c\u5730\u5b89\u88c5\u7684\u7248\u672c\u548c\u521a\u624d\u63d0\u793a\u7684\u4e00\u6837\uff0c\u662f1.29\u7248\u672c\u7684\uff0c\u521a\u624d\u63d0\u793a\u8bf4\u592a\u65e7\u4e86\uff0c\u8981\u66f4\u65b0\u52301.33\u7248\u672c\u3002\n\u641c\u7d22\u63d2\u4ef6 \u5f53\u4f60\u7406\u6240\u5e94\u5f53\u7684\u53bb\u8fd9\u4e2a\u754c\u9762\u51c6\u5907\u641c\u7d22\u8fd9\u4e2a\u63d2\u4ef6\u5e76\u66f4\u65b0\u65f6\u3002\u3002\u3002\u3002\u4f60\u50bb\u4e86\uff0c\uff0c\u600e\u4e48\u641c\u4e0d\u5230\uff1f\uff1f\uff1fWTF\n\u4e0d\u8981\u614c\uff0c\u5929\u65e0\u7edd\u4eba\u4e4b\u8def\uff0c\u8fd9\u91cc\u627e\u4e0d\u5230\uff0c\u53ef\u4ee5\u53bb\u53e6\u5916\u7684\u5730\u65b9\u627e\u3002\u6d4f\u89c8\u5668\u6253\u5f00\u8fd9\u4e2a\u7f51\u7ad9\nJenkins\u63d2\u4ef6\u4e0b\u8f7d\n\u8fdb\u5165\u540e\u5728\u8f93\u5165\u6846\u91cc\u8f93\u5165\u4f60\u521a\u624d\u8981\u4e0b\u8f7d\u7684\u63d2\u4ef6: \u9009\u62e9\u5bf9\u5e94\u7684\u63d2\u4ef6 \u7136\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2 \u4e0b\u8f7d\u521a\u624d\u63d0\u793a\u76841.33\u7248\u672c \u4e0b\u8f7d\u5b8c\u6210\u540e\u662f\u4e00\u4e2ahpi\u6587\u4ef6 \u5bfc\u5165\u63d2\u4ef6 \u5230\u63d2\u4ef6\u7ba1\u7406\u754c\u9762\uff0c\u627e\u5230Upload Plugin \u7136\u540e\u9009\u62e9\u521a\u624d\u4e0b\u8f7d\u7684\u63d2\u4ef6\uff0c\u70b9\u51fb\u5bfc\u5165 \u53ef\u4ee5\u770b\u5230\u63d2\u4ef6\u6b63\u5728\u5bfc\u5165 \u5bfc\u5165\u5b8c\u6210\u540e\uff0c\u91cd\u542fJenkins\u5c31OK\u4e86"},{"title":"Jenkins\u6559\u7a0b-Docker+GitLab\u6301\u7eed\u90e8\u7f72\u6301\u7eed\u96c6\u6210","link":"https:\/\/blog.greycode.top\/posts\/build-jenkins-ci-cd\/","pubDate":"Tue, 12 Nov 2019 17:27:02 +0000","guid":"https:\/\/blog.greycode.top\/posts\/build-jenkins-ci-cd\/","description":"\u76ee\u5f55 Jenkins\u6559\u7a0b-\u642d\u5efa(Docker\u7248)\nJenkins\u6559\u7a0b-\u521b\u5efaMaven\u9879\u76ee\nJenkins\u6559\u7a0b-Docker+GitLab\u6301\u7eed\u90e8\u7f72\u6301\u7eed\u96c6\u6210\n\u73af\u5883 \u5730\u5740 \u7cfb\u7edf \u5b89\u88c5\u7684\u8f6f\u4ef6 \u4e3b\u673a\uff11 10.25.0.72 Centos 7 Docker\u3000,\u3000Jenkins(Docker\u7248) \u4e3b\u673a\uff12 10.25.0.50 Cnetos 7 Docker Jenkins\u6240\u9700\u6dfb\u52a0\u63d2\u4ef6 Git Parameter\nGitLab\nSSH\n\u521b\u5efassh\u767b\u5f55\u51ed\u636e \u8fd9\u8fb9\u9009\u62e9Username with password,\u7528\u8d26\u6237\u5bc6\u7801\u6765\u8bbe\u7f6e\uff1b\u7136\u540e\u5728Username\u548cPassword\u8f93\u5165\u6846\u4e2d\u5206\u522b\u8f93\u516510.25.0.50\u670d\u52a1\u5668\u7684\u8d26\u53f7\u548c\u5bc6\u7801\u3002\u70b9\u51fbOK\u4fdd\u5b58\uff1b\n\u6dfb\u52a0SSH\u914d\u7f6e \u627e\u5230SSH remote hosts\n\u8bbe\u7f6e\u4f60\u8fdc\u7a0b\u673a\u5668\u7684ip\u548c\u7aef\u53e3\uff0c\u7136\u540e\u9009\u62e9\u521a\u914d\u7f6e\u597d\u7684\u51ed\u8bc1\uff0c\u70b9\u51fbsave\u4fdd\u5b58\n\u914d\u7f6eJob \u8fdb\u5165\u4e0a\u7bc7\u6587\u7ae0\u521b\u5efa\u597d\u7684Job,\u5728\u6b64\u57fa\u7840\u4e0a\u8fdb\u884c\u6539\u9020\n\u914d\u7f6eGit Parameter,\u6765\u83b7\u53d6gitlab\u7684Tag\u6570\u636e \u914d\u7f6e\u89e6\u53d1\u5668 \u70b9\u51fb\u6700\u4e0b\u9762\u7684Generate,\u751f\u6210\u79d8\u94a5\u3002\u7136\u540e\u8bb0\u4e0bURL:http:\/\/172.16.54.131:8080\/project\/JenkinsTest \u548c\u751f\u6210\u7684\u79d8\u94a5\uff1a60327d68d10f1f7621696edd42719d1c\n\u6dfb\u52a0\u6784\u5efa\u5b8c\u6210\u540e\u7684\u52a8\u4f5c \u6dfb\u52a0Execute shell \u548cExecute shell script on remote host using ssh Execute shell \uff1a \u6267\u884cJenkins\u6240\u5728\u670d\u52a1\u5668\u7684\u811a\u672c Execute shell script on remote host using ssh\uff1a\u767b\u5f55\u8fdc\u7a0b\u670d\u52a1\u5668\u6267\u884c\u811a\u672c \u7f16\u5199\u4f60\u8981\u6267\u884c\u7684\u811a\u672c \u7531\u4e8e\u662f\u81ea\u5b9a\u4e49\u7684\uff0c\u5185\u5bb9\u6211\u5c31\u4e0d\u7c98\u8d34\u51fa\u6765\u4e86.\u7f16\u5199\u597d\u540e\u70b9\u51fb\u4fdd\u5b58\n\u5f00\u59cb\u6784\u5efa \u624b\u52a8\u6784\u5efa \u9009\u62e9\u4f60\u8981\u6784\u5efa\u7684tag\u6807\u7b7e\uff0c\u70b9\u51fbBuild\u5f00\u59cb\u6784\u5efa\u5e76\u81ea\u52a8\u90e8\u7f72 \u81ea\u52a8\u6784\u5efa \u81ea\u52a8\u6784\u5efa\u662f\u5f53\u4f60push\u6216\u6253tag\u4e0a\u4f20\u4ee3\u7801\u7684\u65f6\u5019\uff0cJenkins\u5c31\u4f1a\u81ea\u52a8\u6784\u5efa\u90e8\u7f72"},{"title":"Jenkins\u6559\u7a0b-\u521b\u5efaMaven\u9879\u76ee","link":"https:\/\/blog.greycode.top\/posts\/build-jenkins-mavne\/","pubDate":"Tue, 12 Nov 2019 17:26:19 +0000","guid":"https:\/\/blog.greycode.top\/posts\/build-jenkins-mavne\/","description":"\u76ee\u5f55 Jenkins\u6559\u7a0b-\u642d\u5efa(Docker\u7248)\nJenkins\u6559\u7a0b-\u521b\u5efaMaven\u9879\u76ee\nJenkins\u6559\u7a0b-Docker+GitLab\u6301\u7eed\u90e8\u7f72\u6301\u7eed\u96c6\u6210\n\u524d\u671f\u51c6\u5907 \u672c\u6559\u7a0b\u662f\u548cgitlab\u96c6\u6210,\u6240\u4ee5\u8981\u6709gitlab\u4ed3\u5e93\u3002\u6ce8\u610f\uff1a\u5982\u679c\u540e\u671f\u8981\u5f04\u81ea\u52a8\u90e8\u7f72\u7684\u8bdd,\u4f60Jenkins\u7684\u5730\u5740gitlab\u5fc5\u987b\u80fd\u8bbf\u95ee\u5230\u3002\u4e0d\u7136gitlab\u76d1\u542c\u5230\u4e8b\u4ef6\u5c31\u901a\u77e5\u4e0d\u4e86Jenkins\u4e86\uff1b\n\u73af\u5883 Centos 7 Jenkins(Docker\u7248) \u6240\u9700\u63d2\u4ef6 \u9664\u4e86\u642d\u5efaJenkins\u65f6\u5b89\u88c5\u7684\u63d2\u4ef6,\u8fd8\u9700\u5b89\u88c5\u7684\u63d2\u4ef6\nMaven Integration \u5b89\u88c5Maven \u70b9\u51fb\u4fa7\u8fb9\u680f\u7684Manage Jenkins,\u7136\u540e\u70b9\u51fbGlobal Tool Configuration,\u8fdb\u5165\u5168\u5c40\u5de5\u5177\u8bbe\u7f6e \u7136\u540e\u627e\u5230Maven,\u70b9\u51fbAdd Maven,\u53ef\u4ee5\u9009\u62e9\u4f60\u8981\u7684Maven\u7248\u672c\uff0c\u7136\u540e\u8bbe\u7f6e\u4e00\u4e2a\u540d\u5b57\u3002\u70b9\u51fb\u4fdd\u5b58\n\u521b\u5efaGit\u767b\u5f55\u51ed\u8bc1 \u70b9\u51fb\u4fa7\u8fb9\u680f\u7684\u51ed\u8bc1\uff0c\u7136\u540e\u6309\u56fe\u70b9\u51fb \u8fd9\u8fb9Kind\u6709\u5f88\u591a\u9009\u9879\uff0c\u8fd9\u8fb9\u9009\u62e9Username with password,\u7528\u8d26\u6237\u5bc6\u7801\u6765\u8bbe\u7f6e\uff1b\u7136\u540e\u5728Username\u548cPassword\u8f93\u5165\u6846\u4e2d\u5206\u522b\u8f93\u5165gitlab\u7684\u8d26\u53f7\u548c\u5bc6\u7801\u3002\u70b9\u51fbOK\u4fdd\u5b58\uff1b\n\u4fdd\u5b58\u540e\u5c31\u4f1a\u51fa\u73b0\u4f60\u4fdd\u5b58\u597d\u7684\u51ed\u8bc1\uff1b\n\u521b\u5efaJOB \u521b\u5efaMaven\u9879\u76ee \u8f93\u5165\u4f60\u7684gitlab\u9879\u76ee\u5730\u5740\uff0c\u7136\u540e\u9009\u62e9\u521a\u624d\u914d\u7f6e\u7684\u51ed\u8bc1 \u8f93\u5165Maven\u6253\u5305\u547d\u4ee4\uff0c\u7136\u540e\u70b9\u51fb\u4fdd\u5b58 \u5f00\u59cb\u6784\u5efa \u67e5\u770b\u6784\u5efa\u9879\u76ee\u65e5\u5fd7 \u7b2c\u4e00\u6b21\u6784\u5efa\u4f1a\u6bd4\u6162\uff0c\u56e0\u4e3a\u4ed6\u8981\u4e0b\u8f7dmaven\u76f8\u5173\u6784\u5efa\u7684\u5305\n\u67e5\u770b\u6784\u5efa\u597d\u7684jar\u5305 \u5230\u6b64\uff0c\u6784\u5efamaven\u9879\u76ee\u5df2\u7ed3\u675f\uff0c\u53ef\u4ee5\u4e0b\u8f7d\u8fd9\u4e2ajar\u5305\u8fdb\u884c\u90e8\u7f72\u3002\u540e\u9762\u4f1a\u6709\u81ea\u52a8\u6784\u5efa\u90e8\u7f72\u7684\u6559\u7a0b"},{"title":"Jenkins\u521d\u59cb\u5316\u754c\u9762\u63d2\u4ef6\u5b89\u88c5\u5931\u8d25\u89e3\u51b3\u65b9\u6cd5","link":"https:\/\/blog.greycode.top\/posts\/problem-jenkins-02\/","pubDate":"Thu, 07 Nov 2019 17:19:52 +0000","guid":"https:\/\/blog.greycode.top\/posts\/problem-jenkins-02\/","description":"\u524d\u8a00 \u5728\u521d\u59cb\u5316\u5b89\u88c5\u754c\u9762\u53ef\u80fd\u7531\u4e8e\u7f51\u7edc\u95ee\u9898\u4f1a\u51fa\u73b0\u63d2\u4ef6\u4e0b\u8f7d\u5931\u8d25\uff0c\u5c31\u50cf\u4e0b\u9762\u8fd9\u4e2a\u754c\u9762\n\u522b\u7740\u6025\uff0c\u76f4\u63a5\u70b9\u51fb\u7ee7\u7eed\uff0c\u5148\u5b8c\u6210\u521d\u59cb\u5316\u6b65\u9aa4\u3002\n\u8bbe\u7f6e\u6e90 \u63d2\u4ef6\u4e0b\u8f7d\u5931\u8d25\uff0c\u4e00\u822c\u90fd\u662f\u7f51\u7edc\u7684\u539f\u56e0\uff0c\u53ea\u8981\u66f4\u6362\u5230\u56fd\u5185\u7684\u8f6f\u4ef6\u6e90\u5c31\u53ef\u4ee5\u4e86\uff0c\u70b9\u51fbManage Jenkins \u70b9\u51fbCorrect \u70b9\u51fbAdvanced \u4e0b\u62c9\u627e\u5230Update Site \u7136\u540e\u628a\u8f93\u5165\u6846\u7684\u5185\u5bb9\u6362\u6210\nhttps:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins\/updates\/2.89\/update-center.json \u91cd\u65b0\u4e0b\u8f7d\u63d2\u4ef6 \u7136\u540e\u91cd\u65b0\u4e0b\u8f7d\u521a\u624d\u90a3\u4e9b\u4e0b\u8f7d\u5931\u8d25\u7684\u63d2\u4ef6,\u8fd9\u91cc\u968f\u673a\u9009\u4e00\u4e2a \u5728\u521a\u624d\u8bbe\u7f6e\u6e90\u7684\u90a3\u4e2a\u754c\u9762\u70b9\u51fb Available\uff0c\u641c\u7d22\u63d2\u4ef6\uff0c\u9009\u62e9\uff0c\u70b9\u51fbinstall \u63d2\u4ef6\u6b63\u5728\u5b89\u88c5 \u5b89\u88c5\u5b8c\u5168\u90e8\u63d2\u4ef6\u540e\u7136\u540e\u91cd\u542fJenkins\uff0c\u63d2\u4ef6\u754c\u9762\u7684\u62a5\u9519\u4fe1\u606f\u624d\u4f1a\u6d88\u5931;\u5982\u679c\u9047\u5230\u63d2\u4ef6\u4e0b\u8f7d\u4e0d\u4e0b\u6765\u6216\u641c\u4e0d\u5230\uff0c\u53ef\u4ee5\u770b\u8fd9\u7bc7\u6587\u7ae0\uff1aJenkins\u63d2\u4ef6\u7248\u672c\u592a\u65e7\u7684\u66f4\u65b0\u65b9\u6cd5"},{"title":"Jenkins\u6559\u7a0b-\u642d\u5efa(Docker\u7248)","link":"https:\/\/blog.greycode.top\/posts\/build-jenkins-docker\/","pubDate":"Thu, 07 Nov 2019 17:19:34 +0000","guid":"https:\/\/blog.greycode.top\/posts\/build-jenkins-docker\/","description":"\u76ee\u5f55 Jenkins\u6559\u7a0b-\u642d\u5efa(Docker\u7248)\nJenkins\u6559\u7a0b-\u521b\u5efaMaven\u9879\u76ee\nJenkins\u6559\u7a0b-Docker+GitLab\u6301\u7eed\u90e8\u7f72\u6301\u7eed\u96c6\u6210\n\u73af\u5883 \u4e3b\u673a\uff1a172.16.54.131\n\u7cfb\u7edf\uff1aCnetos 7\n\u5b89\u88c5Docker-CE \u68c0\u67e5Docker \u9996\u5148\u68c0\u67e5\u672c\u673a\u662f\u5426\u5b89\u88c5Docker\uff0c\u5982\u679c\u5b89\u88c5\u4e86\u76f4\u63a5\u8df3\u8fc7\u5b89\u88c5Docker\u6b65\u9aa4\ndocker -v \u5982\u679c\u51fa\u73b0Docker version 19.03.4, build 9013bf583a\u7c7b\u4f3c\u7684\u4fe1\u606f\uff0c\u5219\u8bf4\u660e\u5df2\u5b89\u88c5Docker\n\u5b89\u88c5 \u672c\u6559\u7a0b\u4ee5centos7\u5b89\u88c5\u65b9\u5f0f\u8bf4\u660e\uff0c\u5176\u4ed6\u7cfb\u7edf\u5b89\u88c5\u65b9\u5f0f\u4f1a\u6709\u4e0d\u540c \u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u5b89\u88c5Docker\nyum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager \\ --add-repo \\ https:\/\/download.docker.com\/linux\/centos\/docker-ce.repo yum install docker-ce service docker start systemctl enable docker \u7b2c\u4e00\u6761\u547d\u4ee4\uff1a\u4e3a\u6dfb\u52a0\u6e90\u505a\u51c6\u5907 \u4f7f\u5176\u652f\u6301\u5b58\u50a8 \u7b2c\u4e8c\u6761\u547d\u4ee4\uff1a\u6dfb\u52a0docker-ce\u8f6f\u4ef6\u6e90 \u7b2c\u4e09\u6761\u547d\u4ee4\uff1a\u5b89\u88c5docker-ce \u7b2c\u56db\u6761\u547d\u4ee4\uff1a\u542f\u52a8docker\u670d\u52a1 \u7b2c\u4e94\u6761\u547d\u4ee4\uff1a\u8bbe\u7f6e\u5f00\u542f\u81ea\u542f \u5b89\u88c5Jenkins\u7684Docker\u5bb9\u5668 \u521b\u5efa\u6587\u4ef6\u5939 \u5728\u521b\u5efa\u5bb9\u5668\u524d\u5148\u5728\u5bbf\u4e3b\u673a\u521b\u5efa\u4e00\u4e2aJenkins\u7684\u5de5\u4f5c\u6587\u4ef6\u5939\uff0c\u7528\u4e8e\u6301\u4e45\u5316\nmkdir \/opt\/jenkins \/\/\u521b\u5efa\u6587\u4ef6\u5939 chmod 7777 \/opt\/jenkins \/\/\u6388\u4e88\u6743\u9650 \u8be5\u6587\u4ef6\u5939\u4e00\u5b9a\u8981\u7ed9\u6743\u9650\uff0c\u4e0d\u7136docker\u5bb9\u5668\u8bbf\u95ee\u4e0d\u4e86\uff0c\u5bb9\u5668\u4f1a\u521b\u5efa\u5931\u8d25\u3002\n\u62c9\u53d6\u5b98\u65b9\u955c\u50cf docker pull jenkins\/jenkins:lts \u542f\u52a8\u5bb9\u5668 docker run -d -p 8080:8080 -p 50000:50000 -u root -v \/var\/run\/docker."},{"title":"\u8bbe\u8ba1\u6a21\u5f0f\u7cfb\u4f8b-\u5355\u4f8b\u6a21\u5f0f","link":"https:\/\/blog.greycode.top\/posts\/gof-singleton\/","pubDate":"Tue, 22 Oct 2019 21:16:37 +0000","guid":"https:\/\/blog.greycode.top\/posts\/gof-singleton\/","description":"\u79ef\u5343\u91cc\u8dec\u6b65\uff0c\u6c47\u4e07\u91cc\u6c5f\u6cb3\uff0e\u6bcf\u5929\u8fdb\u6b65\u4e00\u70b9\u70b9\uff0c\u7ec8\u6709\u4e00\u5929\u5c06\u6210\u5927\u4f6c\n\u524d\u8a00 \u7f51\u4e0a\u8bf4\u5355\u4f8b\u6a21\u5f0f\u662f\u6240\u6709\u6a21\u5f0f\u4e2d\u6700\u7b80\u5355\u7684\u4e00\u79cd\u6a21\u5f0f\uff0c\u5de7\u7684\u662f\u6211\u4e5f\u8fd9\u4e48\u8ba4\u4e3a\u3002\u4e0d\u8fc7\u8d8a\u7b80\u5355\u7684\u4e1c\u897f\uff0c\u5f80\u5f80\u5751\u5c31\u9690\u85cf\u7684\u8d8a\u6df1\uff0c\u8fd9\u8fb9\u6587\u7ae0\u6211\u4f1a\u628a\u6211\u77e5\u9053\u7684\u51e0\u4e2a\u5751\u6240\u51fa\u6765\u3002\n\u4e00.\u4ec0\u4e48\u662f\u5355\u4f8b\u6a21\u5f0f \u200b \u5c31\u5982\u540c\u4ed6\u7684\u540d\u5b57\u4e00\u6837\uff0c&lsquo;\u5355\u4f8b&rsquo;-\u5c31\u662f\u53ea\u6709\u4e00\u4e2a\u5b9e\u4f8b\u3002\u4e5f\u5c31\u662f\u8bf4\u4e00\u4e2a\u7c7b\u5728\u5168\u5c40\u4e2d\u6700\u591a\u53ea\u6709\u4e00\u4e2a\u5b9e\u4f8b\u5b58\u5728\uff0c\u4e0d\u80fd\u5728\u591a\u4e86\uff0c\u5728\u591a\u5c31\u4e0d\u53eb\u5355\u4f8b\u6a21\u5f0f\u4e86\u3002\n1.\u767d\u8bdd\u5c0f\u6545\u4e8b \u200b \u7a0b\u5e8f\u5458\u5c0fH\u5355\u8eab\u5df2\u4e45\uff0c\u6bcf\u5929\u4e0d\u662f\u5bf9\u7740\u7535\u8111\uff0c\u5c31\u662f\u62b1\u7740\u624b\u673a\u8fd9\u6837\u6765\u7ef4\u6301\u751f\u6d3b\u3002\u67d0\u65e5\uff0c\u5750\u5728\u7535\u8111\u524d\uff0c\u7a81\u7136\u611f\u89c9\u4e00\u5207\u90fd\u7d22\u7136\u65e0\u5473\u3002\u8c0b\u751f\u60f3\u627e\u4e00\u4e2a\u5bf9\u8c61\u6765\u4e00\u8d77\u5ea6\u8fc7\u4eba\u751f\u7f8e\u597d\u7684\u6bcf\u4e00\u5929\u3002\n\u200b \u4e8e\u662f\u7cbe\u5fc3\u6253\u626e\u51fa\u95e8\u627e\u5bf9\u8c61\uff0c\u7531\u4e8e\u5c0fH\u5f88\u5e05\uff0c\u5f88\u5feb\u5c31\u627e\u5230\u4e86\u5fc3\u4eea\u7684\u53e6\u4e00\u534a&ndash;\u5c0fK\u3002\u5c0fH\u7684\u5fc3\u4e2d\u6c38\u8fdc\u53ea\u6709\u5c0fK\u4e00\u4e2a\u4eba\uff0c\u800c\u4e14\u53d1\u8a93\u6c38\u8fdc\u4e0d\u4f1a\u5728\u627e\u65b0\u5bf9\u8c61\u3002\n\u5c0fH\u548c\u5c0fK\u7684\u5173\u7cfb\u5c31\u662f\u5355\u4f8b\u6a21\u5f0f\uff0c\u5728\u5c0fH\u7684\u5168\u5c40\u4e2d\u53ea\u6709\u4e00\u4e2a\u5c0fK\u5bf9\u8c61\uff0c\u4e14\u65e0\u7b2c\u4e8c\u4e2a\uff0c\u5982\u679c\u6709\u7b2c\u4e8c\u4e2a\u7684\u8bdd\uff0c\u4ed6\u4eec\u4e4b\u95f4\u7684\u5173\u7cfb\u5c31\u51fa\u95ee\u9898\u4e86\u3002\u54c8\u54c8\n2.\u7528\u5728\u54ea\u91cc \u200b \u5355\u4f8b\u6a21\u5f0f\u4e00\u822c\u7528\u5728\u5bf9\u5b9e\u4f8b\u6570\u91cf\u6709\u4e25\u683c\u8981\u6c42\u7684\u5730\u65b9\uff0c\u6bd4\u5982\u6570\u636e\u6c60\uff0c\u7ebf\u7a0b\u6c60\uff0c\u7f13\u5b58\uff0csession\u56de\u8bdd\u7b49\u7b49\u3002\n3.\u5728Java\u4e2d\u6784\u6210\u7684\u6761\u4ef6 \u9759\u6001\u53d8\u91cf \u9759\u6001\u65b9\u6cd5 \u79c1\u6709\u6784\u9020\u5668 \u4e8c.\u5355\u4f8b\u6a21\u5f0f\u7684\u4e24\u79cd\u5f62\u6001 1.\u61d2\u6c49\u6a21\u5f0f \u7ebf\u7a0b\u4e0d\u5b89\u5168\npublic class Singleton { private static Singleton unsingleton; private Singleton(){} public static Singleton getInstance(){ if(unsingleton==null){ unsingleton=new Singleton(); } return unsingleton; } } 2.\u997f\u6c49\u6a21\u5f0f \u7ebf\u7a0b\u5b89\u5168\npublic class Singleton { private static Singleton unsingleton=new Singleton(); private Singleton(){} public static Singleton getInstance(){ return unsingleton; } } \u8c03\u7528 public class Test { public static void main(String[] args) { Singleton singleton1=Singleton."},{"title":"RocketMQ\u96c6\u7fa4\u642d\u5efa","link":"https:\/\/blog.greycode.top\/posts\/rocketmq-cluster-build\/","pubDate":"Wed, 09 Oct 2019 20:55:36 +0000","guid":"https:\/\/blog.greycode.top\/posts\/rocketmq-cluster-build\/","description":"\u672c\u6587\u53ea\u8bb2RocketMQ\u96c6\u7fa4\u7684\u642d\u5efa(\u5f02\u6b65\u590d\u5236)\uff0c\u5177\u4f53\u7406\u8bba\u77e5\u8bc6\u540e\u7eed\u4f1a\u5728\u5199\u65b0\u6587\u7ae0\u8be6\u7ec6\u4ecb\u7ecd;\n\u73af\u5883 JDK1.8 Centos7 \u4e3b\u673a-\u4e24\u53f0 centos7_1 :172.16.54.130 centos7_2 :172.16.54.128 \u8f6f\u4ef6\u8d44\u6e90 JDK1.8 :https:\/\/www.oracle.com\/technetwork\/java\/javase\/downloads\/jdk8-downloads-2133151.html RocketMQ4.5.2 :http:\/\/mirrors.tuna.tsinghua.edu.cn\/apache\/rocketmq\/4.5.2\/rocketmq-all-4.5.2-bin-release.zip \u5b89\u88c5JDK \u9996\u5148\u5206\u522b\u5728\u4e24\u53f0\u4e3b\u673a\u4e0a\u5b89\u88c5JDK1.8\uff0c\u5177\u4f53\u5b89\u88c5\u65b9\u6cd5\u8fd9\u91cc\u5c31\u4e0d\u8bf4\u4e86\uff0c\u7f51\u4e0a\u968f\u4fbf\u641c\u4e00\u641c\u90fd\u6709\uff1b\n\u914d\u7f6eRocketMQ \u628a\u4e0b\u8f7d\u7684RocketMQ\u5305\u5206\u522b\u4e0a\u4f20\u5230\u4e24\u53f0\u670d\u52a1\u5668\u4e0a\uff0c\u7136\u540e\u7528\u547d\u4ee4\u89e3\u538b:\n# unzip rocketmq-all-4.5.2-bin-release.zip \u7f16\u5199\u914d\u7f6e\u6587\u4ef6 \u8fd9\u4e00\u6b65\u5f88\u91cd\u8981\uff0c\u96c6\u7fa4\u7684\u642d\u5efa\u5173\u952e\u5728\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\u7f16\u5199\uff0c\u9996\u5148\u770b\u770bRocketMQ\u914d\u7f6e\u6587\u4ef6\u7684\u89e3\u6790:\n#\u6240\u5c5e\u96c6\u7fa4\u540d\u5b57 brokerClusterName=rocketmq-cluster #broker\u540d\u5b57\uff0c\u6bcf\u961fmaster\u548cslave\u4fdd\u6301\u4e00\u81f4 brokerName=broker-a #0 \u8868\u793a Master\uff0c&gt;0 \u8868\u793a Slave brokerId=0 #\u6307\u5b9a\u4e3b\u673aip brokerIP1 = \u4e3b\u673aIP #nameServer\u5730\u5740\uff0c\u5206\u53f7\u5206\u5272 namesrvAddr=\u4e3b\u673aIP:9876;\u4e3b\u673aIP:9876 #\u5728\u53d1\u9001\u6d88\u606f\u65f6\uff0c\u81ea\u52a8\u521b\u5efa\u670d\u52a1\u5668\u4e0d\u5b58\u5728\u7684topic\uff0c\u9ed8\u8ba4\u521b\u5efa\u7684\u961f\u5217\u6570 defaultTopicQueueNums=4 #\u662f\u5426\u5141\u8bb8 Broker \u81ea\u52a8\u521b\u5efaTopic\uff0c\u5efa\u8bae\u7ebf\u4e0b\u5f00\u542f\uff0c\u7ebf\u4e0a\u5173\u95ed autoCreateTopicEnable=true #\u662f\u5426\u5141\u8bb8 Broker \u81ea\u52a8\u521b\u5efa\u8ba2\u9605\u7ec4\uff0c\u5efa\u8bae\u7ebf\u4e0b\u5f00\u542f\uff0c\u7ebf\u4e0a\u5173\u95ed autoCreateSubscriptionGroup=true #Broker \u5bf9\u5916\u670d\u52a1\u7684\u76d1\u542c\u7aef\u53e3 listenPort=10911 #\u5220\u9664\u6587\u4ef6\u65f6\u95f4\u70b9\uff0c\u9ed8\u8ba4\u51cc\u6668 4\u70b9 deleteWhen=04 #\u6587\u4ef6\u4fdd\u7559\u65f6\u95f4\uff0c\u9ed8\u8ba4 48 \u5c0f\u65f6 fileReservedTime=120 #commitLog\u6bcf\u4e2a\u6587\u4ef6\u7684\u5927\u5c0f\u9ed8\u8ba41G mapedFileSizeCommitLog=1073741824 #ConsumeQueue\u6bcf\u4e2a\u6587\u4ef6\u9ed8\u8ba4\u5b5830W\u6761\uff0c\u6839\u636e\u4e1a\u52a1\u60c5\u51b5\u8c03\u6574 mapedFileSizeConsumeQueue=300000 #\u68c0\u6d4b\u7269\u7406\u6587\u4ef6\u78c1\u76d8\u7a7a\u95f4 diskMaxUsedSpaceRatio=88 #\u5b58\u50a8\u8def\u5f84 storePathRootDir=\/usr\/local\/rocketmq\/store #commitLog \u5b58\u50a8\u8def\u5f84 storePathCommitLog=\/usr\/local\/rocketmq\/store\/commitlog #\u6d88\u8d39\u961f\u5217\u5b58\u50a8\u8def\u5f84\u5b58\u50a8\u8def\u5f84 storePathConsumeQueue=\/usr\/local\/rocketmq\/store\/consumequeue #\u6d88\u606f\u7d22\u5f15\u5b58\u50a8\u8def\u5f84 storePathIndex=\/usr\/local\/rocketmq\/store\/index #checkpoint \u6587\u4ef6\u5b58\u50a8\u8def\u5f84 storeCheckpoint=\/usr\/local\/rocketmq\/store\/checkpoint #Broker \u7684\u89d2\u8272 #- ASYNC_MASTER \u5f02\u6b65\u590d\u5236Master #- SYNC_MASTER \u540c\u6b65\u53cc\u5199Master #- SLAVE brokerRole=ASYNC_MASTER #\u5237\u76d8\u65b9\u5f0f #- ASYNC_FLUSH \u5f02\u6b65\u5237\u76d8 #- SYNC_FLUSH \u540c\u6b65\u5237\u76d8 flushDiskType=ASYNC_FLUSH #checkTransactionMessageEnable=false #abort \u6587\u4ef6\u5b58\u50a8\u8def\u5f84 abortFile=\/usr\/javawork\/apache-rocketmq\/store\/abort #\u9650\u5236\u7684\u6d88\u606f\u5927\u5c0f maxMessageSize=65536 \u4ee5\u4e0a\u914d\u7f6e\u53ef\u6839\u636e\u4e2a\u4eba\u9700\u6c42\u52a0\u5165\u5230\u81ea\u5df1\u7684\u914d\u7f6e\u6587\u4ef6\u4e2d\uff1bRocketMQ\u5b98\u65b9\u5df2\u7ecf\u4e3a\u6211\u4eec\u521b\u5efa\u597d\u4e86\u7b80\u5355\u7684\u96c6\u7fa4\u914d\u7f6e\u6587\u4ef6\uff0c\u8fdb\u53bb\u89e3\u538b\u540e\u7684\u6587\u4ef6\u5939\uff0c\u5728\u8fdb\u5165\u5230conf\u6587\u4ef6\u5939\uff0c\u53ef\u4ee5\u770b\u5230\u91cc\u9762\u6709\u4e09\u4e2a\u6587\u4ef6\u5939\uff1a"},{"title":"Vue Cli3-11\u521b\u5efa\u9879\u76ee\u6162\u7684\u95ee\u9898","link":"https:\/\/blog.greycode.top\/posts\/vue-cli3-11-problem\/","pubDate":"Thu, 05 Sep 2019 16:33:23 +0000","guid":"https:\/\/blog.greycode.top\/posts\/vue-cli3-11-problem\/","description":"\u524d\u8a00 \u8fd9\u51e0\u5929\u521a\u5b66\u4e60vue\uff0c\u4e8e\u662f\u4e0b\u8f7d\u4e86\u6700\u65b0\u7684vue cli3.11\u6765\u642d\u5efa\u9879\u76ee\uff0c\u53ef\u662f\u642d\u5efa\u7684\u65f6\u5019\u4e00\u76f4\u5361\u5728\u4e0b\u8f7d\u63d2\u4ef6\u89c1\u9762\uff0c\u5c31\u662f\u4e0b\u9762\u8fd9\u5f20\u56fe\u3002\n\u7f51\u4e0a\u67e5\u4e86\u8bf4\u4e0d\u80fd\u7528\u56fd\u5185\u7684\u955c\u50cf\uff0cWTF\uff0c\u4e0d\u662f\u8bf4\u56fd\u5185\u7684\u66f4\u5feb\u5417\uff1f\u597d\u5427\uff0c\u6211\u6362\uff01\uff01\uff01\n\u4e0b\u8f7dnrm \u770b\u6e05\u695a\u54e6\uff0c\u662fnrm\u90e8\u7f72npm\uff01\uff01\uff01nrm \u662f\u4e00\u4e2a npm \u6e90\u7ba1\u7406\u5668\uff0c\u5141\u8bb8\u4f60\u5feb\u901f\u5730\u5728 npm \u6e90\u95f4\u5207\u6362\u3002\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u5b89\u88c5\u3002\nsudo npm install -g nrm \u6d4b\u8bd5nrm\u662f\u5426\u5b89\u88c5\u6210\u529f nrm -V \u5982\u679c\u8f93\u51fa\u7248\u672c\u53f7\uff0c\u5219\u8bf4\u660e\u5b89\u88c5\u6210\u529f\u3002\n\u5207\u6362npm\u6e90 nrm ls \u6b64\u547d\u4ee4\u4f1a\u5217\u51fanpm\u7684\u6240\u6709\u6e90\n\u53ef\u4ee5\u770b\u5230\u6211\u73b0\u5728\u4f7f\u7528\u7684\u662f\u6dd8\u5b9d\u7684\u6e90\uff0c\u73b0\u5728\u628a\u4ed6\u5207\u6362\u5230npm\u7684\u6e90\u3002\nnrm use npm \u518d\u6b21\u521b\u5efavue\u9879\u76ee vue create rrr2 \u9879\u76ee\u6210\u529f\u521b\u5efa\uff01\uff01\uff01"},{"title":"Docker\u4e0b\u5b89\u88c5mysql\u5e76\u8bbe\u7f6e\u7528\u6237\u6743\u9650","link":"https:\/\/blog.greycode.top\/posts\/docker-mysql\/","pubDate":"Tue, 03 Sep 2019 15:58:46 +0000","guid":"https:\/\/blog.greycode.top\/posts\/docker-mysql\/","description":"\u73af\u5883 Ubuntu18.04\nDocker19.03.1\nMysql5.7\nDocker \u62c9\u53d6\u955c\u50cf Docker\u62c9\u53d6\u955c\u50cf\u9ed8\u8ba4\u662f\u4eceDockerHub\u4e0a\u9762\u62c9\u53d6\uff0c\u4e0a\u9762\u6709\u5404\u5382\u5546\u63d0\u4f9b\u7684\u4f18\u8d28\u5b98\u65b9\u955c\u50cf\uff0c\u53ef\u4ee5\u76f4\u63a5\u62c9\u53d6\u4f7f\u7528\u3002\u6216\u8005\u4e5f\u53ef\u4ee5\u7528DockerFile\u81ea\u5b9a\u4e49\u6784\u5efa\u4f60\u81ea\u5df1\u7684\u955c\u50cf\u3002\nsudo docker pull mysql:5.7 \/\/\u62c9\u53d6\u955c\u50cf\u5230\u672c\u5730 \u6ce8\uff1a\u4e0a\u9762mysql:5.7\u6307\u7684\u662f\u62c9\u53d65.7\u7248\u672c\u7684mysql\uff0c\u5982\u679c\u4e0d\u52a0\u76f4\u63a5\u5199mysql\u7684\u8bdd\u9ed8\u8ba4\u662f\u62c9\u53d6mysql\u7684\u6700\u65b0\u7248\u672c\u3002\n\u5982\u679c\u663e\u793a\u4e0a\u9762\u8fd9\u6837\uff0c\u8bf4\u660e\u5df2\u7ecf\u62c9\u53d6\u597d\u4e86\u3002\n\u67e5\u770b\u955c\u50cf sudo docker images \/\/\u67e5\u770b\u672c\u5730\u955c\u50cf \u521b\u5efa\u5bb9\u5668 \u521b\u5efa sudo docker run -d -p 3306:3306 --name mysql5.7 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 -d \u6307\u5b9a\u5bb9\u5668\u8fd0\u884c\u4e8e\u540e\u53f0 -p \u7aef\u53e3\u6620\u5c04 \u4e3b\u673a\u7aef\u53e3:\u5bb9\u5668\u7aef\u53e3 &ndash;name \u81ea\u5b9a\u4e49\u5bb9\u5668\u540d\u5b57\uff0c\u65b9\u4fbf\u8bb0\u5fc6\uff0c\u4e0d\u8bbe\u7f6e\u7684\u8bdd\u4f1a\u968f\u673a\u751f\u4ea7 -e \u5bb9\u5668\u73af\u5883\u53d8\u91cf \u521b\u5efa\u597d\u7684\u8bdd\u4f1a\u663e\u793a\u4e00\u4e32\u968f\u673a\u751f\u4ea7\u7684id\n\u67e5\u770b\u521b\u5efa\u597d\u7684\u5bb9\u5668 sudo docker ps -a -a \u663e\u793a\u6240\u6709\u521b\u5efa\u597d\u7684\u5bb9\u5668\uff0c\u5982\u679c\u4e0d\u52a0\u53ea\u663e\u793a\u6b63\u5728\u8fd0\u884c\u7684\u5bb9\u5668 Mysql \u8fdb\u5165\u5bb9\u5668 sudo docker exec -it mysql5.7 bash -i \u6253\u5f00STDIN\uff0c\u7528\u4e8e\u63a7\u5236\u53f0\u4ea4\u4e92 -t \u5206\u914dtty\u8bbe\u5907\uff0c\u8be5\u53ef\u4ee5\u652f\u6301\u7ec8\u7aef\u767b\u5f55 \u767b\u5f55mysql mysql -uroot -p \u6ce8\uff1a\u7136\u540e\u8f93\u5165\u521a\u624d\u521b\u5efa\u5bb9\u5668\u65f6\u7684\u5bc6\u7801\uff0c\u5c31\u662fMYSQL_ROOT_PASSWORD\u8fd9\u4e2a\u53c2\u6570\n\u521b\u5efa\u6d4b\u8bd5\u6570\u636e\u5e93 create database test; \u521b\u5efamysql\u7528\u6237 create user &#39;zmh&#39;@&#39;%&#39; identified by &#39;zmh&#39;; \u6ce8\uff1a&quot;%&ldquo;\u8868\u793a\u53ef\u4ee5\u4efb\u610fip\u8bbf\u95ee"},{"title":"\u6811\u8393\u6d3e\u5b89\u88c5docker","link":"https:\/\/blog.greycode.top\/posts\/build-docker-pi\/","pubDate":"Fri, 30 Aug 2019 18:33:03 +0000","guid":"https:\/\/blog.greycode.top\/posts\/build-docker-pi\/","description":"\u524d\u8a00 \u548c\u5e73\u5e38x86_64\u67b6\u6784\u7684\u7535\u8111\u5b89\u88c5docker\u4e0d\u540c\uff0c\u6811\u8393\u6d3e\u662fARM\u67b6\u6784\u7684\uff0c\u6240\u4ee5\u5b89\u88c5\u6b65\u9aa4\u6bd4\u8f83\u7e41\u7410\u4e00\u70b9\u3002\n\u4f7f\u7528APT\u6e90\u5b89\u88c5docker \u66f4\u65b0apt\u8f6f\u4ef6\u6e90\u53ca\u5b89\u88c5\u5fc5\u5907\u7ec4\u4ef6\u3002\u4e3a\u4e86\u786e\u8ba4\u6240\u4e0b\u8f7d\u8f6f\u4ef6\u5305\u7684\u5408\u6cd5\u6027\uff0c\u8fd8\u9700\u8981\u6dfb\u52a0\u8f6f\u4ef6\u6e90\u7684 GPG \u5bc6\u94a5\u3002\n$sudo apt-get update $sudo apt-get install \\ apt-transport-https \\ ca-certificates \\ curl \\ gnupg2 \\ lsb-release \\ software-properties-common $curl -fsSL https:\/\/mirrors.ustc.edu.cn\/docker-ce\/linux\/raspbian\/gpg | sudo apt-key add - \u6dfb\u52a0docker ce \u8f6f\u4ef6\u6e90 \u9996\u5148\u6267\u884c\u4ee5\u4e0b\u4e00\u884c\u547d\u4ee4\uff0c\u7136\u540e\u8bb0\u4e00\u4e0b\u8f93\u51fa\u7684\u7ed3\u679c\n$ echo $(lsb_release -cs) stretch \u5728\/etc\/apt\/sources.list.d\u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6docker.list\n$ sudo vi \/etc\/apt\/sources.list.d\/docker.list \u5728\u6587\u4ef6\u91cc\u6dfb\u52a0\u4e0b\u9762\u8fd9\u884c\ndeb [arch=armhf] https:\/\/download.docker.com\/linux\/raspbian $(lsb_release -cs) stable \u628a$(lsb_release -cs)\u6539\u4e3a\u521a\u624d\u7b2c\u4e00\u884c\u8f93\u51fa\u7684\u7ed3\u679c\uff0c\u6bd4\u5982\u6211\u7684\u8f93\u51fa\u7684\u662fstretch\uff0c\u6539\u5b8c\u540e\u5982\u4e0b\ndeb [arch=armhf] https:\/\/download.docker.com\/linux\/raspbian stretch stable \u4fdd\u5b58\uff0c\u9000\u51fa\n\u5b89\u88c5docker ce \u4f9d\u6b21\u6267\u884c\u4ee5\u4e0b\u4e24\u884c\u547d\u4ee4\uff0c\u5373\u53ef\u5b8c\u6210\u5b89\u88c5\n$ sudo apt-get update $ sudo apt-get install docker-ce \u542f\u52a8 $ service docker start \u542f\u52a8 $ service docker stop \u505c\u6b62 $ service docker status \u72b6\u6001 $ service docker restart \u91cd\u542f"},{"title":"JDK\u65f6\u533a\u95ee\u9898","link":"https:\/\/blog.greycode.top\/posts\/problem-jdk-timezone\/","pubDate":"Tue, 27 Aug 2019 15:26:30 +0000","guid":"https:\/\/blog.greycode.top\/posts\/problem-jdk-timezone\/","description":"\u4eca\u5929\u78b0\u5230\u4e00\u4e2a\u5927\u5751\uff0c\u5f04\u4e86\u5feb\u4e00\u4e2a\u5c0f\u65f6\u624d\u89e3\u51b3\u6389\uff1b\n\u4e00\u4e2a\u7ba1\u7406\u53f0\u540e\u7aef\u670d\u52a1\uff0c\u7528docker\u9694\u79bb\u4e86\u4e09\u4e2a\u5bb9\u5668\uff0coracle,nginx,tomcat;\u540e\u53d1\u73b0\u7ba1\u7406\u53f0\u67e5\u51fa\u6765\u7684\u65f6\u95f4\u548c\u73b0\u5b9e\u65f6\u95f4\u76f8\u5dee8\u4e2a\u5c0f\u65f6\uff0c\u4e00\u67e5\u662flinux\u65f6\u533a\u95ee\u9898\uff1b\n\u4e8e\u662f\u6539\u4e4b,\u4e09\u53f0\u5bb9\u5668\u90fd\u8f93\u5165\u4e00\u4e0b\u4ee3\u7801 cp \/usr\/share\/zoneinfo\/Asia\/Shanghai \/etc\/localtime \u6d4b\u8bd5\u4e86\u4e00\u4e0b\uff0c\u53d1\u73b0\u95ee\u9898docker\u5bb9\u5668\u7684\u65f6\u533a\u662f\u6b63\u786e\u4e86\uff0c\u53ef\u662f\u95ee\u9898\u5e76\u672a\u5f97\u5230\u89e3\u51b3\uff0c\u6570\u636e\u5e93\u65f6\u95f4\u8fd8\u662f\u6162\u4e868\u4e2a\u5c0f\u65f6\u3002\n\u4e8e\u662f\u53c8\u67e5\u8d44\u6599\uff0c\u6362\u53e6\u5916\u4e00\u79cd\u8bbe\u7f6e\u65f6\u533a\u7684\u65b9\u6cd5\uff1b vi \/etc\/sysconfig\/clock \u5728\u91cc\u9762\u8f93\u5165\u5982\u4e0b\u5185\u5bb9\nZONE=&#34;Asia\/Shanghai&#34; UTC=false ARC=false \u4fdd\u5b58\uff0c\u91cd\u542f\uff0c\u6d4b\u8bd5\u3002\u3002\u3002\u3002\u3002\u53d1\u73b0\u8fd8\u662f\u4e00\u6837,\u5feb\u75af\u4e86\n\u7b2c\u4e09\u79cd\u65b9\u6cd5\uff0c\u8bbe\u7f6eTZ\u73af\u5883\u53d8\u91cf \u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\u53ef\u4ee5\u5728\u8bbe\u7f6e\u7cfb\u7edf\u7ea7\u522b\u7684\/etc\/profile ,\u4e5f\u53ef\u4ee5\u8bbe\u7f6e\u7528\u6237\u7ea7\u522b\u7684home\u76ee\u5f55\u7684.bashrc\u3002\u7531\u4e8e\u7528\u7684\u662fdocker\uff0c\u9632\u6b62\u53d8\u91cf\u91cd\u542f\u5931\u6548\uff0c\u53ea\u80fd\u5728.bashrc\u91cc\u8bbe\u7f6e\u3002\u5728.bashrc\u52a0\u5165\u5982\u4e0b\u5185\u5bb9\uff1a\nexport TZ=&#39;CST-8&#39; \u4fdd\u5b58\uff1a\u7136\u540e\u6267\u884c\nsource .bashrc \u4f7f\u8bbe\u7f6e\u7acb\u5373\u751f\u6548\u3002\n\u91cd\u542f\u5bb9\u5668\uff0c\u6d4b\u8bd5\uff0c\u53d1\u73b0\u65f6\u95f4\u6b63\u5e38\u4e86\u3002\u3002\u3002\u3002\u54c8\u54c8\u54c8\u54c8\n\u603b\u7ed3 \u4e0a\u9762\u95ee\u9898\u51fa\u5728jdk\u7684new Date()\u65b9\u6cd5\uff0c\u6240\u4ee5\u53ea\u8981\u8bbe\u7f6ejdk\u6240\u5728\u7684\u90a3\u4e2adocker\u5bb9\u5668\u7684\u53d8\u91cf\u5c31\u53ef\u4ee5\uff0c\u4e0d\u7528\u6bcf\u4e2a\u90fd\u8bbe\u7f6e\u3002jdk\u7684new Date()\u65b9\u6cd5\u6bcf\u6b21\u8c03\u7528\u90fd\u4f1a\u53bb\u53d6\u73af\u5883\u53d8\u91cfTZ\u7684\u65f6\u533a\uff0cTZ\u662fTimeZone\u7684\u7f29\u5199\uff0c\u5bb9\u5668\u5185\u90e8\u64cd\u4f5c\u7cfb\u7edf\u5e76\u672a\u6307\u5b9a\u65f6\u533a\uff08TimeZone\uff09\u4fe1\u606f\uff0c\u7cfb\u7edf\u9ed8\u8ba4\u4f7f\u7528\u4e16\u754c\u6807\u51c6\u65f6\uff08UTC+0),\u6240\u4ee5\u5bfc\u81f4new Date()\u51fa\u6765\u7684\u6570\u636e\u5b58\u5e93\u4f1a\u6bd4\u5f53\u524d\u65f6\u95f4\u61628\u4e2a\u5c0f\u65f6\uff1b"},{"title":"Java\u7684==\u548cequals","link":"https:\/\/blog.greycode.top\/posts\/java-equals\/","pubDate":"Tue, 20 Aug 2019 19:22:50 +0000","guid":"https:\/\/blog.greycode.top\/posts\/java-equals\/","description":"\u5728\u5e73\u5e38\u5de5\u4f5c\u548c\u5b66\u4e60\u4e2d\uff0c\u6211\u4eec\u4e00\u822c\u7528==\u548cequals\u6765\u6bd4\u8f83\u4e24\u4e2a\u5bf9\u8c61\u6216\u6570\u636e\u662f\u5426\u76f8\u7b49\u3002\u4f46\u662f\u4ec0\u4e48\u65f6\u5019\u7528equals\uff0c\u4ec0\u4e48\u65f6\u5019\u7528==\u4e00\u76f4\u90fd\u4e0d\u600e\u4e48\u6e05\u695a\uff0c\u4eca\u5929\u6574\u7406\u4e86\u4e0b\uff1b\n\u9996\u5148\u770b\u770bJava\u7684\u6808\u7a7a\u95f4\u548c\u5806\u7a7a\u95f4\u7684\u5730\u5740\u5f15\u7528 ==\u7684\u8bf4\u660e \u5728Java\u4e2d\uff0c==\u5bf9\u6bd4\u7684\u662f\u4e24\u4e2a\u5bf9\u8c61\u5728\u7a7a\u95f4\u91cc\u7684\u5730\u5740\u662f\u5426\u4e00\u81f4,\u6bd4\u5982\u4e0a\u56fe\u7684s2==s3\u8fd4\u56de\u7684\u662ffalse\uff0cs5==s6\u8fd4\u56de\u7684\u662f\u4e3atrue\u3002\u8bdd\u4e0d\u591a\u8bf4\uff0c\u4e0a\u4ee3\u7801\u3002\npublic class demo2 { public static void main(String[] args) { String s1=new String(&#34;t1&#34;); String s2=new String(&#34;t2&#34;); String s3=new String(&#34;t2&#34;); String s4=new String(&#34;t3&#34;); String s5=&#34;t3&#34;; String s6=&#34;t3&#34;; System.out.println(&#34;s2==s3:&#34;+(s2==s3)); System.out.println(&#34;s5==s6:&#34;+(s5==s6)); } } \u7ed3\u679c\uff1a \u8fd9\u662f\u56e0\u4e3a==\u6bd4\u7684\u662f\u5728\u7a7a\u95f4\u91cc\u7684\u5730\u5740\uff0cs2\u548cs3\u5728\u5806\u91cc\u9762\u662f\u4e24\u4e2a\u4e0d\u540c\u7684\u5bf9\u8c61\uff0c\u6240\u4ee5\u5730\u5740\u4e5f\u4e0d\u540c\uff0c\u81ea\u7136\u8fd4\u56de\u5c31\u662ffalse\u3002s5\u548cs6\u662fJava\u7684\u57fa\u7840\u6570\u636e\u7c7b\u578b\uff0c\u6307\u5411\u7684\u662f\u5e38\u91cf\u6c60\u91cc\u540c\u4e00\u4e2a\u5f15\u7528\uff0c\u6240\u4ee5\u5730\u5740\u4e5f\u76f8\u540c\uff0c\u8fd4\u56de\u7684\u5c31\u662ftrue\u3002\nequals\u7684\u8bf4\u660e \u6bcf\u4e2aObject\u91cc\u7684equals\u90fd\u4e0d\u4e00\u6837\uff0c\u6211\u4eec\u770b\u770bString\u91cc\u7684\u6e90\u7801\npublic boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString."},{"title":"Java\u4e2dString\u5224\u65ad\u4e3a\u7a7a\u76844\u5927\u65b9\u6cd5\u6bd4\u8f83","link":"https:\/\/blog.greycode.top\/posts\/java-isnull-four\/","pubDate":"Tue, 20 Aug 2019 18:59:15 +0000","guid":"https:\/\/blog.greycode.top\/posts\/java-isnull-four\/","description":"\u4e00.\u56db\u5927\u65b9\u6cd5 public class demo1 { public static void main(String[] args) { String a=&#34;&#34;; String a2=new String(); System.out.println(a==&#34;&#34;); System.out.println(a2==&#34;&#34;); System.out.println(&#34;------------------------------&#34;); System.out.println(a==null); System.out.println(a2==null); System.out.println(&#34;------------------------------&#34;); System.out.println(a.length()&lt;=0); System.out.println(a2.length()&lt;=0); System.out.println(&#34;------------------------------&#34;); System.out.println(a.isEmpty()); System.out.println(a2.isEmpty()); System.out.println(&#34;------------------------------&#34;); } } \u4e8c.\u8f93\u51fa\u7ed3\u679c \u53ef\u4ee5\u770b\u5230\u7528&quot;==&ldquo;\u5224\u65ad\u7684\u90a3\u7ec4\u51fa\u73b0\u4e86\u4e0d\u4e00\u81f4\u7684\u60c5\u51b5"},{"title":"\u9012\u5f52\u7b97\u6cd5-\u83b7\u53d6json\u4e2d\u6307\u5b9akey\u7684\u6240\u6709\u503c","link":"https:\/\/blog.greycode.top\/posts\/algorithm-recursive-01\/","pubDate":"Sat, 17 Aug 2019 12:38:52 +0000","guid":"https:\/\/blog.greycode.top\/posts\/algorithm-recursive-01\/","description":"\u4eca\u5929\u5728\u5de5\u4f5c\u4e2d\u9047\u5230\u8981\u89e3\u6790json\u5e76\u83b7\u53d6json\u91cc\u6240\u6709\u6307\u5b9akey\u7684\u503c\uff0c\u518d\u628akey\u7684\u503c\u63d2\u5165\u5bf9\u5e94\u7684\u6570\u636e\u6620\u5c04\u8868\u3002\u4e8e\u662f\u5199\u4e86\u4e00\u4e2a\u9012\u5f52\u7b97\u6cd5\u6765\u53d6\u503c\u3002\n1.\u9996\u5148\u5bfc\u5165alibaba\u7684fastjson\uff0c\u7528\u6765\u89e3\u6790json\u3002\u5f53\u7136\u4e5f\u53ef\u4ee5\u7528\u5176\u4ed6\u7684\u89e3\u6790\u5305 &lt;dependency&gt; &lt;groupId&gt;com.alibaba&lt;\/groupId&gt; &lt;artifactId&gt;fastjson&lt;\/artifactId&gt; &lt;version&gt;1.2.58&lt;\/version&gt; &lt;\/dependency&gt; 2.\u521b\u5efa\u4e24\u4e2a\u5de5\u5177\u7c7b\u65b9\u6cd5\uff0c\u7528\u6765\u5224\u65ad\u4f20\u5165\u7684\u662f\u4e0d\u662fjson\u5bf9\u8c61\u6216json\u6570\u7ec4 public static boolean isJSONObj(Object json){ return json instanceof JSONObject; } public static boolean isJSONArray(Object json){ return json instanceof JSONArray; } java\u4e2d\u7684instanceof\u4e5f\u79f0\u4e3a\u7c7b\u578b\u6bd4\u8f83\u8fd0\u7b97\u7b26\uff0c\u56e0\u4e3a\u5b83\u5c06\u5b9e\u4f8b\u4e0e\u7c7b\u578b\u8fdb\u884c\u6bd4\u8f83\u3002\u5b83\u8fd4\u56detrue\u6216false\u3002\n3.\u5efa\u7acb\u6838\u5fc3\u91cd\u8f7d\u65b9\u6cd5 public static void getJSONValue(JSONObject json,String k,List&lt;String&gt; list){ for (Object j:json.keySet()){ if(isJSONObj(json.get(j))){ \/\/\u662f\u5bf9\u8c61 JSONObject j2= JSON.parseObject(json.get(j).toString()); getJSONValue(j2,k,list); }else if(isJSONArray(json.get(j))){ JSONArray j3=JSON.parseArray(json.get(j).toString()); \/\/\u662f\u6570\u7ec4 getJSONValue(j3,k,list); }else if(j==k){ \/\/\u662f\u5b57\u7b26\u4e32 list.add(json.get(j).toString()); } } } public static void getJSONValue(JSONArray json,String k,List&lt;String&gt; list){ for (Object j:json){ if(isJSONObj(j)){ \/\/\u662f\u5bf9\u8c61 JSONObject j2= JSON."},{"title":"Base64\u5f71\u54cd\u6cf0\u6587\u5b57\u6bb5\u53d6\u503c\u95ee\u9898","link":"https:\/\/blog.greycode.top\/posts\/problem-java-base64\/","pubDate":"Wed, 14 Aug 2019 10:39:23 +0000","guid":"https:\/\/blog.greycode.top\/posts\/problem-java-base64\/","description":"\u4eca\u5929\u5728\u5de5\u4f5c\u4e2d\uff0c\u56fe\u7247\u8981\u7528base64\u4e0a\u4f20\uff0c\u4e0a\u4f20\u6570\u636e\u4e2d\u8fd8\u6709\u6cf0\u6587\uff0c\u7136\u540e\u548c\u524d\u7aefapp\u8054\u8c03\u65f6\u53d1\u73b0\u4ed6\u4eec\u4f20\u7684\u6cf0\u6587\u8fd9\u8fb9\u7adf\u7136\u6ca1\u5b58\u5230\u5e93\u91cc\uff0c\u6000\u7591\u662fapp\u6ca1\u6709\u4f20\u503c\u8fc7\u6765\uff0c\u4e8e\u662f\u4e00\u756a\u64cd\u4f5c \u67e5\u770b\u65e5\u5fd7 what,\u65e5\u5fd7\u91cc\u9762\u7adf\u7136\u6709\u4ed6\u4eec\u4f20\u8fc7\u6765\u7684\u6cf0\u6587\u7684\u503c\n\u5bf9\u6bd4ios\u548candroid\u7684\u6570\u636e \u53d1\u73b0\u65e5\u5fd7\u91cc\u7684\u6570\u636e\u90fd\u662f\u4e00\u6837\u7684\uff0c\u4f46\u662fandroid\u4e0a\u4f20\u7684\u6570\u636e\u5168\u90e8\u4f20\u5165\u4e86mysql\u6570\u636e\u5e93\uff0cios\u7684\u9664\u4e86\u6cf0\u6587\uff0c\u5176\u4ed6\u7684\u4e5f\u90fd\u4f20\u5230\u4e86\u5e93\u91cc\n\u786e\u5b9a\u95ee\u9898 \u6700\u540e\u5bf9\u6bd4\u53d1\u73b0\uff0candroid\u7684\u6cf0\u6587\u5b57\u6bb5\u4e09\u653e\u5728base64\u5b57\u6bb5\u524d\u9762\u7684\u7136\u540e\u4f20\u4e0a\u6765\u7684\uff0cios\u662f\u653e\u5728base64\u5b57\u6bb5\u540e\u9762\u4f20\u4e0a\u6765\u7684\uff0c\u6000\u7591\u95ee\u9898\u5728\u6b64\u5904\n\u4fee\u590dbug \u4e8e\u662f\u53ebios\u4e5f\u548candroid\u4e00\u6837\uff0c\u628a\u4e0a\u4f20\u5b57\u6bb5\u7684\u987a\u5e8f\u8c03\u6574\u4e86\u4ee5\u4e0b\uff0c\u628a\u6cf0\u6587\u7684\u5b57\u6bb5\u653e\u5728base64\u5b57\u6bb5\u524d\u9762\uff0c\u7136\u540e\u4e0a\u4f20\u3002\u6539\u4e86\u4e4b\u540e\u8bd5\u4e86\u4ee5\u4e0b\uff0c\uff0c\u7adf\u7136\u89e3\u51b3\u4e86\uff0c2222333333\n\u603b\u7ed3\uff1a\u6682\u65f6\u4e0d\u77e5\u9053\u5177\u4f53\u4ec0\u4e48\u539f\u56e0\uff0c\u6709\u53ef\u80fd\u662f\u56e0\u4e3abase64\u6570\u636e\u592a\u957f\u4e86\uff0c\u5f71\u54cd\u5230\u6cf0\u6587\u7684\u5b57\u6bb5\u5b58\u50a8\u4e86\u3002"}]}}