{"@attributes":{"version":"2.0"},"channel":{"title":"Wi1dcard","link":"https:\/\/wi1dcard.dev\/","description":"Recent content on Wi1dcard","generator":"Hugo -- gohugo.io","language":"en-US","lastBuildDate":"Sun, 10 Mar 2024 14:26:50 +0800","item":[{"title":"Docker in IPv6-Only Network","link":"https:\/\/wi1dcard.dev\/posts\/docker-in-ipv6-only-network\/","pubDate":"Sun, 10 Mar 2024 14:26:50 +0800","guid":"https:\/\/wi1dcard.dev\/posts\/docker-in-ipv6-only-network\/","description":"Recently I&rsquo;ve been using Hetzner Cloud with IPv6 only. I installed Docker and deployed some services. With the default settings of Docker, containers cannot access the IPv6 only network on the host."},{"title":"Git Commit Messages \u548c Changelog \u4e2d\u7684\u5e38\u7528\u52a8\u8bcd\u53c2\u8003","link":"https:\/\/wi1dcard.dev\/posts\/verbs-in-git-commit-messages-and-changelogs\/","pubDate":"Fri, 17 Sep 2021 00:46:38 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/verbs-in-git-commit-messages-and-changelogs\/","description":"<p>\u4f18\u8d28\u7684 Git commit message \u548c Changelog \u4e0d\u4ec5\u53ef\u4ee5\u8ba9\u534f\u4f5c\u8005\u4eec\u4e00\u76ee\u4e86\u7136\u5730\u4e86\u89e3\u7248\u672c\u53d8\u66f4\uff0c\u66f4\u80fd\u5e2e\u52a9\u4f60\u5feb\u901f\u56de\u5fc6\u66fe\u7ecf\u7684\u4fee\u6539\u3002\u56e0\u6b64\uff0c\u5408\u7406\u5730\u4f7f\u7528\u82f1\u8bed\u52a8\u8bcd\u3001\u901a\u8fc7\u300c\u4e00\u53e5\u8bdd\u300d\u7cbe\u51c6\u5730\u6982\u62ec\u505a\u4e86\u4ec0\u4e48\u4e8b\u3001\u7f16\u5199\u6613\u8bfb\u6613\u61c2\u7684\u63cf\u8ff0\u5c31\u663e\u5f97\u5c24\u4e3a\u91cd\u8981\u3002\u672c\u6587\u76ee\u7684\u662f\u7d22\u5f15\u548c\u603b\u7ed3\u5e38\u7528\u7684\u52a8\u8bcd\u5217\u8868\uff0c\u5185\u5bb9\u4ec5\u51ed\u6211\u4e2a\u4eba\u7ecf\u9a8c\u4ee5\u53ca\u6709\u9650\u7684\u67e5\u9605\u8d44\u6599\uff0c\u8bf7\u7ed3\u5408\u5b9e\u9645\u60c5\u51b5\u4f7f\u7528\u3002<\/p>"},{"title":"Serve HTTP and WebSocket with the Same Port and Path in Nginx","link":"https:\/\/wi1dcard.dev\/posts\/serve-http-and-websocket-with-the-same-port-path-in-nginx\/","pubDate":"Fri, 19 Feb 2021 16:00:22 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/serve-http-and-websocket-with-the-same-port-path-in-nginx\/","description":"<p>Polkadot and other Substrate-based chain nodes supports JSON RPC <strong>over HTTP<\/strong> and <strong>over WebSocket<\/strong> on ports 9933 and 9944 individually.<\/p>\n<p>However, according to the <a href=\"https:\/\/en.wikipedia.org\/wiki\/WebSocket#Protocol_handshake\" target=\"_blank\">WebSocket handshake<\/a>, we can determine if the client is requesting WebSocket or other HTTP resource by the header <code>Upgrade: websocket<\/code>.<\/p>\n<p>Here&rsquo;s a little trick in Nginx to reverse proxy both 9933 (HTTP) and 9944 (WebSocket) with the same host, same port, and same path \/ location.<\/p>"},{"title":"Customize Kube-Prometheus Built-in Alerts","link":"https:\/\/wi1dcard.dev\/posts\/customize-kube-prometheus-built-in-alerts\/","pubDate":"Tue, 16 Feb 2021 20:49:12 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/customize-kube-prometheus-built-in-alerts\/","description":"<p><a href=\"https:\/\/github.com\/prometheus-operator\/kube-prometheus\" target=\"_blank\">Kube-prometheus<\/a> provides quite a few great collections of components and alerts that help us monitoring our Kubernetes cluster. I&rsquo;ve used it in the production cluster for serveral months. Although the project exposes a bunch of options via <code>_config+::<\/code> to makes it partially configurable, the scope of parameters that we can modify is still limited.<\/p>"},{"title":"\u4e00\u7bc7\u4e0d\u957f\u4f46\u4f3c\u4e4e\u8fd8\u662f\u6709\u70b9\u4e4f\u5473\u7684\u5e74\u7ec8\u603b\u7ed3","link":"https:\/\/wi1dcard.dev\/posts\/hello-2021\/","pubDate":"Tue, 02 Feb 2021 12:53:32 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/hello-2021\/","description":"<p>\u8bb0\u5f97\u53bb\u5e74\u5199\u8fc7\u4e00\u7bc7 <a href=\"https:\/\/wi1dcard.dev\/posts\/hello-2020\/\">\u4e00\u7bc7\u53c8\u957f\u53c8\u4e4f\u5473\u7684\u5e74\u7ec8\u603b\u7ed3\u548c\u5c55\u671b<\/a>\uff0c\u867d\u7136\u73b0\u5728\u5df2\u7ecf\u662f 2021 \u5e74\u7684 2 \u6708\u4e86\uff0c\u518d\u6765\u56de\u987e\u7a0d\u5fae\u665a\u4e86\u4e9b\uff0c\u4e0d\u8fc7\u6211\u8fd8\u662f\u51b3\u5b9a\u603b\u7ed3\u4e00\u4e0b\u53bb\u5e74\uff0c\u518d\u7ed9\u65b0\u4e00\u5e74\u5236\u5b9a\u51e0\u4e2a\u957f\u671f\u76ee\u6807\u3002<\/p>"},{"title":"\u901a\u4fd7\u89e3\u91ca\u53cd\u4f2a\u9020\u90ae\u4ef6\u673a\u5236 SPF\u3001DKIM \u548c DMARC","link":"https:\/\/wi1dcard.dev\/posts\/anti-email-spoofing-explained\/","pubDate":"Tue, 02 Feb 2021 12:37:02 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/anti-email-spoofing-explained\/","description":"<p>\u8fd9\u7bc7\u535a\u5ba2\u4e00\u6539\u6211\u4e4b\u524d\u6587\u98ce\u7684\u5e38\u6001\uff0c\u56e0\u4e3a\u7f51\u4e0a\u7684\u76f8\u5173\u4e13\u4e1a\u8d44\u6599\u5df2\u7ecf\u5f88\u591a\uff0c\u6211\u5c3d\u53ef\u80fd\u4ee5\u901a\u4fd7\u6613\u61c2\u7684\u8bed\u8a00\u6765\u4ecb\u7ecd\uff0c\u653e\u5f03\u4e86\u90e8\u5206\u4e13\u4e1a\u6027\uff0c\u671b\u8bfb\u8005\u89c1\u8c05\u3002<\/p>\n<p>\u6211\u4eec\u5148\u6765\u8c08\u8c08\u300c\u9632\u6b62\u653b\u51fb\u8005\u4f2a\u9020\u6211\u4eec\u5411\u5176\u4ed6\u4eba\u53d1\u9001\u90ae\u4ef6\u300d\u3002\u8981\u7406\u89e3\u4e3a\u4ec0\u4e48\u4f1a\u5b58\u5728\u4f2a\u9020\u90ae\u4ef6\u4ee5\u53ca\u5982\u4f55\u9632\u6b62\u4f2a\u9020\u90ae\u4ef6\uff0c\u9996\u5148\u9700\u8981\u660e\u767d\u90ae\u4ef6\u673a\u5236\u662f\u600e\u6837\u5de5\u4f5c\u7684\u3002<\/p>"},{"title":"\u6211\u7684\u5de5\u4f5c\u65b9\u6cd5","link":"https:\/\/wi1dcard.dev\/posts\/my-work-skills-2021\/","pubDate":"Mon, 01 Feb 2021 17:36:18 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/my-work-skills-2021\/","description":"<p>2020 \u5e74\u8f6c\u773c\u7ed3\u675f\u4e86\uff0c\u672c\u60f3\u5199\u5e74\u7ec8\u603b\u7ed3\u548c\u65b0\u5e74\u8ba1\u5212\uff0c\u5374\u53d1\u73b0 2020 \u5e74\u9664\u4e86\u6280\u672f\u8fdb\u6b65\uff0c\u8fd8\u603b\u7ed3\u4e86\u4e0d\u5c11\u6211\u81ea\u5df1\u7684\u300c\u5de5\u4f5c\u6280\u5de7\u300d\uff0c\u6216\u8005\u4e5f\u53ef\u4ee5\u53eb\u505a\u300c\u5de5\u4f5c\u5b88\u5219\u300d\u3002\u6211\u9075\u5faa\u7740\u8fd9\u4e9b\u5b9e\u8df5\u4e2d\u603b\u7ed3\u51fa\u6765\u7684\u65b9\u6cd5\u5de5\u4f5c\uff0c\u4e3a\u6211\u81ea\u5df1\u4ee5\u53ca\u6211\u6240\u5728\u7684\u5c97\u4f4d\uff0c\u5e26\u6765\u4e86\u4e0d\u5c0f\u7684\u65f6\u95f4\u6548\u76ca\u548c\u7ecf\u6d4e\u6548\u76ca\u3002<\/p>\n<p>\u5f53\u7136\uff0c\u9002\u5408\u81ea\u5df1\u7684\u624d\u662f\u6700\u597d\u7684\uff0c\u6211\u4e0d\u559c\u6b22\u4e00\u5473\u6a21\u4eff\u5176\u5b83\u4eba\uff0c\u5e0c\u671b\u4f60\u4e5f\u5e26\u7740\u8fd9\u79cd\u60f3\u6cd5\u8bfb\u8fd9\u7bc7\u535a\u5ba2\u3002<\/p>"},{"title":"ESXi OpenWrt \u4f7f\u7528\u534e\u4e3a\u968f\u8eab Wi-Fi \u5b9e\u73b0 WAN \u6545\u969c\u8f6c\u79fb","link":"https:\/\/wi1dcard.dev\/posts\/huawei-5g-dongle-usb-tethering-with-openwrt-in-esxi\/","pubDate":"Wed, 11 Nov 2020 13:00:43 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/huawei-5g-dongle-usb-tethering-with-openwrt-in-esxi\/","description":"<p>\u8fd9\u51e0\u5929\u60f3\u7ed9\u5bb6\u91cc\u4e0a\u300c\u53cc\u7f51\u300d\uff0c\u4f46\u5f31\u7535\u7bb1\u53ea\u6709\u4e00\u6839\u5149\u7ea4\uff0c\u6240\u4ee5\u65e0\u6cd5\u62c9\u53cc\u7ebf\u3002\u6b63\u597d\u624b\u4e0a\u6709\u4e00\u4e2a <a href=\"https:\/\/consumer.huawei.com\/en\/routers\/5g-mobile-wifi-pro\/\" target=\"_blank\">\u534e\u4e3a 5G \u968f\u8eab Wi-Fi Pro<\/a>\uff0c\u5e72\u8106\u7528\u5b83\u6765\u505a Failover\uff08\u6545\u969c\u8f6c\u79fb\uff09\u5427\u3002<\/p>"},{"title":"\u6539\u8fdb Alertmanager \u7684\u9489\u9489\u901a\u77e5","link":"https:\/\/wi1dcard.dev\/posts\/alertmanager-dingtalk-integration-tips\/","pubDate":"Fri, 02 Oct 2020 15:51:18 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/alertmanager-dingtalk-integration-tips\/","description":"<p>\u591a\u4e8f\u4e86 <a href=\"https:\/\/github.com\/timonwong\/prometheus-webhook-dingtalk\" target=\"_blank\">prometheus-webhook-dingtalk<\/a> \u9879\u76ee\uff0cAlertmanager \u96c6\u6210\u9489\u9489\u6d88\u606f\u901a\u77e5\u5f97\u4ee5\u5b9e\u73b0\u3002\u5728\u5b9e\u9645\u4f7f\u7528\u8fc7\u7a0b\u4e2d\uff0c\u6211\u53d1\u73b0\u4e86\u4e00\u4e9b\u53ef\u4ee5\u6539\u8fdb\u7684\u914d\u7f6e\uff0c\u4f8b\u5982\u901a\u77e5\u6d88\u606f\u6a21\u677f\u53ef\u4ee5\u66f4\u52a0\u6e05\u6670\u7b80\u6d01\u3001\u53ef\u4ee5\u6839\u636e\u4e0d\u540c\u7684\u62a5\u8b66\u4f18\u5148\u7ea7\u51b3\u5b9a\u662f\u5426 Mention \u67d0\u4eba\u7b49\u3002<\/p>"},{"title":"Convert Kubernetes-Mixin Severities to OpsGenie Priorities in Prometheus","link":"https:\/\/wi1dcard.dev\/posts\/prometheus-severity-label-to-opsgenie-priority\/","pubDate":"Wed, 30 Sep 2020 16:11:36 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/prometheus-severity-label-to-opsgenie-priority\/","description":"<p>In <a href=\"https:\/\/github.com\/kubernetes-monitoring\/kubernetes-mixin\" target=\"_blank\">kubernetes-mixin<\/a> (a dependency of <a href=\"https:\/\/github.com\/prometheus-community\/helm-charts\/tree\/main\/charts\/kube-prometheus-stack\" target=\"_blank\">kube-prometheus-stack<\/a> and <a href=\"https:\/\/github.com\/helm\/charts\/tree\/d0f9bcc80f0282519bee34d81175895c8a776b1f\/stable\/prometheus-operator\" target=\"_blank\">prometheus-operator<\/a> charts) rules, the severity label of alrets can be <code>critical<\/code>, <code>warning<\/code>, or <code>info<\/code> etc. However, OpsGenie&rsquo;s priority field only accepts values like <code>P1<\/code>, <code>P2<\/code> &hellip; <code>P5<\/code>.<\/p>\n<p>As a user of both of them, I would have to convert the &ldquo;severity&rdquo; to OpsGenie&rsquo;s &ldquo;priority&rdquo;. For example, if a <code>critical<\/code> alert was fired, a matched <code>P1<\/code> alert to be created in OpsGenie is expected, and <code>warning<\/code> -&gt; <code>P2<\/code>, <code>info<\/code> -&gt; <code>P3<\/code>, as well.<\/p>"},{"title":"\u8d85\u7b80\u5355\uff01\u57fa\u4e8e\u65e5\u5fd7\u7684 Darwinia \u9a8c\u8bc1\u4eba\u8282\u70b9\u76d1\u63a7\u9884\u8b66","link":"https:\/\/wi1dcard.dev\/posts\/darwinia-validators-log-based-monitoring\/","pubDate":"Tue, 29 Sep 2020 08:51:32 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/darwinia-validators-log-based-monitoring\/","description":"<p>\u4e00\u822c\u6765\u8bf4\uff0c\u76d1\u63a7 Substrate \u6846\u67b6\u5f00\u53d1\u7684\u533a\u5757\u94fe\u8282\u70b9\uff0c\u53ef\u4ee5\u4f7f\u7528\u5b98\u65b9\u63a8\u8350\u7684 Prometheus + Grafana \u6280\u672f\u6808\u3002\u5728\u8282\u70b9\u6570\u91cf\u6bd4\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u8fd9\u5957\u65b9\u6848\u7684\u4f18\u52bf\u6bd4\u8f83\u5bb9\u6613\u4f53\u73b0\u51fa\u6765\uff0c\u6211\u7ed9\u516c\u53f8\u7684\u5b98\u65b9\u8282\u70b9\u4e5f\u662f\u8fd9\u4e48\u914d\u7684\u3002\u4e0d\u8fc7\u8fd1\u671f Darwinia \u4e3b\u7f51\u4e0a\u7ebf\uff0c\u6709\u4e0d\u5c11\u540c\u4e8b\u60f3\u8981\u8dd1\u81ea\u5df1\u7684\u9a8c\u8bc1\u4eba\uff08<code>validator<\/code>\uff09\u8282\u70b9\u3002\u5bf9\u4e8e\u4ed6\u4eec\u6765\u8bf4\uff1a<\/p>\n<ul>\n<li>\u642d\u5efa\u4e00\u5957 Prometheus \u8fd8\u8981\u81ea\u5df1\u8c03\u9762\u677f\u548c\u89c4\u5219\uff0c\u6210\u672c\u5b9e\u5728\u592a\u9ad8\uff1b<\/li>\n<li>\u53ea\u7528 PM2\u3001Supervisord\u3001Systemd \u4e4b\u7c7b\u7684\u5b88\u62a4\u8fdb\u7a0b\u901a\u5e38\u53ea\u80fd\u4fdd\u8bc1\u8fdb\u7a0b\u6ca1\u6302\uff0c\u4f46\u8282\u70b9\u662f\u5426\u6b63\u5e38\u51fa\u5757\u662f\u672a\u77e5\u7684\uff08\u4f8b\u5982\u65ad\u7f51\u30010 Peer \u7684\u60c5\u51b5\uff0c\u8282\u70b9\u8fdb\u7a0b\u8fd8\u5728\uff0c\u5176\u5b9e\u5df2\u7ecf\u6389\u7ebf\u4e86\uff09\u3002<\/li>\n<\/ul>\n<p>\u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0a\u8fd9\u4e24\u4e2a\u95ee\u9898\uff0c\u6211\u641e\u4e86\u4e00\u5957\u975e\u5e38\u7b80\u6613\u7684\u3001\u57fa\u4e8e\u65e5\u5fd7\u7684\u76d1\u63a7\u9884\u8b66\u65b9\u6cd5\u3002<\/p>"},{"title":"Alertmanager \u901a\u8fc7\u963f\u91cc\u4e91\u4f01\u4e1a\u90ae\u4ef6 SMTP \u670d\u52a1\u53d1\u4fe1","link":"https:\/\/wi1dcard.dev\/posts\/alertmanager-smtp-setup-for-alibaba-mail-service\/","pubDate":"Thu, 24 Sep 2020 14:27:06 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/alertmanager-smtp-setup-for-alibaba-mail-service\/","description":"<p>\u963f\u91cc\u4e91\u6536\u8d2d\u4e07\u7f51\u4e4b\u540e\uff0c\u51e0\u4e4e\u4e0d\u8d5a\u94b1\u7684\u90ae\u4ef6\u670d\u52a1\u8fd8\u771f\u662f\u4e0d\u7ef4\u62a4\u4e0d\u8fed\u4ee3\u4e86 \u2014 \u4e0d\u652f\u6301 DKIM\uff0c\u6ca1\u6cd5\u914d DMARC\uff0c\u5c31\u8fde SMTP \u4e5f\u4e0d\u652f\u6301 STARTTLS 587 \u7aef\u53e3\u3002<\/p>"},{"title":"Integrate ServiceMonitor matchLabels with Kustomize commonLabels","link":"https:\/\/wi1dcard.dev\/posts\/integrate-servicemonitor-matchlabels-with-kustomize-commonlabels\/","pubDate":"Sat, 12 Sep 2020 09:35:43 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/integrate-servicemonitor-matchlabels-with-kustomize-commonlabels\/","description":"<p>While I deploying <a href=\"https:\/\/github.com\/wi1dcard\/v2ray-exporter\" target=\"_blank\">v2ray-exporter<\/a> with <a href=\"https:\/\/kustomize.io\/\" target=\"_blank\">Kustomize<\/a>, I realized that <code>commonLabels<\/code> in <code>kustomization.yaml<\/code> doesn&rsquo;t take care of the <code>spec.selector.matchLabels<\/code> field in <code>ServiceMonitor<\/code>s. That makes sense, as ServiceMonitor is a part of CoreOS&rsquo;s Prometheus Operator project, neither included nor maintained by Kubernetes. But how can we direct Kustomize to fill the labels in ServiceMonitors or even any fields in customized resources?<\/p>"},{"title":"Convert OpenWrt Image to ESXi VMDK","link":"https:\/\/wi1dcard.dev\/posts\/convert-openwrt-image-to-esxi-vmdk\/","pubDate":"Sat, 12 Sep 2020 09:04:26 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/convert-openwrt-image-to-esxi-vmdk\/","description":"<p>The official doc of <a href=\"https:\/\/openwrt.org\/docs\/guide-user\/virtualization\/vmware\" target=\"_blank\">OpenWrt on VMware HowTo<\/a> seems already outdated, and there&rsquo;s no explaination of how to fix <code>Unsupported or invalid disk type 2 for 'scsi0:0'. Ensure that the disk has been imported.<\/code> on ESXi 6.7. Here after looked into some clues on Chinese router forums, I found an usable method to convert the image into ESXi VMDK format on macOS.<\/p>"},{"title":"\u4f7f\u7528 Git Tag \u548c CI \u5e72\u51c0\u5730\u53d1\u5e03 NPM \u5305","link":"https:\/\/wi1dcard.dev\/posts\/npm-publish-with-git-tag-and-ci-cd\/","pubDate":"Wed, 09 Sep 2020 10:04:25 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/npm-publish-with-git-tag-and-ci-cd\/","description":"<p>\u6700\u8fd1\u5728\u63a2\u7d22\u300c\u5982\u4f55\u53d1\u5e03 NPM \u5305\u300d\u7684\u8fc7\u7a0b\u4e2d\uff0c\u53d1\u73b0\u591a\u6570\u4eba\u7684\u601d\u8def\u8981\u4e48\u5b8c\u5168\u4e0d\u7528 CI\uff0c\u4fee\u6539 <code>package.json<\/code> \u5185\u7248\u672c\u53f7\u4e4b\u540e\u624b\u52a8\u53d1\u5e03\uff1b\u8981\u4e48\u7ed3\u5408 CI\uff0c\u4f46\u9700\u8981 CI \u751f\u6210\u65b0\u7248\u672c\u53f7\u4e4b\u540e\u4fee\u6539 <code>package.json<\/code>\uff0c\u6700\u540e\u673a\u5668\u4eba\u6267\u884c Git Commit + Git Tag \u5e76\u63a8\u9001\u5230\u4ed3\u5e93\u5185\u3002\u8fd9\u4e24\u79cd\u505a\u6cd5\u6211\u90fd\u4e0d\u662f\u5f88\u559c\u6b22\uff0c\u524d\u8005\u6ca1\u6709 CI \u4e0d\u80fd\u5fcd\uff0c\u540e\u8005\u4e0d\u4ec5\u8981\u6c42 CI \u6709\u5199\u6743\u9650\uff0c\u800c\u4e14\u4f1a\u4ed3\u5e93\u5185\u589e\u52a0\u8bb8\u591a\u5f62\u5982 <code>Release v...<\/code> \u4e4b\u7c7b\u7684\u63d0\u4ea4\uff0c\u5f3a\u8feb\u75c7\u8868\u793a\u63a5\u53d7\u4e0d\u4e86\u3002<\/p>\n<p>\u4e0d\u8fc7\u7ecf\u8fc7\u4e00\u756a\u7814\u7a76\uff0c\u6211\u8fd8\u662f\u627e\u5230\u4e86\u4e24\u79cd\u6bd4\u8f83\u300c\u5e72\u51c0\u300d\u7684\u601d\u8def\uff0c\u6765\u770b\u770b\u5427\u3002<\/p>"},{"title":"Terraform Quick Start with Alibaba Cloud","link":"https:\/\/wi1dcard.dev\/posts\/terraform-quick-start-with-alibabacloud\/","pubDate":"Fri, 29 May 2020 09:00:21 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/terraform-quick-start-with-alibabacloud\/","description":"<p>As you probably heard Terraform before, it&rsquo;s a great DevOps tool that can help you build your infrastructures with configurations and codes, aka Infrastructure as Code.<\/p>\n<p>Terraform has a bunch of great integrations with cloud platforms, some of them are maintained by Terraform official, such as Azure provider and AWS provider. However, Alibaba Cloud (which is the biggest public cloud company in China mainland) provider is created and maintained by alibaba itself so far. Lack of quick start guide and documentation makes it a little bit hard to get started with.<\/p>"},{"title":"\u6211\u64b0\u5199\u7684 RightCapital \u6280\u672f\u535a\u5ba2\u6587\u7ae0\u94fe\u63a5","link":"https:\/\/wi1dcard.dev\/posts\/rightcapital-blog-posts-composed-by-me\/","pubDate":"Mon, 13 Apr 2020 00:42:49 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/rightcapital-blog-posts-composed-by-me\/","description":"\u5df2\u53d1\u5e03\u7684 DevOps \u81ea\u52a8\u5316\u5b9e\u8df5 - \u5b9a\u65f6\u4efb\u52a1\u76d1\u63a7\u7684\u8fdb\u5316\u4e4b\u8def \u4e00\u6b21 KubeCPUOvercommit \u544a\u8b66\u6392\u67e5\u8fc7\u7a0b\u5c0f\u8bb0 DevOps \u81ea\u52a8\u5316\u5b9e\u8df5 \u2014 \u5728 K8s \u4e0a\u81ea\u52a8\u5316\u6267\u884c Database Migration \u57fa\u4e8e UniFi \u5168\u5bb6\u6876\u7684\u4f01\u4e1a Wi-Fi \u5ba2\u6237\u7aef\u7ba1\u7406 DevOps \u81ea\u52a8\u5316\u5b9e\u8df5 \u2014 \u7ba1\u7406 Incident \u5de5\u4f5c\u6d41 \u8fc1\u79fb\u81f3\u4e2a\u4eba\u535a\u5ba2\u7684 \u7531\u4e8e\u76f8\u5173\u4eba\u5458\u957f\u671f\u62d6\u5ef6\u5ba1\u7a3f\u3001\u53d1\u7a3f\uff0c\u5c06\u90e8\u5206\u6587\u7ae0\u8fc1\u79fb\u81f3\u4e2a\u4eba\u535a\u5ba2\u53d1\u5e03\u3002"},{"title":"\u76d8\u70b9\u4f7f macOS \u5e94\u7528\u6d41\u91cf\u901a\u8fc7\u4ee3\u7406\u7684\u591a\u79cd\u65b9\u5f0f","link":"https:\/\/wi1dcard.dev\/posts\/redirecting-network-traffic-of-various-apps-on-macos-to-proxies\/","pubDate":"Sat, 28 Mar 2020 04:29:03 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/redirecting-network-traffic-of-various-apps-on-macos-to-proxies\/","description":"<p>\u5728\u5f00\u53d1\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u7ecf\u5e38\u9700\u8981\u4f7f\u7528\u5230\u56fd\u5916\u7684\u8d44\u6e90\uff0c\u4f8b\u5982\u5404\u79cd\u5305\u4f9d\u8d56\u7b49\u3002\u56fd\u5185\u76ee\u524d\u6bd4\u8f83\u666e\u904d\u7684\u505a\u6cd5\u662f\u4f7f\u7528\u7531\u77e5\u540d\u7b2c\u4e09\u65b9\u7ef4\u62a4\u7684\u56fd\u5185\u955c\u50cf\u3002\u867d\u7136\u65b9\u4fbf\uff0c\u4f46\u4e5f\u5b58\u5728\u4e00\u4e9b\u65e0\u6cd5\u907f\u514d\u7684\u95ee\u9898\uff0c\u4f8b\u5982\uff1a<\/p>\n<ul>\n<li>\u955c\u50cf\u53ef\u9760\u6027\u672a\u77e5\uff0c\u51fa\u95ee\u9898\u65f6\u6211\u4eec\u65e0\u80fd\u4e3a\u529b\uff0c\u53ea\u80fd\u7b49\u5f85\u7b2c\u4e09\u65b9\u4fee\u590d\u3002<\/li>\n<li>\u955c\u50cf\u540c\u6b65\u65f6\u95f4\u672a\u77e5\uff0c\u53ef\u80fd\u5b58\u5728\u6570\u636e\u6ede\u540e\u3002<\/li>\n<li>\u5b58\u5728\u5b89\u5168\u9690\u60a3\uff08\u5c3d\u7ba1\u53ef\u80fd\u6027\u8f83\u5c0f\uff09\u3002<\/li>\n<\/ul>\n<p>\u56e0\u6b64\uff0c\u6211\u4e2a\u4eba\u66f4\u52a0\u63a8\u8350\u4f9d\u8d56\u4ee3\u7406\u6765\u5b9e\u73b0\u5feb\u901f\u8bbf\u95ee\u6240\u9700\u8d44\u6e90\u7684\u76ee\u7684\u3002\u672c\u6587\u4e0d\u4f1a\u6d89\u53ca\u4efb\u4f55\u8fdd\u53cd\u6cd5\u5f8b\u6cd5\u89c4\u7684\u5185\u5bb9\uff0c\u53ea\u6765\u8c08\u8c08 macOS \u4e0b\u5982\u4f55\u8ba9\u4e0d\u540c\u5e94\u7528\u7684\u6d41\u91cf\u901a\u8fc7 <strong>\u672c\u5730\u7684<\/strong> \u4ee3\u7406\u670d\u52a1\u3002<\/p>"},{"title":"K8s \u4e0b\u7684\u5e94\u7528\u7ba1\u7406 \u2014 \u79c1\u6709 Helm Chart \u7684\u521b\u5efa\u4e0e\u7ef4\u62a4","link":"https:\/\/wi1dcard.dev\/posts\/create-and-maintain-a-helm-chart\/","pubDate":"Fri, 27 Mar 2020 23:14:36 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/create-and-maintain-a-helm-chart\/","description":"<p>\u5728\u4e4b\u524d\u7684\u6587\u7ae0\u4e2d\uff0c\u6211\u4ecb\u7ecd\u4e86\uff1a<\/p>\n<ul>\n<li>\u5982\u4f55\u4f7f\u7528 GitLab CI \u5b9e\u73b0\u6301\u7eed\u90e8\u7f72\u3002<\/li>\n<li>\u5982\u4f55\u4f7f\u7528 Helm \u548c Helmfile \u90e8\u7f72\u5e94\u7528\u5230 Kubernetes \u96c6\u7fa4\u4e2d\u3002<\/li>\n<\/ul>\n<p>\u4f46\u8fd9\u5176\u4e2d\u7f3a\u5c11\u4e86\u5173\u952e\u7684\u4e00\u73af\uff1a\u521b\u5efa\u4e00\u4e2a\u5c5e\u4e8e\u4f60\u7684\u9879\u76ee\u7684 chart\uff0c\u8fd9\u6837\u624d\u80fd\u628a\u6211\u4eec\u5f00\u53d1\u7684\u9879\u76ee\u901a\u8fc7 Helm \u90e8\u7f72\u5230\u96c6\u7fa4\u4e2d\u3002\u672c\u6587\u5c06\u4f1a\u4e3a\u5927\u5bb6\u4ecb\u7ecd\u6211\u4eec\u5982\u4f55\u521b\u5efa\u5e76\u7ef4\u62a4 chart\uff0c\u4ece\u800c\u6253\u901a\u4ece\u63d0\u4ea4\u4ee3\u7801\u5230\u90e8\u7f72\u7684\u5b8c\u6574\u6d41\u7a0b\u3002<\/p>"},{"title":"K8s \u4e0b\u7684 TLS \u8bc1\u4e66\u7ba1\u7406 \u2014 \u4e86\u89e3 Cert-Manager","link":"https:\/\/wi1dcard.dev\/posts\/getting-to-know-cert-manager\/","pubDate":"Fri, 27 Mar 2020 20:53:01 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/getting-to-know-cert-manager\/","description":"<p>\u5728 Kubernetes \u4e2d\u5b9e\u73b0 TLS termination \u975e\u5e38\u5bb9\u6613\u3002Ingress \u8d44\u6e90\u5305\u542b\u4e00 <code>secretName<\/code> \u5c5e\u6027\uff0c\u7528\u4e8e\u6307\u5b9a Secret \u8d44\u6e90\u540d\u79f0\u3002\u5728\u53d6\u5f97\u8bc1\u4e66\u540e\uff0c\u901a\u8fc7 <code>kubectl create secret tls tls-secret --key tls.key --cert tls.crt<\/code> \u521b\u5efa Secret \u5b58\u50a8\u8bc1\u4e66\uff0c\u4fbf\u53ef\u4ee5\u88ab Ingress \u4f7f\u7528\u4e86\u3002<\/p>\n<p>\u552f\u72ec\u6709\u4e9b\u4e0d\u65b9\u4fbf\u7684\u662f\uff0c\u8bc1\u4e66\u7684\u7533\u8bf7\u4ee5\u53ca\u521b\u5efa Secret \u7684\u8fc7\u7a0b\u9700\u8981\u624b\u52a8\u6267\u884c\u3002\u5728\u8bc1\u4e66\u5373\u5c06\u8fc7\u671f\u524d\uff0c\u8fd8\u9700\u8981\u4eba\u5de5\u7eed\u671f\u3002\u5728\u4f20\u7edf VM \u90e8\u7f72\u7684\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u4f7f\u7528\u4f8b\u5982 <a href=\"https:\/\/certbot.eff.org\/\" target=\"_blank\">certbot<\/a> \u6216 <a href=\"https:\/\/github.com\/acmesh-official\/acme.sh\" target=\"_blank\">acme.sh<\/a> \u7b49\u9879\u76ee\uff0c\u914d\u5408 <a href=\"https:\/\/letsencrypt.org\/\" target=\"_blank\">Let&amp;rsquo;s Encrypt<\/a> \u81ea\u52a8\u7533\u8bf7\u5e76\u5b9a\u671f\u7eed\u7b7e\u8bc1\u4e66\u3002\u800c\u5728 K8s \u96c6\u7fa4\u4e2d\u5982\u4f55\u964d\u4f4e\u8bc1\u4e66\u7ef4\u62a4\u6210\u672c\uff1f\u6765\u770b\u770b\u6211\u4eec\u662f\u600e\u4e48\u505a\u7684\u3002<\/p>"},{"title":"K8s \u4e0b\u7684\u5e94\u7528\u7ba1\u7406 \u2014 \u4e86\u89e3 Helmfile","link":"https:\/\/wi1dcard.dev\/posts\/getting-to-know-helmfile\/","pubDate":"Tue, 24 Mar 2020 23:45:01 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/getting-to-know-helmfile\/","description":"<p>\u5728\u4e0a\u4e00\u7bc7\u6587\u7ae0\u4e2d\uff0c\u4e3a\u5927\u5bb6\u4ecb\u7ecd\u4e86 Helm \u7684\u521d\u6b65\u4f7f\u7528\u3002\u7136\u800c\u8fd9\u4ecd\u7136\u4e0d\u80fd\u6ee1\u8db3\u6211\u53f8\u7684\u5de5\u4f5c\u6d41\uff0c\u4e3b\u8981\u95ee\u9898\u6709\uff1a<\/p>\n<ol>\n<li>Helm \u4e0d\u63d0\u4f9b <code>apply<\/code> \u547d\u4ee4\uff1b\u56e0\u6b64\u5728 CI\/CD \u573a\u666f\u4e2d\u5fc5\u987b\u8003\u8651\u5230\u5224\u65ad\u662f install \u8fd8\u662f upgrade\u3002<\/li>\n<li>\u4e0d\u65b9\u4fbf\u63a7\u5236\u5b89\u88c5\u7684 chart \u7248\u672c\uff1b\u4f8b\u5982\u6307\u5b9a\u7248\u672c\u8303\u56f4\u3001\u9501\u5b9a\u67d0\u4e00\u7248\u672c\u7b49\u3002<\/li>\n<li>Values \u5fc5\u987b\u662f\u7eaf\u6587\u672c\uff1b\u4e0d\u652f\u6301\u6a21\u677f\u6e32\u67d3\u3001\u4e0d\u65b9\u4fbf\u533a\u5206\u73af\u5883\u3002<\/li>\n<\/ol>\n<p>\u56e0\u6b64\u6211\u4eec\u9700\u8981 <code>Helm Releases as Code<\/code>\u3002\u6211\u542c\u8bf4\u8fc7\u7684\u4ea7\u54c1\u6709 <a href=\"https:\/\/github.com\/Praqma\/helmsman\" target=\"_blank\">Helmsman<\/a> \u548c <a href=\"https:\/\/github.com\/roboll\/helmfile\" target=\"_blank\">Helmfile<\/a> \u4e24\u6b3e\u3002\u76ee\u524d\u6211\u4eec\u56e2\u961f\u5df2\u7ecf\u4f7f\u7528\u540e\u8005\u4e00\u6bb5\u65f6\u95f4\uff0c\u5e76\u4e14\u6709\u56e2\u961f\u6210\u5458\u8d21\u732e\u8fc7\u90e8\u5206\u4ee3\u7801\u3002<\/p>"},{"title":"K8s \u4e0b\u7684\u5e94\u7528\u7ba1\u7406 \u2014 \u4e86\u89e3 Helm","link":"https:\/\/wi1dcard.dev\/posts\/getting-to-know-helm\/","pubDate":"Tue, 24 Mar 2020 00:35:55 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/getting-to-know-helm\/","description":"<p><a href=\"https:\/\/helm.sh\/\" target=\"_blank\">Helm<\/a> \u662f\u4e00\u6b3e\u9488\u5bf9 Kubernetes \u7684\u300c\u5305\u7ba1\u7406\u5668\u300d\uff0c\u867d\u8bf4\u79f0\u5b83\u4e3a\u5305\u7ba1\u7406\u5668\uff0c\u5176\u5b9e\u4e0e\u5e94\u7528\u5f00\u53d1\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u7684\u5305\u7ba1\u7406\u5668\u7565\u6709\u4e0d\u540c\uff0c\u540e\u8005\u7ba1\u7406\u7684\u662f\u5e94\u7528\u5f00\u53d1\u8fc7\u7a0b\u4e2d\u7684\u4f9d\u8d56\uff0cHelm \u5219\u7ba1\u7406\u7740 Kubernetes \u4e2d\u5e94\u7528\u90e8\u7f72\u65f6\u5404\u9879\u8d44\u6e90\u7684\u4f9d\u8d56\u3002<\/p>\n<p>\u5982\u679c\u4f60\u5bf9 Kubernetes \u6709\u4e00\u5b9a\u4e86\u89e3\uff0c\u76f8\u4fe1\u4f60\u5df2\u7ecf\u5bf9 Deployment\u3001Service\u3001Ingress \u7b49\u8d44\u6e90\u6709\u4e86\u4e00\u5b9a\u8ba4\u8bc6\uff0c\u5927\u591a\u6570 Web \u5e94\u7528\u5728\u90e8\u7f72\u5230 K8s \u96c6\u7fa4\u4e0a\u65f6\u9700\u8981\u5927\u91cf\u4e0d\u540c\u7c7b\u578b\u7684\u8d44\u6e90\u3002\u4f60\u53ef\u4ee5\u5c06\u8fd9\u4e9b\u8d44\u6e90\u58f0\u660e\u7684 YAML \u6587\u4ef6\u653e\u5728\u540c\u4e00\u4e2a\u6587\u4ef6\u5939\u4e0b\u7ba1\u7406\uff0c\u4f46\u662f\u968f\u7740\u6570\u91cf\u7684\u589e\u52a0\uff0c\u5982\u4f55\u590d\u7528\u8fd9\u4e9b YAML\u3001\u5982\u4f55\u7075\u6d3b\u53c8\u4e0d\u7e41\u7410\u5730\u8c03\u6574\u914d\u7f6e\u4ee5\u9002\u5e94\u4e0d\u540c\u73af\u5883\u3001\u5982\u4f55\u5c06\u8fd9\u4e9b YAML \u4f5c\u4e3a\u4e00\u4e2a\u6574\u4f53\u7ba1\u7406\uff0c\u6210\u4e86\u4e00\u4e2a\u4e0d\u5c0f\u7684\u95ee\u9898\u3002<\/p>"},{"title":"\u642d\u5efa\u5f02\u6784 CPU \u7ec4\u6210\u7684\u8fb9\u7f18\u8ba1\u7b97 Kubernetes \u96c6\u7fa4","link":"https:\/\/wi1dcard.dev\/posts\/setup-an-edge-computing-cluster-with-different-archs-of-cpus\/","pubDate":"Thu, 27 Feb 2020 21:13:38 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/setup-an-edge-computing-cluster-with-different-archs-of-cpus\/","description":"<p>\u5e73\u65f6\u9664\u4e86\u7ef4\u62a4\u516c\u53f8\u548c\u79c1\u4eba\u5728\u516c\u6709\u4e91\u7684 Kubernetes clusters \u4e4b\u5916\uff0c\u4e2a\u4eba\u7f51\u7edc\u73af\u5883\u4e0b\u8fd8\u6709\u4e9b\u9700\u8981\u8fd0\u884c\u5728\u672c\u5730\u7684 workload\uff1b\u6bd4\u5982\u7528\u4e8e\u76d1\u63a7\u672c\u5730\u8def\u7531\u8bbe\u5907\uff08~\u4f5c~ XD\uff09\u7684 Prometheus exporters \u548c\u4e00\u4e9b\u65b0\u5947\u73a9\u610f\u513f\u3002\u4e3a\u4e86\u80fd\u591f\u8fd0\u884c\u8fd9\u4e9b\u5e94\u7528\uff0c\u6211\u5728\u5bb6\u7ec4\u5efa\u4e86\u4e00\u5957\u300c\u8fb9\u7f18\u8ba1\u7b97\u96c6\u7fa4\u300d\uff0c\u6765\u770b\u770b\u662f\u600e\u4e48\u505a\u7684\u5427\u3002<\/p>"},{"title":"\u8de8\u9879\u76ee GitLab CI \u914d\u7f6e\u590d\u7528\u4e0e\u7ba1\u7406","link":"https:\/\/wi1dcard.dev\/posts\/reuse-gitlab-ci-configs-across-projects\/","pubDate":"Wed, 26 Feb 2020 22:19:06 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/reuse-gitlab-ci-configs-across-projects\/","description":"<p>\u4e3a\u4e86\u80fd\u591f\u4f7f\u4ee3\u7801\u5728\u4e0d\u540c\u9879\u76ee\u590d\u7528\uff0c\u6211\u53f8\u62bd\u8c61\u3001\u7f16\u5199\u4e86\u8bb8\u591a\u79c1\u6709 libraries\u3002\u5b83\u4eec\u7684\u6e90\u4ee3\u7801\u88ab\u7edf\u4e00\u5b58\u653e\u5728 GitLab\uff0c\u7531 CI \u786e\u4fdd\u4ee3\u7801\u98ce\u683c\u4e00\u81f4\uff0c\u5e76\u6267\u884c\u5355\u5143\u6d4b\u8bd5\u548c\u9759\u6001\u68c0\u67e5\u7b49\u3002\u7531\u4e8e\u4ed3\u5e93\u6570\u91cf\u4f17\u591a\uff0c\u5982\u4f55\u6709\u6548\u5730\u7ec4\u7ec7\u548c\u7ba1\u7406 CI \u914d\u7f6e\u6210\u4e86\u95ee\u9898\u3002\u7ecf\u8fc7\u957f\u65f6\u95f4\u7684\u63a2\u7d22\u548c\u4f18\u5316\uff0c\u6211\u6574\u7406\u4e86\u4e00\u4e9b\u7ecf\u9a8c\uff0c\u5e0c\u671b\u5bf9\u4f60\u6709\u6240\u5e2e\u52a9\u3002<\/p>"},{"title":"22 \u5c81\u7684\u6742\u8c08","link":"https:\/\/wi1dcard.dev\/posts\/thoughts-after-my-22th-birthday\/","pubDate":"Mon, 24 Feb 2020 13:50:52 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/thoughts-after-my-22th-birthday\/","description":"<p>\u5ffd\u7136\u53d1\u73b0\u519c\u5386\u65b0\u5e74\u5df2\u7ecf\u8fc7\u53bb\u4e86\u4e00\u4e2a\u6708\u3002\u8fd9\u4e00\u4e2a\u6708\u6211\u5e72\u4e86\u5565\uff1f\uff01\uff1f<\/p>"},{"title":"Connect to Sangfor SSL VPNs Without the Terrible Client","link":"https:\/\/wi1dcard.dev\/posts\/connect-to-sangfor-ssl-vpn-without-the-terrible-client\/","pubDate":"Fri, 10 Jan 2020 20:11:33 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/connect-to-sangfor-ssl-vpn-without-the-terrible-client\/","description":"<p>The VPN provider of Nanjing University has recently been changed to Sangfor, which is one of the biggest company who provides the corporate SDN, VPN and other enterprise network solutions in China. Although, the <a href=\"https:\/\/vpn.nju.edu.cn\/portal\/#!\/login\" target=\"_blank\">SSL VPN client<\/a> from Sangfor is extremely hard to use - Changing the default DNS server without any notification, hijacking all UDP packet that dport is 53, even removing all the default route generated from the CIDR of interfaces which prevents the client connect to any LAN devices except <code>**.**.**.1<\/code>. These issues have been described as &ldquo;features&rdquo; of their products from a training manual that I found in <a href=\"https:\/\/wenku.baidu.com\/view\/51fec468a45177232f60a2d2.html\" target=\"_blank\">Baidu Wenku<\/a>.<\/p>"},{"title":"\u4e00\u7bc7\u53c8\u957f\u53c8\u4e4f\u5473\u7684\u5e74\u7ec8\u603b\u7ed3\u548c\u5c55\u671b","link":"https:\/\/wi1dcard.dev\/posts\/hello-2020\/","pubDate":"Tue, 31 Dec 2019 19:23:48 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/hello-2020\/","description":"<p>\u8f6c\u773c\u95f4\u5230\u4e86 2019 \u5e74\u672b\uff0c\u8fd8\u8bb0\u5f97\u53bb\u5e74\u4e5f\u5199\u8fc7\u4e00\u7bc7\u7c7b\u4f3c\u7684 <a href=\"https:\/\/wi1dcard.dev\/posts\/hello-2019\/\" target=\"_blank\">\u535a\u5ba2<\/a>\uff1b\u8ba1\u5212\u4eca\u5e74\u7684\u300c\u5e74\u7ec8\u603b\u7ed3\u300d\u86ee\u4e45\u4e86\uff0c\u53ea\u662f\u89c9\u5f97\u65f6\u95f4\u8fd8\u65e9\u4fbf\u4e00\u76f4\u6ca1\u6709\u52a8\u624b\uff0c\u76f4\u5230\u4eca\u5929\u624d\u604d\u7136 \u2014\u2014 \u5df2\u7ecf\u662f 2019 \u5e74\u6700\u540e\u4e00\u5929\u4e86\u3002<\/p>"},{"title":"Increase Node.js V8 Memory Limit","link":"https:\/\/wi1dcard.dev\/posts\/increase-node-js-v8-memory-limit\/","pubDate":"Thu, 28 Nov 2019 21:27:50 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/increase-node-js-v8-memory-limit\/","description":"<p>After a few days working on Salesforce integration, I finnally finished a simple CLI edtion of <a href=\"https:\/\/github.com\/forcedotcom\/dataloader\" target=\"_blank\">DataLoader<\/a> using prune TypeScript. Within lots of CSV rows loaded into memory, the node engine always crashs around 130k of records. In order to get this job done as quick as possible, I have to increase the max memory of Node.js.<\/p>"},{"title":"List All IP Addresses and the Number of Connections to a Port","link":"https:\/\/wi1dcard.dev\/posts\/list-connections-group-by-ip\/","pubDate":"Wed, 13 Nov 2019 21:20:16 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/list-connections-group-by-ip\/","description":"<p>It&rsquo;s been a while maintaining the proxy services for my work friends who are in Beijing office. These days I tried to collect some basic metrics like online IP addresses and its connections. And I found a very simple way to do it with only <code>netstat<\/code> and several text process tools.<\/p>"},{"title":"Find Your Public IP Address via DNS Protocol","link":"https:\/\/wi1dcard.dev\/posts\/find-your-public-ip-via-dns-protocol\/","pubDate":"Thu, 07 Nov 2019 17:11:27 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/find-your-public-ip-via-dns-protocol\/","description":"<p>OpenDNS has a &ldquo;un-official&rdquo; (I didn&rsquo;t find any docs at least) API for returning your public IP, by a normal DNS query.<\/p>"},{"title":"Helm Chart Resource Names Conflict Due to the Fullname Helper","link":"https:\/\/wi1dcard.dev\/posts\/helm-template-resource-already-exists\/","pubDate":"Tue, 05 Nov 2019 19:23:42 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/helm-template-resource-already-exists\/","description":"<p>Recently, I&rsquo;ve been working against Kubernetes and Helm for a while. Today, I faced a strange problem that could only be triggered in a very very specific condition. After determined what happened under the hood, I decided to write it down in case someone else needs it.<\/p>\n<blockquote>\n<p>Also, BTW, to practice my English. :D<\/p>\n<\/blockquote>"},{"title":"\u6211\u5982\u4f55\u5c06\u535a\u5ba2\u8fc1\u79fb\u5230 Kubernetes - II","link":"https:\/\/wi1dcard.dev\/posts\/migrate-to-kubernetes-ii\/","pubDate":"Thu, 12 Sep 2019 18:58:42 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/migrate-to-kubernetes-ii\/","description":"<p>\uff08\u63a5\u4e0a\u6587\uff09<\/p>\n<p>\u524d\u9762\u7684\u90e8\u5206\u4ecb\u7ecd\u4e86\u5982\u4f55\u4e3a\u6211\u7684\u535a\u5ba2\u6253\u5305 Docker \u955c\u50cf\uff0c\u63a5\u4e0b\u6765\u5c31\u662f\u91cd\u5934\u620f \u2014\u2014 \u90e8\u7f72\u5230 Kubernetes\u3002<\/p>"},{"title":"\u6211\u5982\u4f55\u5c06\u535a\u5ba2\u8fc1\u79fb\u5230 Kubernetes - I","link":"https:\/\/wi1dcard.dev\/posts\/migrate-to-kubernetes-i\/","pubDate":"Wed, 11 Sep 2019 22:06:15 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/migrate-to-kubernetes-i\/","description":"<p>\u6700\u8fd1 Kubernetes \u7684\u53d1\u5c55\uff0c\u4ee5\u53ca\u5728\u6211\u53f8\u7684\u5927\u91cf\u5e94\u7528\uff0c\u81ea\u5df1\u4e5f\u8feb\u4e0d\u53ca\u5f85\u60f3\u8981\u5c1d\u5c1d\u9c9c\uff0c\u867d\u7136\u6211\u7684\u535a\u5ba2\u662f\u57fa\u4e8e Hexo \u7684\u7eaf\u9759\u6001\u7ad9\u70b9\uff0c\u4f46\u8fd9\u5e76\u4e0d\u80fd\u963b\u6321\u6211\u628a\u5b83\u8fc1\u79fb\u4e0a Kubernetes\uff01\u6bd5\u7adf&hellip; \u76f8\u6bd4\u4e8e GitHub Pages \u7075\u6d3b\u6027\u66f4\u597d\u53ef\u63a7\u6027\u66f4\u9ad8\uff0cemmmm&hellip; \u597d\u4e86\u6211\u7f16\u4e0d\u4e0b\u53bb\u4e86\uff0c\u603b\u4e4b\uff0c\u751f\u547d\u5728\u4e8e\u6298\u817e\ud83d\ude02\uff0c\u6211\u4eec\u5f00\u59cb\u5427\u3002<\/p>"},{"title":"\u5141\u8bb8 macOS \u5b89\u88c5\u4efb\u4f55\u672a\u7b7e\u540d\u7684 App","link":"https:\/\/wi1dcard.dev\/posts\/disable-system-policy-on-macos\/","pubDate":"Fri, 14 Jun 2019 20:45:35 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/disable-system-policy-on-macos\/","description":"sudo spctl --master-disable"},{"title":"\u5c06 NanoPi \u914d\u7f6e\u4e3a\u5355\u81c2\u8def\u7531\u5668","link":"https:\/\/wi1dcard.dev\/posts\/configure-nanopi-as-a-router\/","pubDate":"Tue, 11 Jun 2019 21:37:40 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/configure-nanopi-as-a-router\/","description":"<p>\u5728\u8fd1\u671f\u6298\u817e\u79d1\u5b66\u4e0a\u7f51\u7f51\u5173\u7684\u8fc7\u7a0b\u4e2d\uff0c\u987a\u4fbf\u7814\u7a76\u4e86\u4e00\u4e0b VLAN\u3002\u901a\u8fc7\u9002\u5f53\u5730\u914d\u7f6e\uff0c\u4e00\u53f0\u53ea\u5177\u5907\u5355\u7269\u7406\u7f51\u53e3\u7684 NanoPi NEO2\uff0c\u540c\u6837\u53ef\u4ee5\u53d8\u8eab\u300c\u5355\u81c2\u300d\u8def\u7531\u5668\u3002<\/p>"},{"title":"\u5982\u4f55\u4e13\u4e1a\u5730\u8868\u8fbe\u300c\u6211\u4e0a\u4e0d\u4e86\u7f51\u4e86\uff01\u300d","link":"https:\/\/wi1dcard.dev\/posts\/inspect-network-failure-like-a-pro\/","pubDate":"Fri, 24 May 2019 22:48:18 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/inspect-network-failure-like-a-pro\/","description":"<p>\u4ece\u4e8b\u8fd0\u7ef4\u5de5\u7a0b\u5e08\uff08\u517c\u516c\u53f8\u7f51\u7ba1\ud83d\ude02\uff09\u4ee5\u6765\uff0c\u9047\u5230\u4e0d\u5c11\u5404\u5f0f\u5404\u6837\u7684\u7f51\u7edc\u6545\u969c\uff0c\u6709\u7684\u6765\u81ea\u4e8e\u8def\u7531\u5668\u95ee\u9898\uff0c\u6709\u7684\u5219\u662f\u5ba2\u6237\u7aef\u914d\u7f6e\u9519\u8bef\u3002\u800c\u5f00\u53d1\u4eba\u5458\u7684\u53cd\u9988\u5927\u591a\u7c7b\u4f3c\u4e8e\uff1a<\/p>\n<ul>\n<li>\u300c\u6211\u4e0a\u4e0d\u4e86\u7f51\u4e86\uff01\u300d<\/li>\n<li>\u300c\u7f51\u7edc\u5361\u4e86\u5417\uff1f\u4e00\u76f4\u5728\u52a0\u8f7d&hellip;\u300d<\/li>\n<\/ul>"},{"title":"\u5728 Linux \u4e2d\u83b7\u53d6\u9ed8\u8ba4\u7f51\u5173\u548c CIDR","link":"https:\/\/wi1dcard.dev\/posts\/gather-gateway-ip-and-cidr\/","pubDate":"Tue, 14 May 2019 21:14:11 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/gather-gateway-ip-and-cidr\/","description":"<p>\u6700\u8fd1\u6298\u817e\u79d1\u5b66\u4e0a\u7f51\u7f51\u5173\uff0c\u535a\u5ba2\u505c\u66f4\u4e00\u6bb5\u65f6\u95f4\uff1b\u968f\u624b\u8bb0\u5f55\u4e00\u6bb5\u5c0f\u811a\u672c\uff0c\u4ee5\u5907\u65e5\u540e\u67e5\u7528\u3002\u8fd9\u662f\u76ee\u524d\u6211\u627e\u5230\u7684\u6700\u7b80\u3001\u6700\u901a\u7528\u65b9\u6848\uff0c\u53ea\u9700 <code>ip<\/code> \u548c <code>grep<\/code> \u547d\u4ee4\u5373\u53ef\u3002<\/p>"},{"title":"\u6211\u5982\u4f55\u5b9e\u73b0 Laravel-China \u5168\u81ea\u52a8\u7cfb\u5217\u6587\u7ae0\u53d1\u5e03","link":"https:\/\/wi1dcard.dev\/posts\/automatic-learnku-deploy-bot\/","pubDate":"Fri, 22 Mar 2019 19:09:26 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/automatic-learnku-deploy-bot\/","description":"<p>\u5728\u65e9\u671f <a href=\"https:\/\/github.com\/wi1dcard\/laravel-deployment\" target=\"_blank\">\u8f7b\u677e\u90e8\u7f72 Laravel \u5e94\u7528<\/a> \u8bfe\u7a0b\u5f00\u59cb\u7f16\u5199\u4e4b\u524d\uff0c\u5c31\u8003\u8651\u5230\u4e00\u4e2a\u975e\u5e38\u91cd\u8981\u7684\u95ee\u9898\uff1a<strong>\u5982\u4f55\u4fdd\u8bc1 Laravel-China \u4e0a\u53d1\u5e03\u7684\u6587\u7ae0\u4e0e GitHub \u4ed3\u5e93\u5185\u7684 Markdown \u6e90\u6587\u4ef6\u4fdd\u6301\u540c\u6b65<\/strong>\uff1f<\/p>"},{"title":"\u6d45\u6790 Laravel \u6587\u6863\u63a8\u8350\u7684 Nginx \u914d\u7f6e","link":"https:\/\/wi1dcard.dev\/posts\/laravel-recommended-nginx-conf-analysis\/","pubDate":"Sat, 16 Mar 2019 11:18:00 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/laravel-recommended-nginx-conf-analysis\/","description":"<p>\u4ee5 <a href=\"https:\/\/laravel.com\/docs\/5.8\/deployment#server-configuration\" target=\"_blank\">Laravel 5.8 \u6587\u6863<\/a> \u4e3a\u51c6\uff0c\u6d45\u6790 Nginx \u914d\u7f6e\u3002\u53ef\u4f5c\u4e3a <a href=\"https:\/\/github.com\/wi1dcard\/laravel-deployment\" target=\"_blank\">\u8f7b\u677e\u90e8\u7f72 Laravel \u5e94\u7528<\/a> \u7684\u62d3\u5c55\u9605\u8bfb\u3002<\/p>"},{"title":"\u4f7f\u7528 AppleScript \u7cbe\u786e\u5730\u8bbe\u7f6e macOS \u7a97\u53e3\u5927\u5c0f","link":"https:\/\/wi1dcard.dev\/posts\/macos-resize-window-programmatically\/","pubDate":"Fri, 08 Mar 2019 20:30:23 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/macos-resize-window-programmatically\/","description":"<p>\u535a\u5ba2\u53c8\u8df3\u7968\u4e00\u9635\u5b50\uff0c\u4e0d\u8fc7\u6700\u8fd1\u5e76\u6ca1\u6709\u95f2\u7740\uff0c\u800c\u662f\u628a\u4e1a\u4f59\u65f6\u95f4\u5168\u90e8\u6295\u5165\u5230\u4e86 <a href=\"https:\/\/github.com\/wi1dcard\/laravel-deployment\" target=\"_blank\">Laravel \u90e8\u7f72\u8bfe\u7a0b<\/a>\u3002\u5728\u5199\u4f5c\u65f6\u7ecf\u5e38\u9700\u8981\u5bf9\u7a97\u53e3\u622a\u56fe\uff0c\u4e3a\u4e86\u63d0\u9ad8\u9605\u8bfb\u4f53\u9a8c\uff0c\u9700\u786e\u4fdd\u622a\u56fe\u5927\u5c0f\u7edf\u4e00\uff1b\u56e0\u6b64\u5982\u4f55\u8ba9\u7a97\u53e3 <strong>\u5feb\u901f<\/strong> \u5730\u7f29\u653e\u4e3a\u6307\u5b9a\u50cf\u7d20\u7684 <strong>\u7cbe\u786e<\/strong> \u5927\u5c0f\uff0c\u6210\u4e86\u4e00\u4e2a\u4e0d\u53ef\u6216\u7f3a\u7684\u9700\u6c42\u3002<\/p>"},{"title":"\u4f60\u9700\u8981\u54ea\u4e9b\u4e91\u670d\u52a1\u57fa\u7840\u8bbe\u65bd\uff1f","link":"https:\/\/wi1dcard.dev\/posts\/cloud-infrastructures\/","pubDate":"Fri, 01 Mar 2019 00:27:49 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/cloud-infrastructures\/","description":"<p>\u672c\u6587\u4e3a\u300a<a href=\"https:\/\/github.com\/wi1dcard\/laravel-deployment\" target=\"_blank\">\u8f7b\u677e\u90e8\u7f72 Laravel \u5e94\u7528<\/a>\u300b\u7684\u9884\u4e60\u8865\u5145\u7bc7\u3002<\/p>"},{"title":"\u4f7f\u7528\u5927\u5c0f\u5199\u654f\u611f\u7684 APFS \u5377\u5b58\u50a8\u4ee3\u7801","link":"https:\/\/wi1dcard.dev\/posts\/use-case-sensitive-apfs-volume\/","pubDate":"Thu, 21 Feb 2019 13:20:29 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/use-case-sensitive-apfs-volume\/","description":"<p>\u7531\u4e8e macOS \u9ed8\u8ba4\u5206\u533a\u548c\u5377\u90fd\u662f\u5927\u5c0f\u5199\u4e0d\u654f\u611f\u7684\uff0c\u5bf9\u4e8e\u5f00\u53d1\u8005\u6765\u8bf4\uff0c\u901a\u5e38\u9700\u8981\u9762\u5bf9\u7684\u662f\u5927\u5c0f\u5199\u654f\u611f\u7684\u73af\u5883\u3002\u5e76\u4e14\uff0c\u8fd9\u4e2a\u5c0f\u5dee\u5f02\u7684\u786e\u5e26\u6765\u4e86\u4e00\u4e9b\u4e0d\u4fbf\uff0c\u4f8b\u5982 <a href=\"https:\/\/learnku.com\/articles\/3782\/a-pit-reminder-a-class-or-a-trait-suddenly-can-not-find\" target=\"_blank\">\u4f7f\u7528 Git \u65f6\u9047\u5230\u7684\u5751<\/a>\u3002\u7136\u800c\uff0c\u81ea\u5df1\u53c8\u6ca1\u6709\u52c7\u6c14\u91cd\u65b0\u683c\u5f0f\u5316\u3001\u88c5\u7cfb\u7edf\u3002\u76f4\u5230\u6700\u8fd1\uff0c\u5728\u8ddf\u540c\u4e8b\u804a\u5929\u65f6\u7ed9\u4e86\u6211\u4e00\u4e2a\u542f\u53d1\u2026\u2026<\/p>"},{"title":"\u5728 Oh-My-Zsh \u5185\u8bbe\u7f6e\u547d\u4ee4\u884c\u6807\u9898","link":"https:\/\/wi1dcard.dev\/posts\/change-terminal-title-in-zsh\/","pubDate":"Thu, 21 Feb 2019 12:59:12 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/change-terminal-title-in-zsh\/","description":"<p>\u524d\u4e9b\u5929\u7ed9\u547d\u4ee4\u884c\u8bbe\u7f6e\u6807\u9898\u9047\u5230\u4e00\u5947\u8469\u95ee\u9898\uff0c\u6700\u7ec8\u8c03\u8bd5\u53d1\u73b0\u662f Oh-My-Zsh \u7684\u9505\u3002<\/p>"},{"title":"\u66f4\u52a0\u6e05\u6670\u6613\u8bfb\u7684 cURL \u5de5\u5177","link":"https:\/\/wi1dcard.dev\/posts\/easier-curl-with-colors\/","pubDate":"Wed, 13 Feb 2019 13:14:54 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/easier-curl-with-colors\/","description":"<p><a href=\"https:\/\/github.com\/reorx\/httpstat\" target=\"_blank\">reorx\/httpstat<\/a> \u662f\u4e00\u6b3e\u66f4\u52a0\u6e05\u6670\u6613\u8bfb\u7684 cURL \u5de5\u5177\u3002\u5176\u672c\u610f\u662f\u5c06 cURL \u8bf7\u6c42\u7684\u7edf\u8ba1\u6570\u636e\u56fe\u5f62\u5316\u3001\u53ef\u89c6\u5316\uff0c\u4f46\u4e5f\u53ef\u4f5c\u4e3a\u65e5\u5e38\u7684 HTTP \u5ba2\u6237\u7aef\u4f7f\u7528\u3002<\/p>"},{"title":"\u4ee5\u52a8\u753b\u65b9\u5f0f\u76f4\u89c2\u5730\u6d4f\u89c8 Git \u6587\u4ef6\u5386\u53f2","link":"https:\/\/wi1dcard.dev\/posts\/animate-git-history-on-web\/","pubDate":"Mon, 11 Feb 2019 14:17:27 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/animate-git-history-on-web\/","description":"<p>\u67e5\u770b Git \u63d0\u4ea4\u5386\u53f2\u7684\u5de5\u5177\u5343\u5343\u4e07\uff0c\u65e0\u8bba\u662f CLI \u8fd8\u662f GUI\u3002\u800c <a href=\"https:\/\/github.com\/pomber\/git-history\" target=\"_blank\">pomber\/git-history<\/a> \u5219\u662f\u4e00\u6b3e\u80fd\u591f\u4ee5\u52a8\u753b\u5f62\u5f0f\u5feb\u901f\u3001\u76f4\u89c2\u5730\u5c55\u73b0 Git \u4ed3\u5e93\u5185\u6587\u4ef6\u53d8\u52a8\u5386\u53f2\u7684 Web \u5de5\u5177\u3002<\/p>"},{"title":"\u52a8\u624b\u642d\u5efa\u4ee3\u7801\u7247\u6bb5\u6258\u7ba1\u670d\u52a1","link":"https:\/\/wi1dcard.dev\/posts\/self-hosted-snippet-service\/","pubDate":"Tue, 05 Feb 2019 19:14:33 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/self-hosted-snippet-service\/","description":"<p><a href=\"https:\/\/github.com\/snibox\/snibox\" target=\"_blank\">snibox\/snibox<\/a> \u662f\u4e00\u6b3e\u4f7f\u7528 Ruby on Rails + Vuex \u7f16\u5199\u7684\u4ee3\u7801\u7247\u6bb5\u6258\u7ba1\u670d\u52a1\u3002\u5bf9\u4e8e\u4e00\u7ebf\u7a0b\u5e8f\u5458\u6765\u8bf4\uff0c\u7ecf\u5e38\u4f1a\u63a5\u89e6\u5230\u5927\u91cf\u7684\u4ee3\u7801\u7247\u6bb5\uff08Snippet\uff09\uff0c\u4e0a\u4f20\u5230 Gist \u65e0\u6cd5\u5b8c\u5168 Private\uff0c\u800c Snibox \u5219\u662f\u4e2a\u4e0d\u9519\u7684\u9009\u62e9\u3002<\/p>"},{"title":"\u5728\u547d\u4ee4\u884c\u4e0b\u8f7d\u7b2c\u4e09\u65b9\u7f51\u7ad9\u7684\u89c6\u9891","link":"https:\/\/wi1dcard.dev\/posts\/cli-video-downloader\/","pubDate":"Mon, 04 Feb 2019 07:38:44 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/cli-video-downloader\/","description":"<p><a href=\"https:\/\/github.com\/soimort\/you-get\" target=\"_blank\">soimort\/you-get<\/a> \u548c <a href=\"https:\/\/github.com\/iawia002\/annie\" target=\"_blank\">iawia002\/annie<\/a> \u662f\u4e24\u6b3e\u5341\u5206\u4e0d\u9519\u7684\u547d\u4ee4\u884c\u89c6\u9891\u4e0b\u8f7d\u5de5\u5177\uff0c\u652f\u6301\u5927\u91cf\u7b2c\u4e09\u65b9\u89c6\u9891\u7ad9\u3002<\/p>"},{"title":"\u547d\u4ee4\u884c\u795e\u5668 - tldr \u548c fuck","link":"https:\/\/wi1dcard.dev\/posts\/tldr-and-the-fuck-in-terminal\/","pubDate":"Thu, 31 Jan 2019 16:59:25 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/tldr-and-the-fuck-in-terminal\/","description":"<p><a href=\"https:\/\/github.com\/tldr-pages\/tldr-cpp-client\" target=\"_blank\">tldr-pages\/tldr-cpp-client<\/a> \u662f <a href=\"https:\/\/github.com\/tldr-pages\/tldr\" target=\"_blank\">tldr-pages\/tldr<\/a> \u7684 C++ \u5ba2\u6237\u7aef\u5b9e\u73b0\u3002\u540e\u8005\u6536\u96c6\u4e86\u4e00\u7cfb\u5217\u7b80\u5316\u7248\u672c\u7684\u547d\u4ee4\u8bf4\u660e\u624b\u518c\uff0c\u7528\u4e8e\u66ff\u4ee3 <code>man<\/code> \u547d\u4ee4\uff1b\u4e14\u9879\u76ee\u7531\u793e\u533a\u9a71\u52a8\uff0c\u4e5f\u5c31\u662f\u8bf4\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u63d0\u4ea4 PR \u6765\u5b8c\u5584\u5b83\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/nvbn\/thefuck\" target=\"_blank\">nvbn\/thefuck<\/a> \u662f\u4e00\u6b3e\u57fa\u4e8e Python \u7f16\u5199\u7684\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u53ef\u5feb\u901f\u4fee\u6b63\uff08\u6ce8\u610f\u4e0d\u662f\u4fee\u590d\uff09\u524d\u4e00\u6761\u547d\u4ee4\u7684\u7528\u6cd5\u9519\u8bef\uff0c\u4f7f\u62a5\u9519\u7684\u547d\u4ee4\u80fd\u591f\u6b63\u5e38\u8fd0\u884c\u3002<\/p>"},{"title":"You Wouldn't Base64 a Password - Cryptography Decoded","link":"https:\/\/wi1dcard.dev\/posts\/you-wouldnt-base64-a-password-cryptography-decoded\/","pubDate":"Wed, 30 Jan 2019 10:19:19 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/you-wouldnt-base64-a-password-cryptography-decoded\/","description":"<p>\u4e00\u7bc7\u6df1\u5165\u8bb2\u89e3 Encode \/ Hash \/ Cryptography \/ Encrypt \u7684\u597d\u6587\u3002\u8f6c\u81ea\uff1a<a href=\"https:\/\/paragonie.com\/blog\/2015\/08\/you-wouldnt-base64-a-password-cryptography-decoded\">https:\/\/paragonie.com\/blog\/2015\/08\/you-wouldnt-base64-a-password-cryptography-decoded<\/a>\u3002<\/p>"},{"title":"\u4f7f\u7528 Git-LFS + \u4e00\u70b9\u6280\u5de7\u7ba1\u7406\u535a\u5ba2\u56fe\u7247","link":"https:\/\/wi1dcard.dev\/posts\/manage-blog-images-with-git-lfs\/","pubDate":"Mon, 28 Jan 2019 22:57:45 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/manage-blog-images-with-git-lfs\/","description":"<p>\u8fd9\u53ef\u80fd\u662f\u622a\u81f3\u76ee\u524d\u6211\u8ba4\u4e3a\u6700\u4f18\u96c5\u7684\u535a\u5ba2\u56fe\u7247\u7ba1\u7406\u65b9\u6848\u6ca1\u6709\u4e4b\u4e00\u3002<\/p>"},{"title":"LGTM\uff08\uff1f\uff1f\uff1f\uff09\u8ff7\u4e4b\u9a9a\u7f29\u5199","link":"https:\/\/wi1dcard.dev\/posts\/github-abbrs-collection\/","pubDate":"Sat, 26 Jan 2019 14:18:02 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/github-abbrs-collection\/","description":"<p>\u641c\u96c6\u4e00\u4e9b GitHub \u5e38\u89c1\u9a9a\u7f29\u5199\uff0c\u4ee5\u5907\u67e5\u8be2\u4f7f\u7528\u3002<\/p>"},{"title":"\u81ea\u52a8\u5316 Markdown \u535a\u6587\u5199\u4f5c\u89c4\u8303\u68c0\u67e5","link":"https:\/\/wi1dcard.dev\/posts\/lint-your-posts-with-ci\/","pubDate":"Sat, 26 Jan 2019 08:54:58 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/lint-your-posts-with-ci\/","description":"<p><a href=\"https:\/\/github.com\/hustcc\/lint-md\" target=\"_blank\">hustcc\/lint-md<\/a> \u662f\u4e00\u6b3e\u4e2d\u6587 Markdown \u5199\u4f5c\u89c4\u8303\u68c0\u67e5\u5de5\u5177\uff0c\u68c0\u67e5\u89c4\u5219\u6765\u6e90\u4e8e <a href=\"https:\/\/github.com\/ruanyf\/document-style-guide\" target=\"_blank\">ruanyf\/document-style-guide<\/a>\u3002<\/p>\n<p>\u914d\u5408 CI\/CD \u4f7f\u7528\uff0c\u5373\u80fd\u591f\u4ee5\u5b8c\u5168\u81ea\u52a8\u5316\u7684\u65b9\u5f0f\uff0c\u786e\u4fdd\u4f18\u79c0\u7684\u535a\u6587\u8d28\u91cf\uff0c\u957f\u671f\u4f7f\u7528\u8fd8\u53ef\u57f9\u517b\u826f\u597d\u7684\u5199\u4f5c\u4e60\u60ef\u3002<\/p>"},{"title":"\u7a0b\u5e8f\u5458\u547d\u4ee4\u884c\u67e5\u8bcd\u597d\u5e2e\u624b","link":"https:\/\/wi1dcard.dev\/posts\/translate-words-via-command-line\/","pubDate":"Thu, 24 Jan 2019 01:12:31 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/translate-words-via-command-line\/","description":"<p><a href=\"https:\/\/github.com\/afc163\/fanyi\" target=\"_blank\">afc163\/fanyi<\/a> \u662f\u4e00\u6b3e\u547d\u4ee4\u884c\u67e5\u8bcd\u5de5\u5177\u3002\u5b9e\u7528\u3001\u7f8e\u89c2\uff0c\u662f\u6211\u5bf9\u5b83\u7684\u7b2c\u4e00\u5370\u8c61\u3002<\/p>"},{"title":"Linux \u4e2d\u6a21\u62df\u591a\u79cd\u7cfb\u7edf\u8d1f\u8f7d\u7684\u65b9\u6cd5","link":"https:\/\/wi1dcard.dev\/posts\/simulate-system-load-in-linux\/","pubDate":"Tue, 22 Jan 2019 22:50:29 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/simulate-system-load-in-linux\/","description":"<p>\u8fd1\u671f\u5728\u7814\u7a76\u7cfb\u7edf\u76d1\u63a7\u9884\u8b66\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\uff1aCPU \u4f7f\u7528\u7387\u9884\u8b66\u3001\u5185\u5b58\u4f7f\u7528\u7387\u9884\u8b66\u3001\u78c1\u76d8\u4f7f\u7528\u7387\u9884\u8b66\u4ee5\u53ca IO \u9884\u8b66\u3002<\/p>\n<p>\u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u9700\u8981\u6a21\u62df\u7cfb\u7edf\u8d1f\u8f7d\u6765\u9a8c\u8bc1\u9884\u8b66\u89c4\u5219\u662f\u5426\u6709\u6548\u3002\u6545\u603b\u7ed3\u51e0\u79cd\u6a21\u62df\u8d1f\u8f7d\u7684\u65b9\u5f0f\uff0c\u4ee5\u4f9b\u65e5\u540e\u67e5\u8be2\u3002<\/p>"},{"title":"\u6301\u7eed\u751f\u6210\u7b80\u5386 PDF \u5e76\u90e8\u7f72\u81f3\u4e03\u725b\u4e91","link":"https:\/\/wi1dcard.dev\/posts\/convert-html-to-pdf-with-ci\/","pubDate":"Mon, 21 Jan 2019 09:20:23 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/convert-html-to-pdf-with-ci\/","description":"<p>\u5927\u6982\u60f3\u6cd5\uff1a<code>\u8f6c\u6362\u6211\u7684\u7b80\u5386 HTML \u5230 PDF<\/code> -&gt; <code>\u5c06 PDF \u90e8\u7f72\u5230\u4e03\u725b\u4e91<\/code> -&gt; <code>\u8bbf\u5ba2\u53ef\u76f4\u63a5\u4e0b\u8f7d\u6700\u65b0\u7248\u672c PDF \u4e14\u4e0e\u5728\u7ebf\u7b80\u5386\u540c\u6b65<\/code>\u3002<\/p>\n<p>\u4ee5\u4e0a\u8fc7\u7a0b\u5747\u57fa\u4e8e Travis CI \u5b9e\u73b0\uff0c\u66ff\u6362\u6210\u5176\u5b83\u4ea6\u53ef\u3002\u5e73\u65f6\u6211\u4eec\u63d0\u5230\u7684 CI\/CD\uff0c\u800c\u672c\u4f8b\u5373\u4e3a\u7b80\u6613\u7684 CD\uff08<code>Continuous Delivery<\/code>\uff09\u5b9e\u4f8b\u3002<\/p>"},{"title":"\u505c\u6b62\u4f7f\u7528 JWT \u4f5c\u4e3a Session \u7cfb\u7edf","link":"https:\/\/wi1dcard.dev\/posts\/stop-using-jwt-for-sessions\/","pubDate":"Sun, 20 Jan 2019 11:11:22 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/stop-using-jwt-for-sessions\/","description":"<p>JSON Web Tokens\uff0c\u53c8\u79f0 <code>JWT<\/code>\u3002\u672c\u6587\u4f5c\u8005\u5c06\u8be6\u89e3\uff1a\u4e3a\u4f55 JWT \u4e0d\u9002\u5408\u5b58\u50a8 Session\uff0c\u4ee5\u53ca JWT \u5f15\u53d1\u7684\u5b89\u5168\u9690\u60a3\u3002\u671b\u5404\u4f4d\u4f7f\u7528\u524d\u4e09\u601d\u3002<\/p>"},{"title":"\u4f7f\u7528 Travis \u90e8\u7f72 GitHub Pages","link":"https:\/\/wi1dcard.dev\/posts\/deploy-github-pages-with-travis-ci\/","pubDate":"Thu, 17 Jan 2019 17:27:22 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/deploy-github-pages-with-travis-ci\/","description":"<p>\u539f\u6765 Travis CI \u5b98\u65b9\u4e00\u76f4\u63d0\u4f9b\u7740\u90e8\u7f72\u5230 GitHub Pages \u7684\u65b9\u5f0f&hellip;<\/p>\n<p>\u90a3\u4e48\u90a3\u4e9b\u626f\u86cb\u7684\u6559\u7a0b\u53ef\u4ee5\u4e00\u8fb9\u73a9\u53bb\u4e86\u3002<\/p>"},{"title":"\u5c06 PHP \u5e94\u7528\u5feb\u901f\u6253\u5305\u4e3a PHAR","link":"https:\/\/wi1dcard.dev\/posts\/packaging-apps-with-phar\/","pubDate":"Tue, 15 Jan 2019 00:03:57 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/packaging-apps-with-phar\/","description":"<p><a href=\"https:\/\/github.com\/humbug\/box\" target=\"_blank\">humbug\/box<\/a> \u662f\u4e00\u6b3e\u5feb\u901f\u7684\u3001\u96f6\u914d\u7f6e\u7684 PHAR \u6253\u5305\u5de5\u5177\u3002<\/p>\n<p>\u8fd8\u8bb0\u5f97\u524d\u4e9b\u5929\u7684\u300a<a href=\"https:\/\/laravel-china.org\/articles\/19742\" target=\"_blank\">SMProxy,\u8ba9\u4f60\u7684\u6570\u636e\u5e93\u64cd\u4f5c\u5feb\u4e09\u500d\uff01<\/a>\u300b\u5417\uff0c\u8be5\u9879\u76ee\u7684 PHAR \u4fbf\u662f\u4f7f\u7528 Box \u6253\u5305\u5b8c\u6210\u7684\u3002<\/p>"},{"title":"\u547d\u4ee4\u884c\u67e5\u8be2\u5929\u6c14\u7684\u6b63\u786e\u65b9\u5f0f","link":"https:\/\/wi1dcard.dev\/posts\/cli-weather-client\/","pubDate":"Sun, 13 Jan 2019 18:13:25 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/cli-weather-client\/","description":"<p><a href=\"https:\/\/github.com\/chubin\/wttr.in\" target=\"_blank\">chubin\/wttr.in<\/a> \u662f\u4e00\u6b3e\u9762\u5411\u547d\u4ee4\u884c\u7684\u5929\u6c14\u9884\u62a5\u670d\u52a1\uff0c\u652f\u6301\u591a\u79cd HTTP \u5ba2\u6237\u7aef\u8fdb\u884c\u8bf7\u6c42\uff0c\u4f8b\u5982\uff1a<code>curl<\/code> \/ <code>httpie<\/code> \/ <code>wget<\/code> \u7b49\u3002\u8be5\u9879\u76ee\u7684\u5b98\u65b9\u63cf\u8ff0\u4fbf\u662f\uff1a<\/p>\n<blockquote>\n<p>The right way to check the weather.<\/p>\n<\/blockquote>"},{"title":"macOS \u7ec8\u7aef\u53ef\u7528\u7684 Hex \u67e5\u770b\u4e0e\u7f16\u8f91\u5668","link":"https:\/\/wi1dcard.dev\/posts\/hex-viewers-and-editors-in-terminal\/","pubDate":"Fri, 11 Jan 2019 10:08:02 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/hex-viewers-and-editors-in-terminal\/","description":"<p>\u5728 Windows \u4e0b\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 WinHex\uff0c\u800c\u5728 macOS \u5e73\u53f0\u4e0a\uff0c\u6709\u4ec0\u4e48\u4e0d\u9519\u7684\u5341\u516d\u8fdb\u5236\u67e5\u770b\u5668\u3001\u7f16\u8f91\u5668\u5462\uff1f<\/p>"},{"title":"\u5728 PHP \u4e2d\u683c\u5f0f\u5316\u5e76\u9ad8\u4eae SQL \u8bed\u53e5","link":"https:\/\/wi1dcard.dev\/posts\/format-sql-statements-in-php\/","pubDate":"Thu, 10 Jan 2019 21:27:06 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/format-sql-statements-in-php\/","description":"<p><a href=\"https:\/\/github.com\/jdorn\/sql-formatter\" target=\"_blank\">jdorn\/sql-formatter<\/a> \u662f\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684 PHP \u7c7b\u7528\u4e8e\u683c\u5f0f\u5316 SQL \u8bed\u53e5\u3002<\/p>\n<p>\u5b83\u652f\u6301\u81ea\u52a8\u8fdb\u884c\u7f29\u8fdb\u3001\u6dfb\u52a0\u6362\u884c\uff0c\u751a\u81f3\u8fd8\u652f\u6301\u8bed\u6cd5\u9ad8\u4eae\u3002<\/p>"},{"title":"\u6210\u529f\u8fbe\u6210\u6210\u5c31 \u2014\u2014 100 \u7bc7\u535a\u6587","link":"https:\/\/wi1dcard.dev\/posts\/100-posts\/","pubDate":"Thu, 10 Jan 2019 21:17:54 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/100-posts\/","description":"\u4eca\u5929\u7ed9\u535a\u5ba2\u6587\u7ae0\u6574\u7406\u5206\u7c7b\uff0c\u5c06\u5168\u5c0f\u5199\u6539\u4e3a\u5355\u8bcd\u5927\u5199\u5f00\u5934\u7684\u8fc7\u7a0b\u4e2d\uff0c\u5076\u7136\u53d1\u73b0\u81ea\u5df1\u5df2\u7ecf\u8fbe\u6210 100 \u7bc7\u535a\u6587\u7684\u6210\u5c31\uff0c\u5c0f\u5c0f\u7684\u5e86\u795d\u4e00\u4e0b\u5427\u3002\n\u53e6\u5916\u63a5\u4e0b\u6765\u8981\u5f00\u65b0\u5751\u4e86\uff0c\u773c\u770b\u7740\u81ea\u5df1\u6df1\u5ea6\u4f7f\u7528 GitHub \u4e5f\u6709\u4e00\u9635\u5b50\u4e86\uff0cStar \u7684\u4ed3\u5e93\u6570\u91cf\u5373\u5c06\u7a81\u7834 500\u3002\u51e0\u5929\u524d\u6574\u7406\u53c8\u6574\u7406\u3001\u7b5b\u9009\u53c8\u7b5b\u9009\uff0c\u7cbe\u9009\u4e86\u90e8\u5206\u4e0d\u9519\u7684\u9879\u76ee\uff0c\u53ef\u80fd\u5f88\u5c0f\u4f17\uff0c\u53ef\u80fd\u5f88\u7b80\u5355\uff0c\u4e0e\u5176\u7559\u5728 Stared list \u91cc\u5403\u7070\uff0c\u4e0d\u5982\u548c\u5927\u5bb6\u5206\u4eab\u4e00\u4e0b\uff0c\u6b63\u6240\u8c13\u72ec\u4e50\u4e50\u4e0d\u5982\u4f17\u4e50\u4e50\u3002\n\u63a5\u4e0b\u6765\u5c06\u66f4\u65b0\u4e00\u7cfb\u5217\u7684\u6587\u7ae0\uff0c\u4ece GitHub \u6458\u9009\u4e00\u4e9b\u6211\u8ba4\u4e3a\u4e0d\u9519\u7684 \u4e2d\u5c0f\u578b \u5f00\u6e90\u9879\u76ee\uff0c\u5e0c\u671b\u80fd\u591f \u5feb\u901f \u7ed9\u4e88\u4f60\u4e00\u4e9b\u7075\u611f\u3001\u542f\u53d1\u548c\u5e2e\u52a9\u3002"},{"title":"\u914d\u7f6e Prometheus \u670d\u52a1\u5668\u76d1\u63a7\u548c Grafana \u770b\u677f","link":"https:\/\/wi1dcard.dev\/posts\/configure-prometheus-monitoring-with-grafana\/","pubDate":"Wed, 09 Jan 2019 20:34:12 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/configure-prometheus-monitoring-with-grafana\/","description":"<blockquote>\n<p>\u8bd1\u8005\u5e8f\uff1aPrometheus \u662f\u670d\u52a1\u5668\u76d1\u63a7\u7cfb\u7edf\u7684\u540e\u8d77\u4e4b\u79c0\uff0c\u53ef\u4ee5\u548c Kubernetes \u5b8c\u7f8e\u7ed3\u5408\u7528\u4e8e\u76d1\u63a7\u5927\u91cf\u96c6\u7fa4\u548c\u5e94\u7528\u3002Grafana \u662f\u4e00\u6b3e\u6570\u636e\u53ef\u89c6\u5316\u770b\u677f\uff0c\u53ef\u6307\u5b9a\u591a\u4e2a\u6570\u636e\u6e90\u6267\u884c\u67e5\u8be2\uff0c\u5c06\u67af\u71e5\u7684\u6570\u636e\u8f6c\u5316\u4e3a\u591a\u7ef4\u5ea6\u7684\u9762\u677f\u3002\u4e24\u8005\u5747\u4e3a\u5f00\u6e90\u9879\u76ee\uff0c\u901a\u8fc7\u914d\u7f6e\u53ef\u5b9e\u73b0\u76f4\u89c2\u5f3a\u5927\u7684\u76d1\u63a7\u3001\u62a5\u8b66\u3001\u5206\u6790\u7cfb\u7edf\uff0c\u5b9e\u5c5e\u8fd0\u7ef4\u795e\u5668\u3002<\/p>\n<\/blockquote>"},{"title":"\u4f7f\u7528 Git Subtree \u7ba1\u7406 Hexo \u4e3b\u9898","link":"https:\/\/wi1dcard.dev\/posts\/manage-hexo-themes-with-git-subtree\/","pubDate":"Fri, 04 Jan 2019 23:24:40 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/manage-hexo-themes-with-git-subtree\/","description":"0x00 \u5e9f\u8bdd \ud83c\udf89 Tada\uff5e \u535a\u5ba2\u7115\u65b0\u4e3b\u9898\u3002\n\u5b9e\u5728\u53d7\u4e0d\u4e86\u539f\u6765\u90a3\u4e2a\u4e3b\u9898\u4e86\uff0c\u5c24\u5176\u662f\u5728\u88ab\u6211\u4eec\u516c\u53f8 CTO \u90fd\u5acc\u5f03\u4e11\u7684\u60c5\u51b5\u4e0b\u3002\u518d\u52a0\u4e0a\u4ee5\u4e0b\u51e0\u4e2a\u539f\u56e0\uff1a\n\u8be5\u4e3b\u9898 GitHub Repo \u51e0\u4e4e\u505c\u6b62\u7ef4\u62a4\uff0c\u51e0\u5468\u624d\u9c9c\u6709\u51e0\u6b21 Commit\u3002 \u4ece\u6211\u5f00\u59cb\u4f7f\u7528\u8be5\u4e3b\u9898\u4ee5\u6765\uff0c\u5f00\u53d1\u4e2d\u7684 Nexus \u4e3b\u9898\u6837\u5f0f\u4f9d\u65e7\u5728\u5f00\u53d1\u4e2d\uff0c2.0 \u7248\u672c\u4e5f\u662f\u4e00\u6837\u3002 \u914d\u7f6e\u9879\u5b9e\u5728\u662f\u592a\u592a\u592a\u591a\u4e86\uff0c\u591a\u5230\u7ecf\u5e38\u6539\u52a8\u4e00\u4e2a\u5730\u65b9\u5c31\u5f15\u8d77\u5947\u602a\u7684\u95ee\u9898\uff0c\u4e14\u5bf9\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\u683c\u5f0f\u68c0\u67e5\u57fa\u672c\u4e3a\u96f6\u3002 \u6587\u6863\u4e0d\u660e\u786e\uff0c\u5341\u5206\u9690\u6666\uff0c\u5185\u7f6e\u529f\u80fd\u4f17\u591a\u4f46\u9c7c\u9f99\u6df7\u6742\u3002 \u6700\u8fd1 \u6587\u6863\u57df\u540d\u8bc1\u4e66\u8fc7\u671f \u65e0\u6cd5\u8bbf\u95ee\u3002 &hellip; \u4e0d\u80fd\u5fcd\u4e0d\u80fd\u5fcd\u3002\u4e00\u6c14\u4e4b\u4e0b\u5f00\u59cb\u4e86\u75af\u72c2\u7684\u8fc1\u79fb\uff0c\u7ecf\u8fc7\u51e0\u4e2a\u5c0f\u65f6\u7684\u6298\u817e\u57fa\u672c\u5b8c\u6210\uff0c\u7b80\u5386\u7684\u6392\u7248\u4e5f\u66f4\u52a0\u660e\u6717\u4e86\u3002"},{"title":"\u6f2b\u8c08 2019","link":"https:\/\/wi1dcard.dev\/posts\/hello-2019\/","pubDate":"Thu, 27 Dec 2018 00:35:01 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/hello-2019\/","description":"\u539f\u672c\u4eca\u665a\u6253\u7b97\u65e9\u7761\uff0c\u7136\u800c\u7761\u610f\u4e00\u8fc7\u968f\u4e4b\u800c\u6765\u5c31\u662f\u5f7b\u5e95\u7684\u6e05\u9192\u3002\n\u8fd1\u671f\uff08emmmm&hellip; \u51e0\u4e2a\u6708\u524d\uff09\u8df3\u69fd\u540e\u4e00\u76f4\u6ca1\u6709\u518d\u7ee7\u7eed\u7f16\u5199\u535a\u5ba2\uff0c\u8fde\u7eed\u8df3\u7968\uff0c\u4e00\u6643\u5230\u4e86 2018 \u7684\u5e74\u5e95\u3002\n\u4e0d\u8fc7\u8fd8\u662f\u505c\u4e0d\u4e0b\u6765\u81ea\u5df1\u9700\u8981\u5199\u70b9\u4ec0\u4e48\u7684\u4e60\u60ef\u3002\u7531\u4e8e\u60f3\u8981\u300c\u79fb\u6c11\u300d\u7684\u503e\u5411\u8d8a\u6765\u8d8a\u5f3a\u70c8\uff0c\u4e8e\u662f\u4fbf\u5f00\u542f\u4e86\u300c\u7ffb\u8bd1\u300d\u7684\u65c5\u7a0b\u3002\n\u5e0c\u671b\u51e0\u4e2a\u6708\u540e\u80fd\u591f\u5728\u4e0d\u65ad\u7684\u5b9e\u8df5\u548c\u953b\u70bc\u4e2d\uff0c\u63d0\u9ad8\u81ea\u5df1\u7684\u82f1\u6587\u8bfb\u5199\u6c34\u5e73\u5427\u3002\n\u6709\u5174\u8da3\u7684\u670b\u53cb\u53ef\u4ee5\u5173\u6ce8\u4e0b\u6211\u7684 Laravel-China ID\u3002\n\u5728\u5f00\u59cb\u65e5\u6e10\u6c89\u8ff7 Laravel-China \u7684\u540c\u65f6\uff0c\u6211\u51b3\u5b9a\u79bb\u5f00 Gitee \u2014\u2014 \u4e5f\u5c31\u662f\u7801\u4e91\u4e86\u3002\n\u6216\u8bb8\u56fd\u5185\u7684\u5f00\u6e90\u793e\u533a\u771f\u7684\u505a\u4e0d\u8d77\u6765\uff1a\n\u8fd8\u6709\uff0c\u4e5f\u6253\u7b97\u8ba9\u5fae\u4fe1\u9000\u51fa\u6211\u300c\u4e3b\u529b\u804a\u5929\u5de5\u5177\u300d\u7684\u821e\u53f0\u4e86\uff0c\u6539\u7528\u5e72\u51c0\u7b80\u5355\u5b89\u5168\u7684 Telegram\uff0c\u524d\u51e0\u5929\u5df2\u7ecf\u66f4\u65b0\u8fc7\u4e86\u7b80\u5386\uff0c\u53bb\u6389\u4e86\u5fae\u4fe1\u4e8c\u7ef4\u7801\u3002\n2019 \u5e74\uff0c\u5e0c\u671b\u81ea\u5df1\u5728\u6280\u672f\u65b9\u9762\uff0c\u80fd\u591f\u5c06\u540e\u7aef\u9886\u57df\u6316\u5f97\u66f4\u6df1\uff0c\u82f1\u8bed\u6c34\u5e73\u83b7\u5f97\u8d28\u7684\u63d0\u5347\uff1b\u751f\u6d3b\u65b9\u9762\uff0c\u548c\u5973\u670b\u53cb\u4fdd\u6301\u7f8e\u597d\u5e78\u798f\uff0c\u987a\u4fbf\u88c5\u70b9\u597d\u6211\u4eec\u7684\u5bb6\uff0c\u8ddf\u968f\u6211\u5d69\u7684\u811a\u6b65\uff0c\u591a\u7ec3\u7ec3\u53a8\u827a\u4e5f\u4e0d\u9519\uff1b\u5176\u4ed6\uff0c\u5e73\u5b89\u5065\u5eb7\u5c31\u597d\u3002"},{"title":"Laravel \u4e8c\u7ea7\u57df\u540d\u7ed1\u5b9a\u5b50\u76ee\u5f55 Nginx \u914d\u7f6e","link":"https:\/\/wi1dcard.dev\/posts\/laravel-nginx-subdomains\/","pubDate":"Mon, 15 Oct 2018 16:55:07 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/laravel-nginx-subdomains\/","description":"\u4e8c\u7ea7\u57df\u540d\u7ed1\u5b9a\u5b50\u76ee\u5f55 Nginx + PHP-FPM \u914d\u7f6e\uff0c\u5185\u7f6e Laravel \u91cd\u5199\u89c4\u5219\uff0c\u53ef\u7528\u4e8e\u672c\u5730\u591a\u9879\u76ee\u5f00\u53d1\u3002\n\u5728 Nginx \u7684\u7ad9\u70b9\u914d\u7f6e\u76ee\u5f55\u65b0\u589e\u7ad9\u70b9\u540e\uff0c\u589e\u52a0\u4ee5\u4e0b\u4ee3\u7801\u5757\u5373\u53ef\u3002\nserver_name ~^(.*)\\.laravel\\.test$; # \u6b63\u5219\u4e8c\u7ea7\u57df\u540d root \/Users\/jootu\/web\/$1\/public; index index.html index.htm index.php; location \/ { try_files $uri $uri\/ \/index."},{"title":"\u6dd8\u5b9d\u5929\u732b\u5546\u54c1\u4fe1\u606f\u7b80\u6613\u722c\u866b","link":"https:\/\/wi1dcard.dev\/posts\/taobao-tmall-crawller\/","pubDate":"Mon, 15 Oct 2018 15:44:34 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/taobao-tmall-crawller\/","description":"\u4f9d\u8d56 Node.js \u89e3\u6790 JSON \u4fe1\u606f\uff0c\u51e0\u6761 Bash \u547d\u4ee4\u5c31\u80fd\u62ff\u5230\u5546\u54c1\u4fe1\u606f\u4e86\u3002\n\u6dd8\u5b9d\u3002\n# \u6d4b\u8bd5 URL URL=&#34;https:\/\/item.taobao.com\/item.htm?id=560121532731&#34; CODE=`curl -sS $URL | awk &#39;\/var g_config = {\/,\/};\/&#39; | iconv -f gbk -t utf-8` echo &#34;var location = {}; $CODEconsole."},{"title":"PSR-7 \u4e0e HTTPlug","link":"https:\/\/wi1dcard.dev\/posts\/psr7-and-httplug\/","pubDate":"Sat, 06 Oct 2018 16:05:41 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/psr7-and-httplug\/","description":"\u524d\u8a00 \u6700\u8fd1\u56fd\u5e86\u671f\u95f4\u6ca1\u7ee7\u7eed\u5f00\u53d1\u9879\u76ee\uff0c\u636e\u8bf4\u8981\u6709\u5927\u53d8\u52a8\uff0c\u7b49\u56fd\u5e86\u540e\u5f00\u4f1a\u8ba8\u8bba\uff0c\u5185\u5fc3\u6709\u70b9\u65b9\u5f20\u3002\nUpdated: \u56fd\u5e86\u540e\u7684\u7b2c\u4e00\u5929\uff0c\u679c\u7136\u780d\u4e86\u3002\u96be\u53d7\u3002\n\u8d81\u7740\u5047\u671f\uff0c\u5c01\u88c5\u4e86\u4e24\u4e2a\u6269\u5c55\u5305\u3002\n\u4e2d\u56fd\u884c\u653f\u533a\u5212\u5730\u5740\u5e93 SDK &#43; \u722c\u866b &#43; \u6570\u636e \u767e\u5ea6\u5c0f\u7a0b\u5e8f\u7b2c\u4e09\u65b9 PHP SDK \u5728\u6784\u5efa\u540e\u8005\u7684\u65f6\u5019\uff0c\u8003\u8651\u5230 PSR-7 \u9010\u6e10\u5728 PHP \u751f\u6001\u5708\u88ab\u5927\u4f17\u63a5\u53d7\uff0c\u7ecf\u8fc7\u659f\u914c\u51b3\u5b9a\u5c06 HTTP \u5ba2\u6237\u7aef\u4e0e SDK \u81ea\u8eab\u903b\u8f91\u5206\u79bb\uff0c\u5b8c\u5168\u9075\u5faa PSR-7\uff0c\u6240\u6709\u8bf7\u6c42\u90fd\u5b9e\u73b0\u4e3a RequestInterface\uff0c\u968f\u540e\u4f7f\u7528\u4efb\u610f\u517c\u5bb9 PSR-7 \u7684\u5ba2\u6237\u7aef\u53d1\u9001\u5373\u53ef\uff0c\u6269\u5c55\u5305\u672c\u8eab\u4e0d\u5173\u6ce8 HTTP \u534f\u8bae\u7684\u6570\u636e\u4f20\u8f93\u3002"},{"title":"Laravel 5.7 \u91cd\u5199\u8f6f\u5220\u9664\u5b57\u6bb5\u4e3a\u65f6\u95f4\u6233","link":"https:\/\/wi1dcard.dev\/posts\/laravel-model-override-soft-delete\/","pubDate":"Tue, 25 Sep 2018 13:47:38 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/laravel-model-override-soft-delete\/","description":"0x00 \u80cc\u666f Laravel \u81ea\u5e26\u8f6f\u5220\u9664\u4f7f\u7528\u7279\u6b8a\u503c NULL \u8868\u793a\u6b64\u8bb0\u5f55\u672a\u88ab\u5220\u9664\u3002\u7531\u6b64\u5f15\u51fa\u4e00\u4e2a\u95ee\u9898\u3002\n\u8bbe\u60f3\uff0c\u67d0\u8868\u5185\u9700\u8981\u5efa\u7acb\u7d22\u5f15\uff0c\u7d22\u5f15\u5b57\u6bb5\u4e3a name, deleted_at\u3002\n\u5047\u8bbe\u6b64\u7d22\u5f15\u6761\u4ef6\u5fc5\u5b9a\u552f\u4e00\uff0c\u53ef\u5efa\u7acb Uniuqe \u7d22\u5f15\u3002\u7136\u800c deleted_at \u5141\u8bb8 NULL \u5b58\u5728\uff0c\u5bfc\u81f4\u7d22\u5f15\u65e0\u6548\uff0c\u5728\u67e5\u8be2\u65f6\u964d\u7ea7\u4e3a Index\u3002\n\u56e0\u6b64\uff0c\u5728\u7edd\u5927\u591a\u6570\u573a\u666f\u4e0b\uff0c\u6211\u4eec\u67e5\u8be2\u672a\u88ab\u5220\u9664\uff08deleted_at IS NULL\uff09\u7684\u6570\u636e\uff0c\u552f\u4e00\u7d22\u5f15\u90fd\u6ca1\u6709\u5375\u7528\u3002"},{"title":"\u89e3\u51b3 Google Play \u79d1\u5b66\u4e0a\u7f51\u4f9d\u65e7\u65e0\u6cd5\u8bbf\u95ee","link":"https:\/\/wi1dcard.dev\/posts\/google-play-dns-poisoning-in-china\/","pubDate":"Wed, 19 Sep 2018 10:46:13 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/google-play-dns-poisoning-in-china\/","description":"\u6700\u8fd1\u53d1\u73b0\u4e2a\u95ee\u9898\uff0c\u8def\u7531\u5668\u6302\u4e86 SS \u4f46\u662f\u624b\u673a\u8bbf\u95ee Google Play \u4f9d\u65e7\u62a5\u9519\uff1a\n\u4ece\u670d\u52a1\u5668\u68c0\u7d22\u4fe1\u606f\u65f6\u51fa\u9519\u3002[DF-DFERH-01]\u3002\n\u9042\u6392\u67e5\uff0c\u53d1\u73b0\u662f\u7531\u4e8e\u56fd\u5185\u7248\u672c\u7684 Google Play \u5546\u5e97\u662f\u4f7f\u7528 services.googleapis.cn \u57df\u540d\uff0c\u800c .cn \u57df\u9ed8\u8ba4\u76f4\u8fde\u56fd\u5185 DNS \u8fdb\u884c\u89e3\u6790\uff0c\u800c GFW \u53c8\u7ed9\u8fd9\u4e2a\u57df\u540d\u4e0b\u6bd2\u5bfc\u81f4 DNS \u6c61\u67d3\uff0c\u65e0\u6cd5\u8bbf\u95ee\u3002"},{"title":"Laravel 5.7 \u6a21\u578b\u5e38\u7528\u5c5e\u6027\u96c6\u5408","link":"https:\/\/wi1dcard.dev\/posts\/laravel-eloquent-model-properties\/","pubDate":"Tue, 18 Sep 2018 09:15:25 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/laravel-eloquent-model-properties\/","description":"Laravel 5.7 \u4e8e\u524d\u51e0\u5929\u53d1\u5e03\uff0c\u8feb\u4e0d\u53ca\u5f85\u7ed9\u6b63\u5728\u5f00\u53d1\u7684\u65b0\u9879\u76ee\u505a\u4e86\u5347\u7ea7\u3002\n\u5728\u6b64\u6574\u7406\u4e00\u4e0b\u6a21\u578b\u5e38\u7528\u5c5e\u6027\uff0c\u4ee5\u5907\u65e5\u540e\u67e5\u8be2\u3002\n$fillable = [ &#39;\u53ef\u6279\u91cf\u586b\u5145\u7684\u5b57\u6bb5&#39; ]; $guarded = [ &#39;\u4e0e\u4e0a\u76f8\u53cd&#39; ]; $hidden = [ &#39;\u6a21\u578b\u8f6c\u6362\u4e3a\u6570\u7ec4\u65f6\u5e94\u5f53\u9690\u85cf\u7684\u5b57\u6bb5&#39; ]; $visable = [ &#39;\u4e0e\u4e0a\u76f8\u53cd&#39; ]; $appends = [ &#39;\u6a21\u578b\u8f6c\u6362\u4e3a\u6570\u7ec4\u65f6\u5e94\u5f53\u8ffd\u52a0\u7684\u865a\u62df\u5b57\u6bb5&#39; \/\/ \u4f8b\u5982\u8bbf\u95ee\u5668 ]; $with = [ &#39;\u5e94\u5f53\u9884\u52a0\u8f7d\u7684\u5173\u8054\u5173\u7cfb&#39;, ]; $attributes = [ &#39;\u5b57\u6bb5\u540d&#39; =&gt; &#39;\u5b57\u6bb5\u9ed8\u8ba4\u503c&#39; ]; $casts = [ &#39;\u5b57\u6bb5\u540d&#39; =&gt; &#39;\u81ea\u52a8\u7c7b\u578b\u8f6c\u6362\u7684\u76ee\u6807\u7c7b\u578b&#39; ]; $dates = [ &#39;\u5e94\u5f53\u88ab\u8f6c\u6362\u4e3a\u65e5\u671f\u65f6\u95f4\u7684\u5b57\u6bb5&#39; ]; $touches = [ &#39;\u6a21\u578b\u66f4\u65b0\u65f6\u5e94\u5f53\u4e00\u5e76\u66f4\u65b0\u7684\u5173\u8054\u5173\u7cfb&#39; ]; \/\/ \u4ee5\u4e0b\u4e3a\u6269\u5c55\u5305\u4f7f\u7528\u7684\u5c5e\u6027 \/\/ https:\/\/github."},{"title":"Git \u4e00\u6b21\u6027\u63a8\u9001\u63d0\u4ea4\u548c\u6807\u7b7e","link":"https:\/\/wi1dcard.dev\/posts\/git-push-with-tags\/","pubDate":"Fri, 07 Sep 2018 09:18:53 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/git-push-with-tags\/","description":"How to push commits and tags in git using the same command&hellip;\n\u8fd1\u671f\u7ef4\u62a4\u9879\u76ee\uff0c\u6709\u4e24\u4e2a\u8fdc\u7a0b\u4ed3\u5e93\uff0c\u6bcf\u6b21\u53d1\u5e03\u7248\u672c\u9700\u8981\u6267\u884c\u56db\u6761\u547d\u4ee4\u3002\ngit push first git push first --tags git push second git push second --tags \u771f\u8981\u547d\u3002"},{"title":"macOS \u8f6c\u6362 SVG \u5230 PNG","link":"https:\/\/wi1dcard.dev\/posts\/macos-convert-svg-to-png\/","pubDate":"Thu, 06 Sep 2018 20:44:12 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/macos-convert-svg-to-png\/","description":"\u8bba\u5982\u4f55\u4ee5\u7a0b\u5e8f\u5458\u7684\u65b9\u5f0f\uff0c\u8f7b\u91cf\u3001\u5feb\u901f\u3001\u4f18\u96c5\u5730\u8f6c\u6362 SVG \u5230 PNG\u3002\n0x00 \u95ee\u9898\u63cf\u8ff0 \u8fd1\u671f\u516c\u53f8\u9879\u76ee\u8fc7\u7a0b\u4e2d\uff0c\u4f7f\u7528 Navicat \u5236\u4f5c E-R \u56fe\uff0c\u4e3a\u4e86\u5feb\u901f\u8fdb\u884c\u5934\u8111\u98ce\u66b4\uff0c\u9700\u8981\u628a\u5173\u7cfb\u56fe\u6253\u5370\u51fa\u6765\u3002\n\u7531\u4e8e\u4e1a\u52a1\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u56fe\u7247\u4e5f\u8d8a\u6765\u8d8a\u5e9e\u5927\u3002\n\u6700\u65e9\u5c1d\u8bd5\u4f7f\u7528 File -&gt; Print as... -&gt; PNG \u5bfc\u51fa\uff0c\u4f46\u662f\u540e\u6765\u53d1\u73b0\u5176 DPI \u6bd4\u8f83\u4f4e\uff0c\u800c\u4e14\u5728\u6a21\u578b\u5173\u7cfb\u6bd4\u8f83\u5927\u7684\u65f6\u5019\uff0c\u5bfc\u51fa\u7684 PNG \u4f1a\u6bd4\u8f83\u6a21\u7cca\u3002"},{"title":"Koolshare \u6885\u6797\u56fa\u4ef6 Shadowsocks \u6613\u4e3b","link":"https:\/\/wi1dcard.dev\/posts\/merlin-koolshare-shadowsocks-transferred\/","pubDate":"Thu, 06 Sep 2018 20:43:05 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/merlin-koolshare-shadowsocks-transferred\/","description":"GitHub \u539f\u4ed3\u5e93\u7684 Commit \u8bb0\u5f55\u5df2\u7ecf\u6d88\u5931\uff0cIssue \u529f\u80fd\u4e5f\u88ab\u5173\u95ed\u4e86\u3002\n\u73b0\u79fb\u52a8\u5230 https:\/\/github.com\/hq450\/fancyss\u3002\n\u4f3c\u4e4e\uff0c\u4e5f\u662f\u88ab\u8bf7\u53bb\u559d\u8336\u4e86\uff1f\n\u67d0\u4e9b\u4eba\uff0c\u5e72\u561b\u975e\u8981\u5c01\u4eba\u5634\u5df4\u5462\u3002\u63a9\u8033\u76d7\u94c3\uff0c\u53ef\u7b11\u3002\n\u66f4\u53ef\u7b11\u7684\u662f\uff0c\u591a\u6570\u4eba\u4e0d\u89c9\u5f97\u81ea\u5df1\u88ab\u5c01\u4f4f\u5634\u5df4\u3002\n\u4e60\u60ef\u4e86\u4e0d\u8bf4\u8bdd\u7684\u65e5\u5b50\uff0c\u4e60\u60ef\u4e86\u7528\u539f\u59cb\u4eba\u7684\u65b9\u5f0f\u3002\n\u6700\u53ef\u6015\u7684\u6c38\u8fdc\u662f\u4eba\u7684\u601d\u7ef4\u3002\n\u4e0d\u591a\u8bf4\u4e86\u3002\n\u6211\u7684 RT-AC86U Koolshare Merlin Shadowsocks 1.3.6 \u60f3\u8981\u5347\u7ea7\u65f6\u51fa\u73b0 404\uff0c\u65e0\u6cd5\u6b63\u5e38\u5728\u7ebf\u5347\u7ea7\u3002"},{"title":"macOS \u5229\u7528 tree \u547d\u4ee4\u5c55\u793a\u76ee\u5f55\u7ed3\u6784","link":"https:\/\/wi1dcard.dev\/posts\/macos-tree-command\/","pubDate":"Wed, 05 Sep 2018 15:19:28 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/macos-tree-command\/","description":"\u5e9f\u8bdd\u4e0d\u591a\u8bf4\uff0c\u5c55\u793a\u6548\u679c\u3002\nwechatapp-rebuild \u251c\u2500\u2500 components\/ \u251c\u2500\u2500 core\/ \u251c\u2500\u2500 images\/ \u251c\u2500\u2500 pages\/ \u251c\u2500\u2500 utils\/ \u251c\u2500\u2500 README.md \u251c\u2500\u2500 app.js \u251c\u2500\u2500 app.json \u251c\u2500\u2500 app.wxss \u2514\u2500\u2500 project."},{"title":"Packagist\uff08Composer\uff09\u4e2d\u56fd\u955c\u50cf","link":"https:\/\/wi1dcard.dev\/posts\/packagist-mirror-in-china\/","pubDate":"Wed, 05 Sep 2018 09:31:33 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/packagist-mirror-in-china\/","description":"<p>\u4ece\u4e03\u6708\u4efd\u5f97\u77e5\u56fd\u5185\u955c\u50cf\u5f00\u59cb\u300c\u4f53\u68c0\u300d\u4e4b\u540e\uff0c\u4e00\u76f4\u6ca1\u6709\u6536\u5230\u6062\u590d\u7684\u6d88\u606f\u3002<\/p>"},{"title":"\u6211\u7684\u5468\u62a5\u5de5\u5177\u7bb1","link":"https:\/\/wi1dcard.dev\/posts\/weekly-report-toolkit\/","pubDate":"Thu, 30 Aug 2018 13:42:06 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/weekly-report-toolkit\/","description":"\u5927\u6982\u5728\u4e24\u4e2a\u6708\u4ee5\u524d\uff0c\u521a\u5165\u804c\u76ee\u524d\u6240\u5728\u7684\u516c\u53f8\uff0c\u8981\u6c42\u5199\u5468\u62a5\uff0c\u800c\u4e14\u8981\u6c42\u6bd4\u8f83\u8be6\u7ec6\uff0c\u6bcf\u5929\u7684\u4efb\u52a1\u90fd\u9700\u8981\u5217\u6e05\u695a\u3002\n\u5bf9\u4e8e\u6211\u8fd9\u79cd\u5f88\u5065\u5fd8\uff0c\u5e76\u4e14\u559c\u6b22\u4ee5\u7ed3\u679c\u4e3a\u5bfc\u5411\uff0c\u4e13\u6ce8\u4e8e\u4ee3\u7801\u7684\u7a0b\u5e8f\u5458\u7b80\u76f4\u8981\u547d\u3002\n\u6240\u4ee5\u4e0b\u51b3\u5fc3\uff0c\u641e\u4e2a\u5e2e\u6211\u5199\u5468\u62a5\u7684\u5de5\u5177\u3002\u4e8e\u662f\u8fd9\u4e2a\u9879\u76ee\u8bde\u751f\u4e86\u3002\n\u81ea\u5df1\u7528\u4e86\u4e00\u9635\u5b50\u611f\u89c9\u8fd8\u4e0d\u9519\uff0c\u7ecf\u8fc7\u4e00\u756a\u6574\u7406\u5b8c\u5584\u51b3\u5b9a\u5f00\u6e90\u3002\n\u4ed3\u5e93\u5730\u5740\uff1ahttps:\/\/github.com\/wi1dcard\/weekly-report\n\u5176\u5b9e\u6ca1\u4ec0\u4e48\u6280\u672f\u542b\u91cf\uff0c\u65e0\u975e\u5c31\u662f\u5229\u7528 Git \u7684\u63d0\u4ea4\u8bb0\u5f55\uff0c\u7f16\u6392\u6210 Markdown\u3002\nBTW\uff0c\u5176\u5b9e\u6216\u8bb8\u7528 Python \u5199\u4f1a\u66f4\u5408\u9002\u3002\n\u6700\u540e\uff0c\u6211\u7684\u5468\u62a5\u9879\u76ee VS Code \u914d\u7f6e\u5982\u4e0b\u3002\n{ &#34;[markdown]&#34;: { &#34;editor.wordWrap&#34;: &#34;off&#34;, &#34;editor."},{"title":"macOS \u63a2\u5bfb\u6587\u4ef6\u6269\u5c55\u5c5e\u6027","link":"https:\/\/wi1dcard.dev\/posts\/macos-ls-extended-attributes\/","pubDate":"Wed, 29 Aug 2018 16:31:08 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/macos-ls-extended-attributes\/","description":"\u8fc7\u7a0b \u4eca\u5929\u7528 ll \u547d\u4ee4\u5076\u7136\u89c2\u5bdf\u5230\u4e00\u4e2a\u7ec6\u8282\uff0c\u67d0\u4e9b\u6587\u4ef6\uff08\u5939\uff09\u5c5e\u6027\u540e\u9762\u5e26\u6709 @ \u5b57\u7b26\uff1a\n$ ll total 104 -rw-r--r--@ 1 user staff 0B 7 25 18:56 Icon? ... drwx------@ 15 user staff 480B 8 29 13:43 renren \u7ecf\u8fc7\u8c37\u6b4c\u4e00\u756a\uff0c\u539f\u6765\u8fd9\u4ee3\u8868\u6587\u4ef6\u542b\u6709 \u6269\u5c55\u5c5e\u6027\u3002"},{"title":"Yii2 \u83b7\u53d6\u5f53\u524d\u8bf7\u6c42\u7684\u8def\u7531\u4fe1\u606f","link":"https:\/\/wi1dcard.dev\/posts\/yii2-get-current-request-route\/","pubDate":"Wed, 29 Aug 2018 13:48:19 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/yii2-get-current-request-route\/","description":"\u5982\u9898\uff0c\u6709\u4e24\u79cd\u65b9\u6848\u5b9e\u73b0\u3002\n\u65b9\u6848\u4e00\uff1a\nYii::$app-&gt;controller-&gt;route; \u65b9\u6848\u4e8c\uff1a\nYii::$app-&gt;requestedRoute \u770b\u8fc7\u6e90\u7801\u540e\u624d\u77e5\u9053\u8fd9\u4fe9\u7684\u533a\u522b\u3002\n\u65b9\u6848\u4e00\u662f\u6839\u636e\u5f53\u524d\u8bf7\u6c42\u5df2\u521b\u5efa\u7684 module \/ controller \/ action\uff0c\u4e5f\u5c31\u662f\u5b9e\u9645\u5904\u7406\u5f53\u524d\u8bf7\u6c42\u7684\u6a21\u5757\u3001\u63a7\u5236\u5668\u3001\u65b9\u6cd5\u6240\u7ec4\u5408\u800c\u6210\u7684\u8def\u7531\uff0c\u7edd\u5bf9\u89c4\u8303\u3002\n\u65b9\u6848\u4e8c\u662f\u6839\u636e UrlManager::routeParam \u7b49\u914d\u7f6e\uff0c\u89e3\u6790\u8bf7\u6c42 URL \u53d6\u5f97\u7684\u8bbf\u95ee\u8def\u7531\uff0c\u4e0d\u4e00\u5b9a\u89c4\u8303\uff0c\u4f46\u5bf9\u7528\u6237\u53ef\u89c1\u3002\n\u901a\u5e38\u60c5\u51b5\u4e0b\u4e24\u79cd\u65b9\u6cd5\u5e94\u8be5\u662f\u7b49\u6548\u7684\uff1b\u67d0\u4e9b\u7279\u6b8a\u573a\u666f\uff0c\u4f8b\u5982\u4fee\u6539\u8fc7\u6839\u636e\u8def\u7531\u89e3\u6790\u521b\u5efa\u63a7\u5236\u5668\u7684\u8fc7\u7a0b\u3001\u5185\u90e8\u53cd\u4ee3\u91cd\u5199\u8fc7 URL \u7b49\uff0c\u5219\u6709\u53ef\u80fd\u5bfc\u81f4\u4e24\u65b9\u5f97\u5230\u7684\u503c\u4e0d\u4e00\u81f4\u3002"},{"title":"Laravel 5.6 \u81ea\u5b9a\u4e49\u8fc1\u79fb\u6869\u4ee3\u7801","link":"https:\/\/wi1dcard.dev\/posts\/laravel-custom-migration-stub\/","pubDate":"Tue, 28 Aug 2018 13:33:16 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/laravel-custom-migration-stub\/","description":"\u4e66\u63a5\u4e0a\u56de\uff0c\u524d\u9762\u8bf4\u5230\u5728\u8fc1\u79fb\u5185\u7ed9 Blueprint \u589e\u52a0\u81ea\u5b9a\u4e49\u7684 Macro\u3002\u90a3\u4e48\uff0c\u5f53\u6211\u4eec\u6bcf\u6b21\u4f7f\u7528 php artisan make:migration \u90fd\u9700\u8981\u624b\u52a8\u4fee\u6539\u4e00\u6b21\u6a21\u677f\u5417\uff1f\u8fd9\u4e0d\u6e05\u771f = =\u3002\n0x00 \u601d\u8def \u81ea\u5b9a\u4e49 make:migration \u6240\u4f7f\u7528\u7684 stub\uff08\u300c\u6869\u300d\uff0c\u53ef\u4ee5\u7406\u89e3\u4e3a\u6a21\u677f\uff09\u6587\u4ef6\u5373\u53ef\u3002\n\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u4f60\u9996\u5148\u9700\u8981\u521b\u5efa\u5c5e\u4e8e\u4f60\u7684 stubs \u6587\u4ef6\uff0c\u6211\u5efa\u8bae\u76f4\u63a5\u4ece Laravel 5."},{"title":"Laravel 5.6 \u7ed9 Blueprint \u589e\u52a0\u81ea\u5b9a\u4e49\u65b9\u6cd5","link":"https:\/\/wi1dcard.dev\/posts\/laravel-blueprint-macro\/","pubDate":"Tue, 28 Aug 2018 02:41:00 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/laravel-blueprint-macro\/","description":"PHP \u57fa\u672c\u529f\u8db3\u591f\u624e\u5b9e\u7684\u60c5\u51b5\u4e0b\uff0c\u5f3a\u70c8\u5efa\u8bae\u5b66\u4e60 Laravel \u7684\u8fc7\u7a0b\u9664\u4e86\u9605\u8bfb\u5b98\u65b9\u6587\u6863\u5916\uff0c\u4ed4\u7ec6\u9605\u8bfb\u6846\u67b6\u6e90\u7801\uff1b\u6216\u8bb8\u4f1a\u6709\u5c0f\u60ca\u559c\u54df\u3002\n0x00 \u51c6\u5907 Laravel 5.6 php artisan make:migration ... \u8fd1\u671f\u5728\u9879\u76ee\u8fc7\u7a0b\u4e2d\uff0c\u9047\u5230\u8fd9\u4e48\u4e2a\u9700\u6c42\uff1a\u5728\u6240\u6709\u6a21\u578b\u8868\u5185\u90fd\u9700\u8981\u652f\u6301\u81ea\u589e\u4e3b\u952e id\u3001\u521b\u5efa\u65f6\u95f4\u3001\u66f4\u65b0\u65f6\u95f4\u4ee5\u53ca\u8f6f\u5220\u9664\uff0c\u4ee5\u5907\u4e0d\u65f6\u4e4b\u9700\u3002\n\u4e8e\u662f\u4e4e\u3002\u4f20\u7edf\u7684\u505a\u6cd5\u662f\uff0c\u5728\u6bcf\u4e2a\u8fc1\u79fb Schema::create \u56de\u8c03\u5185\uff0c\u90fd\u5199\u4e00\u904d $table-&gt;increments + softDeletes + timestamps\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a"},{"title":"\u5728\u7ec8\u7aef\u5185\u6392\u5e8f Markdown \u8868\u683c","link":"https:\/\/wi1dcard.dev\/posts\/sort-markdown-tables-shell\/","pubDate":"Sun, 26 Aug 2018 10:51:16 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/sort-markdown-tables-shell\/","description":"\u5e8f \u6700\u8fd1\u65b0\u9879\u76ee\u5199 README\uff0c\u5728\u7f16\u6392\u5b9e\u4f53\u547d\u540d\u534f\u5b9a\u4e2d\u82f1\u5bf9\u7167\u7684\u65f6\u5019\uff0c\u6709\u4f7f\u7528\u5230 Markdown \u7684\u8868\u683c\u3002\u90a3\u4e48\u5982\u4f55\u6309\u7167\u67d0\u5217\u7684\u5b57\u6bcd\u987a\u5e8f\u6392\u5e8f Markdown \u8868\u683c\u5462\uff1f\u5b9e\u9645\u4e0a\uff0c\u4e00\u6761 Shell \u547d\u4ee4\u5c31\u8db3\u4ee5\u89e3\u51b3\u3002\u8bf7\u770b\u5927\u4f6c\u7684\u5b9e\u73b0\u3002\n\u6b63\u6587 TableFlip \u76ee\u524d\u8fd8\u65e0\u6cd5\u6839\u636e\u5217\u6392\u5e8f\u8868\u683c. \u6240\u4ee5\u6211\u4eec\u4e0d\u5f97\u4e0d\u4f7f\u7528\u5176\u4ed6\u65b9\u6cd5\uff0c\u6bd4\u5982 Shell \u6216\u8005 Terminal \u547d\u4ee4.\n\u9996\u5148\uff0c\u6211\u4eec\u5047\u8bbe\u4f60\u7684 Markdown \u8868\u683c\u7531\u4e00\u4e2a\u4e24\u884c\u7684\u8868\u5934\u5f00\u59cb\uff0c\u5e76\u4e14\u6bcf\u884c\u5f00\u5934\u90fd\u6709\u7ba1\u9053\u64cd\u4f5c\u7b26\uff08|\uff09\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a"},{"title":"PHP JSON Serializer","link":"https:\/\/wi1dcard.dev\/posts\/php-json-serializer\/","pubDate":"Tue, 21 Aug 2018 19:14:26 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/php-json-serializer\/","description":"Serialize &amp; unserialize data to &amp; from JSON. Compatible with serialized data and supported accessing unserialized data as a object &amp; array."},{"title":"Laravel 5.6 \u8def\u7531\u53c2\u6570\u6392\u9664\u5339\u914d","link":"https:\/\/wi1dcard.dev\/posts\/laravel-route-pattern-exclude\/","pubDate":"Sat, 18 Aug 2018 01:52:37 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/laravel-route-pattern-exclude\/","description":"Laravel \u63d0\u4f9b where \u65b9\u6cd5\u548c Route::pattern \u65b9\u6cd5\uff0c\u7528\u4e8e\u8bbe\u7f6e\u67d0\u4e2a\u8def\u7531\u53c2\u6570\u5fc5\u987b\u5339\u914d\u6307\u5b9a\u8868\u8fbe\u5f0f\uff0c\u5219\u6b64\u8def\u7531\u624d\u4f1a\u88ab\u5339\u914d\u3002\n\u90a3\u4e48\uff0c\u5982\u4f55\u8bbe\u7f6e\u6392\u9664\u67d0\u4e2a\u300c\u5173\u952e\u8bcd\u300d\uff08\u6216\u8005\u6211\u4eec\u79f0\u5b83\u4e3a\u300c\u7279\u6b8a\u53c2\u6570\u503c\u300d\uff09\uff0c\u53ea\u6709\u8fd9\u4e2a\u5173\u952e\u8bcd\u4e0d\u5339\u914d\uff0c\u5176\u5b83\u90fd\u5339\u914d\u5462\uff1f\n\u4e3e\u4e2a\u4f8b\u5b50 Route::domain(&#39;{user}.example.com&#39;); Route::pattern(&#39;user&#39;, &#39;???&#39;); ??? \u5904\u4ee3\u8868\u4e8c\u7ea7\u57df\uff0c\u901a\u5e38\u4e0d\u53ef\u4ee5\u8bbe\u7f6e\u4e3a\u4e00\u4e9b\u654f\u611f\u4fdd\u7559\u8bcd\uff0c\u6bd4\u5982 www \/ admin \u7b49\u3002\n\u89e3\u51b3\u65b9\u6848 \u5b9e\u9645\u4e0a\uff0cLaravel \u7684\u8def\u7531\u53c2\u6570\u5339\u914d\uff0c\u4f7f\u7528\u7684\u6b63\u662f\u6b63\u5219\u8868\u8fbe\u5f0f\u3002\u6240\u4ee5\uff0c\u8fd9\u5c31\u597d\u529e\u4e86\u3002"},{"title":"Laravel 5.6 \u4f7f\u7528 MongoDB \u5b58\u50a8\u6846\u67b6\u65e5\u5fd7","link":"https:\/\/wi1dcard.dev\/posts\/laravel-logging-with-mongodb\/","pubDate":"Wed, 15 Aug 2018 12:36:19 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/laravel-logging-with-mongodb\/","description":"\u7f51\u4e0a\u7684\u6587\u7ae0\u666e\u904d\u662f Laravel 5.5 \u7248\u672c\uff0c\u800c\u65e5\u5fd7\u7cfb\u7edf\u5728 5.6 \u7248\u672c\u5347\u7ea7\u65f6\u8fdb\u884c\u4e86\u90e8\u5206\u6539\u52a8\uff0c\u539f\u6709\u65b9\u6cd5\u57fa\u672c\u90fd\u5931\u6548\u4e86\u3002\u672c\u6587\u6839\u636e Laravel 5.6 \u6587\u6863\u7684\u6307\u5f15\uff0c\u5b9e\u73b0\u4f7f\u7528 MongoDB \u5b58\u50a8\u6846\u67b6\u65e5\u5fd7\u3002\n0x00 \u51c6\u5907 MongoDB Engine \u9996\u5148\uff0c\u5b89\u88c5 MongoDB\uff0c\u53c2\u89c1 \u5b98\u65b9\u6587\u6863\u3002\nMongoDB Driver\uff08PHP Extension\uff09 \u5176\u6b21\uff0c\u5b89\u88c5 PHP mongodb \u6269\u5c55\uff0c\u53c2\u89c1 \u5b98\u65b9\u6587\u6863\u3002"},{"title":"Git \u4ed3\u5e93\u67e5\u627e\u5df2\u8ffd\u8e2a\u7684\u5927\u6587\u4ef6","link":"https:\/\/wi1dcard.dev\/posts\/git-find-large-file\/","pubDate":"Fri, 10 Aug 2018 15:33:16 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/git-find-large-file\/","description":"\u5f53\u6211\u4eec\u7684 Git \u4ed3\u5e93\u8d8a\u6765\u8d8a\u5927\uff0c\u6216\u8005\u4e0d\u5c0f\u5fc3\u63d0\u4ea4\u4e86\u4e8c\u8fdb\u5236\u5927\u6587\u4ef6\uff0c\u5982\u4f55\u5feb\u901f\u627e\u51fa\u4ed3\u5e93\u5185\u7684\u300c\u7f6a\u9b41\u7978\u9996\u300d\uff1f\n\u5b9e\u8df5 \u5b9e\u9645\u4e0a\u975e\u5e38\u7b80\u5355\uff0c\u4e00\u6761\u547d\u4ee4\u5c31\u80fd\u641e\u5b9a\u3002\ngit rev-list --objects --all \\ # | git cat-file --batch-check=&#39;%(objecttype) %(objectname) %(objectsize) %(rest)&#39; \\ | sed -n &#39;s\/^blob \/\/p&#39; \\ | sort -r -n -k 2 \\ | head -10 \\ | cut -c 1-12,41- \\ | numfmt --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest \u6ce8\u610f\uff0c\u5728 macOS \u4f7f\u7528\u6b64\u547d\u4ee4\u9700\u8981\u5b89\u88c5 brew install coreutils --with-default-names\u3002"},{"title":"PHP \u5feb\u901f\u626b\u63cf\u5217\u8868\u521b\u5efa\u65e0\u9650\u6781\u5206\u7c7b\u6811","link":"https:\/\/wi1dcard.dev\/posts\/php-fastest-create-tree-from-list\/","pubDate":"Mon, 06 Aug 2018 11:40:06 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/php-fastest-create-tree-from-list\/","description":"\u4e66\u63a5\u4e0a\u56de\u3002\u4e0a\u6587\u7ed3\u5c3e\uff0c\u8bb2\u89e3\u4e86\u5f15\u7528\u7684\u5999\u7528\u3002\u521a\u597d\uff0c\u5728\u6211\u73b0\u5728\u6240\u5904\u516c\u53f8\u7684\u4e1a\u52a1\u91cc\u6709\u4e00\u5904\u7528\u9012\u5f52\u5b9e\u73b0\u7684\u300c\u7701\u5e02\u533a\u300d\u5206\u7ea7\u5217\u8868\uff1b\u672c\u6587\u5c06\u8fd9\u4e00\u7528\u9014\u642c\u8fdb\u751f\u4ea7\u73af\u5883\uff0c\u901a\u8fc7\u4f18\u5316\u6b64\u7701\u5e02\u533a\u5217\u8868\uff0c\u8bd5\u8bd5\u771f\u6b63\u7684\u6548\u679c\u5982\u4f55\u3002\n\u5e9f\u8bdd\u4e0d\u591a\u8bf4\uff0c\u4e0a\u4ee3\u7801\u3002\n\u7701\u5e02\u533a\u5217\u8868\u7ed3\u6784 array( 1 =&gt; array( &#39;id&#39; =&gt; 1, &#39;name&#39; =&gt; &#39;\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd&#39;, &#39;parent_id&#39; =&gt; 0, &#39;level&#39; =&gt; &#39;country&#39;, ), 2 =&gt; array( &#39;id&#39; =&gt; 2, &#39;name&#39; =&gt; &#39;\u5317\u4eac\u5e02&#39;, &#39;parent_id&#39; =&gt; 1, &#39;level&#39; =&gt; &#39;province&#39;, ), 20 =&gt; array( &#39;id&#39; =&gt; 20, &#39;name&#39; =&gt; &#39;\u5929\u6d25\u5e02&#39;, &#39;parent_id&#39; =&gt; 1, &#39;level&#39; =&gt; &#39;province&#39;, ), 38 =&gt; array( &#39;id&#39; =&gt; 38, &#39;name&#39; =&gt; &#39;\u6cb3\u5317\u7701&#39;, &#39;parent_id&#39; =&gt; 1, &#39;level&#39; =&gt; &#39;province&#39;, ), 218 =&gt; array( &#39;id&#39; =&gt; 218, &#39;name&#39; =&gt; &#39;\u5c71\u897f\u7701&#39;, &#39;parent_id&#39; =&gt; 1, &#39;level&#39; =&gt; &#39;province&#39;, ), 349 =&gt; array( &#39;id&#39; =&gt; 349, &#39;name&#39; =&gt; &#39;\u5185\u8499\u53e4\u81ea\u6cbb\u533a&#39;, &#39;parent_id&#39; =&gt; 1, &#39;level&#39; =&gt; &#39;province&#39;, ), 465 =&gt; array( &#39;id&#39; =&gt; 465, &#39;name&#39; =&gt; &#39;\u8fbd\u5b81\u7701&#39;, &#39;parent_id&#39; =&gt; 1, &#39;level&#39; =&gt; &#39;province&#39;, ), ."},{"title":"PHP \u5f15\u7528\u8be6\u89e3 - \u8e29\u5751\u4e0e\u5999\u7528","link":"https:\/\/wi1dcard.dev\/posts\/php-reference-variable\/","pubDate":"Mon, 06 Aug 2018 10:33:41 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/php-reference-variable\/","description":"\u6700\u8fd1\u5728\u5173\u6ce8\u300cPHP \u5f15\u7528\u300d\u8fd9\u4e00\u8bdd\u9898\uff0c\u770b\u8fc7\u4e0d\u5c11\u6df1\u5ea6\u6587\u7ae0\uff0c\u5bf9 PHP \u91cc\u7684\u300c\u5f15\u7528\u300d\u6709\u4e86\u66f4\u6df1\u7684\u7406\u89e3\u3002\n0x00 \u9996\u5148\u770b\u5982\u4e0b\u4ee3\u7801\uff1a\n$foo[&#39;hello&#39;] = &#39;0&#39;; $bar = &amp;$foo[&#39;hello&#39;]; \/\/ \u5f15\u7528\uff01 $tipi = $foo; $tipi[&#39;hello&#39;] = &#39;1&#39;; print_r($foo); \u95ee\uff1a\u8f93\u51fa 0 \u8fd8\u662f\u8f93\u51fa 1\uff1f\u7b54\u6848\u662f 1\u3002"},{"title":"VS Code \u6e05\u7406\u5de5\u4f5c\u533a\u6587\u4ef6","link":"https:\/\/wi1dcard.dev\/posts\/vscode-clear-workspace-storage\/","pubDate":"Fri, 03 Aug 2018 10:18:08 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/vscode-clear-workspace-storage\/","description":"\u524d\u4e9b\u5929\u626b\u63cf\u5927\u6587\u4ef6\u7684\u65f6\u5019\uff0c\u53d1\u73b0\u4e00\u4e2a\u76ee\u5f55 ~\/Library\/Application Support\/Code\/User\/workspaceStorage \u5360\u7528\u975e\u5e38\u5927\uff0c\u770b\u8d77\u6765\u7f6a\u9b41\u7978\u9996\u50cf\u662f VSCode\uff1b\n\u4e8e\u662f\u8c37\u6b4c\u4e00\u756a\uff0c\u53d1\u73b0 GitHub \u4e0a\u6709\u4e00\u6761 Issue \u8ba8\u8bba\u8fd9\u4e8b\u3002\n\u4f20\u9001\u95e8\uff1ahttps:\/\/github.com\/Microsoft\/vscode\/issues\/39692\n\u5176\u4e2d\u6709\u4e00\u6761 Comment \u662f\u8fd9\u6837\u7684\uff1a\nAll extension should be able to recreate their storage although they might answer some questions."},{"title":"\u7279\u55b5\u7684\u968f\u673a Git \u63d0\u4ea4\u4fe1\u606f","link":"https:\/\/wi1dcard.dev\/posts\/git-randomize-commit-message\/","pubDate":"Thu, 26 Jul 2018 08:33:05 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/git-randomize-commit-message\/","description":"2333&hellip; \u6700\u8fd1\u53d1\u73b0\u4e00\u4e2a\u795e\u5947\u7684\u7ad9\u70b9\uff0c\u968f\u673a\u751f\u6210 Git commit message\u3002\nhttp:\/\/whatthecommit.com\/\n\u81f3\u4e8e\u7528\u5230 Git \u4e0a\uff1a\ngit commit -m $(curl -s http:\/\/whatthecommit.com\/index.txt) \ud83d\ude02\n\u4e03\u6708\u9a6c\u4e0a\u53c8\u8981\u8fc7\u53bb\u4e86\u3002\n\u6700\u8fd1\u5728\u5c01\u88c5\u652f\u4ed8\u5b9d\u7684 SDK\uff0c\u6240\u4ee5\u535a\u5ba2\u6709\u4e00\u5c0f\u9635\u5b50\u6ca1\u6709\u66f4\u65b0\u3002"},{"title":"PHP \u83b7\u53d6\u4e0d\u5e26\u547d\u540d\u7a7a\u95f4\u7684\u7c7b\u540d","link":"https:\/\/wi1dcard.dev\/posts\/php-class-name-without-namespace\/","pubDate":"Tue, 24 Jul 2018 00:24:40 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/php-class-name-without-namespace\/","description":"\u65b9\u6cd5\u5f88\u591a\uff0c\u5217\u51fa\u51e0\u4e2a\uff0c\u4ee5\u4f9b\u53c2\u8003\u3002\nLaravel \u6e90\u7801\u91cc\u6252\u51fa\u6765\u7684 class_basename \u8f85\u52a9\u51fd\u6570\nbasename(str_replace(&#39;\\\\&#39;, &#39;\/&#39;, $class)); substr \u5b9e\u73b0\nsubstr(strrchr($class, &#34;\\\\&#34;), 1); \/\/ or substr($class, strrpos($class, &#39;\\\\&#39;) + 1); explode \u5b9e\u73b0"},{"title":"\u6570\u636e\u5e93\u8840\u7684\u6559\u8bad","link":"https:\/\/wi1dcard.dev\/posts\/mysql-bloody-lessons\/","pubDate":"Tue, 17 Jul 2018 16:47:34 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/mysql-bloody-lessons\/","description":"\u4e0d\u7528\u6269\u5c55\u5b9e\u73b0\u7684 PHP \u52a0\u5bc6\u6df7\u6dc6\uff0c\u6ca1\u6709\u9760\u8c31\u7684\u4ea7\u54c1\uff0c\u8fd8\u6709\u53ef\u80fd\u5bfc\u81f4\u903b\u8f91\u51fa\u95ee\u9898\uff0c\u800c\u4e14\u65e0\u6cd5\u68c0\u67e5\u3002 \u7531\u4e8e\u73af\u5883\u56e0\u7d20\u7684\u5dee\u5f02\u5728 PHP \u5185\u4ea7\u751f\u7684\u5f71\u54cd\u662f\u975e\u5e38\u5de8\u5927\u7684\uff0c\u505a SaaS \uff08\u670d\u52a1\u5668\u7531\u5ba2\u6237\u8fd0\u7ef4\uff09\u8fd8\u662f\u4e0d\u7528 PHP \u4e3a\u597d\u3002 \u300c\u7b80\u5355\u6613\u5b66\u300d\u3001\u300c\u5411\u524d\u517c\u5bb9\u6027\u597d\u300d\u7684\u7279\u8d28\u4f7f\u5f97 PHP \u7684\u4ee3\u7801\u53ef\u80fd\u6781\u81f4\u4f18\u96c5\uff0c\u4e5f\u6709\u53ef\u80fd\u4e00\u6ee9\u70c2\u6ce5\uff1b\u300c\u53ef\u4ee5\u8fd0\u884c\u300d\u7684\u4ee3\u7801\u6216\u8bb8\u5b58\u5728\u5de8\u5927\u7684\u53ef\u8bfb\u6027\u5dee\u8ddd\u3001\u6027\u80fd\u5dee\u8ddd\u3002 MySQL BINLOG \u4e5f\u4e0d\u662f\u90a3\u4e48\u597d\u73a9\u7684&hellip; \u82e5\u662f\u6570\u636e\u5e93\u7ed3\u6784\u6709\u6539\u52a8\uff0c\u60f3\u8981\u5b9e\u73b0\u95ea\u56de\u6050\u6015\u4e0d\u662f\u90a3\u4e48\u7b80\u5355\u3002 \u51c6\u5907\u5f00\u5751 Golang\u3002 \u96be\u53d7\u3002"},{"title":"Yii2 \u8f93\u51fa\u6587\u4ef6\u4e0b\u8f7d\u54cd\u5e94","link":"https:\/\/wi1dcard.dev\/posts\/yii2-response-send-file\/","pubDate":"Sat, 14 Jul 2018 13:52:46 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/yii2-response-send-file\/","description":"\u6700\u8fd1\u4e3a\u4e86\u5c3d\u53ef\u80fd\u4f18\u96c5\u5730\u5b9e\u73b0\u4ea7\u54c1\u9700\u6c42\uff0c\u5929\u5929\u770b Yii \u6e90\u7801\uff0c\u611f\u89c9\u8fd8\u662f\u975e\u5e38\u723d\u7684\u3002\u672c\u6587\u5c06\u8981\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528 Yii \u5185\u7f6e\u7684\u65b9\u6cd5\uff0c\u8f93\u51fa\u6587\u4ef6\u3001\u6d41\u3001\u5b57\u7b26\u4e32\u4e3a\u4e0b\u8f7d\u54cd\u5e94\u3002\n\u901a\u8fc7\u67e5\u770b yii\\web\\Response \u6e90\u7801\u53ef\u77e5\uff0c\u5176\u63d0\u4f9b\u5982\u4e0b\u65b9\u6cd5\uff1a\npublic function sendFile($filePath, $attachmentName = null, $options = []); public function sendContentAsFile($content, $attachmentName, $options = []); public function sendStreamAsFile($handle, $attachmentName, $options = []); \u90a3\u4e48\u5982\u4f55\u5728\u63a7\u5236\u5668\u5185\u8c03\u7528\u6b64\u65b9\u6cd5\u8f93\u51fa\u5462\uff1f"},{"title":"Yii2 \u5728\u6a21\u5757\u5185\u6620\u5c04 Controller \u5230\u5176\u5b83\u63a7\u5236\u5668","link":"https:\/\/wi1dcard.dev\/posts\/yii2-redirect-controller-in-module\/","pubDate":"Fri, 13 Jul 2018 15:56:08 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/yii2-redirect-controller-in-module\/","description":"\u4e0a\u6587\u8bb2\u89e3\u5173\u4e8e\u5982\u4f55\u6620\u5c04 Action\uff0c\u672c\u6587\u8bb2\u89e3\u5982\u4f55\u6620\u5c04 Controller\u3002\n0x00 \u5b9e\u73b0 \u9996\u5148\uff0c\u5728\u4f60\u7684 Module \u91cc\uff0c\u5b9a\u4e49\u4e00\u4e2a $controllerRedirectMap \u53d8\u91cf\u3002\npublic $controllerRedirectMap = []; \u91cd\u5199 createControllerByID \u65b9\u6cd5\u3002\npublic function createControllerByID($id) { if(isset($this-&gt;controllerRedirectMap[$id])) { $id = $this-&gt;controllerRedirectMap[$id]; } return parent::createControllerByID($id); } 0x01 \u7528\u6cd5 public $controllerRedirectMap = [ &#39;foo&#39; =&gt; &#39;bar&#39; \/\/ \u8bbf\u95ee `module\/foo\/index` \u5c06\u4f1a\u88ab\u91cd\u5b9a\u5411\u81f3 `module\/bar\/index` &#39;foo\/bar&#39; =&gt; &#39;bar\/foo&#39; \/\/ \u8bbf\u95ee `module\/foo\/bar\/index` \u5c06\u4f1a\u88ab\u91cd\u5b9a\u5411\u81f3 `module\/bar\/foo\/index` ]; 0x02 \u611f\u60f3 \u4e00\u53e3\u6c14\u5199\u4e09\u7bc7\u5173\u4e8e Yii2 \u7684\u535a\u6587\uff0c\u7b97\u662f\u5bf9\u81ea\u5df1\u8fd1\u671f\u9879\u76ee\u4e2d\u7528\u5230 Yii \u4ee5\u6765\u7684\u6280\u5de7\u5c0f\u7ed3\u5427\u3002"},{"title":"Yii2 \u5728\u63a7\u5236\u5668\u5185\u6620\u5c04 Action \u5230\u5176\u5b83\u52a8\u4f5c","link":"https:\/\/wi1dcard.dev\/posts\/yii2-redirect-action-in-controller\/","pubDate":"Fri, 13 Jul 2018 12:02:50 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/yii2-redirect-action-in-controller\/","description":"\u672c\u6587\u8bb2\u89e3\uff1a\u5982\u4f55\u628a\u63a7\u5236\u5668\u5185\u7684\u4efb\u610f\u4e00\u4e2a Action \u6620\u5c04\u5230\u53e6\u4e00\u4e2a Action\u3002\n0x00 \u51c6\u5907 Yii ^ 2.0.7 0x01 \u4ee3\u7801 \u9996\u5148\u5b9a\u4e49\u4e00\u4e2a RedirectAction \u7c7b\u3002\nclass RedirectAction { protected $actionId; public function __construct($actionId) { $this-&gt;actionId = $actionId; } public function __invoke($id, \\yii\\base\\Controller $controller) { return $controller-&gt;createAction($this-&gt;actionId); } } \u63a5\u7740\u5728\u63a7\u5236\u5668\u5185\u91cd\u5199\u5b9e\u73b0 actions() \u65b9\u6cd5\uff0c\u7528\u4e8e\u6620\u5c04 Action ID =&gt; \u5b9e\u9645\u7684\u52a8\u4f5c\u3002"},{"title":"Yii2 \u5141\u8bb8\u63a7\u5236\u5668\u5185\u76f4\u63a5\u8fd4\u56de\u6570\u7ec4","link":"https:\/\/wi1dcard.dev\/posts\/yii2-return-array-in-controller\/","pubDate":"Fri, 13 Jul 2018 12:01:36 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/yii2-return-array-in-controller\/","description":"\u7c7b\u4f3c Laravel \u7684\u6548\u679c\uff1a\u76f4\u63a5 return \u6570\u7ec4\u8f93\u51fa JSON \u54cd\u5e94\u3002\u529e\u6cd5\u6709\u5f88\u591a\uff0c\u76ee\u524d\u6211\u627e\u5230\u7684\u6700\u4f18\u89e3\u51b3\u65b9\u6848\u5982\u4e0b\u3002\n\/** * Enable JSON response if app returns Array or Object * * @return void *\/ protected function enableJsonResponse() { $this-&gt;response-&gt;on(\\yii\\web\\Response::EVENT_BEFORE_SEND, function ($event) { \/** @var \\yii\\web\\Response $response *\/ $response = $event-&gt;sender; if (is_array($response-&gt;data) || is_object($response-&gt;data)) { $response-&gt;format = \\yii\\web\\Response::FORMAT_JSON; } } ); } \u6216\u8005\u5728\u914d\u7f6e\u5185\u5b9a\u4e49\u4e5f\u53ef\u4ee5\uff1a"},{"title":"PHP \u6279\u91cf\u66ff\u6362\u5b57\u7b26\u4e32","link":"https:\/\/wi1dcard.dev\/posts\/php-str-replace-in-associative-array\/","pubDate":"Wed, 11 Jul 2018 15:14:36 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/php-str-replace-in-associative-array\/","description":"PHPer \u4eec\u5e94\u8be5\u90fd\u77e5\u9053 str_replace \u51fd\u6570\uff0c\u800c\u5982\u4f55\u4f7f\u7528\u6570\u7ec4\u6279\u91cf\u66ff\u6362\u67d0\u5b57\u7b26\u4e32\u5185\u7684\u5b50\u4e32\uff0c\u8fd9\u91cc\u6709\u4e2a\u9a9a\u64cd\u4f5c\u3002\n\u8bdd\u4e0d\u591a\u8bf4\uff0c\u76f4\u63a5\u4e0a\u4ee3\u7801\uff1a\n$map = [ &#39;foo&#39; =&gt; &#39;bar&#39;, \/\/ ... ]; $str = str_replace(array_keys($map), array_values($map), $str);"},{"title":"PHP \u4f7f\u7528 array_map \u66ff\u4ee3 foreach","link":"https:\/\/wi1dcard.dev\/posts\/php-array-map-instead-of-foreach\/","pubDate":"Wed, 11 Jul 2018 14:44:18 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/php-array-map-instead-of-foreach\/","description":"\u8bb2\u4e2a PHP \u7684\u9a9a\u64cd\u4f5c\u3002\u8bba\u5982\u4f55\u5b9e\u73b0\uff1a\u628a\u4e8c\u7ef4\u6570\u7ec4\u5185\u67d0\u4e8c\u7ef4\u5143\u7d20\u7684\u503c\uff0c\u5355\u72ec\u63d0\u51fa\u6765\u7ec4\u6210\u4e00\u7ef4\u6570\u7ec4\u3002\n0x00 \u4f20\u7edf\u64cd\u4f5c $pieces = []; foreach($whole as $item) { $pieces[] = $item[&#39;foo&#39;]; } return $pieces; 0x01 \u9a9a\u64cd\u4f5c return array_map( function ($item) { return $item[&#39;foo&#39;]; }, $whole ); \u7701\u6389\u4e24\u4e2a\u53d8\u91cf\uff08$pieces\u3001$item\uff09\uff0c\u5bf9\u4e8e\u4e1a\u52a1\u903b\u8f91\u6bd4\u8f83\u590d\u6742\u7684\u4f4d\u7f6e\uff0c\u7701\u4e00\u4e2a\u53d8\u91cf\u8bf4\u4e0d\u5b9a\u5c31\u5c11\u6b7b\u5341\u4e2a\u8111\u7ec6\u80de&hellip;"},{"title":"\u5bf9 MacDown \u8bf4\u518d\u89c1","link":"https:\/\/wi1dcard.dev\/posts\/say-goodbye-to-macdown\/","pubDate":"Tue, 10 Jul 2018 13:27:35 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/say-goodbye-to-macdown\/","description":"\u8fd9\u4e24\u5929\u53c8\u5728\u6298\u817e\u7f16\u8f91\u5668\uff0c\u65e9\u4e0a\u521a\u66f4\u65b0\u4e86\u5173\u4e8e VSCode \u7684\u6700\u65b0\u914d\u7f6e\u3002\n\u4ece\u63a5\u89e6 Markdown \u5230\u73b0\u5728\uff0c\u5dee\u4e0d\u591a\u4e00\u5e74\uff0c\u6700\u5f00\u59cb\u8bb0\u4e0d\u4f4f\u683c\u5f0f\u3001\u5230\u73b0\u5728\u9a7e\u8f7b\u5c31\u719f\u3002\n\u6700\u65e9\u7684\u65f6\u5019\uff0c\u5165\u95e8 MD \u9009\u4e86\u5f88\u4e45\u7684\u7f16\u8f91\u5668\uff0c\u4ece\u5404\u7c7b\u5728\u7ebf\u7f16\u8f91\u4e00\u8def\u64b8\u5230 MacDown\uff0c\u90a3\u4e2a\u65f6\u5019\u9009\u7f16\u8f91\u5668\u7684\u552f\u4e00\u6807\u51c6\u5c31\u662f\uff1a\u9884\u89c8\u4e00\u5b9a\u8981\u5f3a\u5927\u725b\u903c\ud83d\ude02\u3002\n\u540e\u6765\u628a MD \u4f5c\u4e3a\u4ee3\u7801\u6587\u6863\u6807\u914d\uff0c\u5c31\u5f00\u59cb\u5c1d\u8bd5\u7528 VSCode \u5199 MD\uff0c\u4e5f\u6162\u6162\u603b\u7ed3\u51fa\u4e86\u4e00\u4e9b\u4f18\u52a3\uff1a\nVSCode \u652f\u6301\u4ee3\u7801\u9ad8\u4eae\u6e32\u67d3\uff0cMacDown \u4e0d\u652f\u6301\u3002 MacDown \u652f\u6301\u914d\u7f6e\u5404\u7c7b\u6e32\u67d3\u9009\u9879\u3001\u81ea\u5b9a\u4e49 CSS\uff0cVSCode \u539f\u751f\u4e0d\u652f\u6301\u3002 MacDown \u652f\u6301\u56de\u8f66\u81ea\u52a8\u8865\u5168\u5217\u8868 - \/ *\uff0cVSCode \u539f\u751f\u4e0d\u652f\u6301\u3002 MacDown \u652f\u6301\u5bfc\u51fa PDF\uff0cVSCode \u539f\u751f\u4e0d\u652f\u6301\u3002 \u4f46\u662f\uff01\u5c31\u50cf\u6211\u5f88\u65e9\u4e4b\u524d\u5728 \u63a8\u8350 VSCode \u7684\u535a\u6587 \u91cc\u8bf4\u7684\u90a3\u6837\uff1a"},{"title":"VS Code - \u6765\u81ea\u5fae\u8f6f\u7684\u9a9a\u64cd\u4f5c","link":"https:\/\/wi1dcard.dev\/posts\/proud-to-use-vscode\/","pubDate":"Tue, 10 Jul 2018 09:23:17 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/proud-to-use-vscode\/","description":"PHP Storm \u56e0\u529f\u80fd\u5f3a\u5927\u88ab PHPer \u4eec\u6240\u719f\u77e5\uff0c\u4f46\u81ea\u8eab\u529f\u80fd\u6108\u53d1\u5f3a\u5927\u5e26\u6765\u7684\u95ee\u9898\u4e5f\u540c\u6837\u660e\u663e\uff1a\u529f\u80fd\u81c3\u80bf\uff0f\u542f\u52a8\u7f13\u6162\uff0f\u5185\u5b58\u5360\u7528\u9ad8\u7b49\u3002VS Code \u7ecf\u8fc7\u51e0\u5e74\u7684\u53d1\u5c55\u7b97\u662f\u540e\u8d77\u4e4b\u79c0\uff0c\u5360\u9886\u4e86\u4e00\u90e8\u5206\u5c0f\u4f17\u5e02\u573a\u3002\n\u5c1d\u8bd5\u53d1\u73b0\uff0c\u901a\u8fc7\u6df1\u5ea6\u914d\u7f6e\uff0cVS Code \u7f16\u5199 PHP \u4ee3\u7801\u7684\u4f53\u9a8c\u5b8c\u5168\u4e0d\u4e9a\u4e8e PHP Storm\u3002\u6545\u4eca\u5929\u4e3a\u5927\u5bb6\u4ecb\u7ecd\uff1a\u6765\u81ea\u5fae\u8f6f\u7684\u9a9a\u64cd\u4f5c \u2014\u2014 VS Code\u3002\n\u66f4\u65b0\uff082019 \u5e74 4 \u6708 11 \u65e5\uff09 \u7531\u4e8e Settings \u5185\u5305\u542b\u654f\u611f\u4fe1\u606f\uff0c\u56e0\u6b64 Gist \u94fe\u63a5\u5df2\u79fb\u9664\u3002"},{"title":"Markdown \u6807\u9898\u5c45\u4e2d","link":"https:\/\/wi1dcard.dev\/posts\/markdown-center-heading\/","pubDate":"Mon, 09 Jul 2018 16:35:59 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/markdown-center-heading\/","description":"\u641c\u4e86\u4e0d\u5c11\u5199\u6cd5\uff0c\u56e0 Markdown \u6ca1\u6709\u786e\u5207\u6807\u51c6\u548c\u5b9e\u73b0\u6240\u4ee5\u65e0\u6cd5\u7edf\u4e00\uff0c\u76ee\u524d\u627e\u5230\u4e00\u79cd\u5728 GitHub \u4eb2\u6d4b\u6709\u6548\u7684\u65b9\u6cd5\uff0c\u7b80\u5355\u8bb0\u5f55\u3002\n&lt;h1 align=&#34;center&#34;&gt; HEADING TITLE &lt;\/h1&gt;"},{"title":"Git \u4ed3\u5e93\u6253\u5305\u589e\u91cf\u66f4\u65b0\u5305","link":"https:\/\/wi1dcard.dev\/posts\/pack-incremental-updates-using-git\/","pubDate":"Sun, 08 Jul 2018 15:06:09 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/pack-incremental-updates-using-git\/","description":"\u76ee\u524d\u4efb\u804c\u516c\u53f8\uff0c\u6bcf\u5468\u4e00\u65e5\u5e38\u66f4\u65b0\u9700\u8981\u6253\u5305\u300c\u4e0a\u4e2a\u7248\u672c\u300d\u5230\u300c\u6700\u65b0\u4ee3\u7801\u300d\u7684\u538b\u7f29\u5305\uff0c\u56fe\u65b9\u4fbf\u5199\u6210\u547d\u4ee4\uff0c\u4ee5\u4fbf\u540e\u7eed\u4f7f\u7528\u3002\n0x00 \u601d\u8def git diff \u67e5\u627e\u300c\u4e0a\u4e2a\u7248\u672c\u7684\u63d0\u4ea4\u300d-&gt;\u300c\u6700\u65b0\u63d0\u4ea4\u300d\u7684\u6587\u4ef6\u533a\u522b\u3002 \u5229\u7528\u5404\u7c7b\u538b\u7f29\u5de5\u5177\u6253\u5305\u538b\u7f29\u6587\u4ef6\u3002 0x01 \u4ee3\u7801 git diff --diff-filter=d --name-only &lt;COMMIT_ID&gt; HEAD | xargs tar cvf &lt;FILE_NAME&gt; --exclude=&lt;EXCLUDE&gt; --diff-filter=d\uff1a\u5ffd\u7565\u5220\u9664\u7684\u6587\u4ef6 --name-only\uff1a\u53ea\u5bfc\u51fa\u6587\u4ef6\u540d &lt;COMMIT_ID&gt;\uff1a\u4ece\u54ea\u6b21\u63d0\u4ea4\u5f00\u59cb\u5bfc\u51fa HEAD\uff1a\u5230\u6700\u65b0\u7684\u63d0\u4ea4 &lt;FILE_NAME&gt;\uff1a\u6253\u5305\u7684\u6587\u4ef6\u8def\u5f84 &lt;EXCLUDE&gt;\uff1a\u6392\u9664\u6587\u4ef6\u6216\u76ee\u5f55 \u53e6\u5916\uff0c\u5982\u4e0d\u9700\u8981\u6253\u5305\uff0c\u53ea\u9700\u62f7\u8d1d\uff0c\u53ef\u5c06 tar \u66ff\u6362\u4e3a cp \u547d\u4ee4\uff1a"},{"title":"\u5fae\u4fe1\u5f00\u53d1\u8005\u5de5\u5177 - \u591a\u7528\u6237\u591a\u5f00\u5b9e\u8df5","link":"https:\/\/wi1dcard.dev\/posts\/wechat-dev-tool-multi-instance\/","pubDate":"Fri, 06 Jul 2018 09:32:42 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/wechat-dev-tool-multi-instance\/","description":"\u6b64\u65b9\u6cd5\u622a\u81f3\u672c\u6587\u53d1\u5e03\u65f6\u6700\u65b0\u7248\u672c\uff081.02.1806120\uff09\u6709\u6548\u3002\nStep 1 \u590d\u5236\u4e00\u4efd\u5fae\u4fe1\u5f00\u53d1\u8005\u5de5\u5177\u5b89\u88c5\u76ee\u5f55\u5168\u90e8\u6587\u4ef6\u3002\nStep 2 \u6253\u5f00\u65b0\u76ee\u5f55\uff0c\u627e\u5230 package.nw\/package.json \u6587\u4ef6\u3002\nStep 3 \u7f16\u8f91\u6b64\u6587\u4ef6\uff0c\u65b0\u589e\u4e00\u9879 &quot;single-instance&quot;: false\uff0c\u5e76\u4fee\u6539 name \u968f\u4fbf\u6362\u4e2a\u540d\u5b57\u5373\u53ef\u3002\n\u4f8b\u5982\uff1a\n{ &#34;single-instance&#34;: false, ."},{"title":"PHPCPD - \u68c0\u67e5\u590d\u5236\u7c98\u8d34\u7684 PHP \u4ee3\u7801","link":"https:\/\/wi1dcard.dev\/posts\/php-copy-paste-detector\/","pubDate":"Wed, 04 Jul 2018 11:12:14 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/php-copy-paste-detector\/","description":"\u6700\u8fd1\u7a81\u7136\u5bf9\u4ee3\u7801\u8d28\u91cf\u68c0\u67e5\u611f\u5174\u8da3\uff0c\u51b3\u5b9a\u5bf9\u516c\u53f8\u9879\u76ee\u7684\u4ee3\u7801\u5197\u4f59\u8fdb\u884c\u5f7b\u67e5\u3002\u7ecf\u8fc7\u641c\u7d22\u53d1\u73b0\u4e00\u6b3e\u4e0d\u9519\u7684\u5de5\u5177\uff0c\u9488\u5bf9\u590d\u5236\u7c98\u8d34\u7684\u4ee3\u7801\u6709\u4e0d\u9519\u7684\u8bc6\u522b\u7387\uff0c\u5728\u6b64\u63a8\u8350\u3002\n0x00 \u51c6\u5907 \u9879\u76ee\u5730\u5740\uff1ahttps:\/\/github.com\/sebastianbergmann\/phpcpd\n0x01 \u5b89\u88c5 \u76f4\u63a5\u4e0b\u8f7d\u4ee3\u7801\u5305 wget https:\/\/phar.phpunit.de\/phpcpd.phar chmod +x phpcpd.phar \u6216\u4f7f\u7528 Composer \u5168\u5c40\u5b89\u88c5 composer global require sebastian\/phpcpd 0x02 \u4f7f\u7528 \u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u8981\u5e26\u4e0a\u4ee3\u7801\u6587\u4ef6\u5939\u8def\u5f84\u5373\u53ef\u3002"},{"title":"SSH \u975e\u6d3b\u52a8\u8fde\u63a5\u88ab\u5173\u95ed","link":"https:\/\/wi1dcard.dev\/posts\/ssh-connection-closed-by-remote-host\/","pubDate":"Fri, 22 Jun 2018 10:54:00 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/ssh-connection-closed-by-remote-host\/","description":"\u5728\u4f7f\u7528 macOS \u901a\u8fc7 SSH \u8fde\u63a5\u5230\u6811\u8393\u6d3e\u65f6\uff0c\u9047\u5230 Connection to *** closed by remote host. \u7684\u95ee\u9898\uff0c\u4e0b\u9762\u4ecb\u7ecd\u4e24\u79cd\u89e3\u51b3\u65b9\u6848\u3002\n\u6307\u5b9a KeepAlive \u53c2\u6570 ssh -o TCPKeepAlive=yes {HOST} \u4fee\u6539 SSH \u5ba2\u6237\u7aef\u914d\u7f6e \u4fee\u6539\u6216\u521b\u5efa ~\/."},{"title":"\u6811\u8393\u6d3e\u6298\u817e\u968f\u624b\u8bb0 - Time Machine","link":"https:\/\/wi1dcard.dev\/posts\/raspberry-pi-time-machine\/","pubDate":"Thu, 21 Jun 2018 10:05:47 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/raspberry-pi-time-machine\/","description":"\u7fa4\u6656\u592a\u8d35\uff01\u82e5\u662f\u4e0d\u4ecb\u610f USB 2.0 \u548c 100 Mbps \u5e26\u5bbd\u7684\u8bdd\uff0c\u7528\u6811\u8393\u6d3e + \u79fb\u52a8\u786c\u76d8\u505a\u4e2a\u4f4e\u529f\u8017\u5c0f\u578b NAS \u4e5f\u662f\u4e0d\u9519\u7684\u9009\u62e9\uff1b\u642d\u5efa Samba \u7684\u6559\u7a0b\u5230\u5904\u90fd\u662f\uff0c\u672c\u7bc7\u5c06\u4ecb\u7ecd\u4ee5\u6b63\u786e\u7684\u59ff\u52bf\u642d\u5efa AFP \u5171\u4eab + Time Machine\u3002\nThe following step are the ones that enable Time Machine backups with Raspberry Pi plus a bit of polishing to my taste."},{"title":"PHP intval() \u4e0e (int) \u8f6c\u6362\u7684\u533a\u522b","link":"https:\/\/wi1dcard.dev\/posts\/php-intval-vs-int-casting\/","pubDate":"Mon, 18 Jun 2018 20:43:46 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/php-intval-vs-int-casting\/","description":"\u8bf4\u5230\u5b57\u7b26\u4e32\u8f6c\u6574\u578b\uff0cPHP \u91cc\u5e38\u7528\u7684\u4e24\u4e2a\u65b9\u6cd5\u76f8\u4fe1\u5404\u4f4d\u90fd\u6709\u4e86\u89e3\uff0c\u4f46\u5176\u4e2d\u5fae\u5c0f\u7684\u533a\u522b\u7f3a\u9c9c\u4e3a\u4eba\u77e5\u3002\u672c\u6587\u7b80\u5355\u68b3\u7406\uff0c\u4ee5\u5907\u65e5\u540e\u67e5\u9605\u3002\n\u529f\u80fd \u5bf9\u4e8e\u5341\u8fdb\u5236\u7684\u8f6c\u6362\uff0c\u4e24\u79cd\u65b9\u5f0f\u7684\u529f\u80fd\u662f\u5b8c\u5168\u4e00\u81f4\u7684\uff1a\n$int = intval($str); \/\/ \u7b49\u4ef7\u4e8e $int = (int) $str; \u800c intval() \u5177\u5907\u4e00\u4e2a\u53ef\u9009\u53c2\u6570 $base \u9ed8\u8ba4\u503c\u4e3a 10\uff0c\u7528\u4e8e\u8f6c\u6362\u4e0d\u540c\u6765\u81ea\u8fdb\u5236\u7684\u6570\u636e\uff1a\n$int = intval(&#39;0123&#39;, 8); \/\/ == 83 \u7531\u8fd9\u4e2a\u53c2\u6570\uff0c\u53c8\u5f15\u8d77\u53e6\u4e00\u6761\u9700\u8981\u6ce8\u610f\u7684\u70b9\uff0c\u5148\u770b\u4f8b\u5b50\uff1a"},{"title":"C# \u4e8c\u8fdb\u5236\u8f6c\u6362 \u7f3a\u4f4d\u8865\u96f6","link":"https:\/\/wi1dcard.dev\/posts\/csharp-dec-to-zero-padded-bin\/","pubDate":"Sat, 16 Jun 2018 21:29:17 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/csharp-dec-to-zero-padded-bin\/","description":"\u8fdb\u5236\u8f6c\u6362\uff1a\nbin = Convert.ToString(dec, 2); \u7f3a\u4f4d\u8865\u96f6\uff1a\nbin = bin.PadLeft(8, &#39;0&#39;);"},{"title":"\u5347\u7ea7 MySQL 5.7 \u5230 8.0 \u9047\u5230\u7684\u5751","link":"https:\/\/wi1dcard.dev\/posts\/upgrade-mysql-5.7-to-8.0\/","pubDate":"Sat, 16 Jun 2018 00:30:13 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/upgrade-mysql-5.7-to-8.0\/","description":"\u524d\u51e0\u5929\u624b\u8d31\u5565\u4e5f\u6ca1\u770b\u6267\u884c brew upgrade\uff0c\u968f\u540e\u5c31\u540e\u6094\u4e86&hellip; \u51e1\u4e8b\u6ca1\u6709\u4e00\u5e06\u98ce\u987a\uff0c\u5728\u6b64\u603b\u7ed3\u5347\u7ea7\u7ecf\u9a8c\uff0c\u4ee5\u4f9b\u540e\u4eba\u53c2\u8003\u3002\n0x00 \u573a\u666f\uff1a\u6267\u884c mysql.server start \u63d0\u793a The server quit without updating PID file mysql.server start\u3002\n\u89e3\u51b3\uff1a\ncd \/usr\/local\/var\/mysql\/\uff0c\u5207\u6362\u5230 MySQL \u6570\u636e\u76ee\u5f55\uff08macOS \u4f7f\u7528 brew \u5b89\u88c5\u7684 MySQL \u9ed8\u8ba4\u6570\u636e\u5b58\u50a8\u8def\u5f84\u5982\u4e0a\uff09\u3002 rm *."},{"title":"AMH \u9762\u677f\u91cd\u590d\u52a0\u8f7d MySQL \u6269\u5c55","link":"https:\/\/wi1dcard.dev\/posts\/amh-loaded-mysql-module-twice\/","pubDate":"Thu, 14 Jun 2018 14:38:42 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/amh-loaded-mysql-module-twice\/","description":"\u771f\u662f\u5929\u4e0b\u6ca1\u6709\u4e0d\u5751\u7684\u9762\u677f&hellip; \u76f8\u7ee7\u5b9d\u5854\u548c WDCP \u4e4b\u540e\uff0cAMH \u4e5f\u51fa\u4e86\u95ee\u9898\u3002\n0x00 \u8868\u8c61 \u62a5\u9519\u5982\u4e0b\uff1a\nPHP Warning: Module 'mysql' already loaded in Unknown on line 0\nlogs\/amh-php-errors.log \u6587\u4ef6\u5185\u4e5f\u6709\u5076\u5c14\u51fa\u73b0\u7684\u8bb0\u5f55\u3002"},{"title":"Stylish - \u81ea\u5b9a\u4e49 GitHub \/ Google \/ Youtube \u4e3b\u9898","link":"https:\/\/wi1dcard.dev\/posts\/custom-themes-for-any-website\/","pubDate":"Thu, 14 Jun 2018 07:26:27 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/custom-themes-for-any-website\/","description":"\u6628\u5929\u53d1\u6587\u622a\u56fe\uff0cGitHub \u662f\u9ed1\u8272\uff08Dark\uff09\u4e3b\u9898\uff0c\u672c\u6587\u5c06\u4ecb\u7ecd\uff1a\u5982\u4f55\u5feb\u901f\u7ed9\u7f51\u7ad9\u52a0\u7279\u6280\uff08duang\uff0cduang\uff0cduang\uff09\u3002\n0x00 Stylish \u5b9e\u9645\u4e0a\uff0c\u6211\u7528\u4e86\u4e2a\u540d\u53eb\u300cStylish\u300d\u7684\u795e\u5668\uff0c\u8fd9\u73a9\u610f\u5728 Chrome \u5e94\u7528\u5546\u5e97\u53ef\u4ee5\u76f4\u63a5\u4e0b\u8f7d\uff1a\nhttps:\/\/chrome.google.com\/webstore\/detail\/fjnbnpbmkenffdnngjfgmeleoegfcffe\n\u5b89\u88c5\u540e\u53ef\u4ee5\u76f4\u63a5\u8bbf\u95ee\u5b98\u65b9\u4e3b\u9898\u5546\u5e97\uff1a\nhttps:\/\/userstyles.org\/\n0x01 \u4e3b\u9898 \u63a8\u8350\u51e0\u4e2a\u6211\u5e38\u7528\u7684\u4e3b\u9898\uff1a\nGitHub Dark Google - Clean Dark Fade&#43; for Youtube Baidu Lite \u767e\u5ea6\u8f7b \u767e\u5ea6\u767e\u79d1-\u5c4f\u853d\u548c\u4f18\u5316 0x02 \u8865\u5145 Baidu Lite \u767e\u5ea6\u8f7b\uff0c\u8fd9\u4e2a\u4e3b\u9898\u6709\u4e9b\u517c\u5bb9\u6027\u95ee\u9898\uff0c\u4f8b\u5982 Logo \u91cd\u53e0\u7b49\u7b49\u3002\u539f\u4f5c\u8005\u5df2\u7ecf\u5f88\u4e45\u4e0d\u7ef4\u62a4\uff0c\u6211\u7b80\u5355\u4fee\u590d\u5e76\u6574\u4f53\u6539\u4e3a Dark \u8272\u8c03\uff0c\u653e\u51fa\u7ed9\u5927\u5bb6\u53c2\u8003\uff1ahttps:\/\/gist."},{"title":"\u817e\u8baf\u4e91\u5c4e\u4e00\u6837\u7684\u5bf9\u8c61\u5b58\u50a8","link":"https:\/\/wi1dcard.dev\/posts\/qcloud-terrible-cos\/","pubDate":"Wed, 13 Jun 2018 12:54:04 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/qcloud-terrible-cos\/","description":"\u4e0d\u591a\u8bf4\u4e86\uff0c\u4e0a\u56fe\uff0c\u81ea\u5df1\u611f\u53d7\u5427\u3002\nhttps:\/\/github.com\/tencentyun\/cos-php-sdk-v5\/pull\/72"},{"title":"\u5b9d\u5854\u9762\u677f PHP \u6253\u5f00\u6587\u4ef6\u5931\u8d25\u539f\u56e0\u6392\u67e5","link":"https:\/\/wi1dcard.dev\/posts\/baota-open-basedir-restriction\/","pubDate":"Wed, 13 Jun 2018 10:18:52 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/baota-open-basedir-restriction\/","description":"\u8fd1\u671f\u5728\u4f7f\u7528\u5b9d\u5854\u9762\u677f\u90e8\u7f72 PHP \u9879\u76ee\u65f6\uff0c\u4e0a\u4f20\u6587\u4ef6\u7684\u573a\u666f\uff0cPHP \u65e0\u6cd5\u5bf9\u4e34\u65f6\u6587\u4ef6\u8fdb\u884c\u6253\u5f00\u64cd\u4f5c\uff0c\u65e0\u6cd5\u8ba1\u7b97sha1\u3001md5\uff0c\u9042\u8fdb\u884c\u6392\u67e5\u3002\n0x00 \u62a5\u9519 sha1_file(): open_basedir restriction in effect. File(\/www\/wwwroot\/tmp\/***) is not within the allowed path(s): (***)\n0x01 \u539f\u56e0 \u65b0\u7248\u5b9d\u5854\u9762\u677f\u521b\u5efa\u7ad9\u70b9\u65f6\u9ed8\u8ba4\u6dfb\u52a0 ."},{"title":"\u662f\u65f6\u5019\u79c0\u4e00\u6ce2\u771f\u6b63\u7684\u6069\u7231\u4e86","link":"https:\/\/wi1dcard.dev\/posts\/image-to-ascii-art\/","pubDate":"Wed, 13 Jun 2018 07:34:08 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/image-to-ascii-art\/","description":"<p>\u8981\u8d70\u521b\u610f\u8def\u7ebf\u597d\u5417\uff01<code>print \u6211\u7231\u4f60<\/code> \u4e4b\u6d41\u6015\u4e0d\u662f\u5728\u5c0f\u5b66\u4e94\u5e74\u7ea7\u5965\u585e\u7684\u65f6\u5019\u5c31\u73a9\u817b\u7684\uff0c\u771f\u4e22\u300c\u7406\u79d1\u751f\u300d\u7684\u8138\u3002<\/p>"},{"title":"MySQL \u5728\u6240\u6709\u5b57\u6bb5\u5185\u641c\u7d22\u66ff\u6362\u6587\u672c","link":"https:\/\/wi1dcard.dev\/posts\/mysql-replace-text-in-all-fields\/","pubDate":"Tue, 12 Jun 2018 17:12:28 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/mysql-replace-text-in-all-fields\/","description":"\u53c8\u662f\u9879\u76ee\u6240\u9700\uff0c\u7ee7\u7eed\u9020\u8f6e\u5b50\u3002\u66ff\u6362\u6307\u5b9a\u6570\u636e\u5e93\u7684\u300c\u6240\u6709\u8868\u300d\u5185\u300c\u6240\u6709\u8bb0\u5f55\u300d\u7684\u300c\u6240\u6709\u5b57\u6bb5\u300d\u7684\u503c\uff0c\u4ee5\u4e0b\u4e3a SQL \u8bed\u53e5\u3002\n0x00 \u521b\u5efa\u5b58\u50a8\u8fc7\u7a0b CREATE PROCEDURE `replace_table` (IN `orig_str` VARCHAR(100), IN `new_str` VARCHAR(100), IN `db_name` VARCHAR(100), IN `t_name` VARCHAR(100)) BEGIN DECLARE cul_name VARCHAR(100); DECLARE done int default 0; DECLARE cur CURSOR FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA."},{"title":"PHP \u76f8\u5bf9\u8def\u5f84\u8f6c\u7edd\u5bf9\u8def\u5f84","link":"https:\/\/wi1dcard.dev\/posts\/php-true-realpath\/","pubDate":"Fri, 08 Jun 2018 14:11:22 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/php-true-realpath\/","description":"PHP has a very handy function to convert relative pathnames to absolute paths: realpath(). However, it\u2019s limited in at least two aspects which both make it inconvenient (and sometimes impossible) to use:"},{"title":"json_encode() \u5e8f\u5217\u5316\u975e\u516c\u5f00\u5c5e\u6027","link":"https:\/\/wi1dcard.dev\/posts\/json-encode-non-public-properties\/","pubDate":"Fri, 08 Jun 2018 10:56:00 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/json-encode-non-public-properties\/","description":"\u8fd1\u671f\u9879\u76ee\u8fc7\u7a0b\u4e2d\uff0c\u6709\u4e00\u5904\u573a\u666f\u9700\u8981\u4f7f\u7528 json_encode \u65b9\u6cd5\u5e8f\u5217\u5316\u67d0\u5bf9\u8c61\u5185\u7684 protected \u5c5e\u6027\u3002\n0x00 \u5b9e\u73b0 \u8c08\u5230 json_encode \u81ea\u7136\u60f3\u5230 &lt;code&gt;JsonSerializable&lt;\/code&gt; \u63a5\u53e3\uff0c\u6b64\u63a5\u53e3\u63d0\u4f9b\u4e00\u4e2a\u62bd\u8c61\u65b9\u6cd5\uff1a\nabstract public mixed JsonSerializable::jsonSerialize ( void ) \u4e8e\u662f\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u5b9e\u73b0\uff1a"},{"title":"PHP \u5b9e\u73b0\u7c7b\u4f3c C# MakeRelativeUri \u65b9\u6cd5","link":"https:\/\/wi1dcard.dev\/posts\/php-getting-releative-path\/","pubDate":"Mon, 04 Jun 2018 10:32:08 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/php-getting-releative-path\/","description":"\u5728\u4f7f\u7528 C# \u7684\u8fc7\u7a0b\u4e2d\uff0c\u51e0\u4e4e\u53ef\u4ee5\u5168\u7a0b\u53ea\u9760 MSDN\uff0c\u5f88\u591a\u65b9\u6cd5\u5fae\u8f6f\u5728 .NET \u5185\u5c01\u88c5\u4e86\u5f88\u89c4\u8303\u7684\u5b9e\u73b0\uff1b\u800c\u8fd1\u671f\u5728\u4f7f\u7528 PHP \u5f00\u53d1\u9879\u76ee\u65f6\u9047\u5230\u4e2a\u5c0f\u95ee\u9898\uff1a\u83b7\u53d6\u6587\u4ef6\u6216\u76ee\u5f55 A \u76f8\u5bf9\u4e0e B \u7684\u8def\u5f84\uff0c\u7ffb\u4e86\u4e0b PHP Manual \u53d1\u73b0 PHP \u5185\u6838\u5e76\u6ca1\u6709\u63d0\u4f9b\u5b98\u65b9\u5b9e\u73b0\uff0c\u4e8e\u662f\u8c37\u6b4c\u4e4b\uff0c\u627e\u5230\u4e00\u4efd\u6bd4\u8f83\u89c4\u8303\u7684\u5b9e\u73b0\uff0c\u5728\u6b64\u8bb0\u5f55\uff0c\u4ee5\u5907\u67e5\u8be2\u3002\n0x00 \u539f\u6587 https:\/\/stackoverflow.com\/questions\/2637945\/getting-relative-path-from-absolute-path-in-php"},{"title":"\u535a\u5ba2\u8fc1\u79fb \u2014\u2014 \u5168\u65b0\u7684\u5f00\u59cb","link":"https:\/\/wi1dcard.dev\/posts\/blog-migrated\/","pubDate":"Sat, 02 Jun 2018 08:59:00 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/blog-migrated\/","description":"\u6700\u8fd1\u4ece\u524d\u516c\u53f8\u79bb\u804c\uff0c\u5185\u5fc3\u8868\u793a\u5f88\u75db\uff0c\u81ea\u5df1\u4e4b\u524d\u7684\u6280\u672f\u6587\u7ae0\u8fd8\u90fd\u5728\u56e2\u961f\u535a\u5ba2\u90a3\u8fb9\uff0c\u5c06\u8fd1\u4e00\u5e74\u7684\u6210\u679c\u4e0d\u80fd\u5c31\u8fd9\u4e48\u653e\u5f03\uff0c\u4e8e\u662f\u5f00\u59cb\u6298\u817e\u8f6c\u79fb\u3002\n\u9996\u5148\u8003\u8651\u4e86\u4e00\u4e0b\u5404\u8def\u52a8\u6001\u535a\u5ba2\u7cfb\u7edf\uff0c\u5165\u773c\u7684\u53ea\u6709 Typecho\uff1b\u60f3\u4e86\u4e00\u4e0b\uff0c\u611f\u89c9\u518d\u642d\u4e2a\u73af\u5883\u592a\u9ebb\u70e6\uff0c\u8fd8\u8981\u8c03\u4f18\u3001\u52a0 CDN\u3001\u4fdd\u8bc1\u8bbf\u95ee\u901f\u5ea6\u4ec0\u4e48\u7684\u2026\u2026\u5e72\u8106\u4e00\u4e0d\u505a\u4e8c\u4e0d\u4f11\uff0c\u56de\u5f52\u6781\u7b80\u98ce\u683c\uff0c\u7528\u7eaf\u9759\u6001 + GitHub Pages\u3002\n\u4e8e\u662f\uff0c\u4f60\u73b0\u5728\u770b\u5230\u7684\u4e1c\u897f\u8bde\u751f\u4e86\u3002\n\u4e4b\u524d\u7684\u90fd\u8ba9\u5b83\u8fc7\u53bb\u5427\u3002\n\u6211\u4f1a\u7ee7\u7eed\u52aa\u529b\u7684\u3002"},{"title":"\u516d\u6708\uff0c\u4f60\u597d\u3002","link":"https:\/\/wi1dcard.dev\/posts\/say-hello-to-june\/","pubDate":"Fri, 01 Jun 2018 00:00:00 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/say-hello-to-june\/","description":"\u6211\u4eec\u6700\u597d\u7684\u9047\u89c1\uff0c\u662f\u73b0\u5728\u8fd9\u6837\u7684\u516d\u6708\u3002\u6211\u4eec\u6700\u597d\u7684\u544a\u522b\uff0c\u662f\u73b0\u5728\u8fd9\u6837\u2026\u2026\n\u6ca1\u7ea2\u773c\u3002"},{"title":"Markdown \u8bed\u6cd5\u7b80\u660e\u4ecb\u7ecd","link":"https:\/\/wi1dcard.dev\/posts\/markdown-syntax-intro\/","pubDate":"Wed, 30 May 2018 10:21:12 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/markdown-syntax-intro\/","description":"\u51e0\u4e4e\u6240\u6709 Git \u5e73\u53f0\u5728 Pull request \/ Issue \u7b49\u529f\u80fd\u4e0a\u5927\u91cf\u4f7f\u7528 Markdown \u8bed\u6cd5\uff0c\u6240\u4ee5\u5728\u8fd9\u91cc\u7b80\u5355\u4ecb\u7ecd\u5e76\u7ed9\u51fa\u6548\u679c\u9884\u89c8\uff0c\u4ee5\u65b9\u4fbf\u4f7f\u7528\u3002\n\u4e00\u7ea7\u6807\u9898 \u4e8c\u7ea7\u6807\u9898 \u4e09\u7ea7\u6807\u9898 \u56db\u7ea7\u6807\u9898 \u6709\u5e8f\u5217\u8868\uff1a\nthis is a test list \u65e0\u5e8f\u5217\u8868\uff1a"},{"title":"\u4fee\u590d WDCP \u9762\u677f\u65e0\u6cd5\u5224\u65ad HTTPS \u7684\u95ee\u9898","link":"https:\/\/wi1dcard.dev\/posts\/wdcp-lnamp-https-detecting-issue\/","pubDate":"Tue, 29 May 2018 14:27:08 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/wdcp-lnamp-https-detecting-issue\/","description":"WDCP \u9762\u677f\u9ed8\u8ba4\u91c7\u7528 LNAMP \u7684\u7ed3\u6784\uff0c\u5373 Nginx \u5904\u7406\u9759\u6001\u9875\u9762\uff0c\u5e76\u8f6c\u53d1\u52a8\u6001\u811a\u672c\u8bf7\u6c42\uff08\u5982 PHP\uff09\u5230 Apache \u5904\u7406\u3002\u8fd9\u5728\u6ca1\u6709 PHP-FPM \u7684\u65f6\u4ee3\u662f\u4e2a\u4e0d\u9519\u7684\u9009\u62e9\uff0c\u4f46\u82e5\u662f\u914d\u7f6e\u4e0d\u5f53\uff0c\u5b58\u5728\u7684\u95ee\u9898\u4e5f\u5f88\u660e\u663e\uff0c\u8fd9\u5c31\u662f\u4e00\u4f8b\u3002\n0x00 \u80cc\u666f \u6700\u8fd1\u4f7f\u7528 Yii2 \u6846\u67b6\u5f00\u53d1\u7684\u8fc7\u7a0b\u4e2d\uff0c\u53d1\u73b0\u5728 WDCP \u9762\u677f\u7684\u73af\u5883\u4e0b\uff0cYii \u81ea\u5e26\u7684 yii\\web\\Request::getIsSecureConnection \u5e76\u4e0d\u80fd\u6709\u6548\u5224\u65ad\u5176\u662f\u5426\u662f HTTPS \u8bf7\u6c42\u3002"},{"title":"Polacode - \u751f\u6210\u4f18\u96c5\u7f8e\u89c2\u7684\u4ee3\u7801\u7247\u6bb5\u56fe","link":"https:\/\/wi1dcard.dev\/posts\/vscode-polacode\/","pubDate":"Sat, 05 May 2018 22:54:15 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/vscode-polacode\/","description":"\u5988\u5988\u518d\u4e5f\u4e0d\u7528\u62c5\u5fc3\u6eda\u52a8\u622a\u56fe\u548c\u622a\u56fe\u8fb9\u6846\u4e86\uff5e\n0x00 \u5e9f\u8bdd\u4e0d\u591a\u8bf4\uff0c\u5148\u4e0a\u6548\u679c\u56fe\uff1a\n0x01 \u5176\u5b9e\u8fd9\u662f\u4e00\u6b3e VS Code \u7684\u63d2\u4ef6\uff0c\u53ea\u9700\u8981\u5728 VS Code \u5185\u5b89\u88c5\u5373\u53ef\u3002\n\u4f7f\u7528\u65b9\u6cd5\u6bd4\u8f83\u7b80\u5355\uff0c\u9996\u5148\u4f7f\u7528\u5feb\u6377\u952e Shift + Command + P \u8c03\u51fa\u547d\u4ee4\u7a97\u53e3\uff0c\u7136\u540e\u8f93\u5165 Polacode \u56de\u8f66\u3002"},{"title":"phpize \u7b80\u6613\u5165\u95e8","link":"https:\/\/wi1dcard.dev\/posts\/get-started-with-phpize\/","pubDate":"Mon, 30 Apr 2018 22:31:53 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/get-started-with-phpize\/","description":"\u672c\u6587\u4ee5\u5b89\u88c5 mongodb \u6269\u5c55\u4e3a\u4f8b\uff0c\u7b80\u5355\u8bb2\u89e3\u4f7f\u7528 phpize \u7ed9\u591a\u7248\u672c php \u7f16\u8bd1\u5b89\u88c5\u6269\u5c55\u3002\n0x00 \u51c6\u5907 \u5047\u8bbe\u4f60\u7684\u670d\u52a1\u5668\u6709\u591a\u4e2a\u7248\u672c php\uff0c\u4f60\u9996\u5148\u8981\u627e\u5230\u5bf9\u5e94\u7248\u672c php \u7684 phpize\u3001php-config \u7a0b\u5e8f\u3002\u901a\u5e38\u5b83\u4eec\u4e0e php \u6240\u5904\u76ee\u5f55\u76f8\u540c\u3002\n\u63a5\u4e0b\u6765\u4e0b\u8f7d\u4f60\u7684\u6269\u5c55\u6e90\u7801\u5305\uff0c\u591a\u6570\u6269\u5c55\u6e90\u7801\u90fd\u80fd\u5728 github \u6216 pecl \u4e0b\u8f7d\u5230\u3002"},{"title":"\u6811\u8393\u6d3e\u6298\u817e\u968f\u624b\u8bb0\u2014\u2014\u7ee7\u7535\u5668+\u7ea2\u5916=\u5ba2\u5385\u603b\u63a7","link":"https:\/\/wi1dcard.dev\/posts\/raspberry-pi-media-center\/","pubDate":"Sat, 24 Mar 2018 21:28:06 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/raspberry-pi-media-center\/","description":"\u6295\u5f71\u4eea\uff08\u7535\u89c6\uff09+\u673a\u9876\u76d2+\u97f3\u54cd\u8bbe\u5907\u63a7\u5236\u9879\u76ee\uff0c\u56e0\u81ea\u7528\u4e8e\u5ba2\u5385\u603b\u63a7\uff0c\u6545\u547d\u540d\u4e3aMediaCenter\u3002\n\u63d0\u793a\uff1a\u5f3a\u7535\u5371\u9669\uff0c\u63a5\u7ebf\u52a1\u5fc5\u6ce8\u610f\u5b89\u5168\u3002\n0x00 \u51c6\u5907 \u786c\u4ef6\uff1a\n\u6811\u8393\u6d3e 3B\u3002 \u5fae\u96ea\u7ee7\u7535\u5668\u6a21\u5757\uff0c\u6dd8\u5b9d\u94fe\u63a5\u3002 \u672a\u63a5\u7ebf\u63d2\u5ea7+\u7535\u7f06\u7ebf\u3002 \u7ea2\u5916\u5b66\u4e60\u6a21\u5757\uff0c\u6dd8\u5b9d\u94fe\u63a5\u3002 USB \u8f6c TTL\uff08PL2303\uff09\uff0c\u6dd8\u5b9d\u94fe\u63a5\u3002 \u7ee7\u7535\u5668\u6a21\u5757\u4e5f\u53ef\u4ee5\u6362\u6210\u5176\u5b83\u666e\u901a\u7ee7\u7535\u5668\uff0c\u4f7f\u7528\u6811\u8393\u6d3e GPIO \u53e3\u8f93\u51fa\u9ad8\u4f4e\u7535\u5e73\u5373\u53ef\uff0c\u6211\u91c7\u7528\u73b0\u6210\u6a21\u5757\uff0c\u4ee5\u6c42\u7a33\u5b9a\u53ef\u9760\u3002 \u7ea2\u5916\u6a21\u5757\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8fde\u63a5\u6811\u8393\u6d3e UART\uff0c\u6211\u91c7\u7528\u52a0\u88c5 USB \u8f6c TTL \u6a21\u5757\uff0c\u907f\u514d\u6d6a\u8d39\u552f\u4e00\u4e00\u4e2a UART\u3002"},{"title":"PHPBrew - \u591a\u7248\u672c PHP \u5171\u5b58\u5f00\u53d1\u795e\u5668","link":"https:\/\/wi1dcard.dev\/posts\/phpbrew-documention\/","pubDate":"Sat, 17 Mar 2018 09:37:18 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/phpbrew-documention\/","description":"phpbrew \u662f\u4e00\u4e2a\u6784\u5efa\u3001\u5b89\u88c5\u591a\u7248\u672c PHP \u5230\u7528\u6237\u6839\u76ee\u5f55\u7684\u5de5\u5177\u3002\nGitHub\uff1ahttps:\/\/github.com\/phpbrew\/phpbrew\nphpbrew \u80fd\u505a\u4ec0\u4e48\uff1f\n\u914d\u7f6e\u9009\u9879\u7b80\u5316\u4e3a\u300cVariants\u300d\uff0c\u65e0\u9700\u62c5\u5fc3\u8def\u5f84\u95ee\u9898\u3002 \u652f\u6301\u4f7f\u7528 PDO\uff0cmysql\uff0csqlite\uff0cdebug \u7b49\u4e0d\u540c\u300cVariants\u300d\u7f16\u8bd1 PHP\u3002 \u9488\u5bf9\u4e0d\u540c\u7248\u672c\uff0c\u5206\u522b\u7f16\u8bd1 apache php \u6a21\u5757\uff0c\u4e92\u4e0d\u51b2\u7a81\u3002 \u65e0\u9700 root \u6743\u9650\u5c06 PHP \u5b89\u88c5\u5230\u7528\u6237\u6839\u76ee\u5f55\u3002 \u96c6\u6210\u81f3 bash \/ zsh shell \u7b49\uff0c\u6613\u4e8e\u5207\u6362\u7248\u672c\u3002 \u652f\u6301\u81ea\u52a8\u7279\u6027\u68c0\u6d4b\u3002 \u6613\u4e8e\u5b89\u88c5\u3001\u542f\u7528 PHP \u6269\u5c55\u3002 \u652f\u6301\u5728\u7cfb\u7edf\u73af\u5883\u4e0b\u5b89\u88c5\u591a\u4e2a PHP\u3002 \u8def\u5f84\u68c0\u6d4b\u9488\u5bf9 HomeBrew \u4ee5\u53ca MacPorts \u8fdb\u884c\u4e86\u4f18\u5316\u3002 \u5b89\u88c5\u9700\u6c42 \u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u8bf7\u5148\u67e5\u770b\uff1aRequirement\uff08\u82f1\u6587\uff09\u3002 \u786e\u4fdd\u5df2\u5b89\u88c5\u4f9d\u8d56\u5305\u7684\u5f00\u53d1\u7248\u672c\u7528\u4e8e\u7f16\u8bd1 PHP\u3002"},{"title":"\u7ea0\u7ed3\uff01\u7eaf\u5185\u7f51 Web \u63a7\u5236\u667a\u80fd\u786c\u4ef6\u7684\u6280\u672f\u9009\u578b\u4e4b\u8def","link":"https:\/\/wi1dcard.dev\/posts\/controlling-smart-device-on-web\/","pubDate":"Sun, 11 Mar 2018 12:22:48 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/controlling-smart-device-on-web\/","description":"\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u91c7\u7528 TCP Socket \u4e0e\u667a\u80fd\u786c\u4ef6\u8fdb\u884c\u901a\u4fe1\u3002\u5916\u7f51\u73af\u5883\u4e2d\uff0c\u6709\u65e0\u6570\u79cd\u89e3\u51b3\u65b9\u6848\uff1aSwoole\uff08PHP\uff09\uff0cNode.js\uff0cSuperSocket\uff08.NET\uff09\u2026\u2026 \u800c\u5728\u653f\u4f01\u4e8b\u4e1a\u5355\u4f4d\u7684\u5185\u7f51\u73af\u5883\uff0c\u4e8b\u60c5\u6216\u8bb8\u5c31\u4e0d\u90a3\u4e48\u597d\u529e\u4e86\u3002\n0x01 \u76ee\u7684 \u63a5\u6536\u6765\u81ea\u786c\u4ef6\u7684\u6570\u636e\uff0c\u5e76\u5728 Web \u7aef\u5c55\u793a\u3002 \u901a\u8fc7 Web \u7aef\u64cd\u4f5c\uff0c\u5c06\u6307\u4ee4\u4e0b\u53d1\u81f3\u786c\u4ef6\u3002 0x02 \u9650\u5236 \u6d4f\u89c8\u5668\u9700\u8981\u652f\u6301 IE \u7b49\u8001\u7248\u672c\u6d4f\u89c8\u5668\u3002 \u670d\u52a1\u7aef\u9700\u8981\u652f\u6301 Windows Server \u865a\u62df\u673a\uff08\u6700\u4f4e\u7248\u672c 2008\uff09\u3002 \u7eaf\u5185\u7f51\u73af\u5883\uff0c\u65e0\u6cd5\u8bbf\u95ee\u5916\u7f51\u6e90\uff0c\u65e0\u6cd5\u4f7f\u7528\u5404\u7c7b\u5305\u7ba1\u7406\u5668\uff08\u5176\u5b9e\u53ef\u4ee5\u81ea\u5df1\u642d\u5efa\u5185\u7f51\u6e90\uff0c\u4f46\u8fc7\u4e8e\u590d\u6742\uff0c\u4eba\u529b\u6210\u672c\u592a\u9ad8\uff09\u3002 0x03 \u601d\u8def \u76ee\u524d\u516c\u53f8 Web \u540e\u7aef\u8bed\u8a00\u5747\u4e3a PHP\uff0c\u6240\u4ee5\u4ee5\u4e0b\u601d\u8def\u5168\u90e8\u56f4\u7ed5 PHP \u5f00\u5c55\u3002"},{"title":"\u6280\u672f\u535a\u5ba2\u586b\u5751\u4e4b\u8def","link":"https:\/\/wi1dcard.dev\/posts\/jootu-blog-change-log\/","pubDate":"Sun, 11 Mar 2018 00:00:00 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/jootu-blog-change-log\/","description":"\u81ea\u5df1\u6316\u7684\u5751\uff0c\u54ed\u7740\u4e5f\u8981\u586b\u5b8c\u3002\/\u7b11\u54ed\u8138\n2018-03-11 \u4fee\u590d\u56fe\u7247\u672c\u5730\u5316\u9020\u6210\u5927\u91cf\u65e0\u7528\u9644\u4ef6\u95ee\u9898\u3002 2018-03-09 \u4fee\u590d\u7f29\u7565\u56fe\u6bd4\u4f8b\u62c9\u4f38\u95ee\u9898\uff0c\u903b\u8f91\u91cd\u6784\u3002 2018-02-21 \u6839\u636e Lighthouse \u5efa\u8bae\u4fee\u590d\u90e8\u5206\u95ee\u9898\u3002 \u4fee\u590d\u79fb\u52a8\u7aef\u4e00\u5904 CSS \u6837\u5f0f\u95ee\u9898\u3002 2018-02-18 \u4fee\u590d\u6bcf\u65e5\u56fe\u7247\u672a\u91c7\u7528 HTTPS \u95ee\u9898\u3002 \u4f18\u5316 CDN \u7f13\u5b58\u89c4\u5219\uff0c\u52a0\u5feb\u8bbf\u95ee\u901f\u5ea6\u3002 2018-02-15 \u65b0\u589e\u300cBing \u6bcf\u65e5\u56fe\u7247\u300d\u7f13\u5b58\u529f\u80fd\uff0c\u964d\u4f4e\u8bbf\u95ee\u5ef6\u65f6\u3002 2018-02-14 \u56e0\u539f\u300c\u4e00\u8a00\u300d\u63a5\u53e3\u5931\u6548\uff0c\u6545\u8c03\u6574\u4e3a\u300cBing \u6bcf\u65e5\u56fe\u7247\u300d\u3002 \u4fee\u590d\u5bfc\u822a\u680f\u6d6e\u52a8\u6548\u679c\u5f02\u5e38\u3002 2017-11-20 \u8c03\u6574\u53f3\u4fa7\u8fb9\u680f\u6a21\u5757\u5b57\u4f53\u5927\u5c0f\u3002 2017-11-17 \u4fee\u590d\u4e00\u5904\u56e0\u52a0\u8f7d HTTP \u534f\u8bae\u8d44\u6e90\u5f15\u8d77\u7684\u8b66\u544a\u3002 2017-11-15 \u65b0\u589e\u652f\u6301\u539f\u751f Markdown \u5b58\u50a8\u3002 2017-11-11 \u542f\u7528\u65b0\u57df\u540d\u300cjootu."},{"title":"Thumb - \u81ea\u5e26\u7f13\u5b58\u914d\u7f6e\u7684\u5355\u6587\u4ef6 PHP \u7f29\u7565\u56fe\u5e93","link":"https:\/\/wi1dcard.dev\/posts\/php-thumb\/","pubDate":"Fri, 09 Mar 2018 17:22:51 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/php-thumb\/","description":"PHP GD \u6269\u5c55\u63d0\u4f9b\u4e86\u56fe\u50cf\u5904\u7406\u7684\u63a5\u53e3\uff0c\u672c\u6587\u4e3a\u5927\u5bb6\u4ecb\u7ecd\u4e00\u6b3e\u975e\u5e38\u5c0f\u5de7\u6613\u7528\u7684\u7f29\u7565\u56fe\u5e93\uff0c\u652f\u6301\u591a\u79cd\u7f29\u653e\u65b9\u5f0f\u3001\u591a\u79cd\u8f93\u51fa\u683c\u5f0f\u3001\u81ea\u5e26\u7f13\u5b58\u914d\u7f6e\u2026\u2026\n0x00 \u6e90\u7801 \u9996\u5148\u5f53\u7136\u662f\u653e\u6e90\u7801\uff1a\nwi1dcard\/Thumb\n\u539f\u4f5c\u8005\u4ee3\u7801\u56e0\u4e3a\u591a\u5e74\u6ca1\u6709\u7ef4\u62a4\uff0c\u6211\u8fdb\u884c\u4e86\u5927\u91cf\u8c03\u6574\u548c\u4f18\u5316\uff0c\u6682\u65f6\u5c31\u4e0d\u5408\u5e76\u4e86\u3002\n0x01 \u4f7f\u7528 \u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u5c06thumb.php\u590d\u5236\u5230 Web \u670d\u52a1\u5668\u76ee\u5f55\u4e0b\uff0c\u6253\u5f00\u6b64\u6587\u4ef6\u3002\u6587\u4ef6\u5934\u90e8\u63d0\u4f9b\u4e00\u4e9b\u53ef\u4f9b\u4fee\u6539\u7684\u53c2\u6570\uff0c\u5305\u62ec\u7f13\u5b58\u76ee\u5f55\u7b49\u3002\n\u6211\u4eec\u5728\u6b64\u76ee\u5f55\u4e0b\u521b\u5efacache\u6587\u4ef6\u5939\uff0c\u5e76\u786e\u4fdd PHP \u62e5\u6709rw\u6743\u9650\u3002\n\u63a5\u4e0b\u6765\uff0c\u968f\u4fbf\u627e\u4e00\u5f20\u56fe\u7247\u653e\u5728\u6b64\u76ee\u5f55\u4e0b\uff0c\u63a5\u7740\u4f7f\u7528 Postman \u8bbf\u95ee\uff1a"},{"title":"\u534a\u5e74\u5c0f\u8bb0\uff1aZ-Blog \u7684\u4f18\u52bf\u52a3\u52bf","link":"https:\/\/wi1dcard.dev\/posts\/zblog-pros-and-cons\/","pubDate":"Fri, 09 Mar 2018 01:30:54 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/zblog-pros-and-cons\/","description":"\u4e0d\u77e5\u4e0d\u89c9\u642d\u5efa\u6280\u672f\u535a\u5ba2\u5df2\u7ecf\u8fc7\u53bb\u534a\u5e74\uff0c\u534a\u5e74\u6765\u81ea\u5df1\u548c\u56e2\u961f\u5171\u540c\u8fdb\u6b65\u6210\u957f\uff0c\u4e5f\u5e26\u52a8\u7f51\u7ad9\u5185\u5bb9\u6c34\u51c6\u8d8a\u6765\u8d8a\u9ad8\uff1b\u5728\u6b64\u5c0f\u7ed3\u4e00\u4e0b\u534a\u5e74\u6765\u6df1\u5ea6\u4f7f\u7528 Z-Blog \u4f53\u4f1a\u5230\u7684\u4f18\u7f3a\u70b9\uff0c\u5e0c\u671b\u80fd\u591f\u7ed9\u4e88\u540e\u6765\u8005\u4e00\u5b9a\u53c2\u8003\u3002\n0x00 \u8bf4\u5230\u535a\u5ba2\uff0c\u4e0d\u5f97\u4e0d\u63d0\u8d77\u4e24\u4e2a\u94fe\u63a5\uff1a\n\u5173\u4e8e\u672c\u7ad9\n\u586b\u5751\u4e4b\u8def\n\u7684\u786e\uff0c\u65f6\u95f4\u8fc7\u5f97\u5f88\u5feb\u3002\n0x01 \u5982\u4e0a\uff0c\u5728\u9009\u7528 Z-Blog \u65f6\uff0c\u5954\u7740\u8fd9\u51e0\u70b9\u53bb\u7684\uff1a"},{"title":"FFmpeg \u76f4\u64ad\u63a8\u6d41\u5e38\u7528\u547d\u4ee4\u603b\u7ed3","link":"https:\/\/wi1dcard.dev\/posts\/ffmpeg-live-stream-useful-commands\/","pubDate":"Tue, 06 Mar 2018 22:03:47 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/ffmpeg-live-stream-useful-commands\/","description":"\u603b\u7ed3\u90e8\u5206 FFmpeg \u5e38\u7528\u547d\u4ee4\u884c\u4ee5\u5907\u67e5\u8be2\u4e4b\u7528\u3002\n\u76f4\u63a8\uff08H.264 + AAC\uff09 ffmpeg -re -i INPUT_FILE_NAME -c copy -f flv rtmp:\/\/localhost\/live\/STREAM_NAME\n\u8f6c\u7801\u63a8 ffmpeg -re -i INPUT_FILE_NAME -c:v libx264 -preset superfast -tune zerolatency -c:a aac -f flv rtmp:\/\/localhost\/live\/STREAM_NAME"},{"title":"Laravel + Swoole \u5b9e\u73b0 TCP-UDP Socket \u670d\u52a1\u7aef","link":"https:\/\/wi1dcard.dev\/posts\/swoole-in-laravel\/","pubDate":"Tue, 06 Mar 2018 10:32:22 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/swoole-in-laravel\/","description":"Laravel + Swoole \u5b9e\u73b0\u66f4\u5feb\u7684\u8bf7\u6c42\u5904\u7406\u901f\u5ea6\u3001\u66f4\u9ad8\u5e76\u53d1\u6709\u6269\u5c55\u5305\u53ef\u4f9b\u9009\u62e9\uff0c\u90a3\u4e48\u5982\u4f55\u5728 Laravel \u6846\u67b6\u5185\u4f18\u96c5\u5730\u5d4c\u5165 Swoole \u5b9e\u73b0 TCP\/UDP Socket \u670d\u52a1\u7aef\u5462\uff1f\n0x00 Why \u5148\u8bf4\u8bf4\u4e3a\u4ec0\u4e48\u8981\u5d4c\u5165 Laravel \u5427\u3002\n\u5c31\u4e00\u4e2a\u539f\u56e0\uff1a\nEloquent ORM"},{"title":"OpenSSL \u968f\u624b\u8bb0 - \u751f\u6210\u81ea\u7b7e\u8bc1\u4e66","link":"https:\/\/wi1dcard.dev\/posts\/openssl-generate-cert\/","pubDate":"Sun, 04 Mar 2018 20:56:49 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/openssl-generate-cert\/","description":"\u4f7f\u7528 OpenSSL \u547d\u4ee4\u884c\u751f\u6210 HTTPS \u81ea\u7b7e\u8bc1\u4e66\u3002\nopenssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout cert.key -out cert.pem \u751f\u6210\u8fc7\u7a0b\u4e2d\uff0c\u8bf7\u6ce8\u610fCommon Name\u9700\u8981\u6b63\u786e\u586b\u5165\u9700\u8981\u4e0a HTTPS \u7684\u57df\u540d\uff0c\u6709\u4e8c\u7ea7\u57df\u540d\u4e5f\u8981\u5e26\u4e0a\u3002\u5176\u5b83\u4fe1\u606f\u968f\u610f\u5373\u53ef\u3002"},{"title":"\u7531\u6d45\u5165\u6df1\uff1aLaravel Broadcast \u5b9e\u73b0 WebSocket B\/S \u5b9e\u65f6\u901a\u4fe1","link":"https:\/\/wi1dcard.dev\/posts\/laravel-broadcasting\/","pubDate":"Fri, 02 Mar 2018 20:37:32 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/laravel-broadcasting\/","description":"Laravel \u96c6\u6210\u4f17\u591a\u5f00\u5305\u5373\u7528\u7684\u529f\u80fd, \u867d\u7136\u5b83\u771f\u7684\u5f88&quot;\u80d6&quot;, \u4f46\u8fd9\u5e76\u4e0d\u5f71\u54cd\u5b83\u662f\u4e2a\u597d\u6846\u67b6. \u672c\u7bc7\u6587\u7ae0\u5c06\u91c7\u7528 Laravel 5.6 \u7248\u672c\u7531\u6d45\u5165\u6df1\u4e3a\u5927\u5bb6\u6f14\u793a: \u5982\u4f55\u4f7f\u7528\u5185\u7f6e\u7684 Broadcast\uff08\u5e7f\u64ad\uff09\u529f\u80fd\u5b9e\u73b0\u4e0e\u5ba2\u6237\u7aef\u5b9e\u65f6\u901a\u4fe1.\nTips: \u6b64\u4ed3\u5e93\u5b9e\u73b0\u672c\u6587\u4e2d\u7684 0x02 \u5e7f\u64ad \u4ee3\u7801\u3002\n0x00 \u51c6\u5907 \u5e7f\u64ad\u7cfb\u7edf - Laravel 5."},{"title":"\u6811\u8393\u6d3e\u6298\u817e\u968f\u624b\u8bb0 - \u4fee\u6539 Swap \u5927\u5c0f","link":"https:\/\/wi1dcard.dev\/posts\/raspberry-pi-change-swap-size\/","pubDate":"Thu, 01 Mar 2018 10:11:07 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/raspberry-pi-change-swap-size\/","description":"\u6811\u8393\u6d3e\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u865a\u62df\u5185\u5b58\u53ea\u6709\u533a\u533a 100 MB\uff0c\u8fd9\u5b8c\u5168\u4e0d\u80fd\u6ee1\u8db3\u6b63\u5e38\u4f7f\u7528\u9700\u6c42\uff0c\u672c\u6587\u5c06\u8bb2\u89e3\u5982\u4f55\u4fee\u6539\u4e3a\u5408\u7406\u7684\u503c\u3002\n\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u5728 Linux \u5185\uff0c\u6211\u4eec\u91c7\u7528swapoff\/mkswap\/swapon\u7b49\u547d\u4ee4\u6765\u683c\u5f0f\u5316\u5e76\u6302\u8f7d Swap\uff0c\u4f46\u5728\u6811\u8393\u6d3e\u5185\u6211\u4eec\u4e0d\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\uff0c\u6811\u8393\u6d3e\u672c\u8eab\u63d0\u4f9b\u4e86\u914d\u7f6e\u6587\u4ef6\u53ef\u4ee5\u76f4\u63a5\u4fee\u6539\u3002\nsudo nano \/etc\/dphys-swapfile\n\u627e\u5230\u5982\u4e0b\u884c\uff1a\nCONF_SWAPSIZE=100\n\u4fee\u6539\u4e3a\uff1a\nCONF_SWAPSIZE=1024\n\u7136\u540e\u91cd\u542f\uff0c\u4f7f\u7528free -m\u67e5\u770b\uff0c\u4f60\u5c31\u4f1a\u53d1\u73b0\uff1a\ntotal used free shared buff\/cache available Mem: 875 103 492 19 279 702 Swap: 1023 0 1023 Swap \u5df2\u7ecf\u53d8\u4e3a 1GB\u3002"},{"title":"\u6811\u8393\u6d3e\u6298\u817e\u968f\u624b\u8bb0 - \u4f7f\u7528 apt-get \u5b89\u88c5 Nginx+PHP","link":"https:\/\/wi1dcard.dev\/posts\/raspberry-pi-installing-nginx-php-via-apt\/","pubDate":"Wed, 28 Feb 2018 19:40:01 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/raspberry-pi-installing-nginx-php-via-apt\/","description":"\u767e\u5ea6\u6765\u7684\u6559\u7a0b\u90fd\u662f\u6e90\u7801\u7f16\u8bd1\u5b89\u88c5\uff0c\u5bf9\u4e8e\u6211\u8fd9\u79cd\u5f3a\u8feb\u75c7\u4eba\u7fa4\u6765\u8bf4\u7b80\u76f4\u662f\u4e0d\u5f97\u5df2\u624d\u4f1a\u91c7\u7528\u7684\u65b9\u6848\uff0c\u4e8e\u662f\u679c\u65ad\u81ea\u5df1\u5c1d\u8bd5\u4f7f\u7528 apt-get \u5b89\u88c5 Nginx + PHP \u8fd0\u884c\u73af\u5883\u3002\n0x00 Update apt.\nsudo apt-get update sudo apt-get upgrade 0x01 Install Nginx, PHP7."},{"title":"\u6811\u8393\u6d3e\u6298\u817e\u968f\u624b\u8bb0 - \u4f7f\u7528 apt-get \u5347\u7ea7\u5185\u7f6e Node.js","link":"https:\/\/wi1dcard.dev\/posts\/raspberry-pi-upgrade-nodejs-via-apt\/","pubDate":"Wed, 28 Feb 2018 18:41:17 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/raspberry-pi-upgrade-nodejs-via-apt\/","description":"\u7f51\u7edc\u4e0a\u6709\u4e0d\u5c11\u5b89\u88c5 Node.js \u548c\u7f16\u8bd1\u6e90\u7801\u5347\u7ea7\u7684\u6559\u7a0b\uff0c\u4f46\u5728\u6211\u624b\u4e0a\u7684\u6811\u8393\u6d3e\uff08\u7cfb\u7edf\u7248\u672c\uff1aNovember 2017\uff09\u5df2\u7ecf\u5185\u7f6e Node.js 4.x \u7248\u672c\u3002\u4e3a\u4e86\u4fdd\u6301\u7cfb\u7edf\u5e72\u51c0\u6574\u6d01\uff0c\u4e0d\u60f3\u4f7f\u7528\u6e90\u7801\u7f16\u8bd1\u6765\u66f4\u65b0\uff0c\u672c\u6587\u5c06\u8bb2\u89e3\u5982\u4f55\u64cd\u4f5c\u3002\n0x00 \u5378\u8f7d \u5378\u8f7d\u539f\u6709 node.js \u4ee5\u53ca npm\u3002\nsudo apt-get remove nodejs npm sudo apt autoremove 0x01 \u5b89\u88c5 \u5b89\u88c5\u524d\uff0c\u6211\u4eec\u9700\u8981\u66f4\u65b0 apt \u6e90\u4e3a\u5305\u542b\u6307\u5b9a node."},{"title":"\u6811\u8393\u6d3e\u6298\u817e\u968f\u624b\u8bb0 - \u4eba\u8138\u95e8\u7981","link":"https:\/\/wi1dcard.dev\/posts\/raspberry-pi-face-recognition\/","pubDate":"Tue, 13 Feb 2018 21:31:40 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/raspberry-pi-face-recognition\/","description":"\u524d\u51e0\u5929\u59b9\u5b50\u9001\u4e86\u4e2a\u751f\u65e5\u793c\u7269\u2014\u2014\u6811\u8393\u6d3e\uff0c\u60f3\u5230\u516c\u53f8\u95e8\u7981\u8fd8\u662f\u6307\u7eb9\u89e3\u9501\uff0c\u968f\u5373\u8bf4\u5e72\u5c31\u5e72\uff0c\u5f00\u59cb\u6298\u817e\u4e2a\u4eba\u8138\u95e8\u7981\u987a\u4fbf\u5165\u95e8\u5427\u3002\n0x00 \u601d\u8def \u6700\u5f00\u59cb\u6211\u7684\u60f3\u6cd5\u662f\u7531\u6811\u8393\u6d3e\u72ec\u7acb\u5b8c\u6210\u6444\u50cf\u5934\u56fe\u50cf\u6355\u6349\u3001\u4eba\u8138\u68c0\u6d4b\u3001\u6bd4\u5bf9\uff1b\u8f6c\u5ff5\u4e00\u60f3\uff0c\u540e\u671f\u8fd9\u73a9\u610f\u53ef\u4ee5\u8fce\u5408\u516c\u53f8\u9879\u76ee\uff0c\u653e\u5230\u653f\u4f01\u4e13\u7f51\u5185\u90e8\u8fd0\u4f5c\uff0c\u8fd8\u662f C\uff0fS \u6bd4\u8f83\u5408\u9002\uff08\u66f4\u65b0\u65b9\u4fbf\u3001\u7edf\u4e00\u7ba1\u7406\u3001Client \u7aef\u5e73\u53f0\u65e0\u9650\u5236\uff09\uff1b\u540e\u6765\u53d7\u5230\u516c\u53f8\u53e6\u4e00\u4e2a\u5c0f\u4f19\u4f34\u7684\u542f\u53d1\uff0c\u65e2\u7136\u91c7\u7528 C\uff0fS \u67b6\u6784\uff0c\u90a3\u670d\u52a1\u5668\u7aef\u80af\u5b9a\u662f x64 \u7684 CPU\uff0c\u53ef\u4ee5\u8c03\u7528\u8679\u8f6f\u4eba\u8138 SDK\uff0c\u907f\u514d\u4f7f\u7528\u5f00\u6e90\u7b97\u6cd5\u5934\u75bc\u4f18\u5316\u95ee\u9898\uff0c\u6240\u4ee5\u6700\u7ec8\u7684\u7ed3\u6784\u57fa\u672c\u662f\u8fd9\u6837\u7684\uff1a\n\uff08\u51d1\u5408\u770b\u5427\u2026\u2026\u6bd5\u7adf\u662f\u81ea\u5df1\u6574\u7406\u601d\u8def\u7684\u65f6\u5019\u968f\u624b\u753b\u7684\uff09\n0x01 \u51c6\u5907 \u786c\u4ef6 \u6811\u8393\u6d3e 3B \u7f57\u6280 C170 \u6444\u50cf\u5934\uff08\u8857\u8fb9\u7535\u8111\u5e97\u4e70\u7684\uff09 Linux \u670d\u52a1\u5668\u4e00\u53f0\uff08with x64 CPU\uff09 \u8f6f\u4ef6 C Node."},{"title":"URI \u76f8\u5bf9\u8def\u5f84\u5199\u6cd5","link":"https:\/\/wi1dcard.dev\/posts\/html-relative-uri\/","pubDate":"Thu, 08 Feb 2018 16:14:24 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/html-relative-uri\/","description":"\u5728\u524d\u7aef\u5f00\u53d1\u8fc7\u7a0b\u4e2d\u5e38\u89c1\u8def\u5f84\uff0c\u5728\u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u540c\u7ad9\u70b9\u5f3a\u70c8\u5efa\u8bae\u4f7f\u7528\u76f8\u5bf9\u8def\u5f84\uff0c\u8fd9\u91cc\u7b80\u5355\u603b\u7ed3\u4e00\u4e0b\u76f8\u5bf9\u8def\u5f84\u7684\u5199\u6cd5\u3002\n.\/***\uff0c\u300c.\u300d\u7528\u6765\u8868\u793a\u5f53\u524d\u76ee\u5f55\uff0c\u6b64\u5199\u6cd5\u7528\u4e8e\u5f15\u7528\u548c\u672c\u9875\u9762\u76f8\u540c\u76ee\u5f55\u4e0b\u7684\u5176\u4ed6\u6587\u4ef6\u3002\n..\/***\uff0c\u300c..\u300d\u7528\u6765\u8868\u793a\u4e0a\u7ea7\u76ee\u5f55\uff0c\u5373\u7236\u76ee\u5f55\u3002\u4ee5\u6b64\u7c7b\u63a8\uff0c\u53ef\u4ee5\u4f7f\u7528..\/..\/\u6765\u8868\u793a\u4e0a\u7ea7\u76ee\u5f55\u7684\u4e0a\u7ea7\u76ee\u5f55\u3002\n\/****\uff0c\u300c\/\u300d\u8868\u793a\u540c\u7ad9\u70b9\u8ddf\u76ee\u5f55\u3002\u65e0\u8bba\u672c\u9875\u9762\u76ee\u5f55\u662f\u5728\u54ea\uff0c\u6b64\u5199\u6cd5\u90fd\u80fd\u5f15\u7528\u5230\u6839\u76ee\u5f55\uff0c\u5e38\u89c1\u7528\u6cd5\u4f8b\u5982 favicon\u3002\n\/\/****\uff0c\u300c\/\/\u300d\u8868\u793a\u76f8\u540c\u534f\u8bae\u3002\u6b64\u5199\u6cd5\u4e0e\u7edd\u5bf9\u8def\u5f84\u7684\u533a\u522b\u5c31\u5728\u4e8e\u4e0d\u6307\u5b9a\u534f\u8bae\uff0c\u5177\u4f53\u534f\u8bae\u5c06\u8ddf\u968f\u5f53\u524d\u9875\u9762\uff0c\u5e38\u89c1\u7528\u6cd5\u4f8b\u5982\u5168\u7ad9 HTTPS\u3002\n\u6709\u8fc7 Linux \u529f\u5e95\u7684\u540c\u5b66\u5e94\u8be5\u4f1a\u53d1\u73b0\uff0c\u5982\u4e0a\u7684\u8def\u5f84\u5199\u6cd5\u90fd\u662f\u6807\u51c6\u7684 URI\uff0cLinux \u7684\u6587\u4ef6\u8def\u5f84\u4e5f\u540c\u6837\u9075\u5faa\u4e86 URI \u7684\u6807\u51c6\u3002\u5177\u4f53\u4f8b\u5b50\u5728\u8fd9\u91cc\u4e0d\u518d\u8be6\u53d9\uff0c\u968f\u4fbf\u5f00\u4e2a\u767e\u5ea6\u3001\u6dd8\u5b9d\u7684\u9875\u9762\u4e00\u6293\u4e00\u5927\u628a\uff0c\u81ea\u5df1\u5b9e\u8df5\u4e00\u4e0b\u4e5f\u662f\u4e0d\u9519\u7684\u5b66\u4e60\u65b9\u5f0f\u3002"},{"title":"Chrome \u5360\u7528 *.dev \u5bfc\u81f4 Valet \u5931\u6548\u7684\u89e3\u51b3\u65b9\u6848","link":"https:\/\/wi1dcard.dev\/posts\/chrome-to-force-https-valet-domain\/","pubDate":"Sun, 04 Feb 2018 19:53:26 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/chrome-to-force-https-valet-domain\/","description":"\u524d\u6bb5\u65f6\u95f4\u8c37\u6b4c\u628a .dev \u4e70\u4e86\uff0c\u6211\u6709\u6240\u8033\u95fb\uff0c\u4f46\u8fd9\u6bb5\u65f6\u95f4\u4e00\u76f4\u6ca1\u6709\u505a Web \u5f00\u53d1\uff0c\u4eca\u5929\u5ffd\u7136\u53d1\u73b0 ***.dev \u6253\u4e0d\u5f00\u4e86\uff0c\u6545\u6392\u67e5\u539f\u56e0\u3002\n0x01 \u6700\u5f00\u59cb\u4ee5\u4e3a\u662f dnsmasq \u6302\u4e86\uff0c\u7ecf\u8fc7\u4e00\u756a\u8c37\u6b4c\u548c ping \u68c0\u67e5\uff0c\u53d1\u73b0\u80fd\u591f\u6b63\u5e38\u89e3\u6790\u5230 127.0.0.1\u3002\nValet (Laravel): DNS address can not be found"},{"title":"Nginx+PHP \u73af\u5883 499 \u9519\u8bef\u7801\u6392\u67e5\u8fc7\u7a0b\u5c0f\u8bb0","link":"https:\/\/wi1dcard.dev\/posts\/nginx-php-http-status-499\/","pubDate":"Fri, 02 Feb 2018 18:09:48 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/nginx-php-http-status-499\/","description":"\u524d\u8a00 \u67d0\u516c\u5b89\u9879\u76ee\u8fc7\u7a0b\u4e2d\uff0c\u5728\u5185\u7f51\u670d\u52a1\u5668\u90e8\u7f72 WNMP \u73af\u5883\uff0c\u8fd0\u884c Laravel \u6846\u67b6\u4ee3\u7801\uff0c\u540e\u67e5\u770b\u65e5\u5fd7\u53d1\u73b0\u67d0\u4e00\u65f6\u523b\u7a81\u7136\u6240\u6709\u8bf7\u6c42 499\uff0c\u5e76\u6301\u7eed\u4e00\u6bb5\u65f6\u95f4\uff0c\u9042\u6392\u67e5\u539f\u56e0\u3002\n\u8fc7\u7a0b 0x01 \u7ecf\u641c\u7d22\u5f97\u77e5\uff1a \u54ea\u4e9b\u60c5\u51b5\u4e0b\u4f1a\u4f7f Nginx \u8fd4\u56de HTTP CODE 499\uff1f\n\u5373\uff1a\u300c\u5ba2\u6237\u7aef\u4e3b\u52a8\u5173\u95ed\u8fde\u63a5\u300d\n\u4f46\u67d0\u4e00\u65f6\u95f4\u6bb5\u5185\u5168\u90e8\u8bf7\u6c42\u5747\u4e3a\u8fd4\u56de 499\uff0c\u8fd9\u663e\u7136\u4e0d\u662f\u6240\u6709\u5ba2\u6237\u7aef\u4e3b\u52a8\u610f\u8bc6\u4e0a\u7684\u300c\u5173\u95ed\u300d\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u5ba2\u6237\u7aef\u7b49\u5f85\u8d85\u65f6\uff0c\u81ea\u52a8\u5173\u95ed\u8fde\u63a5\uff1b\u52a0\u4e0a 499 \u7684\u65f6\u95f4\u6bb5\u5185\u5305\u542b\u90e8\u5206 502\uff0c\u8ba9\u6211\u4e0d\u5f97\u4e0d\u6000\u7591\uff1a"},{"title":"Why PHP\uff1f\u6d45\u8c08\u9009\u62e9 PHP \u4f5c\u4e3a\u540e\u7aef\u4e3b\u529b\u5f00\u53d1\u8bed\u8a00\u7684\u539f\u56e0","link":"https:\/\/wi1dcard.dev\/posts\/why-php-in-2017\/","pubDate":"Thu, 18 Jan 2018 13:14:59 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/why-php-in-2017\/","description":"\u5728\u5404\u7c7b\u4ea4\u6d41\u7fa4\uff0c\u751a\u81f3\u591a\u6570\u8001\u4e00\u8f88\u7a0b\u5e8f\u5458\u7684\u773c\u91cc\uff0c\u8ba4\u4e3a PHP \u662f\u300c\u8f7b\u91cf\u7684\u300d\u3001\u300c\u4e0d\u5b8c\u5584\u7684\u300d\u3001\u300c\u6027\u80fd\u96be\u4ee5\u4f18\u5316\u300d\u7684\uff0c\u800c\u8fd9\u4e48\u591a\u5e74\u6765\u4e00\u76f4\u575a\u633a\u7684 Java \u5374\u6210\u4e86\u5f00\u53d1\u300cXX \u7cfb\u7edf\u300d\u7684\u540e\u7aef\u9996\u9009\u8bed\u8a00\u3002\u4e3a\u6b64\uff0c\u672c\u7bc7\u6587\u7ae0\u5c06\u5c3d\u91cf\u4ece\u975e\u6280\u672f\u89d2\u5ea6\u544a\u8bc9\u5927\u5bb6\uff1aWhy PHP\uff1f\n\u73b0\u72b6 \u5176\u5b9e\uff0c\u4ece Java \u548c PHP \u7684\u5386\u53f2\u4e0d\u96be\u770b\u51fa\u3002\u5728 Java \u5f00\u59cb\u76db\u884c\u7684\u5e74\u4ee3\uff0cPHP \u8fd8\u662f\u4e2a\u201c\u6bdb\u5934\u5c0f\u5b50\u201d\uff0c\u53ea\u662f\u4e2a\u666e\u666e\u901a\u901a\u7684\u811a\u672c\u8bed\u8a00\u7f62\u4e86\uff0c\u751a\u81f3\u8fde\u9762\u5411\u5bf9\u8c61\u7684\u57fa\u672c\u6982\u5ff5\u2014\u2014\u7c7b\uff0c\u90fd\u6ca1\u6709\u652f\u6301\u3002\n\u9274\u4e8e PHP \u5386\u4ee3\u5347\u7ea7\u4ee5\u6765\u575a\u5b88\u7684\u5411\u4e0b\u517c\u5bb9\u6027\uff0c\u81f3\u4eca\u8fd8\u53ef\u4ee5\u770b\u5230\u4e0d\u5c11\u7528\u300c\u5f53\u5e74\u7684\u300d\u539f\u751f\u51fd\u6570\u5199\u51fa\u6765\u7684\u4ea7\u54c1\u4ee3\u7801\u53ef\u4ee5\u8fd0\u884c\uff0c\u900f\u8fc7\u547d\u540d\u89c4\u5219\u6211\u4eec\u4e5f\u53ef\u4ee5\u770b\u51fa\u5f53\u5e74\u7684 PHP\uff0c\u597d\u50cf\u7684\u786e\u300c\u4e0d\u591f\u5b8c\u5584\u300d\u3002"},{"title":"macOS Finder \u53f3\u952e\u542f\u52a8\u7ec8\u7aef\uff08Terminal\uff09","link":"https:\/\/wi1dcard.dev\/posts\/macos-start-terminal-in-finder-menu\/","pubDate":"Fri, 17 Nov 2017 15:52:58 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/macos-start-terminal-in-finder-menu\/","description":"Windows \u7cfb\u7edf\u53ef\u4ee5\u4f7f\u7528\u4fee\u6539\u6ce8\u518c\u8868\u7684\u65b9\u5f0f\u5b9e\u73b0\u53f3\u952e\u5728\u5f53\u524d\u76ee\u5f55\u6253\u5f00\u547d\u4ee4\u884c\uff0c\u90a3\u4e48 macOS \u8be5\u5982\u4f55\u4f18\u96c5\u5730\u5b9e\u73b0\u8fd9\u4e00\u529f\u80fd\u5462\uff1f\n1. \u6309\u7167\u5982\u4e0b\u8def\u5f84\u627e\u5230\u8bbe\u7f6e\uff1a \u7cfb\u7edf\u4e0e\u504f\u597d\u8bbe\u7f6e -&gt; \u952e\u76d8 -&gt; \u5feb\u6377\u952e -&gt; \u670d\u52a1 -&gt; \u65b0\u5efa\u4f4d\u4e8e\u6587\u4ef6\u5939\u4f4d\u7f6e\u7684\u7ec8\u7aef\u7a97\u53e3 \/ \u6807\u7b7e\u9875\n2. \u9009\u4e2d\u590d\u9009\u6846\uff0c\u5e76\u5728\u53f3\u4fa7\u8bbe\u7f6e\u5feb\u6377\u952e\u3002 \u8fd9\u91cc\u6211\u8bbe\u7f6e\u4e3a\uff1aCommand + -"},{"title":"\u6b63\u5219\u8868\u8fbe\u5f0f\u8bfe\u7a0b\u5927\u7eb2","link":"https:\/\/wi1dcard.dev\/posts\/regex-classes\/","pubDate":"Tue, 14 Nov 2017 09:51:09 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/regex-classes\/","description":"\u6b63\u5219\u8868\u8fbe\u5f0f(regular expression)\u63cf\u8ff0\u4e86\u4e00\u79cd\u5b57\u7b26\u4e32\u5339\u914d\u7684\u6a21\u5f0f\uff08pattern\uff09\uff0c\u53ef\u4ee5\u7528\u6765\u68c0\u67e5\u4e00\u4e2a\u4e32\u662f\u5426\u542b\u6709\u67d0\u79cd\u5b50\u4e32\u3001\u5c06\u5339\u914d\u7684\u5b50\u4e32\u66ff\u6362\u6216\u8005\u4ece\u67d0\u4e2a\u4e32\u4e2d\u53d6\u51fa\u7b26\u5408\u67d0\u4e2a\u6761\u4ef6\u7684\u5b50\u4e32\u7b49\u3002\u2014\u2014 \u83dc\u9e1f\u6559\u7a0b\n[*] Part 1 \u662f\u4ec0\u4e48\uff1f \u7528\u9014\uff1f\uff08\u641c\u7d22\u3001\u66ff\u6362\u3001\u63d0\u53d6\u3001\u9a8c\u8bc1\u3001\u683c\u5f0f\u5316\u3001Rewrite \u7b49\uff09 \u600e\u4e48\u7528\uff1f \u5e38\u89c1\u6b63\u5219\u5f15\u64ce\uff08PCRE \/ DEELX &hellip;\uff09\u3002 \u5e38\u89c1\u6b63\u5219\u6d4b\u8bd5\u5de5\u5177\uff08Deelx Regex Match Tracer \/ Regex 101 \/ RegExr \/ Cyrilex \/ For PHPer: PHP Live Regex\uff09 \u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\uff08."},{"title":"Laravel 5.5 \u8fde\u63a5 MS SQL\uff08SQL Server\uff09\u6570\u636e\u5e93","link":"https:\/\/wi1dcard.dev\/posts\/laravel-work-with-sql-server\/","pubDate":"Thu, 02 Nov 2017 10:49:20 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/laravel-work-with-sql-server\/","description":"\u56e0\u9879\u76ee\u9700\u8981\uff0c\u8981\u4f7f\u7528 Laravel \u8fde\u63a5\u5fae\u8f6f\u7684 SQL Server\uff0c\u867d\u7136\u8fd9\u79cd\u7ec4\u5408\u663e\u5f97\u975e\u5e38\u5947\u8469\uff0c\u4f46\u7ecf\u8fc7\u6d4b\u8bd5\u8fd8\u662f\u53ef\u4ee5\u6210\u529f\u5b9e\u73b0\u7684\u3002\n\u51c6\u5907 \u9996\u5148\uff0c\u56e0\u4e3a Laravel \u8fde\u63a5\u6570\u636e\u5e93\u9ed8\u8ba4\u662f\u4f7f\u7528 PDO \u6269\u5c55\uff0c\u800c PDO \u8fde\u63a5 SQL Server \u9700\u8981\u4f7f\u7528 pdo_dblib \u6269\u5c55\uff0c\u6240\u4ee5\u9996\u5148\u7b2c\u4e00\u6b65\u5c31\u662f\u5b89\u88c5\u6b64\u6269\u5c55\u3002\nMAC \u7cfb\u7edf \u76f4\u63a5\u4f7f\u7528 brew \u547d\u4ee4\u5b89\u88c5\u5373\u53ef\u3002"},{"title":"2017-10-27 \u817e\u8baf\u4e91 CDN \u6545\u969c\u8bb0\u5f55","link":"https:\/\/wi1dcard.dev\/posts\/qcloud-cdn-breakdown\/","pubDate":"Fri, 27 Oct 2017 17:46:03 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/qcloud-cdn-breakdown\/","description":"\u4eca\u65e5\u6280\u672f\u535a\u5ba2 POST \u8bf7\u6c42\u51fa\u73b0\u56de\u6e90\u5f02\u5e38\u8d85\u65f6\u95ee\u9898\uff0c\u7ecf\u591a\u65b9\u9762\u6392\u67e5\uff0c\u5148\u540e\u6392\u9664 PHP-FPM \u6162\u6267\u884c\u3001MySQL \u6162\u67e5\u8be2\u3001HTTPS \u534f\u8bae\u6545\u969c\u3001\u672c\u5730\u7f51\u7edc\u6545\u969c\u7b49\u95ee\u9898\u540e\u53d1\u73b0\u76f4\u63a5\u8bbf\u95ee\u6e90\u7ad9\u6b63\u5e38\uff0c\u6545\u6000\u7591 CDN \u95ee\u9898\uff0c\u968f\u5373\u63d0\u4ea4\u5de5\u5355\u5e76\u591a\u6b21\u7535\u8054\u817e\u8baf\u4e91\u50ac\u4fc3\uff0c\u6700\u7ec8\u5f97\u5230\u7b54\u590d\u3002\n2017-10-27 15:00 \u6545\u969c\u53d1\u751f\uff0c\u9996\u5148\u6000\u7591\u7ad9\u70b9\u95ee\u9898\uff08\u8bfb\u53d6\u8bf7\u6c42\u6b63\u5e38\uff0c\u5199\u5165\u51fa\u9519\uff09\u3002\n2017-10-27 17:00 \u6392\u67e5\u53d1\u73b0\u95ee\u9898\u539f\u56e0\u662f\u817e\u8baf\u4e91 CDN \u56de\u6e90\u6545\u969c\uff0c\u6b64\u65f6\u5168\u7ad9 GET \u8bf7\u6c42\u6b63\u5e38\uff0cPOST \u8bf7\u6c42 HTTP \u534f\u8bae\u51fa\u73b0 CONNECTION RESET\uff0cHTTPS \u8fd4\u56de 564\uff08\u6839\u636e\u817e\u8baf\u5148\u524d\u89e3\u91ca\u4e3a\u56de\u6e90\u8d85\u65f6\uff09\uff0c\u90e8\u5206\u529f\u80fd\u53ef\u80fd\u51fa\u73b0\u95ee\u9898\uff0c\u63d0\u4ea4\u5de5\u5355\u7b49\u5f85\u817e\u8baf\u4fee\u590d\u3002"},{"title":"UCenter 1.6 Client Example \u5bf9 PHP7 \u517c\u5bb9\u4e0d\u826f\u7684\u6392\u67e5\u4e0e\u4fee\u590d","link":"https:\/\/wi1dcard.dev\/posts\/php7-ucenter-client-example-issue\/","pubDate":"Fri, 27 Oct 2017 00:24:36 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/php7-ucenter-client-example-issue\/","description":"\u6ca1\u9519\u53c8\u8e29\u5751\u4e86\u3002\n\u56e0\u9879\u76ee\u9700\u8981\u4e0e DZ \u8bba\u575b\u5b9e\u73b0 SSO \u767b\u5f55\u3001\u8d26\u53f7\u540c\u6b65\u7b49\u529f\u80fd\uff0c\u7ecf\u8001\u53f8\u673a\u6ce2\u6ce2\u63a8\u8350\uff0c\u76f4\u63a5\u4f7f\u7528 DZ \u5b98\u65b9\u4ea7\u54c1 UCenter \u96c6\u6210\u5373\u53ef\uff1b\u4e8e\u662f\u9648\u665f&amp;\u6f58\u662d\u5b87\u6298\u817e\u4e86\u4e00\u5929 UCenter\uff0c\u53ef\u8fd8\u662f\u9047\u5230\u4e86\u8fc7\u4e0d\u53bb\u7684\u201c\u62e6\u8def\u864e\u201d\uff0c\u4e8e\u662f\u63a5\u8fd1\u4e0b\u73ed\u4e4b\u9645\uff0c\u51b3\u5b9a\u63a5\u624b\u8fd9\u4e2a\u95ee\u9898\uff0c\u4e0d\u77e5\u4e0d\u89c9\u8e0f\u4e0a\u4e86\u8fc7\u8282\u4f9d\u65e7\u52a0\u73ed\u7684\u4e0d\u5f52\u8def\u3002\nUCenter UCenter \u662f\u539f DZ \u56e2\u961f\uff08\u73b0\u5df2\u88ab\u817e\u8baf\u6536\u8d2d\uff09\u5f00\u53d1\u7684\u4e00\u5957\u7edf\u4e00\u8ba4\u8bc1\u7cfb\u7edf\uff08\u987e\u540d\u601d\u4e49\uff1aUser Center\uff09\uff0c\u5177\u4f53\u4ecb\u7ecd\u53c2\u89c1\uff1a\u767e\u5ea6\u767e\u79d1\u3002\u8fd9\u5957\u4ea7\u54c1\u5df2\u7ecf\u975e\u5e38\u6709\u5e74\u5934\uff0c\u4ee5\u73b0\u5728\u7684\u773c\u5149\u518d\u6765\u5ba1\u89c6\u5f53\u65f6\u7684\u67b6\u6784\u786e\u5b9e\u5b58\u5728\u4e0d\u5c11\u95ee\u9898\uff0c\u5f53\u7136\uff0c\u8fd9\u5e76\u4e0d\u5f71\u54cd\u5b83\u5177\u6709\u5386\u53f2\u4ef7\u503c\u3002\n\u5148\u6765\u8bf4\u4e0b UCenter\uff08\u4e0b\u79f0UC\uff09\u7684\u5927\u81f4\u67b6\u6784\u5427\uff0c\u8fd9\u662f\u5751\u8e29\u5b8c\u4e4b\u540e\u603b\u7ed3\u51fa\u6765\u7684\uff0c\u4e3a\u4e86\u4e0d\u5f71\u54cd\u540e\u7eed\u7406\u89e3\u6240\u4ee5\u63d0\u524d\u4ecb\u7ecd\u3002"},{"title":"\u4e03\u725b\u6587\u6863\u586b\u5751\u8fc7\u7a0b\u56de\u987e","link":"https:\/\/wi1dcard.dev\/posts\/qiniu-document-issue\/","pubDate":"Thu, 19 Oct 2017 21:12:08 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/qiniu-document-issue\/","description":"\u524d\u8a00 \u6b64\u95ee\u9898\u4e8e2017\u5e749\u670829\u65e5\u53d1\u73b0\uff0c\u81f3\u4eca\uff082017\u5e7410\u670819\u65e5\uff09\u4e03\u725b\u6587\u6863\u4ecd\u672a\u8fdb\u884c\u4fee\u590d\uff0c\u6545\u53d1\u6b64\u6587\uff0c\u5e0c\u671b\u5f15\u8d77\u4e03\u725b\u5b98\u65b9\u91cd\u89c6\u3002\n\u524d\u4e9b\u65e5\u5b50\u9879\u76ee\u9700\u8981\uff0c\u7528\u4e0a\u4e03\u725b\u5bf9\u8c61\u5b58\u50a8\uff0c\u56e0\u4e4b\u524d\u90fd\u662f\u7528\u7684\u4f20\u7edf\u67b6\u6784\uff1a\n\u5ba2\u6237\u7aef -&gt; \u4e1a\u52a1\u670d\u52a1\u5668 -&gt; \u4e03\u725b\u4e91 \u8fd9\u6b21\u6253\u7b97\u6362\u4e00\u4e0b\uff0c\u5c1d\u8bd5\u66f4\u8282\u7701\u4e1a\u52a1\u670d\u52a1\u8d44\u6e90\u7684\u76f4\u4f20\u5bf9\u8c61\u5b58\u50a8\u65b9\u5f0f\uff1a\n\u5ba2\u6237\u7aef -&gt; \u4e1a\u52a1\u670d\u52a1\u5668\u62ff Token \u5ba2\u6237\u7aef -&gt; \u76f4\u4f20\u4e03\u725b\u4e91 \u4e03\u725b\u4e91 -&gt; \u56de\u8c03\u4e1a\u52a1\u670d\u52a1\u5668 HTTP API \u63a5\u53e3 \u4e1a\u52a1\u670d\u52a1\u5668\u6536\u5230\u4e0a\u4f20\u901a\u77e5, \u9a8c\u8bc1\u6765\u81ea\u4e03\u725b\u670d\u52a1\u5668 -&gt; done."},{"title":"\u4e0d\u8981\u8ba9\u8111\u888b\u91cc\u53ea\u5269 0 \u548c 1 \u2014\u2014 \u907f\u514d\u601d\u7ef4\u56fa\u5316","link":"https:\/\/wi1dcard.dev\/posts\/the-world-isnt-only-true-or-false\/","pubDate":"Sun, 15 Oct 2017 13:39:52 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/the-world-isnt-only-true-or-false\/","description":"0x00 \u524d\u8a00 \u66fe\u7ecf\u548c\u4e00\u4f4d\u4e0d\u505a\u6280\u672f\u3001\u4f46\u4e0e\u6280\u672f\u4eba\u5458\u6709\u5408\u4f5c\u7684\u670b\u53cb\u804a\u5929\uff0c\u4ed6\u4f5c\u4e3a\u4e00\u540d\u5c0f\u9886\u5bfc\uff0c\u5e38\u548c\u5916\u5305\u7a0b\u5e8f\u5458\u6253\u4ea4\u9053\u3002\u6211\u95ee\u4ed6\uff1a\u4f60\u89c9\u5f97\u505a\u7a0b\u5e8f\u5458\u6700\u5fcc\u8bb3\u4ec0\u4e48\uff1f\u4ed6\u7684\u56de\u7b54\u662f\uff1a\n\u4e0d\u8981\u8ba9\u8111\u888b\u91cc\u53ea\u5269\u4e0b\u662f\u4e0e\u975e\u3001\u96f6\u548c\u4e00\u3002\n\u4f5c\u8005\uff1a\u5b59\u4f1f\u5586\uff0f2017-10-15\n0x01 \u95ee\u9898 \u90a3\u65f6\u5019\u4e0d\u61c2\u8fd9\u53e5\u8bdd\u7684\u6211\u4e00\u5fc3\u53ea\u987e\u94bb\u7814\u6280\u672f\uff0c\u4e8e\u662f\u8ffd\u95ee\uff1a\u4f55\u51fa\u6b64\u8a00\uff1f\n\u597d\u591a\u7a0b\u5e8f\u5458\u505a\u4e45\u4e86\u6280\u672f\uff0c\u4e60\u60ef\u4e86\u9762\u5bf9\u4ee3\u7801\uff0c\u6709\u65f6\u5019\u53ef\u4ee5\u660e\u663e\u611f\u89c9\u5230\u4ed6\uff08\u4eec\uff09\u7f3a\u4e4f\u4e86\u4e00\u4e9b\u57fa\u672c\u7684\u611f\u6027\u601d\u7ef4\u3002\u6bd4\u65b9\u8bf4\uff0c\u5ba2\u6237\u63d0\u51fa\u7684\u9700\u6c42\uff0c\u7ed9\u51fa\u7684\u7b54\u590d\u603b\u662f\uff1a\u6211\u53ea\u60f3\u8981\u4f60\u660e\u786e\u7684\u903b\u8f91\uff0c\u4e0d\u8981\u8ddf\u6211\u8bb2\u592a\u591a\uff1b\u53c8\u6216\u662f\u5bf9\u4e8e\u4ea7\u54c1\u7ecf\u7406\u53e3\u4e2d\u7684\u67d0\u4e2a\u6548\u679c\uff0c\u53ea\u6709\u4e24\u6761\u8def\uff1a\u53ef\u4ee5\u5b9e\u73b0\uff0f\u5b9e\u73b0\u4e0d\u4e86\uff1b\u8fd9\u8ba9\u6211\u96be\u4ee5\u63a5\u53d7\u3002\n\u662f\u554a\uff01\u4e16\u754c\u4e0a\u7684\u4e8b\u60c5\u600e\u4e48\u4f1a\u6709\u660e\u786e\u7684\u5206\u754c\u7ebf\uff0c\u4eba\u7684\u601d\u7ef4\u662f\u66f2\u7ebf\u7684\uff0c\u6700\u6015\u601d\u7ef4\u56fa\u5316\u3001\u4e00\u6839\u7b4b\u3002\n0x02 \u5206\u6790 \u56de\u5230\u670b\u53cb\u63d0\u51fa\u7684\u4e24\u4e2a\u4f8b\u5b50\uff1a\n\u5ba2\u6237\u6784\u60f3\u7684\u9700\u6c42 \u9996\u5148\u8981\u660e\u767d\uff0c\u5ba2\u6237\u662f\u666e\u901a\u4eba\uff0c\u4e0d\u61c2\u4ee3\u7801\u3002 \u5176\u6b21\uff0c\u5ba2\u6237\u63d0\u51fa\u7684\u9700\u6c42\u6c38\u8fdc\u53ea\u662f\u8111\u888b\u4e2d\u7684\u6784\u60f3\uff0c\u5982\u4f55\u628a\u6784\u60f3\u53d8\u6210\u73b0\u5b9e\u662f\u4f60\u7684\u4e8b\u60c5\uff0c\u800c\u4e0d\u662f\u5ba2\u6237\u9700\u8981\u601d\u8003\u7684\u4e1c\u897f\u3002 \u4f5c\u4e3a\u4e59\u65b9\uff0c\u6211\u4eec\u5e94\u8be5\u4e3b\u52a8\u534f\u52a9\u4e0d\u61c2\u4ee3\u7801\u7684\u201c\u5c0f\u767d\u201d\u5ba2\u6237\u786e\u5b9a\u4ed6\u60f3\u8981\u7684\u662f\u4ec0\u4e48\uff0c\u5ba2\u6237\u601d\u7ef4\u6240\u53ca\u53ea\u80fd\u505c\u7559\u5728\u4e0e\u6280\u672f\u65e0\u5173\u7684\u5c42\u6b21\u4e0a\uff0c\u90a3\u4e48\u63a5\u4e0b\u6765\u5c31\u9700\u8981\u4f60\u5e26\u9886\u5ba2\u6237\u53bb\u5206\u6790\uff0c\u7406\u6e05\u4ed6\u7684\u903b\u8f91\uff0c\u540c\u65f6\u4e5f\u8981\u601d\u8003\u5728\u6280\u672f\u5c42\u9762\u4e0a\u5982\u4f55\u5b9e\u73b0\u3002\u5ba2\u6237\u4e0d\u4e86\u89e3\u5728\u8f6f\u4ef6\u884c\u4e1a\u6b64\u7c7b\u201c\u6784\u60f3\u201d\u662f\u5982\u4f55\u5b9e\u73b0\uff0c\u800c\u6211\u4eec\u4e0d\u61c2\u5ba2\u6237\u884c\u4e1a\u5185\u7684\u89c4\u5219\uff0c\u5728\u4f60\u4e3b\u52a8\u5e26\u9886\u5ba2\u6237\u5206\u6790\u9700\u6c42\u3001\u5bf9\u9700\u6c42\u201c\u5177\u4f53\u5316\u201d\u7684\u65f6\u5019\uff0c\u5ba2\u6237\u53ef\u4ee5\u8ddf\u5f97\u4e0a\u4f60\u7684\u601d\u7ef4\uff0c\u53ca\u65f6\u4fee\u6b63\u4f60\u6240\u8bf4\u7684\u662f\u5426\u6709\u6240\u504f\u5dee\uff0c\u751a\u81f3\u6709\u53ef\u80fd\u6253\u5f00\u4e86\u601d\u8def\uff0c\u4e3b\u52a8\u8bf4\u51fa\u67d0\u4e00\u6a21\u5757\u7684\u7ec6\u8282\uff1b\u800c\u8fd9\u65f6\u5019\uff0c\u75af\u72c2\u7684\u8bb0\u7b14\u8bb0\u5c31\u597d\u4e86\u3002 \u5173\u4e8e\u4e0a\u9762\u8fd9\u6761\u7406\u8bba\uff0c\u6709\u4e2a\u5f88\u5178\u578b\u53c8\u7c7b\u4f3c\u7684\u4f8b\u5b50\uff1a"},{"title":"macOS \u6e05\u9664 DNS \u7f13\u5b58\u547d\u4ee4","link":"https:\/\/wi1dcard.dev\/posts\/macos-flush-dns-cache\/","pubDate":"Tue, 10 Oct 2017 15:45:43 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/macos-flush-dns-cache\/","description":"sudo killall -HUP mDNSResponder; sudo killall mDNSResponderHelper; sudo dscacheutil -flushcache"},{"title":"Laravel5 \u548c Vue.js \u4f18\u96c5\u7684 Nginx \u91cd\u5199\u89c4\u5219","link":"https:\/\/wi1dcard.dev\/posts\/laravel-vue-rewrite-rules\/","pubDate":"Tue, 26 Sep 2017 14:42:31 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/laravel-vue-rewrite-rules\/","description":"\u672c\u6587\u603b\u7ed3\u5e38\u7528\u91cd\u5199\u89c4\u5219\u3002\nLaravel 5 location\u00a0\/\u00a0{ try_files\u00a0$uri\u00a0$uri\/\u00a0\/index.php?$query_string; } Vue.js https:\/\/router.vuejs.org\/zh-cn\/essentials\/history-mode.html\nlocation\u00a0\/\u00a0{ try_files\u00a0$uri\u00a0$uri\/\u00a0\/index."},{"title":"macOS \u6253\u5f00\u81ea\u5e26 NTFS \u5199\u6587\u4ef6\u529f\u80fd","link":"https:\/\/wi1dcard.dev\/posts\/macos-write-ntfs-driver\/","pubDate":"Fri, 22 Sep 2017 16:27:27 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/macos-write-ntfs-driver\/","description":"\u6253\u5f00 terminal\n\u6267\u884c\u5982\u4e0b\u547d\u4ee4\uff1a\ndiskutil\u00a0list \u53ef\u67e5\u770b\u5168\u90e8\u5206\u533a\u7684\u540d\u5b57\uff0cMAC \u7cfb\u7edf\u9ed8\u8ba4\u6302\u8f7d\u5168\u90e8\u5206\u533a\u5230 \/Volumes \u76ee\u5f55\uff0c\n\u6267\u884c\u5982\u4e0b\u547d\u4ee4\uff1a sudo\u00a0vim\u00a0\/etc\/fstab \u7f16\u8f91 fstab \u6587\u4ef6\uff0c\u6dfb\u52a0\u5982\u4e0b\u4e00\u884c\u5e76\u4fdd\u5b58\uff1a"},{"title":"\u670d\u52a1\u5668\u6e90\u7801\u540c\u6b65\uff1arsync \u914d\u7f6e\u8fc7\u7a0b\u5c0f\u8bb0","link":"https:\/\/wi1dcard.dev\/posts\/depoly-code-to-multiple-servers-with-rsync\/","pubDate":"Wed, 20 Sep 2017 07:07:50 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/depoly-code-to-multiple-servers-with-rsync\/","description":"9.20 updated:\n\u4eca\u5929\u68c0\u67e5\u591a\u5bb6\u516c\u53f8\u7684\u7ba1\u7406\u7aef\u9875\u9762\u65f6\u53d1\u73b0\uff0c\u5c45\u7136\u5176\u4ed6\u516c\u53f8\u53ef\u4ee5\u770b\u5230\u6211\u4eec\u7684\u6d4b\u8bd5\u6570\u636e\uff0c\u9042\u68c0\u67e5\u6570\u636e\u5e93\uff0c\u5e76\u4e0d\u5b58\u5728\u6d4b\u8bd5\u6570\u636e\uff0c\u53c8\u53bb\u7ffb\u914d\u7f6e env \u6587\u4ef6\uff0c\u6570\u636e\u5e93\u914d\u7f6e\u6b63\u5e38\uff0c\u53c8\u6392\u9664 rsync \u540c\u6b65\u4e86 config \u7f13\u5b58\u7684\u53ef\u80fd\u4e4b\u540e\uff0c\u6700\u7ec8\u53d1\u73b0\u662f nginx \u914d\u7f6e\u5f15\u8d77\u7684\u53cd\u5411\u4ee3\u7406\u5168\u90e8\u8fdb\u4e86 demo \u670d\u52a1\u5668\u3002\u3002\u3002\n\u4e0d\u8fc7\u8fd9\u4e5f\u5f15\u8d77\u4e86\u6211\u7684\u91cd\u89c6\uff1a\u7531\u4e8e laravel cache \u9a71\u52a8\u4e3a file\uff0c\u800c rsync \u540c\u6b65\u5217\u8868\u5e76\u6ca1\u6709\u6392\u9664bootstrap\/cache\/config.php\uff0c\u8fd9\u6837\u4f1a\u5bfc\u81f4\u6267\u884cphp artisan config:cache\u7f13\u5b58\u547d\u4ee4\u540e\uff0c\u5168\u90e8\u516c\u53f8\u90fd\u8fde\u63a5\u540c\u4e00\u4e2a\u6570\u636e\u5e93\uff01"},{"title":"How to Read UIDs of IC Cards in C#","link":"https:\/\/wi1dcard.dev\/posts\/read-uids-of-ic-cards\/","pubDate":"Thu, 07 Sep 2017 16:46:16 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/read-uids-of-ic-cards\/","description":"\u4eca\u5929\u6c88\u540c\u5b66\u6765\u95ee c# \u8bfb ic \u5361\u7684\u95ee\u9898\uff0c\u6211\u7b2c\u4e00\u53cd\u5e94\u662f\u60f3\u5230\u4e86 windows \u63d0\u4f9b\u7684\u667a\u80fd\u5361\u9a71\u52a8 API\uff0c\u4e4b\u524d\u7528 c++\u5b9e\u73b0\u8fc7\u4e00\u5957\u3002\nreference\uff1ahttps:\/\/docs.microsoft.com\/zh-cn\/previous-versions\/windows\/desktop\/secsmart\/smart-card-api-portal\n\u53ef\u53ea\u6709\u82f1\u8bed\uff0c\u5bf9\u4e8e\u6ca1\u6709\u9605\u8bfb\u8fc7\u539f\u7248 MSDN \u7684\u5b9e\u4e60\u751f\u6765\u8bf4\u6709\u4e00\u5b9a\u96be\u5ea6\uff0c\u5373\u4fbf\u6709\u590d\u6742\u7684 c++\u6e90\u7801\u53c2\u7167\uff0c\u4f30\u8ba1\u4e5f\u8981\u7814\u7a76\u4e2a\u51e0\u5929\u3002\nso\uff0c\u7528 c# \u5199 windows\uff0c\u8981\u7684\u5c31\u662f\u5b83\u7684\u8f6e\u5b50\u591a\u3002\u9047\u5230\u8fd9\u79cd\u60c5\u51b5\uff0c\u679c\u65ad\u7f51\u4e0a\u641c\u4e00\u4e0b\u5148\uff0c\u4f46\u7ed3\u679c\u4e0d\u5c3d\u4eba\u610f\uff0c\u5927\u591a\u90fd\u662f\u4e13\u95e8\u7528\u4e8e\u67d0\u4e2a\u578b\u53f7\u8bfb\u5361\u5668\u7684\u5382\u5bb6\u63d0\u4f9b\u7684 SDK\u3002\n\u4e8e\u662f\u679c\u65ad\u53bb\u5fae\u8f6f\u5b98\u65b9\u7684\u5305\u7ba1\u7406\u5668 nuget \u91cc\u627e\uff0c\uff08keyword\uff1asmart card\uff09\u2026\u2026"},{"title":"MySQL \u6279\u91cf\u66f4\u65b0\u6240\u6709\u5b57\u6bb5 Collation","link":"https:\/\/wi1dcard.dev\/posts\/mysql-update-all-collations\/","pubDate":"Wed, 06 Sep 2017 19:31:39 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/mysql-update-all-collations\/","description":"\u4eca\u5929\u9879\u76ee\u90e8\u7f72\u9047\u5230\u4e2a\u5751\uff0c\u4e4b\u524d\u5efa\u6570\u636e\u5e93\u7684\u65f6\u5019\uff0c\u628a\u6240\u6709\u7684 collation \u90fd\u5199\u6210\u4e86 utf8\uff0c\u5728\u6d4b\u8bd5\u670d\u52a1\u5668\u4e0a\u4e5f\u6ca1\u600e\u4e48\u6ce8\u610f\uff0c\u90e8\u7f72\u6b63\u5f0f\u670d\u52a1\u5668\u679c\u65ad\u7528 mb4\uff0c\u6545\u9700\u8981\u4fee\u6539\u4e0a\u767e\u4e2a\u5b57\u6bb5\u7684 collation\u3002\n\u6839\u636e\u4e00\u6b21\u53ef\u4ee5\uff0c\u4e24\u6b21\u80fd\u5fcd\uff0c\u4e09\u6b21\u7edd\u5bf9\u4e0d\u884c\u7684\u61d2\u4eba\u539f\u5219 orz\uff0c\u51b3\u5b9a\u5199\u4e2a\u811a\u672c\u5b9e\u73b0\u4e00\u952e\u4fee\u6539\uff0c\u5e9f\u8bdd\u4e0d\u591a\u8bf4\u5148\u53bb\u7f51\u4e0a\u627e\u4e86\u4e2a\u8f6e\u5b50\u3002\nreferer:\u00a0https:\/\/my.oschina.net\/xuqiang\/blog\/507629\n\u7ecf\u8fc7\u4e00\u756a\u4fee\u6539\u548c\u6478\u7d22\uff0c\u603b\u7ed3\u51fa\u5982\u4e0b\u5b58\u50a8\u8fc7\u7a0b\uff1a\nbegin declare\u00a0f_name\u00a0varchar(100); declare\u00a0b\u00a0int\u00a0default\u00a00;\u00a0\/*\u662f\u5426\u8fbe\u5230\u8bb0\u5f55\u7684\u672b\u5c3e\u63a7\u5236\u53d8\u91cf*\/ --\u00a0\u6ce8\u610f\u4fee\u6539\u4e0b\u9762\u7684\u6570\u636e\u5e93\u540d\u79f0\u00a0wsm_aliyun \u00a0declare\u00a0table_name\u00a0cursor\u00a0for\u00a0SELECT\u00a0TABLE_NAME\u00a0FROM\u00a0information_schema."},{"title":"\u5b9e\u9a8c\u5ba4\u6280\u672f\u65b9\u6848\u89e3\u6790","link":"https:\/\/wi1dcard.dev\/posts\/lims-tech-stack\/","pubDate":"Mon, 28 Aug 2017 19:07:53 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/lims-tech-stack\/","description":"\u6b64\u5904\u4e0d\u8003\u8651\u786c\u4ef6\uff0c\u6211\u4eec\u505a PaaS\u3002\n\u9996\u5148\u4e91\u670d\u52a1\uff0c\u8d1f\u8f7d\u5747\u8861\u00a0+\u00a02 \u5230 3 \u53f0\u670d\u52a1\u5668\uff0c\u5176\u4e2d\u6587\u4ef6\u4e0a\u4f20\u4e0b\u8f7d\u91c7\u7528\u5bf9\u8c61\u5b58\u50a8\uff0c\u8fd9\u6837\u53ef\u4ee5\u5927\u91cf\u8282\u7701\u670d\u52a1\u5668\u5e26\u5bbd\uff0c\u5916\u9762\u518d\u5957\u4e00\u5c42 CDN\uff0c\u53ef\u4ee5\u4fdd\u8bc1\u79d2\u5f00\uff1b\u6570\u636e\u5e93\u91c7\u7528\u72ec\u7acb\u7684\u6570\u636e\u5e93\u670d\u52a1\u5668\uff0c\u4e91\u670d\u52a1\u63d0\u4f9b\u5546\u5927\u591a\u5728\u5e95\u5c42\u5b9e\u73b0\u4e86\u70ed\u5907\uff0c\u51fa\u95ee\u9898\u7684\u6982\u7387\u5f88\u5c0f\uff1b\u53e6\u5916\uff0c\u5728\u4e0a\u9762\u7684\u57fa\u7840\u4e0a\u518d\u52a0\u4e0a\u524d\u540e\u7aef\u5206\u79bb\uff0c\u524d\u7aef\u4ee3\u7801\u4e5f\u5168\u90e8\u8dd1\u5728\u5bf9\u8c61\u5b58\u50a8\u91cc\uff0cWeb \u670d\u52a1\u5668\u53ef\u4ee5\u8fbe\u5230\u53ea\u201c\u8ba1\u7b97\u201d\u7684\u76ee\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u53ea\u63d0\u4f9b\u63a5\u53e3\u670d\u52a1\u3002 \u53e6\u5916\u4e3a\u4e86\u9632\u6b62\u653b\u51fb\uff0c\u53ef\u4ee5\u5957\u4e09\u5c42\u9632\u5fa1\uff0c\u4e00\u5c42\u5728 DNS \u89e3\u6790\uff0c\u6302\u6389\u4e86\u7acb\u9a6c\u89e3\u6790\u5230\u7b2c\u4e8c\u53f0\uff0c\u7b2c\u4e8c\u5c42\u5728\u4e91\u670d\u52a1\u63d0\u4f9b\u5546\uff0c\u8d2d\u4e70\u5355\u72ec\u7684\u9632\u5fa1\u670d\u52a1\uff0c\u7b2c\u4e09\u5c42\u5728 WEB\uff0c\u76d1\u6d4b\u5230\u653b\u51fb\u7684\u65f6\u5019\u81ea\u52a8\u5bf9\u67d0\u4e00\u4e2a IP \u8fd4\u56de 502\u3002\n\u7136\u540e\u518d\u6765\u8bf4\u6570\u636e\u5e93\u3001\u8bed\u8a00\u548c\u6846\u67b6\u3002\n\u6570\u636e\u5e93\u91c7\u53d6\u4f18\u52bf\u4e92\u8865\uff0cMongoDB \u9002\u5408\u65e5\u5fd7\uff0c\u4f46\u662f\u4e0d\u9002\u5408\u5173\u952e\u6570\u636e\u7684\u5b58\u50a8\uff0cRedis \u9002\u5408\u505a\u67d0\u4e9b\u6570\u636e\u7684\u7f13\u5b58\uff0c\u4f8b\u5982\u6d88\u606f\u961f\u5217\u3001\u70ed\u5ea6 Top10 \u7b49\uff0c\u800c MySQL\/MariaDB \u5219\u662f\u4f5c\u4e3a\u6700\u7ec8\u7684\u6570\u636e\u5b58\u50a8\uff0c\u4e3a\u5565\u6211\u524d\u9762\u76f4\u63a5\u628a MyISAM \u780d\u6389\u4e86\uff0c\u5c31\u662f\u56e0\u4e3a MySQL \u5728\u8fd9\u4e2a\u67b6\u6784\u91cc\u672c\u8eab\u5c31\u662f\u505a\u4e3a\u201c\u6700\u7ec8 boss\u201d\u5b58\u4e00\u4e9b\u5173\u952e\u6570\u636e\u7684\uff0c\u8981\u5c3d\u6700\u5927\u53ef\u80fd\u4fdd\u8bc1\u4e0d\u51fa\u95ee\u9898\uff0c\u800c\u8981\u8ffd\u6c42\u6548\u7387\u3001\u6570\u636e\u4e00\u81f4\u6027\u76f8\u5bf9\u6765\u8bf4\u65e0\u5173\u7d27\u8981\u7684\u65e5\u5fd7\u8fd9\u4e9b\u5c31\u4ea4\u7ed9 MongoDB \u53bb\u505a\u5427\u3002 \u524d\u9762\u8bf4\u7684\u6570\u636e\u5e93\u91c7\u7528\u5355\u72ec\u7684\u670d\u52a1\u5668\uff0c\u4e5f\u662f\u4e3a\u4e86\u8fd9\u4e2a\u539f\u56e0\uff0c\u4e0d\u540c\u7684\u9700\u6c42\u91c7\u7528\u4e0d\u540c\u7684\u6570\u636e\u5e93\uff0c\u8dd1\u5728\u4e0d\u540c\u670d\u52a1\u5668\u3002"},{"title":"\u6700\u521d\u7684\u8d77\u70b9","link":"https:\/\/wi1dcard.dev\/posts\/started-here\/","pubDate":"Thu, 24 Aug 2017 00:04:25 +0000","guid":"https:\/\/wi1dcard.dev\/posts\/started-here\/","description":"\u8bde\u751f\u2014\u20142017\/08\/24 \u56e2\u961f\u521d\u671f\u9047\u5230\u4e86\u4e00\u4e9b\u95ee\u9898\u3002\n\u6280\u672f\u80fd\u529b\u826f\u83a0\u4e0d\u9f50\uff1b\n\u77e5\u8bc6\u9762\u592a\u7a84\uff0c\u53ea\u4e86\u89e3\u81ea\u5df1\u6240\u5b66\u7684\u9886\u57df\uff1b\n\u540c\u4e00\u95ee\u9898\u9700\u8981\u91cd\u590d\u8bb2\u89e3\u3001\u57f9\u8bad\uff1b\n\u95ee\u9898\u5f97\u4e0d\u5230\u603b\u7ed3\uff0c\u65e0\u6cd5\u52a0\u6df1\u5370\u8c61\uff1b\n\u2026\u2026\n\u4e8e\u662f\uff0c\u672c\u7ad9\u524d\u8eab\u8bde\u751f\u2014\u2014\u6912\u56fe\u6280\u672f\u535a\u5ba2\u3002"}]}}