-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathsearch.xml
5793 lines (4627 loc) · 626 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title><![CDATA[高并发Web项目]]></title>
<url>/2020/04/08/high-performance-web-application/</url>
<content type="html"><![CDATA[<h4 id="Load-average"><a href="#Load-average" class="headerlink" title="Load average"></a>Load average</h4><p>负载对应的是一个数字:<code>load average: 1.02 1.04 1.30</code>,它们分别表示:1分钟、5分钟、15分钟内系统的平均负载。这里面最关键的是15分钟负载,相对于1分钟反应的是短时状况,它反应的是一定时间的压力。</p>
<p>可以将一个cpu内核理解为一条车道,负载为0表示无车,0.5表示车道内有一半的车,1表示车道内已经开满了车,超过1则表示已经有车在等待进入车道。所以对于一个内核,负载不要长期超过1。</p>
<p>如果有多个物理cpu,每个cpu又有多个内核,则不应该超过的负载为:<code>cpu数 x 内核数</code></p>
<p><strong>OSX</strong>:</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 查看负载</span></span><br><span class="line"><span class="meta">></span><span class="bash"> sysctl -n vm.loadavg</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看cpu</span></span><br><span class="line"><span class="meta">></span><span class="bash"> sysctl machdep.cpu</span></span><br></pre></td></tr></table></figure>
<p>查看CPU重要的参数是:</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> CPU 内核数</span></span><br><span class="line">machdep.cpu.core_count: 4 </span><br><span class="line">machdep.cpu.thread_count: 8</span><br></pre></td></tr></table></figure>
<p><strong>Linux</strong>:</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 查看负载</span></span><br><span class="line"><span class="meta">></span><span class="bash"> top</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看cpu</span></span><br><span class="line"><span class="meta">></span><span class="bash"> cat /proc/cpuinfo</span></span><br></pre></td></tr></table></figure>
<h3 id="Tomcat-优化配置"><a href="#Tomcat-优化配置" class="headerlink" title="Tomcat 优化配置"></a>Tomcat 优化配置</h3><p><strong>maxThreads</strong>:允许的最大线程数,默认值为200</p>
<p><strong>acceptCount</strong>:当请求数超过最大线程数时,接受排队的请求个数,默认值为100</p>
<ul>
<li>如果设的较小,超出的请求会就直接被拒绝</li>
<li>如果设的较大,可能就会出现大量的请求超时</li>
</ul>
<blockquote>
<p>As a general rule of thumb, a lightweight, high performance application should look at using a maximum of 150 (accept) threads per CPU core (so a total of 600 on a 4 core box). A more conservative setting, for more heavyweight applications would be 300 accept threads. I’d expect most requirements to be somewhere around the middle (but this will need some analysis), but this is highly situational </p>
</blockquote>
<h3 id="JMeter"><a href="#JMeter" class="headerlink" title="JMeter"></a>JMeter</h3><p><strong>TPS</strong>:Transaction Per Second 事务处理能力,每秒处理事物数(打开页面、登录、选择商品、加入购物车、下单、付款)</p>
<p>主要功能模块:</p>
<ul>
<li>取样器:进行脚本逻辑控制。</li>
<li>线程组:压测场景控制。</li>
<li>监视器:监控压测运行,获取性能指标。</li>
</ul>
<h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ul>
<li><a href="https://www.ruanyifeng.com/blog/2011/07/linux_load_average_explained.html" target="_blank" rel="noopener">理解Linux系统负荷</a></li>
<li><a href="http://www.iocoder.cn/Performance-Testing/Tomcat-Jetty-Undertow-benchmark/" target="_blank" rel="noopener">性能测试 —— Tomcat、Jetty、Undertow 基准测试</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/96692243" target="_blank" rel="noopener">干货收藏!史上最强 Tomcat 8 性能优化来啦!| 原力计划</a></li>
<li></li>
</ul>
]]></content>
<categories>
<category> 高并发 </category>
</categories>
<tags>
<tag> web应用 </tag>
<tag> 高并发 </tag>
</tags>
</entry>
<entry>
<title><![CDATA[编译 Chromium WebView]]></title>
<url>/2020/04/04/build-android-webview-by-chromium/</url>
<content type="html"><![CDATA[<h4 id="在线代码"><a href="#在线代码" class="headerlink" title="在线代码"></a>在线代码</h4><p><a href="https://juejin.im/post/5a94f9d15188257a63113a74" target="_blank" rel="noopener">如何设计一个优雅健壮的Android WebView?</a></p>
<p><a href="https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/build-instructions.md" target="_blank" rel="noopener">Chromium build webview 说明</a></p>
<p><a href="https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/quick-start.md" target="_blank" rel="noopener">Google WebView quick start</a></p>
<h4 id="Chromium-Android-WebView"><a href="#Chromium-Android-WebView" class="headerlink" title="Chromium Android WebView"></a>Chromium Android WebView</h4><p><a href="https://www.zybuluo.com/rogeryi/note/23693" target="_blank" rel="noopener">本文</a>讲述如何对 Chromium Content 进行封装,对外提供一个封装好的 Android View - WebView 供第三方应用使用。代码涉及 Android WebView 和 Chromium Content 模块其中的一部分。</p>
<h4 id="Android-AdvancedWebView"><a href="#Android-AdvancedWebView" class="headerlink" title="Android-AdvancedWebView"></a>Android-AdvancedWebView</h4><p>一个比较早的开源项目,查看<a href="https://github.com/delight-im/Android-AdvancedWebView" target="_blank" rel="noopener">这里</a></p>
]]></content>
<categories>
<category> 浏览器 </category>
</categories>
<tags>
<tag> 浏览器 </tag>
<tag> Chromium </tag>
</tags>
</entry>
<entry>
<title><![CDATA[编译 Firfox]]></title>
<url>/2020/03/28/build-firefox/</url>
<content type="html"><![CDATA[<h4 id="在线代码"><a href="#在线代码" class="headerlink" title="在线代码"></a>在线代码</h4><p>从<a href="https://hg.mozilla.org/mozilla-central/file/tip/netwerk/socket" target="_blank" rel="noopener">这里</a>在线浏览代码。</p>
<h4 id="tarball"><a href="#tarball" class="headerlink" title="tarball"></a>tarball</h4><p>tarball 是代码仓库的快照,打包了某个版本的全部代码,因为做了压缩,比直接<code>clone</code>下载的数据量更小,速度更稳定,也多了断点续传。国内推荐用这种方式下载,参考<a href="https://hg.cdn.mozilla.net/" target="_blank" rel="noopener">这里</a>。下载后解压成仓库的流程参考这里:<a href="https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Source_Code/Mercurial/Bundles" target="_blank" rel="noopener">解压 bundle</a>。</p>
<h4 id="Mozconfig"><a href="#Mozconfig" class="headerlink" title="Mozconfig"></a>Mozconfig</h4><p>一些编译时的配置需要放到 Mozconfig 文件里,参考<a href="https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Configuring_Build_Options" target="_blank" rel="noopener">这里</a>。</p>
<h4 id="编译"><a href="#编译" class="headerlink" title="编译"></a>编译</h4><p>编译流程参考:<a href="https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Simple_Firefox_build/Linux_and_MacOS_build_preparation" target="_blank" rel="noopener">这里</a>。</p>
<p>其中遇到一些技术点:</p>
<p><strong>artifact</strong>:这种方式不用编译C++相关的代码,编译速度更快。适合于面向 Java 语言的开发者。</p>
<h4 id="Developer-guide"><a href="#Developer-guide" class="headerlink" title="Developer guide"></a>Developer guide</h4><p>和 Firefox 开发相关的说明全在<a href="https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide" target="_blank" rel="noopener">这里</a>。</p>
<h4 id="Working-with-Mozilla-source-code"><a href="#Working-with-Mozilla-source-code" class="headerlink" title="Working with Mozilla source code"></a>Working with Mozilla source code</h4><p>和 Mozilla 代码相关的说明全在<a href="https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Source_Code" target="_blank" rel="noopener">这里</a>。包括如何检出代码,提交代码,编译等。</p>
<h4 id="Mozilla-Source-Code-Directory-Structure"><a href="#Mozilla-Source-Code-Directory-Structure" class="headerlink" title="Mozilla Source Code Directory Structure"></a>Mozilla Source Code Directory Structure</h4><p>源码目录结构,当你需要进一步熟悉各模块时,首先要区分都有哪些模块,参考:<a href="https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Source_Code/Directory_structure" target="_blank" rel="noopener">这里</a>。一般我比较关心的几个模块:</p>
<p><strong>browser</strong>:这里是浏览器的界面和主题相关代码</p>
<p><strong>netwerk</strong>:网络套件库,也叫 Necko</p>
<p><strong>security</strong>:包含 <code>NSS</code> 和 <code>PSM</code> 两套安全套件,<code>NSS</code> 包含了用于 SSL 的密码算法</p>
<p><strong>view</strong>:一套跨平台的 UI 组件库,承担绘图、事件处理、滚动、透明化等</p>
<p><strong>widget</strong>:它是 <code>view</code> 的宿主,是 <code>view</code> 与操作系统原生的 UI 系统的枢纽</p>
<h4 id="网络层-Necko"><a href="#网络层-Necko" class="headerlink" title="网络层 Necko"></a>网络层 Necko</h4><p><a href="https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Necko" target="_blank" rel="noopener">Necko</a> 是一个跨平台的网络库,提供了网络多层的接口。</p>
<h4 id="使用-GDB-调试"><a href="#使用-GDB-调试" class="headerlink" title="使用 GDB 调试"></a>使用 GDB 调试</h4><p>关于一些使用上可能遇到的问题,请参考<a href="https://developer.mozilla.org/en-US/docs/Mozilla/Debugging/Debugging_Mozilla_with_gdb" target="_blank" rel="noopener">这里</a></p>
]]></content>
<categories>
<category> 浏览器 </category>
</categories>
<tags>
<tag> firefox </tag>
<tag> 浏览器 </tag>
</tags>
</entry>
<entry>
<title><![CDATA[命令行编译 Java]]></title>
<url>/2019/12/01/add-comment-to-hibernate/</url>
<content type="html"><![CDATA[<h4 id="编译-Java"><a href="#编译-Java" class="headerlink" title="编译 Java"></a>编译 Java</h4><p>If you are using the Hibernate native API, then you need to use the Query#setComment method like this:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">List<Person> persons = (List<Person>) session.createQuery(</span><br><span class="line"> <span class="string">"select p "</span> +</span><br><span class="line"> <span class="string">"from Person p "</span>)</span><br><span class="line">.setComment( <span class="string">"t95=firstdraft"</span> )</span><br><span class="line">.list();</span><br></pre></td></tr></table></figure>
<h4 id="运行"><a href="#运行" class="headerlink" title="运行"></a>运行</h4><p>If you are using JPA, then you can use a QueryHint:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">List<Person> persons = entityManager.createQuery(</span><br><span class="line"> <span class="string">"select p "</span> +</span><br><span class="line"> <span class="string">"from Person p "</span>, Person.class)</span><br><span class="line">.setHint( <span class="string">"org.hibernate.comment"</span>, <span class="string">"t95=firstdraft"</span> )</span><br><span class="line">.getResultList();</span><br></pre></td></tr></table></figure>
<p><a href="https://vladmihalcea.com/hibernate-statementinspector/" target="_blank" rel="noopener">How to intercept and modify SQL queries with the Hibernate StatementInspector</a></p>
]]></content>
<categories>
<category> Java </category>
</categories>
<tags>
<tag> java </tag>
</tags>
</entry>
<entry>
<title><![CDATA[命令行编译 Java]]></title>
<url>/2019/11/28/build-java-in-command-line/</url>
<content type="html"><![CDATA[<h4 id="编译-Java"><a href="#编译-Java" class="headerlink" title="编译 Java"></a>编译 Java</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -d 创建目录结构</span></span><br><span class="line">% javac -d . <filename.java></span><br></pre></td></tr></table></figure>
<h4 id="运行"><a href="#运行" class="headerlink" title="运行"></a>运行</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Linux & Mac</span></span><br><span class="line">% java -cp jarname.jar: package.ClassName </span><br><span class="line"></span><br><span class="line"><span class="comment"># Windows CMD</span></span><br><span class="line">% java -cp jarname.jar;. package.ClassName</span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category> Java </category>
</categories>
<tags>
<tag> java </tag>
</tags>
</entry>
<entry>
<title><![CDATA[编译 Mac cef 2623]]></title>
<url>/2019/10/07/build-mac-cef/</url>
<content type="html"><![CDATA[<blockquote>
<p>Fixed gclient_util after depot_tools changes</p>
</blockquote>
<p>解决办法:<a href="https://bitbucket.org/chromiumembedded/cef/pull-requests/251/fixed-gclient_util-after-depot_tools/diff" target="_blank" rel="noopener">这里</a></p>
]]></content>
<categories>
<category> cef </category>
</categories>
<tags>
<tag> cef </tag>
<tag> MacOS </tag>
</tags>
</entry>
<entry>
<title><![CDATA[VMware 安装 MacOS 流程]]></title>
<url>/2019/10/04/vmware-install-macos/</url>
<content type="html"><![CDATA[<h3 id="一、安装流程"><a href="#一、安装流程" class="headerlink" title="一、安装流程"></a>一、安装流程</h3><ol>
<li>安装 VMware</li>
<li>安装 MacOS 解锁工具</li>
<li>安装 MacOS 系统</li>
<li>配置虚拟机硬件参数</li>
</ol>
<p>下面有几个说明文章比较详细,基本按照步骤操作就可成功:</p>
<ul>
<li><a href="http://www.carrotchou.blog/18689.html" target="_blank" rel="noopener">VMware 虚拟机安装 macOS 10.14 教程</a></li>
<li><a href="https://www.w3h5.com/post/236.html" target="_blank" rel="noopener">VMware虚拟机安装黑苹果MacOS Mojave系统详细教程</a></li>
</ul>
<h3 id="二、常见问题"><a href="#二、常见问题" class="headerlink" title="二、常见问题"></a>二、常见问题</h3><blockquote>
<ol>
<li>新建虚拟机找不到 MAC 系统选项</li>
</ol>
</blockquote>
<p>解决:安装 MacOS 虚拟机解锁工具,从<a href="https://github.com/DrDonk/unlocker" target="_blank" rel="noopener">这里</a>下载。</p>
<blockquote>
<ol>
<li>苹果虚拟机启动花屏</li>
</ol>
</blockquote>
<p>解决:安装 MacOS 虚拟机解锁工具,从<a href="https://github.com/DrDonk/unlocker" target="_blank" rel="noopener">这里</a>下载。</p>
<blockquote>
<ol>
<li>不能登录 App Store</li>
</ol>
</blockquote>
<p>解决:更新虚拟机硬件配置,修改虚拟机 <code>.vmx</code> 文件,参考<a href="https://blog.csdn.net/tsh123321/article/details/80222868" target="_blank" rel="noopener">这篇文章</a></p>
]]></content>
<categories>
<category> vmware </category>
</categories>
<tags>
<tag> vmware </tag>
<tag> MacOS </tag>
</tags>
</entry>
<entry>
<title><![CDATA[好喝的啤酒]]></title>
<url>/2019/07/25/beers/</url>
<content type="html"><![CDATA[<h3 id="IPA"><a href="#IPA" class="headerlink" title="IPA"></a>IPA</h3><p>Indian Pale Ale(印度淡色艾尔),当年英国殖民印度,需要从英国运送啤酒到印度,为了延长啤酒保存时间,就在酒内添加大量啤酒花,使啤酒在桶内发酵好几个月。在这个过程中糖分被消耗掉的酒体保存了高度的酒精含量,导致IPA看起来酒体清淡,其实酒花香气和苦度都非常高。</p>
<h3 id="LAGER(拉格)"><a href="#LAGER(拉格)" class="headerlink" title="LAGER(拉格)"></a>LAGER(拉格)</h3><p>源自德国,采用低温发酵法,酒体清淡泡沫丰富,是常见的工业啤酒酿造方法。一般来说普通工业啤酒基本上都是拉格,比如燕京,青岛,雪花。</p>
]]></content>
<categories>
<category> drink </category>
</categories>
<tags>
<tag> beer </tag>
<tag> drink </tag>
</tags>
</entry>
<entry>
<title><![CDATA[我的周]]></title>
<url>/2019/07/25/my-week-1/</url>
<content type="html"><![CDATA[<h3 id="做人的背景"><a href="#做人的背景" class="headerlink" title="做人的背景"></a>做人的背景</h3><blockquote>
<p>浪子回头金不换<br>晚节不保</p>
</blockquote>
]]></content>
<categories>
<category> week </category>
</categories>
<tags>
<tag> week </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Jitsi Meet 视频技术]]></title>
<url>/2019/07/12/jitsi-video/</url>
<content type="html"><![CDATA[<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> git push -u origin --tags</span></span><br></pre></td></tr></table></figure>
<p>收到下面的错误提示:</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"></span><br><span class="line">remote: GitLab: Failed to authorize your Git request: internal API unreachable </span><br><span class="line">To <...> </span><br><span class="line"> ! [remote rejected] origin/HEAD -> origin/HEAD (pre-receive hook declined) </span><br><span class="line"></span><br><span class="line">...</span><br></pre></td></tr></table></figure>
<a id="more"></a>
<p>从<a href="https://gitlab.com/gitlab-com/support-forum/issues/2683" target="_blank" rel="noopener">这里</a>找到了解决方案:</p>
<blockquote>
<p>取消选择组设置里的 LFS 一项:</p>
</blockquote>
<p><strong>操作步骤:</strong></p>
<ol>
<li>打开并编辑组:<code>https://<URL>/admin/groups/<GROUP>/edit</code></li>
<li>找到 <code>Large File Storage</code> 配置</li>
<li>取消选择下面一项:</li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[ ] Allow projects within this group to use Git LFS</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> jitsi </category>
</categories>
<tags>
<tag> webrtc </tag>
<tag> jitsi </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Gitlab Remote Rejected Error]]></title>
<url>/2019/06/13/gitlab-remote-reject-error/</url>
<content type="html"><![CDATA[<p>今天迁移一个项目到 Gitlab,前面一切正常,当推送标签时</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> git push -u origin --tags</span></span><br></pre></td></tr></table></figure>
<p>收到下面的错误提示:</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"></span><br><span class="line">remote: GitLab: Failed to authorize your Git request: internal API unreachable </span><br><span class="line">To <...> </span><br><span class="line"> ! [remote rejected] origin/HEAD -> origin/HEAD (pre-receive hook declined) </span><br><span class="line"></span><br><span class="line">...</span><br></pre></td></tr></table></figure>
<a id="more"></a>
<p>从<a href="https://gitlab.com/gitlab-com/support-forum/issues/2683" target="_blank" rel="noopener">这里</a>找到了解决方案:</p>
<blockquote>
<p>取消选择组设置里的 LFS 一项:</p>
</blockquote>
<p><strong>操作步骤:</strong></p>
<ol>
<li>打开并编辑组:<code>https://<URL>/admin/groups/<GROUP>/edit</code></li>
<li>找到 <code>Large File Storage</code> 配置</li>
<li>取消选择下面一项:</li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[ ] Allow projects within this group to use Git LFS</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> git </category>
</categories>
<tags>
<tag> git </tag>
<tag> gitlab </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Vim 用法小结]]></title>
<url>/2019/04/29/vim-usage/</url>
<content type="html"><![CDATA[<a id="more"></a>
<h3 id="插件"><a href="#插件" class="headerlink" title="插件"></a>插件</h3><h4 id="NERDTree"><a href="#NERDTree" class="headerlink" title="NERDTree"></a>NERDTree</h4><p><a href="https://github.com/scrooloose/nerdtree" target="_blank" rel="noopener">这里</a></p>
<p>窗口跳转:<code>Ctrl - W</code> → <code>Ctrl - h/j/k/l</code></p>
<h4 id="TagBar"><a href="#TagBar" class="headerlink" title="TagBar"></a>TagBar</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">#Linux</span><br><span class="line">sudo apt-get install ctags</span><br><span class="line">#MacOS</span><br><span class="line">brew install ctags</span><br></pre></td></tr></table></figure>
<p>安装</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Plugin 'majutsushi/tagbar'</span><br></pre></td></tr></table></figure>
<h3 id="SpaceVim"><a href="#SpaceVim" class="headerlink" title="SpaceVim"></a>SpaceVim</h3>]]></content>
<categories>
<category> vim </category>
</categories>
<tags>
<tag> vim </tag>
<tag> shell </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Chromium 模块]]></title>
<url>/2019/03/03/chromium-modules/</url>
<content type="html"><![CDATA[<table>
<thead>
<tr>
<th style="text-align:left">模块</th>
<th style="text-align:left">说明</th>
<th style="text-align:center">必要性</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">default_apps</td>
<td style="text-align:left">默认安装应用的目录</td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">default_apps/external_extensions.json</td>
<td style="text-align:left">默认安装的配置文件</td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">Extensions</td>
<td style="text-align:left">默认安装扩展的目录</td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">Extensions/external_extensions.json</td>
<td style="text-align:left">默认安装的扩展的配置文件</td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">Installer/chrmstp.exe</td>
<td style="text-align:left">chrome setup,和 setup.exe 完全一样 <sup>[1]</sup></td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">Installer/setup.exe</td>
<td style="text-align:left">安装文件,用于升级或卸载</td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">Locales</td>
<td style="text-align:left">多语言文件</td>
<td style="text-align:center">√</td>
</tr>
<tr>
<td style="text-align:left">VisualElements</td>
<td style="text-align:left">?</td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">WidevineCdm</td>
<td style="text-align:left">自带组件(component),Widevine Content Decryption Module,用于在HTML5视频网站播放DRM加密的视频,如netflix</td>
<td style="text-align:center">×?</td>
</tr>
<tr>
<td style="text-align:left">64.0.3282.186.manifest</td>
<td style="text-align:left">chrome 主清单文件</td>
<td style="text-align:center">√</td>
</tr>
<tr>
<td style="text-align:left">chrome.dll</td>
<td style="text-align:left">chrome 主模块</td>
<td style="text-align:center">√</td>
</tr>
<tr>
<td style="text-align:left">chrome.dll.sig</td>
<td style="text-align:left">签名文件?</td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">chrome.exe.sig</td>
<td style="text-align:left">签名文件?</td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">chrome_100_percent.pak</td>
<td style="text-align:left">1x 资源包</td>
<td style="text-align:center">√</td>
</tr>
<tr>
<td style="text-align:left">chrome_200_percent.pak</td>
<td style="text-align:left">2x 资源包</td>
<td style="text-align:center">√</td>
</tr>
<tr>
<td style="text-align:left">chrome_child.dll</td>
<td style="text-align:left">chrome 子进程模块?</td>
<td style="text-align:center">√</td>
</tr>
<tr>
<td style="text-align:left">chrome_child.dll.sig</td>
<td style="text-align:left">签名文件?</td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">chrome_elf.dll</td>
<td style="text-align:left">Chrome Early Loading Framework <sup>[2]</sup></td>
<td style="text-align:center">√</td>
</tr>
<tr>
<td style="text-align:left">chrome_watcher.dll</td>
<td style="text-align:left">Watcher进程加载 chrome_watcher.dll</td>
<td style="text-align:center">√</td>
</tr>
<tr>
<td style="text-align:left">d3dcompiler_43.dll</td>
<td style="text-align:left">required for Windows XP。 Direct3D HLSL Compiler for Redistribution</td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">d3dcompiler_47.dll</td>
<td style="text-align:left">required for Windows Vista and newer。 Direct3D HLSL Compiler for Redistribution</td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">eventlog_provider.dll</td>
<td style="text-align:left">windows 的事件日志</td>
<td style="text-align:center">√?</td>
</tr>
<tr>
<td style="text-align:left">ffmpeg.dll</td>
<td style="text-align:left">多媒体支持。如果不需要播放视频等</td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">icudtl.dat</td>
<td style="text-align:left">International Components for Unicode Data File Little Endian,ICU库是一个支持国际化,本地化的软件库<sup>[3]</sup></td>
<td style="text-align:center">√</td>
</tr>
<tr>
<td style="text-align:left">libegl.dll</td>
<td style="text-align:left"><a href="https://en.wikipedia.org/wiki/EGL_(API" target="_blank" rel="noopener">Embedded-System Graphics Library</a>) <sup>[4]</sup></td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">libglesv2.dll</td>
<td style="text-align:left"><a href="https://en.wikipedia.org/wiki/OpenGL_ES" target="_blank" rel="noopener">OpenGL for Embedded Systems (OpenGL ES or GLES)</a></td>
<td style="text-align:center">×</td>
</tr>
<tr>
<td style="text-align:left">nacl_irt_x86_64.nexe</td>
<td style="text-align:left">Native Client integrated-runtime</td>
<td style="text-align:center">√</td>
</tr>
<tr>
<td style="text-align:left">natives_blob.bin</td>
<td style="text-align:left">binary large object,V8 引擎需要的数据文件</td>
<td style="text-align:center">√</td>
</tr>
<tr>
<td style="text-align:left">resources.pak</td>
<td style="text-align:left">资源文件</td>
<td style="text-align:center">√</td>
</tr>
<tr>
<td style="text-align:left">snapshot_blob.bin</td>
<td style="text-align:left">binary large object,V8 引擎需要的数据文件</td>
<td style="text-align:center">√</td>
</tr>
<tr>
<td style="text-align:left">v8_context_snapshot.bin</td>
<td style="text-align:left">Create V8 contexts from a snapshot file. It will make the initializations of V8 contexts for 1.6-3 times faster.</td>
<td style="text-align:center">√</td>
</tr>
<tr>
<td style="text-align:left">wow_helper.exe</td>
<td style="text-align:left">win32与win64兼容工具</td>
<td style="text-align:center">√</td>
</tr>
</tbody>
</table>
<a id="more"></a>
<h3 id="浏览器支持"><a href="#浏览器支持" class="headerlink" title="浏览器支持"></a>浏览器支持</h3><p>Support for WebGL is present in: </p>
<ul>
<li>Firefox 4+</li>
<li>Google Chrome 9+</li>
<li>Opera 12+, Safari 5.1+</li>
<li>Internet Explorer 11+</li>
<li>Microsoft Edge build 10240+</li>
</ul>
<h3 id="References"><a href="#References" class="headerlink" title="References"></a>References</h3><ol>
<li>The Active Setup executable will be an identical copy of setup.exe; this is necessary because Windows’ installer detection heuristics (which include things like process name being “setup.exe”) will otherwise force elevation for non-admin users when setup.exe is launched. This is mitigated by adding requestedExecutionLevel=”asInvoker” to setup.exe’s manifest on Vista+, but there is no such manifest entry on Windows XP (which results in crbug.com/166473). TODO(gab): Rename setup.exe itself altogether and use the same binary for Active Setup.</li>
<li><a href="http://gclxry.com/chrome-early-loading-framework/" target="_blank" rel="noopener">Chrome Early Loading Framework</a></li>
<li><a href="http://apps.icu-project.org/datacustom/" target="_blank" rel="noopener">International Components for Unicode</a></li>
<li><a href="https://en.wikipedia.org/wiki/ANGLE_(software" target="_blank" rel="noopener">ANGLE(Almost Native Graphics Layer Engine)</a>)<br>/en.wikipedia.org/wiki/ANGLE_(software))</li>
<li><a href="https://bitbucket.org/chromiumembedded/cef/src/816f700d3ea42bedc5ca5a2314c27b761b69abc5/tools/distrib/win/README.redistrib.txt?at=master&fileviewer=file-view-default" target="_blank" rel="noopener">CEF redistrib</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API" target="_blank" rel="noopener">The WebGL API</a></li>
</ol>
]]></content>
<categories>
<category> chromium </category>
</categories>
<tags>
<tag> chromium </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Git 常用用法]]></title>
<url>/2019/02/21/git-usages/</url>
<content type="html"><![CDATA[<h3 id="1-导出-commit-修改的文件"><a href="#1-导出-commit-修改的文件" class="headerlink" title="1 导出 commit 修改的文件"></a>1 导出 commit 修改的文件</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id | xargs tar -rf export.tar</span><br></pre></td></tr></table></figure>
<p><strong>git diff:</strong></p>
<ul>
<li>-r $commit_id:Take a diff of the given commit to its parent(s) (including all subdirectories, not just the top directory)</li>
<li>–no-commit-id –name-only:只输出文件名,不输出 SHA1</li>
<li>–diff-filter=ACMRT:Only show files added, copied, modified, renamed or that had their type changed (eg. file → symlink) in this commit. This leaves out deleted files.</li>
</ul>
<p><strong>tar:</strong></p>
<ul>
<li>-r:添加文件到已经压缩的文件</li>
<li>-f:指定压缩文件</li>
</ul>
<a id="more"></a>
]]></content>
<categories>
<category> git </category>
</categories>
<tags>
<tag> git </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Laradock 配置 xdebug 与 phpstorm]]></title>
<url>/2019/02/20/mac-laradock-xdebug-phpstorm/</url>
<content type="html"><![CDATA[<h2 id="1-配置-Laradock"><a href="#1-配置-Laradock" class="headerlink" title="1 配置 Laradock"></a>1 配置 Laradock</h2><h3 id="1-1-修改-laradock-env"><a href="#1-1-修改-laradock-env" class="headerlink" title="1.1 修改 laradock/.env"></a>1.1 修改 laradock/.env</h3><p>打开 <code>.env</code> 文件,修改下列配置项:</p>
<figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">WORKSPACE_INSTALL_XDEBUG</span>=<span class="literal">true</span></span><br><span class="line"><span class="attr">PHP_FPM_INSTALL_XDEBUG</span>=<span class="literal">true</span></span><br></pre></td></tr></table></figure>
<h3 id="1-2-配置-laradock-php-fpm-xdebug-ini"><a href="#1-2-配置-laradock-php-fpm-xdebug-ini" class="headerlink" title="1.2 配置 laradock/php-fpm/xdebug.ini"></a>1.2 配置 laradock/php-fpm/xdebug.ini</h3><p>php-fpm 用于调试 php 的服务器模式,基于浏览器请求。</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">; <span class="doctag">NOTE:</span> The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)</span></span><br><span class="line"></span><br><span class="line"><span class="comment">; xdebug.remote_host=docker.for.mac.host.internal</span></span><br><span class="line"><span class="comment">; 这里要注意,很多文章说无须修改此项,但我的环境不行,必须配置</span></span><br><span class="line"><span class="comment">; 关于 host.docker.internal,请参考:https://docs.docker.com/docker-for-mac/networking/#there-is-no-docker0-bridge-on-macos</span></span><br><span class="line">xdebug.remote_host=host.docker.internal</span><br><span class="line">xdebug.remote_connect_back=0</span><br><span class="line"><span class="comment">; 配置端口号</span></span><br><span class="line">xdebug.remote_port=9001</span><br><span class="line"><span class="comment">; 配置 key</span></span><br><span class="line">xdebug.idekey=PHPSTORM</span><br><span class="line"></span><br><span class="line"><span class="comment">; 开启</span></span><br><span class="line">xdebug.remote_autostart=1</span><br><span class="line"><span class="comment">; 开启</span></span><br><span class="line">xdebug.remote_enable=1</span><br><span class="line">xdebug.cli_color=0</span><br><span class="line">xdebug.profiler_enable=0</span><br><span class="line">xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"</span><br><span class="line"></span><br><span class="line">xdebug.remote_handler=dbgp</span><br><span class="line">xdebug.remote_mode=req</span><br><span class="line"></span><br><span class="line">xdebug.var_display_max_children=-1</span><br><span class="line">xdebug.var_display_max_data=-1</span><br><span class="line">xdebug.var_display_max_depth=-1</span><br></pre></td></tr></table></figure>
<a id="more"></a>
<h3 id="1-3-配置-laradock-workspace-xdebug-ini"><a href="#1-3-配置-laradock-workspace-xdebug-ini" class="headerlink" title="1.3 配置 laradock/workspace/xdebug.ini"></a>1.3 配置 laradock/workspace/xdebug.ini</h3><p>workspace 用于调试 php 的命令行模式</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">; <span class="doctag">NOTE:</span> The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)</span></span><br><span class="line"></span><br><span class="line">xdebug.remote_host=host.docker.internal</span><br><span class="line">xdebug.remote_connect_back=0</span><br><span class="line">xdebug.remote_port=9001</span><br><span class="line">xdebug.idekey=PHPSTORM</span><br><span class="line"></span><br><span class="line">xdebug.remote_autostart=1</span><br><span class="line">xdebug.remote_enable=1</span><br><span class="line">xdebug.cli_color=0</span><br><span class="line">xdebug.profiler_enable=0</span><br><span class="line">xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"</span><br><span class="line"></span><br><span class="line">xdebug.remote_handler=dbgp</span><br><span class="line">xdebug.remote_mode=req</span><br><span class="line"></span><br><span class="line">xdebug.var_display_max_children=-1</span><br><span class="line">xdebug.var_display_max_data=-1</span><br><span class="line">xdebug.var_display_max_depth=-1</span><br></pre></td></tr></table></figure>
<h3 id="1-4-重新编译-php-fpm-和-workspace-容器"><a href="#1-4-重新编译-php-fpm-和-workspace-容器" class="headerlink" title="1.4 重新编译 php-fpm 和 workspace 容器"></a>1.4 重新编译 php-fpm 和 workspace 容器</h3><p><em>这里要注意,修改了 xdebug.ini 一定要重新编译容器</em></p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> docker-compose build --no-cache php-fpm workspace</span></span><br></pre></td></tr></table></figure>
<h3 id="1-5-重新启动容器"><a href="#1-5-重新启动容器" class="headerlink" title="1.5 重新启动容器"></a>1.5 重新启动容器</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> docker-compose up -d nginx</span></span><br></pre></td></tr></table></figure>
<h2 id="2-配置-PhpStorm"><a href="#2-配置-PhpStorm" class="headerlink" title="2 配置 PhpStorm"></a>2 配置 PhpStorm</h2><h3 id="2-1-配置-PHP"><a href="#2-1-配置-PHP" class="headerlink" title="2.1 配置 PHP"></a>2.1 配置 PHP</h3><p>打开 <code>Preferences > Languages & Frameworks > PHP</code></p>
<p><img src="/images/posts/xdebug/phpstorm1.png" alt=""></p>
<h3 id="2-2-配置-DBGp-Proxy"><a href="#2-2-配置-DBGp-Proxy" class="headerlink" title="2.2 配置 DBGp Proxy"></a>2.2 配置 DBGp Proxy</h3><p>打开 <code>Preferences > Languages & Frameworks > PHP > DBGp Proxy</code></p>
<p><img src="/images/posts/xdebug/phpstorm2.png" alt=""></p>
<h3 id="2-3-添加服务器"><a href="#2-3-添加服务器" class="headerlink" title="2.3 添加服务器"></a>2.3 添加服务器</h3><p>打开 <code>Preferences > Languages & Frameworks > PHP > Server</code></p>
<p><img src="/images/posts/xdebug/phpstorm3.png" alt=""></p>
]]></content>
<categories>
<category> php </category>
</categories>
<tags>
<tag> php </tag>
<tag> laradock </tag>
<tag> phpstorm </tag>
</tags>
</entry>
<entry>
<title><![CDATA[聊聊 WebRTC]]></title>
<url>/2019/02/16/webrtc-server/</url>
<content type="html"><![CDATA[<p>Web Real-Time Communication(Web实时通信,WebRTC)由一组标准、协议和JavaScript API组成,用于实现浏览器之间(端到端)的音频、视频及数据共享。WebRTC使得实时通信变成一种标准功能,任何Web应用都无需借助第三方插件和专有软件,而是通过简单地JavaScript API即可完成。</p>
<h2 id="名词"><a href="#名词" class="headerlink" title="名词"></a>名词</h2><h3 id="1-STUN"><a href="#1-STUN" class="headerlink" title="1 STUN"></a>1 STUN</h3><p>Session Traversal Utilities for NAT (STUN) – RFC 5389</p>
<h3 id="2-TURN"><a href="#2-TURN" class="headerlink" title="2 TURN"></a>2 TURN</h3><p><strong>中继方式 NAT 穿透</strong>(Traversal Using Relay NAT (TURN) – RFC 5766)</p>
<h3 id="3-ICE"><a href="#3-ICE" class="headerlink" title="3 ICE"></a>3 ICE</h3><p><strong>交互式连接建立</strong>(Interactive Connectivity Establishment (ICE) – RFC 5245)</p>
<p>一种综合性的NAT穿越技术,它是一种框架,可以整合各种NAT穿越技术如STUN、TURN(Traversal Using Relay NAT 中继NAT实现的穿透)。ICE会先使用STUN,尝试建立一个基于UDP的连接,如果失败了,就会去TCP(先尝试HTTP,然后尝试HTTPS),如果依旧失败ICE就会使用一个中继的TURN服务器。</p>
<p>通信的两侧可能会处于不同的网络环境中,有时会存在好几层的访问控制、防火墙、路由跳转,所以我们需要一种方法在复杂的网络环境中找到对方,并且连接到相应的目标。WebRTC 使用集成了 STUN、TURN 的 ICE 来进行双方的数据通信。</p>
<a id="more"></a>
<h3 id="4-SDP"><a href="#4-SDP" class="headerlink" title="4 SDP"></a>4 SDP</h3><p><strong>会话描述协议</strong>(Session Description Protocol)</p>
<p>为了连接到其他用户,我们必须要对其他用户的设备情况有所了解,比如音频视频的编码解码器、使用何种编码格式、使用何种网络、设备的数据处理能力,所以我们需要一张“名片”来获得用户的所有信息,而 SDP 为我们提供了这些功能。</p>
<p>一个 SDP 的握手由一个 offer 和一个 answer 组成。</p>
<h3 id="5-RTCPeerConnection-对象"><a href="#5-RTCPeerConnection-对象" class="headerlink" title="5 RTCPeerConnection 对象"></a>5 RTCPeerConnection 对象</h3><p>RTCPeerConnection 对象是 WebRTC API 的入口,它负责创建、维护一个 WebRTC 连接,以及在这个连接中的数据传输。目前新版本的浏览器大都支持了这一对象,但是由于目前 API 还不稳定,所以需要加入各个浏览器内核的前缀,例如 Chrome 中我们使用 webkitRTCPeerConnection 来访问它。</p>
<h3 id="SCTP"><a href="#SCTP" class="headerlink" title="SCTP"></a>SCTP</h3><h3 id="SRTP"><a href="#SRTP" class="headerlink" title="SRTP"></a>SRTP</h3><h3 id="DTLS"><a href="#DTLS" class="headerlink" title="DTLS"></a>DTLS</h3><h2 id="架构"><a href="#架构" class="headerlink" title="架构"></a>架构</h2><h3 id="WebRTC的分层协议图"><a href="#WebRTC的分层协议图" class="headerlink" title="WebRTC的分层协议图"></a>WebRTC的分层协议图</h3><p><img src="https://image-static.segmentfault.com/266/264/2662644592-59ccfc5ce695f_articlex" alt=""></p>
<h2 id="连接模型"><a href="#连接模型" class="headerlink" title="连接模型"></a>连接模型</h2><h3 id="P2P-Mesh"><a href="#P2P-Mesh" class="headerlink" title="P2P Mesh"></a>P2P Mesh</h3><p>音视频数据流只在终端用户之间相互传输,不经过任何服务器节点,而且每个人都要与其它所有人建立P2P连接。</p>
<p><img src="https://blog.wilddog.com/wp-content/uploads/2017/09/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7-2017-09-20-%E4%B8%8B%E5%8D%883.42.12.png" alt=""></p>
<p><img src="https://pic4.zhimg.com/80/v2-1a208b10a56944a01331ee328415ce8b_hd.jpg" alt=""></p>
<h3 id="SFU-方案"><a href="#SFU-方案" class="headerlink" title="SFU 方案"></a>SFU 方案</h3><p>(Selective Forward Unit)。SFU从发布客户端复制音视频流的信息,然后分发到多个订阅客户端。典型的应用场景是1对多的直播服务。</p>
<p><img src="https://blog.wilddog.com/wp-content/uploads/2017/09/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7-2017-09-20-%E4%B8%8B%E5%8D%883.46.26.png" alt=""></p>
<p><img src="https://pic4.zhimg.com/80/v2-f46394c68633a826431d4424c27e9c5f_hd.jpg" alt=""></p>
<p>一个会议室 n 人,SFU 服务器的宽带是:</p>
<ul>
<li>incoming = bitrate x n </li>
<li>outgoing = bitrate x n + hangouts x n x (n-2)</li>
</ul>
<p>说明:bitrate:主画面码率,hangouts:小窗口码率</p>
<table>
<thead>
<tr>
<th style="text-align:center">participants</th>
<th style="text-align:center">resolution(bitrate/hangouts)</th>
<th style="text-align:center">incoming</th>
<th style="text-align:center">outgoing</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">4</td>
<td style="text-align:center">720P(1.5Mbps/0.3Mbps)</td>
<td style="text-align:center">1.5x4=6Mbps</td>
<td style="text-align:center">1.5x4+0.3x4x(4-2)=8.4Mbps</td>
</tr>
<tr>
<td style="text-align:center">9</td>
<td style="text-align:center">VGA(0.6Mbps/0.3Mbps)</td>
<td style="text-align:center">0.6x9=5.4Mbps</td>
<td style="text-align:center">0.6x9+0.3x9x(9-2)=24.3Mbps</td>
</tr>
</tbody>
</table>
<h3 id="MCU"><a href="#MCU" class="headerlink" title="MCU"></a>MCU</h3><p>(Multi-point Control Unit)。MCU是传统视频会议系统中的核心控制单元,在WebRTC的系统实现中, 适合于多人音视频通话场景,MCU可以对接收到的多路流进行转码和混合,并向每个终端输出单路流。</p>
<p><img src="https://blog.wilddog.com/wp-content/uploads/2017/09/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7-2017-09-20-%E4%B8%8B%E5%8D%883.45.14.png" alt=""></p>
<p><img src="https://pic1.zhimg.com/v2-e91913906803cdd15faf31ce9ae2c614_r.jpg" alt=""></p>
<h2 id="NAT-穿透"><a href="#NAT-穿透" class="headerlink" title="NAT 穿透"></a>NAT 穿透</h2><h3 id="ICE"><a href="#ICE" class="headerlink" title="ICE"></a>ICE</h3><p><img src="https://image-static.segmentfault.com/165/053/1650533365-59ccfcb53d363_articlex" alt=""></p>
<p><img src="https://image-static.segmentfault.com/508/300/508300603-59ccfc7731a29_articlex" alt=""></p>
<p><img src="https://image-static.segmentfault.com/146/004/1460044879-59ccfc85c5f6e_articlex" alt=""></p>
<h3 id="单-PeerConnection-方案-VS-多-PeerConnection-方案"><a href="#单-PeerConnection-方案-VS-多-PeerConnection-方案" class="headerlink" title="单 PeerConnection 方案 VS 多 PeerConnection 方案"></a>单 PeerConnection 方案 VS 多 PeerConnection 方案</h3><p><strong>单 PeerConnection 方案</strong></p>
<p><img src="https://pic3.zhimg.com/80/v2-27399c759cda4accdd65a6caf79f7e4e_hd.jpg" alt=""></p>
<p><strong>多 PeerConnection 方案</strong></p>
<p><img src="https://pic2.zhimg.com/80/v2-c14afdb905746f919c15cc85e4c12589_hd.jpg" alt=""></p>
<h2 id="流程"><a href="#流程" class="headerlink" title="流程"></a>流程</h2><h3 id="标准WebRTC连接建立流程"><a href="#标准WebRTC连接建立流程" class="headerlink" title="标准WebRTC连接建立流程"></a>标准WebRTC连接建立流程</h3><p><img src="https://pic3.zhimg.com/80/v2-f2e992dfb3c3252f90d7f8528ce22902_hd.jpg" alt=""></p>
<p><img src="https://pic4.zhimg.com/80/v2-8cf643367610fad90cecc870b2795f4b_hd.jpg" alt=""></p>
<h3 id="端口分配"><a href="#端口分配" class="headerlink" title="端口分配"></a>端口分配</h3><p><img src="https://pic3.zhimg.com/80/v2-1809b8c93983350d3e4484b35b6f6146_hd.jpg" alt=""></p>
<h3 id="Hangouts-方式"><a href="#Hangouts-方式" class="headerlink" title="Hangouts 方式"></a>Hangouts 方式</h3><p><img src="https://pic2.zhimg.com/80/v2-ef3a1ff96b99c10ef675e3f293af001d_hd.jpg" alt=""></p>
<h3 id="视频最多人数"><a href="#视频最多人数" class="headerlink" title="视频最多人数"></a>视频最多人数</h3><ul>
<li>微信最多<a href="http://kf.qq.com/touch/faq/1211147RVfAV150401Ive2IN.html?platform=15" target="_blank" rel="noopener">9人</a></li>
<li>Google Hangouts - 一次会议中最多有25位参与者,过去是最多容纳10个人。当我第一次也是唯一一次使用它进行WebRTC培训时,参会者人数一超过10人就卡死了,导致了我只能选择使用其他视频会议服务。</li>
<li>Hangouts Meet - 在单个会话中将其参与者人数限制在50人以内</li>
<li>Houseparty - 8名参与者</li>
<li>Skype - 25名参与者</li>
<li><a href="http://appear.in" target="_blank" rel="noopener">http://appear.in</a> - 使用专业帐户登录,单个房间内最多支持12个参与者</li>
<li>Amazon Chime - 桌面版16位参与者,iOS上最多8位参与者(尚未支持安卓)</li>
<li>Atlassian Stride and Meet Jitsi - 50位参与者</li>
</ul>
<h2 id="WebRTC-API"><a href="#WebRTC-API" class="headerlink" title="WebRTC API"></a>WebRTC API</h2><p>WebRTC实现了三个API,分别是:</p>
<ul>
<li>MediaStream:通过MediaStream的API能够通过设备的摄像头及话筒获得视频、音频的同步流</li>
<li>RTCPeerConnection:RTCPeerConnection是WebRTC用于构建点对点之间稳定、高效的流传输的组件</li>
<li>RTCDataChannel:RTCDataChannel使得浏览器之间(点对点)建立一个高吞吐量、低延时的信道,用于传输任意数据</li>
</ul>
<h2 id="价格"><a href="#价格" class="headerlink" title="价格"></a>价格</h2><h3 id="即时通讯云"><a href="#即时通讯云" class="headerlink" title="即时通讯云"></a>即时通讯云</h3><p><a href="http://www.easemob.com/pricing/im" target="_blank" rel="noopener">http://www.easemob.com/pricing/im</a></p>
<h3 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h3><ol>
<li><a href="https://segmentfault.com/a/1190000011403597" target="_blank" rel="noopener">深入理解WebRTC</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/37400934" target="_blank" rel="noopener">聊聊WebRTC网关服务器1:如何选择服务端端口方案?</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/37493371" target="_blank" rel="noopener">聊聊WebRTC网关服务器2:如何选择PeerConnection方案?</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/37538078" target="_blank" rel="noopener">聊聊WebRTC网关服务器3:如何优化Server的线程方案?</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/37589412" target="_blank" rel="noopener">聊聊WebRTC网关服务器4:QoS方案分析</a></li>
<li><a href="https://blog.wilddog.com/?p=2196" target="_blank" rel="noopener">WebRTC 是如何进行通信的,WebRCT 的三种网络结构</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/40204873" target="_blank" rel="noopener">WebRTC网关服务器搭建:开源技术 vs 自行研发</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/40429424" target="_blank" rel="noopener">即构自研WebRTC网关服务器架构实践</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/34558950" target="_blank" rel="noopener">WebRTC视频通话中最多能容纳多少用户?</a></li>
<li><a href="https://bloggeek.me/how-many-users-webrtc-call/" target="_blank" rel="noopener">How Many Users Can Fit in a WebRTC Call?</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/33616446" target="_blank" rel="noopener">WebRTC媒体服务器</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/56428846" target="_blank" rel="noopener">WebRTC 开发实践:为什么你需要 SFU 服务器</a></li>
<li><a href="https://www.jiangyu.org/video-recorder-calculation-tool/" target="_blank" rel="noopener">视频监控录像计算工具</a></li>
<li><a href="https://www.jiangyu.org/fps-data-rate-bit-byte-mb-kbps/" target="_blank" rel="noopener">帧率,分辨率,码流的关系以及硬盘容量计算方法</a></li>
</ol>
]]></content>
<categories>
<category> webrtc </category>
</categories>
<tags>
<tag> webrtc </tag>
</tags>
</entry>
<entry>
<title><![CDATA[解决 Windows 远程桌面连接失败]]></title>
<url>/2019/02/01/windows-remote-desktop/</url>
<content type="html"><![CDATA[<h3 id="1-修改防火墙"><a href="#1-修改防火墙" class="headerlink" title="1 修改防火墙"></a>1 修改防火墙</h3><ol>
<li>打开 <code>控制面板</code> > <code>安全</code> > <code>防火墙</code></li>
<li>打开 <code>Allow an app or feature through Windows Firewall</code></li>
<li>找到 <code>Remote Desktop</code>,选中 <code>Private</code></li>
</ol>
<h3 id="2-检查远程访问是否被允许"><a href="#2-检查远程访问是否被允许" class="headerlink" title="2 检查远程访问是否被允许"></a>2 检查远程访问是否被允许</h3><ol>
<li>通过搜索,打开 <code>Allow Remote connections to your computer</code></li>
<li>选中 <code>Allow Remote Assistance connections to this computer</code></li>
<li>选中 <code>Allow remote connections to this computer</code></li>
</ol>
<a id="more"></a>
<h3 id="3-Windows-10:检查远程访问是否被允许"><a href="#3-Windows-10:检查远程访问是否被允许" class="headerlink" title="3 Windows 10:检查远程访问是否被允许"></a>3 Windows 10:检查远程访问是否被允许</h3><ol>
<li>依次打开:<code>Settings</code> > <code>System</code> > <code>Remote Desktop</code></li>
<li>启用 <code>Enable Remote Desktop</code></li>
</ol>
<h3 id="4-Windows-10:禁止-IPv6"><a href="#4-Windows-10:禁止-IPv6" class="headerlink" title="4 Windows 10:禁止 IPv6"></a>4 Windows 10:禁止 IPv6</h3><p>依次打开:<code>Settings</code> > <code>Network and Internet</code> > <code>Ethernet</code> > <code>Change Adapter options</code>,取消选中 <code>Internet Protocol Version 6 (TCP/IPv6)</code>,然后<strong>重启机器</strong>。</p>
]]></content>
<categories>
<category> 修理 </category>
</categories>
<tags>
<tag> windows </tag>
</tags>
</entry>
<entry>
<title><![CDATA[网络工具:ARP]]></title>
<url>/2019/02/01/network-arp/</url>
<content type="html"><![CDATA[<h3 id="1-查看-arp-映射列表"><a href="#1-查看-arp-映射列表" class="headerlink" title="1 查看 arp 映射列表"></a>1 查看 arp 映射列表</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> arp -a</span></span><br></pre></td></tr></table></figure>
<h3 id="2-清除-arp-映射"><a href="#2-清除-arp-映射" class="headerlink" title="2 清除 arp 映射"></a>2 清除 arp 映射</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 清除一个映射</span></span><br><span class="line"><span class="meta">$</span><span class="bash"> arp -d 192.168.199.1</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 清除全部映射</span></span><br><span class="line"><span class="meta">$</span><span class="bash"> arp -ad</span></span><br></pre></td></tr></table></figure>
<a id="more"></a>
]]></content>
<categories>
<category> network </category>
</categories>
<tags>
<tag> network </tag>
<tag> arp </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Chomium 调试方法]]></title>
<url>/2019/01/31/chromium-debug/</url>
<content type="html"><![CDATA[<h2 id="Linux-平台"><a href="#Linux-平台" class="headerlink" title="Linux 平台"></a>Linux 平台</h2><h3 id="基础调试"><a href="#基础调试" class="headerlink" title="基础调试"></a>基础调试</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> gdb -tui -ex=r --args out/Debug/chrome --<span class="built_in">disable</span>-seccomp-sandbox http://google.com</span></span><br></pre></td></tr></table></figure>
<h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ol>
<li><a href="https://chromium.googlesource.com/chromium/src/+/HEAD/docs/linux_debugging.md#Basic-browser-process-debugging" target="_blank" rel="noopener">Tips for debugging on Linux</a></li>
</ol>
]]></content>
<categories>
<category> chromium </category>
</categories>
<tags>
<tag> chromium </tag>
<tag> dbg </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Chomium 崩溃日志]]></title>
<url>/2019/01/31/chromium-crash-report/</url>
<content type="html"><![CDATA[<h3 id="生成-Crash-报告"><a href="#生成-Crash-报告" class="headerlink" title="生成 Crash 报告"></a>生成 Crash 报告</h3><p>打开 Chromium,通过访问 <code>http://crash/</code> 来触发生成崩溃报告,保存在:</p>
<ul>
<li>Linux:<code>~/.config/google-chrome/Crash Reports/</code></li>
<li>Windows/Mac:<code>/path/to/profile/Crash Reports</code></li>
</ul>
<p>在 Linux 平台,通过设置环境变量,可以阻止报告发送给服务器:</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> env CHROME_HEADLESS=1 ./out/Debug/chrome-wrapper</span></span><br></pre></td></tr></table></figure>
<a id="more"></a>
<h3 id="解析-Crash-报告"><a href="#解析-Crash-报告" class="headerlink" title="解析 Crash 报告"></a>解析 Crash 报告</h3><p>可以通过 <code>minidump_stackwalk</code> 工具来解析崩溃报告:</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> minidump_stackwalk 报告名.dmp</span></span><br></pre></td></tr></table></figure>
<p>能过 Linux 平台生成的报告,在执行上面命令解析前,需要先把文件的头(header)去掉,使用文本编辑器打开 dmp 文件,搜索 <code>MDMP</code> 字符,然后将此字符前的头删除后再解析。</p>
<h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ol>
<li><a href="https://www.chromium.org/developers/decoding-crash-dumps" target="_blank" rel="noopener">Decoding Crash Dumps</a></li>
<li><a href="https://chromium.googlesource.com/chromium/src/+/HEAD/docs/linux_crash_dumping.md" target="_blank" rel="noopener">Linux Crash Dumping</a></li>
</ol>
]]></content>
<categories>
<category> chromium </category>
</categories>
<tags>
<tag> chromium </tag>
<tag> crashpad </tag>
</tags>
</entry>
<entry>
<title><![CDATA[使用 Laradock 创建 Laravel 开发环境]]></title>
<url>/2019/01/26/laradock-laravel-development/</url>
<content type="html"><![CDATA[<h2 id="Docker-Desktop"><a href="#Docker-Desktop" class="headerlink" title="Docker Desktop"></a>Docker Desktop</h2><p>从官网下载用于 Mac 机器的 Docker Desktop,如果测试从官方源下载镜像非常慢的话,可以添加国内的阿里加速镜像:</p>
<p><img src="/images/posts/laradock/docker-desktop-1.jpg" alt=""></p>
<h2 id="配置-Laradock"><a href="#配置-Laradock" class="headerlink" title="配置 Laradock"></a>配置 Laradock</h2><h3 id="1-下载-Laradock"><a href="#1-下载-Laradock" class="headerlink" title="1 下载 Laradock"></a>1 下载 Laradock</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> git <span class="built_in">clone</span> https://github.com/laradock/laradock.git</span></span><br></pre></td></tr></table></figure>
<p>目录结构如下</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">+ laradock</span><br><span class="line">+ project-1</span><br><span class="line">+ project-2</span><br></pre></td></tr></table></figure>
<h3 id="2-配置虚拟主机"><a href="#2-配置虚拟主机" class="headerlink" title="2 配置虚拟主机"></a>2 配置虚拟主机</h3><p>前往 <code>nginx/sites</code>,复制 <code>laravel.conf.example</code> 为 <code>project-1.test.conf</code></p>
<p><strong>注意:</strong>只有 <code>.conf</code> 结尾的才会被 nginx 读取。</p>
<a id="more"></a>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">server {</span><br><span class="line"></span><br><span class="line"> listen 80;</span><br><span class="line"> listen [::]:80;</span><br><span class="line"></span><br><span class="line"> # 域名</span><br><span class="line"> server_name project-1.test;</span><br><span class="line"> # 项目目录,均以 /var/www/ 开头</span><br><span class="line"> root /var/www/project-1;</span><br><span class="line"> index index.php index.html index.htm;</span><br><span class="line"></span><br><span class="line"> location / {</span><br><span class="line"> try_files $uri $uri/ /index.php$is_args$args;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> location ~ \.php$ {</span><br><span class="line"> try_files $uri /index.php =404;</span><br><span class="line"> fastcgi_pass php-upstream;</span><br><span class="line"> fastcgi_index index.php;</span><br><span class="line"> fastcgi_buffers 16 16k;</span><br><span class="line"> fastcgi_buffer_size 32k;</span><br><span class="line"> fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;</span><br><span class="line"> include fastcgi_params;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> location ~ /\.ht {</span><br><span class="line"> deny all;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> location /.well-known/acme-challenge/ {</span><br><span class="line"> root /var/www/letsencrypt/;</span><br><span class="line"> log_not_found off;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> error_log /var/log/nginx/laravel_error.log;</span><br><span class="line"> access_log /var/log/nginx/laravel_access.log;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="3-修改本机-hosts"><a href="#3-修改本机-hosts" class="headerlink" title="3 修改本机 hosts"></a>3 修改本机 hosts</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1 project-1.test</span><br><span class="line">127.0.0.1 project-2.test</span><br><span class="line">...</span><br></pre></td></tr></table></figure>
<h3 id="4-配置-laradock-的-env"><a href="#4-配置-laradock-的-env" class="headerlink" title="4 配置 laradock 的 .env"></a>4 配置 laradock 的 <code>.env</code></h3><p>前往 laradock 目录,执行</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> cp env-example .env</span></span><br></pre></td></tr></table></figure>
<p>打开 <code>.env</code> 文件,根据个人需要定制 PHP、Nginx、MySQL 版本及参数。</p>
<h3 id="5-启动"><a href="#5-启动" class="headerlink" title="5 启动"></a>5 启动</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> docker-compose up -d nginx mysql</span></span><br></pre></td></tr></table></figure>
<h3 id="6-测试"><a href="#6-测试" class="headerlink" title="6 测试"></a>6 测试</h3><p>浏览器打开 <code>http://project-1.test</code>,显示出你的 PHP 网站</p>
<h2 id="开发"><a href="#开发" class="headerlink" title="开发"></a>开发</h2><p>开发 laravel 通常我们需要一些工具,比如 composer,PHPUnit,nodejs 等,Laradock 环境已经为我们安装好了这些工具,但这些环境是在 docker 内部,我们需要通过命令将工作目录映射到 docker 环境,这是要执行的命令</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> docker-compose <span class="built_in">exec</span> workspace bash</span></span><br></pre></td></tr></table></figure>
<h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h3 id="1-停止-docker-compose"><a href="#1-停止-docker-compose" class="headerlink" title="1 停止 docker-compose"></a>1 停止 docker-compose</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> docker-compose stop</span></span><br></pre></td></tr></table></figure>
<h3 id="2-切换组件版本"><a href="#2-切换组件版本" class="headerlink" title="2 切换组件版本"></a>2 切换组件版本</h3><p>比如将 MySQL 版本从 latest 切换成 5.7,然后执行以下命令</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> docker-compose build --no-cache php-fpm</span></span><br></pre></td></tr></table></figure>
<h3 id="3-重启组件"><a href="#3-重启组件" class="headerlink" title="3 重启组件"></a>3 重启组件</h3><p>重启 Nginx:</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> docker-compose restart nginx</span></span><br></pre></td></tr></table></figure>
<h3 id="4-添加组件"><a href="#4-添加组件" class="headerlink" title="4 添加组件"></a>4 添加组件</h3><p>比如,添加 phpmyadmin:</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> docker-compose up -d nginx mysql phpmyadmin</span></span><br></pre></td></tr></table></figure>
<h3 id="5-MySQL-服务器的-Host"><a href="#5-MySQL-服务器的-Host" class="headerlink" title="5 MySQL 服务器的 Host"></a>5 MySQL 服务器的 Host</h3><p>MySQL 服务器绑定的 Host 可以不填写具体 ip 地址,而是简单地用 mysql 表示.</p>
<h3 id="6-workspace-和-php-fpm-的区别"><a href="#6-workspace-和-php-fpm-的区别" class="headerlink" title="6 workspace 和 php-fpm 的区别"></a>6 workspace 和 php-fpm 的区别</h3><p>环境配置文件 <code>.env</code> 里包含相似的两块配置:workspace 和 php-fpm,它们对应两个不同的容器,一个是 FPM,一个是 CLI。不管是安装插件还是修改配置,都要分开修改。</p>
<h3 id="7-删除-lt-none-gt-镜像"><a href="#7-删除-lt-none-gt-镜像" class="headerlink" title="7 删除 <none> 镜像"></a>7 删除 <code><none></code> 镜像</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> docker rmi $(docker images --filter <span class="string">"dangling=true"</span> -q --no-trunc)</span></span><br></pre></td></tr></table></figure>
<h3 id="8-清除-Container,Image"><a href="#8-清除-Container,Image" class="headerlink" title="8 清除 Container,Image"></a>8 清除 Container,Image</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">docker system prune</span><br><span class="line"></span><br><span class="line">WARNING! This will remove:</span><br><span class="line"> - all stopped containers</span><br><span class="line"> - all networks not used by at least one container</span><br><span class="line"> - all dangling images</span><br><span class="line"> - all build cache</span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category> php </category>
</categories>
<tags>
<tag> php </tag>
<tag> nginx </tag>
<tag> mysql </tag>
<tag> laravel </tag>
<tag> docker </tag>
<tag> laradock </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Linux 浏览器如何配置 PKCS#11 设备]]></title>
<url>/2019/01/25/linux-browser-config-pkcs11/</url>
<content type="html"><![CDATA[<p>Linux 常用的浏览器包括 Firefox 和 Chrome,这里演示如何为他们添加 PKCS#11(<a href="https://en.wikipedia.org/wiki/PKCS_11" target="_blank" rel="noopener">什么是 PKCS#11?</a>) 设备。</p>
<p>在 Linux 平台上,不管是 Firefox 还是 Chrome 都是使用的 NSS(<a href="https://en.wikipedia.org/wiki/Network_Security_Services" target="_blank" rel="noopener">什么是 NSS?</a>) 来管理证书和安全设备。所以我们只需要知道如何管理 NSS,就可以实现配置这两个浏览器的安全设备配置。</p>
<a id="more"></a>
<h3 id="NSS-工具"><a href="#NSS-工具" class="headerlink" title="NSS 工具"></a>NSS 工具</h3><ul>
<li>certutil</li>
</ul>
<p>文档参考<a href="https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certutil" target="_blank" rel="noopener">这里</a></p>
<ul>
<li>modutil</li>
</ul>
<p>文档参考<a href="https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Reference/NSS_tools_:_modutil" target="_blank" rel="noopener">这里</a></p>
<h3 id="Firefox"><a href="#Firefox" class="headerlink" title="Firefox"></a>Firefox</h3><p>Firefox 自带安全设备的配置界面,所以直接通过界面添加 PKCS#11 设备。</p>
<p><strong>第一步:打开配置</strong></p>
<p><img src="/images/posts/nss/ff1.png" alt=""></p>
<p><strong>第二步:进入安全设备管理</strong></p>
<p><img src="/images/posts/nss/ff2.jpg" alt=""></p>
<p><strong>第三步:载入安全设备</strong></p>
<p><img src="/images/posts/nss/ff3.jpg" alt=""></p>
<p><strong>第四步:载入成功</strong></p>
<p><img src="/images/posts/nss/ff4.jpg" alt=""></p>
<p><strong>第五步:输入 PKCS#11 设备 PIN 码</strong></p>
<p><img src="/images/posts/nss/ff5.png" alt=""></p>
<h3 id="Chrome"><a href="#Chrome" class="headerlink" title="Chrome"></a>Chrome</h3><p><strong>添加 PKCS#11 设备</strong></p>
<p>添加或修改 nss 数据库前,先关闭 chrome 浏览器,然后打开终端,运行下面命令:</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> modutil -dbdir sql:/home/user-x/.pki/nssdb/ -add <span class="string">"opensc"</span> -libfile /home/user-x/Desktop/P11/libTFTknP11.so</span></span><br></pre></td></tr></table></figure>