Shadowsocks源码阅读笔记【1】——语言相关

1.Python版本信息:

>>> import sys
>>> sys.version_info
sys.version_info(major=2, minor=7, micro=6, releaselevel='final', serial=0)

2.getopt.getopt(args, options[, long_options])进行命令行参数解析。

3.json.load(f, object_hook=_decode_dict)自定义JSON解码。

4.string.maketrans(from, to)构建字符映射转换表(长度为256):

>>> import string
>>> from_chars = 'abcdefg'
>>> to_chars = '1234567'
>>> table = string.maketrans(from_chars, to_chars)

Python中JSON在解析的同时进行自定义编码处理

在对文件内容或字符串进行JSON反序列化(deserialize)时,由于原始内容编码问题,可能需要对反序列化后的内容进行编码处理(如将unicode对象转换为str)。

在Python中,一种方式是先使用json.loadjson.loads反序列化得到dict对象,然后对这个dict对象进行编码处理。

但其实在json.loadjson.loads中,有可选参数object_hook。通过使用此参数,可以对反序列化得到的dict直接进行处理,并使用处理后新的dict替代原dict返回。

使用方法为:

d = json.loads(json_str, object_hook=_decode_dict)

附Shadowsocks中使用的_decode_dict_decode_list

def _decode_list(data):
    rv = []
    for item in data:
        if isinstance(item, unicode):
            item 

C语言及Python命令行参数解析 – getopt

在编写各种命令行程序甚至是GUI程序时,经常需要对命令行参数进行解析处理,以控制程序的执行。当只需要按顺序处理各参数时,可以通过简单地遍历各参数实现。如果要处理稍复杂的命令行参数,则可以使用短选项参数(-a-a arg)与长选项参数(--name--name=arg)。注:短选项-abc-a -b -c等同。

在C语言中,对于短选项参数可以使用getop函数。下面代码摘自http://en.wikipedia.org/wiki/Getopt

#include <stdio.h>     /* for printf */
#include <stdlib.h>    /* for exit */
#include <unistd.h>    /* for getopt */

int 

Python中的字符串编码(Encode)与解码(Decode)

强烈推荐文章 Pragmatic Unicode:http://nedbatchelder.com/text/unipain.html


Unicode:一套字符编码方案,为各字符定义一个对应的码位(Code Point)。可简单理解为,一个包含了各种字符及与各字符相关联整数值的映射表(实际上还包含其它信息),表中的每一个条目为 <字符, 整数值> 对。注意,Unicode本身并不规定字符应当如何以二进制形式进行存储。

UTF-8:Unicode编码方案的具体实现之一(还有 UTF-16、UTF-32 等,UTF 为 Unicode Transformation Format 的编写),描述了如何将各字符以二进制进行存储。UTF-8为非定长编码实现,对于不同的字符,其用于二进制存储的字节个数为 1-6 个。如果将Unicode中字符对应码位的整数值形式与UTF-8编码中字符的整数值形式比较,它们并不一定相同。UTF-8 编码内部不含 0 字节,可以被 strlen() 等 C 函数正确处理。

编码:将一个Unicode字符串转换为一个字节序列(a sequence of bytes,a string of bytes)。码位 <128 时与 ASCII 编码相同,码位 <255 时与 Latin-1 …

WordPress后台及Twenty Twelve主题修改Google Fonts加载地址提升访问速度

由于Google众多服务在国内访问存在的问题,WordPress后台及使用了Google Fonts的前台主题,都会在使用时严重拖慢网站整体的加载速度,因此有必要移除Google Fonts,或替换其加载地址。如果需要移除Google Fonts,可搜索相关WordPress插件。

WordPress后台替换:
打开 wp-includes/script-loader.php,搜索 fonts.googleapis.com,找到后将其替换为360网站卫士代理库地址 fonts.useso.com。

Twenty Twelve主题替换:
打开 twentytwelve/functions.php,在 twentytwelve_get_font_url 函数接近末尾处,找到 fonts.googleapis.com 将其替换为 fonts.useso.com。

注:不能简单地下载 fonts.googleapis.com/css 链接到的CSS文件部署到自己的服务器上,因为CSS中引用了Google服务器上的其它字体文件。…

深入理解 C/C++(Olve Maudal & Jon Jagger)笔记

  1. main无显式返回时,程序返回值为最后的函数调用的返回值。
  2. 对于函数定义void func(),C语言表示func接受任意数目、任意类型的参数;C++语言表示不接受参数,相当于void func(void)。若C语言希望函数不接受参数,需要显示声明为void func(void)
  3. 对于全局&局部static变量,在C语言中初始化为0;在C++中初始化为它的默认值(内置类型为0)。对于auto变量,不进行初始化(对函数内的auto变量进行初始化影响性能?),但deubg(非优化)时可能会被初始化为0;当连续多次对包含auto变量的函数进行调用时,变量可能每次分配到相同内存(Execution Stack or Activation Frames)。
  4. 函数外部非static变量自动初始化为0,且全局可见(链接器允许其它对象文件访问该变量);函数外部static变量自动初始化0,仅本编译单元可见。
  5. C/C++在一个序列点(Sequence Point)对一个变量只能更新一次,a =

LeetCode:Search in Rotated Sorted Array II

接前一题(Search in Rotated Sorted Array),但数组中的元素允许重复。
LeetCode OJ地址:http://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/
关键点:旋转前数组有序,可能有重复元素。


我的解法:
前一题能利用折半查找思想的关键是旋转后数组分为两个有序子区间,可以通过A[first]A[mid]A[last-1]target的大小测试来快速缩小查找范围。由于本题中数组可能有重复元素,如对于数组[1,3,1,1,1]A[first]=A[mid]=A[last-1]=1,此时将无法确定是应该将查找区间搜小到A[first,mid)还是A[mid+1,last)。
因此,算法加入高亮代码行17和18的判断,当这三个元素相等时,只++first
注:search返回值由位置索引int修改为是否存在标识bool
// 时间复杂度O(n),空间复杂度O(1)
class Solution {

LeetCode:Search in Rotated Sorted Array

Search in Rotated Sorted Array:http://oj.leetcode.com/problems/search-in-rotated-sorted-array/
关键点:旋转前数组有序,无重复元素。


参考解法:
由于旋转前数组有序,故旋转后,数组被分为两个有序的子区间(无旋转时为一个有序区间)。
算法同样采用折半查找的思想进行搜索,但上下界firstlast的更新相比常规的折半查找略微复杂。
在下面的高亮行11进行判断时,若if判断成立,由旋转前数组有序的条件可知firstmid之间的元素都有序(在一个有序子区间中),故在高亮行12时若if仍成立,则target[first,mid)之间,否则在[mid+1,last)之间。
同上述分析,在高亮行18时若if成立,则target[mid+1,last)之间。
// 时间复杂度O(log n),空间复杂度O(1)
class 

Sublime Text:”output not utf-8″错误

在Sublime Text 3下编译Python时发生"output not utf-8"错误,使用下述方法后解决。
但该方法应该可以推广到用于解决Sublime Text 2及编译其它语言时发生的此错误。

  1. Windows系统在cmd下输入 chcp 获取当前活动代码页(中文系统默认为936)。Python标准encoding:http://docs.python.org/2/library/codecs.html#standard-encodings
  2. Sublime Text菜单选择Tools -> Build System ->New Build System...。
  3. 在新的Build System文件中输入以下内容后保存到Packages文件夹下(Packages/User)。
{
   "cmd": ["python", "-u", "$file"],
   "file_regex": "^[ ]*File "(...*?)", line ([0-9]*)",
   "selector": "source.python",
   "path": "C:\Python27",
   "encoding": 

LeetCode:Remove Duplicates from Sorted Array II

接前一题(Remove Duplicates from Sorted Array),但元素最多允许出现的次数由1变为2。
LeetCode OJ地址:http://oj.leetcode.com/problems/remove-duplicates-from-sorted-array-ii/
关键点:数组已排序,不分配另一个数组,返回去重后数组长度,每个元素最多出现两次。


我的解法1:
1.遍历数组,将其中重复次数在两次以上的所有元素进行标记(mark,此处使用A[0]-1作为mark,对于A[0]本身为最小int时可能存在问题?)。
2.从第一个重复次数在两次以上且该数第三次出现的位置开始遍历,当元素不是被标记的元素时,将该元素往前移动。
算法需要执行两次循环及一次STL的find操作,虽然时间复杂度在O(n),但实际效果并不好,且代码冗长。
对于一个测试用例,算法在执行过程中的数组状态如下代码中的高亮行所示。
// 时间复杂度O(n),空间复杂度O(1)
class Solution {
public:
    int removeDuplicates(int A[], int n) {
        if (0