All Stories

TeXCoding进度

TeXCoding进度

  前次说到可以做一个TeX编辑的完整工具,于是这两天都投入进去了,AutoCompletion倒是也实现得勉强可用了,自我感觉至少比SciTELaTeXIDE的做得好一点点吧,Code Snippet也实现了,具体配置是抄SciTELaTeXIDE的,还有Outline也实现了,用正则表达式每一行都匹配了一遍,其中对一个大字符串按换行符分割是用Lua自己的string.gmatch的,这个模式匹配方法还是很好用的。今天一天都花在实现LaTeX编译之类的命令上去了,其实就是直接调用TeX系统中的可执行文件,完全的体力活啊,而且有一点的是,我对TeX的了解只是一点儿皮毛,很多命令都不知道的,这就使得我只能看SciTELaTeXIDE有哪些命令了,还剩下一点点,争取明天全部完成,就可以真正开始写用户手册了。   抱怨一下QT Creator,真是比较另类啊,选了用Release方式编译,最后链接仍然是用Debug链接的,真是土死了,还一直没找到在哪里设置链接子系统是用console还是windows,默认都用console了,只好手动修改下它自动生成的makefile。

合入新的latex lexer代码

合入新的latex lexer代码

  因为准备写用户文档了,而且是打算用LaTeX编写,最后生成PDF格式,所以要有一个好用的LaTeX编辑器。本来这类工具应该是很多的,但从一开始我就打算是自己写一个这样的工具。当然编辑器仍然是用Scintilla的,只不过,Scintilla中的lexer对TeX的支持并不好,官方代码库中,有两个可用的lexer,一个叫tex,另一个叫latex。但是两个lexer都有比较明显的缺点,以至于根本处于不能用的状态。那个叫tex的,其他表现都勉强可以接受,但是在输入字符时,响应迟缓,不能忍受。而latex则没有支持代码折叠,很简陋。   好在有一个叫SciTELaTeXIDE的开源项目,它是基于SciTE-ru项目的,所以也是用Scintilla的。开发者是向Scintilla贡献最原始的那个latex lexer的作者,在SciTELaTeXIDE中,latex这个lexer已经被修改得比较完善了,同时还增加了BiBTeX和ASY以及metapost的lexer。简单看了一下,要增加这几个lexers,对官方Scintilla代码的修改很少,很容易就合进去了,同时还废掉了官方的latex和tex这两个lexers。   只要再做好Auto Completion,Outline和编译命令,基本上又是一个完整的工具了,呵呵。

《倒霉爱神》(Just My Luck)

《倒霉爱神》(Just My Luck)

  小师妹有一天晚上跟我说一个人看《倒霉爱神》傻笑了一晚上,推荐我也去看看。也确实很久没有看碟了,这些年来这方面的兴趣渐缺,在深圳时还偶尔跟人一起去下电影院,现在连这种机会都没了。今天闲来无事,到PPS上找来看了看。总的说来,主线情节是比较老套的,虽然看时间也是2006年的作品了,不过放在4年前来看,估计还是有这种感觉吧。   男主角是个生来倒霉的家伙,会一脚踩到水坑里,会弯腰撕开裤带,会抓到沾了狗屎的钞票,会出门被鸟屎砸中肩膀……这些是纯粹的晦气,让我觉得更在意的是,在事业上的寻求机会而不得果,甚至差点要被自己的队友们抛弃。   女主角就运气好得跟童话似的,出门不带伞而瞬间天气放晴,在电梯里能遇到搭讪的钻石王老五,代上司谈生意能意想不到的成功,随便买张彩票也能中奖,更过分的是能让别人送错裙子等等等等。不过这些事情,在我看来是不可靠的,人不能指望每时每刻都有这些光环加身。   之后的发展以及各种转折,基本是在我的预料之中,不过我仍然看完了,有一点小感动,特别是到最后女主角决定放弃新工作的机会而去找男主角,毅然吻住了男主角。看到这一段,我突然觉得,世界上尽管有很多邪恶,丑陋的人和事,但那些都于我无关,我只要处理好我的那份责任,那就够了,实在没必要去计较那么多。要相信这个世界上仍然有一些角落,还是有一点点美好的,只不过需要自己去发现,去创造。

遭遇骗子

遭遇骗子

  今天遇到了骗子,只差一点点,有惊无险,记之以作警示。   全程经过是这样的。今天刚好去市区,到了目的地,就接到一个电话,号码是13201792864(疑点一),接听后是一个说普通话的女人,自称车管所的,我大惊,以为哪次闯红灯被逮到了?结果是问我是否xx(我妈的名字,因为后面提到的买车时登记的车主是她),是否在两个多月前买了车。都确认后,她就问我,难道没有接收到车管所发去的通知,根据xxx号文件的指示,小车购置税可以退3%(疑点二)。我说没收到啊,她就问,不是浙江省xx市xx地方吗(确实跟登记的地址一模一样,我已经开始相信是真的),我很抱歉地告诉她,我们搬家了,不住在那里了。她就说,这个通知被退回来了,现在把这部分钱转移到国税局去处理了,你赶紧联系一下国税局,今天是最后一天了,然后告诉我一个电话号码,是4006811987,还有个6位数的退税编码。我看到是400,觉得好像是正规的哈(完全相信),于是打过去,又是一个说普通话的女人(后来回忆了下,似乎跟前面的那个人的声音一样?),我说了一下事情,她就说,把退税编码报过来,我就说了,然后她就说,是不是名叫xx,xx车啊,我说是的,她就问我车身价多少(疑点三),我说10w零多少吧,我不在家,没有发票,说不出具体数字。她也没追究,直接说你可以退三千几百几十几元(后面的我忘了),我很开心啊,这钱相当于白来的嘛,就问她要走什么手续,她说中行建行农行邮政的都可以。我问了一下我身旁的我阿姨,她有个农行的卡(我还真没有这些银行的卡),那女人说,你找到就近的自动柜员机,我们会指导你进行相关操作,把钱转给你(疑点四),我问一定只能转账吗,她说是的(疑点五),此时的我正沉浸在天上掉馅饼的巨大喜悦之中,就硬是让我阿姨放下生意,带我去找农行。找到农行的柜员机后,我让阿姨跟那个女人通话,因为银行卡是她的嘛,要她输密码什么的总不好我来。结果就出很大的漏子了,阿姨跟那女人说上话后,插卡,然后就报了下自己的卡里的余额,我就迷惑了,是你要给我钱,我告诉你这个干吗。这时我阿姨也反应过来了,问我该不会是骗子吧,我心有点慌,支吾了。阿姨就问她,你是哪里的。她说,国税局的。阿姨说,国税局就在这里xx路上啊,我们直接去办理行不行。那女人说,不是你们那里的国税局,是绍兴的。阿姨就说,你绍兴的,就说绍兴话好了,那种话我听不懂,然后那边就没声音了,也没挂断……这时基本可以确认是骗子了,我又打了个电话到买车的4S店里问了一下,店里人马上就说,这是骗人的,我们这里已经有人被骗2w多块了。我说那他们怎么会有我这些资料的,店里的人说,可能是从车管所买来的吧。我郁闷,我现在还在猜是你们店里卖出去的呢!我草,我说你们也有责任通知一下你们每个客户,提醒一下他们注意啊,我今天就差点栽了!   马后炮分析:其实事后回忆整个过程疑点非常多,但我一直被他们说出的完全正确的个人信息和购车资料给迷惑了。后来我又反查了一下最开始那个手机号码,所在地竟然是陕西西安!郁闷,如果当时我的手机上的来电通是正常工作的,我估计不会跟着她这么去折腾吧!现在想起来还是有点心有余悸,羞愧难当啊!   打击诈骗,人人有责!

搞定源代码断点

搞定源代码断点

  今天主要搞定了源代码断点,之前遇到的如果有断点,debuggee启动就会崩溃的问题,其实是通过socket发送命令过去后,debuggee在接收时会把不完整的信息压入到队列中,跟昨天遇到的回应消息不完整是一个道理。   最后我仍然是采用了完全使用debug库的功能实现的方式,这种方式的缺点是调试执行的效率很低,因为每次debug库回调时,都要判断一下是否在当前行有断点。至于之前我想过的那种快速断点的方案,就留到以后版本中实现吧!

修正了一堆问题

修正了一堆问题

  今天可算是最近两个月来状态最好一天了,修正了一堆问题,以至于调试器工作得像样起来了,剩下只要完成源代码断点的功能,就接近可发布的状态了!   这里简单记一下这些已解决的问题。   一开始,是有各种奇怪的问题的,比如在Lua扩展中解析XML格式的回应信息时,会报invalid node,有时候又会报call stack节点不存在,有时候在VS的调试器中运行时,会在分配内存的时候异常。这些问题,最终的原因可能是相同的。我的设计是另有一个工作线程通过socket在与debuggee进程通信,它会接收debuggee进程发回来的回应消息,并把这些回应消息压入一个队列中。而界面线程,会在应用程序消息空闲时,从该队列中撮回应消息,并转发给Lua扩展进行处理。这时我犯了一个错误,我会把一个可能不完整的消息结构体压入队列中,而界面线程取出处理时,并不能检测出是否内容完整。而且,我还是通过动态堆分配来存储这些额外信息,在界面线程中又会去释放这块内存,于是工作线程很可能去读写一块已经无效的内存。   另一个问题是,debuggee有时候会启动即崩溃,通过打印的调试信息显示,是boost::shared_ptr的使用有问题。我仔细检查了代码,发现只有两个boost::shared_ptr,还发现,其中有一个是不必要的,那是一个放在线程函数中的临时对象,生命周期只在该线程函数中有效,所以换成栈上创建就可以了。这样一来,后来经过几次测试,也确实没再出现崩溃。   还有问题是,只能调试一次,再启动debuggee就自动退出了,还有调试的时候用户手动停止调试,debugger会崩溃。其实这是没有仔细划分好各模块的职责,没有仔细设计各模块交互的协议。后来总结发现,如果debuggee要退出,分两种情况,即自动运行完退出和手动强制退出,无论哪种退出,都给Lua扩展发送一个通知,然后Lua扩展把调试端口(socket通信)停掉,而这个通知如果debuggee有能力发(手动强制退出),就让debuggee发,如果没能力(自动运行完),就让debugger发。而手动强制退出,则是只要向debuggee发送个退出命令就可以了。   今天心情真舒畅啊!

进展不错

进展不错

  这两天整调试器,经过不怎样的努力,到现在为止,功能上基本算是具备了,不过就是剩下些bug,主要有:   从debuggee发送过来的信息有时候经过XML解析会出错。   从debuggee发送过来的信息,有时候没有调用栈信息。   断点工作不正常。   有时候刚启动debuggee,debuggee就崩溃。   明后天就集中精力修改这些问题了,哈哈!

代码合得没问题,哈哈

代码合得没问题,哈哈

  前次说到,我觉得我把wxScintilla的代码合得有问题了,我的程序中使用了wxScintilla不能多选。其实是我毛躁了,没认真看Scintilla的文档。其实当时我也是浏览了一遍代码的,发现在wxScintilla中处理用户输入后,就直接转发到Scintilla的平台无关的代码中去了,而这部分平台无关代码我基本是严格复制了官方Scintilla的代码,所以照理是应该没问题的。昨天在整理《Free Software Collection》一文时,考虑到用什么软件来替代UltraEdit,结果发现SciTE的列编辑模式已经可以做得跟UltraEdit很接近了,看了看修改版的SciTE-Ru,也同样如此。当时我还有点怀疑是不是需要在容器应用程序中做单独的处理,想想又有点不太可能。看了一下SciTE-Ru的配置文件,发现是有这么个选项的,后来就去看Scintilla的文档了,看到在Multiple Selection & Virtual Space一节里,确实有相应的设置选项。   土了啊,代码合得没问题,哈哈!

成功恐惧症

成功恐惧症

  我是突然发现,原来我患的是这个病:成功恐惧症!在《反模式》中看到,原来我这样的病症并不唯一,很多人都会有,以至于他们都把它写到书中去了!   说到底,还是出于不够自信,以及毅力缺乏。古时候有句话,叫“行百里者半九十”,其中有一层含义就是最后那10%的工作是最难完成的,不光是因为可能工作内容的难度增加,还有执行者心理上的障碍,就像我这样。   一直以来,我都是一个缺乏毅力的人,很少会从头到尾认认真真地完成一件事情。不论是工作,还是其他生活中的琐碎的小事,比如看书,总是会把最后一部分丢掉。以前有领导说我,做事情总是喜欢只做到90分,而不去追求那完美的100,我不以为然,我是有点小骄傲的,有点自以为是的,这种关键部分有技术难度的部分完成了么,剩下的修修补补让别人去做好了!   现在不行了,所有的事情都得亲历亲为了,这个毛病带来的隐患就爆发了,将将引起严重后果了。记得类似的严重情况在公司时有过一次,那是我第一次独立负责一个特性,不但要完成自己的功能,还得提供接口给其他人使用,到了最后那段时间,心里非常焦虑,极度没信心,到后来都是只敢埋头写代码,不敢调试运行,生怕调试不过,把自己打击得再无法拾起从头来过的勇气了。最后运气很不错,因为本来也只是简单地调用别人的接口,我自己的特性完成后,提供给别人的接口基本功能也是能保障的。   眼下我那个调试器部分,已经持续2个月了吧,一直没有正常的进展,实在是挑战我的心理承受能力。我只能强行扭转自己的心理喜好习惯,自我灌输些心理暗示,希望能顺利度过这一关吧!