分类目录归档:Technology

IT

[原] 给paoding-rose添加动态编译实现ParamResolver的功能

通过javassist,添加了动态编译解析参数类的功能。记录一下主要目的和原理:
目的:动态解析传入参数组合成类。
最后达到的效果:

主要是为了能自动获取DataTables传入的参数:

过程:最初修改自wanghaomiao的blog(以下2-6条)。原文是用java的反射机制,我加入了7-9条,实现了动态编译解析器类。

原理:rose的ParamResolver接口提供了supports和resolve方法,在supports判断某个类是否支持解析,resolve里实现解析。我引入了一个WebBean注解,通过是否加注了WebBean来判断。如果加注了,就用ResolverHelper来实现动态编译。

动态编译核心代码:

附动态生成的解析类主要方法(支持嵌套、支持List、暂支持int long boolean)

[原] paoding-rose获取spring的ApplicationContext

刚开始用rose,因为有些服务是在线程里的,需要getBean。
试了好几个办法,都没法得到spring的ApplicationContext,
比如实现 ApplicationContextAware 结果没Aware。
有一个解决办法是所有线程里用到的依赖都在new的时候传递进去(也是rose作者推荐的方案),不过有时候比较麻烦,比如依赖很多很多,参数一大串;或者临时测一下,又要写一堆@Autowired
另外wangqiaowqo(rose作者之一)在blog里写了通过 new RoseAppContext(); 的方法,实际使用发现这种方式相当于把spring又重启了一遍,所有服务都会重新init,有可能导致严重问题。
有没有办法实现类似一个App.getBean()这种方法呢。
我试了一下,是可以得到最初spring启动环境的那个ApplicationContext的,方法如下(有点绕哦,因为@Autowired不能注解static成员,就把app本身从ApplicationContext中getBean):

其实核心是

[原] JarClassLoader在mac下无法加载native library的问题

JarClassLoader配合maven把所有依赖打包在一起,还是很方便的。不过在mac下发现无法加载native library。
通过跟踪JarClassLoader运行,发现主要原因是:System.mapLibraryName returns suffix ‘dylib’ and not ‘jnilib’ using JDK 7/8 on OS X

解决:
1)复制一份.dylib,or
2)判断下把.dylib的后缀改为.jnilib

[原] 利用java8的新特性lambda和stream处理list转为map

一个需求是这样:根据list,转为map。
假设List,map的key为User.getId(),value显而易见为User
java8以前得这样写:

java8利用lambda和stream这样即可,还是挺方便的:

看起来复杂,好处是支持泛型。如

[原] 利用mac下的截屏命令和ImageMagick生成gif动画

想截个屏幕上固定区域做出gif,下了个好评的截屏软件,不能连续截屏,不能生成动画,还免费3天,坑爹。
自己用AppleScript调用截屏命令搞吧:

这样每隔0.5秒截一张图,然后用ImageMagick转成gif:

[原] 去除list里面所有元素的空格

# 去除list里面的空格

测试:

这里e和f之间是全角空格哦,python3可以直接去除,python2会变成’e\xe3\x80\x80f’

其实,我主要是来测试blog搬迁后是否正常的。

[原] 配置linux iptables NAT方式端口映射远程桌面到内网windows

好吧,标题比较拗口。想象这样一种场景:
外网—-linux(可以是路由器、也可以是物理机)—-内网—-windows
那么外网怎么能远程桌面到内网的windows呢,简单来说,就是通过配置linux的nat端口映射到windows的3389端口:

默认linux没有开启转发,需要先开启:

[原] 终于调通robotlegs框架了,纪念一下并几个注意点

好久没搞技术了,趁长假好好搞了一把,搞了什么呢,居然是AS3。。。
为什么是AS3呢,据说挺好的,虽然感觉越来越不行了。
另外看看这篇,好像挺有意思:Flash is dead, long live OpenFL! – Gamasutra

回到正题,关于robotlegs,可以先看看中文的介绍:ROBOTLEGS轻量级AS3框架
不过,这一篇对应的robotlegs版本应该是比较老的了,很多现在写法都变了。
所以最终还是要看robotlegs-framework
我也是新手上路,就碰到的几个注意问题写一下,后面可能会不断补充,也可能就此太监。

1)针对interface的inject问题:

还可以支持同时多个实现:

2)自定义Event链不触发或者丢数据问题,一定要override clone()函数(搞死我了):

3)view都要搞个Mediator,表示很蛋疼。在Mediator里重新dispatch view的消息:

而不要直接去view.button.addEventListener,因为通过Mediator的addViewListener,容器会负责清扫消息绑定(解绑),如果自己addEventListener必须在销毁的时候remove,不然因为存在引用gc不了,你懂的。

睡觉

[原] IntelliJ IDEA 编译Flash/Flex项目出错的原因

完全照着这个教程来:
Developing, running and packaging AIR mobile applications for Android
发现编译的时候报错:

百撕不得骑姐,后来发现项目所在的全目录里不能有中文,只好在根目录下用了个mklink指过去,OK~
测试一下英语语法:The full path of your project cannot contain any non-latin characters.

[原] Win7下Adobe Flash Builder 4.7 安装后瘦身的简单办法

C盘是块64G的SSD,开发工具越来越大,装得也越来越多,快撑爆了。
Adobe Flash Builder 4.7装完后超过2G,简单瘦身后是500余M。
其实很简单,利用win7的mklink创建软目录(目录指向重复安装的东西):
这里 C:\bianbian 是我安装开发工具的目录,默认是 C:\Program Files
1)jre,因为java的jdk里有(如果你没有装过jdk或jre,则跳过这步),所以:

2)flex SDK,4.7自带了flex 3.?和flex 4.6的sdk,太老了。现在apache Flex SDK都到4.13了

3)air sdk,(如果你没有装过air sdk,则跳过这步。我是下载Adobe上最新的air sdk(15.0)替换到apache Flex SDK里面的air sdk,因为Flex SDK带的air sdk一般比较老)。这里可以省出几百兆:

4)好吧,有个介绍Air平台是多么强大的视频,看完可以删掉,当然不看也不要紧:

[原] win7下启用无线网卡的wifi热点功能

原来还通过路由器刷openwrt然后刷一堆东西抓包,现在不用了,用win7自带的wifi热点吧
代码如下:

[唉] 又被垃圾评论攻占了,开启注册用户才能发表评论

上月信用卡莫名刷出了美金,还百撕不得骑姐呢。。。
看了账单才知道是Amazon的aws ec2主机扣了我的费用,才知道原来ec2的免费策略是有各种各样限额的。
包括流量、IO。。。
一般是不会超的,不过要是也像我这种情况,被垃圾评论攻占的话。。。
ec的免费IO是一个月2百万次,但是怎么算IO呢,嗯,open一次算一次。
我给你解释一下一条垃圾评论大概会占用几次IO:
众所周知php为进程退出就清空所有上下文模式,所以一个访问:
看你include了多少php文件,就有几次IO,插件判断是垃圾评论吧,访问数据库吧,web日志,。。。

现在不得不开启注册用户才能发表评论模式了,然后注册表单里用了google的reCAPTCHA,先看看顶不顶得住。
附图一张:
anti-spam

其实我在此之前还写了个脚本自动添加Spam的ip到iptables的禁封列表里,结果发现太长了这个列表,会搞得服务器卡的一笔。贴在这里看需要的朋友吧:

另外这个主题的作者是根据Akismet的spam清单里的ip地址来过滤的(不过他放到了nginx的deny ip里,其实也可以,不过iptables可能更前端一些)

[原] 几个Win7版chrome的cache目录指向链接

chrome的所有用户data目录:
C:\Users\bianbian\AppData\Local\Google\Chrome\User Data\Default
上面bianbian替换成你的用户名
因为我的R:盘是内存盘,所以把几个cache目录全指过去:

[原] ubuntu下重装mysql

好吧,记不清什么原因了,似乎是用apt-get remove mysql-server卸掉了mysql,然后手动删除了部分mysql的配置文件(好吧,先鄙视自己不用apt-get purge)
不过后来又要用到,于是再install,这时候死活装不上。
基本错误是这样,提示install成功了,不过起不来:
service mysql start start: Rejected send message

然后用apt-get remove mysql-server mysql-client,就install不了了:

好吧,它提示/etc/init.d/mysql找不到,后来搜了一下,假装给他一个:

再次 apt-get remove –purge mysql-server mysql-client
总算清掉了,再一次安装成功:

[原] IDL关于数字值域的注意点

IDL默认方式的数字是短整型(16-bit int)。所以如下的声明方式其实是报错的:

因为,1024*32=32768,超过了短整型上限(32767),从二进制码基础可知会跳到该类型的另一头,即:

这时有两种解决办法,一种显示声明为Long(32-bit int),即数字后面跟上L:

另外一种事先声明:

idl2参见文档,记得是编译开关:1)把所有数字作为Long型 2)用中括号表示数组下标,即[]
http://www.exelisvis.com/docs/COMPILE_OPT.html