Hello World!

树的3种中序遍历的方法

对于二叉树的中序遍历,我们有很多种方法,有递归的和非递归的,有用栈的,有不用栈的。
下面贴一下已知的三种方法,第一种是最简单的递归方法,非常直观。第二种是常规的栈的方法,最后一种比较少见,是线索二叉树来实现遍历的,最后一种的优点是空间为常数!

Mac 从 bash 到 zsh

在mac下用bash一段时间了,今天忽然发现zsh居然可以比bash更加强大
配置之后效果如下
Screen Shot 2014-04-01 at 12.55.00 AM
简单的说 有自动命令补全,命令高亮,自动识别git目录,上一个命令成功与否的返回
需要以下几个步骤达到上面的效果
1.
获得 iterm2
http://www.iterm2.com/
2.
安装zsh

3.
安装powerline字体

双击字体完成安装
然后再iterm2的Preference里面设置成这样 注意non-ASCII font的设置
Screen Shot 2014-04-01 at 1.01.54 AM
然后顺手把terminal选项设置成这样
Screen Shot 2014-04-01 at 1.02.50 AM
4.
获得agnoster主题
https://gist.github.com/3712874
或者
(推荐这种)在~/.oh-my-zsh/themes目录下执行

如果发现这个主题已经存在了,你可以考虑先不下载。。。如果发现重启后你的提示符有乱码,很可能是这个文件乱码了,所以删除这个文件,然后重新下载这个主题就行了。
5.
安装solarized的配色
切换到~/Downloads (其实只要切换到你finder能打开的位置就行了 隐藏目录貌似有点小麻烦)

解压后 选择iterm2-colors-solarized里面的”Solarized Dark.itermcolors” 双击导入
然后在iterm2的Preference里面设置colors的底部有个load presets 钻中 Dark Solarized
然后顺手改一下几个颜色 改成大致这样的样子。。。
注意右侧颜色的需要修改。。。还有foreground 颜色也需要修改
Screen Shot 2014-04-01 at 1.10.55 AM
6.
修改~/.zshrc文件
修改ZSH_THEME成以下的样子

然后在文件结尾添加以下一大段的内容

重启你的shell done!

shell下计算MD5的问题

尝试使用shell自带的md5命令给一些字符串算md5

得到
f447b20a7fcbf53a5d5be013ea0b15af
但是有经验的人都知道 123456的md5是
e10adc3949ba59abbe56e057f20f883e
百度加各种尝试之后,终于发现问题所在
因为 echo自带换行符即’\n’
所以解决方法是

这样获得的都是
e10adc3949ba59abbe56e057f20f883e

关于解决Mac QQ不能使用摄像头的问题

前段时间 Mac QQ 在2013 中的air中无法使用摄像头
Mac QQ 官方给出的解法是
关于2013款air升级至10.8.5后无法使用摄像头的临时解决办法:1.前往路径 /Library/CoreMediaIO/Plug-Ins/DAL/ ,备份文件AppleCamera.plugin;2.下载并解压链接中文件http://url.cn/QTKrsL ;3.复制该文件到1路径,并覆盖原文件;4.重启电脑。
然后确实是有用的
但是
苹果放出了以下更新(不要问我为什么是英文界面,因为在中文的界面中居然搜索不到这个更新,囧)
http://support.apple.com/kb/DL1686
如果你曾经替换过这个文件 但是没有替换回去的话就悲剧了 因为你AppStore上面认为你已经安装了的这个补丁,所以不会提示你再次安装这个补丁,但是由于你没有替换回原来的文件,就会使摄像头彻底悲剧。。系统根本识别不出这个摄像头

因此正确的解法是
1.替换回原来的AppleCamera.plugin
2.去 http://support.apple.com/kb/DL1686 下载这个补丁
3.安装补丁后重启 问题解决

最坑爹的是
关于之前2013款air升级至10.8.5后无法使用摄像头的问题,现在苹果已给出修复补丁;只需将系统升级至最新版即可修复该问题~之前没有升级到10.8.5的用户只需直接升级即可o(∩_∩)o
官方的说法 真是管杀不管埋啊。。。

别问我为什么知道这么清楚。。。。。你懂的

[C++]BigInteger类

最近写了个BigInteger类,采用了unsigned int数组存储 一个存储单元可以存储9个数字,因此比纯粹用char数组存储空间利用率更高
而且可以从1000000000进制的角度看乘除法,将简化乘除法的代码量,想不到加减法的代码量倒是不少。代码中不包含异常处理部分,所以有待完善。当然没有进行强测试,不过基本情况还是比较准确的

重写数据结构之简单表达式求值

昨天准备睡觉 结果应某禽兽的要求 重新写了个数据结构的表达式求值 支持+-*/() 有简单的表达式合法性判定
以前在数据结构课上已经写过类似的东西 但是当初写的太渣了,这个稍微不渣一点。。。。现在重新学习了之后 还是有所收获的
代码贴上来 有关资料 可以参考以前的那篇文章http://www.leelour.com/?p=178

DNF的自动5分钟站街领奖品工具 开发全过程

背景

最近又开始玩dnf了 又赶上圣诞活动 每5min点击右下角的小闹钟一次 然后我就萌生出了写一个自动领取的工具

工具定位

这工具严格意义上算是一个外挂,当然不是修改游戏数据的那种,只能算是模拟挂

开发过程

第一次尝试

第一次我采用mouse_event 进行模拟

先看看mouse_event的定义

基本思路是将鼠标移动到对应位置然后单击,分为以下几个时间

MOUSEEVENTF_MOVE 表示鼠标移动
MOUSEEVENTF_LEFTDOWN 表示鼠标左键按下
MOUSEEVENTF_LEFTUP 表示鼠标左键弹起

但是经过实践证明,移动过程成功,但是鼠标左击没有成功,看来dnf果断屏蔽了这个功能

第二次尝试

我又再次仔细阅读了《C 外挂编写深究》这个神作,里面谈到有三种层次的鼠标模拟,分别为

1.鼠标事件模拟 也就是mouse_event

2.后台鼠标模拟 也就是SendMessage和PostMessage实现

3.驱动级别键盘模拟 大致是用WinIO库实现的

我准备采用后台鼠标模拟试试

捕捉事件消息

先用微软VS自带的神器 spy++捕捉事件消息

具体步骤如下

1.打开spy++,选择日志消息

1

2.得到以下窗口

2

3.选择查找程序工具

3

4.点中需要的程序,这里选中地下城与勇士

4

5.点击“消息“标签

5

6.点击全部清除,由于我们只需要模拟鼠标左键点击,因此选择查看以下消息

6

7.进入游戏中,点击左下角的小闹钟,观察监视窗口捕获的系统消息

8

8.果然得到了鼠标左键down和up的消息,选择一条,右键,属性

9

9.得到以下界面

10

另外一条消息的信息如下

11

需要关注的是什么呢?wParam和lParam,显然这两个是一个16进制的数,意义不用说也能猜出大概,应该是纪录点击相关的坐标之类的

模拟操作

为何要关注wParam和lParam呢?我们先看看SendMessage和PostMessage的函数原型

没错 大家会发现出现了这两个函数的3,4参数正是wParam和lParam

挫折又现

接下来我们只要写程序模拟一下就行了,但是用PostMessage还是SendMessage呢?

这里引用《C 外挂编写深究》的一段话

“我们可以在以上函数说明中看到。PostMessage 和SendMessage 的最大区别就是。PostMessage 投递完消息后就不管了,不会查找是否收到。是否处理。而SendMessage 函数,等一直等到消息处理完成后,再返回。由此可见,windows 是不可能通过sendmessage 来发送键盘消息的。(事实也正是这样)。因为,每按一个键都要等待处理后返回。那该多浪费时间啊。所以,我们使用的是PostMessage 函数来发送按键消息。”

好吧,我便采用了PostMessage来模拟,但是悲剧的是,没有效果!!!

柳暗花明

难道我只能尝试用驱动的方法了么?等等貌似没有用过SendMessage?

于是我就尝试的用SendMessage来模拟,想不到居然成功了!!!!

这一部分已经包含了外挂的核心代码,接下来需要做的只是图形化的处理了,在此不赘述了。

不过dnf居然直接被FindWindows给弄到句柄了。。。。

结束语

这是我第一次写网游的外挂,模拟挂,虽然基本上和单击没区别,因为没有涉及到网络的部分,但是还是有所收获的,按照目前掌握的东西,写一个自动送礼物的外挂还是有可能办到了~

 

 

 

Code::Blocks Win32GUIProject 生成的界面没有XP Style的解决方法

首先感谢 Lingvo的帮助
大家也看到了上一个程序的界面不是特别漂亮 比ResEdit里面显示的要丑, 这是为什么呢?
多亏了 Lingvo的帮助 还阅读了MSDN文档 各种膜拜。。。

解决方法,目前来说对我有效的是下面描述的方法
新建一个文件YourApp.exe.manifest,内容如下(把YourApp改成你自己应用的名字):

将这个文件放到工程根目录 然后

以上内容加到resource.h中
编译 over
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST “FieldRunnersPlugin.exe.manifest”