??xml version="1.0" encoding="utf-8" standalone="yes"?>精品久久久国产,成人国产一区二区三区精品,国产精品久久久久久久久久ktv http://www.aygfsteel.com/killme2008/archive/2012/06/15/380822.htmldennisdennisThu, 14 Jun 2012 18:52:00 GMThttp://www.aygfsteel.com/killme2008/archive/2012/06/15/380822.htmlhttp://www.aygfsteel.com/killme2008/comments/380822.htmlhttp://www.aygfsteel.com/killme2008/archive/2012/06/15/380822.html#Feedback1http://www.aygfsteel.com/killme2008/comments/commentRss/380822.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/380822.html     HouseMD是淘宝的聚石写的一个非怼U的Javaq程q行时诊断和调试工具Q如果你接触qbtraceQ那么HouseMD也许你应该尝试下Q它比btrace更易用,不需要写脚本Q类似strace的方式attach到jvmq程做跟t调试?br />
    基本的安装和使用Lq篇文档?a >UserGuide》,恕不重复。以下内定w假设你正安装了housemd?br />
    本文主要介绍下怎么用housemd诊断跟踪clojureq程。Clojure的java实现也是跑在JVM里,当然也可以用housemd?br />
    我们以一个简单的例子开始,假设我们有如下clojure代码Q?br />
(loop [x 1]
  (Thread/sleep 1000)
  (prn x)
  (recur (inc x)))

    q段很简单,只是间隔一U不断地打印递增的数字x。我们准备用housemd跟踪q个E序的运行,首先q行q个E序Q你可以用leinQ也可以直接java命oq行Q?br />
java -cp clojure.jar clojure.main test.clj

    q行时不断地在控制台打印数字Q通过jps或者ps查询到该q程的idQ假设ؓpidQ用housemdq接到该q程Q?br />
housemd <pid>
    利q入housemd的交互控制台Q通过help命o可以查询支持的命令:

housemd> help

quit      terminate the process.
help      display this infomation.
trace     display or output infomation of method invocaton.
loaded    display loaded classes information.

    要用housemd调试clojureQ你需要对clojure的实现有一点点了解Q有兴趣可以看过ȝ一blog?a href="http://www.aygfsteel.com/killme2008/archive/2010/07/11/325775.html">clojure hacking guide》,单来_clojure的编译器会将clojure代码~译成javacdƈq行。对于JVM来说Qclojure生成的类Q跟java~译器生成类没有什么不同?br />     具体C面的clojure代码Q会生成一个名?strong>user$eval1的类Quser是默认的namespaceQ而eval1是clojure~译器自动生成的一个标C类名,通过loaded命o查询cȝ加蝲情况Q?br />
housemd> loaded user$eval1 -h
user$eval1 -> null
    - clojure.lang.DynamicClassLoader@1d25d06e
        - clojure.lang.DynamicClassLoader@1d96f4b5
            - sun.misc.Launcher$AppClassLoader@a6eb38a
                - sun.misc.Launcher$ExtClassLoader@69cd2e5f

    通过-h选项打印了加载user$eval1的类加蝲器的层次关系Q因为user$eval1是动态生成的Qclojure启动q程中)Q因此它不在M一个class或者jar文g中。除了查询user namespace的类之外Q你q可以查询clojure.core,clojure.lang,clojure.java{Q何被加蝲q来的类Q例如查询clojure.core.prn的类,在clojure里这是一个函敎ͼ在jvm看来q只是一个类Q?br />
housemd> loaded -h core$prn
clojure.core$prn -> /Volumes/HDD/Users/apple/clojure/clojure.jar
    - sun.misc.Launcher$AppClassLoader@a6eb38a
        - sun.misc.Launcher$ExtClassLoader@69cd2e5f
   注意Q不需要完整的namespace——clojure.coreQ直接core$prn卛_。其他也是类伹{?strong>技巧:如果你实在不知道clojure~译器生成的cdQ你可以利用jvm自带的jmap命o来查询?/strong>

   接下来,我们试用trace命o跟踪Ҏ的运行,例如例子中的clojure代码用到了loop和recur两个sepcial formQ我们跟t下loop:
housemd> trace -t 5 core$loop
INFO : probe class clojure.core$loop
core$loop.doInvoke(Object, Object, Object, Object)    sun.misc.Launcher$AppClassLoader@a6eb38a            0            -ms    null
core$loop.getRequiredArity()                          sun.misc.Launcher$AppClassLoader@a6eb38a            0            -ms    null

core$loop.doInvoke(Object, Object, Object, Object)    sun.misc.Launcher$AppClassLoader@a6eb38a            0            -ms    null
core$loop.getRequiredArity()                          sun.misc.Launcher$AppClassLoader@a6eb38a            0            -ms    null

core$loop.doInvoke(Object, Object, Object, Object)    sun.misc.Launcher$AppClassLoader@a6eb38a            0            -ms    null
core$loop.getRequiredArity()                          sun.misc.Launcher$AppClassLoader@a6eb38a            0            -ms    null

core$loop.doInvoke(Object, Object, Object, Object)    sun.misc.Launcher$AppClassLoader@a6eb38a            0            -ms    null
core$loop.getRequiredArity()                          sun.misc.Launcher$AppClassLoader@a6eb38a            0            -ms    null

core$loop.doInvoke(Object, Object, Object, Object)    sun.misc.Launcher$AppClassLoader@a6eb38a            0            -ms    null
core$loop.getRequiredArity()                          sun.misc.Launcher$AppClassLoader@a6eb38a            0            -ms    null

INFO : Ended by timeout
INFO : reset class clojure.core$loop

    ?U内Qclojure.core$loopcL两个Ҏ各被调用?ơ,doInvoke是实际的调用Q而getRequiredArity用来查询loop所需要的参数个数。traceq可以跟t到具体的方法,例如我们跟踪prn函数的调用情况:
housemd> trace -t 5 core$prn.doInvoke
INFO : probe class clojure.core$prn
core$prn.doInvoke(Object)    sun.misc.Launcher$AppClassLoader@a6eb38a            1            1ms    clojure.core$prn@3e4ac866

core$prn.doInvoke(Object)    sun.misc.Launcher$AppClassLoader@a6eb38a            2           <1ms    clojure.core$prn@3e4ac866

core$prn.doInvoke(Object)    sun.misc.Launcher$AppClassLoader@a6eb38a            3           <1ms    clojure.core$prn@3e4ac866

core$prn.doInvoke(Object)    sun.misc.Launcher$AppClassLoader@a6eb38a            4           <1ms    clojure.core$prn@3e4ac866

core$prn.doInvoke(Object)    sun.misc.Launcher$AppClassLoader@a6eb38a            5           <1ms    clojure.core$prn@3e4ac866

INFO : Ended by timeout
INFO : reset class clojure.core$prn
  
   trace打印了方法的调用ơ数Q?U内Q和每次调用的时_毫秒U别Q,以及调用的target object。小技巧:没有可变参数的函数生成类最l调用的是invokeҎQ参C数可能重载)Q有可变参数的函数调用的是doInvokeҎ?br />
   trace命oq支持打印调用堆栈到文gQ例如:
trace -t 5 -d -s  core$prn.doInvoke

   利用-s?d命o会将详细的调用信息输出到临时目录Q时目录的路径可以通过trace help命o查询刎ͼ在我的机器上?tmp/trace/<pid>@host目录下。调用堆栈的输出cMQ?br />
example$square.invoke(Long) call by thread [main]
    example$eval9.invoke(test.clj:11)
    clojure.lang.Compiler.eval(Compiler.java:6465)
    clojure.lang.Compiler.load(Compiler.java:6902)
    clojure.lang.Compiler.loadFile(Compiler.java:6863)
    clojure.main$load_script.invoke(main.clj:282)
    clojure.main$script_opt.invoke(main.clj:342)
    clojure.main$main.doInvoke(main.clj:426)
    clojure.lang.RestFn.invoke(RestFn.java:421)
    clojure.lang.Var.invoke(Var.java:405)
    clojure.lang.AFn.applyToHelper(AFn.java:163)
    clojure.lang.Var.applyTo(Var.java:518)
    clojure.main.main(main.java:37)

   上面q个单的例子展示了用housemd跟踪诊断clojureq程的方法?br />
   自定义ns和函数的调试与此cMQ假设我们有下面的clojure代码Q?br />
(ns example)
(defn square [x]
  (* x x))

(loop [x 1]
  (Thread/sleep 1000)
  (square x)
  (recur (inc x)))
 
   ns为exampleQ自定义函数squareq定期@环调用。用housemd诊断q段代码Q?br />
loaded -h example$square     #查询square的加载情?br />trace -t 10 -d -s example$square.invoke  #跟踪10U内square的调用情?/div>

dennis 2012-06-15 02:52 发表评论
]]>Emacs + Clojure配置的几个Tiphttp://www.aygfsteel.com/killme2008/archive/2012/05/19/378535.htmldennisdennisFri, 18 May 2012 16:57:00 GMThttp://www.aygfsteel.com/killme2008/archive/2012/05/19/378535.htmlhttp://www.aygfsteel.com/killme2008/comments/378535.htmlhttp://www.aygfsteel.com/killme2008/archive/2012/05/19/378535.html#Feedback8http://www.aygfsteel.com/killme2008/comments/commentRss/378535.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/378535.html     很久没更新博客了Q在北京工作Q忙ƈ且充实。目前来_Clojure最好的开发编辑器应该是Emacs + Slime的组合,利用swank-clojureq个目Q加上clojure-modeQ可以完地q行slime。编译、运行、蟩转、文档和引用查看甚至debug都可以搞定。具体配|恕不重复,看swank-clojure的文档即可自己安装v来,或者这?a >中文博客Q?a >windows上配|?/a>?br />
    分n几个TipQ也期待大家分n你们的用心得?br />
    首先是自动在打开clj后缀文g的时候启动执行clojure-jack-in与slimeq接Q可以在emacs配置里加上个callbackQ?br />
(eval-after-load "clojure-mode"
  '(progn
     (require 'slime)
     (require 'clojure-mode)
     (unless (slime-connected-p)
       (save-excursion (clojure-jack-in)))))
    q样在打开clj为后~的文件的时候,自动启动clojure-mode执行clojure-jack-in函数q且q接slime?br />
    clj后缀的文件自动关联到clojure-mode:
(setq auto-mode-alist (cons '("\\.clj$" . clojure-mode) auto-mode-alist))
    通常来说如果你是利用marmalade安装的,会自动关联的?br />
    另外Q启动自动匹配括受字W串引号{的paredit模式一定要启动Q?br />
(defun paredit-mode-enable () (paredit-mode 1))
(add-hook 'clojure-mode-hook 'paredit-mode-enable)
(add-hook 'clojure-test-mode-hook 'paredit-mode-enable)

   在用clojure-mode或者clojure-test-mode的时候自动启用paredit模式Q括号再也不是问题。括号匹配提CZ般是开启的Q如果没有,强制开启:

;;    昄括号匚w
(show-paren-mode t)
(setq show-paren-style 'parentheses)

    slime更多配置Q启用IO重定向(多线EIO输出都定向到SLIME replQ以及设|通讯字符~码{:

(eval-after-load "slime"
  '(progn
     (slime-setup '(slime-repl slime-fuzzy))
     ;;(setq slime-truncate-lines t)
     (setq  swank:*globally-redirect-io*  t)
     ;; (setq slime-complete-symbol-function ' slime-fuzzy-complete-symbol)
     (setq slime-net-coding-system 'utf-8-unix)))

    l心的朋友可能注意到我注释了slime-fuzzy-complete的配|,q是一个支持更好的自动补全功能的SLIME插gQ可以用~写来自动补全)Q可惜在我机器上没有试配置成功Q有兴趣你可以尝试下?br />
    在REPL里支持语法高亮,一定要配置上:

(add-hook 'slime-repl-mode-hook
          (defun clojure-mode-slime-font-lock ()
            (require 'clojure-mode)
            (let (font-lock-mode)
              (clojure-mode-font-lock-setup))))

    单独在clojure-modeQ在其他mode里这些快捷键不会起作用)里配|快捷键可以q样:
(eval-after-load "clojure-mode"
  '(progn
     (require 'slime)
     (require 'clojure-mode)
     (define-key clojure-mode-map (kbd "M-/")  (quote slime-complete-symbol))
     (define-key clojure-mode-map (kbd "C-c s")  (quote slime-selector)))

   例如我这里将M-/作ؓ自动补全的快捷键Q因为meta键在我的Mac机器上设|ؓcommand键,因此自动补全的操作习惯就跟EclipsecM。?strong>slime-selector是一个非常有用的函数Q用来蟩转到slime的一pdbufferQ因此我l定了C-c s快捷键?br />
    额外一提,在Mac osx下,command作ؓmeta?
;;; I prefer cmd key for meta
(setq mac-option-key-is-meta nil
      mac-command-key-is-meta t
      mac-command-modifier 'meta
      mac-option-modifier 'none)

    最后,期待大家不吝分n你的心得?br />    

dennis 2012-05-19 00:57 发表评论
]]>
JavaE序员常用工具集http://www.aygfsteel.com/killme2008/archive/2012/04/17/374936.htmldennisdennisTue, 17 Apr 2012 09:05:00 GMThttp://www.aygfsteel.com/killme2008/archive/2012/04/17/374936.htmlhttp://www.aygfsteel.com/killme2008/comments/374936.htmlhttp://www.aygfsteel.com/killme2008/archive/2012/04/17/374936.html#Feedback15http://www.aygfsteel.com/killme2008/comments/commentRss/374936.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/374936.html    我发现很多h没办法高效地解决问题的关键原因是不熟悉工P不熟悉工具也qŞ了,甚至q不知道怎么L工具Q这个问题就大条了。我惛_下我能想到的一个JavaE序员会用到的常用工兗?br />
一、编码工?br />
1.IDEQ?a >Eclipse或?a >IDEAQ熟悉尽可能多的快捷键,?a >Eclipse常见快捷键列?/a>?br /> 2.插gQ?nbsp;
(1) FindbugsQ在release之前q行一ơ静态代码检查是必须?br /> (2) CloverQ关心你的单元测试覆盖率
(3) Checkstyle 代码风格?br />
3.构徏和部|工?ant或?a >mavenQ现在主都是maven了吧Q?a >使用nexus搭徏mavenU服Q再加上持箋集成jenkins。代码质量不用愁?br />
4.版本理工具Q?svn或?a >git

5.diff和patch

6.讄你的eclipse或者IDEAQ如formatter,save actions以及code template{。代码风|直接用google的也可以啊。?a >Google style guide?br />
7.掌握一个文本编辑器QEmacs或者VIMQ熟悉常用快捷键。这在你需要在U编辑代码,或者编写其他语a代码时候特别有用。?a >器圣战?br />
二、JDK相关

1.jstat : 观察GC情况Q如Q?br />
jstat -gcutil pid 2000

2.jmapQ查看heap情况Q如查看存活对象列表Q?br />
jmap -histo:live pid |grep com.company |less 

或者dump内存用来分析Q?br />
jmap -dump:file=test.bin pid

3.分析dump的堆文gQ可以用jhat:

jhat test.bin

  分析完成后可以用览器查看堆的情c这个工L分析l果q比较原始,你还可以?a >Eclipse MAT插gq行囑Ş化分析,或者IBM?a >Heap Analyzer.

4.jvisualvm和jconsoleQ?JVM自带的性能分析和监控工P怎么用?误q文档?/a>

5.jstackQ分析线E堆栈,?br />
jstack pid > thread_dump

    查看CPU最高的U程在干什么的Ҏl合top和jstackQ?a >http://www.iteye.com/topic/1114219


6.更多JVM工具Q参见官Ҏ档:http://docs.oracle.com/javase/6/docs/technotes/tools/

7.学习使用btrace分析javaq行旉题。?a >Btrace使用?/a>?br />
8.GC日志分析工具Q?a >GC viewer?a >GC-console或?a >自己挑吧?/a>

9.性能分析工具Q除了自带的jvisualvm外,q可以用商业?a >jprofiler?br />
10.JVM参数大全

11.?a >JVM调优标准参数陷阱》,iteye脓?br />
三、Linux工具

1.熟悉常用的shell命oQ?/a>


3.使用htop替换top?br />
4.熟悉?a >strace,gdb甚至systemtap来分析问题?br />
5.熟悉vmstat,iostat,sar{性能l计工具?/a>

5.自动化部|脚本,
py-fabric或者自荐下我的clojure-control?br />
四、其?br />
1.掌握一门脚本语aQ?a >Python或?a >RubyQ高效解决一些需要quick and dirty的Q务:比如d文g、导入导出数据库、网늈虫等。注意不是python.comQ咔咔?br />
2.使用Linux或者Mac ospȝ作ؓ你的开发环境?br />
3.升你的“g工具”Q双屏大屏显C器、SSD?G内存甚至更多?br />
4.你懂的:https://code.google.com/p/goagent/

五、如何查扑ַP

1.搜烦引擎Qgoogle或者baiduQ?a >搜烦技?/a>?br />
2.万能的stack overflowQ?a >http://stackoverflow.com/

3.虚心问牛人?br />
六、最重要的是⋯⋯

一颗永不停止学习的心?img src ="http://www.aygfsteel.com/killme2008/aggbug/374936.html" width = "1" height = "1" />

dennis 2012-04-17 17:05 发表评论
]]>
Emacs之一键格式化http://www.aygfsteel.com/killme2008/archive/2011/07/26/355041.htmldennisdennisTue, 26 Jul 2011 03:24:00 GMThttp://www.aygfsteel.com/killme2008/archive/2011/07/26/355041.htmlhttp://www.aygfsteel.com/killme2008/comments/355041.htmlhttp://www.aygfsteel.com/killme2008/archive/2011/07/26/355041.html#Feedback4http://www.aygfsteel.com/killme2008/comments/commentRss/355041.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/355041.html    格式化源码是很常见的需求,emacs有个indent-region函数用于格式化选定的代码,前提是你处在某个非text mode下,如c-mode或者java-mode之类。如果要格式化整个文Ӟ你需要先选定整个文g(C-x-h)Q然后调用indent-regionQ或?C-M-\ )。两个命令LȝQ我们可以定义个函数搞定q一切,q绑定在一个特定键上,实现一键格式化Q?br />
;;格式化整个文件函?br />(defun indent-whole ()
  (interactive)
  (indent
-region (point-min) (point-max))
  (message 
"format successfully"))
;;l定到F7?br />(global
-set-key [f7] 'indent-whole)

    这D代码添加到你的emacs配置文gQ~/.emacs)Q重启emacsQ以后格式化源码都可以用F7一键搞定?img src ="http://www.aygfsteel.com/killme2008/aggbug/355041.html" width = "1" height = "1" />

dennis 2011-07-26 11:24 发表评论
]]>
վ֩ģ壺 ƽ| | | | ƽ| | ϰ| | | | ɽ| ͬ| ˮ| Դ| | ¦| ¡| ξ| | | | ɰ| | | | | | | ׯ| | | | | | ɽ| | פ| ɽ| | | |