ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>2020国产精品视频,国产精品美女www,蝌蚪视频在线播放http://www.aygfsteel.com/killme2008/category/20771.html生活、程序、未æ?/description>zh-cnThu, 11 Dec 2014 01:02:38 GMTThu, 11 Dec 2014 01:02:38 GMT60Another URL Shortener using NodeJShttp://www.aygfsteel.com/killme2008/archive/2012/11/25/391936.htmldennisdennisSun, 25 Nov 2012 12:31:00 GMThttp://www.aygfsteel.com/killme2008/archive/2012/11/25/391936.html
Is is written in NodeJS,using express.js for MVC framework,and using MySQL for storage and Redis for caching.

A demo online: http://fnil.me/

The project is at https://github.com/killme2008/node-shorten

Feel free to modify and use it.Have fun.

]]>
Ring.velocity:render velocity templates for ring in clojurehttp://www.aygfsteel.com/killme2008/archive/2012/07/18/383354.htmldennisdennisTue, 17 Jul 2012 16:07:00 GMThttp://www.aygfsteel.com/killme2008/archive/2012/07/18/383354.htmlhttp://www.aygfsteel.com/killme2008/comments/383354.htmlhttp://www.aygfsteel.com/killme2008/archive/2012/07/18/383354.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/383354.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/383354.htmlHome: https://github.com/killme2008/ring.velocity

A Clojure library designed to render velocity template for ring in clojure.

Usage

Adds dependency in leiningen project.clj:

  [ring.velocity "0.1.0-SNAPSHOT"] 

Create a directory named templates in your project directory to keep all velocity templates.

Create a template templates/test.vm:

  hello,$name,your age is $age. 

Use ring.velocity in your namespace:

  (use '[ring.velocity.core :only [render]]) 

Use render function to render template with vars:

  (render "test.vm" :name "dennis" :age 29) 

The test.vm will be interpreted equals to:

  hello,dennis,your age is 29. 

Use ring.velocity in compojure:

  (defroutes app-routes      
(GET "/" [] (render "test.vm" :name "dennis" :age 29))
(route/not-found "Not Found"))

Use ring.velocity in ring:

  (use '[ring.util.response])   
(response (render "test.vm" :name "dennis" :age 29))

Custom velocity properties,just put a file named ring-velocity.properties to your classpath or resource paths.The default velocity properties is in src/default/velocity.properties.

License

Copyright © 2012 dennis zhuang[killme2008@gmail.com]

Distributed under the Eclipse Public License, the same as Clojure.

Home: https://github.com/killme2008/ring.velocity



]]>
分布式消息中间äšgMetaq发布1.4.3http://www.aygfsteel.com/killme2008/archive/2012/06/04/379895.htmldennisdennisMon, 04 Jun 2012 02:03:00 GMThttp://www.aygfsteel.com/killme2008/archive/2012/06/04/379895.htmlhttp://www.aygfsteel.com/killme2008/comments/379895.htmlhttp://www.aygfsteel.com/killme2008/archive/2012/06/04/379895.html#Feedback1http://www.aygfsteel.com/killme2008/comments/commentRss/379895.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/379895.html我们在维护的淘宝开源消息中间äšgçš?a style="color: #006699; ">metaqçš?a style="color: #006699; ">github分支åQŒä»Šå¤©å‘布了1.4.2版本åQŒä¸»è¦åšäº†å¦‚下改˜q›ï¼š(x¨¬)

1.支持发送和订阅分离åQŒå¯ä»¥ç»†¾_’度地控制Broker或者某个Topic是否接收消息和接受订阅。服务端æ·ÕdŠ æ–°é€‰é¡¹acceptPublishå’ŒacceptSubscribeã€?br />
2.更友好地关闭BrokeråQŒæ¢³ç†å…³é—­æµ½E‹åƈ通过JMX调用æ–ÒŽ(gu¨©)³•关闭替代原来½Ž€å•çš„killã€?br />
3.æ›´æ–°python客户ç«?/a>åˆ?.2版本åQŒå¯ä»¥é€šè¿‡pip安装:  pip install metaq

4.发布r(ji¨¤)uby语言客户ç«?a style="color: #006699; ">meta-ruby
 0.1版本ã€?br />
5.å…¶ä»–ž®æ”¹˜q›ï¼š(x¨¬)升çñ”geckoåˆ?.1.1版本åQŒå‡¾U§quartzåˆ?.1.4版本åQŒæ·»åŠ é›†æˆæµ‹è¯•å·¥½E‹å’Œå†…部重构½{‰ã€?br />
6.æ–°æ–‡æ¡?a >《ä‹É用log4j扩展发送消息ã€?/a>

½Ž€ä»‹ï¼š(x¨¬)https://github.com/killme2008/Metamorphosis/wiki/介绍
下蝲åQ?a style="color: #006699; ">https://github.com/killme2008/Metamorphosis/downloads

文档åQ?a style="color: #006699; ">https://github.com/killme2008/Metamorphosis/wiki



]]>
clj.monitor : monitoring applications in clojure based on SSHhttp://www.aygfsteel.com/killme2008/archive/2012/05/12/378018.htmldennisdennisSat, 12 May 2012 14:38:00 GMThttp://www.aygfsteel.com/killme2008/archive/2012/05/12/378018.htmlhttp://www.aygfsteel.com/killme2008/comments/378018.htmlhttp://www.aygfsteel.com/killme2008/archive/2012/05/12/378018.html#Feedback5http://www.aygfsteel.com/killme2008/comments/commentRss/378018.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/378018.html
    My weekend project clj.monitor is beta release,it's a clojure DSL for monitoring system and applications based on SSH.

Home:https://github.com/killme2008/clj.monitor

An example:
(ns clj.monitor.example
  (:use [clj.monitor.core]
        [control.core]
        [clj.monitor.tasks]))

;;define a mysql cluster
(defcluster mysql
  :clients [{:user "deploy" :host "mysql.app.com"}])

;;define a monitor for mysql cluster
(defmonitor mysql-monitor
  :tasks [(ping-mysql "root" "password")
            (system-load :5 3)]
  :clusters [:mysql])

;;start monitors
(start-monitors
 :cron "* 0/5 * * * ?"
 :alerts [(mail :from "alert@app.com" :to "yourname@app.com")]
 :monitors [mysql-monitor])

API document: http://fnil.net/clj.monitor

It is just a beta release,if you have any questions or find issues ,please let me know,thanks.

]]>
分布式消息中间äšgMetaq发布1.4.2http://www.aygfsteel.com/killme2008/archive/2012/05/09/377748.htmldennisdennisWed, 09 May 2012 14:47:00 GMThttp://www.aygfsteel.com/killme2008/archive/2012/05/09/377748.htmlhttp://www.aygfsteel.com/killme2008/comments/377748.htmlhttp://www.aygfsteel.com/killme2008/archive/2012/05/09/377748.html#Feedback1http://www.aygfsteel.com/killme2008/comments/commentRss/377748.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/377748.html     我们在维护的淘宝开源消息中间äšgçš?a >metaqçš„github分支åQŒä»Šå¤©å‘布了1.4.2版本åQŒä¸»è¦åšäº†å¦‚下改˜q›ï¼š(x¨¬)

    1.æ·ÕdŠ äº†å¤§é‡çš„ä½¿ç”¨å’ŒåŽŸç†æ–‡æ¡£ï¼Œå‚è§Wikiã€?br />    2.åˆåÆˆtoolså’Œserver-wrapper工程åQŒæä¾›ç»Ÿä¸€çš„脚本来½Ž¡ç†BrokeråQŒç®¡ç†Broker的工作变得非常容易,全部工作都可以通过metaServer.sh的脚本来执行。同时提供了bat启动脚本åQŒç”¨äºŽåœ¨windows上启动Broker做测试ã€?br />    3.新功能:(x¨¬)
   åQ?åQ‰æ–°çš„客æˆïL(f¨¥ng)«¯API用来获取topic的分区列è¡?br />   åQ?åQ‰æ–°çš„客æˆïL(f¨¥ng)«¯API用来获取Broker的统计信æ?br />   åQ?åQ‰å¼‚步复制的Slave可以自动获取Master的配¾|®å˜æ›ß_(d¨¢)¼Œä¾‹å¦‚Master在配¾|®æ–‡ä»¶ä¸­æ–°å¢žæˆ–者删除了topicòq‰™¡ºåˆ©reload热加载成功后åQŒslave可自动复制或者移除变更的topicåQŒæ— éœ€é‡å¯ã€?br />   åQ?åQ‰æ–°çš„统计项目,可以通过'stats config'协议获取Broker的配¾|®æ–‡ä»¶ã€?br />    4.æ·ÕdŠ meta-python™å¹ç›®åQŒä¸€ä¸ªpython的客æˆïL(f¨¥ng)«¯åQŒæš‚时仅支持发送消息功能ã€?br />    5.å…¶ä»–ž®æ”¹˜q›ï¼Œå¦‚统计信息的优化、构建工å…ïL(f¨¥ng)š„æ•´åˆ½{‰ã€?br />
    更详¾l†çš„发行日志è¯ïL(f¨¥ng)œ‹RelaseNotesã€?br />
    下蝲地址åQ? https://github.com/killme2008/Metamorphosis/downloads
    入门指南åQ? ã€?a >如何开å§?/a>ã€?br />    更多文档è¯ïL(f¨¥ng)œ‹Wikiã€?img src ="http://www.aygfsteel.com/killme2008/aggbug/377748.html" width = "1" height = "1" />

]]>
淘宝开源MQ——metaq的详¾l†æ–‡æ¡?/title><link>http://www.aygfsteel.com/killme2008/archive/2012/04/13/374110.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Fri, 13 Apr 2012 14:43:00 GMT</pubDate><guid>http://www.aygfsteel.com/killme2008/archive/2012/04/13/374110.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/374110.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2012/04/13/374110.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/374110.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/374110.html</trackback:ping><description><![CDATA[<br /> <span style="font-size: 10pt; ">    最˜q‘陆陆箋¾l­è¡¥å……了不少</span><a ><span style="font-size: 10pt; ">metaq</span></a><span style="font-size: 10pt; ">的文档,部分是直接从官方文档里摘抄出来,攑֜¨äº?/span><a ><span style="font-size: 10pt; ">github工程的wiki™å?/span></a><span style="font-size: 10pt; ">åQŒæœ‰å…´è¶£äº†è§£ç”šè‡³ä½¿ç”¨meta的可以仔¾l†é˜…è¯ÖM¸‹åQŒä¸€ä»½ç›®å½•:(x¨¬)</span> <div class="wmqeeuq" id="wiki-content" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; background-color: #ffffff; "> <div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; "> <div class="wmqeeuq" id="wiki-body" instapaper_body"="" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; "> <div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; "> <ul style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 30px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; "> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">介绍</span></a></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">基础概念和术语定ä¹?/span></a></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">消息的可靠性、顺序和重复</span></a></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">如何开å§?/span></a></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">½Ž€å•例å­?/span></a></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">服务端配¾|®ç®¡ç?/span></a></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">集群和负载均è¡?/span></a></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">高可用配¾|?异步复制和同步复åˆ?</span></a></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">路线å›?/span></a></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">FAQ</span></a></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">最ä½?j¨©ng)_®žè·?/span></a></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">官方手册(word文档)</span></a></li> </ul> <h1 style="line-height: 1.6; "><span style="font-size: 10pt; ">    Developer</span></h1> <ul style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 30px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; "> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">参与贡献</span></a></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">设计</span></a></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">通讯协议</span></a></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">消息的存å‚?/span></a></li> </ul> <h1 style="line-height: 1.6; "><span style="font-size: 10pt; ">å…Œ™”™å¹ç›®</span></h1> <ul style="margin-top: 15px; margin-right: 0px; margin-bottom: 0px !important; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 30px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; "> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">metamorphosis-example</span></a><span style="font-size: 10pt; ">:½CÞZ¾‹™å¹ç›®</span></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">storm-metamorphosis-spout</span></a><span style="font-size: 10pt; ">:使用metamorphosisä½œäØ“(f¨´)twitter stormçš„spoutæº?/span></li> <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">meta-python</span></a><span style="font-size: 10pt; ">: metamorphosisçš„python语言客户端。目前只支持发送消息功能ã€?/span></li> </ul> </div> </div> </div> </div> <div class="wmqeeuq" id="gollum-footer" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; line-height: 19px; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; background-color: #ffffff; "></div>     <br /> <div><span style="font-size: 10pt; ">    后箋˜q˜ä¼š(x¨¬)¾l§ç®‹è¡¥å……ã€?/span><br /> </div><img src ="http://www.aygfsteel.com/killme2008/aggbug/374110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2012-04-13 22:43 <a href="http://www.aygfsteel.com/killme2008/archive/2012/04/13/374110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>淘宝开源metaqçš„python客户ç«?/title><link>http://www.aygfsteel.com/killme2008/archive/2012/03/21/372405.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Wed, 21 Mar 2012 11:08:00 GMT</pubDate><guid>http://www.aygfsteel.com/killme2008/archive/2012/03/21/372405.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/372405.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2012/03/21/372405.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/372405.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/372405.html</trackback:ping><description><![CDATA[    前面一½‹‡åšå®¢ä»‹¾läº†æˆ‘在github上的一ä¸?a >metaq</a>分支åQŒä»Šå¤©ä¸‹åˆå†™äº†ä¸ªmetaqçš„python客户端,目前仅支持发送消息功能,不过麻雀虽小åQŒäº”脏俱全,客户端和zookeeper的交互和˜qžæŽ¥½Ž¡ç†ä¹‹ç±»éƒ½è¿˜å…·å¤‡åQŒä¸å‡ºæ„å¤–,我们ä¼?x¨¬)首先用上。第一‹Æ¡æ­£å„¿å…«¾låœ°å†™python代码åQŒå†™çš„不好的地方请尽½Ž¡æ‹ç –,多谢ã€?br />    ™å¹ç›®å«meta-pythonåQŒä»ç„¶æ”¾åœ¨github上:(x¨¬)<a >https://github.com/killme2008/meta-python<br /><br /></a>    使用需要先安装zkpython˜q™ä¸ªåº“,具体安装<a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; color: #4183c4; text-decoration: none; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; background-color: #ffffff; ">˜q™ç¯‡åšå®¢</a>åQŒä‹É用很½Ž€å•,发送消息:(x¨¬)<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    <span style="color: #0000FF; ">from</span> metamorphosis <span style="color: #0000FF; ">import</span> Message,MessageProducer,SendResult<br />    p=MessageProducer(<span style="color: #800000; ">"</span><span style="color: #800000; ">topic</span><span style="color: #800000; ">"</span>)<br />    message=Message(<span style="color: #800000; ">"</span><span style="color: #800000; ">topic</span><span style="color: #800000; ">"</span>,<span style="color: #800000; ">"</span><span style="color: #800000; ">message body</span><span style="color: #800000; ">"</span>)<br />    <span style="color: #0000FF; ">print</span> p.send(message)<br />    p.close()</div><br />    <div style="display: inline-block; ">MessageProducerž®±æ˜¯æ¶ˆæ¯å‘送者,它的构造函数接受至ž®‘一个topicåQŒé»˜è®¤çš„zk_servers为localhost:2181åQŒå¯ä»¥é€šè¿‡zk_servers参数指定你的zookeeper集群:<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->p=MessageProducer(<span style="color: #800000; ">"</span><span style="color: #800000; ">topic</span><span style="color: #800000; ">"</span>,zk_servers=<span style="color: #800000; ">"</span><span style="color: #800000; ">192.168.1.100:2191,192.168.1.101:2181</span><span style="color: #800000; ">"</span>)</div><span style="background-color: #eeeeee; "><br /></span><span style="background-color: #eeeeee; ">更多参数è¯ïL(f¨¥ng)›´æŽ¥çœ‹æºç å§ã€‚一个本机的性能‹¹‹è¯•åQˆmeta和客æˆïL(f¨¥ng)«¯éƒ½è·‘在我的机器上åQŒæœºå™¨æ˜¯Mac MC700åQŒosx 10.7åQŒç£ç›˜æ²¡æœ‰å‡¾U§è¿‡åQ‰ï¼š(x¨¬)<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">from</span> metamorphosis <span style="color: #0000FF; ">import</span> Message,MessageProducer<br /><span style="color: #0000FF; ">from</span> time <span style="color: #0000FF; ">import</span> time<br />p=MessageProducer(<span style="color: #800000; ">"</span><span style="color: #800000; ">avos-fetch-tasks</span><span style="color: #800000; ">"</span>)<br />message=Message(<span style="color: #800000; ">"</span><span style="color: #800000; ">avos-fetch-tasks</span><span style="color: #800000; ">"</span>,<span style="color: #800000; ">"</span><span style="color: #800000; ">http://www.taobao.com</span><span style="color: #800000; ">"</span>)<br />start=time()<br /><span style="color: #0000FF; ">for</span> i <span style="color: #0000FF; ">in</span> range(0,10000):<br />    sent=p.send(message)<br />    <span style="color: #0000FF; ">if</span> <span style="color: #0000FF; ">not</span> sent.success:<br />        <span style="color: #0000FF; ">print</span> <span style="color: #800000; ">"</span><span style="color: #800000; ">send failed</span><span style="color: #800000; ">"</span><br />finish=time()<br />secs=finish-start<br /><span style="color: #0000FF; ">print</span> <span style="color: #800000; ">"</span><span style="color: #800000; ">duration:%s seconds</span><span style="color: #800000; ">"</span> % (secs)<br /><span style="color: #0000FF; ">print</span> <span style="color: #800000; ">"</span><span style="color: #800000; ">tps:%s msgs/second</span><span style="color: #800000; ">"</span> % (10000/secs)<br />p.close()</div><span style="background-color: #eeeeee; "><br /> ¾l“æžœåQ?br /><br /><br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->duration:1.85962295532 seconds<br />tps:5377.43415749 msgs/second</div></div><img src ="http://www.aygfsteel.com/killme2008/aggbug/372405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2012-03-21 19:08 <a href="http://www.aygfsteel.com/killme2008/archive/2012/03/21/372405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xmemcached发布1.3.6http://www.aygfsteel.com/killme2008/archive/2012/03/19/372179.htmldennisdennisMon, 19 Mar 2012 02:51:00 GMThttp://www.aygfsteel.com/killme2008/archive/2012/03/19/372179.htmlhttp://www.aygfsteel.com/killme2008/comments/372179.htmlhttp://www.aygfsteel.com/killme2008/archive/2012/03/19/372179.html#Feedback3http://www.aygfsteel.com/killme2008/comments/commentRss/372179.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/372179.html    开源的memcached Java客户ç«?#8212;—xmemcached发布1.3.6版本ã€?/p>

    主要改进如下åQ?/strong> 

1.  ä¸ºMemcachedClientBuilderæ·ÕdŠ ä¸¤ä¸ªæ–°æ–¹æ³•ç”¨äºŽé…¾|®ï¼š(x¨¬)

public void setConnectTimeout(long connectTimeout);  
public void setSanitizeKeys(boolean sanitizeKeys);

 

2.  ç”¨äºŽhibernateçš„XmemcachedClientFactorydæ·ÕdŠ äº†connectTimeout属性,感谢¾|‘友 Boli.Jiangçš„èµA(ch¨³)献ã€?/span>

3.  æ·ÕdŠ æ–°çš„æžšä‹D¾cÕdž‹ net.rubyeye.xmemcached.transcoders.CompressionModeåQŒç”¨äºŽæŒ‡å®šTranscoder的压¾~©ç±»åž‹ï¼Œé»˜è®¤æ˜¯ZIP压羃åQŒå¯é€‰æ‹©GZIP压羃。Transcoder接口æ·ÕdŠ setCompressionModeæ–ÒŽ(gu¨©)³•ã€?/p>

4.  ä¿®æ”¹å¿ƒèŸ©è§„则åQŒåŽŸæ¥æ˜¯åœ¨è¿žæŽ¥ç©ºé—²çš„æ—¶å€™å‘èµ·å¿ƒè·»I¼ŒçŽ°åœ¨å˜æˆå›ºå®šæ¯éš”5¿U’发起一‹Æ¡å¿ƒè·Ïx£€‹¹‹è¿žæŽ¥ã€?/p>

5.  ä¿®æ”¹é»˜è®¤å‚æ•°åQŒé»˜è®¤ç¦ç”¨nagle½Ž—法åQŒé»˜è®¤å°†æ‰šw‡get的合òq¶å› å­ä¸‹é™åˆ°50ã€?/p>

6.  ä¿®å¤bug和改˜q›ï¼ŒåŒ…括åQ?a target="_blank" style="color: #006699; ">161ã€?a target="_blank" style="color: #006699; ">163ã€?a target="_blank" style="color: #006699; ">165ã€?a target="_blank" style="color: #006699; ">169ã€?a target="_blank" style="color: #006699; ">172ã€?73ã€?a target="_blank" style="color: #006699; ">176ã€?a target="_blank" style="color: #006699; ">179å’?a target="_blank" style="color: #006699; ">180ã€?/p>

 

™å¹ç›®ä¸»é¡µåQ?a target="_blank" style="color: #006699; ">http://code.google.com/p/xmemcached/

™å¹ç›®æ–‡æ¡£åQ?a target="_blank" style="color: #006699; ">http://code.google.com/p/xmemcached/w/list

下蝲åQ?a target="_blank" style="color: #006699; ">http://code.google.com/p/xmemcached/downloads/list

源码åQ?a target="_blank" style="color: #006699; ">https://github.com/killme2008/xmemcached

 

Maven依赖åQ?/strong>

 <dependency>  

    <groupId>com.googlecode.xmemcached</groupId>  
    <artifactId>xmemcached</artifactId>  
    <version>1.3.6</version>  
</dependency> 

    最后感谢所有提出issue和改˜q›æ„è§çš„æœ‹å‹ä»¬ã€?img src ="http://www.aygfsteel.com/killme2008/aggbug/372179.html" width = "1" height = "1" />

]]>
Clojure-Control 0.3.0 is outhttp://www.aygfsteel.com/killme2008/archive/2012/02/18/370260.htmldennisdennisSat, 18 Feb 2012 14:08:00 GMThttp://www.aygfsteel.com/killme2008/archive/2012/02/18/370260.htmlhttp://www.aygfsteel.com/killme2008/comments/370260.htmlhttp://www.aygfsteel.com/killme2008/archive/2012/02/18/370260.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/370260.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/370260.htmlClojure-control is a clojure DSL for system admin and deployment with many remote machines via ssh. 
    
    I am pleased to annoucment that clojure-control 0.3.0 is out.It adds some  powerful features in this release ,includes:
  • ssh and scp both have a new option :sudo  to be executed as root on remote machines,for example:
    (ssh "/etc/init.d/ssh restart" :sudo true)
  • scp has a new  option :mode to change file modes copied from local: 
    (scp "start.sh" "/etc/init.d/start.sh" :sudo true :mode 755)
  • A  new function "exists?" to test if a file exists on remote machines:  
    (if (not (exists? (str "/home/deploy/.ssh")))
          (ssh (sudo (str "mkdir -p /home/deploy/.ssh"))))
  • Call other task in deftask with "call" function:
    (deftask :ps "A task to grep process" [process]
            (ssh (str "ps aux | grep " process)))
    (deftask :start_ha []
            (ssh "/etc/init.d/haproxy start")
            (call :ps "haproxy"))
  • A new function "append" to append a line to a file on remote machines:
    (ssh (append "/etc/hosts" "192.168.1.100 web" :sudo true))
  • A new function "sed" to replace lines in a file on remote machines,and comm/uncomm to comment/uncomment a line in a file:
          (sed <file> <before> <after> :flags <flags> :limit <limit> :backup <backup>)
    

    Equivalent to

          sed -i<backup> -r -e "<limit> s/<before>/<after>/<flags>g <filename>"
  • Limits max output line to 10000.
  • Adds more documents in wiki: https://github.com/killme2008/clojure-control/wiki 
   You can install the new version by :
    lein plugin install control 0.3.0           #For clojure 1.3
    lein plugin install control 0.3.1           #For clojure 1.2

    More information please visit it on github: https://github.com/killme2008/clojure-control


]]>
Clojure世界åQ?STM的统è®?/title><link>http://www.aygfsteel.com/killme2008/archive/2012/02/09/369694.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Thu, 09 Feb 2012 12:55:00 GMT</pubDate><guid>http://www.aygfsteel.com/killme2008/archive/2012/02/09/369694.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/369694.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2012/02/09/369694.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/369694.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/369694.html</trackback:ping><description><![CDATA[    òq´å‰ä¸€½‹‡blog提过åQŒå†™äº†ä¸€ä¸ªstm-profiler用于¾lŸè®¡clojure STM的运行状况,攑֜¨äº†github上:(x¨¬)<br /> <a >https://github.com/killme2008/stm-profiler</a><br /> <br />    STM的事务在遇到写冲½Hï¼ˆå¤šä¸ªäº‹åŠ¡å†™åŒä¸€ä¸ªref的时候)(j¨ª)ž®×ƒ¼š(x¨¬)回滚事务òq‰™‡è¯•,通过stm-profiler你可以查看事务的重试‹Æ¡æ•°åQŒé‡è¯•原因,以及(qi¨¢ng)每个referenceçš„ä‹É用情å†üc(di¨£n)€‚ä‹É用很½Ž€å•,在leinçš„project.clj引用stm-profiler:<br /> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000; ">[stm-profiler "1.0.2-SNAPSHOT"]</span></div> <br /> 注意åQŒç›®å‰stm profiler仅支持clojure 1.3ã€?br /> <br /> 我们写一个简单例子:(x¨¬)<br /> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">(use 'stm)<br /> (def a (ref 1))<br /> (def b (ref 2))<br /> <br /> (dotimes [_ 100] (future (dosync (alter a + 1) (alter b - 1))))<br /> (Thread/sleep 1000)<br /> (prn @a)<br /> (prn @b)<br /> (Thread/sleep 1000)<br /> (prn "stm statistics" (stm-stats))<br /> (prn "reference a statistics" (ref-stats a))<br /> (prn "reference b statistics" (ref-stats b))<br /> </span></div> <br /> 定义了两个refåQšaå’ŒbåQŒç„¶åŽç”¨future启动100个线½E‹åƈ发地发è“v同一个事务操作,对a加一åQŒå¯¹b减一。最后打印aå’Œbçš„å€û|¼Œä½¿ç”¨stm-stats函数获取stmçš„ç»Ÿè®¡ä¿¡æ¯åÆˆæ‰“å°åQŒä‹É用ref-stats获取aå’Œb两个referenceçš„ç»Ÿè®¡ä¿¡æ¯åÆˆæ‰“å°ã€?br /> <br /> ˜qè¡Œ˜q™ä¸ªä¾‹å­åQŒåœ¨å¯åŠ¨çš„æ—¶å€™ä¼š(x¨¬)有些警告信息åQŒå¿½ç•¥å³å¯ï¼ˆä¸»è¦æ˜¯å› ä¸ºstm profiler重新定义了一些跟STM相关的函数和宏,如dosync½{‰ï¼Œä½†æ˜¯ä»…仅是添加了¾lŸè®¡åŠŸèƒ½åQŒåƈ没有修改他们原本的功能)(j¨ª)ã€?br /> <br /> 在我机器上的一‹Æ¡è¾“出:(x¨¬)<br /> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000; ">101<br /> -98<br /> "stm statistics" {"(alter a + 1)(alter b - 1)" {:not-running 11, :average-retry 5, :total-cost 1233, :get-fault 44, :barge-fail 224, :change-committed 227, :total-times 100, :average-cost 12}}<br /> "reference a statistics" {"(alter a + 1)(alter b - 1)" {:alter 609, :get-fault 44, :barge-fail 224, :change-committed 227}}<br /> "reference b statistics" {"(alter a + 1)(alter b - 1)" {:alter 114, :not-running 11}}</span></div> <br /> aå’Œb的结果都没问题。重点看打印的统计信息,(stm-stats)的输出结果是åQ?br /> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000; ">{"(alter a + 1)(alter b - 1)" {:not-running 11, :average-retry 5, :total-cost 1233, :get-fault 44, :barge-fail 224, :change-committed 227, :total-times 100, :average-cost 12}}</span></div> <br /> ˜q™ä¸ª¾l“果是一个map,key是事务的formåQŒè€Œvaluež®±æ˜¯è¯¥form的统计信息,也是一个mapåQŒå…·ä½“各™å¹çš„含义如下åQ?br /> <table bgcolor="#C0C0C0" border="3" bordercolor="#000000" cellpadding="2" cellspacing="2" height="102" width="722"> <tbody> <tr> <td> total-cost<br /> </td> <td> 所有事务的总耗时<br /> </td> <td> 100个事务耗时1233毫秒<br /> </td> </tr> <tr> <td> total-times<br /> </td> <td> 事务˜qè¡Œ‹Æ¡æ•°<br /> </td> <td> 100‹Æ?br /> </td> </tr> <tr> <td> average-cost<br /> </td> <td> òq›_‡æ¯ä¸ªäº‹åŠ¡è€—æ—¶<br /> </td> <td> òq›_‡ä¸€ä¸ªäº‹åŠ¡è€—æ—¶12毫秒<br /> </td> </tr> <tr> <td>average-retry<br /> </td> <td>òq›_‡æ¯ä¸ªäº‹åŠ¡çš„é‡è¯•æ¬¡æ•?/td> <td> òq›_‡æ¯ä¸ªäº‹åŠ¡é‡è¯•äº?‹Æ¡æ‰æˆåŠŸ</td> </tr> <tr> <td>not-running</td> <td> å½“前事务不处于running状态,可能是被其他事务打断åQˆbarge)åQŒéœ€è¦é‡è¯?/td> <td> å› äØ“(f¨´)not-running的原因重试了11‹Æ?/td> </tr> <tr> <td>get-fault<br /> </td> <td> è¯Õd–ref值的时候没有找到read point之前的å€û|¼Œè¢«è®¤ä¸ºæ˜¯ä¸€‹Æ¡è¯»é”™è¯¯åQŒéœ€è¦é‡è¯?br /> </td> <td> å› äØ“(f¨´)读ref错误重试äº?4‹Æ?br /> </td> </tr> <tr> <td>barge-fail</td> <td> æ‰“断其他事务å¤ÞpÓ|‹Æ¡æ•°åQŒéœ€è¦é‡è¯?/td> <td> ž®è¯•打断其他事务å¤ÞpÓ|而重试了224‹Æ?/td> </tr> <tr> <td>change-committed</td> <td> åœ¨æœ¬äº‹åŠ¡read point之后有ref倯DŽ·å¾—æäº¤ï¼Œåˆ™éœ€è¦é‡è¯?br /> </td> <td> å› äØ“(f¨´)ref倯D¢«å…¶ä»–事务提交而重试了227‹Æ?/td> </tr> </tbody> </table> <br />     从输出结果来看,˜q™ä¹ˆ½Ž€å•的一个事务操作,每次事务要成功åã^均都需要经˜q?‹Æ¡çš„重试åQŒæœ€å¤§çš„原因是因为ref的值在事务中被其他事务更改了,或者尝试打断其他正在运行的事务å¤ÞpÓ|而重试。关于clojure STM的具体原理推荐看˜q™ç¯‡æ–‡ç« ã€?a >Software transactional memory</a>》。STM不是完美的,事务重试和保存每个reference的历史版本的代ä­h(hu¨¢n)都不低ã€?br /><br />    再看<span style="color: #000000;">(ref-stats a)的输出:(x¨¬)<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{"(alter a + 1)(alter b - 1)" {:alter 609, :get-fault 44, :barge-fail 224, :change-committed 227}}</span></div>    可以看到a在所有事务中的统计信息,˜q”回的结果同æ äh˜¯ä¸ªmapåQŒkey是ä‹É用了a的事务,value是具体的¾lŸè®¡ä¿¡æ¯ã€‚各™å¹çš„含义¾cÖM¼¼ä¸Šè¡¨åQŒä¸˜q‡è¿™é‡Œç²¾¼‹®åˆ°äº†å…·ä½“çš„reference。其中alter™åÒŽ(gu¨©)˜¯æŒ‡å¯¹a调用alter函数äº?09‹Æ¡ã€‚ref-statsä¼?x¨¬)输出所有在事务中调用了a的函数的调用‹Æ¡æ•°ã€?br /><br />    通过stm profiler你可以分析具体每个事务的执行状况åQŒç”šè‡Ïx¯ä¸ªreference的运行状况,查找热点事务和热点reference½{‰ã€‚stm-profiler˜q˜ä¸å®Œå–„åQŒç›®å‰è¿˜ä¸æ”¯æŒ?.2åQ?.4‹¹‹è¯•是可以的åQ‰ã€‚希望有兴趣的朋友加入进来一起完善ã€?br /><br />转蝲è¯äh³¨æ˜Žå‡ºå¤„:(x¨¬)<a id="Editor_Edit_hlEntryLink" title="view: Clojure世界åQ?STM的统è®? href="../archive/2012/02/09/369694.html" target="_blank">http://www.aygfsteel.com/killme2008/archive/2012/02/09/369694.html</a><img src ="http://www.aygfsteel.com/killme2008/aggbug/369694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2012-02-09 20:55 <a href="http://www.aygfsteel.com/killme2008/archive/2012/02/09/369694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>storm集群的监æŽ?/title><link>http://www.aygfsteel.com/killme2008/archive/2011/12/01/365329.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Thu, 01 Dec 2011 13:02:00 GMT</pubDate><guid>http://www.aygfsteel.com/killme2008/archive/2011/12/01/365329.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/365329.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2011/12/01/365329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/365329.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/365329.html</trackback:ping><description><![CDATA[<br />    所谓兵马未动,¾_®è‰å…ˆè¡ŒåQŒå‡†å¤‡å°†<a >storm</a>用在某个™å¹ç›®ä¸­åšå®žæ—¶æ•°æ®åˆ†æžã€‚æ— è®ÞZ“Q何系¾lŸï¼Œä¸€å®šè¦æœ‰ç›‘控系¾lŸåƈ存,当故障发生的时候你能第一个知道,而不是让别äh告诉你,那处理故障就很被动了ã€?br /><br />    因此我写了这么个™å¹ç›®åQŒå–名叫storm-monitoråQŒæ”¾åœ¨äº†githubä¸?br /><br />     <a >https://github.com/killme2008/storm-monitor</a><br /><br />    主要功能如下åQ?br />1.监控supervisor数目是否正确åQŒå½“supervisor挂掉的时候会(x¨¬)发送警告ã€?br />2.监控nimbus是否正常˜qè¡ŒåQŒmonitorä¼?x¨¬)尝试连接nimbusåQŒå¦‚æžœè¿žæŽ¥å¤±è´¥å°±è®¤äØ“(f¨´)nimbus挂掉ã€?br />3.监控topology是否正常˜qè¡ŒåQŒåŒ…括它是否正常部çÖvåQŒæ˜¯å¦æœ‰˜qè¡Œä¸­çš„ä»ÕdŠ¡ã€?br /><br />    当故障发生的时候通过alarmæ–ÒŽ(gu¨©)³•警告用户åQŒå¼€æ”‘Ö‡ºåŽÈš„只是½Ž€å•åœ°æ‰“æ—¥å¿—ã€‚å› ä¸ºæ¯ä¸ªå…¬å¸çš„å‘Šè­¦æŽ¥å£ä¸ä¸€æ øP¼Œæ‰€ä»¥ä½ éœ€è¦è‡ªå·±æ‰©å±•,修改alarm.clj卛_¯ã€‚我们这儿就支持旺旺告警和手机短信告警ã€?br /><br />    基本的原理很½Ž€å•,对supervisorå’Œtopology的监控是通过zookeeper来间接地监控åQŒé€šè¿‡å®šæœŸæŸ¥çœ‹path是否存在。对nimbus的监控是每次起一个短˜qžæŽ¥˜qžä¸ŠåŽ»ï¼Œ˜qžä¸ä¸ŠåŽ»åŒ™®¤ä¸ºæŒ‚掉ã€?br /><br />    整个™å¹ç›®ä¹Ÿæ˜¯ç”¨clojure写。你的机器需要安è£?a >lein</a>å’?a >exec</a>插äšgåQŒç„¶åŽå°†ä½ çš„storm.yaml拯‚´åˆ°conf目录下,¾~–辑monitor.yaml讑֮šç›‘控参数如检查间隔等åQŒæœ€åŽå¯åЍstart.sh脚本卛_¯ã€‚默认日志输出在logs/monitor.logã€?br /><img src ="http://www.aygfsteel.com/killme2008/aggbug/365329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2011-12-01 21:02 <a href="http://www.aygfsteel.com/killme2008/archive/2011/12/01/365329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>clj-xmemcached: memcached client for clojurehttp://www.aygfsteel.com/killme2008/archive/2011/10/30/362315.htmldennisdennisSun, 30 Oct 2011 05:03:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/10/30/362315.htmlhttp://www.aygfsteel.com/killme2008/comments/362315.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/10/30/362315.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/362315.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/362315.html

clj-xmemcached

    Clj-xmemcached is an opensource memcached client for clojure wrapping xmemcached. Xmemcached is an opensource high performance memcached client for java.

Leiningen Usage

To include clj-xmemcached,add:

     [clj-xmemcached "0.1.1"]

to your project.clj.

Usage

Create a client

(use [clj-xmemcached.core])
(def client (xmemcached 
"host:port"))
(def client (xmemcached 
"host1:port1 host2:port2" :protocol "binary"))

Then we create a memcached client using binary protocol to talk with memcached servers host1:port1 and host2:port2. Valid options including:

  :name       Client's name
  :protocol  Protocol to talk with memcached,a string value in text,binary or kestrel,default is text protocol.
  :hash          Hash algorithm,a string value in consistent or standard,default is standard hash.
  :timeout    Operation timeout in milliseconds,default is five seconds.
  :pool          Connection pool size,default is one.

Store items


(xset client "key" "dennis")
(xset client 
"key" "dennis" 100)
(xappend client 
"key" " zhuang")
(xprepend client 
"key" "hello,")

The value 100 is the expire time for the item in seconds.Store functions include xset,xadd,xreplace,xappend and xprepend.Please use doc to print documentation for these functions.

Get items

(xget client "key")
(xget client 
"key1" "key2" "key3")
(xgets client 
"key")

xgets returns a value including a cas value,for example:

  {:value "hello,dennis zhuang", :class net.rubyeye.xmemcached.GetsResponse, :cas 396}

And bulk get returns a HashMap contains existent items.

Increase/Decrease numbers


(xincr client "num" 1)
(xdecr client 
"num" 1)
(xincr client 
"num" 1 0)

Above codes try to increase/decrease a number in memcached with key "num",and if the item is not exists,then set it to zero.

Delete items

(xdelete client "num")

Compare and set

(xcas client "key" inc)

We use inc function to increase the current value in memcached and try to compare and set it at most Integer.MAX_VALUE times. xcas can be called as:

 (xcas client key cas-fn max-times)

The cas-fn is a function to return a new value,set the new value to

(cas-fn current-value)

Shutdown

(xshutdown client)

Flush

(xflush client)
(xflush client (InetSocketAddress. host port))

Statistics

(xstats client)

Example

Please see the example code in example/demo.clj

License

Copyright (C) 2011-2014 dennis zhuang[killme2008@gmail.com]

Distributed under the Eclipse Public License, the same as Clojure.



]]>
我写的这些opensource™å¹ç›®http://www.aygfsteel.com/killme2008/archive/2011/10/09/360311.htmldennisdennisSun, 09 Oct 2011 12:23:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/10/09/360311.htmlhttp://www.aygfsteel.com/killme2008/comments/360311.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/10/09/360311.html#Feedback15http://www.aygfsteel.com/killme2008/comments/commentRss/360311.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/360311.html    ž®†è‡ªå·±åœ¨googlecodeå’Œgithub上的所有项目过了一遍,整理一张列表,列下一些还有点价值和用处的项目,都不是什么great jobåQŒçº¯¾_ÒŽ(gu¨©)˜¯ä¸ÞZº†å·¥ä½œéœ€è¦æˆ–者乐­‘£å†™çš„东西,看官要是有兴­‘£ä¹Ÿå¯ä»¥çž§çž§ã€?br />
 ä¸€ Java相关

1.XmemcachedåQŒè¿˜½Ž—是比较多äh使用的一个java memcached clientåQŒä¼˜ç‚ÒŽ(gu¨©)˜¯æ•ˆçŽ‡å’Œæ˜“ç”¨æ€§ï¼Œ¾~ºç‚¹æ˜¯ä»£ç å†™çš„ä¸æ€Žä¹ˆæ øP¼Œä¸¤å¹´å‰å‘展到现在的东西,以后˜q˜ä¼š(x¨¬)¾l§ç®‹¾l´æŠ¤ã€?br />
2.HS4JåQŒçœ‹handlersocket的时候顺手写的客æˆïL(f¨¥ng)«¯åQŒæˆ‘们公司内部某些项目在用,可能˜q˜æœ‰å…¶ä»–公司外的朋友在用åQŒåŽæ¥åŒäº‹èšçŸŒ™µA(ch¨³)献了一个扩展项ç›?a >hs4j-kitåQŒæ›´æ˜“于使用åQŒä»–写的代码很优雅漂亮,推荐一看。暂时没有精力维护ã€?br />
3.AviatoråQŒä¸€ä¸ªå¾ˆåˆçñ”的表辑ּæ‰§è¡Œå¼•擎åQŒè¡Œå®¶çœ‹åˆ°è‚¯å®šè¦½W‘话我。不˜q‡è¯­æ³•上很符合我自己的口呻I¼Œæˆ‘们自己的项目在用,也有几个朋友在用åQŒä¼š(x¨¬)¾l§ç®‹¾l´æŠ¤ã€?br />
4.JeventåQŒä¸€ä¸ªçީ典P¼Œå…¶å®žæ˜¯æ¨¡ä»¿libevent的一个java实现åQŒå¯¹nio或者libevent的实现机制感兴趣的还可以看看ã€?br />
5. KilimåQŒæˆ‘forkçš„kilim实现åQŒä¿®æ”¹äº†nio调度器,使用多个reactor做调度效率更高,òq¶æ·»åŠ äº†ä¸€ä¸ªHttpClient的实现ã€?br />
äº?Android™å¹ç›®

学习(f¨¤n)android完全是玩¼œ¨æ€§è´¨åQŒæœ‰3个项目,对初学android开发的可能有点参考ä­h(hu¨¢n)倹{€?br />
1.WhetherWeatheråQŒä¸€ä¸ªå¤©æ°”预报和告警的widget插äšgåQŒUI太丑了ã€?br />2.UniqRecorderåQŒå†™æ¥è®°å½•儿子体重变化的ž®å·¥å…øP¼Œå¯ä»¥è‡ªå®šä¹‰é¡¹ç›®å’Œç”Ÿæˆæ›²çº¿å›¾ï¼Œæˆ‘自å·Þp¿˜åœ¨ç”¨ã€?br />3.UniqTaskåQŒæœ€˜q‘写的杀˜q›ç¨‹å·¥å…·åQŒç»å¯¹è½»é‡çñ”åQŒæ²¡òq¿å‘ŠåQŒä¹Ÿæ˜¯æˆ‘自己在用ã€?br />
ä¸?Clojure™å¹ç›®

1.cschemeåQŒä¸€ä¸ªç”¨clojure实现的scheme解释器,åŸÞZºŽsicp˜q™æœ¬ä¹¦çš„解释器实现ã€?br />2.clojure-controlåQŒç±»ä¼?a >node-control的分布式部çÖv和管理的DSL实现åQŒæŒºå¥½çŽ©çš„ï¼Œä¹Ÿæœ‰æœ‹å‹åœ¨ç”¨åQŒæˆ‘自己˜q˜ç”¨ä¸ä¸Š,sunny有写了个很方便的lein插äšgnode-controlã€?br />
clojure˜q˜å†™äº†ä¸€å †çƒ‚ž®ùN¡¹ç›®ï¼Œž®×ƒ¸æ‹¿å‡ºæ¥æ¶å¿ƒäh了ã€?br />
å›?å…¶ä»–

1.node-zk-browseråQŒä¸€ä¸ªå±•现和½Ž¡ç†zookeeperçš„web应用åQŒæˆ‘们自己在用,åŸÞZºŽnode.js实现ã€?br />2.erlwshåQŒä¸€ä¸ªerlangçš„web shell实现åQŒå¯ä»¥åœ¨‹¹è§ˆå™¨é‡Œåšerlang¾~–程åQŒè¢«ä¸€äº›å¼€æºé¡¹ç›®æ¯”如membase用到了ã€?br />
    写这些东西对我自己最有好处,如果能顺便给他äh带来好处åQŒé‚£æ˜¯é¢å¤–的好处。最˜q‘正处于我自å·×ƒ¸€ç”Ÿä¸­ä¹Ÿè®¸æ˜¯æœ€å¤§çš„转折兛_¤´åQŒä¸èƒ½æ›´æ–°blog了,最后,¼œˆæ±‚诸天¼œžä½›(j¨©ng)能带来奇˜qV€?img src ="http://www.aygfsteel.com/killme2008/aggbug/360311.html" width = "1" height = "1" />

]]>
紧急发布xmemcached 1.3.5http://www.aygfsteel.com/killme2008/archive/2011/10/01/359898.htmldennisdennisSat, 01 Oct 2011 07:11:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/10/01/359898.htmlhttp://www.aygfsteel.com/killme2008/comments/359898.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/10/01/359898.html#Feedback6http://www.aygfsteel.com/killme2008/comments/commentRss/359898.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/359898.html    xmemcached紧急发å¸?.3.5版本åQŒä¸»è¦æ˜¯ä¿®å¤ä¸¤ä¸ªç›¸å¯¹ä¸¥é‡çš„bug:

Issue 154: 在重˜qžæœ¬åœ°memcached的时候,有可能出现重˜qžæ— æ³•成功的情况åQŒå¯¼è‡´è¿žæŽ¥ä¸¢å¤±ï¼Œè¯¦æƒ…è§?a >˜q™é‡Œã€?br />Issue 155: é‡è¿žå¯ÆD‡´æ–‡äšg句柄数超˜q‡é™åˆ¶çš„bugåQŒè¿™æ˜¯ç”±äºŽé‡˜qžå¤±è´¥æƒ…况下没有合理关闭socket引è“v的,详情è§?a >˜q™é‡Œã€?br />
    如果你ä‹É用mavenåQŒç®€å•升¾U§ç‰ˆæœ¬å³å¯ï¼š(x¨¬)
 <dependency>
      
<groupId>com.googlecode.xmemcached</groupId>
      
<artifactId>xmemcached</artifactId>
      
<version>1.3.5</version>
 
</dependency>


    下蝲地址åQ?a >http://code.google.com/p/xmemcached/downloads/list

    此版本推荐升¾U§ï¼Œæœ€åŽæ„Ÿè°¢ä¸¤ä½è€å¤–开发者的帮助åQ? ilkinulaså’?a >MrRubato

]]>
UniqTask for androidhttp://www.aygfsteel.com/killme2008/archive/2011/09/20/359033.htmldennisdennisMon, 19 Sep 2011 20:10:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/09/20/359033.htmlhttp://www.aygfsteel.com/killme2008/comments/359033.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/09/20/359033.html#Feedback5http://www.aygfsteel.com/killme2008/comments/commentRss/359033.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/359033.html
    我一直很不爽androidçš„ESä»ÕdŠ¡½Ž¡ç†å™¨ï¼Œå®ƒçš„òq¿å‘Šè®„¡½®çš„地斚wžå¸¸æ¶å¿ƒï¼Œž®±æ”¾åœ¨kill键的下面åQŒè€Œä¸”每次都突然蟩出来åQŒè®©ä½ å¾ˆå®ÒŽ(gu¨©)˜“错误点击。我很佩服他们能惛_‡º˜q™ç§æé«˜ç‚¹å‡»çŽ‡çš„åŠžæ³•åQŒä½†æ˜¯åˆæ— æ¯”鄙视˜q™ç§åšæ³•。今天(哦,不是昨天åQ‰æ™šä¸Šåœ¨twitter上说了,我想自己写个ä»ÕdŠ¡½Ž¡ç†å™¨ï¼Œ¾cÖM¼¼ESä»ÕdŠ¡½Ž¡ç†å™¨ï¼Œòq¶ä¸”没有òq¿å‘Šã€‚那好吧åQŒè¯´òq²å°±òqÔŒ¼Œå¥‹æ–—了一个晚上,¾lˆäºŽæžå‡ºäº†æˆæžœï¼Œ˜q™å°±æ˜¯éš†é‡ç™»åœºçš„UniqTaskåQŒå…ˆçœ‹çœ‹˜qè¡Œæ—¶æˆªå›¾ï¼š(x¨¬)



    ˜q™æ˜¯˜qè¡Œåœ¨æˆ‘çš„GS2上的截图ã€?br />
    UniqTask的功能跟ESä»ÕdŠ¡½Ž¡ç†å™¨çš„功能完全一è‡ß_(d¨¢)¼Œå¯ä»¥è®°å½•kill的历åÔŒ¼Œæ¯æ¬¡å¯åЍUniqTask的时候自动标记过去kill˜q‡çš„˜q›ç¨‹ã€‚但是UniqTask完全¾l¿è‰²æ— æ¯’åQŒç»å¯ÒŽ(gu¨©)²¡æœ‰å¹¿å‘Šï¼Œå’”å’”ã€?br />
    è®æ€¹…没写android½E‹åºåQŒæ‹¿èµäh‰‹æ¥ä¸æ˜¯å¾ˆ™åºåˆ©åQŒæŠ˜è…‘Öˆ°çŽ°åœ¨æ‰æžå®šï¼Œæˆ‘å°†ä»£ç æ”‘Öˆ°äº†github上,也提供了APK下蝲åQŒéžå¸¸æ¬¢˜qŽè¯•用啊ã€?br />
    源码地址åQ?br />    https://github.com/killme2008/UniqTask
    APK下蝲åQ?br />    https://github.com/killme2008/UniqTask/blob/master/UniqTask.apk

    白天˜q˜æœ‰é‡è¦çš„事情要处理åQŒç¡è§‰åŽ»äº†ã€?img src ="http://www.aygfsteel.com/killme2008/aggbug/359033.html" width = "1" height = "1" />

]]>
xmemcached发布1.3.4http://www.aygfsteel.com/killme2008/archive/2011/09/08/358317.htmldennisdennisThu, 08 Sep 2011 10:55:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/09/08/358317.htmlhttp://www.aygfsteel.com/killme2008/comments/358317.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/09/08/358317.html#Feedback3http://www.aygfsteel.com/killme2008/comments/commentRss/358317.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/358317.html

    开源的java memcached client—— xmemcached发布1.3.4版本åQŒä¸»è¦æ”¹˜q›å¦‚下:(x¨¬)

 

1、修复一个相对严重的bugåQŒåœ¨è§£æžäºŒè¿›åˆ¶åè®®æ—¶å¦‚果遇到从服务端˜q”回的错误信息,ä¼?x¨¬)导致连接异常断开åQ›å¦‚果你没有使用binary协议åQŒä¸ä¼?x¨¬)遇到此问题ã€?strong>廸™®®ä½¿ç”¨xmemcachedòq¶ä¸”使用二进制协议的朋友升çñ”到此版本ã€?/strong>

2、允许XMemcachedClientFactoryBean配置opTimeout选项�

3、添加RoundRobinMemcachedSessionLocatoråQŒè½®è¯¢çš„˜qžæŽ¥é€‰æ‹©å™¨ï¼Œä»…用于kestrel或者memcacheq集群åQŒè¿™äº›åº”用都不要求同一个key要保存在固定的服务器上,而仅是作为集¾Ÿ¤åˆ†æ‹…è´Ÿè½½ã€?/p>

4ã€?a >KetamaMemcachedSessionLocatoræ·ÕdŠ é¢å¤–é€‰é¡¹åQŒå…è®?d¨¡ng)R…¾|®æ˜¯å¦å…¼å®?nginx-upstream-consistentåQŒè¿™ä¸ªæ˜¯¾|‘友 wolfg1969贡献的patch。如果要使得xmc的一致性哈希算法兼å®?/span>nginx-upstream-consistentåQŒåªè¦è®¾¾|®cwNginxUpstreamConsistent为true卛_¯åQŒç¤ºèŒƒä»£ç ï¼š(x¨¬)

    MemcachedClientBuilder builder = new XMemcachedClientBuilder(  
                    AddrUtil.getAddresses(servers));  
      
    builder.setSessionLocator(
new KetamaMemcachedSessionLocator(  
                    
true)); 

5、修复bugåQŒåŒ…æ‹?a class="closed_ref" title="Typo in INFO message: log.info("Creating " + selectorPoolSize + " rectors...");" >issue 132 , issue 142 , issue 133 , issue 139 , issue 142 , issue 145 ,issue 150½{‰ã€?/p>

 

如果你ä‹É用mavenåQŒåªè¦ç®€å•升¾U§ç‰ˆæœ¬å³å¯ï¼š(x¨¬) 

  <dependency>  
         
<groupId>com.googlecode.xmemcached</groupId>  
         
<artifactId>xmemcached</artifactId>  
         
<version>1.3.4</version>  
    
</dependency> 

下蝲地址åQ?/p>

http://code.google.com/p/xmemcached/downloads/list



]]>
A clojure DSL for system admin and deployment with many remote machineshttp://www.aygfsteel.com/killme2008/archive/2011/07/24/354938.htmldennisdennisSun, 24 Jul 2011 13:48:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/07/24/354938.htmlhttp://www.aygfsteel.com/killme2008/comments/354938.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/07/24/354938.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/354938.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/354938.htmlupdate: Allow passing command line arguments to task now.

1.What is clojure-control?

    The idea came from node-control.
    Define clusters and tasks for system administration or code deployment, then execute them on one or many remote machines.
    Clojure-control depends only on OpenSSH and clojure on the local control machine.Remote machines simply need a standard sshd daemon.

2.Quick example

Get the current date from the two machines listed in the 'mycluster'  config with a single command:

     (ns samples
     (:use [control.core :only [task cluster scp ssh begin]]))
     ;;define clusters
     (cluster :mycluster
                 :clients [
                               { :host 
"a.domain.com" :user "alogin"}
                               { :host 
"b.domain.com" :user "blogin"}
                             ])
     ;;define tasks
     (task :date 
"Get date"
              []
              (ssh 
"date"))
    ;;start running
    (begin)

    If saved in a file named "controls.clj",run with   

java -cp clojure.jar:clojure-contrib.jar:control-0.1-SNAPSHOT.jar clojure.main controls.clj mycluster date

    Each machine execute "date" command ,and the output form the remote machine is printed to the console.Exmaple console output

 

    Performing mycluster
    Performing date 
for a.domain.com
    a.domain.com:ssh: date
    a.domain.com:stdout: Sun Jul 
24 19:14:09 CST 2011
    a.domain.com:exit: 
0
    Performing date 
for b.domain.com
    b.domain.com:ssh: date
    b.domain.com:stdout: Sun Jul 
24 19:14:09 CST 2011
    b.domain.com:exit: 
0

    Each line of output is labeled with the address of the machine the command was executed on. The actual command sent and the user used to send it is displayed. stdout and stderr output of the remote process is identified as well as the final exit code of the local ssh command.


3.How to scp files?
    Let's define a new task named deploy

  (task :deploy "scp files to remote machines"
        []
        (scp (
"release1.tar.gz" "release2.tar.gz""/home/alogin/"))

    Then it will copy release1.tar.gz and release2.tar.gz to remote machine's /home/alogin directory.

4.Where is it?

    It's on github,https://github.com/killme2008/clojure-control

    Any suggestion or bug reports welcomed.

dennis 2011-07-24 21:48 发表评论
]]>
轻量¾U§é«˜æ€§èƒ½çš„表辑ּæ±‚值器——aviator发布2.0http://www.aygfsteel.com/killme2008/archive/2011/07/13/354296.htmldennisdennisWed, 13 Jul 2011 14:34:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/07/13/354296.htmlhttp://www.aygfsteel.com/killme2008/comments/354296.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/07/13/354296.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/354296.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/354296.html 

    aviator是一个轻量çñ”的、高性能的Java表达式求值器åQŒä¸»è¦åº”用在如工作流引擎节点条äšg判断、MQ中的消息˜q‡æ×o(h¨´)以及(qi¨¢ng)某些特定的业务场景ã€?/p>

    自从上次发布1.0后,˜q˜å‘˜q?.01版本åQŒä¸˜q‡éƒ½æ²¡æ€Žä¹ˆå®£ä¼ ã€‚è¿™‹Æ¡å‘布一ä¸?.0的里½E‹ç¢‘版本åQŒä¸»è¦æ”¹˜q›å¦‚下:(x¨¬)


1、完整支持位˜qç®—½W¦ï¼Œä¸Žjava完全一致。位预算½W¦å¯¹å®žçްbit set之类的需求还是非常必™åȝš„ã€?

2、性能优化åQŒåã^均性能提升100%åQŒå‡½æ•°è°ƒç”¨æ€§èƒ½æå‡200%åQŒæœ€æ–°çš„与groovyå’ŒJEXL的性能‹¹‹è¯•看这é‡?/p>

http://code.google.com/p/aviator/wiki/Performance

3、添加了新函敎ͼŒåŒ…括long、double、str用于¾cÕdž‹è½¬æ¢åQŒæ·»åŠ äº†string.indexOf函数ã€?/p>

4、完善了用户手册åQŒæ›´æ–°æ€§èƒ½‹¹‹è¯•ã€?/p>

 

下蝲地址åQ?nbsp; http://code.google.com/p/aviator/downloads/list

™å¹ç›®ä¸»é¡µåQ?nbsp; http://code.google.com/p/aviator/

用户指南åQ?nbsp; http://code.google.com/p/aviator/w/list

性能报告åQ?nbsp; http://code.google.com/p/aviator/wiki/Performance

源码åQ?nbsp;         https://github.com/killme2008/aviator

 

Maven引用åQˆæ„Ÿè°¢è®¸è€å¤§çš„帮助)(j¨ª)åQ?/p>

    <dependency>
            
<groupId>com.googlecode.aviator</groupId>
            
<artifactId>aviator</artifactId>
                        
<version>2.0</version>
    
</dependency>

     ˜q™ä¸ª™å¹ç›®ç›®å‰ç”¨åœ¨æˆ‘们的MQ产品中做消息˜q‡æ×o(h¨´)åQŒä¹Ÿæœ‰å‡ ä¸ªå…¬å¸å¤–的用户告诉我他们也在用,不过估计不会(x¨¬)很多。有˜q™ç§éœ€æ±‚的场景˜q˜æ˜¯æ¯”较?y¨­u)®‘çš„ã€‚è¿™ä¸ªé¡¹ç›®å®žé™…ä¸Šæ˜¯äØ“(f¨´)我们的MQ定制的,我主要想做到˜q™ä¹ˆå‡ ç‚¹åQ?/p>

åQ?åQ‰æŽ§åˆ¶ç”¨æˆ¯‚ƒ½å¤Ÿä‹É用的函数åQŒä¸å…è®¸è°ƒç”¨ä»ÖM½•不受控制的函数ã€?/p>

åQ?åQ‰è½»é‡çñ”åQŒä¸éœ€è¦åµŒå…¥groovy˜q™ä¹ˆå¤§çš„脚本引擎åQŒæˆ‘们只需要一个剪裁过的表辑ּè¯­æ³•卛_¯ã€?/p>

åQ?åQ‰é«˜æ€§èƒ½åQŒæœ€¾lˆçš„æ€§èƒ½åœ¨æŸäº›åœºæ™¯æ¯”groovy略差åQŒä½†æ˜¯å·²¾léžå¸¸æŽ¥˜q‘ã€?/p>

åQ?åQ‰æ˜“于扩展,可以å®ÒŽ(gu¨©)˜“地添加函数扩展功能。语法相对固定ã€?/p>

åQ?åQ‰å‡½æ•°çš„调用避免使用反射。因此没使用dot˜qç®—½W¦çš„函数调用方式åQŒè€Œæ˜¯æ›´ç±»ä¼¼c语言和lua语言的函数调用风根{€‚函数是一½{‰å…¬æ°‘,seq库的风格很符合我的喜好ã€?/p>

  seq˜q™æ¦‚忉|¥è‡ªclojureåQŒæˆ‘ž®†å®žçŽîCº†java.util.Collection接口的类和数¾l„都¿UîCØ“(f¨´)seq集合åQŒå¯ä»¥ç»Ÿä¸€ä½¿ç”¨seq库操作。例如假设我有个list:

        Map<String, Object> env = new HashMap<String, Object>();
        ArrayList
<Integer> list = new ArrayList<Integer>();
        list.add(
3);
        list.add(
100);
        list.add(
-100);
        env.put(
"list", list);

   可以做这么几个事情,度量大小åQ?br />
count(list)
   判断元素是否存在åQ?br />
include(list,3)
   ˜q‡æ×o(h¨´)元素åQŒè¿”回大äº?的元素组成的seqåQ?br />
filter(list,seq.gt(0))
   寚w›†åˆé‡Œçš„元素求和,应用reduce:
reduce(list,+,0)
   遍历集合元素òq¶æ‰“华ͼš(x¨¬)
map(list,println)
   最后,你还可以排序:
sort(list)

    ˜q™äº›å‡½æ•°¾cÖM¼¼FP里的高阶函数åQŒä‹É用è“v来还是非常爽的ã€?br />
    对函数调用的优化åQŒå…¶å®žåªòq²äº†ä¸€ä¸ªäº‹æƒ…,原来函数调用我是ž®†æ‰€æœ‰å‚数收集到一个list里面åQŒç„¶åŽå†è½¬æˆæ•°ç»„元素交给AviatorFunction调用。这里创å»ÞZº†ä¸¤ä¸ªä¸´æ—¶å¯¹è±¡åQšlist和数¾l„。这其实是没有必要的åQŒæˆ‘只要在AviatorFunction里定义一¾pÕdˆ—重蝲æ–ÒŽ(gu¨©)³•åQŒå¦‚åQ?br />
   public AviatorObject call(Map<String, Object> env);


    
public AviatorObject call(Map<String, Object> env, AviatorObject arg1);


    
public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2);


    
public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3);

    

   ž®×ƒ¸éœ€è¦æ”¶é›†å‚敎ͼŒè€Œæ˜¯ç›´æŽ¥invokeinterface调用AviatorFunction相应的重载方法即可。我看到在JRubyå’ŒClojure里的æ–ÒŽ(gu¨©)³•调用都这样干的。过åŽÈš„思èµ\走岔了。最¾lˆä¹Ÿä¸éœ€è¦åŒºåˆ†å†…部的method和外部的functionåQŒç»Ÿä¸€ä¸ÞZ¸€ä¸ªå¯¹è±¡å³å¯ï¼Œ˜q›ä¸€æ­¥å‡ž®‘了对象创徏的开销ã€?img src ="http://www.aygfsteel.com/killme2008/aggbug/354296.html" width = "1" height = "1" />

]]>
Java NIO¾~–程的技巧和陷阱http://www.aygfsteel.com/killme2008/archive/2011/06/30/353422.htmldennisdennisThu, 30 Jun 2011 03:07:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/06/30/353422.htmlhttp://www.aygfsteel.com/killme2008/comments/353422.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/06/30/353422.html#Feedback4http://www.aygfsteel.com/killme2008/comments/commentRss/353422.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/353422.html åŽÕd¹´åšçš„分äínåQŒä¸€ç›´ä¸Šä¼ slideshareå¤ÞpÓ|åQŒä»Šå¤©åˆè¯•了下,成功了。这个主题主要介¾lJava NIO¾~–程的技巧和陷阱åQŒè§£è¯ÖMº†ä¸€äº›NIO框架的源码,以及(qi¨¢ng)¾~–写高性能NIO¾|‘络框架所需要注意的技巧和¾~ºé™·ã€‚关注这斚w¢çš„æœ‹å‹å¯ä»¥çœ‹ä¸€ä¸‹ã€‚去òq´å†™äº†ç¯‡blog提供了pdf版本的下载,çœ?a href="http://www.aygfsteel.com/killme2008/archive/2010/11/22/338420.html">˜q™é‡Œã€?br />


]]>
xmemcached发布1.3.3版本——支持touchå’ŒGAThttp://www.aygfsteel.com/killme2008/archive/2011/06/12/352120.htmldennisdennisSun, 12 Jun 2011 05:32:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/06/12/352120.htmlhttp://www.aygfsteel.com/killme2008/comments/352120.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/06/12/352120.html#Feedback2http://www.aygfsteel.com/killme2008/comments/commentRss/352120.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/352120.htmlxmemcached发布1.3.3åQŒä¸»è¦æ”¹˜q›å¦‚下:(x¨¬)

1、memcached 1.6æ·ÕdŠ äº†ä¸ž®‘æ–°ç‰ÒŽ(gu¨©)€§ï¼Œå…·ä½“可以参考《what's new in memcachedã€?1) (2)˜q™ä¸¤ä¸ªå¸–子。xmemcachedž®†åŠ(qi¨¢ng)æ—¶è·Ÿ˜q›è¿™äº›æ–°ç‰ÒŽ(gu¨©)€§ã€?.3.3˜q™ä¸ªç‰ˆæœ¬å®žçŽ°äº†äºŒ˜q›åˆ¶åè®®ä¸­æ–°çš„两个命令touchå’ŒGATåQˆget and touch)。这两个功能可以说是千呼万唤始出来,¾lˆäºŽå¯ä»¥ä¸ç”¨get-set来重新设¾|®æ•°æ®çš„­‘…æ—¶æ—‰™—´åQŒåˆ©ç”¨touch或者GAT可以½Ž€å•地更新数据的超时时间ã€?.3.3新增加四个方法:(x¨¬)
    public boolean touch(final String key, int exp, long opTimeout)
            
throws TimeoutException, InterruptedException, MemcachedException;
    
public boolean touch(final String key, int exp) throws TimeoutException,
            InterruptedException, MemcachedException;
        
public <T> T getAndTouch(final String key, int newExp, long opTimeout)
            
throws TimeoutException, InterruptedException, MemcachedException;
    
public <T> T getAndTouch(final String key, int newExp)
            
throws TimeoutException, InterruptedException, MemcachedException;

其中touch用于讄¡½®æ•°æ®æ–°çš„­‘…æ—¶æ—‰™—´åQŒgetAndTouch则是在获取数据的同时更新­‘…æ—¶æ—‰™—´ã€‚例如用memcached存储sessionåQŒå¯ä»¥åœ¨æ¯æ¬¡get的时候更æ–îC¸‹æ•°æ®çš„超时时间来保活ã€?strong>è¯äh³¨æ„ï¼Œ˜q™å››ä¸ªæ–¹æ³•仅在ä‹É用memcached 1.6òq¶ä¸”使用二进制协议的时候有æ•?/strong>ã€?br />
2、setLoggingLevelVerbosityæ–ÒŽ(gu¨©)³•可以作用于二˜q›åˆ¶åè®®ã€?/strong>

3、重构错误处理模块,使得异常信息更友好�/strong>

4、将KeyIteratorå’ŒgetKeyIterator声明为deprecatedåQ?/strong>因䨓(f¨´)memached 1.6ž®†ç§»é™¤stats cachedump协议åQŒåƈ且stats cachedump˜q”回数据有大ž®é™åˆÓž¼ŒéåŽ†åŠŸèƒ½ä¸å…·å®žç”¨æ€§ã€?br />
5、修复BugåQŒåŒ…æ‹?a title="Error getting memcached Detail Statistics" class="closed_ref" >issue 126 ,issue 127,issue 128,issue 129ã€?br />
下蝲地址åQ?a >http://code.google.com/p/xmemcached/downloads/list
源码åQ?nbsp; https://github.com/killme2008/xmemcached
maven引用åQ?br />
 <dependency>
      
<groupId>com.googlecode.xmemcached</groupId>
      
<artifactId>xmemcached</artifactId>
      
<version>1.3.3</version>
 
</dependency>


]]>
Zookeeperçš„web½Ž¡ç†åº”用http://www.aygfsteel.com/killme2008/archive/2011/06/06/351793.htmldennisdennisSun, 05 Jun 2011 17:13:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/06/06/351793.htmlhttp://www.aygfsteel.com/killme2008/comments/351793.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/06/06/351793.html#Feedback2http://www.aygfsteel.com/killme2008/comments/commentRss/351793.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/351793.htmlhttps://github.com/killme2008/node-zookeeper

    我们已经开始在产品使用zookeeper了,那么¾l´æŠ¤å·¥å…·ä¹Ÿå¿…焉™œ€è¦ï¼Œæ‰€è°“兵马未动,¾_®è‰å…ˆè¡Œã€‚请同事帮忙看过几个开源项目后åQŒåƈ没有特别让äh满意的ã€?br />    我想要的功能比较½Ž€å•。首先,希望能将zookeeper集群的数据展½CÞZØ“(f¨´)æ ?w¨¨i)åÅž¾l“æž„åQŒè·Ÿzookeeper模型保持一致。可以逐步展开每层的节点,每次展开都是延迟加蝲从zk里取数据åQŒè¿™æ ·ä¸ä¼?x¨¬)对zk造成太大压力。其‹Æ¡ï¼Œé™¤äº†å±•示æ ?w¨¨i)åÅž¾l“构外,我还希望它能展示每个path的属性和数据åQŒæ›´˜q›ä¸€æ­¥ï¼Œå¦‚果数据是文本的åQŒæˆ‘希望它可¾~–辑。当ç„?d¨°ng)ž¼Œå› äØ?f¨´)¾~–è¾‘åŠŸèƒ½æ˜¯æ¯”è¾ƒå±é™©çš„è¡ŒäØ“(f¨´)åQŒæˆ‘˜q˜å¸Œæœ›è¿™ä¸ªç®¡ç†å·¥å…ähœ‰ä¸ªç®€å•的授权验证机制ã€?br />
    最¾lˆï¼Œæˆ‘自己写了这么个东西åQŒå–åäØ“(f¨´)node-zk-browseråQŒåŸºäºŽnode.jsçš?a >express.js框架å’?a >node-zookeeper客户端实现的。我ž®†å®ƒæ”‘Öœ¨äº†githubä¸?br />
    https://github.com/killme2008/node-zk-browser

    ä½ å¯ä»¥è‡ªå·±æ­å»ø™¿™ä¸ªå°appåQ?npm几乎能帮你搞定大部分工作。界面不¾ŸŽè§‚åQŒå®žç”¨äØ“(f¨´)主,几张˜qè¡Œæ—¶æˆªå›?br />








]]>
node-leveldbçš„memcached adapterhttp://www.aygfsteel.com/killme2008/archive/2011/05/31/351447.htmldennisdennisTue, 31 May 2011 08:45:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/05/31/351447.htmlhttp://www.aygfsteel.com/killme2008/comments/351447.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/05/31/351447.html#Feedback1http://www.aygfsteel.com/killme2008/comments/commentRss/351447.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/351447.htmlleveldb是google最˜q‘开源的一个实玎ͼŒä½†æ˜¯å®ƒä»…是个libåQŒè¿˜éœ€è¦åŒ…装才能ä‹É用ã€?a >node-leveldbž®±æ˜¯ä¸€ä¸ªç”¨node.js包装leveldb的项目,你可以用javascript讉K—®leveldbã€?a >node-leveldb仅提供APIåQŒä¸æä¾›¾|‘络接口供外部访问。我fork了个分支åQŒæžäº†ä¸ªmemcachedçš„adapteråQŒå°†node-leveldbçš„API暴露为memcached的文本协议,˜q™æ ·ä¸€æ¥ä½ å¯ä»¥ç›´æŽ¥ç”¨çŽ°æœ‰çš„memcached client甚至直接telnet上去˜q›è¡Œ‹¹‹è¯•。感兴趣的朋友可以测试下。adpaterž®×ƒ¸€ä¸ªæ–‡ä»?a >memcached.jsã€?br />    
    fork的分支在åQ?br />    https://github.com/killme2008/node-leveldb

    ¾~–译node-leveldb之后åQŒæ‰§è¡?br />
node memcached-adpater/memcached.js

    卛_¯å¯åЍmemcached adapteråœ?1211端口åQŒä½ å¯ä»¥telnet上去‹¹‹è¯•。目前仅支持get/set/delete/quit协议åQŒä¸æ”¯æŒflagå’Œexptimeã€?br />

]]>
HandlerSocket client for java——hs4j正式发布0.1版本http://www.aygfsteel.com/killme2008/archive/2011/03/29/347160.htmldennisdennisMon, 28 Mar 2011 22:55:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/03/29/347160.htmlhttp://www.aygfsteel.com/killme2008/comments/347160.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/03/29/347160.html#Feedback3http://www.aygfsteel.com/killme2008/comments/commentRss/347160.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/347160.html
    HandlerSocket是一个mysql插äšgåQŒå¯ä»¥å°†mysqlä½œäØ“(f¨´)NoSQL来ä‹É用,具体可以看我˜q‡åŽ»å†™çš„˜q™ç¯‡Blogã€?a >hs4j是HandlerSocket的一个java客户端,自认为它比日本äh写的那个客户端更实用和易用一些。写完好久,¾lè¿‡ä¸å°‘朋友使用和测试,现在正式发一ä¸?.1版本åQŒåƈ已同步到maven中心仓库ã€?br />
    ™å¹ç›®ä¸»é¡µåQ?a title="http://code.google.com/p/hs4j/" >http://code.google.com/p/hs4j/
    ™å¹ç›®æè¿°åQšhs4j is a practical java client for HandlerSocket,it is nio based and turned to get better performance.
    使用文档åQ?a >http://code.google.com/p/hs4j/w/list
    下蝲地址åQ?a title="http://code.google.com/p/hs4j/downloads/list" >http://code.google.com/p/hs4j/downloads/list
    源码仓库åQ?a rel="nofollow">https://github.com/killme2008/hs4j

     如果你ä‹É用maven2åQŒå¯ä»¥ç›´æŽ¥å¼•用:(x¨¬)
<dependency>
  
<groupId>com.googlecode.hs4j</groupId>
  
<artifactId>hs4j</artifactId>
  
<version>0.1</version>
</dependency>

     有疑问和bug误‚”¾pÀLˆ‘ã€?br />

]]>
xmemcached发布1.3.2版本http://www.aygfsteel.com/killme2008/archive/2011/03/27/347102.htmldennisdennisSun, 27 Mar 2011 06:06:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/03/27/347102.htmlhttp://www.aygfsteel.com/killme2008/comments/347102.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/03/27/347102.html#Feedback1http://www.aygfsteel.com/killme2008/comments/commentRss/347102.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/347102.html     Xmemcached是一个开源的java memcached clientåQŒå…·æœ‰é«˜æ€§èƒ½ã€æ›´æ˜“用、功能完善等优点åQŒè·¼›ÖM¸Š‹Æ¡å‘å¸?.3.1已经­‘…过两个月,现在正式发布1.3.2˜q™ä¸ªæ–°ç‰ˆæœ¬ï¼Œä¸»è¦çš„æ”¹˜q›å¦‚下:(x¨¬)


1、Bug修复åQŒä»Ž1.3.1版本以来发现的bugòq¶ä¿®å¤ï¼ŒåŒ…括åQ?

issue 112:: 新引入的failure模式在启动的时候,如果memcachedæ•…éšœåQŒè¿è¡Œä¸½W¦åˆé¢„期的bug.

issue 113: 新增加一个deleteæ–ÒŽ(gu¨©)³•åQŒå¯ä»¥è®¾¾|®æ“ä½œè¶…æ—?/p>

public boolean delete(final String key, long opTimeout)
            
throws TimeoutException, InterruptedException, MemcachedException;

2、性能调优åQŒå­˜å‚¨æ“ä½?set/add/replace/prepend/append/cas)的性能提升5%ã€?/p>

3、修复pom.xmlåQŒä‹Éå¾—xmemcached可以在其他机器上¾~–译ã€?/p>

4、ä‹É用githubä½œäØ“(f¨´)源码仓库åQŒç‰ˆæœ¬ç®¡ç†ä‹É用git替换svnåQŒæºç è{¿UÕdˆ°

      https://github.com/killme2008/xmemcached

新版本下载地址åQ?/p>     http://code.google.com/p/xmemcached/downloads/list

使用maven可以直接引用åQ?nbsp;

<dependency>
      <groupId>com.googlecode.xmemcached</groupId>
      
<artifactId>xmemcached</artifactId>
      
<version>1.3.2</version>
 
</dependency>

™å¹ç›®æ–‡æ¡£åQ?/p>

http://code.google.com/p/xmemcached/w/list



]]>
Scheme interpreter in clojurehttp://www.aygfsteel.com/killme2008/archive/2011/01/24/343423.htmldennisdennisMon, 24 Jan 2011 02:42:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/01/24/343423.htmlhttp://www.aygfsteel.com/killme2008/comments/343423.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/01/24/343423.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/343423.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/343423.html
Feature Supported Comment
define yes
lambda yes
variable lookup yes
primitive procedure evaluation yes
compound procedure evaluation yes no tail recursion yet
if yes
cond yes
let yes

let* yes
no named let* yet
letrec no
begin yes

set! yes

quote yes
quasiquote no
unquote no
delay no
define-syntax no

       支持的primitive procedure包括常见的四则运½Ž—、car/cdr、list以及(qi¨¢ng)display、newline½{‰ã€‚代码放在了github上:(x¨¬)https://github.com/killme2008/cscheme,有兴­‘£çš„可以玩玩吧ã€?br />

]]>
Xmemcached 1.3.0正式发布http://www.aygfsteel.com/killme2008/archive/2011/01/04/342287.htmldennisdennisTue, 04 Jan 2011 12:10:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/01/04/342287.htmlhttp://www.aygfsteel.com/killme2008/comments/342287.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/01/04/342287.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/342287.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/342287.htmlXmemcached是一个开源的memcachedçš„Java客户端,最˜q‘引入了一些关键特性,因此版本åïL(f¨¥ng)›´æŽ¥ä»Ž1.2.6.2升çñ”åˆ?.3.0。主要的更改如下åQ?br />

1、引入了failure模式åQŒæ‰€è°“failure模式是指在当一个memcachedç”׃ºŽå„种原因不可用的情况下,发往˜q™ä¸ªèŠ‚ç‚¹çš„è¯·æ±‚å°†ç›´æŽ¥æŠ›å‡ºå¼‚å¸¸åQŒè€Œéžä½¿ç”¨ä¸‹ä¸€ä¸ªå¯ç”¨çš„节点。具体可以看memachedçš?a >˜q™ä¸ªæ–‡æ¡£ã€‚默认不启用åQŒå¯ç”¨failure模式很简单:(x¨¬)

MemcachedClientBuilder builder=……
//启用failure模式�/span>
builder.setFailureMode(true);

也可以采用spring配置�br />

2、在启用failure模式的情况下åQŒå…è®æ€Ø“(f¨´)每个memcached讄¡½®ä¸€ä¸ªå¤‡ä»½èŠ‚ç‚¹ï¼Œå½“ä¸»èŠ‚ç‚¹æŒ‚æŽ‰çš„æƒ…å†µä¸‹åQŒä¼š(x¨¬)ž®†è¯·æ±‚è{交给备䆾节点åQŒä¸»èŠ‚ç‚¹æ¢å¤åŽåˆè‡ªåŠ¨åˆ‡æ¢åˆîC¸»èŠ‚ç‚¹ã€‚è¯·æ³¨æ„åQŒè¦è®„¡½®å¤‡ä†¾èŠ‚ç‚¹çš„å‰ææ˜¯å¯ç”¨failure模式。假设我们已¾læœ‰ä¸¤ä¸ªmemcached节点åQšhost1:portå’Œhost2:portåQŒäØ“(f¨´)host1:port讄¡½®ä¸€ä¸ªå¤‡ä»½èŠ‚ç‚¹host3:port可以实现为:(x¨¬)
MemcachedClientBuilder builder=new XmemcachedClientBuilder(AddrUtil.getAddressMap("host1:port,host3:port host2:port"))
……

ä¸Õd¤‡èŠ‚ç‚¹ä¹‹é—´ç”¨é€—å·éš”å¼€åQŒä¸åŒåˆ†¾l„之间用½Iºæ ¼éš”å¼€åQŒå®Œå…¨å…¼å®?.2ã€‚åÆˆä¸”å½“å¤‡ä†¾èŠ‚ç‚¹˜qžæŽ¥æ„å¤–断开的情况下åQŒxmemcached也会(x¨¬)è‡ªåŠ¨ä¿®å¤å¤‡ä†¾èŠ‚ç‚¹çš„è¿žæŽ¥åÆˆåŠ å…¥æ˜ å°„ã€?br />

关于failure模式和standby节点更多内容可以参è€?a href="http://www.aygfsteel.com/killme2008/archive/2010/12/28/341731.html">˜q™ç¯‡blog.

3、修正BUG和新功能åQŒåŒ…æ‹?a >issue 104,issue 105,issue 107½{‰ã€?br />

™å¹ç›®ä¸»é¡µ http://code.google.com/p/xmemcached/

下蝲地址 http://code.google.com/p/xmemcached/downloads/list

用户指南 http://code.google.com/p/xmemcached/wiki/TableOfContents

     如果你ä‹É用maven构徏åQŒå¯ä»¥ç›´æŽ¥å¼•用:(x¨¬)

<dependency>
<groupId>com.googlecode.xmemcached</groupId>
<artifactId>xmemcached</artifactId>
<version>1.3.1</version>
</dependency>


    æ›´æ–°åQšå‘å¸?.3.1了,如果你还在ä‹Éç”?.3.0åQŒå¾è®®å‡¾U§ã€?.3.0因䨓(f¨´)改变了memcachedåœ°å€æœåŠ¡å™¨é¡ºåºï¼Œå¯èƒ½å¯ÆD‡´åŽŸæœ‰çš„ç¼“å­˜å¤±æ•ˆã€?br />




]]>
Xmemcached 1.3预览åQšfailure模式和standby节点http://www.aygfsteel.com/killme2008/archive/2010/12/28/341731.htmldennisdennisTue, 28 Dec 2010 02:47:00 GMThttp://www.aygfsteel.com/killme2008/archive/2010/12/28/341731.htmlhttp://www.aygfsteel.com/killme2008/comments/341731.htmlhttp://www.aygfsteel.com/killme2008/archive/2010/12/28/341731.html#Feedback5http://www.aygfsteel.com/killme2008/comments/commentRss/341731.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/341731.html     Xmemcached在元旦左叛_‡†å¤‡å‘1.3˜q™ä¸ªç‰ˆæœ¬åQŒè¿™ä¸ªç‰ˆæœ¬æ–°å¢žåŠ çš„ä¸€ä¸ªå…³é”®ç‰¹æ€§å°±æ˜¯æ‰€è°“çš„failure模式。关于这个,可以看下memcached官方文档的解é‡?br />            XMemcachedClientBuilder builder =……
               
//讄¡½®ä½¿ç”¨failure模式
           builder.setFailureMode(true);       在此模式下,某个节点挂掉的情况下åQŒå¾€˜q™ä¸ªèŠ‚ç‚¹çš„è¯·æ±‚éƒ½ž®†ç›´æŽ¥æŠ›å‡ºMemcachedException的异常ã€?br />
      不仅如此åQŒxmemcached 1.3˜q˜å°†å¼•å…¥standby node的概念,你可以设¾|®æŸä¸ªmemached节点的备份节点,当这个节ç‚ÒŽ(gu¨©)Œ‚掉的时候会(x¨¬)ž®†è¯·æ±‚è{发给˜q™ä¸ªå¤‡ä†¾èŠ‚ç‚¹åQŒä¸ä¼?x¨¬)简单地抛出异常åQŒä¹Ÿä¸ä¼š(x¨¬)转发¾l™å…¶ä»–节炏V€‚要使用standby nodeåQŒå¿…™å»é¦–先设¾|®ä‹É用failure modeåQŒä¸€ä¸ªä¾‹å­ï¼š(x¨¬)

XMemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil
                .getAddressMap(
"192.168.1.99:11211,192.168.1.100:11211 192.168.1.101:11211,192.168.1.102:11211"));
builder.setFailureMode(
true);

     可以看到åQŒæ–°çš„æœåŠ¡å™¨å­—ç¬¦ä¸²æ ¼å¼å˜åŒ–äØ“(f¨´)host:port,host:port host:port,host:port的格式,以空格隔开的是两个节点¾l„成的一个分¾l„,以逗号隔开的是主节点和备䆾节点åQŒä»¥ä¸Šé¢çš„例子来è¯ß_(d¨¢)¼Œæˆ‘们讄¡½®å®¢æˆ·ç«¯ä‹É用的节点æ˜?92.168.1.99å’?92.168.1.101åQŒå…¶ä¸?9对应的备份节ç‚ÒŽ(gu¨©)˜¯100åQŒè€?01的备份节ç‚ÒŽ(gu¨©)˜¯102ã€‚åÆˆä¸”æˆ‘ä»¬éœ€è¦è®¾¾|®ä‹É用failure mode为trueã€?br />    
     Failure mode加上standby节点可以比较好的解决新旧数据的问题,òq¶ä¸”也可以防止请求穿透缓存到DBåQŒä½†æ˜¯ä¸»å¤‡ä¸¤ä¸ªèŠ‚ç‚¹ä¹‹é—´çš„æ•°æ®åŒæ­¥åQŒxmemcached不准备帮你做åQŒæˆ‘的徏议是可以使用repcached˜q™ä¸ªpatch做复制ã€?br />     有的朋友可能希望åQŒåœ¨ä½¿ç”¨å¤‡ä†¾èŠ‚ç‚¹ä¹‹å‰å…ˆflush掉备份节点的数据åQŒé˜²æ­¢ä‹É用到老的数据åQŒè¯·æ±‚还是可以穿透缓存去DB查找åQŒåƈ存储到备份节点,我仔¾l†è€ƒè™‘了这个方案,衡量之下˜q˜æ˜¯ä¸å‡†å¤‡åšè‡ªåЍflushåQŒä¸»è¦æ˜¯òq¶å‘上很隑֤„理,òq¶ä¸”flush数据˜q™ä¸ªäº‹æƒ…可以手工来搞åQŒæ ¹æ®æˆ‘的经验,做的太透明太自动不一定是好事。你可以在主节点恢复之后åQŒæ‰‹å·¥flush下备份节点的数据ã€?br />

    目前åQŒxmemcached 1.3已经整装待发åQŒå¯¹˜q™äº›ç‰ÒŽ(gu¨©)€§æœ‰å…´è¶£çš„æœ‹å‹å¯ä»¥å…ˆä»?a >svn下蝲æº?/a>码尝鲜,有ä“Q何改˜q›çš„廸™®®è¯·å‘é‚®äšg¾l™æˆ‘。我的邮件地址在博客的右上角ã€?br />




  


]]>
HandlerSocket client for java——MySql as NoSQLhttp://www.aygfsteel.com/killme2008/archive/2010/11/30/339386.htmldennisdennisTue, 30 Nov 2010 05:51:00 GMThttp://www.aygfsteel.com/killme2008/archive/2010/11/30/339386.htmlhttp://www.aygfsteel.com/killme2008/comments/339386.htmlhttp://www.aygfsteel.com/killme2008/archive/2010/11/30/339386.html#Feedback4http://www.aygfsteel.com/killme2008/comments/commentRss/339386.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/339386.html     HandlerSocket是日本äh akira higuchi 写的一个MySql的插ä»Óž¼Œé€šè¿‡˜q™ä¸ªæ’äšgåQŒä½ å¯ä»¥ç›´æŽ¥è·ŸMySql后端的存储引擎做key-value式的交互åQŒçœåŽÖMº†MySql上层的SQL解释、打开关闭表、创建查询计划等CPU消耗型的开销åQŒæŒ‰ç…§ä½œè€…给出的数据可以在数据全部在内存的情况下可以辑ֈ°75Wçš„QPS查询。具体信息可以看˜q™ç¯‡BlogåQŒä¸­æ–‡ä»‹¾lå¯ä»¥çœ‹˜q™ç¯‡æ–‡ç« ã€?a >HandlerSocket in action》ã€?br />
    ˜q™ä¸ªä¸œè¥¿ä¸ÞZ»€ä¹ˆè®©æˆ‘很‹È€åЍ呢åQŸé¦–先性能是程序员的G点,一听高性能你不由地‹È€åŠ¨ï¼Œå…¶æ¬¡åQŒè¿™ä¹Ÿè§£å†³äº†¾~“å­˜è·Ÿæ•°æ®åº“çš„ä¸€è‡´æ€§é—®é¢˜ï¼Œå› äØ“(f¨´)¾~“å­˜ž®±åœ¨æ•°æ®åº“里面,½W¬ä¸‰åQŒè¿™ä¸ªä¸œè¥¿ä¸ä»…仅是NoSQLåQŒç®€å•çš„CRUD你可以通过HandlerSocketåQŒä½†æ˜¯å¤æ‚的查询你仍然可以走MySqlåQŒå®Œå…¨ç¬¦åˆæˆ‘们应用的场景åQŒåƈ且从实际‹¹‹è¯•来看åQŒæ€§èƒ½¼‹®å®žéžå¸¸ä¼˜ç§€ã€‚但是呢åQŒè¿™ä¸ªä¸œè¥¿çš„代ä­h(hu¨¢n)也少不了åQŒä¾‹å¦‚没有权限检查(未来可能æ·ÕdŠ åQ‰ï¼›ä¸èƒ½å¯ç”¨MySql的查询缓存,否则ä¼?x¨¬)导致数据的不一è‡ß_(d¨¢)¼›åè®®è®¾è®¡ä¹Ÿä¸åˆç†åQŒä‹É用\t做分隔符åQŒä‹É用\n做换行符åQŒé‚£ä¹ˆä½ æ’入或者更新的字段数据ž®×ƒ¸èƒ½å«æœ‰è¿™äº›å­—½W¦ï¼Œå¦åˆ™è¡ŒäØ“(f¨´)ž®†ä¸å¦‚预期ã€?/strike>

   HandlerSocket有一个日本ähçš„java客户端实玎ͼŒæˆ‘去ž®è¯•了下åQŒç»“果发现这玩意完全不具实用性,ž®è£…的层‹Æ¡éžå¸¸åŽŸå§‹ã€‚å› æ­¤æˆ‘è‡ªå·±å†™äº†ä¸ªæ–°çš„å®¢æˆïL(f¨¥ng)«¯åQŒè¿™ž®±æ˜¯æœ¬æ–‡è¦ä»‹¾lçš„HandlerSocket Client for JavaåQŒç®€¿U?a >hs4jåQŒé¡¹ç›®æ”¾åœ¨äº†googlecodeåQŒä»£ç çš„¾|‘络层复用xmemcachedåQŒé‡æ–°å®žçŽîCº†åè®®å’Œä¸Šå±‚接口,目前的状态完全可用,也希望有需要的朋友参与‹¹‹è¯•ã€?br />
   ™å¹ç›®åœ°å€åQ?a >http://code.google.com/p/hs4j/

    HS4Jçš„ä‹É用很½Ž€å•,所有的操作都通过HSClient˜q™ä¸ªæŽ¥å£˜q›è¡ŒåQŒå¦‚我们创徏一个客æˆïL(f¨¥ng)«¯å¯¹è±¡åQ?br />
import com.google.code.hs4j.HSClient;
import com.google.code.hs4j.impl.HSClientImpl;

   HSClient hsClient 
= new HSClientImpl(new InetSocketAddress(9999));

   假设HandlerSocket˜qè¡Œåœ¨æœ¬åœ°çš„9999端口åQŒé»˜è®¤çš„9998是只è¯Èš„åQ?999才是允许è¯Õd’Œå†™ã€‚HSClient是线½E‹å®‰å…¨çš„ã€?br />
   在执行操作前需要先open indexåQ?br />
import com.google.code.hs4j.IndexSession;

      IndexSession session 
= hsClient.openIndexSession(db, table,
                                
"PRIMARY", columns);

   其中db是数据库å?table是表名,"PRIMARY"表示使用主键索引åQŒcolumns是一个字½W¦ä¸²æ•°ç»„代表你要查询的字ŒDµå¿U°ã€‚这里没有指定indexidåQŒé»˜è®¤ä¼š(x¨¬)产生一个indexidåQŒä½ ä¹Ÿå¯ä»¥æŒ‡å®šindexidåQŒè¿”回表½CÞZ¸€‹Æ¡open-indexä¼?x¨¬)话对象åQŒIndexSession同样是线½E‹å®‰å…¨çš„ã€?br />
IndexSession session = hsClient.openIndexSession(indexid,db, table,
                                
"PRIMARY", columns);

   查询操作通过findæ–ÒŽ(gu¨©)³•:
import java.sql.ResultSet;

                
final String[] keys = { "dennis""killme2008@gmail.com" };
                ResultSet rs 
= session.find(keys);
                
while(rs.next()){
                   String name
=rs.getString(1);
                   String mail
=rs.getString(2);
                }

   find˜q”回的是java.sql.ResultSetåQŒä½ å®Œå…¨å¯ä»¥åƒä‹É用jdbc那样åŽÀL“ä½œç»“æžœé›†ã€‚å½“ç„¶æˆ‘çš„ç®€å•å®žçŽ°åÆˆä¸ç¬¦åˆJDBC规范åQŒåªå®žçŽ°äº†æœ€å¸¸è§çš„ä¸€äº›æ–¹æ³•ï¼Œå¦‚getStrng、getLong½{‰ã€‚find(keys)æ–ÒŽ(gu¨©)³•默认使用的opæ˜?="。其他重载方法可以设¾|®å…¶ä»–类型的opåQŒç»Ÿä¸€ž®è£…为枚丄¡±»åž‹FindOperatorã€?br />
   更新操作åQ?br />
import com.google.code.hs4j.FindOperator;

   
int result=session.update(keys, new String[] { "1""dennis",
                                
"test@163.com""109" }, FindOperator.EQ);

   keys表示索引的字ŒDµåˆ—表对应的值数¾l„,通过FindOperator.EQ比较˜q™äº›å€¼å’Œç´¢å¼•åQŒç¬¬äºŒä¸ªå‚æ•°values表示要更新的字段å€û|¼Œ˜q™äº›å€ÆD·Ÿä½ åœ¨open-index的时候传入的columns一一对应åQŒæœ€åŽè¿”回作用的记录数ã€?br />
    删除操作åQ?br />
   int result= session.delete(new String[] { "dennis" },
                                FindOperator.EQ)

    HS4J同样支持˜qžæŽ¥æ± ï¼Œå¯ä»¥åœ¨æž„建客æˆïL(f¨¥ng)«¯çš„æ—¶å€™ä¼ å…¥è¿žæŽ¥æ± å¤§å°åQ?br />
  //100-connections pool
   HSClient hsClient = new HSClientImpl(new InetSocketAddress(9999),100);

   在open index的时候,ä¼?x¨¬)在˜qžæŽ¥æ± é‡Œæ‰€æœ‰çš„˜qžæŽ¥ä¸Šéƒ½openã€‚åÆˆä¸”åœ¨˜qžæŽ¥å› äØ“(f¨´)意外情况åQˆå¦‚¾|‘络错误åQ‰æ–­å¼€çš„æ—¶å€™ï¼ŒHS4Jä¼?x¨¬)自动重˜qžï¼Œòq¶åœ¨é‡è¿žæˆåŠŸçš„æƒ…å†µä¸‹è‡ªåŠ¨å‘é€å·²¾lopençš„indexåQŒä¿è¯åº”用的操作不受重连影响ã€?br />
    因䨓(f¨´)HS4J是我在两天内写就的一个东西,可能˜q˜æœ‰ä¸å°‘隐藏的bugåQŒåƈ且HandlerSocket本èín也是个新东西åQŒå¦‚果有什么问题或者改˜q›å¾è®®ï¼Œéšæ—¶‹Æ¢è¿Žå‘Šè¯‰æˆ‘,多谢ã€?br />

  
  



]]>
Java NIO trick and traphttp://www.aygfsteel.com/killme2008/archive/2010/11/22/338420.htmldennisdennisMon, 22 Nov 2010 10:22:00 GMThttp://www.aygfsteel.com/killme2008/archive/2010/11/22/338420.htmlhttp://www.aygfsteel.com/killme2008/comments/338420.htmlhttp://www.aygfsteel.com/killme2008/archive/2010/11/22/338420.html#Feedback18http://www.aygfsteel.com/killme2008/comments/commentRss/338420.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/338420.html      上周在内部做的一个Java NIO框架的实现技巧和陷阱的分享,对编写NIO¾|‘络框架有兴­‘£çš„æœ‹å‹å¯èƒ½æœ‰ç‚¹å¸®åŠ©åQŒä¸Šä¼ slideshare.net一直出错,直接提供下蝲吧ã€?br />     
     下蝲地址åQ?a href="http://www.aygfsteel.com/Files/killme2008/NIO%20trick%20and%20trap.pdf.zip">Nio Trick and Trap.pdf.zip







]]>
对kilim nio模块的改˜q?/title><link>http://www.aygfsteel.com/killme2008/archive/2010/11/19/338504.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Fri, 19 Nov 2010 10:40:00 GMT</pubDate><guid>http://www.aygfsteel.com/killme2008/archive/2010/11/19/338504.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/338504.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2010/11/19/338504.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/338504.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/338504.html</trackback:ping><description><![CDATA[<br />     前段旉™—´å¯¹kilim的当前版本做了一些改˜q›ï¼Œé›†ä¸­åœ¨nio调度器这一块。Kilim新版本引入了nio调度器,可以跟非é˜Õd¡žIO¾l“åˆåœ¨ä¸€èµøP¼Œä»Žè¿™ä¸ªç‰ˆæœ¬å¼€å§‹ï¼Œkilim才真正具有实用性。协½E‹åªæœ‰è·Ÿéžé˜»å¡žIO¾l“合èµäh¥æ‰èƒ½å‘挥威力啊。但是Kilim的默认的nio调度器还只是使用一个nio worker做调度,˜q™è·ŸçŽ°æœ‰çš„NIO框架采用多个nio worker来提升效率比较è“v来相对落伍。我改进äº?a >NioSelectorScheduler</a>åQŒå¼•入了¾cÖM¼¼Netty3çš„bosså’Œwoker的概念,bossè´Ÿè´£˜qžæŽ¥æŽ¥å…¥åQŒè€Œworkerè´Ÿè´£˜qžæŽ¥çš„IOè¯Õd†™åQŒåƈ且默认设¾|®worker数目为CPU个数的两倍。经˜q‡æˆ‘的测试,改进后的NIO调度器的效率˜qœè¿œ­‘…过了现有的调度器,有兴­‘£å¯ä»¥ç”¨nettyçš„benchmark跑一下example里的<a title="EchoServer" >EchoServer</a>ã€?br /> <br />     Kilim默认˜q˜æä¾›äº†ä¸€ä¸ªç®€æ˜“Http Server框架åQŒä½†æ˜¯æ²¡æœ‰æä¾›Http Client的实玎ͼŒæˆ‘的另一个改˜q›æ˜¯æä¾›äº†ä¸€ä¸ªç®€æ˜“çš„Http Client实现åQŒä¹Ÿæ˜¯åˆ©ç”¨Ragel做协议解析,一个简单的使用例子如下åQ?br /> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> kilim.examples;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> kilim.Pausable;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> kilim.Task;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> kilim.http.HttpClient;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> kilim.http.HttpResponse;<br /> <br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SimpleHttpClient {<br />     </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SimpleTask </span><span style="color: #0000ff;">extends</span><span style="color: #000000;"> Task {<br />         @Override<br />         </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> execute() </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> Pausable, Exception {<br />             HttpClient client </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> HttpClient();<br /> <br />             HttpResponse resp </span><span style="color: #000000;">=</span><span style="color: #000000;"> client.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.google.com.hk/</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />             System.out.println(resp.status());<br />             System.out.println(resp.content());<br />         }<br />     }<br /> <br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {<br />         SimpleTask task </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SimpleTask();<br />         task.start();<br />     }<br /> <br /> }<br /> </span></div> <br /> <br />     ˜q™ä¸ª½Ž€é™‹çš„HttpClient目前只支持GET/POSTåQŒåŒæ—¶æ”¯æŒHttp chunk¾~–码åQˆå¾—益于kilim原有代码åQ‰ï¼Œåšä¸€äº›ç®€å•çš„HTTP调用已经­‘›_¤Ÿã€‚我ž®è¯•在一个项目里使用˜q™ä¸ªHttpClientåŽÀL›¿ä»£java默认的HttpURLConnectionåQŒæ•ˆçŽ‡æœ‰éƒ¨åˆ†æå‡åQŒä½†æ˜¯åŒæ—¶ç”±äºŽå¤§é‡å½E‹å­˜åœ¨å ç”¨äº†å¾ˆå¤§éƒ¨åˆ†çš„内存,¾l™GC也带来了不小的压力ã€?br /> <br />     我的代码直接从kilim的主òq²fork出来åQŒæœ‰å…´è¶£å¯ä»¥ç›´æŽ¥git clone下来玩玩,地址 <a title="https://github.com/killme2008/kilim" > https://github.com/killme2008/kilim</a><br /><img src ="http://www.aygfsteel.com/killme2008/aggbug/338504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2010-11-19 18:40 <a href="http://www.aygfsteel.com/killme2008/archive/2010/11/19/338504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">ÁùÅÌË®ÊÐ</a>| <a href="http://" target="_blank">³ØÖÝÊÐ</a>| <a href="http://" target="_blank">ÈݳÇÏØ</a>| <a href="http://" target="_blank">¸Ê×ÎÏØ</a>| <a href="http://" target="_blank">ÕÃÎäÏØ</a>| <a href="http://" target="_blank">Í­´¨ÊÐ</a>| <a href="http://" target="_blank">ÇìÑôÊÐ</a>| <a href="http://" target="_blank">ÄÚ½­ÊÐ</a>| <a href="http://" target="_blank">³¤É³ÏØ</a>| <a href="http://" target="_blank">ÒÊÔ´ÏØ</a>| <a href="http://" target="_blank">Àè³ÇÏØ</a>| <a href="http://" target="_blank">±¨¼Û</a>| <a href="http://" target="_blank">¤Î÷ÏØ</a>| <a href="http://" target="_blank">Í¨É½ÏØ</a>| <a href="http://" target="_blank">¼ªÁÖÊÐ</a>| <a href="http://" target="_blank">ÏçÄþÏØ</a>| <a href="http://" target="_blank">Åî°²ÏØ</a>| <a href="http://" target="_blank">¹àÄÏÏØ</a>| <a href="http://" target="_blank">¼¯°²ÊÐ</a>| <a href="http://" target="_blank">´óʯÇÅÊÐ</a>| <a href="http://" target="_blank">̨¶«ÊÐ</a>| <a href="http://" target="_blank">ÕżҿÚÊÐ</a>| <a href="http://" target="_blank">ÁúÉ½ÏØ</a>| <a href="http://" target="_blank">¿Æ¼¼</a>| <a href="http://" target="_blank">º£ÄþÊÐ</a>| <a href="http://" target="_blank">ǰ¹ù¶û</a>| <a href="http://" target="_blank">аͶû»¢ÓÒÆì</a>| <a href="http://" target="_blank">ÐÂÌ©ÊÐ</a>| <a href="http://" target="_blank">ÇåÔ­</a>| <a href="http://" target="_blank">Ì©ÖÝÊÐ</a>| <a href="http://" target="_blank">Ïî³ÇÊÐ</a>| <a href="http://" target="_blank">Û°³ÇÏØ</a>| <a href="http://" target="_blank">êùÎªÏØ</a>| <a href="http://" target="_blank">ÔÆÑôÏØ</a>| <a href="http://" target="_blank">Ñúå¨</a>| <a href="http://" target="_blank">Âé½­ÏØ</a>| <a href="http://" target="_blank">Íû¿üÏØ</a>| <a href="http://" target="_blank">ÉÛÑôÊÐ</a>| <a href="http://" target="_blank">°²ÏçÏØ</a>| <a href="http://" target="_blank">Æ½ÒØÏØ</a>| <a href="http://" target="_blank">ÚöáÁÊÐ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>