{"@attributes":{"version":"2.0"},"channel":{"title":"Chance","link":"https:\/\/chance.fyi\/","description":"Recent content on Chance","generator":"Hugo -- 0.118.2","language":"zh","lastBuildDate":"Fri, 05 Dec 2025 12:00:00 +0800","item":[{"title":"Mouse Gestures \u2013 Browser Extension","link":"https:\/\/chance.fyi\/mouse-gestures-privacy-policy\/","pubDate":"Fri, 05 Dec 2025 12:00:00 +0800","guid":"https:\/\/chance.fyi\/mouse-gestures-privacy-policy\/","description":"The Mouse Gestures browser extension is developed and maintained by Chance (chance.fyii@gmail.com).\nData Collection The Extension stores settings locally in your browser. It does not collect any personal data. It does not collect browsing history, analytics, or tracking information. No data is sent to the developer or any external server. Google Drive Backup (Optional) If you enable the optional Google Drive backup:\nThe Extension may save configuration files to your Google Drive."},{"title":"Mouse Gestures \u2013 Browser Extension","link":"https:\/\/chance.fyi\/mouse-gestures\/","pubDate":"Fri, 05 Dec 2025 12:00:00 +0800","guid":"https:\/\/chance.fyi\/mouse-gestures\/","description":"Mouse Gestures is a lightweight browser extension designed to improve your browsing efficiency through intuitive mouse gestures and drag-and-drop operations.\nIt enables faster, smoother web navigation with simple mouse movements.\n\ud83d\udd0d What This Extension Does Provides right-button mouse gestures to perform common browsing actions Supports drag-and-drop gestures for text, links, and images Customizable actions: create and manage your own gestures and choose the actions they perform Offers local backup and restore for all settings Includes an optional Google Drive sync feature for cross-device configuration backup The extension runs fully on the client side and does not change webpage content beyond enabling gesture functionality."},{"title":"Mouse Gestures \u2013 Terms of Service","link":"https:\/\/chance.fyi\/mouse-gestures-terms-of-service\/","pubDate":"Fri, 05 Dec 2025 12:00:00 +0800","guid":"https:\/\/chance.fyi\/mouse-gestures-terms-of-service\/","description":"By using the Mouse Gestures extension, you agree to the following terms.\nUse You may use the Extension freely as long as you comply with applicable laws.\nNo Warranty The Extension is provided \u201cas is\u201d without any warranty. The developer is not responsible for:\nData loss Errors Issues caused by using the Extension Google Drive Backup If you use the optional backup feature:\nYou are responsible for your Google account and any data in your Google Drive."},{"title":"PostgreSQL \u8868\u6570\u636e\u8fc1\u79fb\u7b56\u7565","link":"https:\/\/chance.fyi\/post\/postgresql\/table-data-migration-strategy\/","pubDate":"Mon, 23 Sep 2024 14:58:50 +0800","guid":"https:\/\/chance.fyi\/post\/postgresql\/table-data-migration-strategy\/","description":"\u80cc\u666f \u968f\u7740\u516c\u53f8\u67d0\u9879\u4e1a\u52a1\u7684\u5feb\u901f\u53d1\u5c55\uff0c\u76f8\u5173\u8868\u7684\u6570\u636e\u91cf\u6fc0\u589e\u3002\u4e3a\u4e86\u5e94\u5bf9\u8fd9\u4e00\u589e\u957f\uff0c\u6211\u4eec\u9700\u8981\u5c06\u8fd9\u4e9b\u8868\u7684\u6570\u636e\u8fc1\u79fb\u5230\u65b0\u7684\u6570\u636e\u5e93\uff0c\u5e76\u5b9e\u73b0\u5e73\u6ed1\u5207\u6362\u3002\u672c\u6587\u5c06\u63a2\u8ba8\u51e0\u79cd\u53ef\u80fd\u7684\u8fc1\u79fb\u7b56\u7565\uff0c\u5e76\u5206\u6790\u6bcf\u79cd\u65b9\u6848\u7684\u4f18\u7f3a\u70b9\u3002\n\u6d4b\u8bd5\u73af\u5883\u642d\u5efa \u4e3a\u4e86\u6a21\u62df\u548c\u6d4b\u8bd5\u5404\u79cd\u8fc1\u79fb\u7b56\u7565\uff0c\u6211\u4eec\u9996\u5148\u4f7f\u7528 Docker \u642d\u5efa\u4e86\u4e00\u4e2a\u672c\u5730\u6d4b\u8bd5\u73af\u5883\uff0c\u5305\u542b\u4e09\u4e2a PostgreSQL \u5b9e\u4f8b:\npgsql\uff1a\u6e90\u6570\u636e\u5e93 pgsql1\uff1a\u76ee\u6807\u6570\u636e\u5e93 pgsql2\uff1a\u7528\u4e8e\u5176\u4ed6\u64cd\u4f5c services: pgsql: image: postgres:13 ports: - 5433:5432 environment: POSTGRES_PASSWORD: 123456 pgsql1: image: postgres:13 ports: - 5434:5432 environment: POSTGRES_PASSWORD: 123456 pgsql2: image: postgres:13 ports: - 5435:5432 environment: POSTGRES_PASSWORD: 123456 \u8fc1\u79fb\u7b56\u7565 \u4e00\u3001\u4e3b\u4ece\u590d\u5236 \u4e3b\u4ece\u590d\u5236\u662f\u4e00\u79cd\u76f4\u89c2\u7684\u6570\u636e\u8fc1\u79fb\u65b9\u6cd5\uff0c\u53ef\u4ee5\u786e\u4fdd\u6570\u636e\u7684\u5b9e\u65f6\u540c\u6b65\u3002\n\u914d\u7f6e\u6b65\u9aa4\uff1a \u4fee\u6539\u4e3b\u5e93(\u6e90\u6570\u636e\u5e93)\u914d\u7f6e\uff1a vim \/var\/lib\/postgresql\/data\/pg_hba.conf # \u6dfb\u52a0\u4ece\u5e93IP\u7684\u8bbf\u95ee\u6743\u9650 host replication all 172.20.0.3\/32 md5 \u91cd\u65b0\u52a0\u8f7d\u4e3b\u5e93\u914d\u7f6e\uff1a SELECT pg_reload_conf(); \u914d\u7f6e\u4ece\u5e93(\u76ee\u6807\u6570\u636e\u5e93)\uff1a touch \/var\/lib\/postgresql\/data\/standby.signal vim \/var\/lib\/postgresql\/data\/postgresql.conf # \u6dfb\u52a0\u4e3b\u5e93\u8fde\u63a5\u4fe1\u606f primary_conninfo = &#39;host=pgsql port=5432 user=postgres password=123456&#39; \u5907\u4efd\u4e3b\u5e93\u6570\u636e\u5230\u4ece\u5e93\uff1a pg_basebackup -h pgsql -U postgres -p 5432 -F p -X s -v -P -R -D \/var\/lib\/postgresql\/data \u91cd\u542f\u4ece\u5e93 \u4f18\u70b9\uff1a \u5b9e\u73b0\u5168\u91cf\u6570\u636e\u540c\u6b65\uff0c\u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355\u3002"},{"title":"Navicat HTTP tunnel \u52a0\u901f","link":"https:\/\/chance.fyi\/post\/tool\/navicat\/http-tunnel-acceleration\/","pubDate":"Sat, 14 Sep 2024 13:13:19 +0800","guid":"https:\/\/chance.fyi\/post\/tool\/navicat\/http-tunnel-acceleration\/","description":"\u80cc\u666f \u5728\u516c\u53f8\u73af\u5883\u4e2d\uff0c\u6d4b\u8bd5\u548c\u751f\u4ea7\u6570\u636e\u5e93\u901a\u5e38\u4e0d\u5141\u8bb8\u76f4\u63a5\u5916\u7f51\u8bbf\u95ee\u3002\u4e3a\u4e86\u4f7f\u7528 Navicat \u7ba1\u7406\u8fd9\u4e9b\u6570\u636e\u5e93\uff0c\u6211\u4eec\u9700\u8981\u901a\u8fc7\u96a7\u9053\u8fde\u63a5\u3002\u6211\u4eec\u9009\u62e9\u4f7f\u7528 HTTP \u96a7\u9053\uff0cNavicat \u5b89\u88c5\u76ee\u5f55\u4e0b\u63d0\u4f9b\u4e86\u76f8\u5e94\u7684 PHP \u96a7\u9053\u811a\u672c\uff0c\u53ea\u9700\u5c06\u5176\u90e8\u7f72\u5230\u53ef\u4ee5\u8fde\u63a5\u6570\u636e\u5e93\u7684\u670d\u52a1\u5668\u4e0a\u5373\u53ef\u3002\n\u7136\u800c\uff0c\u5728\u5b9e\u9645\u4f7f\u7528\u8fc7\u7a0b\u4e2d\uff0c\u6211\u53d1\u73b0 HTTP \u96a7\u9053\u4f1a\u663e\u8457\u964d\u4f4e\u64cd\u4f5c\u901f\u5ea6\uff0c\u4e25\u91cd\u5f71\u54cd\u5de5\u4f5c\u6548\u7387\u3002\n\u95ee\u9898\u5206\u6790 \u901a\u8fc7\u67e5\u770b PHP \u96a7\u9053\u811a\u672c\u7684\u4ee3\u7801\uff0c\u6211\u4e86\u89e3\u5230\u5176\u5de5\u4f5c\u539f\u7406\uff1aNavicat \u5c06 SQL \u8bed\u53e5\u53d1\u9001\u7ed9 PHP \u811a\u672c\uff0cPHP \u6267\u884c SQL \u5e76\u8fd4\u56de\u7ed3\u679c\u3002\u8fd9\u4e2a\u4e2d\u8f6c\u8fc7\u7a0b\u4f1a\u5f15\u5165\u4e00\u4e9b\u5ef6\u8fdf\uff0c\u4f46\u5b9e\u9645\u4f53\u9a8c\u4e2d\u7684\u5ef6\u8fdf\u4f3c\u4e4e\u8fc7\u9ad8\u3002\n\u4e3a\u4e86\u6df1\u5165\u5206\u6790\u8fd9\u4e2a\u95ee\u9898\uff0c\u6211\u51b3\u5b9a\u4f7f\u7528 Wireshark \u8fdb\u884c\u6293\u5305\u3002\u6211\u8bbe\u7f6e\u4e86\u4ee5\u4e0b\u8fc7\u6ee4\u5668\u6765\u6355\u83b7\u6240\u6709\u901a\u8fc7 HTTP \u96a7\u9053\u7684 Navicat \u8bf7\u6c42:\nhttp.request.full_uri == &#34;http:\/\/your-domain.com\/ntunnel_pgsql.php&#34; and http.request \u6211\u6267\u884c\u4e86\u4e00\u7cfb\u5217\u5e38\u89c1\u64cd\u4f5c:\n\u6253\u5f00\u6570\u636e\u5e93 \u67e5\u770b\u4e00\u4e2a\u8868\u7ed3\u6784 \u67e5\u770b\u4e00\u4e2a\u8868\u6570\u636e \u6309 id \u5012\u5e8f\u7b5b\u9009\u6570\u636e \u6293\u5305\u7ed3\u679c\u663e\u793a\uff0c\u8fd9\u4e9b\u57fa\u672c\u64cd\u4f5c\u603b\u5171\u89e6\u53d1\u4e86 177 \u6b21\u8bf7\u6c42\u3002\u867d\u7136\u6bcf\u4e2a\u8bf7\u6c42\u7684\u8be6\u7ec6\u5185\u5bb9\u4e0d\u65b9\u4fbf\u90fd\u622a\u56fe\u51fa\u6765\uff0c\u4f46\u662f\u901a\u8fc7\u89c2\u5bdf\u6bcf\u4e2a\u8bf7\u6c42\u7684 Length\uff0c\u4e5f\u53ef\u4ee5\u53d1\u73b0\u5b58\u5728\u5927\u91cf\u91cd\u590d\u8bf7\u6c42\u3002\n\u89e3\u51b3\u65b9\u6848 \u6700\u521d\uff0c\u6211\u5c1d\u8bd5\u5728 Navicat \u8bbe\u7f6e\u4e2d\u5bfb\u627e\u53ef\u4ee5\u7f13\u5b58\u8fd9\u4e9b\u6570\u636e\u7684\u9009\u9879\uff0c\u4ee5\u51cf\u5c11\u91cd\u590d\u8bf7\u6c42\u3002\u4f46\u662f\u6ca1\u6709\u627e\u5230\u76f8\u5173\u8bbe\u7f6e\u3002\n\u56e0\u6b64\uff0c\u6211\u51b3\u5b9a\u5f00\u53d1\u4e00\u4e2a\u672c\u5730\u8fd0\u884c\u7684\u4ee3\u7406\u7a0b\u5e8f\uff0c\u7528\u4e8e\u7f13\u5b58\u91cd\u590d\u8bf7\u6c42\uff0c\u4ece\u800c\u51cf\u5c11\u7f51\u7edc\u8bf7\u6c42\u6b21\u6570\uff0c\u63d0\u9ad8\u64cd\u4f5c\u901f\u5ea6\u3002\n\u6211\u4f7f\u7528 Go \u8bed\u8a00\u5f00\u53d1\u4e86\u4e00\u4e2a\u4ee3\u7406\u5de5\u5177 navicat-http-tunnel-acceleration\u3002\u5b83\u7684\u4f7f\u7528\u975e\u5e38\u7b80\u5355:\n\u514b\u9686\u4ed3\u5e93\u5230\u672c\u5730 \u5728\u9879\u76ee\u76ee\u5f55\u4e0b\u8fd0\u884c go run . --url http:\/\/your-domain.com\/ntunnel_pgsql.php --port &lt;your-port&gt; \u5c06 Navicat \u7684 HTTP \u96a7\u9053\u8bbe\u7f6e\u6210 http:\/\/127."},{"title":"\u4f7f\u7528ChatGPT\u8f85\u52a9\u5f00\u53d1\u9f20\u6807\u624b\u52bf\u6269\u5c55","link":"https:\/\/chance.fyi\/post\/chrome-extension\/mouse-gestures\/","pubDate":"Tue, 04 Jun 2024 14:45:20 +0800","guid":"https:\/\/chance.fyi\/post\/chrome-extension\/mouse-gestures\/","description":"\u524d\u8a00 \u6211\u4e00\u76f4\u5728\u4f7f\u7528\u7684\u9f20\u6807\u624b\u52bf\u63d2\u4ef6 SmartUp Gestures \u6700\u8fd1\u88ab Chrome \u63d0\u793a\u5305\u542b\u6076\u610f\u8f6f\u4ef6\uff0c\u5bfc\u81f4\u65e0\u6cd5\u7ee7\u7eed\u4f7f\u7528\u4e86\u3002\u4f5c\u4e3a\u4e00\u4e2a\u9f20\u6807\u624b\u52bf\u7684\u91cd\u5ea6\u4f7f\u7528\u8005\uff0c\u6211\u4e0d\u4ec5\u5728\u65e5\u5e38\u64cd\u4f5c\u4e2d\u9891\u7e41\u4f9d\u8d56\u5b83\uff0c\u6709\u65f6\u751a\u81f3\u4f1a\u5728\u65e0\u804a\u65f6\u7528\u9f20\u6807\u624b\u52bf\u753b\u753b\u3002\u5c1d\u8bd5\u4e86\u5176\u4ed6\u51e0\u4e2a\u66ff\u4ee3\u7684\u624b\u52bf\u63d2\u4ef6\u540e\uff0c\u6211\u53d1\u73b0\u5b83\u4eec\u90fd\u4e0d\u662f\u5f88\u597d\u7528\u3002\u56e0\u6b64\uff0c\u6211\u51b3\u5b9a\u81ea\u5df1\u5f00\u53d1\u4e00\u4e2a\u65b0\u7684\u9f20\u6807\u624b\u52bf\u63d2\u4ef6\u3002\n\u5b66\u4e60\u63d2\u4ef6\u5f00\u53d1 \u7531\u4e8e\u4ee5\u524d\u6ca1\u6709\u5f00\u53d1\u8fc7 Chrome \u63d2\u4ef6\uff0c\u6211\u51b3\u5b9a\u5148\u4e86\u89e3\u4e00\u4e0b\u5f00\u53d1\u6d41\u7a0b\u3002\u5728\u67e5\u627e\u8d44\u6599\u65f6\uff0c\u6211\u53d1\u73b0\u4e86\u4e00\u7bc7\u540d\u4e3a\u300achrome \u63d2\u4ef6\u5f00\u53d1\u6307\u5357\uff08Manifest V3\uff09\u300b\u7684\u6587\u7ae0\uff0c\u8fd9\u7bc7\u6587\u7ae0\u7b80\u660e\u627c\u8981\u5730\u4ecb\u7ecd\u4e86\u5f00\u53d1\u6d41\u7a0b\u3002\u540c\u65f6\uff0c\u6211\u5728\u5176\u4e2d\u627e\u5230\u4e86\u4e00\u4e2a\u63a8\u8350\u7684\u63d2\u4ef6\u5f00\u53d1\u6a21\u677fchibat\/chrome-extension-typescript-starter\u3002\n\u4e0b\u8f7d\u4e86\u8fd9\u4e2a\u6a21\u677f\u9879\u76ee\uff0c\u7136\u540e\u8fd0\u884c\u8d77\u6765\u3002\u5728 Chrome \u7684\u6269\u5c55\u7a0b\u5e8f\u7ba1\u7406\u9875\u9762\u52a0\u8f7d dist \u76ee\u5f55\u540e\uff0c\u4fbf\u80fd\u770b\u5230\u63d2\u4ef6\u7684\u6548\u679c\u4e86\u3002\n\u5728\u9605\u8bfb\u4e0a\u8ff0\u6587\u7ae0\u548c\u6a21\u677f\u4ee3\u7801\u540e\uff0c\u6211\u4e86\u89e3\u5230 manifest.json \u662f\u63d2\u4ef6\u7684\u914d\u7f6e\u6587\u4ef6\u3002\u63a5\u4e0b\u6765\uff0c\u5c06\u6587\u4ef6\u5185\u5bb9\u53d1\u9001\u7ed9 GPT\uff0c\u8ba9\u5176\u4e3a\u6211\u89e3\u91ca\u5176\u4e2d\u7684\u5404\u9879\u914d\u7f6e\u3002\n\u7ed3\u5408\u6a21\u677f\u4ee3\u7801\u8fdb\u884c\u8c03\u8bd5\u540e\uff0c\u6211\u5927\u81f4\u4e86\u89e3\u4e86\u5404\u4e2a\u9875\u9762\u7684\u4f5c\u7528\u3002\n\u63d2\u4ef6\u5f00\u53d1 \u7ed8\u5236\u9f20\u6807\u6ed1\u52a8\u8f68\u8ff9 \u4e0d\u592a\u4f1a\u5199\u8fd9\u4e9b\u903b\u8f91\uff0c\u8fd8\u662f\u5148\u95ee\u4e00\u4e0b GPT\uff0c\u6211\u4e00\u822c\u5199\u7684 prompt \u90fd\u5f88\u7b80\u5355\uff0c\u7136\u540e\u5728\u9047\u5230\u95ee\u9898\u65f6\u518d\u8fdb\u884c\u8c03\u6574\u3002\n\u5c06\u4ee3\u7801\u590d\u5236\u8fdb\u53bb\u8fdb\u884c\u6d4b\u8bd5\uff0c\u53d1\u73b0\u53ef\u4ee5\u6210\u529f\u7ed8\u5236\u9f20\u6807\u8f68\u8ff9\u3002\u4e0d\u8fc7\uff0c\u4ee3\u7801\u4e2d\u4ecd\u5b58\u5728\u4e00\u4e9b Bug\uff0c\u9700\u8981\u8fdb\u4e00\u6b65\u8c03\u8bd5\u548c\u4fee\u6539\u3002\n1. \u7b2c\u4e00\u4e2a Bug \u662f\u53f3\u952e\u677e\u5f00\u4e86\u8fd8\u80fd\u7ed8\u5236\u8f68\u8ff9 \u731c\u6d4b Bug \u539f\u56e0\u662f\u6ca1\u6709\u53d6\u6d88\u4e8b\u4ef6\u76d1\u542c\u7684\u539f\u56e0\u3002\n\u95ee\u4e86 GPT \u53d1\u73b0\u5728\u4e71\u8bf4\uff0c\u7ecf\u8fc7\u8fdb\u4e00\u6b65\u8c03\u8bd5\uff0c\u53d1\u73b0\u4e0d\u662f\u8fd9\u4e2a\u539f\u56e0\u3002\u7ecf\u8fc7\u7ec6\u81f4\u7684\u8c03\u8bd5\uff0c\u6211\u53d1\u73b0 handleMousedown \u4e2d\u7684\u4ee3\u7801\u5728\u9f20\u6807\u6309\u4e0b\u5e76\u653e\u5f00\u4e4b\u540e\u624d\u6267\u884c\u3002\nGPT \u63a8\u8350\u6211\u4f7f\u7528 mousedown \u4e8b\u4ef6\u3002\u66f4\u6362\u4e8b\u4ef6\u76d1\u542c\u540e\uff0c\u8fd9\u4e2a Bug \u5f97\u5230\u4e86\u89e3\u51b3\u3002\u4e4b\u540e\uff0c\u6211\u53c8\u81ea\u5df1\u6dfb\u52a0\u4e86\u5728\u9f20\u6807\u53f3\u952e\u6309\u4e0b\u5e76\u79fb\u52a8\u65f6\u963b\u6b62\u53f3\u952e\u83dc\u5355\u5f39\u51fa\u7684\u903b\u8f91\u3002\n2. \u7b2c\u4e8c\u4e2a Bug \u662f\u9f20\u6807\u5de6\u952e\u4e5f\u80fd\u7ed8\u5236\u8f68\u8ff9 \u52a0\u4e0a\u662f\u5426\u662f\u53f3\u952e\u6309\u4e0b\u7684\u5224\u65ad\u4e5f\u987a\u5229\u89e3\u51b3\u3002\n3. \u4f18\u5316 \u9f20\u6807\u7ed8\u5236\u7684\u8f68\u8ff9\u4e0d\u987a\u6ed1 GPT \u63a8\u8350\u4f7f\u7528\u8d1d\u585e\u5c14\u66f2\u7ebf\u6765\u5e73\u6ed1\u8f68\u8ff9\u3002\u6dfb\u52a0\u8fd9\u6bb5\u903b\u8f91\u540e\uff0c\u6548\u679c\u8fbe\u5230\u4e86\u9884\u671f\u3002\n4. \u7b2c\u4e09\u4e2a Bug \u662f\u9875\u9762\u6eda\u52a8\u4e4b\u540e\u8f68\u8ff9\u4e0d\u5728\u8ddf\u968f\u9f20\u6807 \u731c\u6d4b\u95ee\u9898\u51fa\u5728\u5143\u7d20\u5b9a\u4f4d\u4e0a\u3002\u7531\u4e8e\u6211\u5bf9 CSS \u4e0d\u592a\u719f\u6089\uff0c\u5199\u5f97\u4e5f\u4e0d\u591a\uff0c\u6240\u4ee5\u53c8\u54a8\u8be2\u4e86 GPT \ud83e\udd23\u3002\n\u6700\u540e\u7684\u4ee3\u7801\u5b9e\u73b0\uff1a\n\/\/ \u662f\u5426\u963b\u6b62\u53f3\u952e\u83dc\u5355 let blockMenu: boolean = false; document."},{"title":"Arch Linux\u914d\u7f6e","link":"https:\/\/chance.fyi\/post\/linux\/arch-configure\/","pubDate":"Tue, 19 Sep 2023 14:48:41 +0800","guid":"https:\/\/chance.fyi\/post\/linux\/arch-configure\/","description":"\u68c0\u67e5\u7f51\u7edc # \u542f\u52a8dhcp systemctl start dhcpcd # \u8bbe\u7f6e\u5f00\u673a\u542f\u52a8 systemctl enable dhcpcd ping baidu.com # \u68c0\u67e5\u8bbe\u7f6e\u7cfb\u7edf\u65f6\u95f4 timedatectl timedatectl set-time &#34;yyyy-MM-dd hh:mm:ss&#34; # \u5347\u7ea7\u7cfb\u7edf\u4e2d\u6240\u6709\u5df2\u5b89\u88c5\u7684\u8f6f\u4ef6\u5305 pacman -Syu \u7528\u6237\u548c\u7528\u6237\u7ec4 # \u521b\u5efa\u7528\u6237 useradd -m chance # \u8bbe\u7f6e\u5bc6\u7801 passwd chance # \u5b89\u88c5sudo pacman -S sudo EDITOR=vim visudo # \u627e\u5230\u4e0b\u9762\u4e00\u884c\u53d6\u6d88\u6ce8\u91ca #%wheel ALL=(ALL:ALL) ALL # \u5c06\u7528\u6237\u52a0\u5165wheel\u7ec4 gpasswd -a [\u7528\u6237\u540d] [\u7ec4\u540d] SSH pacman -S openssh systemctl start sshd systemctl enable sshd # \u67e5\u770bip pacman -S net-tools ifconfig \u914d\u7f6e\u5171\u4eab\u6587\u4ef6\u5939 pacman -S open-vm-tools # \u865a\u62df\u673a\u8bbe\u7f6e\u91cc\u8bbe\u7f6e\u5171\u4eab\u6587\u4ef6\u5939 \u540d\u79f0\u4e3a share # \u67e5\u770b\u8bbe\u7f6e\u7684\u5171\u4eab\u6587\u4ef6\u5939\u540d\u5b57 \u4e3a share vmware-hgfsclient # \u521b\u5efa\u8981\u6302\u8f7d\u7684\u5171\u4eab\u6587\u4ef6\u5939 mkdir \/mnt\/hgfs # \u6302\u8f7d vmhgfs-fuse ."},{"title":"Arch Linux\u5b89\u88c5","link":"https:\/\/chance.fyi\/post\/linux\/arch-install\/","pubDate":"Mon, 18 Sep 2023 15:15:08 +0800","guid":"https:\/\/chance.fyi\/post\/linux\/arch-install\/","description":"\u524d\u9762\u628a\u5f00\u53d1\u73af\u5883\u5207\u6362\u5230 WSL \u4e86\uff0c\u4f46\u662f\u5728\u4f7f\u7528\u8fc7\u7a0b\u4e2d\u9047\u5230\u4e00\u4e2a\u65e0\u6cd5\u89e3\u51b3\u7684 Bug microsoft\/WSL#5118\uff0c\u56e0\u4e3a\u6211\u4f7f\u7528 symlink \u4e5f\u662f\u633a\u9891\u7e41\u7684\uff0c\u65e0\u6cd5\u5fcd\u53d7\u8fd9\u4e2a Bug\uff0c\u6240\u4ee5\u51b3\u5b9a\u5c06\u5f00\u53d1\u73af\u5883\u8fc1\u79fb\u5230\u865a\u62df\u673a \ud83d\ude02\uff0c\u7ecf\u8fc7\u4e00\u756a\u4e86\u89e3\u51b3\u5b9a\u4f7f\u7528 Arch Linux\uff0c\u4e0b\u9762\u662f\u865a\u62df\u673a\u4e2d\u5b89\u88c5 Arch Linux \u7684\u8fc7\u7a0b\u3002\n\u68c0\u67e5\u7f51\u7edc ping baidu.com \u68c0\u67e5\u65f6\u95f4\u662f\u5426\u6b63\u786e timedatectl \u521b\u5efa\u786c\u76d8\u5206\u533a # \u7528 sgdisk \u5c06 MBR \u5206\u533a\u8868\u8f6c\u6362\u4e3a GPT sgdisk -g \/dev\/sda # \u5217\u51fa\u78c1\u76d8\u5206\u533a \u627e\u5230\u8981\u5206\u533a\u7684\u78c1\u76d8 fdisk -l \u5206\u533a\u65b9\u6848 - Arch Linux \u4e2d\u6587\u7ef4\u57fa\n\/boot UEFI \u7cfb\u7edf\u9700\u8981\u6709 EFI \u7cfb\u7edf\u5206\u533a\u3002 # \u5206\u533a fdisk \/dev\/sda # \u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u533a Command (m for help):n Partition number (1-128,default 1): First sector (34-209715166,default 2048): Last sector,+\/-sectors or +\/-sizefK,M,G,T,P}(2048-209715166,default 209713151):+512m Created a new partition 1 of type &#39;Linux filesystem&#39;and of size 512 MiB."},{"title":"\u4eceDocker-Desktop\u8fc1\u79fb\u5230wsl2","link":"https:\/\/chance.fyi\/post\/docker\/from-docker-desktop-to-wsl2\/","pubDate":"Fri, 02 Jun 2023 09:18:44 +0800","guid":"https:\/\/chance.fyi\/post\/docker\/from-docker-desktop-to-wsl2\/","description":"\u6700\u8fd1\u66f4\u65b0\u5347\u7ea7\u4e86\u6700\u65b0\u7248\u672c\u7684 Docker Desktop 4.20.0 \uff0c\u7136\u540e\u53d1\u73b0\u4e86\u4e00\u4e2a bug #13524\uff0c\u7136\u540e\u964d\u7ea7\u4e00\u4e2a\u7248\u672c\u4e4b\u540e\u53c8\u53d1\u73b0\u4e86\u53e6\u4e00\u4e2a bug #13477\u3002\u51b3\u5b9a\u5bfb\u627e\u66ff\u4ee3\u54c1\uff0c\u5c1d\u8bd5\u4e86 Podman Desktop \u4e4b\u540e\u653e\u5f03\u4e86\uff0c\u6700\u7ec8\u51b3\u5b9a\u76f4\u63a5\u4f7f\u7528 wsl2\u3002\u8bb0\u5f55\u4e00\u4e0b\u8fc1\u79fb\u4ee5\u53ca\u8e29\u5751\u8fc7\u7a0b\u3002\nWSL \u9047\u5230\u7684\u65e0\u6cd5\u89e3\u51b3\u7684\u95ee\u9898 microsoft\/WSL#5118 \u5bfc\u81f4\u65e0\u6cd5\u4f7f\u7528 pnpm\uff0c\u53ea\u80fd\u4f7f\u7528 yarn\u3001npm \u66ff\u4ee3\u3002 \u4fee\u6539\u6e90 \u4f7f\u7528\u4e2d\u79d1\u5927\u7684\u8f6f\u4ef6\u6e90 https:\/\/mirrors.ustc.edu.cn\/\n# \u5907\u4efd\u6e90\u6587\u4ef6 $ sudo mv \/etc\/apt\/sources.list \/etc\/apt\/sources.list.backup # \u5207\u6362 root \u7528\u6237 $ sudo su # \u5199\u5165\u4e2d\u79d1\u5927\u7684\u6e90 $ echo &#34;deb https:\/\/mirrors.ustc.edu.cn\/ubuntu\/ jammy main restricted universe multiverse deb-src https:\/\/mirrors.ustc.edu.cn\/ubuntu\/ jammy main restricted universe multiverse deb https:\/\/mirrors.ustc.edu.cn\/ubuntu\/ jammy-security main restricted universe multiverse deb-src https:\/\/mirrors.ustc.edu.cn\/ubuntu\/ jammy-security main restricted universe multiverse deb https:\/\/mirrors."},{"title":"Xdebug\u4f7f\u7528Dbgp\u534f\u8bae\u4e0ePHPStorm\u901a\u4fe1\u8fc7\u7a0b","link":"https:\/\/chance.fyi\/post\/php\/dbgp\/","pubDate":"Wed, 29 Mar 2023 09:40:02 +0800","guid":"https:\/\/chance.fyi\/post\/php\/dbgp\/","description":"\u5411 IDE \u53d1\u8d77\u8fde\u63a5\u8bf7\u6c42 &lt;?xml version=&#34;1.0&#34; encoding=&#34;ISO-8859-1&#34;?&gt; &lt;init appid=&#34;1&#34; idekey=&#34;PHPSTORM&#34; language=&#34;PHP&#34; protocol_version=&#34;1.0&#34; fileuri=&#34;&#34; xmlns=&#34;urn:debugger_protocol_v1&#34;&gt; &lt;engine version=&#34;1.0.0&#34;&gt; &lt;![CDATA[SDB]]&gt; &lt;\/engine&gt; &lt;author&gt; &lt;![CDATA[Chance]]&gt; &lt;\/author&gt; &lt;\/init&gt; feature_set -i 1 -n show_hidden -v 1 feature_set\uff1a\u547d\u4ee4\u540d\u79f0\uff0c\u7528\u4e8e\u8bbe\u7f6e\u8c03\u8bd5\u5668\u7684\u529f\u80fd\u3002 -i 1\uff1a\u547d\u4ee4\u7684\u552f\u4e00\u6807\u8bc6\u7b26\uff0c\u7528\u4e8e\u5728\u8c03\u8bd5\u5668\u548c IDE \u4e4b\u95f4\u8fdb\u884c\u901a\u4fe1\u3002 -n show_hidden\uff1a\u8981\u8bbe\u7f6e\u7684\u529f\u80fd\u540d\u79f0\uff0c\u5373\u663e\u793a\u9690\u85cf\u53d8\u91cf\u3002 -v 1\uff1a\u529f\u80fd\u7684\u503c\uff0c\u8868\u793a\u8981\u663e\u793a\u9690\u85cf\u53d8\u91cf\u3002 \u56de\u590d\uff1a &lt;?xml version=&#34;1.0&#34; encoding=&#34;ISO-8859-1&#34;?&gt; &lt;response xmlns=&#34;urn:debugger_protocol_v1&#34; command=&#34;feature_set&#34; transaction_id=&#34;1&#34; feature=&#34;show_hidden&#34; success=&#34;1&#34;\/&gt; stdout -i 8 -c 1 stdout\uff1a\u547d\u4ee4\u540d\u79f0\uff0c\u7528\u4e8e\u5c06\u8f93\u51fa\u53d1\u9001\u5230\u8c03\u8bd5\u5668\u7684\u63a7\u5236\u53f0\u3002 -i 8\uff1a\u547d\u4ee4\u7684\u552f\u4e00\u6807\u8bc6\u7b26\uff0c\u7528\u4e8e\u5728\u8c03\u8bd5\u5668\u548c IDE \u4e4b\u95f4\u8fdb\u884c\u901a\u4fe1\u3002 -c 1\uff1a\u8f93\u51fa\u7684\u5185\u5bb9\u7c7b\u578b\uff0c\u8868\u793a\u8f93\u51fa\u7684\u662f\u6587\u672c\u5185\u5bb9\u3002 \u56de\u590d\uff1a &lt;?xml version=&#34;1.0&#34; encoding=&#34;ISO-8859-1&#34;?&gt; &lt;response xmlns=&#34;urn:debugger_protocol_v1&#34; command=&#34;stdout&#34; transaction_id=&#34;8&#34; success=&#34;1&#34;\/&gt; status -i 9 status\uff1a\u547d\u4ee4\u540d\u79f0\uff0c\u7528\u4e8e\u67e5\u8be2\u8c03\u8bd5\u5668\u7684\u72b6\u6001\u3002 -i 9\uff1a\u547d\u4ee4\u7684\u552f\u4e00\u6807\u8bc6\u7b26\uff0c\u7528\u4e8e\u5728\u8c03\u8bd5\u5668\u548c IDE \u4e4b\u95f4\u8fdb\u884c\u901a\u4fe1\u3002 \u56de\u590d\uff1a &lt;?"},{"title":"Casbin\u7684Model\u8be6\u89e3\u4e0e\u4f7f\u7528","link":"https:\/\/chance.fyi\/post\/go\/casbin\/","pubDate":"Tue, 25 Oct 2022 16:06:11 +0800","guid":"https:\/\/chance.fyi\/post\/go\/casbin\/","description":"\u7b80\u4ecb \u6587\u6863\uff1ahttps:\/\/casbin.org\/docs\/zh-CN\/overview\nCasbin \u662f\u5e72\u4ec0\u4e48\u7684\u6587\u6863\u8bf4\u7684\u5f88\u8be6\u7ec6\uff0c\u5c31\u4e0d\u5728\u91cd\u590d\u8bf4\u4e86\u3002\u76f8\u4fe1\u5f88\u591a\u4eba\u5728\u770b\u5b8c\u6587\u6863\u4e4b\u540e\uff0c\u4ecd\u7136\u662f\u4e0d\u77e5\u9053 model.conf \u548c policy.csv \u662f\u4ec0\u4e48\uff0c\u770b\u4e0d\u61c2\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u6709\u4e00\u79cd\u65e0\u4ece\u4e0b\u624b\u7684\u611f\u89c9\u3002\n\u77e5\u8bc6\u662f\u6709\u4e00\u4e2a\u77e5\u8bc6\u58c1\u5792\u7684\uff0c\u5728\u4f60\u6253\u7834\u8fd9\u4e2a\u58c1\u5792\u4e4b\u524d\uff0c\u4f60\u89c9\u5f97\u5f88\u96be\uff0c\u67e5\u8d44\u6599\u770b\u6587\u7ae0\u4e5f\u662f\u4e91\u91cc\u96fe\u91cc\u7684\u3002\u4f46\u662f\u5728\u6253\u7834\u58c1\u5792\u4e4b\u540e\uff0c\u638c\u63e1\u4e86\u8fd9\u4e2a\u77e5\u8bc6\u5728\u56de\u5934\u770b\uff0c\u611f\u89c9\u771f\u7684\u597d\u7b80\u5355\u3002\n\u6211\u67e5\u770b\u4e86\u597d\u51e0\u7bc7\u8bb2 Casbin \u7684\u6587\u7ae0\uff0c\u8bb2\u7684\u90fd\u4e0d\u662f\u5f88\u901a\u4fd7\u6613\u61c2\uff0c\u5bf9\u4e8e\u638c\u63e1\u4e86 Casbin \u7684\u4eba\u6765\u770b\u6ca1\u4ec0\u4e48\uff0c\u4f46\u662f\u5bf9\u4e8e\u8fd8\u4e0d\u4f1a\u7684\u4eba\u770b\u4e86\u8fd8\u662f\u6709\u4e9b\u4e91\u91cc\u96fe\u91cc\u3002\u6240\u4ee5\u6211\u653e\u5f03\u4e86\u53bb\u641c\u7d22\u67e5\u770b\u522b\u4eba\u7684\u7ecf\u9a8c\uff0c\u8f6c\u800c\u53bb\u8bfb\u5b98\u65b9\u6587\u6863\uff0c\u5728\u53cd\u53cd\u590d\u590d\u8bfb\u4e86\u51e0\u904d\u6587\u6863\u4e4b\u540e\u7ec8\u4e8e\u638c\u63e1\u4e86 Casbin\u3002\u4e0d\u5f97\u4e0d\u8bf4\u5728\u53bb\u5b66\u4e60\u4e00\u4e2a\u65b0\u4e1c\u897f\u7684\u65f6\u5019\uff0c\u6700\u597d\u7684\u529e\u6cd5\u5c31\u662f\u53bb\u67e5\u770b\u5b98\u65b9\u6587\u6863\u3002\u63a5\u4e0b\u6765\u6211\u4f1a\u4ee5\u4e0d\u4f1a Casbin \u7684\u4eba\u7684\u89d2\u5ea6\u6765\u5c3d\u53ef\u80fd\u901a\u4fd7\u6613\u61c2\u7684\u8bb2\u4e00\u8bb2 Casbin\u3002\nModel \u4e0e Policy \u63a5\u4e0b\u6765\u6211\u4eec\u4ee5 Linux \u7684\u6587\u4ef6\u7cfb\u7edf\u6743\u9650\u4e3a\u4f8b\u6765\u8bb2\u89e3 model.conf \u548c policy.csv \u3002\n\u8bed\u6cd5 \u6587\u6863\uff1ahttps:\/\/casbin.org\/docs\/zh-CN\/syntax-for-models\nRequest \u5b9a\u4e49 \u4e0d\u7ba1\u54ea\u4e2a\u8bed\u8a00\u7684 Casbin \u90fd\u4f1a\u63d0\u4f9b\u4e00\u4e2a enforce \u51fd\u6570\u65b9\u6cd5\u6765\u6821\u9a8c\u662f\u5426\u6709\u6743\u9650\uff0c[request_definition] \u90e8\u5206\u5c31\u5b9a\u4e49\u4e86 enforce \u51fd\u6570\u7684\u53c2\u6570\u3002\n[request_definition] r = sub, obj, act sub, obj, act \u7ecf\u5178\u4e09\u5143\u7ec4: \u8bbf\u95ee\u5b9e\u4f53 (Subject)\uff0c\u8bbf\u95ee\u8d44\u6e90 (Object) \u548c\u8bbf\u95ee\u65b9\u6cd5 (Action)\uff0c\u662f\u53ef\u4ee5\u81ea\u5b9a\u4e49\u7684\u3002\u8868\u793a enforce \u51fd\u6570\u9700\u8981\u6309\u6b64\u987a\u5e8f\u4f20\u5165\u4e09\u4e2a\u53c2\u6570\u3002\n\u5728 Linux \u6587\u4ef6\u7cfb\u7edf\u4e2d\uff1a\nsub\uff1a\u4ee3\u8868\u7528\u6237 obj\uff1a\u4ee3\u8868\u8bbf\u95ee\u7684\u6587\u4ef6\u6216\u6587\u4ef6\u5939 act\uff1a\u4ee3\u8868\u8bfb\u3001\u5199\u6216\u6267\u884c\u6743\u9650 \u5728 RESTful \u98ce\u683c\u7684 API \u4e2d\uff1a\nsub\uff1a\u4ee3\u8868\u8bf7\u6c42\u7528\u6237 obj\uff1a\u4ee3\u8868\u8bf7\u6c42\u8def\u7531 \u4f8b\u5982\uff1a\/api\/user act\uff1a\u4ee3\u8868\u8bf7\u6c42\u65b9\u6cd5 GET\u3001POST\u3001PUT\u3001DELETE Policy \u5b9a\u4e49 [policy_definition] \u90e8\u5206\u662f\u5bf9 policy \u7684\u5b9a\u4e49\uff0c\u5bf9\u7b56\u7565\u6743\u9650\u7684\u89c4\u5219\u5b9a\u4e49\uff0c\u53ef\u4ee5\u81ea\u5b9a\u4e49\u591a\u4e2a\u89c4\u5219\u3002"},{"title":"\u591a\u4e2adocker-compose\u9879\u76ee\u4e4b\u95f4\u901a\u4fe1\u4e0e\u73af\u5883\u67b6\u6784","link":"https:\/\/chance.fyi\/post\/docker\/multiple-docker-compose-communication\/","pubDate":"Sat, 25 Jun 2022 20:44:54 +0800","guid":"https:\/\/chance.fyi\/post\/docker\/multiple-docker-compose-communication\/","description":"\u5728\u8bb2\u591a\u4e2a docker-compose \u9879\u76ee\u4e4b\u95f4\u901a\u4fe1\u4e4b\u524d\uff0c\u60f3\u8981\u5148\u8bf4\u4e00\u8bf4\u6211\u4ece\u521a\u4f7f\u7528 Docker \u5230\u76ee\u524d\u4e3a\u6b62\u9047\u5230\u7684\u4e00\u4e9b\u95ee\u9898\u4e0e\u60f3\u6cd5\u3002\n\u5728\u521a\u5b66\u4e60 Docker \u7684\u65f6\u5019\uff0c\u6211\u76f8\u4fe1\u5f88\u591a\u4eba\u90fd\u8ddf\u6211\u4e00\u6837\u6709\u8fc7\u8fd9\u79cd\u60f3\u6cd5\uff1a\u6211\u4eec\u7684\u4ee3\u7801\u8fd0\u884c\u73af\u5883\u3001MySQL\u3001Redis \u7b49\u670d\u52a1\u662f\u653e\u5230\u4e00\u4e2a\u5bb9\u5668\u91cc\u9762\u5462\uff0c\u8fd8\u662f\u653e\u5230\u591a\u4e2a\u5bb9\u5668\u91cc\u9762\u5462\uff1f\u7ecf\u8fc7\u4e00\u756a\u5b66\u4e60\u77e5\u9053\uff0cDocker \u5b98\u65b9\u662f\u63a8\u8350\u5c06\u8fd9\u4e9b\u73af\u5883\u653e\u7f6e\u5230\u591a\u4e2a\u5bb9\u5668\u4e2d\u7684\uff0c\u81f3\u4e8e\u4e3a\u4ec0\u4e48\u5c31\u4e0d\u8be6\u7ec6\u8bf4\u4e86\uff0c\u53ef\u4ee5\u81ea\u884c\u767e\u5ea6\u5b66\u4e60\u4e00\u4e0b\u3002\n\u5bb9\u5668\u901a\u4fe1 \u4f46\u662f\u5f53\u653e\u5230\u591a\u4e2a\u5bb9\u5668\u4e2d\uff0c\u53c8\u4f1a\u51fa\u73b0\u4e00\u4e2a\u95ee\u9898\uff0c\u6211\u7684 API \u670d\u52a1\u8be5\u600e\u4e48\u8bbf\u95ee MySQL\u3001Redis \u5462\uff1f\u6709\u4e09\u79cd\u529e\u6cd5\u53ef\u4ee5\u89e3\u51b3\u3002\n\u901a\u8fc7\u5bb9\u5668\u5185 ip + \u6620\u5c04\u51fa\u7684\u7aef\u53e3\u8fdb\u884c\u8bbf\u95ee\uff08\u4e0d\u63a8\u8350\uff09 \u901a\u8fc7 --link \u94fe\u63a5\u53e6\u4e00\u4e2a\u5bb9\u5668\u8bbf\u95ee(\u4e0d\u63a8\u8350) --link \u53ea\u80fd\u5728 docker run \u4e00\u4e2a\u5bb9\u5668\u65f6\u94fe\u63a5\u53e6\u4e00\u4e2a\u5df2\u8fd0\u884c\u7684\u5bb9\u5668\uff0c\u6240\u4ee5\u8bf4\u8be5\u65b9\u6cd5\u53ea\u80fd\u5355\u5411\u8bbf\u95ee\u3002 \u901a\u8fc7 network \u5c06\u4e24\u4e2a\u5bb9\u5668\u94fe\u63a5\u5230\u540c\u4e00\u4e2a network \u4e2d\u53ef\u4ee5\u8fdb\u884c\u53cc\u5411\u8bbf\u95ee docker-compose \u8fd9\u4e48\u770b\u6765\u7b2c\u4e09\u79cd\u65b9\u5f0f\u662f\u6700\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4f46\u662f\u5f53\u6211\u4eec\u5bb9\u5668\u8d8a\u6765\u8d8a\u591a\u65f6\uff0c\u9700\u8981\u8bb0\u4f4f\u6240\u6709\u5bb9\u5668\u7684 run \u6307\u4ee4\uff0c\u5c06\u4e00\u4e2a\u4e2a\u7684\u5bb9\u5668 run \u8d77\u6765\uff0c\u7136\u540e\u94fe\u63a5\u5230\u540c\u4e00\u4e2a network \u4e2d\u53bb\uff0c\u64cd\u4f5c\u8d77\u6765\u975e\u5e38\u7684\u9ebb\u70e6\u3002\u6240\u4ee5\u6211\u66f4\u63a8\u8350\u4f7f\u7528 docker-compose \u6765\u7f16\u6392\u7ba1\u7406\u591a\u4e2a\u5bb9\u5668\u3002\u4e0b\u9762\u6765\u7f16\u5199\u4e00\u4e2a docker-compose.yml \u6587\u4ef6\u6f14\u793a\u4e00\u4e0b\u3002\n\u7f16\u5199\u63a5\u53e3 \u56e0\u4e3a\u6211\u4eec\u53ea\u662f\u6765\u6f14\u793a\u4e00\u4e0b\u5bb9\u5668\u4e4b\u95f4\u7684\u901a\u4fe1\uff0c\u4f7f\u7528 MySQL\u3001Nginx \u7b49\u5bb9\u5668\u53cd\u800c\u66f4\u52a0\u7684\u9ebb\u70e6\uff0c\u6240\u4ee5\u6211\u4eec\u4f7f\u7528 Golang \u7b80\u5355\u5199\u4e00\u4e2a\u63a5\u53e3\u7528\u6765\u6784\u5efa\u4e00\u4e2a\u6f14\u793a\u7684\u955c\u50cf\u3002\npackage main import ( &#34;flag&#34; &#34;github.com\/gin-gonic\/gin&#34; ) func main() { name := flag.String(&#34;name&#34;, &#34;&#34;, &#34;&#34;) flag.Parse() r := gin.Default() r."},{"title":"PHP\u767e\u4e07\u6570\u636e\u5bfc\u51faExcel","link":"https:\/\/chance.fyi\/post\/php\/massive_data_export\/","pubDate":"Thu, 19 May 2022 19:43:58 +0800","guid":"https:\/\/chance.fyi\/post\/php\/massive_data_export\/","description":"\u80cc\u666f \u516c\u53f8\u4e1a\u52a1\u90e8\u95e8\u7ecf\u5e38\u4f1a\u9700\u8981\u5bfc\u51fa\u5404\u79cd\u6570\u636e\u8fdb\u884c\u5206\u6790\uff0c\u56e0\u4e3a\u9700\u8981\u7684\u6570\u636e\u6a21\u677f\u591a\u53d8\uff0c\u4ea7\u54c1\u4e00\u76f4\u6ca1\u6709\u5c06\u5176\u89c4\u5212\u6210\u7cfb\u7edf\u529f\u80fd\uff0c\u6bcf\u6b21\u9700\u8981\u7684\u6570\u636e\u90fd\u662f\u624b\u5199 SQL \u8bed\u53e5\u8fdb\u884c\u5bfc\u51fa\u3002\u5728\u5199\u4e86\u4e0a\u4e07\u884c SQL \u8bed\u53e5\u4ee5\u540e\uff0c\u6211\u5bf9\u8fd9\u79cd\u4f53\u529b\u52b3\u52a8\u611f\u89c9\u5230\u4e86\u538c\u70e6\uff0c\u4e8e\u662f\u548c\u9886\u5bfc\u7533\u8bf7\uff0c\u81ea\u5df1\u5229\u7528\u7a7a\u95f2\u65f6\u95f4\u89c4\u5212\u5f00\u53d1\u4e86\u4e00\u4e2a\u7075\u6d3b\u914d\u7f6e\u3001\u9002\u7528\u6027\u5f3a\u7684\u5bfc\u8868\u7cfb\u7edf\u3002\n\u4f7f\u7528\u6280\u672f API \u6846\u67b6 Hyperf Web \u6846\u67b6 Ant Design Pro Excel \u6269\u5c55 xlsWriter \u4f18\u5316 \u4e3a\u4e86\u5c3d\u5feb\u5b9e\u73b0\u529f\u80fd\uff0c\u5bfc\u51fa Excel \u529f\u80fd\u662f\u505a\u7684\u540c\u6b65\u5bfc\u51fa\uff0c\u4f46\u5728\u6211\u7684\u8bbe\u8ba1\u4e2d\u5e94\u8be5\u662f\u5f02\u6b65\u5bfc\u51fa\uff0c\u56e0\u6b64\u5728\u540e\u7eed\u7684\u4f18\u5316\u4e2d\u5f15\u5165\u4e86 RabbitMQ \u6d88\u606f\u961f\u5217\u5b9e\u73b0\u5f02\u6b65\u5bfc\u51fa\u529f\u80fd\u3002\n\u56e0\u4e3a\u4e0d\u80fd\u5c06 Db \u5bf9\u8c61\u6295\u9012\u5230\u6d88\u606f\u961f\u5217\u4e2d\uff0c\u6240\u4ee5\u6295\u9012\u8fc7\u53bb\u7684\u662f SQL \u7684\u9884\u5904\u7406\u8bed\u53e5\u4ee5\u53ca\u5bf9\u5e94\u7684\u53d8\u91cf\uff0c\u4f7f\u7528Db::select($sql, $bindings);\u6267\u884c SQL \u3002\u7136\u540e\u5c1d\u8bd5\u67e5\u8be2\u767e\u4e07\u6761\u6570\u636e\uff0c\u76f4\u63a5\u5c31\u5185\u5b58\u6ea2\u51fa\u4e86\u3002\nvendor\/hyperf\/database\/src\/Connection.php 271 \u884c\n\/** * Run a select statement against the database. *\/ public function select(string $query, array $bindings = [], bool $useReadPdo = true): array { return $this-&gt;run($query, $bindings, function ($query, $bindings) use ($useReadPdo) { if ($this-&gt;pretending()) { return []; } \/\/ For select statements, we&#39;ll simply execute the query and return an array \/\/ of the database result set."},{"title":"Docker\u4e2d\u4f7f\u7528MySQL\u8e29\u5751","link":"https:\/\/chance.fyi\/post\/docker\/mysql-image-use-problem\/","pubDate":"Fri, 08 Apr 2022 11:26:24 +0800","guid":"https:\/\/chance.fyi\/post\/docker\/mysql-image-use-problem\/","description":"\u9700\u8981\u4f7f\u7528\u5230 MySQL \uff0c\u6253\u7b97\u4f7f\u7528 Docker \u6765\u90e8\u7f72\uff0ccompose \u6765\u7ba1\u7406\u3002\u539f\u4ee5\u4e3a\u5f88\u7b80\u5355\uff0c\u6ca1\u60f3\u5230\u8fd8\u662f\u6709\u4e9b\u5751\u7684\u3002\nversion: &#34;3.7&#34; services: mysql: image: mysql:8.0-oracle container_name: mysql ports: - &#34;3306:3306&#34; restart: always environment: # \u5bc6\u7801 MYSQL_ROOT_PASSWORD: &#34;root&#34; # \u521b\u5efa\u9ed8\u8ba4\u6570\u636e\u5e93\u540d MYSQL_DATABASE: &#34;test&#34; \u4e0a\u9762\u7684\u5199\u6cd5\u5c31\u53ef\u4ee5\u542f\u52a8\u4e00\u4e2a MySQL \u670d\u52a1\u4e86\uff0c\u5f88\u7b80\u5355\u3002\u4f46\u662f\u5982\u679c\u91cd\u65b0\u6784\u5efa\u7684\u8bdd\uff0c\u6570\u636e\u5c31\u4f1a\u4e22\u5931\u4e86\uff0c\u89e3\u51b3\u529e\u6cd5\u4e5f\u5f88\u7b80\u5355\uff0c\u6302\u8f7d\u4e00\u4e0b\u6570\u636e\u76ee\u5f55\u3002\nversion: &#34;3.7&#34; services: mysql: image: mysql:8.0-oracle container_name: mysql ports: - &#34;3306:3306&#34; volumes: - .\/data\/mysql:\/var\/lib\/mysql restart: always environment: MYSQL_ROOT_PASSWORD: &#34;root&#34; MYSQL_DATABASE: &#34;test&#34; \u5f88\u597d\uff0cMySQL \u7684\u6570\u636e\u5df2\u7ecf\u6302\u8f7d\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5f53\u91cd\u542f MySQL \u5bb9\u5668\u7684\u65f6\u5019\u53d1\u73b0\u91cd\u542f\u4e0d\u4e86\u4e86\uff0c\u62a5\u9519\u5982\u4e0b\u3002\n[Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.28-1.el8 started. chown: cannot dereference &#39;\/var\/lib\/mysql\/mysql.sock&#39;: No such file or directory \u6839\u636e\u62a5\u9519\u4fe1\u606f\u662f\u627e\u4e0d\u5230\u6302\u8f7d\u76ee\u5f55\u4e0b\u7684\u6587\u4ef6\uff0c\u731c\u6d4b\u662f\u6743\u9650\u539f\u56e0\u5f15\u8d77\u7684\uff0c\u52a0\u4e2a\u6743\u9650\u8bd5\u4e00\u8bd5\u3002"},{"title":"Go\u6807\u51c6\u5e93time.Parse\u65b9\u6cd5\u7684\u65f6\u533a\u95ee\u9898","link":"https:\/\/chance.fyi\/post\/go\/time-parse\/","pubDate":"Wed, 30 Mar 2022 13:37:03 +0800","guid":"https:\/\/chance.fyi\/post\/go\/time-parse\/","description":"time.Parse\u65b9\u6cd5\u89e3\u6790\u65f6\u95f4\u5b57\u7b26\u4e32\u5f97\u5230\u7684 time \u7684\u65f6\u533a\u4e3aUTC\uff0c\u5e76\u4e0d\u4f1a\u81ea\u52a8\u4f7f\u7528\u7cfb\u7edf\u7684\u9ed8\u8ba4\u65f6\u533a\u3002\nparse, _ := time.Parse(&#34;2006-01-02 15:04:05&#34;, &#34;2022-03-30 13:37:03&#34;) \/\/UTC 0 fmt.Println(parse.Zone()) \/\/CST 28800 fmt.Println(time.Now().Zone()) \u5982\u679c\u6211\u4eec\u4e0d\u60f3\u8981UTC\u65f6\u533a\uff0c\u9700\u8981\u522b\u7684\u65f6\u533a\u3002\u53ef\u4ee5\u4f7f\u7528time.ParseInLocation\u65b9\u6cd5\u81ea\u884c\u8bbe\u7f6e\u65f6\u533a\u3002\nloc, _ := time.LoadLocation(&#34;Asia\/Shanghai&#34;) parse, _ := time.ParseInLocation(&#34;2006-01-02 15:04:05&#34;, &#34;2022-03-30 13:37:03&#34;, loc) \/\/CST 28800 fmt.Println(parse.Zone()) \/\/CST 28800 fmt.Println(time.Now().Zone()) "},{"title":"alpine\u955c\u50cf\u8bbe\u7f6e\u65f6\u533a","link":"https:\/\/chance.fyi\/post\/docker\/alpine-set-time-zone\/","pubDate":"Tue, 29 Mar 2022 14:53:01 +0800","guid":"https:\/\/chance.fyi\/post\/docker\/alpine-set-time-zone\/","description":"FROM alpine ENV TZ=Asia\/Shanghai RUN echo &#39;http:\/\/mirrors.aliyun.com\/alpine\/v3.4\/main\/&#39; &gt; \/etc\/apk\/repositories \\ &amp;&amp; apk --no-cache add tzdata zeromq \\ &amp;&amp; ln -snf \/usr\/share\/zoneinfo\/$TZ \/etc\/localtime \\ &amp;&amp; echo &#39;$TZ&#39; &gt; \/etc\/timezone "},{"title":"\u6784\u5efa\u81ea\u5df1\u7684go-gin-api\u811a\u624b\u67b6(\u4e09)","link":"https:\/\/chance.fyi\/post\/go\/gin-api\/03-config\/","pubDate":"Sun, 27 Feb 2022 09:34:23 +0800","guid":"https:\/\/chance.fyi\/post\/go\/gin-api\/03-config\/","description":"Viper \u5730\u5740\uff1ahttps:\/\/github.com\/spf13\/viper Viper \u662f\u9002\u7528\u4e8e Go \u5e94\u7528\u7a0b\u5e8f\u7684\u5b8c\u6574\u914d\u7f6e\u89e3\u51b3\u65b9\u6848\u3002\u5b83\u88ab\u8bbe\u8ba1\u7528\u4e8e\u5728\u5e94\u7528\u7a0b\u5e8f\u4e2d\u5de5\u4f5c\uff0c\u5e76\u4e14\u53ef\u4ee5\u5904\u7406\u6240\u6709\u7c7b\u578b\u7684\u914d\u7f6e\u9700\u6c42\u548c\u683c\u5f0f\u3002\n\u6587\u6863 \u82f1\u6587\uff1a\u53ef\u67e5\u770b Github \u4ed3\u5e93\u7684 README \u6587\u4ef6 \u4e2d\u6587\uff1a\u53ef\u67e5\u770b\u8fd9\u7bc7\u6587\u7ae0\u7684\u7ffb\u8bd1 \u5b89\u88c5 go get github.com\/spf13\/viper \u4f7f\u7528 \u65b0\u5efa\u914d\u7f6e\u6587\u4ef6\/config\/config.toml\naaa = &#34;111&#34; bbb = &#34;222&#34; Viper \u53ea\u9700\u7b80\u5355\u8bbe\u7f6e\u5c31\u53ef\u4ee5\u8bfb\u53d6\u5230\u914d\u7f6e\u4fe1\u606f\u3002\n\/\/\u8bbe\u7f6e\u6587\u4ef6\u8def\u5f84 viper.AddConfigPath(&#34;\/config&#34;) \/\/\u8bbe\u7f6e\u6587\u4ef6\u540d viper.SetConfigName(&#34;config&#34;) \/\/\u8bbe\u7f6e\u6587\u4ef6\u7c7b\u578b viper.SetConfigType(&#34;toml&#34;) \/\/\u8bfb\u53d6\u914d\u7f6e\u6587\u4ef6 _ = viper.ReadInConfig() \/\/\u76d1\u63a7\u914d\u7f6e\u6587\u4ef6\u53d8\u52a8 viper.WatchConfig() for { \/\/\u8f93\u51fa\u6240\u6709\u914d\u7f6e fmt.Println(viper.AllSettings()) time.Sleep(time.Second) } \u591a\u914d\u7f6e\u6587\u4ef6 \u968f\u7740\u9879\u76ee\u5f00\u53d1\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u4fe1\u606f\u53ef\u80fd\u4f1a\u8d8a\u6765\u8d8a\u591a\uff0c\u5168\u90e8\u96c6\u4e2d\u5230\u4e00\u4e2a\u6587\u4ef6\u4e2d\u4f1a\u53d8\u7684\u96be\u4ee5\u7ba1\u7406\u3002\u6309\u529f\u80fd\u5206\u4e3a\u4e0d\u540c\u7684\u914d\u7f6e\u6587\u4ef6\u66f4\u6613\u4e8e\u7ba1\u7406\uff0c\u6211\u4eec\u6765\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u591a\u914d\u7f6e\u6587\u4ef6\u7684\u65b9\u6cd5\u3002\n\u65b9\u6cd5\u4e00 \u4f7f\u7528MergeInConfig()\u65b9\u6cd5\u5c06\u591a\u4e2a\u914d\u7f6e\u6587\u4ef6\u5185\u5bb9\u5408\u5e76\u5230\u4e00\u8d77\u3002\n\u5728\u65b0\u5efa\u4e00\u4e2a\/config\/router.toml\u914d\u7f6e\u6587\u4ef6\nport = 8000 \/\/\u8bbe\u7f6e\u6587\u4ef6\u8def\u5f84 viper.AddConfigPath(&#34;\/config&#34;) \/\/\u8bbe\u7f6e\u6587\u4ef6\u540d viper.SetConfigName(&#34;config&#34;) \/\/\u8bbe\u7f6e\u6587\u4ef6\u7c7b\u578b viper.SetConfigType(&#34;toml&#34;) \/\/\u8bfb\u53d6\u914d\u7f6e\u6587\u4ef6 _ = viper.ReadInConfig() \/\/\u8bbe\u7f6e\u7b2c\u4e8c\u4e2a\u914d\u7f6e\u6587\u4ef6\u540d\u79f0 viper.SetConfigName(&#34;router&#34;) \/\/\u8bfb\u53d6\u5e76\u5408\u5e76\u5df2\u6709\u914d\u7f6e _ = viper.MergeInConfig() \/\/\u8f93\u51fa\u6240\u6709\u914d\u7f6e fmt."},{"title":"Dockerfile\u7f16\u5199\u6ce8\u610f\u4e8b\u9879\u4e0e\u6280\u5de7","link":"https:\/\/chance.fyi\/post\/docker\/dockerfile-matters-needing-attention\/","pubDate":"Wed, 26 Jan 2022 09:08:11 +0800","guid":"https:\/\/chance.fyi\/post\/docker\/dockerfile-matters-needing-attention\/","description":"1\u3001\u591a\u6761\u6307\u4ee4\u5e94\u6362\u884c ... RUN apt-get clean apt-get update ... \u591a\u6761\u6307\u4ee4\u5199\u5728\u4e00\u884c\u4f1a\u5f53\u505a\u4e00\u6761\u6307\u4ee4\u6267\u884c\uff0c\u6709\u53ef\u80fd\u540e\u9762\u7684\u6307\u4ee4\u4e0d\u6267\u884c\u6216\u8005\u62a5\u9519\u3002\n\u5e94\u6539\u4e3a\uff1a\n... RUN apt-get clean \\ &amp;&amp; apt-get update ... 2\u3001\u5ffd\u7565\u9519\u8bef\u7ee7\u7eed\u8fd0\u884c \u6211\u4eec\u5728\u4f7f\u7528apt-get\u5b89\u88c5\u4e00\u4e2a\u5305\u65f6\uff0c\u5e38\u5e38\u4f1a\u56e0\u4e3a\u7f3a\u5c11\u4f9d\u8d56\u800c\u5b89\u88c5\u5931\u8d25\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528apt-get install -y -f --fix-missing\u547d\u4ee4\u6765\u5b89\u88c5\u4e0a\u4e00\u6b21\u5b89\u88c5\u5931\u8d25\u6240\u9700\u8981\u7684\u4f9d\u8d56\u5305\uff0c\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684\u7ba1\u7406\u6240\u4ee5\u4f9d\u8d56\uff0c\u800c\u4e0d\u7528\u6211\u4eec\u624b\u52a8\u6309\u7167\u4f9d\u8d56\u987a\u5e8f\u628a\u6240\u6709\u4f9d\u8d56\u5305\u5b89\u88c5\u4e00\u904d\uff0c\u4f46\u662f\u5fc5\u987b\u5728\u5b89\u88c5\u5931\u8d25\u540e\u6267\u884c\u3002Dockerfile \u5728\u6784\u5efa\u8fc7\u7a0b\u4e2d\u5982\u679c\u51fa\u73b0\u62a5\u9519\u4f1a\u7acb\u5373\u9000\u51fa\u6784\u5efa\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u903b\u8f91\u6216||\u6765\u5ffd\u7565\u9519\u8bef\u7ee7\u7eed\u6267\u884c\u540e\u9762\u7684\u8bed\u53e5\u3002\n... # \u4e0b\u8f7dChrome\u5b89\u88c5\u5305 RUN wget -P \/tmp https:\/\/dl.google.com\/linux\/direct\/google-chrome-stable_current_amd64.deb \\ # \u5b89\u88c5Chrome\u5931\u8d25 &amp;&amp; dpkg -i \/tmp\/google-chrome-stable_current_amd64.deb \\ # \u5b89\u88c5Chrome\u7684\u4f9d\u8d56 &amp;&amp; apt-get install -y -f --fix-missing \\ # \u518d\u6b21\u5b89\u88c5Chrome &amp;&amp; dpkg -i \/tmp\/google-chrome-stable_current_amd64.deb ... \u4e0a\u9762\u7684\u5199\u6cd5\u5728 Chrome \u5b89\u88c5\u5931\u8d25\u65f6\u6784\u5efa\u4f1a\u9000\u51fa\uff0c\u6539\u4e3a\u4e0b\u9762\u7684\u5199\u6cd5\u5c31\u53ef\u4ee5\u6210\u529f\u6784\u5efa\u4e86\u3002\n... # \u4e0b\u8f7dChrome\u5b89\u88c5\u5305 RUN wget -P \/tmp https:\/\/dl.google.com\/linux\/direct\/google-chrome-stable_current_amd64.deb \\ # \u5b89\u88c5Chrome\u5931\u8d25\u4e4b\u540e\u5b89\u88c5Chrome\u7684\u4f9d\u8d56 &amp;&amp; dpkg -i \/tmp\/google-chrome-stable_current_amd64."},{"title":"IDE\u8fdb\u5165Docker\u5bb9\u5668\u8f93\u51fa\u4e2d\u6587\u4e71\u7801","link":"https:\/\/chance.fyi\/post\/tool\/ide\/docker-terminal-chinese-garbled-code\/","pubDate":"Sat, 22 Jan 2022 10:06:42 +0800","guid":"https:\/\/chance.fyi\/post\/tool\/ide\/docker-terminal-chinese-garbled-code\/","description":"\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u4e2d\u6587\u5b57\u7b26\u8f93\u51fa\u4e3a\u4e71\u7801\u3002\n\u89e3\u51b3 \u5982\u4e0b\u56fe\u6240\u793a\u7f16\u8f91 VM Options \uff0c\u6dfb\u52a0\u4e00\u884c -Dfile.encoding=UTF-8\u5e76\u91cd\u542f IDE \u3002"},{"title":"\u4ece\u96f6\u5b8c\u6210\u4e00\u4e2a\u5e26\u6ed1\u52a8\u9a8c\u8bc1\u7684\u81ea\u52a8\u767b\u9646","link":"https:\/\/chance.fyi\/post\/python\/selenium\/","pubDate":"Fri, 21 Jan 2022 14:02:22 +0800","guid":"https:\/\/chance.fyi\/post\/python\/selenium\/","description":"\u524d\u8a00 \u6700\u8fd1\u5e2e\u5973\u670b\u53cb\u5199\u4e86\u4e00\u4e2a\u76d1\u63a7\u4e5d\u4ef7\u8ba2\u9605\u7684\u5c0f\u7a0b\u5e8f\uff0c\u5bf9\u65b9\u63a5\u53e3\u9700\u8981\u767b\u9646\uff0cToken \u6709\u6548\u65f6\u95f4\u53ea\u6709\u5927\u6982 2 \u4e2a\u5c0f\u65f6\uff0c\u6bcf\u6b21\u90fd\u8981\u624b\u52a8\u53bb\u66f4\u65b0\u767b\u9646\u72b6\u6001\uff0c\u592a\u8fc7\u9ebb\u70e6\u4e86\u3002\u6240\u4ee5\u5c31\u60f3\u8981\u89e3\u51b3\u4e00\u4e0b\u81ea\u52a8\u767b\u9646\u7684\u95ee\u9898\uff0c\u767b\u9646\u6709\u6ed1\u52a8\u9a8c\u8bc1\u7801\uff0c\u67e5\u627e\u4e86\u4e00\u4e9b\u8d44\u6599\u51b3\u5b9a\u4f7f\u7528 Python + Selenium \u6765\u89e3\u51b3\uff0c\u53ef\u60dc\u6211\u4e5f\u4e0d\u4f1a Python \uff0c\u53ea\u80fd\u4e00\u70b9\u70b9\u6478\u7d22\u4e86\uff0c\u987a\u4fbf\u8bb0\u5f55\u4e0b\u6765\u3002\n\u4e86\u89e3 Python \u56e0\u4e3a\u4ee5\u524d\u6ca1\u6709\u4f7f\u7528\u8fc7 Python \uff0c\u6240\u4ee5\u5148\u4e86\u89e3\u4e00\u4e0b Python \u7684\u57fa\u672c\u8bed\u6cd5\u3002\n\u83dc\u9e1f\u6559\u7a0b \u5ed6\u96ea\u5cf0\u7684 Python \u6559\u7a0b \u914d\u7f6e\u73af\u5883 \u4e86\u89e3\u5b8c\u57fa\u7840\u4e4b\u540e\u5148\u5b89\u88c5\u4e00\u4e2a\u73af\u5883\u5427\uff0c\u4e0d\u60f3\u5728\u7535\u8111\u4e0a\u5728\u5b89\u88c5 Python \uff0c\u800c\u4e14\u5b8c\u6210\u4e4b\u540e\u80af\u5b9a\u8981\u90e8\u7f72\u670d\u52a1\u5668\uff0c\u6240\u4ee5\u8fd8\u662f\u4f7f\u7528 Docker \u6765\u7edf\u4e00\u73af\u5883\u3002\n\u5b89\u88c5 Python \u5148\u7b80\u5355\u5199\u4e00\u4e2a docker-compose.yml \u7684\u6587\u4ef6\uff0c\u62c9\u53d6\u4e00\u4e2a Python \u955c\u50cf\u5e76\u521b\u5efa\u5bb9\u5668\u3002\ndocker-compose.yml\nversion: &#34;3.7&#34; services: Python: image: Python volumes: - .:\/home working_dir: \/home tty: true \u4f7f\u7528 PyCharm \u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684\u7ba1\u7406 Docker \uff0c\u8fd0\u884c docker-compose.yml \u5e76\u8fdb\u5165\u5bb9\u5668\u3002\n\u5b89\u88c5 Chrome \u6253\u5f00 Chrome \u5b98\u7f51\uff0c\u6ed1\u52a8\u5230\u6700\u4e0b\u9762\uff0c\u70b9\u51fb\u5176\u4ed6\u5e73\u53f0\uff0c\u7136\u540e\u5728\u5f39\u51fa\u7a97\u53e3\u9009\u62e9 Linux\uff0c\u9009\u62e9\u9002\u7528\u7cfb\u7edf\u7684\u5b89\u88c5\u5305\uff0c\u83b7\u53d6\u4e0b\u8f7d\u94fe\u63a5\uff0c\u7136\u540e\u8fdb\u5165\u5bb9\u5668\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u5b89\u88c5 Chrome \u3002\n# \u66f4\u6362apt\u6e90 $ sed -i s@\/deb.debian.org\/@\/mirrors.aliyun.com\/@g \/etc\/apt\/sources."},{"title":"\u6784\u5efa\u81ea\u5df1\u7684go-gin-api\u811a\u624b\u67b6(\u4e8c)","link":"https:\/\/chance.fyi\/post\/go\/gin-api\/02-testing\/","pubDate":"Tue, 11 Jan 2022 13:41:12 +0800","guid":"https:\/\/chance.fyi\/post\/go\/gin-api\/02-testing\/","description":"\u5728\u524d\u6587\u4e2d\u6211\u4eec\u5df2\u7ecf\u6210\u529f\u7684\u4f7f\u7528 Gin \u6846\u67b6\u642d\u5efa\u4e86\u4e00\u4e2a\u7b80\u6613\u7684 API \u670d\u52a1\uff0c\u4f46\u662f\u5728\u4e00\u4e2a\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u7684\u4e1a\u52a1\u903b\u8f91\u90fd\u5199\u5728 main.go \u4e00\u4e2a\u6587\u4ef6\u4e2d\u663e\u7136\u662f\u4e0d\u5408\u7406\u7684\u3002\u6240\u4ee5\u63a5\u4e0b\u6765\u6211\u4eec\u4f1a\u5bf9\u5176\u8fdb\u884c\u91cd\u6784\uff0c\u5728\u6574\u4e2a\u642d\u5efa go-gin-api \u811a\u624b\u67b6\u7684\u8fc7\u7a0b\u4e2d\uff0c\u4f1a\u7ecf\u5e38\u5bf9\u5176\u91cd\u6784\u3002\n\u6bcf\u5f53\u6211\u8981\u8fdb\u884c\u91cd\u6784\u7684\u65f6\u5019\uff0c\u7b2c\u4e00\u4e2a\u6b65\u9aa4\u6c38\u8fdc\u76f8\u540c\uff1a\u6211\u5f97\u786e\u4fdd\u5373\u5c06\u4fee\u6539\u7684\u4ee3\u7801\u62e5\u6709\u4e00\u7ec4\u53ef\u9760\u7684\u6d4b\u8bd5\u3002\u8fd9\u4e9b\u6d4b\u8bd5\u5fc5\u4e0d\u53ef\u5c11\uff0c\u56e0\u4e3a\u5c3d\u7ba1\u9075\u5faa\u91cd\u6784\u624b\u6cd5\u53ef\u4ee5\u4f7f\u6211\u907f\u514d\u7edd\u5927\u591a\u6570\u5f15\u5165 bug \u7684\u60c5\u5f62\uff0c\u4f46\u6211\u6bd5\u7adf\u662f\u4eba\uff0c\u6bd5\u7adf\u6709\u53ef\u80fd\u72af\u9519\u3002\u7a0b\u5e8f\u8d8a\u5927\uff0c\u6211\u7684\u4fee\u6539\u4e0d\u5c0f\u5fc3\u7834\u574f\u5176\u4ed6\u4ee3\u7801\u7684\u53ef\u80fd\u6027\u5c31\u8d8a\u5927\u2014\u2014\u5728\u6570\u5b57\u65f6\u4ee3\uff0c\u8f6f\u4ef6\u7684\u540d\u5b57\u5c31\u662f\u8106\u5f31\u3002 \u2014\u2014 \u300a\u91cd\u6784\uff1a\u6539\u5584\u65e2\u6709\u4ee3\u7801\u7684\u8bbe\u8ba1\u300b\n\u6240\u4ee5\u5728\u6b64\u4e4b\u524d\u6211\u4eec\u9700\u8981\u7f16\u5199\u4e00\u5957\u53ef\u9760\u7684\u5355\u5143\u6d4b\u8bd5\uff0c\u6765\u786e\u4fdd\u4ee3\u7801\u91cd\u6784\u4e4b\u540e\u8fd8\u80fd\u826f\u597d\u7684\u8fd0\u884c\u3002\nGo \u5355\u5143\u6d4b\u8bd5\u6846\u67b6 testing testing \u662f Go \u6807\u51c6\u5e93\u4e2d\u63d0\u4f9b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u652f\u6301\uff0c\u901a\u8fc7 go test \u547d\u4ee4\uff0c\u80fd\u591f\u81ea\u52a8\u6267\u884c\u5982\u4e0b\u5f62\u5f0f\u7684\u4efb\u4f55\u51fd\u6570\uff1a\nfunc TestXxx(*testing.T) \u6ce8\u610f\uff1aXxx \u53ef\u4ee5\u662f\u4efb\u4f55\u5b57\u6bcd\u6570\u5b57\u5b57\u7b26\u4e32\uff0c\u4f46\u662f\u7b2c\u4e00\u4e2a\u5b57\u6bcd\u4e0d\u80fd\u662f\u5c0f\u5199\u5b57\u6bcd\u3002\n\u5728\u8fd9\u4e9b\u51fd\u6570\u4e2d\uff0c\u4f7f\u7528 Error\u3001Fail \u6216\u76f8\u5173\u65b9\u6cd5\u6765\u53d1\u51fa\u5931\u8d25\u4fe1\u53f7\u3002\n\u8981\u7f16\u5199\u4e00\u4e2a\u65b0\u7684\u6d4b\u8bd5\u5957\u4ef6\uff0c\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u540d\u79f0\u4ee5 _test.go \u7ed3\u5c3e\u7684\u6587\u4ef6\uff0c\u8be5\u6587\u4ef6\u5305\u542b TestXxx \u51fd\u6570\uff0c\u5982\u4e0a\u6240\u8ff0\u3002 \u5c06\u8be5\u6587\u4ef6\u653e\u5728\u4e0e\u88ab\u6d4b\u8bd5\u6587\u4ef6\u76f8\u540c\u7684\u5305\u4e2d\u3002\u8be5\u6587\u4ef6\u5c06\u88ab\u6392\u9664\u5728\u6b63\u5e38\u7684\u7a0b\u5e8f\u5305\u4e4b\u5916\uff0c\u4f46\u5728\u8fd0\u884c go test \u547d\u4ee4\u65f6\u5c06\u88ab\u5305\u542b\u3002 \u6709\u5173\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u8fd0\u884c go help test \u548c go help testflag \u4e86\u89e3\u3002\n\u6807\u51c6\u5e93\u7684 testing \u5b9e\u73b0\u6bd4\u8f83\u7b80\u5355\uff0c\u5e76\u4e0d\u652f\u6301\u65ad\u8a00\uff0c\u9700\u8981\u5199 if \u5224\u65ad\u3002\u6240\u4ee5\u4e0d\u8003\u8651\u4f7f\u7528\u3002\nTestify \u5730\u5740\uff1ahttps:\/\/github.com\/stretchr\/testify Testify \u662f\u57fa\u4e8e testing \u7f16\u5199\u7684\uff0c\u6240\u4ee5\u6d4b\u8bd5\u6587\u4ef6\u4e0e\u6267\u884c\u65b9\u5f0f\u4e0e\u5176\u5b8c\u5168\u76f8\u540c\uff0c\u5e76\u4e14\u652f\u6301\u65ad\u8a00\u65b9\u6cd5\u3002\n\u7f16\u5199\u6d4b\u8bd5 \u9996\u5148\u521b\u5efa\u4e00\u4e2a main_test.go \u7684\u6587\u4ef6\uff0c\u5199\u5165\u4ee5\u4e0b\u4ee3\u7801\u5e76\u6267\u884c go mod tidy\u66f4\u65b0\u4f9d\u8d56\u3002\nmain_test.go\npackage main import ( &#34;github."},{"title":"\u6784\u5efa\u81ea\u5df1\u7684go-gin-api\u811a\u624b\u67b6(\u4e00)","link":"https:\/\/chance.fyi\/post\/go\/gin-api\/01-create-project\/","pubDate":"Mon, 10 Jan 2022 15:37:44 +0800","guid":"https:\/\/chance.fyi\/post\/go\/gin-api\/01-create-project\/","description":"\u76ee\u6807 \u5b66\u4e60\u5e76\u638c\u63e1 Go \u8bed\u8a00 \u5b66\u4e60\u5e76\u719f\u7ec3\u4f7f\u7528 Gin \u6846\u67b6 \u5b66\u4e60\u5e76\u719f\u7ec3\u4f7f\u7528 Go \u70ed\u95e8\u5e38\u7528\u7684\u7ec4\u4ef6 \u642d\u5efa\u4e00\u4e2a\u81ea\u5df1\u5f00\u7bb1\u5373\u7528\u7684 api \u6846\u67b6 \u953b\u70bc\u81ea\u5df1\u7684\u5c01\u88c5\u62bd\u8c61\u80fd\u529b \u521d\u59cb\u5316 \u4f7f\u7528 Goland \u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76eego-gin-api\u3002\n\u53ef\u4ee5\u770b\u5230\u9879\u76ee\u4e2d\u6709\u4e00\u4e2a go.mod \u7684\u6587\u4ef6\u3002\nmodule go-gin-api go 1.17 Gin \u5b89\u88c5 \u4e0b\u8f7d\u5e76\u5b89\u88c5 Gin \uff1a\n$ go get -u github.com\/gin-gonic\/gin go get: added github.com\/gin-contrib\/sse v0.1.0 go get: added github.com\/gin-gonic\/gin v1.7.7 go get: added github.com\/go-playground\/locales v0.13.0 ... \u53ef\u4ee5\u770b\u5230\u9879\u76ee\u4e2d\u53c8\u591a\u4e86\u4e00\u4e2a go.sum \u7684\u6587\u4ef6\uff0cgo.sum \u6587\u4ef6\u8be6\u7ec6\u7f57\u5217\u4e86\u5f53\u524d\u9879\u76ee\u76f4\u63a5\u6216\u95f4\u63a5\u4f9d\u8d56\u7684\u6240\u6709\u6a21\u5757\u7248\u672c\uff0c\u5e76\u5199\u660e\u4e86\u90a3\u4e9b\u6a21\u5757\u7248\u672c\u7684 SHA-256 \u54c8\u5e0c\u503c\u4ee5\u5907 Go \u5728\u4eca\u540e\u7684\u64cd\u4f5c\u4e2d\u4fdd\u8bc1\u9879\u76ee\u6240\u4f9d\u8d56\u7684\u90a3\u4e9b\u6a21\u5757\u7248\u672c\u4e0d\u4f1a\u88ab\u7be1\u6539\u3002\ngo.mod \u6587\u4ef6\u4e5f\u53d1\u751f\u4e86\u6539\u53d8\uff1a\nmodule go-gin-api go 1.17 require ( github.com\/gin-contrib\/sse v0.1.0 \/\/ indirect github."},{"title":"\u7ed9Git\u5386\u53f2\u63d0\u4ea4\u6dfb\u52a0GPG\u7b7e\u540d","link":"https:\/\/chance.fyi\/post\/git\/add-gpg-sign-to-old-commit\/","pubDate":"Thu, 06 Jan 2022 15:26:51 +0800","guid":"https:\/\/chance.fyi\/post\/git\/add-gpg-sign-to-old-commit\/","description":"\u4eca\u5929\u7ed9 commit \u6dfb\u52a0\u4e86 GPG \u7b7e\u540d\uff0c\u4f46\u662f\u4ee5\u524d\u7684\u63d0\u4ea4\u8bb0\u5f55\u5374\u6ca1\u6709\u7b7e\u540d\u3002\n\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\n\u6ce8\u610f\uff1a\u4ee5\u4e0b\u547d\u4ee4\u4f1a\u4fee\u6539\u5386\u53f2\uff0c\u53d8\u66f4 commit id \uff0c\u5176\u4ed6\u4eba\u4f1a\u4e0d\u540c\u6b65\uff0c\u614e\u7528\u3002\n\u5bf9\u5386\u53f2\u6240\u6709\u63d0\u4ea4\u589e\u52a0\u7b7e\u540d\uff1a\ngit filter-branch -f --commit-filter &#39;git commit-tree -S &#34;$@&#34;&#39; HEAD \u5bf9\u6700\u540e X \u6b21\u63d0\u4ea4\u589e\u52a0\u7b7e\u540d\uff1a\ngit filter-branch -f --commit-filter &#39;git commit-tree -S &#34;$@&#34;&#39; HEAD~X..HEAD \u5bf9\u6307\u5b9a\u63d0\u4ea4\u8005 Email \u589e\u52a0\u7b7e\u540d\uff1a\ngit filter-branch -f --commit-filter &#39; if [ &#34;$GIT_COMMITTER_EMAIL&#34; = &#34;885046048@qq.com&#34; ] then git commit-tree -S &#34;$@&#34; fi &#39; \u63a8\u9001\u5230\u8fdc\u7a0b\ngit push -f "},{"title":"\u5982\u4f55\u8bb0\u5f55\u53ef\u8bfb\u6027\u7684\u64cd\u4f5c\u65e5\u5fd7\uff1f","link":"https:\/\/chance.fyi\/post\/php\/operation-log\/","pubDate":"Tue, 04 Jan 2022 09:06:55 +0800","guid":"https:\/\/chance.fyi\/post\/php\/operation-log\/","description":"\u524d\u8a00 \u516c\u53f8\u751f\u4ea7\u73af\u5883\u53d1\u751f\u4e86\u4e00\u4e2a\u4e8b\u6545\uff0c\u5bfc\u81f4\u516c\u53f8\u9020\u6210\u4e86\u635f\u5931\u3002\u5148\u8bf4\u7ed3\u679c\u662f\u56e0\u4e3a\u4e1a\u52a1\u4eba\u5458\u4fee\u6539\u53c2\u6570\u65f6\u8bbe\u7f6e\u9519\u4e86\u53c2\u6570\uff0c\u5bfc\u81f4\u4e8b\u6545\u53d1\u751f\u3002\u4e00\u5f00\u59cb\u4e1a\u52a1\u4eba\u5458\u8ba4\u4e3a\u662f\u6211\u4eec\u4ee3\u7801\u7a0b\u5e8f\u51fa\u4e86\u9519\u8bef\uff0c\u597d\u5728\u6709\u64cd\u4f5c\u65e5\u5fd7\u8bb0\u5f55\uff0c\u4e8e\u662f\u524d\u53bb\u67e5\u770b\u53d1\u73b0\uff0c\u64cd\u4f5c\u65e5\u5fd7\u8bb0\u5f55\u4e0d\u5168\uff0c\u6ca1\u6709\u8bb0\u5f55\u5230\u90a3\u4e2a\u4fee\u6539\u7684\u53c2\u6570\u3002\u7136\u540e\u5728\u6392\u67e5\u4ee3\u7801\u53d1\u73b0\u6ca1\u6709\u95ee\u9898\u4e4b\u540e\uff0c\u53ea\u80fd\u901a\u8fc7\u67e5\u627e MySQL \u7684 binlog \u6267\u884c\u65e5\u5fd7\u4e0e Nginx \u7684\u8bf7\u6c42\u65e5\u5fd7\u4f5c\u4e3a\u4f50\u8bc1\uff0c\u624d\u5c06\u6263\u5728\u8eab\u4e0a\u7684\u9505\u7529\u4e86\u51fa\u53bb\u3002\u56e0\u6b64\u6211\u610f\u8bc6\u5230\u64cd\u4f5c\u65e5\u5fd7\u7684\u91cd\u8981\u6027\u3002\n\u4e3a\u4ec0\u4e48\u8981\u8bb0\u5f55\u64cd\u4f5c\u65e5\u5fd7\uff1f \u4e0a\u6587\u4e5f\u5df2\u7ecf\u8bf4\u4e86\uff0c\u64cd\u4f5c\u65e5\u5fd7\u51e0\u4e4e\u5b58\u5728\u4e8e\u6240\u6709\u7684\u7cfb\u7edf\u4e2d\uff0c\u5c24\u5176\u662f\u540e\u53f0\u7ba1\u7406\u7cfb\u7edf\uff0c\u9700\u8981\u8be6\u7ec6\u7684\u8bb0\u5f55\u4e0b\u7ba1\u7406\u5458\u6240\u505a\u51fa\u7684\u64cd\u4f5c\uff0c\u4ee5\u4fbf\u4e8e\u66f4\u597d\u7684\u6392\u67e5\u95ee\u9898\u4e0e\u6eaf\u6e90\u5206\u6790\u3002\n\u7cfb\u7edf\u65e5\u5fd7\u4e0e\u64cd\u4f5c\u65e5\u5fd7\u7684\u533a\u522b \u7cfb\u7edf\u65e5\u5fd7 \u7cfb\u7edf\u65e5\u5fd7\u4e3b\u8981\u4e3a\u4e86\u5f00\u53d1\u66f4\u597d\u7684\u6392\u67e5\u95ee\u9898\uff0c\u4e00\u822c\u8bb0\u5f55\u5728\u65e5\u5fd7\u6587\u4ef6\u4e2d\u3002\u7cfb\u7edf\u65e5\u5fd7\u4e00\u822c\u662f\u5f00\u53d1\u4eba\u5458\u4f1a\u8fdb\u884c\u67e5\u770b\uff0c\u6240\u4ee5\u53ef\u8bfb\u6027\u4e0d\u9700\u8981\u5f88\u9ad8\uff0c\u751a\u81f3\u4f1a\u5305\u542b\u4e00\u4e9b\u4ee3\u7801\u4fe1\u606f\u3002\n\u64cd\u4f5c\u65e5\u5fd7 \u64cd\u4f5c\u65e5\u5fd7\u4e3b\u8981\u662f\u4e3a\u4e86\u8bb0\u5f55\u4f7f\u7528\u4eba\u5458\u7684\u6dfb\u52a0\u3001\u4fee\u6539\u3001\u5220\u9664\u64cd\u4f5c\u3002\u4e00\u822c\u662f\u7ed9\u7528\u6237\u770b\u7684\uff0c\u6240\u4ee5\u9700\u8981\u5f88\u9ad8\u7684\u53ef\u8bfb\u6027\uff0c\u80fd\u8ba9\u4eba\u4e00\u773c\u5c31\u770b\u660e\u767d\u64cd\u4f5c\u4e86\u4ec0\u4e48\u4e1c\u897f\uff0c\u800c\u4e0d\u9700\u8981\u518d\u53bb\u7ed3\u5408\u4ee3\u7801\u8fdb\u884c\u5206\u6790\u3002\n\u5e38\u89c1\u7684\u65e5\u5fd7\u8bb0\u5f55\u65b9\u5f0f \u81ea\u5b9a\u4e49\u51fd\u6570 \u5728\u5f88\u591a\u7cfb\u7edf\u4e2d\u90fd\u662f\u5b9a\u4e49\u4e86\u4e00\u4e2a\u7c7b\u4f3c\u7684admin_log()\u51fd\u6570\uff0c\u7136\u540e\u5728\u9700\u8981\u8bb0\u5f55\u65e5\u5fd7\u7684\u5730\u65b9\u8c03\u7528\u8fd9\u4e2a\u51fd\u6570\u4f20\u5165\u8bb0\u5f55\u7684\u4fe1\u606f\u5373\u53ef\u3002 \u4f18\u70b9\uff1a\n\u6bd4\u8f83\u7075\u6d3b\uff0c\u53ef\u4ee5\u968f\u610f\u62fc\u63a5\u81ea\u5df1\u60f3\u8981\u8bb0\u5f55\u7684\u65e5\u5fd7\u4fe1\u606f \u5728\u60f3\u8981\u8bb0\u5f55\u65e5\u5fd7\u7684\u5730\u65b9\u53ea\u9700\u8c03\u7528\u51fd\u6570\u5c31\u53ef\u4ee5\u4e86 \u7f3a\u70b9\uff1a\n\u65e5\u5fd7\u7684\u8bb0\u5f55\u7a7f\u63d2\u5728\u4ee3\u7801\u4e2d\uff0c\u4e0e\u4ee3\u7801\u8026\u5408\u5ea6\u5f88\u9ad8\uff0c\u589e\u52a0\u4e86\u4ee3\u7801\u590d\u6742\u5ea6 \u5927\u5757\u7684\u65e5\u5fd7\u4fe1\u606f\u5728\u4ee3\u7801\u4e2d\u770b\u8d77\u6765\u5f88\u4e11 \u968f\u7740\u4ee3\u7801\u7684\u4fee\u6539\u53ef\u80fd\u8fd8\u4f1a\u9700\u8981\u5bf9\u65e5\u5fd7\u4fe1\u606f\u8fdb\u884c\u4fee\u6539\u7ef4\u62a4 \u6709\u53ef\u80fd\u4f1a\u5fd8\u8bb0\u65e5\u5fd7\u7684\u8bb0\u5f55\uff0c\u5bfc\u81f4\u51fa\u4e86\u95ee\u9898\u80cc\u9505 \u6ce8\u89e3\uff0b AOP \u5728 Java \u4e2d\u4f7f\u7528\u6ce8\u89e3\uff0b AOP \u662f\u4e00\u79cd\u5f88\u5e38\u89c1\u7684\u65e5\u5fd7\u8bb0\u5f55\u65b9\u5f0f\uff0c\u7f51\u4e0a\u6709\u5f88\u591a\u8fd9\u6837\u7684\u4f8b\u5b50\uff0c\u4f46\u662f\u5728 PHP \u4e2d\u597d\u50cf\u6ca1\u6709\u89c1\u8fc7\u8fd9\u79cd\u65b9\u5f0f\u3002\n\u601d\u8003 \u6211\u4eec\u73b0\u5728\u7684\u7cfb\u7edf\u4e2d\u5c31\u662f\u4f7f\u7528\u7b2c\u4e00\u79cd\u81ea\u5b9a\u4e49\u51fd\u6570\u7684\u65b9\u5f0f\u6765\u8bb0\u5f55\u64cd\u4f5c\u65e5\u5fd7\u7684\uff0c\u6709\u7740\u5f88\u591a\u7684\u7f3a\u70b9\uff0c\u6240\u4ee5\u5c31\u60f3\u8981\u5bfb\u6c42\u4e00\u79cd\u4f18\u96c5\u7684\u8bb0\u5f55\u64cd\u4f5c\u65e5\u5fd7\u7684\u65b9\u5f0f\u3002\n\u5728\u7f8e\u56e2\u6280\u672f\u56e2\u961f\u7684\u300a\u5982\u4f55\u4f18\u96c5\u7684\u8bb0\u5f55\u64cd\u4f5c\u65e5\u5fd7\uff1f\u300b\u4e00\u6587\u4e2d\u5f88\u8be6\u7ec6\u7684\u63cf\u5199\u4e86\u5982\u4f55\u5229\u7528\u6ce8\u89e3+AOP \u5b9e\u73b0\u64cd\u4f5c\u65e5\u5fd7\u7684\u8bb0\u5f55\u3002\u800c PHP \u4e5f\u662f\u6709\u7740\u6ce8\u89e3\u548c AOP \u7684\uff0c\u770b\u4e86\u8fd9\u7bc7\u6587\u7ae0\u4e4b\u540e\u5c31\u4e00\u76f4\u601d\u8003\u8be5\u5982\u4f55\u5b9e\u73b0\u3002\u60f3\u4e86\u5f88\u4e45\uff0c\u770b\u4e86\u5f88\u591a\u904d\u8fd9\u7bc7\u6587\u7ae0\u8fd8\u662f\u611f\u89c9\u4e0d\u662f\u5f88\u5b8c\u7f8e\uff0c\u867d\u7136\u628a\u65e5\u5fd7\u7684\u8bb0\u5f55\u4ece\u4ee3\u7801\u8fc1\u79fb\u5230\u6ce8\u89e3\u4e2d\u4e0e\u4ee3\u7801\u5206\u79bb\uff0c\u4f46\u8fd8\u662f\u6709\u5f88\u5f3a\u7684\u8026\u5408\uff0c\u6bcf\u6b21\u4e1a\u52a1\u4ee3\u7801\u7684\u4fee\u6539\u8fd8\u662f\u9700\u8981\u5bf9\u65e5\u5fd7\u8fdb\u884c\u66f4\u65b0\u7684\u3002\n\u60f3\u6cd5 \u64cd\u4f5c\u65e5\u5fd7\u4e00\u822c\u662f\u9700\u8981\u8bb0\u5f55\u4e0b\u7528\u6237\u7684\u589e\u5220\u6539\u64cd\u4f5c\uff0c\u5bf9\u6570\u636e\u5e93\u589e\u5220\u6539\u7684\u64cd\u4f5c\u6211\u4eec\u4e00\u822c\u4f7f\u7528 ORM \u5b8c\u6210\uff0c\u6240\u4ee5\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 ORM \u7684\u6a21\u578b\u4e8b\u4ef6created\u3001updated\u3001deleted\u6765\u8bb0\u5f55\u7528\u6237\u7684\u589e\u5220\u6539\u64cd\u4f5c\u3002\n\u5728\u5176\u4e2d\u6211\u4eec\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684\u83b7\u53d6\u5230\u7528\u6237\u7684\u64cd\u4f5c\u5185\u5bb9\uff0c\u7136\u540e\u600e\u4e48\u5b9e\u73b0\u53ef\u8bfb\u6027\u5462\uff1f\n\u6211\u7684\u60f3\u6cd5\u662f\u901a\u8fc7\u83b7\u53d6\u8868\u6ce8\u91ca\u6765\u660e\u786e\u8fd9\u6b21\u64cd\u4f5c\u7684\u542b\u4e49\uff0c\u7136\u540e\u901a\u8fc7\u5b57\u6bb5\u6ce8\u91ca\u77e5\u9053\u64cd\u4f5c\u5b57\u6bb5\u7684\u5177\u4f53\u542b\u4e49\u5185\u5bb9\u3002\u5982\u6b64\u6211\u4eec\u5c31\u53ef\u4ee5\u8bb0\u5f55\u5230\u53ef\u8bfb\u6027\u7684\u65e5\u5fd7\u5185\u5bb9\u4e86\u561b\uff1f\n\u5b9e\u73b0 \u5047\u5982\u6709\u5f20\u7528\u6237\u8868\uff0cSQL \u5982\u4e0b\uff1a\ncreate table tb_user ( id int auto_increment primary key, name varchar(20) null comment &#39;\u59d3\u540d&#39;, sex tinyint default 0 null comment &#39;\u6027\u522b&#39; ) comment &#39;\u7528\u6237&#39;; \u5728\u5176\u4e2d\u6dfb\u52a0\u4e00\u6761\u6570\u636e\uff1a"},{"title":"\u5728PhpStorm\u4e2d\u4f7f\u7528PHPUnit\u8fdb\u884c\u5355\u5143\u6d4b\u8bd5","link":"https:\/\/chance.fyi\/post\/php\/phpunit\/","pubDate":"Sun, 19 Dec 2021 11:34:23 +0800","guid":"https:\/\/chance.fyi\/post\/php\/phpunit\/","description":"PHPUnit \u662f\u4ec0\u4e48 PHPUnit \u662f\u4e00\u4e2a\u9762\u5411 PHP \u7a0b\u5e8f\u5458\u7684\u6d4b\u8bd5\u6846\u67b6\uff0c\u8fd9\u662f\u4e00\u4e2a xUnit \u7684\u4f53\u7cfb\u7ed3\u6784\u7684\u5355\u5143\u6d4b\u8bd5\u6846\u67b6\u3002\nPHPUnit \u7684\u5b98\u7f51\u5730\u5740\u4e3a\uff1ahttps:\/\/phpunit.de\/\uff0c\u4e2d\u6587\u955c\u50cf\u7f51\u7ad9\uff1ahttp:\/\/www.phpunit.cn\/\u3002\n\u5b89\u88c5 PHPUnit PHPUnit \u6709\u4e24\u79cd\u5b89\u88c5\u65b9\u5f0f\uff0c\u4e00\u79cd\u662f\u4e0b\u8f7d PHAR \u53d1\u884c\u5305\u8fdb\u884c\u5168\u5c40\u5b89\u88c5\uff0c\u4e00\u79cd\u662f\u4f7f\u7528 composer \u6765\u4e3a\u67d0\u4e00\u4e2a\u9879\u76ee\u5b89\u88c5\u3002\n\u63a8\u8350\u4f7f\u7528 composer \u5b89\u88c5\uff0c\u672c\u6587\u4e5f\u662f\u4f7f\u7528\u8fd9\u79cd\u5b89\u88c5\u65b9\u5f0f\u3002\n\u9996\u5148\u4ee5\u4e0a\u4e00\u7bc7\u6587\u7ae0\u521b\u5efa\u7684\u7a7a\u7684 composer \u5305\u4e3a\u57fa\u7840\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u5373\u53ef\u3002\nroot@d63b4f236f0c:\/home# composer require --dev phpunit\/phpunit \u7f16\u5199 PHPUnit \u6d4b\u8bd5 \u9996\u5148\u5728\u9879\u76ee\u4e0b\u9762\u65b0\u5efa\u4e00\u4e2atests\u6587\u4ef6\u5939\uff0c\u7528\u6765\u5b58\u653e\u5355\u5143\u6d4b\u8bd5\u6587\u4ef6\u3002 \u7136\u540e\u7f16\u8f91 composer.json \u6587\u4ef6\u4e3a tests \u6587\u4ef6\u5939\u589e\u52a0\u4e00\u4e2a\u547d\u540d\u7a7a\u95f4&quot;Chance\\\\Log\\\\Test\\\\&quot;: &quot;tests\/&quot;\u5e76\u6267\u884ccomposer dump-autoload\u66f4\u65b0 composer \u7684\u547d\u540d\u7a7a\u95f4\u4e0e\u6587\u4ef6\u5939\u6620\u5c04\u5173\u7cfb\u3002 \u5728 tests \u76ee\u5f55\u521b\u5efa StackTest.php \u6587\u4ef6\uff0c\u4f7f\u7528\u5b98\u7f51\u7684\u4e00\u4e2a\u4f8b\u5b50\u6765\u6d4b\u8bd5\u3002 StackTest.php\n&lt;?php namespace Chance\\Log\\Test; use PHPUnit\\Framework\\TestCase; class StackTest extends TestCase { public function testPushAndPop() { $stack = []; \/\/ \u65ad\u8a00\u65b9\u6cd5 assertEquals \u5224\u65ad\u4e24\u503c\u662f\u5426\u76f8\u7b49 $this-&gt;assertEquals(0, count($stack)); array_push($stack, &#39;foo&#39;); $this-&gt;assertEquals(&#39;foo&#39;, $stack[count($stack)-1]); $this-&gt;assertEquals(1, count($stack)); $this-&gt;assertEquals(&#39;foo&#39;, array_pop($stack)); $this-&gt;assertEquals(0, count($stack)); } } \u547d\u4ee4\u884c\u6267\u884c\u5355\u5143\u6d4b\u8bd5 \u8fd0\u884c."},{"title":"\u81ea\u52a8\u90e8\u7f72","link":"https:\/\/chance.fyi\/post\/hugo\/auto-deployment\/","pubDate":"Sat, 18 Dec 2021 13:26:02 +0800","guid":"https:\/\/chance.fyi\/post\/hugo\/auto-deployment\/","description":"\u6bcf\u6b21\u5199\u4e00\u7bc7\u65b0\u7684\u6587\u7ae0\u6216\u8005\u6709\u4e00\u70b9\u6539\u52a8\uff0c\u90fd\u8981\u624b\u52a8\u653e\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u7279\u522b\u9ebb\u70e6\uff0c\u6240\u4ee5\u4eca\u5929\u6765\u642d\u5efa\u4e00\u4e2a\u81ea\u52a8\u90e8\u7f72\u73af\u5883\u3002\u6bcf\u6b21\u4fee\u6539\u4e4b\u540e\u53ea\u8981 push \u5230 github \u4e0a\u5c31\u53ef\u4ee5\u4e86\u3002\n\u6211\u5bf9 Docker \u8fd8\u662f\u5f88\u559c\u6b22\u7684\uff0c\u6240\u4ee5\u8fd9\u6b21\u73af\u5883\u4e5f\u7528 Docker \u8fdb\u884c\u642d\u5efa\u3002\n\u5b89\u88c5 Docker \u5b89\u88c5 Docker\n# \u5378\u8f7d\u65e7\u7248\u672c sudo yum remove docker \\ docker-client \\ docker-client-latest \\ docker-common \\ docker-latest \\ docker-latest-logrotate \\ docker-logrotate \\ docker-engine # \u8bbe\u7f6e\u5b58\u50a8\u5e93 sudo yum install -y yum-utils sudo yum-config-manager \\ --add-repo \\ https:\/\/download.docker.com\/linux\/centos\/docker-ce.repo # \u5b89\u88c5 Docker sudo yum install docker-ce docker-ce-cli containerd.io # \u542f\u52a8docker sudo systemctl start docker # \u8fd0\u884c\u6b64\u547d\u4ee4\u4ee5\u4e0b\u8f7d Docker Compose \u7684\u5f53\u524d\u7a33\u5b9a\u7248\u672c sudo curl -L &#34;https:\/\/github."},{"title":"\u4fee\u6539Git\u5386\u53f2\u63d0\u4ea4\u7528\u6237\u540d\u4e0e\u90ae\u7bb1","link":"https:\/\/chance.fyi\/post\/git\/update-author-email\/","pubDate":"Wed, 15 Dec 2021 20:33:01 +0800","guid":"https:\/\/chance.fyi\/post\/git\/update-author-email\/","description":"\u4eca\u5929\u610f\u5916\u53d1\u73b0 GitHub \u4e0a\u7684 commit \u8bb0\u5f55\u6709\u4e24\u4e2a\u7528\u6237\u540d\uff0c\u4e00\u4e2a\u662f\u516c\u53f8\u7684\u914d\u7f6e\uff0c\u4e00\u4e2a\u662f\u5bb6\u91cc\u7684\u914d\u7f6e\u3002\u6240\u4ee5\u9700\u8981\u5c06\u5df2\u7ecf\u63d0\u4ea4\u7684 commit \u8bb0\u5f55\u7684Author\u548cemail\u4fee\u6539\u56de\u6765\u3002\n\u4fee\u6539\u672c\u673a\u5168\u5c40\u7528\u6237\u540d\u4e0e\u90ae\u7bb1 \u5148\u5c06\u672c\u673a\u7684\u7528\u6237\u540d\u4e0e\u90ae\u7bb1\u4fee\u6539\u6b63\u786e\uff0c\u9632\u6b62\u4ee5\u540e\u518d\u6b21\u63d0\u4ea4\u9519\u8bef\u3002\ngit config --global user.name &#34;\u8f93\u5165\u4f60\u7684\u7528\u6237\u540d&#34; git config --global user.email &#34;\u8f93\u5165\u4f60\u7684\u90ae\u7bb1&#34; \u67e5\u770b\u5386\u53f2\u63d0\u4ea4\u4fe1\u606f \u9996\u5148git clone\u4e00\u4efd\u4ee3\u7801\uff0c\u6267\u884cgit log\u67e5\u770b\u5386\u53f2\u63d0\u4ea4\u4fe1\u606f\uff0c\u8bb0\u4f4f\u8981\u4fee\u6539\u7684Author\u548cemail\u3002\n\u6279\u91cf\u4fee\u6539\u5386\u53f2\u4fe1\u606f \u5c06\u4e0b\u5217\u4ee3\u7801\u590d\u5236\u5230\u6587\u672c\u4e2d\u4fee\u6539\u4e3a\u81ea\u5df1\u7684\u4fe1\u606f\uff0c\u7136\u540e\u5c06\u4ee3\u7801\u590d\u5236\u5230\u547d\u4ee4\u884c\u56de\u8f66\u8fd0\u884c\u3002\n\u6ce8\u610f\uff1a\u4ee5\u4e0b\u547d\u4ee4\u4f1a\u4fee\u6539\u5386\u53f2\uff0c\u53d8\u66f4 commit id \uff0c\u5176\u4ed6\u4eba\u4f1a\u4e0d\u540c\u6b65\uff0c\u614e\u7528\u3002\ngit filter-branch -f --env-filter &#39; OLD_EMAIL=&#34;\u539f\u6765\u7684\u90ae\u7bb1&#34; CORRECT_NAME=&#34;\u73b0\u5728\u7684\u540d\u5b57&#34; CORRECT_EMAIL=&#34;\u73b0\u5728\u7684\u90ae\u7bb1&#34; if [ &#34;$GIT_COMMITTER_EMAIL&#34; = &#34;$OLD_EMAIL&#34; ] then export GIT_COMMITTER_NAME=&#34;$CORRECT_NAME&#34; export GIT_COMMITTER_EMAIL=&#34;$CORRECT_EMAIL&#34; fi if [ &#34;$GIT_AUTHOR_EMAIL&#34; = &#34;$OLD_EMAIL&#34; ] then export GIT_AUTHOR_NAME=&#34;$CORRECT_NAME&#34; export GIT_AUTHOR_EMAIL=&#34;$CORRECT_EMAIL&#34; fi &#39; --tag-name-filter cat -- --branches --tags \u8fd0\u884c\u4e4b\u540e\u4f1a\u51fa\u73b0\u4e00\u4e2a\u8b66\u544a\uff0c\u4e0d\u7528\u7ba1\u7b49\u5f85\u6267\u884c\u7ed3\u675f\u5c31\u597d\u4e86\u3002\n# \u8b66\u544a\u4fe1\u606f WARNING: git-filter-branch has a glut of gotchas generating mangled history rewrites."},{"title":"\u521b\u5efa\u4e00\u4e2acomposer\u5305","link":"https:\/\/chance.fyi\/post\/php\/create-composer-package\/","pubDate":"Mon, 13 Dec 2021 16:45:44 +0800","guid":"https:\/\/chance.fyi\/post\/php\/create-composer-package\/","description":"# 1. \u6267\u884ccomposer init root@7608e16a4e0a:\/home# composer init Welcome to the Composer config generator This command will guide you through creating your composer.json config. # 2. \u586b\u5199\u5305\u540d Package name (&lt;vendor&gt;\/&lt;name&gt;) [root\/home]: chance\/log # 3. \u8f93\u5165\u63cf\u8ff0 Description []: Elegant logging of operations # 4. \u8f93\u5165\u4f5c\u8005 Author [, n to skip]: chance &lt;ctx_ya@qq.com&gt; # 5. \u6700\u4f4e\u7a33\u5b9a\u7248\u672c \u53ef\u9009\u503c\uff1astable, RC, beta, alpha, dev \u4e00\u822c\u586bdev Minimum Stability []: dev # 6. \u8f93\u5165\u5305\u7c7b\u578b Package Type (e.g. library, project, metapackage, composer-plugin) []: library # 7."},{"title":"hugo\u6dfb\u52a0utterances\ud83d\udd2e\u8bc4\u8bba\u7cfb\u7edf","link":"https:\/\/chance.fyi\/post\/hugo\/add-utterances\/","pubDate":"Sun, 28 Nov 2021 13:23:17 +0800","guid":"https:\/\/chance.fyi\/post\/hugo\/add-utterances\/","description":"utterances\ud83d\udd2e \u57fa\u4e8e GitHub issues \u6784\u5efa\u7684\u8f7b\u91cf\u7ea7\u8bc4\u8bba\u5c0f\u90e8\u4ef6\u3002\u5b98\u7f51\u5730\u5740\u4e3ahttps:\/\/utteranc.es\/\u3002\n\u51c6\u5907\u4e00\u4e2a\u516c\u5f00\u7684 github \u9879\u76ee \u9700\u8981\u6709\u4e00\u4e2a\u516c\u5f00\u7684\u9879\u76ee\uff0c\u56e0\u4e3a\u5f53\u65f6\u5c06\u535a\u5ba2\u9879\u76ee\u8bbe\u7f6e\u4e3a\u79c1\u6709\u4e86\u3002\u6240\u4ee5\u5148\u66f4\u6539\u4e00\u4e0b\u9879\u76ee\u6743\u9650\uff0c\u5f53\u7136\u4e5f\u53ef\u4ee5\u65b0\u5efa\u4e00\u4e2a\u9879\u76ee\u3002\n\u5b89\u88c5 utterances\ud83d\udd2e \u4e3a\u535a\u5ba2\u9879\u76ee\u5b89\u88c5utterances\n\u6dfb\u52a0\u5230\u535a\u5ba2 \u65b0\u5efalayouts\\partials\\comments.html\u6587\u4ef6\uff0c\u5199\u5165\u4e0b\u9762\u4ee3\u7801\u5e76\u5c06repo\u66f4\u6362\u4e3a\u81ea\u5df1\u7684\u9879\u76ee\u540d\u79f0\u3002\n&lt;script src=&#34;https:\/\/utteranc.es\/client.js&#34; repo=&#34;[ENTER REPO HERE]&#34; issue-term=&#34;pathname&#34; theme=&#34;github-light&#34; crossorigin=&#34;anonymous&#34; async &gt;&lt;\/script&gt; \u7136\u540e\u5728config\u914d\u7f6e\u6587\u4ef6\u4e2d\u6253\u5f00\u8bc4\u8bba\u529f\u80fdcomments = true\u3002\n\u6548\u679c\u5c55\u793a \u95ee\u9898 \u5f53\u5207\u6362\u5230 dark \u4e3b\u9898\u7684\u65f6\u5019\u8bc4\u8bba\u8fd8\u662f\u767d\u7684\uff0c\u4f53\u9a8c\u4e0d\u592a\u597d\u3002\n\u7ecf\u8fc7\u67e5\u770b\u6e90\u7801\uff0c\u53c2\u8003\u8fd9\u4e2aissues\u5b9e\u73b0\u4e86\u6839\u636e\u535a\u5ba2\u4e3b\u9898\u52a8\u6001\u5207\u6362 utteranc \u4e3b\u9898\u3002\nlayouts\\partials\\comments.html\u6587\u4ef6\u4fee\u6539\u4e3a\uff1a\n&lt;script id=&#34;utteranc&#34; src=&#34;https:\/\/utteranc.es\/client.js&#34; repo=&#34;Chance-fyi\/blog&#34; issue-term=&#34;pathname&#34; theme=&#34;github-light&#34; crossorigin=&#34;anonymous&#34; async &gt;&lt;\/script&gt; &lt;script&gt; document.getElementById(&#34;theme-toggle&#34;).addEventListener(&#34;click&#34;, () =&gt; { const theme = document.body.className.includes(&#34;dark&#34;) ? &#34;github-light&#34; : &#34;photon-dark&#34;; const message = { type: &#34;set-theme&#34;, theme: theme, }; const utteranc = document."},{"title":"Typora\u4f7f\u7528Picgo\u56fe\u7247\u4e0a\u4f20\u4e03\u725b\u4e91\u7684\u914d\u7f6e","link":"https:\/\/chance.fyi\/post\/tool\/typora\/typora-picgo-qiniu\/","pubDate":"Thu, 25 Nov 2021 16:47:08 +0800","guid":"https:\/\/chance.fyi\/post\/tool\/typora\/typora-picgo-qiniu\/","description":"{ &#34;picBed&#34;: { &#34;uploader&#34;: &#34;qiniu&#34;, &#34;qiniu&#34;: { &#34;accessKey&#34;: &#34;****************************************&#34;, &#34;secretKey&#34;: &#34;****************************************&#34;, &#34;bucket&#34;: &#34;chance-img&#34;, \/\/ \u5b58\u50a8\u7a7a\u95f4\u540d &#34;url&#34;: &#34;http:\/\/image.chance.fyi&#34;, \/\/ \u81ea\u5b9a\u4e49\u57df\u540d &#34;area&#34;: &#34;z2&#34;, \/\/ \u5b58\u50a8\u533a\u57df\u7f16\u53f7 z0\u534e\u4e1c z1\u534e\u5317 z2\u534e\u5357 na0\u5317\u7f8e as0\u4e1c\u5357\u4e9a &#34;options&#34;: &#34;&#34;, \/\/ \u7f51\u5740\u540e\u7f00\uff0c\u6bd4\u5982?imgslim &#34;path&#34;: &#34;&#34; \/\/ \u81ea\u5b9a\u4e49\u5b58\u50a8\u8def\u5f84\uff0c\u6bd4\u5982img\/ \u7ecf\u6d4b\u8bd5\u53ea\u662f\u5728\u6587\u4ef6\u540d\u4e0a\u6dfb\u52a0\u4e86\u524d\u7f00 \u5e76\u4e0d\u662f\u6587\u4ef6\u5939\u8def\u5f84 } }, &#34;picgoPlugins&#34;: {} } "},{"title":"\u4f7f\u7528docker-compose\u6784\u5efaPHP8.0 + Swoole + Redis + MongoDB\u73af\u5883","link":"https:\/\/chance.fyi\/post\/docker\/docker-compose-build-php-swoole\/","pubDate":"Wed, 24 Nov 2021 15:36:45 +0800","guid":"https:\/\/chance.fyi\/post\/docker\/docker-compose-build-php-swoole\/","description":"\u6700\u8fd1\u516c\u53f8\u8003\u8651\u4f7f\u7528 PHP8 + swoole \u8fdb\u884c\u9879\u76ee\u7684\u91cd\u6784\uff0c\u6240\u4ee5\u8981\u642d\u5efa\u4e00\u4e2a\u73af\u5883\u8fdb\u884c\u5f00\u53d1\u5b66\u4e60\u3002swoole \u53ea\u80fd\u8fd0\u884c\u5728 Linux \u7cfb\u7edf\u4e0b\uff0c\u8003\u8651\u5230\u7edf\u4e00\u56e2\u961f\u7684\u5f00\u53d1\u73af\u5883\uff0c\u907f\u514d\u522b\u7684\u5c0f\u4f19\u4f34\u5728\u73af\u5883\u95ee\u9898\u4e0a\u6d6a\u8d39\u592a\u591a\u65f6\u95f4\uff0c\u6240\u4ee5\u9009\u62e9\u4f7f\u7528 docker \u6765\u6784\u5efa\u4e00\u4e2a\u5f00\u53d1\u73af\u5883\u3002\n\u9996\u5148\u521b\u5efa\u6211\u4eec\u7684\u5de5\u4f5c\u76ee\u5f55Docker\uff0c\u7136\u540e\u5728DockerHub\u4e0a\u67e5\u627e PHP8.0 \u6700\u65b0\u7248\u672c\u7684\u955c\u50cf\u76ee\u524d\u4e3aPHP8.0.12\uff0c\u5728Docker\u76ee\u5f55\u4e0b\u521b\u5efaphp\u76ee\u5f55\uff0c\u56e0\u4e3a\u4ee5\u540e\u53ef\u80fd\u4f1a\u4f7f\u7528\u522b\u7684\u7248\u672c\u7684 PHP\uff0c\u6240\u4ee5\u5728php\u76ee\u5f55\u4e0b\u5728\u521b\u5efa\u4e00\u4e2aphp8.0.12\u7684\u76ee\u5f55\uff0c\u5e76\u5728\u76ee\u5f55\u4e2d\u521b\u5efaDockerfile\u6587\u4ef6\u3002\n\u76ee\u5f55\u7ed3\u6784\u4e3a\nDocker \u251c\u2500 php \u2502 \u251c\u2500 php8.0.12 \u2502 \u2502 \u2514\u2500 Dockerfile \u2502 \u251c\u2500 ... \u6784\u5efa\u81ea\u5df1\u7684 PHP \u955c\u50cf Dockerfile # \u56e0\u4e3a\u8981\u4f7f\u7528swoole\u76f4\u63a5\u4f7f\u7528cli\u7248\u672c FROM php:8.0.12-cli # \u66f4\u65b0\u4f9d\u8d56 RUN apt-get update \\ &amp;&amp; apt-get install -y \\ unixodbc-dev \\ zlib1g-dev \\ libzip-dev # \u521b\u5efa`\/usr\/src\/php\/ext`\u76ee\u5f55 RUN docker-php-source extract # \u4e0b\u8f7dredis\u6269\u5c55 # printf &#34;&#34; | \u662f\u4e3a\u4e86\u8df3\u8fc7\u6269\u5c55\u5b89\u88c5\u8fc7\u7a0b\u4e2d\u5f39\u51fa\u8ba9\u6211\u4eec\u9009\u62e9\u7684yes no RUN printf &#34;&#34; | pecl install redis-5."},{"title":"PHP\u955c\u50cf\u4e2d\u81ea\u5e26\u7684\u51e0\u4e2a\u7279\u6b8a\u7684\u547d\u4ee4","link":"https:\/\/chance.fyi\/post\/docker\/php-image-four-commands\/","pubDate":"Wed, 24 Nov 2021 15:06:12 +0800","guid":"https:\/\/chance.fyi\/post\/docker\/php-image-four-commands\/","description":" docker-php-source docker-php-ext-install docker-php-ext-enable docker-php-ext-configure docker-php-source \u6b64\u547d\u4ee4\uff0c\u5b9e\u9645\u4e0a\u5c31\u662f\u5728 PHP \u5bb9\u5668\u4e2d\u521b\u5efa\u4e00\u4e2a\/usr\/src\/php \u7684\u76ee\u5f55\uff0c\u91cc\u9762\u653e\u4e86\u4e00\u4e9b\u81ea\u5e26\u7684\u6587\u4ef6\u800c\u5df2\u3002\u6211\u4eec\u5c31\u628a\u5b83\u5f53\u4f5c\u4e00\u4e2a\u4ece\u4e92\u8054\u7f51\u4e2d\u4e0b\u8f7d\u4e0b\u6765\u7684 PHP \u6269\u5c55\u6e90\u7801\u7684\u5b58\u653e\u76ee\u5f55\u5373\u53ef\u3002\u4e8b\u5b9e\u4e0a\uff0c\u6240\u6709 PHP \u6269\u5c55\u6e90\u7801\u6269\u5c55\u5b58\u653e\u7684\u8def\u5f84\u90fd\u5728 \/usr\/src\/php\/ext \u91cc\u9762\u3002\n\u683c\u5f0f\uff1a\ndocker-php-source extract # \u521b\u5efa\u5e76\u521d\u59cb\u5316 `\/usr\/src\/php`\u76ee\u5f55 docker-php-source delete # \u5220\u9664 `\/usr\/src\/php`\u76ee\u5f55 docker-php-ext-enable \u8fd9\u4e2a\u547d\u4ee4\uff0c\u5c31\u662f\u7528\u6765\u542f\u52a8 PHP \u6269\u5c55 \u7684\u3002\n\u683c\u5f0f\uff1a\ndocker-php-ext-enable redis # \u5f00\u542fRedis\u6269\u5c55 \u524d\u63d0\u662f\u5df2\u7ecf\u4e0b\u8f7d\u5b89\u88c5\u8fc7 docker-php-ext-install \u8fd9\u4e2a\u547d\u4ee4\uff0c\u662f\u7528\u6765\u5b89\u88c5\u5e76\u542f\u52a8PHP \u6269\u5c55\u7684\u3002\n\u683c\u5f0f\uff1a\ndocker-php-ext-install \u6e90\u7801\u5305\u76ee\u5f55\u540d \u6ce8\u610f\u70b9\uff1a\n\u6e90\u7801\u5305\u9700\u8981\u653e\u5728 \/usr\/src\/php\/ext \u4e0b \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0cPHP \u5bb9\u5668\u6ca1\u6709 \/usr\/src\/php\u8fd9\u4e2a\u76ee\u5f55\uff0c\u9700\u8981\u4f7f\u7528 docker-php-source extract\u6765\u751f\u6210\u3002 docker-php-ext-install \u5b89\u88c5\u7684\u6269\u5c55\u5728\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u4f1a\u81ea\u52a8\u8c03\u7528docker-php-ext-enable\u6765\u542f\u52a8\u5b89\u88c5\u7684\u6269\u5c55\u3002 \u5378\u8f7d\u6269\u5c55\uff0c\u76f4\u63a5\u5220\u9664\/usr\/local\/etc\/php\/conf.d \u5bf9\u5e94\u7684\u914d\u7f6e\u6587\u4ef6\u5373\u53ef\u3002 docker-php-ext-configure docker-php-ext-configure \u4e00\u822c\u90fd\u662f\u9700\u8981\u8ddf docker-php-ext-install\u642d\u914d\u4f7f\u7528\u7684\u3002\u5b83\u7684\u4f5c\u7528\u5c31\u662f\uff0c\u5f53\u4f60\u5b89\u88c5\u6269\u5c55\u7684\u65f6\u5019\uff0c\u9700\u8981\u81ea\u5b9a\u4e49\u914d\u7f6e\u65f6\uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u5e2e\u4f60\u505a\u5230\u3002\n\u7528\u6cd5\uff1a\ndocker-php-ext-configure ext-name [configure flags] "},{"title":"\u4f7f\u7528Hugo\u642d\u5efa\u4e2a\u4eba\u535a\u5ba2","link":"https:\/\/chance.fyi\/post\/hugo\/build-blog\/","pubDate":"Sat, 20 Nov 2021 13:44:46 +0800","guid":"https:\/\/chance.fyi\/post\/hugo\/build-blog\/","description":"\u5b89\u88c5 Go Go \u7684\u5b89\u88c5\u5305\u4e0b\u8f7d\u5730\u5740\u4e3ahttps:\/\/golang.org\/dl\/Windows \u7248\u4e0b\u8f7d\u4e4b\u540e\u4e00\u8defNext\u5c31\u597d\u4e86\uff0c\u6ce8\u610f\u5c06 Go \u5b89\u88c5\u76ee\u5f55\u4e0b\u7684bin\u76ee\u5f55\u52a0\u5165\u5230\u73af\u5883\u53d8\u91cf\u4e2d\u3002\u53ef\u4f7f\u7528go version\u547d\u4ee4\u67e5\u770b\u662f\u5426\u5b89\u88c5\u6210\u529f\u3002\n\u5b89\u88c5 Hugo \u4e8c\u8fdb\u5236\u5b89\u88c5\uff08\u63a8\u8350\uff1a\u7b80\u5355\u3001\u5feb\u901f\uff09 \u5230 Hugo Releases \u4e0b\u8f7d\u5bf9\u5e94\u7684\u64cd\u4f5c\u7cfb\u7edf\u7248\u672c\u7684 Hugo \u4e8c\u8fdb\u5236\u6587\u4ef6\uff08hugo \u6216\u8005 hugo.exe\uff09\nWindows \u7248\u5c06\u4e0b\u8f7d\u7684 hugo.exe \u653e\u5230 Go \u5b89\u88c5\u76ee\u5f55\u4e0b\u7684bin\u76ee\u5f55\u5c31\u53ef\u4ee5\u4e86\uff0c\u4f7f\u7528hugo version\u547d\u4ee4\u67e5\u770b\u5b89\u88c5\u662f\u5426\u6210\u529f\u3002\n\u521b\u5efa blog \u521b\u5efa\u4e00\u4e2a Github \u9879\u76ee \u4f7f\u7528 Github \u8fdb\u884c\u535a\u5ba2\u7684\u6e90\u7801\u7ba1\u7406\uff0c\u521b\u5efa\u4e00\u4e2a\u7a7a\u7684 Blog \u9879\u76ee\u3002\n\u751f\u6210\u7ad9\u70b9 # \u672c\u5730\u521b\u5efaBlog\u76ee\u5f55\u5e76\u8fdb\u5165 # \u4f7f\u7528Hugo\u5feb\u901f\u751f\u6210\u7ad9\u70b9 PS D:\\Blog&gt; hugo new site . # \u521d\u59cb\u5316git \u5e76\u5c06\u7ad9\u70b9\u6e90\u7801\u63a8\u9001\u5230Github PS D:\\Blog&gt; git init PS D:\\Blog&gt; git add . PS D:\\Blog&gt; git commit -m &#34;init blog&#34; PS D:\\Blog&gt; git remote add origin https:\/\/github."}]}}