golang cgo编译问题与坑

golang这个语言最大的好处就是和c结合得非常好,非常方便与c互相调用。虽然其他语言也可以调用c的库,但是调用没有golang这个语言这么方便。其实想讲,golang就是现代版的c语言。

首先golang如何调用c的库,文档写得比较清楚。请参照文档cgo编译cgo命令。这个看来之后基本就大概明白了。而且讲解了一些基本的类型转换。例如string的转换等。不过真实使用的时候,会用到char**的。这个问题如何解决。stackoverflow上有解,请自行观看。

看完这些问题,大家觉得是不是就没有问题。我也是这样想的,不过真实的时候就遇到一个非常恼火的问题。就是golang对格式的一些严格要求。

问题来源,在调试cgo的程序的时候。发觉本来调试好的程序,后来也没有改什么,突然编译不了。找了很久也没有找出原因。由于是测试代码,没有放入代码管理,回滚不了。看来看去也没有看出什么问题。最后只能从最开始重新编写这个代码。最后发现是一个空行引发的血案。悲哀啊,搞了我大半天。

看下边的代码吧:

package main

/*
#cgo CFLAGS: -I .
#cgo LDFLAGS: -L . -lclibrary

#include "clibrary.h"

int callOnMeGo_cgo(int in); // Forward declaration.
*/
import "C"  //这里不能与上边注释的c代码有任何空行。

import (
        "fmt"
        "unsafe"
)

//export callOnMeGo
func callOnMeGo(in int) int {
        fmt.Printf("Go.callOnMeGo(): called with arg = %d\n", in)
        return in + 1
}

func main() {
        fmt.Printf("Go.main(): calling C function with callback to us\n")
        C.some_c_func((C.callback_fcn)(unsafe.Pointer(C.callOnMeGo_cgo)))
}

大家可以尝试在import “C”上边插入空行。你就发现会不能编译了。真是不太明白golang为什么搞怎么严格的格式检查。真的服了它了。多一个空行而已。

还有一个问题是,目前我使用cgo与ffmpeg的库进行编译,经常出现编译问题。但是重新编译多一次就成功了。也搞不懂什么原因。

今天google reader被判死刑。7月进行处决。

今天google reader被判死刑。7月进行处决。听到这个消息后,感觉google切底地变了。不作恶,真tmd的狗屁。乔布斯讲得没有错,google的不作恶口号,就是狗屁。上次在google GAE服务把免费时间大幅减少,我已经吐槽过一次了。这次真的要认真思考以后是否继续使用google的服务了。

google reader是我每天必修课。每天都会在itouch,ipad上用byline扫描RSS.每天在上边花费的时间超过1小时。上边订阅的RSS源超过200个。如果没有google reader是否有影响,我估计还有3个月的期限。找代替的方案应该会有的。不过可能会没有那么方便。

由于google这个巨人,所以好多人围绕着它的api开发了好多应用。例如一些rss阅读器基本上都使用google reader为接口,方便不同设备之间同步。

大家尽量逃离google服务把。其实我最早以前是用抓虾的rss服务的。由于出现过一段时期不稳定,也听说它会倒闭。所以我转用google reader。当时转用google reader最大的原因是因为它老爸是google,相信这个服务不会倒闭。最多被墙。今天睇来我是错的。

大家尽量逃离google服务把。我从今以后都不会向别人推荐google的服务了,也号召大家远离google服务。目前除搜索业务没有很好的代替品,其他的项目都有其他很好的代替品。我自己也不使用他新推的服务,起码不会把重要数据存储在google上边。那些什么google存储千万别用。等你存储上当数据的时候就告诉你要收费,不交钱,你的数据就没有了。tmd,tmd。

目前我还是gmail的用户,好怕有一天这个强大的gmail告诉我要关闭或者收费了。要计划好gmail逃亡路线了。大家一起逃离go ogle把,尽快逃离,让google死去把。

Google App Engine(GAE)真的TMD它,再不免费了。

Google App Engine(GAE)其实我已经使用了差不多2年多了。我一直都是使用免费账户。因为我的应用非常简单,而且也没有对外用户,只是帮助自己定时搜索和统计一些网络数据。使用免费账户还有很多的余量。在上个月已经知道google修改收费标准,而且已经有写bloger反应google这次比较坑爹的。当时自己也没有想太多,想想就是减少配额也应该不会影响到我的。因为我原来也只是用到免费配额的20%左右。应该不关我事。也么有去查看google新的配额说明

直到上星期google正是实施新的配额制度之后,我发觉我放在GAE上的应用彻底down了。开始我还以为程序是否出问题,或者没有升级到最新的GAE版本。后来检查了一遍。并没有发现问题。我就开始怀疑新的配额制度。于是登录GAE Dashboard页面,一看配额情况,数据库读写配额已经100% over了。马上去查看新的配额制度,泪奔啊!!!真的缩减了很多很多。网上搜索了,叫苦的真的非常非常多,不是一般的多。有些用户使用mircoBlog把博客安家在GAE上的用户,就是没有访客浏览自己的blog,就是应付来自各大搜索引擎的蜘蛛已经把配额用完了,免费配额基本上只能用于自我测试使用。普遍用户都在臭骂google。这次收费升级,在数据库的读写配额上升幅最大,而且收费最贵。

我在一年前曾经想把这个blog移植到GAE上,想把空间租用费省下来。不过后来没有太多时间去移植,所以完成。现在真的万幸当初没有这样做,否则今天你也不会看到这个blog了。我在这里也要骂一骂google这次的行为。虽然企业是要赚钱的,但是也要对客户要有个交代。价格升幅不能太大。而且起码提前1年通知。现在升幅大,又只是提前1-2个月通知。如果在GAE上跑正式业务的用户基本上只能乖乖交钱,要不然就停止业务。因为把程序迁移到一个新的平台并不是那么的简单。

google的不作恶的口号去了那?先用免费或者低廉的费用吸引你把平台建设在他们的服务器上。当年离不开他的平台的时候,他会同你讲把你的荷包打开,我要把你的钱全部拿走。乔布斯曾经对google的“不作恶”口号的评价是:“放屁”。看来乔布斯看事情看得非常透切。google最近把好多服务都升级了,我说的是服务收费升级了。很多服务的免费配额都调低了,收费调高了。据我所知道还有google map API,企业邮箱等。以后大家做开发的时候选择一些google的服务时候就要额外留神。要做好随时转换其他平台的准备。要不然就会出问题。以前我太崇拜google了,我经常推荐别人使用google的服务,原因是好用且免费。现在我会叫大家三思阿。大家也要注意这个问题。感觉就像早段时间淘宝商城的升价问题一样,先低价吸引你进入,再掉高价格来卖。

现在大家都比较推崇云服务,我开始也觉得云服务是非常好的一个服务。因为初期投入不会太大,可以随时扩充缩小。非常适合一些小型企业。现在大家选择云平台的时候一定要考虑移植性的问题。可以随时逃亡,或者在两个云平台同时运行,可以随时切换。

htc legend升级andriod 2.2失望中

早两天把老婆的legend手机升级到andriod 2.2了。通过官方的OTA升级。升级过程一共使用了1个小时(包括wifi下载升级文件).整个过程还算顺利,不过在升级前备份数据提示失败,然后只有一个选择“确定”。按确定后就自动升级了。不过升级完成后重启手机的时候出现com.andriod.phone没有响应,可以选择“停止”,“等待”,“取消”.我选择了等待。升级后发觉有gprs的设置和彩信设置都要重新设置。其他都没有发现什么问题。

由于升级当晚比较晚升级。升级完之后没有太多研究。结果第二天老婆返工回来就跟我投诉手机升级后比以前慢好多。有点不敢相信。因为2.2使用了JIT技术。理论上会快很多才是。结果我操作测试一片。短信软件好慢,自带和handcent都非常慢。还有拨号界面边输入边查询的功能非常慢。我个人感觉拨号界面不可能这么慢。未有重启手机。结果拨号界面那里不慢了。和原来的差不多了。不过短信还是好慢。

经过几天的试用。那个短信慢,真是慢得离谱,经常进入短信程序,等到部手机自动关屏幕,短信程序还未显示出短信。在短信按人分类列表上经常在滚动的时候经常假死。真的tmd失望。

除左发觉短信慢之外,发觉程序启动也慢了。大概等1-2秒先从主界面进入软件界面。我老婆不是一个短信狂。不过有个习惯就是没有删除短信的习惯。以前用出名慢的索爱的时候也没有这么慢。也是没有删除短信的习惯。现在只有找工具整理短信。

说了这么的唠叨,现在说点andriod 2.2的一些好处吧,界面有有些显示效果比以前好了。例如,进入程序和推出程序的动画也仿照了apple 的IOS4的风格了。还有一些图标漂亮了。

andriod 2.2的最大好处就是那个wifi hotspot(无线 AP,移动热点)。试用过2-3次,感觉还可以,不过手头上没有联通卡,体现不了速度。只能用移动的edge。感觉还可以接受,就像以前56K猫拨号上网的速度。速度不是太稳定就是了,估计是移动网络的不稳定。

升级后唯一发觉快了的就是浏览器的滚动速度。明显比原来的流畅了不少。对于我喜欢经常用手机上google reader来讲就非常好。而且现在google reader的显示效果也比刚刚买回来的时候好多了,已经和iphone的效果差不多了。大家看回我上次评论legend的使用评论就知道。

htc legend 升级2.2的感觉就是慢了,起码比2.1的时候慢了半拍。看来andriod 2.2的JIT技术并没有对java的运行有提升。虽然在升级之前看到好多评论都话2.2比2.1块好多。但是我的感觉和他们完全相反。只有浏览器的滚动和程序列表的滚动顺畅了。总体来讲再次令我对andriod的系统失望。不清楚是因为legend的配置低还是其他问题。legend现在来讲怎么都是一台中端的机器。不会太差。

如果有钱还是买iphone吧,我觉得买andriod的唯一理由是由于他价格比Iphone便宜得多。

Google App Engine试用与感受

google app engine是目前google的云应用中的最高级别的猛将。这两个星期试用了一下这个App engine。App engine是用来构建网络应用程序,例如你可以在上边开发一个blog程序,然后托管在google app engine上边,你不用再找主机托管商了,你可以使用免费版本,免费版本基本上有足够的配额给一般用户使用。当用户量增加后,你不用担心服务器的扩展。google会帮你做好一切,当然这样你需要给点钱。目前免费账号的程序可以使用可使用多达 500 MB 的存储空间和多达每月 500 万的页面浏览量(官方介绍资料)。一般用户可以用来做独立blog,有朋友已经写好了一个在app engine上运行的blog程序了– Micolog

目前app可以使用的语言有java和python。我无需思考就选择了python来做试验。因为我讨厌java。虽然我不会python,但是学习起来一点困难都没有。脚本语言不用关心内存管理。(在这里pk下java的内存管理,号称不用关心内存泄漏问题,但是实际上到处都是陷阱)。

这里讲讲App Engine需要注意的问题。开发环境一定要安装google所讲的python进行配置。不要使用python.26。需要下载新版本的App engine。我就在这个环境配置中吃了苦头。因为很久以前已经安装过App engine就旧版本。所在这次试用的时候就没有再安装新版本,发觉有些教程上边的程序不能运行,升级了app engine就可以了。

还有就注意是python的的环境。由于发布程序上服务器需要ssl认证,需要为python 2.5的环境安装ssl模块(http://pypi.python.org/pypi/ssl),安装编译ssl模块需要安装mingw32进行编译,并需要下边两个库。

libgw32c-0.4-lib.zip(http://nchc.dl.sourceforge.net/project/gnuwin32/libgw32c/0.4/libgw32c-0.4-lib.zip)
openssl-0.9.8h-1-lib.zip(http://gnuwin32.sourceforge.net/packages/openssl.htm)

另外要注意的是你的python环境是完全安装的版本,我开始使用的python版本是安装别的软件时候带的python2.5。结果这个python包并没有带编译模块的头文件。折腾了我一个早上的时间。不过我发觉app engine 1.3.3的版本在没有ssl的情况下也可以发布程序上服务器,不过没有了加密,很容易把你google的账号密码泄露出去了。

试用的时候发觉app engine的GQL的限制挺多的。使用上并没有sql那么变化多端的查询方式。有一定的局限性。

使用的时候要注意数据的索引(index.yaml),我在测试的时候开始没有注意索引这个东西,发现一些查询在本机上的测试环境上运行的时候ok的。但是当上载到服务器就运行失败。提示索引有问题。原来我试验的时候使用了google的demo程序guestbook。在原有的index.yaml文件中有些旧的数据索引,但是在我的新程序中并没有这些数据,导致上传index.yaml文件的时候失败。后来把这些数据删除了就可以了。其实只要你创建index.yaml文件,并插入下边内容。

indexes:
# AUTOGENERATED

基本上你不用关心文件还需要填写那些内容。在本机测试环境中index.yaml文件的内容可以根据你的程序中的查询语句自动生成的。上传到服务器的时候需要把这个index.yaml文件发布到服务器。

如果服务器你本身有数据,当你上传新的index.yaml文件的时候,服务器需要一段时间重新编制索引,需要等待索引编制完毕后你才可以测试与该索引相关的程序。

Dynamically loading Google Maps API V3 by JQuery

发觉google的一些应用的javascript接口API的的js文件下载有时候会比较慢,会影响网站的加载。好像Google Map API v3的js下载经常都比较慢,影响整体网页的显示效果。所以今天特别研究动态载入javascript文件。网上搜索了一下,无非都是那几个方法。不过我发现JQuery本身就自带一个动态下载javascript文件的函数,无需用一些插件。
jQuery.getScript( url, [callback] ) 官方说明

非常容易加重js文件,1.2版本之后就可以支持跨域下载javascript文件。

于是我就用了动态加载Google Map API v3的javascripte文件。

$.getScript("http://maps.google.com/maps/api/js?sensor=false",function(){
alert("Script loaded and executed.");
});

虽然显示了警告信息”Script loaded and executed.”, 页面变成了空白页面了,真是不解。开始怀疑JQuery的.getScript的问题,于是试了官方的示范例子,并没有问题。于是修改官方例子动态下载google map api的js。同样页面也变成了空白页。

估计应该是google map api v3的api问题,观看了http://maps.google.com/maps/api/js?sensor=false的源代码
继续阅读“Dynamically loading Google Maps API V3 by JQuery”