09 / 12 / 2014 buling

22:50。刚加班回到家,很久没有写点东西了,补一篇流水账。本来周末打算写,比较累就算了,今天又遇到很郁闷的事情,就补上。

估计是老了,记得的事情只能往前推几天,且从周末说吧。周五团建,之前老大有问丹霞山和温泉选什么,我一口回答丹霞山,温泉实在泡的也忒多次了,老大说丹霞山经费不够,说去珠海泡温泉。12点半出发,先是到达神秘岛,估计是淡季,人很少,园内比较有限的娱乐项目(出来时看见门口游览图,园内有180多个项目…)第一个是碰碰车,应该是过了那个年龄我就没有去玩了,接下来过山车,以前没有玩过所以也挺刺激,有相片,但手机问题,之后补上;过后大家继续游园,我和richard、phonix拐道去了一下鬼屋,我x,全自动化的鬼,由于光线原因还是有点点恐怖;临走时本想玩一下跳楼机,可惜检修,作罢,出园,继续。大概6点过就到达住宿地,不得不说有点low,饭后7点半,一行15人去泡温泉,9点半回到住处,本来打算去德州,结果richard已经睡着了,就把他弄起来看跑男,看完11点过,准备睡觉。俗话说两个男人谈女人,三个男人谈事业。然后我们两就正儿八经的围绕着女人的话题讨论到一点。结论:活该我单身,活该你单身,照这样的思想估计还的单身很多年。

他有个很好的习惯睡觉前听一些历史事件,比如春秋三国等时候的故事,是一个不错的的,学。

周六晚起回家,到家4点余,由于旅馆床难受回家补了一觉,周末加班做了一下之前一个朋友创业的项目,说到项目,我上上周加了两天班,上周加了一天班,结果昨天改了协议,作罢,是个项目都难免,结果中午那朋友提起了之前说的一件事情,上次我已经说过这个东西不是问题,但现在初期不是时候,今天他又提了,当时我整个人都不好了,我就直接说了咋们得约定,你提需求我来实现,我实现的过程你不要过问,他有点不高兴了,打了一堆字也没记住,最后说我很难沟通,ok,你都这么说了,是吧,该撤退了。做之前没有讨论过钱,所以我很淡然,没有买卖就没有伤害,好句子,本来是想当自己的事情来做,结果果然不是,他要的是个coder,but,我不是那个程序员,呵呵。最后我把之前的代码打包发了份给他,他没说谢谢,我很不要脸的补了一句不客气。

我一般很多场景都比较理智,今天亦是。我曾经定下过,自己错了主动道歉,面子不是什么大不了的东西。尽力不为钱做不想做的事情,不卖代码。不在吵架时做决定,比如分手这类。不过现在的性格大不如之前了,是时候反省调整一下了。

昨天我姐打电话说之前给她女儿买的表有问题,我说寄回去换,最后,她说连姐要给我介绍女朋友,哈哈。然后,昨天晚上加班到10点多,她9点过电话我,说我妈让问问我幺娘要给我介绍女朋友,是神马神马地方的,随即我就拒绝了。结果前几天,对面的同事说介绍她表妹给我…这个月是桃花?我得把握住。

哦,忘了,前两天wordpress出了bug,我找时间把博客升到4.0,顺便把主题做了一些优化调整。活该你单身,来,自勉之。–09/12/14 23:30

下午去珠海,没想到一早竟然就能听到这首歌曲,现贴链接如下,好听
下载地址: http://www.mjix.com/static/鞋子特大号.mp3

在线听:http://www.mjix.com/music

 早期造个对象,写了个php的rsa帮助类库,先看使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$keys = RsaHelper::new_rsa_key();
 
//生成完key之后应该记录下key值,这里省略
$privkey = $keys['privkey'];
$pubkey  = $keys['pubkey'];
 
/* $privkey = '-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKX0cHYmXyHhIx5/
k6GMneVKpUDsqP2PdKFGollWYCbxJUAHPsHsjILGI0ucGnC+VpfKVX6DEagoRBZv
tz+nnpcreVPtNbKMNzhukSY3Mt7Fo1rMaj0pbsaMom1noQjsKJlVgz6akP7RMm4W
zpnMvcDq/9PucfCQP1FGZTbg1hUxAgMBAAECgYBeGam/ROjChC9utrZWby6E+nuT
wd3c0QA4Bp49+/1Pd4NAuBr8yQ2vhXwz/lL7xOHC9ibeMqHLcPGSq0wEGx6P/XWM
0Ldpwu6cWv4qOdHdBDdqrO6mkyBljt4sq1WtTnkLgZ0cCTTeVnnFDmlc9Zr9oT5k
UezOEb55GziRD5XUxQJBANLx3kUjOFRyR1I/wZYHHJkcm8pSgpDe4b1G60orZa9J
nbUTM+cIvmNKzm99m9aIMvgjk/LBydpxV7W5YYDxHrcCQQDJZpcu5OPWNJ3TdrrK
KNa1lfUo5Vb0sCgpTueZdwngBr043XRTyJHqjziX/9Z19UWrE9Gz6U1Klpa7SBYo
O4NXAkEArsKRCahXJ6cRrXOClx/HMpY//0uCPjFYxa32ipkPgjwz+uswycw1px83
jah7ri1iRK99B9ZCu8XBC53MyL16WwJAISu+dsDILb2YyP1jImy7gEjkignL2p0w
4CzYxFPw0m8Jt1XyFOKR9doE7jP69I6jHNw0y7b/Peuzg8EJtTKoHQJBAITAjM7Q
QnIEgYHvw3gaQI8/6992Y0DSMaHt50peI6uJoMV+X9IcjY1eFUSOHV8nb0uI8xQ7
4SbU2yvLPTqUk50=
-----END PRIVATE KEY-----';
 
$pubkey = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCl9HB2Jl8h4SMef5OhjJ3lSqVA
7Kj9j3ShRqJZVmAm8SVABz7B7IyCxiNLnBpwvlaXylV+gxGoKEQWb7c/p56XK3lT
7TWyjDc4bpEmNzLexaNazGo9KW7GjKJtZ6EI7CiZVYM+mpD+0TJuFs6ZzL3A6v/T
7nHwkD9RRmU24NYVMQIDAQAB
-----END PUBLIC KEY-----'; */
 
//初始化rsaobject
RsaHelper::init($privkey, $pubkey);
 
//原文
$data = 'hello';
 
//私钥加密示例
$encode = RsaHelper::priv_encode($data);
$ret = RsaHelper::pub_decode($encode);
var_dump($ret);
 
//公钥加密示例
$encode = RsaHelper::pub_encode($data);
$ret = RsaHelper::priv_decode($encode);
var_dump($ret);

      类库源码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
class RsaHelper{
    private static $_privkey = '';
    private static $_pubkey = '';
    private static $_isbase64 = false;
 
    /**
     * 初始化key值
     * @param  string  $privkey  私钥
     * @param  string  $pubkey   公钥
     * @param  boolean $isbase64 是否base64编码
     * @return null
     */
    public static function init($privkey, $pubkey, $isbase64=false){
        self::$_privkey = $privkey;
        self::$_pubkey = $pubkey;
        self::$_isbase64 = $isbase64;
    }
 
    /**
     * 私钥加密
     * @param  string $data 原文
     * @return string       密文
     */
    public static function priv_encode($data){
        $outval = '';
        $res = openssl_pkey_get_private(self::$_privkey);
        openssl_private_encrypt($data, $outval, $res);
        if(self::$_isbase64){
            $outval = base64_encode($outval);
        }
        return $outval;
    }
 
    /**
     * 公钥解密
     * @param  string $data 密文
     * @return string       原文
     */
    public static function pub_decode($data){
        $outval = '';
        if(self::$_isbase64){
            $data = base64_decode($data);
        }
        $res = openssl_pkey_get_public(self::$_pubkey);
        openssl_public_decrypt($data, $outval, $res);
        return $outval;
    }
 
    /**
     * 公钥加密
     * @param  string $data 原文
     * @return string       密文
     */
    public static function pub_encode($data){
        $outval = '';
        $res = openssl_pkey_get_public(self::$_pubkey);
        openssl_public_encrypt($data, $outval, $res);
        if(self::$_isbase64){
            $outval = base64_encode($outval);
        }
        return $outval;
    }
 
    /**
     * 私钥解密
     * @param  string $data 密文
     * @return string       原文
     */
    public static function priv_decode($data){
        $outval = '';
        if(self::$_isbase64){
            $data = base64_decode($data);
        }
        $res = openssl_pkey_get_private(self::$_privkey);
        openssl_private_decrypt($data, $outval, $res);
        return $outval;
    }
 
    /**
     * 创建一组公钥私钥
     * @return array 公钥私钥数组
     */
    public static function new_rsa_key(){
        $res = openssl_pkey_new();
        openssl_pkey_export($res, $privkey);
        $d= openssl_pkey_get_details($res);
        $pubkey = $d['key'];
 
        return array(
            'privkey' => $privkey,
            'pubkey'  => $pubkey
        );
    }
}

      妈蛋,win平台下的php protobuf折腾死我了,又改成py了,所以,python版的rsa加密辅助类来了

View Code PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def new_keys():
    (bob_pub, bob_priv) = rsa.newkeys(1024)
    return {'pubkey':bob_pub.save_pkcs1(), 'privkey':bob_priv.save_pkcs1()}
 
class RsaHelper:
 
    def __init__(self, privkey, pubkey):
        self._privkey = privkey.decode('string-escape')
        self._pubkey = pubkey.decode('string-escape')
 
    def encode_priv(self, data):
        privkey = rsa.PrivateKey.load_pkcs1(self._privkey)
        crypto = rsa.encrypt(data, privkey)
        return crypto
 
    def decode_pub(self, data):
        pubkey = rsa.PublicKey.load_pkcs1(self._pubkey)
        msg = rsa.decrypt(data, pubkey)
        return msg
 
    def decode_priv(self, data):
        privkey = rsa.PrivateKey.load_pkcs1(self._privkey)
        msg = rsa.decrypt(data, privkey)
        return msg
 
    def encode_pub(self, data):
        pubkey = rsa.PublicKey.load_pkcs1(self._pubkey)
        crypto = rsa.encrypt(data, pubkey)
        return crypto

      本来还以为挺有成就感了,结果,奶奶,竟然有个pkcs7规范,使用 PyCrypto 进行 AES/ECB/PKCS#5(7) 加密

View Code PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import struct, zlib, StringIO
from Crypto.Cipher import AES
 
def zip_data(data):
    '''压缩数据的方法'''
    return zlib.compress(data)
 
def unzip_data(data):
    '''解压缩数据'''
    return zlib.decompress(data)
 
def pkcs7_padding(s):
    BS = AES.block_size
    return s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
 
def pkcs7_unpadding(s):
    return s[0:-ord(s[-1])]
 
def aes_encrypt(text, key, mode=AES.MODE_CBC):
    '''AES加密算法'''
    cryptor = AES.new(key, mode, key)
    #这里密钥key 长度必须为16(AES-128)
    text = pkcs7_padding(text)
    ciphertext = cryptor.encrypt(text)
    return ciphertext
 
def aes_decrypt(text, key, mode=AES.MODE_CBC):
    '''AES解密算法'''
    cryptor = AES.new(key, mode, key)
    plain_text  = cryptor.decrypt(text)
    plain_text = pkcs7_unpadding(plain_text)
    return plain_text

================更新于2014-11-24 13:00===================

      在测试python的AES加密时候发现网上的一个算法有缺陷,由于AES要求加密的字符串为16的倍数,所以不足需要不足长度,那么来看网上的算法

View Code PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def aes_encrypt(text, key, mode=AES.MODE_CBC):
    PADDING = '\0' #不足填充空
    cryptor = AES.new(key, mode, b'0000000000000000')
    #这里密钥key 长度必须为16(AES-128)
    length = 16
    count = len(text)
    if count < length:
        add = (length-count)
        #\0 backspace
        text = text + (PADDING * add)
    elif count > length:
        add = (length-(count % length))
        text = text + (PADDING * add)
    ciphertext = cryptor.encrypt(text)
    return ciphertext
 
def aes_decrypt(text, key, mode=AES.MODE_CBC):
    PADDING = '{'
    cryptor = AES.new(key, mode, b'0000000000000000')
    plain_text  = cryptor.decrypt(text)
    return plain_text.rstrip(PADDING)

      粗看没有问题,但内容先gzip后,再做aes解密,gzip后的\0会被去掉,结果导致ungzip失败,真是个悲剧。再来看这位博主用”{“来填充: Creating 128 bit AES Ciphertext and Key with Python PyCrypto,但是要是{也冲突如何是好呢,那么解决方法来了:Python Encrypting with PyCrypto AES。解决方法为在内容结尾填充文本长度,代码如下:

View Code PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def aes_encrypt(text, key, mode=AES.MODE_CBC):
    cryptor = AES.new(key, mode, b'0000000000000000')
    #这里密钥key 长度必须为16(AES-128)
    length = 16
    count = len(text)
    lengx = length - (count % length)
    text += chr(count)*lengx
    ciphertext = cryptor.encrypt(text)
    return ciphertext
 
def aes_decrypt(text, key, mode=AES.MODE_CBC):
    cryptor = AES.new(key, mode, b'0000000000000000')
    plain_text  = cryptor.decrypt(text)
    return plain_text[:-ord(plain_text[-1])]

      当然代码还是有问题,chr只能支持0-255,那么解决方法可以根据需要定义结尾为比如最后4个字节为文本长度,那么代码如下:

View Code PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def aes_encrypt(text, key, mode=AES.MODE_CBC):
    cryptor = AES.new(key, mode, b'0000000000000000')
    #这里密钥key 长度必须为16(AES-128)
    length = 16
    count = len(text)
    lengx = length - (count % length)
    countbin = struct.pack('>L', count) #四个字节的int
    intlen = len(countbin)
 
    padding = ''
    if lengx<intlen:
        padding = countbin*(length/intlen+1)
        lengx += length
    else:
        padding = countbin*((lengx-1)/intlen+1)
    text += padding[-lengx:]
    ciphertext = cryptor.encrypt(text)
    return ciphertext
 
def aes_decrypt(text, key, mode=AES.MODE_CBC):
    cryptor = AES.new(key, mode, b'0000000000000000')
    plain_text  = cryptor.decrypt(text)
    dlen = struct.unpack('>L', plain_text[-4:])[0]
    return plain_text[:dlen]

测试方法如下:

View Code PYTHON
1
2
3
4
5
6
def test_aes():
    seckey = 'asdf'*4
    text = 'testasdsdfdsdfsd1'*200
    atxt = aes_encrypt(text, seckey)
    text = aes_decrypt(atxt, seckey)
    print text

       python压缩和解压缩的方法,解压缩很容易找到,压缩的方法可以参考这里:http://stackoverflow.com/questions/8506897/how-do-i-gzip-compress-a-string-in-python

View Code PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def gzip_data(data):
    '''压缩数据的方法'''
    buf = StringIO.StringIO()
    f = gzip.GzipFile(fileobj=buf, mode="w")
    f.write(data)
    f.close()
    return buf.getvalue()
 
def ungzip_data(data):
    '''解压缩数据'''
    buf = StringIO.StringIO(data)
    f = gzip.GzipFile(fileobj=buf)
    return f.read()
 
def test_gzip():
    '''测试'''
    istr = 'asdfasd'
    gdata  = gzip_data(istr)
    print ungzip_data(gdata)

      第一次测试的时候出现错误:
File "D:\Python26\lib\gzip.py", line 212, in read
self._read(readsize)
File "D:\Python26\lib\gzip.py", line 267, in _read
self._read_eof()
File "D:\Python26\lib\gzip.py", line 304, in _read_eof
hex(self.crc)))
IOError: CRC check failed 0x28d60008 != 0x0L

是因为在gzip_data中write后没有close掉,看官方文档如下:Calling a GzipFile object’s close() method does not close fileobj, since you might wish to append more material after the compressed data. This also allows you to pass a StringIO object opened for writing as fileobj, and retrieve the resulting memory buffer using the StringIO object’s getvalue() method.

07 / 11 / 2014 buling

      港行iphone6预定有很多规则限制:1、每个apple id限抢一次;2、每个手机号码限抢一次;每个身份证限抢一次。第一次预定成功,结果通行证过期,只能放弃,之后又买了一张卡,连续早起N次都没有结果,昨天又买了一张卡,今天早上再次失败,痛定思痛,从脚本开始,跟黄牛比手工不靠谱。目前港行价格16G基本还是5000RMB左右,所以脚本来了

View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var storeNum = 'R428',            //ifc店
    modelNum = 'MG4H2ZP/A',  //银色64G
    govType  = 'entryExitPass',  //通行证
    govID    = 'C050XXXXX';      //证ID
 
//这里用于去除可用性检测
if(!window._fetchPostData){
    _fetchPostData = fetchPostData
    fetchPostData = function(eventId, params, callback){
       if(eventId=='availability'){
           return false;
       }
       _fetchPostData(eventId, params, callback);
    }
}
//选择店面
$('#productSelection [name=selectedStoreNumber]').val(storeNum ).change();
//选择iphone6
$('#product .box').eq(0).click();
$('#locked .box').eq(0).click();
//选择颜色,第一个银色
$('#color input.iPhone6').eq(0).parent().click();
//选择64G
$('#model').removeClass('disabled');
$('#model .loading-spinner').addClass('hidden');
$('#model .group').attr('style', '').find('input[value="'+modelNum+'"]').parent().click().parent().show();
//填写联系资料
$('#quantity [name="selectedQuantity"]').val(2);
$('#contact [name="selectedGovtIdType"]').val(govType);
$('#contact [name="govtId"]').val(govID);
//选择时间
$('.button-container a, #time').removeClass('disabled');
$('#time select option').eq(2).prop('selected', true);
//提交
$('#productSelection')[0].submit();

      如果预定成功,我再来更新成自动化脚本,如果没成功就算了,来,嘿、嘿、嘿,加油!

31 / 10 / 2014 buling
歌单
  • 《远山》-末小皮  下载
  • 《我的心里只有你没有他》-谢颖  下载
  • 《Everything》-monta  下载
前端文章
  • 《Isobar前端代码规范 及 最佳实践》  阅读
11 / 10 / 2014 buling

      好久没有记流水账了,又想写一下,过很久回头看曾经的点滴真是一件很有趣的事情,曾经的青涩/幼稚。之前有人翻以前写的流水账,还截图,唉…。

黎平支教活动图片分享:http://www.mjix.com/trip/20140910-zhijiao/

      前不久公司的支教活动,doug拉了4个人组队一起去,后来doug竟然放鸽子,然后我们只能再拉了另外一哥们一起。目的地贵州·黎平,我们是9月10号出发,去广州,直飞黎平;14号一早从侗关到黎平飞回广州,高铁到深圳。10号晚上到的时候有些晚了,校长和老师们已经开始吃饭了,刚好那天是教师节,也没有显得特别怎样,应该是习惯性了,因为每周都有一个团队去支教。接下来几天都是在学校和小孩子一起上课,吃饭;小朋友们很热情,也很调皮,不过xuzi真是牛,从1-5年级的英语,竟然完全hold住了。我教五年级的数学,理想中是用道理来告诉他们数学的意义,而且我很痛恨现在老师的教书方法,不知道曾经我是怎么过来的。一方面希望孩子们能有自己的想法兴趣去成长,另一方面又希望他们能在可控的范围内活动。就更放风筝一样,又想让它飞高,又怕它飞走,这个度真是一个很难拉涅的坎。

      出了和孩子们相处,我更喜欢的是那里的风土人情,由于是寨子,大家居住的很集中,关系也比较亲切。到了晚上,学校里很多妇女和小孩在跳舞,类似广场舞,我挺喜欢,做到肢体协调也是一周挑战,去做一些自己做不到的事情。人们都居住在小河两边,中间有桥-育红桥。晚上很多人在桥上乘凉,这里真的很舒服。 刚去第二天吧,我问song,你想留在这里还是想回去,他说一半一半。当时我挺想回去,房间只有一个风扇,床上垫的是棉被,盖的也是,真热。后来有一次去书记家吃饭,火锅,由于那天下午我在河里和小孩学甩水,结果摔在河里了回去换衣服。鱼火锅,鱼是稻谷田里饲养的(他们那边有这样的习俗),鱼肉带着血直接下锅,真的是我从小到现在吃过的最好吃的鱼,鱼不去鳞甲,很嫩很香。我们住家的水平里是井水,有天我跟着他们去了水井那里,井水放着一个木制罐用于舀水。大家都是直接把水瓶直接放入水井里灌满提着就走,对于我们来说会觉得水瓶外面有不干净的,这样会不会….,至少我觉得很好,随行的生活。

      我们住家的重阳酒也是一种美味,接下来几天小孩会带我们去隔壁寨子玩,相处几天下来,13号晚上,我们又去学校跳舞回来,一种不舍。想起有个小女孩(好像叫静雯),我之前说让我给你拍张照,她说不行,等走的那天早上拍个照给你们留念。才1年纪啊,唉,当时一种强烈的感触。走的那天早上,何倩小朋友还送了我一个礼物,很可爱,我答应她之后会写信寄礼物给她们,现在还没有想好怎么表达,送什么。

      13号晚上,我在育红桥坐着发了这几天唯一一条朋友圈“第一次有这样的旅行,不舍。独坐育红桥不想离开”。

这个就是学甩水的那种照片,我出丑的不在这里

下面这就是那口水井

寨子的样子

静雯和另一个小朋友不认识

何倩小朋友,送了一个小礼物,回来打开一开,一个气球/晕

我最喜欢的一张照片

琢磨不了的远眺

国庆最后一天,看着中国好声音总决赛,这样的感觉很好,安静、平淡。汪峰在演唱前提到了初心,想了想这些年,都有点不清楚什么是初心了,还好zhihu又给了定义:什么是「初心」? 就如同当初学数学为了兴趣(很扯是吗);又如同当初学编程为了创造不平凡一样,可是如今却卖着代码生活。

昨天一个大学朋友过来,一起吃饭,后来他说想想活着一辈子其实就只有自己一个人。我挺赞同的,看圆心不同,生活就不同。以自己奋斗做一番事业为圆心,你就只有一个人和一群人起早贪黑;以家为圆心,父母/妻儿就是你生命的全部;以亲戚朋友为圆心,会有一些关爱和理解陪伴你前行;当然也有一些心大到为祖国而奋斗的,就不说了。一辈子很短,不要留下遗憾就好。后来一起去泡脚,技师说她每个月就1000工资都不到,她一月只上几次班,有一个店铺,生活也乐得逍遥。一种生活态度,也值得思考。

一个人的生活过的很难,懒散,无聊,过去的时间一点都回忆不起来。跑步上班的想法越来越频繁,每天早起上班/夜幕下班的日子很不像生活,是应该给生活找定不同。以前给自己定义,每年用一个月跑步上班,但今年也不知道多少次了,没有一次跑满一月。我不习惯花费时间去追一个人,只是想在一起好好珍惜就行。可是这样就很容易认真,古语有云,你认真就输了。

这个十一哪里都没有去,和朋友吃了四次饭,三次喝酒,一次喝的快忘了爹妈是谁了。pad打字很麻烦,至此。

真实的做自己,尽心尽事,结果的事情就留给命运吧,我挑不过你。

================edit 10:45==================

很难得静静的听了这样一场演唱会,从没感觉如此平静,音乐能带给人心里最深的那点感触。

      中午看了一下分享的wx消息架构设计文章,深有感触,但由于内容比较XX,不能分享,这里写一些简单总结
1、为了规避消息的ack,server只通知client 有消息了,client自己拉取消息。
2、client拉取消息带上当前最大自己最大id,防止消息丢失。这个设计的很好
3、client运行时通知策略和类apns通知策略的不同方式
4、优化的通知带内容体的方式,需要ack

      真是两篇好文,可是…,我只能默默的享受了。接下来遇到个问题,如果用户有10w,每个server只有2w的连接,那这10w是怎么安排哪些用户连接哪个server呢。中午问了richard,说根据dns,那分析如下

      dns不是一个好方法,通过dns获取域名的ip列表,轮询ip地址连接。这个有个问题,如果某一个ip机器挂掉了,需要剔除某ip需要修改dns,而dns生效很慢。且这种方式不能对server做权重控制。

      一开始自己意淫的方式,向某server发起连接获取一个相对性能较好的ip及端口,再向该ip发起连接请求,但这种方式需要两次连接,后来问了一个运维朋友,发了一篇文章: LVS负载均衡原理和算法详解 可以利用DR/TUN方式来实现,但具体在client上还不清楚有什么样的解决方案。