May 5, 2013
消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ
"\u003cp\u003eRabbitMQ、ActiveMQ和ZeroMQ都是极好的消息中间件,但是我们在项目中该选择哪个更适合呢?很多开发者面临这个烦恼。下面我会对这三个消息中间件做一个比较,看了后你们就心中有数了。\u003c/p\u003e\n\u003cp\u003eRabbitMQ是AMQP协议领先的一个实现,它实现了代理(Broker)架构,意味着消息在发送到客户端之前可以在中央节点上排队。此特性使得RabbitMQ易于使用和部署,适宜于很多场景如路由、负载均衡或消息持久化等,用消息队列只需几行代码即可搞定。但是,这使得它的可扩展性差,速度较慢,因为中央节点增加了延迟,消息封装后也比较大。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/05/rabbitmq.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq.jpg\" alt=\"rabbitmq\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.zeromq.org/\"\u003eZeroMQ\u003c/a\u003e 是一个非常轻量级的消息系统,专门为高吞吐量/低延迟的场景开发,在金融界的应用中经常可以发现它。与RabbitMQ相比,ZeroMQ支持许多高级消息场景,但是你必须实现ZeroMQ框架中的各个块(比如Socket或Device等)。ZeroMQ非常灵活,但是你必须学习它的80页的手册(如果你要写一个分布式系统,一定要阅读它)。\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/05/zmq.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zmq.jpg\" alt=\"zmq\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eActiveMQ居于两者之间,类似于ZemoMQ,它可以部署于代理模式和P2P模式。类似于RabbitMQ,它易于实现高级场 …\u003c/p\u003e"
May 5, 2013
editplus查找替换的正则表达式应用
"\u003cp\u003e表达式 说明\n\\t 制表符.\n\\n 新行.\n. 匹配任意字符.\n| 匹配表达式左边和右边的字符. 例如, “ab|bc” 匹配 “ab” 或者 “bc”.\n[] 匹配列表之中的任何单个字符. 例如, “[ab]” 匹配 “a” 或者 “b”. “[0-9]” 匹配任意数字.\n[^] 匹配列表之外的任何单个字符. 例如, “[^ab]” 匹配 “a” 和 “b” 以外的字符. “[^0-9]” 匹配任意非数字字符.\n* 其左边的字符被匹配任意次(0次,或者多次). 例如 “be*” 匹配 “b”, “be” 或者 “bee”.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e其左边的字符被匹配至少一次(1次,或者多次). 例如 “be+” 匹配 “be” 或者 “bee” 但是不匹配 “b”.\n? 其左边的字符被匹配0次或者1次. 例如 “be?” 匹配 “b” 或者 “be” 但是不匹配 “bee”.\n^ 其右边的表达式被匹配在一行的开始. 例如 “^A” 仅仅匹配以 “A” 开头的行.\ncontentnbsp; 其左边的表达式被匹配在一行的结尾. 例如 “econtentquot; 仅仅匹配以 “e” 结尾的行.\n() 影响表达 …\u003c/li\u003e\u003c/ul\u003e"
April 23, 2013
golang中实现自定义数据类型struct
"\u003cp\u003e可以参考: \u003ca href=\"http://blog.haohtml.com/archives/13556\"\u003egolang中的函数\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003efunc.go\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003epackage\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emain\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003etype\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003estu\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eName\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e//首字母大写,允许其它包直接使用,可以直接使用 stu.Name = \u0026#39;test\u0026#39; 也可以使用 setName和getName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eage\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e//不允许外面的包使用,可以使用 setAge和getAge方法\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eperl\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003e new(\u003cspan style=\"color:#a6e22e\"\u003estu\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eperl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eName\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;zhang\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// age\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003esetAge\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003eperl\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e30\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eage\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003egetAge\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003eperl\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003efmt\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;%v\\n\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#a6e22e\"\u003eage\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e//name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003evar\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ename\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eperl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esetName\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;sun\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003ename\u003c/span\u003e = \u003cspan style=\"color:#a6e22e\"\u003eperl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetName\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003efmt\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;%i\\n\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#a6e22e\"\u003ename\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e//print struct\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003efmt\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;%v\\n\u0026#34;\u003c/span\u003e, …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
April 23, 2013
开发jquery插件
"\u003cp\u003ejquery插件开发文档:\u003c/p\u003e\n\u003cp\u003e以下为一简单的实例:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003echajia.js:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-js\" data-lang=\"js\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e//录入框点击事件\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efn\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ealertWhileClick\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e).\u003cspan style=\"color:#a6e22e\"\u003eclick\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e(){\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewindow.\u003cspan style=\"color:#a6e22e\"\u003econsole\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elog\u003c/span\u003e(\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e‘\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003eexecute\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eclick\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eevent\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e’\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003ealert\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e).\u003cspan style=\"color:#a6e22e\"\u003eval\u003c/span\u003e());\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e});\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewindow.\u003cspan style=\"color:#a6e22e\"\u003econsole\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elog\u003c/span\u003e(\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e‘\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003eok2\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e’\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e//获取页面最大div的最大高度\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efn\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emaxHeight\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e(){\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003evar\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emax\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eeach\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e(){\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewindow.\u003cspan style=\"color:#a6e22e\"\u003econsole\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elog\u003c/span\u003e(\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e‘\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003ea\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e’\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003emax\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e Math.\u003cspan style=\"color:#a6e22e\"\u003emax\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003emax\u003c/span\u003e, \u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e).\u003cspan style=\"color:#a6e22e\"\u003eheight\u003c/span\u003e());\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e});\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emax\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e})(\u003cspan style=\"color:#a6e22e\"\u003ejQuery\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e//插件用法\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efunction\u003c/span\u003e(){\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e‘#\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003elogin_username\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e’\u003c/span\u003e).\u003cspan style=\"color:#a6e22e\"\u003ealertWhileClick\u003c/span\u003e();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003evar\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003etallest\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e‘\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003ediv\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e’\u003c/span\u003e).\u003cspan style=\"color:#a6e22e\"\u003emaxHeight\u003c/span\u003e(); …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
April 9, 2013
使用nohup在后台运行scp
"\u003cp\u003e对于scp的用法见:\u003c/p\u003e\n\u003cp\u003e需要从远程拷贝一个比较大的文件,所以要让SCP在后台运行\u003c/p\u003e\n\u003cp\u003egoogle搜了一下都是说使用ssh的public key让两台机器可以不用密码连接\u003c/p\u003e\n\u003cp\u003e但不是每个人都有这个条件允许两台机器无密码通行的\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e所以可以使用下面的方法实现:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.nohup scp user@server:path/file localpath\u003c/p\u003e\n\u003cp\u003e2.输入密码\u003c/p\u003e\n\u003cp\u003e3.按Ctrl+z挂起当前进程\u003c/p\u003e\n\u003cp\u003e4.使用命令bg让挂起的进程继续运行\u003c/p\u003e"
March 19, 2013
sphinx分布式索引简介
"\u003cp\u003e\u003cstrong\u003esphinx分布式索引原理:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e当searchd收到一个对分布式索引的查询时,它做如下操作:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e连接到远程代理\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e执行查询\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e(在远程代理执行搜索的同时)对本地索引进行查询\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e接收来自远程代理的搜索结果\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将所有结果合并,删除重复项\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将合并后的结果返回给客户端\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e在应用程序看来,普通索引和分布式索引完全没有区别。\u003c/p\u003e\n\u003cp\u003e任一个searchd实例可以同时做为主控端(master,对搜索结果做聚合)和从属端(只做本地\u003c/p\u003e\n\u003cp\u003e搜索)。这有如下几点好处:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e集群中的每台机器都可以做为主控端来搜索整个集群,搜索请求可以在主控端之间获\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e得负载平衡,相当于实现了一种HA(high availability,高可用性),可以应对某个\u003c/p\u003e\n\u003cp\u003e节点失效的情况。\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e如果在单台多CPU或多核机器上使用,一个做为代理对本机进行搜索的searchd实例\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e就可以利用到全部的CPU或者核。\u003c/p\u003e\n\u003cp\u003e更好的HA支持已在计划之中,到时将允许指定哪些代理之间互相备份、有效性检查、跟踪\u003c/p\u003e\n\u003cp\u003e运行中的代理、对检索请求进行负载均衡,等等。\u003c/p\u003e\n\u003cp\u003esphinx分布式索引配置:\u003c/p\u003e\n\u003cp\u003eindex dist1\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003elocal index to be …\u003c/p\u003e"
March 9, 2013
linux下启动mysql提示”mysql deamon failed to start”错误的解决办法
"\u003cp\u003e有台linux服务器,系统为centos系统.\u003c/p\u003e\n\u003cp\u003e描述:\u003c/p\u003e\n\u003cp\u003e网站突然连接不上数据库,于是朋友直接重启了一下服务器。进到cli模式下,执行 service myqsld start 发现还是提示”mysql deamon failed to start”错误信息.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/etc/init.d/mysqld start\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMySQL Daemon failed to start.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eStarting mysqld: [FAILED]\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e查看mysqld的log文件\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#less /var/log/mysqld.log\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/usr/libexec/mysqld: Can’t change dir to ‘XXX’ (Errcode: 13)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e首先是查看数据库日志\u003c/p\u003e\n\u003cp\u003emysqld started\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[Warning] Can’t create test file xxx.lower-test [Warning] Can’t create test file xxx.lower-test …\u003c/p\u003e\u003c/blockquote\u003e"
February 27, 2013
在zend stuido下使用git插件教程
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/archives/13679\"\u003e上一节zend stuido下安装了git软件插件\u003c/a\u003e。下面我们来讲一下git插件的使用方法.\u003c/p\u003e\n\u003cp\u003e由于我们目前已经创建好了git项目。所以这里只介绍直接从现成的git项目仓库导入.\u003c/p\u003e\n\u003cp\u003e选择菜单”文件(File)”-\u0026gt;”Import”\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-1.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zendstudio-git-guide-1.png\" alt=\"zendstudio-git-guide-1\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-2.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zendstudio-git-guide-2.png\" alt=\"zendstudio-git-guide-2\"\u003e\u003c/a\u003e \u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-3.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-3.png\" alt=\"zendstudio-git-guide-3\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e点击”Browse…”选择存放git的目录,然后点击”Search”按钮这样就可以读取一些git配置信息,并在上面显示出来项目目录下的所有文件.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-4.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zendstudio-git-guide-4.png\" alt=\"zendstudio-git-guide-4\"\u003e\u003c/a\u003e \u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-5.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-5.png\" alt=\"zendstudio-git-guide-5\"\u003e\u003c/a\u003e最后一步是选择当前项目的名字,这个随便起的。最后点击”Finish”按钮就可以了。\u003c/p\u003e\n\u003cp\u003e这时在IDE左侧会看到项目名字及项目结构信息。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio-git-guide-6.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zendstudio-git-guide-6.png\" alt=\"zendstudio-git-guide-6\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下面可以修改一个文件,然后在左侧的导航里选择修改的文件,右键点击,选择”Team” 菜单,再选择”Commit”菜单,会弹出一个对话框,在”Commit message”对话框时里输入提示备注信息。点击”Commit”按钮就可以了。\u003c/p\u003e"
February 27, 2013
zend studio 安装git插件
"\u003cp\u003e搞php的用zend studio这个ide工具的开发人员应该不在少数,而对于我们团队开发使用svn和git版本控制软件也特别多的。我们公司团队使用的是zendstuido 10与git这两个软件。但默认情况下zendstuido并不支持git这个插件的,这个时候需要我们来手动安装git插件。方法如下:\u003c/p\u003e\n\u003cp\u003ezend studio菜单:Help -\u0026gt; Install new software…\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio_install_git_plugins.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zendstudio_install_git_plugins.png\" alt=\"zendstudio_install_git_plugins\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/zendstudio_install_git_plugins_detail.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zendstudio_install_git_plugins_detail.png\" alt=\"zendstudio_install_git_plugins_detail\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下一步会提示一些是否授受协议之类的。直接选择 我同意(i agree)就可以了。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/archives/13689\"\u003e下面我们来讲一下如何在zend stuido下使用git插件\u003c/a\u003e\u003c/p\u003e"
February 18, 2013
RESTful Web Service Cookbook 学习笔记
"\u003cp\u003e每个HTTP方法都具有特定的主义.\nGET 的目的是得到一个资源的表述\nPUT 用于建立或更新一个资源\nDELETE 用于删除一个资源\nPOST 用于创建多个新资源或者对资源进行多种其它变更\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e不要将GET方法用于不安全或非幂等操作.因为这样做可能会造成永久性的、不到的、不符合需要的资源改变。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在所有上述方法中,GET被滥用的情况最少,因为GET既安全又幂等。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/crud.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/crud.png\" alt=\"crud\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e参考:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/rest-mi.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rest-mi-20230904211219008.png\" alt=\"rest-mi\"\u003e\u003c/a\u003e\u003c/p\u003e"
February 1, 2013
iptables规则的查看、添加、删除和修改[教程]
"\u003cp\u003e在 Linux 中 iptables 实际上只是一个操作 Linux 内核 Netfilter 子系统的“界面”。顾名思义,Netfilter 子系统的作用,就是 Linux 内核里挡在“网卡”和“用户态进程”之间的一道“防火墙”。 也就是说 \u003ccode\u003eiptables\u003c/code\u003e 工作在用户态,它和我们平时开发的应用程序完全一样的,只是它的作用是用来操作 \u003ccode\u003eNetFilter\u003c/code\u003e 的一个工具。而 \u003ccode\u003eNetFilter\u003c/code\u003e 工作在内核态,它们的关系,可以用如下的示意图来表示:\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/06/4a540c412455b4213552bbb531c535ad.webp\" alt=\"\"\u003e图来自极客时间\u003c/p\u003e\n\u003cp\u003e在 iptables 中存在四表五链的概念。\u003c/p\u003e\n\u003cp\u003e表分别为 \u003ccode\u003efilter\u003c/code\u003e、\u003ccode\u003enat\u003c/code\u003e、\u003ccode\u003eraw\u003c/code\u003e、\u003ccode\u003emangle\u003c/code\u003e ,当数据包抵达防火墙时,将依次应用 raw、mangle、nat、和 filter 表中对应链内的规则,其中表的应用顺序为:raw -\u0026gt; mangle -\u0026gt; nat -\u0026gt; filter,而表中链的规则自上向下依次执行,执行中有可能跳转到其它链中继续执行。 \u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/10/d2b5ca33bd970f64a6301fa75ae2eb22.png\" alt=\"\"\u003eiptables Processing Flowchart\u003c/p\u003e\n\u003cp\u003e如果按七层网络协议的话,则 ipables 中的数据流向为\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/10/d4305170eed2b86a240d044f337dd95c.png\" alt=\"\"\u003e(来自Netfilter 官方的原理 …\u003c/p\u003e"
January 31, 2013
ldconfig命令作用
"\u003cp\u003eldconfig是一个动态链接库管理命令\u003c/p\u003e\n\u003cp\u003e为了让动态链接库为系统所共享,还需运行动态链接库的管理命令–ldconfig\nldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态 链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.\u003c/p\u003e\n\u003cp\u003eldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.\n**ldconfig命令行用法如下: **\nldconfig [-v|–verbose] [-n] [-N] [-X] [-f CONF] [-C CACHE] [-r ROOT] [-l] [-p|–print-cache] [-c FORMAT] [–format=FORMAT] [-V] [- |–help|–usage] path…\u003c/p\u003e\n\u003cp\u003e**ldconfig可用的选项说明如下: **\n(1) -v或–verbose …\u003c/p\u003e"
January 26, 2013
iostat命令
"\u003cp\u003eLinux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。iostat属于sysstat软件包。可以用yum install sysstat 直接安装。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.命令格式:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eiostat[参数][时间][次数]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.命令功能:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e通过iostat方便查看CPU、网卡、tty设备、磁盘、CD-ROM 等等设备的活动情况, 负载信息。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.命令参数:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e-c 显示CPU使用情况\u003c/p\u003e\n\u003cp\u003e-d 显示磁盘使用情况\u003c/p\u003e\n\u003cp\u003e-k 以 KB 为单位显示\u003c/p\u003e\n\u003cp\u003e-m 以 M 为单位显示\u003c/p\u003e\n\u003cp\u003e-N 显示磁盘阵列(LVM) 信息\u003c/p\u003e\n\u003cp\u003e-n 显示NFS 使用情况\u003c/p\u003e\n\u003cp\u003e-p[磁盘] 显示磁盘和分区的情况\u003c/p\u003e\n\u003cp\u003e-t 显示终端和CPU的信息\u003c/p\u003e\n\u003cp\u003e-x 显示详细信息\u003c/p\u003e\n\u003cp\u003e-V 显示版本信息\u003c/p\u003e\n\u003cp\u003e4.使用实例:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e实例1:显示所有设备负载情况\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e命令:\u003c/p\u003e\n\u003cp\u003eiostat\u003c/p\u003e\n\u003cp\u003e输出:\u003c/p\u003e\n\u003cp\u003e[root@CT1186 ~]# iostat\u003c/p\u003e\n\u003cp\u003eLinux …\u003c/p\u003e"
January 25, 2013
分布式TCP压力测试工具 tcpcopy
"\u003cp\u003etcpcopy是一种应用请求复制(基于tcp的packets)工具,其应用领域较广,我们曾经应用于网易的广告投放系统,urs系统,nginx hmux协议开发等系统,避免了上线带来的很多问题。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e总体说来,tcpcopy主要有如下功能:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1)分布式压力测试工具,利用在线数据,可以测试系统能够承受的压力大小(远比ab压力测试工具真实地多),也可以提前发现一些bug\n2)对于后端的短连接,请求丢失率非常低(1/10万),可以应用于热备份\n3)普通上线测试,可以发现新系统是否稳定,提前发现上线过程中会出现的诸多问题,让开发者有信心上线\n4)对比试验,同样请求,针对不同或不同版本程序,可以做性能对比等试验\n5)利用多种手段,构造无限在线压力,满足中小网站压力测试要求\n6)实战演习(架构师必备)\u003c/p\u003e\n\u003cp\u003etcpcopy可以用于实时和离线回放领域,并且tcpcopy支持mysql协议的复制,开源一年以来,功能上越来越完善。\u003c/p\u003e\n\u003cp\u003e如果你对上线没有信心,如果你的单元测试不够充分,如果你对新系统不够有把握,如果你对未来的请求压力无法预测,tcpcopy可以帮助你解决上述难题。 …\u003c/p\u003e"
January 25, 2013
git config –global push.default
"\u003cp\u003e参考教程 \u003ca href=\"http://blog.haohtml.com/archives/10093\"\u003ehttp://blog.haohtml.com/archives/10093\u003c/a\u003e 刚安装的git最新版本,发现有些命令发生了一些变化.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[web@bogon www]$ git push\nwarning: push.default is unset; its implicit value is changing in\nGit 2.0 from ‘matching’ to ‘simple’. To squelch this message\nand maintain the current behavior after the default changes, use:\u003c/p\u003e\n\u003cp\u003egit config –global push.default matching\u003c/p\u003e\n\u003cp\u003eTo squelch this message and adopt the new behavior now, use:\u003c/p\u003e\n\u003cp\u003egit config –global push.default simple\u003c/p\u003e\n\u003cp\u003eSee ‘git help config’ and search for ‘push.default’ for further …\u003c/p\u003e\u003c/blockquote\u003e"