{"@attributes":{"version":"2.0"},"channel":{"title":"Trim21's Blog","link":"https:\/\/blog.trim21.me\/","description":"Recent content on Trim21's Blog","generator":"Hugo","language":"zh-cn","lastBuildDate":"Tue, 11 Mar 2025 02:31:16 +0800","item":[{"title":"caddy\u5728\u5185\u7f51\u4e2d\u65e0\u6cd5\u66f4\u65b0\u8bc1\u4e66","link":"https:\/\/blog.trim21.me\/2019\/12\/caddy-not-working-in-nat\/","pubDate":"Mon, 23 Dec 2019 15:31:10 +0800","guid":"https:\/\/blog.trim21.me\/2019\/12\/caddy-not-working-in-nat\/","description":"<p>NAS \u4e0a\u9762\u8fd0\u884c\u4e86\u4e00\u4e2a caddy \u670d\u52a1\u5668\uff0c\u8fd8\u8bbe\u7f6e\u4e86 https\u3002\u6700\u8fd1\u7a81\u7136\u9047\u5230\u4e86\u8bc1\u4e66\u8fc7\u671f\u7684\u95ee\u9898.<\/p>\n<p>\u68c0\u67e5 log \u53d1\u73b0\u662f\u8bc1\u4e66\u7533\u8bf7\u5931\u8d25 <code>SERVFAIL for _acme-challenge.my_domain.<\/code><\/p>\n<p>\u5927\u6982\u641c\u7d22\u4e86\u4e00\u4e0b, \u662f\u56e0\u4e3a\u8def\u7531\u5668\u7684 dnsmasq \u8fc7\u6ee4\u6389\u4e86\u5b8c\u6210\u9a8c\u8bc1\u9700\u8981\u7684 dns \u67e5\u8be2<\/p>\n<p>\u53ea\u8981\u5728 dnsmasq \u8bbe\u7f6e\u4e2d\u628a filterwin2k \u53c2\u6570\u7981\u7528\u5373\u53ef, \u4e0d\u540c\u7248\u672c\u7684 dnsmasq \u7981\u7528\u65b9\u6cd5\u6709\u4e9b\u4e0d\u540c<\/p>"},{"title":"\u5229\u7528\u624b\u5934\u5df2\u6709\u8d44\u6e90\u5c3d\u53ef\u80fd\u9ad8\u914d\u7684\u642d\u4e00\u53f0nas","link":"https:\/\/blog.trim21.me\/2019\/12\/build-a-nas\/","pubDate":"Mon, 23 Dec 2019 00:00:00 +0800","guid":"https:\/\/blog.trim21.me\/2019\/12\/build-a-nas\/","description":"<p>\u73b0\u6210\u5df2\u6709\u7684 nas\uff1a\u4e00\u53f0\u8717\u725b\u661f\u9645 B \u53e3\u5355\u767e\u5146\uff0c\u73b0\u5728\u653e\u4e86\u56db\u5757 500G \u7684\u786c\u76d8\u79df\u4e86\u4e00\u4e2a raid6\u3002\u9664\u53bb\u786c\u76d8\u6210\u672c 268\uff08\u673a\u5668\uff09+200\uff08\u7535\u6e90\uff09, \u786c\u76d8\u662f\u65e7\u786c\u76d8. \u7528\u4e86\u4e09\u56db\u4e2a\u6708\u4e4b\u540e\u5df2\u7ecf\u6709\u4e09\u56db\u5757\u786c\u76d8\u62a5\u8b66\u4e86.<\/p>\n<p>\u603b\u662f\u89c9\u5f97\u6709\u4e9b\u4e0d\u723d\uff0c\u4e3b\u8981\u662f\u53c8\u4e0d\u60f3\u628a\u73b0\u6709 nas \u91cc\u9762\u7684\u6570\u636e\u90fd\u62f7\u51fa\u6765\u6362\u786c\u76d8\uff0c\u53c8\u89c9\u5f97\u73b0\u5728\u7684\u767e\u5146\u548c 1T \u5bb9\u91cf\u4e0d\u592a\u80fd\u8ba9\u4eba\u6ee1\u610f\uff0c\u6240\u4ee5\u60f3\u641e\u4e00\u4e2a\u5343\u5146\u7684\u9ad8\u6027\u80fd nas\u3002<\/p>\n<p>\u770b\u4e86\u770b\u5e02\u9762\u4e0a nas \u7684\u4ef7\u683c\uff0c\u611f\u89c9\u786c\u4ef6\u914d\u7f6e\u53c8\u4e0d\u592a\u5bf9\u7684\u8d77\u4ef7\u683c\uff0c\u4e8e\u662f\u51b3\u5b9a\u81ea\u5df1\u641e\u4e00\u4e2a\u3002\u6b63\u597d\u81ea\u5df1\u73b0\u5728\u8fd8\u95f2\u7f6e\u7740\u4e00\u53f0\u6838\u663e\u7684 itx \u5c0f\u673a\u5668<\/p>\n<h2 id=\"\u624b\u5934\u786c\u4ef6\">\u624b\u5934\u786c\u4ef6<\/h2>\n<h3 id=\"cpu-\u548c\u4e3b\u677f\">CPU \u548c\u4e3b\u677f<\/h3>\n<ol>\n<li>\u56db\u4ee3 i3 \u4e3b\u677f 4 \u4e2a sata3, \u4e00\u4e2a m2 \u63a5\u53e3, \u4e00\u4e2a pci-e 16x \u63a5\u53e3, \u4e24\u4e2a ddr4 \u5185\u5b58\u63a5\u53e3<\/li>\n<li>J1900, \u4e3b\u677f\u4e24\u4e2a sata2 \u63a5\u53e3, \u4e24\u4e2a ddr3 \u5185\u5b58\u63a5\u53e3.<\/li>\n<\/ol>\n<h3 id=\"\u5185\u5b58\">\u5185\u5b58<\/h3>\n<p>\u4e24\u6761 4g \u53f0\u5f0f\u673a ddr4 \u5185\u5b58<\/p>\n<p>\u4e00\u6761 ddr3 \u5185\u5b58\u63a5\u53e3<\/p>\n<h3 id=\"\u786c\u76d8\">\u786c\u76d8<\/h3>\n<ol>\n<li>\u95ea\u8fea Sata3 256G SSD<\/li>\n<li>\u4e24\u6761\u6742\u724c M2 128G SSD<\/li>\n<li>\u4e24\u5757 2.5 \u5bf8\u673a\u68b0\u786c\u76d8 500G 1T<\/li>\n<li>\u4e94\u5757 3.5 \u5bf8\u673a\u68b0\u786c\u76d8 \u5747 500G, \u76ee\u524d\u770b\u6765\u662f\u4e0d\u591f\u7684, \u8fd8\u4f1a\u518d\u4e70.<\/li>\n<\/ol>\n<p>\u8d2d\u5165 256g nvme ssd \u4e00\u6761, \u724c\u5b50\u5c31\u4e0d\u8bf4\u4e86<\/p>"},{"title":"\u7528pyenv\u5b89\u88c5python","link":"https:\/\/blog.trim21.me\/2019\/12\/pyenv-build-python\/","pubDate":"Mon, 23 Dec 2019 00:00:00 +0800","guid":"https:\/\/blog.trim21.me\/2019\/12\/pyenv-build-python\/","description":"<p><a href=\"https:\/\/github.com\/pyenv\/pyenv\">pyenv<\/a>\u662f\u7528\u6765\u5b89\u88c5\u591a\u4e2a\u7248\u672c\u7684 python<\/p>\n<p>\u5b98\u65b9\u63d0\u4f9b\u4e86\u5b89\u88c5\u811a\u672c<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-console\" data-lang=\"console\"><span style=\"display:flex;\"><span>curl https:\/\/cdn.jsdelivr.net\/gh\/pyenv\/pyenv-installer\/bin\/pyenv-installer | bash\n<\/span><\/span><\/code><\/pre><\/div><p>(\u7528 jsdeliver \u662f\u56e0\u4e3a raw.githubusercontent.com \u73b0\u5728\u8bbf\u95ee\u4e0d\u901a\u4e86)<\/p>\n<p>\u542f\u7528 cache\uff0c\u7528\u4e8e\u7f13\u5b58\u4e0b\u8f7d\u7684 python \u6e90\u4ee3\u7801:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-console\" data-lang=\"console\"><span style=\"display:flex;\"><span>mkdir -p .pyenv\/cache\n<\/span><\/span><\/code><\/pre><\/div><p>\u4f7f\u7528 ccache, \u53ef\u4ee5\u7f13\u5b58\u7f16\u8bd1\u4e2d\u4ea7\u751f\u7684\u4e2d\u95f4\u6587\u4ef6\uff0c\u4e0d\u662f\u5fc5\u9700\uff0c\u4f46\u662f\u5728\u591a\u6b21\u6784\u5efa\u7edf\u4e00\u7248\u672c\u7684 python \u65f6\u53ef\u4ee5\u6709\u6548\u52a0\u901f\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-console\" data-lang=\"console\"><span style=\"display:flex;\"><span>git clone https:\/\/github.com\/yyuu\/pyenv-ccache.git $(pyenv root)\/plugins\/pyenv-ccache\n<\/span><\/span><span style=\"display:flex;\"><span>sudo apt install ccache\n<\/span><\/span><\/code><\/pre><\/div><p>\u5b89\u88c5\u8fc7\u7a0b\u4e2d\u4f1a\u51fa\u73b0\u7684\u9519\u8bef<\/p>\n<p>zipimport.ZipImportError: can&rsquo;t decompress data; zlib not available<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-console\" data-lang=\"console\"><span style=\"display:flex;\"><span>sudo apt install zlib1g-dev\n<\/span><\/span><\/code><\/pre><\/div><p>WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-console\" data-lang=\"console\"><span style=\"display:flex;\"><span>sudo apt install libbz2-dev\n<\/span><\/span><\/code><\/pre><\/div><p>WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?<\/p>"},{"title":"\u8f93\u5165\u6cd5\u5207\u6362\u5230Rime","link":"https:\/\/blog.trim21.me\/2019\/10\/migrate-to-rime\/","pubDate":"Wed, 23 Oct 2019 00:00:00 +0800","guid":"https:\/\/blog.trim21.me\/2019\/10\/migrate-to-rime\/","description":"<p>QQ \u62fc\u97f3\u7ec8\u4e8e\u4e5f\u5f00\u59cb\u5f39\u5e7f\u544a\u4e86\uff0c\u6240\u4ee5\u4e00\u6012\u4e4b\u4e0b\u51c6\u5907\u5220\u4e86\u3002<\/p>\n<p>\u53c8\u4e0d\u80fd\u6ca1\u8f93\u5165\u6cd5\u7528\uff0c\u5c31\u7528\u4e0a\u4e86\u5c0f\u72fc\u6beb\u3002\u8bb0\u5f55\u4e00\u4e0b\u8fd9\u4e2d\u95f4\u9047\u5230\u7684\u82e5\u5e72\u5751\u3002<\/p>\n<p><img src=\"https:\/\/blog.trim21.me\/static\/rime-preview.jpg\" alt=\"\u6700\u7ec8\u8bbe\u7f6e\u7684\u6548\u679c\"><\/p>\n<h2 id=\"\u5b89\u88c5\">\u5b89\u88c5<\/h2>\n<p>\u4e00\u8def\u4e0b\u4e00\u6b65\uff0c\u552f\u4e00\u7684\u5751\u5728\u4e8e<code>\u81ea\u5b9a\u4e49\u7528\u6237\u6587\u4ef6\u5939<\/code>\u8fd9\u4e2a\u529f\u80fd\u3002<strong>\u4e0d\u8981\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u7528\u6237\u6587\u4ef6\u5939<\/strong>\u3002<\/p>\n<p>\u5982\u679c\u662f\u4e3a\u4e86 rime \u7684\u591a\u5e73\u53f0\u540c\u6b65\uff0crime \u6709\u53e6\u4e00\u4e2a\u540c\u6b65\u529f\u80fd\u53ef\u4ee5\u8fdb\u884c\u540c\u6b65\uff0c\u800c\u4e0d\u9700\u8981\u540c\u6b65\u6574\u4e2a\u7528\u6237\u6587\u4ef6\u5939\u3002<\/p>\n<p>rime \u6709\u4e00\u4e2a\u5305\u7ba1\u7406\u5668\uff0c\u4f46\u662f\u8fd9\u4e2a\u5305\u7ba1\u7406\u5668\u5728 windows \u4e0a\u5e76\u4e0d\u80fd\u6b63\u786e\u7684\u8bc6\u522b\u7528\u6237\u6587\u4ef6\u5939\uff1a\u65e0\u8bba\u7528\u6237\u600e\u4e48\u8bbe\u7f6e\uff0c\u5305\u7ba1\u7406\u5668\u90fd\u4f1a\u8ba4\u4e3a\u7528\u6237\u6587\u4ef6\u5939\u5728\u9ed8\u8ba4\u7684 <code>%APPDATA%\/rime<\/code>\u3002\u5305\u7ba1\u7406\u5668\u4e5f\u53ea\u4f1a\u628a\u4e0b\u8f7d\u5230\u6587\u4ef6\u5b89\u88c5\u5230\u8fd9\u4e2a\u8def\u5f84\u91cc\u9762\uff0c\u4f46\u5c0f\u72fc\u6beb\u53ea\u4ece\u7528\u6237\u8bbe\u7f6e\u7684\u6587\u4ef6\u5939\u4e2d\u52a0\u8f7d\u914d\u7f6e\u3002\u8fd9\u6837\u4e00\u6765\uff0c\u5305\u7ba1\u7406\u5668\u5b8c\u5168\u65e0\u6cd5\u5de5\u4f5c\u3002<\/p>\n<h2 id=\"\u540c\u6b65\">\u540c\u6b65<\/h2>\n<p>\u540c\u6b65 rime \u6709\u4e00\u4e2a\u81ea\u5e26\u7684\u540c\u6b65\u529f\u80fd\uff0c\u4e5f\u5c31\u662f\u5b89\u88c5\u5b8c\u540e\u770b\u5230\u7684<code>\u3010\u5c0f\u72fc\u6beb\u3011\u7528\u6236\u8cc7\u6599\u540c\u6b65<\/code>\u5f00\u59cb\u83dc\u5355\u9009\u9879\u3002<\/p>\n<p>\u9996\u5148\u6253\u5f00\u7528\u6237\u6587\u4ef6\u5939\u4e2d\u7684<code>installtion.yaml<\/code>\uff08\u6211\u5c31\u4e0d\u4ecb\u7ecd yaml \u8bed\u6cd5\u4e86\uff09\n\uff0c\u6dfb\u52a0\u4e00\u4e2a<code>sync_dir<\/code>\u9009\u9879\u6307\u5411\u4f60\u60f3\u8981\u540c\u6b65\u7684\u4f4d\u7f6e\uff0c\u6bd4\u5982\u6211\u8bbe\u7f6e\u7684\u662f<code>$OneDrive\/rime<\/code>\uff0c\u90a3\u4e48\u5728\u70b9\u51fb\u540c\u6b65\u4e4b\u540e\uff0crime \u4f1a\u5728<code>$sync_dir<\/code>\u6587\u4ef6\u5939\u4e0b\u65b0\u5efa\u4e00\u4e2a\u6587\u4ef6\u5939\uff0c\u540d\u4e3a\u8fd9\u4e2a\u6587\u4ef6\u91cc\u9762\u7684<code>id<\/code>\u4e00\u9879\uff08\u8fd9\u4e00\u9879\u4f60\u4e5f\u662f\u53ef\u4ee5\u6539\u7684\uff0c\u6bd4\u5982\u6211\u6539\u6210\u4e86<code>windows<\/code>\uff09\uff0c\u7136\u540e\u628a\u4f60\u8fd9\u53f0\u673a\u5668\u91cc\u9762\u7684\u6240\u6709\u914d\u7f6e\u548c\u548c\u8bcd\u5e93\u540c\u6b65\u8fc7\u53bb\u3002<\/p>\n<p>\u5982\u679c rime \u5728\u8fd9\u4e2a\u6587\u4ef6\u5939\u4e0b\u9762\u8fd8\u627e\u5230\u4e86\u5176\u4ed6\u673a\u5668\u7684\u540c\u6b65\u7ed3\u679c\uff0c\u4ed6\u8fd8\u4f1a\u5408\u5e76\u5176\u4ed6\u673a\u5668\u7684\u8bcd\u5e93\uff0c\u6240\u4ee5\u53ea\u8981\u5b9a\u65f6\u7684\u8ba9\u5c0f\u72fc\u6beb\u81ea\u52a8\u540c\u6b65\uff0c\u5c31\u80fd\u89e3\u51b3\u591a\u53f0\u673a\u5668\u7684\u540c\u6b65\u95ee\u9898\u3002<\/p>\n<h2 id=\"\u8bbe\u7f6e\">\u8bbe\u7f6e<\/h2>\n<p>Rime \u6240\u6709\u7684\u8bbe\u7f6e\uff08\u9664\u4e86\u8bcd\u5e93\u6587\u4ef6\uff09\u90fd\u662f yaml\uff0c\u4e3a\u4e86\u80fd\u5408\u5e76\u4e0d\u540c\u7684 YAML \u4e2d\u7684\uff0crime \u7528\u5230\u4e86\u4e00\u4e9b\u5173\u952e\u8bcd\u6bd4\u5982<code>patch<\/code>\u3002<\/p>\n<p>\u5c0f\u72fc\u6beb\u7684\u914d\u7f6e\u6587\u4ef6\u5728<code>$RIME_CONFIG_DIR\/weasel.custom.yaml<\/code>\u4e2d\u3002<\/p>\n<h3 id=\"\u8bbe\u7f6e\u5916\u89c2\">\u8bbe\u7f6e\u5916\u89c2<\/h3>\n<h4 id=\"\u8bbe\u7f6e\u5019\u9009\u8bcd\u6570\u91cf\">\u8bbe\u7f6e\u5019\u9009\u8bcd\u6570\u91cf<\/h4>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#f92672\">patch<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&#34;menu\/page_size&#34;: <\/span><span style=\"color:#ae81ff\">9<\/span>\n<\/span><\/span><\/code><\/pre><\/div><h4 id=\"\u8bbe\u7f6e\u4e3b\u9898\">\u8bbe\u7f6e\u4e3b\u9898<\/h4>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#f92672\">patch<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&#34;style\/color_scheme&#34;: <\/span><span style=\"color:#ae81ff\">steam<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&#34;style\/font_face&#34;: <\/span><span style=\"color:#e6db74\">&#34;Microsoft YaHei&#34;<\/span> <span style=\"color:#75715e\"># \u663e\u793a\u5b57\u4f53<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&#34;style\/font_point&#34;: <\/span><span style=\"color:#ae81ff\">14<\/span> <span style=\"color:#75715e\"># \u5b57\u4f53\u5927\u5c0f<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&#34;style\/horizontal&#34;: <\/span><span style=\"color:#66d9ef\">true<\/span> <span style=\"color:#75715e\"># \u6c34\u5e73\u663e\u793a<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&#34;style\/layout\/margin_x&#34;: <\/span><span style=\"color:#ae81ff\">7<\/span> <span style=\"color:#75715e\"># \u7a97\u53e3\u8fb9\u754c\u8ddd\u79bb<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&#34;style\/layout\/margin_y&#34;: <\/span><span style=\"color:#ae81ff\">7<\/span> <span style=\"color:#75715e\"># \u7a97\u53e3\u8fb9\u754c\u8ddd\u79bb<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&#34;style\/layout\/spacing&#34;: <\/span><span style=\"color:#ae81ff\">2<\/span> <span style=\"color:#75715e\">#\u5019\u9009\u7ad6\u6392\u65f6\u5019\u4e0e\u5019\u9009\u8bcd\u7684\u95f4\u8ddd<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&#34;style\/layout\/candidate_spacing&#34;: <\/span><span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#75715e\"># \u5019\u9009\u95f4\u8ddd<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&#34;style\/layout\/round_corner&#34;: <\/span><span style=\"color:#ae81ff\">8<\/span> <span style=\"color:#75715e\"># \u5706\u7684\u62d0\u89d2<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#75715e\"># \u8fd8\u6709\u4e00\u4e9b\u989d\u5916\u7684\u8bbe\u7f6e\uff0c\u8fd9\u4e0d\u662f\u5b8c\u6574\u7684\u5217\u8868\uff0c\u53ea\u662f\u6211\u7528\u5230\u7684<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p><code>style\/color_scheme<\/code> \u8bbe\u7f6e\u4e86\u5185\u7f6e\u7684\u914d\u8272\u65b9\u6848\uff0c\u5b8c\u6574\u7684\u5217\u8868\u53ef\u4ee5\u5728\u8fd9\u91cc\u627e\u5230 <a href=\"https:\/\/github.com\/rime-aca\/color_schemes\">https:\/\/github.com\/rime-aca\/color_schemes<\/a><\/p>"},{"title":"\u7ed9win10\u5e94\u7528\u5546\u5e97\u8bbe\u7f6e\u4ee3\u7406","link":"https:\/\/blog.trim21.me\/2019\/06\/set-proxy-for-win10-store\/","pubDate":"Wed, 26 Jun 2019 21:32:31 +0800","guid":"https:\/\/blog.trim21.me\/2019\/06\/set-proxy-for-win10-store\/","description":"<p>\u6700\u8fd1\u7f51\u7edc\u72b6\u51b5\u5b9e\u5728\u662f\u4e0d\u597d,\u7528 win10 \u5e94\u7528\u5546\u5e97\u4e0b\u8f7d\u5e94\u7528\u600e\u4e48\u4e5f\u4e0d\u6210\u529f.\u4fee\u6539\u7cfb\u7edf\u4ee3\u7406\u4e5f\u4e0d\u7ba1\u7528.\n\u53c2\u7167<a href=\"https:\/\/sspai.com\/post\/41137\">\u5c11\u6570\u6d3e\u7684\u8fd9\u7bc7\u6587\u7ae0<\/a>\u8bbe\u7f6e\u4e86\u4ee3\u7406,\u603b\u7b97\u662f\u89e3\u51b3\u4e86\u95ee\u9898.<\/p>\n<p>\u5176\u4e2d,\u6700\u9ebb\u70e6\u7684\u662f\u627e\u5230\u5bf9\u5e94 uwp \u5e94\u7528\u7684 sid,\u56e0\u4e3a\u662f\u8981\u5728\u8868\u91cc\u4e00\u9879\u4e00\u9879\u7684\u53bb\u627e.<\/p>\n<p>win10 \u5546\u5e97\u5bf9\u5e94\u7684\u5e94\u7528\u5728\u6ce8\u518c\u8868\u4e2d\u7684<code>DisplayName<\/code>\u662f<code>Microsoft.WindowsStore<\/code>,\n\u6240\u4ee5\u904d\u5386<code>HKEY_CURRENT_USER\\Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\CurrentVersion\\AppContainer\\Mappings<\/code>\u7684\u6240\u6709\u5b50 key,\u627e\u5230\u5bf9\u5e94<code>DisplayName<\/code>\u4e2d\u5305\u542b<code>Microsoft.WindowsStore<\/code>\u7684\u4e00\u9879\u5c31\u53ef\u4ee5\u4e86.<\/p>\n<p>\u56e0\u4e3a\u624b\u52a8\u4e00\u9879\u4e00\u9879\u7684\u53bb\u627e\u6548\u7387\u5b9e\u5728\u662f\u592a\u4f4e,\u5c31\u76f4\u63a5\u5199\u4e86\u4e2a python \u811a\u672c\u6765\u904d\u5386.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-python\" data-lang=\"python\"><span style=\"display:flex;\"><span><span style=\"color:#f92672\">import<\/span> winreg\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">def<\/span> <span style=\"color:#a6e22e\">iterkeys<\/span>(key):\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#75715e\"># \u83b7\u53d6\u8be5\u952e\u7684\u6240\u6709\u5b50\u952e\uff0c\u56e0\u4e3a\u6ca1\u6709\u65b9\u6cd5\u53ef\u4ee5\u83b7\u53d6\u5b50\u952e\u7684\u4e2a\u6570\uff0c\u6240\u4ee5\u53ea\u80fd\u7528\u8fd9\u79cd\u65b9\u6cd5\u8fdb\u884c\u904d\u5386<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#66d9ef\">try<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>        i <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">0<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#66d9ef\">while<\/span> <span style=\"color:#66d9ef\">True<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>            <span style=\"color:#75715e\"># EnumValue\u65b9\u6cd5\u7528\u6765\u679a\u4e3e\u952e\u503c\uff0cEnumKey\u7528\u6765\u679a\u4e3e\u5b50\u952e<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>            <span style=\"color:#66d9ef\">yield<\/span> winreg<span style=\"color:#f92672\">.<\/span>EnumKey(key, i)\n<\/span><\/span><span style=\"display:flex;\"><span>            i <span style=\"color:#f92672\">+=<\/span> <span style=\"color:#ae81ff\">1<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#66d9ef\">except<\/span> <span style=\"color:#a6e22e\">WindowsError<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#66d9ef\">return<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">def<\/span> <span style=\"color:#a6e22e\">itervalues<\/span>(key):\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#75715e\"># \u83b7\u53d6\u8be5\u952e\u7684\u6240\u6709\u952e\u503c\uff0c\u56e0\u4e3a\u6ca1\u6709\u65b9\u6cd5\u53ef\u4ee5\u83b7\u53d6\u952e\u503c\u7684\u4e2a\u6570\uff0c\u6240\u4ee5\u53ea\u80fd\u7528\u8fd9\u79cd\u65b9\u6cd5\u8fdb\u884c\u904d\u5386<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    d <span style=\"color:#f92672\">=<\/span> {}\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#66d9ef\">try<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>        i <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">0<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#66d9ef\">while<\/span> <span style=\"color:#66d9ef\">True<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>            <span style=\"color:#75715e\"># EnumValue\u65b9\u6cd5\u7528\u6765\u679a\u4e3e\u952e\u503c\uff0cEnumKey\u7528\u6765\u679a\u4e3e\u5b50\u952e<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>            name, value, _ <span style=\"color:#f92672\">=<\/span> winreg<span style=\"color:#f92672\">.<\/span>EnumValue(key, i)\n<\/span><\/span><span style=\"display:flex;\"><span>            d[name] <span style=\"color:#f92672\">=<\/span> value\n<\/span><\/span><span style=\"display:flex;\"><span>            i <span style=\"color:#f92672\">+=<\/span> <span style=\"color:#ae81ff\">1<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#66d9ef\">except<\/span> <span style=\"color:#a6e22e\">WindowsError<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#66d9ef\">return<\/span> d\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">def<\/span> <span style=\"color:#a6e22e\">main<\/span>():\n<\/span><\/span><span style=\"display:flex;\"><span>    base_key <span style=\"color:#f92672\">=<\/span> (\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#e6db74\">r<\/span><span style=\"color:#e6db74\">&#34;Software\\Classes\\Local Settings\\Software&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#e6db74\">r<\/span><span style=\"color:#e6db74\">&#34;\\Microsoft\\Windows\\CurrentVersion\\AppContainer\\Mappings<\/span><span style=\"color:#ae81ff\">\\\\<\/span><span style=\"color:#e6db74\">&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    )\n<\/span><\/span><span style=\"display:flex;\"><span>    mappings <span style=\"color:#f92672\">=<\/span> winreg<span style=\"color:#f92672\">.<\/span>OpenKey(winreg<span style=\"color:#f92672\">.<\/span>HKEY_CURRENT_USER, base_key)\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#66d9ef\">for<\/span> key <span style=\"color:#f92672\">in<\/span> iterkeys(mappings):\n<\/span><\/span><span style=\"display:flex;\"><span>        k <span style=\"color:#f92672\">=<\/span> winreg<span style=\"color:#f92672\">.<\/span>OpenKey(winreg<span style=\"color:#f92672\">.<\/span>HKEY_CURRENT_USER, base_key <span style=\"color:#f92672\">+<\/span> key)\n<\/span><\/span><span style=\"display:flex;\"><span>        info <span style=\"color:#f92672\">=<\/span> itervalues(k)\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#66d9ef\">if<\/span> <span style=\"color:#e6db74\">&#39;WindowsStore&#39;<\/span> <span style=\"color:#f92672\">in<\/span> info[<span style=\"color:#e6db74\">&#39;DisplayName&#39;<\/span>]:\n<\/span><\/span><span style=\"display:flex;\"><span>            print(info[<span style=\"color:#e6db74\">&#39;DisplayName&#39;<\/span>])\n<\/span><\/span><span style=\"display:flex;\"><span>            print(key)\n<\/span><\/span><span style=\"display:flex;\"><span>            <span style=\"color:#66d9ef\">break<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">if<\/span> __name__ <span style=\"color:#f92672\">==<\/span> <span style=\"color:#e6db74\">&#39;__main__&#39;<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>    main()\n<\/span><\/span><\/code><\/pre><\/div><p>\u76f4\u63a5\u4fdd\u5b58\u6210 py \u6587\u4ef6,\u7136\u540e\u8fd0\u884c,\u63a7\u5236\u53f0\u7684\u7b2c\u4e8c\u884c\u4f1a\u8f93\u51fa\u7c7b\u4f3c<code>S-1-15-2-****<\/code>\u7684\u4e00\u4e2a SID,\u5c31\u662f\u5728<code>CheckNetIsolation.exe loopbackexempt -a -p=${SID}<\/code>\u4e2d\u8981\u7528\u5230\u7684 SID.<\/p>"},{"title":"\u7528PyInstaller\u6253\u5305python\u5e94\u7528","link":"https:\/\/blog.trim21.me\/2019\/06\/build-python-package-with-pyinstaller\/","pubDate":"Sun, 02 Jun 2019 23:47:34 +0800","guid":"https:\/\/blog.trim21.me\/2019\/06\/build-python-package-with-pyinstaller\/","description":"<p>\u90a3\u5929\u7a81\u7136\u597d\u5947\uff0c<code>docker-compose<\/code>\u662f\u7528\u4ec0\u4e48\u8bed\u8a00\u5199\u7684\u3002\u7136\u540e\u4e00\u770b\uff0c\u53d1\u73b0\u5c45\u7136\u662f\u7528 python2 \u5199\u7684\u3002<\/p>\n<p>\u4f46\u60f3\u5230\u6211\u5b89\u88c5\u7684\u65f6\u5019\u4ece\u6765\u6ca1\u5728\u4e4e\u8fc7\u673a\u5668\u4e0a\u6709\u6ca1\u6709\u5b89\u88c5 python\uff0c\u6216\u8005\u6211\u7684 python \u7248\u672c\u662f\u591a\u5c11\uff0c\u800c\u662f\u6309\u7167\u5b98\u7f51\u7684\u6587\u6863\uff0c\u76f4\u63a5\u4e0b\u8f7d\u4e00\u4e2a\u4e8c\u8fdb\u5236\u6587\u4ef6\u6765\u5b89\u88c5\u7684\u3002\u7a81\u7136\u773c\u524d\u4e00\u4eae\u3002\u770b\u4e86\u4e00\u4e0b\u5bf9\u5e94\u7684\u6784\u5efa\u4ee3\u7801\uff0c\u53d1\u73b0\u4ed6\u662f\u7528<a href=\"https:\/\/github.com\/pyinstaller\/pyinstaller\"><code>PyInstaller<\/code><\/a>\u6765\u8fdb\u884c\u6253\u5305\u7684\uff0c\u628a\u4e00\u4e2a python \u5e94\u7528\u6253\u5305\u6210\u5355\u4e2a\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\u3002<\/p>\n<p>\u4e00\u822c\u6765\u8bf4\uff0c\u6b63\u5e38\u7684 python \u5305\u7684\u5206\u53d1\u4f1a\u57fa\u4e8e pip \u7684\uff0c\u53d1\u5e03\u5230 pypi \u548c\u7528\u6237\u4e0b\u8f7d\u7684\u90fd\u662f\u4ee3\u7801\u6587\u4ef6\uff08\u548c\u5176\u4ed6\u8bed\u8a00\u7f16\u8bd1\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\uff09\uff0c\u5982\u679c\u4f9d\u8d56\u4e8e\u5176\u4ed6\u7684 package \u4f1a\u5728\u5b89\u88c5\u7684\u65f6\u5019\u518d\u8fdb\u884c\u4e0b\u8f7d\u3002<\/p>\n<p>\u4f46\u7528<code>PyInstaller<\/code>\uff0c\u6253\u5305\u51fa\u6765\u7684\u53ef\u6267\u884c\u6587\u4ef6\u4e2d\u5305\u542b\u4e86\u6240\u6709\u7528\u5230\u7684\u4f9d\u8d56\u548c python \u89e3\u91ca\u5668\uff0c\u5e76\u4e0d\u9700\u8981\u672c\u673a\u5b89\u88c5\u4e86 python \u6216\u8005 pip\uff0c\u50cf docker-compose \u8fd9\u6837\u7684\u5de5\u5177\uff0c\u6253\u5305\u4e4b\u540e\u6210\u4e00\u4e2a\u5355\u6587\u4ef6\uff0c\u5bf9\u4e8e\u7528\u6237\u5728\u5b89\u88c5\u548c\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u4f1a\u65b9\u4fbf\u8bb8\u591a\uff0c\u800c\u5bf9\u4e8e\u6211\u4eec\u5f00\u53d1\u8005\u6765\u8bf4\uff0c\u5c31\u4e0d\u7528\u8003\u8651\u517c\u5bb9\u65e7\u7684 python \u7248\u672c\uff0c\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528 python3.6 \u7684\u65b0\u8bed\u6cd5\u5982 type annotation \u7b49\uff0c\u4f7f\u7528\u67d0\u4e9b\u53ea\u6709 python3.6 \u4ee5\u4e0a\u7248\u672c\u624d\u80fd\u7528\u7684\u4f9d\u8d56\u5e93\uff0c\u81ea\u7136\u4e5f\u6bd4\u539f\u6765\u723d\u4e86\u8bb8\u591a\u3002<\/p>\n<p>\u9996\u5148\uff0cPyInstaller \u7684\u5de5\u4f5c\u539f\u7406\u662f\u4ece\u4e00\u4e2a py \u6587\u4ef6\u51fa\u53d1\u5728\u9759\u6001\u5206\u6790\u51fa\u6240\u6709\u7528\u5230\u7684\u4f9d\u8d56\uff0c\u7136\u540e\u628a\u6240\u6709\u7684\u4f9d\u8d56\u6253\u5305\u8d77\u6765\uff0c\u5728\u7528\u6237\u4f7f\u7528\u4e8c\u8fdb\u5236\u7684\u65f6\u5019\u91ca\u653e\u5230\u4e00\u4e2a\u4e34\u65f6\u6587\u4ef6\u5939\u4e2d\uff0c\u7528 Python \u89e3\u91ca\u5668\u6765\u8fd0\u884c\u3002<\/p>\n<p>PyInstaller \u5165\u95e8\u7684\u6587\u7ae0\u5df2\u7ecf\u6709\u5f88\u591a\u4e86\uff0c\u5c31\u4e0d\u518d\u91cd\u590d\u5199\u4e00\u904d\u4e86\uff0c\u4e3b\u8981\u9047\u5230\u7684\u5751\u6709\u8fd9\u4e48\u51e0\u4e2a\u3002<\/p>\n<h2 id=\"\u7528\u5230\u7684\u975e-py-\u6587\u4ef6\u8981\u624b\u52a8\u6307\u5b9a\u8def\u5f84\u4e00\u8d77\u6253\u5305\">\u7528\u5230\u7684\u975e py \u6587\u4ef6\u8981\u624b\u52a8\u6307\u5b9a\u8def\u5f84\u4e00\u8d77\u6253\u5305<\/h2>\n<p>\u6211\u7684\u7a0b\u5e8f\u4e2d\u7528\u5230\u4e86\u4e00\u4e9b\u6a21\u677f\u6587\u4ef6\uff0c\u662f\u5728\u7a0b\u5e8f\u8fd0\u884c\u8d77\u6765\u4e4b\u540e\u624d\u6839\u636e\u9700\u8981\u52a0\u8f7d\u51b3\u5b9a\u662f\u5426\u6e32\u67d3\u7684\u3002\u8fd9\u4e9b\u6587\u4ef6\u56e0\u4e3a\u4e0d\u662f python \u6587\u4ef6\uff0c\u6240\u4ee5 PyInstaller \u5728\u5206\u6790\u7684\u65f6\u5019\u4e5f\u4e0d\u4f1a\u77e5\u9053\u662f\u7a0b\u5e8f\u7684\u4e00\u90e8\u5206\uff0c\u5c31\u4e0d\u4f1a\u6253\u5305\u5728\u4e8c\u8fdb\u5236\u4e2d\u3002<\/p>\n<p>\u5728\u7a0b\u5e8f\u8fd0\u884c\u7684\u65f6\u5019\uff0c\u5982\u679c\u7528\u5230\u4e86\u5bf9\u5e94\u7684\u6587\u4ef6\uff0c\u56e0\u4e3a\u6ca1\u6709\u88ab\u6253\u5305\u8fdb\u6765\u7684\u7f18\u6545\uff0c\u7a0b\u5e8f\u5c31\u4f1a\u62a5\u9519\u3002<\/p>\n<p>\u5982\u679c\u7528\u547d\u4ee4\u884c\u6765\u6307\u5b9a\u8981\u4e00\u8d77\u6253\u5305\u7684\u6587\u4ef6\u6548\u7387\u8fc7\u4f4e\uff0c\u6240\u4ee5\u53ef\u4ee5\u7f16\u5199\u4e00\u4e2a spec \u6587\u4ef6\u6765\u544a\u8bc9 PyInstaller \u8981\u5982\u4f55\u6253\u5305\u3002<\/p>\n<p>\uff08\u8fd9\u662f\u6211\u4e4b\u524d\u5c1d\u8bd5\u6253\u5305\u6211\u7684\u7a0b\u5e8f\u662f\u7528\u5230\u7684 spec \u6587\u4ef6\uff0c\u4f46\u662f\u56e0\u4e3a\u4e0d\u652f\u6301<code>entry_points<\/code>\u7684\u539f\u56e0\uff0c\u6240\u4ee5\u6211\u6700\u540e\u653e\u5f03\u4e86\u4f7f\u7528\u8fd9\u4e2a\u529e\u6cd5\uff0c\u4f46\u662f\u6253\u5305\u51fa\u6765\u7684\u7a0b\u5e8f\u5728\u4e0d\u7528\u5230<code>entry_points<\/code>\u7684\u60c5\u51b5\u4e0b\u662f\u8ddf\u76f4\u63a5\u4f7f\u7528 pip \u5b89\u88c5\u884c\u4e3a\u4e00\u81f4\u7684\u3002\uff09<\/p>\n<p><code>bgmi.spec<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-python\" data-lang=\"python\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># -*- mode: python -*-<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">from<\/span> PyInstaller.building.api <span style=\"color:#f92672\">import<\/span> EXE, PYZ\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">from<\/span> PyInstaller.building.build_main <span style=\"color:#f92672\">import<\/span> Analysis\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">import<\/span> os\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">import<\/span> os.path\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">import<\/span> importlib\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>bindata_dir <span style=\"color:#f92672\">=<\/span> [\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#e6db74\">&#39;bgmi\/front\/templates&#39;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#e6db74\">&#39;bgmi\/lib\/models\/migrations&#39;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>]\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">def<\/span> <span style=\"color:#a6e22e\">get_bindata<\/span>():\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#66d9ef\">for<\/span> dir_path <span style=\"color:#f92672\">in<\/span> bindata_dir:\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#66d9ef\">for<\/span> file <span style=\"color:#f92672\">in<\/span> os<span style=\"color:#f92672\">.<\/span>listdir(dir_path):\n<\/span><\/span><span style=\"display:flex;\"><span>            <span style=\"color:#66d9ef\">yield<\/span> (os<span style=\"color:#f92672\">.<\/span>path<span style=\"color:#f92672\">.<\/span>join(dir_path, file), dir_path)\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>block_cipher <span style=\"color:#f92672\">=<\/span> <span style=\"color:#66d9ef\">None<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>package_imports <span style=\"color:#f92672\">=<\/span> [[<span style=\"color:#e6db74\">&#39;peewee_migrate&#39;<\/span>, [<span style=\"color:#e6db74\">&#39;template.txt&#39;<\/span>]]]\n<\/span><\/span><span style=\"display:flex;\"><span>datas <span style=\"color:#f92672\">=<\/span> list(get_bindata())\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">for<\/span> package, files <span style=\"color:#f92672\">in<\/span> package_imports:\n<\/span><\/span><span style=\"display:flex;\"><span>    proot <span style=\"color:#f92672\">=<\/span> os<span style=\"color:#f92672\">.<\/span>path<span style=\"color:#f92672\">.<\/span>dirname(importlib<span style=\"color:#f92672\">.<\/span>import_module(package)<span style=\"color:#f92672\">.<\/span>__file__)\n<\/span><\/span><span style=\"display:flex;\"><span>    datas<span style=\"color:#f92672\">.<\/span>extend((os<span style=\"color:#f92672\">.<\/span>path<span style=\"color:#f92672\">.<\/span>join(proot, f), package) <span style=\"color:#66d9ef\">for<\/span> f <span style=\"color:#f92672\">in<\/span> files)\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>a <span style=\"color:#f92672\">=<\/span> Analysis([<span style=\"color:#e6db74\">&#39;bgmi\/__main__.py&#39;<\/span>],\n<\/span><\/span><span style=\"display:flex;\"><span>             pathex<span style=\"color:#f92672\">=<\/span>[<span style=\"color:#e6db74\">&#39;.&#39;<\/span>],\n<\/span><\/span><span style=\"display:flex;\"><span>             hiddenimports<span style=\"color:#f92672\">=<\/span>[],\n<\/span><\/span><span style=\"display:flex;\"><span>             hookspath<span style=\"color:#f92672\">=<\/span><span style=\"color:#66d9ef\">None<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>             datas<span style=\"color:#f92672\">=<\/span>datas,\n<\/span><\/span><span style=\"display:flex;\"><span>             runtime_hooks<span style=\"color:#f92672\">=<\/span><span style=\"color:#66d9ef\">None<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>             cipher<span style=\"color:#f92672\">=<\/span>block_cipher)\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>pyz <span style=\"color:#f92672\">=<\/span> PYZ(a<span style=\"color:#f92672\">.<\/span>pure, cipher<span style=\"color:#f92672\">=<\/span>block_cipher)\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>exe <span style=\"color:#f92672\">=<\/span> EXE(\n<\/span><\/span><span style=\"display:flex;\"><span>    pyz,\n<\/span><\/span><span style=\"display:flex;\"><span>    a<span style=\"color:#f92672\">.<\/span>scripts,\n<\/span><\/span><span style=\"display:flex;\"><span>    a<span style=\"color:#f92672\">.<\/span>binaries,\n<\/span><\/span><span style=\"display:flex;\"><span>    a<span style=\"color:#f92672\">.<\/span>zipfiles,\n<\/span><\/span><span style=\"display:flex;\"><span>    a<span style=\"color:#f92672\">.<\/span>datas,\n<\/span><\/span><span style=\"display:flex;\"><span>    name<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#39;bgmi&#39;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>    debug<span style=\"color:#f92672\">=<\/span><span style=\"color:#66d9ef\">False<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>    strip<span style=\"color:#f92672\">=<\/span><span style=\"color:#66d9ef\">None<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>    upx<span style=\"color:#f92672\">=<\/span><span style=\"color:#66d9ef\">True<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>    console<span style=\"color:#f92672\">=<\/span><span style=\"color:#66d9ef\">True<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>    bootloader_ignore_signals<span style=\"color:#f92672\">=<\/span><span style=\"color:#66d9ef\">True<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>)\n<\/span><\/span><\/code><\/pre><\/div><p>\u5176\u4e2d\uff0c<code>a = Analysis(['bgmi\/__main__.py'],<\/code>\u4e3a\u7a0b\u5e8f\u7684\u5165\u53e3\u5c31\u662f\u539f\u672c\u5982\u679c\u4f7f\u7528\u547d\u4ee4\u884c\u7684\u8bdd\uff0c\u5728 PyInstaller \u540e\u9762\u8ddf\u7684\u90a3\u4e2a py \u6587\u4ef6\u8def\u5f84\u3002<\/p>"},{"title":"\u53c2\u4e0epython\u6587\u6863\u7684\u4e2d\u6587\u7ffb\u8bd1","link":"https:\/\/blog.trim21.me\/2019\/03\/join-python-zh-cn-translaters\/","pubDate":"Sun, 31 Mar 2019 01:28:36 +0800","guid":"https:\/\/blog.trim21.me\/2019\/03\/join-python-zh-cn-translaters\/","description":"<p>\u4eca\u5929\u770b\u5230\u8fd9\u4e2a\u5e16\u5b50<a href=\"https:\/\/www.v2ex.com\/t\/550164\">\u522b\u5f00\u5fc3\u592a\u65e9\uff0c Python \u5b98\u65b9\u6587\u6863\u7684\u7ffb\u8bd1\u5dee\u8fdc\u4e86 - V2EX<\/a> \u53d1\u73b0\u53c2\u4e0e python \u6587\u6863\u7ffb\u8bd1\u7684\u95e8\u69db\u8fd8\u633a\u4f4e\u7684\uff0c\u5c31\u5c1d\u8bd5\u4e86\u4e00\u4e0b\u7ffb\u8bd1\u4e86\u4e24\u6bb5\u6587\u6863.<\/p>\n<h2 id=\"\u53c2\u4e0e\u7ffb\u8bd1\u7684\u65b9\u6cd5\">\u53c2\u4e0e\u7ffb\u8bd1\u7684\u65b9\u6cd5<\/h2>\n<p>\u6309\u7167 <a href=\"https:\/\/www.python.org\/dev\/peps\/pep-0545\/\">pep-545<\/a>\u7684\u8bf4\u6cd5, \u6709\u4e09\u6b65\u9700\u8981\u505a:<\/p>\n<ol>\n<li>\u6ce8\u518c\u4e00\u4e2a <a href=\"https:\/\/bugs.python.org\">https:\/\/bugs.python.org<\/a> \u7684\u8d26\u53f7, \u8fd9\u4e2a\u7528\u6237\u540d\u5728\u7b7e license \u7684\u65f6\u5019\u4f1a\u7528\u5230.<\/li>\n<li>\u7b7e license <a href=\"https:\/\/www.python.org\/psf\/contrib\/\">\u4ecb\u7ecd<\/a> \u5177\u4f53\u7b7e\u7f72\u662f\u5728<a href=\"https:\/\/www.python.org\/psf\/contrib\/contrib-form\/\">\u8fd9\u4e2a\u9875\u9762\u4e0a<\/a> \u7528\u7684 adobe sign, \u586b\u5b8c\u90a3\u4e2a iframe \u91cc\u9762\u7684\u51e0\u4e2a\u6846\u5c31\u80fd\u63d0\u4ea4\u4e86.<\/li>\n<li>\u6ce8\u518c transifex, \u9009\u62e9\u81ea\u5df1\u7684\u8bed\u8a00, \u5e76\u4e14<a href=\"https:\/\/www.transifex.com\/python-doc\/python-newest\/\">\u7533\u8bf7\u52a0\u5165<\/a><\/li>\n<\/ol>\n<p>\u7136\u540e\u7b49\u5f85\u88ab\u5141\u8bb8\u52a0\u5165\u56e2\u961f, \u7136\u540e\u5c31\u53ef\u4ee5\u5f00\u59cb\u7ffb\u8bd1\u4e86.<\/p>\n<p>\u7ffb\u8bd1\u662f\u4ee5\u6bcf\u6bb5\u4e3a\u5355\u4f4d\u8fdb\u884c\u7684<\/p>\n<p><img src=\"https:\/\/blog.trim21.me\/static\/bd69bf14ly1g1l2x2j9x2j20yh0po7fd.jpg\" alt=\"\"><\/p>\n<p><a href=\"https:\/\/github.com\/python\/python-docs-zh-cn\">python\/python-docs-zh-cn: zh_CN translation of the Python documentation<\/a><\/p>\n<p>\u4e2d\u6587\u7684 po \u6587\u4ef6\u5728\u8fd9\u4e2a\u4ed3\u5e93\u91cc, \u6bcf\u4e2a\u5c0f\u65f6\u4f1a\u6709\u4e00\u4e2a bot \u4f1a\u81ea\u52a8\u628a transifex \u4e0a\u9762\u7684\u7ffb\u8bd1\u540c\u6b65\u5230\u4ed3\u5e93\u91cc\u9762\u53bb, \u4f46\u662f\u81ea\u5df1\u7684\u540d\u5b57\u5e76\u4e0d\u4f1a\u51fa\u73b0\u5728\u8fd9\u4e2a\u4ed3\u5e93\u7684 contributors \u91cc\u9762, 233<\/p>"},{"title":"golang\u7b14\u8bb0","link":"https:\/\/blog.trim21.me\/2018\/11\/learning-golang\/","pubDate":"Thu, 01 Nov 2018 17:25:15 +0800","guid":"https:\/\/blog.trim21.me\/2018\/11\/learning-golang\/","description":"<h2 id=\"\u4e00\u4e9b\u7ea6\u5b9a\">\u4e00\u4e9b\u7ea6\u5b9a<\/h2>\n<ol>\n<li>\u4f7f\u7528\u9a7c\u5cf0\u547d\u540d\u6cd5<\/li>\n<li>\u9996\u5b57\u6bcd\u5c0f\u5199\u7684\u53d8\u91cf\/\u51fd\u6570\u53ea\u80fd\u5728\u5305\u5185\u4f7f\u7528(\u591a\u6309\u4e00\u6b21 shift \u6211\u8981\u7d2f\u6b7b\u4e86, \u867d\u7136\u7f16\u8f91\u5668\u6709\u65f6\u5728\u5c0f\u5199\u8f93\u5165\u7684\u60c5\u51b5\u4e0b\u4e5f\u4f1a\u81ea\u52a8\u8865\u5168\u5927\u5199\u5185\u5bb9, \u4f46\u6709\u65f6\u4e0d\u662f\u90a3\u4e48\u806a\u660e)<\/li>\n<\/ol>\n<h2 id=\"\u6570\u636e\u7c7b\u578b\">\u6570\u636e\u7c7b\u578b<\/h2>\n<h3 id=\"bool\">bool<\/h3>\n<p>\u5e03\u5c14, <code>true<\/code>\u6216\u8005<code>false<\/code><\/p>\n<h3 id=\"string\">string<\/h3>\n<p>\u5b57\u7b26\u4e32, \u4f7f\u7528\u53cc\u5f15\u53f7 \u6bd4\u5982<code>&quot;hello world&quot;<\/code><\/p>\n<h3 id=\"rune\">rune<\/h3>\n<p>\u7c7b\u4f3c\u4e8e\u5b57\u7b26, \u5728\u4f7f\u7528<code>for _, char := range string<\/code>\u8fed\u4ee3 string \u7684\u65f6\u5019, char \u7684\u7c7b\u578b\u5c31\u662f rune<\/p>\n<h3 id=\"int\">int<\/h3>\n<p>\u672a\u5206 int8, int16, int32 \u7b49\u7b49, \u53ef\u80fd\u6709\u4e9b api \u8fd4\u56de\u7684\u662f uint \u7c7b\u578b, \u4f7f\u7528<code>int()<\/code>\u8f6c\u5316\u4e3a int<\/p>\n<h3 id=\"byte\">byte<\/h3>\n<p><code>[]byte<\/code>\u53ef\u4ee5\u8ddf string \u4e92\u76f8\u8f6c\u5316, <code>len(string)<\/code>\u7684\u957f\u5ea6\u5b9e\u9645\u4e0a\u5c31\u662f string \u8f6c\u5316\u4e3a<code>[]byte<\/code>\u4e4b\u540e\u7684\u957f\u5ea6. \u6bcf\u4e2a unicode \u7684\u957f\u5ea6\u4e3a 3. \u6bd4\u5982\u8bf4<code>len(&quot;hello world&quot;)==11<\/code>, \u4f46\u662f<code>len(&quot;\u4f60\u597d \u4e16\u754c&quot;)<\/code>\u7684\u957f\u5ea6\u4e3a 3+3+1=7. \u6bcf\u4e2a\u6c49\u5b57\u56e0\u4e3a\u662f unicode \u6240\u4ee5\u4e3a 3.<\/p>\n<h3 id=\"\u6307\u9488\">\u6307\u9488<\/h3>\n<p>\u53ef\u4ee5\u6307\u5411\u5176\u4ed6\u6570\u636e\u7c7b\u578b, \u5728\u4f20\u503c\u7684\u65f6\u5019\u4f20\u9012\u6307\u9488\u53ef\u4ee5\u907f\u514d\u6bd4\u8f83\u590d\u6742\u7684\u6570\u636e\u7ed3\u6784\u88ab\u590d\u5236\u4e00\u4efd.(\u6bd4\u5982\u6bd4\u8f83\u5927\u7684\u6570\u636e, \u7ed3\u6784\u4f53\u7b49\u7b49)<\/p>\n<h3 id=\"\u6570\u7ec4\">\u6570\u7ec4<\/h3>\n<p>\u7528\u4e8e\u5b58\u653e\u7c7b\u578b\u76f8\u540c\u7684\u4e00\u7ec4\u6570\u636e.<\/p>\n<h4 id=\"slice\">slice<\/h4>\n<p>\u53ef\u53d8\u957f\u5ea6<\/p>"},{"title":"\u5728UserScript\u4e2d\u4f7f\u7528Vue","link":"https:\/\/blog.trim21.me\/2018\/10\/use-vue-in-userscript\/","pubDate":"Thu, 11 Oct 2018 15:26:00 +0800","guid":"https:\/\/blog.trim21.me\/2018\/10\/use-vue-in-userscript\/","description":"<p>\u4e4b\u524d\u5199\u4e86\u4e00\u4e2a\u7528\u6237\u811a\u672c, <a href=\"https:\/\/github.com\/Trim21\/bgm-tv-auto-tracker\">\u5728\u7ad9\u5916\u4e00\u952e\u70b9 bgm \u683c\u5b50<\/a> \u4e3a\u4e86\u6dfb\u52a0\u4e00\u4e2a UI, \u4f46\u53c8\u4e0d\u60f3\u7528 jQuery \u624b\u52a8\u7ed1\u4e00\u5806\u4e8b\u4ef6, \u5c31\u76f4\u63a5\u4e0a\u4e86 Vue. \u6240\u4ee5\u9700\u8981\u7528 Webpack \u6253\u5305\u5bf9\u5e94\u7684 vue \u6587\u4ef6\u5230 userscript \u91cc.<\/p>\n<p><img src=\"https:\/\/blog.trim21.me\/static\/bd69bf14ly1fw4c4bspy5j20b10cagmq.jpg\" alt=\"\u6548\u679c\u56fe\"><\/p>\n<p>\u6309\u94ae\u548c\u5f39\u51fa\u6846\u90fd\u662f Vue \u505a\u7684.<\/p>\n<p>\u56e0\u4e3a\u4e4b\u524d\u4e00\u76f4\u7528\u7684\u662f<code>vue-cli<\/code>\u63d0\u4f9b\u7684 webpack \u6a21\u677f, \u6240\u4ee5\u4e0d\u592a\u719f\u6089 webpack, \u8e29\u4e86\u4e0d\u5c11\u5751.<\/p>\n<p>\u53c2\u8003<a href=\"https:\/\/vue-loader.vuejs.org\/guide\/\">vue-loader<\/a><\/p>\n<p>\u9996\u5148\u5728 webpack \u7684\u8bbe\u7f6e\u4e2d\u6dfb\u52a0\u4e00\u4e2a<code>loader<\/code>, \u518d\u6dfb\u52a0\u4e00\u4e2a\u63d2\u4ef6<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-javascript\" data-lang=\"javascript\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ webpack.config.js\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#a6e22e\">VueLoaderPlugin<\/span> <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">require<\/span>(<span style=\"color:#e6db74\">&#34;vue-loader\/lib\/plugin&#34;<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">module<\/span>.<span style=\"color:#a6e22e\">exports<\/span> <span style=\"color:#f92672\">=<\/span> {\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#a6e22e\">module<\/span><span style=\"color:#f92672\">:<\/span> {\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#a6e22e\">rules<\/span><span style=\"color:#f92672\">:<\/span> [\n<\/span><\/span><span style=\"display:flex;\"><span>      <span style=\"color:#75715e\">\/\/ ... other rules\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>      {\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#a6e22e\">test<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#e6db74\">\/\\.vue$\/<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#a6e22e\">loader<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#e6db74\">&#34;vue-loader&#34;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#a6e22e\">options<\/span><span style=\"color:#f92672\">:<\/span> {\n<\/span><\/span><span style=\"display:flex;\"><span>          <span style=\"color:#a6e22e\">loaders<\/span><span style=\"color:#f92672\">:<\/span> {\n<\/span><\/span><span style=\"display:flex;\"><span>            <span style=\"color:#a6e22e\">scss<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#e6db74\">&#34;vue-style-loader!css-loader!postcss-loader!sass-loader&#34;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>            <span style=\"color:#75715e\">\/\/ &lt;style lang=&#34;scss&#34;&gt;\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>          },\n<\/span><\/span><span style=\"display:flex;\"><span>        },\n<\/span><\/span><span style=\"display:flex;\"><span>      },\n<\/span><\/span><span style=\"display:flex;\"><span>    ],\n<\/span><\/span><span style=\"display:flex;\"><span>  },\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#a6e22e\">plugins<\/span><span style=\"color:#f92672\">:<\/span> [\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#75715e\">\/\/ make sure to include the plugin!\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#66d9ef\">new<\/span> <span style=\"color:#a6e22e\">VueLoaderPlugin<\/span>(),\n<\/span><\/span><span style=\"display:flex;\"><span>  ],\n<\/span><\/span><span style=\"display:flex;\"><span>};\n<\/span><\/span><\/code><\/pre><\/div><p>\u7136\u540e\u5728\u4ee3\u7801\u91cc, \u53c2\u7167 Vue \u5b98\u65b9\u7684\u6a21\u677f, \u53ea\u8981\u521d\u59cb\u5316\u4e00\u4e2a\u5b9e\u4f8b\u5c31\u80fd\u6b63\u5e38\u663e\u793a\u5185\u5bb9\u4e86.<\/p>"},{"title":"\u751f\u6210bgm.tv\u5173\u8054\u6761\u76ee\u7f51\u7edc","link":"https:\/\/blog.trim21.me\/2018\/10\/bgm.tv-ip-viewer\/","pubDate":"Thu, 11 Oct 2018 10:50:36 +0800","guid":"https:\/\/blog.trim21.me\/2018\/10\/bgm.tv-ip-viewer\/","description":"<p>\u672c\u9879\u76ee\u5df2\u5f03\u5751\u3002<\/p>\n<p>\u5728 bgm \u4e0a\u770b\u5230\u6709\u4eba\u8bf4\u73b0\u5728\u7684\u5173\u8054\u56fe\u53ea\u6709\u4e00\u5c42, \u770b\u8d77\u6765\u4e0d\u592a\u65b9\u4fbf, \u5c31\u722c\u4e86\u5168\u7ad9\u6570\u636e\u505a\u4e86\u8fd9\u4e48\u4e2a\u4e1c\u897f.<\/p>\n<h1 id=\"\u722c\u53d6\u6570\u636e\u5e76\u751f\u6210\u5173\u8054\u6761\u76ee\u7f51\u7edc\">\u722c\u53d6\u6570\u636e\u5e76\u751f\u6210\u5173\u8054\u6761\u76ee\u7f51\u7edc<\/h1>\n<h2 id=\"\u722c\u53d6\u6570\u636e\">\u722c\u53d6\u6570\u636e<\/h2>\n<p>\u722c\u6570\u636e\u7528\u7684\u662f<code>scrapy<\/code>, \u56e0\u4e3a\u672c\u7ad9\u6709\u8bf7\u6c42\u901f\u5ea6\u7684\u9650\u5236, \u6240\u4ee5\u6570\u636e\u6e90\u662f\u955c\u50cf\u7ad9.<\/p>\n<p><code>scrapy<\/code>\u7684\u6d41\u7a0b\u662f\u8fd9\u6837\u7684, \u9996\u5148\u7ee7\u627f<code>scrapy.Item<\/code>\u6765\u5b9a\u4e49\u4f60\u81ea\u5df1\u722c\u5230\u7684\u6570\u636e\u7684\u6a21\u578b.<\/p>\n<p>\u6bd4\u5982\u6211\u5b9a\u4e49\u4e86\u6761\u76ee item<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-python\" data-lang=\"python\"><span style=\"display:flex;\"><span><span style=\"color:#f92672\">import<\/span> scrapy\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">from<\/span> scrapy <span style=\"color:#f92672\">import<\/span> Field\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">class<\/span> <span style=\"color:#a6e22e\">SubjectItem<\/span>(scrapy<span style=\"color:#f92672\">.<\/span>Item):\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#75715e\"># define the fields for your item here like:<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    id <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><span style=\"display:flex;\"><span>    _id <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><span style=\"display:flex;\"><span>    name <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><span style=\"display:flex;\"><span>    image <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><span style=\"display:flex;\"><span>    subject_type <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><span style=\"display:flex;\"><span>    name_cn <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><span style=\"display:flex;\"><span>    tags <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><span style=\"display:flex;\"><span>    info <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>    score <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>    score_details <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>    wishes <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><span style=\"display:flex;\"><span>    done <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><span style=\"display:flex;\"><span>    doings <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><span style=\"display:flex;\"><span>    on_hold <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><span style=\"display:flex;\"><span>    dropped <span style=\"color:#f92672\">=<\/span> Field()\n<\/span><\/span><\/code><\/pre><\/div><p>\u6bcf\u4e2a<code>Field()<\/code>\u4e2d\u4fdd\u5b58\u7684\u7684\u6570\u636e\u7c7b\u578b\u53ef\u4ee5\u662f <code>str<\/code>, <code>int<\/code>, <code>bool<\/code>\u7b49\u57fa\u7840\u7684\u6570\u636e\u7c7b\u578b, \u4e5f\u53ef\u4ee5\u662f<code>list<\/code>, <code>dict<\/code>\u8fd9\u79cd\u7ec4\u5408\u7c7b\u578b.<\/p>"},{"title":"\u57fa\u4e8easyncio\u7684web\u6846\u67b6aiohttp","link":"https:\/\/blog.trim21.me\/2018\/10\/python-aiohttp\/","pubDate":"Fri, 05 Oct 2018 17:42:21 +0800","guid":"https:\/\/blog.trim21.me\/2018\/10\/python-aiohttp\/","description":"<p>\u672c\u6765\u60f3\u626f\u4e00\u901a\u6807\u51c6\u5e93\u91cc\u6dfb\u52a0\u4e86<code>asyncio<\/code>\u7684\u610f\u4e49, \u4ec0\u4e48\u7edf\u4e00\u4e86\u5f02\u6b65\u6846\u67b6, \u4ec0\u4e48\u65b9\u4fbf\u4ee3\u7801\u524d\u79fb\u4e4b\u7c7b\u7684\u4e86.\n\u7136\u540e\u53d1\u73b0\u539f\u6765\u5927\u5bb6\u4e5f\u90fd\u662f\u7528\u88c5\u9970\u5668+\u751f\u6210\u5668\u6765\u5199\u7684, \u597d\u50cf\u4e5f\u6ca1\u5565\u533a\u522b&hellip;<\/p>\n<p>\u8fc1\u79fb\u7684\u4e3b\u8981\u963b\u529b\u4e5f\u4e0d\u662f\u5404\u4e2a\u6846\u67b6\u5b9e\u73b0\u5f02\u6b65\u7684\u65b9\u5f0f\u4e0d\u540c, \u800c\u662f\u7528\u5230\u4e86\u6846\u67b6\u7684\u67d0\u4e9b\u7279\u6027, \u5728\u5176\u4ed6\u6846\u67b6\u91cc\u53ef\u80fd\u6ca1\u6709, <code>asyncio<\/code>\u6210\u4e3a\u6807\u51c6\u5e93\u4e5f\u6539\u53d8\u4e0d\u4e86\u8fd9\u4e00\u70b9.<\/p>\n<p>\u4e0d\u8fc7 python3.4 3.5 3.6 \u6dfb\u52a0\u4e86\u5f88\u591a\u65b0\u529f\u80fd,\u8bed\u8a00\u5c42\u9762\u7684\u5f02\u6b65\u652f\u6301\u8d8a\u6765\u8d8a\u597d\u4e86<\/p>\n<p>\u5728 3.4 \u5c31\u662f\u4e0a\u9762\u8bf4\u7684, \u5f15\u5165\u4e86<code>asyncio<\/code>\u7684\u6807\u51c6\u5e93.<\/p>\n<p>3.5 \u6709\u4e86\u4e00\u7cfb\u5217\u7684 bug fix ,\u53ef\u4ee5\u89c1<a href=\"https:\/\/aiohttp.readthedocs.io\/en\/stable\/faq.html#why-is-python-3-5-3-the-lowest-supported-version\">why-is-python-3-5-3-the-lowest-supported-version<\/a>, \u8fd8\u652f\u6301\u4e86<code>async\/await<\/code>\u8bed\u6cd5.<\/p>\n<p>\u4e0d\u8fc7 3.5 \u7684\u65f6\u5019<code>async\/await<\/code>\u8fd8\u4e0d\u662f\u5173\u952e\u5b57, \u8fd8\u53ef\u4ee5\u7ed9<code>async<\/code>\u8d4b\u503c, \u6240\u4ee5\u5230\u4e86 python3.7 \u7684\u65f6\u5019\u6302\u4e86\u4e00\u5806\u5e93, \u56e0\u4e3a\u4ed6\u4eec\u7528\u4e86<code>async<\/code>\u5f53\u53d8\u91cf&hellip;<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-python\" data-lang=\"python\"><span style=\"display:flex;\"><span><span style=\"color:#f92672\">import<\/span> asyncio\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">import<\/span> sys\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>print(sys<span style=\"color:#f92672\">.<\/span>version_info) <span style=\"color:#75715e\"># 3.5.4<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">async<\/span> <span style=\"color:#66d9ef\">def<\/span> <span style=\"color:#a6e22e\">hello<\/span>():\n<\/span><\/span><span style=\"display:flex;\"><span>    print(<span style=\"color:#e6db74\">&#34;Hello world!&#34;<\/span>)\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#75715e\"># \u5f02\u6b65\u8c03\u7528asyncio.sleep(1):<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    r <span style=\"color:#f92672\">=<\/span> <span style=\"color:#66d9ef\">await<\/span> asyncio<span style=\"color:#f92672\">.<\/span>sleep(<span style=\"color:#ae81ff\">1<\/span>)\n<\/span><\/span><span style=\"display:flex;\"><span>    print(<span style=\"color:#e6db74\">&#34;Hello again!&#34;<\/span>)\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">async<\/span> <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">1<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>print(<span style=\"color:#66d9ef\">async<\/span>)\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># \u83b7\u53d6EventLoop:<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>loop <span style=\"color:#f92672\">=<\/span> asyncio<span style=\"color:#f92672\">.<\/span>get_event_loop()\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># \u6267\u884ccoroutine<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>loop<span style=\"color:#f92672\">.<\/span>run_until_complete(hello())\n<\/span><\/span><span style=\"display:flex;\"><span>loop<span style=\"color:#f92672\">.<\/span>close()\n<\/span><\/span><\/code><\/pre><\/div><p>\u4f1a\u8f93\u51fa<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">1<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>Hello world!\n<\/span><\/span><span style=\"display:flex;\"><span>Hello again!\n<\/span><\/span><\/code><\/pre><\/div><p>\u4f46\u662f\u5982\u679c\u5230\u4e86 python3.7, \u4f1a\u62a5\u9519<code>SyntaxError<\/code>, \u4e5f\u56e0\u4e3a\u8fd9\u4e2a\u539f\u56e0\u6302\u4e86\u4e00\u5806\u5e93.<\/p>"},{"title":"\u4f7f\u7528webpack\u6253\u5305userscript","link":"https:\/\/blog.trim21.me\/2018\/10\/webpack-userscript\/","pubDate":"Wed, 03 Oct 2018 11:15:35 +0800","guid":"https:\/\/blog.trim21.me\/2018\/10\/webpack-userscript\/","description":"<p>\u539f\u672c\u7528\u7684\u662f grunt \u6765\u6253\u5305 webpack, \u4f46\u662f grunt \u53ea\u662f\u4f9d\u8d56\u4e8e\u7b80\u5355\u7684\u5b57\u7b26\u4e32\u66ff\u6362\u548c\u62fc\u63a5, \u6548\u7387\u8fc7\u4f4e.<\/p>\n<p>\u65e2\u7136 webpack \u53ef\u4ee5\u7528\u6765\u6253\u5305\u522b\u7684 js \u6587\u4ef6, \u90a3\u4e48\u6253\u5305\u4e00\u4e2a userscript \u80af\u5b9a\u4e5f\u6ca1\u4ec0\u4e48\u95ee\u9898, \u751a\u81f3\u5927\u6750\u5c0f\u7528\u4e86.<\/p>\n<p>\u6240\u4ee5\u81ea\u5df1\u5199\u4e86\u4e00\u4e2a\u6a21\u677f<a href=\"https:\/\/github.com\/Trim21\/webpack-userscript-template\">webpack-userscript-template<\/a><\/p>\n<p>\u56e0\u4e3a\u627e\u4e86\u4e00\u4e0b, \u53d1\u73b0\u76f8\u5e94\u7684\u5de5\u5177\u8fd8\u662f\u6709\u4e9b\u7f3a\u9677\u7684.<\/p>\n<p>\u4e3b\u8981\u6709\u4e24\u4e2a\u95ee\u9898:<\/p>\n<ol>\n<li>\u751f\u6210 userscript \u7684 meta \u6ce8\u91ca<\/li>\n<li>\u6ca1\u6709\u4e00\u4e2a\u597d\u7528\u7684 http client \u5e93.<\/li>\n<\/ol>\n<p>\u6240\u4ee5\u4e3a\u4e86\u81ea\u5df1\u5199 userscript \u723d\u4e00\u70b9, \u5199\u4e86\u4e24\u4e2a\u5e93\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898.<\/p>\n<p><a href=\"https:\/\/github.com\/Trim21\/userscript-metadata-webpack-plugin\">userscript-metadata-webpack-plugin<\/a>\u7528\u6765\u89e3\u51b3\u751f\u6210 meta \u7684\u95ee\u9898<\/p>\n<p><a href=\"https:\/\/github.com\/Trim21\/axios-userscript-adapter\">axios-userscript-adapter<\/a>\u662f axios \u7684\u4e00\u4e2a adapter, \u7528\u6765\u89e3\u51b3\u8fdb\u884c http \u8bf7\u6c42\u7684\u95ee\u9898.<\/p>\n<p>\u672c\u6765 github \u4e0a\u662f\u6709\u4e00\u4e2a webpack-userscript \u9879\u76ee\u7684, \u4f46\u662f\u91cc\u9762\u4e0d\u77e5\u9053\u4e3a\u4ec0\u4e48, \u6253\u5305\u7528\u5230\u7684\u662f bash, \u7406\u89e3\u4e0d\u4e86&hellip;\u5c31\u81ea\u5df1\u5199\u4e86\u4e00\u4e2a<a href=\"https:\/\/github.com\/Trim21\/webpack-userscript-template\">webpack-userscript-template<\/a><\/p>\n<p>\u4f7f\u7528 axios \u7684\u65f6\u5019\u4e0d\u8981\u5fd8\u4e86\u52a0\u5165 connect \u7684 meta<\/p>"},{"title":"bash\u548czsh\u7684\u81ea\u52a8\u8865\u5168","link":"https:\/\/blog.trim21.me\/2017\/12\/bash-zsh-autocompltion\/","pubDate":"Sat, 09 Dec 2017 09:58:46 +0800","guid":"https:\/\/blog.trim21.me\/2017\/12\/bash-zsh-autocompltion\/","description":"<p>\u6700\u8fd1\u5728\u7ed9\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\u8d21\u732e\u4ee3\u7801,\u60f3\u8981\u7ed9\u4ed6\u52a0\u4e0a\u76f8\u5e94\u7684\u81ea\u52a8\u8865\u5168\u529f\u80fd<\/p>\n<p><a href=\"https:\/\/github.com\/BGmi\/BGmi\">BGmi<\/a>\u8d77\u521d\u53ea\u662f\u4e2a cli \u7a0b\u5e8f,\u524d\u7aef\u5355\u7eaf\u7684\u5c55\u793a\u5df2\u7ecf\u4e0b\u8f7d\u7684\u5267\u96c6,\u540e\u6765\u7ed9\u524d\u7aef\u52a0\u4e86\u4e00\u4e9b\u8ba2\u9605\u529f\u80fd,\u4f46\u662f cli \u7684\u4f7f\u7528\u9891\u7387\u8fd8\u662f\u5f88\u9ad8,cli \u6ca1\u6709\u81ea\u52a8\u8865\u5168\u529f\u80fd\u603b\u662f\u8bf4\u4e0d\u8fc7\u53bb,\u6240\u4ee5\u5c31\u82b1\u4e86\u4e00\u4e9b\u65f6\u95f4\u52a0\u4e0a\u4e86\u8fd9\u4e2a\u529f\u80fd.<\/p>\n<h2 id=\"\u5206\u6790\u4e00\u4e0b\u9700\u6c42\">\u5206\u6790\u4e00\u4e0b\u9700\u6c42<\/h2>\n<p>BGmi \u7684\u547d\u4ee4\u90fd\u662f\u540c\u6837\u7684\u7ed3\u6784,<code>bgmi action1 --opt1 arg1 --opt2 arg2<\/code>,\u90a3\u4e48\u6211\u4eec\u9700\u8981\u8865\u5168\u7684\u5c31\u662f\u6240\u6709\u7684 action \u548c\u6bcf\u4e2a action \u76f8\u5e94\u7684\u9009\u9879\u4e86.\u5728\u6b64\u4e4b\u524d,\u662f\u76f4\u63a5<code>add_parser<\/code>\u548c<code>add_argument<\/code>\u76f8\u5e94\u7684 action \u548c\u9009\u9879.\u8fd9\u6837\u662f\u6ca1\u6cd5\u8fdb\u884c\u4e0b\u4e00\u6b65\u7684,\u6240\u4ee5\u9996\u5148\u82b1\u4e86\u4e00\u4e9b\u65f6\u95f4,\u6240\u4ee5\u9996\u5148\u628a\u6240\u6709\u7684<code>action<\/code>\u548c\u76f8\u5e94\u7684<code>opts<\/code>\u5b58\u5728\u4e86\u4e00\u4e2a\u53d8\u91cf\u4e2d<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-python\" data-lang=\"python\"><span style=\"display:flex;\"><span>actions_and_arguments <span style=\"color:#f92672\">=<\/span> [\n<\/span><\/span><span style=\"display:flex;\"><span>    {\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#e6db74\">&#39;action&#39;<\/span>: ACTION_ADD,\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#e6db74\">&#39;help&#39;<\/span>: <span style=\"color:#e6db74\">&#39;Subscribe bangumi.&#39;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#e6db74\">&#39;arguments&#39;<\/span>: [\n<\/span><\/span><span style=\"display:flex;\"><span>            {<span style=\"color:#e6db74\">&#39;dest&#39;<\/span>: <span style=\"color:#e6db74\">&#39;name&#39;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>             <span style=\"color:#e6db74\">&#39;kwargs&#39;<\/span>: dict(metavar<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#39;name&#39;<\/span>, type<span style=\"color:#f92672\">=<\/span>unicode_, nargs<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#39;+&#39;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>                            help<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#39;Bangumi name&#39;<\/span>), },\n<\/span><\/span><span style=\"display:flex;\"><span>            {<span style=\"color:#e6db74\">&#39;dest&#39;<\/span>: <span style=\"color:#e6db74\">&#39;--episode&#39;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>             <span style=\"color:#e6db74\">&#39;kwargs&#39;<\/span>: dict(metavar<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#39;episode&#39;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>                            help<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#39;Add bangumi and mark it as specified episode.&#39;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>                            type<span style=\"color:#f92672\">=<\/span>int), },\n<\/span><\/span><span style=\"display:flex;\"><span>        ]\n<\/span><\/span><span style=\"display:flex;\"><span>    },\n<\/span><\/span><span style=\"display:flex;\"><span>    {\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#e6db74\">&#39;action&#39;<\/span>: ACTION_DELETE,\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#e6db74\">&#39;help&#39;<\/span>: <span style=\"color:#e6db74\">&#39;Unsubscribe bangumi.&#39;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#e6db74\">&#39;arguments&#39;<\/span>: [\n<\/span><\/span><span style=\"display:flex;\"><span>            {<span style=\"color:#e6db74\">&#39;dest&#39;<\/span>: <span style=\"color:#e6db74\">&#39;--name&#39;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>             <span style=\"color:#e6db74\">&#39;kwargs&#39;<\/span>: dict(metavar<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#39;name&#39;<\/span>, nargs<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#39;+&#39;<\/span>, type<span style=\"color:#f92672\">=<\/span>unicode_,\n<\/span><\/span><span style=\"display:flex;\"><span>                            help<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#39;Bangumi name to unsubscribe.&#39;<\/span>), },\n<\/span><\/span><span style=\"display:flex;\"><span>            {<span style=\"color:#e6db74\">&#39;dest&#39;<\/span>: <span style=\"color:#e6db74\">&#39;--batch&#39;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>             <span style=\"color:#e6db74\">&#39;kwargs&#39;<\/span>: dict(action<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#39;store_true&#39;<\/span>, help<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#39;No confirmation.&#39;<\/span>), },\n<\/span><\/span><span style=\"display:flex;\"><span>        ]\n<\/span><\/span><span style=\"display:flex;\"><span>    }]\n<\/span><\/span><\/code><\/pre><\/div><p>\u4e00\u4e2a<code>list<\/code>\u4e2d\u50a8\u5b58\u4e86\u591a\u4e2a<code>dict<\/code>,\u6bcf\u4e2a<code>dict<\/code>\u5bf9\u5e94\u4e00\u4e2a<code>action<\/code>,\u6bcf\u4e2a<code>action<\/code>\u7684\u9009\u9879\u5b58\u5728<code>arguments<\/code>\u5b57\u6bb5\u4e2d.\u8fd9\u91cc\u7684\u547d\u540d\u53ef\u80fd\u6709\u4e9b\u6df7\u4e71,\u5199\u7684\u65f6\u5019\u6ca1\u592a\u6ce8\u610f.<\/p>"},{"title":"ubuntu\u4f7f\u7528\u547d\u4ee4\u91cd\u542f\u8fdb\u5165BIOS","link":"https:\/\/blog.trim21.me\/2017\/05\/ubuntu-reboot-to-bios\/","pubDate":"Fri, 19 May 2017 02:20:20 +0800","guid":"https:\/\/blog.trim21.me\/2017\/05\/ubuntu-reboot-to-bios\/","description":"<p>\u4eca\u5929\u4e00\u4e0d\u5c0f\u5fc3\u5f00\u4e86 BIOS \u91cc\u7684\u5feb\u901f\u542f\u52a8,\u5bfc\u81f4\u8fdb\u4e0d\u53bb BIOS \u8bbe\u7f6e\u4e5f\u65e0\u6cd5\u9009\u62e9\u542f\u52a8\u9879(\u6211\u8fd8\u628a ubuntu \u8bbe\u7f6e\u6210\u4e86\u7b2c\u4e00\u542f\u52a8\u9879&hellip;)\u767e\u5ea6\u641c\u7d22\u65e0\u679c,google \u53d1\u73b0\u4e86\u7ed3\u679c<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>sudo systemctl reboot --firmware-setup\n<\/span><\/span><\/code><\/pre><\/div><p>\u4f1a\u76f4\u63a5\u91cd\u542f\u8fdb\u5165 BIOS<\/p>"},{"title":"\u81ea\u52a8\u91cd\u65b0\u6784\u5efa\u90e8\u7f72\u535a\u5ba2","link":"https:\/\/blog.trim21.me\/2017\/05\/auto-deploy-with-webhook\/","pubDate":"Sun, 14 May 2017 04:57:28 +0800","guid":"https:\/\/blog.trim21.me\/2017\/05\/auto-deploy-with-webhook\/","description":"<p>\u60f3\u6298\u817e\u8fd9\u4e2a\u5f88\u4e45\u4e86,\u7ec8\u4e8e\u628a\u8fd9\u4e2a\u6298\u817e\u597d\u4e86.<\/p>\n<p>\u73b0\u5728\u5199\u535a\u5ba2\u7684\u6d41\u7a0b\u662f,\u6211\u5728\u672c\u673a\u7ef4\u62a4\u4e00\u4e2a git repo,\u91cc\u9762\u662f\u6211\u6240\u6709\u7684\u6587\u7ae0.\u7136\u540e\u6211\u5199\u5b8c\u4e00\u7bc7\u6587\u7ae0\u6216\u8005\u4fee\u6539\u4e86\u6587\u7ae0\u4e4b\u540e push \u5230 github \u4e0a\u53bb,\u76f8\u5e94\u7684 github pages \u5c31\u4f1a\u6839\u636e\u7528\u6765\u4fdd\u5b58\u6587\u7ae0\u7684 repo \u81ea\u52a8\u6700\u65b0\u7684\u72b6\u6001.<\/p>\n<p>\u539f\u672c\u662f\u5728\u81ea\u5df1\u7684 vps \u4e0a\u5f00\u4e86\u4e00\u4e2a\u670d\u52a1\u5668\u5904\u7406 webhook, \u73b0\u5728\u6362\u6210\u4e86<a href=\"https:\/\/travis-ci.org\/\">travis-ci<\/a>\u6765\u81ea\u52a8\u90e8\u7f72.<\/p>\n<p>\u4e0d\u5f97\u4e0d\u8bf4<a href=\"https:\/\/travis-ci.org\/\">travis-ci<\/a>\u662f\u4e2a\u597d\u4e1c\u897f. \u5982\u679c\u4f60\u662f\u5f00\u6e90\u9879\u76ee, \u662f\u53ef\u4ee5\u514d\u8d39\u4f7f\u7528\u7684, \u53ea\u6709 private \u7684\u4ed3\u5e93\u624d\u9700\u8981\u4ed8\u8d39.<\/p>\n<p>\u5199\u4e2a\u535a\u5ba2, \u81ea\u7136\u6240\u6709\u7684\u4e1c\u897f\u90fd\u662f\u516c\u5f00\u7684, \u7528\u4ed6\u6765\u6784\u5efa\u4e5f\u6ca1\u4ec0\u4e48\u95ee\u9898.<\/p>\n<p>\u552f\u4e00\u7684\u95ee\u9898\u662f, \u6784\u5efa\u4e4b\u540e\u7684\u90e8\u7f72\u9700\u8981\u5bc6\u94a5, travis \u81ea\u7136\u4e5f\u8003\u8651\u5230\u4e86\u8fd9\u79cd\u95ee\u9898, \u53ef\u4ee5\u5728<code>more options<\/code>- <code>settings<\/code> - <code>Environment Variables<\/code>\u4e2d\u6dfb\u52a0\u4fdd\u5bc6\u7684\u73af\u5883\u53d8\u91cf, \u8fd9\u6837\u4e00\u6765\u6211\u4eec\u53ea\u8981\u53bb github \u751f\u6210\u4e00\u4e2a\u53ef\u4ee5 push \u7684 token, \u7528\u8fd9\u4e2a token \u53c8\u53ef\u4ee5\u907f\u514d\u6cc4\u9732\u51ed\u8bc1\u4e2a\u7b2c\u4e09\u65b9, \u53c8\u53ef\u4ee5\u5229\u7528\u516c\u6709\u670d\u52a1\u64cd\u4f5c\u6211\u4eec\u7684\u4e2a\u4eba\u4ed3\u5e93.<\/p>\n<p>\u9996\u5148\u751f\u6210\u4e00\u4e2a token, \u8fd9\u4e2a\u6bd4\u8f83\u7b80\u5355<\/p>\n<p>\u56e0\u4e3a github pages \u8981\u6c42 push \u5230<code>${username}.github.io<\/code>\u7684\u4ed3\u5e93\u4e2d, \u6bd4\u5982\u6211\u7684\u7528\u6237\u540d\u662f<code>trim21<\/code>, \u6211\u5c31\u9700\u8981\u628a\u6587\u4ef6 push \u5230<code>trim21.github.io<\/code>\u53bb, \u6240\u4ee5\u6211\u4eec\u9700\u8981\u544a\u8bc9<code>hexo<\/code>\u4ed6\u8981\u64cd\u4f5c\u7684\u90e8\u7f72\u7684\u4ed3\u5e93\u5730\u5740.<\/p>\n<p>\u800c<code>_config.yml<\/code>\u91cc\u9762\u53c8\u4e0d\u80fd\u4f7f\u7528\u73af\u5883\u53d8\u91cf, \u53ea\u80fd\u6bcf\u6b21\u90e8\u7f72\u7684\u65f6\u5019\u628a\u5bf9\u5e94\u7684\u4ed3\u5e93\u94fe\u63a5\u7ed9 echo \u8fdb\u53bb, \u907f\u514d\u6cc4\u6f0f.<\/p>\n<p>\u6211\u7684<code>_config.yml<\/code>\u6587\u4ef6\u7ed3\u5c3e\u662f\u8fd9\u6837\u7684<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-yml\" data-lang=\"yml\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># Deployment<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">## Docs: https:\/\/hexo.io\/docs\/deployment.html<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">deploy<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">type<\/span>: <span style=\"color:#ae81ff\">git<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">branch<\/span>: <span style=\"color:#ae81ff\">master<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u7136\u540e echo \u5230<code>_config.yml<\/code><\/p>"},{"title":"\u6811\u8393\u6d3e\u63a7\u5236\u6b65\u8fdb\u7535\u673a","link":"https:\/\/blog.trim21.me\/2016\/08\/rasberrypi-and-stepping-motor\/","pubDate":"Sat, 13 Aug 2016 21:53:02 +0800","guid":"https:\/\/blog.trim21.me\/2016\/08\/rasberrypi-and-stepping-motor\/","description":"<p>\u6709\u4e00\u4e2a\u9898\u76ee\u9700\u8981\u7528\u6b65\u8fdb\u7535\u673a\u63a7\u5236\u8f6c\u901f,\u800c\u4e14\u9700\u8981\u63a7\u5236\u8f6c\u52a8\u7279\u5b9a\u7684\u89d2\u5ea6,\u6240\u4ee5\u627e\u5230\u4e86\u6b65\u8fdb\u7535\u673a\u8fd9\u79cd\u4e1c\u897f\u6765\u62cd\u7167.<\/p>"},{"title":"ubuntu\u5b89\u88c5matplotlib","link":"https:\/\/blog.trim21.me\/2016\/07\/matplotlib\/","pubDate":"Mon, 25 Jul 2016 19:26:07 +0800","guid":"https:\/\/blog.trim21.me\/2016\/07\/matplotlib\/","description":"<p>(\u53ef\u6076,git \u7528\u7684\u4e0d\u719f\u7ec3,\u628a commit \u4e22\u4e86&hellip;\u91cd\u5199\u6587\u7ae0)<\/p>\n<p>\u603b\u7ed3\u4e00\u4e0b,\u5728\u5b89\u88c5\u4e86<code>NumPy<\/code>\u4e4b\u540e\u8fd8\u9700\u8981\u5b89\u88c5<\/p>\n<ol>\n<li>freetype<\/li>\n<li>libpng<\/li>\n<li>libffi<\/li>\n<li>cairocffi<\/li>\n<\/ol>\n<p>freetype \u4e0b\u8f7d\u5730\u5740 <a href=\"http:\/\/download.savannah.gnu.org\/releases\/freetype\/\">http:\/\/download.savannah.gnu.org\/releases\/freetype\/<\/a><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>wget http:\/\/download.savannah.gnu.org\/releases\/freetype\/freetype-2.6.5.tar.gz\n<\/span><\/span><span style=\"display:flex;\"><span>tar xvf freetype-2.6.5\n<\/span><\/span><span style=\"display:flex;\"><span>sudo make\n<\/span><\/span><span style=\"display:flex;\"><span>sudo make install\n<\/span><\/span><\/code><\/pre><\/div><p>libpng \u548c libffi \u90fd\u5728 apt \u4e0a\u6709<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>\u279c  artic git:<span style=\"color:#f92672\">(<\/span>master<span style=\"color:#f92672\">)<\/span> \u2717 search libffi\n<\/span><\/span><span style=\"display:flex;\"><span>libffi-dev - Foreign Function Interface library <span style=\"color:#f92672\">(<\/span>development files<span style=\"color:#f92672\">)<\/span>\n<\/span><\/span><\/code><\/pre><\/div><div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>\u279c  artic git:<span style=\"color:#f92672\">(<\/span>master<span style=\"color:#f92672\">)<\/span> \u2717 search libpng\n<\/span><\/span><span style=\"display:flex;\"><span>libpng12-0 - PNG library - runtime\n<\/span><\/span><span style=\"display:flex;\"><span>libpng12-dev - PNG library - development\n<\/span><\/span><\/code><\/pre><\/div><p>\u76f4\u63a5 apt-get \u5b89\u88c5\u5373\u53ef<\/p>\n<p>\u8c03\u7528<code>matplotlib<\/code>\u7684\u65f6\u5019\u56fe\u50cf\u5f0f\u5168\u9ed1\u7684,\u63d0\u793a\u6211\u5b89\u88c5<code>cairocffi<\/code>,\u662f pip \u4e0a\u7684\u5305,\u5b89\u88c5\u4e86\u7b2c\u4e09\u4e2a\u4e4b\u540e\u76f4\u63a5<code>pip<\/code>\u5b89\u88c5\u8fd9\u4e2a\u5c31\u53ef\u4ee5\u4e86.<\/p>"},{"title":"\u5229\u7528hexo\u548cGitHub pages\u670d\u52a1\u642d\u5efa\u535a\u5ba2","link":"https:\/\/blog.trim21.me\/2016\/04\/build-blog-whith-hexo-and-github-pages\/","pubDate":"Sat, 16 Apr 2016 01:03:39 +0800","guid":"https:\/\/blog.trim21.me\/2016\/04\/build-blog-whith-hexo-and-github-pages\/","description":"<p>\u4f7f\u7528 GitHub actions \u81ea\u52a8\u90e8\u5c5e\u535a\u5ba2\u5230 GitHub pages\u3002<\/p>\n<h2 id=\"github-pages-\u4ecb\u7ecd\">GitHub Pages \u4ecb\u7ecd<\/h2>\n<p>github pages \u662f github \u63d0\u4f9b\u7684\u670d\u52a1\uff0cgithub \u4f1a\u4e3a\u7279\u5b9a\u4ed3\u5e93\u7684\u9ed8\u8ba4\u5206\u652f\uff08\u6bd4\u5982 <code>${username}.github.io<\/code> \uff09\u6216\u8005\u5176\u4ed6\u4ed3\u5e93\u7684 <code>gh-pages<\/code> \u5206\u652f\u63d0\u4f9b\u9759\u6001\u6587\u4ef6\u670d\u52a1\u3002<\/p>\n<p><code>${username}.github.io<\/code> \u4ed3\u5e93\u7684\u6587\u4ef6\u4f1a\u76f4\u63a5\u653e\u5728 <code>${username}.github.io<\/code> \u57df\u540d\u7684\u6839\u76ee\u5f55\u4e0b\uff0c\u5176\u4ed6\u7684\u4ed3\u5e93\u5219\u4f1a\u653e\u5728<code>\/${repo_name}\/<\/code> \u5b50\u76ee\u5f55\u4e0b\u3002<\/p>\n<p>\u6bd4\u5982\uff0c\u6211\u5728 <code>blog<\/code> \u4ed3\u5e93\u4e0b\u521b\u5efa <code>gh-pages<\/code> \u5206\u652f\uff0c\u5728\u6839\u76ee\u5f55\u521b\u5efa\u4e00\u4e2a <code>index.html<\/code> \u6587\u4ef6\u3002\u4ee5\u6211\u7684\u7528\u6237\u540d<code>trim21<\/code>\u4e3a\u4f8b\uff0c\u8bbf\u95ee <code>https:\/\/trim21.github.io\/blog\/index.html<\/code> \u5c31\u53ef\u4ee5\u6b63\u5e38\u770b\u5230\u6587\u4ef6\u3002<\/p>\n<h2 id=\"github-actions\">GitHub Actions<\/h2>\n<p>2019 \u5e74 GitHub \u4e0a\u7ebf\u4e86\u81ea\u5df1\u7684 CI\uff0c<a href=\"https:\/\/docs.github.com\/cn\/actions\">GitHub Actions<\/a>\uff0c\u5728\u6b64\u4e4b\u524d\u5927\u5bb6\u4e00\u822c\u4f1a\u4f7f\u7528 travis CI \u6216\u8005 circle CI \u7b49\u3002\u4f46\u662f\u76f4\u63a5\u7528 github actions \u53ef\u4ee5\u907f\u514d\u989d\u5916\u6ce8\u518c\u8d26\u53f7\uff0c\u8bbe\u7f6e github access token \u7b49\u7b49\u6743\u9650\u95ee\u9898\u3002<\/p>\n<p>\u6709\u4e86 github actions \u4e4b\u540e\u5c31\u4e0d\u518d\u9700\u8981\u535a\u5ba2\u63d0\u4f9b\u7684\u5404\u79cd\u90e8\u5c5e\u63d2\u4ef6\u4e86\uff0c\u53ea\u9700\u8981\u5728 github actions \u4e2d\u6784\u5efa\u535a\u5ba2\uff0c\u5e76\u4e14\u628a\u751f\u6210\u7684<code>public\/<\/code>\u6587\u4ef6\u5939\u63a8\u5230<code>gh-pages<\/code> \u5206\u652f\u5c31\u53ef\u4ee5\u4e86\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#f92672\">name<\/span>: <span style=\"color:#ae81ff\">build<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">on<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">push<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#f92672\">branches<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>      - <span style=\"color:#ae81ff\">master<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">jobs<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">main<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#f92672\">runs-on<\/span>: <span style=\"color:#ae81ff\">ubuntu-latest<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#f92672\">steps<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>      - <span style=\"color:#f92672\">uses<\/span>: <span style=\"color:#ae81ff\">actions\/checkout@v3<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>      - <span style=\"color:#f92672\">name<\/span>: <span style=\"color:#ae81ff\">Setup node<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#f92672\">uses<\/span>: <span style=\"color:#ae81ff\">actions\/setup-node@v3<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#f92672\">with<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>          <span style=\"color:#f92672\">node-version<\/span>: <span style=\"color:#e6db74\">&#34;16&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>      - <span style=\"color:#f92672\">name<\/span>: <span style=\"color:#ae81ff\">install<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#f92672\">run<\/span>: <span style=\"color:#ae81ff\">yarn<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>      - <span style=\"color:#f92672\">name<\/span>: <span style=\"color:#ae81ff\">build<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#f92672\">run<\/span>: <span style=\"color:#ae81ff\">yarn build<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>      - <span style=\"color:#f92672\">name<\/span>: <span style=\"color:#ae81ff\">Deploy<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#f92672\">uses<\/span>: <span style=\"color:#ae81ff\">peaceiris\/actions-gh-pages@v3<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#f92672\">with<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span>          <span style=\"color:#f92672\">publish_dir<\/span>: <span style=\"color:#ae81ff\">.\/public<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>          <span style=\"color:#f92672\">commit_message<\/span>: <span style=\"color:#ae81ff\">deploy ${{ github.ref }}<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>          <span style=\"color:#f92672\">cname<\/span>: <span style=\"color:#ae81ff\">blog.trim21.me<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>          <span style=\"color:#f92672\">github_token<\/span>: <span style=\"color:#ae81ff\">${{ secrets.GITHUB_TOKEN }}<\/span>\n<\/span><\/span><\/code><\/pre><\/div>"}]}}