All Stories

我只是想插几个图而已

  今天总算咬牙把手册编造完了,一共22页,包括封面和目录。偶然发现在用Adobe Reader浏览这PDF时,在某几页会猛烈地闪烁,一顿一卡的,除了那几页有比较多的图片外,也没其他特别之处了。而同样的文件用FoxIt浏览,就没这问题,而且似乎连字体都要更清晰一点。   这就让我觉得很费解,很有点不爽,于是我打算尝试一下XeLaTeX。卸载了CTeX 2.4.6,然后装上了CTeX 2.8.0.125,因为这个版本里有XeTeX。简单看了一下网上的说明,要用XeTeX,基本不用修改什么,只是比较重要的一点是源文件要用UTF-8保存,当然这只对中文之类的双字节字符来说需要,我这个文档全是英文的,也就不存在这个问题了。然后直接用xelatex.exe编译,一步生成PDF。不过最后出来的效果,却让我很不满意。具体表现在,所有在figure或figwindow中的图片,都没有进行合适的自动缩放,而这点在LaTeX中是做得比较好的。我不知道是哪里的问题,在网上搜了一阵子,也没有提到只字半语。于是又试了一下latex.exe,好家伙,这个版本看到插入png格式的图片竟然报错说缺少什么RoundBox信息。我没折了,撤!   还是继续用回2.4.6版本的CTeX吧,闪烁就闪烁吧。

还是没开始写文档

  昨天还说今天要写文档的,结果今天花了近半天时间画图标去了,当然基本是抄的别人的,我自己是没这种美工功底的。不过比较欣慰的是,最终的结果还算看得顺眼。   另外,本来运行latex等编译命令是直接让它显示个黑窗口的,后来觉得实在不爽,又看了一下它的命令行参数,发现有一个-interaction=nonstopmode,可以在出错时也不停下来,这个不错,于是可以把黑窗口隐藏起来,同时把它的输出重定向到程序的日志窗口了。   最后,是修正了一个小缺陷,在添加已有文件到工程时,同一节点中添加重复的文件也会成功,这太傻了点,就限制了一下,在添加前先检查一遍。   不行了,这东西已经做了5个月了,效率太低了,明天一定要认真快速地写手册了。

要开始认真写用户手册了

  今天看到消息,WinEdt发布6.0版本了,这个软件停在5.x版本长达9年之久,我曾经也试用过,遇到它发疯的时刻,不知什么操作过后,所有的中文字符都会变成乱码,而且在输入时,自动换行很不智能。6.0版本马上下载下来试了试,发现编辑器部分做得更漂亮了些,其他的以前就没深入过,也不知道有什么改进了。   而我的TeXCoding经过今天的努力,基本处于可发布的状态了。现在程序已经能够自己屏蔽没有菜单项的菜单了,在只有TeXCoding的时候就可以没有调试和构建菜单了。所有的,呃,其实是大部分最常用的TeX编译命令已经实现了,当然其实是被我砍掉了好些我觉得可能不那么实用的。这些被砍掉的,以后可能会在后续版本中添加。   明天就开始认真写用户手册了!

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编写,最后生成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)

  小师妹有一天晚上跟我说一个人看《倒霉爱神》傻笑了一晚上,推荐我也去看看。也确实很久没有看碟了,这些年来这方面的兴趣渐缺,在深圳时还偶尔跟人一起去下电影院,现在连这种机会都没了。今天闲来无事,到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发送个退出命令就可以了。   今天心情真舒畅啊!