UI 设计模式资源库分享

http://www.welie.com http://developer.yahoo.com/ypatterns/ http://designinginterfaces.com/patterns/

40+ Techniques to enhance your php code

The Techniques 1. Do not use relative paths , instead define a ROOT path Its quite common to see such lines : 1 require_once(‘../../lib/some_class.php’); This approach has many drawbacks : It first searches for directories specified in the include paths …

Read more »

Nginx 内置变量

HTTP核心模块支持一些内置变量,变量名与apache里的对应。比如 $http_user_agent,$http_cookie等表示HTTP请求信息的变量。更多变量:$args, 请求中的参数; $content_length, HTTP请求信息里的"Content-Length"; $content_type, 请求信息里的"Content-Type"; $document_root, 针对当前请求的根路径设置值; $document_uri, 与$uri相同; $host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名; $limit_rate, 对连接速率的限制; $request_method, 请求的方法,比如"GET"、"POST"等; $remote_addr, 客户端地址; $remote_port, 客户端端口号; $remote_user, 客户端用户名,认证用; $request_filename, 当前请求的文件路径名 $request_body_file, ?? $request_uri, 请求的URI,带参数; $query_string, 与$args相同; $scheme, 所用的协议,比如http或者是https,比如rewrite  ^(.+)$  $scheme://example.com$1  redirect; $server_protocol, 请求的协议版本,"HTTP/1.0"或"HTTP/1.1"; $server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费); …

Read more »

Twitter Storm 入门指南

通过这个入门指南,你将学会如何创建storm拓扑(topology)和部署拓扑到storm集群。主要使用Java语言,少许例子使用Python说明Storm的多语言特性。 准备工作 入门指南使用了storm-start项目中的例子。建议您克隆此项目并跟随这些例子。阅读安装开发环境和创建新Storm项目,在你的机器上安装好开发环境和项目。 Storm集群组件 Storm集群表面类似Hadoop集群。但在Hadoop上你运行的是”MapReduce jobs”,在Storm上你运行的是”topologies”。”Jobs”和”topologies”是大不同的,一个关键不同是一个MapReduce的Job最终会结束,而一个topology永远处理消息(或直到你kill它)。 Storm集群有两种节点:控制(master)节点和工作者(worker)节点。控制节点运行一个称之为”nimbus”的后台程序,它类似于Haddop的”JobTracker”。Nimbus负责在集群范围内分发代码、为worker分配任务和故障监测。 每个工作者节点运行一个称之”Supervisor”的后台程序。Supervisor监听分配给它所在机器的工作,基于Nimbus分配给它的事情来决定启动或停止工作者进程。每个工作者进程执行一个topology的子集;一个运行中的topology由许多跨多个机器的工作者进程组成。   一个Zookeeper集群负责Nimbus和多个Supervisor之间的所有协调工作。此外,Nimbus后台程序和Supervisor后台程序都是快速失败(fail-fast)和无状态的;所有状态维持在Zookeeper或本地磁盘。这意味着你可以kill -9杀掉nimbus进程和supervisor进程,然后重启,它们将恢复状态并继续工作,就像什么也没发生。这种设计使storm极其稳定。 拓扑(topologies) 在Storm上做实时计算,你需要创建拓扑(topologies)。一个拓扑( topology)是一个计算图。一个拓扑中的每个节点都包含处理逻辑,节点之间的连接表示节点间数据流向。 运行一个拓扑相当简单。首先,打包你的全部代码和依赖文件到一个jar文件。然后,你运行一条命令,如下所示: storm jar all-my-code.jar backtype.storm.MyTopology arg1 arg2  这是运行带arg1 和 arg2参数的 backtype.storm.MyTopology 类,这个类的主要功能是定义拓扑,并提交拓扑到nimbus, storm jar 负责连接nimbus和上传jar包。 由于拓扑定义只是一些Thrift结构体,并且nimbus是一个Thrift服务,所以你可以使用任意语言创建和提交拓扑。使用一种基于JVM的语言创建和提交拓扑,上述例子是最容易的方法。 关于启动/停止拓扑方面的更多信息,请参见生产集群环境运行拓扑。   流 Storm核心的抽象概念是“流”。流是一个无界的连续元组(tuple)。Storm提供用分布式和可靠的方式转换一个流到一个新流的原语(primitive)。例如,你可以转换一个tweets流到一个trending topics流。 Storm为完成流转换提供的基本原语是“spouts”和“bolts“, sputs和bolts提供一些接口供你实现,用来运行你特定应用的业务逻辑。 spout是流的源头。例如,一个spout可能从Kestrel队列读取元组并以流的方式发射它们,一个spout可能连接Twitter API并发射一个tweets流。 bolts消费任意数量输入流,做一些处理,也可能发送新流。复杂的流转换,像从一个tweets流计算trending topics流,需要多个步骤和多个bolts。bolts可以做以下任何事情,包括运行功能,过滤元组,聚合流,连接流,访问数据库,以及更多的事情。 spouts和bolts组成的网被打包到一个拓扑(“topology”),拓扑是storm中最高层次的一个抽象概念,拓扑可以被提交到storm集群执行。一个拓扑是一个流转换图,图中的每个节点是一个spout或bolt。图中的边表示bolt订阅了哪个流。当spout或bolt发送元组到流,它发送元组到每一个订阅了该流的bolt。 拓扑中节点间的连接表示元组在拓扑范围内如何传递。例如,如果从SpoutA到BoltB有一条连接,从SpoutA到BoltC也有一条连接,BoltB到BoltC有一条连接,那么,每当SpoutA发射一个元组,元组会发送到BoltB和BoltC,BoltB发射的所有元组也都会发送到BoltC。 Storm拓扑的每个节点并行运行。你可以指定每个节点的并行数,Storm将通过集群产生与并行数相等数量的线程。 拓扑将一直运行,除非你杀掉它。Storm将重新分配失败任务。另外,即使机器down机并且消息被放弃的情况下,Storm都将保证数据不会丢失。 数据模型 Storm使用元组(tuple)作为它的数据模型。一个元组就是一个值列表(List),列表中的值都有一个名字,并且一个元组的字段(field)可以是任意类型的对象。开箱即用,Storm支持所有基本类型、字符串类型、字节数组作为元组字段的值。为了使用一个其它类型的对象,只需该类型实现序列化。 拓扑的每个节点必须为它发射的元组声明输出字段。例如,这个Bolt声明它发射字段为“double”和“triple”的元组,代码如下所示: public class DoubleAndTripleBolt implements IRichBolt {      private OutputCollectorBase _collector;    …

Read more »

创建Twitter Storm项目

这页概述如何设置Storm项目用于开发。步骤如下: 1. 添加Storm的jar包到classpath。 2. 如果使用多语言,添加多语言目录到classpath。   紧跟着来看看 在Eclipse中如何设置storm-starter项目。   添加Storm的jar包到classpath 开发Storm拓扑需要把storm的jar包添加到classpath。高度推荐使用Maven。这有一个storm项目如何设置pom.xml文件的样例。如果你不想使用Maven,你可以添加storm发行版中的jar到classpath。   Storm-starter使用Leiningen编译和解决依赖关系。你可以通过下载这个脚本安装leiningen,替换成你的路径,然后使用它可执行。想下载Storm的依赖,在项目的根目录,简单地运行lein deps。   要在Eclipse中设置classpath,创建新Java项目,包含源代码路径src/jvm/, 确保lib/和lib/dev/下的所有jar文件都在项目的Referenced Libraries中。   如果使用多语言,添加多语言目录到classpath 如果你用非java语言实现spouts或bolts,然后这些实现应该是在项目的multilang/resources/目录下。由于本地模式Strom需要查找这些文件,resources/目录需要添加到classpath。你在Eclipse中可以添加multilang/为源代码目录。你也许也需要添加multilang/resources为源代码目录。   关于用其它语言编写拓扑的更多信息,请参见Storm使用非JVM语言。   为了在Eclipse中测试正在工作的所有代码,你现在就该运行WordCountTopology.java 文件。你将在控制台看到发送消息持续10秒。   英文:https://github.com/nathanmarz/storm/wiki/Creating-a-new-Storm-project

Twitter Storm 集群安装

这篇文章介绍搭建storm集群并运行的步骤。如果你使用AWS, 那么你可以看一下storm-deploy项目,storm-deploy项目使得在Amazon EC2上安装,配置storm集群完全自动化。这篇文章同时也帮你配置好Ganglia以监控CPU, 硬盘以及网络资源的使用情况。 下面是搭建storm集群的一些主要步骤: 搭建ZooKeeper集群。 在Nimbus和所有工作机器上面安装所有的软件。 在Nimbus和所有工作机器上下载并解压storm的发行版。 对storm.yaml进行一些必要的配置。 使用storm脚本来启动所有的必要的进程(nimbus, supervisor, worker)。 搭建ZooKeeper集群 storm使用zookeeper来协调整个集群, 但是要注意的是storm并不用zookeeper来传递消息。所以zookeeper上的负载是非常低的,单个节点的zookeeper在大多数情况下都已经足够了, 但是如果你要部署大一点的storm集群, 那么你需要的zookeeper也要大一点。关于如何部署zookeeper,可以看这里。 关于如何部署zookeeper有些需要注意的地方: 对zookeeper做好监控非常重要, zookeeper是fail-fast的系统,只要出现什么错误就会退出, 所以一定要监控,更多细节看这里。 一定要配置一个cron job来压缩zookeeper的数据和业务日志。zookeeper自己是不会去压缩这些的,所以你如果不设置一个cron job, 那么你很快就会磁盘不够用了,更多细节看这里。 在Nimbus和工作机器上安装必要软件 接下来需要安装Nimbus和工作机器上面的一些storm所依赖的软件。 ZeroMQ 2.1.7 JZMQ Java 6 Python 2.6.6 unzip 上面同时也列出了storm所依赖的软件的版本, 如果版本不一样可能运行不了。 如果安装ZeroMQ和JZMQ的时候有问题,可以看下安装依赖。 在Nimbus和工作机器上下载并解压storm发行版 接下来, …

Read more »

几种计算机语言的评价[转]

一、C C语言的优点是,运行效率高和接近机器语言。它特别适用于以下几种程序:   1. 对运行速度要求很高的程序。   2. 与操作系统内核关系密切的程序。   3. 必须在多个操作系统上移植的程序。 除此之外,学习C语言有一个最大的理由,那就是它能帮助我们学会,在硬件层次上考虑问题。如果你想以编程作为自己的人生事业,C是一定要学习的。 C的最大缺点是,在编程过程中,你不得不花很多时间,考虑与你要解决的问题完全无关、且非常复杂的硬件资源管理问题。 二、C++ C++在80年代中期推出,支持OO(面向对象编程),原意是作为C语言的取代者。   1. 它也没有解决内存管理问题,虽然比C有所改善。   2. 标准化不成功。各个编译器都只支持自己选择的一个子集,导致跨平台性不如C。   3. 过分的精细和复杂了。C++的复杂度,超过了C和OO的复杂度之和。   4. OO并没有带来多少优势,反而带来了一些副作用,比如厚重的胶合层和庞大的代码体积。 总的来说,C++的优势还是程序效率,以及面向对象编程能力,糟糕之处是它鼓励复杂的设计。 三、Shell Shell程序写起来很容易,对于简单的任务,开发速度很快。 当程序变大时,它就不太适合了,很难维护,而且将变得非常专用(只能在你自己的机器上使用),因为 Shell必须调用各种外部程序,无法保证每一台机器都同样安装了这些程序。 最常见的Shell是bash,它的一些语法规则很混乱,会产生很难阅读的代码。另外,shell只能在Unix上使用,无法跨平台。 Shell的最佳用途如下:   1. 执行简单的系统管理任务。   2. 编写系统启动时的初始化脚本。   3. 作为其他语言开发的程序的包装器。 四、Perl Perl发布于1987年,基本上就是一个增强的Shell。 它的最大长处是强劲的文本处理能力,无以伦比的正则表达式支持,而且有全套Unix API的内部支持,显著减少了对C的需求。 Perl的主要缺点是某些部分设计得非常丑陋,且无法补救,某些部分也过于复杂。当程序规模增大时,必须严格遵守约定,才能保证模块化和设计的可控性,难于维护。 五、Python Python发布于1991年,是一种与C语言紧密集成的脚本语言。 …

Read more »

jQuery的deferred对象详解[转]

jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本。每个版本都会引入一些新功能。今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能—-deferred对象。 51CTO推荐专题:jQuery从入门到精通 这个功能很重要,未来将成为jQuery的核心方法,它彻底改变了如何在jQuery中使用ajax。为了实现它,jQuery的全部ajax代码都被改写了。但是,它比较抽象,初学者很难掌握,网上的教程也不多。所以,我把自己的学习笔记整理出来了,希望对大家有用。 本文不是初级教程,针对的读者是那些已经具备jQuery使用经验的开发者。如果你想了解jQuery的基本用法,请阅读我编写的《jQuery设计思想》和《jQuery最佳实践》。 jQuery的deferred对象详解 一、什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们都不是立即能得到结果的。 通常的解决方法是,为它们指定回调函数(callback)。即事先规定,一旦它们运行结束,应该调用哪些函数。 但是,在回调函数方面,jQuery的功能非常弱。为了改变这一点,jQuery开发团队就设计了deferred对象。 简单说,deferred对象就是jQuery的回调函数解决方案。在英语中,defer的意思是"延迟",所以deferred对象的含义就是"延迟"到未来某个点再执行。 二、ajax操作的链式写法 jQuery的ajax操作,传统写法是这样的: $.ajax({   url: "test.html",   success: function(){   alert("哈哈,成功了!");   },   error:function(){   alert("出错啦!");   }   });  在上面的代码中,$.ajax()接受一个对象参数,这个对象包含两个方法:success方法指定操作成功后的回调函数,error方法指定操作失败后的回调函数。 $.ajax()操作完成后,如果使用的是低于1.5.0版本的jQuery,返回的是XHR对象,你没法进行链式操作;如果高于1.5.0版本,返回的是deferred对象,可以进行链式操作。 $.ajax("test.html")   .done(function(){ alert("哈哈,成功了!"); })   .fail(function(){ alert("出错啦!"); });  可以看到,done()相当于success方法,fail()相当于error方法。采用链式写法以后,代码的可读性大大提高。 三、指定同一操作的多个回调函数 deferred对象的一大好处,就是它允许你自由添加多个回调函数。 …

Read more »

Nginx – 504 Gateway Time-out(网关超时)

引起这样的问题很多数情况下跟nginx本身无关,主要是nginx发送给php-fpm的请求未能正常返回而导致,一般情况下,提交动态请求的时候,nginx会直接把 请求转交给php-fpm,而php-fpm再分配php-cgi进程来处理相关的请求,之后再依次返回,最后由nginx把结果反馈给客户端浏览器。 1)大概分析出了原因,下面做就比较容易了,首先是更改php-fpm的几处配置: 把max_children由之前的32改为现在的64,这样就可以保证有充足的php-cgi进程可以被使用;   2)把request_terminate_timeout由之前的0s改为60s,这样php-cgi进程处理脚本的超时时间就是60秒,可以防止进程都被挂起,提高利用效率。   3)接着再更改nginx的几个配置项,减少FastCGI的请求次数,尽量维持buffers不变: fastcgi_buffers由 464k 改为 2256k;fastcgi_buffer_size 由 64k 改为 128K;fastcgi_busy_buffers_size 由 128K 改为 256K;fastcgi_temp_file_write_size 由 128K 改为 256K。   4)另外,php-fpm的默认静态处理方式会使得php-cgi的进程长期占用内存而无法释放,这也是导致nginx出错的原因之一,因此可以将php-fpm的处理方式改成apache模式。 <value name=”style”>apache-like</value>

深入了解Memcache-附演讲ppt

一直在研究memcache,最近整理成ppt演讲稿。引用的图片等资料均来自互联网。 深入了解Memcache