阿里云CDN使用初探

CDN的基本原理,实际上是将某“加速域名”用CName解析到阿里云的DNS调度服务器,然后再只能分配到离访问用户最近的CDN节点。

加速域名就是你希望最终用户访问的域名,当然是希望该域名下的内容是经过了CDN加速的。

阿里云CDN节点事先没有你网站要提供的文件的,那么加速域名下的内容从何而来,就需要有一个源站,顾名思义,即内容的来源的意思。

举例来说,你希望网站 http://www.anrrzh.com 的所有内容都经过加速,那么就配置加速域名为该域名,而源站的配置方式上,有一个比较tricky的地方,是不管你设置为域名还是ip,都会解析成ip地址访问回去.

这里就涉及到一个很有意思的问题,在阿里云CDN文档中也并没有表述清楚的。那就是回源的请求虽然能以ip地址命中目标机器,但其访问的host信息,其实是可以配置的。源站设成某个域名,回源请求肯定会发回该域名指向的ip,但访问的http头信息中host未必为这个域名。在阿里云cdn管理控制台,还有回源host这项设置,可以指定回源请求以什么host访问。

这一点之所以重要,是因为事关源站服务器的解析,尤其是当源站涉及多站点虚拟主机的配置的时候。源站服务器上,也需要配置回源host所指定域名相应的虚拟主机的解析。

关于数据库主键设计

最近要做一些系统的开发,说实话也是有些年没有在一线工作了,动手的激情和乐趣感觉慢慢的回来了。

系统是一个与微信公众平台有交互的课程系统。由于既要支持微信用户登录,又要支持其他注册登录方式,因此要自己设计会员系统。在做数据库设计的时候,一开始像多年前一样,第一反应是给每张表一个自增长数字id作为唯一标识。但总觉得哪里不太妥。于是决定重新思考这个以前认为是最佳实践的原则,参考了一些文档,得出如下结论:

1,自增长需要等待返回值才能知道主键的具体值,对于多表关联的情况,需要等主键生成后再插入该值到关联表中作为外键,程序逻辑变成了两步插入,不太方便。因此主键最好能预先赋值;(本例中会员ID要更新到微信openid与会员关系的映射表)

2,多系统数据库整合的时候,如果大家都是用自增长,那么很难保证唯一性,当值冲突的时候很麻烦。因此主键最好全局(全世界)唯一;(本例中要考虑未来与第三方的开源微信系统如weiphp或者we7等整合)

3,要满足以上要求,多半需要字符串型字段作为主键;

4,要考虑索引性能;

5,是否要考虑后生成的主键值要比之前的大,还需要再考虑。

基本确定采用字符串型的主键,能预先赋值,且能保证全局唯一性,兼顾性能。暂定GUID方案。

其实在考虑以上问题之前还有一个先确定用业务字段还是非业务字段做主键的问题。如果是选择了非业务字段做主键,再考虑主键的生成方案。其实关于用业务字段还是无意义的非业务字段做主键也有很多争论,其中有一个观点认为:非业务字段做主键也是有缺点的,很多查询语句会变得复杂很多。我是挺同意的。当然业务字段做主键则需要放置业务规则发生变化。

本例中的用户ID字段,属于本系统新增的内容,其对应的业务字段来源有多种,除了微信用户openid可能还有其他第三方的用户标识,不能保证唯一性且不排除有变化的可能,所以只能选择非业务字段。从而才有了上面的选择该字段生成方式的问题。

请参考:

博客:数据库主键的设计和思考

知乎:使用自增主键是否总是最佳实践?

segmentfault: 在数据库设计中,无论如何也该设计一个自增ID字段作为主键吗?

用PHP开发微信应用遇到的坑

最近因为业务需要,尝试着做了一些基于微信公众平台的开发。考虑到主要是网站应用和轻度电商,业务逻辑不复杂,加上看到开源php的东西比较多,于是决定基于php进行开发。
以前基本没怎么研究过php,因此做了如下工作:
安装试用weiphp
安装试用微擎
学习使用thinkphp

遇到问题及解决如下:

PHP方面的:

empty() 只检测变量,检测任何非变量的东西都将导致解析错误。

Thinkphp框架中Model的save()方法,成功时候的返回值并不是数据对象本身,目测是成功的记录条数。

JSON对象要decode成为数组以后,再放入session,取出来的时候方便使用。php还是跟数组配合更好。

foreach语句中,如果要修改所遍历数组的值,则应该用&符号进行引用。

微信方面的:

网页授权的时机选择,如果是在某业务(某方法)中途进行身份验证再去要求网页授权,由于网页授权是回调的方式,因此每个页面(控制器->方法)的逻辑即可能是通过微信回调后在调用的,也可能是还没有微信授权的时候调用的。这样的界面逻辑会比较复杂,容易混乱。因此最后统一成,除非是不需要身份验证的页面,否则一律先要求网页授权再说。

微信内置浏览器/手机浏览器方面的:

注意javascript与html标签在文档中出现的顺序问题,有时候在脚本中用选择器取不到页面元素的值的时候,可能就是这个问题。

音频在部分手机上死活不能播放,哪怕手动点播放按钮也不成。发现跟比特率有关系,128KHz就遇到这样的问题,转成96KHz就好了。

静态页面缓存的问题。有的页面根据业务逻辑会呈现不同的内容,但微信浏览器的缓存会导致最新的业务状态没法体现,显示的还是上一个状态的页面。解决办法是在Header中加入如下信息:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

[转载]这些小工具让你的 Android 开发更高效

本文为作者「Tikitoo」投稿,应该多少受我点影响,Tikitoo也是一位自学的Android工程师,并且完全通过自学找到一份还不错的工作。互联网爱好者,并且是简书专题的运营者,点击「阅读原文」可以跳转到作者的博客。

在做Android 开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效。

1. Vysor

Vysor 是一个可以将手机的屏幕投影到电脑上,当然也可以操作,当我们做分享或者演示的时候,这个工具起到了作用。

2. Vector Asset

Android Studio 在1.4 支持了VectorAsset,所谓VectorAsset;它可以帮助你在Android 项目中添加Material Icon 和SVG 图片来作为一个Drawable 资源来使用。不过唯一一点的缺陷就是没有搜索功能,如果你想精心挑选Material Icon ,可以打来网页版来选择,也可以下载SVG 和Png 格式。对于VectorAsset 的好处,它的文件更小,更容易适配不同的屏幕。

3. Stetho

Stetho 是一个Android 开发调试小工具,它可以让你使用Chrome Develop Tools 来可以来查看Sqlite 数据库和SharePreferences,而且可以查看网络连接的数据。在Chrome 输入框输入「chrome://inspect」,点击inspect 就可以开始了。如果使用OkHttp 需要添加拦截器StethoInterceptor。

4. OctoTree

OctoTree 是一个浏览器插件,它可以让你在Github 看代码时,左边栏会出现一个树状结构,就像我们在IDE 一样。当我们看一个项目的结构,或者想看具体的某个文件,这样就会很方便。

5. Chrome ADB

Chrome ADB 是一个使用Chrome 来调试Android 的小工具,它除了提供了安装,卸载,清理数据的基本功能,而且还提供了主页,返回,锁屏的虚拟键功能,也可以看各个应用占用的内存(不得不点名批评一下微信,关闭都还占用100M 内存,不知道你要干嘛)。它还有Android 的App,两者交互一定更有意思。

6. TinyPng

TinyPng 是一个图片压缩工具,可能有些人感觉这个工具应该给设计师使用,我觉得也是。不过有些时候,设计师给你出了个1920* 1080 的启动页,一张图片,1M 左右,我也是泪奔了,感觉设计师说话的时间,估计我们都压缩完了,自己动手,丰衣足食。而且它还提供了API,对不同语言都还有提供了插件,比如Java 就提供了Maven 的支持。

7. PostMan

PostMan 是一个API 调试工具,它提供Chrome App 和Mac App,除了提供基本的API 测试功能, 它还可以添加各种的Auth 认证,响应结果可以选择不同类型,比如HTML,JSON 等,可以设置通用的Header,还可以将之前测试的添加到一个集合,而且也可以同步到服务器,而且最近还添加了团队服务,想想服务器端写完测试你就能看到结果,而不是给你API 文档(当然API 文档还是要有的),这画面太美,我不敢想象。当然它的功能也远远不止这些,它还有专业版,想尝试更多的东西可以体验一下。

8. Genymotion 虚拟机

刚开始做开发的时候,每次使用官方的虚拟机,都想吐槽一下,但是发现了Genymotion 之后,这一切都变化了,它的速度几乎可以和真机媲美了,当然如果有真机,当然还是推荐使用真机测试。据说官方模拟器2.0 很快,不知道是不是又吹牛逼。

9. Json2POJO

Json2POJO 是可以将一个Json 字符串转换成Java 的POJO 类的网页工具,而且可以选择转换器,比如我们使用Retrofit 可以选择Jackson,Gson,而且可以选择重写get,set 方法,还有hashcode,equals 和toString 方法,可以省去了不少手写的时间。

10. Android Pixel

AndroidPixel 是一个简单的将不同的分辨率的换算工具,只要你有一个尺寸的大小,其他的尺寸大小就可以得出,当然dp 这样的单位,可以解决一部分问题,但是大多还要需要微调,这时AndroidPixel 就起到了作用。这个工具来自上一个公司同事告诉我的。

11. Android Arsenal

Android Arsenal 主要是推荐Github 上一些流行的Android 开源项目,基本上最近热门的Android 开源项目都会出现在这里,它还对不同类库进行了分类。

12. AndroidAssetStudio

Android Asset Studio 是一个在线制作工具,它可以制作Iocn,ActionBar,点9 图等等,简单的操作,大大提高了我们开发的效率。

13. WiFi ADB

WiFi ADB 是一个通过无线网络来使电脑和手机连接的手机App(可以去Google Play 搜索类似的),当我们做测试的时候,只需在手机上打开,电脑只需在命令行输入「adb connect xxx.xxx.xxx.xxx:5555」,电脑可以连接手机,就可以通过无线网络来调试开发的应用。

14. ES Explorer

ES Explorer 是一款文件管理器,但实际它又不仅仅是一款文件管理器,在获得Root 之后,它的功能更强大了,它可以浏览受限制的文件目录;而且提供了一系列小工具,比如下载器;还有集成了众多云储存服务。

查看原文

安装weiphp遇到不支持prepared语句的问题

安装weiphp过程中报错,遇到如下问题:

SQLSTATE[HY000]: General error: 2030 This command is not supported in the prepared statement protocol yet
错误位置

FILE: /var/www/weiphp.abc.com/ThinkPHP/Library/Think/Db/Driver.class.php  LINE: 210

TRACE

#0 /var/www/weiphp.abc.com/ThinkPHP/Library/Think/Db/Driver.class.php(210): PDOStatement->execute()
#1 /var/www/weiphp.abc.com/Application/Install/Common/function.php(195): Think\Db\Driver->execute(‘– ————…’)
#2 /var/www/weiphp.abc.com/Application/Install/Controller/InstallController.class.php(117): create_tables(Object(Think\Db\Driver\Mysql), ‘wp_’)
#3 [internal function]: Install\Controller\InstallController->step3()
#4 /var/www/weiphp.abc.com/ThinkPHP/Library/Think/App.class.php(233): ReflectionMethod->invoke(Object(Install\Controller\InstallController))
#5 /var/www/weiphp.abc.com/ThinkPHP/Library/Think/App.class.php(277): Think\App::exec()
#6 /var/www/weiphp.abc.com/ThinkPHP/Library/Think/Think.class.php(120): Think\App::run()
#7 /var/www/weiphp.abc.com/ThinkPHP/ThinkPHP.php(101): Think\Think::start()
#8 /var/www/weiphp.abc.com/install.php(39): require(‘/ var/www/weiphp…’)
#9 {main}

知道笼统来说是数据库环境问题,执行脚本的时候报错,但具体是什么问题,以及怎么修改则不甚了了。

网上搜看有人说要设数据库参数 ATTR_EMULATE_PREPARES 为 true,试过在InstallerController.php中设置此参数没解决问题。在Thinkphp框架里面的 Library/Think/Db/Driver/Driver.class.php设置此参数,也没解决问题。

最后暂时绕开了, 手工执行了install.sql脚本, 注释掉了出错的代码,再运行安装程序,成功。

解决无线网卡突然不能启用的问题(事件ID4294)

家里一台Thinkpad X250,操作系统是Windows 10。早上还在用,播放完一个视频以后,放了一会儿。再打开的时候,发现不能上网。

在控制面板中,找到适配器设置,看无线网卡状态是禁用状态,于是启用,出现文字提示启用成功,但无线网卡的图标依然是灰色的禁用状态。再启用,还是如此。

于是打开事件查看器,在系统事件中看到如下信息:

级别: 错误
事件ID: 4294
来源: Tcpip
内容:
尝试清除硬件地址为 xx-xx-xx-xx-xx-xx 的网络适配器上的数据包合并筛选器失败

以及在此之前的信息:

事件ID: 5002
来源: NETwNb64
内容:
\Device\NDMP2
Intel(R) Wirelss-N 7265

找不到映像文件中指定的资源类型。

网上搜了一下:很多人提到NETwNb64是网卡驱动程序,猜测是某种原因导致驱动出现异常。

由于近期没有安装什么软件,Windows应该也没有版本更新、升级。于是决定重装无线网卡驱动。在设备管理器里面,找到无线网卡Intel(R) Wireless-N 7265,先卸载。再扫描检测硬件改动,自动安装。问题解决!