-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
123 lines (113 loc) · 20.6 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>抽象工厂模式</title>
<url>/2025/02/14/abstract-factory/</url>
<content><![CDATA[<blockquote>
<p>一句话总结:提供成套的产品,就像一键换肤。</p>
</blockquote>
<img src="/images/car-factory.jpeg" alt="Car Factory" width="400px" />
<span id="more"></span>
<p>可以把 <code>抽象工厂</code> 想象成一个超级工厂,这个超级工厂不直接生产产品,而是生产工厂,被生产出来的工厂才负责生产产品。相当于这是一个两层结构的工厂体系:</p>
<ul>
<li>第一层:抽象工厂就像一个总设计师,它定义一系列的生产标准,也规定能生产哪些产品族,但它只是个蓝图,不生产任务和东西。</li>
<li>第二次:具体的工厂,就像一个总设计师下面的各个分厂的厂长,根据总设计师的生产标准,生产具体的产品族。</li>
</ul>
<h3 id="类比-🔄"><a href="#类比-🔄" class="headerlink" title="类比 🔄"></a>类比 🔄</h3><p><strong>汽车工厂</strong> 🚗</p>
<ul>
<li><strong>抽象工厂</strong> = 汽车制造标准(必须有发动机、轮胎、座椅)</li>
<li><strong>具体工厂</strong> = 特斯拉工厂(电机+空气轮胎+电竞座椅) vs 丰田工厂(燃油机+橡胶轮胎+织物座椅)</li>
<li><strong>客户端</strong> = 买车土豪:「我要一辆电动车!」→ 自动获得全套电动组件</li>
</ul>
<h2 id="设计思想-💡"><a href="#设计思想-💡" class="headerlink" title="设计思想 💡"></a>设计思想 💡</h2><ul>
<li><strong>封装变化:</strong> 当产品族发生变化时,只需添加新的具体工厂和产品,而无需修改客户端代码。</li>
<li><strong>依赖倒置原则:</strong> 客户端依赖于抽象而非具体,实现了高内聚低耦合。</li>
<li><strong>单一职责原则:</strong> 抽象工厂负责对象的创建,产品类负责对象的实现。</li>
</ul>
<h2 id="使用场景-⚙️"><a href="#使用场景-⚙️" class="headerlink" title="使用场景 ⚙️"></a>使用场景 ⚙️</h2><ul>
<li>系统需要独立于其产品的创建、组合和表示时。</li>
<li>系统需要由多个产品族中的一个来配置时。</li>
<li>产品之间存在依赖关系,需要确保它们的一致性时。</li>
</ul>
<h2 id="代码示例-💻"><a href="#代码示例-💻" class="headerlink" title="代码示例 💻"></a>代码示例 💻</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Engine</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">install</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Tyre</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">install</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Seat</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">install</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 电机</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">ElectricEngine</span>(<span class="title class_ inherited__">Engine</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">install</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"安装电机"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 空气轮胎</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">AirTyre</span>(<span class="title class_ inherited__">Tyre</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">install</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"安装空气轮胎"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 电竞座椅</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">GamingSeat</span>(<span class="title class_ inherited__">Seat</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">install</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"安装电竞座椅"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 燃油机</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">FuelEngine</span>(<span class="title class_ inherited__">Engine</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">install</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"安装燃油机"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 橡胶轮胎</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">RubberTyre</span>(<span class="title class_ inherited__">Tyre</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">install</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"安装橡胶轮胎"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 织物座椅</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">FabricSeat</span>(<span class="title class_ inherited__">Seat</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">install</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"安装织物座椅"</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">CarFactory</span>:</span><br><span class="line"> <span class="comment"># 组装</span></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">assemble</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">TeslaCarFactory</span>(<span class="title class_ inherited__">CarFactory</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">assemble</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"特斯拉组装"</span>)</span><br><span class="line"> ElectricEngine().install()</span><br><span class="line"> AirTyre().install()</span><br><span class="line"> GamingSeat().install()</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">ToyotaCarFactory</span>(<span class="title class_ inherited__">CarFactory</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">assemble</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"丰田组装"</span>)</span><br><span class="line"> FuelEngine().install()</span><br><span class="line"> RubberTyre().install()</span><br><span class="line"> FabricSeat().install()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">car_store</span>(<span class="params">factory: CarFactory</span>):</span><br><span class="line"> factory.assemble()</span><br><span class="line"></span><br><span class="line">car_store(TeslaCarFactory())</span><br><span class="line">car_store(ToyotaCarFactory())</span><br></pre></td></tr></table></figure>
<h2 id="参考资料-📚"><a href="#参考资料-📚" class="headerlink" title="参考资料 📚"></a>参考资料 📚</h2><ul>
<li><a href="https://refactoring.guru/design-patterns/abstract-factory">Refactoring Guru: 抽象工厂</a></li>
</ul>
]]></content>
<tags>
<tag>设计模式</tag>
</tags>
</entry>
<entry>
<title>Github Page + Godaddy + Cloudflare配置</title>
<url>/2024/04/01/github-page-godaddy-cloudflare/</url>
<content><![CDATA[<p>用 Github Page 搭建个人博客,域名在狗爹上买,域名托管和 CDN 用 cloudflare,本文记录下配置的过程。<br><img src="/images/github-page-godaddy-cloudflare.png"></p>
<span id="more"></span>
<h1 id="购买域名"><a href="#购买域名" class="headerlink" title="购买域名"></a>购买域名</h1><p>打开 <a href="https://www.godaddy.com/">Godaddy</a>,搜索心仪的域名,加购,支付,一波流结束。</p>
<h1 id="配置-Github-Page"><a href="#配置-Github-Page" class="headerlink" title="配置 Github Page"></a>配置 Github Page</h1><p>打开 <a href="https://github.com/">Github</a>,新建一个仓库,仓库名为 <code>username.github.io</code>,其中 <code>username</code> 是你的 Github 用户名。<br><img src="/images/repo-create-global-nav-update.png"><br>导航至仓库<code>settings</code>下的<code>Pages</code>目录,把部署来源改设置为<code>Deploy from a branch</code>。<br><img src="/images/github-page-source.png"></p>
<h1 id="配置自定义域名"><a href="#配置自定义域名" class="headerlink" title="配置自定义域名"></a>配置自定义域名</h1><h2 id="Cloudflare-域名托管"><a href="#Cloudflare-域名托管" class="headerlink" title="Cloudflare 域名托管"></a>Cloudflare 域名托管</h2><p>打开 <a href="https://www.cloudflare.com/">Cloudflare</a>,添加站点,输入购买的域名,选免费模式。<br><img src="/images/cloudflare-add-site.png"><br>添加 Github Pages 的<code>A</code>记录,指向以下的 IP 地址:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">185.199.108.153</span><br><span class="line">185.199.109.153</span><br><span class="line">185.199.110.153</span><br><span class="line">185.199.111.153</span><br></pre></td></tr></table></figure>
<p><img src="/images/cloudflare-dns-records.png"></p>
<h2 id="Godaddy-更改nameserver"><a href="#Godaddy-更改nameserver" class="headerlink" title="Godaddy 更改nameserver"></a>Godaddy 更改<code>nameserver</code></h2><p>打开<code>Godaddy</code>,找到域名管理,更改<code>nameserver</code>为<code>Cloudflare</code>提供的<code>nameserver</code>。<br><img src="/images/godaddy-nameservers.png"><br><img src="/images/cloudflare-nameservers.png"></p>
<h2 id="为域名增加-SSL-保护"><a href="#为域名增加-SSL-保护" class="headerlink" title="为域名增加 SSL 保护"></a>为域名增加 SSL 保护</h2><p>在<code>Cloudflare</code>的<code>SSL/TLS</code>设置中,开启<code>Full</code>模式,这样就可以为域名增加 SSL 保护。<br><img src="/images/cloudflare-ssl.png"></p>
<h1 id="Github-Page-配置自定义域名"><a href="#Github-Page-配置自定义域名" class="headerlink" title="Github Page 配置自定义域名"></a>Github Page 配置自定义域名</h1><p>在 Github 仓库的<code>settings</code>下的<code>Pages</code>目录,输入自定义域名。<br><img src="/images/github-page-custom-domain.png"></p>
<p>这一步做完后会在仓库的根目录下生成一个<code>CNAME</code>文件,里面存放的就是自定义域名。我们可以访问自定义域名来验证是否配置成功。<br>如果不成功,可以通过<code>dig</code>命令来查看域名解析情况。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">dig custom-domain.com</span><br></pre></td></tr></table></figure>
<p>另外也可以看看<code>cloudflare</code>中是否设置了<code>CNAME</code>的记录。</p>
]]></content>
<tags>
<tag>教程</tag>
</tags>
</entry>
<entry>
<title>Save time~亲测有效的ChatGPT充值方法</title>
<url>/2024/04/03/how-to-recharge-chatgpt/</url>
<content><![CDATA[<img src="/images/dalle-take-money.webp" alt="take-money" width="400px" />
<p><span style="font-style: italic; text-align: center"> Created by ChatGPT and me<span></p>
<span id="more"></span>
<p>经过长时间的使用和摸索,我终于找到了一个亲测有效的给 ChatGPT 充值的方法,本文记录下使用过程。有两种方式给 ChatGPT 充值,一是通过 Apple Store 的礼品卡,二是通过 nobepay 的虚拟信用卡。下面是具体的操作步骤。</p>
<h1 id="准备美区-Apple-ID-和梯子"><a href="#准备美区-Apple-ID-和梯子" class="headerlink" title="准备美区 Apple ID 和梯子"></a>准备美区 Apple ID 和梯子</h1><p>梯子可以购买,也可以自己搭建。购买的话,网上搜一下,很多。自己搭建的话,可以参考我非常尊敬的一位已故技术大牛陈皓的<a href="https://github.com/haoel/haoel.github.io">这篇文章</a>。</p>
<p>美区 Apple ID 注册可以参考<a href="https://shadowsockshelp.github.io/Shadowsocks/apple-id.html">注册美区 Apple ID 帐号的终极指南</a>和<a href="https://zhuanlan.zhihu.com/p/623576755">注册美国区 Apple ID 保姆级教程</a>。</p>
<blockquote>
<p>注意:AppStore 要一直保持登录美区的账号,否则 ChatGPT 会无法充值。</p>
</blockquote>
<h1 id="通过-Apple-Store-的礼品卡充值"><a href="#通过-Apple-Store-的礼品卡充值" class="headerlink" title="通过 Apple Store 的礼品卡充值"></a>通过 Apple Store 的礼品卡充值</h1><h2 id="1-打开支付宝(没错,就是支付宝)。"><a href="#1-打开支付宝(没错,就是支付宝)。" class="headerlink" title="1. 打开支付宝(没错,就是支付宝)。"></a>1. 打开支付宝(没错,就是支付宝)。</h2><p>把支付宝的地址改为美国的城市后,点击首页中间的「大牌礼卡」广告进去。</p>
<p><img src="/images/alipay-index.png"></p>
<h2 id="2-在礼品卡页面找到「更多大牌折扣礼卡」进去,找到-Apple-Store-的礼品卡,购买。"><a href="#2-在礼品卡页面找到「更多大牌折扣礼卡」进去,找到-Apple-Store-的礼品卡,购买。" class="headerlink" title="2. 在礼品卡页面找到「更多大牌折扣礼卡」进去,找到 Apple Store 的礼品卡,购买。"></a>2. 在礼品卡页面找到「更多大牌折扣礼卡」进去,找到 Apple Store 的礼品卡,购买。</h2><p><img src="/images/alipay-gift.png"><br><img src="/images/alipay-gift-card.png"></p>
<h2 id="3-打开-AppleStore-兑换礼品卡的兑换码。"><a href="#3-打开-AppleStore-兑换礼品卡的兑换码。" class="headerlink" title="3. 打开 AppleStore 兑换礼品卡的兑换码。"></a>3. 打开 AppleStore 兑换礼品卡的兑换码。</h2><p>购买完礼品卡后,等 2 分钟左右,订单的状态会变成「订单完成」状态,然后就可以在订单详情页看到兑换码了。<br><img src="/images/alipay-pockyt-order.webp"><br><img src="/images/alipay-apple-store-code.webp"></p>
<p>复制兑换码,打开 Apple Store,点击右上角的头像,选择「兑换礼品卡或代码」,输入兑换码。<br><img src="/images/apple-gitf-card.webp"></p>
<h2 id="4-ChatGPT-升级到-plus。"><a href="#4-ChatGPT-升级到-plus。" class="headerlink" title="4. ChatGPT 升级到 plus。"></a>4. ChatGPT 升级到 plus。</h2><p>先把梯子的代理模式设置为全局模式,如果点升级后发现升级按钮是灰色的,去检查登录的 Apple ID 是否是美区的。</p>
<h1 id="通过-nobepay-充值"><a href="#通过-nobepay-充值" class="headerlink" title="通过 nobepay 充值"></a>通过 nobepay 充值</h1><p>找了一圈虚拟信用卡的提供商,最后发现还是 nobepay 是最好用的。可以通过微信和支付宝充值,实在是太方便了。目前我觉的唯一不足是,一次最低充值额为 500 元,早期还能几十块钱充值,现在只能一次性充值 500 元了 😭。</p>
<h2 id="开卡"><a href="#开卡" class="headerlink" title="开卡"></a>开卡</h2><p>导航到「我的卡片」到「快速开卡」页面<br><img src="/images/nobepay-card.png"><br>这里尽量选新上线的卡段,避免有的卡段被风控了。还有个避免充值时被风控的方法是,虚拟卡的地址尽量要和当前梯子所在的 IP 地一致,这样我们就假装是原住民啦 😂。</p>
<h2 id="充值"><a href="#充值" class="headerlink" title="充值"></a>充值</h2><p>开完卡,往卡片里多充一点,比如 ChatGPT Plus 每月是 20$,那就不要只充20$,多个几$,避免被风控。虚拟卡充值完成以后,打开 ChatGPT,点击「升级到 Plus」,选择「信用卡」,输入虚拟卡的信息,然后期待能充值成功 😂。为了提高充值的成功率,可以从以下几方面改进:</p>
<ol>
<li>保持梯子的稳定,不要切换 IP,同时使用全局代理模式。</li>
<li>可以在浏览器的隐身模式中操作充值。</li>
</ol>
<p>给 OpenAI 充值,和给 ChatGPT 充值的操作是一样的,只是充值的金额不同,不过有个范围,最低是 5$,最多只能充39$。<br><img src="/images/openai-credit.png"></p>
]]></content>
<tags>
<tag>教程</tag>
<tag>ChatGPT</tag>
</tags>
</entry>
<entry>
<title>Python新特性 match-case 语句</title>
<url>/2024/05/31/how-to-use-python-match-case-statement/</url>
<content><![CDATA[<p>看了一堆 PEPs 和文章,日常不使用就忘了 😂。看来这个特性不是<code>everyday coding</code>中必用的,不过还是写个笔记再重新理解一下这个特性。</p>
<span id="more"></span>
<h1 id="match-case是什么?"><a href="#match-case是什么?" class="headerlink" title="match-case是什么?"></a><code>match-case</code>是什么?</h1><p><code>match-case</code>本质是<code>Pattern Matching</code>即模式匹配,这概念是从函数式语言如<code>Haskell</code>、<code>Scala</code>、<code>Erlang</code>等中借鉴过来的。一个<code>match</code>表达式包含多个<code>case</code>分支,每个<code>case</code>分支可能包含以下三个部分</p>
<ul>
<li>模式</li>
<li>可选的<code>if</code>条件</li>
<li>被执行的代码块</li>
</ul>
<p><code>match</code>会比较值(即<code>subject</code>)和每个<code>case</code>的模式,直到找到匹配的<code>case</code>,没有则执行默认的<code>case</code>。<br>初看这个语法,会想到<code>switch-case</code>,进而可能会想到以下类似的 demo</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">match</span> status_code:</span><br><span class="line"> <span class="keyword">case</span> <span class="number">200</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'success'</span>)</span><br><span class="line"> <span class="keyword">case</span> <span class="number">404</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'not found'</span>)</span><br><span class="line"> <span class="keyword">case</span> <span class="number">500</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'server error'</span>)</span><br><span class="line"> <span class="keyword">case</span> _:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'unknown status code'</span>)</span><br></pre></td></tr></table></figure>
<p>但,这并不是这个特性设计的初衷,它使用场景主要是为了支持<code>destructuring</code>和<code>binding</code>,其实就是<code>unpacking</code>。</p>
]]></content>
<tags>
<tag>Python</tag>
</tags>
</entry>
</search>