博客

维护外地儿童享有教育平等权利的行动

以下来自老虎庙 @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

Topic: 社会

从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

Topic: 技术

Firefox 的国际米兰炫彩风格

炫彩风格,就是 Personas 啦,中文就是这么翻译的。这个功能随新版的 Firefox 也推出一阵子了,不过我的 Fx 一直是素面朝天。直到——

前两天,我哥给了我两个国际米兰风格的链接,觉得其中一个还不错。用了几天后,今天自己分别用 inter football、inter f c、inter FC 作为关键字搜了一下,发现选择多了不少。

国际的 fans 可以看看,当然曼联的切尔西的巴萨的肯定也有,自己动手吧。

inter football

inter f c

inter FC

Topic: 网络 运动

几个邮件服务商的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附件是靠谱的. 再大些的话,就得先看看对方服务器是否支持了

Topic: 技术

昨日香巴拉穿越

好久没有运动了,加上衣服准备的不好,老婆还把可外挂登山杖的背包带去了西安,于是全程无杖,最后两个山头爬得是相当累。下一段时间得每天锻炼了...

这是为岗什卡做准备的系列训练之一。接下来是4月10日凤凰坨、4月17日海陀山,4月24日白河野外攀岩

如果没有重要事情的话,5月8日就去岗什卡了

Topic: 生活

搜狐邮件中心将推出本地客户端——极速邮

提前剧透一下:

  1. 该 Windows 客户端是用IronPython开发的,因此要求 .NET Framework 2.0 环境
  2. 该客户端采用了特殊协议,暂时只支持搜狐闪电邮系列邮箱。包括 @sohu.com、@vip.sohu.com、@sogou.com、@chinaren.com
  3. 大概 5 月发布
  4. 有可能同期以开源形式推出 Linux、MacOSX 的版本
Topic: 商业

翻墙代理的加密部分

就是怎么在 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, PaddingMode

from 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 md5

from 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

Topic: 技术

翻墙代理的远程部分

既然要翻墙,肯定要有一台墙外主机。为了配合加密,以及 HTTP/HTTPS 协议代理,需要编译有 mcrypt 和 curl 的 PHP;在如今我估计这应该都属于web主机标配环境.

如果是文本数据,就加密后返回;如果非文本数据,就不加密了。返回给本地代理以第一个字符是"0" or "1"来指示接下来的数据是否经过加密。

配合其运行的代码见
翻墙代理的本地部分

翻墙代理的加密部分


$PASSWORD = "yourpasswordhere";
$pw_md5 = md5($PASSWORD, true);
$key = substr($pw_md5, 0, 8);

$iv = substr($pw_md5, 8, 8);

$input = file_get_contents("php://input");

$td = mcrypt_module_open('des', '', 'cbc', '');
mcrypt_generic_init($td, $key, $iv);
if (strlen($input) > 0 && $input % 8 == 0) {

$input = strip_pkcs7("des", "cbc", mdecrypt_generic($td, $input));

$req = explode("\r\n\r\n", $input, 3);

$rawreqline = explode(" ", $req[0]);

$url = parse_url($rawreqline[1]);

$_headers = explode("\r\n", trim($req[1]));
//$_headers[count($_headers)] = "X-Forwarded-For: ".$_SERVER['REMOTE_ADDR'];
if ($url["scheme"] == "http" || $url["scheme"] == "https") {
$ch = curl_init($rawreqline[1]);
/* avoid HTTP/1.1 Transfer-Encoding: chunked */
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $_headers);
curl_setopt($ch, CURLOPT_HEADER, 1);
if ($url["scheme"] == "https") {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if ($rawreqline[0] == "POST" && count($req) == 3) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req[2]);
}

$data = curl_exec($ch);

curl_close($ch);
}

$text_mode = "0";

$res = explode("\r\n\r\n", $data, 2);
$header = explode("\r\n", $res[0], 2); // STATUS HEADER
$headers = explode("\r\n", $header[1]);
foreach ($headers as $hline) {
$h = explode(":", $hline, 2);
$k = strtolower(trim($h[0]));
if ($k == "content-type" && strpos(strtolower(trim($h[1])), "text/") === 0) {
$text_mode = "1";
break;
}
}
if ($text_mode == "1") {
mcrypt_generic_deinit($td);
mcrypt_generic_init($td, $key, $iv);
$data = mcrypt_generic($td, padding_pkcs7("des", "cbc", $data));
}
$data = $text_mode . $data;
}
?>

Topic: 技术

翻墙代理的本地部分

我的这个 proxy 代码参考自 SUZUKI Hisao 的 Tiny HTTP Proxy。主要修改的有两点:

  1. 原版的 do_CONNECT 是两个套接字直接互相转发数据,我改成了 SSL 中间人代理.. 而且依赖到 python 2.6 才支持的 server-side ssl wrap
  2. 另外就是自己封装了 descrypto 类,完成和远程 PHP 的加密
配合其运行的代码见
翻墙代理的远程部分

翻墙代理的加密部分


# -*- coding: utf-8 -*-
# 建议 Python 2.6 环境,以支持 https proxy
# Win32 下需安装
# http://www.python.org/ftp/python/2.6.5/python-2.6.5.msi
# http://www.voidspace.org.uk/downloads/pycrypto-2.0.1.win32-py2.6.exe
# 至于 IronPython 目前还没有 server-side ssl 支持,据说 IP 2.6.1 将会有...
try:
from ipcrypto import descrypto
#IronPython 里的 socket 不支持 bind 到 '0.0.0.0'
import platform
bind_address = (platform.node(), 8000)
except:
from pycrypto import descrypto

bind_address = ('0.0.0.0', 8000)

import urllib2

import BaseHTTPServer, SocketServer

#REMOTEURL/PASSWORD 和国外主机配合
REMOTEURL = 'http://www.dup2.org/blarblarblar.php'

PASSWORD = 'yourpasswordhere'

# KEY/CERT 的生成参考 http://docs.python.org/library/ssl.html
KEYFILE = 'cert.pem'

CERTFILE = 'cert.pem'

#自定义允许的IP列表, 给每个IP起个名字帮助记忆

allow_clients = {'127.0.0.1': 'myself'}

desobj = descrypto(PASSWORD)

skip_headers = ["keep-alive", "proxy-connection", "connection", "accept-encoding"]

class pseudofile():
''' SSL Pseudo File Object'''
def __init__(self, sslobj):
self.sslobj = sslobj

self.closed = 0

def read(self, size):
chunks = []
read = 0
while read < size:
data = self.sslobj.read(size-read)
read += len(data)
chunks.append(data)

return ''.join(chunks)

def readline(self):
line = []
while 1:
char = self.sslobj.read(1)
line.append(char)

if char == "\n": return ''.join(line)

def write(self, data):
bytes = len(data)
while bytes > 0:
sent = self.sslobj.write(data)
if sent == bytes:
break # avoid copy
data = data[sent:]

bytes = bytes - sent

# 下面两个方法是 BaseHTTPServer 里会调用到的
def flush(self):
pass

close = flush

def checkip(f):
def new_f(_self):
(ip, port) = _self.client_address
if ip in allow_clients:
f(_self)
else:
_self.send_error(403)

return new_f

class ProxyHandler(BaseHTTPServer.BaseHTTPRequestHandler):

@checkip
def do_GET(self):
content_length = 0
if hasattr(self, "sslhost"): self.raw_requestline = "%s https://%s%s %s\r\n" % (self.command, self.sslhost, self.path
, self.request_version)
h = [self.raw_requestline]
for kv in self.headers.items():
if kv[0] == 'content-length':
content_length = int(kv[1])
if kv[0] in skip_headers: continue
h.append("%s: %s" % kv)
h.append("connection: close")

req = "\r\n".join(h) + "\r\n\r\n"

if content_length:

req += self.rfile.read(content_length)

encreq = desobj.enc(req)
req = urllib2.Request(REMOTEURL, encreq)

f = urllib2.urlopen(req)

text_mode = f.read(1)
response = f.read()
if text_mode == "1":
response = desobj.dec(response)
self.wfile.write(response)
print 'REQUEST:', self.raw_requestline.strip()
#有时候一些看起来是 text/* 的请求也是 binary mode,通常是 304 Not Modified

print 'RESPONSE: %s, %d Bytes' % ('crypted mode' if text_mode == "1" else 'raw mode', len(response))

self.close_connection = 1

@checkip
def do_CONNECT(self):
# print self.raw_requestline
# "CONNECT twitter.com:443 HTTP/1.1"
self.sslhost = self.raw_requestline.split()[1]
self.wfile.write(self.protocol_version + " 200 Connection established\r\n")
self.wfile.write("Proxy-agent: QYB\r\n\r\n")
# TODO 浏览器端会看到一个警告,但是没有办法;避免警告是不对的,必须让使用者认识到现在是中间人模式
try:
import ssl
self.rfile = pseudofile(ssl.wrap_socket(self.connection, KEYFILE, CERTFILE, True))
self.wfile = self.rfile
self.handle_one_request()
except:
print 'ssl error:', self.raw_requestline

self.close_connection = 1

do_PUT = do_GET
do_POST = do_GET
do_HEAD = do_GET

do_DELETE = do_GET

class ThreadingHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): pass
httpd = ThreadingHTTPServer(bind_address, ProxyHandler)
httpd.serve_forever()

Topic: 技术

今天审判赵连海

关键词:结石宝宝家长

RT @ranyunfei: 中国民众必须知道一个残酷的事实:如果你不想让你的孩子成为奴隶主的添头,在中国生小孩是需要勇气的。如若没有替孩子的自由和权利而战的准备就最好别生。

RT @aiww 判刘晓波,那是读书人的事;判谭作人,那是四川的事;今天审判赵连海,这是每一个有后代的人的事,除非你觉得中国人就该断子绝孙。

Topic: dada
订阅 RSS - 博客 | BT的花