<?xml version="1.0" encoding="UTF-8"?><!-- generator="WordPress/2.6.1" -->
<rss version="0.92">
<channel>
	<title>IT时代</title>
	<link>http://www.oursit.com</link>
	<description>IT时代是记录现今(Linux,ajax,php,FLEX,actionscript,air,javascript,apache,mysql,服务器技术)比较流行的技术文档和实例，并与大家共同讨论各种技术的解决方案和IT的奥秘</description>
	<lastBuildDate>Sat, 23 Jan 2010 02:38:14 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	
	<item>
		<title>如何对memcache的数据(key-value)进行遍历操作</title>
		<description>stats命令
memcache的stats命令包括：


&#160;

    &#160;&#160;&#160;&#160;&#160;&#160;&#160; stats&#160;&#160;&#160;&#160;
    &#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160; stats&#160;reset&#160;&#160;&#160;&#160;
    &#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160; stats&#160;malloc&#160;&#160;&#160;&#160;
    &#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160; stats&#160;maps&#160;&#160;&#160;&#160;
    &#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160; stats&#160;sizes&#160;&#160;&#160;&#160;
    &#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160; ...</description>
		<link>http://www.oursit.com/archives/143.html</link>
			</item>
	<item>
		<title>JS做的树导航控件</title>
		<description>近段时间根据公司的需要，使用JS做了一个树导航控件，如下图：

&#160;
手动添加
&#160;

&#160;

    window.onload&#160;=&#160;function()&#160;&#160;
    &#160;&#160;&#160;&#160;{&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var&#160;navigation&#160;=&#160;new&#160;Navigation(document.getElementById('aa'),'我的导航');&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;navigation.addLayer('学校管理');&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;navigation.addLayer('教师管理');&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;navigation.addLayer('杨潇管理');&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;navigation.getTree(0).createRootNode(1000,'我是谁',undefined,'aa');&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;navigation.getTree(0).createRootNode(1001,'我是杨潇');&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;navigation.getTree(1).createRootNode(1001,'我是杨潇');&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;navigation.getTree(0).getRootNode(0).createChildNode(1002,'我是杨潇');&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;navigation.getTree(0).getRootNode(0).createChildNode(1002,'我是杨潇');&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;navigation.getTree(0).getRootNode(0).createChildNode(1002,'我是杨潇');&#160;&#160;
  ...</description>
		<link>http://www.oursit.com/archives/141.html</link>
			</item>
	<item>
		<title>提高Linux上socket性能&#8212;加速网络应用程序</title>
		<description>&#160;&#160;&#160;&#160;&#160;&#160; 我们在编写网络应用程序的时候经常会碰到性能上面的问题，在网上看到了这片文章，讲的比较好，所以转载过来。：）
在开发 socket 应用程序时，首要任务通常是确保可靠性并满足一些特定的需求。利用本文中给出的 4 个提示，您就可以从头开始为实现最佳性能来设计并开发 socket 程序。本文内容包括对于 Sockets API 的使用、两个可以提高性能的 socket 选项以及 GNU/Linux 优化。
　　为了能够开发性能卓越的应用程序，请遵循以下技巧：
　　最小化报文传输的延时。
　　最小化系统调用的负载。
　　为 Bandwidth Delay Product 调节 TCP 窗口。
　　动态优化 GNU/Linux TCP/IP 栈。
　　技巧 1. 最小化报文传输的延时
　　在通过 TCP socket 进行通信时，数据都拆分成了数据块，这样它们就可以封装到给定连接的 TCP payload(指 TCP 数据包中的有效负荷)中了。TCP payload 的大小取决于几个因素(例如最大报文长度和路径)，但是这些因素在连接发起时都是已知的。为了达到最好的性能，我们的目标是使用尽可能多的可用数据来填充 每个报文。当没有足够的数据来填充 payload 时(也称为最大报文段长度(maximum segment size) 或 MSS)，TCP 就会采用 Nagle 算法自动将一些小的缓冲区连接到一个报文段中。这样可以通过最小化所发送的报文的数量来提高应用程序的效率，并减轻整体的网络拥塞问题。
　　尽管 John Nagle 的算法可以通过将这些数据连接成更大的报文来最小化所发送的报文的数量，但是有时您可能希望只发送一些较小的报文。一个简单的例子是 telnet 程序，它让用户可以与远程系统进行交互，这通常都是通过一个 ...</description>
		<link>http://www.oursit.com/archives/135.html</link>
			</item>
	<item>
		<title>MYSQL复制功能</title>
		<description>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 在前一个公司工作的时候，因为公司运营的系统的数据库中有金钱买卖相关的很重要的数据，服务器又是在别人那里，所以需要进行时时备份数据库，所以就使用MYSQL复制功能来达到时时备份的效果，下面我记录下设置过程，其中为了偷懒有些地方是我抄的别人的，呵呵，但是个人觉得又精简又完整。
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
Server_1：公网主服务器（假设为192.168.100.1）
创建一个支持备份的用户
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO backup@'%' IDENTIFIED BY '1234';
//注意backup为账号1234为密码，请根据具体情况设置
用vi打开my.cnf
设置：（字段信息可能已经存在，请先搜索位置）
server-id = 1
log-bin = shop-bin
Server_2：公网只读服务器（假设为192.168.100.2）
用vi 打开 my.cnf
设置：
server-id = 2
master-host=IP地址 //Server_1的IP
master-user=backup //Server_1的账号
master-password=1234 //Server_1的密码
replicate-do-db=shop //Server_1的数据库名称
注意：从服务器上的ID不能和主服务器上的ID一样
#[Mysql双向同步配置]
Server_1：公网主服务器（假设为192.168.100.1）
设置：
log-slave-updates&#160; //这一句话很重要,只有加上这一句话,才能将信息copy到从服务器上
master-host=IP地址 //Server_3的IP地址
master-user=backup //Server_3的账号
master-password=1234 //Server_3的密码
replicate-do-db=shop //Server_3的数据库
Server_3服务器配置（假设IP为：192.168.100.3）
设置：
server-id = 3
bin-log=shop-bin
master-host=IP地址 //Server_1的IP
master-user=backup //Server_1的账号
master-password=1234 //Server_1的密码
replicate-do-db=shop //Server_1的数据库名称
三台服务器设置完成后需要重新启动才能生效！
重启顺序建议：
Server_1
Server_3
Server_2
&#160;
&#160;
&#160;

主服务器： 192.168.1.222
从服务器： 192.168.1.205
主服务器：
backup数据库为需要复制的数据库，设置 replicate@192.168.1.205 有访问权限:
grant file on *.* to 'replicate'@'192.168.1.205' IDENTIFIED BY 'password';
my.cnf中设置：
mysqld
server-id=1

    ...</description>
		<link>http://www.oursit.com/archives/131.html</link>
			</item>
	<item>
		<title>PHP 真正的ZIP文件操作类</title>
		<description>&#160; 在开发的过程中有时候我们可能需要使用到用zip来压缩和解压缩某个包，但是不是所有服务器我们都能控制（比如虚拟主机商提供的），所以我们可能在很多 环境下都不能使用PHP的ZIP扩展库，下面是我经常会用到的一个zip的PHP类，这里我的本意是想说我们大家可以研究下zip的格式，至于压缩数据其 实就是使用到了PHP的gz相关的函数。


&#160;

    &#60;?&#160;&#160;&#160;
    class&#160;zip&#160;&#160;&#160;&#160;
    {&#160;&#160;&#160;
    &#160;&#160;&#160;
    var&#160;$datasec,&#160;$ctrl_dir&#160;=&#160;array();&#160;&#160;&#160;
    var&#160;$eof_ctrl_dir&#160;=&#160;&#34;\x50\x4b\x05\x06\x00\x00\x00\x00&#34;;&#160;&#160;&#160;
    var&#160;$old_offset&#160;=&#160;0;&#160;var&#160;$dirs&#160;=&#160;Array(&#34;.&#34;);&#160;&#160;&#160;
    &#160;&#160;&#160;
    function&#160;get_List($zip_name)&#160;&#160;&#160;
    {&#160;&#160;&#160;
    &#160;&#160;$zip&#160;=&#160;@fopen($zip_name,&#160;'rb');&#160;&#160;&#160;
   ...</description>
		<link>http://www.oursit.com/archives/127.html</link>
			</item>
	<item>
		<title>PHP+GTK入门</title>
		<description> 以前PHP被认为只能用来编写服务器端的CGI程序，如果说PHP能够开发Windows下的GUI（图形用户界面）程序，你相信吗？最近，PHP的开发小组成功开发出了捆绑GTK+的PHP，那么就可以开发Windows下的GUI程序了。&#160;
&#160;
一、建立PHP/GTK运行环境：&#160;
其实GUI程序和普通的PHPCGI程序没有什么区别，不过是PHP/GTK程序由GTK的类来生成GUI界面而已，他们同样是开放源代码，靠PHP来解析建立窗口。如果你已经建立好了PHP的调试环境，那么安装PHP/GTK环境比较简单：&#160;
1、下载php_gtk.dll（这个dll文件用于解析PHP源程序里面的GTK代码），下载后将其解压到PHP的扩展（extension）目录中；&#160;
2、下载其他PHP/GTK的dll文件（一共6个），将他们解压缩到Windows的system32目录里面；&#160;
3、打开php.ini，在扩展设置部分&#8220;Windows Extensions&#8221;最下面加入&#8220;extension=php_gtk.dll&#8221;的语句，建议先备份php.ini，避免修改失败使得建立好的PHP运行环境作废；&#160;
现在就建立好了PHP/GTK的运行环境了。当然，你也可以不作第二步，而改为在每个PHP/GTK程序源代码的第一行加入&#8220;dl('php_gtk.dll')&#8221;来动态加载GTK的支持。&#160;
如果你还没有建立PHP运行环境，那么安装要更加简单：&#160;
1、下载整个PHP/GTK的捆绑支持包，然后将他们解压缩到c盘的PHP4目录下面；&#160;
2、将winnt目录下面的dll文件拷贝到Windows的system32目录中，将php.ini文件拷贝到Windows的目录中；&#160;
建 立好了PHP/GTK的运行后，可以用命令行模式的PHP来运行一个PHP/GTK程序：在运行中输入&#8220;c:\php4\php  -q gtkprogrampath&#8221;，其中&#8220;c:\php4\php&#8221;改为PHP.EXE的路径，&#8220;gtkprogrampath&#8221;就是PHP/GTK程序的  路径。比如：&#8220;c:\php4\php -q c:\php4\samples\hello.php&#8221;将会运行PHP/GTK运行包中附带的例子&#8220;hello  world&#8221;程序。&#160;
&#160;
二、编译PHP/GTK程序：&#160;
如果你作出一个PHP/GTK的应用程序，还需要对方的电脑建立PHP的运行环境并且使用PHP命令行模式来解析才可以执行的话，那就过于复杂了。那么怎么样才可以编译一个PHP/GTK的程序呢？经过一番搜索，笔者发现了PHPCompiler这个软件。&#160;
PHPCompiler由www.deskcode.com开发（http://www.deskcode.com/phpcompiler），可以将PHP编译成为EXE可执行文件，内置了PHP的支持，如果你要编译一个PHP/GTK程序，必须建立PHP/GTK的运行环境（参照前面的步骤）。要编译一个PHP/GTK程序的步骤如下：&#160;
1、打开PHPCompiler，在&#8220;Script to&#8221;选择希望编译的PHP程序源代码，在&#8220;Destination&#8221;处选择编译成功后的EXE文件的路径；&#160;
2、点击&#8220;Compile&#8221;按钮，会弹出一个对话框询问使用的编译模式（如果是PHP/GTK程序就选择no，是单纯的PHPCGI程序就选择yes）；&#160;
3、然后又会弹出一个对话框询问是否拷贝php4ts.dll文件到编译后的EXE文件的目录，选择yes。&#160;
经过上面的步骤，一个PHP/GTK程序就成功编译了，但是对于编译PHP/GTK程序还有几个需要注意的地方：&#160;
1、编译完成后的可执行文件如果需要执行，PC机上面必须具有GTK运行环境所需的几个dll文件（就是前面下载的那几个），如果需要作成应用程序，可以在安装的时候将几个dll文件拷贝到system32目录中（不过这样子程序也就不是&#8220;绿色软件&#8221;了^_^）。&#160;
2、 PHPCompiler本身对于PHP的支持非常好，但是有些人试过用一些需要扩展支持的函数，比如&#8220;gzopen&#8221;等等，在编译之前还好好的，编译完毕  后就不能用了。其实编译完成后的可执行文件，相当于了只有默认的PHP支持（连GTK支持都没有了），所以如果在程序中应用了任何需要扩展支持的函数，都  必须动态的加载支持函数的dll文件，比如&#8220;dl('php_gtk.dll')&#8221;，这样子编译完成后才不会出错。&#160;
3、运行一个编译后的可执行文件，都会先弹出一个DOS窗口，然后自动关闭，因为每个GUI窗口都是通过GTK来&#8220;绘制&#8221;出来的，所以必须会有那个窗口。&#160;
4、或许以前PHP还不能说是真正的OOP（面向对象程序）语言，但是到了PHP/GTK，任何一个窗口都由GTK对象来&#8220;绘制&#8221;，如果没有过硬的OOP功底，是很难写出GUI程序的。&#160;
&#160;
三、PHP/GTK资源：&#160;
1、http://gtk.php.net：PHP/GTK的官方网站；虽然说是官方网站，但是确简陋的很，出了一个FAQ和邮件列表，几乎找不到任何有用的东西了，&#160;
2、http://www.phpgtk.com：一个界面比较好的PHP/GTK网站，有最新的版本信息。&#160;
3、http://developer.gnome.org/doc/API/gtk/gtkobjects.html：PHP/GTK函数和类的大全/手册网站，里面有十分丰富的PHP/GTK资料。&#160;
4、http://www.phpuk.org/gtk/：非官方版本的GTK手册网站，简单易懂。&#160;
&#160;
如果大家认为E文比较难看，也可以来zphp.com[url]http://dl.itbulo.com/'[/url]&#62;下载最新的PHP/GTK运行环境和支持包。&#160;
&#160;
PHP-GTK开发入门全集(1)&#160;
&#160;
1. PHP-GTK介绍&#160;
1.1 PHP-GTK&#160;
PHP-GTK是PHP的延伸模组，它可以让程序设计师写出在客户端执行的、且独立的GUI的程序。这个模组不允许在浏览器上显视GTK+的程序，它一开始就是开发来写独立的GUI程序的。&#160;
&#160;
1.2 GTK&#160;
GTK原本是为GIMP，一个GUI的影像处理软体而开发的。GTK+是GIMP的套装工具。GTK+从这里开始发展，直到现在已经成为Gnome的中心  (Gnome是一个桌面环境)。后来GTK+也已经被推广到BeOS和Win32，使得它成为PHP延伸模组的最佳选择，维持PHP可以跨平台并可以用  PHP为Linux,BeOS,Windows等平台开发视窗接口的程序。&#160;
&#160;
2. PHP-GTK概念&#160;
2.1 前言&#160;
接下来就要教各位一点点比较观念性的东西罗┅因为这章的概念都是非常重要的，所以就算不懂，也还是要慢慢的看懂它，不然┅以后就┅。还有，接下来的内容不 建议没有程序设计经验的读者阅读，因为有很多的观念很容易会搞不清楚。还有，接下来该用英文的部分我都会用英文，这样大家在看国外文件的时候才不会不知所 措，加油吧!!如果对本章有任何不懂之处，请自行查阅&#160;
PHP-GTK Manual：http://gtk.php.net/manual/en/&#160;
&#160;
2.2 Widget(s)&#160;
Widget是一个GUI程序中基本的functions和forms。最常用的几个Widget是：label、button、window、  frame和text box。所有的widget都是来自于一个抽象的基本class─GtkWidget。每个widget都是一个class&#160;
&#160;
一个Widget一生大概都有五个时期：&#160;
1. 建立(Creation)：宣告一个对象(declaring an object)&#160;
2. 放置(Placement)：将它加入一个容器中(adding it to a container)&#160;
3. 信号连接(Signal Connection)：接收信号以及进行动作(the  action it will perform)&#160;
4. ...</description>
		<link>http://www.oursit.com/archives/125.html</link>
			</item>
	<item>
		<title>Linux音频编程指南</title>
		<description>&#160;
2004-10-28&#160; &#160; 肖文鹏&#160; &#160; IBM DW &#160;
&#160;
虽然目前Linux的优势主要体现在网络服务方面，但事实上同样也有着非常丰富的媒体功能，本文就是以多媒体应用中最基本的声音为对象，介绍如何在Linux平台下开发实际的音频应用程序，同时还给出了一些常用的音频编程框架。&#160;
&#160;
一、数字音频&#160;
&#160;
音频信号是一种连续变化的模拟信号，但计算机只能处理和记录二进制的数字信号，由自然音源得到的音频信号必须经过一定的变换，成为数字音频信号之后，才能送到计算机中作进一步的处理。&#160;
&#160;
数字音频系统通过将声波的波型转换成一系列二进制数据，来实现对原始声音的重现，实现这一步骤的设备常被称为模/数转换器（A/D）。A/D转换器以每秒  钟上万次的速率对声波进行采样，每个采样点都记录下了原始模拟声波在某一时刻的状态，通常称之为样本（sample），而每一秒钟所采样的数目则称为采样  频率，通过将一串连续的样本连接起来，就可以在计算机中描述一段声音了。对于采样过程中的每一个样本来说，数字音频系统会分配一定存储位来记录声波的振  幅，一般称之为采样分辩率或者采样精度，采样精度越高，声音还原时就会越细腻。&#160;
&#160;
数字音频涉及到的概念非常多，对于在Linux下进行音频编程的程序员来说，最重要的是理解声音数字化的两个关键步骤：采样和量化。采样就是每隔一定时间  就读一次声音信号的幅度，而量化则是将采样得到的声音信号幅度转换为数字值，从本质上讲，采样是时间上的数字化，而量化则是幅度上的数字化。下面介绍几个  在进行音频编程时经常需要用到的技术指标：&#160;
&#160;
采样频率&#160;
采样频率是指将模拟声音波形进行数字化时，每秒钟抽取声波幅度样本的次数。采样频率的选择应该遵循奈奎斯特（Harry  Nyquist）采样理论：如果对某一模拟信号进行采样，则采样后可还原的最高信号频率只有采样频率的一半，或者说只要采样频率高于输入信号最高频率的两  倍，就能从采样信号系列重构原始信号。正常人听觉的频率范围大约在20Hz~20kHz之间，根据奈奎斯特采样理论，为了保证声音不失真，采样频率应该在  40kHz左右。常用的音频采样频率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等，如  果采用更高的采样频率，还可以达到DVD的音质。 &#160;
量化位数&#160;
量化位数是对模拟音频信号的幅度进行数字化，它决定了模拟信号数字化以后的动态范围，常用的有8位、12位和16位。量化位越高，信号的动态范围越大，数字化后的音频信号就越可能接近原始信号，但所需要的存贮空间也越大。 &#160;
声道数&#160;
声道数是反映音频数字化质量的另一个重要因素，它有单声道和双声道之分。双声道又称为立体声，在硬件中有两条线路，音质和音色都要优于单声道，但数字化后占据的存储空间的大小要比单声道多一倍。 &#160;
二、声卡驱动&#160;
&#160;
出于对安全性方面的考虑，Linux下的应用程序无法直接对声卡这类硬件设备进行操作，而是必须通过内核提供的驱动程序才能完成。在Linux上进行音频编程的本质就是要借助于驱动程序，来完成对声卡的各种操作。&#160;
&#160;
对硬件的控制涉及到寄存器中各个比特位的操作，通常这是与设备直接相关并且对时序的要求非常严格，如果这些工作都交由应用程序员来负责，那么对声卡的编程  将变得异常复杂而困难起来，驱动程序的作用正是要屏蔽硬件的这些底层细节，从而简化应用程序的编写。目前Linux下常用的声卡驱动程序主要有两种：  OSS和ALSA。&#160;
&#160;
最早出现在Linux上的音频编程接口是OSS（Open Sound System），它由一套完整的内核驱动程序模块组成，可以为绝大多数声卡提供统一的编程接口。OSS出现的历史相对较长，这些内核模块中的一部分  （OSS/Free）是与Linux内核源码共同免费发布的，另外一些则以二进制的形式由4Front  Technologies公司提供。由于得到了商业公司的鼎力支持，OSS已经成为在Linux下进行音频编程的事实标准，支持OSS的应用程序能够在绝  大多数声卡上工作良好。&#160;
&#160;
虽然OSS已经非常成熟，但它毕竟是一个没有完全开放源代码的商业产品，ALSA（Advanced  Linux Sound Architecture）恰好弥补了这一空白，它是在Linux下进行音频编程时另一个可供选择的声卡驱动程序。ALSA除了像OSS那样提供了一组内  核驱动程序模块之外，还专门为简化应用程序的编写提供了相应的函数库，与OSS提供的基于ioctl的原始编程接口相比，ALSA函数库使用起来要更加方  便一些。ALSA的主要特点有：&#160;
&#160;
支持多种声卡设备 &#160;
模块化的内核驱动程序 &#160;
支持SMP和多线程 ...</description>
		<link>http://www.oursit.com/archives/123.html</link>
			</item>
	<item>
		<title>mysql proxy源代码初探</title>
		<description>今天花了半天时间看了下mysql proxy源代码，主要是找出MYSQL协议部分，下面我来说一下过程，以便记录一下。

第一步：找出重点结构

1.network_mysqld_config

network_mysqld_config结构              在network-mysqld.h

主要用于mysqlproxy的整体配置结构，存储的一些服务器IP和端口地址。用于mysql proxy和链接客户端使用

2.netword_mysqld

netword_mysqld结构         network-mysqld.h

个人觉得主要存储mysql proxy的事件驱动机制和network_mysqld_config结构，还会存储一个HASH表结构，这个HASH表结构中存储的是一些功能函数，比如connections_select，config_select，help_select，authors_select函数，这些函数在mysql-proxy.c文件中，这个结构和network_mysqld_config结构是两个全局结构，基本上其他结构都会用到这两个结构体。

3.network_mysqld_table

netword_mysqld_table结构         network-mysqld.h

这个结构就是用在network_mysqld中的HASH表中的，用于存储上面HASH表存储的那几个功能函数。

4.netword_mysqld_con

netword_mysqld_con结构       network-mysqld.h

这个结构表示mysql proxy服务器和客户端的链接状态和请求状态，其中存储着套接字信息和MYSQL链接请求信息，还有模拟MYSQL协议的功能函数信息（以插件形式存在）

5.network_socket

network_socket结构     network-socket.h

里面存储的就是mysql proxy服务端和客户端的sockaddr信息了，包括IP地址字符串信息，主要使用在netword_mysqld_con结构中。其中还用到了network_address，network_queue结构，好像还包括用户名密码（应该是MYSQL的）

基本上主要结构体就是这些了，现在我已经在分析模拟MYSQL协议的地方了，有时间我会在继续写的。 </description>
		<link>http://www.oursit.com/archives/118.html</link>
			</item>
	<item>
		<title>linux 2.6内核epoll用法举例说明</title>
		<description>epoll用到的所有函数都是在头文件sys/epoll.
h中声明的，下面简要说明所用到的数据结构和函数：&#160;
所用到的数据结构 



&#160;

    typedef&#160;union&#160;epoll_data&#160;{&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;void&#160;*ptr;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;int&#160;fd;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;__uint32_t&#160;u32;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;__uint64_t&#160;u64;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;epoll_data_t;&#160;&#160;&#160;
    &#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;struct&#160;epoll_event&#160;{&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;__uint32_t&#160;events;&#160;&#160;&#160;&#160;&#160;&#160;/*&#160;Epoll&#160;events&#160;*/&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;epoll_data_t&#160;data;&#160;&#160;&#160;&#160;&#160;&#160;/*&#160;User&#160;data&#160;variable&#160;*/&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;};&#160;&#160;&#160;


typedef union epoll_data {  ...</description>
		<link>http://www.oursit.com/archives/116.html</link>
			</item>
	<item>
		<title>flex3配合JS上传照片(服务器不保存上传图片)</title>
		<description>前段时间因为自己的项目需要上传照片并对照片进行简单的处理，所以使用FLEX制作了一个上传照片的小应用。

这个小应用的特点是FLEX上传图片之后，后台PHP对图片进行处理转换成一种图片格式，然后把图片路径返回给FLEX显示，FLEX显示之后会在请求后台PHP一次删除图片（其实这里做的复杂了一点，可以直接让PHP把图片转换成一种图片格式之后直接把图片数据返回给FLEX，然后删除图片文件的），在flex中对照片进行处理并截取指定图片数据，把图片数据传递给JS，JS在对图片数据进行处理，这样可以进行表单整体提交，来达到不上传对于的图片文件到服务器浪费服务器的空间。

DEMO：http://www.oursit.com/demo/updatepic_demo/

这里我们先来说下这个DEMO的用法，首先我们点击“浏览“，会弹出一个选择窗口，选择我们的图片并上传。这时候上传图片窗口会显示我们上传的图片（这里上传的图片文件就已经删除了），我们可以使用鼠标拖动图片位置和左下角的进度条可以调整图片大小。我们选择好图片在上传图片中显示的样子之后，只要双击上传图片窗口中的图片，就会把我们想要截取的图片显示在右边的保存图片窗口中，下面的文本框中会出现很多数据，其实这些数据就是保存图片窗口中图片的二进制数据。这样我们就可以提交表单来对图片数据进行处理了。

上面只是说明使用方法，可能大家都会觉得这两个窗口不美观而且太小了，因为我自己项目的局限性的问题请大家原谅:)(什么项目？保密)。

下面我就来介绍一下实现方法

如果要用FLEX制作一个我这样的上传照片应用需要使用到

PNGEncoder;URLUtil; PopUpManager;FileReference;BitmapData这几个类

首先我们介绍上传图片

我们点击浏览按钮的时候会调用下面函数

private function onBrowse():void
{
m_browse.addEventListener(Event.SELECT,onSelect);    //选择好图片调用的事件
var m_filefilter:FileFilter = new FileFilter("Images (*.jpg , *gif , *png)", "*.jpg;*.gif;*.png");  //这里只支持jpg,gif,png图片
m_browse.browse([m_filefilter]);

}

选择好图片然后点击开发的时候会触发 m_browse的Event.SELECT事件,下面请看onSelect函数

private function onSelect(event:Event):void
{
m_browse.removeEventListener(Event.SELECT,onSelect);
m_browse.addEventListener(Event.OPEN,onOpenStart);
m_browse.addEventListener(IOErrorEvent.IO_ERROR,onIOError);
m_browse.addEventListener(ProgressEvent.PROGRESS,onProgress);
m_browse.addEventListener(Event.COMPLETE,onComplete);
m_browse.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,onUploadCompleteData);
var urlrequest:URLRequest;
//Alert.show(URLUtil.getProtocol(Application.application.url));

//下面一块的作用是FLEX在IE和FF调用后台文件的路径不一样，所以这里必须要知道我们要调用的后台PHP文件在哪里，这里的PHP文件和上传图片的SWF文件放在同一目录
if(URLUtil.getProtocol(Application.application.url)=="file")
{
urlrequest = new URLRequest("index.php");
}
else
{
var url:Array = Application.application.url.split("/");
url.pop();
//Alert.show(url.join("/")+"/index.php");
urlrequest = new URLRequest(url.join("/")+"/index.php");
}
var variables:URLVariables = new URLVariables();
variables.width = t_img_Picture.width;
variables.height = t_img_Picture.height;
urlrequest.method = URLRequestMethod.POST;
urlrequest.data = variables;
m_browse.upload(urlrequest,"Pic");
}

这里上传图片完成之后会触发m_browse的DataEvent.UPLOAD_COMPLETE_DATA事件，我们在来看下onUploadCompleteData函数

private function onUploadCompleteData(event:DataEvent):void
{
t_img_Picture.addEventListener(Event.COMPLETE,onPicComplete);    ...</description>
		<link>http://www.oursit.com/archives/111.html</link>
			</item>
</channel>
</rss>
