JSMinNpp 1.13 Released

What’s New in JSMinNpp 1.13:

  • Performance improved (JSFormat will be about 2X faster).
  • Linked editor with Json Viewer: Clicking a data node in Viewer, editor will navigate to corresponding line.
  • Added a logo.

Download links:
https://jstoolnpp.googlecode.com/files/JSMinNPP.1.13.uni.zip
http://sourceforge.net/projects/jsminnpp/files/Uni/JSMinNPP.1.13.uni.zip/download

JSMinNpp 1.12 Released

What’s New:
1.12
Fix a bug in JSON Viewer.
Update JsonPP.
Fix “unexpect space” of JSLint.
Add an option to keep indent in empty line.
Fix “finally” bug.
Change project site to http://sunjw.us/jsminnpp/

Download links:
https://jstoolnpp.googlecode.com/files/JSMinNPP.1.12.uni.zip
http://sourceforge.net/projects/jsminnpp/files/Uni/JSMinNPP.1.12.uni.zip/download

JSMinNpp 1.11 Released

What’s New 1.11
Move to Google Code.
Add a Json Viewer.
Change classes inheritance hierarchy to build a smaller binary file.

Download from here and try.

Although the source code repository has been moved to Google Code, downloading is still from SouceForge.net.

Sooner or later, it will be on GitHub

用程序解决 Draw Something

Draw Somthing 是最近很流行的一个游戏,iOSAndroid 平台都有对应的版本。
游戏很简单,玩家看到单词,然后画给网络对面的玩家。对方看到图片,根据下面给出的候选字母拼出单词。

仔细想了一下,编程解决猜图画,难度比较大。但是可以解决根据已单词长度和候选字母,在字典中寻找符合这两个条件的单词作为候选,之后再由人肉方式得到最终答案。
首先需要准备字典,如果使用标准的字典序,在搜索时需要根据长度过滤单词。其实没有必要每次搜索的时候做,重新对单词进行排序,先按照长度比较大小,只有当长度相同时才按照字典序比较大小。之后就可以将单词整理成按照长度分隔的字典。
搜索时,参考拼写检查算法,将候选字母按照字母顺序排序成列表,将单词依次取出后,也把单词变形,将单词内的字母按照字母顺序排列。看单词的字母表是不是候选字母表的子集,如果是子集,者加入候选单词表。

继续阅读

x=x++;

之前囧哥曾经写过一个日志,讨论一个问题,就是在c/c++里面这个代码的结果

x = 1;
x = x++;

执行后,x是2。这个结论还是比较显而易见的,不过编译器到底是怎么处理这段代码的呢?
我用 Fedora 15 自带的 gcc -S -O0 将 .c 编译成 .s 文件,来看看究竟编译器干了什么。

int x = 13; // 为了看汇编更方便,赋值13
x = x++;

被翻译成如下的汇编代码:

movl	$13, -4(%rbp)  ;x=13
addl	$1, -4(%rbp) ;x++
movl	$0, %eax
popq	%rbp

从汇编码来看,gcc 是这样理解x = x++的:

x = x; // 被优化掉了
x++;

也就是对于 int 这种 trivial 类型,= 的优先级高于后置++。 先赋值,再做后置++。
我们再来试几个代码:
第一组

int x=13;
int y;
y = x++;

翻译结果:

movl	$13, -4(%rbp) ;x=13
movl	-4(%rbp), %eax ;eax=x
movl	%eax, -8(%rbp) ;y=eax
addl	$1, -4(%rbp) ;x++
movl	$0, %eax
popq	%rbp

————————————————–
第二组

int x=13;
int y;
x = y = x++;

翻译结果:

movl	$13, -4(%rbp) ;x=13
movl	-4(%rbp), %eax ;eax=x
movl	%eax, -8(%rbp) ;y=eax
movl	-8(%rbp), %eax ;eax=y
movl	%eax, -4(%rbp) ;x=y
addl	$1, -4(%rbp) ;x++
movl	$0, %eax
popq	%rbp

————————————————–
第三组

int x=13;
int y;
y = ++x;

翻译结果:

movl	$13, -4(%rbp) ;x=13
addl	$1, -4(%rbp) ;++x
movl	-4(%rbp), %eax ;eax=x
movl	%eax, -8(%rbp) ;y=eax
movl	$0, %eax
popq	%rbp

————————————————–
从各个例子中可以看出,gcc 对于 int 这种 trivial 类型,认为 = 优先级高于后置++,低于前置++。

赋值先于后置++,后于前置++。

即使复杂点的例子x=((x++)+(y++)),相当于:

x=x+y;

x++;

y++;

KB2465361 补丁导致 VS08 编译 MFC 体积增大

微软的 KB2465361 补丁导致 VS08 编译出来的 MFC 体积明显的增大。发现这个问题是在编译 fHash 的时候,原来只有 297KB 的 Release Build 一下子变成了 2MB 多,一开始还以为是我自己修改了代码所致,但是仔细查看变大前后的代码,没有可能会导致体积明显变化的修改。用 Dependency Walker 查看后发现,新的二进制链接了 gdiplus.dll 等一堆新的链接库,而代码中根本就没有用到它们。

仔细想想和上一次编译之间唯一的变化就是安装了 KB2465361 补丁。上网查了一下,有这一篇博客确认了这个问题,并提出了解决方法。 继续阅读

Catia CAA Addin 正确的建立方法

最近有幸参与一些 Catia 的二次开发,在这个方面的文档很少是很令人头疼的一件事。

首先入门的时候,比较大的问题就是怎么样能添加一个工具栏到 Catia 界面里。许多教程(例如这个)都会介绍到使用 Addin 为 Catia 添加一个工具栏,但是如果你完全照着做 99% 是不会成功的(剩下的 1% 可能是你电脑出错了:))。其中主要的一个步骤是在添加 Component 的时候,选择一个 TIE mode,教程上说是选择安装路径中的 CATIPrtWksAddin,如果你也是这样选择的,虽然后面的步骤都是对的,编译也完成了,运行后你不会看到这个工具栏在之前步骤建立的Workbench中视看不到这个工具栏的,它其实在 Part Design 工作空间中。如果现在刚才建立的 Workbench 中使用,在一进入这个对话框的时候,在当前工作目录下有一个 CATIAddinWorkbenchAddin 1,直接选择 Implement 这个接口就可以了。

catia_insert_components

因为在建立 Workbench 的时候,就已经建立了这个接口,Workbench 运行的时候,会载入一个实现的接口,并且运行里面的函数来建立菜单和工具栏。而你如果选择 CATIPrtWksAddin,Workbench 载入时并不知道应该用哪个实现类。

向导之后会为你建立好框架,你需要做的就和大多数教程一样,实现 CreateToolbars() 和 CreateCommands() 即可。

如果不想将建立的过程封装起来,也可以不建立 Addin,直接在 Workbench 的 Headers.h 和 Workshop.h 中编写代码。在 CATAddinWorkbenchCmdHeader 1 中会有一个默认的实现名称,例如 MacImplementHeader(CATAddinWorkbenchCmdHeader),使用 CATAddinWorkbenchCmdHeader 可以直接在 Headers.h 中使用和实现 CreateCommands() 时类似的方法建立按钮与命令之间的连接,在 Workshop.h 中也可以使用实现 CreateToolbars() 的方法来建立工具栏和菜单项。

1 下划线部分会由于你所建立的 Workbench 的不同而变化