分类存档: Java

APP设计尺寸标准

Android需要的比例

以小米3的设计稿1920*1080属于xxhdpi,一般需要3个版本xxhdpi、 xhdpi、hdpi 比例值如下

xhdpi和xxhdpi是2:3,所以xhdpi对应的是1280*720
hdpi和xxhdpi是1.5:3,所以hdpi对应960*540

小米一代的854*480分辨率,会自己匹配hdpi即960*540(即把hdpi略微缩小)。类似不同尺寸的手机,android都是通 过这样找相邻的,只要保证相邻的比例允许一定程度上的缩放尔不失真即可QQ截图20131118215517QQ截图20131118215526Iphone需要的比例

iphone4&4s            960*640
iphone5&5c&5a     1136*640

参考文章:
android dip px dp 概念介绍:http://blog.csdn.net/dinko321/article/details/7992776
android dpi归一化加载顺序:http://blog.csdn.net/a220315410/article/details/11896189
iphone设计尺寸规范:http://www.yixieshi.com/ucd/13759.html
APP设计尺寸规范:http://www.25xt.com/3645.html

android ant脚本批量打包-依赖别的项目

一个下午都在修改原来的android打包脚本,晚上仔细看了官网文档半小时搞完。╮(╯▽╰)╭

主要问题在于自己的android工程还依赖于第三方的一个工程library。网上不少例子都是完全重写apk的打包过程,不是不好。就是有点啰嗦不好维护。简单的对于依赖第三方的library工程也没说清除。google了这方面资料不多,我也傻劲东查查西找找折腾了一个下午。早应该想到老外如果没有专门讨论这块,就说明官网文档已经说的太明白了,不需要讨论了。

android ant打包说明:http://developer.android.com/tools/projects/projects-cmdline.html

简单说下,在贴自己的脚本。主工程(自己的工程)、第三方library工程这样有2个工程。意味着要写2个build.xml

1. library工程. 在当前路径上,创建一个TARGET为8的lib工程

2. 主工程. 在当前路径上,创建一个名为XXXXXXBuilder,TARGET为8的工程(eg 可以用android list targets 命令查看所有的target),依赖的library相对或绝对路径

另外,没必要像文档离说的那样local.properties和ant.properties要分开写。把所有配置文件写在一个里面也就够了。不然维护起来也不方便

解决了上面问题,多渠道打包就简单了。直接贴xml

 

结束

Java RSA加密

 

Java WebSocket 开发 Webbit

webbit是基于netty扩展的websocket工具。可以大大简化websocket开发。

项目地址:https://github.com/webbit/webbit

使用说明:https://github.com/webbit/webbit/blob/master/README.md

本文权当翻译,高手直接进上面链接

一些题外话:

  1. websocket和我一开始想象的TCP应用不同。websocket和传统意义上的socket通信不一样。本质上还是HTTP的扩展。
  2. websocket协议目前还没有定稿。目前主要有3个版本的协议在使用。且都是草案。webbit都实现了3个草案。具体参阅维基http://en.wikipedia.org/wiki/WebSocket

快速开始

Maven配置

 配置端口8080.并配置websocket路径/socket的handler

 编写/socket handler

到此为止。基本代码已经都好了。感觉更写个servlet一样方便。

下面是客户端代码:

到此为止。websocket基本功能都已经实现。

 

 

netty+flash xmlsocket 在线聊天室

这几天公司做了个简单的web im聊天室。麦包包晒包频道 右下角的“包打听”。

采用netty 做socket server + flash client. 通讯采用自定义的JSON文本。

在线IM初步的探索,现阶段做的比较简单。

目前就部署1台服务器。没有考虑多机通信。没有涉及通信队列。

总共代码不到1000行。netty的确强大。

关键代码分享:

无话可说的代码,netty通用设置。

由于采用JSON协议。

上行通道:

  1. DelimiterBasedFrameDecoder 读取缓存时,已\0\r\n 为中止符
  2. StringDecoder 二进制转字符串进行UTF-8解码
  3. StringEncoder 字符串UTF-8编码

下行通道:

  1. MessageHandler 业务逻辑处理
  2. MessageEncoder JSON转字节流打入下行通道

netty没有提供\0截取。不过重写部分代码即可。

逻辑处理:

  1. 处理flash 的policy file request
  2. 处理业务逻辑

具体业务在    MessageDispatchHandler 处理一些业务逻辑即可。

 

总结下遇到的问题:

  1. flash socket通讯格式。每个协议请求都会\0作为消息结尾。因此netty接收消息也必须以\0为截止符读取消息。
  2. flash 安全策略。flash夸域访问服务器时,会自动发<policy-file-request/> ,服务端收到消息后,必须响应对应策略文件。
  3. SQL注入。Socket和Http相比。只是通讯的层次发生了改变。应用本身的漏洞仍旧没变。处理SQL的时候需要特别注意。不过用一些成熟的ORM框架可以很好的避免这类问题。
    注:这里使用的是比较低级的JSON字符串作为消息载体,较为普遍和靠谱的做法是采用head+body的方式,但前提需要对格式有严格的约定。JSON灵活性较大,因此采用。

zookeeper资料汇集

这几天看了下zookeeper的东西。收获多多。感谢国人的分享精神。使得这一产品能被更多人了解。

zookeeper基础配置与入门:http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/

agapple学习笔记系列:http://agapple.iteye.com/blog/1292473

taobao通用产品团队:http://rdc.taobao.com/team/jm/archives/448

Paxos算法:http://zh.wikipedia.org/zh/Paxos%E7%AE%97%E6%B3%95

工具:https://github.com/killme2008/node-zk-browser 淘宝团队开发的一个zookeeper节点管理工具。nodejs开发。功能简单。基本实现了zookeeper命令行的功能。

文档是最佳的知识沉淀呀~

apache zookeeper

zookeeper

 

 

jmock2学习笔记-续

总结下这几天初步学习mock的心得. 文中大部分内容来自官网文档.

创建Mock对象

创建Mock Expections

expections 这里指的是jmock在不同情况下的预期值。expections 是jmcok的最重要部分之一。可以模拟用户在不同情况下返回不同的结果。

<expections block>这里是可以设置多个expections 。

Expectations

expections的结构如下:

上面是一个通用的结构。所有expecions都采用相同或更简洁的结构。

invocation-count mock调用频率。oneOf表示调用一次后这个expections即失效。
mock-object mock对象。即上面Mockery创建的对象。
method 用mock代替实现接口的一个方法。所以mock必须使用接口编程。
argument-constraints mock参数条件。即mock指定方法的参数。
when … will…then … 类似于if .. else… 这样的语句。简单的条件表达式
action mock符合条件后,执行操作。一般是返回结果。或者抛出异常
state-machine 条件表达式。

下面详细讲解下expectations各个部分。

Invocation Count

oneOf 只执行一次
exactly(n).of 执行指定n次
atLeast(n).of 至少执行n次
atMost(n).of 最多执行n次
between(min,max).of 可以执行min-max次
allowing 允许执行,不受限制
ignoring 功能同allowing类似。这里主要字面上区分allowing
never 不允许执行

Actions

will(returnValue(v)) 返回一个值。Object类型任意。集合类型不建议这里返回。虽然也可以
will(returnIterator(c)) 返回一个集合类型的值。
will(returnIterator(v1, v2, …, vn)) 返回一个集合类型的值。可以用多个,来分隔。
will(throwException(e)) 抛出一个异常。
will(doAll(a1, a2, …, an)) 嵌套执行多个actoin。不常用。

Sequences

设定mock方法调用的顺序。简单的看下面代码片段。
定义了先save后countUser。调用的时候也必须找这个顺序。否则用例失败。

jmock2学习笔记

目前晚上学习jmock。

Issue: spring+annotations使用jmock

遇到了这个场景。stackoverflow上有人问过这个问题,这里贴一下。

http://stackoverflow.com/questions/1638911/mock-object-and-spring-annotations

关键是使用ReflectionTestUtils的方法。这个方法在spring-test工程的相关jar包。

Issue:入参对象时。mock表达式传入对象必须和实际传入对象为同一句柄。

共用一个_user句柄。否则报错。

Issues:jmock一个异常错误

推荐链接:http://superleo.iteye.com/blog/143493

相关:jmock2学习笔记-续

慎用gson

今天是辛苦1个半月代金券上线的日子。但很不幸。因为线上环境和预发布环境存在不一致问题。导致本次发布失败!

抓取到错误的日志。如下:

问题在gson解析json时间时,出错。但日志显示。出差的地方是2011-07-05 17:41:12。

经过部门同事帮忙,找到原因:线上环境采用en_US.UTF-8编码。线下环境一直用的是zh_CN.UTF-8编码。

Gson默认会使用系统环境的时间解析器来解析时间.显然en_US.UTF-8和zh_CN.UTF-8的默认时间不一致。修改代码如下,可以修复问题

 

建议使用fastjson替代gson. 相关的问题会少很多~

android自定义弹出框(AlertDialog)

网上搜到的一片文章,非常不错. 看一眼就能明白如何操作. 直接贴代码:

原文链接:http://www.androidpeople.com/android-dialog-input-text/