swoole phalconPHP 你该选择哪个

最近看到PHP的框架和各种扩展开了花,而在使用这些扩展或者框架的时候,先有人提出了这样一个疑问,swoole phalconPHP 你该选择哪个?其实提出这个问题的人,估计是对框架不是很熟悉。

有人把swoole和phalconPHP都当框架来说,我觉得,这两个都是c写的,叫扩展可能更好理解。或者是说,当你听到这是扩展的时候,你要意识到,这是要安装的(没有独立服务器或者vps,还是玩不了的),这样或许会更好一点,以为php的框架大部分都是php写的,放在源码目录里面,就跑起来了,而这两个刚刚好都不可以哦!所以我想叫扩展就可以了。

关于这两个扩展的使用场合,我想给大家说下:

swoole:更准确的说,是带了php语言的 nginx 或者 apache,主要是他自己会(或者说,他更适合)处理外网直接发给他的请求,这个时候,可以忽略nginx或者apache等。不需要在做代理了。而且他增加了很多与网络通讯有关的东西!让他自己可以处理很多来自网络的东西(php本来是可以的,只是不够方便,所以很少人会这么用,至少我是用过的,从php5开始,就用他来采集数据,发送数据,监听和处理个个采集器发过来的数据等(⊙﹏⊙)b),所以说php也是可以的,只是没有那么方便,没有处理websocket等(swoole就有了)!

phalconPHP:这个比较像常见的框架,主要提供了一个MVC开发程序的结构,让你在这个结构内,像拼积木一样拼出一个网站或者是说项目来,应该说是一种开发思想或者开发模式上的封装。没有提供新的功能。一切还是原来的那个php。

至于选择,phalconPHP我用过,挺不错的!尤其是他的模板引擎,写起来蛮方便的!个人感觉比smarty好用点,因为我只用过这两个,至于thinkPHP自带的模板,我觉得不好用,所以也不想用!

至于swoole,我觉得这个,可以和很多 框架混用,这样就可以使用 websocket 和 mvc 编程了(感觉叫mc可能更贴切,以为 websocket 的view好像基本给 js 做了,难得跑到服务器来处理)。

呵呵,关于 swoole 的 websocket那一块,最近是没有去实验,因为最近在用 go 来做服务器端。有空看下能不能尝试下,再发给大家试试

openssl自签名证书生成与单双向验证

什么是CA:

CA(Certificate Authority)是数字证书认证中心的简称,是指发放、管理、废除数字证书的机构。

CA的作用是检查证书持有者身份的合法性,并签发证书(在证书上签字),以防证书被伪造或篡改,以及对证书和密钥进行管理。

SSL证书中DN(Distiguish Name)识别名的结构:

遵循X.509标准,标识名的目的就是为每个网络实体提供一个唯一的名字。为了达到这一目的,DN有一种分层结构。一个DN由一些列的RDN(Relative distinguished name,相对标识名)构成。

RDN的乘此结构依次为:

C = US, ST = Beijing, L = Beijing, O = RTFM, OU = Consulting, CN = Eric

(C->Country, ST-> State or Provice Name, L->Locality Name, O->Organization, OU->Organization Unit, CN->Common Name)

生成自签名证书的步骤:

一、建立CA:

  1. 在任意目录建立文件夹,文件夹名称任意

/home/gouxu/gx/key/

  1. 进入到新建立的文件夹key

cd /home/gouxu/gx/key/

  1. 生成CA私钥

openssl genrsa -out ca.key 2048

参数说明:

genrsa:生成rsa秘钥;

-out ca.key 生成的秘钥文件为ca.key;

2048: 秘钥长度为2048.

  1. 用CA私钥生成CA的证书

openssl req -new -x509 -days 36500 -key ca.key -out ca.crt -subj “/C=CN/ST=Beijing/L=Beijing/O=Teamsun/OU=Teamsun”

(-x509选项会生成自签名证书。)

  1. 建立CA相应目录

进入到key文件夹执行如下命令:

mkdir demoCA

cd demoCA/

mkdir newcerts

touch index.txt

echo ’01’ > serial

二、生成server端证书

  1. 进入key文件夹

cd key/

  1. 生成server私钥

openssl genrsa -out server.key 2048

  1. 使用server私钥生成server端证书请求文件

openssl req -new -key server.key -out server.csr -subj “/C=CN/ST=Beijing/L=Beijing/O=Teamsun/OU=guoxu/CN=guoxu”

(没有-x509选项则生成证书请求文件。)

  1. 使用server证书请求文件通过CA生成自签名证书

openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

  1. 验证server证书

gouxu@gouxu-pc:~/gx/key$ openssl verify -CAfile ca.crt server.crt

server.crt: OK

gouxu@gouxu-pc:~/gx/key$

三、双向认证需要生成client证书

  1. 进入key文件夹

cd key/

  1. 生成client私钥

openssl genrsa -out client.key 2048

  1. 使用client私钥生成client端证书请求文件

openssl req -new -key client.key -out client.csr -subj “/C=CN/ST=Beijing/L=Beijing/O=Teamsun/OU=guog/CN=guog”

注意:如果出现如下错误需要更改OU域与CN域重新生成证书请求文件。

Sign the certificate? [y/n]:y

failed to update database

TXT_DB error number 2

  1. 使用client证书请求文件生成自签名证书

openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key

  1. 验证client证书

gouxu@gouxu-pc:~/gx/test$ openssl verify -CAfile ca.crt client.crt

client.crt: OK

gouxu@gouxu-pc:~/gx/test$

四、测试

4.1 使用server证书测试单向认证

  1. 打开窗口1启动server

gouxu@gouxu-pc:~/gx/test$ openssl s_server -accept 10001 -key server.key -cert server.crt

Using default temp DH parameters

Using default temp ECDH parameters

ACCEPT

  1. 打开窗口2启动客户端

gouxu@gouxu-pc:~$ openssl s_client -connect localhost:10001

CONNECTED(00000003)

… …

  1. 连接成功后在任意一个窗口输入字符串会传输到另外一个窗口回显。

4.2 使用server证书和客户端证书做双向测试

  1. 打开窗口1启动server。(带有Verify参数,强制要求client证书)

gouxu@gouxu-pc:~/gx/test$ openssl s_server -accept 10001 -key server.key -cert server.crt -Verify 5

  1. 打开窗口2启动客户端

gouxu@gouxu-pc:~/gx/test$ openssl s_client -connect localhost:10001 -cert client.crt -key client.key

  1. 双向证书正确则连接成功,否则连接失败。
  2. 通过控制台可以双向发送消息。

微信小程序,不要显示 scroll-view 里面的滚动条

今天用小程序实现一个树型,使用了微信自带的滚动区域 scroll-view ,页面实现了,但是先,下拉动态加载内容的时候,那个滚动条总是在缩短,而且还很明显。一闪一闪的,看着很不舒服,就想去掉,在微信的文档里面找了很多,没有找到,感觉开没有希望的时候,想想用浏览器的方式来解决,也许可以,试了很多浏览器隐藏滚动条的方式,都不可以,百度了下,原来是要加-webkit前缀

下面是代码,放在需要隐藏的页面的wxss里面就可以了

::-webkit-scrollbar {
    width: 0;
    height: 0;
    color: transparent;
}

微信小程序 之 tabBar 和 navigator 一起使用 的问题

今天发现微信小程序的一个问题

问题主要是这样的,在开始开发之前 ,没有使用tabBar 所以使用 navigator 的时候,没有发现什么别的问题之后,以为开发尾期,要进行全面测试的时候,加入了tabBar,出现了原先使用 navigator 的地方,无法导航到 tabBar页面,开始很郁闷,找不到解决方法,百度也百度不出来。

看了下手册,发现小程序的手册上有这样的一段描叙

navigator

页面链接。

属性名 类型 默认值 说明
url String   应用内的跳转链接
redirect Boolean false wx.redirectTo(将被废弃,推荐使用 open-type)
open-type String navigate wx.switchTab的功能
hover-class String navigator-hover 时,没有点击态效果
hover-start-time Number 50 按住后多久出现点击态,单位毫秒
hover-stay-time Number 600 手指松开后点击态保留时间,单位毫秒

注:navigator-hover 默认为 {background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;}, <navigator/> 的子节点背景色应为透明色

感觉是open-type的问题,修改了下 open-type=’switchTab’ 发现可以正常打开 tabBar上面的页面,为测试是否正确,把页面从 tabBar删除后,在点击,又进不去了,把 navigator 上面的页面 open-type=’switchTab’ 去掉,可以正常访问、所以确定是这个问题。

结论:

放在tabBar上的页面,页面上使用 navigator 打开需要需要把 navigator 的 open-type 设置为 switchTab 如果不是在tabBar上的,默认就可以了!

Ubuntu 16.10 阿里云更新源 速度不错

#打开这个文件,修改里面的内容
sudo vim /etc/apt/sources.list.d/sources.list #修改

修改一下内容,最好备份一下老的内容或者是直接注释掉老的内容

添加阿里源到如下列表中

deb-src http://archive.ubuntu.com/ubuntu yakkety main restricted #Added by software-properties
#阿里云 Ubuntu 16.10
deb http://mirrors.aliyun.com/ubuntu/ yakkety main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ yakkety main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ yakkety-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ yakkety-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ yakkety universe
deb http://mirrors.aliyun.com/ubuntu/ yakkety-updates universe
deb http://mirrors.aliyun.com/ubuntu/ yakkety multiverse
deb http://mirrors.aliyun.com/ubuntu/ yakkety-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ yakkety-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ yakkety-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu yakkety partner
deb-src http://archive.canonical.com/ubuntu yakkety partner
deb http://mirrors.aliyun.com/ubuntu/ yakkety-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ yakkety-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ yakkety-security universe
deb http://mirrors.aliyun.com/ubuntu/ yakkety-security multiverse

修改好了,可以执行

sudo apt-get update

如果没有错的话,就可以正常安装你想要的软件速度挺快的!比国外的源强不少

Ios 中 关于 WebApp 的 meta 标签

随着webapp 开发越来越多, 开发中的坑也越来越多的被人们发现了,呵呵,这个时候 mate中关于填坑的这些设置就变得比较有用了!下面是ios的坑的填法,记下来,以备使用!

apple-mobile-web-app-capable

设置Web应用是否以全屏模式运行。

语法:
<meta name=”apple-mobile-web-app-capable” content=”yes”>
说明:
如果content设置为yes,Web应用会以全屏模式运行,反之,则不会。content的默认值是no,表示正常显示。你可以通过只读属性window.navigator.standalone来确定网页是否以全屏模式显示。
兼容性:
iOS 2.1 +

apple-mobile-web-app-status-bar-style

设置Web App的状态栏(屏幕顶部栏)的样式

语法:
<meta name=”apple-mobile-web-app-status-bar-style” content=”blank”>
说明:

除非你先使用apple-mobile-web-app-capable指定全屏模式,否则这个meta标签不会起任何作用。

如果content设置为default,则状态栏正常显示。如果设置为blank,则状态栏会有一个黑色的背景。如果设置为blank- translucent,则状态栏显示为黑色半透明。如果设置为default或blank,则页面显示在状态栏的下方,即状态栏占据上方部分,页面占据 下方部分,二者没有遮挡对方或被遮挡。如果设置为blank-translucent,则页面会充满屏幕,其中页面顶部会被状态栏遮盖住(会覆盖页面 20px高度,而iphone4和itouch4的Retina屏幕为40px)。默认值是default。

兼容性
iOS 2.1 +

format-detection

启动或禁用自动识别页面中的电话号码。

语法:
<meta name=”format-detection” content=”telephone=no”>
说明:
默认情况下,设备会自动识别任何可能是电话号码的字符串。设置telephone=no可以禁用这项功能。
兼容性
iOS 1.0 +

viewport

语法:
<meta name=”viewport” content=”width=230,initial-scale=2.3,user-scalable=no”>
说明:

使用viewport meta标签可以提升页面在设备上的表现效果,典型地,你可以设置视口(viewport)的宽度和初始缩放比例。

举个例子来说,如果页面的宽度小于980px,你可以设置视口的宽度以适应页面。如果你正在开发一款Web应用,你应该设置视口的宽度为设备的宽度。

表 1 描述了viewport meta标签支持的属性以及它们的默认值。当有多个属性时,应该使用逗号分隔赋值表达式。设置多个属性时请遵循以下规则:

  • 不要使用分号作为分隔符。
  • 空格也可以作为分隔符,但最好使用逗号。
  • 对于属性值是数字的属性,如果属性值包含了非数字字符但是以数字开头,那么只有数字的部分被当做属性值。例如,1.0x等价于1.0,123×456等价于123。如果参数不以数字开头,则属性值为0。

当要用到设备的尺寸数据时,你可以使用表2中的常量替代数字值。例如,使用device-width替代320(宽度),用device-height替代480(高度)。

你不需要设置每一个属性,未设置的属性会自动采用默认值。

设置视口的宽度为设备的宽度:

<meta name=”viewport” content=”width=device-width”>

设置初始缩放比例为1.0:

<meta name=”viewport” content=”initial-scale=1.0″>

设置初始缩放比例,同时禁止用户缩放。

<meta name=”viewport” content=”initial-scale=2.3, user-scalable=no”>

兼容性
iOS 1.0 +
表 1 Viewport 属性
属性 描述
width 视口的宽度。默认值是980,取值范围是200至10000,也可以取值为常量device-width。
height 视口的高度。默认值是根据width的值和设备的宽高比来计算,取值范围是223至10000,也可以取值为常量device-height。
initial-scale 视口的初始缩放比例。默认值取决于页面充满屏幕的缩放比例,取值范围取决于minimum-scale和maximum-scale。
minimum-scale 视口的最小缩放比例。默认值是0.25,取值范围是>0至10.0。
maximum-scale 视口的最大缩放比例。默认值是5.0,取值范围是>0至10.0。
user-scable 设置用户是否可以缩放视口。yes表示可以,no表示不能,默认值是yes。设置user-scable为no可以防止当用户在input标签的文本域中输入文本时页面发生滚动。
表 2 特殊的viewport属性值
属性值 描述
device-width 设备的宽度(像素)。
device-height 设备的高度(像素)。

Mysql 存储过程 DECIMAL 类型定义向INT 转换

Mysql 存储过程 DECIMAL 类型定义,在定义是,必须定义为带小数点的,也就是与数据库中列的类型要一致,否则会发生类型转换、

如 定义为 DECIMAL不带括号时,是 INT 型的,会发生 小数取整。

所以定义DECIMAL最好严格加上括号()

让他看起来像这样 DECIMAL(10,4)

以上是注意事项 出现在了今天金额计算上的额上!

Web App 之操作页面DOM操作优化

理由:

DOM操作主要分为页面渲染与资源清理(heap控制),两者之间又相辅相成,若是DOM操作一块处理不好,其产生的感觉就不再是慢,而是卡,所以DOM操作优化的主要目的就是消灭页面卡的问题,这个在移动端尤为重要。

关于页面渲染:

浏览器会解析三个东西:HTML、Javascript、CSS

浏览器首先会根据HTML生成DOM Tree,其次会根据CSS生成CSS Rule Tree,javascript可以通过DOM API与CSS API操作DOM Tree与CSS Rule Tree,从而引起页面变化。

浏览器解析结束会通过DOM Tree与CSS Rule Tree形成render tree,只有display不为none的元素才会形成render Tree,render Tree形成后浏览器会调用GUI绘制页面,在此之前做的一件事情便是layout或者说reflow。上面的描述简单而言可以分为以下流程:

l  生成DOM树

l  计算CSS样式

l  构建render tree

l  reflow,定位元素位置大小

l  绘制页面

在这个过程中,若是javascript动态改变DOM Tree便会引起reflow,页面中的元素改变,只要不影响尺寸,比如只是颜色改变只会引起repaint不会引起回流否则,reflow不可避免,这个时候便需要重新计算形成render Tree,reflow分为局部回流与全局回流,会影响下面的,不会影响上面的元素。reflow耗用的系统资源较大,DOM Tree中受到影响的节点皆会reflow,然后影响其子节点最坏的情况是所有节点reflow,该问题引发的现象便是低性能的电脑风扇不停的转,手机变得很热,并且非常耗电,以下操作可能引起reflow

l  操作dom结构

l  动画

l  DOM样式修改

l  获取元素尺寸的API

减少使用定位属性(fixed/absolute):

static元素处于文档流中,其渲染速度是最快的,我们做过一个测试:

100个absolute元素与100个static元素渲染时差在0.01-0.007ms

100000个元素渲染差距便增至30ms左右,这个微小的时差在移动端变得尤为明显,比如:

小米/三星手机(1000左右),便存在明显的渲染问题,具体表现为:

l  定位元素在手机上不能显示。

l  定位元素动画效果失效。

以上问题便是UI渲染失效多导致,最好的解决方案是减少使用定位元素,否则只能引起强烈reflow才能解决。

另外,产品经常会有fixed的相关需求,比如支付按钮一直出现在低端,这个需求会造成两个问题:

l  fixed元素遭遇文本框时失效,可能会飘到页面中间阻挡输入

l  影响效率

问题一原因与移动端的实现有关,暂时没有完美的解决方案,问题二便与渲染直接关联

滚屏时,页面上所有的像素会跟着滚动,显卡对全屏幕上下移动的处理很快,但是若是出现一个fixed元素或者有元素不跟着一起滚动,那么滚动对手机浏览器来说就是一个负担,这种滚动的性能甚至体现在了iphone 4s,因为滚动可能会造成reflow,这个现象体现在:

使用absolute配合javascript模拟fixed效果时,会有断片的效果,该问题在iphone5s便不会出现这个问题。

技巧:

当然,我们不能忽略产品的需求,fixed类需求应该在技术上得到解决,还用户一个良好的体验。

虚拟键盘导致fixed元素错位

fixed元素一定会伴随虚拟键盘的出现,但是虚拟键盘只是“贴”在了viewport上,表面上不会对dom产生“任何”影响,但是这个时候fixed元素表现却变得怪异起来,会错位。

应用层面解决问题方案是,虚拟键盘弹出时将fixed元素设置为static,虚拟键盘消失时候设置回来。

由于虚拟键盘出现并未抛出事件,而检测scroll或者resize事件,皆会有一定延迟,会出现闪烁现象,所以现有最好的方案是setinterval定时器监控当前获取焦点元素是否为文本元素,若是是的话便需要处理,如此便可解决fixed元素错误问题。

fixed元素滑动惯性平滑度

我们常常遇到这种产品需求,tab标签栏开始固定,当滚动向下超过该标签栏后便会变成fixed元素,一直出现在头部,这样的需求在电脑上没有问题,但是在iPhone5s以下的手机常常会出现小范围错位或者快速移动大范围错位的问题。

这个时候我们可以引起reflow迫使浏览器重绘以解决这个问题,这里推荐一个奇怪的hack写法:同时设置三个image元素的src属性,便可以全范围解决该难题,  该方案被团队证实并得到应用。

//三图片src,引发reflow,处理fixed方案惯性问题

var el = this.els.ctlc.find('img');

$(el[0]).attr("src", 'http://res.m.ctrip.com/html5/Content/images/144.png');

$(el[1]).attr("src", 'http://res.m.ctrip.com/html5/Content/images/144.png');

$(el[2]).attr("src", 'http://res.m.ctrip.com/html5/Content/images/144.png');

另外,上图中的tab标签下面的蓝线具有动画,但是在小米或者三星手机上可能不会移动,这个时候也可以动态引起reflow解决这个BUG。

其它

l  CSS选择器尽量使用id与class,避免过度层叠

l  避免使用数值,比如:border: none不会引起渲染,而boder: 0会

l  动画时候让元素脱离文档流,以免导致大量reflow

l  避免逐条修改DOM样式,改以className实现同样功能

l  操作DOM时将display设置为none,因为这种元素不会影响渲染,或者操作fragment对象取代操作显示在页面上的DOM

l  避免将获取DOM样式属性的操作写在循环中,可能引起重复reflow

内存资源优化:

移动端的javascript

首先,移动端的性能与PC端的性能完全不在一个数量级上,比如,我哥做过一个测试,使用innerHTML绘制大段,之后想获取HTML的ID节点,事实上是获取不到的,这种问题在单页模拟多页,动态创建DOM会经常发生

var element   = $('<div id = "test">…大量结构…</div>');

$(root).html(element)

$('#test)  //为空

这类问题匪夷所思,因为页面UI渲染与DOM操作是互斥的,但是就算出现了这个问题,一个解决方案是使用settimeout,更好的方案是使用DOMNodeRemoved事件监控页面DOM改变,将我们的DOM操作回调放入以确保渲染结束。

以上问题只是为了说明移动端的性能问题,这类性能问题会导致很多莫名其妙的问题,而且很多与渲染有关。但是这也从侧面说明了移动端资源的紧缺,若是heap值过大,会导致操作出现卡的现象,更有甚者,会引起页面假死直接退出。

webapp的模式,完全依赖于浏览器的垃圾回收,基本就是作死,因为传统页面一旦刷新页面整个资源完全释放,而webapp没有刷新这类操作,只有一个状态到两一个状态,不相关的内存会保留,资源必须手动释放,或者说,框架必须提供垃圾释放的机制。

这个由图表heap值变化可以清晰看出。

而view切换过程中,不用的资源若是不手动设置为null会导致变量得不到回收便脱离框架控制而失控了。所以我们在webapp的过程中需要注意:

l  释放没有使用的闭包

l  观察者需要得到清理

l  释放定时器

l  view切换过程中,在destroy中释放view相关资源

——感谢艾伦友情支援

闭包陷阱

在我们工作过程中,滥用局部变量极有可能引起闭包陷阱,这个问题不止是性能问题,在逻辑上会引起错误,而且不易发现,比如,在AMD闭包中使用一个局部变量

var _attributes = {};

callback ($.extend(_attributes, opts));

如此操作,会改变_ attributes对象,若是一个实例还无问题,但是两个实例的话便会发生变量污染。

这只是一个例子,但是在代码中滥用局部变量可能会引起不必要的隐忧,戒之慎之。

webapp资源释放

根据前面的描述,我们可以得出一个结论:

无论是view还是UI组件我们得提供统一的destroy接口,以便让用户继承释放资源。

若是view的资源得不到释放导致heap值过高,webapp模式的网站其价值大减。这里有几点可以考虑:

l  webapp中view实例保存不超过5个,多了便释放dom结构以及内存引用(临界值自己判断最优)

l  view隐藏时释放内部资源,解除DOM事件句柄

l  UI组件与view相同,需要统一释放机制

但是单页应用由于页面不会刷新,总有一些资源得不到释放,此问题任重道远,平时编写过程可以做以下优化:

l  使用函数替换逻辑

让我们的函数产生一个返回值替换函数中的大段逻辑,这样的第一个好处便是逻辑清晰,第二个好处是这些函数在不同的函数中,这个函数被使用后便会自动得到释放。

l  清理闭包引用

当一个闭包函数或者什么使用结束后,若不会再使用,便需要手动清理该变量,以便解除闭包之间的引用关系,从而释放资源。

l  使用对象属性或者方法

一个对象可以引用其他对象的属性或者方法,比如obj.foo = thatObj;这种情况下,我们可以随时删除对象解除引用关系,然后便可以清理资源。

动画与假死

动画而言建议采用CSS3实现动画,CSS3中又推荐采用最新的接口,比如使用transform取代top/lelf操作,这样操作效率搞得多。

若是采用动画可以将对应元素设置为absolute以减少回流,另外最关键一点还是

避免移动DOM树过多的节点,这个时候需要驳回产品无理需求,比如:

产品要求日期滚屏组件,显示半年的数据,这半年的数据便是180个DOM树

这个级别的DOM一旦移动整个手机会直接卡死,甚至构建DOM树,渲染页面也会出现假死现象,该问题需要规避。

Application Cache

Application Cache是HTML5为webapp离线使用而增加的API,与localstorage、cookie等不同,Application Cache存储的是一系列请求资源允许浏览器在请求资源时不必通过网络,设计得当的话可以实现离线应用。

使用Application Cache主要是在网络性能上提升,有效降低了网络延迟,提升请求加速

但是也会有一些问题,比如新版本缓存不立刻生效;manifest中的请求路径相对于manifest文件,而非加载页面;更新/回滚等问题,所以使用与否还得论证。

原文地址:http://www.cnblogs.com/yexiaochai/p/3759959.html#!comments

 

Zxing 二维码识别库 横屏修改成竖屏

camera.setDisplayOrientation(90);

不知道为什么,Zxing用的是横屏,也许是因为外国人习惯横屏拍照的原因把,但是,在国内,很多人不习惯,呵呵,我用着也不习惯.所以还是该成竖屏,以适合国内人的习惯吧.

修改方法:

1.在DecodeHandler.java中,修改decode方法

PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height);

byte[] rotatedData = new byte[data.length];

for (int y = 0; y < height; y++) {

 for (int x = 0; x < width; x++)
  rotatedData[x * height + height - y - 1] = data[x + y * width];

 }

int tmp = width; // Here we are swapping, that's the difference to #11
width = height;
height = tmp;
PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height);

2.在CameraManager.java中,修改代码:

// 注释掉
// rect.left = rect.left * cameraResolution.x / screenResolution.x;
// rect.right = rect.right * cameraResolution.x / screenResolution.x;
// rect.top = rect.top * cameraResolution.y / screenResolution.y;
// rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;

//修改成这样的
rect.left = rect.left * cameraResolution.y / screenResolution.x;
rect.right = rect.right * cameraResolution.y / screenResolution.x;
rect.top = rect.top * cameraResolution.x / screenResolution.y;
rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;

3.在CameraConfigurationManager.java中,在setDesiredCameraParameters方法中添加一句

camera.setDisplayOrientation(90);

4.在AndroidManifest.xml中,把Activity的属性android:screenOrientation="landscape" 改为

android:screenOrientation="portrait"