• 2013-05-30

    Nginx 499 错误码以及 AJAX 调用失败

    Views: 35989 | No Comments

    Nginx 的 499 响应错误码是 Nginx 自定义的, 并不是 HTTP 标准所定义, 499 对于 Nginx, 表示服务器还没有把所有数据发送给客户端(浏览器), 浏览器就主动中断了连接.

    最近, 在一个项目中遇到这个问题. 这是一个 AJAX 功能, 网页在点击 a 标签后, 向服务器发起了一个 AJAX 请求. 这个功能在 Firefox, Chrome 等浏览器中都正常, 在 IE8 下也正常, 但是, 当网页被嵌入到一个软件的浏览器控件里时, 就失败了. 浏览器总是返回 499. 网页代码如下:

    <a class="mybutton">Click Me</a>
    
    $('a.mybutton').click(function(){
        // ajax
    });
    

    后来, 才发现这是低版本 IE 的一个 bug, IE 中断了事件响应函数里的异步请求. 要解决, 必须在事件处理函数里返回 false. 将上面的代码改成如下就正常了:

    <a class="mybutton">Click Me</a>
    
    $('a.mybutton').click(function(){
        // ajax
        return false;
    });
    
    Posted by ideawu at 2013-05-30 11:02:20 Tags: , ,
  • 2013-01-21

    好看的在线图表制作工具

    Views: 30405 | 6 Comments

    经常在网上或者电视里看到那些配色方案很柔和的统计图表, 比如饼图, 柱状图, 曲线图等, 我就想, 这是用什么工具做的呢? 用微软的 Excel 肯定不是, Excel 的图表配色太低级丑陋了.

    有一个叫 Open Flash Chart 的, 配色很一般, 最大的缺点是 Flash 的, 通用性不高.

    还有 Google 出品的 Google Chart Tool, 可惜不是很习惯, 也不怎么流行.

    后来我用了一个叫 flot 的工具, 还有一篇博文介绍了. flot 的配色风格还不错, 是用 JavaScript + HTML 5 技术实现作图的, 甚至连 IE6 也支持. 用了一段时间, 感觉还不错.

    最后, 才发现了大名鼎鼎的 Highcharts, 它的客户包括许多知名的公司和网站, 配色非常棒! 效果如图:

    因为最近要制作 SSDB 的性能对比图, 所以我用 Highcharts(作图) 和 handsontable(表格输入) 做了一个在线统计图表制作工具. 我认为最重要也是最独特最有用的一个功能点是: 支持数据断点! 在很多作图软件中, 出现不连续的点时, 作出的图形就完全错误, 为此我做了一些改进.

    有需要的朋友可以看看: http://charts.udpwork.com/

    Posted by ideawu at 2013-01-21 22:43:34
  • 2012-12-28

    在PHP代码中使用LevelDB

    Views: 47950 | 3 Comments

    众所周知, LevelDB 只是一个 C/C++ 的编程语言库, 所以, PHP是无法直接使用 LevelDB 的. 如果 PHP 项目想要使用 LevelDB, 一种方法是用 C 语言开发, 把 LevelDB 封装成 PHP 的一个模块, 另一种方法是将 LevelDB 封装成一个网络服务器.

    开发 PHP 的 LevelDB 模块的方式适用性不是很高, 因为这种模式限定了必须是单机存储而且必须和 PHP 处在同一台机器. 在代码和数据分离的原则下, 将 LevelDB 封装成一个网络服务是更佳的选择.

    SSDB 就是一个 LevelDB 的服务器(LevelDB Server), 以 LevelDB 作为存储引擎, 支持 PHP/Java/Python/C/C++ 等客户端. 下面是一个 PHP 连接 SSDB, 也即 PHP 使用 LevelDB 的例子:

    <?php
    require_once('SSDB.php');
    $ssdb = new SimpleSSDB('127.0.0.1', 8888);
    $resp = $ssdb->set('key', '123');
    $resp = $ssdb->get('key');
    echo $resp; // output: 123
    

    完整 API 见 SSDB 项目 Wiki.

    SSDB 已经在 IT 牛人博客聚合网站得到应用, 非常稳定. 而且, SSDB 支持在线备份功能, 可以通过网络备份数据, 不再担心数据丢失. SSDB 还支持主从同步复制(Replication), 可用于负载均衡.

    SSDB - LevelDB Server 下载地址: https://code.google.com/p/zdb/downloads/list

    Posted by ideawu at 2012-12-28 12:00:48 Tags: ,
  • 2012-11-27

    tableview的SortView有更新

    Views: 18208 | No Comments
    • 给SortView的排序按钮加上箭头, 且仅当鼠标点击箭头时才排序.
    • 修复了浮点数排序的BUG.

    Demo: http://www.ideawu.net/person/tableview/v1.1/SortView.php

    Posted by ideawu at 2012-11-27 12:36:45 Tags:
  • 2012-10-30

    基于Redis构建系统的经验和教训

    Views: 43453 | 1 Comment

    Redis 是一个非常快速和强大的 Key-Value 存储(持久化)系统, 相对于一般的 NoSQL 存储系统, 它最大的特点是支持丰富的数据结构. 特别是其 zset(sorted set)数据结构, 堪称表达能力最强的结构之一(其它强大的数据结构如 sorted hashmap), 可以直接地表达业务逻辑.

    拿一个 Messaging(消息传递)系统来举例, 收件箱发件箱这样的业务逻辑直接用 zset 存储即可, 因为 zset 的每一个元素都有一个用于排序的权重值, 可以非常方便快速地地进行插入和删除操作. 如果使用纯粹的 KV 系统, 存储列表等非字符串结构的数据将是无尽的痛苦.

    由于 Redis 本身的限制, 它所能处理的数据必须完全放在内存中, 而硬盘上的数据是内存数据的一个镜像, 所以, 限制了它的容量不能超过内存的容量(VM 模式无实际意义, 已在新版本中去除). 当前, 服务器的内存以 32G 为普遍情况, 96G 算较好, 如果一个系统要存储 1T 的数据, 那么必须用上 10 台服务器, 硬件成本非常高 -- 且先不谈由此面临的软件的架构改动. 当前, 1T 的数据只能算零头, 对于一个100万活跃用户的系统, 平均每人每天产生 1K 数据, 便需要 1G 的存储空间, 这仅相当于每个用户每天只发10条微博或者10条聊天信息, 真正流行的系统将远远超过这个数据规模.
    Continue reading »

    Posted by ideawu at 2012-10-30 00:59:04 Tags: , ,
  • 2012-10-08

    JavaScript 设置浏览器标题闪动

    Views: 13888 | 2 Comments

    当有新消息或者网页有Ajax内容变动时, 可以闪动浏览器标题(或者Tab标题), 提示用户.

    <script type="text/javascript">
    <!--
    function BlinkTitle(title, timeout){
    	var self = this;
    	var timer = null;
    	var backup = document.title;
    
    	self.start = function(title, timeout){
    		self.stop();
    
    		if(title != undefined){
    			self.title = title;
    		}
    		self.timeout = timeout == undefined? 600: timeout;
    
    		function blink(){
    			document.title = document.title == backup? self.title : backup;
    		}
    		blink();
    		timer = setInterval(blink, self.timeout);
    	}
    
    	self.stop = function(){
    		if(timer != null){
    			document.title = backup;
    			clearInterval(timer);
    			timer = null;
    		}
    	}
    
    	self.start(title, timeout);
    }
    
    var blink = new BlinkTitle('12345');
    //-->
    </script>
    
    <a onclick="blink.stop()">stop</a>
    
    Posted by ideawu at 2012-10-08 11:46:01
|<<<2345678910>>>| 6/28 Pages, 163 Results.