-
Notifications
You must be signed in to change notification settings - Fork 135
/
feed.xml
5882 lines (5758 loc) · 421 KB
/
feed.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
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom"><id>https://github.com/yihong0618/gitblog</id><title>RSS feed of yihong0618's gitblog</title><updated>2024-11-04T01:56:08.942469+00:00</updated><link href="https://github.com/yihong0618/gitblog"/><link href="https://raw.githubusercontent.com/yihong0618/gitblog/master/feed.xml" rel="self"/><generator uri="https://lkiesow.github.io/python-feedgen" version="1.0.0">python-feedgen</generator><entry><id>https://github.com/yihong0618/gitblog/issues/296</id><title>从给 RisingWave 提 PR 说起,聊聊怎么快速切入一个复杂的开源项目</title><updated>2024-11-04T01:56:09.153929+00:00</updated><content type="html"><![CDATA[<blockquote>
<p>对于大部分项目来说,如果想做一点贡献的话,只要跑起来其实已经能找到能贡献的地方了。</p>
</blockquote>
<h2>引子</h2>
<p>前阵子机缘巧合下接触到了 <a href="https://risingwave.com/database/">risingwave</a> 在这之前我可以说是仅仅从几个在这工作的几个厉害的推友那里得知有这么一个用 Rust 写的流数据库,而流数据库是什么,到底什么原理,也仅仅是有所想象。既然是机缘巧合下了解到的,就试试去看看他的代码,去了解下它到底是怎么回事儿,顺便学点什么。</p>
<p>这里特别感谢下<a href="https://github.com/MrCroxx">叉鸽</a>。</p>
<h2>正文</h2>
<p>那么如何快速去切入一个项目呢?Cursor, copilot, marscode? No, 目前这种补全工具在做一个几千个人做过的 demo 里,是无敌的,但对了解一个大项目,甚至能给这个大项目提交一点代码修改一些 bug 的能力近乎于 0. (突然想到好久没有当时特别火的那个解决程序员问题的创业公司的信息了,留下了个 demo, 半年过去了)</p>
<p>既然这些不行,什么可以呢?根据我自己的经验步骤如下。</p>
<ol>
<li>GitHub Actions workflow 比文档要好用,对于一个 CI/CD 写的好的项目,我一般会直接点开 <code>.github</code> 下面的 <code>workflow</code> 如果这个项目很成熟,里面大概率会包括,如何编译,编译需要的依赖是什么?如何测试,需要的版本,不同环境需要安装的不同的包,都会在这个 workflow 里。看里面的 workflow, 然后根据步骤,编译,跑一些简单的命令,项目就跑起来了。</li>
<li>去扫一眼 good first issue, 点开 issues -> tag 筛选 -> good first issue, 去找一个一般 type 为 bug 的,然后结合第一步跑起来的,去把这个 bug 复现,OK 如果能复现已经实现了 1/3 了。</li>
<li>去 PR 里看看,一般一个正在发展的项目会有很多活跃开发者提的 PR, 而提 PR 一般需要做一些本地测试或者写好 pr messaage, 在里面会有一些开发者习惯的命令,比如 <code>./risedev c</code> 可以在本地试一下。</li>
<li>OK 有了这个 ./risedev 跑一下,就大概知道了开发者们常用的命令,本地都实验一下,大致就知道开发流程了</li>
<li>语言是 Rust 我也不会啊?没啥问题啊,既然能跑起来试试呗,去网页搜索 <code>debug rust</code> OK 学习到了和 C 语言一样可以用 gdb 而且有 rust-binding 可以用 rust-gdb, 去项目目录看到,有一个 <code>.vscode</code> 文件夹里面有如何用 VSCode debug 他们用的是 lldb, 我习惯命令行,再搜索下 lldb 也有 binding -> rust-lldb</li>
<li>能 debug 其实又完成 1/3 了,接上面的能复现的 issue -> 跑起来 -> 复现 -> ps aux| grep risingwave 去找到进程号,卧槽!这里好多进程号,两个方案,去按照文档 + issue 搜索去研究下大概应该哪个进程 or 一个一个实验。我都做了。明白了这个 bug 是在 front 进程 -> rust-lldb -p ${pid} 这个时候去研究下需要 break 的点,怎么研究呢?当然是看 log 啊!找到了 log(发现其中有个可以改进一点点的点)正好可以帮提个 <a href="https://github.com/risingwavelabs/risingwave/pull/18845">PR</a>, 找到 log 后大概率能拿到 backtrace 当然也可在 lldb 中用 <code>bt</code> 拿到 backtrack 之后就可以去 break 你想 break 的点了(这里因为 Rust 我不太熟悉,项目也太大,lldb 略卡,我选择直接 break 行号 <code>b xxxxxxx.rs:41</code> 另一个 terminal 跑 sql 再去 lldb 里一步一步调试就好了。</li>
<li>调试的过程中一点一点学习相关的知识,这个时候无论是 google ChatGPT 还是其它的都会派上用场了,哪里不会问哪里。</li>
<li>最有效的可能是 issues 和 PR, 有时候有问题不解对于一个成熟的开源项目来说可以直接去 issues 里搜索相关的关键字,然后大概率有 PR 的双向链接,点进 PR 看代码更改的 diff 学习下前面的大哥是怎么做的,能帮忙更好的定位问题。</li>
<li>尝试解决问题。</li>
<li>解决不了其实无所谓,因为经过了以上的步骤其实对项目已经有一点点了解了,这就够了,能学到一些东西就更开心了。</li>
</ol>
<h2>尾巴</h2>
<ul>
<li>我的 <a href="https://github.com/risingwavelabs/risingwave/pulls?q=is%3Apr+author%3Ayihong0618">PR</a></li>
<li>为了解决 issue 一边学习 Rust 一边理解代码的流程提的 <a href="https://github.com/risingwavelabs/risingwave/pull/18785">PR</a> </li>
</ul>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/296"/><category term="技术文章"/><published>2024-10-11T07:28:08+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/294</id><title>能几日,又中秋</title><updated>2024-11-04T01:56:09.239888+00:00</updated><content type="html"><![CDATA[<blockquote>
<p>芦叶满汀洲,寒沙带浅流。二十年重过南楼。柳下系船犹未稳,能几日,又中秋。
黄鹤断矶头,故人今在否?旧江山浑是新愁。欲买桂花同载酒,终不似,少年游。</p>
</blockquote>
<h2>引子</h2>
<p>中秋过去了,跑完步坐在海边喝着冰啤酒,但因为路程的原因酒已经没那么冰了,不过月色正好,偶尔藏在云间,海风吹过,淡淡的月色铺在海面上荡起涟漪,旅游的人,跑步的人,三三两两跟着狗跑的大哥,在月色间,在海边一起度过中秋,我打开了这罐啤酒喝了起来。没那么凉爽,好在景色和心境足够,静静地享受这一刻的安宁。</p>
<h2>二十年</h2>
<p>这首词最吸引我的是这个二十年重过南楼。
中秋朋友带着女儿来大连玩了,我们也已经是快三十年的朋友了,二十年的场景仿佛弹指间,历历在目。如今我们都是父亲了,甚至不想去回忆过往,只是在朋友圈里感叹,我们初中的物理老师好像一点没见老。那时候好像是意气风发,觉得未来有着无限的可能,在操场每天晚上跑步,好像天上也有个巨大的月亮,月光洒下来,我们想着中考之后怎么玩,我们想着未来的某一天回忆起这月色。</p>
<h2>近况</h2>
<p>最近发生在自己身上的一些事儿还不想在公开场合表达,但是这段时间帮助我的人,朋友圈以为的点赞之交发来问候甚至帮助,大哥的领导素未相识,却帮助了我很多。我都铭记在心,也许未来我会尽量寻找机会和这些朋友喝上一杯,说一句谢谢你,在借用<strong>半拿铁</strong>里的一句"不容易啊"干了这杯聊表敬意和谢意。</p>
<p>儿子上学了,好像他还没有认识到自己身份的过度,对他来说可能不过是换了一个地方度过周一到周五,还挺有趣的。我和老婆倒是没说什么,童年太短暂了,他的快乐时光更短暂了,希望他慢一点长大。</p>
<h2>少年游</h2>
<p>我这两个月经常翻阅的是自己好多年前的跑步记录。
总在感叹,那时候跑的真快啊,跑了 20 年,近 5 年也总有机会追上曾经的自己,去突破一点成绩,却总在最后半途而废,始终也没在自己跑步这个爱好上有所建树,看看自己极限在哪。今年这几个月非常努力了,35 岁的我总在想着也许可以,也许可以追上二十几岁的自己,但是完全以另一个心境,另一个姿态的去追上二十几岁的自己。这半年,平均每个月平均配速进步十几秒,已经从 7mins 的配速到现在 5mins/10s的平均配速,也许真的可以,花上 1-2 年一点一点的去追上 20 几岁读研的时候在操场上套所有人一圈的自己,但这次我没想着超越别人(操场也他妈不让进了)
而只是去试着追上曾经的那个自己。</p>
<blockquote>
<p>欲买桂花同载酒,终不似,少年游。</p>
</blockquote>
<hr />
<p>10.7 补充,十一过完了,感觉没做啥。</p>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/294"/><category term="一些记录"/><published>2024-09-18T14:21:16+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/293</id><title>第一次 AI 尝试,完全用 AI(MarsCode) 做个需求</title><updated>2024-11-04T01:56:09.318830+00:00</updated><content type="html"><![CDATA[<h2>写在前面</h2>
<ol>
<li>这篇文章不是用 AI 写的</li>
<li>为啥不用 Cursor? 因为用 Cursor 8 岁小朋友就可以写</li>
<li>主要原因是朋友在 MarsCode 也算是帮朋友体验产品了</li>
<li>这篇文章和代码同步进行</li>
</ol>
<h2>需求</h2>
<ul>
<li>我想把我每年的周记打印成一个小册,物理留底</li>
<li>我的每年的周记是用 GitHub Issues 写的,是有 API 的</li>
<li>打印的话需要生成 pdf</li>
<li>最好包含图片</li>
</ul>
<h2>开始做吧</h2>
<ul>
<li>既然是完全用 AI 做我就争取不写一行代码</li>
<li>MarsCode 启动</li>
</ul>
<p>不太对,这个 issues 需要 token 不过可以跑一下试试,可以一键添加到文件还是挺方便的。</p>
<p><img src="https://github.com/user-attachments/assets/fb2b59e9-7238-44e7-bdc7-7b81f3732131" alt="image" /></p>
<p>继续对话,说实在的这次还挺惊艳的</p>
<p><img src="https://github.com/user-attachments/assets/87d61d4a-db08-4062-b858-c0f17e01ab3b" alt="image" /></p>
<p>需要让它把 issue_number 换成我周记的 issue number 这里要是能像某个最好的 AI 助手一样一键 diff 替换就好了,
省去了我主动改的步骤</p>
<p><img src="https://github.com/user-attachments/assets/2a95c5f9-299b-4748-b455-92dc92bd3b4d" alt="image" /></p>
<p>跑了一下,一次成功,还是有点牛逼的。这是我第一次完全用 AI 做一个功能,说实在的体验真的不错。</p>
<p><img src="https://github.com/user-attachments/assets/4dc21ebc-0376-4697-8e6f-db1e46e3ef0b" alt="image" /></p>
<p>OK 下面是有难度的,我需要让他生成 pdf 不知道我写简单的 prompt 能不能做的到
(看起来不太对,不过可以试试,再吐槽一下急需一个 diff apply 的功能)</p>
<p><img src="https://github.com/user-attachments/assets/a2070b8e-fdf8-4e62-b4b8-a3c3451a867c" alt="image" /></p>
<p>第一个错,是因为 GitHub 的 rate limit 看看它能解决么?</p>
<p><img src="https://github.com/user-attachments/assets/ce3eeed3-6866-497e-9b65-a10916c8bc78" alt="image" /></p>
<ul>
<li>不太对,我引导他可以用 token 解决试试</li>
<li>能解决还不错。
(期间吐槽,我自己写的话应该早就写完了,这个对于特别熟悉 api 的用处还是有限)
<img src="https://github.com/user-attachments/assets/90ccdb33-fac4-4492-9a6d-4d35cf223ff6" alt="image" /></li>
</ul>
<p>跑起来了,期间上下文丢失了一些信息,我手动改了一下(所以真的需要 diff)</p>
<p>但是是乱码。。。(这块如果支持上传图片就好了,目前 MarsCode 还不支持)
<img src="https://github.com/user-attachments/assets/8e919a76-fe01-4c41-99d3-97469acbbec5" alt="image" /></p>
<p>后面问了几次来解决乱码问题。。。
乱码问题花了最多的提问最多的时间,好在终于搞定了。</p>
<p><img src="https://github.com/user-attachments/assets/bfc309ca-7c3e-4486-b3c7-b09eae97bf1e" alt="image" /></p>
<p>试试能不能更厉害一点</p>
<p><img src="https://github.com/user-attachments/assets/8d28823c-ea2b-4668-bf1d-2efa61f5b6c6" alt="image" /></p>
<p>还行啊!成功了
<img src="https://github.com/user-attachments/assets/5ec2391f-ff08-4dbe-ae1c-4ec32edc6a9f" alt="image" /></p>
<h2>打印吧</h2>
<p>真的不错!
<img src="https://github.com/user-attachments/assets/8ef15937-568e-4143-ae89-b940b9b1548a" alt="image" />
<img src="https://github.com/user-attachments/assets/ba99dbf3-6b97-4551-a441-b155cef673ff" alt="image" /></p>
<h2>总结</h2>
<ul>
<li>至此人生第一次完全跟 AI 对话完成了一个功能</li>
<li>现在 AI 编程助手已经非常可用了</li>
<li>有 diff apply 就好了,有 diff apply 就好了,有 diff apply 就好了</li>
<li>虽然目前没有但是它免费啊,速度快啊,也就能接受了</li>
<li>需求实现,还是挺开心的</li>
<li>以前觉得 100% 用 AI 编程挺蠢的,试过之后发现还能用</li>
<li>但是这个目前的前提就是,你有不用 AI 也能做出来的能力,虽然看起来是悖论,但是是事实(尤其是这里遇到的编码问题)</li>
<li>谢谢花肉</li>
</ul>
<h2>Bonus</h2>
<p>试用 url: <a href="https://www.marscode.cn/home?utm_source=vx&utm_medium=article&utm_campaign=user1">https://www.marscode.cn/home?utm_source=vx&utm_medium=article&utm_campaign=user1</a></p>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/293"/><category term="技术文章"/><published>2024-09-10T05:53:19+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/292</id><title>一件趣事儿</title><updated>2024-11-04T01:56:09.464499+00:00</updated><content type="html"><![CDATA[<p>最近因为一些事情心情挺不好的,但是今天莫名其妙的被人骂小丑,反而让我心情好不少,因为整件事情过于巧合,错误的推理但是答案是对的。我感觉有必要记录一下。</p>
<h2>起</h2>
<p>跑完步打开推特,看到有人 at 我骂我小丑,本来不想理,但是他骂我小丑的理由是对的,我当时说的确实是他,虽然我不知道他怎么找到的,但是我觉得有必要回复一下。下面是截图:</p>
<p><img src="https://github.com/user-attachments/assets/27f64df0-9a23-4c67-a0d0-c6b30aa2d517" alt="image" />
<img src="https://github.com/user-attachments/assets/47d2aca3-1bfe-4122-8bb4-73ffdc4e62a5" alt="image" /></p>
<h2>承</h2>
<p>交流的过程不那么重要,虽然我第一次知道不去挂人不去指名道姓竟然成了流量霸凌。。。虽然这需要先忽略这个人是蓝 v 而我什么都不是的事实,但是确实不重要。我也表示了歉意,如果对方觉得不妥可以删除,但是他依然还在说。。我觉得无趣,就算了。</p>
<h2>转</h2>
<p>但是有意思的是,他怎么从我的周记里找到自己的??一起研究了一下搞明白了。</p>
<ul>
<li>他搜的是自己 v2ex 的流量</li>
<li>其中有这个链接 <a href="https://firstround.com/review/how-superhuman..">https://firstround.com/review/how-superhuman..</a>.</li>
<li>那篇日记里我分享了我非常喜欢的一个一个视频其中也有 superhuman</li>
<li>他就搜到自己了,用错误的方式搜到了对的自己,因为在一个 issue 里。。。</li>
<li>大概也觉得我在说他,但我几乎没跟别人吐槽过,而且那篇日记我在反思,自己未来大概率也会那样</li>
<li>哈哈哈,就特别有意思</li>
</ul>
<p><img src="https://github.com/user-attachments/assets/22bdebac-18ec-4cf9-bda2-dfbfa6c9b706" alt="image" /></p>
<h2>合</h2>
<p>这个故事告诉我:</p>
<ul>
<li>故事背后的东西比吵架有趣多了</li>
<li>用 Issue 写日记 SEO 权重竟然这么高,也导致了这个人搜到自己。</li>
<li>没事儿别网上搜自己,可能就巧了搜到别人骂你</li>
<li>你以为正确的事儿,可能在别人那是小丑</li>
<li>没事儿别网上搜自己</li>
<li>没事儿别网上搜自己</li>
</ul>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/292"/><category term="日记"/><published>2024-09-02T14:07:39+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/291</id><title>这玩意不是就__</title><updated>2024-11-04T01:56:09.547898+00:00</updated><content type="html"><![CDATA[<p>今天 X 上又遇到了这句话,记录一下。</p>
<p><img src="https://github.com/user-attachments/assets/8791927e-261d-48b1-8f2d-3c4cee069c86" alt="telegram-cloud-photo-size-5-6132185908607301735-y" /></p>
<p>大概率说这个话的人并无恶意,也不是想主动彰显自己又多牛逼,在他的生活里,人生中,这么说话才是正常的,走路带着风,出场带着音效的牛逼。
似乎很多事在他眼中都是简单的,所以他们对他们来说都简单到不屑于顾,甚至脑海中都能浮现他们用鼻子发出轻蔑的哼声的场景。
但是,他们知道自己很让人讨厌么?永远不会吧。</p>
<p>哦对,我甚至还收到过一个邮件,主要内容写的是,<code>你写的 xxx 项目不是就,没什么技术含量啊,为什么有这么多 stars</code>. 我还认真回复了。。。</p>
<p>昨天看了码农高天的一个视频,大概也是说的这种人,推荐一下。 -> <a href="https://www.bilibili.com/video/BV1ME421w7YB">答应我,做一个不那么让人讨厌的人</a></p>
<p>我一直很敬佩能自省的人,也希望我能做一个这样的人,如果我做的不对让人讨厌了,反省下说句对不起似乎并不难,在小孩的成长过程中父母教育小孩在大多数情况下什么是对的,什么是错的,小孩理解后,道歉,和父母说句我错了,也并不难。但从我观察来看,为什么到了成年人那里一句我错了,这么难呢?很可能就是,<code>这玩意不是就__</code> 的心态,他们居高临下的看着一切,因为他们确实在周遭的环境中或多或少取得了一些成绩,觉得全宇宙我最牛逼,如果我没做,那是因为我不屑于做,<code>这玩意不是就几行代码的事情么?</code></p>
<ul>
<li>记录一下也是提醒自己这样是让人讨厌的,即使有很小的概率自己说的是对的,但也不要做这样的人。</li>
<li>写完这篇以后没必要跟这样的人有情绪上的波动,因为说这样的话的也可能是自己的朋友,亲戚,他们意识不到而已,而我自己尽量当成没听到</li>
<li>如果未来我也说这样的话,希望我想起来自己写过这篇东西,反省下</li>
</ul>
<p>写到这儿。</p>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/291"/><category term="精进计划"/><published>2024-07-26T04:22:27+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/290</id><title>六月</title><updated>2024-11-04T01:56:09.629671+00:00</updated><content type="html"><![CDATA[<p>六月过完,感慨的是我的小孩可能是幼儿园最后完整的一个月了。他可能还不太懂分别与改变,未来的日子里也会经历无数次这样的分别,希望他好。
六月又想起来每天背一点单词,没有什么目的,就是很纯粹的点点,每天倒是多了一个日常。
六月和老婆结婚八周年了,每天依然和媳妇一起送娃上班,平淡日子里的日常。
六月几乎每天都早起跑步,不知不觉也成了日常的一部分。
六月重新算是认真跑起来 3 个月了,状态逐步提高,还不错。
六月工作上没那么满意,还好有朋友每天聊聊,也算是一种逃离。</p>
<hr />
<p>上半年过完了,下半年继续吧</p>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/290"/><category term="日记"/><category term="生活"/><published>2024-06-30T13:34:51+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/289</id><title>跑了 10000km 花了 13 年</title><updated>2024-11-04T01:56:09.708748+00:00</updated><content type="html"><![CDATA[<h2>起</h2>
<p>上周,我记录的数据过了 10000 km, 足足花了 13 年。跑过了 1w km 以后我去喝了一杯精酿,一边听着音乐一边回忆了一下这 13 年,值得纪念的场景还挺多。</p>
<p>大家可以访问我的<a href="https://yihong.run/">跑步主页</a>来看详细数据</p>
<p><img src="https://github.com/yihong0618/gitblog/assets/15976103/e67203fe-eacb-4d38-85c5-c1f24ed720ae" alt="image" /></p>
<h2>记录</h2>
<p>记录的好处是能随时翻看自己的数据,每一条数据也许就是一段回忆。点开 2012.10.16 的第一条数据,仿佛给我拉回了大学的校园。2013 第一次半马,那也是我第一次坐飞机,自己一个人去扬州跑的,想起了那时的自己,跑完马拉松打了个电话,电话那头的那个人现在是我们 6 岁半小孩的妈妈。</p>
<p><img src="https://github.com/yihong0618/gitblog/assets/15976103/db753214-422e-486c-a28d-5a7693ab9bc1" alt="image" /></p>
<p>2014 年第一个全马,跟我大学时候操场跑步认识的朋友在大连跑的,那时候来大连跑这个马拉松的我怎么也没想到,现在我已经在大连结婚生子工作第八个年头了。</p>
<p>2019 年的北马,那是我第一次真正意义的<strong>跑完</strong>马拉松,一分钟也没走,跑完的时候眼泪掉了下来,没想到接下来就是三年疫情,从那时到今天我再也没跑过马拉松了。</p>
<h2>身影</h2>
<p>跑步这么多年,我从来没参加任何跑团,99.9% 的时间都是我一个人跑的,我喜欢这种感觉,在社交网络,手机触手可及的今天,跑步是为数不多抛开通知,或听音乐,或听电台,或听自己呼吸的独处时间了。</p>
<ul>
<li>在操场上跑过 60 多圈</li>
<li>在海上(跨海大桥)跑过几十次</li>
<li>在暴雨里</li>
<li>在午夜从今天跑到明天</li>
</ul>
<h2>起落</h2>
<p>断断续续跑了这 13 年,中断了几次又重新跑起来,胖了几次又瘦回来了几次。速度快了又慢,慢了又快,始终没能有所建树,不过跑步对我来说就是跑步而已,曾经想能完成个半马,完成了,全马,也完成了,5km 进 20mins 也完成了。
也再没什么特别的目标,很单纯的记录这些,似乎这些已经成为了我的一部分。</p>
<blockquote>
<p>拿起与放下,中间才是人生。</p>
</blockquote>
<p>一直挺喜欢这句话,当时在微博刷到,记了下来,像跑步一样,坚持跑步挺容易的,放弃更容易,难的是拿起与放下的过程。</p>
<h2>收获</h2>
<p>如果说跑步或者长跑对我人生有什么特别大的改变,大多数是没有的,唯一对我而言算上收获的东西就是对无聊的忍耐力,能忍受至少 1 小时的无聊时光,像跑个 10 km 一样。</p>
<p>当然非要总结的话:</p>
<ul>
<li>因为跑步我写了 running_page</li>
<li>因为 running_page 认识了非常多网上的朋友,@ben-29, @frostming, @superleeyom, @EpLiar, @geekplux, @shaonianche,@zstone12, @guanlan, @yvetterowe, @flopp 等等</li>
<li>因为 running_page 学会了怎么维护一个开源项目,后来写了更多的开源项目</li>
<li>似乎都是机缘巧合走下来的,人生也是奇妙</li>
</ul>
<h2>13 年</h2>
<ul>
<li>当然还会继续跑下去,马拉松会继续跑,但可能专注于半马了,也想试试越野。</li>
<li>20000km 的时候我再写一篇,13 年后 GitHub 还在么?</li>
<li>偷偷告诉你们,人生最开心的事儿是跑完大汗淋漓的夏天,超市买瓶冰啤酒坐在海边,海风袭来</li>
<li>The best is yet to come.</li>
</ul>
<p><img src="https://github.com/yihong0618/gitblog/assets/15976103/7ff9e7d9-b2bf-4454-b722-956e5abaa3b8" alt="image" /></p>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/289"/><category term="一些记录"/><category term="Top"/><published>2024-05-31T10:34:18+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/287</id><title>抉择</title><updated>2024-11-04T01:56:09.789560+00:00</updated><content type="html"><![CDATA[<p>每个月写一篇博客我这个从来没向外公布过的目标不知不觉已经坚持了一年零四个月。期间不好说自己收获了什么,但是写点东西也确实成了习惯,纸笔的日记有写,大多数都是寥寥几笔,记录那些不想对除了我之外别人能看到的。<a href="https://github.com/yihong0618/2024/issues/4">周记</a>也有写,不知不觉流水账的周记也写了三年有余,有时候是逼自己去记录点什么,有时候是单纯的想记录分享,当然也有时候是需要写点什么整理自己的心情,今天就是。</p>
<p>但今天的主题不是这个。</p>
<p>是抉择。</p>
<p>我最怕面临的就是抉择,自以为大多数时候都是命运拖着我走,除了高考的失利让我懊悔不已,别的情况下自己都是在命运的交叉点选择被命运被自己的兴趣拖着选择一条道路,后面的道路走的稍微有些难,好像都在还高考的债。如果相信命运的话,当时的抉择导致了此刻的我打这行字。也就没什么必要谈当时的自己多傻逼,后面的路走的顺利与否。</p>
<p>如今又面临抉择,工作上的,城市上的,人生上的。我不知道选择对与错,也许成年人的世界里一步走错也就步步走错,但是普通如我,怎么能知道哪条路是对的啊。</p>
<p>最近脑海里总时不时浮现爷爷要离开这个世界躺在床上的场景,他活了 90 岁,90 岁大概会经历无数的人生抉择,闯关东到东北,生儿育女,经历了几个大时代,等等等等,他弥留之际会回忆这些么?会后悔自己的人生么,会感概这一辈子不到百年的沧海桑田么?我不知道,我也不敢去想我有那一天的话会怎么做。</p>
<p>说说需要的抉择,要不要选择一个新的机会。</p>
<p>工作上我们被收购影响很大,总之大部分是负面的变化,这个新的工作机会,对方非常有诚意,薪水也会高上许多,但需要离开大连,不知道是短暂的还是长时间的。但现在的工作也许不久也必须要离开大连,不久之后可能面临下一波裁员,但我很喜欢现在的团队和领导,对现状也很满意。</p>
<p>我最怕的是主动去改变。我挺享受现在的状态的,我要去改变么?</p>
<p>最近被帮一个用 running_page 认识的朋友搭建他的个人主页,他也在面临抉择,北大的博士,将来的高校老师也在面临抉择,从北京到美国,从美国再到香港,强如他,面临抉择的时候会纠结么?我也不知道。</p>
<p>突然就觉得人生还真跟浮萍没太多区别,自己能掌控的部分太少了,前面说我大多数时候都是被命运推着走,但在时代的浪潮面前谁又不是呢?弄潮的人永远是那么几个,但他们后悔自己的抉择么?他们会面临抉择时候的困境么?我也不知道。</p>
<p>就好像刘震云小说中的小人物一样。</p>
<p>敲下这篇,敲到这行字的时候对我接下来的抉择没有任何帮助,但心情平复了不少,这就是写作的好处吧。</p>
<p>写到这儿。 </p>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/287"/><category term="日记"/><published>2024-04-17T13:20:47+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/283</id><title>三月</title><updated>2024-11-04T01:56:09.886933+00:00</updated><content type="html"><![CDATA[<h2>宫崎英高与村上春树</h2>
<p>这个月打了《只狼》准确说我好久没这么认真的去打一款非 rogue like 游戏了,游戏非常对胃口,在一遍一遍死的时候学习系统,感受自己变强,弹刀打铁也越来越刺激,尤其是战胜壮年义夫的时候,我打了两天,杀掉他的一刹那,高兴的从椅子上站了起来,真的爽也真的开心。</p>
<p>为什么说到村上春树了呢?玩这个游戏的时候不断在想《挪威的森林》里那句:<strong>死并非生的对立面,而作为生的一部分永存(林少华翻译版)</strong>,日本的制作人,作家,非常喜欢讨论生死的问题,宫崎英高也是,几乎每一部游戏都在探讨生死,而《只狼》的核心也是要斩断不死,死亡还是永生,似乎永远是值得探讨的问题。可惜我们无法永生,只能在游戏中,在书里去体验这种感觉。</p>
<h2>开通了爱发电</h2>
<p>突然就想开通个爱发电试试了,没想到真的不少人表示感谢,还有个哥们用爱发电提了个付费的需求,我马上给做了。还挺有趣的。爱发电起的名字还挺有意思的,用爱发电,不只是用爱发电。</p>
<h2>35岁了</h2>
<p>媳妇送了我 iPhone 15 plus 终于手机不卡了。
到了程序员该死的年纪,不过我还想再干几年,如果真干不下去了,那就再说,至少现在还能开心的写着代码。</p>
<p>更感动的是在推特收到了几百条生日快乐,我看见的都一一回复了,感觉真好,这个世界是充满这些陌生人的祝福的。</p>
<h2>讲课与回忆过往</h2>
<p>受朋友邀请去他们公司去讲了 AIGC 的东西,讲了一个多小时,效果也不错,还有一定的补贴,拿到钱我直接转给媳妇了哈哈。不过讲完的时候我想到了我当时在西山居做的第一次 share 2016 年初,做的 VR 也是新兴的东西,讲的时候全程在发抖,到现在我已经能谈笑风生的讲技术的东西了,台底下不少人,我甚至还能讲几个段子,真的是成长了啊。开心。</p>
<h2>读书与电影</h2>
<p>这个月看的几本书都非常推荐(有的还没看完)</p>
<ul>
<li>《这就是 ChatGPT》这绝对是一本被豆瓣评分和书名低估的好书</li>
<li>《我叫刘跃进》文字太好了,喜欢,小人物写的鲜活</li>
<li>《癌症密码》还没读完,但写的很好</li>
<li>看了两遍《周处除三害》我个人很喜欢</li>
</ul>
<h2>项目</h2>
<ul>
<li>running_page 有了新想法但是还没精力更新</li>
<li>suno hack -> <a href="https://github.com/yihong0618/SunoSongsCreator/">https://github.com/yihong0618/SunoSongsCreator/</a></li>
<li>ideo hack -> <a href="https://github.com/yihong0618/IdeoImageCreator">https://github.com/yihong0618/IdeoImageCreator</a></li>
<li>更新了 tg_bot_collections</li>
<li>给 viztracer 提了个 PR > <a href="https://github.com/yihong0618/viztracer">https://github.com/yihong0618/viztracer</a></li>
<li>更新了下 blue 来了个币圈心理按摩</li>
<li>常规维护</li>
</ul>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/283"/><category term="一些记录"/><published>2024-03-31T13:34:54+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/282</id><title>About Me</title><updated>2024-11-04T01:56:09.962464+00:00</updated><content type="html"><![CDATA[<p>似乎每个博客都应该有个 About Me 那么 5 年后就来介绍一下我自己。</p>
<ul>
<li>yihong0618</li>
<li>喜欢游戏,读书,电影,跑步,编程,开源,和奇怪的东西</li>
<li>性格还算温和,偶尔气急了也骂人</li>
<li>写了 20 多年日记,但大部分都丢了</li>
<li>我不用 RSS</li>
<li>不太喜欢加微信群</li>
<li>现在还能背下来将近一百位圆周率</li>
<li>能背下来《琵琶行》和大部分学过没学过的诗</li>
<li>哦对忘了我喜欢诗歌</li>
<li>读过王小波的所有书</li>
<li>读完过《浮士德》</li>
<li>读完过还不止一遍村上春树的所有书</li>
<li>读了不少历史书</li>
<li>看过几百部电影,喜欢的电影是《搏击俱乐部》</li>
<li>最喜欢的游戏是《Dream Quest》《血源》</li>
<li>喜欢的编程语言是 Python</li>
<li>有同好交朋友特别欢迎,但现在不怎么主动加微信了,邮件 tg 都欢迎</li>
<li>防疫时候失去了曾经非常要好的朋友,但也不算后悔</li>
<li>媳妇是初恋</li>
<li>跑过马拉松,PB 4 小时 1 分钟,半马 PB 1 小时 40 分钟</li>
<li>生活在大连</li>
<li>心情不太好时候会跑到海边看海</li>
<li>遇到过贵人,几个帮助我的领导老师都让我成长学到了不少,包括现在的领导,同事。</li>
<li>不想去谈顿悟,但是有时候突然间会针对自己的境遇想明白一些东西</li>
<li>在 2024 年初依然喜欢用 Google 搜索大于 ChatGPT, 因为能发现有趣的人</li>
<li>喜欢读有趣的人的博客</li>
<li>需要聊缺点么?</li>
<li>不聊了就写到这儿先,想到再补充</li>
<li>补充,经常激励自己和说给朋友的话是 The best is yet to come.</li>
<li>迷茫的时候会听 <a href="https://www.youtube.com/watch?v=gH476CxJxfg">Bad day</a></li>
<li>0618 是 0.618 的意思,不是我生日,我也不是刘强东粉丝</li>
<li>喜欢喝酒,酒量一般,但是家人不咋让喝了,痛风。</li>
<li>跑了 <a href="https://yihong.run/">10000km</a></li>
<li>下一个期望是学会日语</li>
</ul>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/282"/><category term="About"/><published>2024-02-27T14:14:19+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/281</id><title>用小爱加手指机器人实现传统开关语音关灯</title><updated>2024-11-04T01:56:10.058387+00:00</updated><content type="html"><![CDATA[<p>最近做了一些折腾,花了点精力终于实现了晚上趟床上看书不用下地,直接跟小爱说一声关灯,手指机器人就能控制开关了。</p>
<p>效果</p>
<p><a href="https://github.com/yihong0618/gitblog/assets/15976103/bb8ec3ab-5229-4e3b-a305-b20b1b8a69f7">https://github.com/yihong0618/gitblog/assets/15976103/bb8ec3ab-5229-4e3b-a305-b20b1b8a69f7</a></p>
<h2>手指机器人选购</h2>
<ul>
<li>开始选用了一款射频开关的,控制不灵敏放弃</li>
<li>之后找了款配合米家的,但是逆向蓝牙略麻烦,米家这块安全性做的不错</li>
<li>最后选定了一款涂鸦的,可以无痛申请开发者,拿到 local token, 就它了(大家如果选用任意平台搜索涂鸦手指机器人就行)</li>
</ul>
<h2>如何操作</h2>
<ul>
<li>结合 <a href="https://github.com/yihong0618/xiaogpt">xiaogpt</a> 使用 git clone 的方式,因为我们需要改一些代码(未来可能会做成插件)</li>
<li>下载涂鸦 app 然后参考这个项目拿到所有的 key -> <a href="https://github.com/redphx/tuya-local-key-extractor">https://github.com/redphx/tuya-local-key-extractor</a></li>
<li>使用这个项目设置手指机器人的蓝牙并测试 <a href="https://github.com/redphx/poc-tuya-ble-fingerbot">https://github.com/redphx/poc-tuya-ble-fingerbot</a> (可能需要改一定代码,如果你想复刻出现困难可以留 comment 我来帮忙</li>
<li>把 fingerbot 代码整合进 xiaogpt 并更改关键词</li>
<li>搞定</li>
</ul>
<h2>By the way</h2>
<p>我还给 miservice 加了循环播放和列表播放,下面是一些技术细节。</p>
<ul>
<li>需求来自这个 issue <a href="https://github.com/yihong0618/MiService/issues/16">https://github.com/yihong0618/MiService/issues/16</a></li>
<li>最困难的事如何拿到 remote url mp3 的时长,我还改写了个 js 项目 -> python <a href="https://github.com/yihong0618/remote_mp3_duration">https://github.com/yihong0618/remote_mp3_duration</a></li>
<li>后来发现并不完美,有些 ffmpeg 转换的 mp3 需要计算 samples </li>
<li>既然都是拿 header 去解析,但传统的 mutagen 不支持 url,那么我为啥不给支持了呢</li>
<li>具体参考这个 commit <a href="https://github.com/yihong0618/MiService/commit/53f9262aa7a40daeaf71a0d2d8a9f2eb26348623">https://github.com/yihong0618/MiService/commit/53f9262aa7a40daeaf71a0d2d8a9f2eb26348623</a> 我们只需要最多拿前 1000 个字节也就能完成解析,也就是只需要 temp file</li>
<li>搞定</li>
</ul>
<p>效果:</p>
<p><a href="https://github.com/yihong0618/gitblog/assets/15976103/3ceb34fc-6a02-404b-b0da-63caf1f340c3">https://github.com/yihong0618/gitblog/assets/15976103/3ceb34fc-6a02-404b-b0da-63caf1f340c3</a></p>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/281"/><category term="技术文章"/><published>2024-01-29T13:15:38+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/280</id><title>记忆碎片</title><updated>2024-11-04T01:56:10.133855+00:00</updated><content type="html"><![CDATA[<p>不知道为什么,回忆起一些事情总有些片段记忆的特别深刻,甚至片段里的人的名字都已经忘记了,但这片段还在。
一些记忆的片段:
1.
和爸爸某一年回家看爷爷,看到街边有个老人在走,我爸说,这不你爷么?一看还真是,爷爷对着我们笑,说伊洪回来了。那是个冬天,阳光洒在雪上反射到爷爷的脸上,80 多岁的老人显得格外的精神,开心。
这次还是和爸爸一起回来看爷爷,爷爷不在能动弹,瘦的皮包骨躺在床上,不太能说话了,胃癌晚期,90多岁没办法做手术。日薄西山,等待最后的日子。这场景也会深深的刻在脑海里。</p>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/280"/><category term="日记"/><published>2023-12-24T12:38:16+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/279</id><title>开源值得么?</title><updated>2024-11-04T01:56:10.208922+00:00</updated><content type="html"><![CDATA[<p>这篇是我写的 telegram channel 的一则 post 做了些补充放在这里:</p>
<blockquote>
<p>开源和分享值得么?在我看来至少目前是值得的,虽然很多时候会遇到不是一个物种的来要求你做这做那,但大多数的时候还算好的。
冒着自己安全的风险做开源值得么?我不知道,但至少应该对这样的人保持敬仰是我这样没这种勇气的人应该做的。
今天在一个群里看到一个 title 是技术负责人的说,能赚钱么?不赚钱我不做,傻逼才做。冷笑一声,就当我们是傻逼吧。当然,他是没错的,只是不是一路人而已。
我不知道未来怎样,能活到现在好像已经超过了古代战乱时期的平均年龄了,虽然有太多的遗憾,也没怎么为自己当时比较傻逼的抉择后悔。
回到正题,我好像没怎么为过利,名倒是机缘巧合认识了大家有几个关注,开源值得么?
认识了这些虽然未曾谋面但在代码里交流了很久的人当然值得了,frostming, saka, kc(jay), cyanide, friendA, Ben_29, xuanwo, fallen, zu1k, laike9m, TJ, machiel, xintao, Epliar, higuoxing, 盐粒等等等
当然值得的,否则我一辈子也不可能认识这么多牛逼的人。
哦对,忘了说,还有那些真心的谢谢。
所以,还会做下去的,虽然环境已经如此差了,做到做不下去那天吧。</p>
</blockquote>
<p>The best is yet to come.</p>
<hr />
<p>这篇 post 缘起是 clash 事件,过去挺久了,但我在路由上的突然不好用,源码也没了,找到了开源认识的朋友帮忙才回复,又想起了这个 post.
现在回想当然是值得的,今天坐在星巴克,喝着同事朋友请我喝的咖啡,其实在成为同事前我们在 GitHub 上已经交流过了,开源的世界真的不大,这么想当然是值得的。</p>
<p>如果想赚钱,当然有 1w 种比开源分享更值得的东西,但很多事情不全是为了赚钱,对吧。</p>
<p>感谢看到这的你,是你们让它变得更值得了。</p>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/279"/><category term="生活"/><published>2023-11-23T08:48:38+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/275</id><title>聊聊读书</title><updated>2024-11-04T01:56:10.311418+00:00</updated><content type="html"><![CDATA[<h2>缘起</h2>
<p>读书究竟为了什么?这些年虽然不上墙内的社交网站了,也很少有人跳出来告诉我要多读书,并顺手推荐了一本《毛泽东选集》,但推上也越来越多的人谈起读书,虽然晒出来的书外面的玻璃纸还没撕开,也要去聊聊读书,当然这里包括我自己,书架上也有很多书封还没打开过躺在那儿看着我的书。
也许有一天会打开,也许不会。</p>
<h2>那么究竟为了什么呢?</h2>
<p>没有实际统计过,但是那些年精力旺盛的时候每年大约读 80 本书左右,应该加起来读的书超过 500 本了,当然,大部分都是小说。倒是没觉得自己有多了不起,但做过一段时间的数据分析的岗位,自己在人群中的阅读量处在什么位置心里还是有数的。</p>
<h2>TO BE DONE</h2>
<p>困了,改天接着写</p>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/275"/><category term="读书笔记"/><published>2023-10-18T14:02:35+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/274</id><title>旧文,移动端最好的游戏,《Dream Quest》以及其它</title><updated>2024-11-04T01:56:10.378379+00:00</updated><content type="html"><![CDATA[<h2>写在前面</h2>
<p>这是一篇 2017 年 9 月给机核的投稿,当时老白的评价是写的比较简单,希望我再补充一些,就没通过。我也懒得补充就一直放那了,当然后面有了《杀戮尖塔》,《怪物火车》,《月圆之夜》等一系列被这个游戏影响或者借鉴的游戏,但《Dream Quest》依然是我最喜欢的,也是其中数值做的最好的。</p>
<p><img src="https://github.com/yihong0618/gitblog/assets/15976103/837e9463-130a-408d-952f-ef43a5d26e2b" alt="image" /></p>
<h2>引</h2>
<p>如果你是个 rogue like游戏的爱好者
如果你是个炉石传说或是地下城的爱好者
如果你在找移动端不错的 rogue like 游戏
当然,如果你不是一个画面党
我向你推荐这款游戏 ->《Dream Quest》
相信我,这是你在移动端能玩到的最棒的 rogue like 游戏,没有之一</p>
<h2>首先说说作者</h2>
<p>熟悉炉石的朋友可能多少听过这个人——《炉石传说》卡拉赞之夜的主设计师之一。而作者加入这个团队也完全是因为这款《Dream Quest》。故事的发展很简单,整个炉石团队沉迷了这款游戏,惊叹其中的卡牌数值设计,本来低调的作者顺理成章的加入了炉石这个“小”团队。</p>
<p>从领英上能查到的信息 Peter Whalen 是毕业于乔治亚理工学院的博士,又在亚马逊当了一年算法工程师(游戏的数值设计如此精妙也不奇怪了)。在这期间他用 Unity 引擎加上 Windows 画图版做出了这款“特别”的游戏,之后加入了炉石团队。(2023 年补充,他现在创业去了)
<img src="https://github.com/yihong0618/gitblog/assets/15976103/8bb031c9-4d23-45e0-8250-d79f0b6b55ba" alt="image" />
<img src="https://github.com/yihong0618/gitblog/assets/15976103/1dec1786-e256-440a-b4fe-6a78f0e32ac5" alt="image" /></p>
<p>在本来就不多的《Dream Quest》玩家中有因为他加入炉石而惋惜的,也有感觉他会给炉石带来一些不一样东西的(如下图),现在看来确实他给炉石带了很多有趣的东西。</p>
<p><img src="https://github.com/yihong0618/gitblog/assets/15976103/3bbe8903-7f6a-4d75-83ed-390d2710745f" alt="image" /></p>
<h2>这是一款怎样的游</h2>
<blockquote>
<p>2023 年的补充,这是一款《杀戮尖塔》的始祖</p>
</blockquote>
<p>记得某个人说过,永远不要因为一本书的封面而判断一本书的价值。而这个游戏每从icon,到主界面,到选人画面,再到进入地图都在考验你这个认知。</p>
<p>游戏的icon是这样的:
<img src="https://github.com/yihong0618/gitblog/assets/15976103/820d7f1c-dbf3-4613-a387-46b230655d4e" alt="image" /></p>
<p>游戏的主界面是这样的:
<img src="https://github.com/yihong0618/gitblog/assets/15976103/936a919e-6437-453c-a721-af407656f9ba" alt="image" /></p>
<p>选人画面中四个初始职业是这样的:
<img src="https://github.com/yihong0618/gitblog/assets/15976103/09447c90-aa6a-494d-bf80-2abfe133b916" alt="image" />
<img src="https://github.com/yihong0618/gitblog/assets/15976103/93cdee20-e2a9-446a-901d-8bc02b15ddc9" alt="image" />
<img src="https://github.com/yihong0618/gitblog/assets/15976103/5086aea9-18eb-439f-bc5f-3a03afd0d2e6" alt="image" />
<img src="https://github.com/yihong0618/gitblog/assets/15976103/16361fb2-1f07-48d0-8de5-e56fada1a1e9" alt="image" /></p>
<p>地图是这样的:
<img src="https://github.com/yihong0618/gitblog/assets/15976103/e9257e04-0436-42ab-9fcd-4e5048a0108d" alt="image" /></p>
<p>甚至游戏的战斗画面是这样的:
<img src="https://github.com/yihong0618/gitblog/assets/15976103/bf2740af-a4cb-4a0a-81f8-efe9cfd173a9" alt="image" /></p>
<p>如果说机核《安利之王》中介绍的《末日拾荒者》画面被称为“屎”的话,那这款游戏的画面只能用“圣屎”来形容了。
当然如果你成功接受了这种设定之后:</p>
<ul>
<li>你会发现,我靠,这 RL 设计的好巧妙,卡牌设计和数值成长似乎非常合理,每次死亡都是一次成长</li>
<li>你学会了游戏中 5 种牌如何搭配如何使用,攻击,行动,魔法,被动,装备</li>
<li>又死了几次之后你还明白了如何放弃你的卡牌(放弃需要花钱),如何根据职业不同Build你的卡组,根据随机的不同如何选择本局游戏的方向</li>
<li>单从法师来说,最开始你会认为应该多去拿魔法牌,死了很多次之后,你会发现学会选择修炼一个属性为主(毒,火,电,冰),还得想办法处理属性免疫的怪物</li>
<li>慢慢的你熟练了,你会发现每个职业都有每个职业的乐趣,而每个职业又有好几种不同的 Build 方法,最后的你懂得了围绕着一张牌或几张牌打,让其他牌为它服务的通关之道</li>
<li>但这仅仅是开始,在困难难度下还有 1000 血的 Lord 等着你。等你慢慢收集齐成就后,解锁了博士,解锁了龙,解锁了德鲁伊,你会感叹我擦,游戏还可以这样玩?游戏这样玩还能保持游戏的原有平衡性?这么牛逼那!</li>
<li>几百小时过去了,游戏还有能开发的地方,你不得不感叹作者的厉害。也不得不遗憾这么牛逼的一个游戏就被这魔性的画面埋没了。</li>
<li>作者怪物图鉴,成就系统,包括开头的故事都做的非常用心(开头的故事甚至还蕴含着通关之道)</li>
</ul>
<p>怪物图鉴:
<img src="https://github.com/yihong0618/gitblog/assets/15976103/ab31b778-5108-4c29-826c-4dc91c78663a" alt="image" /></p>
<p><img src="https://github.com/yihong0618/gitblog/assets/15976103/4608510c-d6f8-4a3e-8013-ed001a49e987" alt="image" /></p>
<p>最终 Boss, 相信最终 Boss 的美术会是你再一次视觉享受:
<img src="https://github.com/yihong0618/gitblog/assets/15976103/a2ac791c-f262-433b-9de4-35a93ed44b4f" alt="image" /></p>
<h2>2023 年的后记</h2>
<ul>
<li>这竟然已经是 6 年前的文章了</li>
<li>6 年间这个游戏的故事还在继续</li>
<li>我把这个游戏推荐给了阿楠,阿楠同样沉迷,结合黑魂做了个小游戏,和阿楠成为了朋友,我转行了程序员,阿楠在最开始给了我不少的帮助,阿楠去做独立游戏了叫<a href="https://store.steampowered.com/app/1016600/Raksasi/?l=schinese">《斩妖》</a></li>
<li>我一直推荐这个游戏,在某个 tg <a href="https://t.me/reorx_share">频道</a>发现他也是这个游戏爱好者,和他聊了很多,发现世界真小,我决定自己也开个频道</li>
<li>我打了 200 个小时的杀戮尖塔,但更怀念的是当时无数次打《Dream Quest》做过站的自己</li>
<li>最简单的画面,最纯粹的快乐</li>
<li>这种快乐在 2022 年《吸血鬼幸存者》也带给我了</li>
<li>对了,我和没给我通过这篇文章的老白,也成了朋友</li>
</ul>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/274"/><category term="一些记录"/><published>2023-09-28T14:55:45+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/272</id><title>微信好友</title><updated>2024-11-04T01:56:10.458192+00:00</updated><content type="html"><![CDATA[<p>微信大概是中国大陆人最重要的工具了吧。这一年我花了很久,把微信好友从 500+ 删到了 260, 写篇东西记录一下。当然,还要感谢微信的炸号,避免了将来可能的很多的尴尬,毕竟我这种人炸号了他们不会奇怪。</p>
<h2>why</h2>
<ul>
<li>最开始是因为愤怒:愤怒那些对任何事情都毫无共情的人,在想为什么他们会在我的微信好友里。当然主要的原因是因为去年防疫过的太苦了,那些给防疫政策唱赞歌,从任何角度我都无法和他们成为朋友。</li>
<li>然后是因为害怕:害怕有一天因为自己朋友圈转发的一些东西或者发表的看法被这些人当成间谍举报,也许我值 50w. 尤其是在某些时候朋友圈一片红和我朋友微信炸号的时候。</li>
<li>最后是因为界限,在好不熟悉的人善意的提醒我要小心说话的时候,我也不知道为什么会那么愤怒,大概是因为表达空间被进一步压缩的无力感吧。</li>
</ul>
<h2>how</h2>
<ol>
<li>最先删除的是完全想不起来是谁的人</li>
<li>接下来是把微信拉到最后倒着往上拉,加过之后就再也没说过话或者几年没再说过话的符合上面三点的人</li>
<li>再之后就是个很艰难的筛选过程,删掉了很多这辈子可能不会再有交集或者不想跟他再有交集的人</li>
</ol>
<h2>next</h2>
<ol>
<li>自己也减少了很多微信的使用,甚至在想主动把号炸掉,重新去加真正好友</li>
<li>继续尽量不加任何的微信群,除了逼不得已那些</li>
<li>该表达就表达,去他妈的小心说话</li>
</ol>
<h2>hope</h2>
<ol>
<li>希望留下的都是值得的朋友</li>
<li>希望觉得我同样讨厌的人也直接删除我</li>
<li>希望有一天可以不用微信</li>
</ol>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/272"/><category term="生活"/><published>2023-08-23T06:35:07+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/270</id><title>如何写一个 PostgreSQL Extension</title><updated>2024-11-04T01:56:10.546749+00:00</updated><content type="html"><![CDATA[<h2>什么是 PostgreSQL Extension</h2>
<p>PostgreSQL Extension 是一个可插拔的功能扩展,用于在 PostgreSQL 数据库系统中添加额外的功能和能力。这些扩展可以由第三方开发者开发并加入到 PostgreSQL 中,以满足特定的需求。扩展可以增强数据库功能。
有些非常不错的 Extensions 甚至成了一些公司选型 Postgres 的理由比如:<a href="https://www.timescale.com/blog/top-5-postgresql-extensions/#1-timescaledb">TimescaleDB</a>, <a href="https://www.timescale.com/blog/top-5-postgresql-extensions/#2-postgis">PostGIS</a> 等等。</p>
<p>今年开始异常火爆的向量数据库,因为有 <a href="https://github.com/pgvector/pgvector">pgvector</a> 也让 pg 有了向量计算和存储的能力。</p>
<p><strong>本文会介绍如何编写 extensions 和推荐一些编写 Extensions 的资源。</strong></p>
<h2>如何写一个 Extensions</h2>
<p>传统的 Extensions 开发一般情况下我们会 c 语言,引入 <code>Postgers.h</code> 写好 Makefile 和 SQL 开发,现在也有了用 Rust 编写 Extensions 的能力 -> <a href="https://github.com/pgcentralfoundation/pgrx">pgrx</a> 借助 pgrx 我们能更好的专注 extensions 中算法本身,也可以借助 Rust 强大的生态更容易的编写 extensions 需要的逻辑,进行更快速,更安全的开发。</p>
<p>以下分别介绍 C 和 Rust 两种开发方式。</p>
<h3>C 语言开发 Extensions</h3>
<p>以 hello_world 为例,需要在 hello_world 文件夹中建下面 4 个文件</p>
<pre><code>hello.control # 插件名.control
hello.c # 插件名.c
hello--1.0.sql # 插件名--1.0.sql
Makefile # 用于编译
</code></pre>
<p>cat hello.control</p>
<pre><code>comment = 'hello:'
default_version = '1.0'
module_pathname = '$libdir/hello'
relocatable = false
superuser = true
</code></pre>
<p>剩下的可以参考这个 pg 的 hello_world 项目 <a href="https://github.com/magnusp/pg_hello">https://github.com/magnusp/pg_hello</a></p>
<p>cat pg_hello.c</p>
<pre><code class="language-c">#include "postgres.h"
#include "fmgr.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
Datum hello( PG_FUNCTION_ARGS );
PG_FUNCTION_INFO_V1( hello );
Datum
hello( PG_FUNCTION_ARGS )
{
// variable declarations
char greet[] = "Hello, ";
text *towhom;
int greetlen;
int towhomlen;
text *greeting;
// Get arguments. If we declare our function as STRICT, then
// this check is superfluous.
if( PG_ARGISNULL(0) ) {
PG_RETURN_NULL();
}
towhom = PG_GETARG_TEXT_P(0);
// Calculate string sizes.
greetlen = strlen(greet);
towhomlen = VARSIZE(towhom) - VARHDRSZ;
// Allocate memory and set data structure size.
greeting = (text *)palloc( greetlen + towhomlen );
SET_VARSIZE(greeting, greetlen + towhomlen + VARHDRSZ);
// Construct greeting string.
strncpy( VARDATA(greeting), greet, greetlen );
strncpy( VARDATA(greeting) + greetlen,
VARDATA(towhom),
towhomlen );
PG_RETURN_TEXT_P( greeting );
}
</code></pre>
<p>代码的一些解释:</p>
<ol>
<li><code>#include "postgres.h"</code> 包含了大部分编写 postgres 相关程序需要的东西,每个 extensions 必须包含这个</li>
<li><code>#include "fmgr.h"</code> 则包含了PG_GETARG_XXX、PG_RETURN_XXX和PG_ARGISNULL 等编写 extensions 必要的宏</li>
<li>Datum 是 data 的单数是在 pg 中最重要的数据类型之一,它肩负着在PG 内核与用户代码之间传递数据的责任</li>
<li>PG_MODULE_MAGIC 这个宏是编写 extensions 的一个必要的宏为了后面编译生成的库才可以被 postgresql 加载</li>
</ol>
<p>在这之后就可以编写好 Makefile 把 pg 的 PATH 加入到环境变量中之后 make && make install</p>
<p>在这之后进入到 psql, create extension hello; select hello('hello'); 就可以了</p>
<p>当然后续可以写一些测试,需要建一个文件夹名为 sql 把相关的测试写在里面,再建一个文件夹名为 expected 把测试跑出的结果写在里面,在 Makefile 加上这句 <code>REGRESS = hello</code>, 就可以利用 pg 的 installcheck 了</p>
<p>cat sql/hello.sql</p>
<pre><code class="language-sql">
CREATE EXTENSION hello;
select hello_hello();
</code></pre>
<p>**如果不知道如何写插件可以参考 pg 核心开发者这个项目,里面有各种各样的 extensions **</p>
<ul>
<li><a href="https://github.com/michaelpq/pg_plugins">pg_plugins</a></li>
<li>参考文章1 - <a href="https://zhmin.github.io/posts/postgresql-c-function/">Postgresql 编写自定义 C 函数</a></li>
<li>参看文章2 - <a href="https://csblog.cc/dbnotes/PostgreSQL%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91.html">PostgreSQL插件开发</a></li>
<li>可以参考迟先生 @skyzh 的有趣项目 <a href="https://github.com/skyzh/pg_poop">pg_poop</a> </li>
</ul>
<h3>Rust 语言开发 Extensions</h3>
<p>当然现在是 2023 年我们完全可以借助 Rust 来开发 Extensions, 这特别得益于 <a href="https://github.com/pgcentralfoundation/pgrx">pgrx</a> 这个项目它的前身也是一个非常棒的 pg 插件 <a href="https://github.com/zombodb/zombodb">zombodb</a></p>
<p>来看看借助 pgrx 开发的优秀的 pg 插件</p>
<ul>
<li><a href="https://github.com/tensorchord/pgvecto.rs">pgvecto.rs</a> -> pgvector 的 Rust 版</li>
<li><a href="https://github.com/postgresml/postgresml">postgresml</a> -> postgres ml 第二版用 Rust 重写,速度大幅提升</li>
<li><a href="https://github.com/yihong0618/gitblog/issues/270">plrust</a> -> 在 pg 中使用 Rust 作为 Procedural Language</li>
</ul>
<p>编写起来就比 C 简单多了,只需要</p>
<ol>
<li>安装 pgrx</li>
<li>cargo pgrx init</li>
<li>cargo pgrx new hello</li>
<li>cargo pgrx install or cargo prgx run</li>
</ol>
<p>一个简单的 hello 程序就做好了,其中 <code>cargo pgrx new hello</code> 帮助我们生成了所有需要的文件,其中 <a href="https://github.com/pgcentralfoundation/pgrx/tree/master/pgrx-examples">pgrx-examples</a> 文件夹中包含了很多如何使用 pgrx 编写的例子。</p>
<p>当然大家可以参考这个项目 <a href="https://github.com/higuoxing/pg_slugify">pg_slugify</a>,利用了 Rust 的生态,几行代码做了一个非常有用 extension, 大家的很多简单的脚本完全可以利用 Rust 编写成插件方便自己开发。</p>
<h2>推荐一些资源</h2>
<ul>
<li><a href="https://pgxn.org/">pgxn</a> extensions 托管</li>
<li><a href="https://gist.github.com/joelonsql/e5aa27f8cc9bd22b8999b7de8aee9d47">1000+ PostgreSQL EXTENSIONs</a> </li>
<li><a href="https://github.com/yihong0618/gitblog/files/12194352/PostgreSQL20extension20develop20guide.1482475700.pdf">postgres extensions 入门培训</a></li>
</ul>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/270"/><category term="技术文章"/><published>2023-07-08T12:13:57+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/268</id><title>五月病</title><updated>2024-11-04T01:56:10.633904+00:00</updated><content type="html"><![CDATA[<p>好久没写流水账了,记录下刚过去的五月。</p>
<h2>北京</h2>
<p>五一假期去北京玩了,故宫,颐和园,天安门,长城都去了,以前去了好多次北京也没去这些地方,这次去倒是没有更多的兴奋,就很平淡的去看这过了几百年的一切。总感觉这皇宫,这皇城,一切都没怎么改变。</p>
<p>被查了 3 次身份证,无数次安检,这也许就是北京吧。儿子去天安门时候安检被没收了彩笔,儿子不理解嗷嗷大哭半小时,五岁的他不明白为什么彩笔会被人夺走,其实我们也不明白,嗯,这是规矩。</p>
<p>当然最开心的是,和老婆一起吃了顿很贵的火锅,见了友人A 还和 hi@guoxing, 陈总喝了酒(还有其他同事),两顿。这些天还总能回想起陈总骑着他的小摩托驮我回酒店,他讲述的每周会骑着这个摩托,买本《三联周刊》来这家酒吧喝两杯酒,正好看完,回去。真美好。</p>
<p>还他妈吃了全宇宙最难吃的炸酱面。</p>
<h2>死亡</h2>
<p>又经历了一个认识的前辈死亡,我不太知道有没有死后的世界,也不知道未来因为 AI 他们会不会永远存在,又想起那些死去的朋友,他们看不到现在这一切了,不知道是不是一种幸运。</p>
<p>也许吧。</p>
<p>一切如旧。</p>
<h2>幸福和插曲</h2>
<ul>
<li>收到了不少的咨询邮件所有的我都尽自己最大的能力回复了,希望能帮到他们</li>
<li>还帮助了一个北大的博士导出了所有跑步数据,作为一个不怎么学习的人真的是荣幸</li>
<li>听《天书广播》印象最深的一句话是,“善意无法报答,只能传递”,那么让我把这些传递下去,自己也挺开心的。</li>
<li>认识了几个新朋友,一个人还要给我推荐工作</li>
<li>被一个人挂着污蔑,我本来想挂着反驳回去,后来想想算了。“恶意当然能传递,但在我这终止吧”</li>
</ul>
<h2>五月病</h2>
<ul>
<li>大概也许到了这个时候。</li>
<li>不太知道我的性格,我的运气会把我带到哪里,把我的家庭带到哪里,有时候还是挺迷茫的,尤其在这种大环境下。</li>
<li>对我也就想想过去了,迷茫对我来说不如一瓶酒。</li>
<li>可惜要尽量戒酒了,以后用跑两圈代替吧</li>
</ul>
<h2>讨厌的人</h2>
<ul>
<li>去年新冠的发展对我最大的帮助是认清了一些朋友,在今年,很少在轻易的交朋友了,尤其是看到曾经当成很好的朋友的人,在嘲笑隔离大巴车死去的那些人,嘲笑“感叹人人都在大巴上”的人。</li>
<li>瞎了眼了,希望以后不会了</li>
</ul>
<h2>希望</h2>
<ul>
<li>明年就 35 岁了</li>
<li>希望变成一个更好的自己</li>
</ul>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/268"/><category term="日记"/><published>2023-06-02T11:30:47+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/262</id><title>杂感</title><updated>2024-11-04T01:56:10.729329+00:00</updated><content type="html"><![CDATA[<p>近况及其它</p>
<h2>死去的朋友</h2>
<p>最近时常想起,时常梦见,清醒时有些自责,喝醉后怅然若失。那时我们相约等上映去看《灌篮高手》,如今只好多买一张票,酒边多放一个杯子,有时候想想有另一个世界就好了,如果有也不知道你过的怎么样。希望,它,真的作为生的对立面永存吧。也不知道当时你为什么这么选择,我们几个如果多给你打些电话情况会不会不一样,往往想到这里就感觉人生和世界的虚幻,究竟哪一个才是真实的?</p>
<h2>灌篮高手</h2>
<p>我很喜欢,无论其它人的评价怎样,在我看来不同年龄段对这个电影的看法是完全不同的,青春的遗憾也好,怀念曾经的自己也罢,仿佛一个跳投,空中划过一道弧线,球进了,是空心的。
而喜悦过去回过头看,一切如闪回一般,转过头,球场变成了屏幕前敲击着键盘的我。操他妈的,一个球花了二十年。</p>
<h2>AI</h2>
<p>这段时间围绕着 OpenAI 的API 做了几个项目,也和朋友有不少的交流,其中 stars 最多的那个双语书翻译项目也是我唯一失控的项目,不但失控,也失去了给它添加新功能的热情,一个是市面上大量同类的项目比我做的好的多的多,而我既没有精力也没有那么大的能力超过他们,而且合了很多代码不是我风格或者是质量没那么高的 PR, 导致项目彻底的失控。
其实更多的是我自己的原因。当然其它运行良好,xiaogpt @frostming 帮了我非常多,我也更愿意去把它变得更好。
给自己做个总结就是,项目的维护其实没想象的那么简单,也要懂得放弃。</p>
<h2>技术含量</h2>
<p>又遇到了别人说,我写的项目毫无技术含量,为什么有这么多人 star 关注。心里还是有些沮丧的。
虽然我知道和那些厉害的人项目我写的东西确实没什么特别的,想辩论几句,我做的都是曾经没人做过的,或者做的方式不是这样的,但这种辩论毫无价值,沮丧过了也就过去了。That's it. 也不知道自己能做什么更多的评价。</p>
<h2>要去北京旅游</h2>
<p>后天早上就出发了,本来想着是避免出行高峰,没想到的是每天都是出行高峰。抢票,抢票,弄了好几天,依然是我媳妇负责计划,出行当天我负责拎包和当个听从一切指挥的傻逼,上次去北京还是 19 年去跑马拉松,没想到这感觉像是没过去多久的事情,但因为新冠竟然过去了 3 年了。</p>
<h2>朋友</h2>
<p>新冠三年最大的庆幸和遗憾是失去了一些朋友,也告诉自己别去轻易交新的朋友。</p>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/262"/><category term="一些记录"/><published>2023-05-01T15:31:30+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/261</id><title>vm.overcommit_memory 学习笔记</title><updated>2024-11-04T01:56:10.797891+00:00</updated><content type="html"><![CDATA[<p>关于 overcommit_memory 学习的一些记录,其中一些为网上前辈文章的整理记录</p>
<h3>什么是 vm.overcommit</h3>
<p>但在实际情况下,进程请求的内存可能比实际需要的内存少很多,而且很多进程请求的内存并不会全部使用。在这种情况下,如果系统采用严格的内存申请机制,将会导致系统的内存利用率低下,一些能够使用的内存被浪费。
因此,为了提高系统的内存利用率和灵活性,Linux 提供了 vm.overcommit_memory 机制。当这个参数的值为 0 或 1 时,内核允许进程请求超过系统实际可用内存的内存量。这种行为被称为 "overcommit"。</p>
<h3>vm.overcommit 的三个值</h3>
<pre><code class="language-c">#define OVERCOMMIT_GUESS 0 // default
#define OVERCOMMIT_ALWAYS 1 // redis
#define OVERCOMMIT_NEVER 2 // postgres
</code></pre>
<pre><code>The Linux kernel supports the following overcommit handling modes
0 - Heuristic overcommit handling. Obvious overcommits of
address space are refused. Used for a typical system. It
ensures a seriously wild allocation fails while allowing
overcommit to reduce swap usage. root is allowed to
allocate slightly more memory in this mode. This is the
default.
1 - Always overcommit. Appropriate for some scientific
applications. Classic example is code using sparse arrays
and just relying on the virtual memory consisting almost
entirely of zero pages.
2 - Don't overcommit. The total address space commit
for the system is not permitted to exceed swap + a
configurable amount (default is 50%) of physical RAM.
Depending on the amount you use, in most situations
this means a process will not be killed while accessing
pages but will receive errors on memory allocation as
appropriate.
Useful for applications that want to guarantee their
memory allocations will be available in the future
without having to initialize every page.
</code></pre>
<p><a href="https://github.com/torvalds/linux/blob/v4.6/mm/util.c#L481">https://github.com/torvalds/linux/blob/v4.6/mm/util.c#L481</a></p>
<h2>当 vm.overcommit_memory = 2 时</h2>
<pre><code class="language-console">grep -i commit /proc/meminfo
</code></pre>
<p><img src="https://user-images.githubusercontent.com/15976103/231321120-e77b8fb6-db53-4537-a470-4ffb8bf86073.png" alt="image" /></p>
<p>/proc/meminfo 中的 Committed_AS 表示所有进程已经申请的内存总大小,(注意是已经申请的,不是已经分配的),如果 Committed_AS 超过 CommitLimit 就表示发生了 overcommit,超出越多表示 overcommit 越严重 -> 触发 OOM</p>
<p>那么这个 CommitLimit 是怎么算出来的呢?</p>
<pre><code class="language-c">int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
{
long free, allowed, reserve;
VM_WARN_ONCE(percpu_counter_read(&vm_committed_as) <
-(s64)vm_committed_as_batch * num_online_cpus(),
"memory commitment underflow");
vm_acct_memory(pages);
/*
* Sometimes we want to use more memory than we have
*/
if (sysctl_overcommit_memory == OVERCOMMIT_ALWAYS)
return 0;
if (sysctl_overcommit_memory == OVERCOMMIT_GUESS) {
free = global_page_state(NR_FREE_PAGES);
free += global_page_state(NR_FILE_PAGES);
/*
* shmem pages shouldn't be counted as free in this
* case, they can't be purged, only swapped out, and
* that won't affect the overall amount of available
* memory in the system.
*/
free -= global_page_state(NR_SHMEM);
free += get_nr_swap_pages();
/*
* Any slabs which are created with the
* SLAB_RECLAIM_ACCOUNT flag claim to have contents
* which are reclaimable, under pressure. The dentry
* cache and most inode caches should fall into this
*/
free += global_page_state(NR_SLAB_RECLAIMABLE);
/*
* Leave reserved pages. The pages are not for anonymous pages.
*/
if (free <= totalreserve_pages)
goto error;
else
free -= totalreserve_pages;
/*
* Reserve some for root
*/
if (!cap_sys_admin)
free -= sysctl_admin_reserve_kbytes >> (PAGE_SHIFT - 10);
if (free > pages)
return 0;
goto error;
}
allowed = vm_commit_limit();
/*
* Reserve some for root
*/
if (!cap_sys_admin)
allowed -= sysctl_admin_reserve_kbytes >> (PAGE_SHIFT - 10);
/*
* Don't let a single process grow so big a user can't recover
*/
if (mm) {
reserve = sysctl_user_reserve_kbytes >> (PAGE_SHIFT - 10);
allowed -= min_t(long, mm->total_vm / 32, reserve);
}
if (percpu_counter_read_positive(&vm_committed_as) < allowed)
return 0;
error:
vm_unacct_memory(pages);
return -ENOMEM;
}
</code></pre>
<p>红帽犯过这个错误 :<a href="https://access.redhat.com/solutions/665023">https://access.redhat.com/solutions/665023</a></p>
<p><img src="https://user-images.githubusercontent.com/15976103/231347898-0ad8af97-7100-420b-85fd-120476e0119f.png" alt="image" /></p>
<h2>OOM-killer</h2>
<p>OMM killer 机制:linux 会为每个进程算一个 score,当内存不足时候它会根据 score kill
score 越大表示越容易杀死</p>
<pre><code class="language-shell">#!/bin/bash
while read -r pid comm
do
printf '%d\t%d\t%s\n' "$pid" "$(cat /proc/$pid/oom_score)" "$comm"
done < <(ps -e -o pid= -o comm=) | sort -k2 -n
</code></pre>
<p>/proc/${pid}/oom_score_adj, 取值范围为-1000到1000, 如果将该值设置为-1000,则进程永远不会被杀死 --> pg
/proc/${pid}/oom_adj, 取值是-17到+15,取值越高,越容易被干掉。如果是-17,则表示不能被kill
/proc/${pid}/oom_score, 是系统综合进程的内存消耗量、CPU 时间(utime + stime)、存活时间(uptime - start time)和 oom_adj 计算出的,消耗内存越多分越高。</p>
<p><a href="https://elixir.bootlin.com/linux/v5.4.58/source/mm/oom_kill.c">https://elixir.bootlin.com/linux/v5.4.58/source/mm/oom_kill.c</a></p>
<h2>数据库如何设置,如何避免被 oom-killer</h2>
<ul>
<li>short answer for redis -> echo 1 > /proc/sys/vm/overcommit_memory :)</li>
<li>for PostgresSQL or Greenplum -> echo 2 > /proc/sys/vm/overcommit_memory :)</li>
</ul>
<p>why </p>
<p>redis:</p>
<blockquote>
<p>The Redis background saving schema relies on the copy-on-write semantic of the fork system call in modern operating systems: Redis forks (creates a child process) that is an exact copy of the parent. The child process dumps the DB on disk and finally exits. In theory the child should use as much memory as the parent being a copy, but actually thanks to the copy-on-write semantic implemented by most modern operating systems the parent and child process will share the common memory pages. A page will be duplicated only when it changes in the child or in the parent. Since in theory all the pages may change while the child process is saving, Linux can't tell in advance how much memory the child will take, so if the overcommit_memory setting is set to zero the fork will fail unless there is as much free RAM as required to really duplicate all the parent memory pages. If you have a Redis dataset of 3 GB and just 2 GB of free memory it will fail.
<img src="https://user-images.githubusercontent.com/15976103/231344226-8be702f8-c564-4bea-960d-ec0dd9020685.png" alt="image" /></p>
</blockquote>
<p>Setting overcommit_memory to 1 tells Linux to relax and perform the fork in a more optimistic allocation fashion, and this is indeed what you want for Redis.</p>
<p>PostgresSQL or <a href="https://community.pivotal.io/s/article/Linux-Overcommit-Strategies-and-Pivotal-GreenplumGPDBPivotal-HDBHDB?language=en_US">Greenplum</a>:</p>
<blockquote>
<p>Why Use Strategy 2?
The issue with the default overcommits strategy, or using strategy 1 is the unpredictable nature of the failure. In either case we are not guaranteed that the memory is available at time of allocation and that results in unpredictable termination of processes. In particular, the nature of the failure with strategy 1 can result in corruption of either datafiles or transaction logs as a memory failure can occur mid-transaction resulting in the immediate shutdown of the database process without any cleanup.</p>
</blockquote>
<p>那如果 redis 和 pg 跑在一台机器上有什么好的建议么?</p>
<ul>
<li>采用策略 1 保证 redis 在内存不足时候可用,设置 pg master 的 oom_score 让它避免被 oom-kill </li>
<li>采用策略 2 尽量避免造成 redis 会 oom 的情况</li>
<li>分两台机器</li>
</ul>
<h2>当设置 overcommit = 2 时有什么需要注意的</h2>
<ol>
<li>如前文说的如果服务器有 redis 要保证内存充足</li>
<li>JVM 启动时 Xms Xmx 设置成相同的值,避免向系统申请内存</li>
</ol>
]]></content><link href="https://github.com/yihong0618/gitblog/issues/261"/><category term="工作"/><published>2023-04-12T04:13:02+00:00</published></entry><entry><id>https://github.com/yihong0618/gitblog/issues/259</id><title>开源四年的一些记录</title><updated>2024-11-04T01:56:10.883329+00:00</updated><content type="html"><![CDATA[<h2>写在前面</h2>
<ul>
<li>很多已经在 #186 中记录了而距离这篇又两年半过去了,经历了不少成长与感动,在这里记录一下。</li>
</ul>
<h2>一些感动</h2>
<ul>
<li>我的第一个项目是命令行听<a href="https://www.gcores.com/">机核</a>最开始写完顺便写了一篇文章发在了机核上,那时候我还不太明白怎么弄 PR, 怎么在开源世界里合作,项目的第一个<a href="https://github.com/yihong0618/gaycore/pull/6">贡献者</a>后来我们在推特互相发现(他给 gaycore 添加了快进功能),有种世界真小的感觉(发现时候我还没几个 fo)。后来他去了美国,我们偶尔还在 tg 聊聊各自的生活,感觉像认识了好多年的朋友。</li>
<li>之后 kindle 离开中国,我恰好有一些 kindle 方面的接口调研经验,写了个帮助大家下载自己书的小项目,被一个网站转载,但读文章之后发现他把所有我项目的链接都换成了自己的,想着有些别扭但还能接受的时候,看到评论区 Ray 和 siwei 在下面的留言,心里暖暖的。
<img src="https://user-images.githubusercontent.com/15976103/226506290-5bd63d19-75c7-4809-9e1d-472d1643297f.png" alt="image" /></li>
<li>熟悉我项目的朋友大概都知道,我所有项目的最后一句话都是<strong>谢谢就够了</strong>,后来在 issue 里在邮件中真的收到了好多感谢,有的还特意发邮件谢谢我,说我帮到了他好多。下面截图是我在 running_page issue 中收到的感谢
<img src="https://user-images.githubusercontent.com/15976103/226507081-85e523ea-780d-4588-9206-ec50a1125100.png" alt="image" /></li>
<li>因为后面给很多跑步的项目提了一些 issue 和代码,其中最感动的就是我给 <a href="https://github.com/grafana/strava-datasource">strava-datasource</a> 提的一个 issue 并附上了解决方案,那个我特别敬佩的作者直接回复,Hi! Could you open a PR with these changes? 让我直接有机会给了 grafana 相关的项目提代码。我也把这个传承了下去,在自己项目中,issue 并附上相关解决方案的同学,我都会问一下是否愿意提个 PR.</li>
<li>收到了图灵编辑的邮件,感谢我做的翻译项目,还要送我一些书。</li>
<li>妈妈和老婆跟我说过,虽然看不懂我做的东西,但是感觉我非常厉害,能帮到其它人就更厉害了。老婆也支持我在业余时间写代码。</li>
<li>面试官(后来成了我的领导),在面试前认真看了我所有的项目</li>
<li>和很多人因为开源成了现实中的朋友</li>
</ul>
<h2>一点成长</h2>
<ul>
<li>掌控感,这个月第一次经历了两个同时增长的项目,几乎所有业余时间都在这上,在这个阶段懂了,如何在自己能力范围内更新项目,判断需求,处理 issue 和如何决定是否合 PR, 当然在累的什么都不想干的时候,忽然想明白了休息才是最重要的</li>
<li>Make it work then make it better. 在最开始的时候我总是想把项目尽可能做的好,加足够多帮到大家的功能再发布,后来明白了,这个是开源项目,我需要做的是,尽可能的让项目 work 起来,pull the trigger, 如果这个项目 work 的足够好,会吸引更多厉害的人来一起 make it better</li>
<li>别炫技,如果这个不是需要炫技的项目,那么,尽可能用最简单的实现,项目就会帮到更多的人,让更多的人参与进来。</li>
<li>记录,比如现在我正在做的</li>
</ul>
<h2>一些遗憾</h2>
<ul>
<li>有些 PR 处理的不好,让一个非常热心的台湾朋友有些累,关掉了 PR. 我自责了好一段时间。他代码写的很漂亮,我应该在那时候尽快处理,而不是想着先添加功能</li>
<li>running_page 因为有地图展示,有一个让我非常难受的 PR.</li>
<li>因为 running_page 的置顶 <a href="https://github.com/yihong0618/running_page/issues/135">issue</a> 我想纪念那些逝去的跑步的朋友,被人说滥用 GitHub. </li>
</ul>
<h2>一点分享</h2>
<ul>
<li>Always be nice</li>
<li>别轻易直接关掉 Issue, 有的时候很伤人</li>
<li>如果项目有我之外的贡献者,即使贡献者是修个 typo, 在 issue 回复里尽量用“我们”, 因为已经不是我一个人的项目了</li>
<li>除非没办法,别停止更新每一个项目 let it work, 因为开源,不一定在什么时候帮到别人</li>
</ul>
<h2>一些数据</h2>
<img align="middle" src="https://github-readme-stats-1.yihong0618.vercel.app/api?username=yihong0618&show_icons=true&&&hide_title=true&theme=radical" />
<p>下面是我在这 4 年里写的开源项目的数据(截止 2023.3.21)而这个表格是用我的一个项目 -> <a href="https://github.com/yihong0618/github-readme-stats">github-readme-stats</a> 自动生成的。这 4 年从第一个项目 gaycore 开始,我一共用 5 种语言写了 35 个开源项目得到了 14000 多个 stars. 还挺值得自豪一下的。最值得自豪的是,它们大部分还在更新。我还给一共 55 个项目提了 160 个 PR.</p>
<h2>The repos I created</h2>
<table>
<thead>
<tr>
<th>ID</th>
<th>REPO</th>
<th>START</th>
<th>UPDATE</th>
<th>LAUGUAGE</th>
<th>STARS</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td><a href="https://github.com/yihong0618/bilingual_book_maker">bilingual_book_maker</a></td>
<td>2023-03-02</td>
<td>2023-03-20</td>
<td>Python</td>
<td>4413</td>
</tr>
<tr>
<td>2</td>
<td><a href="https://github.com/yihong0618/running_page">running_page</a></td>
<td>2020-09-17</td>
<td>2023-03-20</td>
<td>Python</td>
<td>2336</td>
</tr>
<tr>
<td>3</td>
<td><a href="https://github.com/yihong0618/xiaogpt">xiaogpt</a></td>
<td>2023-02-16</td>
<td>2023-03-20</td>
<td>Python</td>
<td>1943</td>
</tr>
<tr>
<td>4</td>
<td><a href="https://github.com/yihong0618/Kindle_download_helper">Kindle_download_helper</a></td>
<td>2022-06-06</td>
<td>2023-03-20</td>
<td>Python</td>
<td>1498</td>
</tr>
<tr>
<td>5</td>
<td><a href="https://github.com/yihong0618/GitHubPoster">GitHubPoster</a></td>
<td>2021-04-21</td>
<td>2023-03-20</td>
<td>Python</td>
<td>1364</td>
</tr>
<tr>
<td>6</td>
<td><a href="https://github.com/yihong0618/gitblog">gitblog</a></td>
<td>2019-07-18</td>
<td>2023-03-20</td>
<td>Python</td>
<td>878</td>
</tr>
<tr>
<td>7</td>
<td><a href="https://github.com/yihong0618/2022">2022</a></td>
<td>2022-01-01</td>
<td>2023-03-11</td>
<td>Python</td>
<td>274</td>
</tr>
<tr>
<td>8</td>
<td><a href="https://github.com/yihong0618/2021">2021</a></td>
<td>2020-12-21</td>
<td>2023-03-05</td>
<td>Python</td>
<td>273</td>
</tr>
<tr>
<td>9</td>
<td><a href="https://github.com/yihong0618/blue">blue</a></td>
<td>2022-10-20</td>
<td>2023-03-20</td>
<td>Python</td>
<td>260</td>
</tr>
<tr>
<td>10</td>
<td><a href="https://github.com/yihong0618/iBeats">iBeats</a></td>
<td>2021-06-11</td>
<td>2023-03-19</td>
<td>Python</td>
<td>200</td>
</tr>
<tr>
<td>11</td>
<td><a href="https://github.com/yihong0618/iWhat">iWhat</a></td>
<td>2023-03-08</td>
<td>2023-03-19</td>
<td>Python</td>
<td>172</td>
</tr>
<tr>
<td>12</td>
<td><a href="https://github.com/yihong0618/2020">2020</a></td>
<td>2020-01-10</td>
<td>2023-03-05</td>
<td>C</td>
<td>139</td>
</tr>
<tr>
<td>13</td>
<td><a href="https://github.com/yihong0618/vscode-gcores">vscode-gcores</a></td>
<td>2020-01-04</td>
<td>2023-03-06</td>
<td>TypeScript</td>
<td>110</td>
</tr>
<tr>
<td>14</td>
<td><a href="https://github.com/yihong0618/github-readme-stats">github-readme-stats</a></td>
<td>2020-12-24</td>
<td>2023-03-19</td>
<td>Go</td>
<td>101</td>
</tr>
<tr>
<td>15</td>
<td><a href="https://github.com/yihong0618/gaycore">gaycore</a></td>
<td>2019-02-18</td>
<td>2023-03-06</td>
<td>Python</td>
<td>99</td>
</tr>
<tr>
<td>16</td>
<td><a href="https://github.com/yihong0618/dalian-IT">dalian-IT</a></td>
<td>2021-04-07</td>
<td>2023-03-19</td>
<td>md</td>
<td>99</td>
</tr>
<tr>
<td>17</td>
<td><a href="https://github.com/yihong0618/2023">2023</a></td>
<td>2023-01-01</td>
<td>2023-03-19</td>
<td>Python</td>
<td>51</td>
</tr>
<tr>
<td>18</td>
<td><a href="https://github.com/yihong0618/duolingo_remember">duolingo_remember</a></td>
<td>2021-01-18</td>
<td>2023-01-30</td>
<td>Python</td>
<td>50</td>
</tr>
<tr>
<td>19</td>
<td><a href="https://github.com/yihong0618/shanbay_remember">shanbay_remember</a></td>
<td>2020-12-02</td>
<td>2023-03-13</td>
<td>JavaScript</td>
<td>47</td>
</tr>
<tr>
<td>20</td>
<td><a href="https://github.com/yihong0618/nbnhhsh-cli">nbnhhsh-cli</a></td>
<td>2021-07-09</td>
<td>2022-07-16</td>
<td>Python</td>
<td>32</td>
</tr>
<tr>
<td>21</td>
<td><a href="https://github.com/yihong0618/gcores_calendar">gcores_calendar</a></td>
<td>2020-08-24</td>
<td>2023-03-04</td>
<td>JavaScript</td>
<td>27</td>
</tr>
<tr>
<td>22</td>
<td><a href="https://github.com/yihong0618/pengdu_helper">pengdu_helper</a></td>
<td>2021-09-09</td>
<td>2023-01-27</td>
<td>Go</td>
<td>27</td>
</tr>
<tr>
<td>23</td>
<td><a href="https://github.com/yihong0618/yihong0618">yihong0618</a></td>
<td>2020-07-16</td>
<td>2023-03-15</td>