-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathatom.xml
3412 lines (2428 loc) · 205 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><![CDATA[思考的轨迹]]></title>
<link href="http://shanewfx.github.com/atom.xml" rel="self"/>
<link href="http://shanewfx.github.com/"/>
<updated>2013-08-16T09:11:33+08:00</updated>
<id>http://shanewfx.github.com/</id>
<author>
<name><![CDATA[Shane]]></name>
<email><![CDATA[[email protected]]]></email>
</author>
<generator uri="http://octopress.org/">Octopress</generator>
<entry>
<title type="html"><![CDATA[Windows上的音频采集技术]]></title>
<link href="http://shanewfx.github.com/blog/2013/08/14/caprure-audio-on-windows/"/>
<updated>2013-08-14T13:56:00+08:00</updated>
<id>http://shanewfx.github.com/blog/2013/08/14/caprure-audio-on-windows</id>
<content type="html"><![CDATA[<p>前一段时间接到一个任务,需要采集到声卡的输出信号,以便与麦克风的输入信号进行混音。</p>
<p>之前一直没有研究过音频的相关技术,这次就顺便抽出一点时间去了解了一下Windows上采集音频的相关技术。</p>
<p>对于音频处理的技术,主要有如下几种:</p>
<ul>
<li>采集麦克风输入</li>
<li>采集声卡输出</li>
<li>将音频数据送入声卡进行播放</li>
<li>对多路音频输入进行混音处理</li>
</ul>
<!--more-->
<h3>1.Windows上音频处理的API</h3>
<p>在Windows操作系统上,常用的音频处理技术主要包括:Wave系列API函数、DirectSound、Core Audio。</p>
<p>其中,Core Audio只可以在Vista以上(包括Vista)的操作系统中才能使用,主要用来取代Wave系列API函数和DirectSound。</p>
<p>Core Audio实现的功能也比较强大,能实现对麦克风的采集、声卡输出的采集、控制声音的播放。</p>
<p>而Wave系列的API函数主要是用来实现对麦克风输入的采集(使用WaveIn系列API函数)和控制声音的播放(使用后WaveOut系列函数)。</p>
<p>DirectSound能够实现的功能估计和Wave系列API差不多,可能会更强一些(由于没有使用过DirectSound,不太肯定!)。</p>
<p>为了实现采集模块对操作系统的兼容性更好,基本上对麦克风输入的采集使用WaveIn系列API函数比较多;</p>
<p>在Windows XP系统中,没有直接提供对声卡输出进行采集的API,因此,在Windows XP要实现对声卡输出的采集会比较麻烦。
通常可选用支持混音的声卡,然后通过使用声卡的混音模块来实现采集,但并不是所有的声卡都支持混音的功能,这样的方案不具备通用性。</p>
<p>要实现通用性,可以采用虚拟声卡的方式来实现,从驱动层获取声卡的输出数据,但这种方案实现难度会比较大。</p>
<p>而在Vista以上的系统中,如Win7,则可以使用Core Audio中的API函数来实现采集声卡输出的功能。</p>
<p>对于混音模块的实现,目前基本是使用自定义的混音算法来完成功能,系统没有直接的API函数可供调用。</p>
<h3>2.使用WaveIn系列API函数实现麦克风输入采集</h3>
<p>涉及的API函数:</p>
<ul>
<li><p>waveInOpen</p>
<p> 开启音频采集设备,成功后会返回设备句柄,后续的API都需要使用该句柄</p>
<p> 调用模块需要提供一个回调函数(waveInProc),以接收采集的音频数据</p></li>
<li><p>waveInClose</p>
<p> 关闭音频采集模块</p>
<p> 成功后,由waveInOpen返回的设备句柄将不再有效
</p></li>
<li><p>waveInPrepareHeader</p>
<p> 准备音频采集数据缓存的空间</p></li>
<li><p>waveInUnprepareHeader</p>
<p> 清空音频采集的数据缓存</p></li>
<li><p>waveInAddBuffer</p>
<p> 将准备好的音频数据缓存提供给音频采集设备</p>
<p> 在调用该API之前需要先调用waveInPrepareHeader</p></li>
<li><p>waveInStart</p>
<p> 控制音频采集设备开始对音频数据的采集</p></li>
<li><p>waveInStop</p>
<p> 控制音频采集设备停止对音频数据的采集</p></li>
</ul>
<p>音频采集设备采集到音频数据后,会调用在waveInOpen中设置的回调函数。</p>
<p>其中参数包括一个消息类型,根据其消息类型就可以进行相应的操作。</p>
<p>如接收到WIM_DATA消息,则说明有新的音频数据被采集到,这样就可以根据需要来对这些音频数据进行处理。</p>
<p>(示例以后补上)</p>
<h3>3.使用Core Audio实现对声卡输出的捕捉</h3>
<p>涉及的接口有:</p>
<ul>
<li><p>IMMDeviceEnumerator</p></li>
<li><p>IMMDevice</p></li>
<li><p>IAudioClient</p></li>
<li><p>IAudioCaptureClient</p></li>
</ul>
<p>主要过程:</p>
<ul>
<li><p>创建多媒体设备枚举器(IMMDeviceEnumerator)</p></li>
<li><p>通过多媒体设备枚举器获取声卡接口(IMMDevice)</p></li>
<li><p>通过声卡接口获取声卡客户端接口(IAudioClient)</p></li>
<li><p>通过声卡客户端接口(IAudioClient)可获取声卡输出的音频参数、初始化声卡、获取声卡输出缓冲区的大小、开启/停止对声卡输出的采集</p></li>
<li><p>通过声卡采集客户端接口(IAudioCaptureClient)可获取采集的声卡输出数据,并对内部缓冲区进行控制</p></li>
</ul>
<p>(示例以后补上)</p>
<h3>4.常用的混音算法</h3>
<p>混音算法就是将多路音频输入信号根据某种规则进行运算(多路音频信号相加后做限幅处理),得到一路混合后的音频,并以此作为输出的过程。</p>
<p>我目前还做过这一块,搜索了一下基本有如下几种混音算法:</p>
<ul>
<li><p>将多路音频输入信号直接相加取和作为输出</p></li>
<li><p>将多路音频输入信号直接相加取和后,再除以混音通道数,防止溢出</p></li>
<li><p>将多路音频输入信号直接相加取和后,做Clip操作(将数据限定在最大值和最小值之间),如有溢出就设最大值</p></li>
<li><p>将多路音频输入信号直接相加取和后,做饱和处理,接近最大值时进行扭曲</p></li>
<li><p>将多路音频输入信号直接相加取和后,做归一化处理,全部乘个系数,使幅值归一化</p></li>
<li><p>将多路音频输入信号直接相加取和后,使用衰减因子限制幅值</p></li>
</ul>
<p>(完)</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[程序员的代码编辑器--Sublime Text 2]]></title>
<link href="http://shanewfx.github.com/blog/2013/01/06/sublime-text2-for-programmer/"/>
<updated>2013-01-06T15:43:00+08:00</updated>
<id>http://shanewfx.github.com/blog/2013/01/06/sublime-text2-for-programmer</id>
<content type="html"><![CDATA[<h4>===目录===</h4>
<ul>
<li>在Windows/Ubuntu上安装Sublime Text 2</li>
<li>在Windows/Ubuntu上搭建Sublime Text 2的C/C++编译环境</li>
<li>使用Sublime Text 2编写、编译、运行C++代码</li>
<li>推荐几个程序员喜欢的Sublime Text 2插件</li>
<li>使用Sublime Text 2浏览Source Code</li>
<li>使用Sublime Text 2和Github Gist管理代码片段</li>
<li>开启Sublime Text 2中的VIM功能</li>
<li>Sublime Text 2与坚果云和HK4WIN的配合使用</li>
</ul>
<h3>0.序言</h3>
<p>元旦小长假前几天偶然中接触到<a href="http://www.sublimetext.com/">Sublime Text 2</a>, 初步使用下来感觉很不错,是又一款比较适合程序员使用的文本编辑器。</p>
<p>在Sublime Text 2之前,一直比较喜欢使用VIM和Notepad++,其中VIM主要用来查看一些源代码文件或编辑一些文本,</p>
<p>而Notepad++更多是用来替代UltraEdit查看Log文件,目前使用下来感觉还不错,搜索功能同样强大。</p>
<p>当然现在VIM还基本属于初步上手阶段,主要是VIM需要记忆的命令太多,而自己在Windows上使用VIM的频率也不怎么高。</p>
<!--more-->
<h3>1.在Windows/Ubuntu上安装Sublime Text 2</h3>
<p>到<a href="http://www.sublimetext.com/2">Sublime Text 2官网</a>上下载Sublime Text 2,目前的版本是2.0.1。</p>
<p>Windows上我下载的是portable版本,解压后即可运行,这样我结合同步工具就可以再多台机器上共享Sublime Text 2的配置和插件了。</p>
<p>Ubuntu我是通过在虚拟机VirtualBox中安装的,版本是10.04,虽然版本旧了一点,但相对于新版的UI,我还是喜欢这版的。</p>
<p>Ubuntu上下载Sublime Text 2的Linux 32Bit版本即可,解压后即可运行。</p>
<h3>2.在Windows/Ubuntu上搭建Sublime Text 2的C/C++编译环境</h3>
<p>这里C/C++编译器使用的是gcc/g++。</p>
<p>在Windows上使用gcc/g++,可以安装<a href="http://www.mingw.org/">MinGW</a>,安装时要勾选上g++,默认没选择g++,安装好后需要在系统环境变量<strong>Path</strong>中加上<code>C:\MinGW\bin</code>,这里是假设MinGW被安装在C盘中。</p>
<p>打开Windows的命令控制台,输入<code>g++ -v</code>来查看g++是否安装成功。</p>
<p>当然在Windows中也可以使用VC++中的编译器,如何在命令行下使用VC++编译器请自行google之。</p>
<p>如果在命令行下可以使用VC++编译器,这样我们可以在Sublime Text 2中新建一个C++编译配置,以实现在Sublime Text 2中使用VC++编译器。</p>
<p>在Ubuntu下安装gcc/g++,在终端命令行中执行<code>sudo apt-get install build-essential</code>即可。</p>
<p>Windows下,要在Sublime Text 2中实现编译、运行C/C++代码,需要修改或新建一个C++编译配置。</p>
<p>具体是:</p>
<p>Sublime Text 2中Tools –> Build System –> New Build System…</p>
<p>输入如下内容,并将文件保存为C++Bulider.sublime-bulid。</p>
<p>在Windows中,该文件被保存在Sublime Text 2目录下的Data\Packages\User中。</p>
<p>在Ubuntu下,该文件被保证在当前用户目录下的.Config/sublime-text-2/Packages/User中。</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>{
</span><span class='line'> "cmd": ["g++", "${file}", "-o", "${file_path}/${file_base_name}"], // For GCC On Windows and Linux
</span><span class='line'> //"cmd": ["CL", "/Fo${file_base_name}", "/O2", "${file}"], // For CL on Windows Only
</span><span class='line'> "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
</span><span class='line'> "working_dir": "${file_path}",
</span><span class='line'> "selector": "source.c, source.c++",
</span><span class='line'>
</span><span class='line'> "variants":
</span><span class='line'> [
</span><span class='line'> {
</span><span class='line'> "name": "Run",
</span><span class='line'> //"cmd": ["bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"] // Linux Only
</span><span class='line'> "cmd": ["CMD", "/U", "/C", "g++ ${file} -o ${file_base_name} && ${file_base_name}"] // For GCC On Windows Only
</span><span class='line'> //"cmd": ["CMD", "/U", "/C", "CL /Fo${file_base_name} /O2 ${file} && ${file_base_name}"] // For CL On Windows Only
</span><span class='line'> }
</span><span class='line'> ]
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>
<p>我的机器上直接使用sublime Text 2默认的C++编译配置也是正常的,应该是我之前安装了Git的原因。</p>
<p>ubuntu下也是可以直接使用sublime Text 2默认的C++编译配置的。</p>
<p>搭建好C/C++编译环境后,Sublime Text 2中编译运行C/C++代码了。</p>
<h3>3.使用Sublime Text 2编写、编译、运行C++代码</h3>
<p>如在Sublime Text 2中新一个Demo.cpp文件,在其中输入代码:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>#include <stdio.h>
</span><span class='line'>
</span><span class='line'>int main()
</span><span class='line'>{
</span><span class='line'> printf("hello world!\n");
</span><span class='line'> return 0;
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>
<p>勾选Tools –> Build System –>C++或者C++Bulider,使用<code>Ctrl + B</code>编译代码,<code>Ctrl + Shift + B</code>执行程序。</p>
<h3>4.推荐几个程序员喜欢的Sublime Text 2插件</h3>
<p>和VIM、Notepad++等一样,Sublime Text 2也支持通过插件来扩展其功能。</p>
<p>Sublime Text 2中安装插件前可先安装<strong>Package Control</strong>,然后通过Package Control来查找、安装插件。</p>
<p>安装Package Control的方法是:</p>
<p>在Sublime Text 2中按Ctrl + `,调出Sublime Text 2的命令行,在其中输入如下内容后,回车即可。</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'</span></code></pre></td></tr></table></div></figure>
<p>安装成功后,重启Sublime text 2,这时,在Preferences下看到Package Control了。</p>
<p>在Windows中,Package Control被安装在Sublime Text 2目录下的Data\Installed Packages中;</p>
<p>在Ubuntu中,Package Control被安装在当前用户目录下的.Config/sublime-text-2/Installed Packages中。</p>
<p>而Sublime Text 2中其他的插件,在Windows中都被安装在Sublime Text 2目录下的Data\Packages中,</p>
<p>在Ubuntu中被安装在当前用户目录下的.Config/sublime-text-2/Packages中。</p>
<p>执行<code>Ctrl + Shift + P</code>调出命令窗口,输入install,根据提示选择Package Control: Install Package;</p>
<p>稍等一下,就会弹出Sublime Text 2的插件列表,在其中选择需要的插件即可完成安装。</p>
<p>下面是几个比较适合程序员使用的Sublime Text 2插件:</p>
<ul>
<li><p>Alignment: 用于代码对齐</p></li>
<li><p>CTags: 用于方便浏览源代码</p></li>
<li><p>Git:源代码版本控制</p></li>
<li><p>Gist:Github中代码片段管理、分享工具</p></li>
</ul>
<p>要使Sublime Text 2中的CTags插件可用,需要在系统中安装CTags工具。</p>
<p>到<a href="http://ctags.sourceforge.net/">这里</a>下载CTags工具,Windows选择ctags58.zip,解压后将其中的ctags.exe拷贝到C:\MinGW\Bin下。</p>
<p>Ubuntu选择ctags-5.8.tar.gz,解压后, 在Bash中进入ctags-5.8目录,</p>
<p>通过执行<code>./configure</code>, <code>make</code>, <code>make install</code>来安装ctags。</p>
<p>安装好Gist插件后,需要修改Gist.sublime-settings这个配置文件,在username后输入Github的登陆用户名,在password后输入Github登陆密码,保存即可。</p>
<p>安装好插件后,通过<code>Ctrl + Shift + P</code>调出命令窗口,然后输入插件名,根据提示可选择相应的插件功能。</p>
<h3>5.使用Sublime Text 2浏览Source Code</h3>
<p>这里主要是利用Sublime Text 2中打开文件夹和快速搜索等功能,配合CTags插件来使用。</p>
<p>对于一个已存在的工程,可以通过Sublime Text 2的Open Folder这个功能来打开工程的全部文件,其中目录结构也同样保留,这个功能对于查看开源代码是非常有帮助的。</p>
<p>而Sublime Text 2的快速搜索功能对于定位代码中的函数、变量等是非常有帮助的,结合CTags插件使用则会更加方便。</p>
<p>使用<code>Ctrl + P</code>可调出Sublime Text 2的快速搜索界面,其功能主要包括:</p>
<ul>
<li><p>可以快速跳转到当前项目中的任意文件,可进行关键词匹配</p></li>
<li><p>用 @ 可以快速列出/跳转到某个函数</p></li>
<li><p>用 # 可以在当前文件中进行搜索</p></li>
<li><p>用 : 加上数字可以跳转到相应的行</p></li>
<li><p>可通过关键字转到某个文件同时加上 @ 来列出/跳转到目标文件中的某个函数,或是同时加上 # 来在目标文件中进行搜索,或是同时加上 : 和数字来跳转到目标文件中相应的行</p></li>
</ul>
<h3>6.使用Sublime Text 2和Github Gist管理代码片段</h3>
<p>通过<code>Ctrl + Shift + P</code>调出命令窗口,在其中输入Gist,选择Gist: Open Gist会列出Github上Gist中已存在的代码片段,选择一个可用Sublime Text 2打开查看或修改。</p>
<p>修改后通过Gist: Update File上传到Github的Gist中。</p>
<p>要增加一个新的代码片段,可在Sublime Text 2中新建一个文件并在其中放入代码片段,或打开一个已存在的文件。</p>
<p>然后使用Gist: Create Public Gist,然后输入描述文件和文件名即可。</p>
<p>这里,顺便推荐一款在<strong>Chrome浏览器</strong>中使用Github Gist的插件 – <a href="https://github.com/simplelife7/EasyGist">EasyGist</a>。</p>
<p>使用下来感觉还不错,很适合在Chrome中来管理代码片段。</p>
<p>在Google网上应用点里搜索EasyGist,选择扩展程序,然后安装即可。</p>
<p>初次使用需要登录一下。</p>
<h3>7.开启Sublime Text 2中的VIM功能</h3>
<p>通过<code>Ctrl + Shift + P</code>调出命令窗口,在其中输入Preferences,选择Preferences Settings - User</p>
<p>将打开的文件内容修改为如下:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>{
</span><span class='line'> "ignored_packages":
</span><span class='line'> [
</span><span class='line'> ],
</span><span class='line'> "vintage_start_in_command_mode": true
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>
<p>这样,在Sublime Text 2中也可以使用VIM的相关命令了。</p>
<p>如插入文本前需要使用<code>i</code>进入插入模式,用<code>Esc</code>回到正常模式中。</p>
<h3>8.Sublime Text 2与坚果云和HK4WIN的配合使用</h3>
<p>在Windows中,云同步工具一直在使用<a href="https://jianguoyun.com/">坚果云</a>,在国内算是做的不错的一个,支持多目录同步。</p>
<p>由于我使用的是Sublime Text 2的portable版,这样将Sublime Text 2放入到坚果云的同步目录中。</p>
<p>这样,我在Sublime Text 2中安装的插件和修改的相关配置都会被同步到云端,</p>
<p>这样家中的机器也会自动进行同步,然后可继续使用Sublime Text 2。</p>
<p>为了使用方便,我一直使用<a href="http://www.songruihua.com/hk4win.html">HK4WIN</a>来管理键盘快捷键。</p>
<p>在HK4WIN的配置文件中加入启动Sublime Text 2的快捷键,这样,以后启动Sublime Text 2就很方便了。</p>
<p>(完)</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[使用MFC Custom Control实现界面的自绘]]></title>
<link href="http://shanewfx.github.com/blog/2012/11/23/mfc-custom-control/"/>
<updated>2012-11-23T11:45:00+08:00</updated>
<id>http://shanewfx.github.com/blog/2012/11/23/mfc-custom-control</id>
<content type="html"><![CDATA[<p>最近在做一个视频编辑的项目,其中界面部分有点复杂,负责这部分的同事使用了MFC的Custom Control来实现界面的自绘效果,目前DemoAP的初步效果已经出来,感觉还不错。</p>
<p>因为工作以来基本没有接触过UI方面的编程,加之以前也没有使用过Custom Control,这次做一个简单学习和总结,以便后用。</p>
<!--more-->
<h5>1.创建MFC工程</h5>
<p>在VS2005中创建一个基于Dialog的MFC工程,DemoUI;</p>
<h5>2.添加CMyPad类</h5>
<p>在DemoUI上右击选择Add->Class,在类向导中选择MFC Class,
再点击Add,在Class Name中填入类名,如CMyPad,选择Base class为CWnd,点击Finish,
这时自动生成MyPad.h和MyPad.cpp。</p>
<h5>3.打开DemoUI.rc,双击Dialog下的IDD_DEMOUI_DIALOG,进入对话框窗口设计界面</h5>
<h5>4.在对话框上加入一个Custom Control控件</h5>
<h5>5.设置Custom Control的属性</h5>
<p>设置如下属性,其他属性使用默认即可:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>ID : IDC_CUSTOM_PAD
</span><span class='line'>Class: MyDrawPad</span></code></pre></td></tr></table></div></figure>
<p>其中,这里的MyDrawPad必须与注册窗口时使用的类名一致,否则编译可通过,但无法运行。</p>
<h5>6.在CMyPad类中添加一个用于注册窗口的成员函数BOOL RegisterWndClass()</h5>
<p>具体实现为:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>BOOL CMyPad :: RegisterWndClass()
</span><span class='line'>{
</span><span class='line'> WNDCLASS windowclass ;
</span><span class='line'> HINSTANCE hInst = AfxGetInstanceHandle ();
</span><span class='line'>
</span><span class='line'> //Check weather the class is registerd already
</span><span class='line'> if (!(::GetClassInfo ( hInst, MYWNDCLASS , &windowclass )))
</span><span class='line'> {
</span><span class='line'> //If not then we have to register the new class
</span><span class='line'> windowclass .style = CS_DBLCLKS; // | CS_HREDRAW | CS_VREDRAW;
</span><span class='line'> windowclass .lpfnWndProc = :: DefWindowProc;
</span><span class='line'> windowclass .cbClsExtra = windowclass. cbWndExtra = 0;
</span><span class='line'> windowclass .hInstance = hInst;
</span><span class='line'> windowclass .hIcon = NULL;
</span><span class='line'> windowclass .hCursor = AfxGetApp ()->LoadStandardCursor ( IDC_ARROW);
</span><span class='line'> windowclass .hbrBackground = ::GetSysColorBrush (COLOR_WINDOW );
</span><span class='line'> windowclass .lpszMenuName = NULL;
</span><span class='line'> windowclass .lpszClassName = MYWNDCLASS;
</span><span class='line'>
</span><span class='line'> if (!AfxRegisterClass (& windowclass))
</span><span class='line'> {
</span><span class='line'> AfxThrowResourceException ();
</span><span class='line'> return FALSE ;
</span><span class='line'> }
</span><span class='line'> }
</span><span class='line'>
</span><span class='line'> return TRUE ;
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>
<p>其中,MYWNDCLASS是在MyPad.h中定义的宏:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>#define MYWNDCLASS L "MyDrawPad"</span></code></pre></td></tr></table></div></figure>
<p>(工程属性中设置为Unicode,API会调用对应的Unicode版本,因此字符串前需加上L)</p>
<h5>7.在主对话框类CDemoUIDlg中关联自定义控件类CMyPad</h5>
<p>首先在CDemoUIDlg类中添加一个成员:<code>CMyPad m_Pad</code> ;</p>
<p>然后进行关联,方法有两种:</p>
<ul>
<li><p>在<code>CDemoUIDlg ::OnInitDialog</code>中关联:<code>m_Pad .SubclassDlgItem(IDC_CUSTOM_PAD, this)</code>;</p></li>
<li><p>在<code>CDemoUIDlg ::DoDataExchange</code>中关联:<code>DDX_Control(pDX, IDC_CUSTOM_PAD, m_Pad)</code>;</p></li>
</ul>
<p>两种方法只能用其中一种,不可同时使用。</p>
<h5>8.为CMyPad添加消息响应函数</h5>
<p>在Class View中选择CMyPad,右击打开其属性界面,选择消息一栏,选择需要响应的消息,并增加对应的消息处理函数。</p>
<p>如选择<code>WM_PAINT</code>,选择<code><Add>OnPaint</code>,这样就在CMyPad中自动添加了响应WM_PAINT消息的处理函数OnPaint()。</p>
<p>简单测试一下, OnPaint函数的实现如下:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>void CMyPad:: OnPaint ()
</span><span class='line'>{
</span><span class='line'> CPaintDC dc ( this); // device context for painting
</span><span class='line'> // TODO: Add your message handler code here
</span><span class='line'> // Do not call CWnd::OnPaint() for painting messages
</span><span class='line'> dc .DrawText ( L"test123" , CRect(0,0,100,100), DT_LEFT );
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>
<h5>9.效果测试</h5>
<p>编译运行,即可看到在Custom Control中绘制出”test123”字符。</p>
<p>(完)</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[软件设计的几点思考和总结]]></title>
<link href="http://shanewfx.github.com/blog/2012/10/12/software-design-principle/"/>
<updated>2012-10-12T19:48:00+08:00</updated>
<id>http://shanewfx.github.com/blog/2012/10/12/software-design-principle</id>
<content type="html"><![CDATA[<p>软件设计是不易的,尤其要设计出结构良好、可靠性高、又不失可扩展性和可维护性的软件更是困难的事。</p>
<p>随着项目的积累、经验的丰富,不同阶段,自己对设计的理解也是不一样的,就像看一本好书,每读一遍,对其中内容的理解往往也会不同一样。</p>
<p>下面是自己对如何设计良好软件的一点理解:</p>
<!--more-->
<p></p>
<p>1.模块/类要尽可能只做一件事,并且要把事做好(符合单一职责原则、高内聚低耦合),这样也有利于提高重用性(KISS原则、DRY原则)</p>
<p>模块/类设计的注意点:</p>
<ul>
<li><p>模块所处层次是否分明[分层设计(横行划分)],功能是否清晰[模块化设计(纵向划分)、正交设计]</p></li>
<li><p>模块接口要仔细设计</p></li>
</ul>
<p>接口要提供哪些功能,接口函数/参数命名是否直达其意(命令查询分离原则),有什么限制,如何返回结果,是否易用,尽可能多从用户使用角度考虑接口的设计;</p>
<p>接口设计要符合“接口隔离原则”,大而全的接口往往没有多个功能分类明确的接口要灵活、易用。</p>
<ul>
<li><p>信息隐藏要做好,模块的边界(接口)要清晰,用户对模块的了解要尽可能少(最少知识原则)</p></li>
<li><p>模块内部实现要尽量符合“迪米特法则”和“契约式设计”</p></li>
<li><p>只和必要的模块产生依赖,模块之间绝不可出现循环依赖</p></li>
<li><p>一组功能相关的模块可放在一起,组成功能包,这样便于修改和维护(共同关闭原则)</p></li>
</ul>
<p>2.设计时,应权衡一下是否要考虑可扩展性(需求将来是否会变化,如果比较稳定则不用考虑,避免过度设计)</p>
<p>如何设计来保证模块/函数具备一定的可扩展性(要符合开闭原则)?</p>
<ul>
<li><p>找出可能的变化,合理抽象(封装变化),提炼接口, 针对接口编程(依赖稳定的抽象/接口), 不依赖具体的实现</p></li>
<li><p>组合优先继承(模块之间的依赖优先考虑是否可采用组合,使用继承主要是以使用多态为目的[里氏替换原则/针对接口编程])</p></li>
<li><p>模块之间要正交(模块间功能要尽可能不重叠)</p></li>
<li><p>高层模块和低层模块之间要符合”依赖倒置原则”和“好莱坞原则”</p></li>
</ul>
<p>高层模块提供低层模块所需的接口,高层模块实现时针对这些接口编程,不依赖低层的具体实现;</p>
<p>而低层模块需要实现这些接口,实际运行时以多态的形式为高层模块提供功能(好莱坞原则)。</p>
<p>3.层次是一种软件抽象,分层设计可提高软件的灵活性,很多设计手法,其本质都是在软件的结构中加入更多的层次。</p>
<p>如对文件操作进行封装,提供一个文件操作类来代理文件操作请求,这样可屏蔽不同操作系统下文件操作API的不同,增加可移植性。</p>
<p>但也要充分考虑到层次带来的复杂性,会增加对软件理解和维护的难度。</p>
<p>因此,要努力控制层次在三层左右,否则宁愿牺牲一点抽象(软件设计是一个权衡和选择的过程)。</p>
<p>另外,层次抽象要保持内在的一致性,一个层次内部应该只做自己应该做的事,而不要去做其他层应该做的事。</p>
<p>如在设计DirectShow Filter时,应尽量把功能层次的模块与Filter层次分开,在Filter层次中只做DirectShow框架下filter应实现的功能,</p>
<p>如媒体类型的协商、与其前端/后端filter的连接、Filter之间的数据流传递等,而不涉及具体功能逻辑部分的实现;</p>
<p>同样,功能实现层也不应该依赖DirectShow框架(如数据的输出可用回调来实现解耦)。</p>
<p>这样做的好处是,以后可单独提取出具体的功能模块,移植到其他非DirectShow框架中,即Filter层仅是一层壳而已。</p>
<p>否则,这样的剥离将难以实现,同时也会因为层次边界的模糊而影响程序的可读性。</p>
<p>4.代码实现时,要有良好的编码风格,且风格要统一,函数和变量命名要准确表达其意;</p>
<p>逻辑实现要简洁利索,避免功能大而全的复杂函数,函数实现也要尽量符合KISS原则,只负责一件事;</p>
<p>总之,要时刻考虑软件维护者的感受(说不定几个月、几年之后你就是软件的维护者呢),尽可能减少让人产生怪异的感觉。</p>
<p>即尽一切方法提供程序的可读性。</p>
<hr />
<p>附上一份关于软件设计基本原则的思维导图,以便参考。</p>
<p><a href="http://www.flickr.com/photos/shanewfx/8079555786/" title="Flickr 上 shanewfx 的 软件设计基本指导思想"><img src="http://farm9.staticflickr.com/8464/8079555786_e74017d4f8_b.jpg" width="970" height="1024" alt="软件设计基本指导思想"></a></p>
<p>图片比较大,请移步<a href="http://tu.mindpin.com/mindmaps/54796">这里</a>直接查看原始文件。</p>
<p>(完)</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[个人技术提升Roadmap]]></title>
<link href="http://shanewfx.github.com/blog/2012/10/09/my-technology-roadmap/"/>
<updated>2012-10-09T16:37:00+08:00</updated>
<id>http://shanewfx.github.com/blog/2012/10/09/my-technology-roadmap</id>
<content type="html"><![CDATA[<p>长假之后果然不在状态,今天抽空给自己未来的学习做了一个简单的规划,也算一个简单的总结和回顾。</p>
<p>为了便于查看,特在<a href="http://tu.mindpin.com/">MindPin</a>上绘制了一张个人技术规划的思维导图。</p>
<p><a href="http://www.flickr.com/photos/shanewfx/8070062706/" title="Flickr 上 shanewfx 的 技术Roadmap"><img src="http://farm9.staticflickr.com/8459/8070062706_8221e32965_b.jpg" width="792" height="1024" alt="技术Roadmap"></a></p>
<p>如果图片不清晰的话,请移步<a href="http://tu.mindpin.com/mindmaps/54700">这里</a>直接查看原始文件。</p>
<!--more-->
<p>随便介绍一下<a href="http://tu.mindpin.com/">MindPin</a>,这是一个在线<a href="http://zh.wikipedia.org/zh-cn/%E5%BF%83%E6%99%BA%E5%9B%BE">思维导图</a>绘制工具。</p>
<p>使用下来感觉还是蛮不错的,UI简洁、快捷键也随手、自动保存、支持多种格式导出。</p>
<p>(完)</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[在Ubuntu中下载编译ffmpeg的过程]]></title>
<link href="http://shanewfx.github.com/blog/2012/09/24/compile-ffmpeg-on-ubuntu/"/>
<updated>2012-09-24T14:06:00+08:00</updated>
<id>http://shanewfx.github.com/blog/2012/09/24/compile-ffmpeg-on-ubuntu</id>
<content type="html"><![CDATA[<p>登陆<a href="http://ffmpeg.org/download.html">ffmpeg官网的下载页面</a>可以得到使用git克隆ffmpeg源代码的地址:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg</span></code></pre></td></tr></table></div></figure>
<p>在ubuntu的shell下,使用上述git命令来下载ffmpeg,下载所需的时间会有点长。</p>
<p>等ffmpeg下载完成,ubuntu上就已经存在了一份完整的ffmpeg源代码了。</p>
<p>下面就可以进行编译ffmpeg了。</p>
<!--more-->
<p>编译前我们可以使用下面命令对ffmpeg的源代码进行备份:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>tar czf ffmpeg.tar.gz ffmpeg/</span></code></pre></td></tr></table></div></figure>
<p>这样就在当前目录下产生一个ffmpeg.tar.gz文件。</p>
<p>在以后需要的时候可以通过下面的命令提取出ffmpeg源代码:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>tar xzf ffmpeg.tar.gz</span></code></pre></td></tr></table></div></figure>
<p>在编译ffmpeg之前,请先安装好基本的C/C++的编译开发环境,请参考<a href="http://shanewfx.github.com/blog/2012/09/22/study-ubuntu-on-virtualbox/">上篇文章</a>。</p>
<p>另外,ffmpeg编译时需要使用yasm,如果系统中没有安装,可以通过下面的命令来安装:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sudo apt-get install yasm</span></code></pre></td></tr></table></div></figure>
<p>上述的编译工具安装好后,就可开始编译ffmpeg了。</p>
<p>ffmpeg是采用autoconfig和automake等工具自动生成makefile,然后再通过make进行编译,具体的编译的过程如下:</p>
<ul>
<li><p>使用<code>./configure</code>产生makefile文件</p></li>
<li><p>使用<code>make</code>进行编译</p></li>
<li><p>使用<code>make install</code>将ffmpeg安装到系统中</p></li>
</ul>
<p>安装ffmpeg到系统中,需要root权限,在shell下执行下面的命令切换到root账户下:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sudo -i</span></code></pre></td></tr></table></div></figure>
<p>根据提示输入root密码,然后还需再次进入到ffmpeg源代码目录中,再执行<code>make install</code>即可。</p>
<p>默认是安装在/user/local下,其中:</p>
<ul>
<li><p>头文件放在/user/local/include目录下</p></li>
<li><p>编译好的libs放在/user/local/lib目录下,其中,在该目录下还有一个pkgconfig目录,里面存放着每个lib的配置文件</p></li>
<li><p>编译好的可执行文件(ffmpeg、ffprobe、ffserver)放在/user/local/bin目录下</p></li>
<li><p>文档在/user/local/share/man/man1目录下,同时在/user/local有一个指向此目录的链接</p></li>
</ul>
<p>后面计划研究一下ffmpeg的架构,如何抽取出ffmpeg中某个Codec,如何增加自己的Codec到ffmpeg中,以及如何基于ffmpeg开发一个简单的播放器。</p>
<p>(全文完)</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[在VirtualBox上小玩Ubuntu]]></title>
<link href="http://shanewfx.github.com/blog/2012/09/22/study-ubuntu-on-virtualbox/"/>
<updated>2012-09-22T18:08:00+08:00</updated>
<id>http://shanewfx.github.com/blog/2012/09/22/study-ubuntu-on-virtualbox</id>
<content type="html"><![CDATA[<p>第一次接触Linux应该是读研时,当时自己在实验室里捣鼓着嵌入式开发,慢慢也就了解了一些Linux的东西,不过当时完全很业余,很多东西都不太懂。</p>
<p>后来,跟其他实验室的同学借了Linux的安装光盘,在自己的机器上第一次装上Linux,不过后来好像也没什么深入的使用。</p>
<p>工作以后,一直是在Windows上做开发,基本不涉及Linux,不过自己对Linux还是蛮感兴趣的,在家里的电脑上也一直安装着Ubuntu,偶尔也会上去玩一玩。</p>
<p>随着和开源软件的接触,发现很多的开源Code都是来自于Linux,自己也一直想学习一下Linux中C/C++开发的方法。</p>
<p>由于自己大部分的工作和家人对电脑的使用都是集中在Windows上,不希望来回切换系统,故多数是在Windows上使用VirtualBox虚拟机安装Ubuntu来使用。</p>
<p>虚拟机上的Ubuntu,我只会安装Linux C/C++开发所必要的一些软件,如代码编辑器Vim, C/C++编译调试工具,代码版本控制工具Git等。</p>
<!--more-->
<p>我使用的Ubuntu版本是10.04,之前安装过11.10这个版本,不过在虚拟机上运行速度不是很好。</p>
<p>如何使用VirtualBox安装Ubuntu,请Google参考相关教程,要注意的是下载下来的Ubuntu的ISO镜像文件,最好验证一下MD5码,以确保镜像文件是完整正确的,否则安装可能会失败。</p>
<p>另外,中文拼音输入法ibus-pinyin还算比较好用,在Ubuntu软件中心搜索ibus-pinyin并安装,然后“系统->首选项->IBUS首选项”切换到输入法选项卡,添加“汉语->拼PINYIN”即可。</p>
<p>下面主要是讲一讲Linux下C/C++开发的一些话题:</p>
<ul>
<li>Linux C/C++开发环境的搭建</li>
<li>Linux常用shell命令</li>
<li>vim的基本操作</li>
<li>gcc/g++/gdb/make工具的熟悉和使用</li>
<li>makefile的编写</li>
<li>autoconf和automake自动生成makefile的方法</li>
</ul>
<h2>1.搭建Ubuntu下C/C++开发环境</h2>
<p>安装C/C++编译工具,包括gcc, g++, gdb, make等,只需要执行下面这条命令即可:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sudo apt-get install build-essential</span></code></pre></td></tr></table></div></figure>
<p>使用”gcc -v”来检查一下安装是否成功。</p>
<p>安装自动生成makefile的相关工具,只需要执行下面这条命令:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sudo apt-get install automake1.9</span></code></pre></td></tr></table></div></figure>
<p>这样,依赖的工具也会被安装,包括autoscan、aclocal、autoconf、automake等。
有了这些工具,在大的开发项目中,就可以不用自己去编写makefile了。</p>
<p>安装源代码编辑器Vim,会比Ubuntu原本自带的vi更好用些。
关于如何将Vim打造成一个IDE,以后再研究吧,网上也有相关的文章可参考,主要是使用Vim插件并修改Vim配置文件。
安装Vim执行下面这条命令:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sudo apt-get install vim</span></code></pre></td></tr></table></div></figure>
<p>这样以后在shell下可直接使用”vim 文件名”,在当前目录下创建一个新文件并打开文件进行编辑或直接打开已存在的文件进行编辑。</p>
<p>安装源代码版本控制工具Git,只需要执行下面这条命令即可:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sudo apt-get install git-core</span></code></pre></td></tr></table></div></figure>
<p>上述工具都安装成功后,在Ubuntu上就已经具备开发C/C++程序的基本环境了。</p>
<p>当然,在Linux上做开发也是有IDE可供选择的,如Eclipse、NetBeans等,据同事介绍,似乎NetBeans还算好用,和Windows下VC比较相似了,而做Android开发一般都是用Eclipse。</p>
<p>目前, 我还不打算使用这些IDE,而是想从底层学习这种在shell下用Vim编写源代码和makefile来完成Code编译和调试的开发模式。</p>
<p>这样,不但有助于掌握Vim和常用的shell命令,而且对相关编译工具的使用、makefile的编写以及理解编译的过程都是有帮助的,当然这样感觉上也会更酷。</p>
<h2>2.Linux常用shell命令</h2>
<p>Linux中的命令有很多,这里只列出在开发过程中一些比较常用的命令。
每一个命令可能都有一些选项参数可以使用,用<code>man 命令</code>或者<code>命令 --help</code>可来查看相关说明。</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>++++++++++++++++++++++++++++++++++++++++++++++++++++++
</span><span class='line'>shell命令 | 功能说明
</span><span class='line'>++++++++++++++++++++++++++++++++++++++++++++++++++++++
</span><span class='line'>mkdir 创建目录
</span><span class='line'>rmdir 删除目录
</span><span class='line'>ls 查看当前目录下的文件和目录(不包括隐藏文件)
</span><span class='line'>ls -a 查看当前目录下的文件和目录(包括隐藏文件)
</span><span class='line'>cd 切换到指定目录(/表示系统根目录 ./表示当前目录 ../表示当前目录的上一级目录)
</span><span class='line'>pwd 查看当前目录的绝对路径
</span><span class='line'>cat 查看文件内容
</span><span class='line'>touch 修改文件日期或创建新文件
</span><span class='line'>rm 删除文件
</span><span class='line'>mv 移动文件或修改文件名
</span><span class='line'>cp 复制文件或目录
</span><span class='line'>chmod 修改文件操作权限
</span><span class='line'>find 查找文件或目录
</span><span class='line'>grep 查找文件里符合正则表达式的字符串
</span><span class='line'>sed 处理和编辑文本
</span><span class='line'>diff 比较文件间的差异
</span><span class='line'>tar 文件打包和解包,通过cvf参数打包,通过xvf解包
</span><span class='line'>zip 压缩工具,.zip
</span><span class='line'>unzip 解压缩zip文件
</span><span class='line'>gzip 压缩解压缩工具,.gz,通过-d参数进行解压缩
</span><span class='line'>man 查看命令说明
</span><span class='line'>file 查看文件类型
</span><span class='line'>which 查看命令文件安装的位置
</span><span class='line'>whereis 查找软件的安装路径
</span><span class='line'>++++++++++++++++++++++++++++++++++++++++++++++++++++++</span></code></pre></td></tr></table></div></figure>
<h2>3.Vim基本操作</h2>
<p>被尊称为程序员神器的Vim有着比较高的学习曲线,不过掌握一些基本的Vim命令,足以让你应付一般的文本编辑。</p>
<p>这里有一份<a href="http://coolshell.cn/articles/5479.html">Vim命令的速查卡</a>:</p>
<p><a href="http://www.flickr.com/photos/shanewfx/8011943417/" title="Flickr 上 shanewfx 的 vim"><img src="http://farm9.staticflickr.com/8296/8011943417_b813b2b38a.jpg" width="500" height="386" alt="vim"></a></p>
<p>常用的Vim操作请参考陈皓的<a href="http://coolshell.cn/articles/5426.html">简明Vim练级攻略</a>,按照攻略来练习吧。</p>
<hr />
<p>(未完待续)</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[思维导图: 我的常用软件]]></title>
<link href="http://shanewfx.github.com/blog/2012/09/06/my-favorite-software/"/>
<updated>2012-09-06T20:20:00+08:00</updated>
<id>http://shanewfx.github.com/blog/2012/09/06/my-favorite-software</id>
<content type="html"><![CDATA[<p>一直以来,我的软件工具集中都会收藏一些比较好用的软件,尤其喜欢<strong>免费</strong>、<strong>开源</strong>的软件。</p>
<p>这里,列出我最常用的一些软件,以备后忘。</p>
<p><a href="http://www.flickr.com/photos/shanewfx/7943007570/" title="Flickr 上 shanewfx 的 我的常用软件"><img src="http://farm9.staticflickr.com/8179/7943007570_99bc0edc27.jpg" width="427" height="500" alt="我的常用软件"></a></p>
<p>思维导图使用<a href="http://freemind.sourceforge.net/wiki/index.php/Main_Page">FreeMind</a>绘制。</p>
<!--more-->
<h2>1 Chrome浏览器</h2>
<p>在<a href="http://www.google.cn/intl/zh-CN/chrome/browser/?hl=zh-CN&brand=CHMI">Chrome</a>出来之前,通常使用<strong>Firefox</strong>,有了<strong>Chrome</strong>,就再也没变过。不过,网购一般还是要回到IE的。</p>
<p>常用的Chrome插件:</p>
<p><strong>AdBlock、FaWave(发微)、Google Mail Checker、IE Tab、Google阅读器通知程序</strong>等</p>
<h2>2 云笔记Evernote</h2>
<p>以前在网上看到不错的文章一般会收藏到<a href="http://shanewfx.360doc.com">360doc</a>,自从接触了<strong>Evernote</strong>,<strong>个人知识管理</strong>就由Evernote负责了。</p>
<p>另外,我比较多的阅读时间是花在<strong>Google阅读器</strong>上,看到喜欢的文章会“加星”标识。</p>
<p>这样通过<a href="https://ifttt.com/">ifttt</a>这个网络工具就可以自动将<strong>加星的文章</strong>发送到Evernote中,因为每个Evernote账户都对应一个个人Evernote邮件地址,向这个地址发送内容会自动出现在Evernote中。</p>
<p>随着时间的推移,Evernote中的文章会越来越多,如果不加分类,以后会很难找到需要的文章。</p>
<p>因此,最好一开始的时候就建立好笔记的结构,并利用标签对文章分类。</p>
<p><a href="http://www.zhihu.com/">知乎</a>上有一些关于如何用好Evernote的讨论,可以去参考一下。</p>
<p>我的Evernote笔记分类结构:</p>
<p><a href="http://www.flickr.com/photos/shanewfx/7943205150/" title="Flickr 上 shanewfx 的 Evernote"><img src="http://farm9.staticflickr.com/8181/7943205150_d33b5b9b1e.jpg" width="219" height="500" alt="Evernote"></a></p>
<p>另外,Evernote每个月只有60M的同步流量,不过对于保存一般的文本和少量的图片是完全够用的。</p>
<h2>3 云储存(坚果云)</h2>
<p>以前要在网络上备份文件,一般都是用网络硬盘,不过一般空间都不大。</p>
<p>而如今的云计算产品是越来越多了,特别近两年,云储存的产品遍地开花,如来头大的有Google Drive、微软的SkyDrive等,我想最出名应该是非Dropbox莫属。</p>
<p>我正式使用云储存应该是今年初,开始用的是金山T盘,不过使用下来并不太满意,而且金山似乎对该产品不太重视,直到在<a href="http://xbeta.info/">善用佳软</a>的博客上看到坚果云的介绍,才慢慢转到坚果,并一直使用至今。</p>
<p><a href="https://jianguoyun.com/">坚果云</a>总体使用下来还不错,同步在背后默默进行,只需将要同步的文件放到指定的文件夹就可以了,而且速度很快。
支持多同步文件夹,同步的文件有版本控制,网页界面很简洁,感觉是用心在做这款产品。</p>
<p>不过,对于免费用户,每个月只有1G的上传流量,3G的下载流量,刚开始转过来的时候上传流量不太够用,后来就基本够用了。</p>
<h2>4 文本编辑器(Notepad++和VIM)</h2>
<p>对于文本编辑器,目前使用最多的应该是Notepad++,主要用来查看、编写一些文本文件,偶尔也会用一用VIM,主要是一些命令总是不太记得住,以后还是要好好学习一下VIM的。</p>
<p>在查看Log文件目前使用比较多的还是UltraEdit,不过慢慢应该会转到Notepad++和VIM上的。</p>
<h2>5 快捷键管理工具(HK4WIN)</h2>
<p>我现在越来越喜欢用键盘快捷键来代替鼠标操作,这样日常的操作效率会高很多。</p>
<p>一个用<strong>AutoHotkey</strong>开发的<a href="http://www.songruihua.com/hk4win.html">HK4WIN2</a>是我用来管理快捷键的主要工具,可以定制打开指定软件和文件夹等快捷键。</p>
<h2>6 版本控制(Git)</h2>
<p>正式使用Git也是今年初开始的,前面有几篇关于Git学习的文章,<a href="http://shanewfx.github.com/blog/2012/04/21/learn-git-command/">这里</a>,<a href="http://shanewfx.github.com/blog/2012/04/28/git-command-note/">这里</a>。</p>
<p>目前使用Git最多的还是来管理我的这个博客,以后慢慢会在工作中引入使用。</p>
<p>偶尔也会用SVN来下载一些开源代码。</p>
<h2>7 其他常用的软件</h2>
<p>PDF阅读,我一直使用免费小巧的<strong>Foxit Reader</strong>; 而PDF打印,则常用使用<a href="http://sourceforge.net/projects/pdfcreator/">PDF Creator</a>。</p>