保持对数字的敏感度

今天我负责维护的一个系统(基于某开源系统的二次开发),使用者那边反馈了一个bug,具体表现大致为数据错乱,本该属于A的数据确关联到B上了,ID 为 128 的数据关联到 ID 为 127 上去了。我在查阅代码的同时,使用者那边也在开源系统官方交流群里面反馈问题,使用者把信息同步给我说群里有个人提到 mysql tinyint 数据范围为 -128 到 127 改下字段类型就行了。这时我才恍然大悟,我早该想到问题出在这的,这个系统有一段时间没有进行的维护,近期也没有提交新代码,怎么这两天突然出现这种 bug 呢,本属于 128 的数据跑到 ID 为 127 的记录去,127 这个数字程序员应该很熟悉才对。

惭愧。

如何定位 app is not installed 错误

这两天尝试着去了解下 Android 软件安全。我在 AVD 上一个 apk 无法被安装, 应该是与 apk 本身没有关系,因为这个 apk 就是我从豌豆荚上下载下来的,点击下一步后,直接提示 app is not installed ,在 Google 上搜索了一翻,为什么会出现这个问题,SO 上有提到一些原因,但是都不是我这里的情况。我重新搜索“app is not installed where is log”,这个问题 下面的一个回答提示了我使用

于是,使用上面命令,log 里面很清晰明显的暴露了问题所在。

感谢,logcat ,这是一只好猫。

Yii2 AssetBundle js 和 css 没有自动更新的问题

最近几天看了很多基于 Yii2 的一些开源项目。很多功能都在可以找到开源的以 Yii2 extension 的形式存在,集成到自己的项目中相当简单。这么说吧,基于这些组件,你可以写很少或者几乎不用写一行代码就可以搭建起来一套很好用的程序。常见的富文本编辑器、权限管理、导航栏、菜单等等这些都有很多不错的扩展可以直接集成。之前我一直以为PHP程序源码不含图片的话超过10M就很恐怖了,但最近几天接触的这些基于 Yii2 的项目,composer install 之后整个源码目录大小超过100M很常见。当然,这还没有 node 恐怖,npm install 之后,随随便便 200M+ 更常见。

以上是题外话。前端时间我就发现了如题的问题。那时没注意。今天仔细读了下相关源码,弄明白了这个问题的根源。

假设有如下 HelloAsset

在视图文件里面注入这个 Bundle

问题表现为:当我们修改 hello.js 后,刷新页面,加载的是我们修改过后的最新的 js。但是当我们修改 js/hello2.js 的内容后,刷新页面,发现最新的 js 并没有出现在浏览器中。

一路追踪代码到 AssetManager.php 里面有个 hash 方法,这个方法会生成 bundle 对应的 assets 目录,代码如下:

上面方法的参数 $path 就是 AssetBundle::$sourcePath 应用 Yii::getAlias 得到的路径。可以看到这个方法的逻辑很清晰,如果没有配置 hashCallback,默认生成 hash 与 $path 的最近一次修改时间相关。怀疑问题出现在这里。

linux 下用 stat 命令可以获取文件的最近访问更改以及改动时间:

当我更改 hello.js 的内容后再次运行 stat 命令:

很明显,最近改动时间已经变了,这点是没问题的。

当我更改 js/hello2.js 的内容后再运行 stat:

可以看到这时 stat hello_assets 的最近改动时间并没有变化。

所以得出结论,当我们更改 $sourcePath 下面再下一级目录下的文件时,$sourcePath 目录的 filemtime 时间并不会改变,因此 hash 函数生成的哈希值也就没有变化。进一步,AssetManager 就没有再进行 publish 资源文件。

解决这个问题的一个方案就是更换生成哈希的实现。我做了一个简单的实现,在配置文件里面 components 项配置 assetManager 的 hashCallback 属性

 

Is this php’s bug?

I am reading yii2’s source code right now. I found that this method yii\di\Instance::ensure something werid。

I changed the code as following:

I got output as :

string(15) “yii\di\Instance”

Can anyone explain?

#Answer

Just now(2016-04-12 15:20:58),I asked Laruence about this questing in qq group.  He answered me that get_calss(null) will return current scope. Then I read the php documetation , It says:

If object is omitted when inside a class, the name of that class is returned.

So, RTFM si right.

记域名备案以及服务器迁到腾讯云上来

之前使用的 Linode 东京节点 1G VPS,在公司访问的时候挺快的,虽然偶尔也会出现 ping 不通,但是家里的长城宽带就是狗屎,基本上连不上去。擦~,当初安装宽带的时候,我就得想想,同样是 100M ,为啥长城要比电信便宜那么多呢,妈蛋,长城的 100M 是大中华局域网的 100M,访问境外网站基本跪。

前两天发现百度没有收录我的博客任何一个页面了,想了想应该是前段时间切换到 https 导致的,我启用了 https 并且把原先的 http 全部到 301 到 https 的链接上面来了。今天看了一下,百度收录了一些,但都是 http 的链接。谷歌收录现在全部都是 https。无所谓了,反正现在每天没有来自百度的任何流量。

朋友在腾讯云工作给推荐自家产品,给了我一个备案授权码,备案很顺利并且很快就通过了。今天购买了腾讯云1G VPS 1个,折腾环境折腾了好久,起初安装的是 CentOS7.1 编译出来的 php-7.0.2 在 nginx 里面没有任何输出也没有任何错误日志,我懒得折腾了,重新装了个 debian8.2,apt 安装 mysql-server 的时候又报错。最终还是换回了 ubuntu。

Linode 也用了18个月的时间,一直都是10美元一个月,最开始是512M 的内存,中间有一次给免费升级到1G 了。腾讯云目前是68元(65主机+3元数据盘)一个月,算下来价格差不多。不过腾讯的出口宽带只有1Mbps,Linode 比这个大多了,我 scp 将 Linode 上的数据弄到腾讯云这个主机上,速度都超过 20Mbps 了,下载速度能达到 2MB/s。不管怎样,腾讯云在访问上更便捷,应该能让省不少心。

对了,晚上我还尝试着去使用了下阿里云的 ACE,应该和新浪 SAE差不多的东西,但是没有新浪的好用,可惜新浪的不支持 https(要想支持 https,一年至少10000元)。按我现在博客的访问量,使用 SAE 这种方式应该只需要花很少很少的钱。

你有没有觉得现在我的博客访问速度杠杠的呢?

配置 nginx 访问 http 自动跳转 https

昨晚在 wosign 申请了个2年的 ssl 证书,很快就部署好了。

今天配置了下,让访问 http 的 url 自动跳转到 https。

相关配置如下即可:

同时监听 80 和 443 端口,并且给 443 端口加上 ssl 支持。当访问不是通过 https 过来的,则重定向到 https 的路径。

compile php with openssl on mac osx error

从源码手动编译 PHP 时出现如下错误:

解决办法

MakeFile 里面找到类似下面这一行:

删除所有的 -lssl 和 -lcrypto 然后添加 libssl.dylib 和 libcrypto.dylib 的路径(如果你安装了 brew,那么则是 /usr/local/opt/openssl/lib/),重新运行 make 命令,done。

附上我修改后的 MakeFile EXTRA_LIBS 那一行: