[原] QNAP和ESXi支持UPS关机

最近搞了i5-7200软路由,把iKuai、LEDE、ubuntu、windows装到了ESXi的虚拟机里,前面两个还好说(写盘不多,断电问题不大),后面两个虚拟机断电可吃不消。于是研究怎么能让ESXi支持UPS下自动关机。
基本照着这篇搞的(不过他应该是Nut Client老版本,核心在于把 UPS server设成: qnapups@qnap的ip地址)

https://www.snbforums.com/threads/using-qnap-ups-server-to-signal-other-devices.17551/

Client NUT pour ESXi 5 et 6

[原] 终极解决QNAP的跨网后ddns问题

上次说的解决方案:https://www.jianshu.com/p/272054ed178b
还是可以工作,不过每次都要手动填挺烦的。最近QNAP ddns的api换ip也挺勤快的。
于是研究了一下:
# nslookup core2.api.myqnapcloud.com | grep ‘Address ‘
Address 1: 52.0.98.168
Address 2: 3.216.22.135
Address 3: 34.235.250.228
Address 4: 107.21.3.202
Address 5: 54.209.222.24
Address 6: 52.201.140.187

再通过lede的uci把上面nslookup出来的ip填到你懂的配置文件里:
# uci add_list 你懂的.@access_control[0].wan_bp_ips=’52.6.174.252’

最终的一行命令如下(吐槽一下BusyBox很多命令或者参数不支持):
# nslookup core2.api.myqnapcloud.com | grep -oE ‘Address \d+: ([^:]{7,16})’ | cut -c12-30 | while read ip; do uci add_lis
t 你懂的.@access_control[0].wan_bp_ips=”$ip”; done; uci commit 你懂的
>>>
uci add_list 你懂的.@access_control[0].wan_bp_ips=107.21.3.202
uci add_list 你懂的.@access_control[0].wan_bp_ips=54.209.222.24
uci add_list 你懂的.@access_control[0].wan_bp_ips=34.235.250.228
uci add_list 你懂的.@access_control[0].wan_bp_ips=52.0.98.168
uci add_list 你懂的.@access_control[0].wan_bp_ips=52.201.140.187
uci add_list 你懂的.@access_control[0].wan_bp_ips=3.216.22.135
uci commit 你懂的

以后就省事了

[原] php按文件时间逆序显示当前目录下的*.pdf

[原] 给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平台是多么强大的视频,看完可以删掉,当然不看也不要紧: