[置顶]基于Adobe AIR技术的FTP客户端

最初的话:

利用很多的业余时间炮制出来的,一款基于AIR的FTP客户端程序终于出炉了。从最初的构思到设计,我花了不少心思来学习和修改,也学到和实践了不少东西。这个过程能让人受益良多。我还希望利用将来的业余时间来继续完善和开发新功能,争取赶上并超过目前主流的FTP客户端工具,很欢迎大家帮忙测试和提出建议,感兴趣的朋友可以发邮件交流。下载和帮助见这里

Read the rest of this entry »

应该是最后一篇日志了

写下这篇更多的为了展望下未来,生活是要继续的,人生是要前进的。

现在的我已经不是一个靠程序吃饭的人了,胸无一策不能继续维持这个技术博客。回想这几年程序生涯,程序带来过很多的快乐,同时也为我带来财富,指导此时此刻我任然保持着对它的兴趣。只是,我不能拿它当生存技能了。程序员是我见过的最为单纯的一类人,沉浸在机器的世界里,跟看不见摸不着的数据打交道,自得其乐甚至是坐井观天,就像孩子那样。现在的经济形势不用说也知道,在一个小圈子里迷糊已经混不下去了。所以我决定去做做跟人打交道的工作。

很庆幸我有这个机会。我又回到了我科班出身的机械行业。噢忘了讲,我们程序员也该关心下实业啦,其实我们写的程序是为了啥,要么在计算机里运行烧电(但是可以用来精神上的消遣),要么控制一下硬件(如现在的机电控制等),这个行业关心的人比较少,我想事门槛高的缘故。

现在我做起了HR,行政和一些技术活,做了一个小管理者。以前在外资公司的经历会带给我一些经验,比如控制思想,流程化思想。在操作过程中,碰上很多的困难,我想我最终都可以克服,因为我同样的爱上了这份工作,如同我以前爱上程序一样。

分享一个小故事

孔子的学生子贱有一 次奉命担任某地方的官吏。当他到任以后,却时常弹琴自娱,不管政事,可是他所管辖的地方却治理得井井有条,民兴业旺。这使那位卸任的官吏百思不得其解,因 为他每天即使起早摸黑,从早忙到晚,也没有把地方治好。于是他请教子贱:“为什么你能治理得这么好?”子贱回答说:“你只靠自己的力量去进行,所以十分辛 苦;而我却是借助别人的力量来完成任务。”

有些事情,真的很难把握。

Prism打造桌面版Gmail

Prism这个工具适合于这些人:

  • 心疼硬盘空间,不想使用下载邮件的客户端。
  • 不想让gmail页面混在一堆tabs里,阻止你随时查看。

Prism可以做到:

  • 在桌面,开始菜单或者Quick Launch Bar上面添加快捷图标。
  • 启动后可以把web gmail页面单独显示在一个容器里(容器内容可配置)。

有了这些好处我想你不妨试试看Prism。用firefox3以上的也可以用Prism for firefox extension。安装完这个插件后,使用tools->Convert website to application…

screenshot

screenshot

betterbeansbinding

第一次用java swing写了套桌面程序,来自动化一些工作上的事情。有人问我为什么不用AIR,毕竟是比较熟悉的flash开发模式,我的理由是AS相关的文档处理类库不够丰富,可能这也是AIR的一个不太好的地方。

熟悉AIR和swing的人应该知道,AS这类动态语言在UI编程的效率方面比java好N多,比如bind非常实用和简便。可是java swing借助一些丰富的类库也能实现类似功能,比如这次要讲的betterbeansbinding,可以实现JList,JTable等swing组件和java beans的绑定,单向或双向的都行。

举例一段代码

jtb = SwingBindings.createJTableBinding(UpdateStrategy.READ_WRITE, vec, wage_list);

BeanProperty<SJPerson, ?> sjp_name = BeanProperty.create("personName");
BeanProperty<SJPerson, ?> sjp_wage1 = BeanProperty.create("wage1");
BeanProperty<SJPerson, ?> sjp_wage2 = BeanProperty.create("wage2");

jtb.addColumnBinding(sjp_name).setColumnName("姓名").setEditable(false);
jtb.addColumnBinding(sjp_wage1).setColumnName("底薪").setColumnClass(Float.class);
jtb.addColumnBinding(sjp_wage2).setColumnName("技术津贴").setColumnClass(Float.class);
jtb.bind();

它的作用是将

  • Vector<SJPerson> vec
  • JTable wage_list

双向绑定,vec是一组beans,在JTable里显示一个row。

更多信息可搜索或者Google code

先有兴趣才有工作吗

我觉得我有必要把一些心得写下来,避免年轻的后来者再犯同样的错误。最近在公司了解到这样一种心态,特别是新来的和刚入行的员工,觉得手上的活枯燥,进而怀疑这份行业无聊,不是他们心中所想,不是心中所愿。其实我非常理解这种心态,因为我自己也是这么走过来的。我敢说,做IT的写程序的,十有八九是从兴趣开始的,兴趣是最好的老师这句话绝对不错。可是我倒想问问,真的是有了兴趣才有工作吗?

我看未必。就我自己一路所感来说,我原来是学机械工程及自动化的,应该说当时我对这门学科非常不满,觉得没有创意没有自由,后来才走上程序这条路。这种心态与现在的新员工何其相似。后来我才真正体会到,不先去做一件事之前你是无法判断兴趣与否的,换句话说,不去亲身体验的话是不会了解其中奥妙的。如同我现在又转回到机械加工这个行当,我下了很大的决心去做这件我以前非常看不起的行当,可是当我慢慢以一种成熟而富有经验的态度去做上这件事的时候,我发觉一切又都充满了乐趣,甚至我在冷冰冰的机器之间发掘到,它们原来这么有味儿。

我觉得人做事就该是这样:做之前不要谈兴趣,兴趣一定是伴随着工作而产生的。

SharePod同步ipod

不用iTunes也能管理ipod。

SharePod本身是一款绿色软件,能支持比较老牌的ipod(我从箱子底翻出来,以前读书的时候买的),个头的话不知比iTunes小了不知多少倍(2M)。如果你只需要弄弄MP3的话,何必去搞个iTunes大玩意儿呢。SharePod官网见这里

另外还有一些比较好用的小工具来支持ipod。

招聘之我见

今天跑了趟招聘会,作为一个招聘者,第一次坐在了招聘位子的后面,来面试各种各样的应聘者。老实说,这类角色还不能让我很好适应,有时候甚至有种异样的感觉使人容易站在应聘者的角度来考虑应聘者的利益,这对于一个代表企业的招聘者来说是要不得的。

今天半天下来,发现企业招人真不容易,要招个合适的人难,招牛人更难。同时,招聘应聘双方心态是非常不同的,咱以前做了这么长时间应聘者,今天不妨来比较下两者心态如何不同。

看待报酬方面

  • 应聘者总是希望能拿很多钱,可以双休可以少加班,可以少操心。
  • 而企业首先需要的是大局,是稳定。也就是说,工钱方面会追求稳定,不可能让一个人鹤立鸡群,不可能为某个人“破例”(我想很多应聘者都这么想过,觉得自己牛的企业会破例)。另外,企业首要会关心对方能带来什么,对方首先能为企业做什么。这恰恰是很多应聘者没有展现出来的,他们总是首先关心能拿多少钱。

看待工作方面

  • 应聘者希望容易上手容易晋升。
  • 而企业在这方面当然希望应聘者能多干活干好活,关注的是人的踏实肯干。这方面我特别有体会,我总是去关注那些人勤恳踏实谦虚的,而不是那类特能吹牛的。我想很多企业都有类似倾向吧。对待个人发展问题,一般正规的企业都有很好的渠道,当然这要凭实力和个人魅力,另外活泼的性格也是重要的。

第三届SWFSH活动

5月30日 第3次 FLASH开发者交流会火热报名中!

经过紧张的筹办,第三次FLASH开发者交流会活动开始报名咯!请大家访问:www.swfsh.com

在这次的活动中,我们邀请到AsWing开源UI框架的作者iiley同学跟大家介绍他在FLASH独立游戏开发方面的经验和感受。

同时我们请来积木网的主程谢敏同学,谢敏采用FLEX框架一手开发了积木网网上电脑,谢敏将为我们带来FLEX框架的完整的开发经验谈(超多干货!!)。

在1月活动中,向大家介绍FLASH播放器性能优化经验的主持人谈熠同学将在这次的活动中给我们介绍如何在FLASH中运用元编程方法来提高代码效率和优化开发过程。

“开心宠物”和“升职记”的主程唐翎同学将告诉大家一种全新的FLASH程序的UI设计方式,使你的程序能够超灵活地支持皮肤设定

用xlwt和xlrd读写Excel文档

工作中不可避免要整Excel文档,比如统计啦排版啦。python官网中有两套类库xlwt和xlrd,不被包含在默认的python类库一起发布,而需要用setup.py install方式来安装。这两套类库的名字比较有趣,拆开来可以看成excel write read,顾名思义是用来读写Excel表格的。但是好好的为什么要两套类库呢,我猜可能是Excel的存储方式很复杂吧,于是这两套类库一个只能读,一个只能写,如果你需要读了修改后再保存,便无能为力了。如果不需要这样的话,就请继续看介绍吧。

xlrd是用来读Excel文档,下载见这里。这里一个小例子:

import xlrd

fname = "201004.xls"
main_sheet = xlrd.open_workbook(fname).sheet_by_index(0)
the_value = main_sheet.cell_value(0, 0) ##read the cell (column 0 and row 0)

xlwt是用来写Excel文档(新建并保存),下载见这里。这里有一个小例子。

import xlwt

bkw = xlwt.Workbook(encoding='utf-8')
sheet = bkw.add_sheet('sheet_name')
sheet.write(0, 0, 'the_value', xlwt.Style.default_style)

这两套类库有比较详细的doc可供查询。值得一提的是,这两套类库是如此相像,但是却不能互用。比如要修改cell的样式(如字体,加粗等),需要使用XFObject,xlwt和xlrd都有定义但却不是一样的。xlwt定义的非常广泛(见Style.py文档)。

UIComponent之currentStateChange事件

在使用State的时候,我总是会选择enterState和exitState事件来处理state切换问题(enterState总是在state切换完毕再抛出,这点很便利),可是最近发现一问题,enterState和exitState实际是抛出FlexEvent对象,此对象不包含上一个state和请求的state的信息,也就是说,你也不会知道你是从哪个state切换过来的,对于某些特别的request来说不是很爽。

于是我查了下UIComponent的源码,发现UIComponent带有两个很好用的事件

  • currentStateChange
  • currentStateChanging

在UIComponent的commitCurrentState方法(private)里,还能找到这两个事件,以及enterState,exitState抛出的顺序:

  1. currentStateChanging
  2. exitState
  3. enterState
  4. currentStateChange

从这里不难发现flex framework对于state的处理机制,首当其冲便是currentState property,它存储着state信息。切换的时候,首先抛出currentStateChanging事件,说明切换开始,然后执行“移除”当前state,抛出exitState(至此state被移除),然后切换到新的state,完成后抛出enterState,接着抛出currentStateChange事件,currentState修改完毕。

并且我们可以注意到,currentStateChange抛出的是StateChangeEvent事件对象,此对象带有oldState和newState property,恰好弥补了enterState和exitState的不足。