更换域名

名中间多了一个-一直心里不爽,加上最近域名认证甚嚣尘上,原来的j-lite.net也被强制停止解析了一阵子,所以干脆,换了新域名,从此,请各位用jsome.net来访问本站,原域名只作跳转用。

以上。

emacs sudo编辑远端文件

在之前的一篇文章里提到过在Emacs下使用sudo的方法。这个解决了我很多本地编辑的问题。但是我还是抛不开vi,因为一直没有解决服务器上需要sudo才有权限的文件编辑问题。

现实中这是一个很普遍的现象,就是在服务器上关闭了root或者其他用户的ssh登陆权限,是通过一般用户登陆以后通过sudo等方式获得权限后才能进行进一步的文件编辑。而如果直接使用sudo,用比如/sudo:user@host:filepath的方式来打开文件,Emacs会报错说这是一个远端文件,不能使用sudo来进行操作。就因为这提示,导致我一直以来对于这样的情况只能乖乖地开个shell跑到服务器上面去用vi编辑,编辑过程中的各种不爽在此不表……

不过当最终忍受不住这种只能用vi的寂寞后,终于下定决心看一下tramp的手册,结果很好,发现了这么一章内容――Connecting to a remote host using multiple hops,原来tramp是可以通过设置代理的方式来编辑那些无法直接访问到的文件的。代理可以是各种Inline method,也可以是Gateway method。所以通过ssh做跳板再sudo是完全可行的。

设置的格式是(host user proxy),其中proxy可以使用%u%h来通配输入的用户名和主机名。详细情况感兴趣的童鞋可以细看手册,这儿就只贴出满足我的需求的代码了:

(add-to-list 'tramp-default-proxies-alist
             '(nil "\\`user\\'" "/ssh:%h:"))

经过这样的设置,就可以直接使用/sudo:user@host:filepath来编辑那些远端需要sudo的文件了。所以,泡杯茶,扔掉vi吧 : )

在Finder中启动当前目录的iTerm

阵子看了个利用Automator给Finder加上自动切换显示隐藏文件的方法,觉得这方法还不错。早想给Finder加上一个打开当前路径的终端的功能了,于是就撒手开干。

打开Automator,新建服务,服务接受设为 没有输入 ,位置设为 Finder ,从左侧的资源库中找出 运行AppleScript ,拖到右侧,然后保存为 Open iTerm Here 。这时候切换到Finder,便会发现服务子菜单里面多出了一个 Open iTerm Here 的菜单。OK,基础工作完成,下面就是码代码的时间。

在刚刚创建的AppleScript的输入框中输入如下代码,

on run {input, parameters}

  tell application "Finder"
    try
      set currFolder to (folder of the front window as alias)
    on error
      set currFolder to (path to desktop folder as alias)
    end try
    set currPath to POSIX path of currFolder
  end tell

  tell application "iTerm"
    activate
    tell the first terminal
      launch session "Default Session"
      tell the last session
        write text "cd " & quoted form of currPath
      end tell
    end tell
  end tell

  return input

end run

这段AppleScript会获取将当前最前面的Finder地址,如果获取不到,则返回桌面店址,然后通知iTerm的第一个窗口新建标签并跳到这个目录去。为啥是iTerm的第一个窗口? 因为我一般只开一个而已…… 各位童鞋可以根据自己需要作调整。

好了,这时候按一下编辑器的运行,看看是不是正常工作了。一般是没问题的,因为我现在在用的就是这段 = =|||

嗯,大功告成,这时候在Finder中选择这个服务,一切便都如我们所愿了。最后,为了避免每次都要去点菜单,再去键盘设置里改一下快捷键。最理想当然就是用 command+T 了,不过这个快捷键被加入边栏这渣占用了,既不能被服务的快捷键覆盖,又找不到取消这种系统快捷键的方法,于是只好把加入边栏改成一个不常用的键组合,这才一切OK。

Django的CSRF原来形同虚设呀⋯⋯

在搞Django 1.3和Uploadify的整合时,被莫名其妙的302困扰,在苦思之后突然发现,原来Uploadify发送请求时是不会发送Cookie信息的。火急火燎地弄了个middleware来将POST中对应字段写到request.COOKIES去。这样一搞,302倒是ok了,但403倒跑了出来。使用抽插,哦不,抽查法找到是Csrf的验证问题,于是天真地把csrfmiddlewaretoken塞到POST里,可是403依旧。甚是火大。

只好乖乖地看源码,看看Django是如何做CSRF验证的。Django是在CsrfViewMiddleware中进行的相关验证,验证过程很简单,从Cookie中拿出token,然后从POST中拿出csrfmiddlewaretoken,然后块俩做一个字符匹配,就哦了。于是明白了,不就再传个cookie嘛,但突然一想,不对呀,csrfmiddlewaretoken的值就是从cookie里拿的,再传同一个值来做验证,这不是和没验证没啥区别么……

于是做了一个试验,结果确实如此,这下Django悲剧了……

实验项目可以在这个地址下载,运行runserver后,用curl来验证

直接GET,无障碍

curl http://127.0.0.1:8000

强制GET,无障碍

curl -G -d test=test http://127.0.0.1:8000

POST,403了,ms没问题?

curl -d test=test http://127.0.0.1:8000

POST,随便加上csrf,靠!!居然过了!!!

curl -d "test=test;csrfmiddlewaretoken=1" -b csrftoken=1  http://127.0.0.1:8000

归根结底,还是这个验证方法有问题,起码post中的token和cookie中的token是用secret_key做过变幻的,这样才能避免伪造,否则,神马都是浮云~~ 望天

P.S. 报bug去了,#15845。不知他们会采用我说的方法不⋯⋯

Updated: 呃,一般情况下大约是不会有问题的,因为这只是可以任意伪造csrf_token,但通常还有需要csrf保护的地方也会需要sessionid来作用户验证。这篇的问题就可以暂时忽略了。

豆瓣电台重播Bookmarklet

从电台支持单曲推荐以后,以前的那个和你喜欢的音乐不期而遇的口号就逐渐变成泡沫了。当发现可以听任意条目页上的可加心曲目时,种种神秘感便都烟消云散了,这样不好,不好。不过,有一个功能倒是挺实用的,那就是重播当前歌曲,反正都不小心让我遇上了,那多听两遍总没啥问题吧…… 于是,就诞生了如下的bookmarklet,需要的童鞋自己领用吧。

豆瓣电台 - 重播当前曲目

这颠倒的日子

吧,一年一次不负责任日来了,跟风改了主页风格,各位慢慢看,别晕。

继续阅读

Django 1.3新特性

阵子出去度假了,回来发现Django 1.3终于发布了。这次发布包含了少量新功能和大量的bugfix,具体的下文会说明。这次升级对Python版本的最低要求提高至2.4,另外这将是最后一个支持2.4的Django版本了,各位有能力有需求的同志请果断更新。

1.3带来了什么?

类视图 (Class-based views)

本次更新加入了一个新的框架来支持类视图,这将意味着更高的代码重用率和开发效率。新的Generic View基类在提供了易用性和扩展性的同时,还对原先的函数式generic view提供了完整的模拟支持。

扩展链接:
通用类视图
新旧Generic View迁移指南

继续阅读

嗨,新年快乐

虎年的尾巴上,我这个很挫的blog还是更新一下吧,祝大家新年快乐,万事顺利,最关键的,还是看图吧。

新年快乐

Everbox

知后觉的发现有了Everbox这么个玩意儿,盛大搞出来的云储存,看这架势是要弄得像dropbox那样,不过很不给力的现在只有Windows的客户端…… 但帮助中心里已经豪言要做各个桌面平台和移动平台的客户端,所以还是可以期待一下的。

这玩意儿运营的方式是用了任务模式,完成啥啥啥任务就奖励多少空间,不过所谓任务,无外乎安装客户端上传文件邀请好友什么的。新注册用户初始拥有2G空间,在完成各个任务后最高能达到10G,而且官方声称以后还会有更多激励机制使活跃用户获得更多空间。

目前注册Everbox需要邀请码,而且现在有每个新用户完成安装客户端并上传文件后可以获得2G奖励的活动,不过这个活动还有2个小时不到就要结束了,而我刚刚才想起来有这么回事…… 手上还有4个邀请,看看有没有有缘人拿到这2G奖励了……

Everbox的邀请是直接发到被邀请人邮箱的,有兴趣的童鞋就在填写评论时填写email项,这样在页面上不会显示出来,免得被垃圾邮件骚扰 :)