分类目录归档:编程语言

编译static的Python及自带的相关module

非 static 编译

不指定额外参数直接编译 Python:

$ ./configure
$ make

查看所依赖的共享库:

$ ldd python
    linux-vdso.so.1 =>  (0x00007fffcd95a000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fab5c350000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fab5c140000)
    libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fab5bf20000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fab5bc10000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fab5b840000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fab5c600000)

static 编译

MinGW 编译 static Qt

  1.  MinGW 编译 static icu4c (QtWebkit 依赖)
    1. 下载 icu4c (http://site.icu-project.org/, http://sourceforge.net/projects/icu/, icu4c-XXX-src.zip)
    2. 下载安装 MYSYS2 (https://wiki.qt.io/MSYS2)
    3. 在 MYSYS2 shell 中 cd 到 icu4c source 目录并进行配置与编译
      ./runConfigureICU MinGW --prefix=/d/icu541-mingw492 --enable-static --disable-shared
      mingw32-make
      mingw32-make install
      
    4. 添加 include 目录及其内的 .h

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 …

深入理解 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 =

Python遍历清理VC项目中的Debug Release ipch 及 sdf

VC编译后生成的Debug、Release、ipch目录及sdf文件占用大量空间,不方便代码保存,写了个Python程序自动遍历清理。

import os
import shutil
  
def remove_vc_extra(root_dir):
    list_dirs = os.walk(root_dir, topdown=False)
    for dirpath, dirnames, filenames in list_dirs:
        for dirname in dirnames:
            if dirname == 'Debug' or dirname == 'Release' or dirname == 'ipch':
                shutil.rmtree(os.path.join(dirpath, dirname), ignore_errors=True)
        for filename in filenames: