Mobile App 缓存设计逻辑

出了什么问题?

最近在用 PhoneGap 做手机端 App,第一个版本出来后,给人的整体感觉就是:卡!慢!非常卡!非常慢!

每次切换 tab 都要5秒左右,这个实在是无法接受啊。

 

慢不是你的错

本来,用 PhoneGap 就会让人产生质疑,它会不会很慢?

所以一出现慢的问题,大部分人一开始都会怪到 PhoneGap 头上吧?我一开始也在质疑自己,用 PhoneGap 是正确的选择吗?

调用 WebService 返回 417 错误

错误现象

现象很简单,调用某个 WebService 的时候返回了如下的错误信息:

The request failed with HTTP status 417: Expectation failed.

实在是搞不懂这个错误是什么原因啊!解决办法很简单,按照如下文章在 web.config 中加入一段配置即可。

注意,不是在服务提供方那边加(加了也没用),而是在服务调用方那边加上。

解决方法:http://www.codeproject.com/Articles/94235/The-request-failed-with-HTTP-status-417-Expectatio

生活与重构

怎么样才是NB的工程师

记得以前我很喜欢一句话:“当你觉得以前的代码很2的时候,就说明你进步了。”

好赞的一句话是不是?大学的时候,每隔一段时间就会有这样的感觉,感觉自己越来越NB了。

但是,总觉得自己还不算大师,可是差在哪?

zepto 和 backbone 配合使用的坑

问题代码

最近有那么一段 js 代码,困扰了很久很久,开发环境又是 PhoneGap,所以没办法调试 js…

代码大致逻辑如下:

var options

options.error = function (model, xhr, options) {
    if (xhr.status === 401) {
        //todo: login

        Backbone.sync(method, model, options)
        return
    }
}

options.success = function (model, xhr, options) {
	//todo:
}

Backbone.sync(method, model, options)

逻辑很简单,就是如果登陆的时候返回401错误,就重新登陆一下,登陆完成后重新请求数据。

这段代码没有问题,但是这个逻辑 + zepto + backbone 就有问题了。

代码在第二次请求的时候,就会报一个错误: xhr 是一个对象而不是一个函数。

后 RSS 时代的思考

Google Reader 为何关闭?

在距离正式关闭Google Reader还有4周左右的时间里,谷歌决定对外解释公司为何会关掉这一平台的原因。谷歌新闻与社交产品主管Richard Gringars告诉Wired.com,Google Reader已经是一种过时的新闻采集模式。

Gringars认为,对于进入一个每日新闻消费持续不断的时代,那种传统的新闻消费方式已经不适用智能机和平板用户。与此同时,谷歌建议Google Reader用户可以访问Google+来查阅新闻。

也许,谷歌的这一决定是为了向世人证明,他们是走在时代的前沿,他们的模式预示着未来的新闻阅读方式。

log4net 配置文件加载优先级

坑坑坑

最近把项目中所有的日志都改成了 log4net ,同事也蠢蠢欲动,用起了 log4net。

但是一个大坑扑面而来…

 

现象是这样的,同事有两个项目:

控制台引用程序:在 assembly 里配置了 log4net 的配置文件地址。

业务逻辑层:引用了 log4net 并写日志了。

 

然后日志始终无法输出!

之前我一直天真地以为,解决方案中任何一个项目只要加上了[assembly: log4net.Config.XmlConfigurator(Watch=true)]就可以正确地加载配置了!

Console.WriteLine 的坑

扫地老太太

据说在每一个互联网公司里,都有一个扫地的老太太。很偶然地,当她经过一个程序员的身边,扫一眼屏幕上的代码,会低声提醒对方说:小心,栈溢出了…

别看这是一个笑话,我那天真的遇上了!

只不过扫地老太太变成了前端工程师…

 

那天我在优化一个作业,里面有大批量的数据,为了监控我 Console.WriteLine 了。

然后前端工程师说:喂,不要用那么多的控制台输出,会影响性能的!

什么?控制台输出会影响性能?

我的三观瞬间崩塌了…

WCF 调用的那些事

WCF 的问题和 using 语句块

WCF 这个问题已经纠结了很久了:

介绍:http://kb.cnblogs.com/page/88739/

各种解决方案:http://stackoverflow.com/questions/573872/what-is-the-best-workaround-for-the-wcf-client-using-block-issue

iOS 证书与推送证书的注意事项

iOS 证书与推送证书

之前研究 iOS 开发,这书这块折腾了我很久很久!

老外这篇文章写得很清晰:

http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1

之前是有中文版的,后来针对 iOS6 有了更新,所以暂时还没有中文版。

这篇文章写的最详细,按照它说的一步步做下去,就可以实现推送了~

但是期间还是遇到了很多坑,而且总感觉没有完全理解,所以便有了这篇文章,自己帮自己梳理一下,也给大家一些帮助。

流水账式的教程我就不写了,上面那篇文章很详细了~

git 环境搭建进阶

各种 git 工具

最新在 mac 和 windows 下用了各种 git 工具;有 shell 的,也有 GUI 的,并尝试着使用它们来进行工作。

经过一番实践后,给大家推荐一套我最喜欢的 git 工具。

另外也给大家推荐一些基本配置,可以让你的工作效率大大提升。

 

公共配置

先给大家看一下我 .gitconfig 文件里的一些配置(mac & windows 都适用):

[color]
#开启着色功能
	status = auto
	diff = auto
	branch = auto
	interactive = auto
[merge]
#默认 merge 都加上 --no-ff
	ff = false
[alias]
#别名
	st = status
	ci = "commit -m"
	br = branch
	co = checkout
	cia = "commit -am"
	df = diff
	dt = difftool
	mg = merge
	mt = mergetool
	ll = "log --oneline"

TFS 到 git 的过度或共存方案

过度或共存

之前的项目是 TFS 的,所以我们的 CI(持续集成)平台自然也是和 TFS 做整合的。

那在持续集成平台还未支持 git,或者想让 TFS 和 git 共存的时候应该怎么做的?

 

共处一室

第一步要做的是把同一个目录弄成 git 和 tfs 的目录。

git 需要在根目录生成一个 .git 的目录,而 TFS 会生成一些 .vssscc 文件,所以他们并不会产生冲突。

我是先有 TFS 再有 git,所以 TFS 不用做什么,直接在目录下初始化 git 就行了。

PhoneGap 与 Application Cache

一个想法

在研究 PhoneGap 的时候一直在想一个问题,怎么提高移动网络下的网络性能?特别是静态文件,多次加载完全是浪费。

HTTP 协议中控制缓存也比较纠结,总会有个 304 请求,而且各种协议,各种 HTTP header,都不统一。而且 304 实际上也是进行了一次 HTTP 请求的。

因为用的是 PhoneGap,可以用 Navtive Code 来进行扩展,所以想到一个点子,是否能有一个静态文件升级功能?远程有一个文件标记着静态文件包的最新版本,如果有更新,这个插件就自动把静态文件下载到本地。然后 PhoneGap 打开的页面使用本地缓存的静态文件即可。完全不需要任何请求!

Java 中拦截 System.exit

场景

有一个 jar 包,但是这个 jar 包是一个控制台应用程序,所以我想直接调用它的 main 函数来执行。

但是遇到一个很纠结的问题,这个 jar 包因为是一个控制台应用程序,所以遇到错误的时候,会直接执行 System.exit(-1),我的程序用它的时候就会直接被退出了…

但我更希望它可以抛出异常。

iOS 推送的服务端实现

Apple Push Notification Service

最近研究手机开发,iOS 的 APNS 真的是比 Android 先进很多啊~

虽然 Android 现在也有同样的东西了,但是在中国基本是废掉的…

APNS 原理和 iOS 设备上的实现,可以在下文中获得答案:(右上角可以切换成中文)

http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12
但是,客户端实现了,服务端怎么实现了?

上面的教程中用 Php 实现了服务端的推送,代码也非常简单,原理也不难,就是实现 SSL Socket 并按照协议给苹果的服务器发送数据。

原文中的 Php 只用了不到50行就实现了。然后苦苦寻找,终于找到了 C# 版本和 Java 版本。

如果了解 APNS 原理后就会知道,iOS服务端只需要一个通用的 key(一个 App 一个 key),key 的密码,还有设备的 token(一个设备一个 token),就可以给设备发送推送了。

《七周七语言》有感

七周七语言

前一段时间看完了《七周七语言》,这本书的书写风格有点像教材,会要求你回家做作业。

但说实在的,不做作业真的无法理解里面的全部内容。

或许抽空我也应该再看一遍并且把里面的作业做一遍。

 

之前对 C# 最熟悉,所以难免会把里面的各种编程模型和 C# 进行比较了。

建站指引 —— 备案

吐槽备案

我自己的网站现在外国主机上,但是以前在国内,所以经也已经完成备案了。说备案之前我不得不吐槽一下:

第一个是吐槽备案的速度,工信部负责,它是国家公职部门,效率可想而知,大家懂的。

第二个是吐槽备案的意义,为什么要备案?

为什么要备案?备案是希望网站内容有违规违法的时候可以方便地找到当事人。

想法很好,但是互联网是全球的,我完全可以把不和谐的东西放到外国的服务器呗,这样就拿我没办法了。

其实工信部怕的不是常规意义的诈骗网站、黄色网站,怕的是XXX网站。为什么这么说?因为以前备案抓的很松的,大型正规网站自证清白才会去备案,个人网站最早以前都不管的。直到某一天,我的网站突然被封了!被告知现在所有网站要备案… 最近的局势大家都懂得,嗯…

那都说了备案是堵不死XXX网站的,那还有什么意义?没关系,境外网站的话还有 GFW 呢~

于是,一条完整的防线就建立了起来,境内备案,境外 GFW!天朝万岁!

建站指引 —— 博客程序

选择博客程序

其实在选择博客程序这件事上,没什么好选的,一般来说只有一个选择:WordPress

优点:

  1. 流行、易用,不需要懂 php 就可以使用;
  2. 插件丰富;
  3. 主题丰富。

建站指引 —— 虚拟主机与VPS

何处来安放你,我的网站?

买了域名以后第二件事情就是需要找一个空间放你的网站了。

下面有这几种方案可供大家选择:

 

家里电脑开着当主机

这个方案不用我教,大家都是做这行的,虽然不是运维但基本也肯定都懂吧?

但是这个方案有一些风险。

家里的电信IP是动态的,解决方案有:花生壳(只有买了花生壳的域名才可以)、DNSPOD(需要把 NameServer 迁移到 DNSPOD)。

好吧,就算你把动态 IP 的问题解决了,有一个新的难题会摆在你面前。

现在很多网络供应商的路由器都是封闭式的,导致你的电脑在外网不可见。

所以这个方案真的很不靠谱,就算全部靠定了,你也不能一直把家里的电脑开着吧?

建站指引 —— 域名

漫漫长路

自己的博客一步步走来其实并不容易,域名、空间、备案等等… 全部折腾完起码也要弄好几个月,还好这几个月主要是等待,不需要你弄什么。

建站第一步当然是买一个域名啦,所以本文会和大家聊聊买域名的各种事。

 

域名在哪买?

域名购买原则:一定要到国外买,千万不要在国内买!(除了 .cn, .org.cn, .com.cn 等)

首先,一个域名往往归一个国家或一个组织所管理,而同一个域名可以在各个域名供应商那买到,但价格和服务有所不同。

国家域名比较特殊,例如中国的相关域名(.cn, .org.cn, .com.cn 等)就没有开放给国外的域名供应商。因为国家需要对这几个域名做点限制吧。例如前段时间就不允许个人购买 .cn 域名了。

另外,作为一个个人博主,强烈不建议使用 .cn 相关的域名。

相对于国内,无论是价格、服务、稳定性(这个可以解决)等各个方面来看,国外的明显高于国内。国外又好又便宜,干嘛不买国外的呢?

最后,国外貌似只有 GoDaddy 支持支付宝,而且它本身也基本上是老外的首先,所以没有道理不用它啦!

购买方式很简单,注册、登陆、选购、支付即可。

F5 —— 网页开发免刷神器

免刷神器

最近在 寸老师的博客 上发现了一个很简单但是很实用的小工具:F5

F5 是什么呢?

简单的来说就是:在你保存或者编译网站之后,可以帮你自动刷新浏览器上的页面。

特性:

  1. 保存或编译时才刷新,而不是强制每过一段时间刷新一次
  2. 不限浏览器
  3. 不限开发语言:纯 html+js,asp.net,jsp 都可以