-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrss.xml
More file actions
1802 lines (1274 loc) · 111 KB
/
rss.xml
File metadata and controls
1802 lines (1274 loc) · 111 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
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
<rss version="2.0">
<channel>
<title></title>
<link></link>
<description>Powered By <a href="http://lizheming.gitcafe.com">PMBlog</a></description>
<language>zh-cn</language>
<ttl>10</ttl>
<item>
<title><![CDATA[PHPer,我这三年]]></title>
<description><![CDATA[<blockquote>
如未特别标明,文章均属原创。转载请注明出处。by : 柳公子 <a href="http://huliuqing.github.io">http://huliuqing.github.io</a>
</blockquote>
<p>从2011年10月至本月初(2014年9月),我的工作和生活都在南昌一家叫腾王的初创手机游戏开发公司,从事PHP开发工作。虽然身处手游开发企业从事开发工作,但业务始终围绕建站、手游数据对接展开,提升和可发展前景不大。</p>
<p>出于各种原因,在9月中旬选择从腾王离职,加入到上海天奕达科技有限公司从事PHP开发工作。目前在天奕达工作稍微比在腾王辛苦,很多状态与腾王相似。</p>
<h2>腾王的一些问题</h2>
<p>在腾王与小伙伴们相处没有所谓的勾心斗角、尔虞我诈。大家处于好友的状态下从事开发工作,并且工作强度不大。在腾王工作的三年让我很开心。即便如此,最近一年工作在腾王,我的思考越来越多。</p>
<p>1、培训应届毕业生没有很好的老师</p>
<p>这些新人无论从事cocos2d,unity3d,动画还是PHP研发,都没有一个靠谱的“老师”。所有从事软件研发的企业,在其招聘信息上都会附上“有相关开发经验者优先”这样一条信息。</p>
<p>在腾王工作的新人是痛苦的,起码我是这样认为的。腾王几乎所有招聘的研发人员都来自于应届毕业生包括我自己。</p>
<p>在腾王的培训学校,对这些即将毕业的应届毕业生培训3-5个月游戏开发课程,签订劳动协议后便留在腾王。对于我们第一期的还好一些,有来自日本PA公司的大牛教授游戏开发课程,遇到问题大牛能够很快解决,授之以渔。</p>
<p>之后的学员,便是由我们这些刚接触游戏开发人员,以仅有的游戏开发知识,传授新的学员游戏开发课程,开发知识仅限于游戏引擎函数库的使用,呵呵,Are you kidding?</p>
<p>我在想,会不会有这样的人才,自己只有半桶水,可以教出一桶水的学生?</p>
<p>2、研发力量严重不足</p>
<p>如果培训学习仅仅是入职的第一步,那入职以后的艰辛依然无法忽视。</p>
<p>第一期学员入职后(我也是第一期学员,学习的课程是游戏开发,只不过还没学完课程就转到PHP从事PHP开发工作),日本的大牛就功成身退回日本了。剩下的就是我们这些一期的学员,游戏开发中的问题解决不了,发邮件给日本、百度、谷歌;再遇到问题,发邮件给给本、百度、谷歌......</p>
<p>第二期之后的学员,再遇到问题时,就是依靠先前培训过的“编程老鸟”的力量来解决问题。</p>
<p>我在想,会不会有这样的人才,自己对问题的认识一知半解,然而可以相对完美的解决问题?</p>
<p>3、员工技能培训工作没有做好</p>
<p>无论BAT,还是初创公司,都知道人才储备的重要性。优秀的人才多数集中在北上广深。在南昌优秀的编程开发人员,有但很少,年轻有活力的编程人员则更少。</p>
<p>腾王有机会留下部分有活力的年轻人,但在这些员工身上投入的精力太少。拿我来说(额我不是有活力的年轻人),我是在腾王自学的PHP。找视频、看手册、写代码、解决问题这些工作完全靠自己,这是我的状态。</p>
<p>拿游戏研发的员工来说,依然走着找视频、看手册、写代码、解决问题的老套路。</p>
<p>没有问题么?</p>
<p>可以说很多人到目前都没有深入的学习过IO、文件操作、数据库、MVC、编程规范、代码可用性和复用性这些内容,更有甚者可能闻所未闻。</p>
<p>现在三年过去了,我见到的依然有用a、b命名变量的;存在没有正确缩进格式的;乱写函数名的;额,还有纯拼音命名的。</p>
<p>如果一个人是这样,可以说他不够勤奋,但如果很多人都这样的话,难道说所有人不勤奋?</p>
<p>新员工基础培训工作,和老员工的进阶培训工作,我认为公司需要在这些方面投入精力。</p>
<p>4、没有明确需求和好的策划</p>
<p>我不懂策划,但我知道需求的重要性。做游戏,开发人员不负责任的可以仅仅关注编码工作,编写玩代码就OK;负责的同学,可能回去了解需求,思考如何做得更好。</p>
<p>在腾王游戏策划是从学员中招收的半路出家的“和尚”。在游戏策划中,策划时,市面上有哪些好的设计借鉴过来放到我们的游戏里,很多功能的设定给出的理由是“我认为这样,balabala”,而不是“为什么这样,而不应该是那样”。很多时候,上一个版本和这一个版本看起来是两个不同的游戏,呵呵,我不知道是怎么考虑的。</p>
<p>对于PHP研发工作,则连个需求都没有。开始的1年是在开源软件上进行二次开发工作,还好一些。之后给过来新的项目,就不适合二次开发了。
没有需求,没有产品分析,谁能告诉我要做成什么样?给几张图,把图上的功能实现了就行。shit,一坨狗屎。</p>
<p>搞到后来我这个做开发的还要兼职去思考如何把图上的网站,划分功能解决需求问题,设计数据库,技术选型,做前端,教新人。还能不能让我安静的写代码?</p>
<p>最奇葩的一次,一个项目前后有至少六七个人给过我反馈修改意见,你妹。</p>
<p>5、还有很多我想不到的</p>
<h2>我是如何解决这些问题的</h2>
<p>对症下药,才能药到病除,如果遇到这样的公司,我们应该自己积极的寻找途径加强自己。期望公司能够解决培训、流程、策划问题,你的成本会太高。</p>
<p>1、自学</p>
<p>我是做PHP开发工作的,再决定转做PHP开始,我就google了PHP如何学习。这之后我看完了PHP手册、MySQL、Javascript、CSS相关的理论知识并坚持实践;学习Web UI/UX相关知识;学习PHP、MySQL、Web前端安全及优化知识;阅读开源软件源代码。我可以肯定Web开发我入门了。</p>
<p>2、使用google,百度,Stackoverflow和Github</p>
<p>纸上谈兵永远不可行,开发过程中总会遇到各种奇葩问题,这时候利用好google,百度,Stackoverflow和Github将对你编程工作大有裨益。内事问百度、外事问Google、编程问题找找Stackoverflow、需要开源程序或许Github可以帮到你。如何用好这些软件请自行google、百度。</p>
<p>3、keep going</p>
<p>持续保持一种学习、研究和练习的状态。3年内搞清楚你所从事的领域是什么、能做什么、如何去做好它;没事多写写代码,看源代码;多看书、看好书;在你的领域开启循环模式,反复提升技能。如果觉得差不多了,就更深入一点、更广一点。</p>
<p>什么是更深入、更有广度?我无法解答你,当你明白的时候,自然无需我多说什么。</p>
<p>4、更多</p>
<p>希望你我都能能过的更好,走得跟远。best regards</p>
]]></description>
<pubDate>2014-09-22T00:00:00+08:00</pubDate>
<guid>http://huliuqing.github.io/2014-08-26-what-i-am-doing-with-php-in-last-there-years.html</guid>
<link>http://huliuqing.github.io/2014-08-26-what-i-am-doing-with-php-in-last-there-years.html</link>
</item>
<item>
<title><![CDATA[PHPer,我这三年]]></title>
<description><![CDATA[<p>tag:php,总结</p>
<blockquote>
如未特别标明,文章均属原创。转载请注明出处。by : 柳公子 <a href="http://huliuqing.github.io">http://huliuqing.github.io</a>
</blockquote>
<p>从2011年10月至本月初(2014年9月),我的工作和生活都在南昌一家叫腾王的初创手机游戏开发公司,从事PHP开发工作。虽然身处手游开发企业从事开发工作,但业务始终围绕建站、手游数据对接展开,提升和可发展前景不大。</p>
<p>出于各种原因,在9月中旬选择从腾王离职,加入到上海天奕达科技有限公司从事PHP开发工作。目前在天奕达工作稍微比在腾王辛苦,很多状态与腾王相似。</p>
<h2>腾王的一些问题</h2>
<p>在腾王与小伙伴们相处没有所谓的勾心斗角、尔虞我诈。大家处于好友的状态下从事开发工作,并且工作强度不大。在腾王工作的三年让我很开心。即便如此,最近一年工作在腾王,我的思考越来越多。</p>
<p>1、培训应届毕业生没有很好的老师
这些新人无论从事cocos2d,unity3d,动画还是PHP研发,都没有一个靠谱的“老师”。所有从事软件研发的企业,在其招聘信息上都会附上“有相关开发经验者优先”这样一条信息。</p>
<p>在腾王工作的新人是痛苦的,起码我是这样认为的。腾王几乎所有招聘的研发人员都来自于应届毕业生包括我自己。</p>
<p>在腾王的培训学校,对这些即将毕业的应届毕业生培训3-5个月游戏开发课程,签订劳动协议后便留在腾王。对于我们第一期的还好一些,有来自日本PA公司的大牛教授游戏开发课程,遇到问题大牛能够很快解决,授之以渔。</p>
<p>之后的学员,便是由我们这些刚接触游戏开发人员,以仅有的游戏开发知识,传授新的学员游戏开发课程,开发知识仅限于游戏引擎函数库的使用,呵呵,Are you kidding?</p>
<p>我在想,会不会有这样的人才,自己只有半桶水,可以教出一桶水的学生?</p>
<p>2、研发力量严重不足
如果培训学习仅仅是入职的第一步,那入职以后的艰辛依然无法忽视。</p>
<p>第一期学员入职后(我也是第一期学员,学习的课程是游戏开发,只不过还没学完课程就转到PHP从事PHP开发工作),日本的大牛就功成身退回日本了。剩下的就是我们这些一期的学员,游戏开发中的问题解决不了,发邮件给日本、百度、谷歌;再遇到问题,发邮件给给本、百度、谷歌......</p>
<p>第二期之后的学员,再遇到问题时,就是依靠先前培训过的“编程老鸟”的力量来解决问题。</p>
<p>我在想,会不会有这样的人才,自己对问题的认识一知半解,然而可以相对完美的解决问题?</p>
<p>3、员工技能培训工作没有做好
无论BAT,还是初创公司,都知道人才储备的重要性。优秀的人才多数集中在北上广深。在南昌优秀的编程开发人员,有但很少,年轻有活力的编程人员则更少。</p>
<p>腾王有机会留下部分有活力的年轻人,但在这些员工身上投入的精力太少。拿我来说(额我不是有活力的年轻人),我是在腾王自学的PHP。找视频、看手册、写代码、解决问题这些工作完全靠自己,这是我的状态。</p>
<p>拿游戏研发的员工来说,依然走着找视频、看手册、写代码、解决问题的老套路。</p>
<p>没有问题么?</p>
<p>可以说很多人到目前都没有深入的学习过IO、文件操作、数据库、MVC、编程规范、代码可用性和复用性这些内容,更有甚者可能闻所未闻。</p>
<p>现在三年过去了,我见到的依然有用a、b命名变量的;存在没有正确缩进格式的;乱写函数名的;额,还有纯拼音命名的。</p>
<p>如果一个人是这样,可以说他不够勤奋,但如果很多人都这样的话,难道说所有人不勤奋?</p>
<p>新员工基础培训工作,和老员工的进阶培训工作,我认为公司需要在这些方面投入精力。</p>
<p>4、没有明确需求和好的策划
我不懂策划,但我知道需求的重要性。做游戏,开发人员不负责任的可以仅仅关注编码工作,编写玩代码就OK;负责的同学,可能回去了解需求,思考如何做得更好。</p>
<p>在腾王游戏策划是从学员中招收的半路出家的“和尚”。在游戏策划中,策划时,市面上有哪些好的设计借鉴过来放到我们的游戏里,很多功能的设定给出的理由是“我认为这样,balabala”,而不是“为什么这样,而不应该是那样”。很多时候,上一个版本和这一个版本看起来是两个不同的游戏,呵呵,我不知道是怎么考虑的。</p>
<p>对于PHP研发工作,则连个需求都没有。开始的1年是在开源软件上进行二次开发工作,还好一些。之后给过来新的项目,就不适合二次开发了。
没有需求,没有产品分析,谁能告诉我要做成什么样?给几张图,把图上的功能实现了就行。shit,一坨狗屎。</p>
<p>搞到后来我这个做开发的还要兼职去思考如何把图上的网站,划分功能解决需求问题,设计数据库,技术选型,做前端,教新人。还能不能让我安静的写代码?</p>
<p>最奇葩的一次,一个项目前后有至少六七个人给过我反馈修改意见,你妹。</p>
<p>5、还有很多我想不到的</p>
<h2>我是如何解决这些问题的</h2>
<p>对症下药,才能药到病除,如果遇到这样的公司,我们应该自己积极的寻找途径加强自己。期望公司能够解决培训、流程、策划问题,你的成本会太高。</p>
<p>1、自学
我是做PHP开发工作的,再决定转做PHP开始,我就google了PHP如何学习。这之后我看完了PHP手册、MySQL、Javascript、CSS相关的理论知识并坚持实践;学习Web UI/UX相关知识;学习PHP、MySQL、Web前端安全及优化知识;阅读开源软件源代码。我可以肯定Web开发我入门了。</p>
<p>2、使用google,百度,Stackoverflow和Github
纸上谈兵永远不可行,开发过程中总会遇到各种奇葩问题,这时候利用好google,百度,Stackoverflow和Github将对你编程工作大有裨益。内事问百度、外事问Google、编程问题找找Stackoverflow、需要开源程序或许Github可以帮到你。如何用好这些软件请自行google、百度。</p>
<p>3、keep going
持续保持一种学习、研究和练习的状态。3年内搞清楚你所从事的领域是什么、能做什么、如何去做好它;没事多写写代码,看源代码;多看书、看好书;在你的领域开启循环模式,反复提升技能。如果觉得差不多了,就更深入一点、更广一点。</p>
<p>什么是更深入、更有广度?我无法解答你,当你明白的时候,自然无需我多说什么。</p>
<p>4、更多</p>
<p>希望你我都能能过的更好,走得跟远。best regards</p>
]]></description>
<pubDate>2014-09-22T00:00:00+08:00</pubDate>
<guid>http://huliuqing.github.io/2014-09-22-my-last-three-years.html</guid>
<link>http://huliuqing.github.io/2014-09-22-my-last-three-years.html</link>
</item>
<item>
<title><![CDATA[git入门资源]]></title>
<description><![CDATA[<h2>git入门资源</h2>
<p><blockquote>
如未特别标明,文章均属原创。转载请注明出处 </p>
<p>by : 柳公子 <a href="http://huliuqing.github.io">http://huliuqing.github.io</a>
</blockquote></p>
<p>因为写github pages的原因,而学习git相关使用方法。网上有非常多的入门教程可供学习,在这里列出个人觉得比较适合初学者的两个不错的资源。</p>
<h2>一)Git教程</h2>
<p>廖雪峰老师编写的《Git教程》。完全面向初学者的,内容讲解的浅显易懂。戳这里<a href='http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000' target="_blank">查看</a></p>
<p>另外,他(numbbbbb)将廖雪峰老师的教程制作了<a href='https://github.com/numbbbbb/Git-Tutorial-By-liaoxuefeng' target="_blank">电子书</a></p>
<h2>二)tryGit教程(E文)</h2>
<p>tryGit教程是由Code School出品,在线Git命令使用教程。配合廖雪峰老师<code>Git教程</code>,让我们真正掌握如何使用Git。当然,如果你自行配置好了Git环境,那Don't be shy,just try!</p>
<h2>----------------------------------------</h2>
<p>其它:</p>
<p><a href='http://rogerdudler.github.io/git-guide/index.zh.html' target="_blank">git - 简明指南</a> </p>
<blockquote>
<p>号称史上最简单入门,个人没试过</p>
</blockquote>
]]></description>
<pubDate>2014-06-16T14:00:00+08:00</pubDate>
<guid>http://huliuqing.github.io/2014-06-16-git-tutorials-resource.html</guid>
<link>http://huliuqing.github.io/2014-06-16-git-tutorials-resource.html</link>
</item>
<item>
<title><![CDATA[前端开发体系构建]]></title>
<description><![CDATA[<blockquote>
如未特别标明,文章均属原创。转载请注明出处
by : 柳公子 <a href="http://huliuqing.github.io">http://huliuqing.github.io</a>
</blockquote>
<p>本文列出前端开发中收集的好文章,将持续更新</p>
<p><a href="http://www.cnblogs.com/cnwebdeveloper/articles/2234423.html" target='_blank'>浏览器内部工作原理</a></p>
<p><a href="http://www.infoq.com/cn/articles/talk-front-end-integrated-solution-part2" target='_blank'>前端开发体系建设日记</a></p>
<p><a href="https://github.com/fouber/blog/issues/3" target='_blank'>前端工程与性能优化</a></p>
<p><a href="http://blog.xufei.gitpress.org/" target='_blank'>前端架构那些事儿</a></p>
<p><a href="https://github.com/fanker/javascript-style-reference" target='_blank'>Javascript代码及注释规范</a></p>
<p><a href="https://github.com/WenTao-Love/fks">Frontend Knowledge Structure</a></p>
<p>to be continued</p>
]]></description>
<pubDate>2014-06-10T16:00:00+08:00</pubDate>
<guid>http://huliuqing.github.io/2014-06-10-web-frontend-framework-develop-resource.html</guid>
<link>http://huliuqing.github.io/2014-06-10-web-frontend-framework-develop-resource.html</link>
</item>
<item>
<title><![CDATA[Web缓存加速指南]]></title>
<description><![CDATA[<blockquote>
如未特别标明,文章均属原创。转载请注明出处
by : 柳公子 <a href="http://huliuqing.github.io">http://huliuqing.github.io</a>
</blockquote>
<h2>前端缓存优化加速的指南</h2>
<p>在这篇文章中,我会不定时的增加有关前端优化加速相关的好文章。</p>
<p><a href="http://www.cnblogs.com/lhb25/archive/2009/06/28/1512485.html">Web缓存技术相关简析</a></p>
<p><a href="http://www.chedong.com/tech/cache_docs.html">面向站长和网站管理员的Web缓存加速指南[翻译]</a></p>
<p><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html">Caching in HTTP[英文]</a></p>
<p><a href="http://browserdiet.com/en/">how to lose weight in the browser</a></p>
]]></description>
<pubDate>2014-05-29T09:00:00+08:00</pubDate>
<guid>http://huliuqing.github.io/2014-05-29-web-caching-guide.html</guid>
<link>http://huliuqing.github.io/2014-05-29-web-caching-guide.html</link>
</item>
<item>
<title><![CDATA[如何创建简单的批处理(.bat)文件[译文]]]></title>
<description><![CDATA[<blockquote>
如未特别标明,文章均属原创。转载请注明出处
by : 柳公子 <a href="http://huliuqing.github.io">http://huliuqing.github.io</a>
</blockquote>
<p>想简单的学习批处理文件书写方法,于是翻译了这篇文章。原文<a href="http://www.makeuseof.com/tag/write-simple-batch-bat-file/">在这</a></p>
<h2>1.创建一个.bat文件</h2>
<p>在桌面创建一个文本文件,打开刚刚创建的文件。点解 file > save as,并输入批处理文件的文件名以.bat结尾。我创建的是testbat.bat</p>
<h2>2.快速掌握基本关键字</h2>
<p>如果你会使用命令行模式,那你更容易使用批处理文件,因为批处理文件和命令行模式使用同一种语言。我们仅仅需要通过批处理文件告诉命令行提示符需要做什么,而不是每次都打开命令行输入那些命令。这会为我们节省大量时间。只不过我们需要在批处理文件中添加一些逻辑处理(如简单的循环,条件语句等)</p>
<p>有如下7个简单的命令我们需要去熟悉,在命令行模式下这些命令是不区分大小写的</p>
<pre><code>TITLE - 设置命令提示窗口的窗口标题。默认为“cmd”
ECHO - 批文件的输出语句。echo之后的所有词语都会在命令行中显示出来
ECHO OFF - 通常放在文件第一行。告诉命令行不要显示bat文件中的命令
PAUSE - 使用此关键字将会在命令行中输出“press any key to continue”,这样我们就可以有更多的时间去查看命令信息。这条语句在调试的时候会非常有用,因为它会终止批文件继续执行除非我们按下任意键。
CLS - 清屏处理
IPCONFIG 打印输出当前的TCP/IP配置的设置值
ping ping + ip地址,让我们知道电脑是否正常通讯
</code></pre>
<h2>3.快速掌握逻辑语句</h2>
<p>问题
① 通过ipconfig/all检测电脑网络设置
② 预留时间给用户阅读信息
③ ping google.com以检测我们的电脑是否联网了
④ 预留时间给用户阅读信息</p>
<h2>4.编写.bat文件</h2>
<pre><code>echo off
chcp 65001
echo 通过bat文件,执行查看网络连接是否正常
ipconfig /all
pause
ping www.google.com
echo 所有执行通过
pause
</code></pre>
<h2>5.点击.bat文件运行</h2>
]]></description>
<pubDate>2014-05-29T09:00:00+08:00</pubDate>
<guid>http://huliuqing.github.io/2014-05-29-how-to-write-a-bat-file.html</guid>
<link>http://huliuqing.github.io/2014-05-29-how-to-write-a-bat-file.html</link>
</item>
<item>
<title><![CDATA[memcache缓存处理简介]]></title>
<description><![CDATA[<blockquote>
<p>如未特别标明,文章均属原创。转载请注明出处。by : 柳公子 <a href="http://huliuqing.github.io">http://huliuqing.github.io</a></p>
</blockquote>
<p>进行PHP开发工作3年,直到最近才更专注的去思考关于PHP项目性能问题(一直以来有去了解,但并未深入的去学习)。这篇文章简单讲解在windows平台下PHP开发中,安装和使用memcached缓存系统。</p>
<p>先来看看维基百科关于<a href="http://zh.wikipedia.org/wiki/Memcached" target="_blank">memcached</a>的解释:</p>
<blockquote>
<p>memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用。这是一套开放源代码软件,以BSD license授权发布。
...
memcached的API使用三十二比特的循环冗余校验(CRC-32)计算键值后,将数据分散在不同的机器上。当表格满了以后,接下来新增的数据会以LRU机制替换掉。由于memcached通常只是当作高速缓存系统使用,所以使用memcached的应用程序在写回较慢的系统时(像是后端的数据库)需要额外的代码更新memcached内的数据。</p>
</blockquote>
<p>感觉很高端的样子,简单来说<code>memcached</code>是一套分布式的内存对象缓存系统,<code>Key/Value</code>值对以Hashmap方式缓存到内存中,以降低Web应用对数据库、文件读取的压力。</p>
<h2>memcached缓存系统组成</h2>
<p>一) memcached服务守护程序</p>
<p>服务器守护程序是用C编写的,为客户端程序提供服务。<a href="http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zip">点这里下载</a></p>
<p>二) memcache客户端程序</p>
<p>客户端程序可以是任意语言编写的,通过memcached协议与守护程序通信。我们这下载PHP开发相关的版本。<a href="http://downloads.php.net/pierre/" target="_blank">到这里去下载</a></p>
<h2>memcached服务守护程序安装</h2>
<ol>
<li><p>1.下载memcached服务器程序,获取memcached.exe文件。<a href="http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zip">点这里下载</a></p></li>
<li><p>2.进入命令行模式,使用命令安装memcached
c:/memcached/memcached.exe -d install</p></li>
<li><p>3.启动服务
c:/memcached/memcached.exe -d start</p></li>
</ol>
<p>默认情况下memcached服务器程序监听<code>11211</code>端口,并指定缓存使用的最大内存为<code>64MB</code>。</p>
<p>常用memcached选项参数</p>
<pre><code>-m 指定缓存所使用的最大内存容量,单位是Megabytes,默认是64MB
-u 只有以root身份运行时才指定该参数
-d 以daemon的形式运行
-l 指定监听的地址
-p 指定监听的TCP端口号,默认是11211
//"-d"参数更多选项值
-d install 安装memcached
-d uninstall 卸载memcached
-d start 启动memcached服务
-d restart 重启memcached服务
-d stop 停止memcached服务
-d shutdown 停止memcached服务
</code></pre>
<p>更多memcached选项参数,<a href="http://works.jinbuguo.com/man/memcached.html">点这里去了解</a></p>
<h2>memcache客户端安装</h2>
<p>如果使用XAMPP/WAMP集成开发环境,我们仅需下载php_memcache扩展程序。</p>
<ol>
<li><p>1.下载dll扩展程序(<a href="http://downloads.php.net/pierre/" target="_blank">到这里去下载</a>),放于c:/xampp/php/ext/目录下。</p></li>
<li><p>2.开启扩展服务。
进入php.ini文件添加如下<code>extension=php_memcache.dll</code></p></li>
<li><p>3.重新启动XAMPP/WAMP</p></li>
</ol>
<h2>使用memcache缓存</h2>
<p>超简单示例:</p>
<pre><code>&lt;?php
$memcache = new Memcache;
$memcache-&gt;connect('127.0.0.1',11211);
$memcache-&gt;add('name','柳公子');
$name = $memcache-&gt;get('name');
echo $name;
</code></pre>
<p>进入官网手册,了解更多关于<a href="http://cn2.php.net/manual/zh/book.memcache.php">memcache</a>相关信息</p>
<h2>工具</h2>
<p><a href="http://www.junopen.com/memadmin/" target="_blank">memcache监控程序</a></p>
<p>参考资料:</p>
<p><a href="http://works.jinbuguo.com/man/memcached.html">memcache手册中文</a></p>
<p><a href="http://www.codeforest.net/how-to-install-memcached-on-windows-machine">How to install Memcached on Windows machine</a></p>
<p><a href="http://blog.csdn.net/poechant/article/details/7074257">Memcached基础及示例程序</a></p>
<p><a href="http://blog.csdn.net/poechant/article/details/7082115">Memcached配置参数初解</a></p>
<p><a href="http://zh.wikipedia.org/wiki/Memcached">维基百科:memcached</a></p>
<p><a href="http://baike.baidu.com/view/794242.htm">百度百科:memcached</a></p>
<p><a href="http://cn2.php.net/manual/zh/book.memcache.php">手册:memcached</a></p>
]]></description>
<pubDate>2014-05-27T17:55:00+08:00</pubDate>
<guid>http://huliuqing.github.io/2014-05-27-install-memcache-in-php.html</guid>
<link>http://huliuqing.github.io/2014-05-27-install-memcache-in-php.html</link>
</item>
<item>
<title><![CDATA[如何优化PHP网站[译]]]></title>
<description><![CDATA[<p>转载请注明出处</p>
<p>这是一篇翻译自stackOverflow的文章,由于水平有限难免出错,如果您在阅读的时候发现了,请帮我更正。</p>
<h2>如何优化PHP网站</h2>
<p>问题如下(原文:<a href="http://stackoverflow.com/questions/8258567/php-website-optimization/8259911#8259911">PHP website Optimization</a>):
我拥有一个高访问量的网站,需要保证每个访问我站点的用户,都能够在最短的时间内显示出他们请求的页面。
我通过Google搜索大量关于网站访问速度和优化方法的文章,并得出如下几个方案:</p>
<pre><code> 1. 对页面缓存
通过对页面缓存,我可以让访问更加快速。但是如果我变更了页面的内容,我则必须把页面的内容从缓存中删除并重新对文件进行缓存。
2. 页面静态化(把页面保存在磁盘中)
通过页面静态化,我可以比较简单的对它进行维护。只是这样的话我必须每次访问它所在的目录来进行维护工作。
</code></pre>
<p>那么究竟如何才能够达到我想要的目的呢?</p>
<h2>------------------------------------------------------------------------------------------</h2>
<h2>来自Book Of Zeus的回答:</h2>
<p><a href="http://stackoverflow.com/a/8259911/3675700">Book Of Zeus</a></p>
<p>对于网站的性能来说,当我们需要获取静态或动态的内容时,减少访问数据库或文件系统的请求数,启用缓存(缓存页面或部分内容)是很重要的一个环节。</p>
<p>在运行动态内容的时候,我们可以使用加速PHP处理的软件:</p>
<p>(一)在这我推荐使用Alternative PHP Cache(<a href="http://php.net/manual/en/book.apc.php">通过手册了解更多关于APC信息</a>)。</p>
<p>推荐几篇关于APC的好文章给你:</p>
<ol>
<li><p>1.<a href="http://agilewebmasters.com/robert/what-is-the-best-php-accelerator-to-use/">What is the best PHP accelerator to use?
</a></p></li>
<li><p>2.<a href="http://blog.digitalstruct.com/2007/12/23/php-accelerators-apc-vs-zend-vs-xcache-with-zend-framework/">PHP Accelerators : APC vs Zend vs XCache with Zend Framework</a></p></li>
<li><p>3.<a href="http://blog.bodhizazen.net/linux/lighttpd-php-acceleration-benchmarks/">Lighttpd – PHP Acceleration Benchmarks</a></p></li>
</ol>
<p>(二)如果是缓存内容或整个页面的话,最好使用<a href="http://memcached.org">Memcached</a> 或 <a href="http://redis.io">Redis</a>进行缓存。</p>
<ol>
<li><p>1.<code>memcached</code>
一个高性能的分布式内存对象缓存开源系统。用于降低数据库负载,提升动态web程序的访问速度。memcached是通过把从数据库中返回的结果集、调用API返回的结果集或者呈现的页面。在内存中以键值对的形式进行缓存。</p></li>
<li><p>2.<code>Redis</code>
一款高性能键值对存储数据库开源项目。当值为字符,哈希表,列表,集合或排序集合时,它被视作一种数据结构服务程序。</p></li>
</ol>
<p>这两个(Memcached和Redis)项目都是用于缓存内容和变量的绝好工具。</p>
<p>推荐几篇有关Memcached和Redis的相关文章:</p>
<ol>
<li><p>1.<a href="http://trespams.com/2011/08/05/redis-vs-memcached-en/">Redis vs Memcached</a></p></li>
<li><p>2.<a href="On Redis, Memcached, Speed, Benchmarks and The Toilet">On Redis, Memcached, Speed, Benchmarks and The Toilet</a></p></li>
<li><p>3.<a href="http://systoilet.wordpress.com/2010/08/09/redis-vs-memcached/">Redis vs Memcached</a></p></li>
<li><p>4.<a href="http://dormando.livejournal.com/525147.html">Redis VS Memcached (slightly better bench)</a></p></li>
</ol>
<p>(三)使用varnish,nginx或G-Wan</p>
<ol>
<li><p>1.<code>Varnish</code>
一款专为有大量动态内容web网站设计的HTTP加速器。与其它HTTP加速器相比,如squid在客户端缓存;Apache则仅仅是服务器软件。Varnish则一开始就被设计成为HTTP加速器。</p></li>
<li><p>2.<code>Nginx</code>
是一款由俄罗斯程序员Igor Sysoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。起初是供俄国大型的门户网站及搜索引擎Rambler(俄语:Рамблер)使用。此软件BSD-like协议下发行,可以在UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操作系统中运行</p></li>
<li><p>3.<code>g-wan</code>
C编写的Web服务器,比其它采用键值对存储的解决方案更加快速</p></li>
</ol>
<p>一些文章: </p>
<ol>
<li><p>1.<a href="http://nbonvin.wordpress.com/2011/03/14/apache-vs-nginx-vs-varnish-vs-gwan/">Serving static files: a comparison between Apache, Nginx, Varnish and G-WAN</a></p></li>
<li><p>2.<a href="http://loadstorm.com/2011/05/web-server-performance-benchmarks/">Web Server Performance Benchmarks</a></p></li>
<li><p>3.<a href="http://www.garron.me/en/go2linux/nginx-varnish-vs-nginx-alone-compared.html">Nginx+Varnish compared to Nginx</a></p></li>
<li><p>4.<a href="http://cd34.com/blog/infrastructure/apache-varnish-nginx-and-lighttpd/">Apache, Varnish, nginx and lighttpd</a></p></li>
<li><p>5.<a href="http://www.wikivs.com/wiki/G-WAN_vs_Nginx">G-WAN vs Nginx</a></p></li>
</ol>
<p>(to be continued)</p>
]]></description>
<pubDate>2014-05-26T18:00:00+08:00</pubDate>
<guid>http://huliuqing.github.io/2014-05-26-translate-PHP-website-optimization.html</guid>
<link>http://huliuqing.github.io/2014-05-26-translate-PHP-website-optimization.html</link>
</item>
<item>
<title><![CDATA[Apache Bench 工具介绍]]></title>
<description><![CDATA[<blockquote>
<p>如未特别标明,文章均属原创。转载请注明出处
by : 柳公子 <a href="http://huliuqing.github.io ">http://huliuqing.github.io </a></p>
</blockquote>
<p>apache benchmark(以下简称ab)是一款基准测试工具,用于描绘当前安装的apache服务器的执行性能,是apache安装的一部分。用户可以模拟对特定URL的任意数量请求来对Web服务器进行负载测试,观察你的apache服务器每秒可以处理多少请求。</p>
<p>ab工具提供以下信息:</p>
<ul>
<li>传输的总大小</li>
<li>Web服务器在模拟流量下每秒可以支持的请求总数</li>
<li>完成一个请求所花费的最长时间</li>
<li>完成一个请求所花费的最少时间</li>
</ul>
<h2>ab语法</h2>
<pre><code>ab
[-A auth-username:password]
[-c concurrency]
[-C cookie-name=value]
[-d]
[-e csv-file]
[-g gnuplot-file]
[-h]
[-H custom-header]
[-i]
[-k]
[-n requests]
[-p POST-file]
[-P proxy-auth-username:password]
[-q]
[-s]
[-S]
[-t timelimit]
[-T content-type]
[-v verbosity]
[-V]
[-w]
[-x &lt;table&gt;-attributes]
[-X proxy[:port]]
[-y &lt;tr&gt;-attributes]
[-z &lt;td&gt;-attributes]
[http://]hostname[:port]/path
</code></pre>
<h2>ab选项标记</h2>
<pre><code>-A auth-username:password
向服务器提供基本认证信息。用户名和密码之间由一个":"隔开,并将被以base64编码形式发送。无论
服务器是否需要(即是否发送了401认证需求代码),此字符串都会被发送。
-c concurrency
一次产生的请求个数。默认设置为1。
-C cookie-name=value
对请求附加一个"Cookie:"头行。其典型形式是 name=value 的一个参数对。此参数可以重复。
-d
不显示"percentage served within XX [ms] table"消息(为以前的版本提供支持)。
-e csv-file
产生一个逗号分隔(CSV)文件,该文件包含基准测试的运行结果(其中包含了处理每个相应
百分比[Percentage served]请求(从1%到100%)所需要的相应百分比时间[Time in ms](以微
秒为单位))。由于这种格式已经"二进制化",所以比"gnuplot"格式更有用。
-g gnuplot-file
把所有测试结果写入一个"gnuplot"或者TSV(以Tab分隔)文件。此文件可以方便地导入到 Gnuplot,
IDL, Mathematica, Excel中。其中的第一行为标题。
-h
显示要用于ab的选项列表。
-H custom-header
对请求附加额外的头信息。此参数的典型形式是一个有效的头信息行,其中包含了以冒号分隔的字段
和值(如:"Accept-Encoding: zip/zop;8bit")。
-i
执行HEAD请求,而不是默认的GET请求 。
-k
启用KeepAlive功能,即在一个HTTP会话中执行多个请求。默认不启用KeepAlive功能。
-n requests
在测试会话中所执行的请求个数。默认仅执行一个请求,此时其结果不具有意义,n值最大为50000。
-p POST-file
包含了POST数据的文件。
-P proxy-auth-username:password
对一个中转代理提供基本认证信息。用户名和密码由一个":"隔开,并将被以base64编码形式发送。
无论服务器是否需要(即是否发送了407代理认证需求代码),此字符串都会被发送。
-q
如果处理的请求数大于150,ab每处理大约10%或者100个请求时,会在stderr输出一个进度计数。此
-q 标记可以屏蔽这些信息。
-s
用于编译中(ab -h 会告诉你)使用了SSL的受保护的https ,而不是http协议的时候。此功能是实验性的,最好不要用。
-S
不显示中值和标准偏差值,而且在均值和中值为标准偏差值的1到2倍时,也不显示警告或出错信息。
默认时,会显示最小值/均值/最大值等数值。(为以前的版本提供支持)
-t timelimit
测试所进行的最大秒数。内部隐含值是"-n 50000"。它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
-T content-type
POST数据时所使用的"Content-type"头信息。
-v verbosity
设置显示信息的详细程度,4或更大值会显示头信息,3或更大值可以显示响应代码(404,200等),2或更大值可以显示警告和其他信息。
-V
显示版本号并退出。
-w
以HTML表格形式输出结果。默认时,它是白色背景的两列宽度的一张表。
-x &lt;table&gt;-attributes
设置&lt;table&gt;属性的字符串。此属性被填入&lt;table 这里 &gt; 。
-X proxy[:port]
对请求使用代理服务器。
-y &lt;tr&gt;-attributes
设置&lt;tr&gt;属性的字符串。
-z &lt;td&gt;-attributes
设置&lt;td&gt;属性的字符串。
</code></pre>
<h2>运行ab工具</h2>
<p>现在我们要运行ab工具来对http://www.github.com来进行基准测试。
运行如下命令:</p>
<p>ab -n 1 http://www.github.com/</p>
<p>输出结果如下</p>
<pre><code>Server Software:
Server Hostname: www.github.com
Server Port: 80
#服务器信息
Document Path: /
Document Length: 0 bytes
#文档信息
Concurrency Level: 1
Time taken for tests: 1.651 seconds
Complete requests: 1
Failed requests: 0
Write errors: 0
Non-2xx responses: 1
Total transferred: 107 bytes
HTML transferred: 0 bytes
Requests per second: 0.61 [#/sec] (mean)
Time per request: 1650.709 [ms] (mean)
Time per request: 1650.709 [ms] (mean, across all concurrent requests)
Transfer rate: 0.06 [Kbytes/sec] received
#连接信息
Connection Times (ms)
min mean[+/-sd] median max
Connect: 862 862 0.0 862 862
Processing: 788 788 0.0 788 788
Waiting: 788 788 0.0 788 788
Total: 1650 1650 0.0 1650 1650
#连接指标分类
</code></pre>
<h2>1. 服务器信息部分</h2>
<p>一般我们的Web服务器软件会是apache,那么在Server Software : 中会显示 apache : 。
但是由于Web管理员使用安全措施,该字段可能返回其它内容或什么也不返回(如示例)</p>
<pre><code>Server Hostname : 测试主机名
Server Post : 测试主机的Web服务器监听端口号
</code></pre>
<h2>2. 脚本信息部分</h2>
<p>包含基准测试主机的Web文档的信息内容</p>
<pre><code>Document Path : 包含测试请求的文档
Document Length : 包含所有HTML 、CSS、JS、图像及其响应的其它数据的字节数总和
</code></pre>
<h2>3. 链接信息部分</h2>
<p>连接数据包含基准测试信息最核心的反馈信息。
其中最需要关心的内容部分:</p>
<pre><code> HTML transferred 整个模拟测试中传输的内容正文总大小
Requests per second 每秒支持的请求数
Time per request 满足一个请求需要花费的总时间
</code></pre>
<p>优化目标:减少HTML transferred 大小,提高Requests per second并降低Time per request值</p>
<h2>4. 连接指标分类</h2>
<p>在这一部分我们主要关注Total项目中的min : ,max : 列</p>
<pre><code>min : 请求所花费的最短时间
man : 请求所花费的最长时间
</code></pre>
<h2>参考资料</h2>
<p><a href="http://apache.chinahtml.com/programs/ab.html">apache 中文手册</a> </p>
<p>未完待续</p>
]]></description>
<pubDate>2014-05-26T14:51:52+08:00</pubDate>
<guid>http://huliuqing.github.io/2014-05-26-introduce-php-test-tool-ab.html</guid>
<link>http://huliuqing.github.io/2014-05-26-introduce-php-test-tool-ab.html</link>
</item>
<item>
<title><![CDATA[详解PHP中对象属性遍历]]></title>
<description><![CDATA[<h2>对象迭代</h2>
<p><blockquote>
如未特别标明,文章均属原创。转载请注明出处 </p>
<p>by : 柳公子 <a href="http://huliuqing.github.io">http://huliuqing.github.io</a>
</blockquote></p>
<p>php官网手册对于<a href="http://www.php.net/manual/zh/language.oop5.iterations.php" target="_blank">遍历对象</a>解释如下:
<blockquote>PHP 5 提供了一种定义对象的方法使其可以通过单元列表来遍历,例如用 foreach 语句。默认情况下,所有可见属性都将被用于遍历。 </blockquote></p>
<p>不过使用简单的foreach遍历对象,仅仅能够遍历出对象实例中可见(public)属性的值。</p>
<p>foreach是如何实现对对象进行遍历的呢?</p>
<p>我们的鸟哥在<a href="http://www.laruence.com/2008/10/31/574.html" >关于一笔试题(Iterator模式) </a>一文中分享过foreach源码实现。这边我就拿来主义了:</p>
<pre><code>switch (zend_iterator_unwrap(array, &amp;iter TSRMLS_CC)) {
default:
case ZEND_ITER_INVALID:
.....
break
case ZEND_ITER_PLAIN_OBJECT: {
......
break;
case ZEND_ITER_PLAIN_ARRAY:
.....
break;
case ZEND_ITER_OBJECT:
......
break;
}
</code></pre>
<p>具体如何使用<code>foreach</code>遍历对象,查看示例:</p>
<pre><code>&lt;?php
class Student{
private $_identityCard = '360401190001011018';
public $_name = '三丰';
public $_age = 800;
protected $_bloodType = 'O';
public function __construct(){}
}
$s = new Student();
foreach($s as $key =&gt; $v){
echo 'key ',$key ,' val ',$v ,'&lt;/br&gt;';
}
//输出
key :_name val 三丰
key :_age val 800
</code></pre>
<p>从输出的结果来看,实例化对象的所有可见(<code>public</code>)属性都给遍历输出出来了。</p>
<p>但是,当我们需要遍历那些非可见对象属性,明显简单的使用<code>foreach</code>遍历对象就不够用了。</p>
<p>好在PHP中有提供内置遍历接口<code>Iterator</code> 和 <code>IteratorAggregate</code>完成对象的遍历工作。
关于Iterator与IteratorAggregate接口如下:</p>
<pre><code>Iterator extends Traversable {
/* 方法 */
abstract public mixed current ( void )//返回当前元素。
abstract public scalar key ( void ) //返回当前元素的键
abstract public void next ( void ) //移动当前位置到下一个元素
abstract public void rewind ( void ) //返回到迭代器的第一个元素
abstract public boolean valid ( void )//此方法在 Iterator::rewind() 和 Iterator::next()
//方法之后被调用以此用来检查当前位置是否有效
}
IteratorAggregate extends Traversable {
/* 方法 */
abstract public Traversable getIterator ( void )//返回一个外部迭代器
}
</code></pre>
<p>我们可以通过实现这两个迭代器接口,定义自己的对象遍历规则</p>
<p>1、通过实现IteratorAggregate接口,完成对象属性遍历</p>
<p>我们只需要实现IteratorAggregate中getIterator()方法完成遍历。</p>
<pre><code>class Kungfu implements IteratorAggregate{
public $_name='飞鸿';
public $_age = 121;
protected $_bloodType = 'O';
private $_isMarried = true;
public function __construct(){}
public function getIterator(){
$members = get_class_vars(__CLASS__);
return new ArrayIterator($members);
}
}
$k = new Kungfu();
foreach($k as $key =&gt; $v){
echo 'key ',$key ,' val ',$v ,'&lt;/br&gt;';
}
/*
key _name val 飞鸿
key _age val 121
key _bloodType val O
key _isMarried val 1
*/
</code></pre>
<p>2、通过实现Iterator接口,完成对象属性遍历</p>
<p>相对于<code>IteratorAggregate</code>而言,<code>Iterator</code>接口实现起来稍微麻烦一些,需要在实现类中实现所有5个抽象方法。</p>
<p>不过如果我们需要对迭代的对象,进行具体控制的话,使用<code>Iterator</code>的话则更合适。</p>
<pre><code>class Language implements Iterator{
private $_lang;
private $_counter=0;
public function __construct(){
$this-&gt;_lang = explode(',', 'PHP,C++,C,GO,JAVA,JAVASCRIPT,RUBY,Node.js');
}
public function rewind(){
$this-&gt;_counter = 0;
}
public function current(){
//当编程语言的值为JAVA时,返回空
if($this-&gt;_lang[$this-&gt;_counter] == 'JAVA'){
return null;
}
return $this-&gt;_lang[$this-&gt;_counter];
}
public function valid(){
return isset( $this-&gt;_lang[$this-&gt;_counter]);
}
public function next(){
++$this-&gt;_counter;
}
public function key(){
return $this-&gt;_counter;
}
}
$m = new Language();
foreach($m as $key =&gt; $v){
echo 'key ',$key ,' val ',$v ,'&lt;/br&gt;';
}
//结果输出
key 0 val PHP
key 1 val C++
key 2 val C
key 3 val GO
key 4 val
key 5 val JAVASCRIPT
key 6 val RUBY
key 7 val Node.js
</code></pre>
<p>接口<code>Iterator</code>中抽象方法的执行顺序如下图所示:
<img src="http://huliuqing.github.io/images/post-source/2014-05-analyze-object-iterator-in-php.png" title="Iterator抽象方法调用顺序"></img></p>
]]></description>
<pubDate>2014-05-15T10:41:30+08:00</pubDate>
<guid>http://huliuqing.github.io/2014-05-15-analyze-object-iterator-in-php.html</guid>
<link>http://huliuqing.github.io/2014-05-15-analyze-object-iterator-in-php.html</link>
</item>
<item>
<title><![CDATA[我的算法学习之路 - [转载]]]></title>
<description><![CDATA[<p>原文链接:<a href="http://zh.lucida.me/blog/on-learning-algorithms/" target="_blank">我的算法学习之路</a></p>
<p>原文作者:<a href="http://zh.lucida.me/blog/on-learning-algorithms/" target="_blank">Lucida</a></p>
<h2>这篇文章讲了什么?</h2>
<ul>
<li><p>我这些年学习数据结构和算法的总结。</p></li>
<li><p>一些不错的算法书籍和教程。</p></li>
<li><p>算法的重要性。</p></li>
</ul>
<h2>初学 ##</h2>
<p>第一次接触数据结构是在大二下学期的数据结构课程。然而这门课程并没有让我入门——当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾——反正最后考试划个重点也能过,于是这门整个计算机专业本科最重要的课程就被傻逼的我直接忽略过去了。</p>
<p>直到大三我才反应过来以后还要找工作——而且大二的折腾证明了我并没有什么商业才能,以后还是得靠码代码混饭吃,我当时惊恐的发现自己对编程序几乎一无所知,于是我给自己制订了一个类似于建国初期五年计划的读书成长计划,其中包括C语言基础、数据结构以及计算机网络等方面的书籍。</p>
<p>读书计划的第一步是选择书籍,我曾向当时我觉得很牛的”学长”和”大神”请教应该读哪些算法书籍,”学长”们均推荐算法导论,还有几个”大神”推荐计算机程序设计艺术(现在我疑心他们是否翻过这些书),草草的翻了下这两本书发现实在看不懂,但幸运的是我在无意中发现了豆瓣这个神奇的网站,里面有很多质量不错的书评,于是我就把评价很高而且看上去不那么吓人的计算机书籍都买了下来——事实证明豆瓣要比这些”学长”或是”大神”靠谱的多得多。</p>
<h2>数据结构与算法分析——C语言描述</h2>
<p><img src="http://huliuqing.github.io/images/post-source/2014-05-how-to-learning-algorithm-reprint-1.jpg"></p>
<p><a href="http://book.douban.com/subject/1139426/">数据结构与算法分析——C语言描述</a>是我学习数据结构的第一本书:当时有很多地方看不懂,于是做记号反复看;代码看不明白,于是抄到本子上反复研读;一些算法想不通,就把它所有的中间状态全画出来然后反复推演。事实证明尽管这种学习方法看起来傻逼而且效率很低,但对于当时同样傻逼的我却效果不错——傻人用傻办法嘛,而且这本书的课后题大多都是经典的面试题目,以至于日后我看到<a href="http://book.douban.com/subject/3004255/">编程之美</a>的第一反应就是这货的题目不全是抄别人的么。</p>
<p>至今记得,这本书为了说明算法是多么重要,在开篇就拿最大子序列和作为例子,一路把复杂度从O(N3)杀到O(N2)再到O(NlgN)最后到O(N),当时内心真的是景仰之情=如滔滔江水连绵不绝,尼玛为何可以这么屌,</p>
<p>此外,我当时还把这本书里图算法之前的数据结构全手打了一遍,后来找实习还颇为自得的把这件事放到简历里,现在想想真是傻逼无极限。</p>
<p>凭借这个读书成长计划中学到的知识,我总算比较顺利的找到了一份实习工作,这是后话。</p>
<h2>入门</h2>
<p>我的实习并没有用到什么算法(现在看来就是不停的堆砌已有的API,编写一堆自己都不知道对不对的代码而已),在发现身边的人工作了几年却还在和我做同样的事情之后,我开始越来越不安。尽管当时我对自己没什么规划,但我清楚这绝壁不是我想做的工作。</p>
<h2>微软的梦工厂</h2>
<p><img src="http://huliuqing.github.io/images/post-source/2014-05-how-to-learning-algorithm-reprint-2.jpg"></p>
<p>在这个摇摆不定的时刻,<a href="http://book.douban.com/subject/3238803/">微软的梦工场</a>成了压倒骆驼的最后一支稻草,这本书对微软亚洲研究院的描写让我下定了”找工作就要这样的公司”的决心,然而我又悲观的发现无论是以我当时的能力还是文凭,都无法达到微软亚研院的要求,矛盾之下,我彻底推翻了自己”毕业就工作”的想法,辞掉实习,准备考研。</p>
<p>考研的细节无需赘述,但至今仍清楚的记得自己在复试时惊奇且激动的发现北航宿舍对面就是微软西格玛大厦,那种离理想又进了一步的感觉简直爽到爆。</p>
<h2>算法设计与分析</h2>
<p>我的研究生生涯绝对是一个反面典型——翘课,实习,写水论文,做水研究,但有一点我颇为自得——从头到尾认真听了韩军教授的算法设计与分析课程。</p>
<p>韩军给我印象最深的有两点:课堂休息时跑到外面和几个学生借火抽烟;讲解算法时的犀利和毫不含糊。</p>