登录 |

Can nginx be used as a reverse proxy for a backend websocket server?

2010年08月27日 上午 11:31 | 作者:

http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/

http://stackoverflow.com/questions/2419346/can-nginx-be-used-as-a-revers…

http://github.com/slact/nginx_http_push_module

phpdoc安装

2010年08月20日 上午 04:54 | 作者:

安装

[shell]pear install phpDocumentor[/shell]

修改模板字符集为utf-8

[shell]sudo sed -i s/iso-8859-1/utf-8/g `grep -rl iso /usr/share/php/data/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/*`[/shell]

生成HTML文档

[shell]
#查看帮助
phpdoc -h
#生成文档
#phpdoc -d [源代码目录] -t [生成html目录]
phpdoc -d www/chs/branches/war/src/src/class/ -t /var/share/phpdoc/chs[/shell]

Namespaced Events

2010年08月17日 上午 32:38 | 作者:

jQuery provides a system for namespacing bound events for easier triggering and removal. Namespaced events were added in jQuery 1.2.

The Problem

Generally, when binding an event callback, you would do something like:

[js]$(‘.class’).bind(‘click’, function(){});[/js]

However, there is a problem: Sometimes you want to unbind just a specific handler, or group of handlers (like all handlers bound by a plugin).

Unfortunately calling unbind will remove all bound handlers.
[js]
$(‘.class’).unbind(‘click’);[/js]
You could create a reference for the function and use that for both bind and unbind.
[js]
function handler() { … }
$(‘.class’).bind(‘click’, handler);
$(‘.class’).unbind(‘click’, handler);[/js]
But that requires that you maintain a reference to the function for as long as it exists – which isn’t always feasible.

The Solution: Namespaced Events

jQuery provides a concept called namespaced events: Simply add a classname to your event when you declare it. You can then reference that namespaced event both with unbind and trigger.
[js]
$(‘.class’).bind(‘click.namespace’, function(){});
$(‘.class’).trigger(‘click.namespace’);
$(‘.class’).unbind(‘click.namespace’);[/js]
Namespaced events will be unbound or triggered when their namespace is mentioned explicitly, or no namespace is mentioned at all. For example:
[js]
$(‘.class’).bind(‘click.namespace’, function(){});
$(‘.class’).trigger(‘click.namespace’); // Will trigger
$(‘.class’).trigger(‘click’); // Will trigger
$(‘.class’).trigger(‘click.other’); // Won’t trigger[/js]
If you’ve used the same namespace on multiple events, you can easily remove the bindings from all events at once.
[js]
$(‘.class’).bind(‘click.namespace’, function(){});
$(‘.class’).bind(‘blur.namespace’, function(){});
$(‘.class’).unbind(‘.namespace’);[/js]
Namespaces may also come in handy when reinitializing events after an Ajax request:
[js]
$(‘.class’)
.unbind(‘click.namespace’)
.bind(‘click.namespace’, function(){});[/js]
As of jQuery 1.3 you can use multiple namespaces on your events, like so:
[js]
$(‘.class’).bind(‘click.a.b’, function(){});
$(‘.class’).trigger(‘click.a’);
$(‘.class’).unbind(‘click.b’);[/js]

启用open_basedir导致CURL失效的问题

2010年08月17日 上午 25:40 | 作者:

  1. CURLOPT_FOLLOWLOCATION
    Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set
  2. curl_setopt_array()
    如果curl_setopt_array中包含CURLOPT_FOLLOWLOCATION键值,会导致所有options设置失败,让你感觉curl_setopt_array有问题,其实这个函数本身是没问题的。

强制下载文件,正确输出中文名

2010年08月16日 上午 30:25 | 作者:

通杀浏览器:IE、Opear、webkit(Safari / Chrome)、Firefox

// $filename 必须 UTF-8 encode
function header_filename($filename){ 
	$ua = $_SERVER['HTTP_USER_AGENT'];
	if ( strpos($ua, "MSIE") !== false ) {
		$encoded_filename = urlencode($filename);
		$encoded_filename = str_replace("+", "%20", $encoded_filename);
		header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
	} elseif ( strpos($ua, "Firefox") !== false ) {
		header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"');
	} else {
		header('Content-Disposition: attachment; filename="' . $filename . '"');
	}
}

Crontab别忘了设置环境变量!

2010年08月7日 下午 31:08 | 作者:

freebsd下,crontab未继承用户环境变量,需要在crontab头部加入PATH,HOME:

PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
HOME=/home/zhangwei

* * * * * cd ~/script && php hello.php  #如果未设置HOME,那就找不到~,如果未设置PATH,就找不到php

[楚汉]迁移MySQL服务器

2010年08月4日 上午 31:35 | 作者:

文件

/trunk/src/source/base/release.config.class.php  数据库连接配置
/trunk/src/viscera/js/map_chat.js 聊天服务器ip
/trunk/src/viscera/map_state.php 地图引用  ×map_chat.js?[版本号]
/trunk/src/templates/game.html  主界面引用 ×map_chat.js?[版本号]

MySQL同步数据

  1. 将242的数据库导出备份文件到241
  2. 在241启动复制,change master to 242
  3. 等待同步完成,show slave status

具体步骤:http://wiki.onoboss.com/?p=42

SVN同步代码

svn up /home/onoboss/td_chs

TIPS

  1. 新装mysql-server,/etc/mysql/my.cnf 默认配置性能低下,推荐使用下面的:
    [shell][client]
    port            = 3306
    socket          = /var/run/mysqld/mysqld.sock
    [mysqld_safe]
    socket          = /var/run/mysqld/mysqld.sock
    nice            = 0

    [mysqld]
    user            = mysql
    pid-file        = /var/run/mysqld/mysqld.pid
    socket          = /var/run/mysqld/mysqld.sock
    port            = 3306
    basedir         = /usr
    datadir         = /var/lib/mysql
    tmpdir          = /tmp

    skip-external-locking
    skip-name-resolve

    skip-character-set-client-handshake
    init-connect            =’SET NAMES utf8′
    default-character-set   = utf8

    key_buffer              = 1M
    max_allowed_packet      = 16M
    thread_stack            = 192K
    thread_cache_size       = 16

    max_connections         = 512
    myisam-recover          = BACKUP
    back_log                = 1024

    query_cache_size        = 512M
    query_cache_limit       = 32M
    query_cache_min_res_unit = 1k

    join_buffer_size        = 2M

    expire_logs_days        = 10
    max_binlog_size         = 100M

    log_error               = /var/log/mysql/mysql.err
    general_log             = 1
    general_log_file        = /var/log/mysql/mysql.log
    long_query_time         = 1
    log-slow-queries        = /var/log/mysql/mysql-slow.log

    table_open_cache        = 1024
    max_heap_table_size     = 512M
    tmp_table_size          = 512M

    log_bin                 = mysql-bin
    server_id               = 242
    sync_binlog             = 1

    innodb_buffer_pool_size = 1G
    innodb_log_file_size    = 256M
    innodb_log_buffer_size  = 4M
    innodb_flush_log_at_trx_commit  = 2
    innodb_thread_concurrency       = 8
    innodb_flush_method     = O_DIRECT
    #transaction-isolation  = READ-COMMITTED

    [mysqldump]
    quick
    quote-names
    max_allowed_packet      = 16M

    [mysql]

    [isamchk]
    key_buffer              = 16M

    !includedir /etc/mysql/conf.d/[shell/]</li>
    <li>MySQL的错误,默认是保存在系统日志内:/var/log/syslog,使用以下命令查看:
    [shell]tail -f /var/log/syslog | grep mysql[/shell]

  2. Innodb重新设置日志文件大小,会导致Innodb引擎无法启动,需要先删除之前的日志文件:
    [shell]rm /var/lib/mysql/ib_logfile*[/shell]
  3. MySQL默认配置bind:127.0.0.1,导致php无法连接,删除或注释掉!再开启防火墙,禁止外部访问MySQL端口。
    [shell]
    #bind-address           = 127.0.0.1
    [/shell]
  4. 使用 127.0.0.1 连接数据库,localhost 可能连不上!
    241现在就不能使用localhost连接,mysql_connect返回false
  5. 一定要启用二进制日志,并做每日备份!数据丢了,哭都来不及……
    http://yueliangdao0608.blog.51cto.com/397025/118694

腾讯-1亿个数取前1万大的整数-答

2010年08月1日 下午 11:31 | 作者:

还是这位大爷牛:http://lanphaday.bokee.com/5145363.html

单机

1.先取10000个整数,从小到大排好序,形成一个有序队列Q[0~9999]。
2.然后取第10001个整数,是否比Q[0]小?
3.使用插入排序法(算法复杂度log2(N),二分法,10000个,找到自己的插入位置,需要查找14次::2^14=16384)插入到Q中。
4.剔除掉队列中最小的那个数Q[0];
5.重复2-4,直到1亿。

总的计算次数是:

10000 × 14+ (1亿-10000) × 14

14 × 1亿 ≈ 14亿

如果把队列Q增大为16384呢?貌似降低了后期排序的6384*14次计算,可是理论上时间复杂度没什么变化……

将Q增大为2^14,即Q[0~16363]

16384 × 14 + (1亿-16384) × 14

14 × 1亿 ≈ 14亿

随着遍历的进行,这个Q[0~9999]内的min最小数会越来越大,插入排序的概率也会越来越小。这个概率到底是多少呢?

分布式计算?

假设阁下有10000台机器 !

1.把1亿切分成10000×10000的分卷
2.在单台机器完成10000的快速排序(也可一边传输一边使用插入排序……)
3.在总机执行TOP10000的归并排序

1亿+网络传输(1亿)+10000×10000×14+网络传输(1万)+2×10000×14

1亿+14亿+28万+网络传输(1亿零1万) ≈ 计算(14亿零15万)+网络传输(1亿零1万)

快速排序的时间复杂度
最坏:N*(N-1)/2
最好:N*logN

归并排序的时间复杂度
N*logN