Say Hello to My New Mate

没错,这是我的新伙伴,今天正式开始我的骑行了,2012的一大目标就是锻炼身体!

bike bike

今天在网上看中的,下午联系,晚上就提车了,真是爽快! 因为信任骑行的人,我对车主“死魂灵”是完完全全的信任,虽然我还是车盲一个,哈哈! 提车的时候,死魂灵无微不至的交代,各种经验之谈浓缩在短短的十分钟之内,从车的调节,到刹车的时候,还有分别时候的关于安全的交代。。我囫囵吞枣般地都短暂记住了,那个场景让我想起了小说里的场面:一个武功高手在传内力给一个战斗力只有5的小朋友。。

Ubuntu下在命令行批量生成缩略图

1
2
3
4
5
6
7
8
9
10
# 准备工作:安装 imagemagick
sudo apt-get install imagemagick
cd /path/to/big/images #大图所在的目录

#创建小图对应的目录结构
find . -type d -print -exec mkdir '../small/{}' -p \\;

#批量转换! 等比例缩小到320x320之内
find . -type f -name '*.jpg' -print -exec \\
convert '{}' -resize 320x320 '../small/{}' \\;

这样小图都会按原先的目录结构,在上级目录的small目录出现了

其实imagemagick是一个超级神器,上面只是它很简单的一个应用…

让VIM与Ubuntu和睦相处

VimUbuntu都是我的好朋友,不过他们之间好像有点不和睦。在Ubuntu11.04下gvim的菜单不能集成进全局菜单条(global menu),而在Ubuntu11.10下gvim打开之后会非常卡。需要调解一下 :D

解决gvim在Ubuntu 11.04中菜单显示的问题

执行gvim时,gvim的菜单不能立刻显示出来。并且报错:

(gvim:15150): WARNING : Unable to register window with path ‘/com/canonical/menu/4200024’: Timeout was reached

解决方法是运行:

1
2
echo 'alias gvim="env UBUNTU_MENUPROXY=0 gvim"' >> ~/.bashrc
source ~/.bashrc

解决gvim在Ubuntu 11.10中导致电脑很卡的问题

运行:

1
2
echo 'alias gvim="gvim -f"' >> ~/.bashrc
source ~/.bashrc

解决提示“pixmap”的问题

如果终端中提示:

(gvim:2353): Gtk-WARNING **: 无法在模块路径中找到主题引擎:“pixmap”,

解决方法是运行:

1
sudo apt-get install gtk2-engines-pixbuf

自动更新git目录

假设我们有一批文件用Git在管理,然后在服务器上做了一个repo。团队成员先从服务器pull下来最新的版本,然后在本地修改并提交,最后push回服务器,这是很典型的应用场景。

假如现在需要服务器端收到客户端的push后,能自动更新repo目录里面的文件,听起来很简单,用钩子就可以了,不过还是遇到一些问题,好在最后在google帮助下搞定。

总结的步骤如下:

1.先在服务器端运行设置,接受提交

git config receive.denyCurrentBranch ignore

2.把以下内容保存为服务器端repo中的钩子文件(.git/hooks/post-receive

1
2
3
#!/bin/sh
cd ..
env -i git reset --hard

3.设置权限为可运行

1
chmod a+x post-receive

好了,这样每当服务器收到客户端的push,就会自动更新文件列表了

Ubuntu下使用Array SSL VPN客户端连接VPN网络

公司用的Array Networks提供的SSL VPN系统,vpn网页在Ubuntu下无法正常启动Java Applet。幸好得到了wenyue的指点,找到了方法。如果你也是Ubuntu系统,需要连接到Array SSL VPN,可以参考一下。

安装步骤

1.下载Array Networks提供的客户端程序 array_vpnc.bin

#!bash
sudo apt-get install libc6-i386 #64位系统也是这个包
wget http://q.pnq.cc/uploads/array_vpnc.bin
chmod a+x array_vpnc.bin

2.下载这个小脚本到同个目录

#!bash
#下载辅助脚本
wget http://q.pnq.cc/uploads/vpn-for-common.sh -O vpn.sh
#里面会包含重要信息,我们不想别人随便访问
chmod 700 vpn.sh

3.修改vpn.sh中的配置,将vpn_host、user、key修改为你的配置

#!bash
vpn_host=your_vpn_server
user=your_user_name
key=your_static_passwd #密码中不变的部分

使用方法:

#!bash
./vpn.sh

然后根据提示输入,当看到这个提示时,就说明成功了:

array_vpnc: VPN TUNNEL SUCCESSFUL!

Have fun!

Flash真的适合做网站应用吗?

两年前,我们开发了一套基于Flash的文件(主要是图片)上传RIA应用,提供给阿里巴巴的用户使用。如果你使用过Wordpress或flickr上传图片,你应该已经用过类似的产品。这个程序基于YUI Uploader开发,增加了一个实用的功能——在客户端先将图片缩小,再上传到服务器。用户用数码相机拍摄的照片往往有600万以上的像素,但产品图片放到阿里巴巴网站上显示,并不需要这么大的像素,通常等比例缩小到1024×1024之内就可以了。借助于Flash对图片先缩小再上传的技术,我们在没有增加服务器投入的情况下,将原先上传图片的尺寸限制由250KB/张提升到了5MB/张。同时,Flash上传还比传统HTML表单方式上传有更好的体验,例如可以多选一批文件同时上传、可以实时展示上传进度、选择文件时可以过滤非图片文件。 这个组件获得了很大的成功。上线后不久,阿里巴巴网站上用户的图片上传数量由日均1万张左右上升至日均15万张左右。但在这个上传应用投入应用的两年中,我们遇到了各种问题。

1. bug

基于IE多标签浏览器中的伪沙箱问题就不说了,最严重的是cookie的问题。使用FileReference.upload的方式上传文件,http请求中附带的cookie信息不一定是当前浏览器进程的cookie,在Firefox、chrome等非IE浏览器中非常严重,可能传输的是IE中的cookie。即便是IE,也可能传输的cookie内容和当前页面的cookie记录不符合。这直接导致服务器端在收到文件之后的安全验证中失败。而对于阿里巴巴这样的大型网站,有比较成熟的java web框架,要去掉对cookie的依赖非常麻烦。于是结果就是,首先我们只有在用户使用IE系浏览器的时候才使用Flash上传,其次我们隔三岔五的还会收到使用IE的某些客户的投诉,在花费了大量的时间排查之后,我发现是由于cookie的问题导致上传失败。这个bug已经存在很多年,但是随着Flash从9升级到10,许多版本过去了,问题依然没有被解决。对于闭源的Flash,我们也帮不上忙。

2.性能

相对于现今数码相机的像素量,5MB的大小限制非常保守。但大于5M的时候,在一些低配置的电脑上,读取文件内容的时候就会发生浏览器假死现象。假死很容易导致浏览器崩溃,所以我们采取了保守的限制——5MB。 另外一个性能消耗是将BitmapData编码成JPEG文件的时候。Adobe提供了JPEGEncoder,但由于是Array实现的,所以性能是个问题。编码一个2880×2880的图片在一台中等配置的电脑上大约需要15秒时间。 我用Vector改写了这个类,时间缩短为3.5秒左右。使用Alchemy,时间进一步缩短到1.5秒左右。但还是不够安全,所以最后采用了异步Vector的方式,延长编码的时间,以保证程序的稳定性。(评测在这里

3.图片质量

Flash内置的最好的图片缩小算法(用BitmapData.draw,并将smoothing参数设为true),在缩小图片的时候容易产生锯齿。因此我改写了Jacwright提供的缩小算法,图片质量的问题解决,但代价是性能又降低了一些。

4.安全限制

Flash10.0之后,增加了一个安全限制——当URLLoader以标准文件上传的方式发送POST请求的时候,需要由用户的UI操作(鼠标点击或按键事件)触发。因为我们对用户的图片做了处理,已经无法再通过FileReference上传,只能通过URLLoader。这个安全性限制规定每次发起一个上传文件的URLLoader请求,都必须让用户点击一下鼠标才可以。如果用户选择了20张图片,就要点击20次鼠标。这显然是无法接受的。因此我们放弃了用标准文件上传,采用普通post形式。代价是失去了对上传进度的跟踪,不知道文件上传的百分比;同时服务器端也需要改造。

改变

最近,我们做了一个决定:开发一个类似功能的ActiveX控件,替代Flash作为图片上传的主要解决方案。ActiveX的优势是性能,不足之处在于只能在Windows+IE浏览器中使用,但实际上我们的Flash上传目前也只能在IE中使用。Flash真的适合像阿里巴巴这样的网站使用吗?闭源和性能是Flash最大的问题。但在HTML5被广泛支持前,Flash和传统Ajax还是我们最主要的富客户端应用开发技术,相对于ActiveX、Silverlight、JavaFX、Gear等技术来说,Flash还是有安装率优势的。我们看到Adobe最近在新功能开发方面非常给力,值得称赞,但基础的功能的持续完善对开发者也同样重要。目前Flash依然是我们很重要的RIA技术,但是HTML5完全到来的那一天,现在很难说。

如何一键启动Virtualbox虚拟机

现在用Ubuntu或者Mac的人越来越多了,但很多情况下还是离不开Windows,所以大多数人都是安装了Virtualbox,在VBox里面运行Windows虚拟机。 你是怎样启动Windows虚拟机的呢?是不是 1. 运行Virtualbox 2. 点选虚拟机的图标 3.点“启动” 那么可以考虑一下给单个虚拟机创建快捷方式,提高工作效率。别小看这点时间哦,每天节约下来的时间不可小视呢! 在桌面/Dock上创建一个程序快捷方式: /usr/bin/VBoxManage startvm 虚拟机名称 例如我的虚拟机叫做XP,那么这个命令就是 /usr/bin/VBoxManage startvm XP 不同的系统可能VBoxManage所在的地方不一样,用这个命令查找VBoxManage所在路径: which VBoxManage 至于怎么创建快捷方式,可以参考网上的教程。这是我的Ubuntu上的效果: ps. 图标是在iconfinder找到的  

Crontab无效的原因分析

有时候会发生这样的现象,命令是可以在shell中正常运行的,但添加到crontab中定时运行的时候,就发生一些异常的事情。(如果还不知道 Crontab 是什么的话,可以看一下这里先) 比如我今天在目录/home/ued66/asproj-builder 下写了一个 build-all.sh: svn up #更新代码 ./compile.rb --all >> ./log/run.log #编译,并将结果记录 在shell中运行这个命令是正常的: /home/ued66/asproj-builder/build-all.sh crontab中这样写: */5 * * * * /home/ued66/asproj-builder/build-all.sh (为了测试方便,设成每5分钟运行一次,实际是每天运行一次足矣) 虽然是同个命令,但是compile.rb却没有被正确调用。 经过调试,发现问题有两个: 1. 路径问题 既然用了相对路径,必须要把当前目录设置正确。把crontab写成这样: */5 * * * * cd /home/ued66/asproj-builder && ./build-all.sh 2. 环境问题 compile.rb 是用ruby写的一个脚本,而我的ruby程序是用源码编译安装的,安装目录是/usr/local/ruby。compile.rb的第一行是 #!/usr/bin/env ruby 这是告诉shell使用ruby来执行这个脚本。但问题在于crontab运行的时候是没有加载用户环境变量的,“which ruby“运行结果为空也验证了这点。所以compile.rb不能被正确执行也很好理解了。 最后把build-all.sh写成这样,问题解决: #!/bin/sh svn up /usr/local/ruby/bin/ruby compile.rb --all >> ./log/run.log 看着程序自动运作起来,非常开心啊!

Virtualbox 网络桥接不起作用?试试装增强功能

今天晚上在Ubuntu的服务器上用Virtualbox安装了一个Windows 7的虚拟机,一切都好,但在网络配置的时候遇到了问题。网卡选择桥接(Bridge)模式,运行时能(从DHCP服务器)得到ip地址,却无法上网。外部的计算机也访问不了该ip。 Google之,尝试了很多方法,都没有效果。 最后偶然发现,安装完增强功能包之后,居然桥接模式就正常了。进一步证明,这个增强功能包是必备的东东。 安装增强功能包,一开始是从Virtualbox菜单中安装,发现下载速度太慢。在apt里面搜到原来有个包:virtualbox-guest-additions,所以先执行这句: sudo apt-get install virtualbox-guest-additions 然后再到VB虚拟机里面点安装增强功能,可以节约一点时间。

Flash在某些多标签浏览器中的“伪沙箱”问题

sandbox

在Flash播放器运行时,将不同来源的资源划分到独立的沙箱(sandbox)内,不同沙箱之间不能彼此操作数据(除非目标沙箱做过一些设置,授权其他沙箱可访问),这就是Flash的跨沙箱问题。当Flash文件(.swf) 和页面(.html)不在同一个域名下时,如果不经过Flash内部声明System.allowDomain,html无法访问flash定义的接口;不经过html设置allowScriptAccess为’always’,Flash也无法调用页面上的js函数。

那么如果html和flash都设置了互相可以访问,是否Flash和html之间就可以互相访问了呢?理论上是的,然而实际上却不是。破碎的心

Read on →