抠腚爱揉曼 Coding Iron Man

1Feb/110

速成WOW插件DEBUG-[CWLK-3.3.5-Runevolution]

Posted by Anson

最近在WOW,国服终于开ICC了嘛,怎么也得去见阿傻子一面。10人团已经开到小阿面前,作为一个DPS DK,深感和上一版本的差距,于是从邪血二天一洗成双持传染冰。但这鸟天赋打起来实在太累人,于是就开始寻觅一个符文+疾病+buff的监控插件。还真被我找到个合适的,名字就叫~当当当当~Runevolution。

=== 以上都是废话 ===

这插件有个问题……第一次进是OK的,退出游戏再进后就各种报错,各种google无果之后决定自助解决……毕竟我还是个码农的嘛。

于是先看报错日志,接着翻插件代码,看配置文件,查API。最后终于被我发现Orz的作者把父框体结构直接存入了配置文件,而实际上只应该存放父框体的名字就好了……于是妥妥的加上:GetName()就妥妥的好了,起码看上去是好了,因为咱是速成的所以也不知道有没有后遗症。

总之附件在此,送给Google。Runevolution-3.3.5

Tagged as: No Comments
11Jan/113

原来身份证号是可以自我验证的

Posted by Anson

在Google Reader上别人share的文章看到的,二代身份证号码可以通过一种机制去验真。同样道理的也可以基于这种方式生成伪造的身份证号码,只不过也只能逃过本地验证,联网验证肯定还是死翘翘的。

蛋疼Groovy练手一段:

id = "787416969231782985"

factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] as int[]
results = [1, 0, "x", 9, 8, 7, 6, 5, 4, 3, 2] as String[]

sum = 0
factors.eachWithIndex { factor, i ->
    sum += (id[i] as int) * factor
}

id[17].toLowerCase() == results[sum%11]

各位如果和我一样蛋疼的也可以把id换成自己的身份证号码run一下看看是不是正确。另外附上同样蛋疼的生成脚本一段:

id = ""

factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] as int[]
results = [1, 0, "x", 9, 8, 7, 6, 5, 4, 3, 2] as String[]

sum = 0
random = new Random()
factors.each {
    ide = random.nextInt(10)
    id += ide
    sum += ide * it
}

id += results[sum%11]
Tagged as: 3 Comments
11Jan/110

Project Lombok给力的new feature

Posted by Anson

唔 刚SJ同学推荐了下Project Lombok的新特性,看了下果然V5啊,从此可以和那些乱七八糟的类型声明说byebye了(虽然只是某种程度上)……

简单来说呢 就是用了Lombok后腰不酸腿不疼走路也有劲了我们就有了val,可以像这样:

val map = new HashMap<String, Object>();
// 这东西等效于这样
final HashMap<String, Object> map = new HashMap<String, Object>();

看上去就像scala类型推断似的!但其实没那么强……只能推断你的初始化表达式的类型,而且现在只支持local variable和for each loop中的声明。

真相在这里->Project Lombok,对IDE的支持现在是eclipse和netbeans(with bugs),以及构建时对maven的支持。

BTW:0.9.3的stable包里没有val,在0.10.0-逼她2这个perview包里

Tagged as: No Comments
10Jan/111

一个很简单的JavaBean Validator

Posted by Anson

前几天和同事聊到对于复杂表单提交上来的数据需要校验很是麻烦,想到通过annotation注解校验规则到field上会清晰方便不少,然后查到JSR303就是干这事的,有一个实现是hibernate搞的hibernate-validator

不过既然想到了就顺手实现下试试,因为只是简单尝试,也不顾什么JSR303了,想到哪写到哪,在某需求讨论会上花了半个多小时搞出了下面这个非常简单的Vifix Validator。现在只实现了一个NotNull、一个Regex以及一个可指定自定义validator的annotation。

如果哪位有兴趣看看我的悲催代码的,下载点这里XD->VValidate。工程通过maven3构建,测试在src/test/java/TestDriver.java。

Tagged as: 1 Comment
21Oct/101

0x406D1388

Posted by Jay

神奇的魔数,果断的放弃

Filed under: 抠腚 1 Comment
22Aug/108

做了件有趣的事情

Posted by Anson

有个好友在国内某网站当编辑,他的悲催主管要求他们每一个人在站内要有3个拥有500好友的马甲用来干各种事情……好友便求助于我帮忙点掉一些加好友申请,但本着技术是第一生产力的原则,于是我尝试着分析了下某网站申请加好友的流程并调戏了一把。以前也没有尝试过做类似的事情,所以在这里随便记录一下,具体内容就不说了……不然应该会被看出来是哪个网站……

申请加好友的操作其实很简单,输入一段话和验证码按确定就好了。要模拟这个操作所需要解决的几个问题就是:

  1. 获取到请求地址和参数
  2. 附带用户登录信息发送请求
  3. 绕过验证码

第一点,通过chrome开发者工具或者firebug都可以,抓取浏览器和服务器之间的请求和响应就可以获取到请求地址和参数。稍微分析下参数之后就找出了需要的信息……
第二点,其实只需要在请求的时候把cookie信息一并丢过去就好了,sessionId也是放在cookie里的。通过在chrome的js console里输入document.cookie获取到cookie内容……
第三点,好吧这个其实应该是最麻烦的部分……我从来没关注过这方面的信息,验证码原理什么的OCR什么的完全不懂啊。但是在分析了某网站的验证码机制后发现相当悲催……它在请求验证码的时候把验证码图片以及一个和图片关联的惟一ID传送给浏览器form,然后通过用户输入的验证码和那个惟一ID是否匹配来验证(以上都是我猜的~)。杯具的地方在于这个验证码惟一ID在被验证一次后并没有即时失效,在相当相当相当长的一段时间内,通过那个惟一ID和验证码发起请求都有效(以上也是我猜的~都不知道是不是有失效策略……),于是于是于是~万事俱备,只欠编码~

首先我手动操作发了一个加好友申请,抓取到请求和响应后把请求地址,用户id,验证码以及验证码惟一ID分离出来,把好友给我的活跃用户表格正则表达式提取为一堆数字ID初始化为一个集合。接着要做的事就是拼请求,开连接,丢cookie信息,发起请求获取响应,然后要是乐意的话分析下response的信息,对成功失败以及重复发送申请进行统计……在简单实验了几次成功之后,我就很欢乐的给他的三个用户总过发了3000多个好友申请……就不知道通过率有多少了……

BTW: 程序是用Scala写的,其实也没用什么Scala的特性,主要是拼请求地址之类有一大堆乱七八糟符号的字符串的时候用原始字符串各种好用不用转义……

Filed under: 抠腚 8 Comments
19Aug/101

关于MySQL事务隔离级别

Posted by Anson

好吧,今天查一个问题查了一整天……最后发现其实很简单……不过因为过程很艰辛所以不得不记录一下……

问题场景很简单。有两个互相嵌套的事务1和2,2嵌套在1中。事务2插入了一条数据并提交到数据库,事务1尝试获取事务2插入的数据,然后很杯具的失败了~

相信绝大多数人看到这个场景再结合此文标题就会各种知道然后BS我居然要花掉一整天来查这个问题……是的,现在我也是各种知道但是杯具的是当时我各种不知道……

事情的起因是同事写了一个简单注解驱动的多数据源事务管理,于是就拿过来用,然后在写某单元测试的时候发现了这个问题。当然,我第一反应是……这事务管理器靠谱么……于是开始埋头看他的代码(从这里开始我方向已经跑偏了)。看完他的没看爽,又跑去看了一圈ibatis的代码。看完还是嘛原因没找出来……于是去翻mysql日志……翻完更是祭出了端口监听工具抓包分析……

经过上述种种折腾之后……好吧……它不就是因为MySQL的InnoDB默认的数据隔离级别是Repeatable Read而Oracle之流的大多数数据库都是Read Committed么……我只不过是因为被既然都已经提交到数据库了你凭什么不让我读类似这样的惯性思维所影响了嘛(特别是在询问一个MySQL DBA和一个Oracle DBA都没有给我什么建设性建议的情况下……)~

于是在我很用力的敲下了下面的命令后,世界变得更美好了……

mysql> set global transaction isolation level read committed

Tagged as: 1 Comment
17Aug/104

Scala笔记2

Posted by Anson

最近几天杂事很多,导致那本薄薄的Scala至今未看完……今天先来接一下Scala笔记2

  • Scala的访问控制机制和Java有别。有些许的概念不同而且能够做到更加细粒度的控制。Scala默认访问修饰为public,Java则是微妙的default。Scala中的protected则比Java更小气,它只对自己和派生类可见,同包下的其它类无法访问,而且类也只能访问自己的基类中的protected成员,无法访问继承同样基类的其余派生类中的基类protected成员。Scala对细粒度访问控制体现在private和protected修饰可以通过方括号指定额外的报名或类名来赋权。
16Aug/103

SFINAE

Posted by Jay

什么是SFINAE

在C++中有很多的编程技巧(Trick),SFINAE就是其中一种,他的全义可以翻译为“匹配失败并不是一个错误(Substitution failure is not an error)”。简单来说他就是专门利用编译器匹配失败的一种技巧。

案例

比如我们想实现一个通用的函数叫AnyToString,他可以实现任意类型的数据转成字符串:

template<typename ValueType>
char* AnyToString(const ValueType& value);

我们更希望这个函数能检查ValueType类型自己有没有ToString方法,如果有就直接调用,没有的话就采取通用的处理方案。但是C++没有反射机制,不能像C#那样通过TypeInfo来检查,更没有像Java那样纯粹的OOP,从最基类就定义了ToString方法,下面的子类只用负责重载。
所以我们希望能有一种方法能让C++也能检查某个类型是否定义了某个成员函数,这就可以用到SFINAE。

11Aug/106

Eclipse仿Netbeans配色方案

Posted by Anson

今天把Intellij IDEA、Netbeans的最新版都搞了下来玩了下(主要是想试下它们分别的Scala插件),不过最后还是因为习惯问题屈服与Eclipse的淫威之下……好吧其实大学里的时候我明明还是Netbeans控的,而且感觉Netbeans6.5之后的UI和配色都很符合我的口味,而且Eclipse那像干了的血一样的keyword颜色我也实在审美疲劳了,于是我决定把Netbeans的配色偷过来。

Netbeans的配色其实很简单,黑灰蓝绿棕就这几种颜色,对照着改下还是相当快的,先上截图。

打开Eclipse->Window->Preferences->Java->Editor->Syntax Coloring(当然也可以在Perferences的filter里直接输入Syntax定位)