Intelligence without ambition is a bird without wings.

2015-01-06
位域与大小端

小端

先定义的位域占用字节低位

1
2
3
4
struct {
uint8_t a:4;
uint8_t b:4;
} Bit;

内存中:

1
2
xxxx xxxx
b a

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdint.h>

struct {
uint8_t a:4; /**< 低4位 */
uint8_t b:4; /**< 高4位 */
} Bit;

int main()
{

Bit.a = 0x0;
Bit.b = 0xf;

printf("Bit:%#x\n", Bit);
printf("address:%x\n", (char*)&Bit);

return 0;
}

输出:

1
2
Bit:0xf0
address:4063f0

阅读此文

2015-01-05
本地透明代理的实现

转载自http://blog.csdn.net/someonea/article/details/5864946

Windows下实现本地透明代理可以通过一个过滤驱动和代理进程实现。
过滤驱动Attach到“//Device//Tcp”和”//Device//Udp”,然后在Dispatch函数中修改
连接的目的地址并保存原始目的地址和源地址。
上层的代理进程在accept到连接时,向过滤驱动查询连接的原始目的地址,
然后向原始目的地址发起连接。

Linux下面使用netfilter(iptables)可以很容易的实现一个TCP透明代理,
使用iptables的REDIRECT选项无需编写内核模块就可以把连接重定向到本地代理进程。
然后代理进程accept到连接时通过SO_ORIGINAL_DST这个socket选项就可以得到原始目的地址,
非常方便。
不过这只是对TCP而言的,对应UDP而言,还是需要编写一个内核模块,自己做一些处理。
对于UDP,可以用nf_register_hook注册一个Hook,然后保存socket目的地址。
另外注册一个字符设备,在字符设备的IOCTL处理函数中把socket的原始目的地址发送给代理进程。
这一点与Windows的过滤驱动很相似,过滤驱动一般也是注册一个控制设备,
用户态程序通过控制设备与过滤驱动通信。

Mac OS X中也有类似的机制(使用ipfw的fwd、divert选项),不过用的人较少。

Mac OS X中可以注册Socket Filters手工过滤特定的连接。

阅读此文

2015-01-04
任播

多台设备具有统一IP地址,但在任何给定时间,只有其中之一可以接收到传送端来的资讯。

用途

任播通常用于提供高可靠性和负载平衡

实现方式

实例

参考

  1. https://zh.wikipedia.org/wiki/%E4%BB%BB%E6%92%AD
阅读此文

2015-01-04
dns中递归查询与迭代查询的区别

  • 递归查询:

一般客户机和服务器之间属递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机;

  • 迭代查询(反复查询):

一般DNS服务器之间属迭代查询,如:若DNS2不能响应DNS1的请求,则它会将DNS3的IP给DNS2,以便其再向DNS3发出请求;

参考

  1. http://zhidao.baidu.com/link?url=zZcn6vwAvt3f_391aq8kqR-rohsN-WYq5mDst_bUkzxYpEJZyuH-3ggW5BibrDPcrNpbWMqH8nMrACtahNhmZq
阅读此文

2015-01-04
修改文件默认打开方式

系统命令方式(优先级低于用户设置,即存储于注册表中的)

  1. assoc改变指定拓展名对应的文件类型

    assoc .apk=AndroidPackage
    <=>
    reg add HKEY_CLASSES_ROOT\.apk /d "AndroidPackage" /f
    
  2. ftype来指定文件执行命令,%1代表该文件,%*代表参数

    ftype txtfile="e:\OS\Android\Exeperience\apk-install.bat" %1 %*
    <=>
    reg add HKEY_CLASSES_ROOT\AndroidPackage\Shell\Open\Command /d "\"e:\OS\Android\Exeperience\apk-install.bat\" %%1 %%*" /f
    

修改用户设置

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.txt\UserChoice]
"Rrogid"="\"C:\\Program Files (x86)\\Vim\\vim73\\gvim.exe\" \"%1\" \"%*\""
阅读此文

2014-12-31
GetTickCount

精度

这个函数并非实时发送,而是由系统每18ms发送一次,因此其最小精度为18ms。当需要有小于18ms的精度计算时,应使用StopWatch方法进行。

  • 连续触发200次,实测下来,最小间隔在15ms。
阅读此文

2014-12-26
tuple

形式定义

元组是个数有限的对象的序列。元组由三部分组成:边界符、分隔符和元素。通常采用的边界符是小括号”( )”,分隔符是逗号”,”。

特性:

  • 个数有限

  • 有序

  • 用来表示一组相关联数据

背景

  • 在数学中,元组被用来描述对象的属性,例如,有向图被定义成一个二元组(V, E),这里V是节点的集合,E是V × V的子集,表示边。

  • 在计算机科学中,元组被用来描述一组相关联的数据,常通过位置关系来隐式说明值得意义。

python中的tuple

python中的tuple元素类型不要求一致,即意味着可以各种嵌套使用。如([1, 2], {'a': 1}, (1, 2))

与list对比

存储对象

  • tuple存储的元素是异构的(heterogeneous),有点类似C中的结构体,是用来表达对象的组成

  • list,存储的元素是同构的(homogeneous ),是一种序列的存储方式(链式存储),是用来做数据的容器

可变性

  • tuple是不可变的

  • list是可变的

提供的操作

  • tuple无增删改

  • list提供增删改

优势

逻辑清晰,代码安全,健壮性更好!

何时使用

根据数据本质特征

参考

  1. http://en.wikipedia.org/wiki/Tuple
  2. http://zh.wikipedia.org/wiki/%E5%A4%9A%E5%85%83%E7%BB%84
  3. http://en.wikipedia.org/wiki/List_(abstract_data_type)
  4. http://stackoverflow.com/questions/626759/whats-the-difference-between-list-and-tuples
  5. http://stackoverflow.com/questions/1708510/python-list-vs-tuple-when-to-use-each
  6. Understanding tuples vs. lists in Python
  7. https://docs.python.org/dev/library/collections.html#collections.namedtuple
阅读此文

2014-12-26
python命令行选项

  • -B

    不生成__pycache__文件夹

阅读此文

2014-12-26
python-安装setuptools

官网链接

步骤

  • 下载ez_setup.py

  • 使用目标python运行ez_setup.py

    python ez_setup.py
    
  • 添加C:\Python27\Scripts到环境变量PATH

  • 安装pip

    easy_install pip

注:

  1. win下安装可能出现错误:UnicodeDecodeError 'ascii' codec can't decode byte请参考这里解决
阅读此文

2014-12-26
python-使用py2exe打包

打包成单个文件

setup.py:

1
2
3
4
5
6
7
from distutils.core import setup
import py2exe
import sys

sys.argv.append('py2exe')

setup(options = {'py2exe': {'bundle_files': 1, 'compressed': True}}, console=['image.py'])
python setup.py

常见问题

没有带上自己的包

1
2
3
4
5
6
import sys
sys.path.append(PACKAGE_DIR)

options = {'py2exe': {
'packages': ['PACKAGE_NAME']
}}
阅读此文