不舒服
为什么会有不舒服的感觉?这些东西是我想要的吗?不是,那不舒服个毛线?
可能最近事情太多太累了吧。。
关于单元测试的Mock
Groovy Mock
- Groovy的MockFor可以mock构造方法,这样Groovy就几乎不需要依赖PowerMock来做mock了。
- Groovy的MockFor可以在main里面跑,而PowerMock和Grails的mockFor只能在JUnit里跑。
- Groovy的MockFor可以在一个case里对一个方法mock多次,包括构造方法。
- 可以嵌套use的闭包来解决一个case里有多个类需要mock的情况。
- 默认情况下use闭包里必须且只能调用demand里定义的方法,但是可以在use之前用ignore来指定哪些方法需要被忽略(即调用实际类的方法)。
- MyClass.metaClass.static.doMethod的方式不能mock private的静态方法,public/protected可以。myClassInstance.metaClass.doMethod可以mock实例的私有非静态方法。demand方式可以mock private的静态方法。
- metaClass = null可以使metaClass的mock失效。
- demand和metaClass方式可以给被mock的类增加不存在的方法。
- 用demand来mock静态方法的时候可以不写static。
- 类的metaClass来mock静态方法必须写static,实例的metaClass来mock静态方法可以不写static,但是实例的metaClass只对当前实例的static方法生效。
- (待验证)MockFor mock = new MockFor(MyClass.class, true);第二个参数为true的时候,表示允许mock构造函数。如果在use里面(包括被测试类内部)有显式调用MyClass构造方法的话,必须显式mock构造方法。如果显式mock构造方法的话,要在mock之前(demand.with闭包之前)创建实例,并在mock的构造方法里返回这个实例,而不能现场new出来返回。
- mock final属性,这里要利用Groovy的一个特性,就是用点(.)访问一个属性(property)的时候,是等同于调用这个属性的getter方法(getProperty)的,因此可以通过给目标类增加该属性的getter方法达到mock该属性的目的。
- Mock的作用范围:如果放在单元测试里,那Mock的作用范围是当前类,如果所有测试放在一个suite里跑,那Mock的作用范围就是整个suite,因此如果不加以注意极易造成上一个case里的Mock影响下一个case的情况。所以在Mock的时候,必须要注意及时使metaClass和demand等永久生效的Mock还原。
PowerMock
- PowerMock的"value = "可以不用写。
- PowerMock来mock静态方法的时候,可以用mockStatic(Class<?> type),该方法忽略被mock的静态方法的public/private/protected关键字。
又好久没写了
想想写些什么
在android代码里执行shell命令
Process process = Runtime.getRuntime().exec(cmd);
可以执行su,但是不能执行chmod这些命令。
刚网上找到个例子,提供了新思路,他是从system/bin/sh力创建一个Process,获取p的输出流,往流里写命令,相当于创建shell再往里输命令一样。
Process proc = null;
关于工作和找工作(二)
taobao说我通过面试了。
对于外包:
虽然很高兴有机会在我喜欢的公司工作,但是,我不是淘宝的员工,在淘宝工作而已,就是所谓的人事外包。
没有这家外包公司,我可能还在找工作。
而且我相信这种身份只是暂时的,已经挤进淘宝了就会有机会,我想我会适应新工作的,而且我觉得我适合这份工作。
整个阿里今年净增不超过200个人,我得挤进去。
对于新工作:
出乎我意料的是,TL没有让我用我擅长的东西,而是让我去了解一个我从来没听说过的东西,说用这个做开发。
嗯,他总有他的理由,这个跟我没有必然的联系,一方面,把事情做好才是最重要的。这让我想到了大三在灵通实习的时候,当时一起实习的同学向我抱怨,说做的东西没技术含量,不想做,我说你把你的任务漂亮完成了自然会让别人对你刮目相看,你才会有机会接触到更深层次的东西,简单的事情都做不好别人怎么放心让你做复杂的事?这是态度问题。另一方面,作为新人,本着谦虚谨慎的态度,可能会更好一点,否则一来就唱反调,那200个人里估计就没我了。但是我可以保留意见,等这个项目过去之后再来评估得失,或者说到底哪种工作方式更适合我。
然后我只用了2天时间就把这个新玩意弄明白了,这个速度比我想象的要快。当时面试的时候TL问我如果有一样新的东西让我学,需要用多久,我说一周。
不谦虚一下,坐在我对面的几个小伙子,水平未必比我强很多,至少我接触的东西比他们要多不少。
第一个项目必须漂亮地搞定。我需要证明自己的价值,但是不能急着证明自己的价值。借用左爷一句话:做人要低调,做事要高调。
回过来说一下基础,基础扎实并不仅说对某样或某些只是有多了解,还表现在在这个基础之上对更深层次知识的理解和吸收得心应手表示毫无难度和压力的状态。
一年扔掉外包的身份,三年到P7。有目标做事会更有效率。
啊,那时我32岁了。
即将TB
目标很明确。
给自己一年时间。
50%
“是王禺吗?我这里是淘宝,首先恭喜你通过面试,这里有些信息需要您提供一下……”
新浪微博尾巴
大小写敏感
①MOTO锋芒智能手机 ②XT910 ③ motorola
① MOTO锋丽智能手机 ②XT615 ③motorola
① HTC灵感 ②HTC Z710t ③HTC
① HTC灵感XL.urBeats ②HTC Sensation XL with Beats Audio X315e ③HTC
① HTC灵感XE.urBeats ②HTC Sensation XE with Beats Audio Z715e ③HTC
① 三星GalaxyNote ②GT-I9220 ③samsung
① 小米手机 ②MI-ONE Plus ③Xiaomi
① 华为云手机 ②C8650 ③HUAWEI
spring AOP的实现方式
- ProxyFactoryBean
- BeanNameAutoProxyCreator
- <aop:config>
- @AspectJ/注解
<aop:config>风格的配一置使得 Spring auto-proxying 机制的使用变得很笨重。如果你已经通过 BeanNameAutoProxyCreator 或类似的东西显式使用alto-proxying ,它可能会导致问题(例如通知没有被织入)。推荐的使用模式是仅仅使用<aop:config>风格,或一行仅仅使用AltoProxycreator风格。
org.springframework.beans.MutablePropertyValues.add
2.5的包和3.0的包共存。删掉2.5的。
关于工作和找工作(一)
终于离开了呆了3年的火星,我又踏上了求职的道路。其实这里不应该用“又”字,因为之前的工作都不是“求”职。
再被阿里系灭了N遍后,我得到了一个现场面试的机会。虽然目前不知道具体的结果,不过我预感要遭。
基本上,年后一直在碰壁。
跟朋友聊,我说,之前的工作都来得太顺利,我需要一些挫折来让自己明白自己的分量。大学毕业直接进研究所,研究所出来直接去火星,当然途中有一些所谓的面试,但是也偶读没当回事也就没认真对待。
好多人对我说,你有实力,你是人才,慢慢的我就飘飘了,相信了这些东西。
实际上我有力,但是不一定有实力;是个人,但是不一定是人才。
现在真正作为一个社会人,真刀真&枪去跟别人竞争,才发现有心无力。
对我来说,工作并不单是为了赚钱,虽然钱也很重要,而是让自己有事情做,一种需要,不游手好闲浪费粮食,不危害和报复社会。在家西久了会烦躁起来。
关于心态,被灭肯定是不爽的,但是技不如人这个也不得不承认,火星3年的进步比别人慢这也是咎由自取。
那天下午去了淘宝某个办公区,心想这才是我喜欢的IT企业。虽然没有马云吹的那种敲锣打鼓,但是氛围相当的和谐。
这就是我想要去的地方。
但是我喜欢淘宝,淘宝未必喜欢我。
淘宝或者阿里巴巴我肯定是要去一趟的。
这次不行还有下次,大不了其他地方再呆段时间把该补的地方补起来再来过。
对自己来说也算是一种历练,这是第一次,但不会是最后一次,以后钉子还多的是。
跟看书一样,备而不用而已,厚积薄发。
心态平和,切忌眼高手低。
关于妹子和认识妹子
不得不面对的事情,今年是虚岁奔三的最后一年了,明年就奔四了,好华丽啊,要一枝花了。
然后另一件不得不面对的事情,就是至今孤身一人。正月吃饭各种询问各种催,我一概回答:不清楚,不知道,不要问我。
慢慢的,已经不怎么拒绝朋友们的好意了,也算给自己一个机会。
@左爷 那天说了句话,说:“你觉得再过两三年现在为你准备的妹子们还在吗?”,非常实际,看起来确实是不能再拖了
但是,意愿归意愿,意愿等于现实那世界上也就不存在那么多悲剧了,所以悲剧肯定是有的。
有了目标,接下来的就是要相互了解。
我忽然觉得搭讪就是一项与生俱来的技能,而我没有这项技能,并且加点的按钮是灰色的。
和一个不认识的人聊天,找话头是件相当有技术含量的事情,要满足以下所有要求:有话题,能让对方接得下去,不能让对方产生不适的感觉,否则立马冷场。
这就是悲剧的原因之一,基本上在陌生人面前我都是沉默的,只有跟@知秋 见面那次例外,聊到最后都拍桌子,真泥马一见如故。
但是并不是说,见面了就能解决这个问题。因为一见面,别人就能看到你长得怎么样,一看你长得丑就免谈了,这是悲剧原因之二。对于“丑”这件事,一千个人有一千个丑的定义,我觉得我会被包括在其中大多数的定义里。在这里要感谢下表妹@蘑菇 和@知秋 的安慰……
有人说,妹子都是追到手的。在一定程度上我同意这个观点,另一定程度上我保留意见,这句话是有适用前提的。
比如,和妹子认识,然后妹子也不讨厌,然后才有各种追求的可能,这就完全没有问题。
但是,反过来想一下,一个毫无感觉甚至不喜欢的人,天天主动,烦不烦?这就不是主动追求了,而是死缠烂打。
好吧这是两个极端,如果某件不好的事情有一定概率发生,我在考虑这个事情的影响的时候,会适当提高这个概率,比如“妹子会烦”这件事情。
所以我觉得还是那种长时间的相处会比较适合我,但是一般情况下,就会马上想到@左爷 那句话,@艿总 更加斩钉截铁:不可能。
反正当前,妹子的priority不高,缓一下就缓一下吧。
选段(三十三)
Tonic() 22:53:38
不是。。我说你也会收到那么大的红包么
七() 22:54:53
不会..我要积德..
七() 22:55:25
听说红娘成事儿能积德
Tonic() 22:55:39
好吧。。今年双立春,积分加倍哦
七() 22:56:19
包邮么,亲
Tonic() 22:56:43
是的。我前年介绍失败,运被了一年
七() 22:57:31
为什么不早告诉我。。
Tonic() 22:57:40
介绍有风险,牵线须谨慎
七() 22:58:02
我买机票去了。。我回家行么
七() 22:58:27
Tonic...
Tonic() 22:58:50
我觉的我的悲剧是小概率事件。。因为我向他们索要ipad
七() 22:58:56
你不厚道...
七() 22:59:24
对!这因为这个!
Tonic() 22:59:33
你没要东西应该不需要承担风险
七() 22:59:51
我不要,我什么都不要了...
(来自iPhone QQ:http://mobile.qq.com)
Tonic() 23:00:11
嗯。。那估计没问题
七() 23:00:40
还能积德不
Tonic() 23:01:47
这个人积分要实名制的吧
Tonic() 23:02:24
就跟你拜佛一样 你要默念自己的籍贯
Transaction
原子性、一致性、分离性、持久性。
隔离级别:未提交读、已提交读、可重复读、可序列化
泥马基础都忘掉了。。。
在此输入标题2
我的踟蹰来自对不可控的未来的恐惧,但是这却是个悖论。
事物总归有正反两面,而我却下意识地将负面放大了。
在此输入标题
任何人都可以认为我很厉害,有水平,但唯独自己不能这么认为,而且永远不能这么认为。
保持谦虚的同时,保持自信和乐观。
光驱维修记
上周买了光驱位硬盘槽,然后开机状态下把光驱拔了下来,把插槽换上去,发现里面的硬盘不转。
(光驱位的设备是可以热插拔的)
再把光驱换回去,光驱也不转,也弹不出来。
bios里也都不认,推断是供电问题,因为如果电源正常那么光驱是一定能弹出来的。
想可能是把光驱的时候把主板拔坏了,如果这个假设成立,那主板接口的电压一定是有问题的。
用万用表量,电压分别是3.3V,5+V,5+V,0,地线,地线。
然后需要确定光驱的供电接口的针脚定义,可是网上找了一大圈,没找到。然后想到那个光驱位的硬盘槽,它是把光驱接口转换成硬盘接口的,根据走线和硬盘电源的定义,就能反推出光驱接口的定义。
结果是,1、4脚空置,2、3脚短接并为硬盘供电,即是说,只要主板上2、3脚的5V供电正常,硬盘理论上是能工作的。
上面测量结果显示主板电压正常,但硬盘却不工作,那最大可能就是主板上的插口坏了。而且如果插口坏,那光驱多半也是不能工作的。
----------------------------------------------------------------
中午光驱好了一会,又坏了,看来确实是接触问题。
dell官方回了邮件,建议我给主板放电或者重置bios,于是选择给主板放电,然后再开机,发现光驱好了。
然后我移除了光驱,换上硬盘,不转,再换回光驱,也不转。
这就排除了接口的问题。
于是还是把硬盘放上去,重置bios,重启,硬盘转了。
----------------------------------------------------------------
结论:光驱位的设备不支持热插拔!!!坑爹啊,XP下都能热插拔的,甚至原来ide口的设备都支持热插拔,尼玛win7和sata却不支持。
分代
年轻代,年老代,持久代
Scavenge GC
- 新对象生成,并且在Eden申请空间失败时
Full GC
-
年老代(Tenured)被写满
-
持久代(Perm)被写满
-
System.gc()被显示调用
安卓传感器
| int | TYPE_ACCELEROMETER | A constant describing an accelerometer sensor type. |
| int | TYPE_ALL | A constant describing all sensor types. |
| int | TYPE_AMBIENT_TEMPERATURE | A constant describing an ambient temperature sensor type |
| int | TYPE_GRAVITY | A constant describing a gravity sensor type. |
| int | TYPE_GYROSCOPE | A constant describing a gyroscope sensor type |
| int | TYPE_LIGHT | A constant describing an light sensor type. |
| int | TYPE_LINEAR_ACCELERATION | A constant describing a linear acceleration sensor type. |
| int | TYPE_MAGNETIC_FIELD | A constant describing a magnetic field sensor type. |
| int | TYPE_ORIENTATION | This constant is deprecated. use SensorManager.getOrientation() instead. |
| int | TYPE_PRESSURE | A constant describing a pressure sensor type |
| int | TYPE_PROXIMITY | A constant describing an proximity sensor type. |
| int | TYPE_RELATIVE_HUMIDITY | A constant describing a relative humidity sensor type. |
| int | TYPE_ROTATION_VECTOR | A constant describing a rotation vector sensor type. |
| int | TYPE_TEMPERATURE | This constant is deprecated. use Sensor.TYPE_AMBIENT_TEMPERATURE instead. |
http://developer.android.com/reference/android/hardware/SensorEvent.html
选段 番外篇(十二)
小左 23:08:56
很晕啊
!王悠揚 23:09:21
有吗
小左 23:09:30
没有
。。。
小左 23:12:09
人呢
!王悠揚 23:12:26
在
小左 23:12:33
给点回应啊
!王悠揚 23:12:41
你只要跟我讲晕的地方。。
小左 23:13:06
你要回应我才好讲下去啊
小左 23:13:11
人是交流的动物
!王悠揚 23:13:34
因为每次你讲关键点之前都有很多铺垫。。。
小左 23:13:39
对啊
小左 23:13:48
这样关键点才突出
!王悠揚 23:14:01
那样会让人失去兴致
小左 23:14:18
直接亮关键点就没意思啦
!王悠揚 23:14:38
开门见山 节省时间
!王悠揚 23:14:47
交流效率显著提高
小左 23:15:07
看来跟工科的人不能用我这样的叙事方式
!王悠揚 23:15:29
工科的人一般没兴趣听铺垫。。。
apk手工签名
java -jar signapk.jar [.x509.pem filename] [.pk8 filename] [unsigned apk filename] [ signed apk filename]
修改安卓手机的开关机动画和铃声
bootanimation.zip的文件格式
大家看到这是个zip压缩包,这个包是无损压缩的,就是说自己在打包的时候,要选择“存储”。
然后里面有至少1个目录和1个desc.txt文件。
目录里放的是一组按文件名排序(至少我看到的都是文件名编码排序)的图片,可以是png也可以是jpg,能不能是gif或bmp不知道大家可以试试,这一组图片就是第二屏开机动画的帧。
然后再来看desc.txt文件,这个文件控制了动画的播放进程,打开这个txt(建议用写字板或者其他文本编辑器打开,不要用系统自带notepad,因为notepad打开只显示一行),可以看到类似以下内容:
540 960 15
p 1 1 android
第一行是屏幕分辨率和播放的速率(帧数,每秒放几张),
第二行p表示play就是播放,第一个1表示循环1遍(0表示循环播放),第二个1表示每帧的时长为1帧(如果是2,就是说15帧的话要放2秒钟),最后个android表示图片所在的目录。
有时候这个文件会有3行(比如某些原版的rom),第三行内容和第二行类似:
p 1 1 beats
就是说android目录里面的放一遍以后,再把beats目录里的放一遍。所以理论上第二屏动画可以放很多段进去。
关机动画的格式
关机动画默认文件名是downanimation.zip,文件格式和bootanimation.zip是完全一样的。
讲一下开机音乐
开机音乐默认文件名是android_audio.mp3
(插播,其实文件名都是浮云,都是能改的,网上的帖子说的修改方式其实都是在假设某种默认情况成立的前提下的修改方案。)
不出意外的话,只要把这些文件统统扔进
\system\customize\resource
就OK了,嗯?不行?那试试扔到
\system\media
里,嗯还不行?好吧,你跟我的情况一样,rom被修改过了,参照以下方式修改:
找到
\system\customize\CID\default.xml这个文件(肯定有,别说找不到),用文本编辑器打开(这里可以用notepad),然后在快结束的地方,会有这样的代码,注意红色标出的部分,大家懂的,我就不解释了,按需修改,替换,重启,有了。
<BootConfiguration>
<BootAnimation animation="/system/customize/resource/bootanimation.zip" audio="/system/customize/resource/android_audio.mp3" />
</BootConfiguration>
<ShutdownConfiguration>
<ShutdownAnimation image_png="/system/customize/resource/downanimation.zip" image="" fps="15" />
</ShutdownConfiguration>
大家可以试试把动画包换成其他文件名比如 GrassMudHorse.zip之类……
最后注意一下(这些都是未经试验的,请谨慎试验)
1、ShutdownAnimation 配置项有一个fps="15"的属性,我不知道这里的fps和desc.txt里面的帧数设置哪个优先级高,我没试过。
2、ShutdownAnimation 配置项还有一个image_png的属性,注意看png,我也不知道是不是关机动画只支持png格式的图片。
3、理论上ShutdownAnimation 配置项还可以增加audio属性(如下),给你的关机画面也加上音乐,同样我也没试过。
<ShutdownAnimation image_png="/system/customize/resource/downanimation.zip" audio="/system/customize/resource/youraudioname.mp3" fps="15" />
最后,我觉得完全可以做一个修改开关机动画音乐的软件出来~因为原理实在是很简单。。。
