打磨程序员的专属利器分三个专题展示--
1. 命令行&文件
2. 快捷键
3. 文本 (本文)
好记性不如烂笔头,对于程序员更是如此。学习某种新语言或者某个库,若事先不记点笔记,几年后再拣起来会非常地慢。
之前自己一直用“为知笔记”,但慢慢发现了几个问题。
a. 这个软件喜欢升级,而每次升级都将界面改得面目全非(其实现在绝大多数软件都喜欢没事升级)。我只是想一个简洁的软件界面,只想专注于笔记,而为知的每一次更新后都得花精力在熟悉界面上。
b. 为知的笔记不是文本,这样笔记内容几乎只能用为知才能打开。如果想在ubuntu或者Mac上看,只有期待它出对应的客户端或者用网页查看(但如果没网时也不能查看本地数据了)。不过现在我打开wiz的网页版笔记,只能另我大失所望,本人只是想要一个左边是树形控件展示笔记的结构,右边可以显示笔记内容的界面,而wiz网站的在线笔记做得太复杂了。
c. 有时不知是服务器还是网络问题,同步居然出现问题。在家里电脑写的东西,来到公司后发现居然没有同步过来,fuck!!!!
忍无可忍后,就动了自己实现个笔记软件的想法。最开始是用c#写,笔记保存成.mht格式,用IE控件进行预览,用word进行编辑(这是从wiz中得到的启发)。不过后来也发现不是文本的笔记根本不能跨平台。于是又重写了一遍,用c++实现,下面是软件的界面,很简洁,但完全够自己用了。
这个程序从底层反锯齿的2d图形库,到界面库,到Markdown的解析,都是自己重新造轮子实现(虽说在软件界不鼓励重新造轮子,但通过造轮子可以将图形库、界面库理解得更透彻)。由于太过简陋就不发布出来,等过段时间有空了用QT再重写一个相对漂亮点的界面再公布源码和程序。
上面的笔记中提到了Markdown。《程序员修炼之道》中提到笔记得到文本来记录。最开始本人一直认为“文本”就是“纯文本”,直到在开源软件中发现有.md文件,于是知道了有Markdown这种东东,然后忽然识别到文本也可以做得很漂亮(html,css就是文本)。
Markdown是html的一个子集。可以用少量的标示符就可以构造出漂亮的文本排版。下面简单介绍下Markdown的标示符:
a. 行首的#可以指明段落,一个表示第一级,二个表示第二级,以此类推
b. 两行```之间的内容可以被解析为code格式,就像上图中有灰色背景的区域,这种可以方便放代码。
c. 行首的 * 可以被解析成html的
d. 用[name](http://www.test.com "test") 这种格式可以指定超链接
e. 用下面的格式可以构造出如下的表格
name | age
---|---
man1 | 45
man2 |2
....
更多Markdown语法可以参数其官网。反正都挺好学,也比较易用,可以在记笔记时不因格式问题而花太多的精力,让我们专注于内容。
有了上面DIY的笔记软件后,对于多地办公、多台电脑办公就得考虑如何同步笔记了。
开始本人是使用金山网盘,但也是因为同步问题,有时真是金山的服务器挂了,导致无法同步。还一个严重的问题,网盘没有像svn,git那样明确的update,commit,pull,push操作,这样在同步时真就会出现问题。然后本人试了几乎所有的网盘,发现在某些情况下100%的情况会出现同步失败的问题。
************************
在写这篇博文时为了再次证实下,于是本人又装了次金山快盘。
新建一个文件夹,在这个文件夹下再新建两个文本文档,往其中一个文本文档中随便写点东西,这时去网页版的金山快盘上,就发现真就没有把刚才的东西同步上来。比吃了蟑螂还恶心!!!
qq云盘和360网盘以前还可以在Explorer中查看本地数据,但现在只有用它自己的程序来操作本地数据了。
百度云盘同样也有这样问题,没有本地路径。
************************
同样是忍无可忍
开始使用 http://svn.jundie.net/,但由于本人小气,不想花钱买私有项目,只有把自己的笔记弄成开源项目,虽说没什么重要东西,但总感觉不靠谱。
于是找到git.oschina.net,并且发现基于git有非常多的服务器,并且都可以免费申请私有项目。于是爱上了git,为了保险,将自己所有的代码都放到git上,当然是私有项目(遥想当年,由于本人折腾电脑、折腾分盘,将大一下刚学程序半年写的vb6俄罗斯方块程序源码弄丢了,多么地心疼啊)~~
于是妈妈再也不用担心代码弄丢了。
为了方便在Explorer中访问笔记,可以使用前文介绍的subst命令,将笔记路径映射成一个虚拟磁盘以便访问。
《程序员修炼之道》中说程序员应该每一年学习一门新语言,我们打个折扣1~2年学习一门新语言。并且非常有必要学习一门文本操作语言,比如Python,Ruby或者是Perl。虽然用C#,java,甚至是c/c++都可以进行文本操作,但编写代码的速度肯定不及脚本语言。
本人最开始学习的是Perl语言。这门语言咋一看觉得不好学——充满了各种奇奇怪怪的符号。不过如果沉下心来将《Perl语言入门》、《Perl语言编程》两本书看完,然后再动手自己写几个实用的小程序,Perl的学习之路基本上就算是毕业了。
下面展示几个本人所写的perl程序。也是比较简陋(本人侧重于实用):
linux下的ls命令可以将当前路径下的文件、文件夹都显示出来。windows下没有这样的程序,于是本人实现了一个。
View Code
将上面的代码保存为ls.pl,放在系统路径中。然后在命令行中就可以用 perl ls.pl 来执行它。如果嫌这个命令太复杂,就想用ls来执行它,可以这样,在系统路径中建立一个ls.bat文件,内容为
@echo off
perl e:\Tools\ls.pl %*
这样输入ls时,先执行ls.bat文件,然后在这个文件中再真正执行perl代码(这里指定ls.pl的路径得用绝对路径)。其中%*是将 ls后面所有的命令行选项传递给ls.pl。
ls所支持的命令行选项有:
当我们阅读某个开源项目时往往想找一个类名、或者一个变量名在哪些地方使用过,如果这时没有将项目组织用IDE组织起来,想要查找就比较麻烦。在linux下有个grep可以对文本进行搜索,然后本人就用perl写了一个类似grep的程序,可以在文本文件中查找字符串,并且可以指定在特定的文件上查找。
grep
同样为了方便,建立一个grep2.bat文件,其内容为(这里只所有取名为grep2,是因为本人在widnows中装了linux的一些软件后有grep程序了,为了不引起冲突而取名grep2)
@echo off
perl e:\Tools\grep.pl %*
grep2 ClassName 查找所有文本文件中的ClassName
grep2 -f file 只查找文件名(不查找内容)
grep2 -f \.cpp$ -t ClassName 在以.cpp结尾的文件中查找ClassName
分析linux下的开源项目时往往没有IDE的支持,这里想要定位到变量的定义处,或者想查找在哪些地方有使用这个变量就很不方便。于是可以建立一个不能编译的vs项目,将所有源码添加到vs后,仅仅用来浏览代码。但基本上开源项目的结构都非常复杂,子文件夹中包括子文件夹,而vs也只支持批量添加同一个文件夹中的所有文件。如果一个个文件夹手动去添加代码文件,是个非常重复的工作。——于是程序的天性,消除重复劳动在此得到体现。
如果是建立c/c++项目,其项目拓展名是.vcproj,可以发现它就是一个xml文件。
其包括文件的关键节点如下:
知道了这个结构后,就可以用程序自动生成了~~
文本操作,本人依然用Perl !!
create.pl
vs_pre.txt
将create.pl vs_pre.txt复制到需要构建项目的地方,然后执行perl create.pl,这样就会生成一个temp.vcproj的项目,其中就包括了这个目录下所有的.h, .hpp, .cpp文件,在create.pl 的73行可以指定添加文件的类型。
之前本人分析gimp和ffmpeg的源码就是用这种方法建立了vs项目,于是极大地提高了分析代码的效率。
如果以后有心情了,分析linux系统源码时也会用这种方式来构建项目。
自从爱上了git.oschina.net后,将所有代码都放到git的私有项目中。c++代码都放在本地的 e:\cpp_app\ 文件夹下
如图所示,左下角有小绿圆圈的标志都是有提交git的项目。
这么多项目,如果一个个手动地进入文件夹然后pull,push,非常繁琐。
于是先建立下面的git_syn.pl文件
1 my $one = $ARGV[0];
2 my $path = "e:\\cpp_app\\";
3 opendir(DIR, $path);
4 my @files = readdir(DIR);
5
6 foreach (@files) {
7 next if $_ eq '.' or $_ eq '..';
8
9 my $str = $path . $_ . "\\" . ".git";
10 if (-d $str) {
11 my $s = $path . $_;
12
13 say "\n\n=============== now directory : $s";
14 chdir $s;
15
16 if ($one == 0) {
17 system "git add .";
18 system "git commit -a";
19 system "git push";
20 } elsif ($one == 1) {
21 system "git pull";
22 }
23 }
24 }
建立pull.bat文件
1 echo off
2 perl git_syn.pl 1
3 pause
建立push.bat文件
1 echo off
2 perl git_syn.pl 0
3 pause
git_syn.pl遍历e:\cpp_app文件夹下的所有文件夹,如果发现有.git子文件夹,则根据传入参数判断是push还是pull操作。
有了pull.bat, push.bat后,妈妈再也不会担心有代码没更新了。使用svn的项目也这样弄,只要将git 改成svn,pull,push换成update,commit即可。参见《命令行&界面》
个人认为程序员应该将正则表达式融入自己的血液。
如果不沉下心来学习,或者学了后不用,都会出现想使用正则表达式而很茫然的情况。
本人借着学习Perl的机会,将正则表达式重新好好学了一遍,并且在日常的工作中有意识地强迫自己去使用,几个月下来后基本上可以称得上熟练掌握了正则表达式。
下面就介绍几个在vs中用正则表达式进行查找/替换的例子(vs的正则和标准的正则有所不同,不过思想是一样的,只是在表示符号上不所不同):
用如下图所示的方法打开vs的正则表达式查找、替换功能:
其中{}表示分组(相当于标准正则中的()),[]表示一类字符集(相当于标准正则中的{})
关于正则表达式的具体使用情况还有很多,结合上面介绍的grep2,可以用\.cpp$来查找所有后缀是cpp的文件。
总之,学习正则表达式的回报会随着时间的累积越来越多,随着对其掌握的熟练程序而越来越多。