Jonny Zheng

I'm an idealist, not perfectionist

Sublime 下配置vim模式

最近用上了sublime text2, 和textmate比界面要漂亮一些,而且几个平台下都有对应版本,比较统一。

sublime支持文本编辑使用 vim 模式,vim 快捷键编辑文本还是挺快的,两个编辑器融合一下也挺好,选择Preferences->Settings- Default, 在文本的最下面有一行

1
"ignored_packages": ["vintage"]

,这里sublime 默认去掉了vim的支持,我们只需要把”vintage”删掉就好了。

再在编辑框里试试已经ok了,但是在vim里我都把ESC键映射到了’ii’上了: imap ‘ii’ ,这里并不支持imap。 不过我们可以在vintage 的package包里自己定义,我的机器是windows,默认packages都装在了 C:\Documents and Settings\zhengj1\Application Data\Sublime Text 2\Packages 目录下,找到Vintage\Default.sublime-keymap文件,用文本编辑器打开,加上下面的代码:

1
"ignored_packages": ["vintage"]

这个keymap文件里可以定义自己习惯的快捷键方式,有兴趣的不妨研究研究。

vintage这个插件并不支持command, 想要支持还需要下一个VintageEx 包,一些简单的命令就可以用了。</esc>

关于Jquery offset().top 在IE和Firefox下行为不一致的问题

项目中用到了JSTree,原先一个页面里包含了很多的tab标签,而且每个tab标签内功能都很多,用到了大量的js代码,后来我们决定把tab里的内容分成不同的page,然后用iframe调用。

于是奇怪的问题出现了,在IE下面拖动滚动条后jstree的node怎么也点不了了,像事件丢失了一样。调试了一会貌似不是我代码的原因,于是到JSTree的源码里看看,结果看到下面这一句,他计算的事件点击在页面的position要在node的li高度范围内,这个不知道为啥要这样做,很是奇怪,但是这就是为什么在iframe里会出怪问题的原因。

1
2
3
4
if(trgt.is("ins") && event.pageY - trgt.offset().top < this.data.core.li_height)
{
    this.toggle_node(trgt);
}

在ie下面当右边滚动条滚动后$(element).offset().top计算出来的值就不对了,必须要加document.documentElement.scrollTop 的值才能得到正确的结果,迫不得已,修补bug如下

1
2
3
4
5
6
var posY = 0;
if(window.parent!= window && $.browser.msie)
    posY= (trgt.offset().top+document.documentElement.scrollTop);
else
    posY= trgt.offset().top;
if(trgt.is("ins") && event.pageY - posY < this.data.core.li_height) { this.toggle_node(trgt); }

Jquery里也有人提到这个问题,新版的JSTree里已经修复此bug, 附上地址供参考

根据IP获得城市名称 Ruby 版

很多本地化生活网站的一个基本功能就是根据用户的IP地址判断所在的城市,基本的逻辑就是有一个ip库,根据ip库里的记录找到用户ip地址所在的范围。

IP库没有太多选择,我在网上找到的一个http://www.maxmind.com/app/ip-location, 这个网站本身提供收费的IP库和免费的IP库,收费的库在准确率上要稍微高一些,拿城市的库做一个例子,左边是免费版,右边是收费版:

GeoLite City GeoIP City
Cost Free $370 initial, $90 per month updates
Coverage Worldwide Worldwide
Accuracy Over 99.5% on a country level and 79% on a city level for the US within a 25 mile radius. More details Over 99.8% on a country level and 83% on a city level for the US within a 25 mile radius. More details
Redistribution Free, subject to GPL/LGPL for APIs and database licenseCommercial redistribution licenses are available Please contact us.
Updates Updated monthly, at the beginning of each month Updated monthly. For binary format, weekly updates, automated updates available by using geoipupdate program included withC API

ruby 的使用很简单,有一个gem库: http://geoip.rubyforge.org/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
require ‘geoip’
c = GeoIP.new(‘GeoIP.dat’).country(‘www.nokia.com’)
=> [“www.nokia.com”, “147.243.3.83”, 69, “FI”, “FIN”, “Finland”, “EU”]
c.country_code3
=> “FIN”
c.to_hash
=> {:country_code3=>"FIN", :country_name=>"Finland", :continent_code=>"EU",
:request=>"www.nokia.com", :country_code=>69, :country_code2=>"FI", :ip=>"147.243.3.83"}


c = GeoIP.new(‘GeoLiteCity.dat’).city(‘github.com’)
=> [“github.com”, “207.97.227.239”, “US”, “USA”, “United States”, “NA”, “CA”,
“San Francisco”, “94110”, 37.7484, -122.4156, 807, 415, “America/Los_Angeles”]
>> c.longitude
=> -122.4156
>> c.timezone
=> “America/Los_Angeles”


c = GeoIP.new(‘GeoIPASNum.dat’).asn(“www.fsb.ru”)
=> [“AS8342”, “RTComm.RU Autonomous System”]

我下了一个citylite的免费库,只试了我自己的地址,判断是准确的,还没有找其他的地方进行测试,79%的准确率不高也不低,用作预判断还是可以接受的。

Vim Window下显示换行符的问题

 

关于回车与换行

很久以前,老式的电传打字机使用两个字符来另起新行。一个字符把滑动架移回首位 (称为回车,,ASCII码为0D),另一个字符把纸上移一行 (称为换行, ,ASCII码为0A)。当计算机问世以后,存储器曾经非常昂贵。有些人就认定没必要用两个字符来表示行尾。UNIX 开发者决定他们可以用 一个字符来表示行尾,Linux沿袭Unix,也是。Apple 开发者规定了用。开发 MS-DOS以及Windows 的那些家伙则决定沿用老式的

因为MS-DOS及Windows是回车+换行来表示换行,因此在Linux下用Vim查看在Windows下用VC写的代码,行尾后的 ^M 符号,表示的是符。

在Vim中解决这个问题,很简单,在Vim中利用替换功能就可以将 ^M 都干掉,键入如下替换命令行:

1
:%s/^M//g

注意:上述命令行中的 ^M 符,不是 ^ 再加上 M,而是由 Ctrl+vCtrl+M 键生成的

vim 自动识别换行符

1
set fileformats=unix,dox,mac

设置保存格式

1
set fileformat=unix

 

Linode 和 Amazon EC2 国内访问速度的比较

这两天在看云主机和vps,比较了一下目前的网速:

 

AWS 新加坡机房 300ms左右

AWS 日本机房 120ms左右

linode 美国机房 200-300ms左右,不稳定,晚上会慢一点,估计是美国白天的关系。

linode 日本机房 70ms左右,前两天刚从美国迁移过来,速度很不错。

公司香港机房  50 ms 仅做参考

盛大云 (云中书城)  10- 20ms   云中书城是他唯一给出的案例,没法测试别的是否也这么快。

刚申请成功盛大云, ping 新浪的结果是135 ms左右, 而且访问国外速度比较慢,linux下包有时只有8k, 继续试用中。

长期招募创业伙伴 上海地区

本人正在进行一个创业计划,如果你是:交互及设计师,前端攻城师,Rails 攻城师 ,最好上海地区,如果能力很强可以外地, 而且希望趁年轻一起做一些疯狂的事情,可以联系我:mars131[at]gmail.com  。

前期以业余时间为主,没有报酬,如果能融资到钱或者项目上线有收入了可以全职,待遇肯定比平均标准高,而且创业伙伴有股份。

目前急需设计师做交互构思和设计,欢迎推荐。

站点: www.riceten.com

Paperclip在development 模式下打印不出convert 命令

今天升级了一下bundle,结果在调试时发现原先可以打印paperclip执行的imagemagick命令,现在却不可以了,网上看了一下,原因是paperclip 调用了 Cocaine插件, 而之前执行命令的log代码已经删掉了,全靠Cocaine输出。

简单的改法:

修改 config/environments/development.rb文件,最后一行加一句:

1
Cocaine::CommandLine.logger = Logger.new(STDOUT)

Git Rebase 后本地commit记录丢失

今天下班前要代码要上测试环境,和另外两个同事一起merge代码,等我merge的时候我发现pull不到更新,于是问他俩,他们竟然都签入到了master里去了,邮件里写的很清楚要签入到分支的,两个人一个都没看邮件,当时不hold住就要吐血了。

OK,  反正可以用rebase,  于是用TortoiseGit的rebase功能把他们在master上的代码merge到当前分支上来,一切搞定后提交测试,结果他俩的代码都正确了,我之前写的功能没有了,再看看代码今天写的东西都没有了,shit, 看来真是hold不住了。

查看log记录,没有push到远程的commit也都不见,难道真的要重写一遍么,还好万能的 Google 救了我。

即使rebase命令已经干掉了上一次push到现在的所有提交记录但是在本地文件里还是有相关信息的,找到项目目录下的git文件 .git\logs\refs\heads\branchname, 打开来看看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
0000000000000000000000000000000000000000 f7f3b11f66b709dcd93e1c15825270dce90adc5e jonny <jonny.zheng@lexisnexis.com> 1314676889 +0800	branch: Created from HEAD

f7f3b11f66b709dcd93e1c15825270dce90adc5e 74173c185de3ce5ee846bc7e0326481276372071 jonny <jonny.zheng@lexisnexis.com> 1314682422 +0800	commit (amend): init

74173c185de3ce5ee846bc7e0326481276372071 93ba66f74b9e11ed8acae3e6ddd1159be1ff9ef4 jonny <jonny.zheng@lexisnexis.com> 1314682760 +0800	commit (merge): Merge branch 'b3.3' of 10.123.4.212:/opt/git/jolnet into b3.3

93ba66f74b9e11ed8acae3e6ddd1159be1ff9ef4 9273c7dbd497d070ebd8704f284444f658666954 jonny <jonny.zheng@lexisnexis.com> 1314772033 +0800	commit: 1

9273c7dbd497d070ebd8704f284444f658666954 9530c1ca1730ab1c249d3c301817bd037b3f6773 jonny <jonny.zheng@lexisnexis.com> 1314786503 +0800	commit: daily check in

9530c1ca1730ab1c249d3c301817bd037b3f6773 c91bb413528815321b10929d9cd26480de64f3bf jonny <jonny.zheng@lexisnexis.com> 1314787003 +0800	commit (amend): daily check in

c91bb413528815321b10929d9cd26480de64f3bf 3006dced1c8d39108483927bd5cc1e9ee4d1ec05 jonny <jonny.zheng@lexisnexis.com> 1314788056 +0800	3006dced1c8d39108483927bd5cc1e9ee4d1ec05: updating HEAD

3006dced1c8d39108483927bd5cc1e9ee4d1ec05 813acf5e60bc0d2e64c9682fe7498dc79606e1e1 jonny <jonny.zheng@lexisnexis.com> 1314788446 +0800	813acf5e60bc0d2e64c9682fe7498dc79606e1e1: updating HEAD

813acf5e60bc0d2e64c9682fe7498dc79606e1e1 ada2680266b192a0ebf8d4a43ca8ca4812aadc78 jonny <jonny.zheng@lexisnexis.com> 1314788695 +0800	ada2680266b192a0ebf8d4a43ca8ca4812aadc78: updating HEAD

ada2680266b192a0ebf8d4a43ca8ca4812aadc78 a259bcff43cc726be011efbbeb5975ffafb87ee5 jonny <jonny.zheng@lexisnexis.com> 1314788871 +0800	commit: rebase

最后一行是rebase的操作,我只要新建个分支在里面找回前一行commit的代码就可以了。

1
git checkout -b my_recovery 0800	ada2680266b192a0ebf8d4a43ca8ca4812aadc78

方法2(这个更简单)

1
2
3
git reflog
# Suppose the old commit was HEAD@{5} in the ref log
git reset --hard HEAD@{5}

终于找回了丢失的代码,可以不用重写一遍了,而且学到了很有用的解决方法,看来犯错也不都是坏事。

最后补一句,还是命令行比较好用,图形化的复杂操作不会用啊。

windows下为TortoiseGit生成密钥

使用TortoiseGit 的时候如果进行远程提交的话使用putty密钥会比较方便,记录一下生成密钥的步骤。

  1. 下载 putty, putty-key-Generator putty 是用来连接远程linux server的客户端,putty-key-Generator是用来生成公钥和密钥的。

  2. 生成公钥密钥 运行  putty-key-Generator,设定生成公钥的长度,一般是1024,2048 .  然后点击Generate按钮,同时鼠标需要在生产区域不停的动,直到密钥生成。 生成好后,key-comment填写 用户名@主机名 ,如: git@server1

  3. Linux 端配置 确保 /etc/ssh/ssh_config文件中下面的配置打开 RSAAuthentication yes 编辑 用户目录下.ssh/authorized_keys, 把第一步生成好的公钥替换掉原来的。 修改权限:

1
2
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
  1. windows端进行连接 使用putty进行连接,connection->ssh->auth 里选择第一步保存的私钥, 填写好session信息后登陆。输入login name, 这时使用了私钥就不再需要密码了。

 

Mysql 新版本编译参数

新版本的mysql 使用了CMAKE作为编译工具,不论这种方法的优缺点,先上编译参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cmake . \
-DCMAKE_BUILD_TYPE:STRING=Release \
-DCMAKE_INSTALL_PREFIX:PATH=/usr/local/mysql \
-DDEFAULT_CHARSET:STRING=utf8 \
-DDEFAULT_COLLATION:STRING=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock \
-DCOMMUNITY_BUILD:BOOL=ON \
-DENABLED_PROFILING:BOOL=ON \
-DENABLE_DEBUG_SYNC:BOOL=OFF \
-DINSTALL_LAYOUT:STRING=STANDALONE \
-DMYSQL_MAINTAINER_MODE:BOOL=OFF \
-DWITH_EMBEDDED_SERVER:BOOL=ON \
-DWITH_EXTRA_CHARSETS:STRING=all \
-DWITH_SSL:STRING=bundled \
-DWITH_UNIT_TESTS:BOOL=OFF \
-DWITH_ZLIB:STRING=bundled \
-LH

具体可参考 http://forge.mysql.com/wiki/CMake

CMake和configure的命令行参数比较 http://forge.mysql.com/wiki/CMake#Introduction