第一次开WP的博客,从此有了自己独立的家!

ubuntu编译安装PHP5.4.0+Nginx(FPM/FastCGI)(转)

2012年3月30日 没有评论

转自:http://cc.ecjtu.net/posts/php-5-4-Nginx-ubuntu-make-install

PHP5.4.0发布了,添加了很多新特性,于是今天在ubuntu下编译安装了PHP5.4+Nginx1.0.13+Memcache,让PHP

以fastcgi模式运行。MySQL就不装了用以前的5.1版本的。附张图:

php54.pngphp541.png

阅读全文…

Configure 参数选项详解

2012年3月9日 没有评论

对于需要编译安装的软件而言, 去了解其./configure参数是很有必要的, 不同的软件参数是不同的, 具体请查看 # ./configure –help
本文阐述一下通用的configure参数情况
Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。
与一些技巧相比,Configure显得基础一些,当然使用和学习起来就显得枯燥乏味一些,当然要成为高手,对基础的熟悉不能超越哦。

‘configure’脚本有大量的命令行选项.对不同的软件包来说,这些选项可能会有变化,但是许多基本的选项是不会改变的.带上’–help’选项执行’configure’脚本可以看到可用的所有选项.尽管许多选项是很少用到的,但是当你为了特殊的需求而configure一个包时,知道他们的存在是很有益处的.下面对每一个选项进行简略的介绍:

‘–cache-file=FILE’
‘configure’会在你的系统上测试存在的特性(或者bug!).为了加速随后进行的配置,测试的结果会存储在一个cache file里.当configure一个每个子树里都有’configure’脚本的复杂的源码树时,一个很好的cache file的存在会有很大帮助.

‘–help’
输出帮助信息.即使是有经验的用户也偶尔需要使用使用’–help’选项,因为一个复杂的项目会包含附加的选项.例如,GCC包里的’configure’脚本就包含了允许你控制是否生成和在GCC中使用GNU汇编器的选项.

‘–no-create’
‘configure’中的一个主要函数会制作输出文件.此选项阻止’configure’生成这个文件.你可以认为这是一种演习(dry run),尽管缓存(cache)仍然被改写了.

‘–quiet’
‘–silent’
当’configure’进行他的测试时,会输出简要的信息来告诉用户正在作什么.这样作是因为’configure’可能会比较慢,没有这种输出的话用户将会被扔在一旁疑惑正在发生什么.使用这两个选项中的任何一个都会把你扔到一旁.(译注:这两句话比较有意思,原文是这样的:If there was no such output, the user would be left wondering what is happening. By using this option, you too can be left wondering!) 阅读全文…

字符,字节和编码(转)

2011年12月1日 没有评论

引言

“字符与编码”是一个被经常讨论的话题。即使这样,时常出现的乱码仍然困扰着大家。虽然我们有很多的办法可以用来消除乱码,但我们并不一定理解这些办法的内在原理。而有的乱码产生的原因,实际上由于底层代码本身有问题所导致的。因此,不仅是初学者会对字符编码感到模糊,有的底层开发人员同样对字符编码缺乏准确的理解。

1. 编码问题的由来,相关概念的理解

1.1 字符与编码的发展

从计算机对多国语言的支持角度看,大致可以分为三个阶段:

 

 

系统内码

说明

系统

阶段一

ASCII

计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。

英文 DOS

阶段二

ANSI编码
(本地化)

为使计算机支持更多语言,通常使用 0×80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 ’中’ 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。

不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。

不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。

中文 DOS,中文 Windows 95/98,日文Windows 95/98

阶段三

UNICODE
(国际化)

为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。

Windows NT/2000/XP,Linux,Java

阅读全文…

分类: MFC, VC++相关 标签: ,

谈谈 Unicode 编码,简要解释 UCS、UTF、BMP、BOM 等名词(转)

2011年12月1日 1 条评论

这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级。整理这篇文章的动机是两个问题:

问题一:
使用Windows记事本的“另存为”,可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件,Windows是怎样识别编码方式的呢?

我很早前就发现Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节,分别是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。但这些标记是基于什么标准呢?

 

问题二:
最近在网上看到一个ConvertUTF.c,实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互转换。对于Unicode(UCS2)、GBK、UTF-8这些编码方式,我原来就了解。但这个程序让我有些糊涂,想不起来UTF-16和UCS2有什么关系。

查了查相关资料,总算将这些问题弄清楚了,顺带也了解了一些Unicode的细节。写成一篇文章,送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂,但要求读者知道什么是字节,什么是十六进制。

0、big endian和little endian

big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。还是将49写在前面,就是little endian。

“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。

我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。 阅读全文…

分类: MFC, VC++相关 标签: ,

Python 去除列表中重复的元素(转)

2011年11月17日 没有评论

Python 去除列表中重复的元素

比较容易记忆的是用内置的set

1
2
3
l1 = ['b','c','d','b','c','a','a']
 l2 = list(set(l1))
 print l2

还有一种据说速度更快的,没测试过两者的速度差别

1
2
3
l1 = ['b','c','d','b','c','a','a']
 l2 = {}.fromkeys(l1).keys()
 print l2

这两种都有个缺点,祛除重复元素后排序变了:
['a', 'c', 'b', 'd']

如果想要保持他们原来的排序:

用list类的sort方法

1
2
3
4
l1 = ['b','c','d','b','c','a','a']
 l2 = list(set(l1))
 l2.sort(key=l1.index)
 print l2

也可以这样写

1
2
3
l1 = ['b','c','d','b','c','a','a']
 l2 = sorted(set(l1),key=l1.index)
 print l2

也可以用遍历

1
2
3
4
5
6
l1 = ['b','c','d','b','c','a','a']
 l2 = []
 for i in l1:
 if not i in l2:
 l2.append(i)
 print l2

上面的代码也可以这样写

1
2
3
4
l1 = ['b','c','d','b','c','a','a']
 l2 = []
 [l2.append(i) for i in l1 if not i in l2]
 print l2

这样就可以保证排序不变了:
['b', 'c', 'd', 'a']

转自:http://www.cnblogs.com/infim/archive/2011/03/10/1979615.html

分类: Python, 一些见解 标签: , ,

标志寄存器和跳转指令

2011年11月17日 没有评论

标志寄存器

寄存器名  标志位  功能
OF	  11	  溢出标志
DF	  10	  方向标志(影响串操作指令)
IF	  9	  中断标志(CPU响应外中断开关)
TF	  8	  陷阱标志(CPU单步模式开关)
SF	  7	  符号标志
ZF	  6	  零标志
AF	  4	  辅助进位标志
PF	  2	  奇偶标志
CF	  0	  进位标志

跳转指令

指令	功能     范围	  操作码   标志寄存器
JO	溢出跳转   短	  70     OF = 1
JNO	不溢出跳转  短	  71     OF = 0
JB	低于跳转   短	  72     CF = 1
JNB	不低于跳转  短	  73     CF = 0
JE	相等跳转   短	  74     ZF = 1
JNE	不等跳转   短	  75     ZF = 0
JBE	不高于跳转  短	  76
JA	高于跳转   短	  77
JS	负号跳转   短	  78     SF = 1
JNS	非负跳转   短	  79     SF = 0
JP	奇偶跳转   短	  7A     PF = 1
JNP	非奇偶跳转  短	  7B     PF = 0
JL	小于跳转   短	  7C
JNL	不小于跳转  短	  7D
JNG	不大于跳转  短	  7E
JG	大于跳转   短	  7F
JCXZ	CX为零跳转  短	  E3
JECXZ	ECX为零跳转   短	  E3
JMP	无条件跳转  无	  FF

断点类型和原理

2011年11月15日 没有评论

当我们需要让被调试程序暂停的时候就需要用到断点。通过暂停进程,我们能观察变量,堆栈参数以及内存数据,并且记录他们。断点有非常多的好处,当你调试进程的时候这些功能会让你觉得很舒爽。断点主要分成三种:软件断点,硬件断点,内存断点。他们有非常相似的工作方式,但实现的手段却各不相同。

软件断点

          软件断点具体而言就是在CPU执行到特定位置的代码的时候使其暂停。软件断点将会使你在调试过程中用的最多的断点。软件断点的本质就是一个单字节的指令,用于暂停被执行程序,并将控制权转移给调试器的断点处理函数。
我们都知道CPU的软中断方式,就是int n,实际上软件断点使用的就是int 3软中断方式,所以软件断点实际上是把下断地址上的第一个指令的字节码改成cc(int 3的指令字节码),然后把原来的字节码记录下来,CPU执行到CC时int 3中断,原后再把原来的字节码写回去,让程序能继续正确运行。

硬件断点

         硬件断点非常有用,尤其是当想在一小块区域内设置断点,但是又不能修改它们的时候。这种类型的断点被设置在CPU级别,并用特定的寄存器:调试寄存器。一个CPU一般会有8个调试寄存器(DR0寄存器到DR7寄存器),它们被用于管理硬件断点。调试寄存器DR0到调试寄存器DR3存储硬件断点地址。这意味着你同一时间内最多只能有4个硬件断点。DR4和DR5保留。DR6是状态寄存器,说明了被断点触发的调试事件的类型。DR7本质上是一个硬件断点的开关寄存器,同时也存储了断点的不同类型。通过在DR7寄存器里设置不同标志,能够创建以下几种断点:

·当特定的地址上有指令执行的时候中断;
·当特定的地址上有数据可以写入的时候;
·当特定的地址上有数据读或者写但不执行的时候;
·这非常有用,当你要设置特定的断点(至多4个),又不能修改运行的进程的时候。

内存断点

内存断点其实不是真正的断点。当一个调试器设置了一个内存断点的时候,它其实是改变了内存中某个块或者页的权限。一个内存页是操作系统处理的最小的内存单位。一个内存页被申请成功以后,就拥有了一个权限集,它决定了内存该如何被访问。下面是一些内存页的访问权限的例子:

·可执行页 允许执行但不允许读或写,否则抛出访问异常
·可读页 只允许从页面中读取数据,其余的则抛出访问异常
·可写页 允许将数据写入页面

任何对保护页的访问都会引发异常,之后页面恢复访问前的状态,内存断点,实际上利用了操作系统的异常机制。

分类: 逆向调试 标签: , , ,

X86 函数调用约定

2011年11月3日 没有评论

cdecl(X86 C语言约定函数调用约定):

In C:
int python_rocks(reason_one, reason_two, reason_three);

In x86 Assembly:
push reason_three
push reason_two
push reason_one
call python_rocks
add esp, 12

stdcall(win32 api 函数调用约定,OLE DLL也是这个约定):

In C:
int my_socks(color_one color_two, color_three);

In x86 Assembly:
push color_three
push color_two
push color_one
call my_socks

两种调用约定的的区别在于stdcall堆线的是在call里平衡的
最后一点,这两种调用方式的返回值都存储在EAX中

分类: 最新文章 标签:

在 Django 中使用 MongoDB(转)

2011年11月3日 没有评论

转自:http://simple-is-better.com/news/386#dig

每一个Django工程师在接触NOSQL数据库的时候,肯定都会思考一个问题:在Django中不能像操作普通的关系型数据库(以下简称RDB)一样,操作NOSQL数据库吗?当然可以,Django工程师几乎不需要什么学习成本,就能使用NOSQL数据库——因为有mongoengine这个模块。

MongoEngine由Python语言写成,提供一个很类似Django ORM的API,本文介绍mongoengine的基本使用,主要是数据结构的定义和内联表单的使用。

Install & Begin

需要安装两个模块,pymongo和mongoengine

pip install -U mongoengine
pip install pymongo

现在我们以最快的方式利用Django对MongoDB进行操作,请在电脑旁放置一个秒表,理论上完成这些操作的时间不会超过3分钟:

新建一个应用,其中新建一个docs.py文件,代码如下:

from mongoengine import *
connect(‘test’)

class User(Document):
username = StringField(required=True)
website = URLField()
tags = ListField(StringField(max_length=16))

然后编辑views.py文件:

from django.http import HttpResponse
from . import docs

def index(request):
user1 = docs.User(
username=’Perchouli’,
website=’http://dmyz.org’,
tags = ['Web','Django','JS']
)
user1.save()
Oid = user1.id
return HttpResponse(Oid)

最后,把视图加到URL中,访问这个视图可以看到返回的ObjectID,我们已经实现了对NOSQL数据库的写入和查找了。是不是和Django ORM几乎一样呢? 阅读全文…

分类: Python 标签: , ,

Ruby正则表达式的正反向预搜索

2011年9月16日 没有评论

例:

str2 = “abcdefghi”

puts str2.scan(/ab(c)/)  输出c,/ab(c)/的意思是指匹配abc,但只取出()里面的字符串
puts str2.scan(/ab(?:c)/) 输出abc,/ab(?:c)/的意思是指匹配ab后,判断ab后面是否跟着c,如果是则取出abc,不是则为nil
puts str2.scan(/ab(?=c)/) 输出ab,/ab(?=c)/的意思是指匹配ab后,判断ab后面是否跟着c,如果是则取出ab,不是则为nil
puts str2.scan(/ab(?!d)/) 输出ab,/ab(?!d)/的意思是指匹配ab后,判断ab后面是否跟着d,如果是则为nil,如果不是,则输出ab

分类: Ruby, WEB相关 标签: