flashconvert

四月 14th, 2010

为了方便的将日常使用的文件转换为flash文件,以便于传播,花费了几个小时在服务器上搭建好了环境,并编写了相应的脚本来处理对应的文档,功能类似于豆丁这样的网站,访问地址:https://www.libing.name/flashconvert,因为服务器空间有限,不能一直将转换后的文件保留,设置为每小时清理一次,如果有朋友需要转换后下载,请转换完成后马上下载,以防止你转换的文件丢失,目前大体支持以下格式的文件。

* Word、Excel、Power Point、RTF等富文本文件

* Gif、Jpg、Bmp等日常的图形文件转换,其实可以支持更加多的文件和多文件合成单Flash,但因时间有限,且有处也不是非常大,所以暂时没有加入

*Avi、Wav等视频文件,如果不在这些视频里边,建议先转换为这些视频后再进行转换

具体的实现思路就不在写了,都是基于开源软件实现的,因此非常感谢开源给我带来的益处。

希望这个小工具会给你带来一些帮助。呵呵! :)

批量处理多个表

十月 30th, 2009

xaprb上发现的一个工具,很是有用,记录之.

平时在数据库设计的过程中会设计成单个表为分表,比如说POST表最终为一个POST库,这个库有几百个表,对数据进行切分。

在这种情况下,如果添加或者修改字段或者清空数据时就很麻烦了,之前一直是使用自己的脚本进行处理,而Xaprb开发的这个小工具则刚好可以做这个事,呵,以后不用再为类似的事情操心了。

$ wget http://www.maatkit.org/get/mk-find
$ perl mk-find --exec 'TRUNCATE TABLE %D.%N'

%D表示任意数据库
%N表示任意表

对于单个数据库进行操作则如下:

$ wget http://www.maatkit.org/get/mk-find
$ perl mk-find dbname --exec 'TRUNCATE TABLE %D.%N'

ngx_http_request_t是在编写nginx模块中经常用到的结构体,大多的模块的工作都是基于该结构体的,该结构中的request_body是记录请求的数据主体,大部分情况在POST状态时有数据。实际情况下,如果需要HOOK上行的数据,即在提交给后端的SERVER前基于request_body进行处理,那么nginx现有提供的几个模块的注册位置都读取不到request_body,估计可能很多同学都碰到这个问题,我觉得很有必要加上一个阶段,呵呵。

当然nginx给我们提供了相应的函数来做这个事情,这个函数就是ngx_http_read_client_request_body。可采用如下方式进行调用:

static ngx_int_t
ngx_http_x_up_handler(ngx_http_request_t *r)
{
	ngx_int_t rc;
 
	if (r->method == NGX_HTTP_POST)
	{
		ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, "post:%V", &r->uri);
		rc = ngx_http_read_client_request_body(r, ngx_http_x_up_body_handler);
 
		if (rc >= NGX_HTTP_SPECIAL_RESPONSE) 
			return rc;
		else
			return NGX_DECLINED;
	}
	else
		ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, "get:%V", &r->uri);
 
	return NGX_DECLINED;
}
 
 
static void
ngx_http_x_up_body_handler(ngx_http_request_t *r)
{
	if (r->request_body) 
	{
		ngx_chain_t	*cl;
		for (cl = r->request_body->bufs; cl; cl = cl->next) 
		{
			ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, "post request body:%s", cl->buf->pos);
		}
	}
 
}
 
 
static ngx_int_t
ngx_http_x_up_init(ngx_conf_t *cf)
{
	ngx_http_handler_pt        *h;
	ngx_http_core_main_conf_t  *cmcf;
 
	cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
 
	h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
	if (h == NULL) {
		return NGX_ERROR;
	}
 
	*h = ngx_http_x_up_handler;
 
	return NGX_OK;
}

至此,包括header/request_uri/request_body这些HTTP请求中的数据段都能获取了,基于POST的数据写个LB如何? :)

在编写nginx的http的模块的时候,需要在各个阶段对http请求做相应的处理,以达到不同的目的,比如请求发起的时候是否有访问权限、内容生成的时候进行过滤或者其它处理等等。如果在编译nginx模块内注册的处理阶段不正确会导致达不到想要的结果,比如你想处理内容的时候内容实际上这个时候是没有的,如此等等。

在nginx内部定义了多个阶段的类型以满足不同的处理要求(ngx_http_core_module.h中,不同版本不一样):

typedef enum {
    NGX_HTTP_POST_READ_PHASE = 0,
 
    NGX_HTTP_SERVER_REWRITE_PHASE,
 
    NGX_HTTP_FIND_CONFIG_PHASE,
    NGX_HTTP_REWRITE_PHASE,
    NGX_HTTP_POST_REWRITE_PHASE,
 
    NGX_HTTP_PREACCESS_PHASE,
 
    NGX_HTTP_ACCESS_PHASE,
    NGX_HTTP_POST_ACCESS_PHASE,
 
    NGX_HTTP_TRY_FILES_PHASE,
    NGX_HTTP_CONTENT_PHASE,
 
    NGX_HTTP_LOG_PHASE
} ngx_http_phases;

Read the rest of this entry »

nginx做透明代理

九月 10th, 2009

前一阵子在帮一朋友解决问题时,聊及nginx的透明代理的问题,当时就想修改nginx来实现透明代理,幸好一直没有付诸实现,不然又一次重造轮子.

下午在邮件列表中讨论到这个问题,nginx的作者Igor的回答让我茅塞顿开。看以下配置:

user  www;
worker_processes  1;
 
error_log  /var/log/nginx/error.log debug;
#pid        logs/nginx.pid;
 
 
events {
    use epoll;
    worker_connections  1024;
}
 
 
http {
    resolver 202.103.96.68;
    server {
        listen       81;
        location / {
                proxy_pass  http://$http_host$request_uri;
        }
    }
}

享受nginx给我们带来的快乐吧! :)