ADSL被联通(北京网通)的“京城时讯”劫持!

最近发现我访问一些站点的时候(如昨晚访问www.apple.com的时候)我发现页面弹出广告,但问题是apple.com的英文网站是不可能弹出中文广告的。

网通“京城时讯”弹出广告的截图

今天我又重现了这个问题,仔细看了下出问题的原因,页面的url没有变,dns也是正常的。应该只是http请求被劫持。可恨的是它不是注入式的劫持(也就是将广告的代码插入到</body>之前,而是使用了非常简单的iframe劫持,这种初级的劫持手段会造成很多网站访问不正常。可恨的是,在这样的劫持下你的个人隐私就完全没有保证了。代码是这样的:


<html>
<meta http-equiv='Pragma' content='no-cache'><head><title></title>
<script LangUage='JavaScript'>
try{var tmp=parent.window.location.href}catch(e){window.location.reload();}
</script>
</head>
<frameset framespacing=0 border=0 rows='*,0' frameborder=0 onload="window.lxmainframe.location='http://61.172.192.88/city/index.html?url='+window.location;"><frame name='lxmainframe' src='about:blank' scrolling='auto'><frame name='lxblankframe' src='about:blank' scrolling='no'></frameset>
</html>

作为一个mac user,我显然不是中病毒了。google一下也发现很多人都遇到了“京城时讯”的绑架。我刚才给10010打电话投诉,还好虽然停机保号但是可以拨10010。先是被转到网络部,让我自己到www.jcxinxi.com自己注销,让我挂电话。我马上试验,发现根本找不到她说的登录的地方,让她们告诉我详细注销步骤,她让我等了有3分钟左右才告诉我需要点那个“会员注销”。然后我又继续让她转接专门负责投诉的“上级”,那个上级向我解释了“给我看广告是为我好,这个服务是免费赠送以后”,我只能告诉他我办包年服务的时候的单子上面没有说网通可以免费赠送给我这个服务的时候才客气的让我留下联系方式说再联系。我知道这种事情“don’t blame the people, blame the game.”,所以我接受人家的电话服务。把这倒霉的该死的差劲ADSL服务Blame到底,投诉到底!

我投诉的时候提了几个理由:

  1. 联通在没有最终用户许可的情况下私自给我绑服务。
  2. 你们嵌入网站的iframe的方式直接造成很多网站访问不了。
  3. 给我看商业广告,jcxinxi可以从后向商户收费。侵犯了我这个最终用户的利益。尤其是我是有偿使用ADSL服务且我从来没有同意接收广告。
  4. 你们窃取我的HTTP Request是严重的侵犯我的隐私。
  5. 你们影响了我访问网站的显示效果,也是对第三方利益的侵犯。

周六日重构OpenParty App中发现的一些问题

Open Party App是我们在为OpenParty开发的新网站,上面集成了会员注册报名参加活动等功能。我们把他放在Google Code上面以开源crowd sourcing的方式开发。Django我是业余水平,在这个项目里面继续磨练。上周末正好有空开发,顺便重构了一下代码,我把其中发现的一些bad smell纪录下来,给和我们一样的Django业余团队参考。

  1. {% ifequal event.is_upcoming 1%}

    这是错误的,本意是{% if event.is_upcoming %},因为它本身就是个Boolean

  2. <a class=”gray_link”>看看谁参加了活动</a>

    gray_link是一个为样式命名的css class,但是css class的名字应该是一个结构语义的东西。也就是说css class应该是What it is而不是How it looks like。可以命名为<a class=”who-participated”>看看谁参加了活动</a>

  3. views.py里面return render_to_response(‘core/topic.html’, locals(), context_instance=RequestContext(request))

    使用locals()我上次就发过邮件,这样做是不好的。因为locals会鼓励你创建很多没有意义的本地变量,将它们一股脑的传递到template。造成template里面由很多的判断逻辑,但是这些逻辑本身应该是在models层搞定的。当你从template重构这些晦涩复杂的判断逻辑的时候,你会发现问题可能就出在views.py里面那一个locals()。没错,我说的就是topics.html这个模版,看看判断是否可以投票的那部分逻辑,实在是太复杂了,我不得不给他写测试,花了不少的时间重构。在模版里面你总是会思考一些措辞和样式的问题,而忘记了分支逻辑的复杂,这种代码经常是有很多的bug的,而且它们非常难于维护和修复。一定要将这种复杂度封装在model层并进行测试才可以。

  4. 没有意义的判断

    我看到很多if model.is_accepted == True: return True; else: return False这样的代码。我是在不理解为什么可能出现这样的代码……请注意这个和错误1差不多,都属于非常坏的重复代码。

  5. 测试

    请注意,我们没有赶时间。我们不太需要临时性的代码,要随时注意代码的可维护性,因为我们是一个团队。测试就是代码的文档,请注意尽量尝试测试先行,如果不行也注意让你的model得到充分的测试。当你发现Event和Topic这两个Model的创建需要费这么多的周折的时候,你是否发现你的Model抽象有问题?你是否有重构的冲动,将它们的创建行为变得更简单。

  6. 命名

    is_arranged这样的命名可能不太容易理解,注释上面写的是”’该话题是否已经加入到活动,并且活动尚未开始”’。那么如果keep stupid的话我觉得,is_arranged_in_coming_event是不是更容易理解呢?

    is_shown,注释”’该话题所属活动是否正在进行或已经结束”’,这个就很难理解了。因为你看到“应该显示”这样一个名字的时候,知道后面的意思是活动正在进行或结束了么?is_arranged_event_started_or_closed也许更容易理解?

这都是一些重构建议,有一部分问题我已经重构过了。大家都在参加OpenParty的Coding Dojo,一起持续重构吧!

在Mac下的Pydev里面几个常用的快捷键 Cmd+e切换tab,配合输入tab…

在Mac下的Pydev里面几个常用的快捷键

Cmd+e
切换tab,配合输入tab文件的名字的前几个可以快速在上下文中切换tab
Cmd+d
删除本行
Cmd+Option+上
复制本行一次(Duplicate this line)
Cmd+Shift+R
快速打开文件,注意没有通配符也不是smart匹配……
Cmd+Shift+F11
Rerun,常用在运行当前的单元测试
Cmd+Option+r

Rename refactory,重命名重构,非常实用。不过少数情况下这个重构不安全,注意diff
Cmd+Shift+O
自动import,缺点是它会搅乱你精心设计的import顺序,不在乎的朋友非常方便,可以让你的coding工作变得非常流畅。不过如果你开启auto import以后这个快捷键就不需要了,但是auto import的副作用就是它经常import那些明明不需要import的东西,如self、len它都会傻傻的import。
Cmd+Shift+F
在当前Folder搜索,前提是你在文件浏览部分选中了一个Folder

刚才写了一个识别网站charset的正则,因为目前写一个网页抓取的工具,里面对中…

刚才写了一个识别网站charset的正则,因为目前写一个网页抓取的工具,里面对中文url做encoding的时候需要先识别页面的编码,可惜UrlEncoding没有强制使用UTF-8编码,真是烦人。下面是一个python下的正则表达是的字面文本。

r'<meta.*(?:(?:charset\s*=\s*["|\']?)|(?:charset.*content\s*=\s*["|\']\s*))([\d|\w|\-]+)[;|"|\'|\s]'

我的.profile里面的alias,之前使用kill $(ps auwx | …

我的.profile里面的alias,之前使用kill $(ps auwx | grep qTfnNC | grep -v grep | awk ‘{ print $2 }’)的方法放在.profile里面就不好用了,所以最近就一直没有使用它。既然还是反复在用它(连接断开vpn以后经常需要重启ssh代理),所以还是修正它好了。

alias px="ssh -qTfnNC -D 7777 yourdomain.com"
alias kpx="(ps auwx | grep qTfnNC | grep -v grep | awk '{ print $2 }')|xargs kill;px"