All Stories

高导来出差

  上周就听说她要过来了,今天快下班的时候看到她从旁边走过,刚好有另外两个领导在,她就只能跟我笑笑。下班后,教授埋单,去湘江老厨吃了一顿,说起来我们几个人很久没有一起出去吃了。高导还是很爱搞笑,真是个有趣的人。一年啊,就这么快过去了。  吃完饭,要走回公司去坐班车。今天很失策啊,没预料到会遇到下雨,还下得很大啊,结果和疯丫头两个人一把小伞,一人湿了一半,还差点没赶上班车,真悬啊。  还以为工具快忙完了,今天才发现,还欠下好多账,唉!不过易用性方面真的也改进了好多,只是我觉得这工具,我们现在花了这么多精力,到时候人家用不用,能用多少,觉得好用不,还一切都是未知数呢,不过就当是给我自己一个锻炼的机会吧,至少是了解了一些MFC编程的东西,以前可是几乎一点都不会MFC的呀,而现在几乎都不想再用VCL了,越来越不喜欢C++Builder了,感觉VC真的太好用了。

快忙完了,这个工具

  这周又过了大半了,真快啊!明后两天要加油把帮助文档解决掉,真是个麻烦事,我总觉得一个编辑器没啥好说的。不过很让我高兴的是,功能上基本把最紧要的部分都完成了,今天又加了几个特性,换行符转换、括号配对高亮等。不过今天去找人玩的时候,突然发现有一个很重要的方面居然一直被忽略掉了,那就是对代码审查(或用例评审)过程的支持。如果能做成像Source Insight那样强大的引用、跳转,就太完美了,不过我不打算继续下去了。那个脚本适配层还需要进行一些改进,原来想得太简单,而且被人看到了那个Panel。要给它们添加自定义快捷键的功能,这样就需要一个额外的文件来保存对应的快捷键信息。另外还有一个可能是,应他们的要求会需要能让外部执行器来运行脚本。

看到一个做共享软件的站点

  本来我也只是好奇在网上搜寻一些IDE,看看它们有哪些优缺点可以借鉴参考的,不经意间来到一个共享软件的官方站点。有些站点是很容易就看出来是一个做共享软件的,很可能就是一个人在做。这个站点卖几款编辑器,分别是针对HTML、Perl、PHP的,我都down下来大概看了一下,觉得还是比较粗糙的,所以我开始有点怀疑这个能卖出去多少,从定价上来看,Perl和PHP的编辑器要$59,HTML那个$24,但同类竞争应该是比较激烈的吧,各种免费、共享、商业软件都在抢夺这么块市场,应该有很多做得比这些好多了。不过这个作者倒是有点意思,只是一个文本编辑器,他就变出三个花样来。但我查看了一下三个编辑器的窗口类,却是不同的,有点奇怪,不知道是出于什么原因,或者说,三个产品开发的时间间隔比较大,导致作者在新开发一款产品时使用新的控件。  另外搜索到一个PHP Designer 2007,记得我大学毕业设计的时候就用过它的,当时好像还是免费的,不过现在这个要€39,它就要比前面提到的那个专业得多,记得两年前用它时就已经觉得很好用了,现在就更强了。它用的TSynEdit控件,应该是用Delphi开发的,About里很老实地把它用到的所有控件都罗列出来了,大部分是用Mozilla协议的,比较乖啊。看来善用开源成果也是做共享软件提高开发效率和产品质量的一种手段啊。

编辑器研究

  从网上down了几十个文本处理的程序下来,我的主要目的是研究一下目前Windows平台下好用的编辑程序,从中汲取一点有用的想法。其实看了看,发现超过一半的编辑器质量很一般,有的简直可以用粗制滥造来形容,只有不到一半的比较成熟。这里先排除像Word这种富文本编辑器,因为我只是为了Impeller来寻找竞争对手和学习对象,所以是纯文本编辑器才列入其中。  Emacs和VIM暂时也不说,感觉这两个从*nix发源起家的,风格完全与Windows平台下的不同,可比性并不大,当然这两个的极强的可扩展性是很值得学习的,VIM了解得更少,Emacs的之前用过一段时间,确实可以说是功能多得变态,这一方面得益于它的灵活的扩展性外,另一方面当然是几十年发展积累下来的众多fans开发的插件,看似很朴素的界面下,甚至可以玩俄罗斯方块。  之后剩下可以参考的,其实就是目前最流行的几款了,如UltraEdit、EmEdit、EditPlus、PSPad、Notepad2、Notepad++之类通用文本编辑器,Code::Blocks、Visual SlickEdit、Source Insight之类具有工程概念支持的代码编辑器。一般说来现在优秀的通用文本编辑器都会支持编程语言的语法高亮,有的还有代码折叠,集成一定程度的文件管理功能,支持外部脚本扩展、宏功能,其它的主要是一些锦上添花的辅助功能,比如支持外部程序调用,各种插入功能等等,看来看去,我觉得Impeller的编辑器功能上除了不支持列模式外,其它的基本上都有了,甚至有的方面还可能略强于那些编辑器。但与那些代码编辑器来比的话,还欠缺一些很重要的元素,比如定位为一款IDE来说,重构是现代IDE必要的功能,以及Source Insight具有的引用、跳转功能也是强得很有特色,作为一款代码浏览器是很需要这样方便的代码导航能力的。  在这个8月里,我大概只能做到完成外部工具调用以及留下外部脚本扩展接口为止了。其它的想法,留给自己的CodingTool来实现吧!

Ruby参数列表提示基本完成

  经过今天近一天的奋战,参数列表的提示功能基本也完成了,顺便发现了一个较新版Scintilla中存在的一个bug,自己动手改了重编译dll,解决。  不过今天为了完成这个特性,还是费了点精神的,字符串指针乱飞,真是头也昏了。有时候我就会想,其它语言没有指针,都是怎么操作字符串的哦,哈哈,越来越井底了。  在完成这个特性时,又顺便发现,可能可以通过从数据库中记录下相关的方法返回值类型,更加智能地进行自动补全。  下周重点是先把胶片和帮助写完,然后把其它模块要求提供的支持做好。

Ruby语法动态提示基本完成

  可以动态地提示关键字、已定义变量、类名、类方法的自动完成了。其中,用Greta写了个变量声明的扫描器,其实是全文匹配一把,速度挺慢的,于是只好做成多线程的,现在的处理是有隐患的,以要改。另外顺便让我确认用CppSQLite这个封装类在MFC程序来操作SQLite 3.4.x版本也是基本没有问题的,有了封装类,编码真的变得很简单很容易,完了,我已经没能力自己写代码了,全是拿别人写好的代码来拼凑一下。这样一个工具,大概拿出去卖,也是能卖的吧,呵呵。  剩下就是要做函数参数列表的动态提示了。  做完这两个特性后,就去做外部工具和脚本适配层,然后改一些问题,完善一下GT3000的封装,写一下帮助和宣传胶片,这个8月就这样过完了。  不过在业余时间,还得研究一下asio以及它自带的httpd的例子,写一下设计需求一直到概要设计为止。

小思宇也要离职了

  今天小思宇突然给我发了个邮件,说她可能要离职了。我也没怎么想,直接说,支持她。记得刚进来的那一年,我们都是互相安慰互相鼓励,这样坚持过来的。后来问了问大概什么时候,她说可能最快9月份,那时跟玉玉一起。我也不好再说什么,水斗新村新阳丽舍新雅阁301就这样彻底散了,以后要见面也不知道是什么时候了。  一天都在整一个外部工具对话框,完全仿VC来做的,不过工作量还是有点大的,或者说我的效率着实很低。在这个8月里,我要把编辑器相关部分想好的都实现了,尤其是要留下接入后门,以后可以在不修改重编译工具源代码的情况下,给工具增加新特性。

之后一段时间要做的事情

  编辑器重构昨天就基本已经完成,今天好像没做什么事,就是讨论了一天各种事务。其实对于编辑器,我还是有很多想法的,看到SciTE和notepad++的表现,还有UltraEdit,就想把它们有的,都做进来,前两者就是Scintilla控件的最好功能展现。尤其是下午看了一下8月份的《程序员》杂志,刚好有个专题介绍现在流行的几个RoR用IDE,心更痒了,想把所有好的东西全加上去。至少,能用脚本进行扩展是我特别想要的,我甚至想做个DLL做个适配层,工具可以动态地加载该DLL,该DLL可以接受各种外挂的脚本解释器,这样没有这个DLL工具还是能正常工作,除了脚本扩展。另外一个想法是,好像Greta这个库有点点问题,也不知道是不是代码写得有问题,所以我又想,能不能做个正则表达式库的适配层,这样也可以挂接不同的正则表达式库了,比如除了Grata外还有用于C/C++系的boost::regex、ATL::Regex、PCRE等等,这样就像UltraEdit一样了,用户可以选择自己习惯的那种。  现在最大的问题是,语法解析,我要做一个动态提示功能,这需要随时知道一个变量的类型,而这对于Ruby这么动态的语言来说,真是太难了。SUN为Netbeans专门开了个代号为Schliemann的Generic Language Support Framework项目,它可以动态地通过由用户自行添加正则表达式和语法规则(现在流行用巴科斯范式吗?不清楚),来动态地增加对新语言的词法解析和语法解析,这比Scintilla现在的做法要更灵活,不需要编译器,有个文本编辑器写规则就行了。我当然做不了这么好,所以现在只能依赖SciLexer.dll或者另寻出路,看了一下ctags,好像对Ruby的支持不如对C/C++的好,它解析不出变量的最初定义的地方,难道自己写一个简单的够用的,因为目前面向的用户应该绝大多数情况下只会用到Ruby语言中很小一个子集的特性。  早上去讨论了一下另一个任务的需求,果然我最开始的想法是正确的,看来老大的理解能力或者是个人喜好影响了他的判断力啊!今天讨论了一下,老大出来就有点惊奇地说,看来要做一个像电驴一样的东西了。呵呵,其实我当初最早看到这个很原始,未经过整理的需求时,就已经断定会是这样的结果,只是当时老大一心想用Sharepoint,我也不好多说,还似模似样地给他用SharePoint Service3.0建了站来看看,当时转项目部1个月,全在看这个资料了,呼呼,浪费好多时间。  现在就要来网络通信了,一个支持P2P的东东,可以做的事情真是太多了,呵呵。一个集中式服务器只提供索引及账号管理功能,其它的都在客户端完成。我有点想试一下Google桌面搜索的那种界面,在本地建一个http服务器,然后用IE跟用户交互。不过生成HTML页面有没有现成的办法呢,还有HTML的表现力是强,但如果要让用户输入很多零散的信息,这样也很难处理哦。至于http服务器,记得boost的开发邮件列表里有提到过一个基于asio的项目,一时找不到URL了,可能可以用一下。先分解一下设计需求吧,反正有一个季度时间来做,这个东西有点感兴趣哦!

关于Scintilla的某些快捷键输入怪异字符

  一直以来都存在着这个问题,当时大概看了一下Scintilla的源代码,也没有找到哪里注册处理了这些快捷键,想不到好的办法,于是就临时处理了一下,自己截获这些快捷键,发现一个截获一个,本来以为可能截获得差不多了,结果前些天发现还有没有拦截的,于是觉得有点郁闷,决定要彻底解决这个问题。  又稍微仔细地搜索了一遍Scintilla的源代码,发现确实好像没有注册这些快捷键,然后到maillist上问,作者Neil Hodgson也真的挺热心的,每封邮件都回了,由于时差的关系,加上我白天在公司不能上网,这些天我都是晚上回家写邮件,描述问题,第二天早上起来收邮件,看看他的答复。这样持续了几天,终于今天早上看到回复后,搞清楚了问题的本质。  我照他的办法在ScintillaWin.cxx的WM_SYSKEYDOWN/WM_KEYDOWN里打了断点,然后跟踪,发现这时按到那几个快捷键都是直接传给::DefWindowProc处理了。这开始让我觉得有点走不下去的感觉,后来往上看,有WM_CHAR消息的处理,于是也打了个断点,发现每次按了快捷键后,就会收到WM_CHAR消息,而且参数就是这些不可见字符的ASCII码值。Neil说这是Windows发的。我用SDK写了个小程序试了试,果然发现这是Windows的默认行为。Neil说这只能自己在程序里处理把所有这些快捷键都屏蔽了。于是我就又郁闷了,我怎么知道到底是有多少控制字符被绑定到什么键上去了。上Google搜索了一把,发现一个列表,呵呵,刚好列出了所有的VT100和VT220键盘的控制字符绑定。  中午的时候想了想,我不想在程序里处理拦截所有快捷键,不如直接改Scintilla的源代码,在WM_SYSKEYDOWN/WM_KEYDOWN里记录一下是否按下了Ctrl,在WM_CHAR里判断一下这个标记,如果标记置位了,并且刚好这次得到的是个控制字符,就直接退出,这样就看起来解决了,至少Windows平台上似乎没什么问题了(注:Scintilla是直接多平台的,包括Windows、MacOS、以及通过Gtk+支持的平台等)。  Neil Hodgson是个很有毅力的人啊,这东东从1998年做到现在,越来越完善,而主要作者却一直是他一个人,当然也还是有很多人为之作出了贡献。