-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
3754 lines (3376 loc) · 246 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
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>zeroto的博客</title>
<subtitle>追求卓越,成功自然而来</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="//zeroto.tech/"/>
<updated>2019-06-11T02:13:42.000Z</updated>
<id>//zeroto.tech/</id>
<author>
<name>千古不见一人闲</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Git 常用命令</title>
<link href="//zeroto.tech/2019/05/22/Git%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E9%80%9F%E6%9F%A5%E8%A1%A8/"/>
<id>//zeroto.tech/2019/05/22/Git常用命令速查表/</id>
<published>2019-05-22T08:55:44.000Z</published>
<updated>2019-06-11T02:13:42.000Z</updated>
<content type="html"><![CDATA[<h3 id="Git-常用命令"><a href="#Git-常用命令" class="headerlink" title="Git 常用命令"></a>Git 常用命令</h3><h4 id="大览"><a href="#大览" class="headerlink" title="大览"></a>大览</h4><ul>
<li>master 默认开发分支</li>
<li>Origin 默认远程版本库</li>
<li>Head 默认开发分支</li>
<li>Head^ Head的父提交</li>
</ul>
<a id="more"></a>
<h4 id="创建版本库"><a href="#创建版本库" class="headerlink" title="创建版本库"></a>创建版本库</h4><ul>
<li>git clone <url> 从远程仓库拷贝代码到本地</url></li>
<li>git init 创建 Git 库</li>
</ul>
<h4 id="分支与标签"><a href="#分支与标签" class="headerlink" title="分支与标签"></a>分支与标签</h4><ul>
<li>git branch xxx_dev 创建名字为 <code>xxx_dev</code> 的分支</li>
<li>git branch -d xxx_dev 删除<code>xxx_dev</code> 的分支</li>
<li>git branch 查看当前的分支名称</li>
<li>git branch -r :查看远程分支</li>
<li>git merge <branch> 将 branch 分支合并到当前分支</branch></li>
<li>git checkout xxx_dev 切换到名字为 <code>xxx_dev</code> 的分支</li>
<li>git checkout 可以将 HEAD 移到一个新的分支,并更新工作目录。因为可能会覆盖本地的修改,所以执行这个指令之前,你需要 stash 或者 commit 暂存区和工作区的更改。</li>
<li>git push origin xxx_dev 执行推送的操作,完成本地分支向远程分支的同步</li>
<li>git tag 查看标签</li>
<li>git tag xxx_dev 基于最新提交创建名字为 <code>xxx_dev</code> 标签</li>
<li>git tag -d xxx_dev 删除<code>xxx_dev</code> 的标签<ul>
<li>打标签 git tag -a v1.01 -m “Release version 1.01”</li>
<li>提交标签到远程仓库 :<code>git push origin --tags</code></li>
<li>查看某两次 tag 之间的 commit :<code>git log --pretty=oneline tagA..tagB</code></li>
<li>查看某次 tag 之后的 commit :<code>git log --pretty=oneline tagA..</code></li>
</ul>
</li>
<li>git checkout <branch tag=""> 切换到指定分支或标签;可以将 HEAD 移到一个新的分支,并更新工作目录。因为可能会覆盖本地的修改,所以执行这个指令之前,你需要 stash 或者 commit 暂存区和工作区的更改。</branch></li>
</ul>
<p><strong>这两个命令都是把修改从一个分支集成到另一个分支上,它们只是以非常不同的方式进行</strong></p>
<p>何时使用:</p>
<ol>
<li>如果你对修改不够果断,请使用合并操作</li>
<li>根据你希望的历史记录的样子,而选择使用变基或合并操作</li>
</ol>
<ul>
<li>git merge 把本地代码和已经取得的远程仓库代码合并</li>
<li>git rebase ,是复位基底的意思。使用变基时,意味着使用另一个分支作为集成修改的新基础</li>
</ul>
<p> <strong>Git 提交代码时候写错 commit 信息后,如何重新设置 commit 信息?</strong></p>
<p>可以通过 <code>git commit --amend</code> 来对本次 commit 进行修改。</p>
<h4 id="修改和提交"><a href="#修改和提交" class="headerlink" title="修改和提交"></a>修改和提交</h4><ul>
<li><p>git status 查看当前仓库的状态</p>
</li>
<li><p>git diff 查看本次修改与上次修改的内容的区别</p>
</li>
<li><p>git show 显示某次提交的内容 git show $id</p>
</li>
<li><p>git add <file> 把现在所要添加的文件放到暂存区中</file></p>
</li>
<li><p>git rm <file> 从版本库中删除文件</file></p>
</li>
<li><p>git reset <file> 从暂存区恢复到工作文件</file></p>
</li>
<li><p>git reset HEAD^ 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改</p>
</li>
<li><p>git commit 把 git add 到暂存区的内容提交到代码区中</p>
</li>
<li><p>git stash 暂存</p>
</li>
<li><p>git stash pop 恢复最近一次的暂存</p>
</li>
<li><p>git reset HEAD^ —hard <a href="https://gitbook.tw/chapters/using-git/reset-commit.html" target="_blank" rel="external">刚才的Commit后悔了,想要拆掉重做)</a></p>
</li>
</ul>
<h4 id="远程操作"><a href="#远程操作" class="headerlink" title="远程操作"></a>远程操作</h4><ul>
<li>git pull 抓取远程仓库所有分支更新并合并到本地</li>
<li><code>git push origin master</code> :将本地主分支推到远程主分支</li>
<li>使用 <code>git fetch</code> 是取回远端更新,不会对本地执行 merge 操作,不会去动你的本地的内容。而 <code>git pull</code> 会更新你本地代码到服务器上对应分支的最新版本</li>
<li>git remote -v 查看远程版本库信息</li>
<li>git remote show <remote> 查看指定远程版本库信息</remote></li>
<li>git remote add <remote> <url> 添加远程版本库</url></remote></li>
</ul>
<p><img src="/assets/blogImg/image-20190523093108311.png" alt="image-20190523093108311"></p>
<p>来自于 <a href="http://svip.iocoder.cn/Git/Interview/" target="_blank" rel="external">芋道源码</a></p>
<p><a href="https://gitbook.tw/interview" target="_blank" rel="external">Git 面试题</a></p>
<p>🦅 <strong>reset 与 rebase 有什么区别?</strong></p>
<ul>
<li>reset 操作,不修改 commit 相关的东西,只会去修改 <code>.git</code> 目录下的东西。</li>
<li>rebase 操作,会试图修改你已经 commit 的东西,比如覆盖 commit 的历史等,但是不能使用 rebase 来修改已经 push 过的内容,容易出现兼容性问题。rebase 还可以来解决内容的冲突,解决两个人修改了同一份内容,然后失败的问题。</li>
</ul>
<p>推荐看看 <a href="https://codeday.me/bug/20171012/84739.html" target="_blank" rel="external">《“git reset”和“git rebase”有什么区别?》</a> 。</p>
<p>🦅 <strong>reset 与 revert 与 checkout 有什么区别?</strong></p>
<p>首先是它们的共同点:用来撤销代码仓库中的某些更改。</p>
<p>然后是不同点:</p>
<ul>
<li><p>1)从 commit 层面来说:</p>
<ul>
<li><p><code>git reset</code> ,可以将一个分支的末端指向之前的一个 commit 。然后再下次 Git 执行垃圾回收的时候,会把这个 commit 之后的 commit 都扔掉。<code>git reset</code> 还支持三种标记,用来标记 reset 指令影响的范围:</p>
<ul>
<li><p><code>--mixed</code> :会影响到暂存区和历史记录区。也是默认选项;</p>
</li>
<li><p><code>--soft</code> :只影响历史记录区;</p>
</li>
<li><p><code>--hard</code>:影响工作区、暂存区和历史记录区。</p>
<blockquote>
<p>注意:因为 <code>git reset</code> 是直接删除 commit 记录,从而会影响到其他开发人员的分支,所以不要在公共分支(比如 develop)做这个操作。</p>
</blockquote>
</li>
</ul>
</li>
<li><p><code>git checkout</code> ,可以将 HEAD 移到一个新的分支,并更新工作目录。因为可能会覆盖本地的修改,所以执行这个指令之前,你需要 stash 或者 commit 暂存区和工作区的更改。</p>
</li>
<li><p><code>git revert</code> ,和 <code>git reset</code> 的目的是一样的,但是做法不同,它会以创建新的 commit 的方式来撤销 commit ,这样能保留之前的 commit 历史,比较安全。另外,同样因为可能会覆盖本地的修改,所以执行这个指令之前,你需要 stash 或者 commit 暂存区和工作区的更改。</p>
</li>
</ul>
</li>
<li><p>2)从文件层面来说</p>
<ul>
<li><code>git reset</code> ,只是把文件从历史记录区拿到暂存区,不影响工作区的内容。而且支持 <code>--mixed</code>、<code>--soft</code> 和 <code>--hard</code> 。</li>
<li><code>git checkout</code> ,则是把文件从历史记录拿到工作区,不影响暂存区的内容。</li>
<li><code>git revert</code> ,不支持文件层面的操作。</li>
</ul>
</li>
</ul>
<p>总的来说,回答关键点:</p>
<ul>
<li>对于 commit 层面和文件层面,这三个指令本身功能差别很大。</li>
<li><code>git revert</code> 不支持文件层面的操作。</li>
<li>不要在公共分支做 <code>git reset</code> 操作。</li>
</ul>
<p>🦅 <strong>不小心用 git reset –hard 指令把提交理掉了,有机会救回來吗?</strong></p>
<p>放心,基本上东西进了 Git 就不容易消失,它們只是以一种我们肉眼看不懂的格式存放在 Git 空间裡。我们可以透過 <code>git reflog</code> 指令去翻一下被 reset 的那個 Commit 的编号值,然後再做一次 <code>git reset --hard</code> 就可以把它救回來了。</p>
<p><img src="/assets/blogImg/image-20190523110912323.png" alt="image-20190523110912323"></p>
<p><img src="/assets/blogImg/image-20190523141340237.png" alt="image-20190523141340237"></p>
<p><img src="/assets/blogImg/image-20190523144308255.png" alt="image-20190523144308255"></p>
<p><img src="/assets/blogImg/image-20190523145633497.png" alt="image-20190523145633497"></p>
<p><img src="/assets/blogImg/image-20190523145855146.png" alt="image-20190523145855146"></p>
<p>参考资料 <a href="https://gitbook.tw/chapters/github/using-force-push.html" target="_blank" rel="external">【状况题】听说git push -f这个指令很可怕</a></p>
<p><img src="/assets/blogImg/image-20190523152036290.png" alt="image-20190523152036290"></p>
]]></content>
<summary type="html">
<h3 id="Git-常用命令"><a href="#Git-常用命令" class="headerlink" title="Git 常用命令"></a>Git 常用命令</h3><h4 id="大览"><a href="#大览" class="headerlink" title="大览"></a>大览</h4><ul>
<li>master 默认开发分支</li>
<li>Origin 默认远程版本库</li>
<li>Head 默认开发分支</li>
<li>Head^ Head的父提交</li>
</ul>
</summary>
<category term="Git" scheme="//zeroto.tech/tags/Git/"/>
</entry>
<entry>
<title>IntelliJ IDEA 从SVN检出Maven项目到Tomcat部署</title>
<link href="//zeroto.tech/2019/02/28/IDEA%E8%B5%B7%E6%AD%A5/"/>
<id>//zeroto.tech/2019/02/28/IDEA起步/</id>
<published>2019-02-28T06:10:48.000Z</published>
<updated>2020-02-20T02:29:04.000Z</updated>
<content type="html"><![CDATA[<h1 id="起步"><a href="#起步" class="headerlink" title="起步"></a>起步</h1><ul>
<li>下载IDEA(不要下载社区版),并激活</li>
<li>Maven环境配置</li>
<li>检出项目</li>
<li>同一窗口查看多个项目(模块),就像eclipse一样</li>
<li>Tomcat 配置</li>
<li>启动项目</li>
</ul>
<a id="more"></a>
<h2 id="截图分步骤展示"><a href="#截图分步骤展示" class="headerlink" title="截图分步骤展示"></a>截图分步骤展示</h2><h3 id="激活IDEA"><a href="#激活IDEA" class="headerlink" title="激活IDEA"></a>激活IDEA</h3><p><a href="http://idea.lanyus.com/" target="_blank" rel="external">IntelliJ IDEA 注册码 </a></p>
<h3 id="Maven环境配置"><a href="#Maven环境配置" class="headerlink" title="Maven环境配置"></a>Maven环境配置</h3><p>idea 自带maven,只需把settings.xml放在合适的路径下即可。</p>
<h3 id="SVN检出项目"><a href="#SVN检出项目" class="headerlink" title="SVN检出项目"></a>SVN检出项目</h3><p><img src="media/15513350795895.jpg" alt=""></p>
<p>如果SVN版本控制不是svn协议,而是https协议的话,可以选中截图画框选项:</p>
<p><img src="media/15513352497401.jpg" alt=""></p>
<h3 id="同一窗口查看多个项目(模块)"><a href="#同一窗口查看多个项目(模块)" class="headerlink" title="同一窗口查看多个项目(模块)"></a>同一窗口查看多个项目(模块)</h3><p>idea打开 File -> Project Structure</p>
<h3 id="Tomcat-配置"><a href="#Tomcat-配置" class="headerlink" title="Tomcat 配置"></a>Tomcat 配置</h3><p>1、安装插件:<br><img src="media/15513357317241.jpg" alt=""></p>
<p>2、配置</p>
<p><img src="media/15513358498640.jpg" alt=""></p>
<h2 id="Tomcat-端口号与项目中bootstrap-yml里面的port配置一致即可-启动。"><a href="#Tomcat-端口号与项目中bootstrap-yml里面的port配置一致即可-启动。" class="headerlink" title="Tomcat 端口号与项目中bootstrap.yml里面的port配置一致即可 启动。"></a>Tomcat 端口号与项目中bootstrap.yml里面的port配置一致即可 启动。</h2><h2 id="快捷键"><a href="#快捷键" class="headerlink" title="快捷键"></a>快捷键</h2><ol>
<li>Use ⇧⌘⏎ to complete a current statement such as if, do-while, try-catch, return (or a method call) into a syntactically correct construct (e.g. add curly braces).</li>
<li>⌘ + F 在当前文件进行文本查找</li>
<li>⌘ + R 在当前文件进行文本替换</li>
<li>⌘ + Z 撤销</li>
<li>⌘ + Y 复制光标所在行 或 复制选择内容,并把复制内容插入光标位置下面;(自定义)</li>
<li>⌘ + X 剪切光标所在行 或 剪切选择内容</li>
<li>⌘ + C 复制光标所在行 或 复制选择内容</li>
<li>⌘ + D 删除光标所在行或删除选中的行(自定义)</li>
<li>⌘ + E 显示最近打开的文件记录列表</li>
<li>⌘ + O 类大纲(自定义)</li>
<li>⌘ + L 在当前文件跳转到指定行处</li>
<li>⌘ + G <a href="https://www.jetbrains.com/help/rider/Finding_and_Replacing_Text_in_File.html#search_through_current_file" target="_blank" rel="external">查找下一个/移至下一个出现</a></li>
<li>⌘ + J 插入自定义动态代码模板</li>
<li>⌘ + P 根据输入的 <strong>类名</strong> 查找类文件 (自定义)</li>
<li>⌘ + shift + O 根据输入的 <strong>文件名</strong> 查找文件 </li>
<li><strong>⇧ + F6</strong> It is possible to rename CSS selectors directly from HTML. Position the caret at the selector to be renamed and press ⇧F6 (Refactor | Rename).</li>
<li>⌘ + shift + U 大小写转换</li>
<li>⌘ + shift + ↩ 自动结束代码,行末自动添加分号</li>
<li>alt + P 显示方法的参数信息(自定义)</li>
<li>⌘ + N 生成代码(getter、setter、构造函数、hashCode/equals,toString)</li>
<li><strong>⌘ + shift+V</strong> 从最近的缓冲区粘贴</li>
<li>Use ⌘↑ keyboard shortcut to show the navigation bar, and arrow keys to locate the necessary files or folders.</li>
<li><strong>⌘ + shift+上/下箭头</strong> 向上或向下移动</li>
<li>⌘ + alt + L 可以再src 下直接Optimize imports</li>
<li>⌃ + alt + O 自动导包</li>
</ol>
<p><a href="">四、Compile and Run(编译和运行)</a></p>
<p><strong>⌘F9</strong> 编译Project</p>
<p><strong>⌘⇧F9</strong> 编译选择的文件、包或模块</p>
<p><strong>⌃⌥R</strong> 弹出 Run 的可选择菜单</p>
<p><strong>⌃⌥D</strong> 弹出 Debug 的可选择菜单</p>
<p><strong>⌃R</strong> 运行</p>
<p><strong>⌃D</strong> 调试</p>
<p><strong>⌃⇧R, ⌃⇧D</strong> 从编辑器运行上下文环境配置</p>
<p><a href="">五、Debugging(调试)</a></p>
<p><strong>F8</strong> 进入下一步,如果当前行断点是一个方法,则不进入当前方法体内</p>
<p><strong>F7</strong> 进入下一步,如果当前行断点是一个方法,则进入当前方法体内,如果该方法体还有方法,则不会进入该内嵌的方法中</p>
<p><strong>⇧F7</strong> 智能步入,断点所在行上有多个方法调用,会弹出进入哪个方法</p>
<p><strong>⇧F8</strong> 跳出</p>
<p><strong>⌥F9</strong> 运行到光标处,如果光标前有其他断点会进入到该断点</p>
<p><strong>⌥F8</strong> 计算表达式(可以更改变量值使其生效)</p>
<p><strong>⌘⌥R</strong> 恢复程序运行,如果该断点下面代码还有断点则停在下一个断点上</p>
<p><strong>⌘F8</strong> 切换断点(若光标当前行有断点则取消断点,没有则加上断点)</p>
<p><strong>⌘⇧F8</strong> 查看断点信息</p>
]]></content>
<summary type="html">
<h1 id="起步"><a href="#起步" class="headerlink" title="起步"></a>起步</h1><ul>
<li>下载IDEA(不要下载社区版),并激活</li>
<li>Maven环境配置</li>
<li>检出项目</li>
<li>同一窗口查看多个项目(模块),就像eclipse一样</li>
<li>Tomcat 配置</li>
<li>启动项目</li>
</ul>
</summary>
<category term="IntelliJ IDEA 部署Maven项目" scheme="//zeroto.tech/tags/IntelliJ-IDEA-%E9%83%A8%E7%BD%B2Maven%E9%A1%B9%E7%9B%AE/"/>
</entry>
<entry>
<title>CentOS 7 安装配置分布式文件系统FastDFS</title>
<link href="//zeroto.tech/2019/01/04/CentOS%207%20%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E5%88%86%E5%B8%83%E5%BC%8F%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9FFastDFS/"/>
<id>//zeroto.tech/2019/01/04/CentOS 7 安装配置分布式文件系统FastDFS/</id>
<published>2019-01-04T06:12:50.000Z</published>
<updated>2020-02-20T02:35:10.000Z</updated>
<content type="html"><![CDATA[<h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>感谢淘宝资深架构师余庆大神开源了如此优秀的轻量级分布式文件系统,记录一下FastDFS V5.05在CentOS7中的安装与配置。</p>
<p>首先简单了解一下基础概念,FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。</p>
<a id="more"></a>
<p><strong>下载包</strong></p>
<blockquote>
<p>libfastcommon-1.0.7.tar.gz<br>FastDFS_v5.05.tar.gz<br>nginx-1.8.0.tar.gz</p>
</blockquote>
<p>FastDFS的两个核心概念分别是:</p>
<p><strong>Tracker(跟踪器)</strong></p>
<p>Tracker主要做调度工作,相当于mvc中的controller的角色,在访问上起负载均衡的作用。跟踪器和存储节点都可以由一台或多台服务器构成,跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务,其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。</p>
<p>Tracker负责管理所有的Storage和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息。并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表,Tracker需要管理的元信息很少,会全部存储在内存中。</p>
<p>另外tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为tracker cluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务。</p>
<p><strong>Storage(存储节点)</strong></p>
<p>Storage采用了分卷[Volume](或分组[group])的组织方式,存储系统由一个或多个组组成,组与组之间的文件是相互独立的,所有组的文件容量累加就是整个存储系统中的文件容量。</p>
<p>一个卷[Volume](组[group])可以由一台或多台存储服务器组成,一个组中的存储服务器中的文件都是相同的,组中的多台存储服务器起到了冗余备份和负载均衡的作用,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。</p>
<p>参考资料: <a href="https://www.linuxidc.com/Linux/2016-09/135537.htm" target="_blank" rel="external">CentOS 7 安装配置分布式文件系统FastDFS</a></p>
]]></content>
<summary type="html">
<h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>感谢淘宝资深架构师余庆大神开源了如此优秀的轻量级分布式文件系统,记录一下FastDFS V5.05在CentOS7中的安装与配置。</p>
<p>首先简单了解一下基础概念,FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB &lt; file_size &lt;500MB)为载体的在线服务。</p>
</summary>
<category term="CentOS下搭建FastDFS V5.05" scheme="//zeroto.tech/tags/CentOS%E4%B8%8B%E6%90%AD%E5%BB%BAFastDFS-V5-05/"/>
<category term="FastDFS 整合 Nginx" scheme="//zeroto.tech/tags/FastDFS-%E6%95%B4%E5%90%88-Nginx/"/>
</entry>
<entry>
<title>Quartz 分布式任务</title>
<link href="//zeroto.tech/2018/11/28/Quartz%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E7%9B%B8%E5%85%B3%E8%A1%A8%E4%BB%8B%E7%BB%8D/"/>
<id>//zeroto.tech/2018/11/28/Quartz定时任务相关表介绍/</id>
<published>2018-11-28T06:14:14.000Z</published>
<updated>2019-05-23T05:53:51.000Z</updated>
<content type="html"><![CDATA[<h5 id="1-qrtz-job-details:存储每一个已配置的-jobDetail-的详细信息"><a href="#1-qrtz-job-details:存储每一个已配置的-jobDetail-的详细信息" class="headerlink" title="1. qrtz_job_details:存储每一个已配置的 jobDetail 的详细信息"></a>1. qrtz_job_details:存储每一个已配置的 jobDetail 的详细信息</h5><a id="more"></a>
<table>
<thead>
<tr>
<th>表字段</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>sched_name</td>
<td>调度名称</td>
</tr>
<tr>
<td>job_name</td>
<td>集群中job的名字,该名字用户自己可以随意定制,无强行要求</td>
</tr>
<tr>
<td>job_group</td>
<td>集群中job的所属组的名字,该名字用户自己随意定制,无强行要求 </td>
</tr>
<tr>
<td>description</td>
<td>相关介绍</td>
</tr>
<tr>
<td>job_class_name</td>
<td>集群中个notejob实现类的完全包名,quartz就是根据这个路径到classpath找到该job类</td>
</tr>
<tr>
<td>is_durable</td>
<td>是否持久化,把该属性设置为1,quartz会把job持久化到数据库中</td>
</tr>
<tr>
<td>is_nonconcurrent</td>
<td>是否并发</td>
</tr>
<tr>
<td>is_update_data</td>
<td>是否更新数据</td>
</tr>
<tr>
<td>requests_recovery</td>
<td>是否接受恢复执行,默认为false,设置了RequestsRecovery为true,则该job会被重新执行</td>
</tr>
<tr>
<td>job_data</td>
<td>一个blob字段,存放持久化job对象</td>
</tr>
</tbody>
</table>
<h5 id="2-qrtz-triggers:-保存触发器的基本信息"><a href="#2-qrtz-triggers:-保存触发器的基本信息" class="headerlink" title="2. qrtz_triggers: 保存触发器的基本信息"></a>2. qrtz_triggers: 保存触发器的基本信息</h5><table>
<thead>
<tr>
<th>表字段</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>sched_name</td>
<td>调度名称</td>
</tr>
<tr>
<td>trigger_name</td>
<td>触发器的名字,该名字用户自己可以随意定制,无强行要求</td>
</tr>
<tr>
<td>trigger_group</td>
<td>触发器所属组的名字,该名字用户自己随意定制,无强行要求</td>
</tr>
<tr>
<td>job_name</td>
<td>qrtz_job_details表job_name的外键</td>
</tr>
<tr>
<td>job_group</td>
<td>qrtz_job_details表job_group的外键</td>
</tr>
<tr>
<td>description</td>
<td>相关介绍</td>
</tr>
<tr>
<td>next_fire_time</td>
<td>上一次触发时间(毫秒)</td>
</tr>
<tr>
<td>prev_fire_time</td>
<td>下一次触发时间,默认为-1,意味不会自动触发</td>
</tr>
<tr>
<td>priority</td>
<td>优先级</td>
</tr>
<tr>
<td>trigger_state</td>
<td>当前触发器状态,设置为ACQUIRED,如果设置为WAITING,则job不会触发</td>
</tr>
<tr>
<td>trigger_type</td>
<td>触发器的类型,使用cron表达式</td>
</tr>
<tr>
<td>start_time</td>
<td>开始时间</td>
</tr>
<tr>
<td>end_time</td>
<td>结束时间</td>
</tr>
<tr>
<td>calendar_name</td>
<td>日程表名称,表qrtz_calendars的calendar_name字段外键</td>
</tr>
<tr>
<td>misfire_instr</td>
<td>措施或者是补偿执行的策略</td>
</tr>
<tr>
<td>job_data</td>
<td>一个blob字段,存放持久化job对象</td>
</tr>
</tbody>
</table>
<h5 id="3-qrtz-cron-triggers:存储触发器的cron表达式表。"><a href="#3-qrtz-cron-triggers:存储触发器的cron表达式表。" class="headerlink" title="3. qrtz_cron_triggers:存储触发器的cron表达式表。"></a>3. qrtz_cron_triggers:存储触发器的cron表达式表。</h5><table>
<thead>
<tr>
<th>表字段</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>sched_name</td>
<td>调度名称</td>
</tr>
<tr>
<td>trigger_name</td>
<td>qrtz_triggers表trigger_name的外键</td>
</tr>
<tr>
<td>trigger_group</td>
<td>qrtz_triggers表trigger_group的外键</td>
</tr>
<tr>
<td>cron_expression</td>
<td>cron表达式</td>
</tr>
<tr>
<td>time_zone_id</td>
<td>时区</td>
</tr>
</tbody>
</table>
<h5 id="4-qrtz-scheduler-state:存储集群中note实例信息,quartz会定时读取该表的信息判断集群中每个实例的当前状态。"><a href="#4-qrtz-scheduler-state:存储集群中note实例信息,quartz会定时读取该表的信息判断集群中每个实例的当前状态。" class="headerlink" title="4. qrtz_scheduler_state:存储集群中note实例信息,quartz会定时读取该表的信息判断集群中每个实例的当前状态。"></a>4. qrtz_scheduler_state:存储集群中note实例信息,quartz会定时读取该表的信息判断集群中每个实例的当前状态。</h5><table>
<thead>
<tr>
<th>表字段</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>sched_name</td>
<td>调度名称</td>
</tr>
<tr>
<td>instance_name</td>
<td>之前配置文件中org.quartz.scheduler.instanceId配置的名字,就会写入该字段</td>
<td>,如果设置为AUTO,quartz会根据物理机名和当前时间产生一个名字</td>
</tr>
<tr>
<td>last_checkin_time</td>
<td>上次检查时间</td>
</tr>
<tr>
<td>checkin_interval</td>
<td>检查间隔时间</td>
</tr>
</tbody>
</table>
<h5 id="5-qrtz-blob-triggers:Trigger-作为-Blob-类型存储-用于-Quartz-用户用-JDBC-创建他们自己定制的-Trigger-类型,JobStore-并不知道如何存储实例的时候"><a href="#5-qrtz-blob-triggers:Trigger-作为-Blob-类型存储-用于-Quartz-用户用-JDBC-创建他们自己定制的-Trigger-类型,JobStore-并不知道如何存储实例的时候" class="headerlink" title="5. qrtz_blob_triggers:Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)"></a>5. qrtz_blob_triggers:Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)</h5><table>
<thead>
<tr>
<th>表字段</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>sched_name</td>
<td>调度名称</td>
</tr>
<tr>
<td>trigger_name</td>
<td>qrtz_triggers表trigger_name的外键</td>
</tr>
<tr>
<td>trigger_group</td>
<td>qrtz_triggers表trigger_group的外键</td>
</tr>
<tr>
<td>blob_data</td>
<td>一个blob字段,存放持久化Trigger对象</td>
</tr>
</tbody>
</table>
<h5 id="6-qrtz-calendars:以-Blob-类型存储存放日历信息,-quartz可配置一个日历来指定一个时间范围。"><a href="#6-qrtz-calendars:以-Blob-类型存储存放日历信息,-quartz可配置一个日历来指定一个时间范围。" class="headerlink" title="6. qrtz_calendars:以 Blob 类型存储存放日历信息, quartz可配置一个日历来指定一个时间范围。"></a>6. qrtz_calendars:以 Blob 类型存储存放日历信息, quartz可配置一个日历来指定一个时间范围。</h5><table>
<thead>
<tr>
<th>表字段</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>sched_name</td>
<td>调度名称</td>
</tr>
<tr>
<td>calendar_name</td>
<td>日历名称</td>
</tr>
<tr>
<td>calendar</td>
<td>一个blob字段,存放持久化calendar对象</td>
</tr>
</tbody>
</table>
<h5 id="7-qrtz-fired-triggers:存储与已触发的-Trigger-相关的状态信息,以及相联-Job-的执行信息。"><a href="#7-qrtz-fired-triggers:存储与已触发的-Trigger-相关的状态信息,以及相联-Job-的执行信息。" class="headerlink" title="7. qrtz_fired_triggers:存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息。"></a>7. qrtz_fired_triggers:存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息。</h5><table>
<thead>
<tr>
<th>表字段</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>sched_name</td>
<td>调度名称</td>
</tr>
<tr>
<td>entry_id</td>
<td>调度器实例id</td>
</tr>
<tr>
<td>trigger_name</td>
<td>qrtz_triggers表trigger_name的外键</td>
</tr>
<tr>
<td>trigger_group</td>
<td>qrtz_triggers表trigger_group的外键</td>
</tr>
<tr>
<td>instance_name</td>
<td>调度器实例名</td>
</tr>
<tr>
<td>fired_time</td>
<td>触发的时间</td>
</tr>
<tr>
<td>sched_time</td>
<td>定时器制定的时间</td>
</tr>
<tr>
<td>priority</td>
<td>优先级</td>
</tr>
<tr>
<td>state</td>
<td>状态</td>
</tr>
<tr>
<td>job_name</td>
<td>集群中job的名字,该名字用户自己可以随意定制,无强行要求</td>
</tr>
<tr>
<td>job_group</td>
<td>集群中job的所属组的名字,该名字用户自己随意定制,无强行要求 </td>
</tr>
<tr>
<td>is_nonconcurrent</td>
<td>是否并发</td>
</tr>
<tr>
<td>requests_recovery</td>
<td>是否接受恢复执行,默认为false,设置了RequestsRecovery为true,则会被重新执行</td>
</tr>
</tbody>
</table>
<h5 id="8-qrtz-locks:存储程序的悲观锁的信息-假如使用了悲观锁-。"><a href="#8-qrtz-locks:存储程序的悲观锁的信息-假如使用了悲观锁-。" class="headerlink" title="8. qrtz_locks:存储程序的悲观锁的信息(假如使用了悲观锁)。"></a>8. qrtz_locks:存储程序的悲观锁的信息(假如使用了悲观锁)。</h5><table>
<thead>
<tr>
<th>表字段</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>sched_name</td>
<td>调度名称</td>
</tr>
<tr>
<td>lock_name</td>
<td>悲观锁名称</td>
</tr>
</tbody>
</table>
<h5 id="9-qrtz-paused-trigger-grps:存储已暂停的-Trigger-组的信息。"><a href="#9-qrtz-paused-trigger-grps:存储已暂停的-Trigger-组的信息。" class="headerlink" title="9. qrtz_paused_trigger_grps:存储已暂停的 Trigger 组的信息。"></a>9. qrtz_paused_trigger_grps:存储已暂停的 Trigger 组的信息。</h5><table>
<thead>
<tr>
<th>表字段</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>sched_name</td>
<td>调度名称</td>
</tr>
<tr>
<td>trigger_group</td>
<td>qrtz_triggers表trigger_group的外键</td>
</tr>
</tbody>
</table>
<h5 id="10-qrtz-paused-trigger-grps:存储已暂停的-Trigger-组的信息。"><a href="#10-qrtz-paused-trigger-grps:存储已暂停的-Trigger-组的信息。" class="headerlink" title="10. qrtz_paused_trigger_grps:存储已暂停的 Trigger 组的信息。"></a>10. qrtz_paused_trigger_grps:存储已暂停的 Trigger 组的信息。</h5><table>
<thead>
<tr>
<th>表字段</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>sched_name</td>
<td>调度名称</td>
</tr>
<tr>
<td>trigger_group</td>
<td>qrtz_triggers表trigger_group的外键</td>
</tr>
</tbody>
</table>
<h5 id="11-qrtz-simple-triggers:存储简单的-Trigger,包括重复次数,间隔,以及已触发的次数。"><a href="#11-qrtz-simple-triggers:存储简单的-Trigger,包括重复次数,间隔,以及已触发的次数。" class="headerlink" title="11. qrtz_simple_triggers:存储简单的 Trigger,包括重复次数,间隔,以及已触发的次数。"></a>11. qrtz_simple_triggers:存储简单的 Trigger,包括重复次数,间隔,以及已触发的次数。</h5><table>
<thead>
<tr>
<th>sched_name</th>
<th>调度名称</th>
</tr>
</thead>
<tbody>
<tr>
<td>trigger_name</td>
<td>qrtz<em>triggers表trigger</em> name的外键</td>
</tr>
<tr>
<td>trigger_group</td>
<td>qrtz_triggers表trigger_group的外键</td>
</tr>
<tr>
<td>repeat_count</td>
<td>重复的次数统计</td>
</tr>
<tr>
<td>repeat_interval</td>
<td>重复的间隔时间</td>
</tr>
<tr>
<td>times_triggered</td>
<td>已经触发的次数</td>
</tr>
</tbody>
</table>
<h5 id="12-qrtz-simprop-triggers:存储CalendarIntervalTrigger和DailyTimeIntervalTrigger"><a href="#12-qrtz-simprop-triggers:存储CalendarIntervalTrigger和DailyTimeIntervalTrigger" class="headerlink" title="12. qrtz_simprop_triggers:存储CalendarIntervalTrigger和DailyTimeIntervalTrigger"></a>12. qrtz_simprop_triggers:存储CalendarIntervalTrigger和DailyTimeIntervalTrigger</h5><table>
<thead>
<tr>
<th>表字段</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>SCHED_NAME</td>
<td>调度名称</td>
</tr>
<tr>
<td>TRIGGER_NAME</td>
<td>qrtz<em>triggers表trigger</em> name的外键</td>
</tr>
<tr>
<td>TRIGGER_GROUP</td>
<td>qrtz_triggers表trigger_group的外键</td>
</tr>
<tr>
<td>STR_PROP_1</td>
<td>String类型的trigger的第一个参数</td>
</tr>
<tr>
<td>STR_PROP_2</td>
<td>String类型的trigger的第二个参数</td>
</tr>
<tr>
<td>STR_PROP_3</td>
<td>String类型的trigger的第三个参数</td>
</tr>
<tr>
<td>INT_PROP_1</td>
<td>int类型的trigger的第一个参数</td>
</tr>
<tr>
<td>INT_PROP_2</td>
<td>int类型的trigger的第二个参数</td>
</tr>
<tr>
<td>LONG_PROP_1</td>
<td>long类型的trigger的第一个参数</td>
</tr>
<tr>
<td>LONG_PROP_2</td>
<td>long类型的trigger的第二个参数</td>
</tr>
<tr>
<td>DEC_PROP_1</td>
<td>decimal类型的trigger的第一个参数</td>
</tr>
<tr>
<td>DEC_PROP_2</td>
<td>decimal类型的trigger的第二个参数</td>
</tr>
<tr>
<td>BOOL_PROP_1</td>
<td>Boolean类型的trigger的第一个参数</td>
</tr>
<tr>
<td>BOOL_PROP_2</td>
<td>Boolean类型的trigger的第二个参数</td>
</tr>
</tbody>
</table>
]]></content>
<summary type="html">
<h5 id="1-qrtz-job-details:存储每一个已配置的-jobDetail-的详细信息"><a href="#1-qrtz-job-details:存储每一个已配置的-jobDetail-的详细信息" class="headerlink" title="1. qrtz_job_details:存储每一个已配置的 jobDetail 的详细信息"></a>1. qrtz_job_details:存储每一个已配置的 jobDetail 的详细信息</h5>
</summary>
<category term="Quartz 分布式任务" scheme="//zeroto.tech/tags/Quartz-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BB%BB%E5%8A%A1/"/>
</entry>
<entry>
<title>Quartz Best Practices</title>
<link href="//zeroto.tech/2018/06/20/Quartz%20Best%20Practices/"/>
<id>//zeroto.tech/2018/06/20/Quartz Best Practices/</id>
<published>2018-06-20T08:28:15.000Z</published>
<updated>2018-08-02T07:57:20.000Z</updated>
<content type="html"><![CDATA[<h1 id="最佳实践"><a href="#最佳实践" class="headerlink" title="最佳实践"></a>最佳实践</h1><ul>
<li>Production System Tips</li>
<li>JobDataMap Tips</li>
<li>Trigger Tips</li>
<li>JDBC JobStore</li>
<li>Daylight Savings Time</li>
<li>Jobs</li>
<li>Listeners (TriggerListener, JobListener, SchedulerListener</li>
<li>Exposing Scheduler Functionality Through Applications</li>
</ul>
<a id="more"></a>
<h2 id="生产环境中的建议"><a href="#生产环境中的建议" class="headerlink" title="生产环境中的建议"></a>生产环境中的建议</h2><p><strong>跳过检查更新</strong><br>通过配置 “org.quartz.scheduler.skipUpdateCheck: true” 属性,你能够取消检查更新。</p>
<h2 id="JobDataMap-建议"><a href="#JobDataMap-建议" class="headerlink" title="JobDataMap 建议"></a>JobDataMap 建议</h2><p><strong>Only Store Primitive Data Types (including Strings) In the JobDataMap,避免序列化问题</strong></p>
<p><strong>Use the Merged JobDataMap</strong><br>在任务执行的时候,JobExecutionContext中的JobDataMap作为一个convenience。它是通过在JobDetail中的JobDataMap和Trigger中的JobDataMap合并而来,后者中的值会覆盖前面一个中同名变量的值。</p>
<p>当你有一个任务在scheduler中,而且这个任务又会被多个Triggers重复使用,那么你最好把值存在Trigger的JobDataMap中,这样对于每次独立的任务触发时,你就可以为Job提供不同的数据输入啦。</p>
<p>根据以上所述,我们提出了如下的最佳实践:在调用Job.execute(…)方法时,一般来说应该从JobExecutionContext中的JobDataMap中解析变量的值,而不是直接从JobDetail的JobDataMap中解析。</p>
<h2 id="Trigger-建议"><a href="#Trigger-建议" class="headerlink" title="Trigger 建议"></a>Trigger 建议</h2><p><strong>Use TriggerUtils</strong></p>
<ul>
<li>提供了一个简单的方法来创建triggers(schedules)</li>
<li>有很多不同的方法通过schedules来创建triggers以满足特定的描述,这个要比直接实例化特定类型的triggers(SimpleTrigger,CronTrigger等)然后调用不同的setter方法来配置它们方便许多</li>
<li>提供了一个简单的方法来创建日期(比如start/end日期)</li>
<li>提供了分析triggers的助手(e.g. calculating future fire times)</li>
</ul>
<h2 id="JDBC-JobStore"><a href="#JDBC-JobStore" class="headerlink" title="JDBC JobStore"></a>JDBC JobStore</h2><p><strong>永远都不要直接往Quartz的表中写数据</strong><br>Writing scheduling data directly to the database (via SQL) rather than using scheduling API:<br><strong>永远不要在同一个Database将一个Non-Clustered Scheduler 指向另一个相同名字的Scheduler Name</strong><br>If you point more than one scheduler instance at the same set of database tables, and one or more of those instances is not configured for clustering, any of the following may occur:</p>
<ul>
<li>会造成数据腐化(被删除的数据,混乱的数据)</li>
<li>会造成任务在到达执行点的时候像没有执行就消失了</li>
<li>会造成当触发时间到来时,而任务还未执行</li>
<li>可能会造成死锁</li>
</ul>
<p><strong>Ensure Adequate Datasource Connection Size</strong><br>建议将你的数据源连接数配置为配置为线程池中工作线程数加3。如果你的应用还要经常调用scheduler的API,那么你还需要增加额外的connections。If you are using JobStoreCMT, the “non managed” datasource should have a max connection size of at least four.</p>
<h2 id="Daylight-Savings-Time"><a href="#Daylight-Savings-Time" class="headerlink" title="Daylight Savings Time"></a>Daylight Savings Time</h2><p><strong>Avoid Scheduling Jobs Near the Transition Hours of Daylight Savings Time</strong><br>注意:本地的时钟向前或者向后转移时和总的时间的细节可以在如下链接中找到:<br><a href="https://en.wikipedia.org/wiki/Daylight_saving_time_by_country" target="_blank" rel="external">https://en.wikipedia.org/wiki/Daylight_saving_time_by_country</a>.</p>
<p>SimpleTriggers不受夏令时的影响,这是因为它们总是在毫秒时刻被精确地触发,并且在进过了精确的毫秒数之后会再次被触发。</p>
<p>由于CronTriggers会在给定的时/分/秒被触发,当夏令时转移时到来的时候,它们会受到这些怪事的影响。</p>
<p>举一个可能发生的例子,在夏令时的美国时区/位置进行调度的时候,如果使用CronTrigger并且调度的触发时间是在1:00 AM和2:00 AM之间时会发生下列的问题:</p>
<ul>
<li>1:05 AM may occur twice! - duplicate firings on CronTrigger possible</li>
<li>2:05 AM may never occur! - missed firings on CronTrigger possible</li>
</ul>
<p>Again, specifics of time and amount of adjustment varies by locale.</p>
<p>其他的触发器类型是根据日历的移动而不是根据确切的时间量来进行的,例如CalenderIntervalTrigger,将会同样地受影响,但不是错过触发或者触发两次,而是将它的触发时间偏移一个小时。</p>
<h2 id="Jobs"><a href="#Jobs" class="headerlink" title="Jobs"></a>Jobs</h2><p><strong>等待条件来到</strong><br>长时间运行的任务会阻止其他任务的运行(如果在线程池中所有的线程都繁忙)。</p>
<p>如果你认为需要调用 Thread.sleep() 这个方法来停止工作线程执行任务,这是一个典型的信号,任务不会完成其余的任务,因它必须等待某些条件的到来(比如某些数据可读)。</p>
<p>一个更好的方法是释放线程 (exit the job) 并且允许其他任务在这个线程执行。任务可以重新调度自己,或者在它退出之前其他任务。</p>
<p><strong>抛出异常</strong><br>一个任务的执行方法应该包含在try-catch块中,以此处理可能发生的异常。</p>
<p>如果一个任务抛出一个异常,Quartz一般会马上再执行它(可能会抛出相同的异常)。最好是任务捕获所有它可能遇到的异常并处理它们,然后重新调度自己或其他的任务。</p>
<p><strong>可恢复性和幂等性</strong><br>In-progress Jobs marked “recoverable” are automatically re-executed after a scheduler fails. This means some of the job’s “work” will be executed twice.</p>
<p>This means the job should be coded in such a way that its work is idempotent.</p>
<h2 id="监听器(TriggerListener-JobListener-SchedulerListener)"><a href="#监听器(TriggerListener-JobListener-SchedulerListener)" class="headerlink" title="监听器(TriggerListener, JobListener, SchedulerListener)"></a>监听器(TriggerListener, JobListener, SchedulerListener)</h2><p><strong>Keep Code In Listeners Concise And Efficient</strong><br>Keep Code In Listeners Concise And Efficient<br>Performing large amounts of work is discouraged, as the thread that would be executing the job (or completing the trigger and moving on to firing another job, etc.) will be tied up within the listener.</p>
<p><strong>处理异常</strong><br>每个监听器的方法都应该在try-catch块中处理所有可能的异常。</p>
<p>如果一个监听器抛出了一个异常,可能会造成其他的监听器无法被通知到或阻止其他任务的执行等。</p>
<h2 id="通过应用来暴露调度器的功能"><a href="#通过应用来暴露调度器的功能" class="headerlink" title="通过应用来暴露调度器的功能"></a>通过应用来暴露调度器的功能</h2><p><strong>Be Careful of Security!</strong><br>有的用户通过应用程序接口来暴露Quartz的调度功能。这会非常有用,虽它可能会造成极度的危险。</p>
<p>确保你没有错误地允许用户定义他们想要的任何参数和任何类型的任务。例如,Quartz会带有一个预定的任务org.quartz.jobs.NativeJob,这个任务将会在它们定义的任意的本地系统上执行命令。恶意的用户可能会使用这个来控制或者摧毁你的系统。</p>
<p>同样的像 SendEmailJob 之类的任务,并且事实上任何其他的任务都可以被当作恶意用途。</p>
<p>如果允许用户定义任意他们想要的任务将会是你的系统遭受各种可能的危害,等同于 OWASP 和 MITRE 定义的命令注入攻击等。</p>
<h1 id="参考在此:"><a href="#参考在此:" class="headerlink" title="参考在此:"></a>参考在此:</h1><p><a href="http://www.quartz-scheduler.org/documentation/best-practices.html" target="_blank" rel="external">Quartz Best Practices(http://www.quartz-scheduler.org/documentation/best-practices.html)</a></p>
]]></content>
<summary type="html">
<h1 id="最佳实践"><a href="#最佳实践" class="headerlink" title="最佳实践"></a>最佳实践</h1><ul>
<li>Production System Tips</li>
<li>JobDataMap Tips</li>
<li>Trigger Tips</li>
<li>JDBC JobStore</li>
<li>Daylight Savings Time</li>
<li>Jobs</li>
<li>Listeners (TriggerListener, JobListener, SchedulerListener</li>
<li>Exposing Scheduler Functionality Through Applications</li>
</ul>
</summary>
<category term="Quartz" scheme="//zeroto.tech/tags/Quartz/"/>
</entry>
<entry>
<title>网线接口转换器 苹果Mac集线器HUB接硬盘</title>
<link href="//zeroto.tech/2018/06/05/Mac%20%E7%BD%91%E7%BA%BF%E6%8E%A5%E5%8F%A3%E8%BD%AC%E6%8D%A2%E5%99%A8%E7%9A%84%E6%AD%A3%E7%A1%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95/"/>
<id>//zeroto.tech/2018/06/05/Mac 网线接口转换器的正确使用方法/</id>
<published>2018-06-05T09:38:55.000Z</published>
<updated>2018-06-05T09:55:26.000Z</updated>
<content type="html"><![CDATA[<h1 id="Mac-连接网线"><a href="#Mac-连接网线" class="headerlink" title="Mac 连接网线"></a>Mac 连接网线</h1><p>以我在京东上购买的 毕亚兹(biaze) USB分线器3.0 千兆有线网卡 USB转RJ45网线接口转换器 苹果Mac集线器HUB接硬盘 ZH17-金属银 为例:</p>
<pre><code class="sh">~ csrutil status
System Integrity Protection status: enabled (Custom Configuration).
Configuration:
Apple Internal: disabled
Kext Signing: enabled
Filesystem Protections: enabled
Debugging Restrictions: disabled
DTrace Restrictions: enabled
NVRAM Protections: enabled
BaseSystem Verification: enabled
This is an unsupported configuration, likely to break in the future and leave your machine in an unknown state.
~
</code></pre>
<p>首先,SIP status 必须是 disabled 状态才行,可以通过以下步骤设置:<br>1、重启电脑<br>2、按住command+r进入恢复模式<br>3、点击顶部菜单栏实用工具中的终端,(可以输入csrutil status检查状态)<br>4、然后输入csrutil disable</p>
<p>其次,<a href="http://www.realtek.com/downloads/downloadsView.aspx?Langid=3&PNid=56&PFid=56&Level=5&Conn=4&DownTypeID=3&GetDown=false#7" target="_blank" rel="external">下载驱动</a>,选择 MAC OS 10.6 to 10.13 版本,下载安装。</p>
<p>最后,重启电脑。此时,关闭Wi-Fi 网络,试试网络吧。公司网络应该是用网线连接上了。</p>
]]></content>
<summary type="html">
<h1 id="Mac-连接网线"><a href="#Mac-连接网线" class="headerlink" title="Mac 连接网线"></a>Mac 连接网线</h1><p>以我在京东上购买的 毕亚兹(biaze) USB分线器3.0 千兆有线网卡 USB转RJ45
</summary>
<category term="Mac 网线接口转换器" scheme="//zeroto.tech/tags/Mac-%E7%BD%91%E7%BA%BF%E6%8E%A5%E5%8F%A3%E8%BD%AC%E6%8D%A2%E5%99%A8/"/>
</entry>
<entry>
<title>亿级流量网站架构核心技术</title>
<link href="//zeroto.tech/2018/05/14/%E9%AB%98%E5%8F%AF%E7%94%A8%E4%B8%8E%E9%AB%98%E5%B9%B6%E5%8F%91/"/>
<id>//zeroto.tech/2018/05/14/高可用与高并发/</id>
<published>2018-05-14T08:01:27.000Z</published>
<updated>2018-05-14T08:20:33.000Z</updated>
<content type="html"><![CDATA[<h1 id="跟开涛学搭建高可用高并发系统"><a href="#跟开涛学搭建高可用高并发系统" class="headerlink" title="跟开涛学搭建高可用高并发系统"></a>跟开涛学搭建高可用高并发系统</h1><p>本书将介绍缓存、异步并发、连接池、线程池、如何扩容、消息队列、分布式任务等高并发原则来提升系统吞吐量。</p>
<p>通过负载均衡和反向代理实现分流,通过限流 保护服务免受雪崩之灾,<br>通过降级实现部分可用、有损服务,通过隔离实现故障隔离,<br>通过设置合理的超时与重试机制避免请求堆积造成雪崩,通过回滚机制快速修复错误版本;<br>使得系统高可用。</p>
<a id="more"></a>
<p><img src="/assets/blogImg/高可用.png" alt="高可用"></p>
<p><img src="/assets/blogImg/高并发.png" alt="高并发"></p>
]]></content>
<summary type="html">
<h1 id="跟开涛学搭建高可用高并发系统"><a href="#跟开涛学搭建高可用高并发系统" class="headerlink" title="跟开涛学搭建高可用高并发系统"></a>跟开涛学搭建高可用高并发系统</h1><p>本书将介绍缓存、异步并发、连接池、线程池、如何扩容、消息队列、分布式任务等高并发原则来提升系统吞吐量。</p>
<p>通过负载均衡和反向代理实现分流,通过限流 保护服务免受雪崩之灾,<br>通过降级实现部分可用、有损服务,通过隔离实现故障隔离,<br>通过设置合理的超时与重试机制避免请求堆积造成雪崩,通过回滚机制快速修复错误版本;<br>使得系统高可用。</p>
</summary>
<category term="高可用" scheme="//zeroto.tech/tags/%E9%AB%98%E5%8F%AF%E7%94%A8/"/>
<category term="高并发" scheme="//zeroto.tech/tags/%E9%AB%98%E5%B9%B6%E5%8F%91/"/>
</entry>
<entry>
<title>那些年我看过的书</title>
<link href="//zeroto.tech/2018/03/14/recommend-books/"/>
<id>//zeroto.tech/2018/03/14/recommend-books/</id>
<published>2018-03-14T05:42:13.000Z</published>
<updated>2018-06-22T01:12:18.000Z</updated>
<content type="html"><![CDATA[<h1 id="开头"><a href="#开头" class="headerlink" title="开头"></a>开头</h1><p>2012年底正式参加工作,先后经历了三家单位(软通、必联(北京)电子商务、北京四合天地科技),有短有长(补充:2018-06入职互金行业了)。有的得到了经验,有的在那里得到了成长。不付青春吧。期间也认识了不少志同道合的好同事,有些也成为了好朋友。技术道路上还需披荆斩棘,更进一步。回首往事,才能更好的展望未来。</p>
<a id="more"></a>
<p><img src="/assets/blogImg/In-the-Grass.jpg" alt="In-the-Grass"></p>
<h2 id="技术书籍推荐(90-都是购买的书籍,偏爱)"><a href="#技术书籍推荐(90-都是购买的书籍,偏爱)" class="headerlink" title="技术书籍推荐(90%都是购买的书籍,偏爱)"></a>技术书籍推荐(90%都是购买的书籍,偏爱)</h2><p>有些是在京东上购买的书籍,有些是在异步社区上购买的,还有些就是<a href="http://tengj.top/" target="_blank" rel="external">嘟嘟独立博客</a>电子书互助计划得到的。<br>1、 《Java 核心技术》卷一 、卷二 两本书,算是入门比较好的书籍了<br>2、 <a href="https://legacy.gitbook.com/book/quanke/think-in-java/details" target="_blank" rel="external">Thinking in Java (Java 编程思想)</a>GitBook 可下载阅读。第13章没有编辑,Java的GUI现在应用少,正合我意。<br>3、 《Java 并发编程实战》<br>4、 《实战Java高并发程序设计》<br>5、 <a href="https://legacy.gitbook.com/@zhengyq" target="_blank" rel="external">Effective Java 中文版 第2版</a>GitBook 可下载阅读。算是 Java 的进阶书籍了,面试好多问题也是从这出来的<br>6、 《图解数据结构-使用Java》<br>7、 《Spring揭秘》<br>8、 《设计模式之禅(第2版)》<br>9、 《Redis实战》异步社区,购买的正版电子图书。超级清晰。在此推广一波<br>10、《MyBatis从入门到精通__刘增辉(著)》<br>11、《Android群英传:神兵利器》<br>12、《图解HTTP》对互联网基盘-HTTP协议进行了全面系统的介绍<br>13、《图解TCP/IP(第5版)》<br>14、《Spring Boot实战 ,丁雪丰 (译者) 》<br>15、《阿里巴巴Java开发手册(终极版)》</p>
<h3 id="算法"><a href="#算法" class="headerlink" title="算法"></a>算法</h3><p>1、《数据结构与算法分析-Java语言描述 第3版》木有坚持读下来<br>2、《算法 第4版》木有坚持读下来<br>3、《程序员的数学1》<br>4、《程序员的数学2:概率统计》<br>5、《程序员的数学3:线性代数》</p>
<h3 id="架构"><a href="#架构" class="headerlink" title="架构"></a>架构</h3><p>1、《大型网站技术架构:核心原理与案例分析》<br>2、《淘宝技术这十年》<br>3、《亿级流量网站架构核心技术(跟开涛学搭建高可用高并发系统)》<br>4、《深入分布式缓存:从原理到实践》<br>5、《Spring Cloud微服务实战》<br>6、《架构探险:轻量级微服务架构(上)》黄勇。由此加入了勇哥建立的微信群,大佬云集<br>7、《分布式服务框架原理与实践》<br>8、《Netty权威指南第二版》</p>
<h2 id="优秀博客推荐"><a href="#优秀博客推荐" class="headerlink" title="优秀博客推荐"></a>优秀博客推荐</h2><p>1、<a href="https://www.geekonomics10000.com/" target="_blank" rel="external">万维钢 用理工科思维理解世界</a><br>2、<a href="http://mindhacks.cn/" target="_blank" rel="external">刘未鹏</a><br>3、<a href="https://coolshell.cn/" target="_blank" rel="external">酷壳-陈皓</a><br>4、<a href="http://jinnianshilongnian.iteye.com/" target="_blank" rel="external">开涛的博客</a><br>5、<a href="http://cmsblogs.com/" target="_blank" rel="external">chenssy</a> Java并发编程实战</p>
<h2 id="人文书籍推荐"><a href="#人文书籍推荐" class="headerlink" title="人文书籍推荐"></a>人文书籍推荐</h2><p>1、《暗时间》 刘未鹏 | <a href="http://mindhacks.cn/" target="_blank" rel="external">Mind Hacks思维改变生活</a><br>2、《数学之美 (第二版)》吴军博士的,“数学之美”系列文章原刊载于谷歌黑板报<br>3、《浪潮之巅》同样也是吴军博士的<br>4、《三国机密》、《三国配角演义》马伯庸老爷子,有“文字鬼才”之誉<br>5、《北京折叠》<br>6、《人类简史》<br>7、《万万没想到:用理工科思维理解世界》万维钢<br>8、《黑客与画家》<br>9、《如何变得有意思:阮一峰博客文集》<br>10、《MacTalk 跨越边界》<br>11、《禅与摩托车维修艺术》</p>
<h2 id="商业、经济、财经"><a href="#商业、经济、财经" class="headerlink" title="商业、经济、财经"></a>商业、经济、财经</h2><p>1、《联盟:互联网时代的人才变革》参加了樊登读书会,因而知道的这本书<br>2、《重新定义公司:谷歌是如何运营的》<br>3、《罗辑思维 有种·有料·有趣》<br>4、《魔鬼经济学》也是罗辑思维视频节目了解到的,共四册;只读了前两册。<br>5、《从0到1开启商业与未来的秘密》<br>6、《怪诞行为学:可预测的非理性》<br>7、《怪诞行为学2:非理性的积极力量》<br>8、《三体:黑暗森林》<br>9、《我在碧桂园的1000天》电子版内部使用。以财务之眼看杨国强和他的地产王国。在碧桂园人称“三斌”之一吴建斌 著;</p>
<h2 id="工具"><a href="#工具" class="headerlink" title="工具"></a>工具</h2><p>Git : 廖雪峰的 Git 教程<br>IDEA:<a href="https://github.com/judasn/IntelliJ-IDEA-Tutorial" target="_blank" rel="external">IntelliJ IDEA 简体中文专题教程</a><br>Maven:《Maven实战》</p>
<h2 id="程序员的自我修养"><a href="#程序员的自我修养" class="headerlink" title="程序员的自我修养"></a>程序员的自我修养</h2><p>1、《程序员修炼之道-从小工到专家》<br>2、《代码整洁之道》<br>3、《重构:改善既有代码的设计》<br>4、《软技能:代码之外的生存指南》 程序员除了写代码,还得懂点其他的软技能</p>
<h2 id="生活、其他"><a href="#生活、其他" class="headerlink" title="生活、其他"></a>生活、其他</h2><p>1、《悟空传》今何在。有这样一群人,他们宁肯死,也不肯输。<br>2、《煮酒探西游》吴闲云<br>3、《我不是潘金莲》刘震云的几乎都买来读过;12年、13年那两年很喜欢读他的书,一句顶一万句,温故一九四二、一地鸡毛、温故一九四二。<br>4、《人民的名义》影视剧开播前就已经读完了,电视剧还是追了。<br>5、《你我皆凡人》:从金庸武侠里读出来的现实江湖(六神磊磊处女作)。有微信大号“六神磊磊读金庸”,置顶公众号,粉丝支持所以买了这本书。<br>6、《为什么你总是害怕来不及》<br>7、《从你的全世界路过》张嘉佳<br>8、《儒林外史》、三言两拍;<br>9、《万历十五年》</p>
<h2 id="计划要看的电子书"><a href="#计划要看的电子书" class="headerlink" title="计划要看的电子书"></a>计划要看的电子书</h2><p>1、《编程之法:面试和算法心得_迷你书》<br>2、《架构即未来 现代企业可扩展的Web架构流程和组织原书第2版》<br>3、《一线架构师实践指南》<br>4、《O2O实战+他们是如何利用互联网的》<br>5、《实战Elasticsearch、Logstash、Kibana++分布式大数据搜索与日志挖掘及可视化解决方案》<br>6、《数据库查询优化器的艺术:原理解析与SQL性能优化》</p>
<h1 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h1><p>个人认为,作为程序员不要吝啬对自己的投资,只有自己强大了才能更好的赚钱。每年都要买几本书投资一下,未来的回报会超出你的想象的,博主先准备把2017年买的书先看完先。</p>
]]></content>
<summary type="html">
<h1 id="开头"><a href="#开头" class="headerlink" title="开头"></a>开头</h1><p>2012年底正式参加工作,先后经历了三家单位(软通、必联(北京)电子商务、北京四合天地科技),有短有长(补充:2018-06入职互金行业了)。有的得到了经验,有的在那里得到了成长。不付青春吧。期间也认识了不少志同道合的好同事,有些也成为了好朋友。技术道路上还需披荆斩棘,更进一步。回首往事,才能更好的展望未来。</p>
</summary>
<category term="随笔" scheme="//zeroto.tech/tags/%E9%9A%8F%E7%AC%94/"/>
</entry>
<entry>
<title>Spring Cloud构建微服务架构</title>
<link href="//zeroto.tech/2018/03/07/Spring%20Boot%E6%9E%84%E5%BB%BA%E5%BE%AE%E6%9C%8D%E5%8A%A1/"/>
<id>//zeroto.tech/2018/03/07/Spring Boot构建微服务/</id>
<published>2018-03-07T06:45:37.000Z</published>
<updated>2018-08-02T07:25:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="接触Spring-Boot"><a href="#接触Spring-Boot" class="headerlink" title="接触Spring Boot"></a>接触Spring Boot</h1><p>2016年 Spring Boot 还没有被广泛使用,到了现在经过2年的发展,很多互联网公司已经将 Spring Boot 搬上了生产,而使用 Spring Boot 的开源项目在 Github/码云 上面已有不少,很有必要开启一波学习潮了。</p>
<p>听到了一句挺中肯的话,“离开场景和业务的修炼都是伪命题”。所以呢,有必要总结一下Spring Boot 相关的开源项目,选取一个感兴趣的,然后深入学习提交pr,真正的提高自己的技术能力。</p>
<a id="more"></a>
<h2 id="搜集"><a href="#搜集" class="headerlink" title="搜集"></a>搜集</h2><ul>
<li><a href="https://gitee.com/vmaps" target="_blank" rel="external">springcloud-app/dubbo-app</a></li>
<li><a href="http://springcloud.cn/view/337" target="_blank" rel="external">海信商业云平台的微服务落地实践</a>马映辉 群分享</li>
<li><a href="https://mp.weixin.qq.com/s/R4uUH0y-ZwoelLNnM4zYow" target="_blank" rel="external">如何把复杂单体应用快速迁移到微服务</a></li>
<li><a href="http://tengj.top/2017/04/24/springboot0/" target="_blank" rel="external">Spring Boot干货系列总纲</a></li>
<li><a href="https://www.bysocket.com/?page_id=1639" target="_blank" rel="external">Spring Boot 那些事</a></li>
<li><a href="http://blog.didispace.com/Spring-Boot基础教程/" target="_blank" rel="external">Spring Boot基础教程</a></li>
<li>[江南一点雨(Spring Cloud教程合集)]作者参考了程序猿DD(翟永超)一书《Spring Cloud微服务实战》,可用来作为辩证学习的素材。</li>
<li>[江南一点雨] <a href="https://github.com/lenve" target="_blank" rel="external">https://github.com/lenve</a></li>
<li><a href="http://xujin.org/" target="_blank" rel="external">沉思录</a> Spring Cloud中国社区创始人,业余主要研究Spring Cloud。我们微信群猪的博客,强力推荐。</li>
</ul>
<h2 id="有思想的博客站点"><a href="#有思想的博客站点" class="headerlink" title="有思想的博客站点"></a>有思想的博客站点</h2><ul>
<li><a href="https://my.oschina.net/huangyong" target="_blank" rel="external">黄勇</a> 群主,强力推荐。</li>
<li><a href="http://www.ityouknow.com/" target="_blank" rel="external">纯洁的微笑</a> 微笑大佬,我们【原创技术博客作者交流群】群主。</li>
<li><a href="http://blog.didispace.com/" target="_blank" rel="external">程序猿DD</a></li>
<li><a href="http://tengj.top/" target="_blank" rel="external">嘟嘟独立博客</a></li>
<li><a href="https://www.bysocket.com/" target="_blank" rel="external">泥瓦匠BYSocket</a></li>
<li><a href="https://blog.52itstyle.com/" target="_blank" rel="external">小柒2012</a></li>
<li><a href="http://www.itmuch.com/" target="_blank" rel="external">周立</a></li>
<li><a href="https://juejin.im/user/56fe494539b0570054f2e032" target="_blank" rel="external">Aresn</a> iView 主力开发者</li>
<li><a href="https://juejin.im/post/591aa14f570c35006961acac" target="_blank" rel="external">花裤衩(手摸手,带你用vue撸后台)</a></li>
<li><a href="http://www.itdiffer.com/" target="_blank" rel="external">老齐</a></li>
<li><a href="http://goileo.top/#blog" target="_blank" rel="external">Goileo Lee</a></li>
<li><a href="http://binux.cn/" target="_blank" rel="external">许彬</a></li>
<li><a href="http://stormzhang.com/" target="_blank" rel="external">stormzhang</a></li>
<li><a href="http://shiyanjun.cn/" target="_blank" rel="external">简单之美</a></li>
<li><a href="https://gitee.com/sunlightcs" target="_blank" rel="external">独孤求胜</a></li>
<li><a href="http://blog.mayongfa.cn/" target="_blank" rel="external">马勇发</a></li>
<li><a href="http://blog.csdn.net/singwhatiwanna" target="_blank" rel="external">任玉刚</a></li>
<li><a href="https://jianshiapp.com/circles/1209" target="_blank" rel="external">见识(web前端)</a></li>
<li><a href="https://monkeysayhi.github.io/" target="_blank" rel="external">猴子007</a></li>
<li><a href="http://litten.me/" target="_blank" rel="external">Litten</a></li>
<li><a href="http://imweb.io/" target="_blank" rel="external">IMWeb前端博客</a></li>
<li><a href="https://github.com/Blankj/awesome-java-leetcode" target="_blank" rel="external">Blankj</a> 有个非常知名的 awesome-java-leetcode</li>
<li><a href="https://blankj.com/" target="_blank" rel="external">https://blankj.com/</a></li>
<li><a href="http://guolin.tech" target="_blank" rel="external">郭霖</a></li>
<li><a href="http://blog.csdn.net/lmj623565791" target="_blank" rel="external">张鸿洋</a></li>
<li><a href="http://www.wanandroid.com/" target="_blank" rel="external">http://www.wanandroid.com/</a> 张鸿洋运营</li>
<li><a href="http://blog.csdn.net/eclipsexys" target="_blank" rel="external">eclipse_xu</a> 《Android群英传:神兵利器》,买了读过。有意思的人儿</li>