-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathatom.xml
348 lines (348 loc) · 57.4 KB
/
atom.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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
<?xml version="1.0" encoding="utf-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>YeungYeah 的乱写地</title><link>https://scottyeung.top/</link><description>YeungYeah 的乱写地中记录了作者的所思所想及所为。</description><generator>Hugo 0.122.0 https://gohugo.io/</generator><language>zh-CN</language><managingEditor>[email protected] (YeungYeah)</managingEditor><webMaster>[email protected] (YeungYeah)</webMaster><lastBuildDate>Tue, 04 Feb 2025 13:15:25 +0000</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://scottyeung.top/atom.xml"/><item><title>2024 年度记录</title><link>https://scottyeung.top/2025/record-of-2024/</link><guid isPermaLink="true">https://scottyeung.top/2025/record-of-2024/</guid><pubDate>Sat, 04 Jan 2025 10:06:50 +0800</pubDate><author>[email protected] (YeungYeah)</author><description><p>度过作为纯种打工人完整的一年,简单地写点流水账,记录下今年的一些事情与想法。</p>
<h2 id="一月">一月</h2>
<p>终于去香港办银行卡了,虽然遇到了一些预料之外的问题,去到发现<a href="http://xhslink.com/a/Rb3xDU5JTPY2">电信电话卡在香港漫游无效没信号的问题</a>,不过有惊无险,最后还是顺利办成并当场下卡。</p>
<p>从这刻开始,我也开启了我的美股投资之路。通过美股这个渠道,我对投资和赚钱有了更多的思考。在去年工作之后,我就觉得搞钱才是最重要的事,但具体该怎么搞钱、如何在不工作之外还能有收入,当时还没有太多的想法。如今接触到美股投资后,虽然不可能通过投资马上赚大钱,但起码看到了希望,尤其是看到一些转行当专职 trader 的同行还能养活自己并过得不错之后,更让我觉得这条路有可能性。</p>
<p><strong>核心还是需要:做好准备,等待机会。</strong> 多攒钱,积极寻找机会,be open,不局限于某一条路子。</p>
<p>借着办卡的机会,我顺便在香港玩了一天。上次去香港应该还是初中的时候。作为一个广东人,虽然对香港的各种信息接触得比较多,看似很熟悉,但实际上这才是我第二次去香港。不过会粤语、熟悉香港文化,去玩也没遇到什么问题。香港这个城市还是有许多吸引我的地方,让我想起初中时的志愿是到香港大学读书。现在其实有机会拿到 hkid 去香港工作,但各种因素让我迟疑,尤其是“待七年”这个门槛太高。不过,去生活不行,多点去玩还是可以的。第一次去香港之后,回来我就马上把签注更新成了一签多行。</p>
<h2 id="二月">二月</h2>
<p>过年,越来越没什么年味和感觉,也可能是年纪大了,对过年也越来越没什么期盼。过年逐渐演化成回乡下吃饭,亲戚间互相探亲吃饭,各种吃饭的模版一般的场景,并不喜欢。</p>
<h2 id="三月--四月">三月 &amp; 四月</h2>
<p>own 的一个项目终于要上线了,期间外部合作机构各种幺蛾子,各种出问题,上线后也还有很多手尾需要跟进。不过最终的业务效果还是极好的,上线的这一年带来了极高的 TPV。虽然说技术是为了业务服务,但很现实的一点是,真的拿到了好的业务成果之后,还会 credit to 技术人员上吗?想起内网曾经看到的一个吐槽贴,庆功会上各种人都在,唯独不见技术人员。</p>
<p>再结合年度绩效出来后的年终奖和调薪,更加让人想笑 <del>(我这个新人连这个500都没)</del> 更加意识到打工没什么前途。</p>
<p><img src="https://scottyeung.top/my-images/202501041125963.jpeg" alt=""></p>
<hr>
<p>女朋友的考研成绩也出了,初试高分,复试准备了两周后也顺利拿下,终于上岸,可喜可贺,算是弥补了当年的遗憾。</p>
<h2 id="五月">五月</h2>
<p>打卡汕头。虽然高中时身边有不少潮汕同学,但直到现在才第一次去。对汕头的印象,全是牛肉火锅和甘草水果。</p>
<h2 id="六月">六月</h2>
<p>和团队团建去了马来西亚,时隔七年再次出国,而且也还是去马来西亚。海岛的景色确实还可以,浮潜也很有意思。</p>
<p>去东南亚旅行消费确实低,来回的机票全包也才 900+。逐渐开始意识到,其实出国玩并没有想象中那么麻烦,性价比也挺高的。新的一年希望能有更多机会解锁不同的国家(但还得先解锁各国签证)。</p>
<h2 id="九月---十一月">九月 - 十一月</h2>
<p>三个月参加了三个同学的婚礼,身边的同学和朋友开始逐渐结婚成家了。还是挺多感慨的,见证着身边同龄人进入下一个人生阶段,偶尔也会想:什么时候轮到我呢?我并不恐婚恐育,相反甚至还有点向往婚姻、家庭与小孩。然而结婚也没那么简单,结婚意味着两个家庭的结合,不是两个人领证就完事,还需要考虑方方面面的各种因素。不过麻烦归麻烦,还是需要面对的,也不会去逃避。希望这两年能让这个喜事发生。</p>
<h2 id="十二月">十二月</h2>
<p>公司的年度体检拖到年底才去做,所幸体检结果没啥大问题。工作以来自我感觉身体没以前好了,以前常常和别人自嘲说,我们这行是拿命换高薪。现在真工作了,发现工作确实会是一种损耗,both 生理上和心理上。如何面对这些损耗并尽可能减少它们带来的影响,这是我工作中最重要的一个课题。</p>
<p>生理上影响最大的一个点是运动时间少了。读书时时间充足,几乎每天都有时间运动,即使没运动,每天的步行量也足够。但工作后很容易一周都没运动(当然也有一部分原因是工作累了自己懒得动)。于是也在寻找一个高效且自己能坚持的运动方式,让自己动起来。之前买了一个壶铃,运动效果确实不错,当成 HIIT 都可以,但坚持了一个月就闲置了。</p>
<p>最近这个月重拾了游泳。其实从小就很喜欢游泳,小时候的夏天一放假家里人就会带我去游泳,也练出了自认为还可以的游泳技能。后面上大学后就基本没怎么接触游泳了。现在重新游泳后,开始在有泳道的专业泳池游(小时候游的泳池真的就是一个大池子)。接触游泳的人多了,再加上用手表开始记录自己的游泳情况,才发现其实我也不是那么会游。</p>
<p>在小城市里,会游泳的人没那么多,泳池也没那么专业,可能大多数人去游泳实际上是在玩水。在这样的环境里游得最好,其实也不代表什么。但处于其中的话,还是会被环境与平台局限着眼光与想法。</p>
<p>以前的自己有点坐井观天了,这不仅是游泳,还有许多方面。被自己的思维、想法,或者各种因素局限了。还是得打开自己,be open and keep exploring.</p></description><category domain="https://scottyeung.top/posts/">posts</category><category domain="https://scottyeung.top/tags/%E8%AE%B0%E5%BD%95/">记录</category><category domain="https://scottyeung.top/tags/summary/">summary</category><category domain="https://scottyeung.top/tags/%E7%94%9F%E6%B4%BB/">生活</category><category domain="https://scottyeung.top/tags/%E6%8A%95%E8%B5%84/">投资</category><category domain="https://scottyeung.top/tags/%E5%B7%A5%E4%BD%9C/">工作</category></item><item><title>被生态绑架的数据</title><link>https://scottyeung.top/2025/kidnapped-by-data/</link><guid isPermaLink="true">https://scottyeung.top/2025/kidnapped-by-data/</guid><pubDate>Fri, 03 Jan 2025 20:49:51 +0800</pubDate><author>[email protected] (YeungYeah)</author><description><p>才用了两年多的 Apple Watch,现在电量已经开始撑不住了。目前电池健康度是 85%,晚上充满电后睡前戴上,第二天晚上七八点就会弹出 10% 的低电量警告。如果晚上需要去游泳,还得专门早上起床后给手表补一下电,确实有点顶不住。</p>
<p>打算换一个手表。继续用苹果的话,从 S7 换到 S10 感觉提升也不大;换成 Ultra 又觉得有点太贵了。于是考虑换个安卓厂商出的手表,看上了华为的 GT5 Pro。非华为手机也能用,只需要安装一个华为运动健康的 APP。不过这样一来,记录的数据就得全部存放在华为运动健康当中。这样的话,这些数据还属于我的吗?</p>
<p>其实有点好笑,我用他们的产品产生的属于我自己的数据,却无法对其拥有绝对的掌控权。某种程度上,这些数据存在他们的 APP 中,似乎就成了他们的数据。但这并不是华为一家会这样,几乎所有安卓厂商都有自己的健康 APP和手表,生成的各种监测数据也只能同步到各自的 APP 和生态当中。</p>
<p>不过,现在在用的苹果也一样。如果我不用 iPhone,健康与健身的所有数据,我同样没有办法迁移出来继续使用。这也是一直阻碍我换手机回归安卓的一大原因。</p>
<p>科技越发展,数码生态越完善,反而越建立起了生态上的壁垒。生态之间的迁移太过痛苦,甚至可以说是必然会有成本。迁移必须做出取舍(trade-off),选择任何一方都会有不足之处,无非是看自己能接受哪些问题作为妥协点。但其实这种取舍一直都存在,只是以前生态未完善时积累的数据还不够多。而现在,工作之后,时间和精力也不像以前那样充裕,去适应新的生态变得更加困难。</p>
<p>所以要换啥呢?一直在想,却始终想不出一个结果,这样就一直拖着不换了吧😂。然而,想换的心已经有了,拖着其实并不能打消这个念头。看什么时候彻底忍不了了吧。</p></description><category domain="https://scottyeung.top/posts/">posts</category><category domain="https://scottyeung.top/tags/%E5%90%90%E6%A7%BD/">吐槽</category><category domain="https://scottyeung.top/tags/%E7%94%9F%E6%B4%BB/">生活</category><category domain="https://scottyeung.top/tags/Apple/">Apple</category></item><item><title>Ahr999 in TradingView</title><link>https://scottyeung.top/2024/ahr999/</link><guid isPermaLink="true">https://scottyeung.top/2024/ahr999/</guid><pubDate>Tue, 31 Dec 2024 11:34:44 +0800</pubDate><author>[email protected] (YeungYeah)</author><description><p>近段时间开始关注 BTC 大饼现货,并且在找机会逐步进场持有。其中我主要是通过 Ahr999 指标来判断入场时机,这个指数来自于<a href="https://coxxa.github.io/bitcoin-ahr999-HODL/#/di-shi-wu-zhang">《囤比特币》</a>。</p>
<p>具体的定义可参考</p>
<p><code>Ahr999 = ((比特币价格/200日定投成本) * (比特币价格/指数增长估值)</code></p>
<ul>
<li>指数增长估值= 10^[5.84 * log(币龄) - 17.01]</li>
<li>币龄 = 当前日期距离2009年1月3日的天数</li>
<li>200日定投成本 使用几何平均值</li>
</ul>
<p>通常认为:</p>
<ul>
<li>Ahr999 &lt; 0.45 时,表示市场极度恐慌,是很好的买入机会</li>
<li>Ahr999 &gt; 1.2 时,表示市场可能过热,需要注意风险</li>
<li>0.45 &lt; Ahr999 &lt; 1.2 时,属于相对合理区间</li>
</ul>
<p>最开始打算是直接写个脚本跑在服务器上,定时计算,进入合适的区间就发 tg 消息提醒。写好调试好发现,我的服务器限于网络环境,无法调用 API 拿到数据,只能放弃。又转念一想,其实也算是个交易指标,干脆拿去 TradingView 上搞一个,写个指标画出来,并且加一个通知,如果指标跌破区间,就通过 TradingView 发邮件提醒。通过这个过程,也学习一下 TradingView 的脚本编写。</p>
<p>具体效果见下图</p>
<p><img src="https://scottyeung.top/my-images/202412311325330.png" alt=""></p>
<p>以下脚本代码主要通过 AI 辅助写出,有需要的话可以自取添加指标。这里指标只能针对日区间数据,需要把变更区间设置成 1d.</p>
<pre tabindex="0"><code class="language-pine" data-lang="pine">//@version=6
indicator(&#39;BTC AHR999 Index&#39;, overlay = false)
// 确保在日线图表上使用
if not timeframe.isdaily
runtime.error(&#39;请在日线图表上使用此指标&#39;)
// 计算币龄(从2009年1月3日开始)
GENESIS_TIMESTAMP = timestamp(&#39;2009-01-03&#39;)
days_since_genesis = (time - GENESIS_TIMESTAMP) / (1000 * 60 * 60 * 24)
// 计算指数增长估值
// formula: 10^(5.84 * log(币龄) - 17.01)
exp_growth = math.pow(10, 5.84 * math.log10(days_since_genesis) - 17.01)
// 计算200日定投成本(简单移动平均)
// sma_200 = ta.sma(close, 200)
f_gma(src, len) =&gt;
sum_logs = 0.0
for i = 0 to len - 1 by 1
sum_logs := sum_logs + math.log(src[i])
sum_logs
math.exp(sum_logs / len)
length = input.int(200, &#39;Length&#39;, minval = 1)
gma_200 = f_gma(close, length)
// 计算 AHR999 指数
// formula: (比特币价格/200日定投成本) * (比特币价格/指数增长估值)
ahr999 = close / gma_200 * (close / exp_growth)
// 为了使所有指标在同一个视图中可见,进行数值缩放
scale_factor = 1000 // 可以根据需要调整这个缩放因子
scaled_close = close / scale_factor
scaled_gma_200 = gma_200 / scale_factor
scaled_exp_growth = exp_growth / scale_factor
// 绘制所有指标
plot(ahr999, &#39;AHR999&#39;, color = color.blue, linewidth = 2, precision=3)
plot(scaled_close, &#39;当日收盘价&#39;, color = color.green, linewidth = 1, precision=3)
plot(scaled_gma_200, &#39;200日定投成本&#39;, color = color.orange, linewidth = 1, precision=3)
plot(scaled_exp_growth, &#39;指数增长估值&#39;, color = color.purple, linewidth = 1, precision=3)
// 添加 AHR999 的参考线
hline(0.45, &#39;极度抄底区&#39;, color = color.green, linestyle = hline.style_dashed)
hline(1.2, &#39;中性&#39;, color = color.gray)
hline(4, &#39;极度卖出区&#39;, color = color.red, linestyle = hline.style_dashed)
// 添加图例说明
var tbl = table.new(position.top_right, 4, 2, bgcolor = color.new(color.black, 70))
table.cell(tbl, 0, 0, &#39;指标&#39;, text_color = color.white)
table.cell(tbl, 0, 1, &#39;实际值&#39;, text_color = color.white)
table.cell(tbl, 1, 0, &#39;收盘价&#39;, text_color = color.green)
table.cell(tbl, 1, 1, str.tostring(close, format.volume), text_color = color.green)
table.cell(tbl, 2, 0, &#39;200MA&#39;, text_color = color.orange)
table.cell(tbl, 2, 1, str.tostring(gma_200, format.volume), text_color = color.orange)
table.cell(tbl, 3, 0, &#39;指数估值&#39;, text_color = color.purple)
table.cell(tbl, 3, 1, str.tostring(exp_growth, format.volume), text_color = color.purple)
</code></pre></description><category domain="https://scottyeung.top/posts/">posts</category><category domain="https://scottyeung.top/tags/%E6%8A%95%E8%B5%84/">投资</category><category domain="https://scottyeung.top/tags/%E5%B7%A5%E5%85%B7/">工具</category><category domain="https://scottyeung.top/tags/%E5%AD%A6%E4%B9%A0/">学习</category></item><item><title>博客 RSS 抓取失败</title><link>https://scottyeung.top/2024/rss-fetch-failed/</link><guid isPermaLink="true">https://scottyeung.top/2024/rss-fetch-failed/</guid><pubDate>Sun, 29 Dec 2024 11:50:22 +0800</pubDate><author>[email protected] (YeungYeah)</author><description><p>上两周收到 <a href="https://github.com/nju-lug/blogroll">NJU-LUG Blogroll</a> 维护者的一封邮件,告诉我本博客的 RSS 抓取出了问题,让我有空时看一下。由于最近两个月没更新博客,也没时间关注,所以并未注意到抓取存在问题。昨天更新了一篇文章后,今天发现阅读量依然是零。打开 <a href="https://app.follow.is/share/feeds/55149012216215581">Follow</a> 一看,才发现 Follow 的抓取也出问题了。</p>
<p>收到邮件时,我在本地测试了一下,RSS 是可以正常打开的。随后查看 NJU-LUG Blogroll 提供的失败日志,提示访问超时。初步判断可能是 CDN 出了问题。</p>
<p>于是登录又拍云,检查了一下 CDN 的配置,最终发现了一个<strong>加速区域</strong>的配置项。默认配置是国内加速,这会导致海外的请求被路由到国内的 CDN 节点。看起来问题应该就出在这里——海外访问(比如 GitHub Action)最近可能无法正常访问又拍云的国内 CDN 节点,导致超时,从而无法抓取 RSS。</p>
<p><img src="https://scottyeung.top/my-images/202412291319630.png" alt=""></p>
<p>将配置改为全球加速后,我在 Follow 中重新抓取,问题顺利解决。</p></description><category domain="https://scottyeung.top/posts/">posts</category><category domain="https://scottyeung.top/tags/%E5%8D%9A%E5%AE%A2/">博客</category><category domain="https://scottyeung.top/tags/GitHub/">GitHub</category><category domain="https://scottyeung.top/tags/rss/">rss</category><category domain="https://scottyeung.top/tags/%E8%AE%B0%E5%BD%95/">记录</category></item><item><title>如履薄冰</title><link>https://scottyeung.top/2024/walking-on-thin-ice/</link><guid isPermaLink="true">https://scottyeung.top/2024/walking-on-thin-ice/</guid><pubDate>Sat, 28 Dec 2024 17:20:02 +0800</pubDate><author>[email protected] (YeungYeah)</author><description><p>因为剩了一点假期的原因,昨天就提前结束了今年的工作日。当然,结束的只是今年不用去上班的日子,有事情还是得干。甚至周六中午还因为时差的原因,需要给美国同事排查问题、回复消息。太久没更新了,就随便总结和吐槽一下工作吧。</p>
<p>马上就要成为入职一年半的职场练习生了。回想这段时间,最大的感受就是——慌。又慌又焦虑。担心事情搞不定,担心会出什么问题,担心会不会有故障或者资损风险。真的是如履薄冰,每一步都得小心翼翼,生怕踩到一个坑。一方面是因为有许多外部因素不可控,另一方面是业务系统范围实在太大,边边角角太多,很容易忽略一些细节踩坑。真的防不胜防,而且有些问题可能根本不是自己能够避免的。</p>
<h2 id="不能犯错的压力">“不能犯错”的压力</h2>
<p>之所以这么慌,还是因为“不能犯错”这个点。在大厂里,犯错的代价太高了。一个故障,一个资损,可能直接就得背个低绩效,甚至还有可能被“请走”。即使没到那么严重的地步,在这个竞争激烈、内卷严重的环境中,一次失误也足以影响后续的晋升和发展。</p>
<p>但这不仅仅是互联网行业的现象。前几天看新闻,一个律师因为忘了告知当事人补 5 块诉讼费,被对方起诉仲裁,最后赔了一百多万。律师这行也是高风险职业。这让我更加深刻地意识到,有些职业的犯错成本就是太高,根本不能出错。</p>
<h2 id="工作与生活难分离">工作与生活难分离</h2>
<p>除了“不能犯错”的压力,另一个让我觉得疲惫的,是工作和生活实在难以完全分开。</p>
<p>首先是工作时间的问题。下班晚已经是常态了,有时候加班到晚上十点多,回到家基本就只剩下洗漱睡觉的时间,一点自己的生活都没有。就算偶尔早点下班,也时不时会有人来找。</p>
<p>其次,每个人都在整个业务链条上扮演着某个环节。如果你没完成任务,就会阻塞到其他人;反过来,如果别人没完成任务,你也会被卡住。为了不耽误事情,只能在一些不恰当的时间打扰别人,比如晚上或者周末。当然,这种打扰是相互的,我也经常在休息的时候被各种消息轰炸。久而久之,生活和工作的界限就变得模糊不清。</p>
<h2 id="能怎么办">能怎么办</h2>
<p>工作始终还是工作,工作为了赚钱,赚钱为了生活。未来目标还是希望能够找到一个舒服点的行业或岗位,能够犯错,没那么高压。<del>当然最理想的还是不用工作了,</del> 不知到哪一天能够真的靠被动收入养活自己,希望不是得等到退休的那一天(当然也不一定能真的干到退休)。</p></description><category domain="https://scottyeung.top/posts/">posts</category><category domain="https://scottyeung.top/tags/%E7%94%9F%E6%B4%BB/">生活</category><category domain="https://scottyeung.top/tags/%E9%9A%8F%E7%AC%94/">随笔</category><category domain="https://scottyeung.top/tags/%E5%B7%A5%E4%BD%9C/">工作</category><category domain="https://scottyeung.top/tags/%E5%90%90%E6%A7%BD/">吐槽</category></item><item><title>Arc 书签导出</title><link>https://scottyeung.top/2024/export-arc-bookmarks/</link><guid isPermaLink="true">https://scottyeung.top/2024/export-arc-bookmarks/</guid><pubDate>Wed, 02 Oct 2024 20:02:42 +0800</pubDate><author>[email protected] (YeungYeah)</author><description><p>最近想着从 Arc 浏览器撤出,重新用回 edge 浏览器。更换浏览器,自然需要迁移在 Arc 这里的使用历史数据,最主要的就是书签,或者在 Arc 这里叫做 Pined Tab。然而找了一圈,居然没找到导出的地方,搜索了一下,这个使用 chromium 内核的 Arc 浏览器,居然还真没有导出书签的地方(<a href="https://sspai.com/post/81942">Arc 浏览器的用户体验之耻,无法导出收藏的网址
</a>)。。。</p>
<p>根据少数派看到的文章,浏览器本身没有导出书签的功能,只能够到应用到目录找到数据文件,具体的路径在 <code>/Users/{你的用户名}/Library/Application Support/Arc/StorableSidebar.json</code></p>
<p><img src="https://scottyeung.top/my-images/202410012019733.png" alt=""></p>
<p>导出的数据文件里包含了 Pined tabs 的 url 和标题。然而这个 json 数据格式 chrome/edge 浏览器还不能够直接导入,还需要转换成相应的 html 格式。</p>
<p>上面少数派文章的评论区里面有人贴出了转换的页面,但是试用了一下,收藏的分组名和层级会丢失,于是又自己写了一个,可以试用一下。找到上面路径的文件复制里面的文本内容贴到网页使用就可以。</p>
<p>具体的地址是:<a href="https://scottyeung.top/arc-bookmarks-export/">https://scottyeung.top/arc-bookmarks-export/</a></p>
<ul>
<li>支持按照层级分组导出书签</li>
<li>会将打开的标签页,Pined Tab 上面固定的应用 tab 也导出
<ul>
<li>但是这些导出的没有区分出来,统一放在最外层分组的最底下</li>
<li>因此导出前最好先把 Arc 浏览器打开没有关闭的 tab 先关掉</li>
</ul>
</li>
</ul></description><category domain="https://scottyeung.top/posts/">posts</category><category domain="https://scottyeung.top/tags/%E5%B7%A5%E5%85%B7/">工具</category><category domain="https://scottyeung.top/tags/%E5%90%90%E6%A7%BD/">吐槽</category><category domain="https://scottyeung.top/tags/%E8%BD%AF%E4%BB%B6/">软件</category></item><item><title>站点SEO与被镜像</title><link>https://scottyeung.top/2024/mirror-website-in-seo/</link><guid isPermaLink="true">https://scottyeung.top/2024/mirror-website-in-seo/</guid><pubDate>Fri, 27 Sep 2024 21:23:32 +0800</pubDate><author>[email protected] (YeungYeah)</author><description><p>之前看到有推友吐槽自己的站点被镜像了,当时还觉得我这种没什么人看的小网站应该不会有人盯上吧。结果一搜还真有过,还贴心地翻译成了繁体字。。。而且搜索引擎展示位置还挺靠前的,会不会被人当成是我的繁体站点了。</p>
<p><img src="https://scottyeung.top/my-images/202409272133506.png" alt=""></p>
<p>直接点开后发现 404,一开始还以为已经停掉了,后面看其他博主的文章才发现只是屏蔽了内地 IP,切换后发现,这个镜像站还活得好好的,最好笑的是把我这篇吐槽镜像站的文章也镜像过去了。</p>
<p><img src="https://scottyeung.top/my-images/202409281241071.png" alt=""></p>
<p>细看了一下,这个镜像还做了一些替换,除了翻译成繁体字以外,还把网站里面出现的所有关于域名 scottyeung.top 都去掉或者替换成他的域名。</p>
<p><img src="https://scottyeung.top/my-images/202409281247721.png" alt="">
<img src="https://scottyeung.top/my-images/202409281247266.png" alt=""></p>
<p>博客还是用了 Waline 作为评论系统,这个镜像也直接镜像过去,还好这里有对域名的校验,不然直接连访问次数和评论数据都被污染掉了。</p>
<p>很气,但也只能加个防盗跳转链接,以及向搜索引擎和 dns 解析商进行反馈了,相关的方法可以参考 <a href="https://yfzhu.cn/posts/1014/">网站被恶意镜像了该怎么办
</a>。</p>
<hr>
<p>之前一直都对于这种 copy 别人内容,构建内容农场非常厌恶,之前甚至还考虑过要不要把 RSS 订阅的全文给去掉,只保留摘要(<a href="https://scottyeung.top/2022/rss-output-all/">RSS 应否开启全文订阅</a>)。但真没想到居然还有整个网站 copy 过来搞一个镜像站的操作,未免有点可怕了。更可怕的是镜像的如果再多点,且 SEO 如果做得再好点,会不会有朝一日直接把我的网站给淹没了,一搜直接搜到别人的网站去。</p>
<p>然后更搞笑的是,打开很少用的百度搜索了一下自己,自己搜不出来站点的任何内容。当场非常震惊,明明记得自己以前也在百度注册过站点,并提交了站点地图。然后发现可能是因为博客当初从 hexo 切换成 hugo 之后,生成的站点地图 sitemap 原地址变成了一个索引型sitemap,而百度已经不支持了。</p>
<p><img src="https://scottyeung.top/my-images/202409272155445.png" alt=""></p>
<p>即使删除后,也不给我再添加,也不知道是不是明天才能刷新这个提交上限😂</p>
<p>虽然我自己已经不怎么用百度了,但是 SEO 不占领,万一被人通过 SEO 将 copy 的内容或者镜像站冲上前面了,岂不是在百度上替代了我,成为 another YeungYeah?不能容忍。</p></description><category domain="https://scottyeung.top/posts/">posts</category><category domain="https://scottyeung.top/tags/%E5%8D%9A%E5%AE%A2/">博客</category><category domain="https://scottyeung.top/tags/%E5%90%90%E6%A7%BD/">吐槽</category></item><item><title>FoldLeft and FoldRight</title><link>https://scottyeung.top/2024/foldleft-and-foldright/</link><guid isPermaLink="true">https://scottyeung.top/2024/foldleft-and-foldright/</guid><pubDate>Tue, 03 Sep 2024 23:08:35 +0800</pubDate><author>[email protected] (YeungYeah)</author><description><p>看 [[Scala 函数式编程]] 当中做的练习,还挺有意思。</p>
<p>实现了 foldLeft 合 foldRight 之后,如何使用 foldRight / foldLeft 实现 foldRight / foldLeft?</p>
<blockquote>
<p>Hard: Can you write foldRight in terms of foldLeft? How about the other way around? Implementing foldRight via foldLeft is useful because it lets us implement foldRight tail recursively, which means it works even for large lists without overflowing the stack.</p>
</blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">def</span> <span class="n">foldRight</span><span class="o">[</span><span class="kt">A</span>,<span class="kt">B</span><span class="o">](</span><span class="n">as</span><span class="k">:</span> <span class="kt">List</span><span class="o">[</span><span class="kt">A</span><span class="o">],</span> <span class="n">z</span><span class="k">:</span> <span class="kt">B</span><span class="o">)(</span><span class="n">f</span><span class="k">:</span> <span class="o">(</span><span class="kt">A</span><span class="o">,</span> <span class="kt">B</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">B</span><span class="o">)</span><span class="k">:</span> <span class="kt">B</span> <span class="o">=</span> <span class="n">as</span> <span class="k">match</span>
</span></span><span class="line"><span class="cl"> <span class="k">case</span> <span class="nc">Nil</span> <span class="k">=&gt;</span> <span class="n">z</span>
</span></span><span class="line"><span class="cl"> <span class="k">case</span> <span class="n">x</span><span class="k">:</span><span class="kt">:xs</span> <span class="o">=&gt;</span> <span class="n">f</span><span class="o">(</span><span class="n">x</span><span class="o">,</span> <span class="n">foldRight</span><span class="o">(</span><span class="n">xs</span><span class="o">,</span> <span class="n">z</span><span class="o">)(</span><span class="n">f</span><span class="o">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="n">foldLeft</span><span class="o">[</span><span class="kt">A</span>,<span class="kt">B</span><span class="o">](</span><span class="n">as</span><span class="k">:</span> <span class="kt">List</span><span class="o">[</span><span class="kt">A</span><span class="o">],</span> <span class="n">z</span><span class="k">:</span><span class="kt">B</span><span class="o">)(</span><span class="n">f</span><span class="k">:</span> <span class="o">(</span><span class="kt">B</span><span class="o">,</span> <span class="kt">A</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">B</span><span class="o">)</span><span class="k">:</span> <span class="kt">B</span> <span class="o">=</span> <span class="n">as</span> <span class="k">match</span>
</span></span><span class="line"><span class="cl"> <span class="k">case</span> <span class="nc">Nil</span> <span class="k">=&gt;</span> <span class="n">z</span>
</span></span><span class="line"><span class="cl"> <span class="k">case</span> <span class="n">x</span><span class="k">:</span><span class="kt">:xs</span> <span class="o">=&gt;</span> <span class="n">foldLeft</span><span class="o">(</span><span class="n">xs</span><span class="o">,</span> <span class="n">f</span><span class="o">(</span><span class="n">z</span><span class="o">,</span> <span class="n">x</span><span class="o">))(</span><span class="n">f</span><span class="o">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>看到这个第一反应想到一个很 trick 的想法: foldRight 其实不就等于 reverse 之后再 foldLeft 吗?刚好前面也用 foldLeft 实现了 reverse.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">def</span> <span class="n">reverse</span><span class="o">[</span><span class="kt">A</span><span class="o">](</span><span class="n">list</span><span class="k">:</span> <span class="kt">List</span><span class="o">[</span><span class="kt">A</span><span class="o">])</span><span class="k">:</span> <span class="kt">List</span><span class="o">[</span><span class="kt">A</span><span class="o">]</span> <span class="k">=</span> <span class="n">foldLeft</span><span class="o">(</span><span class="n">list</span><span class="o">,</span> <span class="nc">List</span><span class="o">.</span><span class="n">empty</span><span class="o">[</span><span class="kt">A</span><span class="o">])((</span><span class="n">acc</span><span class="o">,</span> <span class="n">h</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">h</span><span class="k">:</span><span class="kt">:acc</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="n">foldRightViaFoldLeft</span><span class="o">[</span><span class="kt">A</span>, <span class="kt">B</span><span class="o">](</span><span class="n">l</span><span class="k">:</span> <span class="kt">List</span><span class="o">[</span><span class="kt">A</span><span class="o">],</span> <span class="n">acc</span><span class="k">:</span> <span class="kt">B</span><span class="o">,</span> <span class="n">f</span><span class="k">:</span> <span class="o">(</span><span class="kt">A</span><span class="o">,</span> <span class="kt">B</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">B</span><span class="o">)</span><span class="k">:</span> <span class="kt">B</span>
</span></span><span class="line"><span class="cl"> <span class="k">=</span> <span class="n">foldLeft</span><span class="o">(</span><span class="n">reverse</span><span class="o">(</span><span class="n">l</span><span class="o">),</span> <span class="n">acc</span><span class="o">)(</span><span class="n">f</span><span class="o">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>除了这种 trick 以外,还有没其他方法呢?搜了一下官方解答,给的另一种办法是这样的</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">def</span> <span class="n">foldRightViaFoldLeft</span><span class="o">[</span><span class="kt">A</span>, <span class="kt">B</span><span class="o">](</span><span class="n">l</span><span class="k">:</span> <span class="kt">List</span><span class="o">[</span><span class="kt">A</span><span class="o">],</span> <span class="n">acc</span><span class="k">:</span> <span class="kt">B</span><span class="o">,</span> <span class="n">f</span><span class="k">:</span> <span class="o">(</span><span class="kt">A</span><span class="o">,</span> <span class="kt">B</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">B</span><span class="o">)</span><span class="k">:</span> <span class="kt">B</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl"> <span class="n">foldLeft</span><span class="o">(</span><span class="n">l</span><span class="o">,</span> <span class="o">(</span><span class="n">b</span><span class="k">:</span> <span class="kt">B</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">b</span><span class="o">)((</span><span class="n">g</span><span class="o">,</span> <span class="n">a</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="o">(</span><span class="n">b</span><span class="k">:</span> <span class="kt">B</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">g</span><span class="o">(</span><span class="n">f</span><span class="o">(</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">)))(</span><span class="n">acc</span><span class="o">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>看了好一会,然后删掉自己重新一次之后,才理解过来。思路就是在 foldLeft 的过程,维护一个 acc 的函数,然后将前面的元素逐个塞到这个函数里面,越后面的元素塞在越里层,最右面的函数最先开始处理。通过 foldLeft 得到这个函数后,再传初值调用即可。</p>
<p>让 gpt 生成的一个例子</p>
<ul>
<li>假设我们有一个列表 <code>List(1, 2, 3)</code>,一个初始值 <code>0</code>,和一个函数 <code>f = (a: Int, b: Int) =&gt; a + b</code>。调用 <code>foldRightViaFoldLeft_1(List(1, 2, 3), 0, (a, b) =&gt; a + b)</code> 会构建如下的函数链:
<ul>
<li>初始值是 <code>(b: Int) =&gt; b</code>。</li>
<li>第一个元素 <code>1</code>:<code>(g, a) =&gt; b =&gt; g(f(a, b))</code> 变成 <code>(b: Int) =&gt; (b: Int) =&gt; b + 1</code>。</li>
<li>第二个元素 <code>2</code>:<code>(b: Int) =&gt; ((b: Int) =&gt; b + 1)(b + 2)</code>。</li>
<li>第三个元素 <code>3</code> :<code>(b: Int) =&gt; (((b: Int) =&gt; b + 1)(b + 2))(b + 3)</code>。</li>
</ul>
</li>
<li>最终这个链会被应用到初始值 <code>0</code> 上,得到 <code>0 + 3 + 2 + 1</code>,即 <code>6</code>。</li>
</ul>
<p>说实话有了思路,写起来也还是挺绕的,但是写着写着意识到,其实可以根据类型来判断填什么值,这样就很好写了。</p></description><category domain="https://scottyeung.top/posts/">posts</category><category domain="https://scottyeung.top/tags/Scala/">Scala</category><category domain="https://scottyeung.top/tags/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B/">函数式编程</category><category domain="https://scottyeung.top/tags/coding-%E5%AD%A6%E4%B9%A0/">coding 学习</category></item><item><title>LeetCode: Make a Square with the Same Color</title><link>https://scottyeung.top/2024/3127-leetcode/</link><guid isPermaLink="true">https://scottyeung.top/2024/3127-leetcode/</guid><pubDate>Sat, 31 Aug 2024 11:25:27 +0800</pubDate><author>[email protected] (YeungYeah)</author><description><h2 id="problem">Problem</h2>
<p>source: <a href="https://leetcode.cn/problems/make-a-square-with-the-same-color/description/">3127. Make a Square with the Same Color</a></p>
<p>difficulty: easy</p>
<p>You are given a 2D matrix grid of size 3 x 3 consisting only of characters 'B' and 'W'. Character 'W' represents the white color, and character 'B' represents the black color.</p>
<p>Your task is to change the color of at most one cell so that the matrix has a 2 x 2 square where all cells are of the same color.</p>
<p>Return true if it is possible to create a 2 x 2 square of the same color, otherwise, return false.</p>
<h3 id="constraints">Constraints:</h3>
<ul>
<li><code>grid.length == 3</code></li>
<li>``grid[i].length == 3`</li>
<li><code>grid[i][j] is either 'W' or 'B'</code>.</li>
</ul>
<h2 id="solution">Solution</h2>
<p>问题可以转化成判断 matrix 是否存在一个 2 * 2 的 matrix,其中包含 3 or 4 个相同的元素。</p>
<p>但是再仔细一看 matrix 只有 3 * 3,因此可以直接分成 4 个 block,分别判断 4 个 block 是否存在就行了。</p>
<h3 id="kotlin">Kotlin</h3>
<p>直接判断每一个点分别在哪些 block 里面,但是这几个 if 判断就写得很丑陋(写了一个之后干脆打开 GitHub Copilot 生成算了)</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-kotlin" data-lang="kotlin"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">fun</span> <span class="nf">canMakeSquare</span><span class="p">(</span><span class="n">grid</span><span class="p">:</span> <span class="n">Array</span><span class="p">&lt;</span><span class="n">CharArray</span><span class="p">&gt;):</span> <span class="n">Boolean</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">val</span> <span class="py">cnt</span> <span class="p">=</span> <span class="n">IntArray</span><span class="p">(</span><span class="m">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">fun</span> <span class="nf">Char</span><span class="p">.</span><span class="k">value</span><span class="p">():</span> <span class="n">Int</span> <span class="p">=</span> <span class="k">if</span> <span class="p">(</span><span class="k">this</span> <span class="o">==</span> <span class="sc">&#39;B&#39;</span><span class="p">)</span> <span class="m">1</span> <span class="k">else</span> <span class="p">-</span><span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">i</span> <span class="k">in</span> <span class="m">0.</span><span class="p">.</span><span class="m">2</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">j</span> <span class="k">in</span> <span class="m">0.</span><span class="p">.</span><span class="m">2</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="m">2</span> <span class="o">&amp;&amp;</span> <span class="n">j</span> <span class="p">&lt;</span> <span class="m">2</span><span class="p">)</span> <span class="n">cnt</span><span class="p">[</span><span class="m">0</span><span class="p">]</span> <span class="o">+=</span> <span class="n">grid</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="k">value</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="m">2</span> <span class="o">&amp;&amp;</span> <span class="n">j</span> <span class="p">&gt;</span> <span class="m">0</span><span class="p">)</span> <span class="n">cnt</span><span class="p">[</span><span class="m">1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">grid</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="k">value</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span> <span class="n">i</span> <span class="p">&gt;</span> <span class="m">0</span> <span class="o">&amp;&amp;</span> <span class="n">j</span> <span class="p">&lt;</span> <span class="m">2</span><span class="p">)</span> <span class="n">cnt</span><span class="p">[</span><span class="m">2</span><span class="p">]</span> <span class="o">+=</span> <span class="n">grid</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="k">value</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span> <span class="n">i</span> <span class="p">&gt;</span> <span class="m">0</span> <span class="o">&amp;&amp;</span> <span class="n">j</span> <span class="p">&gt;</span> <span class="m">0</span><span class="p">)</span> <span class="n">cnt</span><span class="p">[</span><span class="m">3</span><span class="p">]</span> <span class="o">+=</span> <span class="n">grid</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="k">value</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">cnt</span><span class="p">.</span><span class="n">any</span><span class="p">()</span> <span class="p">{</span> <span class="k">it</span> <span class="k">in</span> <span class="n">listOf</span><span class="p">(</span><span class="m">2</span><span class="p">,</span> <span class="p">-</span><span class="m">2</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="p">-</span><span class="m">4</span><span class="p">)</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="scala">Scala</h3>
<p>最近在学 Scala,于是自然又用 Scala 写一次。相比于此前丑陋的 if 判断,干脆写得更加函数式,试一下 loop free。</p>
<p>直接三行搞定。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-Scala" data-lang="Scala"><span class="line"><span class="cl"><span class="k">object</span> <span class="nc">Solution</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="n">canMakeSquare</span><span class="o">(</span><span class="n">grid</span><span class="k">:</span> <span class="kt">Array</span><span class="o">[</span><span class="kt">Array</span><span class="o">[</span><span class="kt">Char</span><span class="o">]])</span><span class="k">:</span> <span class="kt">Boolean</span> <span class="o">=</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="n">getRange</span> <span class="k">=</span> <span class="k">for</span> <span class="o">{</span> <span class="n">i</span> <span class="k">&lt;-</span> <span class="mi">0</span> <span class="n">to</span> <span class="mi">1</span><span class="o">;</span> <span class="n">j</span> <span class="k">&lt;-</span> <span class="mi">0</span> <span class="n">to</span> <span class="mi">1</span><span class="o">}</span> <span class="k">yield</span> <span class="o">(</span><span class="n">i</span><span class="o">,</span> <span class="n">j</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="n">check</span><span class="o">(</span><span class="n">x</span><span class="k">:</span> <span class="kt">Int</span><span class="o">,</span> <span class="n">y</span><span class="k">:</span> <span class="kt">Int</span><span class="o">)</span><span class="k">:</span> <span class="kt">Boolean</span> <span class="o">=</span> <span class="n">getRange</span><span class="o">.</span><span class="n">count</span><span class="o">((</span><span class="n">i</span><span class="o">,</span> <span class="n">j</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">grid</span><span class="o">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">i</span><span class="o">)(</span><span class="n">y</span> <span class="o">+</span> <span class="n">j</span><span class="o">)</span> <span class="o">==</span> <span class="sc">&#39;B&#39;</span><span class="o">)</span> <span class="o">!=</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">getRange</span><span class="o">.</span><span class="n">count</span><span class="o">((</span><span class="n">i</span><span class="o">,</span> <span class="n">j</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">check</span><span class="o">(</span><span class="n">i</span><span class="o">,</span> <span class="n">j</span><span class="o">))</span> <span class="o">&gt;=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"> <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div></description><category domain="https://scottyeung.top/posts/">posts</category><category domain="https://scottyeung.top/tags/LeetCode/">LeetCode</category><category domain="https://scottyeung.top/tags/%E7%AE%97%E6%B3%95/">算法</category><category domain="https://scottyeung.top/tags/kotlin/">kotlin</category><category domain="https://scottyeung.top/tags/Scala/">Scala</category></item><item><title>手动生成 SSL 证书添加到又拍云</title><link>https://scottyeung.top/2024/gen-ssl-for-upyun/</link><guid isPermaLink="true">https://scottyeung.top/2024/gen-ssl-for-upyun/</guid><pubDate>Fri, 05 Jul 2024 20:35:47 +0800</pubDate><author>[email protected] (YeungYeah)</author><description><p>本站一直用又拍云进行 CDN 加速,因为又拍云有一个又拍云联盟的活动,博主只需要在网站放一个 LOGO 即可获取一定的免费额度。唯一的问题就是需要每年重新申请一下这个又拍云的活动。</p>
<p>又拍云还提供 SSL 证书申请与管理,可以一站式管理 HTTPS 的问题。之前一直用他家的 TrustAsia DV SSL 单域名证书,还可以自动续签。然而今年到期后开始收费了,只能转向免费的 Let's Encrypt. 但不知道又拍云还是 Let's Encrypt 这里抽什么风,重复申请好几次都还是失败,提工单来来回回咨询了很多次都没有结果,最后跟我说的厂商 Let's Encrypt 给我限制了。。。</p>
<p><img src="https://scottyeung.top/my-images/202407052046999.png" alt=""></p>
<p>没办法,而且我的旧证书马上就要过期了,只能自己动手,丰衣足食。又拍云支持上传自己的证书,干脆我自己去 Let's Encrypt 申请一个证书上传上去。</p>
<p>我用的是 <a href="https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E">acme.sh</a> 进行的申请,使用起来也很简单。</p>
<ol>
<li>
<p>安装 acme.sh</p>
<ol>
<li><code>curl https://get.acme.sh | sh -s [email protected]</code></li>
<li>安装后默认会搞一个每天 0 点运行的 crontab 自动更新过期证书</li>
</ol>
</li>
<li>
<p>我这里用的是 dns 验证域名所有权的方式.</p>
<ol>
<li>手动验证(不能够自动更新,每次都需要手动更新)
<ol>
<li>生成 dns 验证相关的 dns 配置,生成后需要添加 dns 解析。
<ol>
<li><code>acme.sh --issue --dns -d scottyeung.top --yes-I-know-dns-manual-mode-enough-go-ahead-please</code></li>
</ol>
</li>
<li>添加 dns 解析后,生成证书。
<ol>
<li><code>acme.sh --renew -d scottyeung.top --yes-I-know-dns-manual-mode-enough-go-ahead-please</code></li>
</ol>
</li>
</ol>
</li>
<li>自动验证。通过申请 DNS 解析商的 API Key,访问 DNS 解析商来进行验证
<ol>
<li>申请解析商相应的 API key,并通过环境变量进行设置。不同的解析商使用不同的变量命名,可以参考 <a href="https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_dp">acme.sh/wiki</a>。下面以 DNSPod 为例
<ol>
<li>
<pre tabindex="0"><code>export DP_Id=&#34;&lt;id&gt;&#34;
export DP_Key=&#34;&lt;key&gt;&#34;
</code></pre></li>
</ol>
</li>
<li>生成证书
<ol>
<li><code>./acme.sh --issue --dns dns_dp -d scottyeung.top</code></li>
</ol>
</li>
</ol>
</li>
</ol>
</li>
<li>
<p>最终生成的证书和私钥放在 <code>~/.acme.sh/scottyeung.top_ecc</code></p>
<ol>
<li>证书:fullchain.cer</li>
<li>私钥:scottyeung.top.key</li>
</ol>
</li>
</ol>
<p>生成之后把证书和私钥上传到又拍云就可以。唯一的缺点是有效期比较短,只有 90 天,需要 60 天后更新,到时再看看能不能自动化更新。
(三个月已经到了,在更新的过程中意识到就算可以本地更新,还是需要手动上传到 又拍云 去,才能确保又拍云上面的证书不过期)。</p></description><category domain="https://scottyeung.top/posts/">posts</category><category domain="https://scottyeung.top/tags/%E5%8D%9A%E5%AE%A2/">博客</category><category domain="https://scottyeung.top/tags/%E8%AE%B0%E5%BD%95/">记录</category><category domain="https://scottyeung.top/tags/%E5%90%90%E6%A7%BD/">吐槽</category></item></channel></rss>