??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲首页国产精品丝袜,亚洲精品高清国产一线久久,日韩色视频一区二区三区亚洲http://m.tkk7.com/sean/category/35.htmlRead me, read Sean.zh-cnSun, 09 Mar 2014 10:25:17 GMTSun, 09 Mar 2014 10:25:17 GMT60IntelliJ IDEA 常用快捷?/title><link>http://m.tkk7.com/sean/archive/2014/03/09/410781.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Sun, 09 Mar 2014 05:38:00 GMT</pubDate><guid>http://m.tkk7.com/sean/archive/2014/03/09/410781.html</guid><wfw:comment>http://m.tkk7.com/sean/comments/410781.html</wfw:comment><comments>http://m.tkk7.com/sean/archive/2014/03/09/410781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/sean/comments/commentRss/410781.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/sean/services/trackbacks/410781.html</trackback:ping><description><![CDATA[<br /> 整理一?IntelliJ IDEA 最常用的快捷键Q按照便于记忆的方式排列Q?br /> <br /> <pre> Ctrl-N              Class... (find by name) Ctrl-Shift-N        File... (find by name) Ctrl-Shift-Alt-N    Symbol... (find by name) Ctrl-G              Line... (goto line) Ctrl-H              Type hierarchy (hierarchy) Ctrl-Shift-H        Method hierarchy (hierarchy) Ctrl-Alt-H          Call hierarchy (hierarchy) Ctrl-Q              Quick documentation Ctrl-Alt-I          Auto-indent lines (indent) Ctrl-Alt-L          Reformat code (line up) Ctrl-Alt-O          Optimize imports (optimize) Ctrl-/              Comment with line comment (//) Ctrl-Shift-/        Comment with block comment (/*...*/) Ctrl-W              Select word or block (word) Ctrl-D              Copy line (duplicate line, yyp) Ctrl-X              Cut line (dd) Ctrl-U              Uppercase/lowercase (upper) Ctrl-J              Insert live template Ctrl-Alt-J          Surround with live template Ctrl-Alt-T          Surround with (template) Ctrl-Shift-J        Join lines (join) Ctrl-E              Recent files (editions) Ctrl-Shift-E        Recently changed files (editions) Alt-Shift-C         Recent changes (changes) Ctrl-B              Delcaration Ctrl-Shift-B        Type declaration Ctrl-Alt-B          Implementation(s) Ctrl-P              Parameter info (parameter) Ctrl-Space          Basic completion Ctrl-Shift-Space    Smart completion Ctrl-Alt-Space      Completion lookup Alt-Enter           Auto-complete Alt-Insert          Generate... Ctrl-Shift-Up/Down  Move statement up/down Alt-Shift-Up/Down   Move line up/down Ctrl-Up/Down        Scroll up/down Alt-Up/Down         Previous/next method F2                  Next highlighted error Shift-F2            Previous highlighted error Ctrl-F              Find Ctrl-R              Replace F3                  Next match Shift-F3            Previous match F4                  Jump to source Ctrl-Alt-Shift-T    Refactor this F5                  Refactor copy F6                  Refactor move Ctrl-F6             Refactor change signature Shift-F6            Refactor rename Alt-Delete          Refactor safe delete Ctrl-Alt-V          Refactor extract variable Ctrl-Alt-F          Refactor extract field Ctrl-Alt-P          Refactor extract parameter Ctrl-Alt-M          Refactor extract method Ctrl-Alt-N          Refactor inline </pre> <img src ="http://m.tkk7.com/sean/aggbug/410781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/sean/" target="_blank">laogao</a> 2014-03-09 13:38 <a href="http://m.tkk7.com/sean/archive/2014/03/09/410781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] Windows环境下Apache最基本的调优方?/title><link>http://m.tkk7.com/sean/archive/2011/08/02/355618.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Tue, 02 Aug 2011 13:04:00 GMT</pubDate><guid>http://m.tkk7.com/sean/archive/2011/08/02/355618.html</guid><wfw:comment>http://m.tkk7.com/sean/comments/355618.html</wfw:comment><comments>http://m.tkk7.com/sean/archive/2011/08/02/355618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/sean/comments/commentRss/355618.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/sean/services/trackbacks/355618.html</trackback:ping><description><![CDATA[<p> 今天q程支持同事在Windows环境调优Apache服务器性能Q记录在此,供需要的朋友参考?/p> <p> Java EE应用Q同旉|在两个Tomcat(5.5.27)实例上,前面放了个Apache(httpd-2.2.19-win32-x86-no_ssl)Q通过mod_jk(1.2.32)做负载均衡,同一台物理服务器Q操作系lؓ64位的Windows Server 2003 SP2。现象是60+客户端,q_每个客户端每U请求数2ơ,单个h正常响应旉?00ms以内Q即每秒冲进?20个请求,q发量最多在60上下QApache已不堪"?负,静态资源响应时间都过10sQ同时Tomcat和数据库服务器均正常。凭我的l验Q同L压力直接压到Tomcat也不至于q么隄。看来问题出在Apache?/p> <p> 首先修改httpd.conf配置文gQ打开status模块Q?/p> <p> <code> LoadModule status_module modules/mod_status.so<br/> <Location /status><br/>   SetHandler server-status<br/>   Order deny,allow<br/>   Deny from all<br/>   Allow from 127.0.0.1 #需要的话也可放开为all<br/> </Location> </code></p> <p> q样我们p通过/status面查看服务器当前的状态信息,l果观察到worker(即线E?C?4Q坑爹啊Q难怪撑不住。我记得以前Windows下面的Apache默认U程数没q么的。找准问题,接下来就好办了:</p> <p> <code> <IfModule mpm_winnt.c><br/>   ThreadsPerChild 300<br/>   MaxRequestsPerChild 0<br/> </IfModule> </code></p> <p> E微解释一下:mpm_winnt.c是Apache为Windows NT提供的MPM (Multi-Processing Module)Q对应到Linux环境下,则有prefork.c(多进E?每进E?个线E?和worker.c(多进E?多线E?两种MPM可选。Windows下面只会有父与子两个q程Q因此单个子q程能同时v多少U程(ThreadsPerChild)成了调优的关键。另一个参数MaxRequestsPerChild的含义是单个子进E篏计最多处理到个hQ超q该值则退出重启,q是Z防止内存泄露慢慢拖垮整个服务器而做的防御性措施,0表示不做此限制?/p> <p> 新配|上U后Q客L数量利冲上200+。Case closed.</p> <img src ="http://m.tkk7.com/sean/aggbug/355618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/sean/" target="_blank">laogao</a> 2011-08-02 21:04 <a href="http://m.tkk7.com/sean/archive/2011/08/02/355618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>"上v"是如何变?涓婃?的?http://m.tkk7.com/sean/archive/2011/03/29/347243.htmllaogaolaogaoTue, 29 Mar 2011 15:50:00 GMThttp://m.tkk7.com/sean/archive/2011/03/29/347243.htmlhttp://m.tkk7.com/sean/comments/347243.htmlhttp://m.tkk7.com/sean/archive/2011/03/29/347243.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/347243.htmlhttp://m.tkk7.com/sean/services/trackbacks/347243.html

今天帮同事解决一个邮件ؕ码的问题Q简C此?

邮g正文׃贴了Q有一D从上下文判断明昑ֺ该是"上v"Q却昄成了"?.."Q于是自然而然的拿??字和"?字来分析?

通过单的Groovy脚本对这两个汉字分别按gbk和utf-8~码Qƈ得到的byte[]转换成二q制表示输出如下Q?

== ?==
11001001 11001111
11100100 10111000 10001010
== ?==
11100100 10111000
11100110 10110110 10010011

注意"?字的W?排前两组??字第1排的两组byte正好相同Q于是问题迎刃而解Qؕ码是׃邮g以utf-8~码后被错误的以gbk解码Q随后又重新~码成utf-8Q造成的?/p>

关键代码Q?/p>

void showBytes(String input) {
  println("== " + input + " ==")
  b = input.getBytes("gbk")
  b.each { print Integer.toBinaryString(it).substring(24) + ' ' }
  println()
  b = input.getBytes("utf8")
  b.each { print Integer.toBinaryString(it).substring(24) + ' ' }
  println()
}



laogao 2011-03-29 23:50 发表评论
]]>
如何让统一版本的Eclipse RCP应用同时支持多个q_http://m.tkk7.com/sean/archive/2011/01/30/343769.htmllaogaolaogaoSun, 30 Jan 2011 04:17:00 GMThttp://m.tkk7.com/sean/archive/2011/01/30/343769.htmlhttp://m.tkk7.com/sean/comments/343769.htmlhttp://m.tkk7.com/sean/archive/2011/01/30/343769.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/343769.htmlhttp://m.tkk7.com/sean/services/trackbacks/343769.html

和Swing应用的直接跨q_不同QSWT/RCP应用要想同时支持不同q_Q需要做些特D的配置Q不qƈ不复杂,记录在此Q希望能帮到有需要的朋友。目前win32?2位Linux?4位Linux和Mac OS X基本上就覆盖了所有主的桌面操作pȝQ本文将以同时支持这四种OSZ来进行讲解?/p>

首先是下载对应版本的RCP框架在不同操作系l的插gQ将它们攑֜同一个plugins目录Q比如你可以用win32为基Q然后添加针对其他^台的如下插g:

org.eclipse.core.filesystem
org.eclipse.core.filesystem.win32.x86
org.eclipse.core.filesystem.linux.x86
org.eclipse.core.filesystem.linux.x86_64
org.eclipse.core.filesystem.macosx

org.eclipse.core.net
org.eclipse.core.net.win32.x86
org.eclipse.core.net.linux.x86

org.eclipse.core.resources
org.eclipse.core.resources.win32.x86

org.eclipse.equinox.launcher
org.eclipse.equinox.launcher.win32.win32.x86
org.eclipse.equinox.launcher.gtk.linux.x86
org.eclipse.equinox.launcher.gtk.linux.x86_64
org.eclipse.equinox.launcher.carbon.macosx

org.eclipse.equinox.security
org.eclipse.equinox.security.win32.x86
org.eclipse.equinox.security.macosx

org.eclipse.swt
org.eclipse.swt.win32.win32.x86
org.eclipse.swt.gtk.linux.x86
org.eclipse.swt.gtk.linux.x86_64
org.eclipse.swt.carbon.macosx

接下来将不同q_下的eclipse可执行文?Windows下面是eclipe.exeQLinux下是eclipseQMac OS X下面是Eclipse.app)攑ֈ不同的子目录下,当然Q如果你的RCP应用有别的名Uͼ也可以重命名eclipse可执行文Ӟ按照不同q_的规范更换图标,然后修改.ini文g让它?startup?startup.libraray参数指向相对路径中正版本的插g卛_?/p>

最后分享一下我们Y仉|的机制: 按照前面介绍的方式打包的应用E序Q交到用h里ƈ不是很友好,因ؓ需要他/她自己再做一ơ判断,当前的操作系l是什么,然后打开不同的目录去点击不同的可执行文g。我们的做法是单独提供一个SwingE序Q在客户端自动判断OSQ然后自动调用不同版本的可执行文Ӟ同时Q这个SwingE序被做成Java Web StartQ把整个RCP客户端的下蝲和同步也处理掉,q样Q对用户而言Q整个过E就透明了,只需要一个JNLPQ剩下的工作完全自动化?/p>

laogao 2011-01-30 12:17 发表评论
]]>
Java命o行实用工具jps和jstathttp://m.tkk7.com/sean/archive/2011/01/27/343620.htmllaogaolaogaoThu, 27 Jan 2011 04:04:00 GMThttp://m.tkk7.com/sean/archive/2011/01/27/343620.htmlhttp://m.tkk7.com/sean/comments/343620.htmlhttp://m.tkk7.com/sean/archive/2011/01/27/343620.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/343620.htmlhttp://m.tkk7.com/sean/services/trackbacks/343620.html

在Linux或其他UNIX和类UNIX环境下,ps命o惛_大家都不陌生Q我怿也有不少同学写过 ps aux | grep java | grep -v grep | awk '{print $2}' q样的管道命令来扑ևJavaq程的pid。常a道,Javaq真的"跨^?Q它自己是q_。作为^収ͼ当然也有些基本的工具Q让我们可以用更单、更l一Q同时又是非侵入的方式来查询q程相关信息。今天我们就来认识一下其中的两个?/p>

jps

֐思义Q它对应到UNIX的ps命o。用法如?

jps [ options ] [ hostid ]

其中Qoptions可以?-q (安静) -m (输出传递给mainҎ的参? -l (昄完整路径) -v (昄传递给JVM的命令行参数) -V (昄通过flag文g传递给JVM的参? -J (和其他Java工具cM用于传递参数给命o本n要调用的javaq程)Qhostid是主机idQ默认localhost?/p>

jstat

用于输出l定javaq程的统计信息。用法如?

jstat -options 可以列出当前JVM版本支持的选项Q常见的?-class (cd载器) -compiler (JIT) -gc (GC堆状? -gccapacity (各区大小) -gccause (最q一ơGCl计和原? -gcnew (新区l计) -gcnewcapacity (新区大小) -gcold (老区l计) -gcoldcapacity (老区大小) -gcpermcapacity (怹区大? -gcutil (GCl计汇? -printcompilation (HotSpot~译l计)

假定你要监控的Javaq程h12345Q那?br /> jstat -gcutil -t 12345 200 300 卛_?00毫秒q箋打印300ơ带有时间戳的GCl计信息?/p>

单解释一? -gcutil是传入的optionQ必选,-t是打印时间戳Q是以目标JVM启动旉v点计的Q可选;12345是vmid/pidQ和我们从jps拿到的是一LQ必选;200是监控时间间隔,可选,不提供就意味着单次输出Q?00是最大输出次敎ͼ可选,不提供且监控旉间隔有值的话,是无限期打C厅R?/p>

具体输出明细的解释请参考官Ҏ?http://download.oracle.com/javase/6/docs/technotes/tools/share/jstat.html



laogao 2011-01-27 12:04 发表评论
]]>
用Scala解Hanoi?/title><link>http://m.tkk7.com/sean/archive/2009/11/23/303374.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Mon, 23 Nov 2009 11:20:00 GMT</pubDate><guid>http://m.tkk7.com/sean/archive/2009/11/23/303374.html</guid><wfw:comment>http://m.tkk7.com/sean/comments/303374.html</wfw:comment><comments>http://m.tkk7.com/sean/archive/2009/11/23/303374.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.tkk7.com/sean/comments/commentRss/303374.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/sean/services/trackbacks/303374.html</trackback:ping><description><![CDATA[<p>到处吹嘘Scala很长旉了,却一直没有在自己的blog上增加过M相关内容Q今天就来补一补。当ӞScala的基本特性就不多废话了,|上已经有相当多的资料,如果懒得googleQ只想看完本文,那么你只需要知道它是一门以JVM为目标运行环境的静态编E语a(当然QScala官方也有.NET版,但已不是光?Q同时具备面向对象和函数式编E语a的特炏V本文将通过一个简单的CZQ展CScala的FP能力Q其中十分heavy的用Cimplicit隐式转换和模式匹配?/p> <p>代码是从guithub的gist上抄的,单改了改Q原始代码见: <a target="_blank">http://gist.github.com/66925</a></p> <p> </p> <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #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; ">import</span><span style="color: #000000; "> scala.reflect.Manifest<br />   <br /> def simpleName(m:Manifest[_]):String </span><span style="color: #000000; ">=</span><span style="color: #000000; "> {<br />   val name </span><span style="color: #000000; ">=</span><span style="color: #000000; "> m.toString<br />   name.substring(name.lastIndexOf(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">$</span><span style="color: #000000; ">'</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br /> }<br />   <br /> trait Num<br /> </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> Succ[Pre</span><span style="color: #000000; "><</span><span style="color: #000000; ">:Num] </span><span style="color: #0000FF; ">extends</span><span style="color: #000000; "> Num<br /> </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> _1 </span><span style="color: #0000FF; ">extends</span><span style="color: #000000; "> Num<br /> type _2 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Succ[_1]<br /> type _3 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Succ[_2]<br /> type _4 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Succ[_3]<br />  <br /> </span><span style="color: #0000FF; ">case</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> Move[N</span><span style="color: #000000; "><</span><span style="color: #000000; ">:Num,A,B,C]()<br /> <br /> implicit def move1[A,B,C](implicit a:Manifest[A], b:Manifest[B]) : Move[_1,A,B,C] </span><span style="color: #000000; ">=</span><span style="color: #000000; "> {<br />   System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Move from </span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> simpleName(a) </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; "> to </span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> simpleName(b))<br />   </span><span style="color: #0000FF; ">null</span><span style="color: #000000; "><br /> }<br />  <br /> implicit def moveN[P</span><span style="color: #000000; "><</span><span style="color: #000000; ">:Num,A,B,C](implicit m1:Move[P,A,C,B], m2:Move[_1,A,B,C], m3:Move[P,C,B,A]) : Move[Succ[P],A,B,C] </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; "><br />   <br /> def run[N</span><span style="color: #000000; "><</span><span style="color: #000000; ">:Num,A,B,C](implicit m:Move[N,A,B,C]) </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; "><br />   <br /> </span><span style="color: #0000FF; ">case</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> Left()<br /> </span><span style="color: #0000FF; ">case</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> Center()<br /> </span><span style="color: #0000FF; ">case</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> Right()<br />   <br /> run[_3,Left,Right,Center]<br /> </span></div> <p> </p> <p>q段代码解决的是l典的汉诺塔问题Q通过一根中柱,左׃64个大依ơ叠加的圆盘全部Ud到右柱,要求整个q程中每ơ只能移动一个圆盘,且每个圆盘只能独立占据一Ҏ子或是叠加在比自w更大的圆盘上?/p> <p>单分析一下就知道Q这是一个递归问题(FP的英雄特?Q?/p> <ul> <li>当只?个圆盘时Q不用通过中柱Q直接可以从左柱Ud到右柱;</li> <li>当有2个圆盘时Q将盘UdC柱,剩下的大盘移动到xQ再从中柱把盘Ud到右柱;</li> <li>当有3个圆盘时Q先Ud2个圆盘到中柱Q再Ud大盘到右柱,再移?个圆盘到xQ?/li> <li>...</li> </ul> <p>很容易发C个patternQ那是UdN(N>1)个圆盘,可以通过以下三个步骤Q?/p> <ol> <li>UdN-1个圆盘,从左柱到中柱Q?/li> <li>Ud剩下?个圆盘,从左柱到xQ?/li> <li>UdN-1个圆盘,从中柱到x?/li> </ol> <p>在解释代码之前,先说说Scala的implicit隐式转换Q这是一个非常powerful的ideaQ当Scala~译器发现类型不匚wQ它不会直接failQ而是试从代码中指定的,在scope内的implicit转换定义Q来替换问题对象或表辑ּ以满类型要求,当然Qؓ了避免歧义,同一时刻Scala需要找到唯一的一个满x件的implicit定义?/p> <p>我们的代码首先定义了一个取得友好类名的ҎQ不LI它Q然后定义了一个正整数的序列,也不LI它了,你只需要当作他们是正整数就好,接触qFP的同学应该对此类定义不陌生,接下来定义了如下3个支持implicit传入参数的方法:</p> <ol> <li>implicit def move1[A,B,C](implicit a:Manifest[A], b:Manifest[B]) : Move[_1,A,B,C]</li> <li>implicit def moveN[P<:Num,A,B,C]( implicit <br /> m1:Move[P,A,C,B], <br /> m2:Move[_1,A,B,C], <br /> m3:Move[P,C,B,A]<br /> ) : Move[Succ[P],A,B,C]</li> <li>def run[N<:Num,A,B,C](implicit m:Move[N,A,B,C])</li> </ol> <p>含义分别是:</p> <ol> <li>当需要Move[_1,A,B,C]值时Q可以找我帮?我有个side-effectQ那是输出Ud指o)Q?/li> <li>当需要Move[Succ[P],A,B,C]Ӟ可以找我帮忙Q?/li> <li>q行我,我接受Move[N,A,B,C]cd的参数?/li> </ol> <p>单说明:Scala用[]表示cd参数Q区别于Java?lt;>Q另外,Scala的类型声明在变量/函数定义之后。Move[_,A,B,C]的含义是通过CQ从AUd圆盘到B?/p> <p>我们来模拟运行一下,Z演示效果Q用一个中{复杂的数目Q?个圆盘,从LeftUd到Right?/p> <p>run[_3,Left,Right,Center]Q对应Move[Succ[_2],Left,Right,Center]Q于是展开成三个MoveQ?/p> <p>Move[_2,Left,Center,Right]即Move[Succ[_1],Left,Center,Right]<br /> Move[_1,Left,Right,Center]<br /> Move[_2,Center,Right,Left]即Move[Succ[_1],Center,Right,Left]<br /> </p> <p>然后l箋展开Move[_2,Left,Center,Right]和Move[_2,Center,Right,Left]Q得刎ͼ</p> <p>Move[_1,Left,Right,Center]<br /> Move[_1,Left,Center,Right]<br /> Move[_1,Right,Center,Left]<br /> --------------------------<br /> Move[_1,Left,Right,Center]<br /> --------------------------<br /> Move[_1,Center,Left,Right]<br /> Move[_1,Center,Right,Left]<br /> Move[_1,Left,Right,Center]<br /> </p> <p>q个时候已l全部都匚wMove[_1,A,B,C]Q于是我们很Ҏ得到以下输出Q?/p> <p>Move from Left to Right<br /> Move from Left to Center<br /> Move from Right to Center<br /> Move from Left to Right<br /> Move from Center to Left<br /> Move from Center to Right<br /> Move from Left to Right<br /> </p> <p>希望本文能带lScala初学者一些感性认识和启发?/p> <p><br /> </p> <img src ="http://m.tkk7.com/sean/aggbug/303374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/sean/" target="_blank">laogao</a> 2009-11-23 19:20 <a href="http://m.tkk7.com/sean/archive/2009/11/23/303374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] Spring+Hibernate之“暴力”updatehttp://m.tkk7.com/sean/archive/2009/01/29/252704.htmllaogaolaogaoThu, 29 Jan 2009 08:54:00 GMThttp://m.tkk7.com/sean/archive/2009/01/29/252704.htmlhttp://m.tkk7.com/sean/comments/252704.htmlhttp://m.tkk7.com/sean/archive/2009/01/29/252704.html#Feedback4http://m.tkk7.com/sean/comments/commentRss/252704.htmlhttp://m.tkk7.com/sean/services/trackbacks/252704.html先简单介l一下问题的语境?br />
手头有个开发了3q的Spring+iBATIS应用Q经怸层架构)Q最q尝试用Hibernate实现原有SQLMap版的部分CRUD操作。除开混合事务和其他一些底层配|细?如TransactionAwareDataSource、禁用lazy-load{?之外Q最大的一?pattern-mismatch"是:Model层和持久层采用了dirty flag机制Q即每次INSERT和UPDATE操作Q都会根据每个字D늚dirty与否军_是否参加INSERT/UPDATEQ而这些dirty flag可以被外部重|,所以业务层的代码,l常可以看到cMq样的patternQ?br />
1- new一个modelcdƈsetId() Q或者在已有的model上重|dirty flagQ?br />2- set需要update的字D(通常都只是部分字D)
3- 丢给DAO层去update

最l的效果是某张表某个ID的某条记录的某些字段被更CQ而其他字D不受媄响,q就是我在标题中提到的所?暴力"updateQ虽不elegantQ但却也单实用,臛_?直接"?br />
Z让Hibernate版的DAOQ默认除Trasient之外全体字段参加INSERT和UPDATEQl支持这L"use-pattern"Q除了按照Hibernate的习惯去配置映射和SessionFactory{之外,我们需要做一些额外的工作Q?br />
1- 在BO/EntitycMq加注解
@org.hibernate.annotations.Entity(dynamicInsert=true, dynamicUpdate=true)

2- 实现org.hibernate.Interceptor接口的findDirty()ҎQHibernate提供了一个EmptyInterceptor可以作ؓLQ方法签名如下:
public int[] findDirty(
    Object entity, 
    Serializable id, 
    Object[] currentState, 
    Object[] previousState, 
    String[] propertyNames, 
    Type[] types
);
q回的int[]包含所有应该被认ؓ是dirty的字D늃引,q回null表示默认处理Q传入的entity是持久对象,字段列表会通过propertyNames参数传给你?br />
3- 注入到Spring的Application Context中,cMq样Q?br />
<bean id="findDirtyInterceptor" class="gao.sean.hybrid.interceptor.FindDirtyInterceptor"/>

<bean id="sessionFactory"
    class
="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    
    
<property name="entityInterceptor"><ref bean="findDirtyInterceptor"/></property>
    
</bean>

在这L配置下,业务层的代码可以l?暴力"update了?br />


laogao 2009-01-29 16:54 发表评论
]]>
[Tips] Spring 2.5.6新特性之packagesToScanhttp://m.tkk7.com/sean/archive/2009/01/29/252685.htmllaogaolaogaoWed, 28 Jan 2009 18:59:00 GMThttp://m.tkk7.com/sean/archive/2009/01/29/252685.htmlhttp://m.tkk7.com/sean/comments/252685.htmlhttp://m.tkk7.com/sean/archive/2009/01/29/252685.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/252685.htmlhttp://m.tkk7.com/sean/services/trackbacks/252685.html如果你用早前版本的SpringQ又恰好采用了Annotation注解方式(而非传统XML方式)配置Hibernate对象关系映射Q那么在通过org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean配置sessionFactoryӞ你一定对annotatedClasses、annotatedPackages有一U说不出的胸L感觉Q如此以高配|性见长的SpringQ怎么在这一个小的环节上就不能做得再灵zM呢,一定要一个个手写Class路径么?

估计有不h无奈选择了从AnnotationSessionFactoryBeanl承一个自定义的子c,自己实现扫描逻辑Q找出@Entity注解q的cL单配|进厅R?br />
Spring 2.5.6里有个不怎么L的改q,那就是在AnnotationSessionFactoryBean上增加了一个新的方法:
setPackagesToScan(String[] packagesToScan)

有了q个ҎQ我们不再需要自己动手去实现实体cȝ扫描了,直接在Spring配置文g中AnnotationSessionFactoryBeanq个section上增加类似如下的一个property卛_(假定你需要加载的实体cL在的包名matchq个字符?com.**.bo")Q?br />
<property name="packagesToScan" value="com.**.bo"/>

你也可以以清单的方式指定多于1条的匚w字串Q如Q?br />
<property name="packagesToScan">
    
<list>
        
<value>com.abc.core.bo</value>
        
<value>com.abc.auditing.bo</value>
    
</list>
</property>



laogao 2009-01-29 02:59 发表评论
]]>
easyb - Getting Startedhttp://m.tkk7.com/sean/archive/2009/01/04/249798.htmllaogaolaogaoSun, 04 Jan 2009 14:28:00 GMThttp://m.tkk7.com/sean/archive/2009/01/04/249798.htmlhttp://m.tkk7.com/sean/comments/249798.htmlhttp://m.tkk7.com/sean/archive/2009/01/04/249798.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/249798.htmlhttp://m.tkk7.com/sean/services/trackbacks/249798.html从某U意义上Ԍeasyb是Groovy版的RSpecQ是一个基?BDD: Behavior-Driven Development"思维方式的测试框架。其作者Andrew Glover是《Groovy in Action》一书的合著者之一。项目的主页在:

http://easyb.org/

不多废话了,上代码,一个story大概长成q个样子Qؓ了方便大家理解,举一个无比弱智的例子Q:
scenario '1+1应该{于2', {
    given 
'a和b分别{于1', {
      a 
= 1
      b 
= 1
    }
    when 
'c是a+b的和', {
      c 
= a + b
    }
    then 
'c应该{于2', {
      c.shouldBe 
2
    }
}

如何在Eclipse环境下跑q段story脚本Q请参考官Ҏ档:
http://code.google.com/p/easyb/wiki/ConfiguringEclipseToRunEasyb

最后你的输出应该类|
Running first easyb story (FirstEasybStory.groovy)
Scenarios run: 
1, Failures: 0, Pending: 0, Time Elapsed: 0.629 sec

1 behavior run with no failures




laogao 2009-01-04 22:28 发表评论
]]>
Spring 3.0前瞻http://m.tkk7.com/sean/archive/2008/12/27/248655.htmllaogaolaogaoSat, 27 Dec 2008 09:55:00 GMThttp://m.tkk7.com/sean/archive/2008/12/27/248655.htmlhttp://m.tkk7.com/sean/comments/248655.htmlhttp://m.tkk7.com/sean/archive/2008/12/27/248655.html#Feedback2http://m.tkk7.com/sean/comments/commentRss/248655.htmlhttp://m.tkk7.com/sean/services/trackbacks/248655.html周末花时间看了Rick Evans在London Spring User Group (LSUG)关于Spring 3.0介绍的视频,地址在这里:
http://java.dzone.com/videos/a-look-forward-spring-30

ҎRick的介l,Spring 3.0于明年2月中旬正式发布,其中比较重要的两个亮ҎQ?br />
1- JDK 5成为Spring 3.0的最低要求,因此很多遗留代码得以重构Q更加清?
2- 引入了新的Spring Expression Language (SPEL)用于描述XML和Annotation中的配置信息?br />QRickq用了大量篇q介lSpring 3.0如何在API和配|层面支持RESTQ不q这不在我兴范围内Q?br />
除了上述两大亮点Q还有如下一些值得一提的变化Q?br />
1- L了Commons AttributesQ减了很多相关依赖;
2- 不再支持Struts 1.x;
3- 全面转向Listener-style的context加蝲方式;
4- 源码l织更加模块化,每个子模块都是独立项?
5- 构徏环境抛弃MavenQ{Z用ANT+Ivy; (W者非常赞成的一个变?
6- 源码库由CVS全面转向Subversion?"逃离"CVS是大势所?)




laogao 2008-12-27 17:55 发表评论
]]>
[Tips] 修改JavaE序pȝ默认字体http://m.tkk7.com/sean/archive/2008/10/24/236363.htmllaogaolaogaoFri, 24 Oct 2008 03:36:00 GMThttp://m.tkk7.com/sean/archive/2008/10/24/236363.htmlhttp://m.tkk7.com/sean/comments/236363.htmlhttp://m.tkk7.com/sean/archive/2008/10/24/236363.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/236363.htmlhttp://m.tkk7.com/sean/services/trackbacks/236363.html实在受不了在中文Windows下Java(Swing)E序默认的字体,那叫一个难看。如果你和我一P那么希望下面的小贴士可以帮到你(以JDK 1.5.0ZQ:

1- 扑ֈJRE目录Q如果你安装的是JDKQ那么在JDK的目录下可以扑ֈjre子目录,是它了Q如果你安装的JREQ那么默认应该在Program Files\Java\jre1.5.0_...?br />2- q入JRE目录下的lib文g夹,你应该可以看到很多fontconfig开头的文gQ找到fontconfig.properties.srcQ拷贝一份,重命名ؓfontconfig.properties?br />3- 打开fontconfig.propertiesQ你会看C大堆字体相关的配|,扑ֈallfonts.chinese-ms936q一条(通常在最前面Q,可以看到默认讄为SimSunQ修改这个配|,选填你需要的字体名称卛_Q如"Courier New"?Consolas"{?br />
更详l的配置Q参考:
http://java.sun.com/j2se/1.5.0/docs/guide/intl/fontconfig.html




laogao 2008-10-24 11:36 发表评论
]]>
iText vs FOP - Java动态生成PDF的两个选择http://m.tkk7.com/sean/archive/2008/10/05/232577.htmllaogaolaogaoSun, 05 Oct 2008 15:28:00 GMThttp://m.tkk7.com/sean/archive/2008/10/05/232577.htmlhttp://m.tkk7.com/sean/comments/232577.htmlhttp://m.tkk7.com/sean/archive/2008/10/05/232577.html#Feedback9http://m.tkk7.com/sean/comments/commentRss/232577.htmlhttp://m.tkk7.com/sean/services/trackbacks/232577.html阅读全文

laogao 2008-10-05 23:28 发表评论
]]>
[Tips] 使用Groovy处理邮g通知http://m.tkk7.com/sean/archive/2008/08/27/225118.htmllaogaolaogaoWed, 27 Aug 2008 10:55:00 GMThttp://m.tkk7.com/sean/archive/2008/08/27/225118.htmlhttp://m.tkk7.com/sean/comments/225118.htmlhttp://m.tkk7.com/sean/archive/2008/08/27/225118.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/225118.htmlhttp://m.tkk7.com/sean/services/trackbacks/225118.html通过Groovy实现邮g通知Q其实是转发到ANTQ十分容易,先上代码Q?br />
 1 ant = new AntBuilder()
 2 
 3 def mail(subject, body, attachment = [dir:".",files:[]]) {
 4     ant.mail(mailhost:"mail.com", mailport:"1025", user:"mailer", password:"123", subject:"${subject}") {
 5         from(address:"nobody@mail.com")
 6         to(address:"nobody@mail.com")
 7         message("${body}")
 8         attachments() {
 9             if (attachment.files) {
10                 fileset(dir:"${attachment.dir}") {
11                     attachment.files.each {
12                         include(name:it)
13                     }
14                 }
15             }
16         }
17     }
18 }
19 
20 attachment = [dir:"/tmp", files:["some.properties","some.sql"]]
21 mail("Test mail message at ${new Date()}""This is a test message.", attachment)
22 

q个单的例子很好的展CZ如下GroovyҎ:
1- Groovy脚本可以不需要定义Q何classQ方法定义和实际调用也可以؜在一P十分手?br />2- 定义变量不需要指定类型,只要赋值即可,不过q行期依然是强类型?br />3- Ҏ参数可以有默认倹{?br />4- List和Map的构建直接在语义层面提供支持Q如[a:1,b:2]和[1,2]?br />5- GString使得我们可以方便的在String中引用变量甚x表达式,?${a.b.c}"?${new Date()}"?br />6- 逻辑判断在true/false基础上有所扩展Q[]Q?个元素的ListQ和null均做false处理?br />7- Closure支持Q方便我们在外围代码处“当场”指定处理逻辑Q省M大多数在Java中需要匿名内部类来处理的ȝQ如attachment.files.each { .... }Q只有一个传入参数时Q可直接用it指代?br />8- 与ANT的无~集成,以及对Builder模式的良好支持,使得我们可以写出上述初看上去有些不可思议的代码?br />
P.S. 虽然Groovy自己已经bundle了ANTQ可以直接用其中的l大多数功能Q不qؓ了调用ANT的mail taskQ还需要将ANT发行版中带有的ant-javamail.jar以及JavaMail API对应的jar包(可以从Sun|站下蝲Q加到classpath。如果你的JDK版本低于6.0Q还需要activation.jar?br />



laogao 2008-08-27 18:55 发表评论
]]>
[Tips] "When ANT is not enough"升?- Groovy to the rescue!http://m.tkk7.com/sean/archive/2008/08/25/224246.htmllaogaolaogaoMon, 25 Aug 2008 11:38:00 GMThttp://m.tkk7.com/sean/archive/2008/08/25/224246.htmlhttp://m.tkk7.com/sean/comments/224246.htmlhttp://m.tkk7.com/sean/archive/2008/08/25/224246.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/224246.htmlhttp://m.tkk7.com/sean/services/trackbacks/224246.html 前一随W?/a>提到目前计划pȝ学习Python和GroovyQ有什么比实际使用更好的学习途径呢?1q多以前Q我曄?a target="_blank" title="http://m.tkk7.com/sean/archive/2007/06/18/124859.html" href="/sean/archive/2007/06/18/124859.html">另一随W?/a>提到Q当ANT不够用时Q可以用JRuby+AntwrapQ这是一个可行的ҎQƈ且经q了长期实战的考验。不qGroovy可以做的更好Q感兴趣的朋友可以和Antwrap版对照一下)Q?br />
 1 #!/usr/bin/env groovy
 2 
 3 ant = new AntBuilder()
 4 root = ":pserver:cvsuser:password@10.10.10.1/cvsrepo/SampleProduct"
 5 
 6 def checkout() {
 7     ant.cvs(cvsroot:root,command:"checkout -A","package":".",dest:"cvsoriginal",compressionlevel:"9")
 8 }
 9 
10 def update() {
11     ant.cvs(cvsroot:root,command:"update -A -d","package":".",dest:"cvsoriginal",compressionlevel:"9")
12 }
13 
14 def compile(project) {
15     ant.javac(srcdir:"cvsoriginal/$project/src",destdir:"cvsoriginal/$project",target:"1.5",encoding:"GBK")
16     ant.copy(todir:"cvsoriginal/$project") {
17         fileset(dir:"cvsoriginal/$project/src") {
18             exclude(name:"**/*.java")
19         }
20     }
21     ant.jar(destfile:"build/$project.jar",basedir:"cvsoriginal/$project",manifest:"MANIFEST.MF") {
22         exclude(name:"src/**")
23     }
24 }
25 
26 // to actually call your target
27 checkout root
28 

代码更紧凑,与Java的集成更无缝。只需要简单的培训Q有Java基础的朋友就能上手,不必再额外学习和习惯Ruby的语法,不用gem installQ也不用去monkey-patch个别文g来集成和打包Ant、Antwrap和JRubyQ只需要一个groovy-all-x.x.x.jar加上自己的脚本即可轻松搞定?br />
[2008-08-26 19:25:00 更新] l过实际环境试Q原来JRuby(1.1)+Antwrap需?4分钟完成的构建,改用Groovy(1.5.6)后,仅需?6分钟Q对于需要经常处理构建的目和品来_q?分钟q是相当可观的?br />



laogao 2008-08-25 19:38 发表评论
]]>
08q秋季学习计?/title><link>http://m.tkk7.com/sean/archive/2008/08/20/223139.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Tue, 19 Aug 2008 16:33:00 GMT</pubDate><guid>http://m.tkk7.com/sean/archive/2008/08/20/223139.html</guid><wfw:comment>http://m.tkk7.com/sean/comments/223139.html</wfw:comment><comments>http://m.tkk7.com/sean/archive/2008/08/20/223139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/sean/comments/commentRss/223139.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/sean/services/trackbacks/223139.html</trackback:ping><description><![CDATA[ <br />从开始专心学习Java到现在,已经7q了Q非常幸q的Q在q?q中Q除?q的“半工半诠Z和1q的.NET目Q篏U有5q都是从事的JavaZ的应用开发,应该_Java伴随我走q了从入行到站稳脚跟最关键的几q。从某种意义上讲Q我应该感谢Java?br /><br />然而,随着旉的推U,接触到的不同的东西越来越多,自己对不同问题的看法和解决问题的思\来成熟,Java虽然是全能型的语aQ也变得来无法满x常工作和׃的需要,在一些特定的场合Q也发别扭Q有时我甚至会怀念学生时代的Pascal/Delphi和后来的C/C++。回q头ȝ自己Q从刚入行时的Java fanboiQ到现在q样一个pragmatist和purist的结合体Q是多么有趣的{变?br /><br />在过ȝ2q多Q除了Java?NETQ陆陆箋l接触到q有q简单用经历的~程语言Q有bash、PL/SQL、JavaScript、PHP、Perl、Ruby/JRuby、Scala、Python/Jython、Groovy{等Q不q都没有pȝ的学习过Q基本就是拿来主义,什么好用用什么,解决手里的问题ؓ丅R?br /><br />也许是工作性质的原因,日常要处理的非技术性Q务越来越多,留给具体~程的时间现在一天比一天少Q编E带来的乐趣和解x术问题带来的快感Q就昑־十分珍贵。所以我下定军_一定要pȝ的学?~2U和Java/.NET不同的编E语a。一开始这个选择q不ҎQ我曄q?a target="_blank" title="http://twitter.com/laogao/statuses/853718837" >半调侃式的和一个朋友讲Q“Python, Ruby, Scala, Groovy, 一个都不能?/a>Q经q一D|间的权衡之后Q还是比较自然的作出了最后的选择QPython和Groovy?br /><br />Pythonq个选择其实q不难,留意Pythonq门语言Q其实说h也有差不?q了Q它完全W合“和Java/.NET不同的编E语a”这个条Ӟ而且应用面很q,也十分成熟,功能也非常强大,加上大量现成的类库,能够胜Q很多不同cd的编EQ务。基本上q是一个不用Q何思想斗争的选择?br /><br />Groovyq个选择相对没有那么直接Q至在我真正用Groovy上手做一些东西之前,对它q没有特别的感觉Q甚臌疑它存在的h|因ؓ有Jython和JRuby的选择Qؓ什么一定要Groovy呢?到最q开始接触GroovyQ才逐渐了解到它的出w(Groovy的作者受到Python的启发,不过后来Groovy发展的越来越接近RubyQ,和它在“兼容”Java代码的前提下为Java语言带来的巨大的表达力提升。对于有Java基础的h而言QGroovy十分Ҏ上手Q而且可以帮助我们化很多繁杂的dQ比如自动构建和自动化测试,而这正是我目前需要处理的?br /><br />最后简单说说其他几个落选的原因Q除了时间有限之外)Q?br />bash - 目前掌握的基本够用,发现不够Ӟ完全可以用Python代替?br />PL/SQL - 基本很少使用了,偶尔需要维护,今后深入用的Z也不多?br />JavaScript - 对“网”版的编E语a可能有天生的偏见Q尤其是作ؓJava fanboiQ当然对它“盗用”Javaq个名字是有意见的?br />PHP - 用的Z很少Q而且q于quick&dirtyQ不是我喜欢的风根{?br />Perl - 虽然功能强大Q但是感觉语法有些terseQ不是很适应Q能处理的Q务,基本上Python也可以?br />Ruby - 语法和设计理念还是有一些认同,但是对Unicode的支持和部v环境的支持都q不是很让h信服Q另外,拿孟岩的话说QRuby是一门魔q语aQ我不喜Ƣ过于魔qȝ东西Q而更习惯具体直接的代码?br />Scala - 也是一门和Javaq_关系密切的语aQ不q有些“学院派”,函数式编E固然是亮点Q但短期内看不到太多的学习h倹{?br /><br />所以,lg所qͼ最后再点一下题Q?8q秋季的学习计划是:pȝ学习Python和Groovy?br /><br /><br /><img src ="http://m.tkk7.com/sean/aggbug/223139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/sean/" target="_blank">laogao</a> 2008-08-20 00:33 <a href="http://m.tkk7.com/sean/archive/2008/08/20/223139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] JRuby 1.1.2 发布http://m.tkk7.com/sean/archive/2008/05/28/203452.htmllaogaolaogaoWed, 28 May 2008 04:08:00 GMThttp://m.tkk7.com/sean/archive/2008/05/28/203452.htmlhttp://m.tkk7.com/sean/comments/203452.htmlhttp://m.tkk7.com/sean/archive/2008/05/28/203452.html#Feedback1http://m.tkk7.com/sean/comments/commentRss/203452.htmlhttp://m.tkk7.com/sean/services/trackbacks/203452.htmlJVM下的Ruby语言实现JRuby发布1.1版的W二个升U版1.1.2Q这个版本最主要x的仍然是性能Q值得一提的包括Q?br /> 1- 启动旉大大~短?br /> 2- YAML标记解析速度提高100x以上?br /> 3- Ҏ调用在性能、线E和栈深度等斚w的增强?br />4- 其他bug?br />
主页: http://jruby.codehaus.org/
下蝲: http://dist.codehaus.org/jruby/




laogao 2008-05-28 12:08 发表评论
]]>
[新闻] JRuby 1.1发布http://m.tkk7.com/sean/archive/2008/04/05/190985.htmllaogaolaogaoSat, 05 Apr 2008 15:01:00 GMThttp://m.tkk7.com/sean/archive/2008/04/05/190985.htmlhttp://m.tkk7.com/sean/comments/190985.htmlhttp://m.tkk7.com/sean/archive/2008/04/05/190985.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/190985.htmlhttp://m.tkk7.com/sean/services/trackbacks/190985.htmlJVM下的Ruby语言实现JRuby正式发布1.1版,q个版本最主要x的是性能Q除此之外,值得一提的包括Q?br />1- 支持Ruby代码~译成Java Bytecode?br />2- Onigurumaq个Ruby 1.9标配的正则库UL到Java?br />3- 重构q的IO实现?br />4- 更低的内存消耗?br />5- 修复大量其他兼容性问题?br />
主页: http://jruby.codehaus.org/
下蝲: http://dist.codehaus.org/jruby/




laogao 2008-04-05 23:01 发表评论
]]>
[Tips] ULOracle数据库到PostgreSQL的要?/title><link>http://m.tkk7.com/sean/archive/2008/03/11/185510.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Tue, 11 Mar 2008 15:04:00 GMT</pubDate><guid>http://m.tkk7.com/sean/archive/2008/03/11/185510.html</guid><wfw:comment>http://m.tkk7.com/sean/comments/185510.html</wfw:comment><comments>http://m.tkk7.com/sean/archive/2008/03/11/185510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/sean/comments/commentRss/185510.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/sean/services/trackbacks/185510.html</trackback:ping><description><![CDATA[ <br />最q尝试把一个Oracle数据库,q同构徏在这个数据库上的Java应用UL到PostgreSQL环境。在ULq程中,ȝ了一些要点,一斚w作ؓW记备忘Q一斚w也给有类gQ务需要处理而又无从下手的朋友作为参考?br /><br />1- 首先是准备PostgreSQL环境。有条g的话Q最好是找一台空闲的PCZ为测试服务器Q安装Linux或BSDQ然后从源码~译最新的PostgreSQL 8.3.0。编译时Q通过configure指定--with-perl?-with-python以支持PL/Perl和PL/Python。因为绝大多数Linux发行版都已自带Perl和PythonQ不必额外安装?br /><br />2- 如果是Windows环境Q又需要Perl和PythonQ则必须额外安装QPython的话Q可以方便的扑ֈ2.5 for Windows的安装包QPerl的话Q推荐ActivePerlQ相寚w烦一点,Z后面用到的一些便利的功能利加蝲QPerl版本量?.8.8?br /><br />3- 创徏数据库和用户。通过initdb初始化数据目录,配置postgresql.conf指定LIP、端口等{信息,配置pg_hba.conf指定讉K权限Q通过pg_ctl -D <数据目录> -l <日志文g> start启动postmasterQ然后createdb、createuser创徏数据库和用户。数据库建好之后Q就可以createlang -d <数据库名> [plperl|plperlu|plpython|plpythonu]开启PL/Perl和PL/Python。具体命令行参数可通过各命令加--help查看?br /><br />4- 安装PostgreSQL客户端pgAdminIIIQ最新版?.8.2Q有条g的话Q也可以下蝲源码自己~译?br /><br />5- 安装Oracle客户端,需要在PostgreSQL同一台机器,以便Perl用于q接数据库的DBI和Oracle驱动DBD::Oracle模块利安装。如果是Windows上的ActivePerlQ则可以通过ppm install DBD-OracleQ如果是Linux/BSDQ则可以通过CPAN来安装,如perl -MCPAN -e shellq入CPAN ShellQ通过install <模块?gt;或force install <模块?gt;安装DBI和DBD::Oracle?br /><br />6- 数据库的ULQ可以选择ora2pg来帮忙,目前的版本是4.7。ora2pg是一个用于读取Oracle数据库schema、数据,q生成PostgreSQL脚本或直接导入PostgreSQL数据库的Perl工具。用法很单,是通过.conf文g指定数据库连接信息包括NLS_LANG、需要导出导入的schema、table、view、data{等Q然后执行一个pl脚本。这是目前相Ҏ较成熟的一个方案,但是遇到schema复杂、约束较强的数据库,需要手工处理的地方q是不少。徏议不要直接写入PostgreSQLQ而是生成SQL脚本Q验证无误后再执行。ora2pg默认会把Oracle中名U的大写转换成小写,因ؓPostgreSQL在解析SQLӞ除非""括v来,默认都是转成写。schema、table、view、sequence、data{等Q基本用ora2pgQ加上一些手工调整即可搞定。至于function、stored procedure{,q是手工UdQ偷不得懒。除了ora2pgQ其实也可以配置DBI-LinkQ将Oracle数据库挂到PostgreSQL数据库作Zl独立的"schema"Q然后用create table xxx as select ... from ...q样的语法来倒表和数据。PostgreSQL的contrib包也附带有一个dblinkQ不q是q接其他PostgreSQL数据库的Q如果需要连接非PostgreSQLQ? q是考虑DBI-LinkQQ何可以通过Perl的DBI接口讉K的数据库Q都能linkqPostgreSQL?br /><br />7- 接下来就是Java应用本n了,我这ơ移的这个应用是Spring+iBatis架构的,很多SQL语句都是明文Q好在DAO层的基础部分(CRUD)的SQLMap是工兯动生成,且都是符合ANSI SQL92标准的,不需要修改即可用。其余的高查询SQLQ需要调整的地方不少Q一些常见的修改列D如下Q?br /><br />i. SELECT出来的columnQ包括子查询Q,如果有别名,必须加ASQ比?select null as some_column from some_table;<br />ii. PostgreSQL没有dual表,cMselect 0 from dual的语句,写成select 0卛_;<br />iii. DECODE函数需要重构成(case when some_column = 'some_value' then 'some_other_value' when ... then ... else 'some_default_value' end ) as some_column;<br />iv. NVL()函数QPostgreSQL中相对应的是coalesce()Q其实几乎所有主DBMS都支持coalesceQ包括OracleQ这才是标准写法;<br />v. 比较日期Q在PostgreSQL中,使用date_trunc('day', SOME_DATE) = date_trunc('day', #enteredDate#)q样的写法,其中'day'位置可选字D包括有year、month、week、hour、minute、second{等;<br />vi. SYSDATEQ对应到PostgreSQL是current_timestampQ可以根据需要用current_date;<br />vii. ROWNUMQ通常我们用ROWNUM都是Z限制查询出来的记录数QPostgreSQL没有q个关键字,需要改成在SELECT语句最后添?LIMIT语句Q如LIMIT 100;<br />viii. (+)q样的外q接写法需要调整ؓSQL标准?table1 [LEFT|RIGHT|FULL] OUTER JOIN table2 ON (...);<br />ix. CONNECT BY ... START WITH ... 递归查询可以参?http: //www.postgresql.org/docs/8.3/static/tablefunc.html 的connectby()函数.<br /><br />最后再多提一点,PostgreSQL自带的过E语a是PL/pgSQLQ在PostgreSQL上写functionQ除了用plpqsqlQ还支持sql、plperl(u)、plpython(u){等。如果你对SQL天生q敏Q看cMPL/pgSQL的代码都很吃力,别说是写了,你完全可以用你喜Ƣ的语言来表辑և数和存储q程的逻辑。有了PL/PythonQ你q怕什么呢Q你几乎能做M事?br /><br />[更新 20080313] 把JDBC驱动的部分漏掉了Q移植Java应用Ӟ除了改SQLQ还需要拿PostgreSQL的JDBC驱动攑ֈclasspath下面Q如WEB-INF/libQ然后修Ҏ据库q接URLQ改成jdbc:postgresql://<ip>:<port>/<dbname>卛_?br /><br />[更新 20080323] ULschema和数据时Q比ora2pg更方便的一U方式是利用EnterpriseDB的Migration ToolQ将Oracle的JDBC驱动ojdbc14.jar拯到EnterpriseDB安装路径下的jre/lib/ext下后Q启动Developer Studio卛_建立Oracleq接Q选中schema后,可以通过右键Online Migrationschema、数据、函数包{等一ơ性通通导入EnterpriseDB。如果要l箋往"U?PostgreSQLU,从EDB做backupQ然后到PostgreSQL下做restoreQ这样会丢掉函数包,因ؓ毕竟EDB在PostgreSQL基础上做了相当改造以和Oracle兼容Q不q函数包之类q是手工UL较稳妥?br /><br /><br /><img src ="http://m.tkk7.com/sean/aggbug/185510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/sean/" target="_blank">laogao</a> 2008-03-11 23:04 <a href="http://m.tkk7.com/sean/archive/2008/03/11/185510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Sun Hires Python Expertshttp://m.tkk7.com/sean/archive/2008/03/05/183819.htmllaogaolaogaoTue, 04 Mar 2008 16:07:00 GMThttp://m.tkk7.com/sean/archive/2008/03/05/183819.htmlhttp://m.tkk7.com/sean/comments/183819.htmlhttp://m.tkk7.com/sean/archive/2008/03/05/183819.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/183819.htmlhttp://m.tkk7.com/sean/services/trackbacks/183819.html在JRuby得到Sun的认可ƈ成功发布1.0Q已l向1.1q进之时Q比Ruby应用更广、更早出现JVMq行版本的Python也终于得CSun的重视:

http://www.eweek.com/c/a/Application-Development/Sun-Hires-Python-Experts/

管Sun官方的说法是他们会更多的应用和扶持native版的PythonQ相信一直饱受冷落的JythonQ也多少会从中受益吧?br />



laogao 2008-03-05 00:07 发表评论
]]>
[新闻] Apache Harmony 5.0 reaches M5http://m.tkk7.com/sean/archive/2008/02/29/183052.htmllaogaolaogaoFri, 29 Feb 2008 15:28:00 GMThttp://m.tkk7.com/sean/archive/2008/02/29/183052.htmlhttp://m.tkk7.com/sean/comments/183052.htmlhttp://m.tkk7.com/sean/archive/2008/02/29/183052.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/183052.htmlhttp://m.tkk7.com/sean/services/trackbacks/183052.html在2月的最后一天,Apache Harmony发布?.0的第5个milestone: http://harmony.apache.org/

为默默耕耘的人鼓掌?br />



laogao 2008-02-29 23:28 发表评论
]]>
[新闻] Grails正式发布1.0?/title><link>http://m.tkk7.com/sean/archive/2008/02/07/179425.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Thu, 07 Feb 2008 02:47:00 GMT</pubDate><guid>http://m.tkk7.com/sean/archive/2008/02/07/179425.html</guid><wfw:comment>http://m.tkk7.com/sean/comments/179425.html</wfw:comment><comments>http://m.tkk7.com/sean/archive/2008/02/07/179425.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/sean/comments/commentRss/179425.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/sean/services/trackbacks/179425.html</trackback:ping><description><![CDATA[ <br />春节期间真是好事不断啊,l?a target="_blank" title="http://m.tkk7.com/sean/archive/2008/02/07/179424.html" href="/sean/archive/2008/02/07/179424.html">PostgreSQL 8.3正式release</a>后,Grails也如U发?.0版。作为受到Ruby on Rails启发开动的"Groovy版Rails"目Q它在设计哲学上和RailsQ包括JRuby版的RailsQ有着很大的不同,Rails是从头开始用Ruby完整实现从表现层到ORM所有功能,而Grails则是利用JavaC֌现有的成熟开源框Ӟ如Spring、Hibernate{,在此基础上整合出一套完整的Web应用框架Q有点类似Pylons和Django的区别?br /><br />?a target="_blank" title="http://m.tkk7.com/sean/archive/2008/01/27/178036.html" href="/sean/archive/2008/01/27/178036.html">之前一随W?/a>也提到过Q和其它在JVM中运行的动态语a如Jython、JRuby不同的是QGroovy对于有Java基础的h们来_学习曲线几乎是^的,上手很快Q如果你同时也熟悉Spring和Hibernate{,那么Grails更是不二之选?br /><br />官网: <a target="_blank" title="http://grails.codehaus.org/" >http://grails.codehaus.org/</a><br />Release Notes: <a target="_blank" title="http://grails.org/1.0+Release+Notes" >http://grails.org/1.0+Release+Notes</a><br />下蝲: <a target="_blank" title="http://grails.codehaus.org/Download" >http://grails.codehaus.org/Download</a><br /><br /><br /><img src ="http://m.tkk7.com/sean/aggbug/179425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/sean/" target="_blank">laogao</a> 2008-02-07 10:47 <a href="http://m.tkk7.com/sean/archive/2008/02/07/179425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[链接] 会JavaQ学GroovyQ这里有很好的介绍/演示 http://m.tkk7.com/sean/archive/2008/01/27/178036.htmllaogaolaogaoSun, 27 Jan 2008 09:14:00 GMThttp://m.tkk7.com/sean/archive/2008/01/27/178036.htmlhttp://m.tkk7.com/sean/comments/178036.htmlhttp://m.tkk7.com/sean/archive/2008/01/27/178036.html#Feedback2http://m.tkk7.com/sean/comments/commentRss/178036.htmlhttp://m.tkk7.com/sean/services/trackbacks/178036.html如果你有一定的Java基础Q想快速的尝动态语a的味道,Groovy是个自然的过渡选择。今天无意中看到一介lGroovy的文章,很短Q也很有,从一个典型的JavaE序开始,一步一?Groovy?Q最l改造成一个完整的GroovyE序Q?br />
http://java.dzone.com/news/java-groovy-few-easy-steps


如果你对当下动态语a的现状有所了解Q那你多半已l知道能在JVM中运行的动态语aQ远不止Groovy一U,那么什么理׃让你选择Groovy而非Jython、JRuby或者其他类似的语言呢?W者认Z要还是编码习惯和风格QGroovy是这些语a中最接近Java的。Jython和JRuby都是从其他成功的动态语a"UL"q来Q带有明昄Python、Ruby语法特征和习惯。选择Jython或者JRuby的朋友,我想大都是原本就有Python或者Ruby的基Q舍不得Python和Ruby的一些很方便的语法和~码风格/习惯/哲学Q或者干脆就是ؓ了将Python和Ruby世界的一些框架引入到Java中,或者说是让Python/Ruby应用能够更好的利用Javaq_已有的资源。如果你在动态语a上没有这斚w的需求,只是Z让你的Java应用更动态,选择Jython或者JRuby只能是凭I增加学习难度。要知道QPython和Ruby都是很有特点、很有个性的语言Q其实Java又何不是)Q要从Java的思维和哲学,转向Python/Ruby的思维和哲学,q不是那么容易做到和做好的?br />



laogao 2008-01-27 17:14 发表评论
]]>
[Tips] When ANT is not enough, JRuby to the rescue!http://m.tkk7.com/sean/archive/2007/06/18/124859.htmllaogaolaogaoSun, 17 Jun 2007 16:39:00 GMThttp://m.tkk7.com/sean/archive/2007/06/18/124859.htmlhttp://m.tkk7.com/sean/comments/124859.htmlhttp://m.tkk7.com/sean/archive/2007/06/18/124859.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/124859.htmlhttp://m.tkk7.com/sean/services/trackbacks/124859.html 随着目来大Q你的ANT脚本变得来臃肿,来依赖antcontrib来实现构建逻辑Q不x弃对构徏q程和出做_的控Ӟ恨不得自己写ANT TaskQ?br />
{一{,在你考虑转向Maven或者真正卷赯子开始研IANT Task的API之前Q先听我向你推荐Ruby/JRuby。相信我Q也许这才是你真正需要的?br />
在我看来构徏脚本最主要的要求是表达能力和控制能力,表达能力是我们应该能够很方便的告诉它我们要它做什么,而控制能力是我们告诉它如何去做,除了必要? 构徏命o的参数、依赖关pM外,它应该能够理解我们其他一些特D要求。在目相对单时QANT的XML格式?脚本语言"能够比较好的表达构徏者的? 求,臛_比纯Java的方式更加简单清晎ͼ于是几乎从它诞生之日成为Java领域当仁不让的头h建工兗但是ANT也有它不够用的时候,其在控制能 力上Qؓ了实现实际用中来复杂越来越_的对构徏q程和出的要求QANT的用者们开始对ANTq行扩展Q最具媄响力?非官?扩展可能是 antcontrib了,很多实际Java目的构建文件中我们都能够找到它的媄子。但是一堆taskdef?variable>之类的夹杂在ANT脚本里,怎么看怎么觉得别扭Q也严重影响构徏脚本的可L?br />
我发现我需要的是一个具有完整功能脚本语a来写我的构徏逻辑Q一斚w它要_单,我需要清晰的表达我的意图Q另一斚w当我需要的时候它要够强大来帮我实现_的控制。我自然而然惛_Ruby?br />
׃Ruby是一个功能完整的工具Q完全自己写Ruby脚本来调用Java自己的构建工具如javac、jar{等q不可能,但是既然已经有h做了? 子,我们拿来用就是了Q大不了自己再改装一下,也少C弯\。时下比较流行的解决Ҏ有Buildr、Raven、Rant和AntwrapQ它们各有特 点,大家可以Ҏ需要进行选择?br />
我最l选了其中最"轻量"的AntwrapQ原因嘛Q我不想学新的APIQ我已经熟悉ANT常用的TaskQ而且我希望尽可能多的自己控制构徏的过E和? 出。Antwrap最能够满我的需要。而前不久JRuby刚刚发布?.0版,q样一来Ruby和Java的跨界引用变得更加容易,Ruby的实现自? 选择了JRuby?br />
安装JRuby和Antwrap相当ҎQ只要把下蝲的jruby-bin-1.0.tar.gz/.zip解压到本圎ͼ保JAVA_HOME? CLASSPATH的配|,然后gem install Antwrap (选择Java? 卛_。ؓ了顺利加载AntwrapQ需要在CLASSPATH中包含ANT的ant.jar和ant-launcher.jar?当然Q如果想更加方便 的share你的成果Q可以把ant的文件拷贝到jruby目录下,在jruby的启动脚本加入必要的export/set命oQ然后打包,q样别h只要 从你提供的zip包解压出来即可用?

Zl大家一个直观的感觉QD个简单的例子(貌似BlogJava没有提供对Ruby代码的默认支持,大家就看吧)Q?br />
 1 require 'rubygems'
 2 gem 'Antwrap'
 3 require 'antwrap'
 4 
 5 @ant=AntProject.new(:name=>"SampleAntwrapBuild", :basedir=>".")
 6 @cvsroot=":pserver:cvsuser:password@10.10.10.1/cvsrepo/SampleProduct"
 7 
 8 def cvscheckout
 9     @ant.cvs(
10         :cvsroot=>"#{@cvsroot}"
11         :command=>"checkout -A"
12         :package=>"."
13         :dest=>"cvsoriginal"
14         :compressionlevel=>"9")
15 end
16 
17 def cvsupdate
18     @ant.cvs(
19         :cvsroot=>"#{@cvsroot}"
20         :command=>"update -A -d"
21         :package=>"."
22         :dest=>"cvsoriginal"
23         :compressionlevel=>"9")
24 end
25 
26 def compile(project_name)
27     @ant.javac(
28         :srcdir=>"cvsoriginal/#{project_name}/src"
29         :destdir=>"cvsoriginal/#{project_name}"
30         :target=>"1.5"
31         :encoding=>"GBK")
32     @ant.copy(    :todir=>"cvsoriginal/#{project_name}"do
33         fileset(:dir=>"cvsoriginal/#{project_name}/src"do
34             exclude(:name=>"**/*.java")
35         end
36     end
37     @ant.jar(
38         :destfile=>"build/#{project_name}.jar"
39         :basedir=>"cvsoriginal/#{project_name}"
40         :manifest=>"MANIFEST.MF"do
41         exclude(:name=>"src/**")
42     end
43 end
44 
45 # to actually call your target
46 if ARGV.empty?
47     puts "Usage: jruby #{$0} [target]"
48 else
49     eval ARGV[0]
50 end
51 

可以看到几乎都是我们熟悉的ANT TaskQ只是更加紧凑更加灵z,一旦掌握了最最基本的Ruby语法Q用它写出功能强大的构徏脚本可以说是分分钟搞定?br />



laogao 2007-06-18 00:39 发表评论
]]>
[八卦] Java "forks": first .NET, then SWT/Eclipse, now Harmony?http://m.tkk7.com/sean/archive/2007/04/14/110644.htmllaogaolaogaoSat, 14 Apr 2007 07:20:00 GMThttp://m.tkk7.com/sean/archive/2007/04/14/110644.htmlhttp://m.tkk7.com/sean/comments/110644.htmlhttp://m.tkk7.com/sean/archive/2007/04/14/110644.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/110644.htmlhttp://m.tkk7.com/sean/services/trackbacks/110644.html d一h有意思的文章Q来自Weiqi GaoQ?br />http://www.weiqigao.com/blog/2007/04/12/java_the_third_fork_from_sun.html

q几qSun的日子似乎ƈ不好q:和微软先是不Ƣ散后来虽然和解但貌合神,微Y不买Sun的̎Q干脆自己搞?NETQ对IBM更是气不打一处来Q但是不怎么说SWT/Eclipseq朵q实开得太艻I甚至盖过了Sun的光芒;现在Sun?a target="_blank">和Apache铆上?/a>?br />
q三ơ不和,背后的原因几乎都是Sun不愿意大胆革新JavaQ或者放弃对Java的控制权QSun的JDK开源ƈ不能改变Sun对Java的实际控Ӟ?br />



laogao 2007-04-14 15:20 发表评论
]]>
[新闻] Java SE 1.6.0发布W一个update releasehttp://m.tkk7.com/sean/archive/2007/04/01/107840.htmllaogaolaogaoSun, 01 Apr 2007 14:49:00 GMThttp://m.tkk7.com/sean/archive/2007/04/01/107840.htmlhttp://m.tkk7.com/sean/comments/107840.htmlhttp://m.tkk7.com/sean/archive/2007/04/01/107840.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/107840.htmlhttp://m.tkk7.com/sean/services/trackbacks/107840.html 版本?.6.0_01?br />
详见:
http://java.sun.com/javase/6/webnotes/ReleaseNotes.html




laogao 2007-04-01 22:49 发表评论
]]>
[阅读] JRuby, Groovy, and Swinghttp://m.tkk7.com/sean/archive/2007/02/21/100322.htmllaogaolaogaoWed, 21 Feb 2007 12:03:00 GMThttp://m.tkk7.com/sean/archive/2007/02/21/100322.htmlhttp://m.tkk7.com/sean/comments/100322.htmlhttp://m.tkk7.com/sean/archive/2007/02/21/100322.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/100322.htmlhttp://m.tkk7.com/sean/services/trackbacks/100322.html 以下是一l相互关联、按旉先后排列?blog文章Q主要探讨是Swing存在的问题以及动态语a如JRuby/Groovy能否帮我们解决Swing的问题:

JRuby can save Swing
JRuby cannot save Swing
Groovy can save Swing

挺有的Q推荐大家有I一诅R?br />



laogao 2007-02-21 20:03 发表评论
]]>
[新闻] Apache ActiveMQ graduates from incubatorhttp://m.tkk7.com/sean/archive/2007/02/07/98456.htmllaogaolaogaoTue, 06 Feb 2007 16:28:00 GMThttp://m.tkk7.com/sean/archive/2007/02/07/98456.htmlhttp://m.tkk7.com/sean/comments/98456.htmlhttp://m.tkk7.com/sean/archive/2007/02/07/98456.html#Feedback0http://m.tkk7.com/sean/comments/commentRss/98456.htmlhttp://m.tkk7.com/sean/services/trackbacks/98456.html Apache旗下的ActiveMQ日前正式"毕业"成ؓApache的顶U项目之一。官方主也?a >http://incubator.apache.org/activemq/改ؓhttp://activemq.apache.org/?br/>



laogao 2007-02-07 00:28 发表评论
]]>
[阅读] 谁射杀了桌面版Javahttp://m.tkk7.com/sean/archive/2007/01/25/96047.htmllaogaolaogaoThu, 25 Jan 2007 13:30:00 GMThttp://m.tkk7.com/sean/archive/2007/01/25/96047.htmlhttp://m.tkk7.com/sean/comments/96047.htmlhttp://m.tkk7.com/sean/archive/2007/01/25/96047.html#Feedback4http://m.tkk7.com/sean/comments/commentRss/96047.htmlhttp://m.tkk7.com/sean/services/trackbacks/96047.html http://mikeomatic.net/?p=138

挺有的一文章。Java在桌面应用这个领域始l得不到q泛的认同,虽然Java 6和SWT/RCP都ؓ改善桌面版Java应用做出了自q努力Q但Java在这个领域的坏名声已l难以挽回。造成q一现状的始作俑者是谁,是什么原因导致h们对桌面版Java心存偏见Q用Java开发桌面应用的朋友也会l常会觉得力不从心呢Q该文作者提Z三点Q?br/>
  1. Sun没有意识到这样一个事实:M一ƾ桌面框架的实现Q假如不能无~的q行在Windows上,都注定成为“也能运行”的一UGUI技术,始终无法和native的版本抗衡?/li>
  2. 他们认定解决Q实玎ͼ高桌面控g的方法是通过Swingq种方式Qؓ了“跨q_”,所有东西本质上都是通过JFrame自己在canvas上画Q而不是利用现成已l实现的东西Q带来额外的开销和重复劳动?/li>
  3. 他们早应该把官方的开发工具做得更加完善,现在NetBeans发展很好Q但是不是有点太晚意识到q个问题了,而不论OS Xq是WindowsQ都在这斚wU篏了一大批忠实用户?/li>

我认为,不管桌面版Javaq去的名声如何,能够跨^台运行,来好的虚拟机环境和性能Q越来越好的API和工h持,庞大的开发群体和开源框?工具QJava仍然是开发企业桌面应用的一个相当不错的选择?br/>



laogao 2007-01-25 21:30 发表评论
]]>
Learn to be defensivehttp://m.tkk7.com/sean/archive/2007/01/25/95819.htmllaogaolaogaoWed, 24 Jan 2007 16:03:00 GMThttp://m.tkk7.com/sean/archive/2007/01/25/95819.htmlhttp://m.tkk7.com/sean/comments/95819.htmlhttp://m.tkk7.com/sean/archive/2007/01/25/95819.html#Feedback1http://m.tkk7.com/sean/comments/commentRss/95819.htmlhttp://m.tkk7.com/sean/services/trackbacks/95819.html 作ؓ开发者,我们必须要学会defensive programmingQ尤其是对要求高可靠性和无h职守的企业应用中,需要特别留意我们的设计和编码,必须可能做到够defensive?br/>
什么是defensive programmingQD个大安看过的例子:

String str = ...
if ("".equals(str)) {}

在这里我们不写str.equals("")而是反过来,是Z防止出现不必要的NPE ?NullPointerException?br/>
q行期异常是最最需要特别关照的一U非正常状况Q除了像上面q类要求我们采用相对较好的编码习惯之外,Z减少q行期异常的发生Q通常也需要用try-catch代码块来把我们相对脆弱,或者需要格外保护的逻辑包v来,对于外部传进来的参数Q一定要assert它们的合法性,即assert它们是否能够安全的被后面的逻辑所使用?br/>
通常意义上,defensive programming主要cover的是避免不必要的q行期异常发生。我们可以更q一步,更广义的q用defensive programming的核心思想Q在企业应用中,除了q行期异常,对于有些看似严重的极端的错误Q如|络时Q连接丢失,数据库提交失败等情况Q需要我们具体问题具体分析,q所有checked exception都一定需要我们去一一catch然后处理。更多的时候,其当开发无守的后台E序Q我们可以采取重试、报告、修改外部数据等方式处理Q能够自行解决的Q就不要动不动就报错Q或{待用户认Q不能自行解决的Q则要及时报告ƈ停止q行Q避免更大的错误发生?br/>
举个相对具体的例子,两个异构的系l,通过一个中间层的消息^台相互发送消息,通信协议采用最基本的socket方式Q这三个pȝ随时都可能出现宕机或链接中断的情cؓ了保证数据的完整性,我们拿其中一个需要发送和接收消息的系l来l说Q?br/>
一个可能的实现方式是:该系l所有要发送的消息保存到数据库Q给它一个初始状态;另一个独立进E从数据库按照时间先后拿出消息,更新拿出的这条消息的状态ؓ处理中,q尝试发送消息;成功后根据需要,更新消息状态ؓ成功发送或者直接删除,如果遇到p|或异常,消息恢复为初始状态,U程sleep一D|_然后再次试Q多ơ尝试或者尝试跨度超q一定时间范_则停止处理,向管理员汇报Q通过邮g、短信等途径Q。对于接收到的消息,同样是先存入数据库,然后再由后箋的进E用cM的方式取出ƈ处理。如果程序崩溃,可以自动重新启动Q应用或整个服务器)。这样不哪一D通信U\出现故障或阻塞,或者宕机,pȝ都可以一步一个脚华ͼ保dd而自动的执行Qƈ且忠实记录下有h值的状态信息,出现问题时管理员可以很直观的看到在哪个环节出现故障,从而快速找到问题关键ƈ有效解决?br/>
Defensive programming可以让我们的应用更健壮,在保证数据正性、完整性的前提下,面对困难也能更加独立自主。和defensive programming相关的话题我惛_家如果感兴趣Q可以展开更多更深入的探讨Q这里只是给大家做个介绍性的铺垫Q能抛砖引玉当然更好?br/>



laogao 2007-01-25 00:03 发表评论
]]>
[新闻] Eclipse Joins JCPhttp://m.tkk7.com/sean/archive/2007/01/13/93582.htmllaogaolaogaoSat, 13 Jan 2007 04:05:00 GMThttp://m.tkk7.com/sean/archive/2007/01/13/93582.htmlhttp://m.tkk7.com/sean/comments/93582.htmlhttp://m.tkk7.com/sean/archive/2007/01/13/93582.html#Feedback1http://m.tkk7.com/sean/comments/commentRss/93582.htmlhttp://m.tkk7.com/sean/services/trackbacks/93582.html 原文:
http://www.linux-watch.com/news/NS6467114693.html

#更新:
ҎEclipse Foundation的Executive Director Mike Milinkovich?a target="_blank">blog文章QEclipse Foundation除了加入JCP之外Q还加入OMG和OSGi?br/>



laogao 2007-01-13 12:05 发表评论
]]>
վ֩ģ壺 ޹Ʒ99þþþþ| һ| պ߹ۿƵ| | þAV뾫Ʒɫҹ鶹 | ޳ɫۺվ| selaobanƵѾƷ| ۺɫ߲| ҹƵ| ҹþþӰԺ| Ļһ| AVһ֤| һaȫƵ| ޹Ʒ۲ӰԺ߹ۿ | һ߹ۿ| ˬִ̼վ| ޳AVƬ߹ۿWWW| þѹƵ| ޹Ʒþ˰| þۺAVѹۿ| ޸ҹӰ| aػƵƬƵ| ٶ100%ڵѹۿ| ޾Ʒר߹ۿ| ߹ۿѹۿ| ޹Ʒþþþ | ޺Сvideos| ŷ޴Ƭ| ˾ҹƵ| ޾Ʒھþ| ձַȫ߹ۿ| Ʒ޾Ʒպͼ| ۺϽ| 6080ҹһëƬѿ | ޵һҳ߲| ѹۿ| ߹ۿר| ˳վ߲2019| AVֻ߹ۿ| Ʒ10000| ɫAëƬѿ|