<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>2nthony</title><description>我是一名 web 前端程序员。</description><link>https://2nthony.com/</link><item><title>将 Cursor 按键变回 VS Code 风格</title><link>https://2nthony.com/posts/change-cursor-keybindings/</link><guid isPermaLink="true">https://2nthony.com/posts/change-cursor-keybindings/</guid><description>硬编码真难绷</description><pubDate>Mon, 26 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我发布了一个插件 &lt;a href=&quot;https://github.com/2nthony/vscode-preferences-for-cursor&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://github.com/2nthony/vscode-preferences-for-cursor&lt;/a&gt; ，这个插件目前的作用就是自带了一批按键配置，可以直接将所有按键前缀改回 &lt;code &gt;cmd+k&lt;/code&gt; 而不需要改动自己的按键配置文件，这更易于维护自己的配置文件。&lt;/p&gt;
&lt;p&gt;插件是参考  &lt;a href=&quot;https://github.com/tjx666/vscode-classic-experience&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://github.com/tjx666/vscode-classic-experience&lt;/a&gt; 的，不使用他的是因为这个插件带了一些作者个人风格的按键如将行内 AI 编辑的按键设定为 &lt;code &gt;cmd+e&lt;/code&gt; ，AI Chat 为 &lt;code &gt;cmd+]&lt;/code&gt; ，用了一天很不习惯。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Cursor 首次运行可以选择 VS Code 按键风格，但那不是真正的。&lt;/p&gt;
&lt;h2&gt;cmd+k 组合键&lt;/h2&gt;
&lt;p&gt;首先将 leader key 从 &lt;code &gt;cmd+r&lt;/code&gt; 改变回 &lt;code &gt;cmd+k&lt;/code&gt; ，这个操作实际上只是帮你将按键重新设置，并逐个添加到你的 &lt;code &gt;keybindings.json&lt;/code&gt; 中，不需要备份，但是如果你有很多个人定制不妨看一眼知道个位置。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2024/08/BPstPg.png?x-oss-process=style/jpg&quot; alt=&quot;BPstPg.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// 添加 cmd k ， 删除 cmd r&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+k cmd+c&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;editor.action.addCommentLine&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;when&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;editorTextFocus &amp;amp;&amp;amp; !editorReadonly&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+r cmd+c&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-editor.action.addCommentLine&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;when&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;editorTextFocus &amp;amp;&amp;amp; !editorReadonly&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;行内 AI 编辑&lt;/h2&gt;
&lt;p&gt;为了变为 Copilot 的风格，所以要用 &lt;code &gt;cmd+i&lt;/code&gt; 来触发编辑框。这些组合键需要在 Default Keyboard shortcuts 中找到并复制到自己的配置文件中，因为按键是有参数的，所以不能在 UI 界面改。这里包含了代码编辑器和终端的情况。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;shift+cmd+i&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aipopup.action.modal.generate&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;when&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;editorFocus&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;invocationType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;toggle&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+i&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aipopup.action.modal.generate&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;when&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;editorFocus&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;invocationType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;new&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+k&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-aipopup.action.modal.generate&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;when&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;editorFocus&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;shift+cmd+k&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-aipopup.action.modal.generate&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;when&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;editorFocus&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+i&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cursorai.action.generateInTerminal&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;when&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;terminalFocus &amp;amp;&amp;amp; terminalHasBeenCreated || terminalFocus &amp;amp;&amp;amp; terminalProcessSupported&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+k&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-cursorai.action.generateInTerminal&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;when&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;terminalFocus &amp;amp;&amp;amp; terminalHasBeenCreated || terminalFocus &amp;amp;&amp;amp; terminalProcessSupported&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;即使是将 &lt;code &gt;cmd+k&lt;/code&gt; 改到了 &lt;code &gt;cmd+i&lt;/code&gt; ， &lt;code &gt;cmd+k&lt;/code&gt; 在编辑框里面仍然生效，只能猜是硬编码导致的。&lt;/p&gt;
&lt;p&gt;在 issue 和 forum 也有用户反馈，都一年多了不回应也不改，虽然不是 Cursor 卖点但是对于有肌肉记忆的老 VS Code 用户来说非常不友好。&lt;/p&gt;
</content:encoded></item><item><title>一顿操作就为了能充值 OpenAI</title><link>https://2nthony.com/posts/charge-openai/</link><guid isPermaLink="true">https://2nthony.com/posts/charge-openai/</guid><description>完成了 1/3 数字移民</description><pubDate>Fri, 08 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近两个月，断断续续的在研究怎么充值 OpenAI ，直到这几天才&lt;span class=&quot;red&quot;&gt;&lt;b &gt;能&lt;/b&gt;&lt;/span&gt;把这件事完成。&lt;span class=&quot;red&quot;&gt;关键就是自己(自己名下)拥有境外的支付方式&lt;/span&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/12/jjlYsC.png?x-oss-process=style/jpg&quot; alt=&quot;jjlYsC.png&quot;&gt;&lt;/p&gt;
&lt;h3&gt;&lt;b &gt;OpenAI 这么麻烦，其实还有很多替代方案供我们选择&lt;/b&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Azure OpenAI 。微软合作版，不但容易开通而且还能支持国内的信用卡付款。唯一不足的仅仅是模型更新慢一个月左右、切换模型麻烦一点。切换模型其实也可以通过 Cloudflare worker 解决，我在&lt;a href=&quot;https://2nthony.com/posts/azure-openai-compat&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;上一篇博文&lt;/a&gt;中也介绍到。&lt;/li&gt;
&lt;li&gt;号商中转服务。Api Key 池，每次调用时合理分配。好处是能紧跟 OpenAI 模型更新。但是各号商定价参差不齐，有比官网模型定价便宜到离谱的，也有更贵的。&lt;/li&gt;
&lt;li&gt;捆绑业务。指的是在应用内购买 Credits ，而不需要自己提供 Api Key 。普遍这种服务的定价会根据 OpenAI 官方模型定价额外加收 10% ~ 30% 不等。一旦购买，这些 Credits 只能在这里用，如果有的选，这种方案是&lt;b &gt;最不推荐的&lt;/b&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;上述的替代方案中，只有 1 跟 2 是推荐的，但也各有利弊。1 是自己的号，能掌控全局；2 是省心，但不能确定号商会不会跑路或者被批量封号。&lt;/p&gt;
&lt;h3&gt;&lt;b &gt;开通所需服务&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;言归正传，为了能够充值 OpenAI ，我搜了不少资料，看了不少视频，在排除了各种乱七八糟不知名不认识的服务或应用，最终我需要开通的东西如下 3 个，文末有视频教程，有兴趣跟着操作就行：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;OCBC (Oversee-Chinese Banking Cooperation) 新加坡华侨银行&lt;/li&gt;
&lt;li&gt;Wise (原 TransferWise)&lt;/li&gt;
&lt;li&gt;(可选) Kraken 海妖交易所&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;OCBC 是当地实体银行。Wise 是跨境支付服务，账号很早就有，但是没有途径激活。重点是 kraken ，它跟在前文提到的排除的服务或应用中拥有类似的作用：将 USDT → 欧元 → Wise ；kraken 的优势是有网络报道它受欧洲部分地区监管，&lt;a href=&quot;https://cn.fazzaco.com/newsdetail/%E6%8E%A8%E8%BF%9B%E6%AC%A7%E6%B4%B2%E6%89%A9%E5%BC%A0kraken%E5%96%9C%E6%8F%90%E6%AC%A7%E7%9B%9F%E7%94%B5%E5%AD%90%E8%B4%A7%E5%B8%81%E7%89%8C%E7%85%A7%E5%B9%B6%E5%9C%A8%E8%A5%BF%E7%8F%AD%E7%89%99%E5%AE%8C%E6%88%90vasp%E6%B3%A8%E5%86%8C-298887&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;有爱尔兰中央银行授权&lt;/a&gt; ，Wise 虽然表示不接受虚拟货币交易所的钱，但是受监管的接受，&lt;span class=&quot;red&quot;&gt;&lt;b &gt;毕竟资金安全是非常重要的&lt;/b&gt;&lt;/span&gt;。距今几个月前的视频，有人通过它提现到 wise ，来源为 &lt;a href=&quot;https://find-and-update.company-information.service.gov.uk/company/08593670&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;b &gt;PAYWARD LTD.&lt;/b&gt;&lt;/a&gt; &lt;b &gt;，&lt;/b&gt;最近看到他的视频留意到他的 wise 号还在，算是让我放心一点。Kraken 可选的原因是，可以通过银行跨境汇款或者熊猫速汇将钱打进 OCBC 来代替，代价是他们的手续费都很贵，往下会解释我的资金流走向。&lt;/p&gt;
&lt;h3&gt;&lt;b &gt;绑定 OpenAI 支付&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;所有材料都准备好后，我打算使用 wise 开通的卡来绑定，结果意外的是 wise 的卡段已经被 OpenAI 拒绝了，上网搜一番看到 v2 的 &lt;a href=&quot;https://jp.v2ex.com/t/973637&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;wise 卡也被 declined 了 - V2EX&lt;/a&gt; 。那只好使用 OCBC 申请的 360 借记卡来绑定了。绑定成功后我填写充值 $5 ，之后便看到本文开头的那张图片；但这 $5 并未直接从 OCBC 卡里扣除。&lt;/p&gt;
&lt;p&gt;在 12 月 13 日发现了账单，账单日期是 12 月 9 日，扣除新加坡元 6.93 元，约合 $5.16 。&lt;/p&gt;
&lt;p&gt;Wise 卡段被拒的原因说不定也是被撸的多了，比如号商。现在 OCBC 的门槛下来了，万一也是因为撸多了被拒就一切回到解放前。&lt;/p&gt;
&lt;h3&gt;&lt;b &gt;资金流&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;最近的一笔资金流走向流程，也可能是我今后常用的(&lt;span class=&quot;red&quot;&gt;仅供参考&lt;/span&gt;)：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;交易所兑换的 USDT 转账到 kraken ，转账每笔手续费为 1USDT&lt;/li&gt;
&lt;li&gt;在 Kraken 交易所，将 USDT 兑换为欧元，损耗大约为 100USDT ≈ 1.6欧元&lt;/li&gt;
&lt;li&gt;在 Kraken 将欧元提现至 Wise ，通过 SEPA 的方式提现，提现每笔手续费为 1欧元，耗时大约半天&lt;/li&gt;
&lt;li&gt;欧元到账 Wise 后，再兑换为新加坡元，其中兑换手续费大约为 5欧元 ≈ 0.03欧元&lt;/li&gt;
&lt;li&gt;在 Wise 将新加坡元提现到 OCBC ，通过 PayNow 方式，手续费为 0 ，秒到&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其实可以直接提现欧元到 OCBC ，因为它支持欧元和其他多种货币。&lt;/p&gt;
&lt;h3&gt;&lt;b &gt;测试 API&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;充值成功后肯定要测试看看实际上能不能用了。&lt;/p&gt;
&lt;p&gt;默认情况下使用 gpt 4 vision 进行了几个测试，不能识别出图片的人物是谁，但是描述一张图片里有什么东西，比如 gentle smile 。另外测试过截图一段代码给他也能给我解释代码；将设计稿输出为代码经过几次测试效果一般。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/12/bJjUeY.jpg?x-oss-process=style/jpg&quot; alt=&quot;bJjUeY.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;玩了几次 vision 和几次 &lt;a href=&quot;https://github.com/abi/screenshot-to-code&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;abi/screenshot-to-code: Drop in a screenshot and convert it to clean code (HTML/Tailwind/React/Vue)&lt;/a&gt; 后，花费如下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/12/cBzBAn.png?x-oss-process=style/jpg&quot; alt=&quot;cBzBAn.png&quot;&gt;&lt;/p&gt;
&lt;h3&gt;&lt;b &gt;链接&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=M5wf8ZWCo_8&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;💳【快上车】0 成本新加坡华侨银行 OCBC 开户教程！OCBC APP 线上云开户秒开、怒省3000块、有实体卡！全套中国资料境外银行开户从未如此简单｜数字牧民LC - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mirror.xyz/0x31fdf33e75000121E150A12A340e2e3c4EbF57DD/B1H8XuwAOkmIBLubWDG2ZRSsuMYgyB-AHBDPXiCWOho&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;加密货币合规出金完整教程之3/4 入金kraken交易所再转到Wise — 0x31fd…57DD (mirror.xyz)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.barretlee.com/blog/2023/09/06/ocbc-bank/&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;新加坡华侨银行 OCBC 开户小记 | 小胡子哥的个人网站 (barretlee.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>记录：通过 Cloudflare workers 使 Azure OpenAI API 兼容 OpenAI API</title><link>https://2nthony.com/posts/azure-openai-compat/</link><guid isPermaLink="true">https://2nthony.com/posts/azure-openai-compat/</guid><pubDate>Wed, 29 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;目的：&lt;/p&gt;
&lt;p&gt;在 APP 端可以直接使用 OpenAI 设置。如果使用的是 Azure 设置在切换模型时&lt;span class=&quot;red&quot;&gt;需要手动&lt;/span&gt;改配置&lt;/p&gt;
&lt;p&gt;原脚本：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/haibbo/cf-openai-azure-proxy&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;haibbo/cf-openai-azure-proxy: A Cloudflare worker script to proxy OpenAI‘s request to Azure OpenAI Service (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;最近 Azure OpenAI 也发布了 GPT-3.5-turbo-1106 和 GPT-4-turbo 模型。但由于这些模型又在一些特定资源地区才能用，为了能够使用新模型我需要新创建一个对应地区的资源组，这样我就有了多个资源。&lt;span class=&quot;red&quot;&gt;所以我需要解决的问题是将脚本能支持保持一个入口来访问不同的资源组，换言之在 APP 端则是不用为了切换模型而改 Azure OpenAI 的设置。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;因此我做了以下优化，贴出关键代码可以抄作业：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * 将 mapper = {} 改为函数，key 不变，value 改为对应的资源组信息
 *
 * 创建一组环境变量
 *  - 其中 KEY 对内是用来验证 worker 的，对外则是当作 OpenAI API Key
 *  - 其他则是资源组的 key
 */&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// key: model, value: {}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMappers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;gpt-3.5-turbo&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// The name of your Azure OpenAI Resource.&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;resourceName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;region1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// The deployment name you chose when you deployed the model.&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;deploymentName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;deployment1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;apiKey&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;REGION_KEY1&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;gpt-3.5-turbo-16k&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;resourceName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;region2&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;deploymentName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;deployment2&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;apiKey&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;REGION_KEY2&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;gpt-4&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;resourceName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;region2&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;deploymentName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;deployment2&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;apiKey&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;REGION_KEY2&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&apos;gpt-4-1106-preview&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;resourceName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;region2&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;deploymentName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;deployment2&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;apiKey&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;REGION_KEY2&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; env&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ctx&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleRequest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; env&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ctx&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleRequest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; env&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ctx&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; modelName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; body&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; mappers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMappers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; options &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mappers&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;modelName&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; resourceName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; deploymentName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; apiKey &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options
  
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fetchAPI &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;resourceName&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.openai.azure.com/openai/deployments/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;deploymentName&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;path&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;?api-version=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;apiVersion&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; authKey &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;headers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Authorization&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;KEY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;KEY&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;authKey&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Bearer &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;KEY not allowed&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;403&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; payload &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;method&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;application/json&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;api-key&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; apiKey&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; body &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;object&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{}&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleModels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; mappers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMappers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; key &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; mappers&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;创建环境变量&lt;/h3&gt;
&lt;p&gt;Worker &amp;gt; Settings &amp;gt; Variables &amp;gt; Environment Variables&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/11/iFyuAp.jpg?x-oss-process=style/jpg&quot; alt=&quot;iFyuAp.jpg&quot;&gt;&lt;/p&gt;
&lt;h3&gt;实际场景示例&lt;/h3&gt;
&lt;p&gt;使用 &lt;a href=&quot;https://chatkit.app/&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://chatkit.app&lt;/a&gt; 举例，理论上支持其他支持自定义 OpenAI API Endpoint 的应用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/11/j1NFCD.jpg?x-oss-process=style/jpg&quot; alt=&quot;j1NFCD.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;OpenAI API Key 填的是自定义的 Key，正如代码块说明，对外则是当作 OpenAI API Key 。&lt;/p&gt;
</content:encoded></item><item><title>我的 RSS 阅读器上位替代</title><link>https://2nthony.com/posts/rss-reader-again/</link><guid isPermaLink="true">https://2nthony.com/posts/rss-reader-again/</guid><description>又在写 RSS 阅读器</description><pubDate>Tue, 12 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/09/HttrpP.png?x-oss-process=style/jpg&quot; alt=&quot;HttrpP.png&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;背景：我正在使用的两个 RSS 阅读器分别是 Reeder 5 和 &lt;span class=&quot;green&quot;&gt;Feedly&lt;/span&gt; web 。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;又花了大约一周的时间，写了一个 RSS 阅读器，浏览器扩展 App 。 &lt;/p&gt;
&lt;p&gt;下载 &lt;a href=&quot;https://chromewebstore.google.com/detail/rsskit/kgikhpcpcgfjeopgkndhelednaimfiog?hl=en&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Chrome Web Store&lt;/a&gt; ，更新历史 &lt;a href=&quot;https://2nthony.notion.site/76519e9058b942a98a2a31743b17d586?v=3413af20620b4a86b9d9ce905c271dd5&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;RSSkit Changelog&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;b &gt;我的一些需求&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;b &gt;AI 总结&lt;/b&gt;。就是总结这篇文章主要讲了什么，有些文章很长的，或者非中文的，就可以给它总结一下，快速了解主要讲什么是否让我感兴趣，还可以充当翻译，总结一次即可持久存在。跟其他 app 一样，需要在设置里配置 key ，endpoint ，model 和 默认 prompt ，支持 openai 和 azure openai 。效果如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/09/KX6xYs.jpg&quot; alt=&quot;KX6xYs.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;b &gt;Reader View&lt;/b&gt; 。 类似 Reeder 的客户端的 Reader View 功能，&lt;b &gt;因为有些 feed post 只输出内容片段，或者不含媒体内容(如图片)，又或者这篇博文只挂了一个视频等&lt;/b&gt;，上图中有几个 feeds 就有这种情况，所以这个功能对我来说是挺重要的。用开头的文章来作为示例(留意高亮选中文本)：&lt;/p&gt;
&lt;p&gt;这是 feed post 内容：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/09/Bd9D4Y.jpg&quot; alt=&quot;Bd9D4Y.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;这是 reader view 模式的内容：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/09/L3EABH.jpg&quot; alt=&quot;L3EABH.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;b &gt;代码块高亮&lt;/b&gt;。有点意外我正在使用的两款阅读器都不支持，不是刚需但是有高亮会提升阅读体验。&lt;/p&gt;
&lt;p&gt;&lt;b &gt;轻，快，web&lt;/b&gt;。比起桌面级应用，我只需要在浏览器扩展列表上用鼠标点一下即可，而不再需要敲键盘 &lt;code &gt;cmd + space, [reader], enter&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;其他不一一列举，还有不少需求都是我主动创造出来的需求，包括上面几个也是。&lt;/p&gt;
&lt;p&gt;另外意外的通过 RSSHub Radar 发现有个人 GitHub feeds 订阅，刚好可以临时解决现在看不到动态的问题。&lt;/p&gt;
&lt;h2&gt;&lt;b &gt;Roadmap&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;我仍然需要添加一些基本功能才能让它变得基本完整。&lt;/p&gt;
</content:encoded></item><item><title>写代码还有热/激情吗?</title><link>https://2nthony.com/posts/passion-of-coding/</link><guid isPermaLink="true">https://2nthony.com/posts/passion-of-coding/</guid><description>廉颇老矣，尚能饭否？</description><pubDate>Sun, 16 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在今年的上半年，共计有两个人直接或间接问了我这样的问题。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/07/RbNJKV.png&quot; alt=&quot;RbNJKV.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/07/1oHqmd.png&quot; alt=&quot;1oHqmd.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;第一个回复了邮件是比较肯定的回答，因为当时我在写一个 coin-ticker 的状态栏应用。第二个群聊好像是间接回应了现在热情比较少🥲。这其中从有到少只差了 4 个月而已。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;公司项目由于很多&lt;b &gt;历史原因&lt;/b&gt;，很难会有热情；如不知道“怎么”写代码。&lt;/p&gt;
&lt;p&gt;个人项目会好一些，也是由于我近期的个人项目自己都会用，所以会尽可能的让自己舒适，或许这就是热情的来源；如打造 vim 编辑器，个人新玩具。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;最近正好上头想玩点新东西，也很烦 Days matter(倒数日) app 有太多信息干扰，于是动手写了一个替代品： &lt;a href=&quot;https://inkdays.vercel.app/&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Inkdays&lt;/a&gt; 。到现在花了差不多24小时 🤔 ，如果一开始就用 &lt;span class=&quot;blue&quot;&gt;React&lt;/span&gt; 和探索 jotai 的话可能会少点。本来是用 &lt;span class=&quot;green&quot;&gt;Vue&lt;/span&gt; 的，接近两年没系统应用变得有点陌生，略遗憾。&lt;/p&gt;
&lt;p&gt;这个项目所有应用到的第三方库之中我最喜欢的是 &lt;a href=&quot;https://jotai.org/&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;jotai&lt;/a&gt; ，最基础的 api 就像 VueUse 的 &lt;code &gt;createGlobalState&lt;/code&gt; 那样，让我惊讶的是在 &lt;span class=&quot;purple&quot;&gt;Redux&lt;/span&gt; 系之外状态管理还能这么简洁。&lt;/p&gt;
&lt;p&gt;以后有兴趣再探索一下 jotai 的更多场景。&lt;/p&gt;
&lt;p&gt;个人感想。&lt;/p&gt;
&lt;p&gt;系列扩展阅读&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://colmugx.github.io/blog/2023/07/20/passion-of-coding/&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;写代码还有激情吗？- Colmugx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>使用  tauri-app 写了一个 Menubar app (coin ticker)</title><link>https://2nthony.com/posts/tauri-menubar-app/</link><guid isPermaLink="true">https://2nthony.com/posts/tauri-menubar-app/</guid><description>小试牛刀 coin ticker</description><pubDate>Sun, 12 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AI 总结&lt;/p&gt;
&lt;p&gt;这篇博客主要是作者分享了他最近写的一个还未完成的 menubar app，并提供了参考的应用和开源代码链接。作者解释了他写这个app的原因，并表示核心功能已经完成，但样式方面有些懒得去做。作者提到了他在隐藏menubar图标方面遇到的问题，并介绍了他目前的解决方案。&lt;/p&gt;
&lt;p&gt;博客还提供了一组系统资源占用数据的对比，将作者的应用与Coin Tick原版进行了比较。尽管作者的应用在CPU和内存方面的占用略高于原版，但作者认为这并不是大问题。&lt;/p&gt;
&lt;p&gt;最后，作者列举了一些他认为tauri app可以实现的功能，包括轻量级的spotlight、图床上传和根据机器负载情况显示状态栏上的跑步猫等。&lt;/p&gt;
&lt;p&gt;总的来说，这篇博客介绍了作者正在开发的menubar app，并分享了他的一些想法和解决方案。读者可以了解到作者的动机、进展情况以及可能的功能扩展。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/02/fCJ24X.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;最近花了几个晚上，写了一个还未完成的 menubar app ，大致上参照 &lt;a href=&quot;https://apps.apple.com/us/app/coin-tick-menu-bar-crypto/id1141688067?mt=12&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Coin Tick&lt;/a&gt; 实现，代码也开源：&lt;a href=&quot;https://github.com/2nthony/coin-ticker&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;2nthony/coin-ticker&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;原因是不久前发现 tauri app 在 menubar 上表现还挺可以的，于是也想着写一个 app 玩玩。到今天为止核心功能的完成度已经可以了，起码对我自己来说是；样式啥的懒得写了，又不是天天蹲着这些界面看🤨。&lt;/p&gt;
&lt;p&gt;&lt;b &gt;唯一瑕疵是我还未找到有什么办法隐藏 menubar 的图标&lt;/b&gt;，因为我觉得有点多余。目前的解决方案是创建一个 Empty 图标，瑕疵是看上去是空的，实际上是有一个标准大小的空占位，所以当图标排列开后看上去会很别扭：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-rust&quot;&gt;let tray = SystemTray::new()
    .with_menu(tray_menu)
    .with_icon(Icon::Rgba {
        rgba: vec![0, 0, 0, 0],
        width: 1,
        height: 1,
    });
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;p&gt;这是一组系统资源占用数据对比，虽不及原生节省，但无伤大雅。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Coin Tick 原版&lt;/th&gt;
&lt;th&gt;Coin Ticker 文中介绍的&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;常态小于 1&lt;/td&gt;
&lt;td&gt;常态小于 1 * 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内存(MB)&lt;/td&gt;
&lt;td&gt;≈46&lt;/td&gt;
&lt;td&gt;60 + 36 + 8 ≈ 100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;tauri app 能做的事情，貌似还&lt;span class=&quot;red&quot;&gt;&lt;b &gt;能&lt;/b&gt;&lt;/span&gt;有很多：列一些脑洞（&lt;span class=&quot;red&quot;&gt;&lt;b &gt;可以&lt;/b&gt;&lt;/span&gt;是替代品、社区上已有的实现，不一定有实现的价值&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;轻量的 spotlight ，可以模拟实现一些插件，例如运行一些命令行，&lt;code&gt;@bitwarden/cli&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;图床上传&lt;/li&gt;
&lt;li&gt;根据机器负载情况状态栏有只猫的跑路速度（社区有&lt;ul&gt;
&lt;li&gt;tauri 有更新托盘图标的 api&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2022 回顾</title><link>https://2nthony.com/posts/2022/</link><guid isPermaLink="true">https://2nthony.com/posts/2022/</guid><description>焦虑，taylorfakefan</description><pubDate>Fri, 20 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/01/tQN03e.heic!jpg&quot; alt=&quot;雪山与满月&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;今年看到的灵魂问题，”你对现在满意吗？“，”那么，古尔丹，代价是什么呢？“&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;开源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/2nthony/ghq&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ghq&lt;/a&gt; ，使用 node 实现的一个版本，本质上只是封装了 git 的部分命令并加以优化，集中管理 git 仓库的工具。其实大部份情况下使用 git 或者 degit 就足够了。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/2nthony/blogkit&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;blogkit&lt;/a&gt; ，它的目标是一个通用的博客工具，通过 theme 以及 api 接口可以组合成任意的博客网站，并且 theme 和 api 适配都可以通过 npm 分享。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/2nthony/nofeedback&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;nofeedback&lt;/a&gt; ，是一个可以嵌(embed)在 notion 页面的反馈表单组件，应用场景是一些以 notion 为主的文档可以嵌入该组件获得用户的反馈，由于是通过 iframe 嵌入实现的，所以也可以应用到任意网页上。相比起 notion forms ，nofeedback 场景单一，免费，自部署。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/2nthony/vercel-toast&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;vercel-toast&lt;/a&gt; ，这已经是 3 年前的老项目了，也只是一个消息弹出框。让我惊讶的是这东西今年在 npm 上的每月下载量竟然能保持在 1.8k 左右，最高到了 2.2k ，上年平均只有 1k ，不知道这东西的需求在哪里。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/2nthony/vitesse.nvim&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;vitesse.nvim&lt;/a&gt;, &lt;a href=&quot;https://github.com/2nthony/vitesse.iterm&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;vitesse.iterm&lt;/a&gt; ，两个自用主题，参考 vscode-theme-vitesse 实现。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;工作&lt;/h2&gt;
&lt;p&gt;首先非常感谢前同事 &lt;a href=&quot;https://github.com/colmugx&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;@colmugx&lt;/a&gt; 给我提供了一次面试机会，最终我还是以远程工作的方式开始了今年的工作生涯。&lt;/p&gt;
&lt;p&gt;此次的工作变化最大的并非工作方式，而是技能，我需要使用 React 及其生态来工作。在此环境下，我没有去过多的了解 React 本身，只是了解一些基本的知识以及项目本身所应用到的具体 API 范围，因为在 UI 层面上，现代框架/库都有很多相似之处。&lt;/p&gt;
&lt;p&gt;所以大多数情况下，我都是在做 UI 。&lt;/p&gt;
&lt;h3&gt;远程工作&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;每个团队都可能不一样。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span class=&quot;red&quot;&gt;&lt;b &gt;我的感受是除了环境不是枯燥的写字楼外，基本上与正常坐班是一致的，只是额外附带一定的自由度，并且环境可以是自己认为最舒适的。&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;说起远程工作，这是我从至少 4 年前就开始期待这样的工作方式，不用通勤挤地铁。我目前所在的团队属于小型创业团队，现在是 4 个人。一天的工作内容大致如下，早上开一个视频会议，之后根据上班时间自行安排工作，期间有需要的话会文字或者视频与同事交流。迭代计划是每两周一个迭代，遵循 SCRUM 的方式，每个迭代的第一天复盘上个迭代完成度，之后会安排这个迭代的内容。&lt;/p&gt;
&lt;p&gt;&lt;b &gt;我正常工作日的一天大概是这样的&lt;/b&gt;：早上10点开会，会后有时候我会去打一壶豆浆（大约3分钟）又或者整一杯手冲咖啡粉，回到电脑面前边吃面包边看 issues ；11点左右开始犹豫点什么外卖（不自己做是因为我觉得花的时间很多），再开始工作，大约12点外卖到后就吃。下午2点左右到晚上接近7点都是在工作，之后就去做晚饭；晚上的时间会在 看资料、看视频、娱乐等等看实际需要做出选择。&lt;/p&gt;
&lt;h2&gt;阅读&lt;/h2&gt;
&lt;p&gt;上年定了个阅读 10 本书的目标，实际上只阅读了甚至不到 3 本，其实我把读书的时间都花在了“学习”上。&lt;/p&gt;
&lt;h2&gt;学习/收获&lt;/h2&gt;
&lt;h3&gt;React 系&lt;/h3&gt;
&lt;p&gt;除去 React 本身外，其实我更多的是去&lt;b &gt;了解&lt;/b&gt;其生态库，比如 redux, native, nextjs, easy-peasy 等等，除了能应付工作外，还为下面的一些项目作铺垫。&lt;/p&gt;
&lt;h3&gt;发布了一个安卓应用（半成品）&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.pecoapp.rss&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Peco - Apps on Google Play&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Peco 是一个 RSS 阅读工具，基于 Ionic Framework 框架实现。我发布这个是为了测试，并且让我具备发布 Android 应用到 Google Play 的条件（交了 25 美元开通了开发者账号）。&lt;/p&gt;
&lt;p&gt;期间有个插曲是我打算使用 React Native 来重写以获得更好的体验，于是开始学习并赶上同样的进度后发现，除了页面过渡效果变好之外，实际阅读体验感觉大不如前，Markdown 的处理是让我比较头痛的，如果是嵌套 webview 体验真的很差，于是退回了 Ionic Framework 版本，毕竟这个项目是打算快速发布的，所以不打算让它阻塞发布日期🤨。&lt;/p&gt;
&lt;h3&gt;发布了一个浏览器扩展&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/blank-tab/mdcofpcmhlfopbnpankpmpgheekbppik?hl=en&amp;authuser=0&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Blank Tab - Chrome Web Store&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Blank Tab 是将浏览器的首页变为空白页，其实这类扩展多到溢出，我发布这个也只是为了测试玩玩，并且让我具备发布浏览器扩展的条件（交了 5 美元开通了开发者账号）。&lt;/p&gt;
&lt;p&gt;在最初接触扩展时屡屡碰壁，因为 Chrome 需要将标准从 Manifest V2 升级到 V3 ，我不太会翻 Chrome Extension 的文档，搜到的其他资料教程很多都是落后的，所以我感到比较困难。直到我发现了 &lt;a href=&quot;https://github.com/PlasmoHQ/plasmo&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;PlasmoHQ/plasmo: 🧩 The Browser Extension Framework &lt;/a&gt;框架，在这个框架的帮助下，我很快就能做到我想要的样子（并不是空白页这种简单的功能）。&lt;/p&gt;
&lt;h3&gt;发布了一个 devlog 视频&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=cz3qumY1UdQ&amp;ab_channel=2nthonyHu&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;[devlog] React Native adding code syntax highlighting for markdown content - YouTube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1tY411o7bX/?vd_source=38a6263eb4cb18c533ff9aeb7e8a8c2a&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;[devlog] 为 React Native 添加 Markdown 代码高亮_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一直以来我都非常喜欢 &lt;a href=&quot;https://www.youtube.com/@devaslife&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;devaslife&lt;/a&gt; 的 ASMR 视频，我很震撼写代码本身也能如此赏心悦目，为什么要在 Vim 上写代码也是受他影响。&lt;/p&gt;
&lt;p&gt;在尝试 React Native 的时候我也录制了一个类似的视频玩玩，由于我不具备视频相关的知识，因此这个视频相比起 devaslife 显得非常平庸。在写代码的过程中我经常卡顿，流畅度对比起来真是一个天一个地。&lt;/p&gt;
&lt;p&gt;这个视频发布后，我在推特上发了一个推，并没有 @devaslife ，可能是由于关键字 &lt;code &gt;devaslife&lt;/code&gt; ，他看到并回复了一句 &lt;code &gt;Noice&lt;/code&gt; (英伦腔发音的 &lt;code &gt;Nice&lt;/code&gt;)。随后这个视频的播放量就开始上来了，到现在为止大约 600 播放，果然有人引流就是不一样🤨！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/01/4JWFY0.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2&gt;社交&lt;/h2&gt;
&lt;p&gt;一次偶然的机会，我在闲鱼以面交的方式认识了一位很特别的人，其中的一个特别的点是&lt;span class=&quot;red&quot;&gt;养爬宠&lt;/span&gt;，在认识他之前我虽然看过爬宠但还没产生兴趣，最终还是受他影响开始养了。&lt;/p&gt;
&lt;h2&gt;新事物&lt;/h2&gt;
&lt;h3&gt;爬宠豹纹守宫&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/01/WXFVpp.heic!jpg&quot; alt=&quot;早年抓拍到 rua 的瞬间&quot;&gt;&lt;/p&gt;
&lt;p&gt;我是被它可爱的外表吸引才开始注意到这类宠物的，最终产生饲养兴趣是受上面提到的特别朋友影响。&lt;/p&gt;
&lt;p&gt;守宫的种类很多，价格也因不同种类，花纹，基因等而不同，低一两百，高不封顶，我目前得知最贵的一种报价接近 10 万人民币，好像是睫角守宫莉莉白，其实还有更高的。而我的选择则就很明确了，入门且低价即可。&lt;/p&gt;
&lt;p&gt;它的饲养方式有点简单，一个类似于收纳盒的盒子，一个躲避（也就是家？），一个水盆，一个食盆足以。唯一难的是需要留意环境温度（30度上下3度），湿度（40度？蜕皮期最好保持60度左右），喂虫子（面包虫即可），蜕皮（如果卡皮需要帮忙，一般不需要）。&lt;/p&gt;
&lt;h2&gt;推荐音乐&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;听就是了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Taylor Swift （一个女人）&lt;/h3&gt;
&lt;p&gt;今年我越来越喜欢这个女人，曾一度想买一些周边🤨。这样一位集可爱、迷人、美丽、&lt;s &gt;倒霉&lt;/s&gt;于一身，我愿称之为”仙女下凡“。所以，我把他的歌几乎都听了个遍。&lt;/p&gt;
&lt;h3&gt;Cannons （一支复古电子音团队）&lt;/h3&gt;
&lt;p&gt;Bad dream 最高单曲循环了一天。&lt;/p&gt;
&lt;h2&gt;焦虑&lt;/h2&gt;
&lt;p&gt;今年我感知到可能有些焦虑，或许是受到一些“贩卖焦虑”的影响，或许是看着别人的 Side Project 很高的月盈收影响，以至于有时候会想“我还能干什么”。&lt;b &gt;一切恐惧源于火力不足&lt;/b&gt;。&lt;/p&gt;
&lt;h2&gt;展望 2023&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Micro SaaS&lt;/li&gt;
&lt;li&gt;blogkit 做一些合理的改动&lt;/li&gt;
&lt;li&gt;阅读，也多看看别人的博客&lt;/li&gt;
&lt;li&gt;保持构建 &lt;a href=&quot;https://github.com/timqian/sideproject.guide&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Side Projects&lt;/a&gt; ，同时要避免随处可见的&lt;/li&gt;
&lt;li&gt;至少再发布一个 coding ASMR 视频&lt;/li&gt;
&lt;li&gt;去一个地方走走&lt;/li&gt;
&lt;li&gt;搞多点猎奇食物&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>发布了一个手机 App</title><link>https://2nthony.com/posts/released-a-mobile-app/</link><guid isPermaLink="true">https://2nthony.com/posts/released-a-mobile-app/</guid><description>全新领域的尝试</description><pubDate>Mon, 17 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span class=&quot;gray&quot;&gt;&lt;s &gt;更新：正在用 React Native 写。&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这份粮食，我自己都不吃！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;我想开发 App 的原因其实是几个月前看到的一篇文章：&lt;a href=&quot;https://mp.weixin.qq.com/s/72gzhy9L8DqdxruRDs8X8A&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;b &gt;我用一个跨平台 Web 应用替换了原生 iOS 应用，竟没人发现&lt;/b&gt;&lt;/a&gt; 。当时我不禁产生疑问，&lt;span class=&quot;red&quot;&gt;现在 Web 套壳应用在手机上性能表现已经好到没人发现了吗？&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;尝试&lt;/h2&gt;
&lt;p&gt;带着这个疑问，我也尝试了 &lt;a href=&quot;https://ionicframework.com/&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ionicframework&lt;/a&gt; ，&lt;b &gt;随便&lt;/b&gt;写了一个计时器叫做 Timer It ，它现在可以在 &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.timerit.app&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Google Play&lt;/a&gt; 中下载到，为此我还交了 25 美元的开发者帐号费用，目前也只能在 Google Play 中下载，不发布 App Store 是因为这个东西根本不值得 99 美元的年费开发者帐号。&lt;/p&gt;
&lt;h3&gt;结果表现&lt;/h3&gt;
&lt;p&gt;录制了一个 GIF 在 Android 模拟器上的表现。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/10/JsCleh.gif&quot; alt=&quot;JsCleh.gif&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;red&quot;&gt;性能表现还能接受&lt;/span&gt;。因为这只是一个计时器，首页就是一个等待开始计时的时间和一个按钮，核心功能上几乎完全不吃性能。但是通过一些插件调用原生 API 我感觉有一点延迟感，如果播放声音的话我会感觉延迟了大约几十毫秒才开始播放，或许这就是与原生通讯的过程所产生的时差吧。&lt;/p&gt;
&lt;p&gt;设置页上有一个时间选择器，操作起来有明显的掉帧感，跟 iOS 上时钟的计时器对比就会有一种 30 帧 VS 60 帧的感觉，或许因为 Swiper.js 套 Swiper.js 的原因，又或许是渲染的 DOM 节点过多的原因，这个原因以后有时间再去研究，也正是这个原因，我才把时间选择器从首页移动到了设置页。&lt;b &gt;本来的设计是，进来就是设定周期时间，点 Start 再开始计时&lt;/b&gt;，参考 iOS 上时钟的计时器。&lt;/p&gt;
&lt;h2&gt;上架到 Google Play 与更新&lt;/h2&gt;
&lt;p&gt;作为全新领域，从开通开发者帐号到上架商店，过程上当然会有阻难，不过好在是他们都不难解决。&lt;/p&gt;
&lt;p&gt;第一次上架审核的过程比较长，大约 4、5 天我才收到审核通过的邮件，后续我也有个几次迭代更新，审核速度最短的一次不到 2 小时。&lt;/p&gt;
&lt;p&gt;从上架成功的那一刻开始，这个 App 的开发也基本宣布结束了，后续的迭代更新也只是为了探索与尝试，因为自打一开始这个 App 就是为了&lt;b &gt;做实验&lt;/b&gt;的。&lt;/p&gt;
&lt;h2&gt;想要开发的 Apps&lt;/h2&gt;
&lt;p&gt;其实我想要开发的 apps 是非常多的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b &gt;RSS 阅读器&lt;/b&gt;。这类在核心功能上应该是比较好实现的，而且现在社区上对于基本 HTML 和 Markdown 样式好看的实现实在是太多了，难的多在于用户操作和阅读体验，而且各个平台上均有标杆 App 在支撑，例如 iOS 上的 Reeder 。&lt;/li&gt;
&lt;li&gt;&lt;b &gt;查询食物营养成分表&lt;/b&gt;。问题是成分数据来源，极度庞大，同样也有标杆软件：薄荷健康，薄荷营养师。&lt;/li&gt;
&lt;li&gt;&lt;b &gt;记账&lt;/b&gt;？？？。以前写的记账网页应用。&lt;/li&gt;
&lt;li&gt;&lt;b &gt;公众号编辑器&lt;/b&gt;。这简直是在创造需求，我不太相信会有哪位公众号编辑人员会在手机上做该在电脑上做的事情。&lt;/li&gt;
&lt;li&gt;还有一些不一一列举。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上困难其实可以用时间来堆，但是堆出来后有没有利益，有没有用户，这才是&lt;b &gt;核心难题&lt;/b&gt;，所以「想」与「做」不成正比。&lt;/p&gt;
&lt;h2&gt;收获&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Google Play 开发者帐号&lt;/li&gt;
&lt;li&gt;一个真正在商店上可下载的应用&lt;/li&gt;
&lt;li&gt;ionicframework/capacitor 应用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;收获其实不多，但以后如果我打算开发新 App 的话，能比现在更快的创造发布新 App 的基本所需。&lt;/p&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;回到开头的那个疑问，其实只是完美适配原作者的实际应用场景而已。或许在将来 Web 应用在手机上的表现会越来越好，但永远也不会媲美原生应用！&lt;/p&gt;
</content:encoded></item><item><title>再再次打造 Vim 编辑器</title><link>https://2nthony.com/posts/vim-again-and-again/</link><guid isPermaLink="true">https://2nthony.com/posts/vim-again-and-again/</guid><description>本文并不包含 Vim 哲学内容</description><pubDate>Mon, 15 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本文所有 Vim 均为 &lt;a href=&quot;https://neovim.io/&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;NeoVim&lt;/a&gt; 。为什么要使用 Vim ，我的回答是「颜值与操作」，或者 Google 这个问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2023/02/VWHt8I.jpg!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2&gt;原因&lt;/h2&gt;
&lt;p&gt;之前定制的不够好用。正好 &lt;a href=&quot;https://twitter.com/inkdrop_app&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Takuya 🐾 devaslife&lt;/a&gt; 又更新了 Vim Setup 的视频，细数已经第四期了，平均每年一期。正好我也需要改，那就跟着一起做一些修改。&lt;/p&gt;
&lt;h2&gt;结合自身情况浅谈 Vim 使用&lt;/h2&gt;
&lt;p&gt;&lt;span class=&quot;red&quot;&gt;&lt;b &gt;在定制好 Vim 且使用了很长时间，并没有感到 Vim 能带来非常明显的效率提升&lt;/b&gt;&lt;/span&gt;&lt;b &gt;。&lt;/b&gt;或许是因为我这段时间内&lt;b &gt;几乎&lt;/b&gt;没有使用 VS Code，无法对比，所以模糊了这个概念。&lt;/p&gt;
&lt;p&gt;&lt;b &gt;我切换到 Vim 的原因大概以下几个：&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b &gt;半透明的毛玻璃效果&lt;/b&gt;。我能很轻松的通过 iTerm 2 实现背景半透明的毛玻璃效果。&lt;/li&gt;
&lt;li&gt;&lt;b &gt;纯键盘操作&lt;/b&gt;。我可以通过键盘来代替大部分鼠标操作，我只是很讨厌键盘与鼠标之间的来回。&lt;/li&gt;
&lt;li&gt;&lt;b &gt;低内存占用&lt;/b&gt;。下面是一个 Vim 与 VS Code 启动相同&lt;b &gt;最小可行&lt;/b&gt;项目，打开相同文件的内存占用&lt;b &gt;不完全&lt;/b&gt;对比。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;iTerm 2 + Vim + Node(LSP)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;下面的 node 进程不太确定是否全部是 Vim LSP 带起来的，姑且全部算上&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;截图前做的一些操作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开关闭文件搜索 ( nvim-tree&lt;/li&gt;
&lt;li&gt;打开文件搜索并确认打开文件 ( telescope nvim&lt;/li&gt;
&lt;li&gt;打开 Git ( toggleterm + lazygit&lt;/li&gt;
&lt;li&gt;输入一些内容触发 LSP 以及代码提示 ( lspconfig + nvim-cmp&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/08/RfMfJk.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h3&gt;VS Code&lt;/h3&gt;
&lt;p&gt;截图前做的一些操作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开内置终端&lt;/li&gt;
&lt;li&gt;输入一些内容触发代码提示&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/08/gDmgin.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;肉眼可见，vim 占用的资源还是少了很多的。&lt;/p&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;每当设置完 Vim 后打开一个项目看看效果是很有成就感的(就像客制化键盘拼成后打几分钟字，听听键盘敲击音那样的成就感)，&lt;b &gt;但已经&lt;/b&gt;不想再大费周章来搞 Vim 了。&lt;/p&gt;
&lt;p&gt;要是能重来，我要选 &lt;a href=&quot;https://github.com/LunarVim/LunarVim&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;span class=&quot;red&quot;&gt;LunarVim&lt;/span&gt;&lt;/a&gt; 之类的已经集成好的编辑器，省心又省力。&lt;/p&gt;
&lt;h2&gt;更新&lt;/h2&gt;
&lt;p&gt;&lt;span class=&quot;red&quot;&gt;由于种种原因，我已经使用 LunarVim 重来了。&lt;/span&gt;理由其实无非都是那几个：懒，不太想再折腾这个东西。虽然 LunarVim 做了很多处理，但仍然比较习惯先前的定制，我仍然进行了不少迁移和覆盖，好在&lt;b &gt;比较面向社区&lt;/b&gt;化，随便提了几个对我有用的 PR 都合了，不过隐藏的风险也是&lt;b &gt;比较面向社区&lt;/b&gt;。&lt;/p&gt;
&lt;p&gt;过程依旧不是一帆风顺，文档的不完善与落后，导致在一些情况下我需要看代码才能知道如何覆盖原有的配置。LunarVim 的 stable 版本为了稳定，将插件的 commit 锁上了，但&lt;b &gt;碰巧&lt;/b&gt;撞上 Volar(vue-language-server) 的大版本更新，导致 Vue 项目无法启动 LSP server 导致无法获得语言支持。解决的办法是将这些 commit 删除即可，但我依旧选择一种困难的方式写了一个 hack 配置来自动删除这些 commit ，因为我认为这种事情可能还会发生。&lt;/p&gt;
&lt;h2&gt;链接&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/craftzdog/dotfiles-public&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;craftzdog/dotfiles-public: My personal dotfiles (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://space.bilibili.com/26319956/channel/collectiondetail?sid=361766&amp;ctype=0&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;敲代码的脱发水的个人空间_哔哩哔哩_bilibili&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/2nthony/dotfiles&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;2nthony/dotfiles: My personal dotfiles (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/LunarVim/LunarVim&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;LunarVim/LunarVim: An IDE layer for Neovim with sane defaults. Completely free and community driven. (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/LazyVim/LazyVim&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;LazyVim/LazyVim: Neovim config for the lazy (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Logseq 体验</title><link>https://2nthony.com/posts/logseq/</link><guid isPermaLink="true">https://2nthony.com/posts/logseq/</guid><description>双向链接必能帮助我们找回很多记忆</description><pubDate>Wed, 16 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/03/mVnxfo.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2&gt;什么是 Logseq&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://logseq.com/&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Logseq&lt;/a&gt; 是一个开源的笔记管理工具，支持 markdown 与 org-mode 模式，可以用来写作，组织和分享你的知识与想法，也可以用来跟踪自己的待办事项，&lt;span class=&quot;red&quot;&gt;&lt;b &gt;并且链接是双向的&lt;/b&gt;&lt;/span&gt;。&lt;/p&gt;
&lt;p&gt;Logseq 基本概念是以天作为单位，存放在侧边栏 &lt;code &gt;Journals&lt;/code&gt; 中，那么每一天都会生成一个 Page 。下图中，&lt;span class=&quot;red&quot;&gt;红色区域是 Page&lt;/span&gt; ，&lt;span class=&quot;blue&quot;&gt;蓝色区域 Block&lt;/span&gt; 就是这个 &lt;span class=&quot;red&quot;&gt;Page&lt;/span&gt; 的内容。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/03/emJML5.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2&gt;为什么使用 Logseq&lt;/h2&gt;
&lt;p&gt;我平时或多或少都会记录一些东西，使用过的软件包括苹果的 Notes ，Notion 开一个专门的 database 。为了让这些记录变得有条理，我必须创建一些目录来划分它们，当我需要新记录一些东西的时候，我必须要先想应该记录在哪个目录；如果是记录灵光一闪的想法，在此前还要分析该想法属于什么类型，才能找到对应的目录，这个过程有可能会导致灵光一闪的想法记忆衰弱，最终适得其反。&lt;/p&gt;
&lt;p&gt;因此，Logseq 可以让我一打开软件就能记录，并且在记录的同时就能根据我的 [[关键词]] 分类好，并且它是离线的，生成的文件存放在 iCloud 可以无缝同步，很安全。&lt;/p&gt;
&lt;h2&gt;我是如何使用它的&lt;/h2&gt;
&lt;p&gt;我将我要做的事情，灵光一闪的想法，笔记都记录在 Logseq 中。&lt;/p&gt;
&lt;h3&gt;以待办事项为例&lt;/h3&gt;
&lt;p&gt;例如，我今天要完善 swc 的文档，添加 minify 函数的用法与说明，那么我会写一条待办 Block：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/03/6eXIOB.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;那么它会转换成一条待办事项：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/03/8yUULv.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;点击 LATER 文字换将状态切换为 NOW，并且展示在当天的 🔨 NOW 区域，表示我正在做的事情：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/03/fpYoBT.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;完成时点击左侧的&lt;span class=&quot;blue&quot;&gt;蓝点&lt;/span&gt;即可。&lt;/p&gt;
&lt;h3&gt;集中管理所有待办事项&lt;/h3&gt;
&lt;p&gt;如果我们不把这些待办事项集中管理起来，而是通过”翻记录“的形式来查找要做的事情是很痛苦的，因此我创建了一个 Dashboard Page ，专门收集待办事项。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/03/GyxNRc.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;该 Dashboard Page 中有两个 block ，Todo 以及 In progress ，分别代表要做的事情，以及正在做的事情。为了能收集待办事项，需要应用到 query 语法：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/03/CBUbT7.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/03/a0yJBf.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h3&gt;添加 Tag 标记&lt;/h3&gt;
&lt;p&gt;我在一些 block 后面标记了一些 tag ，如 &lt;code &gt;#contributing&lt;/code&gt; , &lt;code &gt;#blogging&lt;/code&gt; ，每一个 tag 也是一个独立的 Page ，并且所有带有这个 tag 的都会展示在与之相关的 Page 上。&lt;/p&gt;
&lt;p&gt;我个人使用的 tag 有以下几个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;note - 一些学习上的笔记&lt;/li&gt;
&lt;li&gt;contributing - 与社区贡献相关&lt;/li&gt;
&lt;li&gt;random-thought - 灵光一闪的想法/闪念&lt;/li&gt;
&lt;li&gt;blogging - 与写博客相关&lt;/li&gt;
&lt;li&gt;deprecated - 已经放弃的事情&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下展示的是 &lt;code &gt;#contributing&lt;/code&gt; Page：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/03/JZ5oJ1.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Query 的进阶用法&lt;/h2&gt;
&lt;p&gt;Query 语法后面接着的是条件，也即以哪些条件来查询结果。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;{{query (条件)}}
{{query (and ((条件1) (条件2))}}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;我在 Dashboard Page 的 Todo 区域，就运用了多条件来查询结果：在查询待办的同时，还把带有 &lt;code &gt;#deprecated&lt;/code&gt; 的 tag 的排除。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/03/R5vT6i.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;体验 Logseq 一周，很好用，功能非常多，无论是知识管理，笔记，甚至是管理生活。但它在我心目中还没有一家独大的地步，也即 Notion 还无法被取代，但可以肯定的是，苹果的 Notes 可以彻底被取代！&lt;/p&gt;
&lt;p&gt;功能多的同时，也意味着会有学习成本了， query 的进阶用法便是其中之一。Notion 在这方面就做的挺好，在输入 &lt;code &gt;/&lt;/code&gt; 功能指令弹出的提示会有图片示例而不是单纯的文字。&lt;/p&gt;
&lt;h2&gt;链接&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://logseq.github.io/#/page/queries&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Logseq queries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=DxoGJBb1mWQ&amp;ab_channel=RandyMusic&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Randy - 我是如何使用 Logseq 的 | How I use Logseq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Sansui233/logseq-bonofix-theme&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;logseq-bonofix-theme&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>博客的终极奥义</title><link>https://2nthony.com/posts/ultimate-blog/</link><guid isPermaLink="true">https://2nthony.com/posts/ultimate-blog/</guid><description>奥义就是统一的博客引擎</description><pubDate>Tue, 01 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/03/L5xsYt.png!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;目前你所看到的博客内容完全由 Blogkit 以及其生态搭建，部署在 Vercel ，正所谓 &lt;span class=&quot;red&quot;&gt;Dogfooding(吃自己的狗粮)&lt;/span&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Github: &lt;a href=&quot;https://github.com/2nthony/blogkit&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;2nthony/blogkit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最近从 &lt;a href=&quot;https://github.com/djyde/sairin&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://github.com/djyde/sairin&lt;/a&gt; 中获取了灵感，让我立马动身，将之前的想法「在 Notion 上写博客」实现！&lt;/p&gt;
&lt;h2&gt;统一的博客引擎&lt;/h2&gt;
&lt;p&gt;可扩展是目前任何工具必备的功能，因此我将它们分为 3 部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;核心库：只负责获取列表，内容和输出 RSS&lt;/li&gt;
&lt;li&gt;请求库：为核心库提供获取列表，获取内容和获取 RSS items&lt;/li&gt;
&lt;li&gt;主题库：每个主题页面接收 props ，渲染列表和内容&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，你可以随意定制除核心库以外的任何配置。&lt;/p&gt;
&lt;h2&gt;起源&lt;/h2&gt;
&lt;p&gt;为什么做这个工具，其实也跟我曾经对博客工具的选型有关。一路以来，我将 GitHub Issues，saber，11ty，notion 当过博客工具。它们或多或少都有一定程度上的限制：工具，外观，扩展等，&lt;span class=&quot;red&quot;&gt;因此我一直希望能有一个工具，允许我们在任何地方(这里指存储博文的地方)写博客，并且不需要依靠 Git 系统，同时也能拥有自由扩展 web 能力的工具。那么现在，这个工具由我凭借着社区上的灵感，写了出来。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;已有生态&lt;/h2&gt;
&lt;p&gt;请求库&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/2nthony/blogkit/tree/main/packages/blogkit-notion&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;blogkit-notion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/2nthony/blogkit/tree/main/packages/blogkit-yuque&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;blogkit-yuque&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/2nthony/blogkit/tree/main/packages/blogkit-strapi&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;blogkit-strapi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;主题库&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/2nthony/blogkit/tree/main/packages/blogkit-theme-minimal&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;blogkit-theme-minimal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;基于 Next.js(ISR)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://nextjs.org/blog/next-12-1#on-demand-incremental-static-regeneration-beta&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ISR&lt;/a&gt; 是我在 Sairin 项目中了解到的 Next.js 特性，它就是静态文件递增更新而不需要重新构建整个项目。我在核心库设置了 60 秒，也即该博客内容会每 60 秒按需更新对应的内容。&lt;/p&gt;
&lt;h2&gt;接下来&lt;/h2&gt;
&lt;p&gt;我会完善一些核心库的 Types ，使用文档，以及推广到相关圈子如(dev.to, producthunt...)，并且正在构思 Major 版本。&lt;/p&gt;
&lt;h2&gt;尾&lt;/h2&gt;
&lt;p&gt;这就是我的博客的终极奥义！&lt;/p&gt;
</content:encoded></item><item><title>当了几周的 &quot;Leader&quot;</title><link>https://2nthony.com/posts/be-a-leader-for-weeks/</link><guid isPermaLink="true">https://2nthony.com/posts/be-a-leader-for-weeks/</guid><description>讲话大声的人就能当”管理”</description><pubDate>Sun, 13 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Leader 带有 “” 是强调我并不是真正的成为 Leader 。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;我与其他 3 个人一起到易方达基金驻场，在此前，我对其余 3 人完全不了解。&lt;/p&gt;
&lt;p&gt;我们需要负责的项目是基础组件库建设，据说是重点项目。其实就是搭建一个文档工具，有 demo 展示与代码，有 API 说明，简述就是跟其他 UI 库那样的工具。之后，我们将现有的业务组件迁移到该文档上，形成一个 UI 库。并持续添加业务组件。&lt;/p&gt;
&lt;h2&gt;成为 &amp;quot;Leader&amp;quot; 的契机&lt;/h2&gt;
&lt;p&gt;原本我们之间并没有这样的职责，只有一个 「代理管理」 。这个 「代理管理」 就是帮在总部的部门负责人管理我们的。在一次项目会议上，我们被问到谁是你们类似小组长这样的存在时，我们互相指对方。后果可想而知，我们被骂了一顿。&lt;/p&gt;
&lt;p&gt;后来，「代理管理」 找我谈了一番，说他自己并没有自信带人，也没有适当的领导力，更何况 「我」 只是被交代来管理，并没有交代 「我」 成为组长。正好此时我也有机会向他了解了其他 2 人的能力情况。之后他提出建议，在我们 4 人中，通过投票将能力最好的来当 &amp;quot;Leader&amp;quot; 。&lt;/p&gt;
&lt;p&gt;结果如标题，3 票都放在了我身上。&lt;/p&gt;
&lt;h2&gt;带人做项目&lt;/h2&gt;
&lt;h3&gt;做事&lt;/h3&gt;
&lt;p&gt;在刚开始成为 &amp;quot;Leader&amp;quot; 的一周，我想让他们做出一些&lt;span class=&quot;red&quot;&gt;改变&lt;/span&gt;，改变这种杂乱无序的做事方式。于是我对他们提出一些要求，考虑到他们的工作年限几乎都是 1 年左右，因此我只列出一些&lt;span class=&quot;red&quot;&gt;主观&lt;/span&gt;认为在能力范围内的，并且符合当前工作环境的要求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git 工作方式&lt;ul&gt;
&lt;li&gt;一个分支只做一件事&lt;/li&gt;
&lt;li&gt;A 的代码由 B 来合并&lt;/li&gt;
&lt;li&gt;不允许直接推代码到 dev 和 main&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用 GitLab Issues 来跟踪工作内容&lt;/li&gt;
&lt;li&gt;编码规范&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;red&quot;&gt;&lt;b &gt;避免做重复的事情&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;red&quot;&gt;&lt;b &gt;遇到问题前先想想&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上述要求几乎都写在了一个 GitLab 仓库上，并发给大家看，他们都表示同意，可以，还不错。&lt;/p&gt;
&lt;p&gt;不到几天，其中有人说，太麻烦；了解了一下原因，原来是对 Git 不熟悉，不会处理冲突，并说以前都是随便搞。于是我以 「一个分支只做一件事」 作为例子，解释为什么要这么做与可以避免的后果。&lt;/p&gt;
&lt;h3&gt;编码期&lt;/h3&gt;
&lt;p&gt;在大家明确自己做什么的时候，便各自为之。期间，我也会被提问或要求帮助，大多时候我都是告诉他们思路或该怎么做，避免直接告诉他们答案或者帮助他们编码。&lt;/p&gt;
&lt;p&gt;有一次，有人处理了一个问题，之后我们进行了如下对话：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「如果有下一个人遇到与你一样的情况，你会怎么做？」&lt;/li&gt;
&lt;li&gt;「我告诉他就行。」&lt;/li&gt;
&lt;li&gt;「如果再有下一个呢？」&lt;/li&gt;
&lt;li&gt;「我再告诉他。」&lt;/li&gt;
&lt;li&gt;「如果再有 N 个呢？」&lt;/li&gt;
&lt;li&gt;「我都告诉他们。」&lt;/li&gt;
&lt;li&gt;「写一个文档是不是就可以避免了？」（语气平和并请求）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;到最后，这个文档并没有写，也没有第 2 个问他的人。&lt;/p&gt;
&lt;h2&gt;体验卡到期&lt;/h2&gt;
&lt;p&gt;大约 3 周，项目负责人还是将我们的部门负责人叫了过来，每周规定几天需要到这里参与开发。至此，我并不再扮演 &amp;quot;Leader&amp;quot; 这个角色。&lt;/p&gt;
&lt;h2&gt;感受&lt;/h2&gt;
&lt;p&gt;在我不再扮演 “leader” 角色后，上述提到的一些要求已经彻底没有人遵循了，除了我自己。我的代码被「还原」了 4 次也是因为直接推 dev 的原因。&lt;/p&gt;
&lt;p&gt;工作环境真的很重要，这里的环境更强调&lt;b &gt;人&lt;/b&gt;。如果人之间的做事方式比较一致，共事起来会很舒服。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;更新 2022-04-07&lt;/h3&gt;
&lt;p&gt;在最近的一次项目会议中，因为来了一位更有资质的人，队伍内又重新介绍了一次自己，这时候部分人介绍自己的工作年限从以前听到的 1 年左右变成了 3 年左右或以上，让我比较困惑，究竟哪次是真的，我没有追问，因为也已经没必要了。&lt;/p&gt;
</content:encoded></item><item><title>2021 回顾</title><link>https://2nthony.com/posts/2021/</link><guid isPermaLink="true">https://2nthony.com/posts/2021/</guid><description>孤儿</description><pubDate>Mon, 03 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;开源&lt;/h2&gt;
&lt;p&gt;我一直期望我能在开源上有一番成就，典型的比喻就是拥有一个&lt;b &gt;高星并且用户多&lt;/b&gt;的仓库，星数和用户必须是成正比的。但至今为止还未有。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.notion.so/GitHub-Sponsor-d8bfc8a78e4d4a848b3bef7ccad7d665&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;我开通了 GitHub Sponsor&lt;/a&gt; ，此举属于未雨绸缪。让我惊讶的是前同事 &lt;a href=&quot;https://github.com/lianghx-319&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;@lianghx-319&lt;/a&gt; 是我的第一个 Sponsor ，很是感谢。&lt;/p&gt;
&lt;p&gt;有一次在微信群中某段聊天记录中 &lt;a href=&quot;https://github.com/levy9527&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;@levy&lt;/a&gt; 提到：「开源也基本停止维护了，很可惜」。确实有点可惜，不过好在还是有人&lt;b &gt;偶尔&lt;/b&gt;维护的，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我发起了一个重写的 &lt;a href=&quot;https://github.com/FEMessage/update-popup/pull/35&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://github.com/FEMessage/update-popup/pull/35&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/lianghx-319&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;@lianghx-319&lt;/a&gt; 修复的 &lt;a href=&quot;https://github.com/FEMessage/nuxt-micro-frontend/pull/44&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://github.com/FEMessage/nuxt-micro-frontend/pull/44&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/levy9527&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;@levy&lt;/a&gt; 也做了好一些修复，没有一一贴出来。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;友谊&lt;/h2&gt;
&lt;p&gt;近期在跟朋友玩「王者荣耀」，认识了一个新朋友，人送外号「富婆」，虽素未谋面，但就边游戏边聊天上，是个非常有意思的人。&lt;/p&gt;
&lt;h2&gt;工作&lt;/h2&gt;
&lt;p&gt;在第三季度末开始我有在找新工作，其中也有朋友帮我推荐，我很感激。但他们推荐的我全部都进不去，&lt;b &gt;不怀疑是能力不足或方向不对口&lt;/b&gt;，另外我对面试比较失望的一点：&lt;b &gt;背书式面试&lt;/b&gt;(面试成功率跟刷面试题挂钩)，刷面试题确实可以增长知识，但这里背书式面试更指的是，即使不知道为什么，只需要背好答案就行。我为什么这样想，是因为其中一个面试的一个问题是：「Webpack 怎么启用 HMR ，HMR 的&lt;b &gt;插件名&lt;/b&gt;叫什么？」我能理解前一小问，后一小问确实不理解。&lt;/p&gt;
&lt;p&gt;在年尾最后几天，我面上了新公司「复深蓝」，我的职责是驻场到易方达基金内网开发，好处是我距离地点非常近，步行 17 分钟左右即可到达，并且下班时间很早(6 点)，但上班时间也很早(8 点半)。我更期待的是我能有更多的空余时间，做其他事情。&lt;/p&gt;
&lt;h2&gt;学习&lt;/h2&gt;
&lt;h3&gt;Svelte&lt;/h3&gt;
&lt;p&gt;兴趣为之。Svelte 今年重新映入眼帘，并且使用 Svelte 将我的一个 App 重写。因为已经熟悉 MVVM 这类库的开发方式，所以在学习 Svelte 上也没什么难度，基本上跑一遍官网上的例子就熟悉了。有兴趣建议阅读 &lt;a href=&quot;https://lutaonan.com/blog/svelte/&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Randy 对 Svelte 的看法&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;Rust&lt;/h3&gt;
&lt;p&gt;🦀 兴趣为之。我一直想通过 Rust 来写一些 Nodejs addons 。但我应该先熟悉 Rust ，所以我要使用 Rust 改进一个新的 App 。可能是因为我带着 JS 的思维去学习，因此我感到非常困难。&lt;/p&gt;
&lt;h2&gt;阅读&lt;/h2&gt;
&lt;p&gt;这一年我阅读的书变少了很多，这部分时间几乎都转到了写代码与学习上。&lt;/p&gt;
&lt;h3&gt;做出好选择&lt;/h3&gt;
&lt;p&gt;是一本与职场生涯比较相关的书籍。由于这本书从&lt;b &gt;看&lt;/b&gt;开始到&lt;b &gt;听&lt;/b&gt;结束时间跨度比较大，有点忘记内容了，但我印象最深刻的一个观点是关于自我介绍的：&lt;span class=&quot;red&quot;&gt;很多人的自我介绍都是围绕自己的，但在一线城市，在一些社交场合中，别人更关注的是能为他人带来什么价值。&lt;/span&gt;所以作者给出了他自己的个人介绍以作为例子：&lt;span class=&quot;red&quot;&gt;我是一名职业规划师，我专门帮助别人提供职业规划方案以及建议，如果大家在职业规划上有什么不懂的可以联系我&lt;/span&gt;。不过职场与社交的自我介绍还是有区别的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://evilaassets.oss-cn-shanghai.aliyuncs.com/uPic/2022/03/8Ad6hk.jpg!jpg&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;这是我最近刷推特看到的，瞬间联想起本书的这个观点。&lt;/p&gt;
&lt;h3&gt;每周工作 4 小时&lt;/h3&gt;
&lt;p&gt;这本书同样阅读时间跨度比较大，甚至还未读完。
在此书中我了解到最为意想不到的是：&lt;span class=&quot;red&quot;&gt;&lt;b &gt;原来我们的生活也可以外包&lt;/b&gt;&lt;/span&gt;。&lt;/p&gt;
&lt;h2&gt;新事物&lt;/h2&gt;
&lt;h3&gt;数字货币&lt;/h3&gt;
&lt;p&gt;我以一个投资者的态度来接触这个领域，我目前只通过现货买卖来盈利。&lt;/p&gt;
&lt;h2&gt;年度满意之举&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.notion.so/05f8ead5db6042ac828236404ff1377a&quot;  target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;我的 Shell 配置&lt;/a&gt; 在 Shell 上写代码&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;展望 2022&lt;/h2&gt;
&lt;p&gt;结合上述部分内容，并追加：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;升级设备 MacBook Air M1, iPhone 13&lt;/li&gt;
&lt;li&gt;使用 Rust 基于 macMineable 代码编写新的 App ，需要支持 M1 显卡，并且需要成为 sponsor 才能使用部分功能&lt;/li&gt;
&lt;li&gt;阅读至少 10 本新书，平均 1 月 1 本&lt;/li&gt;
&lt;li&gt;维护一份 email list&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>