博客
草泥马之歌
作词:佚名(待考) 作曲:蓝精灵
在那荒茫美丽马勒戈壁有一群草泥马,
他们活泼又聪明,
他们调皮又灵敏,
他们自由自在生活在那草泥马戈壁,
他们顽强勇敢克服艰苦环境。
噢,卧槽的草泥马!
噢,狂槽的草泥马!
他们为了卧草不被吃掉
打败了河蟹,
河蟹从此消失草泥马戈壁
《草泥马之歌》有可能成为一首载入中华民族史册的歌曲,它将在贵国这片神奇的土地上不断地被人们唱起。
IronPython 2.6.1 补上了 SSL 支持
CPython 2.6 里面,把以前的 socket.ssl() 去掉,新增加了一个 ssl module,提供了更完善的API,包括 server-side SSL。IronPython 2.6.0 刚发布的时候,估计把和 CPython 2.6 兼容性的工作重心放在语言核心方面了,漏掉了对这个 ssl 模块的支持,现在终于在 2.6.1 里面补上了。
就我个人测试,IP 的 client-side ssl 是能用的,但是还有点小小的兼容性问题。我在mail-list里指出了这点,开发者为此新开了一个 issue #26778。server-side 用起来明显和 CPython 不同,使用自制的证书(我的翻墙 Proxy)会在握手阶段报一个 "The credentials supplied to the package were not recognized" 错误,现在正在等待列表上的开发者给我回复..
BTW: 我猛然发现我的翻墙工具基本上和 GAppProxy 一样。只不过他是用 gzip 压缩,而我是用 des 来穿过 GFW(这样安全性要好那么一点点);而且我 HTTPS 支持部分的代码比他漂亮,呵呵
维护外地儿童享有教育平等权利的行动
以下来自老虎庙 @24hour 目前推特现场直播:
# 现场标语:保障外地儿童平等入学 #haidian
27 minutes ago via web
#标语:不要户口要平等 #haidian
27 minutes ago via web
#家长纷纷赶到 #haidian
40 minutes ago via web
#今日**大事:早八点半要求外来学童入学平等待遇对话在海淀教委进行。 已到现场,请关注直播!#haidian
44 minutes ago via web
以下来自许志永 @zhiyongxu 4月8日推特直播:
# 我们的五条可不可行?等待答复。关于一班40人,我的意思是,40人不是排斥外地孩子的理由。 3:50 PM Apr 8th via web
#教委:捐资助学费上缴财政了。家长:既然给财政,为何不公开呢? 3:45 PM Apr 8th via web
#择校费应该明确,不要回避,回避,改成捐资助学费没有意义,应当规范,严格择校条件,公开透明。 3:44 PM Apr 8th via web
#所有人不分户籍一律平等;公立学校全部参加电脑派位,取消自主招生;择校条件和费用全部公开透明。 3:38 PM Apr 8th via web
#教委:准备建更多学校。家长:义务教育平等优先,至于特长生什么的,那是次要问题。我们念五条要求。 3:34 PM Apr 8th via web
#特长生制度把很多孩子毁了,畸形。 3:30 PM Apr 8th via web
#特长生的问题呢?推优呢?全部电脑派位。 3:27 PM Apr 8th via web
#公立学校限制40人一班,因此很多孩子没学上,这样的限制不合理。 3:23 PM Apr 8th via web
#教委:正在调研,正在考虑家长们的要求,电脑派位统一录取。 3:21 PM Apr 8th via web
#北京人口未来十年可能接近3000万,新市民的孩子都会来北京读书,这是政府要考虑的。 3:20 PM Apr 8th via web
#教委:必须考虑打工子弟人口最大外延。1000万人的孩子都会来北京的,城市既然容纳劳动力,也就应当容纳他们的孩子。 3:15 PM Apr 8th via web
#让家长提供居住地证明,按照居住地解决 3:14 PM Apr 8th via web
#教委:上海积分制,看贡献。我的观点:上海那样做也不公平。 3:09 PM Apr 8th via web
#
家长:找了很多中学,都很黑,为什么海淀不能创造一个好的教育氛围呢? 3:08 PM Apr 8th via web
#中科院工作的一位家长:我的孩子找了5个学校了,要收很多钱,可以说很肮脏。 3:06 PM Apr 8th via web
#教委:还有一个问题,打工子弟学校一家两三个孩子,要不要都解决?家长:多少孩子都应当解决啊 3:05 PM Apr 8th via web
#教委:人越来越多了,所以资源紧张。海淀去年解决了4700外地孩子上初中。假如外区县的孩子回居住地上学,海淀教育资源不再紧缺。 3:04 PM Apr 8th via web
#家长:往年所有的孩子都能入学,为什么今年教育资源紧张了? 3:00 PM Apr 8th via web
#我的发言,公立学校应该提供严格的平等教育;如果择校,严格限制,条件公开,费用公开;至于想选择特别优越的学校,那北京四中,人大附之类的应该私立,国家不资助。 2:59 PM Apr 8th via web
#海淀1300名打工子弟学校学生,有的教材不一样,怎么升北京的初中?这是个问题。 2:53 PM Apr 8th via web
#打工子弟学校里面有多少孩子的家长在外地区工作?我倾向于按经常居住地确定学籍,即使打工子弟学校不合法,但孩子的学籍必须合法。 2:52 PM Apr 8th via web
#在海淀教委谈平等教育,20多位家长代表1800多位家长和教委有关负责人协商。 2:48 PM Apr 8th via web
#反户籍歧视,从孩子教育开始。下午20位家长代表1000多家长第五次去海淀教委协商平等教育问题。http://xuzhiyong.fyfz.cn/art/604683.htm 9:03 AM Apr 8th via web
从U盘安装 Windows XP
假如你的机器没有光驱(常见于上网本,或超便携笔记本)而需要重装操作系统,那就只能从USB安装了。而最方便快捷的方法无疑是生成USB安装盘。
我是因为光驱挂了,所以去往上找相关方案的。搜了一圈,看起来最傻瓜的方法是MSFN 论坛上的一个 "WinSetupFromUSB with GUI",我用的是当前最新的 1.0 beta6
但是它的界面过于 geek 了,经我实战校验,只需要三步(参考下图):
1. 选择一个操作系统类型
2. 选择安装光盘路径,换言之就是那个i386的父目录
3. GO
总之可以忽略界面开始的两个格式化相关按钮。如果为了清理空间而格式化的话,大可以在资源管理器里弄
然后就是从U盘启动,选择First Step,进入 XP 文本安装状态,大约5分钟完成,重起,继续从U盘启动,选择Second Step,进入 XP 图形安装界面,10-15分钟装完,再次重起。接下来就没U盘啥事了。
install xp from usb
Firefox 的国际米兰炫彩风格
炫彩风格,就是 Personas 啦,中文就是这么翻译的。这个功能随新版的 Firefox 也推出一阵子了,不过我的 Fx 一直是素面朝天。直到——
前两天,我哥给了我两个国际米兰风格的链接,觉得其中一个还不错。用了几天后,今天自己分别用 inter football、inter f c、inter FC 作为关键字搜了一下,发现选择多了不少。
国际的 fans 可以看看,当然曼联的切尔西的巴萨的肯定也有,自己动手吧。
几个邮件服务商的EHLO SIZE结果
- gmail.com, 35651584
- hotmail.com, 29696000
- sina.cn, 52428800
- 126/QQ, 不支持在 EHLO 的时候响应 SIZE
考虑到附件大小编码后要增加1/3,上述三个邮箱 SIZE * 0.75 后分别为:26,738,688/gmail,22,272,000/hotmail, 39,321,600/sina
换句话说,向别人发邮件带个20M附件是靠谱的. 再大些的话,就得先看看对方服务器是否支持了
昨日香巴拉穿越
好久没有运动了,加上衣服准备的不好,老婆还把可外挂登山杖的背包带去了西安,于是全程无杖,最后两个山头爬得是相当累。下一段时间得每天锻炼了...
这是为岗什卡做准备的系列训练之一。接下来是4月10日凤凰坨、4月17日海陀山,4月24日白河野外攀岩
如果没有重要事情的话,5月8日就去岗什卡了
搜狐邮件中心将推出本地客户端——极速邮
提前剧透一下:
- 该 Windows 客户端是用IronPython开发的,因此要求 .NET Framework 2.0 环境
- 该客户端采用了特殊协议,暂时只支持搜狐闪电邮系列邮箱。包括 @sohu.com、@vip.sohu.com、@sogou.com、@chinaren.com
- 大概 5 月发布
- 有可能同期以开源形式推出 Linux、MacOSX 的版本
翻墙代理的加密部分
就是怎么在 PHP/mcrypt 和 PyCrypto 之间 DES(或其他加密算法,比如3DES/RSA/..) 通信的问题,我这里还额外考察了下 .NET 平台的算法
网上询问相关问题的还挺多,尤其是 PHP 和 .NET 之间的 DES 转换。主要是 PHP/mcrypt 隐藏了 padding 的细节,且只保留了 ZERO_PADDING 模式,所以不明白cyrpto原理的不太容易找到症结所在。我的传输方案统一用 pkcs#7 padding.
首先是给服务器端增加的 PKCS#7 PADDING 函数,来自PHP官方函数手册上某人的注释
function padding_pkcs7($crypto, $mode, $dat)
{
$block = mcrypt_get_block_size($crypto, $mode);
$len = strlen($dat);
$padding = $block - ($len % $block);
$dat .= str_repeat(chr($padding),$padding);
return $dat;}
function strip_pkcs7($crypto, $mode, $text)
{
$block = mcrypt_get_block_size($crypto, $mode);
$packing = ord($text{strlen($text) - 1});
if($packing and ($packing < $block)){
for($P = strlen($text) - 1; $P >= strlen($text) - $packing; $P--){
if(ord($text{$P}) != $packing){
$packing = 0;
}
}
}
return substr($text,0,strlen($text) - $packing);
}
本地端 .NET 平台的 descrypto 封装
# -*- coding: utf-8 -*-
# ipcrypto.py
from System import Array, Byte
from System.Security.Cryptography import DESCryptoServiceProvider, CryptoStream, CryptoStreamMode, PaddingModefrom System.IO import MemoryStream, StreamWriter, StreamReader
from hashlib import md5
def s2ab(s): return Array[Byte](tuple(Byte(ord(c)) for c in s))
def ab2s(ab, len=0):
if len == 0: len = ab.Length return ''.join([chr(ab[i]) for i in range(len)])
class descrypto():
def __init__(self, password):
pwmd5 = md5(password).digest()
self.key = s2ab(pwmd5[:8])
self.iv = s2ab(pwmd5[8:]) self.des = DESCryptoServiceProvider() # 缺省 des.Mode = CipherMode.CBC
def enc(self, input):
ms = MemoryStream()
encStream = CryptoStream(ms, self.des.CreateEncryptor(self.key, self.iv), CryptoStreamMode.Write)
sw = StreamWriter(encStream)
sw.Write(input)
sw.Flush()
encStream.FlushFinalBlock() return ab2s(ms.GetBuffer(), ms.Length)
def dec(self, input):
ms = MemoryStream(s2ab(input))
length = len(input)
decStream = CryptoStream(ms, self.des.CreateDecryptor(self.key, self.iv), CryptoStreamMode.Read)
byteArray = Array.CreateInstance(Byte, length)
length = decStream.Read(byteArray, 0, length)
return ab2s(byteArray, length)
本地端 PyCrypto 的封装
# -*- coding: utf-8 -*-
# pycrypto.py
from hashlib import md5from Crypto.Cipher import DES
class descrypto():
def __init__(self, password):
pwmd5 = md5(password).digest()
self.key = pwmd5[:8] self.iv = pwmd5[8:]
def enc(self, input):
des = DES.new(self.key, DES.MODE_CBC, self.iv)
lastblock = len(input) % 8
if lastblock > 0:
padding = 8 - lastblock input += padding * chr(padding)
return des.encrypt(input)
def dec(self, input):
des = DES.new(self.key, DES.MODE_CBC, self.iv)
ret = des.decrypt(input)
padding = ord(ret[-1])
for i in range(padding):
if ord(ret[-1 - i]) != padding:
padding = 0
break
if padding > 0:
ret = ret[:-padding]
return ret

最新评论