-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.xml
More file actions
562 lines (562 loc) · 67.4 KB
/
index.xml
File metadata and controls
562 lines (562 loc) · 67.4 KB
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
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>MoonLab</title><link>https://moonlab.top/</link><description>Recent content on MoonLab</description><generator>Hugo -- 0.143.1</generator><language>zh-CN</language><lastBuildDate>Sat, 01 Nov 2025 14:20:04 +0800</lastBuildDate><atom:link href="https://moonlab.top/index.xml" rel="self" type="application/rss+xml"/><item><title>VSCode + OpenOCD 远程调试开发STM32</title><link>https://moonlab.top/posts/2025/daplink-remote-debug/</link><pubDate>Sat, 01 Nov 2025 14:20:04 +0800</pubDate><guid>https://moonlab.top/posts/2025/daplink-remote-debug/</guid><description><p><img loading="lazy" src="c32edaab8195003b5131f89c36e83f22.jpg" alt="" />
</p>
<pre tabindex="0"><code>[PC] --Wi-Fi--&gt; [树莓派5] --USB--&gt; [DAPLink] --SWD--&gt; [STM32目标板]
</code></pre><h1 id="树莓派配置">树莓派配置</h1>
<p>测试Daplink USB连接状态</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>lsusb
</span></span></code></pre></div><h2 id="必要的包">必要的包</h2>
<ul>
<li>openocd</li>
<li>gdb-multiarch</li>
<li>git</li>
<li>make</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>sudo apt install openocd gdb-multiarch git make
</span></span></code></pre></div><h2 id="openocd">OpenOCD</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg
</span></span></code></pre></div><p>默认情况下,OpenOCD启动的GDB服务器(3333端口)只监听本地回环地址(<code>127.0.0.1</code>)</p>
<p>我们需要让OpenOCD监听所有网络接口(<code>0.0.0.0</code>)</p>
<pre tabindex="0"><code>nano ~/remote_daplink.cfg
</code></pre><pre tabindex="0"><code># 指定使用CMSIS-DAP接口
adapter driver cmsis-dap
# 使用SWD协议,STM32F1支持SWD
transport select swd
# 可选:设置适配器速度,如果连接不稳定可以降低速度(单位kHz)
adapter speed 1000
# 指定STM32F1x的目标配置文件
source [find target/stm32f1x.cfg]
bindto 0.0.0.0
gdb_port 3333
telnet_port 4444
tcl_port 6666
# 可选:如果你希望OpenOCD在后台运行(作为守护进程
# daemon_startup attach
</code></pre><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>sudo openocd -f ~/remote_daplink.cfg
</span></span></code></pre></div><p>Tips: <code>-d</code>:输出调试信息</p></description></item><item><title>Clangd + VSCode使用方法</title><link>https://moonlab.top/posts/2025/clangd/</link><pubDate>Thu, 23 Oct 2025 00:36:09 +0800</pubDate><guid>https://moonlab.top/posts/2025/clangd/</guid><description><p><strong>clangd 是基于 Clang 编译器的 C/C++/Objective-C 语言服务器。</strong><br>
它提供类似 IDE 的功能,例如<strong>代码补全</strong>、跳转导航、重构和诊断,并可在支持 LSP(语言服务器协议)的编辑器中使用,如 VSCode、Neovim、Sublime 等。</p>
<hr>
<ul>
<li>
<p><strong>代码补全(Code completion)</strong><br>
在你输入代码时,自动建议变量、函数和类型。</p>
</li>
<li>
<p><strong>跳转到定义 &amp; 查找引用(Go-to-definition &amp; Find references)</strong><br>
一键跳转到符号的定义,或查找它在何处被使用。</p>
</li>
<li>
<p><strong>诊断与警告(Diagnostics &amp; warnings)</strong><br>
不用手动编译,编辑器中就能显示编译错误和警告。</p>
</li>
<li>
<p><strong>重构 &amp; 代码操作(Refactoring &amp; code actions)</strong><br>
支持重命名符号、生成函数框架、自动修复 include 等。</p>
</li>
</ul>
<hr>
<p>请确保在项目根目录下有一个 <code>compile_commands.json</code> 文件。<br>
👉 参考文档:<a href="https://clang.llvm.org/docs/JSONCompilationDatabase.html">JSON Compilation Database</a></p>
<p>CMake(2.8.5 及以上版本)支持在使用 Unix Makefile 构建时,通过设置 <code>CMAKE_EXPORT_COMPILE_COMMANDS</code> 选项来生成这个编译数据库。</p>
<p>但是也可以用<a href="https://github.com/rizsotto/Bear">Bear</a>来生成。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>brew install bear
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>bear -- make clean all
</span></span></code></pre></div><p>但是我在Mac平台下使用arm-none-eabi-gcc来进行交叉编译的时候,bear生成的<code>compile_commands.json</code>里只有<code>[]</code>。</p>
<p>我懒得找解决方法,就直接用<a href="https://github.com/nickdiego/compiledb">compiledb</a>最后生成了<code>compile_commands.json</code>:</p>
<p>在VSCode中<code>Ctrl + Shift + P</code>打开 <code>Preferences: Open Settings(JSON)</code>编辑<code>settings.json</code></p>
<p>或手动去寻找:</p></description></item><item><title>Keil5 编译错误 error: call to undeclared function '__enable_irq'</title><link>https://moonlab.top/posts/2025/keil-i2c-error/</link><pubDate>Sat, 06 Sep 2025 21:25:30 +0800</pubDate><guid>https://moonlab.top/posts/2025/keil-i2c-error/</guid><description><p><img loading="lazy" src="Cursor_V82vfScjj0.png" alt="" />
</p>
<p><code>stm32f1xx_hal_i2c.c</code> 中 <code>__enable_irq</code> 和 <code>disable_irq</code> 函数出现了报错:</p>
<pre tabindex="0"><code>error: call to undeclared function &#39;__enable_irq&#39;; ISO C99 and later do not support implicit of function declarations
</code></pre><p>在 core_cm3.h -&gt; cmsis_compiler.h -&gt; cmsis_armclang.h (ARM Compiler 6) 或 cmsis_armcc.h (AC5) 中对这两个方法没有定义,只有一段注释:</p>
<p><img loading="lazy" src="Cursor_PY4yNMqFgJ.png" alt="" />
</p>
<p><code>__enable_irq</code> 和 <code>disable_irq</code> 控制的是PRIMASK寄存器值。</p>
<p>是一种 intrinsic 函数,编译器会自动识别并替换为相关的指令,它们其实是编译器的一部分,实际的定义位于Keil的 arm_compat.h 中。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * Arm Compiler 6 (armclang)
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> */</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#elif defined (__ARMCC_VERSION) &amp;&amp; (__ARMCC_VERSION &gt;= 6010050)
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">#include</span> <span style="color:#75715e">&#34;cmsis_armclang.h&#34;</span><span style="color:#75715e">
</span></span></span></code></pre></div><p>在其中,这个头文件 <code>arm_compat.h</code> 本该是不存在的:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;arm_compat.h&gt;</span><span style="color:#75715e">
</span></span></span></code></pre></div><p>在<code>.\Drivers\CMSIS\Include</code> 中多了一个<code>arm_compat.h</code>文件,这会导致覆盖编译器的头文件,所以会出现一系列错误。</p></description></item><item><title>BTSNOOP is FUN!</title><link>https://moonlab.top/posts/2025/btsnoop/</link><pubDate>Fri, 01 Aug 2025 22:40:44 +0800</pubDate><guid>https://moonlab.top/posts/2025/btsnoop/</guid><description><h1 id="手机-hci-日志记录">手机 HCI 日志记录</h1>
<p>在VIVO手机中的开发者选项,启用蓝牙 HCI 信息手机日志。</p>
<p>用USB连接电脑后,将 USB连接方式 调整为传输文件。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>adb bugreport vivo_btsnoop
</span></span></code></pre></div><p>会在 <code>/data/user_de/0/com.android.shell/files/</code> 下生成日志,并自动拉取到电脑上。</p>
<p>在 bugreport.zip 下的 <code>\FS\data\misc\bluetooth\logs</code> 中能找到 HCI log:</p>
<p><img loading="lazy" src="explorer_yhsMlyWsdg.png" alt="" />
</p>
<h1 id="knowledge-base"><strong>Knowledge Base</strong></h1>
<h2 id="uuid"><strong>UUID</strong></h2>
<p>UUID(Universally Unique Identifier)是一个 <strong>128位(16字节)</strong> 的唯一标识符,用于标识蓝牙协议中的各种组件 <strong>Services</strong> <strong>Characteristics</strong> <strong>Descriptors</strong> 的类型和功能。</p>
<h2 id="service"><strong>Service</strong></h2>
<p>Service 是蓝牙设备提供的 <strong>功能集合</strong>,每个 Service 包含一个或多个 <strong>Characteristic</strong></p>
<p>Service 也分为 <strong>Primary Service</strong> 和 <strong>Secondary Service</strong></p>
<h2 id="characteristic"><strong>Characteristic</strong></h2>
<p>Characteristic 是 Service 中的 <strong>具体数据点</strong>,用于 <strong>读取、写入、通知</strong> 数据。<br>
每个 Characteristic 包含:</p>
<ul>
<li><strong>Value</strong>:存储的数据(如温度、心率等)。</li>
<li><strong>Properties</strong>:定义操作权限(<code>read</code>、<code>write</code>、<code>notify</code> 等)。</li>
<li><strong>Descriptors</strong>:额外配置(如通知开关)。</li>
</ul>
<h1 id="抓包">抓包</h1>
<p>我已经知道这是一个蓝牙低功耗(BLE)设备,只需找到Attribute Protocol通信:</p>
<p><img loading="lazy" src="Wireshark_7s6DEm1OpW.png" alt="" />
</p></description></item><item><title>算法 - 前缀和</title><link>https://moonlab.top/posts/2025/alg-prefix-array/</link><pubDate>Sun, 04 May 2025 02:23:47 +0800</pubDate><guid>https://moonlab.top/posts/2025/alg-prefix-array/</guid><description><p>在需要频繁地求数组中区间的和的情景下,前缀和数组十分有用。花费 $O(n)$ 的时间生成前缀和,之后只需要 $O(1)$ 的时间计算区间和。</p>
<p>定义一个数组<code>a = [1, 2, 3, 4, 5]</code>,它的前缀和数组:</p>
<pre tabindex="0"><code>prefix[0] = 1
prefix[1] = 1 + 2 = 3
prefix[2] = 1 + 2 + 3 = 6
prefix[3] = 1 + 2 + 3 + 4 = 10
prefix[4] = 1 + 2 + 3 + 4 + 5 = 15
</code></pre><p>要计算 $[i,j]$ 区间的和,可以用 <code>prefix[j] - prefix[i-1]</code> 算出,其中 i = 0 下溢时直接取 <code>prefix[j]</code>。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cpp" data-lang="cpp"><span style="display:flex;"><span>vector<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> prefix(n);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">int</span> sum <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span>(<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>) {
</span></span><span style="display:flex;"><span> sum <span style="color:#f92672">+=</span> i;
</span></span><span style="display:flex;"><span> prefix[i] <span style="color:#f92672">=</span> sum;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>C++的<code>numeric</code>库提供了一个方便的函数<code>partial_sum</code>可以快速计算前缀和。</p></description></item><item><title>2025蓝桥杯赛后总结</title><link>https://moonlab.top/posts/2025/lanqiao-aftermatch/</link><pubDate>Thu, 01 May 2025 16:11:27 +0800</pubDate><guid>https://moonlab.top/posts/2025/lanqiao-aftermatch/</guid><description><p>这次省赛,实际上我并无准备,因为我一如既往地对算法没有什么兴趣。</p>
<p>竞赛一共八道题,A和B题是填空题,后六道题都是程序设计。前五题都做了,第六题暴力应该只拿了部分分,后两题就没时间写了。</p>
<p>在赛场上当时看到C++编译器是2014年发布的gcc 4.7.4,用的是C++98标准。但蓝桥杯的云端是可以运行C++11以上的标准的代码的。</p>
<p>本地做题环境的编译器低版本,导致许多C++函数用不了。比如 to_string()函数用不了。前两题最快速的做饭需要将数转到字符串类型,但是我只知道c++中有一个方便的 to_string() 函数,还好当时我看到赛场机子中有Pycharm,所以我就用python计算了前两道填空题。</p>
<p><strong>这个向下兼容的过程,消耗了我大量时间。</strong></p>
<p>最致命的是,有一道题我需要声明一个迭代器,但是我不知道迭代器的类型名,一般来说都是用auto自动推导的,但auto只在C++11标准以上才有,导致这道题的代码我在本地环境无法测试。明明代码是正确的,但本地的低版本编译器却认为我的代码是错误的。这种割裂感很少有。</p>
<p>而现在看来这道题也依旧做对了。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cpp" data-lang="cpp"><span style="display:flex;"><span><span style="color:#75715e">// C++98
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>std<span style="color:#f92672">::</span>vector<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> vec;
</span></span><span style="display:flex;"><span>std<span style="color:#f92672">::</span>vector<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;::</span>iterator it <span style="color:#f92672">=</span> vec.begin();
</span></span><span style="display:flex;"><span><span style="color:#75715e">// C++ 11
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">auto</span> it <span style="color:#f92672">=</span> vec.begin(); <span style="color:#75715e">// 自动推导为 std::vector&lt;int&gt;::iterator
</span></span></span></code></pre></div><p>与当时赛场的老师沟通,得知组委会只要求提供5.11版本的dev c++,而他们似乎只更新了代码编辑器版本,但一般来说dev c++是捆绑了一个编译器的,但不知为何内置的编译器却十分古典,感觉有点意思。</p>
<p>比赛完后,我查找了在 C++98 的字符串类型转换方法:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cpp" data-lang="cpp"><span style="display:flex;"><span><span style="color:#75715e">// for C++98/03 standard
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>string <span style="color:#a6e22e">old_int_to_string</span>(<span style="color:#66d9ef">int</span> v) {
</span></span><span style="display:flex;"><span> ostringstream oss;
</span></span><span style="display:flex;"><span> oss <span style="color:#f92672">&lt;&lt;</span> v;
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> oss.str();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>string <span style="color:#a6e22e">old_double_to_string</span>(<span style="color:#66d9ef">double</span> v) {
</span></span><span style="display:flex;"><span> ostringstream oss;
</span></span><span style="display:flex;"><span> oss <span style="color:#f92672">&lt;&lt;</span> fixed <span style="color:#f92672">&lt;&lt;</span> setprecision(<span style="color:#ae81ff">6</span>) <span style="color:#f92672">&lt;&lt;</span> v;
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> oss.str();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>string <span style="color:#a6e22e">old_c_style_to_string</span>(<span style="color:#66d9ef">int</span> v) {
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">char</span> buffer[<span style="color:#ae81ff">32</span>]; <span style="color:#75715e">// make sure buffer is suffcient
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> sprintf(buffer, <span style="color:#e6db74">&#34;%d&#34;</span>, v);
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> string(buffer);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>事实上,生活在草台班子里的我们不必认真太多。</p></description></item><item><title>三星ZFold 3改造</title><link>https://moonlab.top/posts/2025/samsung-zfold3/</link><pubDate>Thu, 01 May 2025 16:11:27 +0800</pubDate><guid>https://moonlab.top/posts/2025/samsung-zfold3/</guid><description><h1 id="samsung-zfold-3">Samsung ZFold 3</h1>
<p><img loading="lazy" src="IMG_2029.png" alt="" />
</p>
<p><img loading="lazy" src="scrcpy_xRO0PSYyxj.png" alt="" />
</p>
<h2 id="bootloader-unlock">BootLoader Unlock</h2>
<p>打开 OEM Unlock</p>
<h2 id="root">Root</h2>
<h2 id="get-the-firmware">Get the Firmware</h2>
<p>获取系统固件可以通过网络查找,也可以借助官方工具进行下载。下面将借助S换机助手将手机更新到最新版系统来获取固件。</p>
<p>解锁BL后,在手机中进行系统更新会提示不信任设备,只能借助S换机助手来更新系统。</p>
<p><img loading="lazy" src="explorer_jYjuPIThAE.jpg" alt="" />
</p>
<p>连接后,换机助手会下载固件到安装路径下的Binary文件夹中,在手机Download完成后会自动删除下载的固件。</p>
<p><img loading="lazy" src="SmartSwitchPC_QCh5cJbOn9.png" alt="" />
</p>
<p>更新完成后,手机的系统版本是2025/6/29发布的大陆版F9260ZCSCKYF3</p>
<p><img loading="lazy" src="scrcpy_FvDqDY2d7u.png" alt="" />
</p>
<p><img loading="lazy" src="explorer_MicmWOa3Sj.png" alt="" />
</p>
<p>将AP中的boot.img.lz4压缩为tar格式</p>
<p><a href="https://github.com/fei-ke/Magisk/releases">https://github.com/fei-ke/Magisk/releases</a></p>
<p>使用Magisk对镜像进行修补</p>
<p><img loading="lazy" src="scrcpy_6fzUZLhKPH.png" alt="" />
</p>
<blockquote>
<p>adb reboot download</p></blockquote>
<p><img loading="lazy" src="IMG_2034.png" alt="" />
</p>
<p>使用Odin刷入镜像</p>
<p><img loading="lazy" src="Odin3_v3.14.4_ufInA2qRE3.png" alt="" />
</p></description></item><item><title>JavaScript 逆向 Steam 登录二维码</title><link>https://moonlab.top/posts/2025/steam/</link><pubDate>Wed, 05 Feb 2025 18:22:04 +0800</pubDate><guid>https://moonlab.top/posts/2025/steam/</guid><description><p>众所周知,steam里骗子猖狂。以下页面是骗子私信发给我的一个仿冒的steam钓鱼网站。</p>
<p><img loading="lazy" src="2025-04-19-202645.png" alt="s" />
</p>
<p>如果点击 接受礼物 就会跳转至虚假的steam登录界面。</p>
<p><img loading="lazy" src="steam.png" alt="steam" />
</p>
<p>如果毫无防备,通过手机steam客户端扫描右边的二维码进行登录,steam会进行登录异常的警告,一般来说要通过这一步还是很麻烦的。如果强行继续,那么steam账号除了会被劫持api key以外,大概率还会被洗库存,比如一些便宜的卡片和库存里的小件都会被卖出,而不会触发steam手机令牌的验证。</p>
<p>那么骗子是如何制作这些钓鱼网站的?steam对于自身系统的保护究竟做的怎么样?</p>
<p>这些都绕不开对于steam的逆向分析。</p>
<h1 id="开始逆向">开始逆向</h1>
<p>抓包观察了一会steam登录界面后,就已经捋清了整个登录站点的逻辑。</p>
<p>在最开始会连接<code>/BeginAuthStatusViaQRCode</code> 获取登录二维码,之后每隔一段时间(5s)就会请求 <code>PollAuthSessionStatus/v1</code> 以更新会话状态,如果当前页面的二维码已经过期,则会刷新。</p>
<p>如果先点击登录按钮,会请求<code>/GetPasswordRSAPublicKey/v1</code>,之后是 <code>/BeginAuthSessionStatusViaCredentials</code>。</p>
<p>可以很明显的看到用的是 protobuf 协议。</p>
<p><img loading="lazy" src="1.png" alt="1.png" />
</p>
<p>查看这个网络请求的来源:</p>
<p><img loading="lazy" src="2025-02-07-173039.png" alt="2025-02-07-173039.png" />
</p>
<p>继续追踪这个API的来源。在js文件顶部可以看到这是用webpack打包的:</p>
<p><img loading="lazy" src="2025-02-07-174847.png" alt="2025-02-07-174847.png" />
</p>
<p>找到来自Send的方法调用比较可疑:</p>
<p><img loading="lazy" src="2025-02-07-191915.png" alt="2025-02-07-191915.png" />
</p>
<p>这里的 <code>r</code> 是一个对象,查看一下它的构造方法:</p>
<p><img loading="lazy" src="2025-02-07-195700.png" alt="2025-02-07-195700.png" />
</p>
<p>已经能看到proto的结构了。</p>
<p>构建出用于请求<code>GetPasswordRSAPublicKey/v1</code>的proto:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-c" data-lang="c"><span style="display:flex;"><span>syntax <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;proto3&#34;</span>;
</span></span><span style="display:flex;"><span>package steam;
</span></span><span style="display:flex;"><span>option go_package <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;proto/steam&#34;</span>
</span></span><span style="display:flex;"><span>message GetPasswordRSAPublicKey_Request {
</span></span><span style="display:flex;"><span> string account_name <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>message GetPasswordRSAPublicKey_Response {
</span></span><span style="display:flex;"><span> string public_key_mod <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
</span></span><span style="display:flex;"><span> string public_key_exp <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span>;
</span></span><span style="display:flex;"><span> uint64 timestamp <span style="color:#f92672">=</span> <span style="color:#ae81ff">3</span>;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>编译proto:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ protoc --go_out<span style="color:#f92672">=</span>. --go-grpc_out<span style="color:#f92672">=</span>. steam.proto
</span></span></code></pre></div><p>安装golang的protobuf包:</p></description></item><item><title>快速求解平方根倒数算法</title><link>https://moonlab.top/posts/2025/alg-graphics-1/</link><pubDate>Tue, 04 Feb 2025 21:35:38 +0800</pubDate><guid>https://moonlab.top/posts/2025/alg-graphics-1/</guid><description>本文介绍了一种快速计算平方根倒数的算法,该算法源于上世纪90年代。文章首先解释了浮点数在计算机中的存储方式,特别是float32格式的结构,包括符号位、指数位和尾数位。接着,介绍了牛顿迭代法的基本原理及其在求解平方根倒数中的应用。通过对浮点数的对数变换,推导出与平方根倒数相关的公式,并解释了代码中使用的神秘常数 0x5f3759df 的来源,最后提到切比雪夫最佳逼近的概念,以优化计算结果。</description></item><item><title>Protobuf</title><link>https://moonlab.top/posts/2025/protobuf3/</link><pubDate>Fri, 24 Jan 2025 03:33:27 +0800</pubDate><guid>https://moonlab.top/posts/2025/protobuf3/</guid><description><h1 id="安装-protobuf">安装 protobuf</h1>
<p>假设环境下已有<code>protoc</code> (protocal buffers compiler)。</p>
<p>对于 Go 语言,安装相应的可执行文件:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>go install google.golang.org/grpc/cmd/protoc-gen-go@latest
</span></span><span style="display:flex;"><span>go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
</span></span></code></pre></div><p>在Windows中,执行完安装命令后在<code>C:\Users\user\go\bin</code>路径下会有<code>proctoc-gen-go.exe</code>和<code>protoc-gen-go-grpc.exe</code>。</p>
<p>安装完Go插件后,我们希望protoc生成Go语言的代码,需要为 <code>.proto</code> 文件加一行以指定生成的Go包名:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">syntax</span> = <span style="color:#e6db74">&#34;proto3&#34;</span>;
</span></span><span style="display:flex;"><span><span style="color:#f92672">package</span> <span style="color:#a6e22e">com</span>.<span style="color:#a6e22e">example</span>.<span style="color:#a6e22e">pkg</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">option</span> <span style="color:#a6e22e">go_package</span> = <span style="color:#e6db74">&#34;example/gopkg&#34;</span>
</span></span></code></pre></div><p>如果需要使用 <code>grpc</code> 服务,安装包:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>go get google.golang.org/grpc
</span></span></code></pre></div><p>之后便可启动一个 gRPC 服务器:</p>
<h1 id="grpc-gateway">gRPC gateway</h1>
<p>为 <code>gRPC</code> 服务生成面向 <code>RestFul API</code> 的网关</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest
</span></span><span style="display:flex;"><span>go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">syntax</span> = <span style="color:#e6db74">&#34;proto3&#34;</span>;
</span></span><span style="display:flex;"><span><span style="color:#f92672">package</span> <span style="color:#a6e22e">com</span>.<span style="color:#a6e22e">example</span>.<span style="color:#a6e22e">pkg</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> <span style="color:#e6db74">&#34;google/api/annotations.proto&#34;</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">option</span> <span style="color:#a6e22e">go_package</span> = <span style="color:#e6db74">&#34;example/gopkg
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">service AuthService {
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> rpc Login(LRequest) returns (LResponse) {
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> option (google.api.http) = {
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> post: &#34;</span><span style="color:#f92672">/</span><span style="color:#a6e22e">v1</span><span style="color:#f92672">/</span><span style="color:#a6e22e">login</span><span style="color:#e6db74">&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> body: &#34;</span><span style="color:#f92672">*</span><span style="color:#960050;background-color:#1e0010">&#34;</span>
</span></span><span style="display:flex;"><span> };
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">message</span> <span style="color:#a6e22e">LRequest</span> {
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">string</span> <span style="color:#a6e22e">field</span> = <span style="color:#ae81ff">1</span>;
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">message</span> <span style="color:#a6e22e">LResponse</span> {
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">string</span> <span style="color:#a6e22e">field</span> = <span style="color:#ae81ff">1</span>;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>之后便可以生成grpc gateway的代码了:</p></description></item><item><title>Android设备安装Debian成为BT下载服务器</title><link>https://moonlab.top/posts/2024/debian-on-android/</link><pubDate>Wed, 07 Aug 2024 08:24:02 +0800</pubDate><guid>https://moonlab.top/posts/2024/debian-on-android/</guid><description>文章介绍了如何在Android设备上通过Termux安装Debian,并配置VNC以便远程访问。作者提到,由于Android 12引入的Phantom Process Killer机制,Termux容易被杀死,因此提供了关闭该限制的ADB命令。接着,文章详细说明了如何安装XFCE桌面环境和配置VNC服务器,包括使用TightVNC的步骤。最后,作者提到可以进一步安装gogs作为本地Git服务器。</description></item><item><title>[双系统] Windows 更新摧毁了我的Linux系统</title><link>https://moonlab.top/posts/2024/windows-update-broke-linux-system/</link><pubDate>Sat, 03 Aug 2024 08:28:35 +0800</pubDate><guid>https://moonlab.top/posts/2024/windows-update-broke-linux-system/</guid><description>在 Windows 更新后,用户的 Linux 系统因等待 90 秒而无法启动,并且出现依赖失败。调查发现,Windows 调换了 Linux 分区和恢复分区的顺序,从而导致了问题。用户通过修复 Linux、更新 fstab、重新安装 Grub 和使用 efibootmgr 更改启动顺序解决了问题。</description></item><item><title>Reading List</title><link>https://moonlab.top/reading/</link><pubDate>Thu, 28 Dec 2023 13:04:32 +0000</pubDate><guid>https://moonlab.top/reading/</guid><description><h2 id="fiction">FICTION</h2>
<p>[ ] Cryptonomicon by Neal Stephenson - 2024.1</p>
<p>[x] 雪国 川端康成 - 2024.4 美的留存是徒劳的</p>
<p>[x] 千只鹤 川端康成 - 2024.5 有罪的爱也是爱吗?</p>
<h2 id="philosophy">PHILOSOPHY</h2>
<p>规训与惩罚:监狱的诞生 <a href="https://zh.wikipedia.org/wiki/%E7%B1%B3%E6%AD%87%E7%88%BE%C2%B7%E7%A6%8F%E6%9F%AF">米歇尔·福柯</a> - 2024.6
Doing Philosophy: From Common Curiosity to Logical Reasoning</p>
<h2 id="tech">TECH</h2>
<p>[ ] How to Solve It by G.Polya</p>
<p>[ ] Code Complete by McConnell, Steve - 2024 I like the well-structured, clear table of contents with the related references in a chapter&rsquo;s beginning, and concise summaries at the end. Besides that, what things need to be done before project construction is well</p></description></item><item><title>Golang embed 使用问题</title><link>https://moonlab.top/posts/2023/golang-embed-package-use-issues/</link><pubDate>Wed, 27 Dec 2023 08:10:39 +0000</pubDate><guid>https://moonlab.top/posts/2023/golang-embed-package-use-issues/</guid><description>Golang 使用 embed 包在编译时将外部文件包含到二进制程序中。使用 embed 指令可以将 html、css、js 等静态文件添加到二进制文件中,而无需额外的资源文件。嵌入文件可以使用字符串、[]字节和 FS 来引用。但也有一些限制,如文件层次结构问题和复杂路径问题。例如,如果嵌入文件和被嵌入文件不在同一层次,嵌入模式将无法成功解析。另一个问题是处理复杂路径,即静态文件夹被放置在嵌入文件的子文件夹中。解决办法是使用 io/fs 软件包中的 Sub 方法来处理这些复杂路径。</description></item><item><title>Hexo博客自动备份插件 云盘备份支持</title><link>https://moonlab.top/posts/2023/hexo-auto-backup/</link><pubDate>Tue, 19 Dec 2023 21:38:50 +0000</pubDate><guid>https://moonlab.top/posts/2023/hexo-auto-backup/</guid><description>本文讨论了博客数据备份方案,强调321原则:保留3个备份副本,使用2种不同储存介质,1个备份远离数据源。最初考虑使用GitHub Action进行备份,但发现其局限性。为此,开发了Hexo插件“hexo-auto-backup”,可在执行hexo deploy时自动备份重要文件到本地或云盘,支持多种云服务和协议。插件安装简单,通过npm安装。未来计划改进备份过期设置和多系统支持。详细信息可见插件的GitHub仓库。</description></item><item><title>通过汇编分析栈、函数调用 esp&ebp</title><link>https://moonlab.top/posts/2023/aem-esp-ebp/</link><pubDate>Fri, 15 Dec 2023 14:31:17 +0000</pubDate><guid>https://moonlab.top/posts/2023/aem-esp-ebp/</guid><description>栈是一种遵循后进先出(LIFO)规则的数据结构,通常用于内存管理。重要寄存器包括栈指针(SP)和基指针(BP)。在函数调用中,使用<code>push</code>将参数压入栈中,<code>call</code>指令保存返回地址。ESP寄存器指向栈顶,函数执行后需平衡栈。C语言函数调用中,参数通过EBP寻址,编译器可能使用<code>mov</code>而非<code>push</code>,使得ESP不指向栈顶,简化栈平衡的处理。</description></item><item><title>Git push 出现 permisson denied error 403</title><link>https://moonlab.top/posts/2023/git-err/</link><pubDate>Fri, 15 Sep 2023 12:09:04 +0000</pubDate><guid>https://moonlab.top/posts/2023/git-err/</guid><description>在尝试使用 <code>git push -u origin main</code> 时,出现了权限错误,提示旧用户被拒绝访问。为了解决这个问题,作者尝试通过 <code>git commit --amend --reset-author</code> 重置提交作者,但问题依旧。最终在 Stack Overflow 找到解决方案:删除旧的凭证,成功解决了问题,节省了一个小时的时间。</description></item><item><title>坑:Litepal save方法返回true却没有保存</title><link>https://moonlab.top/posts/2020/pit-for-litepal-save/</link><pubDate>Mon, 24 Feb 2020 11:52:38 +0000</pubDate><guid>https://moonlab.top/posts/2020/pit-for-litepal-save/</guid><description><p>在开发 Madoka 日记时,做到导出导入的功能时,我想偷个懒导出直接用 Gson 将 Java 对象转换为 json 然后放在 txt 中,导入的时候再将 json 转为 javaBean 就行啦。</p>
<p>而数据库我用的是 Litepal 直接搞,使用这个库的好处就是速度快,方便,适合新手。</p>
<p>但其实 sqlite 的语法和一些其他的语句并不难,所以用这个库就是为了方便&hellip;</p>
<p>使用 Litepal 储存数据时,需要调用 save() 方法。</p>
<p>这里我就遇到了一个问题,明明 save() 方法返回的是 true ,但数据库里没有需要保存的数据啊?</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> Gson gson <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Gson();
</span></span><span style="display:flex;"><span> Diary diary <span style="color:#f92672">=</span> gson.<span style="color:#a6e22e">fromJson</span>(json, Diary.<span style="color:#a6e22e">class</span>);
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> diary.<span style="color:#a6e22e">save</span>();
</span></span></code></pre></div><p>这是调用 Gson 将 json 转换为 javabean 对象。</p>
<p>明明 Diary 的内容全是正确的,我开始询问度娘。</p>
<p>结果没找到跟我的问题直接相关的文章,结果我看到了有个人在吐槽啥 setting getting,我就想到了会不会是因为没有调用 Diary 的构造方法?</p>
<p>Diary 作为一个 Litepal 的,它是继承自 LitePalSupport 的,会不会是因为没有调用 LitePalSupport 的构造方法呢?</p>
<p>我将导入代码改了一下:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> Gson gson <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Gson();
</span></span><span style="display:flex;"><span> Diary diary <span style="color:#f92672">=</span> gson.<span style="color:#a6e22e">fromJson</span>(json, Diary.<span style="color:#a6e22e">class</span>);
</span></span><span style="display:flex;"><span> Diary saveDiary <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Diary();
</span></span><span style="display:flex;"><span> saveDiary.<span style="color:#a6e22e">setId</span>(diary.<span style="color:#a6e22e">getId</span>());
</span></span><span style="display:flex;"><span> saveDiary.<span style="color:#a6e22e">setCreatedTime</span>(diary.<span style="color:#a6e22e">getCreatedTime</span>());
</span></span><span style="display:flex;"><span> saveDiary.<span style="color:#a6e22e">setLastUpdatedTime</span>(diary.<span style="color:#a6e22e">getLastUpdatedTime</span>());
</span></span><span style="display:flex;"><span> ... 省略一万个代码
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> saveDiary.<span style="color:#a6e22e">save</span>();
</span></span></code></pre></div><p>果然,最后正常了&hellip;</p></description></item><item><title>Android Shizuku源码分析 第二篇</title><link>https://moonlab.top/posts/2020/android-shizuku-theory2/</link><pubDate>Tue, 04 Feb 2020 11:43:10 +0000</pubDate><guid>https://moonlab.top/posts/2020/android-shizuku-theory2/</guid><description>本文深入分析了 Shizuku 的启动过程,特别是 <code>Starter</code> 类的 <code>main</code> 方法是如何被调用的。文章首先回顾了 Shizuku 的基本概念,并介绍了通过 <code>adb</code> 命令激活 ShizukuService 的过程,重点分析了 <code>start.sh</code> 脚本的执行。当用户通过 ShizukuManager 启动应用时,<code>start.sh</code> 脚本被调用,该脚本负责设置环境并执行 <code>libshizuku.so</code> 文件。文章详细描述了 <code>ShizukuManager</code> 在启动时如何写入 <code>start.sh</code> 文件及其相关的 dex 文件路径。接着,文章探讨了 <code>libshizuku.so</code> 中的 <code>main</code> 方法,说明了如何通过 <code>app_process</code> 启动 Java 类 <code>moe.shizuku.server.Starter</code>。在 <code>Starter</code> 类的 <code>main</code> 方法中,创建了 <code>ShizukuService</code> 实例,从而完成了 ShizukuService 的启动。最后,作者总结了整个过程,强调了用户通过简单的 <code>adb</code> 命令如何触发一系列复杂的操作,最终实现 Shizuku 的功能。</description></item><item><title>Android Shizuku源码分析</title><link>https://moonlab.top/posts/2020/android-shizuku-theory/</link><pubDate>Sun, 02 Feb 2020 19:24:10 +0000</pubDate><guid>https://moonlab.top/posts/2020/android-shizuku-theory/</guid><description>本文分析了 Shizuku 的源码,介绍了其如何通过 Binder 实现与 Android 系统服务的交互。Shizuku 应用引导用户以 root 或 adb 方式运行服务进程,利用 ShizukuBinderWrapper 进行系统隐藏 API 的调用。文章详细探讨了 ShizukuBinderWrapper 的构造、transact 方法及其与 IShizukuService 的通信过程,最后简要提及 ShizukuService 的启动流程。作者计划进一步深入分析 Shizuku 的启动机制。</description></item><item><title>Android 监听第三方Activity的一举一动</title><link>https://moonlab.top/posts/2020/android-activity-monitor/</link><pubDate>Sat, 01 Feb 2020 18:39:25 +0000</pubDate><guid>https://moonlab.top/posts/2020/android-activity-monitor/</guid><description>这篇文章主要记录了作者在2019年初的个人感受和一些技术探索。作者回顾了过去一年的经历,感到没有太多进展,并提到冬季的天气和国内的传染病情况。尽管在家中待得久了,作者也提到了一些娱乐活动,比如观看动画和春晚,但整体上对新番的期待逐渐减弱。在技术方面,作者分享了在Android开发中监听Activity启动的需求,探讨了几种方法来获取Activity的类名。首先,作者提到使用<code>ActivityManager</code>的<code>getRunningTasks</code>方法,但由于权限限制,这种方法不可行。接着,作者提到<code>UsageStatsManager</code>只能获取应用包名,而无法获取Activity类名。最终,作者发现了<code>IActivityController</code>接口,并通过使用Shizuku工具来调用系统API,从而实现了监听Activity启动的功能。总结来说,文章结合了个人生活感受与技术探索,展示了作者在面对生活和技术挑战时的思考与解决方案。</description></item><item><title>Android笔记#1 View的事件分发机制解析</title><link>https://moonlab.top/posts/2019/android-view-motionevent/</link><pubDate>Wed, 14 Aug 2019 11:07:50 +0000</pubDate><guid>https://moonlab.top/posts/2019/android-view-motionevent/</guid><description>本文总结了《Android艺术开发探索》中关于View事件分发机制的内容。事件序列从ACTION_DOWN开始,经过多个ACTION_MOVE,最后以ACTION_UP结束。事件传递顺序为Activity -&gt; Window -&gt; DecorView -&gt; RootView。事件分发主要通过dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三个方法实现。ViewGroup的onInterceptTouchEvent默认返回false,子View可通过OnTouchListener处理事件。总结指出,事件分发机制确保一个事件序列只能被一个View拦截和消耗,且OnTouchListener优先级高于onTouchEvent。</description></item><item><title>知乎日报的问题</title><link>https://moonlab.top/posts/2019/android-zhihu-daily/</link><pubDate>Thu, 04 Jul 2019 20:34:10 +0000</pubDate><guid>https://moonlab.top/posts/2019/android-zhihu-daily/</guid><description>作者在暑假期间开始开发一个第三方的知乎日报客户端,使用MVP架构。遇到了一些问题,如全局异常处理和JSON解析,选择使用Picasso加载图片。为了解决WebView中图片宽度过大的问题,作者通过JavaScript调整图片大小。最终,作者完成了基本的加载和查看功能,并在GitHub上分享了代码。尽管开发过程充满挑战,作者仍然享受这个过程。</description></item><item><title>Hello World</title><link>https://moonlab.top/posts/2019/hello-world/</link><pubDate>Sat, 25 May 2019 14:50:36 +0000</pubDate><guid>https://moonlab.top/posts/2019/hello-world/</guid><description><p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p>
<h2 id="quick-start">Quick Start</h2>
<h3 id="create-a-new-post">Create a new post</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ hexo new <span style="color:#e6db74">&#34;My New Post&#34;</span>
</span></span></code></pre></div><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p>
<h3 id="run-server">Run server</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ hexo server
</span></span></code></pre></div><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p>
<h3 id="generate-static-files">Generate static files</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ hexo generate
</span></span></code></pre></div><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p>
<h3 id="deploy-to-remote-sites">Deploy to remote sites</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ hexo deploy
</span></span></code></pre></div><p>More info: <a href="https://hexo.io/docs/deployment.html">Deployment</a></p></description></item><item><title>使用Hexo</title><link>https://moonlab.top/posts/2019/hello-hexo/</link><pubDate>Sat, 25 May 2019 14:50:36 +0000</pubDate><guid>https://moonlab.top/posts/2019/hello-hexo/</guid><description><p>咸鱼不咸从今天(2019.5.25)开始使用<a href="https://hexo.io">Hexo</a>啦</p>
<p>用了一年多的 Typecho ,换了新的博客程序虽然有点不习惯,但是我觉得 Hexo 比 Typecho更加好用</p>
<p>之前在 Typecho 写的文章我并不打算搬过来,评论也是如此,所以基本上相当于重新写一个博客&hellip;</p>
<p>之前的 咕咕咕 事故导致博客失去了许多朋友QAQ</p>
<p>写博客的这一段时间,我也有许多的收获吧</p>
<p>咸鱼不咸的初心只是因为无聊,而现在则是想要有一个在复杂的网络中发声的立身之地</p>
<p>在茫茫海洋中,唯有这小小的避浪处能给我安心吧</p>
<p>这也算是一个新的开始吧,以后更新博客的速度就随缘吧233333</p></description></item><item><title>Ubnutu 无法启动网易云音乐 - 总结</title><link>https://moonlab.top/posts/2018/ubuntu-cannot-use-netease-music/</link><pubDate>Tue, 07 Aug 2018 21:28:14 +0800</pubDate><guid>https://moonlab.top/posts/2018/ubuntu-cannot-use-netease-music/</guid><description><blockquote>
<p>从垃圾堆里抛出来的一篇2018的文章. &ndash;2024.8.7</p></blockquote>
<p>Author Avatar
LingC
8 月 7 日</p>
<h1 id="00">00</h1>
<p>本文总结了16.04以上的版本运行网易云音乐会出现的问题,以及解决方法
如果你安装官方版本网易云音乐后(v1.1.0),运行网易云音乐无响应的话可以试试以下几种方法</p>
<h1 id="01">01</h1>
<p>在终端中输入</p>
<p>$ netease-cloud-music &ndash;no-sandbox %U</p>
<p>即可启动网易云音乐</p>
<p>有可能会出现一些警告,稍后会打开网易云主界面</p>
<p>如果出现Unable to locate theme engine in module_path: &ldquo;adwaita&rdquo;</p>
<p>可以尝试执行这条命令:$ sudo apt install gnome-themes-standard</p>
<p>如果出现failed to retrieve propertygtk-primary-button-warps-slider’ of type gboolean'</p>
<p>可以尝试$ vi ~/.gtkrc-2.0</p>
<p>使用vim打开这个文件,将其中的一行改为</p>
<p>gtk-primary-button-warps-slider=false改为gtk-primary-button-warps-slider=0</p>
<p>然后可以再试着运行一下,如果还不行就reboot</p>
<p>如果出现Gtk-Message: 08:59:03.546: Failed to load module &ldquo;canberra-gtk-module&quot;或者没有反应,那么你可以试试第二种方法</p>
<h1 id="02">02</h1>
<p>在终端中输入</p>
<p>$ sudo netease-cloud-music</p>
<p>使用root权限运行网易云音乐</p>
<p>可能会出现一些警告和报错,其实可以无视(懒的管)</p>
<p>2018-08-07 09-00-03屏幕截图.png</p>
<h1 id="03">03</h1>
<p>可以试一下这个方法
<a href="https://jingyan.baidu.com/article/1e5468f956a15c484861b770.html">https://jingyan.baidu.com/article/1e5468f956a15c484861b770.html</a></p>
<h1 id="04">04</h1>
<p>该方法针对于ubuntu 18.04LTS 网易云音乐v1.1.0</p>
<p>其他版本也可以试一下</p>
<p>首先</p></description></item><item><title>Windows 好软推荐 | 这一定是良心软件</title><link>https://moonlab.top/posts/2018/windows-software-recommendation/</link><pubDate>Sat, 04 Aug 2018 21:28:14 +0800</pubDate><guid>https://moonlab.top/posts/2018/windows-software-recommendation/</guid><description><blockquote>
<p>从垃圾堆里抛出来的一篇2018的文章. &ndash;2024.8.7</p></blockquote>
<p>Author Avatar
LingC
8 月 4 日</p>
<h1 id="00">00</h1>
<p>继上一篇电脑中常用的软件</p>
<p>我在 C 盘格式化后又遇见了一些不错的软件,这些软件反正是有 Windows 版本的,其他系统我就不知道啦~~</p>
<p>并且这篇文章我会为你找到软件的官网或资源下载地址,我会一并写在这篇文章中</p>
<h1 id="01---fances">01 - Fances</h1>
<p>这款软件就是让你的桌面更条例有序,给泥们放一张我桌面的截图吧
TIM截图20180804195952.png
是不是感觉很好看 o( ̄▽ ̄)o</p>
<p>购买:https://www.stardock.com/products/fences/
不过 steam 上也有卖 <a href="https://store.steampowered.com/app/607380/Fences/?l=tchinese&amp;cc;=nl">https://store.steampowered.com/app/607380/Fences/?l=tchinese&cc;=nl</a>
你说你没有钱买正版?没关系,我这里有破解版
不过在下载之前你要答应我,自己有能力的话一定要去买正版哦 (。・∀・) ノ
慕若曦那里就有这个破解版资源,链接:https://www.muruoxi.com/623.html</p>
<h1 id="02---flux">02 - f.lux</h1>
<p>有时候我会抱怨,电脑屏幕的亮度太高了,兼职闪瞎我的眼睛,特别是在晚上的时候,我一直找不到好的护眼软件</p>
<p>然而,这款软件除了普通的护眼功能外,还可以根据你选择的模式在不同时间段进行自动调节
来张图</p>
<p>flux.png</p>
<p>你可以直接去官网中下载:https://justgetflux.com/</p>
<h1 id="03---uninstaller">03 - uninstaller</h1>
<p>这其实是一个小工具,你不用安装就可以启动</p>
<p>这是一款小型轻量的卸载程序,我看中它可以卸载完程序后,清理注册表里的残留,感觉挺良心的
我查了一下才发现,我一直用的是老版本的 uninstaller,这是老板本截图,新版本比这好看很多</p>
<p>uninstallerold.png</p>
<p>老板本的 uninstaller 不需要安装,而新版本的需要安装,但是新版本的用户体验肯定比老板本好啦</p>
<p>新版本截图:</p>
<p>uninstallernow.png</p>
<p>虽然新版本安装时有一些肿瘤,推荐你安装同一公司的产品,以及订阅书籍,但是它在功能使用方面并不膨胀,我自己稍微使用了一下感觉还行
飞去下载地址吧!:https://iobit-uninstaller.en.softonic.com/</p>
<h1 id="04---火绒">04 - 火绒</h1>
<p>这是本文唯一提到的国产软件,也是我最期待的软件</p>
<p>这是一款电脑安全软件,我相信你们的电脑一般都会装一些安全软件,比如 360,百度,腾讯的那些安全卫士</p>
<p>我在知道火绒之前一直是裸体的,直到火绒出现到我面前,我一直是不相信国内会有如此良心的安全软件</p>
<p>首先,肯定有人会问</p>
<pre><code>啊,这是什么软件,听都没有听说过,肯定没有 360 好用啦
</code></pre>
<p>其实火绒的防护能力并不亚于国内的安全软件,不敢说是站在顶端,但是从制作人方面就可以看出一定不是什么小公司做开发的,我用着感觉十分的不错,纯净的超乎想象,有一次我卸载国内某款软件,最后即将完成卸载时,我不耐烦的快速按了,眼角的余光看见了</p>
<pre><code>√ 安装 鲁大师
√ 安装 …
</code></pre>
<p>当时其实我都忘记了还有火绒在,所以慌的一批,然后火绒就在右下角弹出 “已拦截…..”</p></description></item><item><title>typecho - http转https</title><link>https://moonlab.top/posts/2018/typecho-http-2-https/</link><pubDate>Tue, 27 Mar 2018 21:28:14 +0800</pubDate><guid>https://moonlab.top/posts/2018/typecho-http-2-https/</guid><description><blockquote>
<p>从垃圾堆里抛出来的一篇2018的文章. &ndash;2024.8.7</p></blockquote>
<p>2018-03-27 21:28</p>
<p>在我从http转成https时出现一个致命问题:</p>
<p>css与js无法加载</p>
<p>报错截图:</p>
<p>![NOT]</p>
<p>主页界面:</p>
<p><img loading="lazy" src="https://img.lcblog.cn/images/typecho/2018-03-27/1.png" alt="1" />
</p>
<p>并且这时没有绿锁</p>
<p><img loading="lazy" src="https://img.lcblog.cn/images/typecho/2018-03-27/3.png" alt="3" />
</p>
<hr>
<p>访问了许多网站,游览了许多资料
在<code>config.inc.php</code>中插入</p>
<pre><code>/** 开启HTTPS */
define('__TYPECHO_SECURE__',true);</code></pre>
<p>也没有任何卵用,我开始绝望</p>
<p>其主要问题是 网站前台资源 通过http访问,而本站是https,所以会出现问题
且安全连接并不完全,因为有http的连接</p>
<p>就在这时,我翻到一篇文章,看到一个插件:<code>TEDUriReplace</code>
使用方法非常简单,插件截图:
<img loading="lazy" src="https://img.lcblog.cn/images/typecho/2018-03-27/2.png" alt="2" />
</p>
<p>步骤:</p>
<p>1.将后台的网址改为https://xxx.cn</p>
<p>2.在插件的规则中写入<code><a href="http://xxx.cn/=%3Ehttps://xxx.cn/">http://xxx.cn/=>https://xxx.cn/</a></code></p>
<p>3.刷新网页</p>
<p>就是如此简单,这款插件真的很好用
下载链接:<a href="https://s.typechodev.com/plugins/uploads/2017/12/2122242327.zip">https://s.typechodev.com/plugins/uploads/2017/12/2122242327.zip</a></p></description></item><item><title>如何评价Android P</title><link>https://moonlab.top/posts/2018/comment-about-android-p/</link><pubDate>Wed, 21 Mar 2018 21:09:14 +0800</pubDate><guid>https://moonlab.top/posts/2018/comment-about-android-p/</guid><description><blockquote>
<p>从垃圾堆里抛出来的一篇2018的文章. &ndash;2024.8.7</p></blockquote>
<p>2018-03-21 21:09</p>
<p>[one]</p>
<p>[two]</p>
<p>2018年3月8日,Google发布了Android P的预览版
而这次版本更新引来了很多不满,大多是对布局外观上的评价
主要都是围绕着Material Design的问题,因为Google从Android5.x开始就遵循着Material Design
而Material Design是Google提出的设计风格,虽然Google系列很多都遵循着MD
但是也有一部分偏移了MD,就比如AndroidP,我感觉更偏向于扁平化</p>
<p>[Android]</p>
<p>这张图片是AndroidP的截图,感觉还可以
另外再说一下圆角元素,AndroidP大量使用了圆角元素
我个人感觉圆角元素的弧度只要把握好,真的不是什么大问题
斜刘海的问题我也不想多说
这也成为了被众人吐槽的原因之一</p>
<p>[Android Title]</p>
<p><em>Android P</em></p>
<p>[IOS]
<em>IOS</em>
P的通知栏已经丝毫没有MD的风格了,与IOS的通知栏比起来
感觉更像了,偏向于扁平化,没有质感了</p>
<p>[Android Seting]</p>
<p>P的设置界面倒还不错,虽然与MD搭不上边
色彩的搭配很有亮点</p>
<hr>
<p>总的来说,并不是特别讨厌P的更新,因为时代会变化</p>
<p><code>![hx][7]</code></p>
<p>倒不如说很喜欢这次更新,感觉是安卓目前最好看的设计
MD风格是给人的设计思路,而不是限制设计的锁链</p></description></item><item><title/><link>https://moonlab.top/posts/2025/forced-air-cooler/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://moonlab.top/posts/2025/forced-air-cooler/</guid><description><p>我的笔记本温度达到80度以上,系统就会降频。打cs的话,fps直接从稳定的180帧调到130-140帧上下。</p>
<p><a href="https://www.bilibili.com/video/BV1Lr421M7u2">B站视频</a></p>
<p>看了视频中的测评,能降温10度左右。</p>
<p>压风式散热</p>
<p>36*25cm</p>
<p>考虑到用纸箱做自己根据需要来开孔比较简单,不需要改图纸</p>
<h1 id="材料清单">材料清单</h1>
<table>
<thead>
<tr>
<th>材料</th>
<th>数量</th>
<th>总价</th>
</tr>
</thead>
<tbody>
<tr>
<td>10cm 离心风机(空气净化器风扇)</td>
<td>1</td>
<td>15¥</td>
</tr>
<tr>
<td>可调电源3-12V 2A</td>
<td>1</td>
<td>5.99¥</td>
</tr>
<tr>
<td>DC转4pin线</td>
<td>1</td>
<td>3.3¥</td>
</tr>
<tr>
<td>36*26*6cm 飞机盒</td>
<td>3</td>
<td>4.1¥</td>
</tr>
<tr>
<td>PVC胶布</td>
<td>1</td>
<td>1.62¥</td>
</tr>
<tr>
<td>回弹海绵 厚15mm 宽20mm</td>
<td>2米</td>
<td>5.56¥</td>
</tr>
</tbody>
</table>
<p>合计:</p>
<p>如果要用亚克力板做,则需要加上:</p>
<table>
<thead>
<tr>
<th>材料</th>
<th>数量</th>
<th>总价</th>
</tr>
</thead>
<tbody>
<tr>
<td>亚克力板</td>
<td>1</td>
<td>40¥</td>
</tr>
<tr>
<td>M3 10*10*10 六面螺母</td>
<td>12</td>
<td>9¥</td>
</tr>
<tr>
<td>M3*8 螺丝</td>
<td>32</td>
<td>1.28¥</td>
</tr>
<tr>
<td>M4*8 螺丝</td>
<td>9</td>
<td>3¥</td>
</tr>
<tr>
<td>M4 14mm 双通铜柱</td>
<td>3</td>
<td>4.5¥</td>
</tr>
</tbody>
</table></description></item><item><title/><link>https://moonlab.top/posts/2025/stm32-problem-1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://moonlab.top/posts/2025/stm32-problem-1/</guid><description><p><img loading="lazy" src="Cursor_jOhDlTFH4Y.png" alt="" />
</p></description></item><item><title/><link>https://moonlab.top/posts/2025/windows-performance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://moonlab.top/posts/2025/windows-performance/</guid><description><p>Windows很好用。</p>
<p>关闭Windows更新的<a href="https://learn.microsoft.com/zh-cn/windows/deployment/do/waas-delivery-optimization">传递优化 Delivery Optimization</a>。</p>
<p>设置-&gt;Windows更新-&gt;高级选项-&gt;传递优化-&gt;允许从其他设备下载-&gt;关</p></description></item><item><title>关于</title><link>https://moonlab.top/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://moonlab.top/about/</guid><description><h1 id="showcase-video">Showcase Video</h1>
<iframe src="//player.bilibili.com/player.html?isOutside=true&aid=28924723&bvid=BV1zs411M7Av&cid=50155814&p=1&high_quality=1&danmaku=0" allowfullscreen="allowfullscreen" width="100%" height="400" scrolling="no" frameborder="0" sandbox="allow-top-navigation allow-same-origin allow-forms allow-scripts"></iframe>
<h1 id="关于我lingc">关于我(LingC)</h1>
<p>An Explorer of the cold land.</p>
<p>Email: <a href="mailto:me@moonlab.top">me@moonlab.top</a></p>
<h1 id="关于-moonlab">关于 MoonLab</h1>
<p>Glowing guardian in the cosmic sea,
always a timeless, tranquil melody.</p>
<p>All the articles in this site are licensed under the <a href="http://creativecommons.org/licenses/by-nc/4.0/">CC BY-NC 4.0</a> .</p>
<h1 id="友情链接">友情链接</h1>
<p><a href="https://blog.nexmoe.com/">&gt; 折影轻梦</a></p>
<p><a href="https://zgcwkj.cn/">&gt; Zgcwkj</a></p>
<p><a href="https://blog.conoha.vip/">&gt; 变态鹅</a></p>
<p><a href="https://blog.ojhdt.com">&gt; Ojhdt&rsquo;s blog</a></p>
<p><a href="https://idealclover.top">&gt; idealclover</a></p></description></item><item><title>项目</title><link>https://moonlab.top/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://moonlab.top/projects/</guid><description><p>由我个人维护并开发的项目</p>
<p><strong><a href="https://github.com/HelloLingC/moon-meet">Moon Meet</a></strong> - 为 Cloudflare Worker 设计的由 ECDH 密钥交换算法保证通讯安全性的在线加密聊天服务。任何人都可以免费地部署在自己的 Worker 中。使用 Vue3, Vite, itty-router 构建,并根据 GPL 协议进行源代码分发。</p>
<p><strong><a href="https://github.com/HelloLingC/mooncomm">MoonComm</a></strong> - 为 Cloudflare Worker 设计的博客评论系统。通过 D1 数据库进行数据存储,数据库仅支持 SQLite。前端使用 Google Lit, 后端使用 itty-router 构建,并根据 LGPL 协议进行源代码分发。</p>
<p><strong><a href="https://github.com/HelloLingC/moon-counter">Moon Counter</a></strong> - 网站浏览量统计器。支持通过图片和文本显示网页浏览量,允许修改 CORS。使用 Golang 开发,并根据 MIT 协议进行源代码分发。</p></description></item></channel></rss>