msgbartop
用铅笔写日记,记录那最原始的美丽
msgbarbottom

本站已托管至谷歌云平台

最近忽然对国外的几个互联网巨头的云服务产生了浓厚的兴趣,利用手里的外币卡分别开通了Amazon AWS,Microsoft Azure 以及 Google GCP.

AWS 和 GCP 都声称可以免费试用一年,分别给了一定的试用金额度,以两者中先消耗殆尽的为准。

Azure 的免费试用期只有一个月,后来发现一个月到期后只要升级到 即用即付 订阅,微软还是提供了几个low-level 的云产品的一年试用配额的,也算是有点良心啊~哈哈

不过GCP 和 Azure 一年试用到期后,我是不打算在继续用了,因为微软的太贵,而谷歌的线路炸的太厉害,可能是国内很多人通过“删除结算账号,再添加一张新信用卡”的方式,反复获取那$300一年的免费试用周期吧,给我感觉很不稳定。

倒是 AWS 让我眼前一亮,AWS Lightsail 套餐月付只有$3.5,折合人民币二十几块钱,日本线路ping 值很低,几乎50+- ms,性价比极高。本人吐血推荐购买。

以上是题外话。

本来我的博客是托管在搬瓦工(BWH)上面的,也是同样的问题,线路炸的太频繁,没有让我感觉到它的任何优点。一次偶然的机会让我看到了GCP 提供一个美区(不包括北弗吉尼亚地区)的 f1-micro 实例供用户永久免费使用。具体配置如下:

每月 1 个 f1-micro 实例(仅限美国区域 - 不包括北弗吉尼亚地区)

每月 30 GB HDD,每月 5 GB 快照

每月 1 GB 网络出站流量 - 从北美到所有区域目的地(不包括中国和澳大利亚)

参见: Google Cloud Platform 免费方案

这让我眼前一亮,我现在这个bwh服务器年付$39.99,说实话用处也不大,速度嘛也没啥优势,况且我现在也套了cf 的 cdn,感觉没啥区别了。

留着它用处确实没啥,索性把网站搬到GCP 美区实例上去,把bwh 给退了。能省则省嘛,哈哈。

说干就干,找个空闲的时候,我就把数据,配置备份,然后在新实例上部署环境,确认两边ok后,把数据导入了进去。由于套了cf 的cdn,登陆cf 后台,改了一下DNS相关记录,就坐等生效了。

搬完之后访问了一下,速度还蛮OK的。

附延迟测试数据:

on GCP via Cloudflare
MacBook-Pro-3:Documents toplist$ ping xiazhengxin.name
PING xiazhengxin.name (104.27.176.20): 56 data bytes
64 bytes from 104.27.176.20: icmp_seq=0 ttl=54 time=179.096 ms
64 bytes from 104.27.176.20: icmp_seq=1 ttl=54 time=165.458 ms
64 bytes from 104.27.176.20: icmp_seq=2 ttl=54 time=221.086 ms
64 bytes from 104.27.176.20: icmp_seq=3 ttl=54 time=244.089 ms
64 bytes from 104.27.176.20: icmp_seq=4 ttl=54 time=266.278 ms
64 bytes from 104.27.176.20: icmp_seq=5 ttl=54 time=185.729 ms
64 bytes from 104.27.176.20: icmp_seq=6 ttl=54 time=208.304 ms
64 bytes from 104.27.176.20: icmp_seq=7 ttl=54 time=232.247 ms
64 bytes from 104.27.176.20: icmp_seq=8 ttl=54 time=254.497 ms
64 bytes from 104.27.176.20: icmp_seq=9 ttl=54 time=176.149 ms
64 bytes from 104.27.176.20: icmp_seq=10 ttl=54 time=198.623 ms
64 bytes from 104.27.176.20: icmp_seq=11 ttl=54 time=222.786 ms
64 bytes from 104.27.176.20: icmp_seq=12 ttl=54 time=244.178 ms
64 bytes from 104.27.176.20: icmp_seq=13 ttl=54 time=251.045 ms
64 bytes from 104.27.176.20: icmp_seq=14 ttl=54 time=188.904 ms
^C
--- xiazhengxin.name ping statistics ---
15 packets transmitted, 15 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 165.458/215.898/266.278/31.276 ms

on BWH
MacBook-Pro-3:Documents toplist$ ping bwh.xzx.im
PING bwh.xzx.im (104.153.103.172): 56 data bytes
64 bytes from 104.153.103.172: icmp_seq=0 ttl=50 time=141.367 ms
64 bytes from 104.153.103.172: icmp_seq=1 ttl=50 time=142.667 ms
64 bytes from 104.153.103.172: icmp_seq=2 ttl=50 time=145.147 ms
64 bytes from 104.153.103.172: icmp_seq=3 ttl=50 time=142.224 ms
64 bytes from 104.153.103.172: icmp_seq=4 ttl=50 time=188.251 ms
64 bytes from 104.153.103.172: icmp_seq=5 ttl=50 time=142.178 ms
64 bytes from 104.153.103.172: icmp_seq=6 ttl=50 time=234.048 ms
64 bytes from 104.153.103.172: icmp_seq=7 ttl=50 time=252.443 ms
64 bytes from 104.153.103.172: icmp_seq=8 ttl=50 time=170.327 ms
64 bytes from 104.153.103.172: icmp_seq=9 ttl=50 time=193.155 ms
64 bytes from 104.153.103.172: icmp_seq=10 ttl=50 time=217.860 ms
64 bytes from 104.153.103.172: icmp_seq=11 ttl=50 time=240.174 ms
64 bytes from 104.153.103.172: icmp_seq=12 ttl=50 time=160.681 ms
64 bytes from 104.153.103.172: icmp_seq=13 ttl=50 time=259.157 ms
64 bytes from 104.153.103.172: icmp_seq=14 ttl=50 time=271.898 ms
64 bytes from 104.153.103.172: icmp_seq=15 ttl=50 time=228.873 ms
^C
--- bwh.xzx.im ping statistics ---
16 packets transmitted, 16 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 141.367/195.653/271.898/46.145 ms

on GCP
MacBook-Pro-3:Documents toplist$ ping gcp.xzx.im
PING gcp.xzx.im (35.230.16.233): 56 data bytes
64 bytes from 35.230.16.233: icmp_seq=0 ttl=50 time=204.657 ms
64 bytes from 35.230.16.233: icmp_seq=1 ttl=50 time=226.352 ms
64 bytes from 35.230.16.233: icmp_seq=2 ttl=50 time=248.862 ms
64 bytes from 35.230.16.233: icmp_seq=3 ttl=50 time=169.600 ms
64 bytes from 35.230.16.233: icmp_seq=4 ttl=50 time=191.350 ms
64 bytes from 35.230.16.233: icmp_seq=5 ttl=50 time=219.921 ms
64 bytes from 35.230.16.233: icmp_seq=6 ttl=50 time=237.154 ms
64 bytes from 35.230.16.233: icmp_seq=7 ttl=50 time=261.225 ms
64 bytes from 35.230.16.233: icmp_seq=8 ttl=50 time=182.807 ms
64 bytes from 35.230.16.233: icmp_seq=9 ttl=50 time=203.962 ms
64 bytes from 35.230.16.233: icmp_seq=10 ttl=50 time=227.414 ms
64 bytes from 35.230.16.233: icmp_seq=11 ttl=50 time=250.583 ms
64 bytes from 35.230.16.233: icmp_seq=12 ttl=50 time=172.640 ms
64 bytes from 35.230.16.233: icmp_seq=13 ttl=50 time=194.657 ms
64 bytes from 35.230.16.233: icmp_seq=14 ttl=50 time=214.056 ms
64 bytes from 35.230.16.233: icmp_seq=15 ttl=50 time=230.942 ms
^C
--- gcp.xzx.im ping statistics ---
16 packets transmitted, 16 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 169.600/214.761/261.225/27.036 ms

本周杂记

一转眼,8月份的第三周已经快过了,马上就迎来第四周了,也就是说整个8月份也快接近尾声了~可怜的孩子们的暑假也快玩完了,估计很多的孩子们开始寻找他们的暑假作业本了,呵呵~(我一般都是最后一天才开始想起要考虑这件事情的……)

本周,说实话,和上周一样,依然是没什么特别的事情,生活基本上就是“公司”—“家”两点一线,单调的很~回到家也没有什么可说的,吃饭、睡觉。如果非要说点事情的话,可能就是CCAV综合频道播出的一部名叫《大唐双龙传》的电视剧了~

其实我本身对这些影视作品极其不感冒,看的更是甚少。要我说《大唐双龙传》应该改名为《两个家伙的艳遇史》才更贴切。不过说真的,里面的女主角的确是一个比一个养眼,这也是我一直在关注它的原因所在。特别是里面的“李秀宁”和“宋玉致”,尤其是后者,我一直看着眼熟,总觉得在哪里见过,就是想不起来。后来才想起来,她长得很像“刘敏林”(原谅我吧,我使用了百毒百科,因为维基里没有这个词条),有没有?呵呵~

好了,扯远了~我发现我扯淡的功夫又长进了,囧rz

本周,业内最大的新闻莫过于周一的晚些时候爆出的谷歌公司收购摩托罗拉移动的这则重磅消息了。作为一名谷歌的轻度爱好者和摩托手机的用户,我不得不说,这可能是个好消息!而作为一名开源爱好者和Android开发者,我对Android的前景也抱有了很大期望~直到我昨天收到了fsf.org的关于“Android内核开源协议GPLv2终结”的邮件消息,我只能希望谷歌不要在错误的道路上越走越远……

还有人说,谷歌收购摩托后,期待摩托的所有Android机型能够开放bootloader.我表示影响不大~因为"Move2SD Enabler" 和 "Root Uninstaller"这两款应用完全能够满足我~ 哈哈

还有就是关于国内MIUI团队推出的小米手机的,反正我是不会买的,因为我说过我的下一步手机可能是MeeGo操作系统。不过,我可能会推荐别人去买,为什么?就凭目前它可观的配置和1999块的价格~

之后就是关于百毒贴吧的一些牢骚,我要说,百毒贴吧可能是国内最河蟹、最水产的交流社区,没有之一。那尼玛的真是个容不得异语者的平台,管理员如此,里面的成员亦如此。为了逃避被河蟹的命运,我想要创建一个关于辅助言论自由的项目(JS + SVG)的想法,越来越强烈了~

还有就是Firefox 6,正式发布了!这一次Ubuntu 软件仓库源的维护者反应还算迅速,我在Mozilla发布后的第二天就接到更新通知了,蛮好,呵呵。

最后就是关于EveryDNS的,我已经是第3+次接到他们通知我转移域名的邮件了,EveryDNS本月底就到彻底关闭了,掐指一算,不剩几天了。为免费模式默哀,我的下家已经找好了,就是飓风电子(HE.net).

不过我可能要等到月底才会转过去,EveryDNS我还要用一阵子~

好了,就是这些。

eclipse上android项目编译出错的解决办法

最近Android很火呀,我也打算抛弃现在的moto手机,入手一个基于Android的手机了,看来看去就锁定即将上市的魅族M9了.

话说距离m9上市还有一段时间,闲得无聊便打算先熟悉一下android(安卓)系统,因为android是基于linux内核,由java语言实现的开源手机平台.故而也让我有了动手的理由,于是就按照 developer.android.com (这里要bs一下GFW, *.android.com 居然被墙了……) 上的文档先写一个"Hello,Android"出来.聊以自慰了一下.

下载安装了android sdk 和 Android Development Tools (ADT) Plugin for Eclipse (地址:https://dl-ssl.google.com/android/eclipse/),重启了下eclipse,就可以创建Android项目了。

跑了一下项目,发现sdk 自带的模拟器真不错,感觉和真机差不多了,也算先尝尝鲜了 呵呵

不过,在运行项目的时候,发现一个问题。就是一旦android 项目被清理(Clean)了源码,再次编译会出错,而且永远通不过 囧rz...
如图:
项目编译出错

注:我用的是中文版的eclipse(在此感谢babel国际组织),所以不清楚英文版下报错信息是什么,所以我也搜不到任何有用的信息。不过最下面错误我以前是遇到过的,英文是“The project cannot be built until build path errors are resolved”.

这个gen下面的文件都是自动生成的,不可以人工操作.

在网上搜索了一下,有人说可以通过项目右键菜单里面的 "Android Tools" -> "Fix Project Properties" 解决,貌似不行.
这个郁闷呀,后来我找啊找,终于找到了解决办法。

那就是,如图:
配置buildpath

是构建器(位于 项目->属性->构建器)次序的问题,请确保项目中的 java 构建器 始终位于最后.
调整好后,清理一下,再次编译即可通过.

该错误虽然很小,可是却很恶心。希望对某些正在挠头的人有所帮助. :)

基于Gaelyk框架快速开发谷歌云计算应用

其实这篇文章很久就打算写了,本来的想法是计划等到我的wp4gae项目有了博客雏形的时候,顺便写出来的。

可是事与愿违,我打算用groovy实现绘制验证码遇到了技术瓶颈,项目就一下子死在那了…详见邮件列表存档 囧rz

这一死就死了近两个月……好了,言归正传,话说用gaelyk 开发谷歌云计算(简称GAE)还是蛮棒的,而且它也是难得的几个面向GAE平台的groovy框架.

我就是在groovy官网看到它的链接的,主页是:http://gaelyk.appspot.com/,可以说gaelyk是一个又轻量级又强大易用的框架.

首先,确保本地eclipse(原谅我,我用的是eclipse) 安装了Google App Engine Plugin for Eclipse,Groovy-Eclipse 插件.
根据消息,后者最新版本为 Groovy-Eclipse 2.0.2,安装地址为:
http://dist.springsource.org/release/GRECLIPSE/e3.5/
http://dist.springsource.org/release/GRECLIPSE/e3.6/ (for Helios)

顺便说一句,eclipse 最新版本3.6 在widnows下有内存溢出现象,经常导致假死,这已经是公认bug了.

在groovy 和 gae 插件安装了后,现在可以创建基于gaelyk的项目。
有两种选择:
1,只下载 gaelyk-0.4.2.jar 文件,在项目中导入.缺点是必须对项目目录结构很清楚。
2,就是下载官方提供好的项目模板,解压后,可以直接导入到eclipse中。而且里面还自带了一些GAE的jar包.

本人选择的是后者方法,里面还有一些例子,可以参考学习.

一切完成后,目录结构如图:
gaelyk-directory-layout

前期工作好了后,就可以开始开发项目了.

习惯了一般的b/s开发,忽然转变到云计算平台,一般人都不会太舒服。不过gaelyk 是遵循经典的MVC模式的,它把视图和后台的逻辑处理很明显的分开了.

视图前台显示部分交给了视图模板 *.gtpl(相当于jsp),而把处理程序通通放在了Groovlet 里(类似servlet)。这样的话,思路就变的清晰了.

和jsp一样,gaelyk提供如 request、response、appliaction、session 等隐式对象,随用随拿.

当然,gaelyk 还提供了一些特殊的内置对象,比如 params(据说是学ruby on rails),就是一个封装了请求体里面参数的键值对集合, 或者像 headers,就是请求头里面的信息,以供用户调用.
厌烦了log4j ?不妨尝试下 gaelyk的 GroovyLogger,一样很棒。

除了这些个一开始就实例化好待用的对象,官方叫它“积极变量”,gaelyk 还提供了一些“消极变量”(即第一次请求时才实例化),
有点类似于 饿汉模式 和 懒汉模式阿.
如 out、html.

当然还有一些 gae 的对象,如 datastore,用于操作数据库.厌烦了gae 自带的jdo、jpa 方式。尝试一下gaelyk的条件式查询,很是方便。最重要的一点是其中不会产生一句sql语句,呵呵,sql不好的同学们有福了 :)

在gtpl 视图模板里面,默认支持el表达式,原生态支持 小脚本、代码块以及表达式.(因为groovy也是java 囧rz)
还有更有趣的,gaelyk 导入类时支持通过 as xxx 起别名,很方便.而跳转和重定向的时候也有简洁的办法,直接 forward "url"、redirecr "url" 即可,再也不用Request.xxx.dispatch.xxxx.findforward 了.

gaelyk 还有一个亮点就是,支持地址重写.只要稍稍编辑 web.xml (交由 RoutesFilter 处理),再指定规则文件.
就可以实现伪静态了.
如 get "/topic/@title" forward:"/[email protected]" 即可.而且还可以通过 validate 进行验证,过滤掉非法参数. 让被注入成为往事. 呵呵
并且,从gaelyk 0.4.1 开始,支持缓存 cache 了.如 cache: 3.hours 即缓存3小时.

还有更让人叫绝的,gaelyk 里面根本不需要实体类,呵呵
因为Entity对象是可以直接构造的,而且groovy 里面没有对象类型的区分(灰常像php、javascript),也就给了方便.
比如我创建一个用户,包含用户名、密码.

Entity entity = new Entity("user"); 注意导包 import com.google.appengine.api.datastore.Entity

然后只需要用户从表单提交对应的值过来。填充入user实体中.
还在用request.getxxxbyxxx???忘了上面提到的 params ?

gaelyk 提供你想不到的方法访问实体,
entity['name'] = params['name']
或者
entity.password = params['password']

亦可 entity << params 全部填充.

这时候,只需调用 entity的 save() 方法,就可以将数据持久化了.
删除只需同样调用 entity 的 detele() 方法即可,若需起事务,只需把语句放入datastore.withTransaction{}的闭包中即可.

怎么样?增删就是如此的简单.

至于查询,更是简单.指定要查询的实体,扔给几个条件、标准就出来了(有点类似hibernate的Criteria查询).
创建query.
def query = new Query("user")

给出条件(相当于sql where)
query.addFilter("name", Query.FilterOperator.EQUAL, "xxx")

指定排序(相当于sql order by)
query.addSort("name", Query.SortDirection.DESCENDING)

预编译
PreparedQuery preparedQuery = datastore.prepare(query)

设定单次结果集大小,和漂移位置.实现分页
def list = preparedQuery.asList(withLimit(10).offset(20)) //查询20到30列.

这样增删查均完成了.gaelyk 真的是很省事呀.

当然,gaelyk 提供远不止这些,还有像 email 功能、memcache 功能、 BlobStore 、queue 等功能.这些我都没有用过,将来可能会更多.

不过作为一个开发者来说,这样的框架只会让我们的工作越来越方便,效率越来越高.

关于gaelyk 的更多例子,见:http://gaelyk.appspot.com/tutorial
如果对我的wp4gae源码有兴趣,请看:http://code.google.com/p/wp4gae/source/browse/

wp4gae现运行于 http://xia-zhengxin.appspot.com/,欢迎围观.
注:相当alpha的版本.

这是怎样无耻的一个人!!

昨天我发现我搭建在000webhost上的文件共享平台,无法访问了.
怀疑DNS出了问题,一检测没有问题.

挂了代理访问正常,看来是被墙了.
我的帐号是被分配在server12.000webhost.com上的,ping 了一下,没有响应,可以确诊了.

也不想再申请新的帐号,因为转移数据很累.而且这么经常无法访问,本身和我搭建文件共享的目的冲突,我也受不了。

想到除了文件共享之外,我的xiazhengxin.net.cn 域名也没有别的用途,而且freedns.ws 经常抽风.
我便打算把它转移到xname.org 上面去,稳定点好.

我的三个CN域名只有.net.cn 没有转移过去,因为我之前说过要留条后路,现在看来这条后路也不需要了.

当我登录xname.org后台,点击 Create zone ,填上我的域名,点击create 按钮后,我惊呆了!
居然提示说,该域名已经被添加入系统了,而且那个人不是我.如图:
添加冲突

我检查了一遍,是的呀!我的确是添加了.cn|.org.cn 两个域名,如图:
域名列表

究竟是怎么一回事??
这个域名一直是我在用,在我之前也没有人使用过。

难道是tmd有人恶作剧?我晕哪,这是多么无聊的一个人哪,更加无耻!
我的域名和你有一毛钱关系么?你注册了又能怎样?

最后只能是我选择了另外一个DNS ISP,而你得到了一个空列表.

囧呐,真是什么人都有……
而且,从我的遭遇中可以看出一个问题,就是在dns isp 处添加域名,缺乏最基本的域名所有权认证。导致是个人都可以去添加记录.

建议dns 服务商们可以学习谷歌,要求站长添加一条cname记录,或者在根目录上传认证文件等。
通过这些手段,让那些个无聊无耻、搞破坏的人无机可趁.

但愿,我只是个个例.