-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
520 lines (267 loc) · 328 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>战忽包子的小站</title>
<link href="https://darksheep404.github.io/atom.xml" rel="self"/>
<link href="https://darksheep404.github.io/"/>
<updated>2025-01-06T15:58:48.093Z</updated>
<id>https://darksheep404.github.io/</id>
<author>
<name>darksheep</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>nvm-windows nvm install not work</title>
<link href="https://darksheep404.github.io/2025/01/06/nvm-windows-install-not-work/"/>
<id>https://darksheep404.github.io/2025/01/06/nvm-windows-install-not-work/</id>
<published>2025-01-06T23:20:18.000Z</published>
<updated>2025-01-06T15:58:48.093Z</updated>
<content type="html"><![CDATA[<h3 id="nvm-windows-nvm-install-not-work"><a href="#nvm-windows-nvm-install-not-work" class="headerlink" title="nvm-windows nvm install not work"></a>nvm-windows nvm install not work</h3><p>毕业后买的新电脑环境不多,最近折腾博客要升级node,想从node换成nvm,结果一直遇到奇怪问题<br>nvm-window 安装的nvm install success后 nvm list为空<code>No installations recognized.</code>,且nvm use 报错 <code>nvm use 18.16.0</code><br><code>activation error: Version not installed.</code> </p><blockquote><p>2025年1月6日23:45:09</p></blockquote><p>原因如下(1.22版本前装在非C盘会存在此问题),使用更新版本或者装在C盘可解</p><p><code>nvm debug</code>可以查看当前版本</p><pre class="language-bash" data-language="bash"><code class="language-bash">C:<span class="token punctuation">\</span>Users<span class="token punctuation">\</span>xxx<span class="token operator">></span>nvm debugxxx is not using admin or elevated rights.Windows Version: <span class="token number">10.0</span> <span class="token punctuation">(</span>Build <span class="token number">22631</span><span class="token punctuation">)</span>Windows Developer Mode: UNKNOWNNVM4W Version: <span class="token number">1.2</span>.0</code></pre><p>在<a href="https://github.com/coreybutler/nvm-windows/issues/979">nvm list shows node version but nvm use claims its not installed</a>中发现</p><p><a href="https://github.com/coreybutler/nvm-windows/wiki/Common-Issues">https://github.com/coreybutler/nvm-windows/wiki/Common-Issues</a></p><p>原怀疑 nodejs未卸载干净, 但是全局搜nodejs文件夹未发现安装,且node命令未识别,但是发现形似nvm/local/tmp的文件下有下载的<code>node 18.16.0</code>文件夹</p><blockquote><p>NVM for Windows used Go’s <a href="https://pkg.go.dev/os#Rename">os.Rename</a> to move files from temporary directories to the final installation directory. Thanks to explorations with <a href="https://github.com/thadguidry">@thadguidry</a> in <a href="https://github.com/coreybutler/nvm-windows/issues/1198">#1198</a> and <a href="https://github.com/coreybutler/nvm-windows/issues/1206">#1206</a>, we realized this function fails silently when attempting to move files across different hard drive volumes (like <code>C:\</code> and <code>E:\</code>). NVM for Windows uses Go’s wonderful support for temporary directories to process installations, which use the primary volume (usually <code>C:\</code>). If you are using a different volume for your NVM for Windows installation, it would be subject to this nuance of the <code>os.Rename</code> method.<br>NVM for Windows使用Go的<a href="https://pkg.go.dev/os#Rename">os. config</a>将文件从临时目录移动到最终安装目录。感谢<a href="https://github.com/thadguidry">@thadguidry</a>在<a href="https://github.com/coreybutler/nvm-windows/issues/1198">#1198</a>和<a href="https://github.com/coreybutler/nvm-windows/issues/1206">#1206</a>中的探索,我们意识到当尝试在不同的硬盘驱动器卷(如<code>C:\</code>和<code>E:\</code>)中移动文件时,此功能会默默失败。Windows版NVM使用Go对临时目录的出色支持来处理安装,该安装使用主卷(通常是<code>C:\</code>)。如果您正在使用不同的卷进行NVM for Windows安装,则会受到<code>os.Rename</code>方法的这种细微差别的影响。</p><p>At the time of this writing, a preliminary fix has been created. It is scheduled for release in v1.2.2 after we finalize testing. In the interim, users will need to install NVM for Windows on their C drive.</p></blockquote>]]></content>
<summary type="html"><h3 id="nvm-windows-nvm-install-not-work"><a href="#nvm-windows-nvm-install-not-work" class="headerlink" title="nvm-windows nvm install not </summary>
<category term="环境配置" scheme="https://darksheep404.github.io/categories/%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/"/>
</entry>
<entry>
<title>2024</title>
<link href="https://darksheep404.github.io/2024/12/02/2024/"/>
<id>https://darksheep404.github.io/2024/12/02/2024/</id>
<published>2024-12-02T12:20:18.000Z</published>
<updated>2025-01-06T15:58:48.093Z</updated>
<content type="html"><![CDATA[<h3 id="本篇通過github在綫發佈"><a href="#本篇通過github在綫發佈" class="headerlink" title="本篇通過github在綫發佈"></a>本篇通過github在綫發佈</h3><p>挖個坑等待填充</p>]]></content>
<summary type="html">2024測試</summary>
<category term="demo" scheme="https://darksheep404.github.io/categories/demo/"/>
<category term="demo" scheme="https://darksheep404.github.io/tags/demo/"/>
</entry>
<entry>
<title>k8s笔记</title>
<link href="https://darksheep404.github.io/2024/11/23/k8s%E7%AC%94%E8%AE%B0/"/>
<id>https://darksheep404.github.io/2024/11/23/k8s%E7%AC%94%E8%AE%B0/</id>
<published>2024-11-23T15:20:18.000Z</published>
<updated>2025-01-06T15:58:48.093Z</updated>
<content type="html"><![CDATA[<p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521213417394.png" alt="image-20230521213417394" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521213437099.png" alt="image-20230521213437099" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521213456098.png" alt="image-20230521213456098" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521213544895.png" alt="image-20230521213544895" loading="lazy"></p><h2 id="K8S的对象"><a href="#K8S的对象" class="headerlink" title="K8S的对象"></a>K8S的对象</h2><p><img src="https://static001.geekbang.org/resource/image/b5/cf/b5a7003788cb6f2b1c5c4f6873a8b5cf.jpg?wh=1920x1298" alt="img" loading="lazy"></p><h3 id="离线业务-gt-临时任务-gt-只跑一次-job-定时任务-cronjob"><a href="#离线业务-gt-临时任务-gt-只跑一次-job-定时任务-cronjob" class="headerlink" title="离线业务->临时任务->只跑一次:job,定时任务:cronjob"></a>离线业务->临时任务->只跑一次:job,定时任务:cronjob</h3><p><strong>一些字段</strong><br>activeDeadlineSeconds,设置 Pod 运行的超时时间。</p><p>backoffLimit,设置 Pod 的失败重试次数。</p><p>completions,Job 完成需要运行多少个 Pod,默认是 1 个。</p><p>parallelism,它与 completions 相关,表示允许并发运行的 Pod 数量,避免过多占用资源。</p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521214214049.png" alt="image-20230521214214049" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/9b780905a824d2103d4ayyc79267ae28.jpg" alt="img" loading="lazy"><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/yy352c661ae37dd116dd12c61932b43c.jpg" alt="img" loading="lazy"></p><h3 id="ConfigMap-x2F-Secret-明文-x2F-秘文配置信息"><a href="#ConfigMap-x2F-Secret-明文-x2F-秘文配置信息" class="headerlink" title="ConfigMap/Secret:明文/秘文配置信息"></a>ConfigMap/Secret:明文/秘文配置信息</h3><blockquote><p>不是容器 不需要spec字段说明允许规格</p><p>containers”里有一个“env”,它定义了 Pod 里容器能够看到的环境变量</p><p>可以使用了简单的“value”,把环境变量的值写“死”在了 YAML 里</p><p>实际上它还可以使用另一个“valueFrom”字段,从 ConfigMap 或者 Secret 对象里获取值</p><ul><li>name”字段是 API 对象的名字,而不是 Key-Value 的名字。</li></ul></blockquote><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/0663d692b33c1dee5b08e486d271b69d.jpg" alt="img" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521214405793.png" alt="image-20230521214405793" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521214605773.png" alt="image-20230521214605773" loading="lazy"></p><h3 id="Deployment-管理pod-gt-pod管理container"><a href="#Deployment-管理pod-gt-pod管理container" class="headerlink" title="Deployment:管理pod->pod管理container"></a>Deployment:管理pod->pod管理container</h3><h4 id="DaemonSet-spec-里没有-replicas-字段-在每个节点上只创建出一个-Pod-实例"><a href="#DaemonSet-spec-里没有-replicas-字段-在每个节点上只创建出一个-Pod-实例" class="headerlink" title="DaemonSet (spec 里没有 replicas 字段)在每个节点上只创建出一个 Pod 实例"></a>DaemonSet (spec 里没有 replicas 字段)在<strong>每个节点上只创建出一个 Pod 实例</strong></h4><p>如需要运行在master node上 需要设置污点/容忍度 taint:tolerations</p><p><img src="https://static001.geekbang.org/resource/image/c1/1c/c1dee411aa02f4ff2b8caaf0bd627a1c.jpg?wh=1920x1173" alt="img" loading="lazy"></p><h4 id="StatefulSet"><a href="#StatefulSet" class="headerlink" title="StatefulSet"></a>StatefulSet</h4><blockquote><p>专门部署“有状态应用”的 API 对象 StatefulSet,它与 Deployment 非常相似,区别是由它管理的 Pod 会有固定的名字、启动顺序和网络标识,这些特性对于在集群里实施有主从、主备等关系的应用非常重要</p></blockquote><p><img src="https://static001.geekbang.org/resource/image/71/88/71b485401dca6946fe4788fa97e3fd88.png?wh=1268x414" alt="img" loading="lazy"></p><blockquote><p><strong>所管理的 Pod 不再是随机的名字了,而是有了顺序编号</strong>,从 0 开始分别被命名为 redis-sts-0、redis-sts-1,Kubernetes 也会按照这个顺序依次创建(0 号比 1 号的 AGE 要长一点),这就解决了“<strong>有状态应用”的第一个问题:启动顺序</strong></p><p><strong>有了这个唯一的名字,应用就可以自行决定依赖关系了</strong>,</p><p>如以 Redis 为例子里,就可以让先启动的 0 号 Pod 是主实例,后启动的 1 号 Pod 是从实例</p><p>Service 自己会有一个域名,格式是“对象名. 名字空间”,当我们把 Service 对象应用于 StatefulSet 的时候,<strong>会为 Pod 再多创建出一个新的域名,格式是“Pod 名. 服务名. 名字空间.svc.cluster.local”/“Pod 名. 服务名</strong>”</p><p>外部的客户端只要知道了 StatefulSet 对象,就<strong>可以用固定的编号去访问某个具体的Pod了,虽然 Pod 的 IP 地址可能会变,但这个有编号的域名由 Service 对象维护,是稳定不变的</strong></p></blockquote><p><img src="https://static001.geekbang.org/resource/image/1a/0f/1a06987c87f3db948b591883a81bac0f.jpg?wh=4000x2946" alt="img" loading="lazy"></p><h3 id="Service与Ingress"><a href="#Service与Ingress" class="headerlink" title="Service与Ingress"></a>Service与Ingress</h3><blockquote><p>不再关心 Pod 的具体地址,只要访问 Service 的固定 IP 地址</p></blockquote><p><img src="https://static001.geekbang.org/resource/image/0f/64/0f74ae3a71a6a661376698e481903d64.jpg?wh=1920x1322" alt="img" loading="lazy"></p><h4 id="ingress-集群内外边界上的入口"><a href="#ingress-集群内外边界上的入口" class="headerlink" title="ingress:集群内外边界上的入口"></a>ingress:集群内外边界上的入口</h4><blockquote><p>Ingress 的路由规则是 HTTP 协议,所以就不能用 IP 地址的方式访问,必须要用域名、URI</p></blockquote><p><img src="https://static001.geekbang.org/resource/image/e6/55/e6ce31b027ba2a8d94cdc553a2c97255.png?wh=1288x834" alt="img" loading="lazy"></p><h4 id="四者联系"><a href="#四者联系" class="headerlink" title="四者联系"></a>四者联系</h4><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/bb7a911e10c103fb839e01438e184914.jpg" alt="img" loading="lazy"></p><h2 id="几种更新策略"><a href="#几种更新策略" class="headerlink" title="几种更新策略"></a>几种更新策略</h2><blockquote><p>普通部署 全部停掉 然后全部启动新的</p><p>用时最短</p></blockquote><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521220007395.png" alt="image-20230521220007395" loading="lazy"></p><h3 id="滚动更新"><a href="#滚动更新" class="headerlink" title="滚动更新"></a>滚动更新</h3><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521220049973.png" alt="image-20230521220049973" loading="lazy"></p><h3 id="蓝绿部署"><a href="#蓝绿部署" class="headerlink" title="蓝绿部署"></a>蓝绿部署</h3><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521220049973.png" loading="lazy"></p><p>金丝雀发布</p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521220129212.png" alt="image-20230521220129212" loading="lazy"></p><h2 id="应用更健康"><a href="#应用更健康" class="headerlink" title="应用更健康"></a>应用更健康</h2><blockquote><p>创建容器有三大隔离技术:namespace、cgroup、chroot。其中的 namespace 实现了独立的进程空间,chroot 实现了独立的文件系统,cgroup 的作用是管控 CPU、内存,保证容器不会无节制地占用基础资源,进而影响到系统里的其他应用</p></blockquote><h3 id="cgroup"><a href="#cgroup" class="headerlink" title="cgroup"></a>cgroup</h3><p>CPU、内存与存储卷,在 Pod 容器的描述部分添加一个新字段 resources 进行申请,它就相当于申请资源的 Claim</p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521221149186.png" alt="image-20230521221149186" loading="lazy"></p><blockquote><p>Kubernetes 里 CPU 的最小使用单位是 0.001,为了方便表示用了一个特别的单位 m,也就是“milli”“毫”的意思,比如说 500m 就相当于 0.5</p></blockquote><h3 id="容器状态探针-Probe"><a href="#容器状态探针-Probe" class="headerlink" title="容器状态探针(Probe)"></a>容器状态探针(Probe)</h3><blockquote><p> 除了保证崩溃重启,还必须要能够探查到 Pod 的内部运行状态,定时给应用做“体检”,让应用时刻保持“健康”,能够满负荷稳定工作</p></blockquote><ul><li><p>Startup,启动探针,用来检查应用是否已经启动成功,适合那些有大量初始化工作要做,启动很慢的应用。</p></li><li><p>Liveness,存活探针,用来检查应用是否正常运行,是否存在死锁、死循环。</p></li><li><p>Readiness,就绪探针,用来检查应用是否可以接收流量,是否能够对外提供服务</p></li></ul><p><img src="https://static001.geekbang.org/resource/image/64/d9/64fde55dd2eab68f9968ff34218646d9.jpg?wh=1920x1200" alt="img" loading="lazy"></p><h4 id="探测方式"><a href="#探测方式" class="headerlink" title="探测方式"></a>探测方式</h4><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521221515092.png" alt="image-20230521221515092" loading="lazy"></p><blockquote><p>启用了 80 端口,然后用 location 指令定义了 HTTP 路径 /ready,它作为对外暴露的“检查口”,用来检测就绪状态,返回简单的 200 状态码和一个字符串表示工作正常</p></blockquote><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521221701080.png" alt="image-20230521221701080" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521221605863.png" alt="image-20230521221605863" loading="lazy"></p><h3 id="namespace-通过不同命名空间实现资源隔离"><a href="#namespace-通过不同命名空间实现资源隔离" class="headerlink" title="namespace:通过不同命名空间实现资源隔离"></a>namespace:通过不同命名空间实现资源隔离</h3><blockquote><p>可以像管理容器一样,给名字空间设定配额,把整个集群的计算资源分割成不同的大小,按需分配给团队或项目使用</p></blockquote>]]></content>
<summary type="html"><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20230521213417394.png" alt="image-20230521213417394" loading="lazy"></</summary>
</entry>
<entry>
<title>越南旅游</title>
<link href="https://darksheep404.github.io/2024/10/23/%E8%B6%8A%E5%8D%97%E6%97%85%E6%B8%B8/"/>
<id>https://darksheep404.github.io/2024/10/23/%E8%B6%8A%E5%8D%97%E6%97%85%E6%B8%B8/</id>
<published>2024-10-23T15:20:18.000Z</published>
<updated>2025-01-06T15:58:48.094Z</updated>
<content type="html"><![CDATA[<h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><blockquote><p>护照,信用卡,签注</p></blockquote><h3 id="护照申请"><a href="#护照申请" class="headerlink" title="护照申请"></a>护照申请</h3><blockquote><p>微信 珠海公安=>出入境办理预约<br>经常约满,需要早点约,不过也有机会捡漏,</p></blockquote><h3 id="VISA信用卡办理"><a href="#VISA信用卡办理" class="headerlink" title="VISA信用卡办理"></a>VISA信用卡办理</h3><p>园区中国银行可办,我选了多币种卡,可以扣港币,越南盾,用美元还款,可以自己买美元还/到期自动扣汇率对应人民币</p><h3 id="越南签证申请"><a href="#越南签证申请" class="headerlink" title="越南签证申请"></a>越南签证申请</h3><blockquote><p>电子签是PDF,要自行打印,需要在口岸换成另纸签</p><p>过关的时候会有旅行公司骗你200人民币打印费,但是可以带着你插队<br>花费 电子签注25美元 (180RMB)<br><strong>付款需要visa</strong></p></blockquote><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423185040446.png" alt="image-20240423185040446" loading="lazy"></p><h3 id="越南手机卡"><a href="#越南手机卡" class="headerlink" title="越南手机卡"></a>越南手机卡</h3><blockquote><p>淘宝或者口岸现买均可</p></blockquote><h3 id="开通手机卡境外收短信功能"><a href="#开通手机卡境外收短信功能" class="headerlink" title="开通手机卡境外收短信功能"></a>开通手机卡境外收短信功能</h3><blockquote><p>默认关闭,在境外收不到验证码</p><p>不要往国内发短信,会被封号 要拿身份证照片解封</p></blockquote><h3 id="现金"><a href="#现金" class="headerlink" title="现金"></a>现金</h3><blockquote><p>口岸兑换 或者 ATM visa取款,特定银行 取款</p></blockquote><h2 id="衣食住行"><a href="#衣食住行" class="headerlink" title="衣食住行"></a>衣食住行</h2><p>衣服:短袖+薄外套+找有洗衣机烘干机的民宿</p><p>吃饭:路边摊<br>出行:<strong>grab</strong> 打车软件(汽车+摩的)+<strong>google maps</strong></p><p>住宿:Agoda(酒店),爱彼迎(民宿)<br><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423210713409.png" alt="image-20240423210713409" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423210648254.png" alt="image-20240423210648254" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423210739200.png" alt="image-20240423210739200" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423210757873.png" alt="image-20240423210757873" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423210830993.png" alt="image-20240423210830993" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423210845351.png" alt="image-20240423210845351" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423210901702.png" alt="image-20240423210901702" loading="lazy"></p><h2 id="景点"><a href="#景点" class="headerlink" title="景点"></a>景点</h2><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423190747489.png" alt="image-20240423190747489" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423190625758.png" alt="image-20240423190625758" loading="lazy"></p><h3 id="博物馆"><a href="#博物馆" class="headerlink" title="博物馆"></a>博物馆</h3><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423191601488.png" alt="image-20240423191601488" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423192012006.png" alt="image-20240423192012006" loading="lazy"></p><h3 id="中越"><a href="#中越" class="headerlink" title="中越"></a>中越</h3><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423211020461.png" alt="image-20240423211020461" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423211035296.png" alt="image-20240423211035296" loading="lazy"></p><p><strong>共产主义+儒家文化+法国殖民色彩+越南风情</strong><br><strong>两千年来持续千年的北属时期(郡县制直辖)</strong></p><p>第一,二次:秦汉到魏晋南北朝,(期间有三年,二佂夫人起义,被伏波将军马援平定[三国马超祖先])</p><p>第三次:隋唐</p><p>(流放地之一,如 杜审言[杜甫祖父],王勃都被流放到交州下面的郡县)</p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423192351882.png" alt="image-20240423192351882" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423192544159.png" alt="image-20240423192544159" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423195533680.png" alt="image-20240423195533680" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423195556216.png" alt="image-20240423195556216" loading="lazy"></p><h3 id="二战结束后"><a href="#二战结束后" class="headerlink" title="二战结束后"></a>二战结束后</h3><blockquote><p>越南与湛江</p></blockquote><p><strong>越南北纬16度线=>南越与北越</strong></p><blockquote><p>英国带领把法国外籍军团的步兵+战俘营法军占领越南南部</p><p>中华民国第一方面军受降及接管越南北方,在北纬16度线上封锁法军北上的道路,支持越南国民党与越南共产党组成北越第一届内阁</p></blockquote><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423203300992.png" alt="image-20240423203300992" loading="lazy"><br>《七子之歌》==><strong>广州湾</strong>(湛江市),澳门、香港、台湾、威海卫、广州湾、九龙岛和旅大</p><blockquote><p>中法政府于1946年2月28日达成协议<br>==>中国将北越军事行政权移交给法国</p><ul><li>法国交还广州湾(现湛江市)</li><li>承担中国军队入越军费</li><li>中国无偿收回滇越铁路雲南段</li></ul><blockquote><p>条约签订后<br>法军在海防要求提前登陆,与53军130师发生军事冲突,被击沉军舰一艘,击伤两艘,伤亡五百余人,中国军队仅十几人轻伤</p><p>法国舰队中将司令举白旗要求停火</p></blockquote></blockquote><ul><li>越南抗法战争</li><li>越南抗美战争</li><li>对越自卫反击战(1979年到1989年近十年间的中越边境冲突)</li></ul><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/image-20240423211050818.png" alt="image-20240423211050818" loading="lazy"></p><h2 id="越南遇见的国人"><a href="#越南遇见的国人" class="headerlink" title="越南遇见的国人"></a>越南遇见的国人</h2><ul><li>深圳富士康去越南北宁富士康出差的老哥</li><li>四处旅游的广州土著(ins大佬,语言能力很强,旅行很local化)</li><li>去河内开小店铺的不会越南语的边民</li><li>报了越南语夜校的做生意的老板</li></ul><h3 id="视频"><a href="#视频" class="headerlink" title="视频"></a>视频</h3><h4 id="视频1-越南路边摊买东西-真正的世界语言-x3D-gt-肢体语言"><a href="#视频1-越南路边摊买东西-真正的世界语言-x3D-gt-肢体语言" class="headerlink" title="视频1:越南路边摊买东西(真正的世界语言=>肢体语言)"></a>视频1:越南路边摊买东西(真正的世界语言=>肢体语言)</h4><h4 id="视频2-还剑湖夜晚路边弹唱与踢毽子的学生们"><a href="#视频2-还剑湖夜晚路边弹唱与踢毽子的学生们" class="headerlink" title="视频2:还剑湖夜晚路边弹唱与踢毽子的学生们"></a>视频2:还剑湖夜晚路边弹唱与踢毽子的学生们</h4><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><p><a href="https://www.krzzjn.com/show-531-112251.html">抗战胜利国军入越受降与法国斗争始末</a></p><p><a href="https://zh.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%8D%B0%E5%BA%A6%E6%94%AF%E9%82%A3%E6%88%B0%E7%88%AD">第一次印度支那战争WIKI</a></p><p><a href="https://zh.wikipedia.org/wiki/%E8%B6%8A%E5%8D%97%E6%88%98%E4%BA%89">越南战争WIKI</a></p><p><a href="https://sites.google.com/view/minhvien-yaohan/%E8%B6%8A%E5%8D%97%E7%9F%A5%E5%A4%9A%E5%B0%91/%E7%9F%A5%E5%A4%9A%E5%B0%91%E4%B9%8B21-40/%E8%B6%8A%E5%8D%97%E7%9F%A5%E5%A4%9A%E5%B0%91-31">越南知多少-越南西贡大学陆礼强</a></p><p><a href="https://www.tapafun.com/share/%E8%B6%8A%E5%8D%97%E5%8D%8E%E4%BA%BA%E6%95%85%E4%BA%8B/">越南华人故事-海虹号陆礼强</a></p><p><a href="https://sites.google.com/view/minhvien-yaohan/%E6%BC%AB%E8%B0%88%E5%BE%B7%E5%9B%BD%E8%A7%81%E9%97%BB/%E6%BC%AB%E8%B0%88%E5%BE%B7%E5%9B%BD%E8%A7%81%E9%97%BB-01?authuser=0">陆礼强德国日记=>1978年海虹号难民被西德接收,85年左右毕业在银行编写电脑程序</a></p>]]></content>
<summary type="html"><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><blockquote>
<p>护照,信用卡,签注</p>
</blockquote>
<h3 id="护照申请"><a href</summary>
</entry>
<entry>
<title>Sealos使用</title>
<link href="https://darksheep404.github.io/2024/09/23/Sealos%E4%BD%BF%E7%94%A8/"/>
<id>https://darksheep404.github.io/2024/09/23/Sealos%E4%BD%BF%E7%94%A8/</id>
<published>2024-09-23T15:20:18.000Z</published>
<updated>2025-01-06T15:58:48.093Z</updated>
<content type="html"><![CDATA[<p><a href="https://cloud.sealos.io/">https://cloud.sealos.io/</a></p><h3 id="使用sealos选择nginx-docker镜像部署"><a href="#使用sealos选择nginx-docker镜像部署" class="headerlink" title="使用sealos选择nginx docker镜像部署"></a>使用sealos选择nginx docker镜像部署</h3><p>修改k8s部署的nginx image内部的nginx.conf来添加proxy_pass</p><p>需要在外部编写一个nginx.conf,覆盖掉镜像内部的nginx.conf</p><p><strong>在k8s中,可以使用把编写的nginx.conf放到 configMap内 随后用configMap的内容挂载到nginx容器内覆盖掉configMap</strong></p><blockquote><p>gui <code>新增配置文件</code>创建后 实际生成了<code>configMap</code></p></blockquote><p><code>configmap.yaml</code></p><pre class="language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">apiVersion</span><span class="token punctuation">:</span> v1<span class="token key atrule">kind</span><span class="token punctuation">:</span> ConfigMap<span class="token key atrule">metadata</span><span class="token punctuation">:</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> nginx<span class="token punctuation">-</span>test<span class="token key atrule">data</span><span class="token punctuation">:</span> <span class="token key atrule">etcvn-nginxvn-nginxvn-conf</span><span class="token punctuation">:</span> <span class="token punctuation">|</span><span class="token punctuation">-</span> user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;<span class="token punctuation">...</span>省略其他配置内容</code></pre><p><code>deployment.yml</code></p><pre class="language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">apiVersion</span><span class="token punctuation">:</span> apps/v1<span class="token key atrule">kind</span><span class="token punctuation">:</span> Deployment<span class="token key atrule">metadata</span><span class="token punctuation">:</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> nginx<span class="token punctuation">-</span>test <span class="token key atrule">labels</span><span class="token punctuation">:</span> <span class="token key atrule">app</span><span class="token punctuation">:</span> nginx<span class="token punctuation">-</span>test<span class="token key atrule">spec</span><span class="token punctuation">:</span> <span class="token key atrule">replicas</span><span class="token punctuation">:</span> <span class="token number">1</span> <span class="token key atrule">revisionHistoryLimit</span><span class="token punctuation">:</span> <span class="token number">1</span> <span class="token key atrule">selector</span><span class="token punctuation">:</span> <span class="token key atrule">matchLabels</span><span class="token punctuation">:</span> <span class="token key atrule">app</span><span class="token punctuation">:</span> nginx<span class="token punctuation">-</span>test<span class="token punctuation">...</span> <span class="token key atrule">spec</span><span class="token punctuation">:</span> <span class="token key atrule">automountServiceAccountToken</span><span class="token punctuation">:</span> <span class="token boolean important">false</span> <span class="token key atrule">containers</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> nginx<span class="token punctuation">-</span>test <span class="token key atrule">image</span><span class="token punctuation">:</span> nginx <span class="token punctuation">...</span> <span class="token key atrule">volumeMounts</span><span class="token punctuation">:</span> <span class="token comment">#容器挂载配置</span> <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> etcvn<span class="token punctuation">-</span>nginxvn<span class="token punctuation">-</span>nginxvn<span class="token punctuation">-</span>conf <span class="token comment">#对应vloume名称</span> <span class="token key atrule">mountPath</span><span class="token punctuation">:</span> etc/nginx/nginx.conf <span class="token comment">#挂载到容器的的路径</span> <span class="token key atrule">subPath</span><span class="token punctuation">:</span> ./etc/nginx/nginx.conf <span class="token comment">#只挂载vloume中特定文件,而非整个目录 </span> <span class="token key atrule">volumes</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> etcvn<span class="token punctuation">-</span>nginxvn<span class="token punctuation">-</span>nginxvn<span class="token punctuation">-</span>conf <span class="token comment">#volume 定义的卷的名称</span> <span class="token key atrule">configMap</span><span class="token punctuation">:</span> <span class="token comment">#vloume</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> nginx<span class="token punctuation">-</span>test <span class="token comment">#configMap的名称</span> <span class="token key atrule">items</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">key</span><span class="token punctuation">:</span> etcvn<span class="token punctuation">-</span>nginxvn<span class="token punctuation">-</span>nginxvn<span class="token punctuation">-</span>conf <span class="token comment">#configMap中数据项的key</span> <span class="token key atrule">path</span><span class="token punctuation">:</span> ./etc/nginx/nginx.conf <span class="token comment">#数据项在卷中路径</span></code></pre><blockquote><p>原gui 新建的名字即为挂载到容器中的路径,需要修改为etc/nginx/nginx.conf</p></blockquote><p><code>kubectl edit deployment nginx-test</code> 进入编辑模式</p><p>按<code>Insert</code> 进入编辑</p><p><code>Esc</code> 退出编辑,进入命令模式 <code>:wq</code> 保存并退出 <code>:q</code> 不保存退出</p>]]></content>
<summary type="html"><p><a href="https://cloud.sealos.io/">https://cloud.sealos.io/</a></p>
<h3 id="使用sealos选择nginx-docker镜像部署"><a href="#使用sealos选择nginx-docker镜</summary>
</entry>
<entry>
<title>结合el-dialog使用.sync和vuex</title>
<link href="https://darksheep404.github.io/2024/05/02/%E7%BB%93%E5%90%88el-dialog%E4%BD%BF%E7%94%A8.sync%E5%92%8Cvuex/"/>
<id>https://darksheep404.github.io/2024/05/02/%E7%BB%93%E5%90%88el-dialog%E4%BD%BF%E7%94%A8.sync%E5%92%8Cvuex/</id>
<published>2024-05-02T12:20:18.000Z</published>
<updated>2025-01-06T15:58:48.094Z</updated>
<content type="html"><![CDATA[<h3 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h3><blockquote><p>需要每次刷新页面或者切换页面时<br>调用api 查询是否需要弹窗<br>并弹出弹窗</p></blockquote><h4 id="监听-vue刷新或切换页面"><a href="#监听-vue刷新或切换页面" class="headerlink" title="监听 vue刷新或切换页面"></a>监听 vue刷新或切换页面</h4><pre class="language-javascript" data-language="javascript"><code class="language-javascript">VueRouter<span class="token punctuation">.</span><span class="token function">afterEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>VueRouter<span class="token punctuation">.</span>app<span class="token punctuation">.</span>$store<span class="token punctuation">.</span>getters<span class="token punctuation">.</span>token<span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'%c用户刷新'</span><span class="token punctuation">,</span> <span class="token string">'color:white;background:blue;font-weight: bold;'</span><span class="token punctuation">)</span> <span class="token comment">//check中 调用set 将返回值设置进vuex中 </span> <span class="token function">checkNeedDialog</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre><h3 id="dialog-sync-与vuex"><a href="#dialog-sync-与vuex" class="headerlink" title="dialog .sync 与vuex"></a>dialog .sync 与vuex</h3><blockquote><p>当需要在子组件中更新父组件传入的值时</p></blockquote><p>子组件应通过$emit提交事件,传入要更新的属性和新值<br><code>this.$emit('update:title', newTitle)</code><br>父组件监听事件并更新值<br><code>v-on:update:title="doc.title = $event</code><br>父组件中简写<br><code>v-bind:title.sync</code> 即<code>:title.sync</code></p><h3 id="实际实现"><a href="#实际实现" class="headerlink" title="实际实现"></a>实际实现</h3><h4 id="弹窗组件中"><a href="#弹窗组件中" class="headerlink" title="弹窗组件中"></a>弹窗组件中</h4><blockquote><p>控制弹窗是否可见的变量<br>由父组件传入<br>子组件通过计算属性 获取值</p></blockquote><pre class="language-vue" data-language="vue"><code class="language-vue"><el-dialog :visible="dialogVisible" ><el-button @click="dialogVisible = false">{{ $t('gotIt') }}</el-button></el-dialog></code></pre><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token literal-property property">computed</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token literal-property property">dialogVisible</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>visible <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">set</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token string">'update:visible'</span><span class="token punctuation">,</span> val<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code></pre><h4 id="父组件使用时"><a href="#父组件使用时" class="headerlink" title="父组件使用时"></a>父组件使用时</h4><blockquote><p>组件上设置:visible.sync</p></blockquote><pre class="language-vue" data-language="vue"><code class="language-vue"><share-notify :visible.sync = "isShowShareDialog"/></code></pre><blockquote><p>绑定的变量为计算属性<br>以上两处的计算属性因为除了get以外还需要set<br>所以要写成<code>xxx:{}</code>的格式<br>只有get的计算属性 则可以写成 <code>xxx(){return xxx}</code>的简写</p></blockquote><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token literal-property property">isShowShareDialog</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span>state<span class="token punctuation">.</span>user<span class="token punctuation">.</span>isShowEquoteShareDialog <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">set</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">dispatch</span><span class="token punctuation">(</span><span class="token string">'confirmEquoteShareDialog'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code></pre><h4 id="改进"><a href="#改进" class="headerlink" title="改进"></a>改进</h4><blockquote><p>不过此例中,结合上述代码可以发现<br>不需要由父组件根据vuex中值 更新子组件的可见状态<br>直接子组件的<code>visible</code> 与vuex中数据绑定即可</p></blockquote><h3 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h3><p><a href="https://blog.csdn.net/zjpjay/article/details/113992083">:visible.sync 的作用_卡卡西Sensei的博客-CSDN博客_:visible.sync</a><br><a href="https://v2.cn.vuejs.org/v2/guide/components-custom-events.html#sync-%E4%BF%AE%E9%A5%B0%E7%AC%A6">.sync修饰符 — Vue.js</a></p>]]></content>
<summary type="html"><h3 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h3><blockquote>
<p>需要每次刷新页面或者切换页面时<br>调用api 查询是否需要弹窗<br>并弹出弹窗</p>
</blockquo</summary>
</entry>
<entry>
<title>24-Week4-April</title>
<link href="https://darksheep404.github.io/2024/04/28/24-Week4-April/"/>
<id>https://darksheep404.github.io/2024/04/28/24-Week4-April/</id>
<published>2024-04-28T15:20:18.000Z</published>
<updated>2025-01-06T15:58:48.093Z</updated>
<content type="html"><![CDATA[<blockquote><p>24-4.22~4.28</p></blockquote><p>[TOC]</p><p>周末是一如既往的睡到下午,然后在床上躺着不想起床的情况</p><p>活动为<br>刷B站+看小说+淘宝闲鱼+小红书</p><p>#硬件DIY</p><p><a href="https://www.bilibili.com/video/BV1ND421T7nB">99元低成本搭建docker服务器</a></p><p>#影视作品</p><p>怀旧向_关于年轻时动画片的评论,喜羊羊,猪猪侠这些_猪猪侠和蓝弧后面坐了洛洛历险记/超兽武装?_动漫公司多来自广东</p><p>#旅游</p><p><a href="https://www.bilibili.com/video/BV1UZ42187Ho?spm_id_from=333.880.my_history.page.click"><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/d21bdb0b22f2c5bc2ff31878728c93a367239c4a.jpg@160w_100h_1c.webp" alt="img" loading="lazy"></a></p><p><a href="https://www.bilibili.com/video/BV1UZ42187Ho">一个月300,如何在浙江安吉摆烂?【小城市旅居报告2】</a></p><blockquote><p>数字游民形式_但是房租很贵能到两千+,吃的也贵,分几个园区,感觉不会去_老园区会有小团体问题,新园区还好,依赖老人友好的带新人氛围,但是新人如果老人带了后后续宅起来,不回馈社区,也不利于社区发展</p></blockquote><p><a href="https://www.bilibili.com/video/BV1Cw411X7A5?spm_id_from=333.880.my_history.page.click"><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/4b08c363b278e4340c4574d03cf5b38033c9dc67.jpg@160w_100h_1c.webp" alt="img" loading="lazy"></a></p><p><a href="https://www.bilibili.com/video/BV1Cw411X7A5">一天60元,在青旅摆烂是一种什么体验?(青年旅社的优缺点详细介绍)</a></p><blockquote><p>青旅的介绍,如背包十年</p></blockquote><p>#美食</p><p><a href="https://www.bilibili.com/video/BV1FK421e75E?spm_id_from=333.880.my_history.page.click"><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/e28d46307198530eba2d03a8fc5e7b80b1670cfa.jpg@160w_100h_1c.webp" alt="img" loading="lazy"></a></p><p><a href="https://www.bilibili.com/video/BV1FK421e75E">日式咖喱漫谈——有科技 也会狠活儿</a></p><blockquote><p>咖喱在日本演化出很多种类</p><p>加热就可以用来做饭感觉类似现在的料理包</p><p>感觉一些看起来挺好吃的,不同的肉和蔬菜</p></blockquote><p><a href="https://www.bilibili.com/video/BV19S421c7bb?spm_id_from=333.880.my_history.page.click"><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/22557ae88cb78876c9e71797c32dca8f4f3ce384.jpg@160w_100h_1c.webp" alt="img" loading="lazy"></a></p><p><a href="https://www.bilibili.com/video/BV19S421c7bb">王国士兵的餐桌——奥斯曼帝国篇</a></p><p>#粤语</p><p>查找B站和油管 男亲女爱全集失败</p><p>#台剧</p><p>#台湾犯罪故事</p><blockquote><p>找到后,在B站看完了四集解说</p><p>出轨=>破坏火车铁轨保险骗保事件</p><p>生死困局=>蒙冤入狱灭门案黑帮保镖与受害人记者儿子的故事</p><p>恶有引力=>感觉出彩一些,家豪(打架)+善亦(自闭+缺少认知+没朋友)杀害老师的故事,对于两个小孩子刻画很好,家豪虽然坏,但是对善亦很好,善亦受欺负,像乖孩子那种,但是对生死好坏没认知,帮助家豪杀害了帮助自己的女老师==>994年「內湖女教師命案」</p></blockquote><p>#台北女子图鉴</p><blockquote><p>看了一点,开头台南去台北的部分,很像大陆的小地方进大城市</p></blockquote><p><a href="https://www.olevod.com/index.php/vod/play/id/38903/sid/1/nid/1.html">https://www.olevod.com/index.php/vod/play/id/38903/sid/1/nid/1.html</a><br>#电动车头盔教程</p><p>感觉半盔比较适合,要找新国标3C认证更安全,看了一下测评的牌子</p><p>#ai #朝鲜</p><p><a href="https://www.bilibili.com/video/BV18x4y187NX?spm_id_from=333.880.my_history.page.click"><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/ita/18fc08c3e30209c10650aa39f7763d9980e94863.jpg@160w_100h_1c.webp" alt="img" loading="lazy"></a></p><p><a href="https://www.bilibili.com/video/BV18x4y187NX">人民女团:将军!请下命令吧!</a></p><p>ai把朝鲜军歌改成南朝鲜风格</p><p>#台湾</p><blockquote><p>大陆和台湾 要开放福建到台湾马祖,希望早日开放广东</p></blockquote><p>#购物</p><p>新的被子,这次选了绿色</p><p>新的线条小狗短袖两只</p><blockquote><p>小红书看到有博主@陈出月设计 大明帝国护照,想买来做护照壳,不过博主目前只做手账本,护照壳可能需要自己找人做,但是好像烫金要很多件才可以做</p><p>因为年份聊到崇祯纪元,发现最后一本崇祯纪元书本是1914,之前一直记错成1912,</p><p>感觉可以找时间做个崇祯纪元计算的工具</p></blockquote>]]></content>
<summary type="html">24-Week4-April</summary>
<category term="weekly" scheme="https://darksheep404.github.io/categories/weekly/"/>
<category term="weekly" scheme="https://darksheep404.github.io/tags/weekly/"/>
</entry>
<entry>
<title>打工人darkSheep</title>
<link href="https://darksheep404.github.io/2021/08/21/%E5%B0%8F%E5%86%AF%E7%9A%84%E5%9B%9B%E4%BB%BD%E5%B7%A5%E4%BD%9C/"/>
<id>https://darksheep404.github.io/2021/08/21/%E5%B0%8F%E5%86%AF%E7%9A%84%E5%9B%9B%E4%BB%BD%E5%B7%A5%E4%BD%9C/</id>
<published>2021-08-21T19:28:18.000Z</published>
<updated>2025-01-06T15:58:48.094Z</updated>
<content type="html"><![CDATA[<h2 id="小冯的第四份工作之魔都小码农"><a href="#小冯的第四份工作之魔都小码农" class="headerlink" title="小冯的第四份工作之魔都小码农"></a>小冯的第四份工作之魔都小码农</h2><blockquote><p>这是我继<br>老板与小姨子爱情的受害者(浙江温州皮革厂流水线)<em>是电子厂啦</em><br>合法赌徒观察者(沃尔玛体育彩票售票)<br>华为人工智能背后的人工(数据采集标注)<br>后的第四份工作:魔都小码农</p></blockquote><blockquote><p>其实诸如读物与报纸中北漂沪漂,高额房租等对大城市艰辛的描述<br>让中学的我对北上广深抱有更多的恐惧而不是向往<br>进而决定以后未来的我要远离这些大城市</p></blockquote><p><em>但是世事弄人,我还是来到了上海</em></p><blockquote><p>所幸</p></blockquote><blockquote><p>有着洗衣机,冰箱,空调,厨房和阳台卫浴,客厅的住宿<br>和朝9晚7,2小时午休,但相对弹性的上下班时间<br>构成了我小惬意的实习生活</p></blockquote><blockquote><p>但是其实当初的恐惧和如今的小惬意并不矛盾<br>因为构成我幸福感最重要的保障是<br>公司报销了我们两室一厅4k一个月的房租[笑哭]<br>(虽然理论上是我和舍友同时各承担2k的房租,但是他到30号才入住去了,<br>如果不是公司报销,第一个月我就要负担4k的全额房租了)<br>之后才是美好生活的必备品:洗衣机与空调<br>加分品:可以冰镇可乐与西瓜的冰箱<br>骑单车十几分钟的通勤距离<br>睡懒觉导致迟到十几分钟也没关系的弹性时间</p></blockquote><h3 id="浙江温州流水线"><a href="#浙江温州流水线" class="headerlink" title="浙江温州流水线"></a>浙江温州流水线</h3><p>第一份工作是浙江温州的车间流水线,第一份工位手会做到轻微的蜕皮起泡</p><h4 id="见闻录"><a href="#见闻录" class="headerlink" title="见闻录:"></a>见闻录:</h4><blockquote><ul><li><p>遇上了一次车间集体罢工,因为大家希望转为工资更高的计件(对于当时的我不过是大家都说明天大家都不用来上班)</p></li><li><p>一直笑眯眯的隔壁工位阿嬷因为要照顾确诊癌症的丈夫提出辞职哭成了泪人,往常贼凶的班组长在旁边不停的安慰</p><p>(疾病会轻易的击毁一个家庭的生活)</p></li><li><p>第一次遇到一大批辍学的同龄人</p></li><li><p>不同于送孩子当兵据说要托关系的老家,年轻工友说被村里让他(没上学的适龄人)报名兵役体检否则交几千罚款)</p></li></ul></blockquote><blockquote><p>此处附图1:工作内容*2</p><p>2:仪容镜</p><p>3:午餐</p></blockquote><h3 id="沃尔玛体彩售票员"><a href="#沃尔玛体彩售票员" class="headerlink" title="沃尔玛体彩售票员"></a>沃尔玛体彩售票员</h3><blockquote><p>待续</p></blockquote><h4 id="见闻录-1"><a href="#见闻录-1" class="headerlink" title="见闻录"></a>见闻录</h4><blockquote><p>十赌九输</p></blockquote><h3 id="华为人工智能背后的人工"><a href="#华为人工智能背后的人工" class="headerlink" title="华为人工智能背后的人工"></a>华为人工智能背后的人工</h3><blockquote><p>待续<br>视频号机器人的视频</p></blockquote>]]></content>
<summary type="html">darkSheep的 第四份工作の魔都小码农</summary>
<category term="分享" scheme="https://darksheep404.github.io/categories/%E5%88%86%E4%BA%AB/"/>
<category term="分享" scheme="https://darksheep404.github.io/tags/%E5%88%86%E4%BA%AB/"/>
</entry>
<entry>
<title>MES初探</title>
<link href="https://darksheep404.github.io/2021/07/03/MES%E5%88%9D%E6%8E%A2/"/>
<id>https://darksheep404.github.io/2021/07/03/MES%E5%88%9D%E6%8E%A2/</id>
<published>2021-07-03T20:21:08.000Z</published>
<updated>2025-01-06T15:58:48.093Z</updated>
<content type="html"><![CDATA[<h2 id="MES是什么"><a href="#MES是什么" class="headerlink" title="MES是什么"></a>MES是什么</h2><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><blockquote><p>所读专业为软件工程(智能制造),本来打算当成软件工程读<br>智能制造方向也只选了必修的Teamcenter和MES</p><p>结果因为学院的强制智能制造相关企业实习,即将成为一名MES开发(&实施?)实习生</p></blockquote>]]></content>
<summary type="html"><h2 id="MES是什么"><a href="#MES是什么" class="headerlink" title="MES是什么"></a>MES是什么</h2><h3 id="前言"><a href="#前言" class="headerlink" title="前言"><</summary>
<category term="MES" scheme="https://darksheep404.github.io/categories/MES/"/>
<category term="MES" scheme="https://darksheep404.github.io/tags/MES/"/>
</entry>
<entry>
<title>接口和抽象类区别</title>
<link href="https://darksheep404.github.io/2021/04/11/%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB/"/>
<id>https://darksheep404.github.io/2021/04/11/%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB/</id>
<published>2021-04-11T20:19:08.000Z</published>
<updated>2025-01-06T15:58:48.094Z</updated>
<content type="html"><![CDATA[<h3 id="特性"><a href="#特性" class="headerlink" title="特性"></a>特性</h3><h4 id="抽象类"><a href="#抽象类" class="headerlink" title="抽象类"></a>抽象类</h4><ul><li><p>包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法;</p></li><li><p>抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;</p></li><li><p>一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类;</p></li><li><p>抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用。</p></li></ul><h4 id="接口"><a href="#接口" class="headerlink" title="接口"></a>接口</h4><ul><li>接口成员变量默认为<code>public static final</code>,必须赋初值,不能被修改</li><li>JDK1.8中对接口增加了新的特性:</li><li>(1)、默认方法(<code>default method</code>):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;</li><li>(2)、静态方法(<code>static method</code>):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)</li></ul><h3 id="抽象类和接口的区别"><a href="#抽象类和接口的区别" class="headerlink" title="抽象类和接口的区别"></a>抽象类和接口的区别</h3><ul><li>接口强调特定功能的实现,而抽象类强调所属关系</li></ul><table><thead><tr><th><strong>参数</strong></th><th><strong>抽象类</strong></th><th><strong>接口</strong></th></tr></thead><tbody><tr><td>默认的方法实现</td><td>它可以有默认的方法实现</td><td>jdk1.8之后通过default提供方法默认实现</td></tr><tr><td>构造器</td><td>抽象类可以有构造器,提供给子类super调用</td><td>接口没有构造器</td></tr><tr><td>与正常Java类的区别</td><td>除了你不能实例化抽象类之外,它和普通Java类没有任何区别</td><td>接口是完全不同的类型</td></tr><tr><td>访问修饰符</td><td>抽象方法可以有<strong>public</strong>、<strong>protected</strong>和<strong>default</strong>这些修饰符</td><td>接口方法默认修饰符是<strong>public</strong>。你不可以使用其它修饰符。</td></tr><tr><td>main方法</td><td>抽象方法可以有main方法,且可以运行抽象类main方法</td><td>接口没有main方法</td></tr><tr><td>速度</td><td>它比接口速度要快</td><td>接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。</td></tr><tr><td>添加新方法</td><td>如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。</td><td>如果你往接口中添加方法,那么你必须改变实现该接口的类。<br />1.8提供default,则无需修改</td></tr><tr><td>设计理念</td><td>is-a的关系,体现的是一种关系的延续</td><td>like-a体现的是一种功能的扩展关系</td></tr></tbody></table>]]></content>
<summary type="html"><h3 id="特性"><a href="#特性" class="headerlink" title="特性"></a>特性</h3><h4 id="抽象类"><a href="#抽象类" class="headerlink" title="抽象类"></a>抽象类</h4><u</summary>
<category term="java" scheme="https://darksheep404.github.io/categories/java/"/>
<category term="java" scheme="https://darksheep404.github.io/tags/java/"/>
</entry>
<entry>
<title>JUC并发学习笔记</title>
<link href="https://darksheep404.github.io/2021/04/08/JUC%E5%AD%A6%E4%B9%A0/"/>
<id>https://darksheep404.github.io/2021/04/08/JUC%E5%AD%A6%E4%B9%A0/</id>
<published>2021-04-08T20:19:08.000Z</published>
<updated>2025-01-06T15:58:48.093Z</updated>
<content type="html"><![CDATA[<p>JUC</p><blockquote><p> 采用源码+文档方式学习</p></blockquote><p>什么是JUC</p><blockquote><p> java.util工具包</p></blockquote><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210322170332.png" alt="image-20210322170330290" loading="lazy"></p><blockquote><p> 并发:多线程操作操作一个资源</p></blockquote><ul><li><p>cpu一核,模拟多条线程</p><blockquote><p> 并行:多个人一起走</p></blockquote></li><li><p>CPU多核,多个线程同时运行</p></li></ul><h3 id="Wait和sleep"><a href="#Wait和sleep" class="headerlink" title="Wait和sleep"></a>Wait和sleep</h3><p>1、来自不同的类<br>wait ->Object</p><p> sleep -> Thread<br>2、关于锁的释放<br>wait会释放锁,sleep睡觉了,抱着锁睡觉,不会释放</p><p>3、使用的范国是不同的</p><ul><li><p><code>wait必须在同步代码块中</code></p></li><li><p>sleep可以再任何地方睡</p></li></ul><p>4、是否需要捕获异常<br>Wait不需要捕获异常</p><p>//现在也需要了</p><p>sleep必须要捕获异常?</p><h3 id="锁"><a href="#锁" class="headerlink" title="锁"></a>锁</h3><h4 id="传统-Synchronized锁"><a href="#传统-Synchronized锁" class="headerlink" title="传统 Synchronized锁"></a>传统 Synchronized锁</h4><blockquote><p>线程就是一个单独的资源类,没有任何附属的操作</p><p>资源类OOP</p><p>多线程操作同一个资源类,把资源类丢入线程</p></blockquote><pre class="language-java" data-language="java"><code class="language-java"><span class="token comment">// 资源类 OOP</span><span class="token keyword">class</span> <span class="token class-name">Ticket</span> <span class="token punctuation">{</span> <span class="token comment">// 属性、方法</span> <span class="token keyword">private</span> <span class="token keyword">int</span> number <span class="token operator">=</span> <span class="token number">30</span><span class="token punctuation">;</span> <span class="token comment">// 卖票的方式</span> <span class="token comment">// synchronized 本质: 队列,锁</span> <span class="token keyword">public</span> <span class="token keyword">synchronized</span> <span class="token keyword">void</span> <span class="token function">sale</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>number<span class="token operator">></span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"卖出了"</span><span class="token operator">+</span><span class="token punctuation">(</span>number<span class="token operator">-</span> <span class="token operator">-</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"票,剩余:"</span><span class="token operator">+</span>number<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code></pre><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>time<span class="token punctuation">.</span></span><span class="token class-name">OffsetDateTime</span></span><span class="token punctuation">;</span><span class="token class-name">Lock</span> 接口<span class="token comment">/*** 真正的多线程开发,公司中的开发,降低耦合性* 线程就是一个单独的资源类,没有任何附属的操作!* 1、 属性、方法*/</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">SaleTicketDemo01</span> <span class="token punctuation">{</span><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">// 并发:多线程操作同一个资源类, 把资源类丢入线程</span><span class="token class-name">Ticket</span> ticket <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Ticket</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// @FunctionalInterface 函数式接口,jdk1.8 lambda表达式 (参数)->{ 代码 }</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">40</span> <span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> ticket<span class="token punctuation">.</span><span class="token function">sale</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token string">"A"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//同上创建名称为B,C的线程并start</span> <span class="token comment">//--------------省略的另外两个线程</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><h4 id="Lock锁"><a href="#Lock锁" class="headerlink" title="Lock锁"></a>Lock锁</h4><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210330212342.png" alt="image-20210330212342160" loading="lazy"></p><p><code>实现类</code></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210330212403.png" alt="image-20210330212403217" loading="lazy"></p><blockquote><p> 默认为非公平锁</p></blockquote><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210330212424.png" alt="image-20210330212423864" loading="lazy"></p><pre class="language-java" data-language="java"><code class="language-java"><span class="token comment">// Lock三部曲</span><span class="token comment">// 1、 new ReentrantLock();</span><span class="token comment">// 2、 lock.lock(); // 加锁</span><span class="token comment">// 3、 finally=> lock.unlock(); // 解锁</span><span class="token keyword">class</span> <span class="token class-name">Ticket2</span> <span class="token punctuation">{</span><span class="token comment">// 属性、方法</span> <span class="token keyword">private</span> <span class="token keyword">int</span> number <span class="token operator">=</span> <span class="token number">30</span><span class="token punctuation">;</span> <span class="token class-name">Lock</span> lock <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ReentrantLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">sale</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> lock<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 加锁</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment">// 业务代码</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>number<span class="token operator">></span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"卖出了"</span><span class="token operator">+</span><span class="token punctuation">(</span>number<span class="token operator">--</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"票,剩余:"</span><span class="token operator">+</span>number<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> lock<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 解锁</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><ul><li>操作代码</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token comment">//公平锁:十分不公平:可以插队 (默认)</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>concurrent<span class="token punctuation">.</span>locks<span class="token punctuation">.</span></span><span class="token class-name">ReentrantLock</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">SaleTicketDemo02</span> <span class="token punctuation">{</span><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">// 并发:多线程操作同一个资源类, 把资源类丢入线程</span> <span class="token class-name">Ticket2</span> ticket <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Ticket2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// @FunctionalInterface 函数式接口,jdk1.8 lambda表达式 (参数)->{ 代码 }</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">40</span> <span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> ticket<span class="token punctuation">.</span><span class="token function">sale</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token string">"A"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">40</span> <span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> ticket<span class="token punctuation">.</span><span class="token function">sale</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token string">"B"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">40</span> <span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> ticket<span class="token punctuation">.</span><span class="token function">sale</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token string">"C"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code></pre><blockquote><blockquote><p>Synchronized 和 Lock 区别<br>1、Synchronized 内置的Java关键字, Lock 是一个Java类<br>2、Synchronized 无法判断获取锁的状态,Lock 可以判断是否获取到了锁<br>3、Synchronized 会自动释放锁,lock 必须要手动释放锁!如果不释放锁,死锁<br>4、Synchronized 线程 1(获得锁,阻塞)、线程2(等待,傻傻的等);Lock锁就不一定会等待下<br>去;可以设置等待超时?<br>5、Synchronized 可重入锁,不可以中断的,非公平;Lock ,可重入锁,可以 判断锁,非公平(可以<br>自己设置);<br>6、Synchronized 适合锁少量的代码同步问题,Lock 适合锁大量的同步代码!<br>锁是什么,如何判断锁的是谁!<br>4、生产者和消费者问题<br>面试的:单例模式、排序算法、生产者和消费者、死锁</p></blockquote></blockquote><h3 id="生产者和消费者问题"><a href="#生产者和消费者问题" class="headerlink" title="生产者和消费者问题"></a>生产者和消费者问题</h3><p><code>判断要使用if,不能使用while</code>:见多线程笔记</p><h4 id="lock实现"><a href="#lock实现" class="headerlink" title="lock实现"></a>lock实现</h4><blockquote><p>并发资源类</p></blockquote><pre class="language-java" data-language="java"><code class="language-java"><span class="token comment">// 判断等待,业务,通知</span><span class="token keyword">class</span> <span class="token class-name">Data2</span><span class="token punctuation">{</span> <span class="token comment">// 数字 资源类</span><span class="token keyword">private</span> <span class="token keyword">int</span> number <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token class-name">Lock</span> lock <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ReentrantLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">Condition</span> condition <span class="token operator">=</span> lock<span class="token punctuation">.</span><span class="token function">newCondition</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//condition.await(); // 等待</span><span class="token comment">//condition.signalAll(); // 唤醒全部</span><span class="token comment">//+1</span><span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">InterruptedException</span> <span class="token punctuation">{</span> lock<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment">// 业务代码</span> <span class="token keyword">while</span> <span class="token punctuation">(</span>number<span class="token operator">!=</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">//0</span> <span class="token comment">// 等待</span> condition<span class="token punctuation">.</span><span class="token function">await</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span>number<span class="token operator">++</span><span class="token punctuation">;</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"=>"</span><span class="token operator">+</span>number<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// 通知其他线程,我+1完毕了</span>condition<span class="token punctuation">.</span><span class="token function">signalAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span>lock<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment">//-1</span><span class="token keyword">public</span> <span class="token keyword">synchronized</span> <span class="token keyword">void</span> <span class="token function">decrement</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">InterruptedException</span> <span class="token punctuation">{</span> lock<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token keyword">while</span> <span class="token punctuation">(</span>number<span class="token operator">==</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">// 1</span> <span class="token comment">// 等待</span> condition<span class="token punctuation">.</span><span class="token function">await</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> number<span class="token operator">--</span><span class="token punctuation">;</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"=>"</span><span class="token operator">+</span>number<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 通知其他线程,我-1完毕了</span> condition<span class="token punctuation">.</span><span class="token function">signalAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> lock<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><blockquote><p>并发访问</p></blockquote><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">package</span> <span class="token namespace">com<span class="token punctuation">.</span>kuang<span class="token punctuation">.</span>pc</span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>concurrent<span class="token punctuation">.</span>locks<span class="token punctuation">.</span></span><span class="token class-name">Condition</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>concurrent<span class="token punctuation">.</span>locks<span class="token punctuation">.</span></span><span class="token class-name">Lock</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>concurrent<span class="token punctuation">.</span>locks<span class="token punctuation">.</span></span><span class="token class-name">ReentrantLock</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">B</span> <span class="token punctuation">{</span><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token class-name">Data2</span> data <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Data2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> data<span class="token punctuation">.</span><span class="token function">increment</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token string">"A"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> data<span class="token punctuation">.</span><span class="token function">decrement</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token string">"B"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> data<span class="token punctuation">.</span><span class="token function">increment</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token string">"C"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> data<span class="token punctuation">.</span><span class="token function">decrement</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token string">"D"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>任何一个新的技术,绝对不是仅仅只是覆盖了原来的技术,优势和补充!</p><blockquote><p>Condition 精准的通知和唤醒线程</p><p><code>condition1.await();</code></p><p><code>condition2.signal();</code></p></blockquote><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">printA</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>lock<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">try</span> <span class="token punctuation">{</span><span class="token comment">// 业务,判断-> 执行-> 通知</span><span class="token keyword">while</span> <span class="token punctuation">(</span>number<span class="token operator">!=</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment">// 等待</span>condition1<span class="token punctuation">.</span><span class="token function">await</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"=>AAAAAAA"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// 唤醒,唤醒指定的人,B</span>number <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>condition2<span class="token punctuation">.</span><span class="token function">signal</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span>lock<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><h3 id="8锁问题"><a href="#8锁问题" class="headerlink" title="8锁问题"></a>8锁问题</h3><blockquote><p>如何判断锁的是谁!永远的知道什么锁,锁到底锁的是谁!</p></blockquote><h3 id="Callable"><a href="#Callable" class="headerlink" title="Callable"></a>Callable</h3><p>1、可以有返回值 </p><p>2、可以抛出异常 </p><p>3、方法不同,run()/ call()</p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">public</span> <span class="token class-name">Integer</span> <span class="token function">call</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"call()"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 会打印几个call</span><span class="token comment">// 耗时的操作</span><span class="token keyword">return</span> <span class="token number">1024</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">CallableTest</span> <span class="token punctuation">{</span><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">ExecutionException</span><span class="token punctuation">,</span><span class="token class-name">InterruptedException</span> <span class="token punctuation">{</span><span class="token comment">// new Thread(new Runnable()).start();</span><span class="token comment">// new Thread(new FutureTask<V>()).start();</span><span class="token comment">// new Thread(new FutureTask<V>( Callable )).start();</span><span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 怎么启动Callable</span><span class="token class-name">MyThread</span> thread <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MyThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">FutureTask</span> futureTask <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FutureTask</span><span class="token punctuation">(</span>thread<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 适配类</span><span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span>futureTask<span class="token punctuation">,</span><span class="token string">"A"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span>futureTask<span class="token punctuation">,</span><span class="token string">"B"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 结果会被缓存,效率高</span><span class="token class-name">Integer</span> o <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Integer</span><span class="token punctuation">)</span> futureTask<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//这个get 方法可能会产生阻塞!把他放到</span>最后<span class="token comment">// 或者使用异步通信来处理!</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>o<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">MyThread</span> <span class="token keyword">implements</span> <span class="token class-name">Callable</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Integer</span><span class="token punctuation">></span></span> <span class="token punctuation">{</span><span class="token annotation punctuation">@Override</span><span class="token keyword">public</span> <span class="token class-name">Integer</span> <span class="token function">call</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"call()"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 会打印几个call</span><span class="token comment">// 耗时的操作</span><span class="token keyword">return</span> <span class="token number">1024</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><blockquote><p>1、有缓存 2、结果可能需要等待,会阻塞!</p></blockquote><h3 id="常用的辅助类-必会"><a href="#常用的辅助类-必会" class="headerlink" title="常用的辅助类(必会)"></a>常用的辅助类(必会)</h3><h4 id="CountDownLatch"><a href="#CountDownLatch" class="headerlink" title="CountDownLatch"></a>CountDownLatch</h4><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">CountDownLatchDemo</span> <span class="token punctuation">{</span><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">InterruptedException</span> <span class="token punctuation">{</span><span class="token comment">// 总数是6,必须要执行任务的时候,再使用!</span><span class="token class-name">CountDownLatch</span> countDownLatch <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">CountDownLatch</span><span class="token punctuation">(</span><span class="token number">6</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span><span class="token number">6</span> <span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">" Go out"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>countDownLatch<span class="token punctuation">.</span><span class="token function">countDown</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 数量-1</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">valueOf</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span>countDownLatch<span class="token punctuation">.</span><span class="token function">await</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 等待计数器归零,然后再向下执行</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Close Door"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><code>countDownLatch.countDown();</code> // 数量-1</p><p><code>countDownLatch.await();</code></p><p> // 等待计数器归零,然后再向下执行 每次有线程调用 countDown() 数量-1,假设计数器变为0,countDownLatch.await() 就会被唤醒,继续 执行!</p><h4 id="CyclicBarrier"><a href="#CyclicBarrier" class="headerlink" title="CyclicBarrier"></a>CyclicBarrier</h4><blockquote><blockquote><p>加法计数器</p></blockquote></blockquote><h4 id="Semaphore"><a href="#Semaphore" class="headerlink" title="Semaphore"></a>Semaphore</h4><blockquote><p> 信号量</p><p> semaphore.acquire() 获得,假设如果已经满了,等待,等待被释放为止<br> semaphore.release(); 释放,会将当前的信号量释放 + 1,然后唤醒等待的线程! 作用: 多个共享资源互斥的使用!并发限流,控制最大的线程数!</p></blockquote><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">SemaphoreDemo</span> <span class="token punctuation">{</span><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">// 线程数量:停车位! 限流!</span><span class="token class-name">Semaphore</span> semaphore <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Semaphore</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span><span class="token number">6</span> <span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token comment">// acquire() 得到</span><span class="token keyword">try</span> <span class="token punctuation">{</span>semaphore<span class="token punctuation">.</span><span class="token function">acquire</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span>"抢到车位"<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">TimeUnit</span><span class="token punctuation">.</span><span class="token constant">SECONDS</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span>"离开车位"<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span>semaphore<span class="token punctuation">.</span><span class="token function">release</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// release() 释放</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">valueOf</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><h3 id="读写锁"><a href="#读写锁" class="headerlink" title="读写锁"></a>读写锁</h3><pre class="language-java" data-language="java"><code class="language-java"><span class="token comment">/*** 独占锁(写锁) 一次只能被一个线程占有* 共享锁(读锁) 多个线程可以同时占有* ReadWriteLock* 读-读 可以共存!* 读-写 不能共存!* 写-写 不能共存!*/</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ReadWriteLockDemo</span> <span class="token punctuation">{</span><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token class-name">MyCache</span> myCache <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MyCache</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// 写入</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> <span class="token number">5</span> <span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">final</span> <span class="token keyword">int</span> temp <span class="token operator">=</span> i<span class="token punctuation">;</span><span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token punctuation">{</span>myCache<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>temp<span class="token operator">+</span><span class="token string">""</span><span class="token punctuation">,</span>temp<span class="token operator">+</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">valueOf</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">// 读取</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> <span class="token number">5</span> <span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">final</span> <span class="token keyword">int</span> temp <span class="token operator">=</span> i<span class="token punctuation">;</span><span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token punctuation">{</span>myCache<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>temp<span class="token operator">+</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">valueOf</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment">// 加锁的</span><span class="token keyword">class</span> <span class="token class-name">MyCacheLock</span><span class="token punctuation">{</span><span class="token keyword">private</span> <span class="token keyword">volatile</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">String</span><span class="token punctuation">,</span><span class="token class-name">Object</span><span class="token punctuation">></span></span> map <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// 读写锁: 更加细粒度的控制</span><span class="token keyword">private</span> <span class="token class-name">ReadWriteLock</span> readWriteLock <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ReentrantReadWriteLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">private</span> <span class="token class-name">Lock</span> lock <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ReentrantLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// 存,写入的时候,只希望同时只有一个线程写</span><span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">put</span><span class="token punctuation">(</span><span class="token class-name">String</span> key<span class="token punctuation">,</span><span class="token class-name">Object</span> value<span class="token punctuation">)</span><span class="token punctuation">{</span>readWriteLock<span class="token punctuation">.</span><span class="token function">writeLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">try</span> <span class="token punctuation">{</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"写入"</span><span class="token operator">+</span>key<span class="token punctuation">)</span><span class="token punctuation">;</span>map<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"写入OK"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span>readWriteLock<span class="token punctuation">.</span><span class="token function">writeLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment">// 取,读,所有人都可以读!</span><span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token class-name">String</span> key<span class="token punctuation">)</span><span class="token punctuation">{</span>readWriteLock<span class="token punctuation">.</span><span class="token function">readLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">try</span> <span class="token punctuation">{</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"读取"</span><span class="token operator">+</span>key<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">Object</span> o <span class="token operator">=</span> map<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"读取OK"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span>readWriteLock<span class="token punctuation">.</span><span class="token function">readLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment">/*** 自定义缓存*/</span><span class="token keyword">class</span> <span class="token class-name">MyCache</span><span class="token punctuation">{</span><span class="token keyword">private</span> <span class="token keyword">volatile</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">String</span><span class="token punctuation">,</span><span class="token class-name">Object</span><span class="token punctuation">></span></span> map <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token number">10</span>、阻塞队列阻塞队列:<span class="token comment">// 存,写</span><span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">put</span><span class="token punctuation">(</span><span class="token class-name">String</span> key<span class="token punctuation">,</span><span class="token class-name">Object</span> value<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"写入"</span><span class="token operator">+</span>key<span class="token punctuation">)</span><span class="token punctuation">;</span>map<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"写入OK"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">// 取,读</span><span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token class-name">String</span> key<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"读取"</span><span class="token operator">+</span>key<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">Object</span> o <span class="token operator">=</span> map<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"读取OK"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><h3 id="阻塞队列"><a href="#阻塞队列" class="headerlink" title="阻塞队列"></a>阻塞队列</h3><p>什么情况下我们会使用 阻塞队列:多线程并发处理,线程池! 学会使用队列 添加、移除 </p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210330214037.png" alt="image-20210330214037634" loading="lazy"></p><h3 id="线程池-重点"><a href="#线程池-重点" class="headerlink" title="线程池(重点)"></a>线程池(重点)</h3><p><code>线程池:三大方法、7大参数、4种拒绝策略</code></p><blockquote><blockquote><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210323151912.png" alt="image-20210323151912115" loading="lazy"></p></blockquote></blockquote><blockquote><blockquote><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210323151944.png" alt="image-20210323151944753" loading="lazy"></p><p><img src="/JUC_md_files/01_20210325150248.png?v=1&type=image&token=V1:8HEaAjBtXmTIvprHJ7YSw1om8WE1nF9vrzOwwCSIJw8" alt="输入图片描述" loading="lazy"><br><img src="/JUC_md_files/02_20210325150257.png?v=1&type=image&token=V1:bQD8d945Z777r5xwEbmNVNoJMKc3tqpOOogHR_5od-o" alt="输入图片描述" loading="lazy"><br><img src="/JUC_md_files/03_20210325150330.png?v=1&type=image&token=V1:gpwseHVrgAL5RKm_0c2-yMuJRc7vJccqH1R98cDNaJI" alt="输入图片描述" loading="lazy"><br><img src="/JUC_md_files/04_20210325150340.png?v=1&type=image&token=V1:5RHrJAF1fsp4VFh1zIjp-PdUB-pnFfZT3ERcqZyW67o" alt="输入图片描述" loading="lazy"><br><img src="/JUC_md_files/05_20210325150348.png?v=1&type=image&token=V1:_D7GTafOz3trfRN0aCyOy8aIRv7BxYY_LGwzyCRbBvg" alt="输入图片描述" loading="lazy"><br><img src="/JUC_md_files/06_20210325150356.png?v=1&type=image&token=V1:fSWbriyf80g3GqY-bUR_Q0Y4HwtfV47WVTE7p3mOeZE" alt="输入图片描述" loading="lazy"><br><img src="/JUC_md_files/07_20210325150407.png?v=1&type=image&token=V1:fsWIsw_fCC9UkhX28Fyu8PmYv5VbujnnyJ0oiWCw8t8" alt="输入图片描述" loading="lazy"><br><img src="/JUC_md_files/08_20210325150417.png?v=1&type=image&token=V1:kGqW0DrYgT4PF3gTUbg-Etl2WipuUsC4JyEdKrzKpcA" alt="输入图片描述" loading="lazy"><br><img src="/JUC_md_files/09_20210325150425.png?v=1&type=image&token=V1:T_9z9K9Wj3sZr8xQ_Fg4818LkU6NDn46NWbXDRK0e6E" alt="输入图片描述" loading="lazy"><br><img src="/JUC_md_files/10_20210325150435.png?v=1&type=image&token=V1:sYs64Wqv1V6-Hw2pZHVXftibLBH_yytdeCr_8eoHuQE" alt="输入图片描述" loading="lazy"><br><img src="/JUC_md_files/10_20210325150444.png?v=1&type=image&token=V1:elZuMttx19IJGRFHxB_PhFoAe5Iv-LQbgnHlWkuFrW8" alt="输入图片描述" loading="lazy"><br><img src="/JUC_md_files/11_20210325150506.png?v=1&type=image&token=V1:lqJVF59Kpo5GeUeAzeowYSQoUe7DyB3zSN3oTUTzsY0" alt="输入图片描述" loading="lazy"><br><img src="/JUC_md_files/12_20210325150515.png?v=1&type=image&token=V1:YLvkwlFgsseRDarnJc4ZODiQx6bfCpb2nRv_iRcNBKg" alt="输入图片描述" loading="lazy"><img src="/JUC_md_files/13_20210325150524.png?v=1&type=image&token=V1:mC0S6cOo7mRCKvY5fd0Npgc-ZJLCHA59psB2L_wTZqw" alt="输入图片描述" loading="lazy"><img src="/JUC_md_files/14_20210325150533.png?v=1&type=image&token=V1:-1DXkutrjaCNDNOix5P-jmVi6fAq5Au-n1VUDqZG5Os" alt="输入图片描述" loading="lazy"><img src="/JUC_md_files/15_20210325150542.png?v=1&type=image&token=V1:E_ZzLxZoW0PoD9y4DVHajyuBVArL9jnC6FTN5ohMo6U" alt="输入图片描述" loading="lazy"><img src="/JUC_md_files/16_20210325150550.png?v=1&type=image&token=V1:wUq3fM9Dfr_AS0C0hUx5yEea7eZQPxuRI2wuKj8S5F4" alt="输入图片描述" loading="lazy"><img src="/JUC_md_files/17_20210325150600.png?v=1&type=image&token=V1:dySM0LHdejxhlv_UmEpBeGjfOlJkfyDCq66YmftZDQw" alt="输入图片描述" loading="lazy"><img src="/JUC_md_files/18_20210325150608.png?v=1&type=image&token=V1:fjetujmUR3gP1peHXiX86gdo6yyAg4yJDhpKGwwkmxM" alt="输入图片描述" loading="lazy"><img src="/JUC_md_files/19_20210325150616.png?v=1&type=image&token=V1:Y9cQig7yytkhQ_HCIHOCCM_vG2FPj1RUrOewccb3x64" alt="输入图片描述" loading="lazy"><img src="/JUC_md_files/19_20210325150622.png?v=1&type=image&token=V1:HtYkcgipjqRojL2wYf0eA0M-MJz76etv2VS3it-dHq4" alt="输入图片描述" loading="lazy"><img src="/JUC_md_files/20_20210325150628.png?v=1&type=image&token=V1:YrgACay29Q1Gam8Z0wSg9eohoIZA2OrDZdK85QU2hOA" alt="输入图片描述" loading="lazy"><img src="/JUC_md_files/21_20210325150635.png?v=1&type=image&token=V1:z0fZy0MQeHiVJ7yuCPlIkt35QPsKUXGphXEwwIjnNmY" alt="输入图片描述" loading="lazy"><img src="/JUC_md_files/22_20210325150641.png?v=1&type=image&token=V1:sANnjjRAGW1D6jVWxukwxyJpntA18_qQUGEqZ01Qe2U" alt="输入图片描述" loading="lazy"><img src="/JUC_md_files/23_20210325150647.png?v=1&type=image&token=V1:SUi-uwu7yPzW_YxlgfoBmAuCpWlE3MFMDxWbA9g8dtw" alt="输入图片描述" loading="lazy"></p></blockquote></blockquote><h3 id="12-四大函数式接口"><a href="#12-四大函数式接口" class="headerlink" title="12:四大函数式接口"></a>12:四大函数式接口</h3><p>lamdba表达式,函数式接口,链式编程,Stream流</p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210323154333.png" alt="image-20210323154333067" loading="lazy"></p><ul><li><p>Function接口:入参分别为参数类型和返回值类型</p></li><li><p>断定型接口,一个输入参数,返回值只能是布尔值</p></li><li><p>消费型接口,生产者接口</p></li><li><p>消费型接口:只有输入,没有返回值</p></li><li><p>生产者接口,没有输入只有返回值</p></li><li><blockquote><blockquote><p>函数式接口都可以用lambda接口简化</p></blockquote></blockquote></li><li><blockquote><blockquote><p>泛型,枚举,反射,传统程序员常用</p></blockquote></blockquote></li></ul><h3 id="Stream流式计算"><a href="#Stream流式计算" class="headerlink" title="Stream流式计算"></a>Stream流式计算</h3><p><code>操作:存储+计算</code></p><ul><li><p>存储:集合,mysql</p></li><li><p>计算都应该交给流来操作</p></li></ul><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210323160253.png" alt="image-20210323160253580" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210323160508.png" alt="image-20210323160507757" loading="lazy">10</p><ul><li>打印传入的参数</li></ul><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210323160621.png" alt="image-20210323160621019" loading="lazy"></p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210323160733.png" alt="image-20210323160733487" loading="lazy"></p><ul><li>每个方法返回this就能链式</li></ul><h3 id="14-ForkJoin"><a href="#14-ForkJoin" class="headerlink" title="14:ForkJoin"></a>14:ForkJoin</h3><blockquote><blockquote><p>分支合并</p><ul><li>jdk1.7之后出来的</li><li>并行执行任务,提高效率</li><li>跳过</li></ul></blockquote></blockquote><h3 id="15-异步回调"><a href="#15-异步回调" class="headerlink" title="15:异步回调"></a>15:异步回调</h3><h3 id="16-JMM"><a href="#16-JMM" class="headerlink" title="16:JMM"></a>16:JMM</h3><h3 id="17-Volatile可见性及其非原子性验证"><a href="#17-Volatile可见性及其非原子性验证" class="headerlink" title="17:Volatile可见性及其非原子性验证"></a>17:Volatile可见性及其非原子性验证</h3><ul><li><p>保证可见性</p></li><li><p>不保证原子性</p></li><li><p>ACID中就有原子性:不可分割</p></li><li><p>幻读,脏读</p><p><code>atomic包</code></p><h4 id="使用原子类解决原子性问题"><a href="#使用原子类解决原子性问题" class="headerlink" title="使用原子类解决原子性问题"></a>使用原子类解决原子性问题</h4></li></ul><h3 id="指令重排"><a href="#指令重排" class="headerlink" title="指令重排"></a>指令重排</h3><blockquote><p>源代码->编译器优化的重排,指令并行也可能会重排->内存系统也会重排–>执行</p><ul><li>处理器进行指令重排的时候,会考虑数据的依赖性</li><li></li></ul></blockquote><p>volatile避免指令重排</p><ul><li>内存屏障.cpu指令,作用:</li><li>1:保证特定的操作的执行顺序</li><li>可以保证某些变量的内存可见性</li></ul><h3 id="DCL懒汉式就使用了volatile"><a href="#DCL懒汉式就使用了volatile" class="headerlink" title="DCL懒汉式就使用了volatile"></a>DCL懒汉式就使用了volatile</h3><ul><li>饿汉式单例–构造器私有</li></ul><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210324210652.png" alt="image-20210324210646067" loading="lazy"></p><ul><li>可能浪费内存</li></ul><p>懒汉式</p><ul><li>先构造器私有</li><li>不为空则再为创建</li><li><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210324211031.png" alt="image-20210324211031110" loading="lazy"></li><li>多线程情况下失败</li><li>如果==null,先上锁</li><li>双重检测锁懒汉式</li><li>lazayman=new lazyman()不是原子性操作</li><li><ul><li>分配内存空间</li><li>执行构造方法,初始化对象</li><li>把对象指向空间</li><li>如果走成132</li><li>其他线程发现空间里有对象,但是实际上未初始化,返回了未初始化的对象</li><li><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210324211618.png" alt="image-20210324211618757" loading="lazy"></li></ul></li><li><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210324211142.png" alt="image-20210324211142656" loading="lazy"></li><li>利用反射破坏单例模式</li><li><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210324211902.png" alt="image-20210324211902466" loading="lazy"></li><li>防止</li><li>给构造器加个锁,如果已经有对象,</li><li><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210324211944.png" alt="image-20210324211944040" loading="lazy"></li></ul><h3 id="枚举"><a href="#枚举" class="headerlink" title="枚举:"></a>枚举:</h3><blockquote><p>jdk1.5新增</p><p>本身也是一个class类</p></blockquote><h3 id="CAS"><a href="#CAS" class="headerlink" title="CAS"></a>CAS</h3><blockquote><p>compareAndSwap:比较并交换</p></blockquote><blockquote><p> 如果期望的值达到了,则更新,否则不更新</p></blockquote><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210324213529.png" alt="image-20210324213529144" loading="lazy"></p><p>java无法操作内存</p><p>java可以调用C++native</p><p>C++可以操作内存</p><p>java的后门,可以通过这个操作内存</p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210324213831.png" alt="image-20210324213831438" loading="lazy"></p><p>offset:内存偏移</p><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210324214022.png" alt="image-20210324214022006" loading="lazy"></p><ul><li>内存操作,效率很高</li><li>自旋锁,不停旋转直到成功为止</li><li><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210324214145.png" alt="image-20210324214144352" loading="lazy"></li><li>CAS:ABA问题(狸猫换太子)</li><li><ul><li>比较当前工作内存中的值和主内存的值,如果之歌值是期望的,那么执行操作,如果不是就一直循环</li><li>好处:自带原子性</li><li>缺点 :</li><li>循环会耗时</li><li>一次性只能保证一个共享变量的原子性</li></ul></li><li>UnSafe类</li><li></li></ul><h3 id="ABA问题"><a href="#ABA问题" class="headerlink" title="ABA问题"></a>ABA问题</h3><p>CAS时捣乱线程改过又改回去了</p><ul><li>乐观锁,悲观锁</li></ul><h3 id="原子引用"><a href="#原子引用" class="headerlink" title="原子引用"></a>原子引用</h3><p>TimeUnit.secondes.sleep()来延时</p><p>像SQl插入后版本号提升1</p><p><img src="C:/Users/Lenovo/AppData/Roaming/Typora/typora-user-images/image-20210324220212708.png" alt="image-20210324220212708" loading="lazy"></p><p>原子类型改为原子引用,加上了时间戳</p><p>乐观锁有CAS和版本号两种解决方式</p><p><img src="C:/Users/Lenovo/AppData/Roaming/Typora/typora-user-images/image-20210324220422410.png" alt="image-20210324220422410" loading="lazy"></p><h3 id="此处需要敲代码-还有单例模式这些"><a href="#此处需要敲代码-还有单例模式这些" class="headerlink" title="此处需要敲代码,还有单例模式这些"></a>此处需要敲代码,还有单例模式这些</h3><h3 id="21-对各种锁的理解"><a href="#21-对各种锁的理解" class="headerlink" title="21:对各种锁的理解"></a>21:对各种锁的理解</h3><h4 id="公平锁-非公平锁"><a href="#公平锁-非公平锁" class="headerlink" title="公平锁,非公平锁"></a>公平锁,非公平锁</h4><ul><li>公平锁暖插队,公平锁可以插队</li><li>非公平锁,可以插队(默认都是非公平)</li><li>3s的不等待很多秒的</li><li>Lock =new RestrantLock()</li><li>参数传入True则为公平锁</li></ul><h4 id="可重入锁-x2F-递归锁"><a href="#可重入锁-x2F-递归锁" class="headerlink" title="可重入锁/递归锁"></a>可重入锁/递归锁</h4><p>Re en trant:Reentrant<br>001</p><p><img src="C:/Users/Lenovo/AppData/Roaming/Typora/typora-user-images/image-20210324220914187.png" alt="image-20210324220914187" loading="lazy"></p>]]></content>
<summary type="html"><p>JUC</p>
<blockquote>
<p> 采用源码+文档方式学习</p>
</blockquote>
<p>什么是JUC</p>
<blockquote>
<p> java.util工具包</p>
</blockquote>
<p><img src="https:/</summary>
<category term="笔记" scheme="https://darksheep404.github.io/categories/%E7%AC%94%E8%AE%B0/"/>
<category term="java" scheme="https://darksheep404.github.io/tags/java/"/>
</entry>
<entry>
<title>查山正微信小程序</title>
<link href="https://darksheep404.github.io/2021/03/19/%E6%9F%A5%E5%B1%B1%E6%AD%A3/"/>
<id>https://darksheep404.github.io/2021/03/19/%E6%9F%A5%E5%B1%B1%E6%AD%A3/</id>
<published>2021-03-19T15:20:18.000Z</published>
<updated>2025-01-06T15:58:48.094Z</updated>
<content type="html"><![CDATA[<ul><li>提交表单时,contact为对象openid–贡献者对应微信昵称</li><li>条目页面:显示贡献者微信昵称,头像(如果用户换头像,原头像url会过期失效–如果贡献了条目,则存储用户头像?)</li></ul><h2 id="TODO"><a href="#TODO" class="headerlink" title="TODO"></a>TODO</h2><ul><li><input disabled="" type="checkbox"> <code>TODO</code>如需使用date字段,需初始化之前未设置date字段的数据库</li><li><input disabled="" type="checkbox"> <code>feature</code>:主页随机一店,选择查看山正列表</li><li><input disabled="" type="checkbox"> 提交汉服时的check改为精确匹配</li><li><input disabled="" type="checkbox"> <code>fix</code>:小程序启动时获取info信息,而不是到了每个页面再加载</li><li><input disabled="" type="checkbox"> <code>feature</code>:对于冲突汉服店铺信息的公示与投票</li><li><input disabled="" type="checkbox"> <code>improve</code>:获取更多的汉服山正店铺信息</li><li><input disabled="" type="checkbox"> <code>improve</code>汉服图片链接可以放到images目录下</li><li><input disabled="" type="checkbox"> <code>fix</code>微信更新接口后更新原获取用户信息代码</li><li><input disabled="" type="checkbox"> 添加功能导致的主页UI重构</li></ul><blockquote><p>当前主页塞不下其他功能入口了</p></blockquote><ul><li><input disabled="" type="checkbox"> 加入以图搜图入口</li></ul><blockquote><p>可采用淘宝以图搜图接口</p></blockquote><h2 id="V0-3-0"><a href="#V0-3-0" class="headerlink" title="V0.3.0"></a>V0.3.0</h2><h3 id="bug修复"><a href="#bug修复" class="headerlink" title="bug修复"></a>bug修复</h3><ul><li><p><input checked="" disabled="" type="checkbox"> 提交时的查询是模糊匹配还是全匹配?:<code>暂定为模糊匹配</code></p></li><li><p><input disabled="" type="checkbox"> <code>TODO</code>如需使用date字段,需初始化之前未设置date字段的数据库</p></li><li><p><input checked="" disabled="" type="checkbox"> <code>Fix</code>输入框为空时查询卡死</p></li><li><p><input checked="" disabled="" type="checkbox"> <code>Fix</code>修复了添加新用户时忘记添加nums字段的bug</p></li><li><p><input checked="" disabled="" type="checkbox"> <code>improve</code>新增汉服和冲突,用户增加了date字段</p></li><li><p><input checked="" disabled="" type="checkbox"> <code>Fix</code>某次查询结果未收录后,以后查询都会显示一个未收录–<code>如果收录,重新置值为true</code></p></li><li><p><input checked="" disabled="" type="checkbox"> <code>Fix</code>未收录时,显示的店铺名随输入框变动–<code>显示时使用新设定的值而非输入值</code></p></li><li><p><input checked="" disabled="" type="checkbox"> <code>Fix</code>提交页面点击用户多次按钮造成的数据重复提交–<code>更改clickable为false</code></p></li></ul><h3 id="进行中"><a href="#进行中" class="headerlink" title="进行中"></a>进行中</h3><p><code>小程序端后台管理系统</code></p><ul><li><p><input checked="" disabled="" type="checkbox"> <code>feature</code>:汉服店铺贡献者列表,按照贡献店铺数目排序(<code>预备v0.3.0推出</code>)</p></li><li><p><input disabled="" type="checkbox"> <code>feature</code> <code>admin</code> <code>timportant</code>待鉴定汉服页面</p></li><li><p><input checked="" disabled="" type="checkbox"> <code>UI</code> <code>Fix</code>排名信息页的加载弹窗</p></li><li><p><input checked="" disabled="" type="checkbox"> 删除函数:疑虑:remove没有日志,不知道删除了什么–<code>TODO:先查存入再删</code></p></li><li><p><input checked="" disabled="" type="checkbox"> 修改函数</p></li><li><p><input checked="" disabled="" type="checkbox"> 根据id查询函数</p></li><li><p><input disabled="" type="checkbox"> 分页云函数:限定山正,分页跳转:</p><blockquote><ul><li><input disabled="" type="checkbox"> </li><li><input checked="" disabled="" type="checkbox"> 分页跳转</li><li><input disabled="" type="checkbox"> 选择查看山正列表</li><li><input disabled="" type="checkbox"> <code>feature</code>:主页随机一店</li></ul></blockquote></li><li><p><input checked="" disabled="" type="checkbox"> list页面处设置一个加载中弹窗,区分删除确认弹窗<code>UI</code> <code>Fix</code></p></li><li><p><input checked="" disabled="" type="checkbox"> 优化显示列表,当前过于密集<code>UI</code> <code>Fix</code></p></li><li><p><input disabled="" type="checkbox"> 获取列表改为都是山店or正店,可以拿到主页展示<code>admin</code> <code>user</code> <code>promove</code></p></li><li><p><input disabled="" type="checkbox"> 冲突汉服信息的更正<code>feature</code> <code>admin</code></p></li><li><p><input disabled="" type="checkbox"> 用户提交了已经有的数据<code>useractions</code></p></li><li><p><input checked="" disabled="" type="checkbox"> 所有文本尽量上云</p></li></ul><blockquote><p>带来加载缓慢问题–更改为小程序启动时全部获取放到缓存Storage中</p></blockquote><ul><li><input checked="" disabled="" type="checkbox"> 待鉴定店铺小程序端查看</li></ul><blockquote><p>去除未鉴定提交为表单,改为直接客服按钮发送店铺</p></blockquote><ul><li><p><input disabled="" type="checkbox"> 提交汉服时的check改为精确匹配</p></li><li><p><input checked="" disabled="" type="checkbox"> 未知汉服时主动沟通方法</p><blockquote><p>如上</p></blockquote></li></ul><h3 id="待实现"><a href="#待实现" class="headerlink" title="待实现"></a>待实现</h3><ul><li><p><input disabled="" type="checkbox"> <code>fix</code>:小程序启动时获取info信息,而不是到了每个页面再加载</p></li><li><p><input disabled="" type="checkbox"> <code>feature</code>:对于冲突汉服店铺信息的公示与投票</p></li><li><p><input disabled="" type="checkbox"> <code>improve</code>:获取更多的汉服山正店铺信息</p></li><li><p><input checked="" disabled="" type="checkbox"> <code>learning</code>:学习并利用云开发CMS便捷管理云端数据</p></li><li><p><input checked="" disabled="" type="checkbox"> <code>feature</code>:对具体店铺的评论—(<code>预备v0.3.0推出</code>)</p><blockquote><p>评论区,论坛类需要企业资质</p></blockquote></li></ul><h3 id="未收录体验优化"><a href="#未收录体验优化" class="headerlink" title="未收录体验优化"></a>未收录体验优化</h3><p><code>待选解决方案</code></p><ul><li><input checked="" disabled="" type="checkbox"> 如果未查到,自动收录到未查询数据库–定时统一搜集</li><li><input checked="" disabled="" type="checkbox"> 弹出订阅模板消息申请–如果未查到获取订阅通知–收录后通知</li><li><input checked="" disabled="" type="checkbox"> 未查询到–向客户发送消息–在提交页面新增–客服会话<code>feature</code> <code>timportant</code></li></ul><hr><ul><li><input disabled="" type="checkbox"> 汉服图片链接可以放到images目录下</li><li><input disabled="" type="checkbox"> 主页tips换行符失效</li><li><input disabled="" type="checkbox"> textarea不放在表单组件中时,无法移动光标,按向上方向键会丢失内容</li><li><input disabled="" type="checkbox"> 使用text替代数组:未知问题:原来text使用换行符\n,不会换行,改为用数组遍历<view>实现换行</li></ul><hr><h2 id="V0-2-0"><a href="#V0-2-0" class="headerlink" title="V0.2.0"></a>V0.2.0</h2><blockquote></blockquote><ul><li><p><code>fix</code>:未录入店铺显示为山店</p></li><li><p>更正查询结果为模糊匹配所得列表–修正按钮位置</p></li><li><p>更正显示tips未从云端数据库获取:则不提交审核,仅修改数据库也可修正</p></li><li><p>展示提供店铺数目的人名单列表—待做</p></li><li><blockquote><p>拟解决方案:更换true和false为</p><ul><li>或者:新增字段,如果false且该字段为真,则显示为未录入</li><li><code>采用</code></li></ul></blockquote></li></ul><h2 id="代码问题-amp-知识速记"><a href="#代码问题-amp-知识速记" class="headerlink" title="代码问题&知识速记"></a>代码问题&知识速记</h2><h3 id="数据库聚合查询"><a href="#数据库聚合查询" class="headerlink" title="数据库聚合查询"></a>数据库聚合查询</h3><p><code>project</code> 的形式如下:</p><pre class="language-text" data-language="text"><code class="language-text">project({ <表达式>})</code></pre><p>聚合阶段。把指定的字段传递给下一个流水线,指定的字段可以是某个已经存在的字段,也可以是计算出来的新字段。</p><p><code>addFields</code> 等同于同时指定了所有已有字段和新增字段的 <code>project</code> 阶段</p><p>const _ = db.command</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">await</span> db<span class="token punctuation">.</span><span class="token function">collection</span><span class="token punctuation">(</span><span class="token string">'user'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">where</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">openid</span><span class="token operator">:</span>wxContext<span class="token punctuation">.</span><span class="token constant">OPENID</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">data</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token comment">// 更新字段++</span> <span class="token literal-property property">nums</span><span class="token operator">:</span>_<span class="token punctuation">.</span><span class="token function">inc</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre><h3 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h3><blockquote><p>在微信开发中我们经常会用到标签中属性的属性值,有时候我们通过 data-* 和 e.target.dateset 来获取属性值</p></blockquote><ul><li><p>调用出来的数据是undefined</p></li><li><p>data后面的属性名写得不规范!在data后面的属性名是不能按照驼峰式的写法,只要把定义的<strong>属性名全部换成小写</strong>就没有问题了</p></li><li><p>但这种方式有时也会存在 e.target.dataset={},此时productid=undefined,就需要换一种解决办法。。。</p><p> 2)console.log(e)查看</p><p> e对象中包含两个对象分别是currentTarget和target,而真正的数据包含在currentTarget。 打印出e,找到你的数据,通过对象调用的方式即可。</p><blockquote><p>使用第一种的方法e.target.dataset.action 会获取当前点击的元素的action,则获取图片上的action,图片上没有action便取的是undefined; 使用第二种的方法e.currentTarget.dataset.action 会获取有事件的那个元素,即view,所以获得“father”</p></blockquote></li><li><p><code>var date=new Date()</code>:js获取当前时间</p></li></ul><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20210303154025.png" alt="image-20210303154021312" loading="lazy"></p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token function-variable function">onLoad</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">options</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> wx<span class="token punctuation">.</span><span class="token function">showLoading</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">title</span><span class="token operator">:</span> <span class="token string">'加载中'</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token keyword">var</span> that <span class="token operator">=</span> <span class="token keyword">this</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'postid'</span><span class="token punctuation">,</span> options<span class="token punctuation">.</span>postid<span class="token punctuation">)</span> <span class="token keyword">const</span> db <span class="token operator">=</span> wx<span class="token punctuation">.</span>cloud<span class="token punctuation">.</span><span class="token function">database</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> _ <span class="token operator">=</span> db<span class="token punctuation">.</span>command db<span class="token punctuation">.</span><span class="token function">collection</span><span class="token punctuation">(</span><span class="token string">'post_collection'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span>options<span class="token punctuation">.</span>postid<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token function-variable function">success</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">res</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res<span class="token punctuation">.</span>data<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token function-variable function">onItemClick</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>currentTarget<span class="token punctuation">.</span>dataset<span class="token punctuation">.</span>postid<span class="token punctuation">)</span> wx<span class="token punctuation">.</span><span class="token function">navigateTo</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">url</span><span class="token operator">:</span> <span class="token string">'../postdetail/postdetail?postid='</span> <span class="token operator">+</span> e<span class="token punctuation">.</span>currentTarget<span class="token punctuation">.</span>dataset<span class="token punctuation">.</span>postid<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span></code></pre><blockquote><p>表单的两种形式</p><p>之前使用:利用双向绑定</p><p>监听输入的值绑定到data里的数据</p><p>按钮监听事件为将这些数据一起处理并调用云函数提交</p><hr><p>标准form:button设置submit属性</p><p>提交时一起提交</p></blockquote><pre class="language-javascript" data-language="javascript"><code class="language-javascript">db<span class="token punctuation">.</span><span class="token function">collection</span><span class="token punctuation">(</span><span class="token string">'test'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span><span class="token string">'milk-1'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">data</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">'milk'</span><span class="token punctuation">,</span> <span class="token literal-property property">official</span><span class="token operator">:</span> <span class="token string">'dairy'</span><span class="token punctuation">,</span> <span class="token literal-property property">beizhu</span><span class="token operator">:</span> <span class="token string">'test'</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre><p> <code>//忘记添加await导致函数未生效</code></p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">await db.collection('test').doc(event.id).set({</span><span class="token template-punctuation string">`</span></span><span class="token keyword">var</span> that<span class="token operator">=</span><span class="token keyword">this</span><span class="token punctuation">;</span><span class="token comment">//进入云函数中this发生了变化,使用this.setData({})无效</span>wx<span class="token punctuation">.</span>cloud<span class="token punctuation">.</span><span class="token function">callFunction</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token comment">// 云函数名称</span> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">'get_store_byName'</span><span class="token punctuation">,</span> <span class="token comment">//携带的参数:storeName--云函数中使用event.storeName获取</span> <span class="token literal-property property">data</span><span class="token operator">:</span><span class="token punctuation">{</span> <span class="token literal-property property">storeName</span><span class="token operator">:</span>that<span class="token punctuation">.</span>data<span class="token punctuation">.</span>storeName <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">//成功后执行</span> <span class="token function-variable function">success</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">res</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//提取数据--返回的数据为res.result.云函数处定义的字段名.data</span> <span class="token keyword">var</span> data <span class="token operator">=</span> res<span class="token punctuation">.</span>result<span class="token punctuation">.</span>storelist<span class="token punctuation">.</span>data <span class="token comment">//此处为了简略代码,删去了else情况的操作</span> <span class="token keyword">if</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>length<span class="token operator">></span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span> that<span class="token punctuation">.</span><span class="token function">setData</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">loadModal</span><span class="token operator">:</span><span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token literal-property property">storelist</span><span class="token operator">:</span> data <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token literal-property property">fail</span><span class="token operator">:</span> console<span class="token punctuation">.</span>error <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre><ul><li><input disabled="" type="checkbox"> <code>放在标签内和放在value的区别</code></li><li><input disabled="" type="checkbox"> <code>doc返回的是一条值而不是一个列表</code></li><li><input disabled="" type="checkbox"> </li></ul><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>textarea</span> <span class="token attr-name">maxlength</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-1<span class="token punctuation">"</span></span> <span class="token attr-name">bindinput</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>beizhuInput<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{{storelist.beizhu}}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>textarea</span><span class="token punctuation">></span></span></code></pre><ul><li><input disabled="" type="checkbox"> <strong>使用set更新其他字段后,未更新的字段name消失</strong></li><li><input disabled="" type="checkbox"> <strong>onLoad里加载数据,从上一层回来时数据不会更新</strong></li><li><input disabled="" type="checkbox"> onshow也不更新</li></ul><p>update 只能更新,set是有则替换,无则插入,覆盖操作</p><p>set()更新字段下的所有数据</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">await</span> db<span class="token punctuation">.</span><span class="token function">collection</span><span class="token punctuation">(</span><span class="token string">'hanfuStore'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span>event<span class="token punctuation">.</span>id<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">data</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token literal-property property">official</span><span class="token operator">:</span> event<span class="token punctuation">.</span>official<span class="token punctuation">,</span> <span class="token literal-property property">beizhu</span><span class="token operator">:</span> event<span class="token punctuation">.</span>beizhu<span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token comment">//事实上重写了data字段</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token number">1</span>,表示:将style的color的值更新为blue<span class="token keyword">const</span> _ <span class="token operator">=</span> db<span class="token punctuation">.</span>commanddb<span class="token punctuation">.</span><span class="token function">collection</span><span class="token punctuation">(</span><span class="token string">'todos'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span><span class="token string">'todo-identifiant-aleatoire'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token literal-property property">data</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token literal-property property">style</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token literal-property property">color</span><span class="token operator">:</span> <span class="token string">'blue'</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token function-variable function">success</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">res</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res<span class="token punctuation">.</span>data<span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token number">2</span>,表示:将style的值更新为对象<span class="token punctuation">{</span><span class="token literal-property property">color</span><span class="token operator">:</span>blue<span class="token punctuation">}</span><span class="token keyword">const</span> _ <span class="token operator">=</span> db<span class="token punctuation">.</span>commanddb<span class="token punctuation">.</span><span class="token function">collection</span><span class="token punctuation">(</span><span class="token string">'todos'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span><span class="token string">'todo-identifiant-aleatoire'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token literal-property property">data</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token comment">//style的值更新为对象{color:blue}</span> <span class="token comment">//重写了style字段,而不是data字段</span> <span class="token literal-property property">style</span><span class="token operator">:</span> _<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">color</span><span class="token operator">:</span> <span class="token string">'blue'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token function-variable function">success</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">res</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res<span class="token punctuation">.</span>data<span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token comment">//结果看起来一样,其实性能1更高些。</span></code></pre><ul><li><input checked="" disabled="" type="checkbox"> 固定在页面左侧不随滑动改变的按钮</li></ul><pre class="language-css" data-language="css"><code class="language-css"><span class="token property">position</span><span class="token punctuation">:</span> fixed<span class="token punctuation">;</span> <span class="token property">z-index</span><span class="token punctuation">:</span> 1<span class="token punctuation">;</span><span class="token comment">/*设置悬浮优先级为最高,否则会被覆盖而看不到*/</span> <span class="token property">left</span><span class="token punctuation">:</span> 0px<span class="token punctuation">;</span> <span class="token property">bottom</span><span class="token punctuation">:</span> 40%<span class="token punctuation">;</span> <span class="token property">background-blend-mode</span><span class="token punctuation">:</span> color-burn<span class="token punctuation">;</span> <span class="token comment">/* top: 60%; */</span> </code></pre><ul><li><p>padding缩写:上右下左</p></li><li><blockquote><blockquote><p>小程序端与云函数端的表现会有如下差异:</p><ul><li>小程序端:注意与集合权限设置有关,一个用户仅能统计其有<strong>读权限</strong>的记录数</li><li>云函数端:因属于管理端,因此可以统计集合的所有记录数</li></ul></blockquote></blockquote></li></ul><ul><li><p><input disabled="" type="checkbox"> <code>improve</code>查询–修改–页面同所有店铺页面分开–不具备翻页功能</p></li><li><p><input disabled="" type="checkbox"> <code>所有正店</code> <code>所有山店</code> 页面</p></li><li><p><input disabled="" type="checkbox"> </p></li><li><p><input disabled="" type="checkbox"> </p></li></ul><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token function">showQrcode</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> wx<span class="token punctuation">.</span><span class="token function">previewImage</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">urls</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'https://6865-helloyun-4ge5h4wyc91f5778-1304890457.tcb.qcloud.la/myQrCode/money.jpg?sign=0148353eddb814548368e3db70dd26ee&t=1614000653'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token literal-property property">current</span><span class="token operator">:</span> <span class="token string">'https://6865-helloyun-4ge5h4wyc91f5778-1304890457.tcb.qcloud.la/myQrCode/money.jpg?sign=0148353eddb814548368e3db70dd26ee&t=1614000653'</span> <span class="token comment">// 当前显示图片的http链接 </span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre><ul><li><input disabled="" type="checkbox"> 设置的弹窗为flase未生效</li></ul><p> <code>云函数success的内容更改,更新云函数后才生效</code></p><hr><pre class="language-javascript" data-language="javascript"><code class="language-javascript">wx<span class="token punctuation">.</span>cloud<span class="token punctuation">.</span><span class="token function">callFunction</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token comment">// 云函数名称</span> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">'get_store_list'</span><span class="token punctuation">,</span> <span class="token literal-property property">data</span><span class="token operator">:</span><span class="token punctuation">{</span> <span class="token literal-property property">pages</span><span class="token operator">:</span>pages <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">//携带的参数:storeName--云函数中使用event.storeName获取</span> <span class="token comment">//成功后执行</span> <span class="token function-variable function">success</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">res</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> data <span class="token operator">=</span> res<span class="token punctuation">.</span>result<span class="token punctuation">.</span>storeList<span class="token punctuation">.</span>data that<span class="token punctuation">.</span><span class="token function">setData</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token comment">//此处设置一个加载中弹窗,区分删除确认弹窗</span> <span class="token literal-property property">loadModel2</span><span class="token operator">:</span><span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token literal-property property">storelist</span><span class="token operator">:</span> data <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token literal-property property">fail</span><span class="token operator">:</span> console<span class="token punctuation">.</span>error <span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre><pre><code>- [ ] 更新日志每次更新才会有,不需要云端更新数据库,采用静态html- [ ] 滚动公共栏</code></pre><pre class="language-javascript" data-language="javascript"><code class="language-javascript">db<span class="token punctuation">.</span><span class="token function">collection</span><span class="token punctuation">(</span><span class="token string">'admin'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span><span class="token string">'admin81192'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">field</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">password</span><span class="token operator">:</span><span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token literal-property property">_id</span><span class="token operator">:</span><span class="token boolean">false</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre><blockquote><p>云函数的返回格式:res.result.</p></blockquote><pre class="language-javascript" data-language="javascript"><code class="language-javascript">wx<span class="token punctuation">.</span>cloud<span class="token punctuation">.</span><span class="token function">callFunction</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">'check_admin'</span><span class="token punctuation">,</span> <span class="token literal-property property">data</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token literal-property property">username</span><span class="token operator">:</span> that<span class="token punctuation">.</span>data<span class="token punctuation">.</span>username<span class="token punctuation">,</span> <span class="token literal-property property">password</span><span class="token operator">:</span>that<span class="token punctuation">.</span>data<span class="token punctuation">.</span>password<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function-variable function">complete</span><span class="token operator">:</span> <span class="token parameter">res</span> <span class="token operator">=></span> <span class="token punctuation">{</span> that<span class="token punctuation">.</span><span class="token function">setData</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">checkres</span><span class="token operator">:</span>res<span class="token punctuation">.</span>result <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>that<span class="token punctuation">.</span>data<span class="token punctuation">.</span>checkres<span class="token punctuation">.</span>res<span class="token punctuation">)</span><span class="token punctuation">{</span> wx<span class="token punctuation">.</span><span class="token function">navigateTo</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">url</span><span class="token operator">:</span> <span class="token string">'/pages/admin/home'</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token comment">//跳转回主页面</span> <span class="token punctuation">{</span> that<span class="token punctuation">.</span><span class="token function">setData</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">loadModal</span><span class="token operator">:</span><span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment">//放在compelete外报错:res为null,不知道是不是因为云函数异步调用还未结束</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre>]]></content>
<summary type="html">查山正微信小程序开发日志</summary>
<category term="demo" scheme="https://darksheep404.github.io/categories/demo/"/>
<category term="demo" scheme="https://darksheep404.github.io/tags/demo/"/>
<category term="微信小程序" scheme="https://darksheep404.github.io/tags/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
<category term="云开发" scheme="https://darksheep404.github.io/tags/%E4%BA%91%E5%BC%80%E5%8F%91/"/>
</entry>
<entry>
<title>观影道士下山&唐人街探案3</title>
<link href="https://darksheep404.github.io/2021/01/17/%E9%81%93%E5%A3%AB%E4%B8%8B%E5%B1%B1/"/>
<id>https://darksheep404.github.io/2021/01/17/%E9%81%93%E5%A3%AB%E4%B8%8B%E5%B1%B1/</id>
<published>2021-01-17T02:20:18.000Z</published>
<updated>2025-01-06T15:58:48.094Z</updated>
<content type="html"><![CDATA[<ul><li><p>我的印象中道教出世,佛教入世或香火气更重</p><blockquote><p> 剧中的佛教则是超然,道教坠入红尘,沦为凡尘,入世而困于世,死于世间纷扰</p></blockquote></li><li><p>宝强的电影里总会出现的搞基和被绿情节【唐人,道士下山】</p></li><li><p>剧情同设定不符,有武功的扫地道士师父追不上也摁不住张震</p></li><li><p>用自己的绝招换了药酒倒可以用知道自己可能死解释</p></li><li><p>但是把绝招交给王没起到太大的作用,房祖名找何安下聊天吃鸡肉没体现出来为啥:<strong>“枪挂在墙上是要开的”</strong></p></li><li><p>一个角度清奇的评论</p></li></ul><blockquote><p>中国的服装是长袍大袖,衣料为柔软纱绸,身上轻了分量,手拿扑克牌便显得窝囊,所以要玩有重量感的麻将。西装布料坚挺,纸牌便显得轻灵,构成轻重对比。<br>这个世界需要轻重缓急。——分寸感</p></blockquote><ul><li>未读过原著,查阅影评而同原著之删减凸显,改造巨大,面目全非</li></ul><h4 id="被道教告上法庭的道士下山"><a href="#被道教告上法庭的道士下山" class="headerlink" title="被道教告上法庭的道士下山"></a>被道教告上法庭的道士下山</h4><blockquote><p>大部分的形容词与定义词都是<strong>尝试</strong>去描述</p></blockquote><ul><li>王宝强身上的猴气,他除了功夫完全没有一丝出身道观的味道反而相悖</li></ul><blockquote><p>乡土,不谙世事,璞玉”或者说是猴气</p><ul><li>宝强多次对欲望的直白表达:你把手艺教给我吧</li><li>类似莫言的书中,乡土感的,对于性的渴求和表述:我想和xx睡觉</li></ul></blockquote><ul><li>道士与道教的体现基本只是武林恩怨和江湖斗殴</li><li>任何情况都不能杀人的戒律:“腐儒”的腐</li></ul><blockquote><p>在一个有江湖与武功的世界,道士为师傅报仇杀人造成道心崩塌而去拜佛,被和尚教诲</p><p>《道德经》表达的思想中就有【佳兵者不祥之器,圣人不得已而用之】</p><p>一味严守戒律只有腐儒的“腐”</p></blockquote><ul><li>导演想要阐述道,给道下了定义,确是使用直白的说教,人物台词甚至用旁白来总结,而不是隐喻</li><li>行走时脑子会发散出很多,写字或者敲击键盘的时候就什么都不剩了</li></ul><hr><h3 id="唐人街探案3"><a href="#唐人街探案3" class="headerlink" title="唐人街探案3"></a>唐人街探案3</h3><blockquote><p>疑问和悬疑点?</p></blockquote><ul><li>误导作用的侧写,as一次错误的运算:男性华人,其他都准</li><li>续集の悬疑点</li><li>懂风水不懂符</li><li>宝强的角色一直被弹幕叫做藏拙,到影片结束,也没体现太多</li><li>宋义作为Q来说,太拙劣了,即使是顺风车杀人,也不用把自己以嫌疑犯的身份搭进去,且Q发了消息给一名1000名的侦探的事情,反常理,也可以查看聊天记录验证</li><li>侦探被全部关起来也挺操蛋的</li></ul><h3 id="唐人街中也提到的道Tao"><a href="#唐人街中也提到的道Tao" class="headerlink" title="唐人街中也提到的道Tao"></a>唐人街中也提到的道Tao</h3><blockquote><p>符咒,神性与兽性,阴阳与光影,五行对应五脏炼丹,杀人者镇压邪灵的符咒</p></blockquote><ul><li>白天救人,晚上杀人的神性兽性过于极端的理论有点强行</li><li>溶于中国传统乡俗,宗教,只漏出只鳞半爪的道</li><li>与封建乡土迷信,各种学说交杂在一起,你中有我,我中有你,被其他事物所错误代言</li><li>什么是道,道家还是道教</li><li>传统中儒释道愈发互相交融,与忌讳等一起建构了旧的中国,传统哲学</li><li>先贤说,而各个先贤意见相左</li><li></li></ul><p><strong>看电影的我:听故事而不是思考故事</strong></p><blockquote><p>走马观花,不关心提到的那些公式</p></blockquote><p>* </p><p><strong>常看到的时灵时不灵,而似招摇撞骗的薛定谔状态の高人师傅的形象</strong></p><p><strong>行走或杂务时的脑洞随想,在坐下来动笔或者敲键盘时无影无踪</strong></p><h4 id="杂笔"><a href="#杂笔" class="headerlink" title="杂笔"></a>杂笔</h4><p><strong>什么是道?</strong></p><p>梁兴扬是道士吗,或许是,是道长吗,则未必,白云观日西瓜的是吗,倒也未必</p><p>则性</p><p>普通人意念与香火中,道士的形象,多为智者,道长,德高望重,一言一语皆是教化</p><p>老子化胡,多宝如来,慈航道人,观音大士,观音老母</p><p>破山伐庙中被击的粉碎的<strong>道教香火神话体系</strong>,淫祀众神,这点则在日本的神社中得以延存</p><p>不是什么佛祖天尊,而是人身边与生活中的小神,带着当地特色的许愿所在,如我敲下这行位置的地方之前就是一个火神庙</p><p>道教的分支细末随着封建迷信逝去,如同火葬,送灯</p><p>道–武功</p><p>和尚则–未必–但也有</p><p>传武与塔沟</p>]]></content>
<summary type="html"><ul>
<li><p>我的印象中道教出世,佛教入世或香火气更重</p>
<blockquote>
<p> 剧中的佛教则是超然,道教坠入红尘,沦为凡尘,入世而困于世,死于世间纷扰</p>
</blockquote>
</li>
<li><p>宝强的电影里总会出现的搞基和被绿情节【</summary>
<category term="编程之外" scheme="https://darksheep404.github.io/categories/%E7%BC%96%E7%A8%8B%E4%B9%8B%E5%A4%96/"/>
<category term="分享" scheme="https://darksheep404.github.io/tags/%E5%88%86%E4%BA%AB/"/>
</entry>
<entry>
<title>转载:MVC,MVP 和 MVVM 的图示</title>
<link href="https://darksheep404.github.io/2020/12/03/MVC,MVP%E5%92%8CMMM%E7%9A%84%E5%9B%BE%E7%A4%BA/"/>
<id>https://darksheep404.github.io/2020/12/03/MVC,MVP%E5%92%8CMMM%E7%9A%84%E5%9B%BE%E7%A4%BA/</id>
<published>2020-12-03T16:10:18.000Z</published>
<updated>2025-01-06T15:58:48.093Z</updated>
<content type="html"><![CDATA[<p><a href="http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html">转载:MVC,MVP 和 MVVM 的图示</a></p><blockquote><p>复杂的软件必须有清晰合理的架构,否则无法开发和维护。</p><p><a href="http://zh.wikipedia.org/wiki/MVC">MVC</a>(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用。它本身<a href="http://www.ruanyifeng.com/blog/2007/11/mvc.html">很容易理解</a>,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了。</p></blockquote><h2 id="一、MVC"><a href="#一、MVC" class="headerlink" title="一、MVC"></a>一、MVC</h2><p>MVC模式的意思是,软件可以分成三个部分。</p><p><img src="http://www.ruanyifeng.com/blogimg/asset/2015/bg2015020104.png" alt="img" loading="lazy"></p><blockquote><ul><li>视图(View):用户界面。</li><li>控制器(Controller):业务逻辑</li><li>模型(Model):数据保存</li></ul></blockquote><p>各部分之间的通信方式如下。</p><p><img src="http://www.ruanyifeng.com/blogimg/asset/2015/bg2015020105.png" alt="img" loading="lazy"></p><blockquote><ol><li>View 传送指令到 Controller</li><li>Controller 完成业务逻辑后,要求 Model 改变状态</li><li>Model 将新的数据发送到 View,用户得到反馈</li></ol></blockquote><p>所有通信都是单向的。</p><h2 id="二、互动模式"><a href="#二、互动模式" class="headerlink" title="二、互动模式"></a>二、互动模式</h2><p>接受用户指令时,MVC 可以分成两种方式。一种是通过 View 接受指令,传递给 Controller。</p><p><img src="http://www.ruanyifeng.com/blogimg/asset/2015/bg2015020106.png" alt="img" loading="lazy"></p><p>另一种是直接通过controller接受指令。</p><p><img src="http://www.ruanyifeng.com/blogimg/asset/2015/bg2015020107.png" alt="img" loading="lazy"></p><h2 id="三、实例:Backbone"><a href="#三、实例:Backbone" class="headerlink" title="三、实例:Backbone"></a>三、实例:Backbone</h2><p>实际项目往往采用更灵活的方式,以 <a href="http://documentcloud.github.com/backbone">Backbone.js</a> 为例。</p><p><img src="http://www.ruanyifeng.com/blogimg/asset/2015/bg2015020108.png" alt="img" loading="lazy"></p><blockquote><ol><li><p>用户可以向 View 发送指令(DOM 事件),再由 View 直接要求 Model 改变状态。</p></li><li><p>用户也可以直接向 Controller 发送指令(改变 URL 触发 hashChange 事件),再由 Controller 发送给 View。</p></li><li><p>Controller 非常薄,只起到路由的作用,而 View 非常厚,业务逻辑都部署在 View。所以,Backbone 索性取消了 Controller,只保留一个 Router(路由器) 。</p></li></ol></blockquote><h2 id="四、MVP"><a href="#四、MVP" class="headerlink" title="四、MVP"></a>四、MVP</h2><p>MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。</p><p><img src="http://www.ruanyifeng.com/blogimg/asset/2015/bg2015020109.png" alt="img" loading="lazy"></p><blockquote><ol><li><p>各部分之间的通信,都是双向的。</p></li><li><p>View 与 Model 不发生联系,都通过 Presenter 传递。</p></li><li><p>View 非常薄,不部署任何业务逻辑,称为”被动视图”(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。</p></li></ol></blockquote><h2 id="五、MVVM"><a href="#五、MVVM" class="headerlink" title="五、MVVM"></a>五、MVVM</h2><p>MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。</p><p><img src="http://www.ruanyifeng.com/blogimg/asset/2015/bg2015020110.png" alt="img" loading="lazy"></p><p>唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。<a href="https://angularjs.org/">Angular</a> 和 <a href="http://emberjs.com/">Ember</a> 都采用这种模式。</p><blockquote><p>vue也可以双向绑定?</p></blockquote>]]></content>
<summary type="html"><p><a href="http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html">转载:MVC,MVP 和 MVVM 的图示</a></p>
<blockquote>
<p>复杂的软件必须有清晰合理的架构,否则无法开发和维护</summary>
<category term="分享" scheme="https://darksheep404.github.io/categories/%E5%88%86%E4%BA%AB/"/>
<category term="拜读" scheme="https://darksheep404.github.io/tags/%E6%8B%9C%E8%AF%BB/"/>
</entry>
<entry>
<title>Docker初窥+nginx</title>
<link href="https://darksheep404.github.io/2020/12/03/docker&nginx/"/>
<id>https://darksheep404.github.io/2020/12/03/docker&nginx/</id>
<published>2020-12-03T15:20:18.000Z</published>
<updated>2025-01-06T15:58:48.093Z</updated>
<content type="html"><![CDATA[<blockquote><p>本学期第十四周:</p></blockquote><p><a href="http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html">阮一峰:Docker入门教程</a></p><h2 id="Docker初窥-nginx"><a href="#Docker初窥-nginx" class="headerlink" title="Docker初窥+nginx"></a>Docker初窥+nginx</h2><h4 id="需求:"><a href="#需求:" class="headerlink" title="需求:"></a>需求:</h4><p><code>软件运行需要环境配置。换一台机器就要重新配置</code></p><p><strong>希望</strong>:<strong>软件可以带环境安装:安装时把运行所需环境复制过来</strong></p><p>已有解决方案:虚拟机,Linux容器</p><ul><li><p>虚拟机:独占一部分内存和硬盘空间,运行时其他程序不能使用</p></li><li><ul><li><strong>资源占用多</strong>:哪怕应用程序真正使用只有1mb,虚拟机也需要几百mb才能运行</li><li><strong>多余步骤多</strong>:虚拟机是完整操作系统,无法跳过用户登录等“系统级别操作步骤”</li><li><strong>启动慢</strong>:启动速度等于操作系统</li></ul></li><li><p>Linux容器</p></li><li><ul><li><p><strong>不模拟完整操作系统,而是对进程进行隔离</strong></p></li><li><blockquote><p>或者说,在正常进程的外面套了一个<a href="https://opensource.com/article/18/1/history-low-level-container-runtimes">保护层</a>。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。</p><p>由于容器是进程级别的,相比虚拟机有很多优势。</p></blockquote></li><li><p><strong>启动快</strong>:启动进程而不是启动操作系统</p></li><li><p><strong>资源占用少</strong>:只占用需要的资源,多个容器可以共享资源,不想虚拟机要独享</p></li><li><p><strong>体积小</strong>:只包含用到的组件即可,不需要打包整个操作系统</p></li></ul></li></ul><h3 id="Docker是什么"><a href="#Docker是什么" class="headerlink" title="Docker是什么"></a>Docker是什么</h3><blockquote><p><strong>Linux容器的一种封装,提供简单易用的容器使用接口,当前最流行的方案</strong></p></blockquote><ul><li>可以方便的创建和使用容器,把软件放入容器</li><li>容器可以进行版本管理,复制,分享,修改</li></ul><h4 id="用途"><a href="#用途" class="headerlink" title="用途"></a>用途</h4><ul><li><strong>提供一次性环境</strong>:如测试</li><li><strong>提供弹性的云服务</strong>:Docker容器可以随开随关,适合动态扩容和缩容</li><li><strong>组建微服务架构</strong>:一个机器可以通过多个容器跑多个服务,在本机就可以模拟出微服务架构</li></ul><h3 id="怎么用"><a href="#怎么用" class="headerlink" title="怎么用"></a>怎么用</h3><h4 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h4><blockquote><p>有社区版和企业版,个人开发者社区版够用</p><p>Windows,ubuntu,mac等都有</p></blockquote><h4 id="Q-amp-A"><a href="#Q-amp-A" class="headerlink" title="Q&A"></a>Q&A</h4><p>Q:</p><blockquote><p> Q:不同操作系统上Docker是否有区别,linux上的Docker容器是否可以跑在linux上</p></blockquote><p>A:</p><blockquote><p>A:未知</p><p>由下文有Ubuntu镜像+apahce</p><p>容器内镜像类似小型虚拟机?与容器外操作系统无关?</p></blockquote><h5 id="安装成功后"><a href="#安装成功后" class="headerlink" title="安装成功后"></a>安装成功后</h5><ul><li>运行命令验证</li></ul><pre class="language-bash" data-language="bash"><code class="language-bash">$ <span class="token function">docker</span> version<span class="token comment"># 或者</span>$ <span class="token function">docker</span> inf</code></pre><ul><li>docker需要用户有sudo权限,避免每次输入sudo,可以把用户加入docke用户组</li></ul><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">usermod</span> <span class="token parameter variable">-aG</span> <span class="token function">docker</span> <span class="token environment constant">$USER</span></code></pre><ul><li>Docker 是服务器—-客户端架构。命令行运行<code>docker</code>命令的时候,需要本机有 Docker 服务。如果服务没有启动,可以用下面的命令启动</li></ul><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># service 命令的用法</span>$ <span class="token function">sudo</span> <span class="token function">service</span> <span class="token function">docker</span> start<span class="token comment"># systemctl 命令的用法</span>$ <span class="token function">sudo</span> systemctl start <span class="token function">docker</span></code></pre><h4 id="image文件"><a href="#image文件" class="headerlink" title="image文件"></a>image文件</h4><p><strong>应用程序及其依赖,打包在 image 文件里面</strong></p><ul><li><p>通过这个文件,才能生成 Docker 容器</p></li><li><p>可以看作是容器的模板</p></li><li><p>实际开发中,<strong>一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成</strong>。</p><blockquote><p>你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。</p></blockquote><p>Q:</p><blockquote><p> Ubuntu 的 image不也是一个操作系统?</p></blockquote></li><li><p>尽量使用别人制作好的,或者基于别人的加工</p></li></ul><blockquote><p>一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。</p></blockquote><hr><h3 id="实操:"><a href="#实操:" class="headerlink" title="实操:"></a>实操:</h3><ul><li>下载一个镜像并运行</li><li>停止程序</li><li>停止服务型容器</li><li>终止和删除容器文件</li><li>制作自己的docker容器?镜像</li><li>其他有用的命令</li></ul><h3 id="待续"><a href="#待续" class="headerlink" title="待续"></a>待续</h3><h3 id="Docker微服务教程:架设wordpress网站"><a href="#Docker微服务教程:架设wordpress网站" class="headerlink" title="Docker微服务教程:架设wordpress网站"></a><a href="http://www.ruanyifeng.com/blog/2018/02/docker-wordpress-tutorial.html">Docker微服务教程:架设wordpress网站</a></h3><blockquote><ul><li>方法 A:自建 WordPress 容器</li><li>方法 B:采用官方的 WordPress 容器</li><li>方法 C:采用 Docker Compose 工具</li></ul></blockquote><h1 id="Nginx-docker容器教程"><a href="#Nginx-docker容器教程" class="headerlink" title="Nginx docker容器教程"></a><a href="http://www.ruanyifeng.com/blog/2018/02/nginx-docker.html">Nginx docker容器教程</a></h1>]]></content>
<summary type="html"><blockquote>
<p>本学期第十四周:</p>
</blockquote>
<p><a href="http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html">阮一峰:Docker入门教程</a></p>
<</summary>
<category term="分享" scheme="https://darksheep404.github.io/categories/%E5%88%86%E4%BA%AB/"/>
<category term="拜读" scheme="https://darksheep404.github.io/tags/%E6%8B%9C%E8%AF%BB/"/>
</entry>
<entry>
<title>webSocket初探</title>
<link href="https://darksheep404.github.io/2020/12/03/webSocket%E5%88%9D%E7%AA%A5/"/>
<id>https://darksheep404.github.io/2020/12/03/webSocket%E5%88%9D%E7%AA%A5/</id>
<published>2020-12-03T15:20:18.000Z</published>
<updated>2025-01-06T15:58:48.093Z</updated>
<content type="html"><![CDATA[<blockquote><p><a href="http://websocket.org/">WebSocket</a> 是一种网络通信协议,很多高级功能都需要它</p></blockquote><h3 id="需求"><a href="#需求" class="headerlink" title="需求"></a>需求</h3><ul><li><p>已经有了 HTTP 协议,为什么还需要另一个协议?</p></li><li><p>因为 HTTP 协议有一个缺陷:通信只能由客户端发起。</p></li></ul><blockquote><p>举例来说,我们想了解今天的天气,只能是* 客户端向服务器发出请求</p><p>服务器返回查询结果。</p><p>HTTP 协议做不到服务器主动向客户端推送信息。</p></blockquote><p><strong>单向请求的</strong>特点,</p><ul><li><p>注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。</p></li><li><p>我们只能使用<a href="https://www.pubnub.com/blog/2014-12-01-http-long-polling/">“轮询”</a>:每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。</p></li><li><p>轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开</p></li></ul><h3 id="webSocket"><a href="#webSocket" class="headerlink" title="webSocket"></a>webSocket</h3><blockquote><p>WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了</p></blockquote><blockquote><p>服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于<a href="https://en.wikipedia.org/wiki/Push_technology">服务器推送技术</a>的一种。</p></blockquote><p>其他特点包括:</p><p>(1)建立在 TCP 协议之上,服务器端的实现比较容易。</p><p>(2)<strong>与 HTTP 协议有着良好的兼容性。默认端口也是80和443</strong>,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。</p><h4 id="Q-amp-A"><a href="#Q-amp-A" class="headerlink" title="(Q&A)"></a>(Q&A)</h4><blockquote><p>现在http已经被https取代</p><p>与http兼容是否会导致落后</p><p>A</p></blockquote><p>A:</p><blockquote><p>2008年诞生,应该不会?</p><p>下文(6):wss应该对应https</p></blockquote><p>(3)数据格式比较轻量,性能开销小,通信高效。</p><p>(4)可以发送文本,也可以发送二进制数据。</p><p>(5)没有同源限制,客户端可以与任意服务器通信。</p><p>(6)协议标识符是<code>ws</code>(如果加密,则为<code>wss</code>),服务器网址就是 URL。</p><blockquote><pre class="language-markup" data-language="markup"><code class="language-markup"></code></pre></blockquote><p><img src="http://www.ruanyifeng.com/blogimg/asset/2017/bg2017051503.jpg" alt="img" loading="lazy"></p><h3 id="使用实例-待续"><a href="#使用实例-待续" class="headerlink" title="使用实例:待续"></a>使用实例:待续</h3><h3 id="Q:http2-0也有推送,这两者的关系是什么?"><a href="#Q:http2-0也有推送,这两者的关系是什么?" class="headerlink" title="Q:http2.0也有推送,这两者的关系是什么?"></a>Q:http2.0也有推送,这两者的关系是什么?</h3><blockquote><p>? HTTP/2 只能推送静态资源,无法推送指定的信息。</p></blockquote>]]></content>
<summary type="html"><blockquote>
<p><a href="http://websocket.org/">WebSocket</a> 是一种网络通信协议,很多高级功能都需要它</p>
</blockquote>
<h3 id="需求"><a href="#需求" class="header</summary>
<category term="分享" scheme="https://darksheep404.github.io/categories/%E5%88%86%E4%BA%AB/"/>
<category term="拜读" scheme="https://darksheep404.github.io/tags/%E6%8B%9C%E8%AF%BB/"/>
</entry>
<entry>
<title>vue井字棋小游戏</title>
<link href="https://darksheep404.github.io/2020/11/26/vue%E4%BA%95%E5%AD%97%E6%A3%8B%E5%B0%8F%E6%B8%B8%E6%88%8Fdemo/"/>
<id>https://darksheep404.github.io/2020/11/26/vue%E4%BA%95%E5%AD%97%E6%A3%8B%E5%B0%8F%E6%B8%B8%E6%88%8Fdemo/</id>
<published>2020-11-26T15:33:18.000Z</published>
<updated>2025-01-06T15:58:48.093Z</updated>
<content type="html"><![CDATA[<h3 id="井字棋"><a href="#井字棋" class="headerlink" title="井字棋"></a>井字棋</h3><p><code>使用vue</code></p><h4 id="本站预览链接"><a href="#本站预览链接" class="headerlink" title="本站预览链接"></a><a href="https://darksheep.xyz/game01/">本站预览链接</a></h4><h4 id="GitHub单网页预览链接"><a href="#GitHub单网页预览链接" class="headerlink" title="GitHub单网页预览链接"></a>GitHub单网页预览链接</h4><blockquote><p>待补充</p></blockquote><p><strong>tips</strong></p><blockquote><p>网页制作之初是单独作为一个网页设计,现在挂靠在博客的右边栏</p><p>胜利后的布局出现稍微错乱</p></blockquote><h3 id="一个旋转的太极"><a href="#一个旋转的太极" class="headerlink" title="一个旋转的太极"></a>一个旋转的太极</h3><h4 id="本站预览链接-1"><a href="#本站预览链接-1" class="headerlink" title="本站预览链接"></a><a href="https://darksheep.xyz/taiji/">本站预览链接</a></h4><p><code>使用html css</code></p><blockquote><p>利用html和css制作的一个简单的太极单页面</p><ul><li>不清楚是否也会同本页面发生冲突</li></ul></blockquote><h3 id="vue打包发布"><a href="#vue打包发布" class="headerlink" title="vue打包发布"></a>vue打包发布</h3><blockquote><p>vue打包成html</p><p><code>yarn build</code> or <code>npm run build</code></p><p>vue打包dist目录下index.html打开空白</p><p>根目录下新建<code>vue.config.js</code>,填入以下代码</p><blockquote><p>vue cli3.0后此文件隐藏,不在根目录下,可以自己手动新建文件覆盖相应配置</p></blockquote><pre class="language-javascript" data-language="javascript"><code class="language-javascript">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token literal-property property">lintOnSave</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token literal-property property">publicPath</span><span class="token operator">:</span> <span class="token string">'./'</span><span class="token punctuation">,</span> <span class="token literal-property property">outputDir</span><span class="token operator">:</span> <span class="token string">'dist'</span><span class="token punctuation">,</span> <span class="token literal-property property">assetsDir</span><span class="token operator">:</span> <span class="token string">'static'</span><span class="token punctuation">}</span></code></pre></blockquote><h3 id="井字棋demo源码"><a href="#井字棋demo源码" class="headerlink" title="井字棋demo源码"></a>井字棋demo源码</h3><h4 id="app-vue"><a href="#app-vue" class="headerlink" title="app.vue"></a>app.vue</h4><pre class="language-vue" data-language="vue"><code class="language-vue"><template> <div id="app"> <div id="res" v-if="win">游戏结束,获胜者是:{{ winner }}</div> <div class="row"> <cell @click="onclickCell(0, $event)" :n="n" /> <cell @click="onclickCell(1, $event)" :n="n" /> <cell @click="onclickCell(2, $event)" :n="n" /> </div> <div class="row"> <cell @click="onclickCell(3, $event)" :n="n" /> <cell @click="onclickCell(4, $event)" :n="n" /> <cell @click="onclickCell(5, $event)" :n="n" /> </div> <div class="row"> <cell @click="onclickCell(6, $event)" :n="n" /> <cell @click="onclickCell(7, $event)" :n="n" /> <cell @click="onclickCell(8, $event)" :n="n" /> </div> </div></template><script>import cell from "./cell";export default { data() { return { cells: [ [1, 1, 1], [1, 1, 1], [1, 1, 1], ], /* 写成如下没带逗号出现bug,影响到n的赋值,但是如下代码null批量替换成1后代码也可以运行 cells: [[null, null, null] [(null, null, null)] [(null, null, null)]], */ n: 0, win: false, winner: null, }; }, components: { cell }, methods: { onclickCell(i, text) { console.log(`${i}号被点击,内容是${text}`); //插入变量是用反单引号括起来 this.cells[Math.floor(i / 3)][i % 3] = text; this.n = this.n + 1; this.tell(); if (this.win === true) { //此处误写掉括号,一直判定成true this.winner = text; console.log(`获胜者是${text}`); } else { console.log("胜负未定"); } }, tell() { const cells = this.cells; for (let i = 0; i < 2; i++) { if ( cells[i][0] === cells[i][1] && cells[i][0] === cells[i][2] && cells[i][0] !== 1 ) { this.win = true; } } for (let j = 0; j < 2; j++) { if ( cells[0][j] === cells[1][j] && cells[0][j] === cells[2][j] && cells[0][j] !== 1 ) { this.win = true; } } if ( cells[0][0] !== 1 && cells[2][2] == cells[0][0] && cells[1][1] === cells[2][2] ) { this.win = true; } if ( cells[0][2] !== 1 && cells[1][1] == cells[2][0] && cells[0][2] === cells[1][1] ) { this.win = true; } }, },};</script><style>.row { display: flex; justify-content: center; align-items: center;}#res { border: 1px solid red; background: lightblue; position: absolute; height: 374px; width: 100%; display: flex; justify-content: center; align-items: center;}</style></code></pre><h4 id="cell-vue"><a href="#cell-vue" class="headerlink" title="cell.vue"></a>cell.vue</h4><pre class="language-vue" data-language="vue"><code class="language-vue"><template> <div id="cell" v-on:click="onclickself"> <template v-if="a">{{ text }}</template> <template v-else></template> </div></template><script>//node中向外暴露成员:moudule.exports={}和exports,导入模块:var 名称=require('标识符')//ES6中导入:import xxx form xx,导出:export default和export 向外暴露//两种不能混用//export导出,导入时要加{}:按需导出,export 可以向外导出多个成员,import时如果不需要,可以不在{}中定义//export导出的成员,导入时必须严格按照名称{}按需接受 想换名字可以使用as 起别名// export default 导出的成员,可以使用任意变量接收,导入时不需要加{} 一个文件中,export可以有多个,export default只可以有一个export default { //父组件使用v-bind或简化指令传递数据给子组件 //子组件通过props接收,只能读不能更改 props: ["n"], data() { //:() => { //function(){} //return (x = 1); return { a: false, text: "o" }; }, methods: { onclickself() { if (this.a === true) { return; } else { this.a = true; this.text = this.n % 2 === 0 ? "x" : "o"; //父组件通过v-on把其方法引用传递给子组件,子组件通过$emit,调用父组件方法,并把数据传给父组件使用 this.$emit("click", this.text); } }, },};</script><style>#cell { border: 1px solid black; width: 100px; height: 100px; display: flex; justify-content: center; align-items: center; font-size: 80px;}</style></code></pre><h4 id="main-js"><a href="#main-js" class="headerlink" title="main.js"></a>main.js</h4><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">import</span> Vue <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token keyword">import</span> App <span class="token keyword">from</span> <span class="token string">'./App.vue'</span>Vue<span class="token punctuation">.</span>config<span class="token punctuation">.</span>productionTip <span class="token operator">=</span> <span class="token boolean">false</span><span class="token keyword">new</span> <span class="token class-name">Vue</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token function-variable function">render</span><span class="token operator">:</span> <span class="token parameter">h</span> <span class="token operator">=></span> <span class="token function">h</span><span class="token punctuation">(</span>App<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">$mount</span><span class="token punctuation">(</span><span class="token string">'#app'</span><span class="token punctuation">)</span></code></pre><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token doctype"><span class="token punctuation"><!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">html</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>zh<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>UTF-8<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>title</span><span class="token punctuation">></span></span>doucument<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"> <span class="token atrule"><span class="token rule">@keyframes</span> x</span> <span class="token punctuation">{</span> <span class="token selector">from</span> <span class="token punctuation">{</span> <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">rotate</span><span class="token punctuation">(</span>0deg<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">to</span> <span class="token punctuation">{</span> <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">rotate</span><span class="token punctuation">(</span>360deg<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token selector">*</span> <span class="token punctuation">{</span> <span class="token comment">/*background: #eee;*/</span> <span class="token property">box-sizing</span><span class="token punctuation">:</span> border-box<span class="token punctuation">;</span> <span class="token property">padding</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span> <span class="token property">margin</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">body</span> <span class="token punctuation">{</span> <span class="token property">background</span><span class="token punctuation">:</span> #eee<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">#八卦</span> <span class="token punctuation">{</span> <span class="token comment">/*border:1px solid red;*/</span> <span class="token property">width</span><span class="token punctuation">:</span> 400px<span class="token punctuation">;</span> <span class="token property">height</span><span class="token punctuation">:</span> 400px<span class="token punctuation">;</span> <span class="token property">border-radius</span><span class="token punctuation">:</span> 200px<span class="token punctuation">;</span> <span class="token property">position</span><span class="token punctuation">:</span> relative<span class="token punctuation">;</span> <span class="token property">overflow</span><span class="token punctuation">:</span> hidden<span class="token punctuation">;</span> <span class="token property">animation</span><span class="token punctuation">:</span> x 1s infinite linear<span class="token punctuation">;</span> <span class="token property">box-shadow</span><span class="token punctuation">:</span> 0px 0px 3px 0px <span class="token function">rgba</span><span class="token punctuation">(</span>0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0.75<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">#八卦>div:nth-child(2)</span> <span class="token punctuation">{</span> <span class="token comment">/*border:10px solid green;*/</span> <span class="token property">width</span><span class="token punctuation">:</span> 50%<span class="token punctuation">;</span> <span class="token property">height</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span> <span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span> <span class="token property">right</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span> <span class="token property">background</span><span class="token punctuation">:</span> white<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">#八卦>div:first-child</span> <span class="token punctuation">{</span> <span class="token comment">/*border:10px solid yellow;*/</span> <span class="token property">width</span><span class="token punctuation">:</span> 50%<span class="token punctuation">;</span> <span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span> <span class="token property">height</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span> <span class="token property">left</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span> <span class="token property">background</span><span class="token punctuation">:</span> black<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">#八卦>div:nth-child(3)</span> <span class="token punctuation">{</span> <span class="token comment">/*border:10px solid green;*/</span> <span class="token property">width</span><span class="token punctuation">:</span> 50%<span class="token punctuation">;</span> <span class="token property">height</span><span class="token punctuation">:</span> 50%<span class="token punctuation">;</span> <span class="token property">border-radius</span><span class="token punctuation">:</span> 200px<span class="token punctuation">;</span> <span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span> <span class="token comment">/*right: 0;此处多写了一个右边,但是好像没影响*/</span> <span class="token property">left</span><span class="token punctuation">:</span> 50%<span class="token punctuation">;</span> <span class="token property">background</span><span class="token punctuation">:</span> black<span class="token punctuation">;</span> <span class="token property">margin-left</span><span class="token punctuation">:</span> -100px<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">#八卦>div:nth-child(4)</span> <span class="token punctuation">{</span> <span class="token comment">/*border:10px solid green;*/</span> <span class="token property">width</span><span class="token punctuation">:</span> 50%<span class="token punctuation">;</span> <span class="token property">height</span><span class="token punctuation">:</span> 50%<span class="token punctuation">;</span> <span class="token property">border-radius</span><span class="token punctuation">:</span> 200px<span class="token punctuation">;</span> <span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span> <span class="token property">right</span><span class="token punctuation">:</span> 50%<span class="token punctuation">;</span> <span class="token property">background</span><span class="token punctuation">:</span> white<span class="token punctuation">;</span> <span class="token property">margin-right</span><span class="token punctuation">:</span> -100px<span class="token punctuation">;</span> <span class="token property">bottom</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">#八卦>div:nth-child(5)</span> <span class="token punctuation">{</span> <span class="token comment">/*上小白圆*/</span> <span class="token comment">/*border:10px solid green;*/</span> <span class="token property">width</span><span class="token punctuation">:</span> 12.5%<span class="token punctuation">;</span> <span class="token property">height</span><span class="token punctuation">:</span> 12.5%<span class="token punctuation">;</span> <span class="token property">border-radius</span><span class="token punctuation">:</span> 200px<span class="token punctuation">;</span> <span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span> <span class="token property">left</span><span class="token punctuation">:</span> 50%<span class="token punctuation">;</span> <span class="token property">background</span><span class="token punctuation">:</span> white<span class="token punctuation">;</span> <span class="token property">margin-left</span><span class="token punctuation">:</span> -6.25%<span class="token punctuation">;</span> <span class="token property">margin-top</span><span class="token punctuation">:</span> 6.25%<span class="token punctuation">;</span> <span class="token property">top</span><span class="token punctuation">:</span> 12.5%<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">#八卦>div:nth-child(6)</span> <span class="token punctuation">{</span> <span class="token comment">/*下小白圆*/</span> <span class="token comment">/*border:10px solid green;*/</span> <span class="token property">width</span><span class="token punctuation">:</span> 12.5%<span class="token punctuation">;</span> <span class="token property">height</span><span class="token punctuation">:</span> 12.5%<span class="token punctuation">;</span> <span class="token property">border-radius</span><span class="token punctuation">:</span> 200px<span class="token punctuation">;</span> <span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span> <span class="token property">left</span><span class="token punctuation">:</span> 50%<span class="token punctuation">;</span> <span class="token property">background</span><span class="token punctuation">:</span> black<span class="token punctuation">;</span> <span class="token property">margin-left</span><span class="token punctuation">:</span> -6.25%<span class="token punctuation">;</span> <span class="token property">margin-bottom</span><span class="token punctuation">:</span> 6.25%<span class="token punctuation">;</span> <span class="token property">bottom</span><span class="token punctuation">:</span> 12.5%<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">#八卦-wrapper</span> <span class="token punctuation">{</span> <span class="token property">border</span><span class="token punctuation">:</span> solid 1px red<span class="token punctuation">;</span> <span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span> <span class="token property">justify-content</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span> <span class="token property">align-items</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span> <span class="token property">flex-direction</span><span class="token punctuation">:</span> column<span class="token punctuation">;</span> <span class="token property">height</span><span class="token punctuation">:</span> 100vh<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">#txt</span> <span class="token punctuation">{</span> <span class="token property">margin-top</span><span class="token punctuation">:</span> 1em<span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>head</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>八卦-wrapper<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>八卦<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>2<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>3<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>4<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>txt<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>道可道,非常道<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>html</span><span class="token punctuation">></span></span></code></pre>]]></content>
<summary type="html"><h3 id="井字棋"><a href="#井字棋" class="headerlink" title="井字棋"></a>井字棋</h3><p><code>使用vue</code></p>
<h4 id="本站预览链接"><a href="#本站预览链接" class="he</summary>
<category term="前端" scheme="https://darksheep404.github.io/categories/%E5%89%8D%E7%AB%AF/"/>
<category term="demo" scheme="https://darksheep404.github.io/tags/demo/"/>
<category term="vue" scheme="https://darksheep404.github.io/tags/vue/"/>
</entry>
<entry>
<title>文章&博客拜读学习</title>
<link href="https://darksheep404.github.io/2020/11/25/%E4%B8%80%E4%BA%9B%E6%8B%9C%E8%AF%BB%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%96%87%E7%AB%A0or%E5%8D%9A%E5%AE%A2/"/>
<id>https://darksheep404.github.io/2020/11/25/%E4%B8%80%E4%BA%9B%E6%8B%9C%E8%AF%BB%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%96%87%E7%AB%A0or%E5%8D%9A%E5%AE%A2/</id>
<published>2020-11-25T16:20:18.000Z</published>
<updated>2025-01-06T15:58:48.093Z</updated>
<content type="html"><![CDATA[<blockquote><p>传说中的:去我的收藏夹里吃灰吧</p></blockquote><h3 id="Phodal"><a href="#Phodal" class="headerlink" title="Phodal"></a><a href="https://www.phodal.com/">Phodal</a></h3><p><code>全栈,前端,开源,物联网</code></p><blockquote><p>读过&待重读</p></blockquote><h4 id="Phodal’s-Idea实战指南"><a href="#Phodal’s-Idea实战指南" class="headerlink" title="Phodal’s Idea实战指南"></a><a href="http://ideabook.phodal.com/">Phodal’s Idea实战指南</a></h4><h4 id="GitHub漫游指南"><a href="#GitHub漫游指南" class="headerlink" title="GitHub漫游指南"></a><a href="http://github.phodal.com/">GitHub漫游指南</a></h4><h3 id="阮一峰的开发者手册"><a href="#阮一峰的开发者手册" class="headerlink" title="阮一峰的开发者手册"></a><a href="http://www.ruanyifeng.com/blog/developer/">阮一峰的开发者手册</a></h3><h3 id="待整理"><a href="#待整理" class="headerlink" title="待整理~~~"></a>待整理~~~</h3>]]></content>
<summary type="html"><blockquote>
<p>传说中的:去我的收藏夹里吃灰吧</p>
</blockquote>
<h3 id="Phodal"><a href="#Phodal" class="headerlink" title="Phodal"></a><a href="https://w</summary>
<category term="分享" scheme="https://darksheep404.github.io/categories/%E5%88%86%E4%BA%AB/"/>
<category term="分享" scheme="https://darksheep404.github.io/tags/%E5%88%86%E4%BA%AB/"/>
</entry>
<entry>
<title>随机获取猫图APP</title>
<link href="https://darksheep404.github.io/2020/11/24/%E8%8E%B7%E5%8F%96%E9%9A%8F%E6%9C%BA%E7%8C%AB%E5%9B%BEAPP/"/>
<id>https://darksheep404.github.io/2020/11/24/%E8%8E%B7%E5%8F%96%E9%9A%8F%E6%9C%BA%E7%8C%AB%E5%9B%BEAPP/</id>
<published>2020-11-24T15:20:18.000Z</published>
<updated>2025-01-06T15:58:48.094Z</updated>
<content type="html"><![CDATA[<p>[TOC]</p><h2 id="安卓实验-随机猫图"><a href="#安卓实验-随机猫图" class="headerlink" title="安卓实验:随机猫图"></a>安卓实验:随机猫图</h2><blockquote><p> 安卓实验:随机猫图:cat:</p></blockquote><blockquote><p>使用技术:RecycleView,Glide</p></blockquote><h3 id="运行效果"><a href="#运行效果" class="headerlink" title="运行效果"></a>运行效果</h3><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20201124224447.jpg" alt="Screenshot_20201124_224008_com.demo.catws" loading="lazy"></p><h3 id="遇到的待解决的问题"><a href="#遇到的待解决的问题" class="headerlink" title="遇到的待解决的问题"></a>遇到的待解决的问题</h3><ul><li><code>Oncreate</code>里给<code>RecycleView</code>传入了八张初始图片,并没有按照瀑布流显示,而是排成了一行</li><li>运行点击函数后才刷新成设置的两列</li></ul><blockquote><p>拟解决办法,<code>oncreate</code>里面调用一个刷新函数,函数执行<code>notifyItemChanged(0)</code></p><blockquote><p>实际未改变,希望他刷新布局</p></blockquote><blockquote><p>并未解决</p></blockquote></blockquote><p>* </p><ul><li><p>点击函数里清空了items数组,使用<code>myadaper?.notifyItemInserted(data.size-1)</code>报错越界</p><p>使用<code>myadaper!!.notifyItemChanged(data.size-1)</code>反而正常</p></li></ul><blockquote><p>猜想,data数组更新了,但是适配器里的数组还保存着原来的数据,调用notify函数后才更新对应位置数据</p><p>所以主页面里按data空数组下标从0开始插入反而报错</p><p><strong>报错日志</strong></p><pre class="language-verilog" data-language="verilog"><code class="language-verilog">D<span class="token operator">/</span>TAG<span class="token operator">----></span>得到第 <span class="token number">0</span> 个图片链接:<span class="token punctuation">:</span> https<span class="token punctuation">:</span><span class="token comment">//24.media.tumblr.com/tumblr_lwwcqwNiyE1r0mbi6o1_500.jpg</span>D<span class="token operator">/</span>TAG<span class="token operator">----></span>得到第 <span class="token number">1</span> 个图片链接:<span class="token punctuation">:</span> https<span class="token punctuation">:</span><span class="token comment">//25.media.tumblr.com/tumblr_ll6oplOJki1qjahcpo1_500.jpg</span>D<span class="token operator">/</span>TAG<span class="token operator">----></span>重置了第<span class="token number">1</span> 个图片链接:<span class="token punctuation">:</span> D<span class="token operator">/</span>TAG<span class="token operator">----></span>得到第 <span class="token number">2</span> 个图片链接:<span class="token punctuation">:</span> https<span class="token punctuation">:</span><span class="token comment">//25.media.tumblr.com/tumblr_ln7y9yW8hn1qdth8zo1_500.jpg</span>D<span class="token operator">/</span>TAG<span class="token operator">----></span>得到第 <span class="token number">3</span> 个图片链接:<span class="token punctuation">:</span> https<span class="token punctuation">:</span><span class="token comment">//s3.us-west-2.amazonaws.com/cdn2.thecatapi.com/images/PfA5hN4En.jpg</span>D<span class="token operator">/</span>TAG<span class="token operator">----></span>得到第 <span class="token number">4</span> 个图片链接:<span class="token punctuation">:</span> https<span class="token punctuation">:</span><span class="token comment">//s3.us-west-2.amazonaws.com/cdn2.thecatapi.com/images/1XJ21J4EE.jpg</span>D<span class="token operator">/</span>TAG<span class="token operator">----></span>得到第 <span class="token number">5</span> 个图片链接:<span class="token punctuation">:</span> https<span class="token punctuation">:</span><span class="token comment">//s3.us-west-2.amazonaws.com/cdn2.thecatapi.com/images/2B3n7I5u2.jpg</span>D<span class="token operator">/</span>TAG<span class="token operator">----></span>得到第 <span class="token number">6</span> 个图片链接:<span class="token punctuation">:</span> https<span class="token punctuation">:</span><span class="token comment">//s3.us-west-2.amazonaws.com/cdn2.thecatapi.com/images/0xvhPJ8pd.jpg</span>D<span class="token operator">/</span>TAG<span class="token operator">----></span>得到第 <span class="token number">7</span> 个图片链接:<span class="token punctuation">:</span> https<span class="token punctuation">:</span><span class="token comment">//s3.us-west-2.amazonaws.com/cdn2.thecatapi.com/images/6X-Rt4SAF.jpg</span>D<span class="token operator">/</span>Tag<span class="token punctuation">:</span> 执行了onBindViewHolderD<span class="token operator">/</span>AndroidRuntime<span class="token punctuation">:</span> Shutting down VME<span class="token operator">/</span>AndroidRuntime<span class="token punctuation">:</span> FATAL EXCEPTION<span class="token punctuation">:</span> main Process<span class="token punctuation">:</span> com<span class="token punctuation">.</span>demo<span class="token punctuation">.</span>catws<span class="token punctuation">,</span> PID<span class="token punctuation">:</span> <span class="token number">23693</span> java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>IndexOutOfBoundsException<span class="token punctuation">:</span> Inconsistency detected<span class="token punctuation">.</span> Invalid item position <span class="token function">7</span><span class="token punctuation">(</span>offset<span class="token punctuation">:</span><span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">.</span>state<span class="token punctuation">:</span><span class="token number">8</span> androidx<span class="token punctuation">.</span>recyclerview<span class="token punctuation">.</span>widget<span class="token punctuation">.</span>RecyclerView<span class="token operator">{</span>abf2cbd VFED<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>ID <span class="token operator">-</span><span class="token number">72</span><span class="token punctuation">,</span><span class="token number">246</span><span class="token operator">-</span><span class="token number">1155</span><span class="token punctuation">,</span><span class="token number">2109</span> <span class="token number">#7</span>f070083 app<span class="token punctuation">:</span>id<span class="token operator">/</span>recycle<span class="token operator">}</span><span class="token punctuation">,</span> </code></pre></blockquote><ul><li><p>初始化的<code>recycleview</code>传入空数组时也不能使用<code>insert</code>,但可以使用<code>changed</code> 。。。。</p></li><li><p><strong>报错日志</strong></p></li><li><p>```verilog<br>D/TAG—->得到第 0 个图片链接:: <a href="https://26.media.tumblr.com/Jjkybd3nSk1fx3xfOQ0aNJawo1_500.jpg">https://26.media.tumblr.com/Jjkybd3nSk1fx3xfOQ0aNJawo1_500.jpg</a><br>D/TAG—->得到第 1 个图片链接:: <a href="https://24.media.tumblr.com/tumblr_lhc5exQHCr1qgnva2o1_500.jpg">https://24.media.tumblr.com/tumblr_lhc5exQHCr1qgnva2o1_500.jpg</a><br>D/TAG—->得到第 2 个图片链接:: <a href="https://24.media.tumblr.com/tumblr_m46gb0Yz7l1qz6rxuo1_500.jpg">https://24.media.tumblr.com/tumblr_m46gb0Yz7l1qz6rxuo1_500.jpg</a><br>D/TAG—->得到第 3 个图片链接:: <a href="https://24.media.tumblr.com/tumblr_m5b8gqPHsN1qenqklo1_r1_500.jpg">https://24.media.tumblr.com/tumblr_m5b8gqPHsN1qenqklo1_r1_500.jpg</a><br>D/TAG—->重置了第3 个图片链接::<br>D/TAG—->得到第 4 个图片链接:: <a href="https://25.media.tumblr.com/tumblr_m6fj9jObek1qzbxjgo1_500.jpg">https://25.media.tumblr.com/tumblr_m6fj9jObek1qzbxjgo1_500.jpg</a><br>D/TAG—->重置了第4 个图片链接::<br><a href="https://s3.us-west-2.amazonaws.com/cdn2.thecatapi.com/images/L6X35YZPT.jpg">https://s3.us-west-2.amazonaws.com/cdn2.thecatapi.com/images/L6X35YZPT.jpg</a><br>D/TAG—->得到第 5 个图片链接:: <a href="https://s3.us-west-2.amazonaws.com/cdn2.thecatapi.com/images/L6X35YZPT.jpg">https://s3.us-west-2.amazonaws.com/cdn2.thecatapi.com/images/L6X35YZPT.jpg</a><br>D/TAG—->得到第 6 个图片链接:: <a href="https://s3.us-west-2.amazonaws.com/cdn2.thecatapi.com/images/R1_Oy4xPh.jpg">https://s3.us-west-2.amazonaws.com/cdn2.thecatapi.com/images/R1_Oy4xPh.jpg</a><br>D/TAG—->得到第 7 个图片链接:: <a href="https://s3.us-west-2.amazonaws.com/cdn2.thecatapi.com/images/HJiePCL8P.jpg">https://s3.us-west-2.amazonaws.com/cdn2.thecatapi.com/images/HJiePCL8P.jpg</a><br>D/TAG: 进入onCreateViewHolder<br>D/Tag: 执行了onBindViewHolder<br>//…<br>D/Tag: 执行了onBindViewHolder<br>I/chatty: uid=10161(com.demo.catws) identical 3 lines<br>D/AndroidRuntime: Shutting down VM<br>E/AndroidRuntime: FATAL EXCEPTION: main<br>Process: com.demo.catws, PID: 24957<br>java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionMyViewHolder{a05aa7 position=12 id=-1, oldPos=7, pLpos:7 scrap [attachedScrap] tmpDetached not recyclable(1) no parent} androidx.recyclerview.widget.RecyclerView{3aa67fe VFED….. ……ID -72,246-1155,2109 #7f070083 app:id/recycle}</p><pre class="language-none"><code class="language-none"> ### 业务代码```kotlin//点击函数fun lookCat(v:View) = Thread(){ val url="https://api.thecatapi.com/api/images/get?format=xml&size=med&results_per_page=8" val xmlString = URL(url).readText() val parserFactory: XmlPullParserFactory = XmlPullParserFactory.newInstance() val parser: XmlPullParser = parserFactory.newPullParser() parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true) parser.setInput(StringReader(xmlString)) var tag: String? var text = "" var count=0; data.clear() var bytes:ByteArray? var event = parser.eventType while (event != XmlPullParser.END_DOCUMENT) { tag = parser.name when (event) { XmlPullParser.TEXT -> text = parser.text XmlPullParser.END_TAG -> when (tag) { "url" -> { //把资源链接压进资源数组 //图片链接处理 Log.d("TAG---->得到第 ${data.size-1} 个图片链接:", text) data.add(text) runOnUiThread { //myadaper?.notifyItemInserted(data.size-1) //此处使用提醒插入报错,使用提醒改变正常运行 myadaper!!.notifyItemChanged(data.size-1) Log.d("TAG---->重置了 ${data.size-1} 个图片链接:", text) } } } } event = parser.next() } }.start()</code></pre></li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token comment">//图片加载函数</span><span class="token keyword">override</span> <span class="token keyword">fun</span> <span class="token function">onBindViewHolder</span><span class="token punctuation">(</span>holder<span class="token operator">:</span> MyViewHolder<span class="token punctuation">,</span> position<span class="token operator">:</span> Int<span class="token punctuation">)</span> <span class="token punctuation">{</span> Log<span class="token punctuation">.</span><span class="token function">d</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">"Tag"</span></span><span class="token punctuation">,</span><span class="token string-literal singleline"><span class="token string">"执行了onBindViewHolder"</span></span><span class="token punctuation">)</span> Glide<span class="token punctuation">.</span><span class="token function">with</span><span class="token punctuation">(</span>myContext<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">load</span><span class="token punctuation">(</span>items<span class="token punctuation">[</span>position<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">into</span><span class="token punctuation">(</span>holder<span class="token punctuation">.</span>imgview<span class="token punctuation">)</span> <span class="token punctuation">}</span></code></pre><h2 id="1-0版本:解析获取xml中的一个图片链接并显示"><a href="#1-0版本:解析获取xml中的一个图片链接并显示" class="headerlink" title="1.0版本:解析获取xml中的一个图片链接并显示"></a>1.0版本:解析获取xml中的一个图片链接并显示</h2><blockquote><p>未使用布局及图片加载库</p></blockquote><h3 id="效果图"><a href="#效果图" class="headerlink" title="效果图"></a>效果图</h3><blockquote><ul><li>点击按钮向api接口请求xml数据</li><li>当从xml中解析出图片url地址后左上角显示:<br>“猫猫图正在向您走来”</li><li>从url中读取到图片后,显示图片链接与图片到ui上</li></ul></blockquote><p><img src="https://sheepnote.oss-cn-shenzhen.aliyuncs.com/20201006/20201124200225.png" alt="image-20201124200224064" loading="lazy"></p><h3 id="业务代码"><a href="#业务代码" class="headerlink" title="业务代码"></a>业务代码</h3><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">fun</span> <span class="token function">lookCat</span><span class="token punctuation">(</span>v<span class="token operator">:</span>View<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token function">Thread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">val</span> url<span class="token operator">=</span><span class="token string-literal singleline"><span class="token string">"https://api.thecatapi.com/api/images/get?format=xml&size=med&results_per_page=1"</span></span> <span class="token comment">//读取并格式化返回的xml</span> <span class="token keyword">val</span> xmlString <span class="token operator">=</span> <span class="token function">URL</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">readText</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">val</span> parserFactory<span class="token operator">:</span> XmlPullParserFactory <span class="token operator">=</span> XmlPullParserFactory<span class="token punctuation">.</span><span class="token function">newInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">val</span> parser<span class="token operator">:</span> XmlPullParser <span class="token operator">=</span> parserFactory<span class="token punctuation">.</span><span class="token function">newPullParser</span><span class="token punctuation">(</span><span class="token punctuation">)</span> parser<span class="token punctuation">.</span><span class="token function">setFeature</span><span class="token punctuation">(</span>XmlPullParser<span class="token punctuation">.</span>FEATURE_PROCESS_NAMESPACES<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span> parser<span class="token punctuation">.</span><span class="token function">setInput</span><span class="token punctuation">(</span><span class="token function">StringReader</span><span class="token punctuation">(</span>xmlString<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">var</span> tag<span class="token operator">:</span> String<span class="token operator">?</span> <span class="token keyword">var</span> text <span class="token operator">=</span> <span class="token string-literal singleline"><span class="token string">""</span></span> <span class="token keyword">var</span> bytes<span class="token operator">:</span>ByteArray<span class="token operator">?</span> <span class="token keyword">var</span> event <span class="token operator">=</span> parser<span class="token punctuation">.</span>eventType <span class="token comment">//开始解析返回的xml,此处因为url设置results_per_page=1,返回的xml只有一个image节点即一张图片链接</span> <span class="token keyword">while</span> <span class="token punctuation">(</span>event <span class="token operator">!=</span> XmlPullParser<span class="token punctuation">.</span>END_DOCUMENT<span class="token punctuation">)</span> <span class="token punctuation">{</span> tag <span class="token operator">=</span> parser<span class="token punctuation">.</span>name <span class="token keyword">when</span> <span class="token punctuation">(</span>event<span class="token punctuation">)</span> <span class="token punctuation">{</span> XmlPullParser<span class="token punctuation">.</span>TEXT <span class="token operator">-></span> text <span class="token operator">=</span> parser<span class="token punctuation">.</span>text XmlPullParser<span class="token punctuation">.</span>END_TAG <span class="token operator">-></span> <span class="token keyword">when</span> <span class="token punctuation">(</span>tag<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token string-literal singleline"><span class="token string">"url"</span></span> <span class="token operator">-></span><span class="token punctuation">{</span> imgurl<span class="token operator">=</span>text timestart<span class="token punctuation">.</span>text<span class="token operator">=</span><span class="token string-literal singleline"><span class="token string">"猫猫图正在向您走来!"</span></span> Log<span class="token punctuation">.</span><span class="token function">d</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">"MainActivity"</span></span><span class="token punctuation">,</span><span class="token string-literal singleline"><span class="token string">"已读取完图片链接 :</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">$</span><span class="token expression">imgurl</span></span><span class="token string"> "</span></span><span class="token punctuation">)</span> bytes <span class="token operator">=</span> <span class="token function">URL</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">readBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span> runOnUiThread<span class="token punctuation">{</span> <span class="token keyword">var</span> text<span class="token operator">=</span>imgurl textView<span class="token punctuation">.</span>text<span class="token operator">=</span>text <span class="token keyword">val</span> bitmap <span class="token operator">=</span> BitmapFactory<span class="token punctuation">.</span><span class="token function">decodeByteArray</span><span class="token punctuation">(</span>bytes<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> bytes<span class="token punctuation">.</span>size<span class="token punctuation">)</span> Log<span class="token punctuation">.</span><span class="token function">d</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">"MainActivity"</span></span><span class="token punctuation">,</span><span class="token string-literal singleline"><span class="token string">"已读取完图片字节文件:</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">$</span><span class="token expression">imgurl</span></span><span class="token string"> "</span></span><span class="token punctuation">)</span> imageView<span class="token punctuation">.</span><span class="token function">setImageBitmap</span><span class="token punctuation">(</span>bitmap<span class="token punctuation">)</span> imageView<span class="token punctuation">.</span>isEnabled <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">//当xml存在多个子节点时生效,此时暂不生效</span> event <span class="token operator">=</span> parser<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span></code></pre>]]></content>
<summary type="html"><p>[TOC]</p>
<h2 id="安卓实验-随机猫图"><a href="#安卓实验-随机猫图" class="headerlink" title="安卓实验:随机猫图"></a>安卓实验:随机猫图</h2><blockquote>
<p> 安卓实验:随机猫图:cat:<</summary>
<category term="demo" scheme="https://darksheep404.github.io/categories/demo/"/>
<category term="demo" scheme="https://darksheep404.github.io/tags/demo/"/>
<category term="java" scheme="https://darksheep404.github.io/tags/java/"/>
<category term="kotlin" scheme="https://darksheep404.github.io/tags/kotlin/"/>
<category term="Android" scheme="https://darksheep404.github.io/tags/Android/"/>
</entry>
<entry>
<title>分享:From Java To Kotlin</title>
<link href="https://darksheep404.github.io/2020/11/19/From%20Java%20To%20Kotlin/"/>
<id>https://darksheep404.github.io/2020/11/19/From%20Java%20To%20Kotlin/</id>
<published>2020-11-19T15:20:18.000Z</published>
<updated>2025-01-06T15:58:48.093Z</updated>
<content type="html"><![CDATA[<p>[TOC]</p><p><a href="https://github.com/MindorksOpenSource/from-java-to-kotlin/blob/master/README-ZH.md">From Java To Kotlin</a></p><h2 id="打印日志"><a href="#打印日志" class="headerlink" title="打印日志"></a>打印日志</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"Amit Shekhar"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Amit Shekhar"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token function">print</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">"Amit Shekhar"</span></span><span class="token punctuation">)</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">"Amit Shekhar"</span></span><span class="token punctuation">)</span></code></pre><hr><h2 id="常量与变量"><a href="#常量与变量" class="headerlink" title="常量与变量"></a>常量与变量</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token class-name">String</span> name <span class="token operator">=</span> <span class="token string">"Amit Shekhar"</span><span class="token punctuation">;</span><span class="token keyword">final</span> <span class="token class-name">String</span> name <span class="token operator">=</span> <span class="token string">"Amit Shekhar"</span><span class="token punctuation">;</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">var</span> name <span class="token operator">=</span> <span class="token string-literal singleline"><span class="token string">"Amit Shekhar"</span></span><span class="token keyword">val</span> name <span class="token operator">=</span> <span class="token string-literal singleline"><span class="token string">"Amit Shekhar"</span></span></code></pre><hr><h2 id="null声明"><a href="#null声明" class="headerlink" title="null声明"></a>null声明</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token class-name">String</span> otherName<span class="token punctuation">;</span>otherName <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">var</span> otherName <span class="token operator">:</span> String<span class="token operator">?</span>otherName <span class="token operator">=</span> <span class="token keyword">null</span></code></pre><hr><h2 id="空判断"><a href="#空判断" class="headerlink" title="空判断"></a>空判断</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">if</span> <span class="token punctuation">(</span>text <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> length <span class="token operator">=</span> text<span class="token punctuation">.</span><span class="token function">length</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin">text<span class="token operator">?</span><span class="token punctuation">.</span><span class="token function">let</span> <span class="token punctuation">{</span> <span class="token keyword">val</span> length <span class="token operator">=</span> text<span class="token punctuation">.</span>length<span class="token punctuation">}</span><span class="token comment">// or simply</span><span class="token keyword">val</span> length <span class="token operator">=</span> text<span class="token operator">?</span><span class="token punctuation">.</span>length</code></pre><hr><h2 id="字符串拼接"><a href="#字符串拼接" class="headerlink" title="字符串拼接"></a>字符串拼接</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token class-name">String</span> firstName <span class="token operator">=</span> <span class="token string">"Amit"</span><span class="token punctuation">;</span><span class="token class-name">String</span> lastName <span class="token operator">=</span> <span class="token string">"Shekhar"</span><span class="token punctuation">;</span><span class="token class-name">String</span> message <span class="token operator">=</span> <span class="token string">"My name is: "</span> <span class="token operator">+</span> firstName <span class="token operator">+</span> <span class="token string">" "</span> <span class="token operator">+</span> lastName<span class="token punctuation">;</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">val</span> firstName <span class="token operator">=</span> <span class="token string-literal singleline"><span class="token string">"Amit"</span></span><span class="token keyword">val</span> lastName <span class="token operator">=</span> <span class="token string-literal singleline"><span class="token string">"Shekhar"</span></span><span class="token keyword">val</span> message <span class="token operator">=</span> <span class="token string-literal singleline"><span class="token string">"My name is: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">$</span><span class="token expression">firstName</span></span><span class="token string"> </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">$</span><span class="token expression">lastName</span></span><span class="token string">"</span></span></code></pre><hr><h2 id="换行"><a href="#换行" class="headerlink" title="换行"></a>换行</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token class-name">String</span> text <span class="token operator">=</span> <span class="token string">"First Line\n"</span> <span class="token operator">+</span> <span class="token string">"Second Line\n"</span> <span class="token operator">+</span> <span class="token string">"Third Line"</span><span class="token punctuation">;</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">val</span> text <span class="token operator">=</span> <span class="token string-literal multiline"><span class="token string">""" |First Line |Second Line |Third Line """</span></span><span class="token punctuation">.</span><span class="token function">trimMargin</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre><hr><h2 id="三元表达式"><a href="#三元表达式" class="headerlink" title="三元表达式"></a>三元表达式</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token class-name">String</span> text <span class="token operator">=</span> x <span class="token operator">></span> <span class="token number">5</span> <span class="token operator">?</span> <span class="token string">"x > 5"</span> <span class="token operator">:</span> <span class="token string">"x <= 5"</span><span class="token punctuation">;</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">val</span> text <span class="token operator">=</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">></span> <span class="token number">5</span><span class="token punctuation">)</span> <span class="token string-literal singleline"><span class="token string">"x > 5"</span></span> <span class="token keyword">else</span> <span class="token string-literal singleline"><span class="token string">"x <= 5"</span></span></code></pre><hr><h2 id="操作符"><a href="#操作符" class="headerlink" title="操作符"></a>操作符</h2><ul><li>java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">final</span> <span class="token keyword">int</span> andResult <span class="token operator">=</span> a <span class="token operator">&</span> b<span class="token punctuation">;</span><span class="token keyword">final</span> <span class="token keyword">int</span> orResult <span class="token operator">=</span> a <span class="token operator">|</span> b<span class="token punctuation">;</span><span class="token keyword">final</span> <span class="token keyword">int</span> xorResult <span class="token operator">=</span> a <span class="token operator">^</span> b<span class="token punctuation">;</span><span class="token keyword">final</span> <span class="token keyword">int</span> rightShift <span class="token operator">=</span> a <span class="token operator">>></span> <span class="token number">2</span><span class="token punctuation">;</span><span class="token keyword">final</span> <span class="token keyword">int</span> leftShift <span class="token operator">=</span> a <span class="token operator"><<</span> <span class="token number">2</span><span class="token punctuation">;</span><span class="token keyword">final</span> <span class="token keyword">int</span> unsignedRightShift <span class="token operator">=</span> a <span class="token operator">>>></span> <span class="token number">2</span><span class="token punctuation">;</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">val</span> andResult <span class="token operator">=</span> a <span class="token operator">and</span> b<span class="token keyword">val</span> orResult <span class="token operator">=</span> a <span class="token operator">or</span> b<span class="token keyword">val</span> xorResult <span class="token operator">=</span> a <span class="token operator">xor</span> b<span class="token keyword">val</span> rightShift <span class="token operator">=</span> a <span class="token operator">shr</span> <span class="token number">2</span><span class="token keyword">val</span> leftShift <span class="token operator">=</span> a <span class="token operator">shl</span> <span class="token number">2</span><span class="token keyword">val</span> unsignedRightShift <span class="token operator">=</span> a <span class="token operator">ushr</span> <span class="token number">2</span></code></pre><hr><h2 id="类型判断和转换-声明式"><a href="#类型判断和转换-声明式" class="headerlink" title="类型判断和转换 (声明式)"></a>类型判断和转换 (声明式)</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">if</span> <span class="token punctuation">(</span>object <span class="token keyword">instanceof</span> <span class="token class-name">Car</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token class-name">Car</span> car <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Car</span><span class="token punctuation">)</span> object<span class="token punctuation">;</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">object</span> <span class="token keyword">is</span> Car<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token keyword">var</span> car <span class="token operator">=</span> <span class="token keyword">object</span> <span class="token keyword">as</span> Car</code></pre><hr><h2 id="类型判断和转换-隐式"><a href="#类型判断和转换-隐式" class="headerlink" title="类型判断和转换 (隐式)"></a>类型判断和转换 (隐式)</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">if</span> <span class="token punctuation">(</span>object <span class="token keyword">instanceof</span> <span class="token class-name">Car</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">Car</span> car <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Car</span><span class="token punctuation">)</span> object<span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">object</span> <span class="token keyword">is</span> Car<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> car <span class="token operator">=</span> <span class="token keyword">object</span> <span class="token comment">// 聪明的转换</span><span class="token punctuation">}</span></code></pre><hr><h2 id="多重条件"><a href="#多重条件" class="headerlink" title="多重条件"></a>多重条件</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">if</span> <span class="token punctuation">(</span>score <span class="token operator">>=</span> <span class="token number">0</span> <span class="token operator">&&</span> score <span class="token operator"><=</span> <span class="token number">300</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">if</span> <span class="token punctuation">(</span>score <span class="token keyword">in</span> <span class="token number">0</span><span class="token operator">..</span><span class="token number">300</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span></code></pre><hr><h2 id="更灵活的case语句"><a href="#更灵活的case语句" class="headerlink" title="更灵活的case语句"></a>更灵活的case语句</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">int</span> score <span class="token operator">=</span> <span class="token comment">// some score;</span><span class="token class-name">String</span> grade<span class="token punctuation">;</span><span class="token keyword">switch</span> <span class="token punctuation">(</span>score<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> <span class="token number">10</span><span class="token operator">:</span> <span class="token keyword">case</span> <span class="token number">9</span><span class="token operator">:</span> grade <span class="token operator">=</span> <span class="token string">"Excellent"</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token number">8</span><span class="token operator">:</span> <span class="token keyword">case</span> <span class="token number">7</span><span class="token operator">:</span> <span class="token keyword">case</span> <span class="token number">6</span><span class="token operator">:</span> grade <span class="token operator">=</span> <span class="token string">"Good"</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token number">5</span><span class="token operator">:</span> <span class="token keyword">case</span> <span class="token number">4</span><span class="token operator">:</span> grade <span class="token operator">=</span> <span class="token string">"OK"</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token number">3</span><span class="token operator">:</span> <span class="token keyword">case</span> <span class="token number">2</span><span class="token operator">:</span> <span class="token keyword">case</span> <span class="token number">1</span><span class="token operator">:</span> grade <span class="token operator">=</span> <span class="token string">"Fail"</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">default</span><span class="token operator">:</span> grade <span class="token operator">=</span> <span class="token string">"Fail"</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">var</span> score <span class="token operator">=</span> <span class="token comment">// some score</span><span class="token keyword">var</span> grade <span class="token operator">=</span> <span class="token keyword">when</span> <span class="token punctuation">(</span>score<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">10</span> <span class="token operator">-></span> <span class="token string-literal singleline"><span class="token string">"Excellent"</span></span> <span class="token keyword">in</span> <span class="token number">6</span><span class="token operator">..</span><span class="token number">8</span> <span class="token operator">-></span> <span class="token string-literal singleline"><span class="token string">"Good"</span></span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span> <span class="token operator">-></span> <span class="token string-literal singleline"><span class="token string">"OK"</span></span> <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">..</span><span class="token number">3</span> <span class="token operator">-></span> <span class="token string-literal singleline"><span class="token string">"Fail"</span></span> <span class="token keyword">else</span> <span class="token operator">-></span> <span class="token string-literal singleline"><span class="token string">"Fail"</span></span><span class="token punctuation">}</span></code></pre><hr><h2 id="for循环"><a href="#for循环" class="headerlink" title="for循环"></a>for循环</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> <span class="token number">10</span> <span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span> <span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span> i <span class="token operator">>=</span> <span class="token number">0</span> <span class="token punctuation">;</span> i<span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> <span class="token number">10</span> <span class="token punctuation">;</span> i<span class="token operator">+=</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span> i <span class="token operator">>=</span> <span class="token number">0</span> <span class="token punctuation">;</span> i<span class="token operator">-=</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">String</span> item <span class="token operator">:</span> collection<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">Map<span class="token punctuation">.</span>Entry</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">></span></span> entry<span class="token operator">:</span> map<span class="token punctuation">.</span><span class="token function">entrySet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">..</span><span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span> until <span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">10</span> downTo <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">..</span><span class="token number">10</span> step <span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">10</span> downTo <span class="token number">0</span> step <span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token keyword">for</span> <span class="token punctuation">(</span>item <span class="token keyword">in</span> collection<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span> value<span class="token punctuation">)</span> <span class="token keyword">in</span> map<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span></code></pre><hr><h2 id="更方便的集合操作"><a href="#更方便的集合操作" class="headerlink" title="更方便的集合操作"></a>更方便的集合操作</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">final</span> <span class="token class-name">List</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Integer</span><span class="token punctuation">></span></span> listOfNumber <span class="token operator">=</span> <span class="token class-name">Arrays</span><span class="token punctuation">.</span><span class="token function">asList</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">final</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Integer</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">></span></span> keyValue <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Integer</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>map<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token string">"Amit"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>map<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token string">"Ali"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>map<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token string">"Mindorks"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// Java 9</span><span class="token keyword">final</span> <span class="token class-name">List</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Integer</span><span class="token punctuation">></span></span> listOfNumber <span class="token operator">=</span> <span class="token class-name">List</span><span class="token punctuation">.</span><span class="token function">of</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">final</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Integer</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">></span></span> keyValue <span class="token operator">=</span> <span class="token class-name">Map</span><span class="token punctuation">.</span><span class="token function">of</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token string">"Amit"</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token string">"Ali"</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token string">"Mindorks"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">val</span> listOfNumber <span class="token operator">=</span> <span class="token function">listOf</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token keyword">val</span> keyValue <span class="token operator">=</span> <span class="token function">mapOf</span><span class="token punctuation">(</span><span class="token number">1</span> <span class="token keyword">to</span> <span class="token string-literal singleline"><span class="token string">"Amit"</span></span><span class="token punctuation">,</span> <span class="token number">2</span> <span class="token keyword">to</span> <span class="token string-literal singleline"><span class="token string">"Ali"</span></span><span class="token punctuation">,</span> <span class="token number">3</span> <span class="token keyword">to</span> <span class="token string-literal singleline"><span class="token string">"Mindorks"</span></span><span class="token punctuation">)</span></code></pre><hr><h2 id="遍历"><a href="#遍历" class="headerlink" title="遍历"></a>遍历</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token comment">// Java 7 and below</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">Car</span> car <span class="token operator">:</span> cars<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>car<span class="token punctuation">.</span>speed<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">// Java 8+</span>cars<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span>car <span class="token operator">-></span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>car<span class="token punctuation">.</span>speed<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// Java 7 and below</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">Car</span> car <span class="token operator">:</span> cars<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>car<span class="token punctuation">.</span>speed <span class="token operator">></span> <span class="token number">100</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>car<span class="token punctuation">.</span>speed<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment">// Java 8+</span>cars<span class="token punctuation">.</span><span class="token function">stream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span>car <span class="token operator">-></span> car<span class="token punctuation">.</span>speed <span class="token operator">></span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span>car <span class="token operator">-></span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>car<span class="token punctuation">.</span>speed<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin">cars<span class="token punctuation">.</span><span class="token function">forEach</span> <span class="token punctuation">{</span> <span class="token function">println</span><span class="token punctuation">(</span>it<span class="token punctuation">.</span>speed<span class="token punctuation">)</span><span class="token punctuation">}</span>cars<span class="token punctuation">.</span><span class="token function">filter</span> <span class="token punctuation">{</span> it<span class="token punctuation">.</span>speed <span class="token operator">></span> <span class="token number">100</span> <span class="token punctuation">}</span> <span class="token punctuation">.</span><span class="token function">forEach</span> <span class="token punctuation">{</span> <span class="token function">println</span><span class="token punctuation">(</span>it<span class="token punctuation">.</span>speed<span class="token punctuation">)</span><span class="token punctuation">}</span></code></pre><hr><h2 id="方法定义"><a href="#方法定义" class="headerlink" title="方法定义"></a>方法定义</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">void</span> <span class="token function">doSomething</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// logic here</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">doSomething</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> numbers<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// logic here</span><span class="token punctuation">}</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">fun</span> <span class="token function">doSomething</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// logic here</span><span class="token punctuation">}</span><span class="token keyword">fun</span> <span class="token function">doSomething</span><span class="token punctuation">(</span><span class="token keyword">vararg</span> numbers<span class="token operator">:</span> Int<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// logic here</span><span class="token punctuation">}</span></code></pre><hr><h2 id="带返回值的方法"><a href="#带返回值的方法" class="headerlink" title="带返回值的方法"></a>带返回值的方法</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">int</span> <span class="token function">getScore</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// logic here</span> <span class="token keyword">return</span> score<span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">fun</span> <span class="token function">getScore</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> Int <span class="token punctuation">{</span> <span class="token comment">// logic here</span> <span class="token keyword">return</span> score<span class="token punctuation">}</span><span class="token comment">// as a single-expression function</span><span class="token keyword">fun</span> <span class="token function">getScore</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> Int <span class="token operator">=</span> score</code></pre><hr><h2 id="无结束符号"><a href="#无结束符号" class="headerlink" title="无结束符号"></a>无结束符号</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">int</span> <span class="token function">getScore</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// logic here</span> <span class="token keyword">return</span> <span class="token number">2</span> <span class="token operator">*</span> value<span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">fun</span> <span class="token function">getScore</span><span class="token punctuation">(</span>value<span class="token operator">:</span> Int<span class="token punctuation">)</span><span class="token operator">:</span> Int <span class="token punctuation">{</span> <span class="token comment">// logic here</span> <span class="token keyword">return</span> <span class="token number">2</span> <span class="token operator">*</span> value<span class="token punctuation">}</span><span class="token comment">// as a single-expression function</span><span class="token keyword">fun</span> <span class="token function">getScore</span><span class="token punctuation">(</span>value<span class="token operator">:</span> Int<span class="token punctuation">)</span><span class="token operator">:</span> Int <span class="token operator">=</span> <span class="token number">2</span> <span class="token operator">*</span> value</code></pre><hr><h2 id="constructor-构造器"><a href="#constructor-构造器" class="headerlink" title="constructor 构造器"></a>constructor 构造器</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Utils</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token class-name">Utils</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// This utility class is not publicly instantiable </span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">int</span> <span class="token function">getScore</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token number">2</span> <span class="token operator">*</span> value<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">class</span> Utils <span class="token keyword">private</span> <span class="token keyword">constructor</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">companion</span> <span class="token keyword">object</span> <span class="token punctuation">{</span> <span class="token keyword">fun</span> <span class="token function">getScore</span><span class="token punctuation">(</span>value<span class="token operator">:</span> Int<span class="token punctuation">)</span><span class="token operator">:</span> Int <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token number">2</span> <span class="token operator">*</span> value <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment">// another way</span><span class="token keyword">object</span> Utils <span class="token punctuation">{</span> <span class="token keyword">fun</span> <span class="token function">getScore</span><span class="token punctuation">(</span>value<span class="token operator">:</span> Int<span class="token punctuation">)</span><span class="token operator">:</span> Int <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token number">2</span> <span class="token operator">*</span> value <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><hr><h2 id="Get-Set-构造器"><a href="#Get-Set-构造器" class="headerlink" title="Get Set 构造器"></a>Get Set 构造器</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Developer</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token class-name">String</span> name<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">int</span> age<span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token class-name">Developer</span><span class="token punctuation">(</span><span class="token class-name">String</span> name<span class="token punctuation">,</span> <span class="token keyword">int</span> age<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>age <span class="token operator">=</span> age<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> name<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setName</span><span class="token punctuation">(</span><span class="token class-name">String</span> name<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">getAge</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> age<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setAge</span><span class="token punctuation">(</span><span class="token keyword">int</span> age<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>age <span class="token operator">=</span> age<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">equals</span><span class="token punctuation">(</span><span class="token class-name">Object</span> o<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span> <span class="token operator">==</span> o<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>o <span class="token operator">==</span> <span class="token keyword">null</span> <span class="token operator">||</span> <span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> o<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token class-name">Developer</span> developer <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Developer</span><span class="token punctuation">)</span> o<span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>age <span class="token operator">!=</span> developer<span class="token punctuation">.</span>age<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token keyword">return</span> name <span class="token operator">!=</span> <span class="token keyword">null</span> <span class="token operator">?</span> name<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>developer<span class="token punctuation">.</span>name<span class="token punctuation">)</span> <span class="token operator">:</span> developer<span class="token punctuation">.</span>name <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">hashCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> result <span class="token operator">=</span> name <span class="token operator">!=</span> <span class="token keyword">null</span> <span class="token operator">?</span> name<span class="token punctuation">.</span><span class="token function">hashCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span> result <span class="token operator">=</span> <span class="token number">31</span> <span class="token operator">*</span> result <span class="token operator">+</span> age<span class="token punctuation">;</span> <span class="token keyword">return</span> result<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string">"Developer{"</span> <span class="token operator">+</span> <span class="token string">"name='"</span> <span class="token operator">+</span> name <span class="token operator">+</span> <span class="token char">'\''</span> <span class="token operator">+</span> <span class="token string">", age="</span> <span class="token operator">+</span> age <span class="token operator">+</span> <span class="token char">'}'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">data</span> <span class="token keyword">class</span> <span class="token function">Developer</span><span class="token punctuation">(</span><span class="token keyword">val</span> name<span class="token operator">:</span> String<span class="token punctuation">,</span> <span class="token keyword">val</span> age<span class="token operator">:</span> Int<span class="token punctuation">)</span></code></pre><hr><h2 id="原型扩展"><a href="#原型扩展" class="headerlink" title="原型扩展"></a>原型扩展</h2><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Utils</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token class-name">Utils</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// This utility class is not publicly instantiable </span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">int</span> <span class="token function">triple</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token number">3</span> <span class="token operator">*</span> value<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token keyword">int</span> result <span class="token operator">=</span> <span class="token class-name">Utils</span><span class="token punctuation">.</span><span class="token function">triple</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">fun</span> Int<span class="token punctuation">.</span><span class="token function">triple</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> Int <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span> <span class="token operator">*</span> <span class="token number">3</span><span class="token punctuation">}</span><span class="token keyword">var</span> result <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">.</span><span class="token function">triple</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre><ul><li>Java</li></ul><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Direction</span> <span class="token punctuation">{</span> <span class="token function">NORTH</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">SOUTH</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">WEST</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">EAST</span><span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> direction<span class="token punctuation">;</span> <span class="token class-name">Direction</span><span class="token punctuation">(</span><span class="token keyword">int</span> direction<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>direction <span class="token operator">=</span> direction<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">getDirection</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> direction<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code></pre><ul><li>Kotlin</li></ul><pre class="language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token keyword">enum</span> <span class="token keyword">class</span> <span class="token function">Direction</span><span class="token punctuation">(</span><span class="token keyword">val</span> direction<span class="token operator">:</span> Int<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">NORTH</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">SOUTH</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">WEST</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">EAST</span><span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre>]]></content>
<summary type="html"><p>[TOC]</p>
<p><a href="https://github.com/MindorksOpenSource/from-java-to-kotlin/blob/master/README-ZH.md">From Java To Kotlin</a></p>
<h2</summary>
<category term="分享" scheme="https://darksheep404.github.io/categories/%E5%88%86%E4%BA%AB/"/>
<category term="指南" scheme="https://darksheep404.github.io/tags/%E6%8C%87%E5%8D%97/"/>
<category term="java" scheme="https://darksheep404.github.io/tags/java/"/>
</entry>
</feed>