Tairan's Story

「知之真切笃实处即是行,行之明觉精察处即是知,知行工夫不可离。」

使用 Go 调用 Windows API

Go 通过 cgo 可以利用现有C语言库

例如在 Windows 中使用 Go 调用 Win32 API

首先安装必要的工具

  1. Go
  2. MingW
项目文件完成后的布局
1
2
3
4
5
6
7
8
9
10
11
%GOPATH%
    +- src
        +- w32api
            +- kernel.go
        +- testapp
            +- main.go
    +- bin # go install testapp
        +- testapp.exe
    +- pkg # go install w32api
        +- windows_386
    +- testapp.exe

包装 Windows API

kernel.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package w32api

// #define WIN32_LEAN_AND_MEAN
// #include <windows.h>
import "C"
import "syscall"

func GetCurrentDirectory() string {
    if bufLen := C.GetCurrentDirectoryW(0, nil); bufLen != 0 {
            buf := make([]uint16, bufLen)
            if bufLen := C.GetCurrentDirectoryW(bufLen, (*C.WCHAR)(&buf[0])); bufLen != 0 {
                        return syscall.UTF16ToString(buf)
            }
        }
    return ""
}

注意

在 import “C” 和 // #include <windows.h> 之间不能有空行

编译并安装

1
2
go build w32api
go install w32api

调用

main.go
1
2
3
4
5
6
7
package main

import "w32api"

func main() {
    println(w32api.GetCurrentDirectory())
}
1
2
go build testapp
go install testapp

Troubleshooting

  • can’t load package: package w32api: import “w32api”: cannot find package

原因是没有设置环境变量 GOPATH

  • exec gcc: exec: “gcc”: executable file not found in %PATH%

原因是 gcc 所在目录没有加入道 %PATH% 中,检查 MingW 是否正确安装,并将 bin 目录加入到环境变量 %PATH% 中

参考

使用CGO封装Windows API

我的 Kindle 3

经常阅读的人应该入手一部电子阅读器,在信息时代我们的时间都已经分割成若干的碎片,阅读的场所随时都在变化,此外出门随手带上几本书也是常有的事情,如果书籍电子化了,随身带上一个小图书馆也不是什么难事。

根据自己的喜好,我选择了 Amazon 的 Kindle 3,最近 Kindle 4 touch 也出来了,如果也需要的话可以考虑入手一部。在使用 Kindle 3 的过程中我遇到了一些事情,现在记录下来。

我买的是 Kindle 3.5.1 WIFI 广告版,主要的原因是价格,虽然 Kindle 的价格已经比较低廉,但是工资有限需要用钱的地方又很多,所以选择了既能阅读又少花钱的版本。很多人担心广告版会到处铺满广告影响使用,实际上广告只会出现在2个地方:一个是待机屏幕,另一个是 Collection 的下脚,也就是所有书籍目录的下面,不是某一本书的目录。广告的内容大都是一些打折信息,曾经有人出钱买 Kindle 上的 Mac 打折促销代码。广告画面设计的也挺精美的,待机的时候就当换桌面背景了。

刚入手 Kindle ,一个很重要的初始用途是用来看技术文档,比如 RFC, 因为贪心,把所有 RFC 的 PDF 格式文档大约 6000+ 的文件一次放进 Kindle ,悲剧发生了,Kindle 罢工,会重启,无法响应。 后来实际的实践证明,在 Kindle 里一次放入很多书籍是一个巨大的错误,Kindle 的计算能力有限,书籍多了不易查找,一次放入很多书,自己都不会怎么看,完全背离的电子书最初的用途:阅读。对于我来讲,一次在 Kindle 中保有 10-20 本已经足够。

经过这段时间的使用,发现 Kindle 3 并不适合阅读技术书籍,尤其是A4尺寸的 PDF 文件。全屏,竖着看字体太小,横着看一屏无法显示整页,字体放大到任何尺寸后也都会一屏无法显示整页,用5way键移动很痛苦。也许 Kindle Touch 出来后会改善?

柳暗花明又一村,看技术文档不方便,可看其他的人文书籍简直就是天生佳品。一本接着一本,总觉得书籍来源太少。毕竟 Kindle 3 还没有正式进入景德镇,中文书籍依赖网络上各个站点提供的盗版,那感觉就是想花钱买正版却没有货。现在也有些网友准备做正版阅读计划,可那也是才开始,还不知道能否突破景德镇的限制。我也设想做一个电子书分享平台,将目前没有版权或者是自由版权的书整理成某种中间格式,然后生成各种电子阅读器的版本。这潭水太深,这个想法也只是停留在想法这里。

在决定买 Kindle 之前也考察过盛大的锦书,从价格来讲,锦书很有竞争力。但是有两个原因让我放弃了,第一是锦书的云中书城都是所谓的网络文学,99%的作品绝对是猴子打出的汉字。即锦书无法提供有价值的正版书籍购买渠道。第二是锦书配套的环境太差,所谓的管理软件云梯,在英文 Windows 系统上到处乱吗,bug 满天飞,各种限制。花钱买电子书不是为了折腾的,既然花钱就要有好服务,比起 Amazon 的 Email deliver 和 Kindle 支持的各种文档以及配套软件差太远。

Kindle 在使用 WIFI 的时候有个问题,如果 WIFI 信道使用大于 10 的时候,它无法搜索到 WIFI 信号。Mac OS X lion 也有这个问题。路由器上的无线信道设置成自动的或者1-9都可以解决这个问题。

Kindle 还在使用中,如果遇到其他问题再继续记录。 Enjoy reading. :-)

独立程序员接定制软件开发项目总结

定制软件开发中陷阱重重,主要的原因是客户对自己的需求不清楚。很奇怪吧? 客户竟然对自己想要什么东西说不清楚。事实上,在软件开发领域这是常有的事情。软件这玩意抽象,看得见摸不着,甚至看都看不见。让对技术一无所知的人来描述自己想要什么样的软件,太困难了。 这样的事实对乐天派的程序员来讲就是一个噩梦,这里引用西乔姐在 Twitter 上发表的一段话:

@arthur369: 千万不要相信那些在谈需求的时候说:“做一个和XX一样的就行了” 的人。其实这种人最好就不要和他一起做事。因为最后结果只有2种,1、你白做了(需求一定会变动数次);2、做出来一个垃圾。”

最近我就接到一个这样的项目,刚开始的版本是对照着某软件的前一个发行版做,然后又变成了要具有此软件当前版本的某些功能,最后又发现客户的客户已经有一个类似的软件,于是乎又开始向模仿此软件+改进的方向前进,漫漫长路多折腾,如此多的波折才算拿到最终的需求。真正的需求拿到了开始加班加点的做了,可麻烦的事情还有。

这是一个远程的项目,我在南边,客户在北面, 还好在同一个国家,都说中国话。沟通的次数那叫一个寒碜,三、五天都不一定能接上头,接头的方式基本是邮件和IM,电联不多,软件本身的开发经费就不高,如果直接电联估计都支援给中国移动了。

在项目进行中第一次改变需求的时候,我是做好了心理准备的,毕竟那么多前辈的经验摆在那里。此时我在想借由着自己快速迭代,不断的改进软件原型来拿到真正的需求,理论上这种方式是可行的,总会拿到最终的需求,然后做下去就是了。可现实是残酷的,没有充足的时间,即使你承接项目不要多少钱,客户那边随着时间的流逝也会损失很多本该赚到的利润,咱都是凡人,耗不起呐。

和此类不甚明白软件开发的客户打交道还有个问题,软件里面的实现似乎并那么重要,漂亮好用的UI才是让他们看起来软件是如此美妙的东西。作为独立工作的程序员,大多对外在美没有多少的品味,黑客们更是喜欢默默无闻、稳定可靠后台运行的程序。缺少在美的层次上的交流,后端代码交流更是一团糟,客户说在这里加个东西然后这样动,你后端的东西写的不好则会伤筋动骨。

总之,定制软件开发的项目成本很高,劳神费力不讨好。因为程序员不但要保证有一个很快的开发速度来适应软件的变化,同时也要担负起教育客户的重任,还要培养出对美欣赏的品味。通常此类软件开发过程中得到的物质报酬不多,好处是对于软件开发的新手来讲,通过那么几次定制软件开发的折腾可以快速成长,怎么说也能成为一个快速山寨的熟手。如果你是一个拿着不错的薪水的在职人员,我看还是算了,与其浪费如此之多的精力和少的可怜的报酬,还不如好好钻研自己本身工作上的业务,或者干脆多陪陪身边的人吧。

为Fedora 15安装64位的FlashPlayer - Update

Update 现在Adobe已经提供正式版本下载 http://get.adobe.com/flashplayer/


总的来说,复制下面的代码并执行就可以将64位的flashplayer安装到fedora 15 x86_64上去了。截至目前为止,Adobe 依然没有官方的正式版flashplayer 64bit版本释放出来,只有在http://labs.adobe.com 能拿到测试版本。不管怎样,测试版本在fedora上工作的也不错。:-)

INSTALL

#!/usr/bin/env bash

FLASH=http://download.macromedia.com/pub/labs/flashplayer10/flashplayer10_2_p3_64bit_linux_111710.tar.gz

cd /tmp
wget -c $FLASH
tar zxf flashplayer10_2_p3_64bit_linux_111710.tar.gz

# apply plugins for firefox
cp libflashplayer.so /usr/lib64/mozilla/plugins/libflashplayer.so

# remove cache
rm -rf libflashplayer.so
rm -rf flashplayer10_2_p3_64bit_linux_111710.tar.gz

UNINSTALL

rm -rf /usr/lib64/mozilla/plugins/libflashplayer.so

转战亚马逊EC2

EC2 Nginx PHP FastCGI MySQL WordPress

关于 Amazon EC2 的教程已经铺天盖地了,有英文也有中文。现在EC2对新注册的用户有优惠,及Micro Instance级别的会有1年的免费份额。注意只是对新注册用户,如果你已经注册了 AWS 账户,即使并没有开通任何服务也不属于新注册用户,意思就是只要你使用就没有免费的。这一点我是用了$2美金的账单换来的教训。网上也有其他同学遇到,看来不仔细阅读文档就是没文化的代表。这里是账单查询地址https://aws-portal.amazon.com/gp/aws/developer/account/index.html?ie=UTF8&action=activity-summary 一旦发现产生莫名其妙的费用,赶紧查。

我这次使用 Amazon EC2 的目的是把即将到期的博客迁移到这里,并且让手中的一些闲置域名也利用起来。其中还有一个更重要的目的就是为部署一个很重要的网站,基于Django的。

首先要做的是迁移博客。 进入 EC2 后需要安装一些软件,因为Micro Instance只能使用Amazon Linux(redhat系),所以包管理器使用的是yum。

sudo yum install mysql mysql-libs mysql-server php php-mysql spawn-fcgi nginx

启动MySQL后,并更改root用户的密码

sudo service mysqld start
/usr/bin/mysqladmin -u root -p -h localhost password 'newpassword'

配置 Nginx, 在这里我遇到了一些问题,折腾了一天才搞定。这里要十分的感谢网友 hfw_1984 的帮助。遇到的问题主要集中在fastcgi部分,如果要让Nginx支持我博客的URL格式如http://www.tairan.net/index.php/2011/03/30/follow-the-right-way/ 则必须参照以下配置:

    location ~ ^.+\.php {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;  # 这一行必须放在 SCRIPT_FILENAME 上面,否则会被覆盖。
        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        #fastcgi_param   PATH_INFO   $fastcgi_path_info; # 这两行并不需要
        #fastcgi_param   PATH_TRANSLATED $document_root$fastcgi_path_info;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
    }

Micro Instance 默认提供的Nginx Version: 0.8.53

以上就是这两天的战果,还有其他的一些东西已经被写成自动化脚本,为方便备份数据,再次迁移、部署提供方便。

总的来说在墙内,使用EC2也不错,性价比不是最好,但是绝对值得试用。:-)

守规矩才能行的方便

规矩是无处不在的,使用工具也有使用工具的规矩,就像你不能拿个榔头去拧螺丝一样。 就算是软件也有其使用的规矩, 经常看到有人抱怨某个软件怎么样的难用,其实大多数情况下他是用使用其他软件的习惯去使用另一个软件,也就是因为没有遵守使用此软件的规矩而带来的诸多不便。当然也有极少部分的软件真的很难用,那么就打破规矩,重新建立一个。

举几个例子, Windows 上的软件管理,如果不用第三方的软件管理工具的话,那么使用MSI安装,卸载就是它的规矩。 Debian/Ubuntu 则是 apt-get 进行软件的管理,如果你使用咒语的话 ./configure & make & make install 那么就要自己去管理软件的诸多文件。 Mercurial 如果你要删除或者移动文件那么就使用 hg rm / hg mv 的命令来做,而不是直接的 rm / mv

如何判断程序是安装后第一次执行

有时我们需要在程序第一次启动的时候进行一些初始化工作,如何识别程序是部署后第一次运行呢? .net framework就提供了这样的功能。

参考这里 http://msdn.microsoft.com/zh-cn/library/system.deployment.application.applicationdeployment.isfirstrun.aspx

这里还有更多的关于.net 程序部署相关的技术说明 。http://msdn.microsoft.com/zh-cn/library/system.deployment.application.aspx

如何在Alwaysdata上部署Django应用

Alwaysdata是一个法国的ISP,提供相当不错的VPS,共享主机等服务,而且免费的项目也相当的好,可惜你需要在墙外才能享受到如此高档的服务。

在Alwaysdata的wiki上已经详细说明了如何部署Django的应用,但是如果一丝不苟的依葫芦画瓢你未必能一次成功,因为这篇文档还遗漏了一点。

你还需要在project的根目录中放一个.htaccess 如下

project
     |-- apps
     |-- public
            |-- django.fcgi
            |-- .htaccess
     |-- .htaccess
     |-- settings.py
     |-- manage.py

而这个 .htaccess 的内容是:

AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ public/django.fcgi/$1 [QSA,L]

读《创业者》

这本书我读的是中文版,现在我还是无法流畅的阅读英文版以及购买英文版对于墙内的我来说也是在是不方便。既然是翻译版,那么总会有几个人跳出来说翻译的不好,我认为翻译的质量固然重要,但是你不能因为还不至于影响阅读的小毛病来排斥一本好书。

Founders at work 英文版 中文版

曾经在书店蹲点看过第一篇关于Paypal的,其他的都是跳着看的,因为这本书对32个不同的创业者的采访,所以跳着看是最合适的。你喜欢谁就可以先看谁!

这本书里,我最喜欢的几个人是:史蒂夫·沃兹尼亚克大卫·海涅米尔·汉森乔尔·斯波斯基埃文·威廉姆斯梅娜·特洛特。当然其他的人我也很喜欢,但是这几个人对现在的我来说,影响颇深。

在我眼里,史蒂夫·沃兹尼亚克简直就是一个完美的黑客,好吧,你可以把Apple I当作一个玩具,但是Apple II对个人计算机产生了划时代的影响,正是史蒂夫·沃兹尼亚克一个人独立完成的Apple II,从硬件组装设计到操作系统以及编程语言等。我最欣赏史蒂夫·沃兹尼亚克对待计算机的态度:如果没有那就自己设计一个吧。另一方面,史蒂夫·沃兹尼亚克的人格魅力也很强悍。就是一超脱的大侠,自己专注技术的同时并不去计较物质上的所得,也许你觉得他赚了很多钱,并不单纯,可赚钱对他来说真的只是副产品。所以他会将自己的股份分给40位他认为对苹果有贡献却没有得到股份的工程师。

埃文·威廉姆斯和梅娜·特洛特要放在一起才会更有味道,他们分别是Blogger和TypePad的创始人。Blogger最终被Google收购,目前被挡在墙外。而Blogger在被收购之前的发展并不是一帆风顺的,因为埃文·威廉姆斯开不起员工的工资,把公司解散了,成了孤家寡人。但是埃文·威廉姆斯并没有放弃,带着Blogger扛过来了,而且他还创建了Twitter,当然这个也是墙外的。TypePad在发展的过程中好像并没有比Blogger惨,但是这对程序员夫妻过的也不是一帆风顺。虽然没有得到被大牌收购的命运,但是他们写的优秀的博客程序赢得了众多的付费用户。他们不但运营着TypePad,还创造了一个很强大的独立博客程序MovableType。有意思的是埃文·威廉姆斯和梅娜·特洛特都在很糟糕的环境下坚持了下来。

大卫·海涅米尔·汉森和乔尔·斯波斯基是我目前的指路明灯!大卫·海涅米尔·汉森是2005年的开源软件评选出来的年度最佳黑客,他们的团队不仅创造了划时代的RubyOnRails,而且运营的产品也很成功。乔尔·斯波斯基更是大名鼎鼎的著名小公司的领头羊。他们两个人让我看到了希望,公司并不一定要大,要上市,重要的是要让公司健康的运行,良好的舒适的工作环境,不错的盈利能力,即使是小公司也会活的很滋润。这种小公司的发展模式很适合互联网时代的程序员。这就是我看到的希望!

论人生

这篇文章已经躺在我的硬盘中一个月有余,题目起的有点大,正因此我总是觉得自己写出来的东西不够深刻。不过我还是先把它放出来,现在不放又不知道多久才能放出来。借此希望能够引起一些看客的共鸣,最好能得到一些中肯的建议,让我完善自己的思想。

文章全文如下:

论人生

在岔路口 爱丽丝问猫:我该选择哪一条路? 猫:那要看你去什么地方? 爱丽丝:随便什么地方都行。 猫:那你选择任何一条路都可以。

人生就是岔路口的选择题,一条是随便走一条路,另一条是选择一条通向自己目的地的路。

不管你做出什么选择都没有对和错,人生就是如此,出生后一步步地走向死亡。

当你随便选择一条路,可能你在认为这是顺其自然,路通向何方走着瞧。我认为这是很浪漫的选择,能顺其自然则不会感受到被自然规律所束缚的痛苦。然而做出这样的选择,则说明你有足够的信心和一份不用为物质所担忧的心。如果没有这些,这个浪漫的选择会被现实打击地粉碎,并不断的折磨你。当你认为你是在顺其自然的时候,请回忆一下,你是否为之前的一个决定,例如没有得到更好的收入、浪费了好机会而后悔?如果你回答是,那么你真的没有足够的能力去浪漫。

如果选择的是另一条通向自己目的地的路,恭喜你,你选择了一条充满荆棘的痛苦之路,但当你接近或者达到终点的时候会充满着幸福。选择这一条路,在世人眼中你是功利地,世俗的。其实我说这是条现实之路,当然现实并不是说让你势利,而是脚踏实地的一步步的前进。人的能力总是有限的,如果你认不清自己的能力,那么通常你会高估自己,而高估自己的结果就是不断的碰壁。

在人生的路上,很多人遇到的问题是在这两条路门口徘徊,想浪漫,但没有资本,想现实,却不知目的地是何方。

一颗聪明的大脑加上一笔丰厚的遗产足以让你做出浪漫的选择。如果你没有那么还是现实一点比较好,意欲带来的痛苦总是自己心甘情愿忍受的。

实事求是的做出自己的选择,无论是在宝马车里哭,还是在自行车上笑都应该是无怨无悔的。