April 30, 2011
| 作者:白菜
|
分类:C语言
要了解C语言的指针,首先应该了解内存的结构。下面我先介绍一下内存的结构吧,let’s go。
内存就像一个个编好号码的盒子,如下图:

我们可以任意选择其中的一个盒子存放东西,例如我们要在第一个盒子中放入10个乒乓球,所以我们可以找到编号为1的盒子,然后把10个乒乓球放进里面。
计算机的内存跟上面的例子很相似,因为内存也有编号,也可以往里面放东西,所以本质上跟上面的例子没有什么区别的。我们看看内存的真实结构吧:

在上面的图中,我们看到的图片左边的一些16进制数值就是内存的编号,我们称他为内存地址。而白色框框里面的数据就是保存在内存中的实际数据,我们一般使用的就是这些数据。
好了,已经大概了解过计算机的内存结构了,下面我们来说说什么是指针吧。
定义:指针是一种数据类型,与其它的数据类型不同的是指针是一种“用来存放内存的地址”的变量。
从上面的定义上可以看出,指针是变量,而且是有类型的变量,但他保存的是内存的地址。这样说来,指针也是很容易理解的。的确,指针就是这么容易。不过要灵活运用指针才能发挥出C语言的最大优势。
阅读剩余部分...
April 29, 2011
| 作者:白菜
|
分类:编程算法
提到mysql,我顺便讲讲序列。用过oracle的人都知道,orale没有类似mysql的AUTO_INCREMENT这样的自增长字段,实现插入一条记录,自动增加1.oracle是通过sequence(序列)来完成的。这样看起来,似乎mysql的自增长要比oracle序列的实现更好更方便。那我为什么还要提序列呢?有必要吗?
(1)首先mysql的自增长“序列”和序列是两回事,mysql本身不提供序列机制。
mysql的AUTO_INCREMENT可以设置起始值,但是不能设置步长,其步长默认就是1.(这里是错误的,可以通过修改系统变量设置步长,但其针对全局)
(3)mysql一个表只能有一个自增长字段。自增长只能被分配给固定表的固定的某一字段,不能被多个表共用。并且只能是数字型。
(4)在历史表和数据迁移时,经常会遇到自增主键重复的问题。
(5)自增主键往往是没意义的。
在下列情况下可能你需要使用序列:
(1)业务复杂,你需要高度定制和控制主键(自增主键只能是按数字递增的,但是序列可以随心所欲的变化,比如按照年月日生成主键。。。)
(2)你希望手工维护自增长,方便数据迁移;
(3)当事务跨多表时,期望事务可靠性;
当你需要一个业务上有意义的主键时,比如单据号等(若你需要的只是一个流水号,那么用自增更方便);
(5)当你的主键很明确地需要和其他表关联时(若你的表不与其他表关联时,如日志表,自增更方便)
(6)你期望这个主键是唯一的,不需要重复利用的。
当然,序列也有缺点,主要就是程序处理麻烦,不如自增方便。oracle的自增有缓存,不用担心效率问题,而mysql只能通过触发器模拟,可能会有性能损失。
阅读剩余部分...
April 28, 2011
| 作者:白菜
|
分类:心情与文字
长颈鹿的脖子那么长 哽咽的时候是不是很难受
章鱼有三颗心脏 心痛的时候是不是很疼
乌鸦可以学人说话 尴尬的时候会不会装咳嗽
骆驼有长长的睫毛 想哭的时候能不能说眼睛进了沙
蛇没有宽宽的肩膀 她累的时候给不了能够依靠的温暖
小强有两个大脑 孤单的时候会不会一起想着谁
我没有长长的脖子 却哽咽的说不出话
我没有三颗心脏 体会不到无法忍受的痛再多三倍
我假装咳嗽 假装被沙子迷了眼 你也没有看我一眼
是因为我太弱小 没有很可靠的肩膀么
无时无刻的清澈的想念 一定比两个大脑一起想你还多吧
蜉蝣只能活很短 可能一辈子都来不及和心里珍藏的那个人说一些想说的话
我又能活多久 时间会不会给我可以开口的勇气
把人生看做是自己独一无二的创作 便不会频频回首
你会不会忽然地出现 在旧时光的风景里 成为珍藏一生的美丽
http://www.lzhi.org/views/502009
April 21, 2011
| 作者:白菜
|
分类:php,编程算法
这一次,我们讲讲前端页面缓存,包括浏览器缓存.
通常,前端的页面缓存主要有基于HHTP协议和基于浏览器和脚本两种。HTTP协议中有很多报头来描述缓存的。我们可以在HTML页面利用meta tag和PHP程序中通过header来控制.例如:
<?php
header('Cache-Control:max-age=86400, must-revalidate');//24小时
header('Last-Modified:'.gmdate('D, d M Y H:i:s').'GMT');
header('Expires:'.gmdate('D, d M Y H:i:s', time() + '86400').'GMT');
echo '我不刷新';再写个HTML文件c.htm:<html>
<body>
haha,<a href=cache.php>go</a>
</body>
</html>
我们请求127.1/c.htm,点击链接,然后利用浏览器的回退按钮,返回c.htm,再点击链接,如下图左所示,我们发现,当添加了缓存指令后,我们无论如何来回后退和点击链接,下面的网络请求URL这一条始终为灰色,表示浏览器并没有发起实际的网络请求,而是直接调用了存储在用户电脑中的缓存页,除非缓存时间过期,在这期间,即使是实际内容改变了,浏览器也不会去重新读取我们在服务器上的资源。你可以把echo的那一句修改后,再点击,会发现网络请求仍然为灰色。在这种情况下,只有以下三种情况浏览器才会去更新缓存:
(1)缓存到期
(2)缓存被清除;
(3)F5或 ctrl+F5强制刷新。(这一点各种浏览器处理可能存在差异,我的测试环境是firefox 4)
当我们屏蔽上面的header指令或者改用如下代码时//告诉客户端浏览器不使用缓存,HTTP 1.1 协议
header("Cache-Control: no-cache, must-revalidate");
//告诉客户端浏览器不使用缓存,兼容HTTP 1.0 协议
header("Pragma: no-cache");


阅读剩余部分...
April 21, 2011
| 作者:白菜
|
分类:php,编程算法
刚刚讲的是最简单的文件缓存,再复杂一点,讲讲稍微复杂点的opcode缓存。
所谓opcode缓存就是把php在经虚拟机把php代码编译成一种中间码(这种代码就叫opcode)的结果缓存起来(可以缓存到硬盘,也可以到内存),下一次php运行此页面时,只要直接解释这堆代码就行了。这样就省去了flex语法器进行语法编译和大部分语法检查(这个语法检查在多个阶段均存在)的过程,一定程度上提高了php的运行速度,减轻服务器的负荷。eAccelerator就是这么的一款工具,当然它的功效不仅如此。至于eAccelerator的安装和配置我在第一章就讲过了,此处不在赘述。
Opcode长啥样?我们直观的来看一下。
首先安装VLD扩展,VLD全名是Vulcan Logic Disassembler,可以用来检测PHP脚本的执行情况。
【Linux下】:安装VLD:wget http://pecl.php.net/get/vldtar zxvf vld-0.9.1.tgzcd vld-0.9.1phpize./configuremake install编辑php.ini文件激活vld扩展:extension=vld.so如果是在win下,可参考我博客的一篇文章进行编译,http://aiyooyoo.com/index.php/archives/212/。如果你不大会的话,或者觉得麻烦,也可以用我编译好的,在本指南第一章的源代码目录里有。此扩展在php5.3.3-5.3.5测试均可用,其他较早版本应该也可以。同样的,在win下安装扩展的操作不再描述。现在我们写一个文件测试一下,代码如下:
<?php echo "helloword\r";
$data['first']='Hello';
$data['first']['second']='world';echo $data ['first'];
在命令行下执行php -dvld.active=1 g:\bak\temp\tempcode\time.php,得到输出如下
filename: G:\bak\temp\tempcode\time.phpfunction name: (null)
number of ops: 13compiled vars: !0 = $data
line # * op fetch ext return operands
--------------------------------------------------------------------------------
2 0 > EXT_STMT 1 ECHO 'helloword%0D'
3 2 EXT_STMT 3 ZEND_ASSIGN_DIM !0, 'first' 4 ZEND_OP_DATA 'Hello', $1
4 5 EXT_STMT 6 FETCH_DIM_W $2 !0, 'first' 7 ZEND_ASSIGN_DIM $2, 'second' 8 ZEND_OP_DATA 'world', $4
5 9 EXT_STMT 10 FETCH_DIM_R $5 !0, 'first' 11 ECHO $5 12 > RETURN 1
branch: # 0; line: 2- 5; sop: 0; eop: 12path #1: 0,welloword
从这里我们可以看出,这段代码被分成了13小步执行。看一张C的hello world经过汇编后的代码,有没有发现上面的OPCODE和汇编代码很像。没错,opcode就是php的“汇编代码”。OpCode就是Operation Code,意即操作码的意思。注意:OpCode不是php里的专有名词。 Php里的Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,PHP的语言引擎Zend执行php代码时候,会把php代码经过分成token,词法分析的过程转成opcode,然后顺序执行。

阅读剩余部分...
April 21, 2011
| 作者:白菜
|
分类:php,编程算法
二、缓存使用
我们先从最简单的看起,来看看模板中的文件缓存机制是怎样的。想想应该这个逻辑是很清晰地,模板的作用之一就是把动态的php代码“编译”成静态的HTML文件,当下次去读取时,就不用再“编译”了,直接读取静态文件就好。有人说模板引擎应该去做解释标签的活计,不应该越俎代庖,插手缓存。我一直认为,php就是个表现层语言,它本身就是个模板引擎了,大没必要把模板和文件缓存分的那么细。
这里我不会讲smarty的用法,这个东西你用它就在那里,不用你就可以把它忽视。我们可以在这里实现一个简单的模板引擎,来展示下文件缓存和模板机制的基本工作原理。
<?php
/**
Copyright (C), :06/06
name:模板解析(开发版)
Author:猪也知道 waitfox@qq.com
Description:轻巧模板解析类,最大程度的原生态。
*/
class Template {
private $arrayConfig = array(
'suffix'=>'.ptd',//设置模版文件的后缀
'templateDir'=>'template/',//设置模板所在的文件夹
'cachedir'=>'cache/',//设置编译后的缓存文件存放的目录
'cache_htm'=>false,//是否需要编译成静态的HTML文件
'suffix_cache'=>'.htm',//设置编译文件的后缀
'cache_time'=>7200//多长时间自动更新,单位秒,建议设置大一些
);
private $value=array();
private $message=null;
public $file;//模版文件名,不带路径
public $cache_file;//编译后的完整文件名
static private $instance = null;
public function __construct($arrayConfig = array()) {
$this->arrayConfig= $arrayConfig+$this->arrayConfig;
}
阅读剩余部分...
April 21, 2011
| 作者:白菜
|
分类:php,编程算法
缓存的简介
一。缓存介绍
一般情况下,一个网站,或者一个应用,它的一般形式是,浏览器请求应用服务器,应用服务器做一堆计算后再请求数据库,数据库收到请求后再作一堆计算后把数据返回给应用服务器,应用服务器再作一堆计算后把数据返回给浏览器.这个是一个标准流程.但是随着web业务的复杂和并发的增加,应用服务器和数据库服务器所做的计算也越来越多,但是往往我们的应用服务器资源是有限的,数据库每秒中接受请求的次数也是有限的.如何利用有限的资源来提供尽可能大的吞吐量呢,一个办法:减少计算量,缩短请求流程(减少网络io或者硬盘io),这时候缓存就可以大展手脚了.缓存的基本原理就是打破上面所描绘的标准流程,在这个标准流程中,任何一个环节都可以被切断.请求可以从缓存里取到数据直接返回.这样不但节省了时间,提高了响应速度,而且也节省了硬件资源.可以让我们有限的硬件资源来服务更多的用户.
在web的世界,理论上每一层都是可以被缓存的。我们从最底层说起,以php为例,有ZEND虚拟机的变量缓存,有memcache这样的key-value内存缓存,有APC,eAccelerator这样的主要基于Opcode字节码的缓存,然后到了数据库层,有数据库的SQL CACHE,再到servlet容器层,有apache的缓存,在sevlet在上去一点点,还有一个webcache层(如squid,varnish等等),然后应用级别的smarty实现的文件缓存,再往前,就到了基于HTTP协议和浏览器自身实现的浏览器缓存。当然,上面的分类中存在重复和交叉,这只是一个粗略的描述。
缓存放在什么地方?无非就是内存和硬盘。文件缓存如模板机制自然是缓存在硬盘上的,而一些需要高速存取的变量则缓存在内存中。模板的缓存是把动态的代码编译成静态文件,放入硬盘,就不用每次访问都编译了,直接读出即可。通常来说,缓存组件都是同时结合内存和硬盘,当内存满后,就把部分数据持久化到硬盘,或通过定期dump,把内存的数据写入硬盘,防止数据丢失。由于nosql技术和流行,有时候会把数据库缓存单列出来。
阅读剩余部分...
April 19, 2011
| 作者:白菜
|
分类:网页前端
1.jquery动态删除表格行或单元格
$("a[todo*='del']").click(function(e){
var id = $(this).attr('todel');//获取ID
var now=$(this);//防止作用域被篡改
if (confirm("您确定要删除吗?")) {
$.get("/p/ajax/pdel.do", {
id: id
}, function(data){
switch (data._rc) {
case "success":
alert('删除成功', '删除账号');
now.parent().parent().find("td").eq(2).html("");
now.parent().parent().find("td").eq(3).html("");
now.parent().parent().find("td").eq(4).html("");
now.parent().parent().find("td").eq(4).html("<a href='../p/paddpre.do?pId=" + id + "'>添加账号</a>");
//$("#po"+id).remove();删除整行
break;
default:
jAlert("操作成功!");
break;
}
});
}
})
阅读剩余部分...