Flash Viewer for PDF - 整点flash…

一直以来就喜欢scribd,发现他的ipaper越来越强大。包括docstoc等都在向Flash Viewer靠拢
在网上随便的搜索一把,了解了他们的大致解决方案,我们也动手搞一把。
这些文章都来自晚上,版权归其所有哦。记录一下。(windows XP平台,linux下大致相同)
1, 首先PDF要转化成swf
通过swftools 提供的pdf2swf工具,转化为一个swf,其有很多选项可以参看文档,我是在windows GUI程序下进行,生成一个book.swf

2, 从这个老大这里,找来了一个simple的Flash Viewer,这里是对应的flashviewer.swf,还有源文件

3, 然后呢,通过swfcombine工具,我们将我们的book.swf和flashview.swf进行合并,生成一个简单的具有翻页,缩放功能的swf:

swfcombine.exe  fdviewer.swf "#1"=temp.swf -o mybook.swf

经过一段时间的等待,好了,我们的图书就生成了。

我比较狠心,把programming erlang给转换了一把:
pdf: 2719kb
book.swf: 1993kb
mybook.swf:3998kb

看看截图:

开始学习python了

harry.python以会不会python为纲,正好我一直以来都很想学习python,在这个经济危机的时代,就来个语言大跃进。
这个正好也是我09年计划的一部分,比较性急的开始python之路了。ps:我看到python的标识,就想起贪吃蛇。。。

harry推荐的A byte of python还在每日2章的赶工阅读中,我的Blog中会增加python的内容咯。。

顺便说说工作中的事情,我这次是痛下决心,再也不山寨了。一些基础的模块绝对不会在重复劳动,磨刀不误砍柴工。
http client现在用上了libcurl,很好很强大,ssl,http,ftp一应俱全,使用方便。
加密解密,openssl几乎可以全部胜任,候选是曾经让我着实头疼的crypto++
http server,使用yufeng推荐的shttpd,只要一个c文件解决问题
xml处理用上了轻量的tinyxml以及libxml
本地数据库,采用sqlite,小巧玲珑
也就是这样了,以后的原则是,尽量少的开发windows客户端。。天啊,解放我吧。

2008 Review and My 2009

遵循网络习俗,辞旧迎新,回顾过去,展望未来!

2008做过的:
开始在linux下进行开发
使用Vim,Emacs,熟悉Shell,Make
接触并系统学习Erlang
了解了更多开源项目
使用 MFC/WTL 编写了N个Windows应用
参加Programming Erlang的相关活动
参加Erlounge III
使用Erlang尝试开源项目
认识很多的朋友

2009要做的:
继续E2dynamo,发布多个版本
进行更多Server相关开发,期待从事相关工作
学习python,经常使用c
阅读couchdb和ejabbered代码
用Erlang解决更多的问题
了解更多协议和标准
更多的好友,更多的文章

Tiny Notes About Erlang Syntax

Literal Term
int, float, atom, tuple, list, binary
in predefined attributes and user-defined attributes, the Value must be literal term. for example:
some_module.erl

...
-attr1(1).
-attr2(1.0).
-attr3(correct).
-attr4({1, 0}).
-attr5("good").
-attr6(<<"good">>).
...

all the attributes is normal.

List Comprehension

for example:

L = [{cn, "Beijing"}, {cn, "Shanghai"}, {us, "New York"}, {jp, "Tokyo"}].
a) CnCity = [Ci || {cn, Ci} <- L] or
b) CnCity = [Ci || {Country, Ci} <-L, Country =:= cn]

a) we can use pattern match in generator to get some Values, this is simple.
b) we can also use filter to get the expected values.

Macros With Same Name

In Erlang, if two macros with the same name, then we will get “redefing macro ..” error info when compilation. so we must give the different names for all the macro.
for example:

-define(Log(S), (io:format("log:~s~n", [S]))).
-define(Log(F, D), (io:format("log:~s~n", [io_lib:format(F, D)]))).

change to

-define(Log(S), (io:format("log:~s~n", [S]))).
-define(Log2(F, D), (io:format("log:~s~n", [io_lib:format(F, D)]))).

boot_server 及 Erlang emulator启动过程

在分布式系统中,因为涉及到大量的机器,所以部署略微有些繁琐。

使用Erlang开发的系统,我们可以通过boot_server来加载我们的代码,免去了ssh登陆服务器,更新代码这样繁琐的步骤。我们只需要将最新的beam文件放到一个server,作为Erlang的boot_server,其他的机器启动Erlang时,通过连接这个Boot Server加载最新的应用代码,完成程序的启动。

架设Server ip为:8.17.85.135
其中一个Client为: 124.118.219.104

启动一个Boot Server涉及的主要模块为erl_boot_server,我们可以通过erlang_boot_server:start/1启动boot server,通过erl_boot_server:add_slave/1加载一个slave,也就是允许连接本机从而加载代码的client。我们也可以通过kernel config来启动boot server,这样更简单:
bserver.config:

[
{kernel, [{start_boot_server, true} ,
{boot_server_slaves, [{124,118,219,104}]}]}
].

(注:根据Erlang 文档,slave可以采用atom, string, tuple多种方式来表示,可是我尝试只能使用tuple,不知是否bug?)

随后启动

erl -setcookie "cookie" -config bserver

至此,我们的boot server就启动成功了,接下来让我们的client从boot server启动。
client:

erl -loader inet -hosts "8.17.85.135" -id node1 -setcookie "cookie"

很遗憾,在我的机器,没有启动成功,因为我client是widnows xp系统。

boot server启动对client的要求

  1. Slave在Boot Server的Slaves列表中
  2. Erlang OTP版本相同
  3. Cookie设置相同
  4. 路径一致

以上4点不一定准确,需要我回头在家中的linux上进行尝试,呵呵,本人保留对以上4点要求修改的的权力 :)

根据文档循规蹈矩的走了一遍,有很多疑问和不解,需要去代码中遨游一翻了。
根据init.erl, kernel.erl, erl_prim_loader.erl我简单的罗列了下面的启动过程:

erl启动过程:

  1. shell中输入 erl ……
  2. emulator调用init:boot/1启动(通过 erlang:whereis(init)返回pid为<0,0,0>,init是第一个process)
  3. 启动erl_prim_loader,其负责获取具体的文件从本地(efile)或远程的boot_server(inet)
  4. 根据-boot选项,获取boot script文件名称,通过erl_prim_loader获取boot脚本
  5. 解析boot script,调用init:eval_script/8执行对应的语句
  6. boot script执行完成后,调用init:start_em/1启动erl参数中-s -run对应的模块
  7. 执行完毕,启动完成

对于Erlang系统的启动是根据boot script,通过erl_prim_loader从local或server获取具体的module BinCode
随后通过erlang:load_module加载。

有个问题,这里的erl_prim_loader,要么是通过efile,要么是通过inet,有没有一个hybrid的版本呢,我可以让部分module通过inet加载,而部分通过local加载,通过修改boot.script可以么?这个需要寻找一个好的方案,期待答案….

CouchDB安装

接下来的几天,我将认真的研究CouchDB,当然我也不会忘记E2dynamo。

昨天在Joyent Accelerator Server上安装了CouchDB,因为首先要安装OpenSSL,Erlang,ICU,SpiderMonkey所以,安装的过程比较繁琐,还好最后一切OK。具体安装请参考:
http://wiki.joyent.com/accelerators:setup-couchdb?s[]=pkgsrc

因为CouchDB-0.8.1还没有安全机制,CouchDB只能绑定在服务器的127.0.0.1,这样外网就无法访问了,还好有SSH。呵呵,我们通过TCP Tunneling技术可以访问。

首先你的本地要安装一个ssh server,我windows下使用cygwin中的ssh
下面是操作步骤:

Accelerator:

 $ sudo vi /etc/ssh/sshd_config
- AllowTcpForwarding no
+ AllowTcpForwarding yes
- GatewayPorts no
+ GatewayPorts yes

Accelerator: $ sudo svcadm restart svc:/network/ssh:default
Accelerator: $ svcs -a | grep -i ssh

本地:

 $ ssh -NfL 5984:127.0.0.1:5984 user@domain

这里稍微解释一下:
5984:127.0.0.1:5984 user@domain 对应为
<local_port>:<target_ip>:<target_port> Name@middle
表示对本地5984的访问,我要通过middle Server跳转到target_ip:target_port上

好了,在本地通过浏览器输入:
http://127.0.0.1:5984/_utils/

看到了CouchDB的管理界面了吧。
安装完毕了,接下来就可以参照代码进行分析了。
附:可以使用apache附带的ab工具,进行性能测试,判断CouchDB的性能指标,ab man page:
http://httpd.apache.org/docs/2.0/programs/ab.html

CN Erlounge III归来!

非常辛苦忙碌的几天,昨天因为比较累,没有及时更新blog,今天终于缓过劲来,就来拔拔草,呵呵。

终于看到了我久仰的老大们,非常的开心,照片为证(因为我一直在笑,在乐呵)

http://picasaweb.google.com/krzycube/CnErloungeIii

CN Erlounge III明日启程!

明天就要出发去上海参加Erlounge III了,临行之前发个文章。

首先感谢ecug给我这个机会,其次感谢Erlang学习中帮助我的各位老大(明天就要见到他们了!:) )!

我的topic是:E2dynamo设计与实现 ,Erlang+曾经的DHT相关了解+amazon的paper+妄想参加Erlounge III,促成了我做这个题目,并且一个月前开始动手写代码。

由于业余时间有限,加上个人精力有限,项目最初的原型还没有推出,预计在2009年1月左右,我会发布一个最最初级的版本,希望能为Erlang的普及和开源做点小小的贡献。

热诚邀请各位有兴趣的朋友参与此项目!

项目地址:http://code.google.com/p/e2dynamo

此外,祝福Erlounge III圆满成功,让我们都能收获颇丰!

申请免费的服务器(Facebook Accelerator)

感谢Arbow提供这个链接,我们可以申请一个免费的虚拟服务器
(系统为sunos, RAM 512M, disk:10G)
http://www.joyent.com/developers/facebook/
前提是你要拥有一个Facebook的API key
随后sign Up,成功后你会收到一个mail:Welcome to your Facebook Accelerator

里面有你的域名,服务IP,用户/密码,root密码,mysql用户密码等信息,你就可以管理你的服务器了。
默认其预装了很多应用,如apache,php,mysql等。
我申请他,主要为erlang应用的开发测试,所以我要安装Erlang OTP:
安装过程参照joyent wiki上的couchdb安装过程

Windows下使用SecureCRT登陆,linux通过SSH登陆服务器

首先安装openssl

cd /tmp
wget http://www.openssl.org/source/openssl-0.9.8e.tar.gz
tar xzf openssl-0.9.8e.tar.gz
cd openssl-0.9.8e
./Configure --prefix=/opt/local/32 386 shared solaris-x86-gcc
gmake
gmake test
sudo gmake install

随后Erlang OTP:

cd /tmp
wget http://www.erlang.org/download/otp_src_R12B-5.tar.gz
tar xzf otp_src_R12B-5.tar.gz
cd otp_src_R12B-5
./configure --prefix=/opt/local --with-ssl=/opt/local/32
gmake
sudo gmake install

经过一段等待,大功告成!

启动erl

$ erl
Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.6.5  (abort with ^G)
1>

好了,接下来你就可以将你的代码通过http,或者SFtp传到你的服务器上,进行测试了。

比如我的服务器Ip为:8.17.85.135,我可以这样启动erl作为一个node:
$ erl -name remote@8.17.85.135 -setcookie erlangcookie

在我本地启动另一个节点:
erl -name local@test.toquick.com -setcookie erlangcookie

写些测试代码吧,体验一下erlang分布式的魅力。

嗨,我还在,但是比较忙。

啊,好久不更新blog,可不是我的作风阿。呵呵,因为最近比较忙。

最近主要是在忙一个erlang相关的slide,一边准备资料,一边写代码,竭尽全力的希望作好一点,尽管时间和能力有限。

我已经该掉了一个臭毛病,那就是以前中午看新闻,现在我中午已经不去任何网站,看任何新闻了,那些空无飘渺,歌功颂德,离奇荒诞,一不留神就要搞的我心情不好,呵呵,我的精力可不想贡献给那些窃喜的编辑。中午有时间,跟朋友聊几句,看看mail,学点流行的技术,更有意义。

前几天看到十七世大宝法王的介绍,引用一句专业点的词汇,法相庄严!呵呵,肃然起敬阿,精神偶像,顶礼膜拜。相关的音乐也非常好听哦,比如修心,坚心等。

呵呵。很高兴,每天能知道新的知识。

继续写代码了。回头说朋友们。