-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
908 lines (791 loc) · 89.4 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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><![CDATA[Cribug's Notes]]></title>
<link href="/atom.xml" rel="self"/>
<link href="http://notes.cribug.com/"/>
<updated>2016-06-23T19:09:49.722Z</updated>
<id>http://notes.cribug.com/</id>
<author>
<name><![CDATA[Cribug]]></name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title><![CDATA[PHP 数组函数列表]]></title>
<link href="http://notes.cribug.com/2016/php-array-function/"/>
<id>http://notes.cribug.com/2016/php-array-function/</id>
<published>2016-06-23T18:39:00.000Z</published>
<updated>2016-06-23T19:09:49.722Z</updated>
<content type="html"><![CDATA[<p>在开发过程中,做数组处理的时候,往往因为对编程语言的内置函数不清楚,而重写了这些功能,走了不少弯路,下面是 PHP 中最强大的数组函数列表,一定要记清。</p>
<ul>
<li><a href="http://php.net/manual/zh/function.array-change-key-case.php" target="_blank" rel="external">array_change_key_case</a> — 返回字符串键名全为小写或大写的数组</li>
<li><a href="http://php.net/manual/zh/function.array-chunk.php" target="_blank" rel="external">array_chunk</a> — 将一个数组分割成多个</li>
<li><a href="http://php.net/manual/zh/function.array-column.php" target="_blank" rel="external">array_column</a> — 返回数组中指定的一列</li>
<li><a href="http://php.net/manual/zh/function.array-combine.php" target="_blank" rel="external">array_combine</a> — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值</li>
<li><a href="http://php.net/manual/zh/function.array-count-values.php" target="_blank" rel="external">array_count_values</a> — 统计数组中所有的值出现的次数</li>
<li><a href="http://php.net/manual/zh/function.array-diff-assoc.php" target="_blank" rel="external">array_diff_assoc</a> — 带索引检查计算数组的差集</li>
<li><a href="http://php.net/manual/zh/function.array-diff-key.php" target="_blank" rel="external">array_diff_key</a> — 使用键名比较计算数组的差集</li>
<li><a href="http://php.net/manual/zh/function.array-diff-uassoc.php" target="_blank" rel="external">array_diff_uassoc</a> — 用用户提供的回调函数做索引检查来计算数组的差集</li>
<li><a href="http://php.net/manual/zh/function.array-diff-ukey.php" target="_blank" rel="external">array_diff_ukey</a> — 用回调函数对键名比较计算数组的差集</li>
<li><a href="http://php.net/manual/zh/function.array-diff.php" target="_blank" rel="external">array_diff</a> — 计算数组的差集</li>
<li><a href="http://php.net/manual/zh/function.array-fill-keys.php" target="_blank" rel="external">array_fill_keys</a> — 使用指定的键和值填充数组</li>
<li><a href="http://php.net/manual/zh/function.array-fill.php" target="_blank" rel="external">array_fill</a> — 用给定的值填充数组</li>
<li><a href="http://php.net/manual/zh/function.array-filter.php" target="_blank" rel="external">array_filter</a> — 用回调函数过滤数组中的单元</li>
<li><a href="http://php.net/manual/zh/function.array-flip.php" target="_blank" rel="external">array_flip</a> — 交换数组中的键和值</li>
<li><a href="http://php.net/manual/zh/function.array-intersect-assoc.php" target="_blank" rel="external">array_intersect_assoc</a> — 带索引检查计算数组的交集</li>
<li><a href="http://php.net/manual/zh/function.array-intersect-key.php" target="_blank" rel="external">array_intersect_key</a> — 使用键名比较计算数组的交集</li>
<li><a href="http://php.net/manual/zh/function.array-intersect-uassoc.php" target="_blank" rel="external">array_intersect_uassoc</a> — 带索引检查计算数组的交集,用回调函数比较索引</li>
<li><a href="http://php.net/manual/zh/function.array-intersect-ukey.php" target="_blank" rel="external">array_intersect_ukey</a> — 用回调函数比较键名来计算数组的交集</li>
<li><a href="http://php.net/manual/zh/function.array-intersect.php" target="_blank" rel="external">array_intersect</a> — 计算数组的交集</li>
<li><a href="http://php.net/manual/zh/function.array-key-exists.php" target="_blank" rel="external">array_key_exists</a> — 检查给定的键名或索引是否存在于数组中</li>
<li><a href="http://php.net/manual/zh/function.array-keys.php" target="_blank" rel="external">array_keys</a> — 返回数组中部分的或所有的键名</li>
<li><a href="http://php.net/manual/zh/function.array-map.php" target="_blank" rel="external">array_map</a> — 将回调函数作用到给定数组的单元上</li>
<li><a href="http://php.net/manual/zh/function.array-merge-recursive.php" target="_blank" rel="external">array_merge_recursive</a> — 递归地合并一个或多个数组</li>
<li><a href="http://php.net/manual/zh/function.array-merge.php" target="_blank" rel="external">array_merge</a> — 合并一个或多个数组</li>
<li><a href="http://php.net/manual/zh/function.array-multisort.php" target="_blank" rel="external">array_multisort</a> — 对多个数组或多维数组进行排序</li>
<li><a href="http://php.net/manual/zh/function.array-pad.php" target="_blank" rel="external">array_pad</a> — 用值将数组填补到指定长度</li>
<li><a href="http://php.net/manual/zh/function.array-pop.php" target="_blank" rel="external">array_pop</a> — 将数组最后一个单元弹出(出栈)</li>
<li><a href="http://php.net/manual/zh/function.array-product.php" target="_blank" rel="external">array_product</a> — 计算数组中所有值的乘积</li>
<li><a href="http://php.net/manual/zh/function.array-push.php" target="_blank" rel="external">array_push</a> — 将一个或多个单元压入数组的末尾(入栈)</li>
<li><a href="http://php.net/manual/zh/function.array-rand.php" target="_blank" rel="external">array_rand</a> — 从数组中随机取出一个或多个单元</li>
<li><a href="http://php.net/manual/zh/function.array-reduce.php" target="_blank" rel="external">array_reduce</a> — 用回调函数迭代地将数组简化为单一的值</li>
<li><a href="http://php.net/manual/zh/function.array-replace-recursive.php" target="_blank" rel="external">array_replace_recursive</a> — 使用传递的数组递归替换第一个数组的元素</li>
<li><a href="http://php.net/manual/zh/function.array-replace.php" target="_blank" rel="external">array_replace</a> — 使用传递的数组替换第一个数组的元素</li>
<li><a href="http://php.net/manual/zh/function.array-reverse.php" target="_blank" rel="external">array_reverse</a> — 返回一个单元顺序相反的数组</li>
<li><a href="http://php.net/manual/zh/function.array-search.php" target="_blank" rel="external">array_search</a> — 在数组中搜索给定的值,如果成功则返回相应的键名</li>
<li><a href="http://php.net/manual/zh/function.array-shift.php" target="_blank" rel="external">array_shift</a> — 将数组开头的单元移出数组</li>
<li><a href="http://php.net/manual/zh/function.array-slice.php" target="_blank" rel="external">array_slice</a> — 从数组中取出一段</li>
<li><a href="http://php.net/manual/zh/function.array-splice.php" target="_blank" rel="external">array_splice</a>— 把数组中的一部分去掉并用其它值取代</li>
<li><a href="http://php.net/manual/zh/function.array-sum.php" target="_blank" rel="external">array_sum</a> — 计算数组中所有值的和</li>
<li><a href="http://php.net/manual/zh/function.array-udiff-assoc.php" target="_blank" rel="external">array_udiff_assoc</a> — 带索引检查计算数组的差集,用回调函数比较数据</li>
<li><a href="http://php.net/manual/zh/function.array-udiff-uassoc.php" target="_blank" rel="external">array_udiff_uassoc</a> — 带索引检查计算数组的差集,用回调函数比较数据和索引</li>
<li><a href="http://php.net/manual/zh/function.array-udiff.php" target="_blank" rel="external">array_udiff</a> — 用回调函数比较数据来计算数组的差集</li>
<li><a href="http://php.net/manual/zh/function.array-uintersect-assoc.php" target="_blank" rel="external">array_uintersect_assoc</a> — 带索引检查计算数组的交集,用回调函数比较数据</li>
<li><a href="http://php.net/manual/zh/function.array-uintersect-uassoc.php" target="_blank" rel="external">array_uintersect_uassoc</a> — 带索引检查计算数组的交集,用回调函数比较数据和索引</li>
<li><a href="http://php.net/manual/zh/function.array-uintersect.php" target="_blank" rel="external">array_uintersect</a> — 计算数组的交集,用回调函数比较数据</li>
<li><a href="http://php.net/manual/zh/function.array-unique.php" target="_blank" rel="external">array_unique</a> — 移除数组中重复的值</li>
<li><a href="http://php.net/manual/zh/function.array-unshift.php" target="_blank" rel="external">array_unshift</a> — 在数组开头插入一个或多个单元</li>
<li><a href="http://php.net/manual/zh/function.array-values.php" target="_blank" rel="external">array_values</a> — 返回数组中所有的值</li>
<li><a href="http://php.net/manual/zh/function.array-walk-recursive.php" target="_blank" rel="external">array_walk_recursive</a> — 对数组中的每个成员递归地应用用户函数</li>
<li><a href="http://php.net/manual/zh/function.array-walk.php" target="_blank" rel="external">array_walk</a> — 使用用户自定义函数对数组中的每个元素做回调处理</li>
<li><a href="http://php.net/manual/zh/function.array.php" target="_blank" rel="external">array</a> — 新建一个数组</li>
<li><a href="http://php.net/manual/zh/function.arsort.php" target="_blank" rel="external">arsort</a> — 对数组进行逆向排序并保持索引关系</li>
<li><a href="http://php.net/manual/zh/function.asort.php" target="_blank" rel="external">asort</a> — 对数组进行排序并保持索引关系</li>
<li><a href="http://php.net/manual/zh/function.compact.php" target="_blank" rel="external">compact</a> — 建立一个数组,包括变量名和它们的值</li>
<li><a href="http://php.net/manual/zh/function.count.php" target="_blank" rel="external">count</a> — 计算数组中的单元数目或对象中的属性个数</li>
<li><a href="http://php.net/manual/zh/function.current.php" target="_blank" rel="external">current</a> — 返回数组中的当前单元</li>
<li><a href="http://php.net/manual/zh/function.each.php" target="_blank" rel="external">each</a> — 返回数组中当前的键/值对并将数组指针向前移动一步</li>
<li><a href="http://php.net/manual/zh/function.end.php" target="_blank" rel="external">end</a> — 将数组的内部指针指向最后一个单元</li>
<li><a href="http://php.net/manual/zh/function.extract.php" target="_blank" rel="external">extract</a> — 从数组中将变量导入到当前的符号表</li>
<li><a href="http://php.net/manual/zh/function.in-array.php" target="_blank" rel="external">in_array</a> — 检查数组中是否存在某个值</li>
<li><a href="http://php.net/manual/zh/function.key-exists.php" target="_blank" rel="external">key_exists</a> — 别名 array_key_exists</li>
<li><a href="http://php.net/manual/zh/function.key.php" target="_blank" rel="external">key</a> — 从关联数组中取得键名</li>
<li><a href="http://php.net/manual/zh/function.krsort.php" target="_blank" rel="external">krsort</a> — 对数组按照键名逆向排序</li>
<li><a href="http://php.net/manual/zh/function.ksort.php" target="_blank" rel="external">ksort</a> — 对数组按照键名排序</li>
<li><a href="http://php.net/manual/zh/function.list.php" target="_blank" rel="external">list</a> — 把数组中的值赋给一些变量</li>
<li><a href="http://php.net/manual/zh/function.natcasesort.php" target="_blank" rel="external">natcasesort</a> — 用“自然排序”算法对数组进行不区分大小写字母的排序</li>
<li><a href="http://php.net/manual/zh/function.natsort.php" target="_blank" rel="external">natsort</a> — 用“自然排序”算法对数组排序</li>
<li><a href="http://php.net/manual/zh/function.next.php" target="_blank" rel="external">next</a> — 将数组中的内部指针向前移动一位</li>
<li><a href="http://php.net/manual/zh/function.pos.php" target="_blank" rel="external">pos</a> — current 的别名</li>
<li><a href="http://php.net/manual/zh/function.prev.php" target="_blank" rel="external">prev</a> — 将数组的内部指针倒回一位</li>
<li><a href="http://php.net/manual/zh/function.range.php" target="_blank" rel="external">range</a> — 建立一个包含指定范围单元的数组</li>
<li><a href="http://php.net/manual/zh/function.reset.php" target="_blank" rel="external">reset</a> — 将数组的内部指针指向第一个单元</li>
<li><a href="http://php.net/manual/zh/function.rsort.php" target="_blank" rel="external">rsort</a> — 对数组逆向排序</li>
<li><a href="http://php.net/manual/zh/function.shuffle.php" target="_blank" rel="external">shuffle</a> — 将数组打乱</li>
<li><a href="http://php.net/manual/zh/function.sizeof.php" target="_blank" rel="external">sizeof</a> — count 的别名</li>
<li><a href="http://php.net/manual/zh/function.sort.php" target="_blank" rel="external">sort</a> — 对数组排序</li>
<li><a href="http://php.net/manual/zh/function.uasort.php" target="_blank" rel="external">uasort</a> — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联</li>
<li><a href="http://php.net/manual/zh/function.uksort.php" target="_blank" rel="external">uksort</a> — 使用用户自定义的比较函数对数组中的键名进行排序</li>
<li><a href="http://php.net/manual/zh/function.usort.php" target="_blank" rel="external">usort</a> — 使用用户自定义的比较函数对数组中的值进行排序</li>
</ul>
]]></content>
<summary type="html">
<![CDATA[在开发过程中,做数组处理的时候,往往因为对编程语言的内置函数不清楚,而重写了这些功能,走了不少弯路,下面是 PHP 中最强大的数组函数列表,一定要记清。]]>
</summary>
<category term="PHP" scheme="http://notes.cribug.com/tags/PHP/"/>
</entry>
<entry>
<title><![CDATA[Linux 命令之 touch]]></title>
<link href="http://notes.cribug.com/2016/linux-touch/"/>
<id>http://notes.cribug.com/2016/linux-touch/</id>
<published>2016-04-27T14:11:00.000Z</published>
<updated>2016-04-27T15:38:32.407Z</updated>
<content type="html"><![CDATA[<p>linux 的 <code>touch</code> 命令,一般在使用 <code>make</code> 的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件。</p>
<h3 id="1-_命令格式">1. 命令格式</h3><pre><code>touch <span class="string">[选项]</span> 文件
</code></pre><h3 id="2-_命令功能">2. 命令功能</h3><p><code>touch</code> 命令参数可更改文档或目录的日期时间,包括存取时间和更改时间。 </p>
<h3 id="3-_命令参数">3. 命令参数</h3><pre><code>-<span class="ruby">a 或--time=atime或--time=access或--time=use 只更改存取时间。
</span>-<span class="ruby">c 或--no-create 不建立任何文档。
</span>-<span class="ruby">d 使用指定的日期时间,而非现在的时间。
</span>-<span class="ruby">f 此参数将忽略不予处理,仅负责解决<span class="constant">BSD</span>版本touch指令的兼容性问题。
</span>-<span class="ruby">m 或--time=mtime或--time=modify 只更改变动时间。
</span>-<span class="ruby">r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。
</span>-<span class="ruby">t 使用指定的日期时间,而非现在的时间。</span>
</code></pre><h3 id="4-_命令实例">4. 命令实例</h3><pre><code># 创建不存在的文件
<span class="keyword">touch</span> test1.txt test2.txt
# 更新log2.<span class="built_in">log</span>的时间和log1.<span class="built_in">log</span>时间戳相同
<span class="keyword">touch</span> -r log1.<span class="built_in">log</span> log2.<span class="built_in">log</span>
# 设定文件的时间戳
<span class="keyword">touch</span> -t <span class="number">201211142234.50</span> <span class="built_in">log</span>.<span class="built_in">log</span>
</code></pre><p>说明:</p>
<p>-t 使用指定的时间值time作为指定文件相应时间戳记的新值。此处的time规定为如下形式的十进制数:</p>
<p>[[CC]YY]MMDDhhmm[.SS]</p>
<p>这里,CC为年数中的前两位,即”世纪数”;YY为年数的后两位,即某世纪中的年数.如果不给出CC的值,则touch 将把年数CCYY限定在1969–2068之内.MM为月数,DD为天将把年数CCYY限定在1969–2068之内.MM为月数,DD为天数,hh 为小时数(几点),mm为分钟数,SS为秒数.此处秒的设定范围是0–61,这样可以处理闰秒.这些数字组成的时间是环境变量TZ指定的时区中的一个时 间.由于系统的限制,早于1970年1月1日的时间是错误的。</p>
]]></content>
<summary type="html">
<![CDATA[linux 的 touch 命令,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件。]]>
</summary>
<category term="Linux" scheme="http://notes.cribug.com/tags/Linux/"/>
</entry>
<entry>
<title><![CDATA[Linux 命令之 cp]]></title>
<link href="http://notes.cribug.com/2016/linux-cp/"/>
<id>http://notes.cribug.com/2016/linux-cp/</id>
<published>2016-04-23T07:15:00.000Z</published>
<updated>2016-04-22T16:43:11.835Z</updated>
<content type="html"><![CDATA[<p>cp 命令用来复制文件或目录,是Linux系统中最常用的命令之一。在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数。但是如果是在shell脚本中执行cp时,没有-i参数时不会询问是否覆盖。这说明命令行和shell脚本的执行方式有些不同。 </p>
<h3 id="1-_命令格式">1. 命令格式</h3><pre><code>cp <span class="string">[选项]</span> <span class="string">[-T]</span> 源 目的
cp <span class="string">[选项]</span> 源 目录
cp <span class="string">[选项]</span> -t 目录 源
</code></pre><h3 id="2-_命令功能">2. 命令功能</h3><p>将源文件复制至目标文件,或将多个源文件复制至目标目录</p>
<!--
### 3. 命令参数 ###
-->
<h3 id="3-_命令实例">3. 命令实例</h3><pre><code><span class="comment"># 复制单个文件到目标目录,文件在目标文件中不存在</span>
<span class="comment"># 在没有带-a参数时,两个文件的时间是不一样的。在带了-a参数时,两个文件的时间是一致的</span>
cp nginx.<span class="command">log</span> ./<span class="command">log</span>
<span class="comment"># 目标文件存在时,会询问是否覆盖</span>
<span class="comment"># 这是因为cp是cp -i的别名。目标文件存在时,即使加了-f标志,也还会询问是否覆盖</span>
cp nginx.<span class="command">log</span> ./<span class="command">log</span>
<span class="comment"># 复制整个目录</span>
<span class="comment"># 目标目录存在与否结果是不一样的。目标目录存在时,整个源目录被复制到目标目录里面</span>
cp test1 test2
<span class="comment"># 复制的 log.log 建立一个连结档 log_link.log</span>
<span class="comment"># 那个 log_link.log 是由 -s 的参数造成的,建立的是一个快捷方式</span>
cp -s <span class="command">log</span>.<span class="command">log</span> log_link.<span class="command">log</span>
</code></pre>]]></content>
<summary type="html">
<![CDATA[cp 命令用来复制文件目录,是Linux系统中最常用的命令之一。在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数。但是如果是在shell脚本中执行cp时,没有-i参数时不会询问是否覆盖。这说明命令行和shell脚本的执行方式有些不同。]]>
</summary>
<category term="Linux" scheme="http://notes.cribug.com/tags/Linux/"/>
</entry>
<entry>
<title><![CDATA[Linux 命令之 mv]]></title>
<link href="http://notes.cribug.com/2016/linux-mv/"/>
<id>http://notes.cribug.com/2016/linux-mv/</id>
<published>2016-04-15T15:53:00.000Z</published>
<updated>2016-04-22T16:19:05.155Z</updated>
<content type="html"><![CDATA[<p><code>mv</code> 命令是move的缩写,可以用来移动文件或者将文件改名,是Linux系统下常用的命令,经常用来备份文件或者目录。</p>
<h3 id="1-_命令格式">1. 命令格式</h3><pre><code>mv <span class="string">[选项]</span> 源文件或目录 目标文件或目录
</code></pre><h3 id="2-_命令功能">2. 命令功能</h3><p><code>mv</code> 命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时,mv命令完成文件重命名。当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时,mv先拷贝,再将原有文件删除,而链至该文件的链接也将丢失。</p>
<h3 id="3-_命令参数">3. 命令参数</h3><pre><code>-<span class="ruby">b <span class="comment"># 若需覆盖文件,则覆盖前先行备份。 </span>
</span>-<span class="ruby">f <span class="comment"># force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;</span>
</span>-<span class="ruby">i <span class="comment"># 若目标文件 (destination) 已经存在时,就会询问是否覆盖!</span>
</span>-<span class="ruby">u <span class="comment"># 若目标文件已经存在,且 source 比较新,才会更新(update)</span>
</span>-<span class="ruby">t <span class="comment"># 指定目标目录,该选项适用于移动多个源文件到一个目录的情况,此时目标目录在前,源文件在后。</span></span>
</code></pre><h3 id="4-_命令实例">4. 命令实例</h3><pre><code><span class="comment"># 文件改名</span>
mv test.log test.txt
<span class="comment"># 移动文件</span>
mv test.log ./<span class="built_in">test</span>
<span class="comment"># 将文件log1.txt, log2.txt移动到目录test中</span>
mv <span class="built_in">log</span>1.txt <span class="built_in">log</span>2.txt <span class="built_in">test</span>
mv -t ./<span class="built_in">test</span> <span class="built_in">log</span>1.txt <span class="built_in">log</span>2.txt
<span class="comment"># 将文件file1改名为file2,如果file2已经存在,则询问是否覆盖</span>
mv -i <span class="built_in">log</span>1.txt <span class="built_in">log</span>2.txt
<span class="comment"># 将文件file1改名为file2,即使file2存在,也是直接覆盖掉</span>
<span class="comment"># -f是个危险的选项,使用的时候一定要保持头脑清晰,一般情况下最好不用加上它</span>
mv <span class="operator">-f</span> <span class="built_in">log</span>1.txt <span class="built_in">log</span>2.txt
<span class="comment"># 如果目录dir2不存在,将目录dir1改名为dir2;否则,将dir1移动到dir2中</span>
mv dir1 dir2
<span class="comment"># 移动当前文件夹下的所有文件到上一级目录</span>
mv * ../
<span class="comment"># 把当前目录的一个子目录里的文件移动到另一个子目录里</span>
mv ./<span class="built_in">test</span>1/* ./<span class="built_in">test</span>2
<span class="comment"># 文件被覆盖前做简单备份,前面加参数-b</span>
mv <span class="built_in">log</span>1.txt -b <span class="built_in">log</span>2.txt
</code></pre><p>说明:<br>-b 不接受参数,mv会去读取环境变量VERSION_CONTROL来作为备份策略。<br>–backup该选项指定如果目标文件存在时的动作,共有四种备份策略:<br>1.CONTROL=none或off : 不备份。<br>2.CONTROL=numbered或t:数字编号的备份<br>3.CONTROL=existing或nil:如果存在以数字编号的备份,则继续编号备份m+1…n:<br>执行mv操作前已存在以数字编号的文件log2.txt.~1~,那么再次执行将产生log2.txt~2~,以次类推。如果之前没有以数字编号的文件,则使用下面讲到的简单备份。<br>4.CONTROL=simple或never:使用简单备份:在被覆盖前进行了简单备份,简单备份只能有一份,再次被覆盖时,简单备份也会被覆盖。</p>
<p>整理自: <a href="http://www.cnblogs.com/peida/archive/2012/10/27/2743022.html" target="_blank" rel="external">每天一个linux命令: mv命令</a></p>
]]></content>
<summary type="html">
<![CDATA[mv命令是move的缩写,可以用来移动文件或者将文件改名,是Linux系统下常用的命令,经常用来备份文件或者目录。]]>
</summary>
<category term="Linux" scheme="http://notes.cribug.com/tags/Linux/"/>
</entry>
<entry>
<title><![CDATA[Linux 命令之 rmdir]]></title>
<link href="http://notes.cribug.com/2016/linux-rmdir/"/>
<id>http://notes.cribug.com/2016/linux-rmdir/</id>
<published>2016-04-11T15:52:00.000Z</published>
<updated>2016-04-14T15:55:35.175Z</updated>
<content type="html"><![CDATA[<p>rmdir 命令的功能是删除空目录,一个目录被删除之前必须是空的。(<code>rm - r dir</code> 命令可代替rmdir,但是有很大危险性。)删除某目录时也必须具有对父目录的写权限。</p>
<h3 id="1-_命令格式">1. 命令格式</h3><pre><code>rmdir <span class="string">[选项]</span> 目录
</code></pre><h3 id="2-_命令功能">2. 命令功能</h3><p>该命令从一个目录中删除一个或多个子目录项,删除某目录时也必须具有对父目录的写权限。</p>
<h3 id="3-_常用参数">3. 常用参数</h3><pre><code>-<span class="ruby">p <span class="comment"># 递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。</span>
</span> # 如果整个路径被删除或者由于某种原因保留部分路径,则系统在标准输出上显示相应的信息。
-<span class="ruby">v, --verbose <span class="comment"># 显示指令执行过程</span></span>
</code></pre><h3 id="4-_命令实例">4. 命令实例</h3><pre><code><span class="keyword">rmdir</span> dirname <span class="comment"># 命令不能直接删除非空目录</span>
<span class="keyword">rmdir</span> -p logs <span class="comment"># 当子目录被删除后使它也成为空目录的话,则顺便一并删除 </span>
</code></pre><p>整理自: <a href="http://www.cnblogs.com/peida/archive/2012/10/27/2742076.html" target="_blank" rel="external">每天一个linux命令: rmdir命令</a></p>
]]></content>
<summary type="html">
<![CDATA[rmdir 命令的功能是删除空目录,一个目录被删除之前必须是空的。('rm - r dir' 命令可代替rmdir,但是有很大危险性。)删除某目录时也必须具有对父目录的写权限。]]>
</summary>
<category term="Linux" scheme="http://notes.cribug.com/tags/Linux/"/>
</entry>
<entry>
<title><![CDATA[Linux 命令之 rm]]></title>
<link href="http://notes.cribug.com/2016/linux-rm/"/>
<id>http://notes.cribug.com/2016/linux-rm/</id>
<published>2016-04-10T15:20:00.000Z</published>
<updated>2016-04-10T15:42:06.101Z</updated>
<content type="html"><![CDATA[<p>rm 是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件和子目录均删除。对于链接文件,只是删除了链接,原有文件保持不变。</p>
<p>rm是一个危险的命令,使用的时候要特别当心,否则整个系统就会毁掉(比如在/下执行 <code>rm -rf *</code> )。所以,我们在执行rm之前最好先确认一下在哪个目录,到底要删除什么东西,操作时保持高度清醒的头脑。</p>
<h3 id="1-_命令格式">1. 命令格式</h3><pre><code>rm <span class="string">[选项]</span> 文件
</code></pre><h3 id="2-_命令功能">2. 命令功能</h3><p>删除一个目录中的一个或多个文件和目录,如果没有使用 <code>-r</code> 选项,则rm不会删除目录。 </p>
<h3 id="3-_常用参数">3. 常用参数</h3><pre><code>-<span class="ruby">f, --force <span class="comment"># 忽略不存在的文件,不给出提示。</span>
</span>-<span class="ruby">i, --interactive <span class="comment"># 进行交互式删除</span>
</span>-<span class="ruby">r, -<span class="constant">R</span>, --recursive <span class="comment"># 将列出的全部目录和子目录均递归地删除。</span>
</span>-<span class="ruby">v, --verbose <span class="comment"># 详细显示进行的步骤</span>
</span> -<span class="ruby">-help <span class="comment"># 显示此帮助信息并退出</span>
</span> -<span class="ruby">-version <span class="comment"># 输出版本信息并退出</span></span>
</code></pre><h3 id="4-_常用实例">4. 常用实例</h3><pre><code><span class="keyword">rm</span> 文件名 # 删除文件,系统会先询问是否删除
<span class="keyword">rm</span> -f 文件名 # 强行删除<span class="keyword">file</span>,系统不再提示
<span class="keyword">rm</span> -i *.<span class="keyword">log</span> # 删除任何.<span class="keyword">log</span>文件;删除前逐一询问确认
<span class="keyword">rm</span> -r <span class="keyword">test</span> # 将 <span class="keyword">test</span> 目录及目录中所有档案删除
<span class="keyword">rm</span> -rf <span class="keyword">test</span> # 将 <span class="keyword">test</span> 目录及目录中所有档案删除,并且不用确认
<span class="keyword">rm</span> -- -f # 删除以 -f 开头的文件
</code></pre><h3 id="5-_自定义回收站功能">5. 自定义回收站功能</h3><pre><code>myrm(){ D=/tmp/$(date +<span class="decorator">%Y</span><span class="decorator">%m</span><span class="decorator">%d</span><span class="decorator">%H</span><span class="decorator">%M</span><span class="decorator">%S</span>); mkdir -p <span class="variable">$D</span>; mv <span class="string">"$@"</span> <span class="variable">$D</span> && echo <span class="string">"moved to $D ok"</span>; }
</code></pre><p>上面的操作过程模拟了回收站的效果,即删除文件的时候只是把文件放到一个临时目录中,这样在需要的时候还可以恢复过来。</p>
<p>整理自: <a href="http://www.cnblogs.com/peida/archive/2012/10/26/2740521.html" target="_blank" rel="external">每天一个linux命令: rm命令</a></p>
]]></content>
<summary type="html">
<![CDATA[rm 是常用的命令,该命令的功能为删除一个目录中的一个或多个文件和目录,它也可以将某个目录及其下的所有文件和子目录均删除。对于链接文件,只是删除了链接,原有文件保持不变。rm是一个危险的命令,使用的时候要特别当心,否则整个系统就会毁掉(比如在/下执行rm -rf *)。所以,我们在执行rm之前最好先确认一下在哪个目录,到底要删除什么东西,操作时保持高度清醒的头脑。]]>
</summary>
<category term="Linux" scheme="http://notes.cribug.com/tags/Linux/"/>
</entry>
<entry>
<title><![CDATA[Linux 命令之 mkdir]]></title>
<link href="http://notes.cribug.com/2016/linux-mkdir/"/>
<id>http://notes.cribug.com/2016/linux-mkdir/</id>
<published>2016-04-09T15:03:00.000Z</published>
<updated>2016-06-23T18:20:58.949Z</updated>
<content type="html"><![CDATA[<p><code>mkdir</code> 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录。</p>
<h3 id="1-_命令格式">1. 命令格式</h3><pre><code>mkdir <span class="string">[选项]</span> 目录名
</code></pre><h3 id="2-_命令功能">2. 命令功能</h3><p>通过 <code>mkdir</code> 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录,即同一个目录下不能有同名的(区分大小写)。 </p>
<h3 id="3-_常用参数">3. 常用参数</h3><p>-m, –mode # 设定权限(类似 chmod),而不是 rwxrwxrwx 减 umask<br>-p, –parents # 递归创建多个目录<br>-v, –verbose # 每次创建新目录都显示信息<br> –help # 显示此帮助信息并退出<br> –version # 输出版本信息并退出</p>
<h3 id="4-_常用实例">4. 常用实例</h3><pre><code>mkdir test
mkdir -p test2/test22
mkdir -m <span class="number">777</span> test3
mkdir -v test4
mkdir -vp scf/{<span class="class"><span class="keyword">lib</span>/,<span class="title">bin</span>/,<span class="title">doc</span>/{<span class="title">info</span>,<span class="title">product</span>},<span class="title">logs</span>/{<span class="title">info</span>,<span class="title">product</span>},<span class="title">service</span>/<span class="title">deploy</span>/{<span class="title">info</span>,<span class="title">product</span>}}</span>
</code></pre><p>整理自: <a href="http://www.cnblogs.com/peida/archive/2012/10/25/2738271.html" target="_blank" rel="external">每天一个linux命令: mkdir命令</a></p>
]]></content>
<summary type="html">
<![CDATA[mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录。]]>
</summary>
<category term="Linux" scheme="http://notes.cribug.com/tags/Linux/"/>
</entry>
<entry>
<title><![CDATA[Linux 命令之 pwd]]></title>
<link href="http://notes.cribug.com/2016/linux-pwd/"/>
<id>http://notes.cribug.com/2016/linux-pwd/</id>
<published>2016-04-08T15:14:00.000Z</published>
<updated>2016-04-08T15:36:08.536Z</updated>
<content type="html"><![CDATA[<p>Linux中用 pwd 命令来查看”当前工作目录“的完整路径。简单得说,每当你在终端进行操作时,你都会有一个当前工作目录。在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置。</p>
<h3 id="1-_命令格式">1. 命令格式</h3><pre><code>pwd <span class="string">[选项]</span>
</code></pre><h3 id="2-_命令功能">2. 命令功能</h3><p>查看“当前工作目录”的完整路径</p>
<h3 id="3-_常用参数">3. 常用参数</h3><p>一般情况下不带任何参数<br>如果目录是连接时,使用 <code>pwd -P</code> 会显示出实际路径,而非使用连接(link)路径</p>
<h3 id="4-_常用实例">4. 常用实例</h3><pre><code><span class="comment"># 用 pwd 命令查看默认工作目录的完整路径</span>
[root<span class="annotation">@localhost</span> ~]<span class="comment"># pwd</span>
/root
[root<span class="annotation">@localhost</span> ~]<span class="comment">#</span>
<span class="comment"># 使用 pwd 命令查看指定文件夹</span>
[root<span class="annotation">@localhost</span> ~]<span class="comment"># cd /usr/local/</span>
[root<span class="annotation">@localhost</span> soft]<span class="comment"># pwd </span>
/usr/<span class="keyword">local</span>/
[root<span class="annotation">@localhost</span> soft]<span class="comment">#</span>
<span class="comment"># 目录是连接时,pwd -P 显示出实际路径,而非使用连接(link)路径,pwd显示的是连接路径</span>
[root<span class="annotation">@localhost</span> soft]<span class="comment"># cd /etc/init.d </span>
[root<span class="annotation">@localhost</span> init.d]<span class="comment"># pwd</span>
/etc/init.d
[root<span class="annotation">@localhost</span> init.d]<span class="comment"># pwd -P</span>
/etc/rc.d/init.d
[root<span class="annotation">@localhost</span> init.d]<span class="comment">#</span>
<span class="comment"># /bin/pwd,-L 目录连接链接时,输出连接路径;-P 输出物理路径</span>
[root<span class="annotation">@localhost</span> init.d]<span class="comment"># /bin/pwd </span>
/etc/rc.d/init.d
[root<span class="annotation">@localhost</span> init.d]<span class="comment"># /bin/pwd -P</span>
/etc/rc.d/init.d
[root<span class="annotation">@localhost</span> init.d]<span class="comment"># /bin/pwd -L</span>
/etc/init.d
[root<span class="annotation">@localhost</span> init.d]<span class="comment">#</span>
<span class="comment"># 当前目录被删除了,而pwd命令仍然显示那个目录</span>
[root<span class="annotation">@localhost</span> init.d]<span class="comment"># cd /opt/soft</span>
[root<span class="annotation">@localhost</span> soft]<span class="comment"># mkdir removed</span>
[root<span class="annotation">@localhost</span> soft]<span class="comment"># cd removed/</span>
[root<span class="annotation">@localhost</span> removed]<span class="comment"># pwd</span>
/opt/soft/removed
[root<span class="annotation">@localhost</span> removed]<span class="comment"># rm ../removed -rf</span>
[root<span class="annotation">@localhost</span> removed]<span class="comment"># pwd</span>
/opt/soft/removed
[root<span class="annotation">@localhost</span> removed]<span class="comment"># /bin/pwd</span>
/bin/pwd: couldn't <span class="keyword">find</span> directory entry <span class="keyword">in</span> “..” <span class="keyword">with</span> matching i-node
</code></pre><p>整理自: <a href="http://www.cnblogs.com/peida/archive/2012/10/24/2737730.html" target="_blank" rel="external">每天一个linux命令: pwd命令</a></p>
]]></content>
<summary type="html">
<![CDATA[Linux中用 pwd 命令来查看”当前工作目录“的完整路径。简单得说,每当你在终端进行操作时,你都会有一个当前工作目录。在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置。]]>
</summary>
<category term="Linux" scheme="http://notes.cribug.com/tags/Linux/"/>
</entry>
<entry>
<title><![CDATA[Linux 命令之 cd]]></title>
<link href="http://notes.cribug.com/2016/linux-cd/"/>
<id>http://notes.cribug.com/2016/linux-cd/</id>
<published>2016-04-07T14:30:00.000Z</published>
<updated>2016-04-17T15:56:24.022Z</updated>
<content type="html"><![CDATA[<p><code>cd</code> 命令可以说是 Linux 中最基本的命令语句,其他命令的操作,基本都是建立在 <code>cd</code> 命令上。所以,学习 Linux 常用命令,首先要学好 <code>cd</code> 命令的使用技巧。</p>
<h3 id="1-_命令格式">1. 命令格式</h3><pre><code>cd <span class="string">[目录名]</span>
</code></pre><h3 id="2-_命令功能">2. 命令功能</h3><p>切换当前目录至另外一目录</p>
<h3 id="3-_常用范例">3. 常用范例</h3><pre><code><span class="built_in">cd</span> / <span class="comment"># 进入根目录</span>
<span class="built_in">cd</span> .. <span class="comment"># 退到上一目录</span>
<span class="built_in">cd</span> ..// <span class="comment"># 退到上一目录</span>
<span class="built_in">cd</span> ../.. // <span class="comment"># 使用cd 命令实现进入当前目录的父目录的父目录</span>
<span class="built_in">cd</span> <span class="comment"># 进入当前用户主目录</span>
<span class="built_in">cd</span> ~ <span class="comment"># 进入当前用户主目录</span>
<span class="built_in">cd</span> /usr/<span class="built_in">local</span> <span class="comment"># 进入指定目录,从根目录开始,目录名称前加 / ,当前目录内的子目录直接写名称即可</span>
<span class="built_in">cd</span> - <span class="comment"># 返回进入此目录之前所在的目录</span>
<span class="built_in">cd</span> !$ <span class="comment"># 把上个命令的参数作为cd参数使用</span>
</code></pre><p>整理自: <a href="http://www.cnblogs.com/peida/archive/2012/10/24/2736501.html" target="_blank" rel="external">每天一个Linux命令:cd命令</a></p>
]]></content>
<summary type="html">
<![CDATA[cd 命令可以说是 Linux 中最基本的命令语句,其他命令的操作,基本都是建立在 cd 命令上。所以,学习 Linux 常用命令,首先要学好 cd 命令的使用技巧。]]>
</summary>
<category term="Linux" scheme="http://notes.cribug.com/tags/Linux/"/>
</entry>
<entry>
<title><![CDATA[Linux 命令之 ls]]></title>
<link href="http://notes.cribug.com/2016/linux-ls/"/>
<id>http://notes.cribug.com/2016/linux-ls/</id>
<published>2016-04-06T15:48:00.000Z</published>
<updated>2016-04-21T09:51:04.657Z</updated>
<content type="html"><![CDATA[<p><code>ls</code> 命令是linux下最常用的命令。<code>ls</code> 命令就是 <code>list</code> 的缩写,缺省下 <code>ls</code> 用来打印出当前目录的清单。如果 <code>ls</code> 指定其他目录,那么就会显示指定目录里的文件及文件夹清单。</p>
<p>通过 <code>ls</code> 目录命令不仅可以查看linux文包含的文件,而且可以查看文件权限等信息。</p>
<h3 id="1-_命令格式">1. 命令格式</h3><pre><code>ls <span class="string">[参数]</span> <span class="string">[目录名]</span>
</code></pre><h3 id="2-_命令功能">2. 命令功能</h3><p>列出目标目录中所有的子目录和文件。</p>
<h3 id="3-_常用参数">3. 常用参数</h3><table><br> <tr><br> <td>-a , –all</td><br> <td>列出目录下的所有文件,包括以 . 开头的隐含文件</td><br> </tr><br> <tr><br> <td>-A</td><br> <td>同-a, 但不列出”.”(表示当前目录)和”..”(表示当前目录的父目录</td><br> </tr><br> <tr><br> <td>-c</td><br> <td>配合-lt: 根据 ctime 排序及显示 ctime (文件状态最后更改的时间)</td><br> </tr><br> <tr><br> <td></td><br> <td>配合-l: 显示 ctime 但根据名称排序</td><br> </tr><br> <tr><br> <td></td><br> <td>否则: 根据 ctime 排序</td><br> </tr><br></table>
<!-- ### 4. 常用范例 ### -->]]></content>
<summary type="html">
<![CDATA[ls命令是linux下最常用的命令。ls命令就是list的缩写,缺省下ls用来打印出当前目录的清单。如果ls指定其他目录,那么就会显示指定目录里的文件及文件夹清单。通过ls 命令不仅可以查看linux目录包含的文件,而且可以查看文件权限等信息。]]>
</summary>
<category term="Linux" scheme="http://notes.cribug.com/tags/Linux/"/>
</entry>
<entry>
<title><![CDATA[Linux 命令学习目录]]></title>
<link href="http://notes.cribug.com/2016/linux-list/"/>
<id>http://notes.cribug.com/2016/linux-list/</id>
<published>2016-04-05T12:45:00.000Z</published>
<updated>2016-06-23T19:09:51.127Z</updated>
<content type="html"><![CDATA[<p>Linux 系统在学习和工作中需要经常用到,根据<a href="http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html" target="_blank" rel="external">竹子-博客</a>,整理出了一份Linux命令资料。其他的参考资料有:</p>
<ol>
<li>《鸟哥的linux私房菜》</li>
<li><a href="http://codingstandards.iteye.com/blog/786653" target="_blank" rel="external">我使用过的Linux命令系列总目录</a></li>
<li><a href="http://roclinux.cn/?cat=3" target="_blank" rel="external">linux命令五分钟系列 </a></li>
</ol>
<h3 id="文件目录操作命令">文件目录操作命令</h3><ol>
<li><a href="#">linux命令之 ls</a></li>
<li><a href="#">linux命令之 cd</a></li>
<li><a href="#">linux命令之 pwd</a></li>
<li><a href="#">linux命令之 mkdir</a></li>
<li><a href="#">linux命令之 rm</a></li>
<li><a href="#">linux命令之 rmdir</a></li>
<li><a href="#">linux命令之 mv</a></li>
<li><a href="#">linux命令之 cp</a></li>
<li><a href="#">linux命令之 touch</a></li>
</ol>
<h3 id="文件查找命令">文件查找命令</h3><h3 id="文件和目录属性">文件和目录属性</h3><h3 id="文件打包上传和下载">文件打包上传和下载</h3><h3 id="linux文件权限设置">linux文件权限设置</h3><h3 id="磁盘存储相关">磁盘存储相关</h3><h3 id="性能监控和优化命令">性能监控和优化命令</h3><h3 id="网络命令">网络命令</h3><p><a href="#">linux命令之 scp</a></p>
<h3 id="其他命令">其他命令</h3><p><a href="#">linux命令之 crontab</a></p>
]]></content>
<summary type="html">
<![CDATA[Linux 系统在学习和工作中需要经常用到,根据<a href="http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html">竹子-博客</a>,整理出了一份Linux命令资料。]]>
</summary>
<category term="Linux" scheme="http://notes.cribug.com/tags/Linux/"/>
</entry>
<entry>
<title><![CDATA[Linux 命令之 crontab]]></title>
<link href="http://notes.cribug.com/2016/linux-crontab/"/>
<id>http://notes.cribug.com/2016/linux-crontab/</id>
<published>2016-04-05T09:52:21.000Z</published>
<updated>2016-04-05T15:45:35.720Z</updated>
<content type="html"><![CDATA[<p>下午刚被面试题完虐回来,面试题里的内容以前做东西时基本上都接触过,但是还是被虐了,这里就说明了长期记忆的重要性,很多知识都需要去整理,去积累。一个月前还用的 crontab ,但是在做面试题的时候就蒙了。</p>
<p>crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。</p>
<p>Linux下的任务调度分为两类,系统任务调度和用户任务调度。</p>
<h3 id="系统任务调度">系统任务调度</h3><p>系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。<code>cat /etc/crontab</code>:</p>
<pre><code>SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
<span class="preprocessor"># For details see man <span class="number">4</span> crontabs</span>
<span class="preprocessor"># Example of job definition:</span>
<span class="preprocessor"># .---------------- minute (<span class="number">0</span> - <span class="number">59</span>)</span>
<span class="preprocessor"># | .------------- hour (<span class="number">0</span> - <span class="number">23</span>)</span>
<span class="preprocessor"># | | .---------- day of month (<span class="number">1</span> - <span class="number">31</span>)</span>
<span class="preprocessor"># | | | .------- month (<span class="number">1</span> - <span class="number">12</span>) OR jan,feb,mar,apr ...</span>
<span class="preprocessor"># | | | | .---- day of week (<span class="number">0</span> - <span class="number">6</span>) (Sunday=<span class="number">0</span> or <span class="number">7</span>) OR sun,mon,tue,wed,thu,fri,sat</span>
<span class="preprocessor"># | | | | |</span>
<span class="preprocessor"># * * * * * user-name command to be executed</span>
</code></pre><p>前三行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户。</p>
<h3 id="用户任务调度">用户任务调度</h3><p>用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用crontab工具来定制自己的计划任务。</p>
<p>所有用户定义的 <code>crontab</code> 文件都被保存在 <code>/var/spool/cron</code> 目录中。其文件名与用户名一致。<br><code>/etc/cron.deny</code> 该文件中所列用户不允许使用crontab命令。<br><code>/etc/cron.allow</code> 该文件中所列用户允许使用crontab命令(默认情况下不存在)。<br>如果两个文件同时存在,那么/etc/cron.allow优先。如果两个文件都不存在,那么只有root用户可以安排作业。</p>
<p>用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:</p>
<pre><code><span class="preprocessor"># .---------------- minute 表示分钟,可以是从<span class="number">0</span>到<span class="number">59</span>之间的任何整数。</span>
<span class="preprocessor"># | .------------- hour 表示小时,可以是从<span class="number">0</span>到<span class="number">23</span>之间的任何整数。</span>
<span class="preprocessor"># | | .---------- day 表示日期,可以是从<span class="number">1</span>到<span class="number">31</span>之间的任何整数。</span>
<span class="preprocessor"># | | | .------- 表示月份,可以是从<span class="number">1</span>到<span class="number">12</span>之间的任何整数。</span>
<span class="preprocessor"># | | | | .---- 表示星期几,可以是从<span class="number">0</span>到<span class="number">7</span>之间的任何整数,这里的<span class="number">0</span>或<span class="number">7</span>代表星期日。</span>
<span class="preprocessor"># | | | | | .-command要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。</span>
<span class="preprocessor"># | | | | | |</span>
<span class="preprocessor"># * * * * * * </span>
</code></pre><p>在以上各个字段中,还可以使用以下特殊字符:</p>
<pre><code>* : 代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
, : 可以用逗号隔开的值指定一个列表范围,例如,“<span class="number">1</span>,<span class="number">2</span>,<span class="number">5</span>,<span class="number">7</span>,<span class="number">8</span>,<span class="number">9</span>”
- : 可以用整数之间的中杠表示一个整数范围,例如“<span class="number">2</span>-<span class="number">6</span>”表示“<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>”
/ : 可以用正斜线指定时间的间隔频率,例如“<span class="number">0</span>-<span class="number">23</span>/<span class="number">2</span>”表示每两小时执行一次。
同时正斜线可以和星号一起使用,例如*/<span class="number">10</span>,如果用在minute字段,表示每十分钟执行一次。
</code></pre>]]></content>
<summary type="html">
<![CDATA[下午刚被面试题完虐回来,面试题里的内容以前做东西时基本上都接触过,但是还是被虐了,这里就说明了长期记忆的重要性,很多知识都需要去整理,去积累。一个月前还用的 crontab ,但是在做面试题的时候就蒙了。]]>
</summary>
<category term="Linux" scheme="http://notes.cribug.com/tags/Linux/"/>
</entry>
<entry>
<title><![CDATA[GitLab的安装]]></title>
<link href="http://notes.cribug.com/2016/gitlab-start/"/>
<id>http://notes.cribug.com/2016/gitlab-start/</id>
<published>2016-04-04T15:02:11.000Z</published>
<updated>2016-04-04T17:54:10.939Z</updated>
<content type="html"><![CDATA[<p>在阿里云上折腾了一天的 GitLab ,编译安装时各种被墙,无法正常安装,最后使用了官网的rpm包安装方式解决了问题。</p>
<blockquote>
<p>GitLab的两种安装方法:</p>
<p><font color="blue">编译安装</font><br>优点:可定制性强。数据库既可以选择MySQL,也可以选择PostgreSQL;服务器既可以选择Apache,也可以选择Nginx。<br>缺点:国外的源不稳定,被墙时,依赖软件包难以下载。配置流程繁琐、复杂,容易出现各种各样的问题。依赖关系多,不容易管理,卸载GitLab相对麻烦。</p>
<p><font color="blue">通过rpm包安装</font><br>优点:安装过程简单,安装速度快。采用rpm包安装方式,安装的软件包便于管理。<br>缺点:数据库默认采用PostgreSQL,服务器默认采用Nginx,不容易定制。</p>
</blockquote>
<h3 id="安装_GitLab">安装 GitLab</h3><p>进入进入<a href="https://about.gitlab.com/downloads/" target="_blank">gitlab官方网站</a>,选择对应的操作系统 — CentOS 6 (and RedHat/Oracle/Scientific Linux 6),按照官方提示进行安装。</p>
<p>1.安装配置必要的依赖。在Centos 6 和 7 中,以下的命令将会打开HTTP和SSH在系统防火墙中的可访问权限。</p>
<pre><code>sudo yum <span class="operator"><span class="keyword">install</span> curl openssh-<span class="keyword">server</span> openssh-clients postfix cronie
sudo service postfix <span class="keyword">start</span>
sudo chkconfig postfix <span class="keyword">on</span>
sudo lokkit -s <span class="keyword">http</span> -s ssh</span>
</code></pre><p>2.由于在线安装脚本内容被墙,可以在服务器上搭建个shadowsocks客户端进行安装(又需要稍微折腾一下)。</p>
<pre><code>curl -sS http<span class="variable">s:</span>//packages.gitlab.<span class="keyword">com</span>/install/repositories/gitlab/gitlab-<span class="keyword">ce</span>/script.rpm.<span class="keyword">sh</span> | sudo bash
sudo yum install gitlab-<span class="keyword">ce</span>
</code></pre><p>或者将安装包下载在本地,然后通过scp或者ftp再上传到服务器进行安装。</p>
<pre><code>curl -O http<span class="variable">s:</span>//packages.gitlab.<span class="keyword">com</span>/gitlab/gitlab-<span class="keyword">ce</span>/packages/<span class="keyword">el</span>/<span class="number">6</span>/gitlab-<span class="keyword">ce</span>-<span class="number">8.6</span>.<span class="number">4</span>-<span class="keyword">ce</span>.<span class="number">0</span>.el6.x86_64.rpm/download
rpm -<span class="keyword">i</span> gitlab-<span class="keyword">ce</span>-<span class="number">8.6</span>.<span class="number">4</span>-<span class="keyword">ce</span>.<span class="number">0</span>.el6.x86_64.rpm
</code></pre><p>3.配置和启动GitLab。用 vim 打开 <code>/etc/gitlab/gitlab.rb</code> ,将 <code>external_url = 'http://git.example.com'</code> 修改为自己的IP地址:<code>http://xxx.xx.xxx.xxx</code>,然后执行下面的命令,对GitLab进行编译。</p>
<pre><code><span class="title">sudo</span> gitlab-ctl reconfigure
</code></pre><p>4.打开 <code>http://xxx.xx.xxx.xxx</code> ,使用gitlab。</p>
<h3 id="出现的问题">出现的问题</h3><p>1.在浏览器中访问GitLab出现502错误<br>原因:内存不足。<br>解决办法:检查系统的虚拟内存是否随机启动了,如果系统无虚拟内存,则增加虚拟内存,再重新启动系统。</p>
<p>2.GitLab头像无法正常显示<br>原因:gravatar被墙<br>解决办法:<br>编辑 /etc/gitlab/gitlab.rb,将</p>
<pre><code><span class="id">#gitlab_rails</span>[<span class="string">'gravatar_plain_url'</span>] = <span class="string">'http://gravatar.duoshuo.com/avatar/%{hash}?s=%{size}&d=identicon'</span>
</code></pre><p>修改为:</p>
<pre><code><span class="atom">gitlab_rails</span>[<span class="string">'gravatar_plain_url'</span>] = <span class="string">'http://gravatar.duoshuo.com/avatar/%{hash}?s=%{size}&d=identicon'</span>
</code></pre><p>然后在命令行执行:</p>
<pre><code>sudo gitlab-ctl reconfigure
sudo gitlab-rake <span class="operator"><span class="keyword">cache</span>:<span class="keyword">clear</span> RAILS_ENV=production</span>
</code></pre><h3 id="参考资料">参考资料</h3><p><a href="https://segmentfault.com/a/1190000002722631" target="_blank" rel="external">GitLab的安装方式</a></p>
]]></content>
<summary type="html">
<![CDATA[在阿里云上折腾了一天的 GitLab ,编译安装时各种被墙,无法正常安装,最后使用了官网的rpm包安装方式解决了问题。]]>
</summary>
<category term="git" scheme="http://notes.cribug.com/tags/git/"/>
</entry>
<entry>
<title><![CDATA[Linux 命令之 scp]]></title>
<link href="http://notes.cribug.com/2016/linux-scp/"/>
<id>http://notes.cribug.com/2016/linux-scp/</id>
<published>2016-04-02T05:26:33.000Z</published>
<updated>2016-04-02T07:13:54.012Z</updated>
<content type="html"><![CDATA[<p>之前迁移服务器站点和数据的时候,我能想到的唯一办法是使用 ftp 工具将程序和数据库打包下载来,然后再使用 ftp 工具上传到另外一台服务器。这样的解决方案很浪费时间,经过同事介绍,使用 Linux 下的 scp 工具很容易的去完成服务器迁移工作,看来我这个半吊子程序员做运维还是不行滴 :)。。</p>
<p>scp 基于 ssh 登录,将当前主机文件 upload 给远程主机,或者将远程主机的文件 download 到当前操作主机。</p>
<h3 id="当前主机文件_upload_给远程主机">当前主机文件 upload 给远程主机</h3><p>复制文件 </p>
<pre><code><span class="preprocessor"># 将本地的 /var/data.tar.gz 文件上传到 <span class="number">222.222</span><span class="number">.222</span><span class="number">.222</span> 服务器的 data 目录下</span>
<span class="preprocessor"># 文件名不变,命令执行后需要输入远程主机的 root 用户密码</span>
scp /var/data.tar.gz root@<span class="number">222.222</span><span class="number">.222</span><span class="number">.222</span>:/data/
<span class="preprocessor"># 将本地的 /var/data.tar.gz 文件上传到 <span class="number">222.222</span><span class="number">.222</span><span class="number">.222</span> 服务器的 data 目录下</span>
<span class="preprocessor"># 文件名变为 upload.tar.gz,命令执行后需要输入远程主机的 root 用户密码</span>
scp /var/data.tar.gz root@<span class="number">222.222</span><span class="number">.222</span><span class="number">.222</span>:/data/upload.tar.gz
<span class="preprocessor"># 将本地的 /var/data.tar.gz 文件上传到 <span class="number">222.222</span><span class="number">.222</span><span class="number">.222</span> 服务器的 data 目录下</span>
<span class="preprocessor"># 文件名不变,命令执行后需要输入远程主机的用户名字的密码</span>
scp /var/data.tar.gz <span class="number">222.222</span><span class="number">.222</span><span class="number">.222</span>:/data/
<span class="preprocessor"># 将本地的 /var/data.tar.gz 文件上传到 <span class="number">222.222</span><span class="number">.222</span><span class="number">.222</span> 服务器的 data 目录下</span>
<span class="preprocessor"># 文件名变为 upload.tar.gz,命令执行后需要输入远程主机的用户名和密码</span>
scp /var/data.tar.gz <span class="number">222.222</span><span class="number">.222</span><span class="number">.222</span>:/data/upload.tar.gz
</code></pre><p>复制目录</p>
<pre><code><span class="preprocessor"># 将本地的 /var/log 目录上传到 <span class="number">222.222</span><span class="number">.222</span><span class="number">.222</span> 服务器的 data 目录下</span>
<span class="preprocessor"># 即远程主机产生 /data/log/ 目录,命令执行后需要输入远程主机的 root 用户密码</span>
scp -r /var/<span class="built_in">log</span>/ root@<span class="number">222.222</span><span class="number">.222</span><span class="number">.222</span>:/data/
<span class="preprocessor"># 将本地的 /var/log 目录上传到 <span class="number">222.222</span><span class="number">.222</span><span class="number">.222</span> 服务器的 data 目录下</span>
<span class="preprocessor"># 即远程主机产生 /data/log/ 目录,命令执行后需要输入远程主机的 root 用户密码</span>
scp -r /var/<span class="built_in">log</span>/ <span class="number">222.222</span><span class="number">.222</span><span class="number">.222</span>:/data/
</code></pre><h3 id="远程主机文件_download_到当前主机文件">远程主机文件 download 到当前主机文件</h3><p>只要将上面<font color="red">《当前主机文件 upload 给远程主机》</font>的后面两个参数(本地目录和远程目录)调换顺序就好,例如:</p>
<pre><code><span class="comment"># 将远程主机的 data.tar.gz 文件下载到本地 /var/ 目录下</span>
<span class="comment"># 文件名不变,命令执行后需要输入远程主机的 root 用户密码</span>
scp root<span class="variable">@222</span>.<span class="number">222.222</span>.<span class="number">222</span><span class="symbol">:/data/data</span>.tar.gz /var/
<span class="comment"># 将远程主机的 /var/log/ 目录下载到当前主机的 data 目录下</span>
<span class="comment"># 即本地主机产生 /data/log/ 目录,命令执行后需要输入远程主机的 root 用户密码</span>
scp -r <span class="number">222.222</span>.<span class="number">222.222</span><span class="symbol">:/var/log/</span> /data/
</code></pre><h3 id="其他">其他</h3><p>如果远程主机的默认 SSH 端口被改的话,可以使用 <code>-p</code> 参数,例如:</p>
<pre><code>scp -p <span class="number">22001</span> root<span class="variable">@222</span>.<span class="number">222.222</span>.<span class="number">222</span><span class="symbol">:/data/data</span>.tar.gz /var/
</code></pre><p>还有一些其他参数, <code>-v</code>(显示进度)、 <code>-4</code>(使用 IPV4 地址), <code>-6</code>(使用 IPV6 地址)。</p>
<p>在使用 scp 的过程中,注意所使用的用户是否具有可读取远程服务器相应文件的权限。</p>
<p>如果你使用的是 <code>OS X</code> 系统或者 <code>Linux</code> 系统,还可以实现本地的文件上传,下载等功能。如果是 <code>windows</code> 系统的话,我没折腾过,大家可以试试。</p>
<p>Linux 之间传输文件的其他方式:</p>
<ul>
<li>一台主机安装 ftp Server,另外一台使用ftp的Client程序。</li>
<li>采用samba服务。</li>
<li>将文件放到 Web 目录下,另外一台进行 <code>wget</code> 下载(我能想到的只有这么多了)。</li>
</ul>
<p>前两方式我没试过,不保证很简单。</p>
]]></content>
<summary type="html">
<![CDATA[之前迁移服务器站点和数据的时候,我能想到唯一的办法是使用 ftp 工具将程序和数据库打包下载来,然后再使用 ftp 工具上传到另外一台服务器。这样的解决方案很浪费时间,经过同事介绍,使用 Linux 下的 scp 工具很容易的去完成服务器迁移工作,看来我这个半吊子程序员做运维还是不行滴 :)。]]>
</summary>
<category term="Linux" scheme="http://notes.cribug.com/tags/Linux/"/>
</entry>
<entry>
<title><![CDATA[推荐一些 PHP 学习资料]]></title>
<link href="http://notes.cribug.com/2016/Learn-PHP/"/>
<id>http://notes.cribug.com/2016/Learn-PHP/</id>
<published>2016-03-31T15:11:42.000Z</published>
<updated>2016-03-31T18:14:37.684Z</updated>
<content type="html"><![CDATA[<h3 id="文档">文档</h3><blockquote>
<p>目前网络上充斥着大量的过时资讯,让 PHP 新手误入歧途,并且传播着错误的实践以及不安全的代码。《 PHP 之道》收集了现有的 PHP 最佳实践、编码规范和权威学习指南,方便 PHP 开发者阅读和查找。</p>
</blockquote>
<p><a href="http://www.phptherightway.com/" target="_blank"><img src="http://www.phptherightway.com/images/banners/leaderboard-728x90.png" alt="PHP: The Right Way"></a></p>
<p>我刚开始学习的 PHP 资料,是网上下载的某培训机构2013年的培训视频,视频内容使用的 PHP 版本是 5.3.* 。由于使用的学习资料过时,导致我半年之后才知道 PHP 有“命名空间”这东西。虽然说网络是个好东西,但是里面充斥着太多的杂乱信息。技术虽然快速发展,但是信息还是存在着不对称,比如在国外火了一年多的技术,国内才逐渐火起来。</p>
<p>多年之后,我发现了一个好东西,可以解决学习 PHP 的困扰,《 PHP 之道》向 PHP 新手介绍一些他们没有发现或者是太晚发现的主题,或是经验丰富的专业人士已经实践已久的做法提供一些新想法。当有更多有用的资讯以及范例时,<font color="red">《 PHP 之道》</font>会随着相关技术的发展而持续更新。</p>
<p>推荐,跟我一样英语不过关的同学,观看英文手册。(可以一边学习英语,一边学习技术,说不定以后要看的英文文档的机会还有很多呢)</p>
<ul>
<li>English: <a href="http://www.phptherightway.com/" target="_blank" rel="external">http://www.phptherightway.com/</a></li>
<li>中文版: <a href="http://laravel-china.github.io/php-the-right-way/" target="_blank" rel="external">http://laravel-china.github.io/php-the-right-way/</a></li>
</ul>
<p>如果需要工具文档的话,<font color="red">官方文档</font>是最好的工具书,没有之一,无论是内容还是翻译排版等,都是上乘之作,尤其手册可以像论坛一样,递交笔记和查看他人的笔记,从中应该能得到些技术点吧!</p>
<ul>
<li>English: <a href="http://php.net/manual/en/" target="_blank" rel="external">http://php.net/manual/en/</a></li>
<li>中文版: <a href="http://php.net/manual/zh/" target="_blank" rel="external">http://php.net/manual/zh/</a></li>
</ul>
<h3 id="书籍">书籍</h3><p>另外推荐两本书,PHP 工程师进阶所需。</p>
<p><font color="red">《深入PHP:面向对象、模式与实践(第3版)》</font>,PHP专家赞德斯经典力作,主要讲解面向对象、设计模式和一些工具的使用等。</p>
<p><font color="red">《 Modern PHP 》</font>的作者也是《 PHP 之道》的发起人 Josh Lockhart。书中覆盖面很广,从“命名空间”、“闭包”等,讲到最佳实践,也有composer 、psr 等最新标准规范,适合有一定 PHP 开发经验的人阅读。</p>
]]></content>
<summary type="html">
<![CDATA[目前网络上充斥着大量的过时资讯,让 PHP 新手误入歧途,并且传播着错误的实践以及不安全的代码。PHP之道收集了现有的 PHP 最佳实践、编码规范和权威学习指南,方便 PHP 开发者阅读和查找。]]>
</summary>
<category term="PHP" scheme="http://notes.cribug.com/tags/PHP/"/>
</entry>
<entry>
<title><![CDATA[PHP 正则匹配汉字的正确姿势]]></title>
<link href="http://notes.cribug.com/2016/RegEx-Han/"/>
<id>http://notes.cribug.com/2016/RegEx-Han/</id>
<published>2016-03-30T13:32:44.000Z</published>
<updated>2016-03-31T19:17:46.053Z</updated>
<content type="html"><![CDATA[<p>一直以来,正则匹配汉字都是个坑,网上搜索出来的 <font color="blue">Unicode码段</font>匹配都不怎么好用。前几天在一个技术群里,看到了一个大牛给出了个不错的解决方案。</p>
<p>下面是我Get到的新技能:</p>
<pre><code><span class="regexp">/\p{Han}/u</span>
</code></pre><p>以前从来没见过这样的正则(原谅我的无知吧)。<code>\p{Han}</code> 代表汉语(中文字符),<code>u</code>模式修饰符表示被匹配的字符串是utf-8的(传说中的开启Unicode模式?)。<font color="red">这个正则只适合于 “开启Unicode模式的PHP” 和 “1.9以上版本Ruby” 。</font></p>
<p>实践出真知:</p>
<pre><code><?php
<span class="variable">$value</span>=<span class="string">"迷麟--灵山王"</span>;
preg_match(<span class="string">'/^(\p{Han}){2}/u'</span>, <span class="variable">$value</span>, <span class="variable">$result</span>);
print_r(<span class="variable">$result</span>);
?>
</code></pre><p>输出为:</p>
<pre><code><span class="keyword">Array</span>
(
[<span class="number">0</span>] => 迷麟
[<span class="number">1</span>] => 麟
)
</code></pre><p>参考资料:<br>正则表达式:Unicode诸问题:<a href="http://www.infoq.com/cn/news/2011/03/regular-expressions-unicode-2" target="_blank" rel="external">http://www.infoq.com/cn/news/2011/03/regular-expressions-unicode-2</a><br>模式修饰符:<a href="http://php.net/manual/zh/reference.pcre.pattern.modifiers.php" target="_blank" rel="external">http://php.net/manual/zh/reference.pcre.pattern.modifiers.php</a></p>
<p>欢迎大家学习交流。</p>
]]></content>
<summary type="html">
<![CDATA[一直以来,正则匹配汉字都是个坑,网上搜索出来的 <font color="blue">Unicode码段</font>匹配都不怎么好用。前几天在一个技术群里,看到了一个大牛给出了个不错的解决方案。]]>
</summary>
<category term="RegEx" scheme="http://notes.cribug.com/tags/RegEx/"/>
</entry>
<entry>
<title><![CDATA[各路大牛齐聚《技术社群大会》]]></title>
<link href="http://notes.cribug.com/2016/TCC2016/"/>
<id>http://notes.cribug.com/2016/TCC2016/</id>
<published>2016-03-29T09:47:26.000Z</published>
<updated>2016-03-29T14:43:32.426Z</updated>
<content type="html"><![CDATA[<p>利用周末的空闲时间,去参加了由极客邦举办的<font color="#0070C2">技术社群大会</font>,见证了一场由IOS大牛唐巧引起的粉丝见面会。啥?你问什么叫粉丝见面会?参会人员一般以上都是冲着唐巧去的,而且纷纷合照留念,这不叫粉丝见面会么?然而我并不是IOS开发者 <strong>:)</strong>。转为正题,这次大会的质量还是非常高滴,虽说是社群大会,但是大多数来的都是技术人员,极少数是运营人员。</p>
<p><img src="/images/TCC2016.png" alt="TCC Logo" title="TCC Logo"></p>
<p>对于开发者来说,这样的大会虽然不能短时间提升你的技术能力,但能让你体会到一场盛大的技术盛宴,对于开拓视野还是不错滴。大会的演讲嘉宾太多,我就讲讲印象最深的两个人吧,一个是IOS明星唐巧小哥,一个是PHP明星鸟哥。</p>
<h3 id="资深iOS开发者——唐巧">资深iOS开发者——唐巧</h3><p>先来一段官方介绍吧!</p>
<blockquote>
<p>唐巧,Blogger,资深iOS开发者,InfoQ编辑,《iOS开发进阶》作者。曾在网易参与过网易邮箱、网易微博以及有道云笔记的开发。</p>
<p>目前在猿题库创业,是小猿搜题的产品技术负责人。喜欢写作与分享,长期维护着自己的技术博客:<a href="http://blog.devtang.com" target="_blank" rel="external">http://blog.devtang.com</a> 和微信公共帐号iOSDevTips,他的技术文章也多次发表在InfoQ网站上。</p>
</blockquote>
<p>话说网易的产品用着都还不错呢,就是安全做的不到位唉,现在应该好了吧,表示是163邮箱的老用户了(不服来拼)。</p>
<p>话说唐巧小哥刚上场就问,现场有多少人是根据他提供的优惠码来参加大会的(要知道即便有优惠码,还是需要100软妹纸的),从我看得到的视野来说,基本2/3的人都举起了手,然后又问有多少人是IOS开发者,结果有更多的人参与了进来。我只想说这是真爱!!!</p>
<p>唐巧小哥带给我们的不是IOS各种高大上的技术,而是一位IOS新人,经历了怎样的成长,才站在了技术之巅的历程。他说,现在的大牛分为两种人,一种是静下心来默默做事情的,非常低调,但是实力强悍;另外一种是通过写博客或者笔记等,来沉淀自己的知识,同时分享了知识,逐渐成为行业的专家。而他属于第二种人。</p>
<ul>
<li>2011.07转型学习IOS开发</li>
<li>2012.05独立负责IOS产品</li>
<li>2013年开了个微信公众号,用了半年时间,达到3000订阅量</li>
<li>2014年完成了一本书——《iOS开发进阶》</li>
</ul>
<p>这就是他的成长历程。</p>
<p>为什么你不行呢?很多人都会这样找借口,上班没时间去学习。真的没时间学习么?</p>
<p>唐巧利用上下班坐公交时间和平时的碎片时间,看WWDC视频,看各种IOS博客,然后沉淀成笔记,反复的复习。记忆→理解→应用→分析→评鉴→创造。也许你又会说英语不好,WWDC视频看不了;如果花太多时间学习了话,就没有对象,没有老婆。你可知道唐巧小哥的孩子都快能打酱油了呢。</p>
<p>下面是他最后的总结:</p>
<ul>
<li>时间(不要找借口)</li>
<li>心智(培养一些习惯,不要去抵抗,设定一个目标,写微信公众号或者写博客)</li>
<li>坚持(10000个小时的实践者,用10000h,你可能就是某一领域的专家,或许三年就能完成,或许五年)</li>
</ul>
<h3 id="PHP技术专家——鸟哥">PHP技术专家——鸟哥</h3><blockquote>
<p>惠新宸,国内最有影响力的PHP技术专家,PHP开发组核心成员,PECL开发者,Zend公司外聘顾问,曾供职于雅虎、百度、新浪,现任链家网技术副总裁兼总架构师。是PHP 7的核心开发者,PHP5.4,5.5的主要开发者。</p>
<p>作为PECL开发者贡献了Yaf (Yet another framework),Yar(Yet another RPC framework) 以及Yac(Yet another Cache)、Taint等多个优秀开源作品,同时也是APC、Opcache、Msgpack等项目的维护者。</p>
</blockquote>
<p>看到这里你是不是惊呆了呢?没事,我也惊呆了!有人说,鸟哥不是搞Linux的么?没错,但是此鸟哥非彼鸟哥,如果你是做PHP的话,就肯定知道了。</p>
<p>我是大概去年2月份学习的PHP吧,直到半年后,偶然机会才得知江湖有PHP鸟哥这一号人物。我们都是用PHP写东西的,而鸟哥却是写PHP的,这之间的差距,可想而知!</p>
<p>我不知道为什么很多程序员都会去黑PHP,但是PHP工程师的就业前景,就目前而言,还是排在前几名的。说其语法奇葩也好,说其函数命名不规范也好,但它就是走在时代的前沿。鸟哥认为,语言的好坏,是市场需求来决定的,而不是开发者来决定的。在PHP的背后,有着强大的社区支持,PHP开发过程中,如果遇到错误,只要将错误代码贴到Google上,第一个答案就能解决你的问题,这就是PHP背后强大的社区支持。</p>
<ul>
<li><p>PHP 1 (1994)<br>Personal HomePage Tool(首创: HTML和脚本融合在一起,开发维护效率大幅提升)</p>
</li>
<li><p>PHP 2 (1995 ~ 1997)<br>PHP/FI(Form Interpreter)(还只是简单的Form解析,加入了对mSQL的支持,1996: 50000个域名使用PHP)</p>
</li>
<li><p>PHP 3 (1998)<br>Hypertext Preprocessor(终于是一门语言了,弱类型, 可扩展的语言)</p>
</li>
<li><p>PHP 4 (2000)<br>Zend Engine 1.0(基本的OO支持、会话支持、性能提升、社区快速发展、2002:Yahoo! 从YScript迁移到了PHP)</p>
</li>
<li><p>PHP 5 (2004)<br>Zend Engine 2.0(更好的OO支持、PDO的引用、 性能提升、WordPress、Facebook)</p>
</li>
<li><p>PHP 6 (2005)<br>Unicodes支持,然而你懂得。。。</p>
</li>
<li><p>PHP 7 (2014)<br>Zend Engine 3.0(最大的一次重构, 历时一年多开发,PHP最大的性能提升版本)</p>
</li>
</ul>
<p>想要鸟哥最近的的两个演讲PPT,可以可以戳下面的链接:</p>
<p>配置PHP7达到更高性能: <a href="http://www.slideshare.net/laruence/php7-for-its-best-performance" target="_blank" rel="external">http://www.slideshare.net/laruence/php7-for-its-best-performance</a><br>PHP的历史: <a href="http://www.slideshare.net/laruence/a-history-of-php" target="_blank" rel="external">http://www.slideshare.net/laruence/a-history-of-php</a></p>
]]></content>
<summary type="html">
<![CDATA[利用周末的空闲时间,去参加了由极客邦举办的<font color="#0070C2">技术社群大会</font>,见证了一场由IOS大牛唐巧引起的粉丝见面会。啥?你问什么叫粉丝见面会?参会人员一般以上都是冲着唐巧去的,而且纷纷合照留念,这不叫粉丝见面会么?然而我并不是IOS开发者 <strong>:)</strong>。转为正题,这次大会的质量还是非常高滴,虽说是社群大会,但是大多数来的都是技术人员,极少数是运营人员。]]>
</summary>
<category term="技术大会" scheme="http://notes.cribug.com/tags/%E6%8A%80%E6%9C%AF%E5%A4%A7%E4%BC%9A/"/>
</entry>
<entry>
<title><![CDATA[防止Ajax重复递交]]></title>
<link href="http://notes.cribug.com/2015/prevent-repeat-ajax/"/>
<id>http://notes.cribug.com/2015/prevent-repeat-ajax/</id>
<published>2015-12-03T12:14:43.000Z</published>
<updated>2016-03-30T16:22:07.510Z</updated>
<content type="html"><![CDATA[<p>遇到了这样一个问题,使用ajax进行表单递交,如果网络不好,不能及时响应,如果重复点击submit按钮,会不断的向服务器递交数据,导致重复递交同样的数据。那么这个问题该怎么解决呢?</p>
<h3 id="最粗暴的方式,修改按钮状态或者外部变量锁定">最粗暴的方式,修改按钮状态或者外部变量锁定</h3><ul>
<li>修改按钮状态 - 只要点击按钮后,将按钮状态更改为disabled,返回结果后就delete掉这个状态。</li>
<li>外部变量锁定 - 放个全局变量,只要发了Ajax请求,变量为false,收到结果就变回true。每次发请求的时候检测这个变量,假如为false就不能发Ajax。</li>
</ul>
<p>当然不推荐这两种方式。</p>
<p>参考资料:<a href="http://www.zhihu.com/question/19805411" target="_blank" rel="external">http://www.zhihu.com/question/19805411</a></p>
]]></content>
<summary type="html">
<![CDATA[遇到了这样一个问题,使用ajax进行表单递交,如果网络不好,不能及时响应,能重复点击submit按钮,会不断的向服务器递交数据,导致重复递交同样的数据。]]>
</summary>
<category term="Ajax" scheme="http://notes.cribug.com/tags/Ajax/"/>
</entry>
<entry>
<title><![CDATA[用Ajax取代传统的Form提交的好处]]></title>
<link href="http://notes.cribug.com/2015/ajax-vs-form/"/>
<id>http://notes.cribug.com/2015/ajax-vs-form/</id>
<published>2015-12-01T15:14:21.000Z</published>
<updated>2016-01-28T18:07:16.828Z</updated>
<content type="html"><![CDATA[<p>开发的过程中,总会遇到各种各样的小问题。有的问题是由于个人失误造成的,需要去修正,而有的是因为决策原因,需要换条思路去解决。一般我们在实现页面局部刷新的时候使用Ajax,表单递交的时候使用传统的Form递交。如果表单递交使用Ajax的话,也许会有意想不到的结果。</p>
<p>使用Ajax递交表单,体验会更好。数据提交页面不会闪屏;页面局部更新速度快;网络带宽占用低。</p>
<p>传统模式下,表单提交整个页面重绘,为了维持页面用户对表单的状态改变,要多写不少代码。 要在控制器和模板之间传递更多参数以保持页面状态。而AJAX不然,数据提交页面不会白屏,因为页面只是局部更新, 不关心也不会影响页面其他部分的内容。</p>
]]></content>
<summary type="html">
<![CDATA[开发的过程中,总会遇到各种各样的小问题。有的问题是由于个人失误造成的,需要去修正,而有的是因为决策原因,需要换条思路去解决。一般我们在实现页面局部刷新的时候使用Ajax,表单递交的时候使用传统的Form递交。如果表单递交使用Ajax的话,也许会有意想不到的结果。]]>
</summary>
<category term="Ajax" scheme="http://notes.cribug.com/tags/Ajax/"/>
</entry>
<entry>
<title><![CDATA[来自UCloud的数据方舟]]></title>
<link href="http://notes.cribug.com/2015/UCloud-TestDataArk/"/>
<id>http://notes.cribug.com/2015/UCloud-TestDataArk/</id>
<published>2015-11-24T03:21:18.000Z</published>
<updated>2016-01-28T18:07:27.248Z</updated>
<content type="html"><![CDATA[<p>上周做完UCloud的<font color="red">数据方舟</font>测试,今天写个书面的测评吧。</p>
<h3 id="1-_介绍">1. 介绍</h3><h4 id="1-1_UCloud">1.1 UCloud</h4><p>最早看到UCloud的影子是在一个开源社区,印象最深刻的就是那个简洁的Logo。当时还在学校,对云计算这个概念不是很清楚,使用过一些产品后,才知道云计算的强大之处——<font color="#0070C2">成本低 · 安全 · 方便</font>。</p>
<p><img src="/images/ucloud-logo.png" alt="UCloud Logo" title="UCloud Logo"></p>
<p>随着云计算的发展,各大互联网巨头都提供有云服务,而UCloud是一家非常专业的云计算服务商,说其专业,是因为UCloud只专注于云计算,比如典型的云服务器、云数据库等。</p>
<h4 id="1-2_UDataArk(数据方舟)">1.2 UDataArk(数据方舟)</h4><p>还记得电影《诺亚方舟:创世之旅》和《2012》里面的诺亚方舟么?其作用是保留物种不被灭绝。在计算机领域,数据就等同于物种,是非常重要的。<font color="red">数据方舟</font>是UCloud近期提供的数据备份服务,目前还处于内测阶段,我有幸提前进行了试用。</p>
<p>数据方舟支持手工备份和<font color="red">秒级备份</font>服务。从使用感受上来说,秒级备份是亮点。各大互联网厂商都提供的云服务一般都支持手动备份(创建镜像),但是大多忽略了实时备份,然而只有实时备份才更能保证数据的完整性,秒级备份服务正是基于这点诞生的。</p>
<h3 id="2-_使用">2. 使用</h3><h4 id="2-1_开启数据方舟">2.1 开启数据方舟</h4><p>在Ucloud上创建云主机,目前只有标准版的云主机支持数据方舟服务,SSD高性能版、网络增强机型暂时不支持数据方舟服务,相信Ucloud很快会全方位支持。</p>
<p>在最后一步备份方案中后面打勾,才能开启这台主机的数据方舟服务。<br><img src="/images/ucloud-ark-open.png" alt="开启数据方舟" title="开启数据方舟"></p>
<h4 id="2-2_我的云主机配置">2.2 我的云主机配置</h4><ul>
<li>主机名:ARK</li>
<li>机型:标准版</li>
<li>镜像:CentOS 6.5 64bit</li>
<li>CPU:2核</li>
<li>内存:4G</li>
<li>本地硬盘:<br>/dev/vda1 20GB系统盘(/)<br>/dev/vdb 20GB数据盘(/data/)</li>
</ul>
<p>既然数据方舟是用来备份数据的,所以刚开始我在云主机上做了一个WEB服务配置,使用了LNMP架构(Linux + Nginx + MySQL + PHP),将MySQL的data目录放在数据盘中(/data/mysql/),同时安装了一个流行的php框架Laravel,也放在数据盘中(/data/www/)。</p>
<p><img src="/images/ucloud-ark-base.png" alt="基础配置" title="基础配置"></p>
<p>下面是部署在该云主机上的WEB程序,为了使测试更直观,为该Web程序配置了二级域名。<br><img src="/images/ucloud-web-1.png" alt="web首页" title="web首页"></p>
<p>OK!既然系统环境和程序部署完成,就可以开始测试数据方舟的功能了。</p>
<h4 id="2-3_手动备份测试">2.3 手动备份测试</h4><p>手动备份数量上限:系统盘和数据盘各三份,如果多于三个的话,需要先把以前的一份备份删除,才能继续创建备份。</p>
<p>我的个人认知是这样的,这里的手动备份相当于各大云厂商提供的镜像服务,手动备份的最大特点是灵活性高,适用于各种备份场景,在应用进行重大迭代之前进行手动备份是非常有必要的。</p>
<p><img src="/images/ucloud-handbak-1.png" alt="手动备份" title="手动备份"></p>
<p>等待了大概5秒钟系统盘和数据盘备份成功。</p>
<p><img src="/images/ucloud-handbak-2.png" alt="手动备份" title="手动备份"></p>
<p>接下来我们可以先把Web应用的数据库删除了,看看效果。</p>
<blockquote>
<p>mysql> show databases;<br>+——————–+<br>| Database |<br>+——————–+<br>| information_schema |<br>| laraveltest |<br>| mysql |<br>| performance_schema |<br>+——————–+<br>4 rows in set (0.00 sec)</p>
<p>mysql> drop database laraveltest;<br>Query OK, 6 rows affected (0.01 sec)</p>
</blockquote>
<p>现在来访问web主页,由于我使用Debug模式,页面会显示出这样的提示,意思是找不到数据库laraveltest。</p>
<blockquote>
<p>PDOException in Connector.php line 47:<br>SQLSTATE[HY000] [1049] Unknown database ‘laraveltest’</p>
</blockquote>
<p>好吧,接下来对数据盘进行恢复,来尝试一下找回我刚才弄丢的数据。<font color="red">需要有一点注意的是,可以在开机状态下备份,但是不能在开机状态下还原数据,需要将主机关闭后进行恢复,以保证数据的准确性</font>。</p>
<p><img src="/images/ucloud-handbak-3.png" alt="手动备份" title="手动备份"></p>
<p>关闭主机,选择按备份恢复,对我们刚才的备份的数据盘进行恢复。<br><img src="/images/ucloud-handbak-4.png" alt="手动备份" title="手动备份"></p>
<p>数据盘恢复比较快,1分钟左右就会好了,然后启动服务器。查看Web主页,显示正常。查看数据库,刚才被删除的laraveltest数据库已经恢复正常。</p>
<blockquote>
<p>mysql> show databases;<br>+——————–+<br>| Database |<br>+——————–+<br>| information_schema |<br>| <font color="red">laraveltest</font> |<br>| mysql |<br>| performance_schema |<br>+——————–+<br>4 rows in set (0.00 sec)</p>
</blockquote>
<h4 id="2-4_秒级备份测试">2.4 秒级备份测试</h4><p>我认为秒级恢复是数据方舟最赞的部分,一是因为其开发技术要求肯定要高,二是可以给使用人员带来不少的便捷。秒级服务提供的具体内容如下:</p>
<ul>
<li>12小时内的任意时间,精确到秒哦</li>
<li>24小时内的任意整点</li>
<li>3天内的0点时刻</li>
</ul>
<p>由于我上周就进行了使用,所以这里积攒了些秒级备份的数据。</p>
<p><img src="/images/ucloud-autobak-1.png" alt="秒级备份" title="秒级备份"><br><img src="/images/ucloud-autobak-2.png" alt="秒级备份" title="秒级备份"></p>
<h5 id="2-4-1_秒级备份测试一">2.4.1 秒级备份测试一</h5><p>接下来把系统盘和数据盘都恢复到三天前,看看当时的Web界面是什么样子的。</p>
<p>关闭主机——>恢复——>按备份恢复<br><img src="/images/ucloud-autobak-3.png" alt="秒级备份" title="秒级备份"></p>
<p>经过4分钟,系统盘和数据盘全部还原成功,开机,来一睹三天前的Web界面吧(Laravel的初始化界面)。<br><img src="/images/ucloud-autobak-4.png" alt="秒级备份" title="秒级备份"></p>
<h5 id="2-4-2_秒级备份测试二">2.4.2 秒级备份测试二</h5><p>这个时候,如果我使用rm把 整个磁盘删除了,还不能不能恢复成功呢?再次选择使用秒级备份,把数据恢复到今天中午时刻,观测一下是否能够成功。</p>
<blockquote>
<p>[root@10-10-31-119 ~]# rm -rf / --no-preserve-root</p>
</blockquote>
<p>尽管有Ucloud的数据方舟,但当我rm整个磁盘的时候,脑袋还是嗡的一下,有点晕,原谅我的承受力有点低吧(主要以前丢数据丢的有点怕了)。现在将服务器断电(由于删除了整个系统,无法正常关机),使用秒级备份,把数据恢复到今天中午13:03:34(随机敲的)</p>
<p><img src="/images/ucloud-autobak-5.png" alt="秒级备份" title="秒级备份"></p>
<p>… … … 这次恢复花的时间稍微长点,用了15分钟。迫不及待的打开Web,观测一下,谢天谢地,一切正常。</p>
<p><img src="/images/ucloud-autobak-6.png" alt="秒级备份" title="秒级备份"></p>
<h3 id="3-_总结">3. 总结</h3><p>对数据方舟的测试,断断续续用了一周的时间,在这个过程中,与数据方舟的研发人员进行过沟通,对数据方舟这款产品有了一定的理解,并且就一些细节问题进行反馈,发现数据方舟的研发团队的执行力相当高,很多问题都会当天解决,向数据方舟的研发团队致敬。下面是我对数据方舟这款产品的总结。</p>
<ul>
<li><p><font color="#0070C2">灵活的手动备份 + 秒级的自动备份</font><br>手动备份适用于各种场景,灵活方便。但是在一些时候手贱地误删了一些东西,而上次手动备份到刚才之间的时间段,增加存在一些很重要的数据,如果使用手动备份,会将这段时间的数据丢掉,我们可以使用秒级备份恢复到误操作的前几秒,既避免了数据的丢失,还解决的手贱造成的问题,相当吃了一次后悔药。</p>
</li>
<li><p><font color="#0070C2">在线实时备份,不需要暂停业务</font><br>刚才使用了手动备份和秒级备份进行恢复系统数据,在备份过程中,没有需要对机器进行任何暂停应用的操作,也没有造成应用的任何不适,这样的方式大大的简化了业务备份的难题,进一步可以降低互联网创业人员的难度。</p>
</li>
<li><p><font color="#0070C2">控制台操作</font><br>一旦服务器应用出问题,即便不是专业的运维人员,也能通过控制台将应用恢复到最近没有出错的时刻(得益于超赞的自动备份)。</p>
</li>
</ul>
]]></content>
<summary type="html">
<![CDATA[上周做完UCloud的<font color="red">数据方舟</font>测试,今天写个书面的测评吧。最早看到UCloud的影子是在一个开源社区,印象最深刻的就是那个简洁的Logo。当时还在学校,对云计算这个概念不是很清楚,使用过一些产品后,才知道云计算的强大之处——<font color="#0070C2">成本低 · 安全 · 方便</font>。]]>
</summary>
<category term="云计算" scheme="http://notes.cribug.com/tags/%E4%BA%91%E8%AE%A1%E7%AE%97/"/>
</entry>
</feed>