GNU、GPL、Linux

首先是GNU计划,由理查德*斯托尔曼发起。GNU组织发布了一系列的GNU工具集。
然后到91年的时候,Linus开发了Linux,当时不过是一个内核;由于Linux采用开放源代码,所以自然和GNU的开源精神不谋而合,两者就结合在一起了。其结果就是一个完整的GNU/Linux操作系统出现了。

GPL(General Public License,通用公共许可协议)是一种版权形式,是Richard Stallman在开放源代码软件发行的实践中,逐渐总结出的一套保护自由软件的条款,称之为GPL

Copyright 与 Copyleft : http://91win.blog.163.com/blog/static/390038662008624904962/

多线程与虚拟内存

前面文章提到siege是一个多线程程序,在32位的机器上,我准备使用500个并发做测试,结果发现报内存不够的错误。
于是,使用gdb跟了一下,在创建完线程后,报错的函数出停止,看看到底使用了多少内存,结果发现使用虚拟内存3G,实际占用物理内存2.3M,很明显,不是物理内存不足,而是32位机器的虚拟内存的大小所限导致的,更大的物理内存也没有意义,关键是要支持更大的虚拟内存,如果使用64位的机器,一个够他折腾了。

问题: 创建线程真的需要很大的虚拟内存的开销吗?创建线程的开销是怎么计算的?和主线程占用内存大小的关系是怎样的?
再用gdb跟一下,这次在pthread_create处设置断点,使用top观察内存变化情况,发现:
 1. 创建线程之前,程序使用虚拟内存5M,物理内存1M
 2. 创建1个线程后,程序使用虚拟内存增加10M,物理内存增加4K
 3. 继续观察创建更多线程的情况,发现,每创建一个线程,虚拟内存增加10M,物理内存增加4K

线程真的很消耗虚拟内存资源吗?都用来做什么了?

关于http server的几个压测工具

1. ab
Apache自带的一个工具,是一个单进程、单线程的程序,采用异步的http请求来实现并发;表现到server上的并发数可能就不是给ab设置的并发数了; 所以可以使用下面两个工具。

2. webbench
http://home.tiscali.cz/~cz210552/webbench.html
这是一个多进程实现并发的程序,结果都通过管道汇总到主进程。

  • 统计信息太简单,只知道访问次数,不知道响应时间的分布
        
  • 目前还不支持keep-alive

3. siege
http://www.joedog.org/index/siege-home
这是一个多线程实现并发的程序。

4. http_load
http://www.acme.com/software/http_load/

html Meta

   meta是用来在HTML文档中模拟HTTP协议的响应头报文。meta  标签用于网页的<head>与</head>中,meta 标签的用处很多。meta  的属性有两种:name和http-equiv。name属性主要用于描述网页,对应于content(网页内容),以便于搜索引擎机器人查找、分类(目 前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类)。这其中最重要的是description(站点在搜索引擎上的描述)和 keywords(分类关键词),所以应该给每页加一个meta值。比较常用的有以下几个:

  name 属性

  1、<meta name="Generator" contect="">用以说明生成工具(如Microsoft FrontPage 4.0)等;

  2、<meta name="KEYWords" contect="">向搜索引擎说明你的网页的关键词;

  3、<meta name="DEscription" contect="">告诉搜索引擎你的站点的主要内容;

  4、<meta name="Author" contect="你的姓名">告诉搜索引擎你的站点的制作的作者;

  5、<meta name="Robots" contect= "all|none|index|noindex|follow|nofollow">

  其中的属性说明如下:

  设定为all:文件将被检索,且页面上的链接可以被查询;

  设定为none:文件将不被检索,且页面上的链接不可以被查询;

  设定为index:文件将被检索;

  设定为follow:页面上的链接可以被查询;

  设定为noindex:文件将不被检索,但页面上的链接可以被查询;

  设定为nofollow:文件将不被检索,页面上的链接可以被查询。

  http-equiv属性

  1、<meta http-equiv="Content-Type" contect="text/html";charset=gb_2312-80">

和 <meta http-equiv="Content-Language" contect="zh-CN">用以说明主页制作所使用的文字以及语言;

  又如英文是ISO-8859-1字符集,还有BIG5、utf-8、shift-Jis、Euc、Koi8-2等字符集;

  2、<meta http-equiv="Refresh" contect="n;url=http://yourlink">定时让网页在指定的时间n内,跳转到页面http://yourlink;

  3、<meta http-equiv="Expires" contect="Mon,12 May 2001 00:20:00 GMT">可以用于设定网页的到期时间,一旦过期则必须到服务器上重新调用。需要注意的是必须使用GMT时间格式;

  4、<meta http-equiv="Pragma" contect="no-cache">是用于设定禁止浏览器从本地机的缓存中调阅页面内容,设定后一旦离开网页就无法从Cache中再调出;

   5、<meta http-equiv="set-cookie" contect="Mon,12 May 2001 00:20:00  GMT">cookie设定,如果网页过期,存盘的cookie将被删除。需要注意的也是必须使用GMT时间格式;

  6、<meta http-equiv="Pics-label" contect="">网页等级评定,在IE的internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级别就是通过meta属性来设置的;

  7、<meta http-equiv="windows-Target" contect="_top">强制页面在当前窗口中以独立页面显示,可以防止自己的网页被别人当作一个frame页调用;

   8、<meta http-equiv="Page-Enter"  contect="revealTrans(duration=10,transtion= 50)">和<meta  http-equiv="Page-Exit"  contect="revealTrans(duration=20,transtion=6)">设定进入和离开页面时的特殊效果,这个功能即 FrontPage中的“格式/网页过渡”,不过所加的页面不能够是一个frame页面。

  以上是常用的几个meta属性,有个人主页的朋友不妨在你的主页中加上它,效果可是不一样的哦:)。

iphone 升级感悟

曾经我的好友因为不小心将iphone升级到了一个还未能破解的版本,导致iphone刚买不到2个月,就束之高阁了半年之久;再加上对iphone的越狱、解锁之类的东西也没弄明白为什么会有这么多问题,所以我的iphone已有2年没有重做系统了,系统版本还是3.0的。
由于系统版本太低,导致一些软件安装不了,还有一些其他的问题,比如易用性等,我升级系统的欲望越来强烈了;但是由于手头就这一部手机,万一弄不好,又恐耽误了工作,所以迟迟没有敢升级系统。
今天,周日的晚上,两天的周末我都没有做这件事情,却现在要做,我一定是头脑有点儿冲动了。不过,我曾经是有一些准备的。
翻开曾经准备的升级教程 http://iphone.tgbus.com/tutorial/hacktutorial/201011/20101129090737.shtml,找出曾经下载的软件包: iPhone1,2_4.2.1_8C148_Restore.ipsw  和 redsn0w_win_0.9.6rc8 ; 简单备份一下几个重要的数据,主要是通讯录了,然后就开始看着教程安装了。
当然,教程已经写的很详细了,具体过程我就不说了,主要想记录一下自己遇到的问题。
1. 使用itunes将系统更新到4.2.1后,我没有重启系统已查看当时系统是否可以看到主界面(可以看到一个简单的界面,啥也干不了的),而是直接打开红雪,进行越狱
2. 越狱开始提示的3个步骤,先按power键3s,再同时按home键10s,再松开power键,只按住home键15s,其实这个只是为了进入DFU模式,原不解其意,我第一次在这个地方操作失败了,于是挫折从这里就开始了
3. 越狱后,我没有看到想要的东西,看到的却是一个白苹果;这时,我想到了91助手里面有个修复白苹果的功能,于是我祭出了91助手; 91助手说我的手机可能还没有越狱,不能使用91助手,于是我想用itunes恢复的曾经的状态,毕竟我是备份过的。
4. 打开itunes,开始恢复,提示系统已损坏,无法恢复; 我奇怪了,如果系统好好的,我还不让你恢复呢! 后来才发现,是91助手发现itunes要操作手机,给拦截了
5. 尝试再次越狱,多次重试无效
6. 使用itunes恢复,因为知道了是91助手惹的祸了,所以这次回复成功了
越狱前:

由于我的iphone是有锁的,所以不越狱也不能打电话,sim卡不支持,下面开始越狱

7. 再次越狱, 由于操作比较谨慎,这次成功了
8. 越狱后重启,看到了桌面了,很开心,感觉完成了似的,至少这已经是一个质的突破了; 下面还有好多操作,当然都不再是什么问题了,一路过关斩将,还算比较顺利
9. 装完系统后,我看到的是英文界面,看了看设置,里面有个国际化的选项,选择简体中文后,界面变的格外亲切了
10. 但是现在还不能打电话,连运营商都搜不到,因为步骤还没走完呢,大概下面的过程就是解锁了吧; 下面是更新cydia,并安装ultrasn0w,使用ultrasn0w来解锁; 现在终于知道了有锁和无锁的区别了;
如果是无锁的,其实不越狱也没关系,只是不能用破解的软件而已;
如果是有锁的(美版的),如果不越狱就安装不了cydia,安装不了cydia就无法解锁,不解锁就不能打电话。

11. 解锁之后还是不能打电话,因为需要升级基带,还是用红雪,和越狱的步骤类似
12. 现在可以打电话了,使用itunes恢复自己的音乐、应用程序等等; 因为我使用91助手备份的通讯录,所以还使用91助手恢复通讯录吧

现在已经晚上0点了,终于都搞定了; 虽有挫折,但是还算是比较顺利的。

php中的 "==" 是怎么实现的

参考函数: compare_function (in Zend/zend_operators.c)

test.php
===================
class phpor{
public function __tostring() {
return ‘aa’;
}
}

if (new phpor == "aa") echo ‘ok1’;
if ("aa" == new phpor) echo ‘ok2’;
exit;
===========================
你觉得ok1和ok2是不是都能输出; 原来我猜测php是不是将 ”==“ 右边的转换成左边的类型后进行比较的; 看了源码才知道根本不是这么简单的;
如果其中一个是对象,并且该对象是可以cast的,则将对象cast成另一操作数的类型后再进行比较。所以上面ok1和ok2都是输出的

———————-
关于 ‘===’ 的实现,参考: is_identical_function (in Zend/zend_operators.c)

PHP中的引用

1. PHP中对象的赋值,默认是引用的;对象作为参数传递时也是引用传递的,和普通变量是不同的。
2. 函数定义时,试图将返回值定义成引用是没有意义的; 如下面代码:
——————–
<?php

function &phpor() { // 这里的 & 没有任何作用
    static $a = 1;
    $a++;
    return $a;
}

$b = phpor();  // $b没有被作用返回值的引用
$c = &phpor(); // 引用返回值需要在函数调用时引用
echo "b:$b\n";
echo "c:$c\n";
phpor();
echo "b:$b\n";
echo "c:$c\n";

exit;
===================
输出结果:
b:2
c:3
b:2
c:4
—————————-

PHP中函数的内部类型

阅读PHP源码有一个非常重要的函数: zend_do_fcall_common_helper_SPEC (in Zend/zend_vm_execute.h);

PHP中有很多现有的函数是用C写的, 称之为: ZEND_INTERNAL_FUNCTION ; 还有一部分是我们自己使用function关键字定义的,这部分称为: ZEND_USER_FUNCTION ; 对于类也有这种区别,用C写的那部分类,称之为: ZEND_INTERNAL_CLASS; 我们自己使用class关键字定义的类,称为:ZEND_USER_CLASS ; 相关定义可参看: Zend/zend_compile.h

通过函数zend_do_fcall_common_helper_SPEC() , 我们可以知道内部函数和用户函数分别是怎么执行的。 内部函数通过函数 zend_execute_internal 来执行, 用户函数是通过函数 zend_execute来解释执行opcode的。

PHP中函数的存储结构:
———————- in zend_compile.h ———————-
typedef union _zend_function {
    zend_uchar type;    /* MUST be the first element of this struct! */

    struct {
        zend_uchar type;  /* never used */
        char *function_name;
        zend_class_entry *scope;
        zend_uint fn_flags;
        union _zend_function *prototype;
        zend_uint num_args;
        zend_uint required_num_args;
        zend_arg_info *arg_info;
        zend_bool pass_rest_by_reference;
        unsigned char return_reference;
    } common;
       
    zend_op_array op_array;
    zend_internal_function internal_function;
} zend_function;
其中,type标识的是内部函数还是用户函数
————————————————-

关于类的存储结构,参看Zend/zend.h 中结构体 _zend_class_entry,其中也有一个type属性来标识了内部类还是用户类了;

作业: foreach一个类的时候,能看到那些属性或函数,内部类和用户类表现一样吗?为什么?

1. foreach内部类的时候,什么也看不到
2. foreach用户类的使用,public的属性可以看到,private的属性或任意访问权限的成员方法是看不见的。

关于mongo的安装

* 比较方便的办法是下载一个合适的二进制的mongodb的包,直接复制到合适的目录
* 自己编译安装:

  1. 首先, mongodb的编译是通过scons来构建的, 所以要先安装scons, 参考: http://www.scons.org/
  2. scons 是一个python工具,所以你要先安装python
  3. 假设你上面的已经安装成功了
  4. mongodb还依赖下面东西:
  • devel/boost
  • devel/libexecinfo
  • devel/pcre
  • lang/spidermonkey

  5. 假设你安装完了上面依赖, 好了, scons . ; 但愿你是幸运的

——————–
提示: boost安装可以使用yum:
yum install boost-devel

pcre的安装: http://www.pcre.org/

spidermonkey的安装: http://www.mongodb.org/display/DOCS/Building+Spider+Monkey

重要: gcc < 4编译不行