Intelligence without ambition is a bird without wings.

2015-11-03
mysql-多列排序

1
select * from test order by A DESC, B AESC
阅读此文

2015-11-02
go-string

要点

  • a string is in effect a read-only slice of bytes

  • string可以存储任意的bytes

  • 字符串字面值是utf-8编码的,所以赋给string时,string存储的也是utf-8编码序列

  • 使用range得到的是字符(rune)序列

    1
    2
    3
    for _, b := range str {
    fmt.Printf("%T,%v\n", b, b)
    }
  • 使用for迭代,来访问utf-8字节(byte)

    1
    2
    3
    for i := 0; i < len(str); i++ {
    fmt.Printf("%v:%T, %v\n", i, str[i], str[i])
    }
  • rune的意思的code point(unicode码元), 底层类型为int32

参考

  1. https://blog.golang.org/strings
  2. http://golanghome.com/post/207
阅读此文

2015-11-02
大小端

背景

字节序是一个处理器架构特性。

对于多字节数据,存在一个数据的字节安排问题(大小端)。

大小端取决与CPU架构,X86:小端,KEIL-C51:大端

记忆方式

  • 大端 <=> 字符串顺序

实例分析

例:0x11223344(4B)在内存中存放时

大端:

数据的高位字节放在内存低地址,也就是说数据由高位字节向低位字节在内存中存放,
类似于字符串的存放,按照从左向右的顺序存放.

内存:0  1  2  3
      11 22 33 44

优点

  1. 直接在内存中观察方便

缺点

  1. 不符合逻辑

  2. 不利于编码,解码

小端:

数据的高位字节放在内存高地址,也就是数据从低位字节向高位字节在内存中存放

内存:0  1  2  3
      44 33 22 11

优点

  1. 这种存放方式比较符合逻辑
  2. 利于读入时的解码(转换成对应数据类型的值),如int i = 0x11223344,按ANSI
    存放在文件中,再次读入时,需要根据ASCII码把对应的值转换成int型,容易处理,因为先
    读入的是低位字节

缺点

  1. 直接在内存中观察时,不方便

  1. 以上数字都是十六进制形式;
  2. 假设变量地址为0
阅读此文

2015-11-02
编码-utf-8

规律

  • 对于UTF-8编码中的任意字节B,如果B的第一位为0,则B为ASCII码,并且B独立的表示一个字符;

  • 如果B的第一位为1,第二位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的一个字节,并且不是字符的第一个字节编码;

  • 如果B的前两位为1,第三位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由两个字节表示;

  • 如果B的前三位为1,第四位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由三个字节表示;

  • 如果B的前四位为1,第五位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由四个字节表示;

参考

  1. https://zh.wikipedia.org/wiki/UTF-8
阅读此文

2015-11-02
mysql-系统变量

用户变量

用户变量是会话期的(作用域,生命期)

1
2
3
4
5
6
7
mysql> SET @t1=1, @t2=2, @t3:=4;
mysql> SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3;
+------+------+------+--------------------+
| @t1 | @t2 | @t3 | @t4 := @t1+@t2+@t3 |
+------+------+------+--------------------+
| 1 | 2 | 4 | 7 |
+------+------+------+--------------------+

系统变量

  • 查询系统变量

    select @@character_set_server;
    
  • 通过show

    show variables like 'max_allowed_packet';
    

参考

  1. http://dev.mysql.com/doc/refman/5.7/en/user-variables.html
  2. http://dev.mysql.com/doc/refman/5.7/en/set-variable.html
  3. http://dev.mysql.com/doc/refman/5.7/en/show-variables.html
  4. http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
阅读此文

2015-11-02
go-dsn

阅读此文

2015-11-02
mysql-中文编码

说明

  • 存储使用UTF-8(中文占用3B,英文占用1B)

要点

  • char(n)vchar(n)n指的是字符容量,具体占用字节空间取决于编码集

  • 字符

    • 一个汉字即一个字符

    • 一个英文字母即一个字符

  • char_length 获取字符串的字符数目

  • length 获取字节数(所占空间大小)

实验

环境

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
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
mysql> select char_length('a');
+------------------+
| char_length('a') |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)

mysql> select length('a');
+-------------+
| length('a') |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)

mysql> select char_length('汉');
+--------------------+
| char_length('汉') |
+--------------------+
| 1 |
+--------------------+
1 row in set (0.00 sec)

mysql> select length('汉');
+---------------+
| length('汉') |
+---------------+
| 3 |
+---------------+
1 row in set (0.00 sec)

参考

  1. https://dev.mysql.com/doc/refman/5.0/en/string-functions.html
阅读此文

2015-11-02
mysql-忽略客户端编码设定

1
skip-character-set-client-handshake
阅读此文

2015-10-30
ubuntu-使用pptpd搭建vpn

步骤

  1. 安装pptpd

    apt-get install pptpd
    
  2. vi /etc/pptpd.conf

    option /etc/ppp/pptpd-option                    #指定PPP选项文件的位置
    debug                                           #启用调试模式
    localip 192.168.0.1                             #VPN服务器的虚拟ip
    remoteip 192.168.0.200-238,192.168.0.245        #分配给VPN客户端的虚拟ip
    
  3. vi /etc/ppp/pptpd-options

    name pptpd                      #pptpd服务的名称
    refuse-pap                      #拒绝pap身份认证模式
    refuse-chap                     #拒绝chap身份认证模式
    refuse-mschap                   #拒绝mschap身份认证模式
    require-mschap-v2               #允许mschap-v2身份认证模式
    require-mppe-128                #允许mppe 128位加密身份认证模式
    ms-dns 8.8.8.8                  #使用Google DNS
    ms-dns 8.8.4.4                  #使用Google DNS
    proxyarp                        #arp代理
    debug                           #调试模式
    dump                            #服务启动时打印出所有配置信息
    lock                            #锁定TTY设备
    nobsdcomp                       #禁用BSD压缩模式
    
  4. 添加用户vi /etc/ppp/chap-secrets

    #格式:用户名   服务类型   密码   分配的ip地址
    test    *    1234    *
    
  5. 重启PPTPD服务

    service pptpd restart
    
  6. 配置网络和路由规则,设置ipv4转发

    sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
    sysctl -p
    
    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
    
  7. 设置MTU来确保过大的包不会被丢弃(可选)

    iptables -I FORWARD -s 192.168.0.0/24 -p tcp --syn -i ppp+ -j TCPMSS --set-mss 1300
    
  8. 备份iptables

    iptables-save > /etc/iptables.rule
    
  9. 开机自动加载

    vi /etc/network/interfaces
    
    pre-up iptables-restore < /etc/iptables.rule
    

参考

  1. http://blog.fens.me/ubuntu-vpn-pptp/
  2. http://blueve.me/archives/1087
  3. http://www.777s.me/centos-pptp.html
阅读此文

2015-10-29
nginx-add-header

1
add_header Cache-Control "no-cache";
阅读此文