<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2577232898547286851</id><updated>2011-07-28T17:49:00.812-07:00</updated><category term='linux'/><category term='Mule'/><category term='XML'/><category term='Design'/><category term='MySql'/><category term='OSGi'/><category term='JavaScript'/><category term='ESB'/><category term='vmware'/><category term='Wicket'/><category term='Tool'/><category term='Smooks'/><title type='text'>随记随拍</title><subtitle type='html'>记录生活、工作中的点点滴滴。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-3297639399552132794</id><published>2009-05-04T02:18:00.000-07:00</published><updated>2009-05-04T02:18:00.526-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wicket'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>DDD(Domain Driven Design)之Package规划</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;  在以前的项目中，“贫血”模型用的比较多，然而“贫血”模型并没有充分发挥DDD的优势，也达不到Domain Objects是业务逻辑的核心作用。&lt;br /&gt;&lt;br /&gt;  借鉴网络上的一些资料，在新的架构下，自己规划了一下Packages。目前，新架构采用Wicket 1.4 + Guice 2.0 + Warp-persist 2.0 + Hibernate 3.3 框架。如此设计架构，主要是为了进行组件式复用，以及保持架构尽量轻量化。&lt;br /&gt;&lt;br /&gt;  Packages按层次方式来进行划分（见下图）：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;do&lt;/b&gt;&lt;b&gt;main&lt;/b&gt;：放置所有的领域对象，包含model和service两类对象。model下放置DO和Repository接口，DO中包含业务逻辑方法，并可注入Repository进行持久化。service下主要放置涉及多个DO之间存在交互的对&lt;div align="left"&gt;&lt;br /&gt;&lt;/div&gt; 象。&lt;/li&gt;&lt;li&gt;&lt;b&gt;infrastructure.persistence&lt;/b&gt;：放置所有Repository接口的hibernate实现。infrastructure下包含所有的基础实施，譬如：cache，security等。&lt;/li&gt;&lt;li&gt;&lt;b&gt;application&lt;/b&gt;：facade模式的应用，主要是为了方便表现层调用。并且可适配多种展现方式，譬如：html、xml等。&lt;/li&gt;&lt;li&gt;&lt;b&gt;guice&lt;/b&gt;：放置guice的module。&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div align="left"&gt;&lt;img src="http://lh5.ggpht.com/_Qezq_4KA2Ek/Sf6xCwkzVHI/AAAAAAAAAFQ/PY1fx3ZISJM/%5BUNSET%5D.jpg?imgmax=800" style="max-width: 800px;" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img src="http://img.zemanta.com/pixy.gif?x-id=874ae68e-9a89-841a-8410-bb8b4af5d891" class="zemanta-pixie-img" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-3297639399552132794?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/3297639399552132794/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/05/ddddomain-driven-designpackage.html#comment-form' title='36 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/3297639399552132794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/3297639399552132794'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/05/ddddomain-driven-designpackage.html' title='DDD(Domain Driven Design)之Package规划'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_Qezq_4KA2Ek/Sf6xCwkzVHI/AAAAAAAAAFQ/PY1fx3ZISJM/s72-c/%5BUNSET%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>36</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-3701331783919092616</id><published>2009-04-30T00:40:00.000-07:00</published><updated>2009-04-30T03:06:10.027-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wicket'/><title type='text'>Wicket+Guice+Warp-Persist+Hibernate配置</title><content type='html'>Wicket1.4中已经有独立的Guice模块，但Guice只是一个IoC框架，不支持对事务等的管理；Warp-Persist是Guice下的一个支持事务管理的框架，它支持多种ORM框架，如：Hibernate、Jpa等。当前，配置Wicket+Guice+Warp-Persist+Hibernate已经非常简单，几个步骤即可：&lt;br /&gt;&lt;br /&gt;1. download相应框架的jar包和运行时必须的lib；Guice当前的版本已经升级到2.0 snapshot，只需要guice-core.jar和aopalliance.jar，warp-persist也只需求找一个最新的jar包即可；Wicket和Hibernate所需的lib比较多，主要需要注意cglib和slf4j（日志）。&lt;br /&gt;&lt;br /&gt;2. 创建一个Guice的Module，扩展AbstractModule即可。&lt;br /&gt;&lt;br /&gt;3. Module中首先装载Warp-Persist:      &lt;blockquote&gt; &lt;span style="font-style: italic;"&gt;install(PersistenceService.&lt;span style="font-weight: bold;"&gt;usingHibernate&lt;/span&gt;().across(UnitOfWork.&lt;span style="font-weight: bold;"&gt;REQUEST&lt;/span&gt;).buildModule());&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;  4. 然后配置hibernate configuation，我这里用的是AnnotationConfiguration，切记：&lt;span style="font-weight: bold;"&gt;configuration中一定要指定current_session_context_class这个参数&lt;/span&gt;。hibernate.cfg.xml放在WEB-INF/classes目录下。&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;        AnnotationConfiguration result = new AnnotationConfiguration();&lt;br /&gt;     result.configure(ServiceModule.class.getResource("/hibernate.cfg.xml"));&lt;br /&gt;     result .setProperty("hibernate.current_session_context_class", "managed");&lt;br /&gt;     bind(Configuration.class).toInstance(result);&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;  5. 最后，配置web.xml，一定要注意Warp‘s Filter和WicketFilter的位置，&lt;span style="font-weight: bold;"&gt;Warp‘s Filter一定要放置在WicketFilter的前面&lt;/span&gt;。并且指定WicketFilter的applicationFactoryClassName和module参数。&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;    &amp;lt;filter&amp;gt;&lt;br /&gt;     &amp;lt;filter-name&amp;gt;sessionPerRequestFilter&amp;lt;filter-name&amp;gt;&lt;br /&gt;     &amp;lt;filter-class&amp;gt;com.wideplay.warp.persist.PersistenceFilter&amp;lt;filter-class&amp;gt;&lt;br /&gt; &amp;lt;/filter&amp;gt;&lt;br /&gt; &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;     &amp;lt;filter-name&amp;gt;sessionPerRequestFilter&amp;lt;filter-name&amp;gt;&lt;br /&gt;     &amp;lt;url-pattern&amp;gt;/*&amp;lt;url-pattern&amp;gt;&lt;br /&gt; &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;filter&amp;gt;&lt;br /&gt;     &amp;lt;filter-name&amp;gt;wicketFilter&amp;lt;filter-name&amp;gt;&lt;br /&gt;     &amp;lt;filter-class&amp;gt;org.apache.wicket.protocol.http.WicketFilter&amp;lt;filter-class&amp;gt;&lt;br /&gt;&lt;br /&gt;     &amp;lt;init-param&amp;gt;&lt;br /&gt;     &amp;lt;param-name&amp;gt;&lt;span style="font-weight: bold;"&gt;applicationFactoryClassName&lt;/span&gt;&amp;lt;param-name&amp;gt;&lt;br /&gt;     &amp;lt;param-value&amp;gt;org.apache.wicket.guice.GuiceWebApplicationFactory&amp;lt;param-value&amp;gt;&lt;br /&gt;   &amp;lt;/init-param&amp;gt;&lt;br /&gt;   &amp;lt;init-param&amp;gt;&lt;br /&gt;     &amp;lt;param-name&amp;gt;&lt;span style="font-weight: bold;"&gt;module&lt;/span&gt;&amp;lt;param-name&amp;gt;&lt;br /&gt;     &amp;lt;param-value&amp;gt;com.deversoft.test.guice.WicketModule&amp;lt;param-value&amp;gt;&lt;br /&gt;   &amp;lt;/init-param&amp;gt;&lt;br /&gt;   &amp;lt;init-param&amp;gt;&lt;br /&gt;     &amp;lt;param-name&amp;gt;wicket-guice.stage&amp;lt;param-name&amp;amp;gt&lt;br /&gt;     &amp;lt;param-value&amp;gt;DEVELOPMENT&amp;lt;param-value&amp;gt;&lt;br /&gt;   &amp;lt;/init-param&amp;gt;&lt;br /&gt; &amp;lt;/filter&amp;gt;&lt;br /&gt; &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;     &amp;lt;filter-name&amp;gt;wicketFilter&amp;lt;filter-name&amp;gt;&lt;br /&gt;     &amp;lt;url-pattern&amp;gt;/*&amp;lt;url-pattern&amp;gt;&lt;br /&gt; &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;参考资料：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.mularien.com/blog/2007/11/28/bleeding-edge-transactional-wicket-web-applications-with-warp-and-guice/"&gt;Bleeding Edge Transactional Wicket Web Applications with Warp and Guice&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wideplay.com/"&gt;Warp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://wicket.apache.org/"&gt;Wicket&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://code.google.com/p/google-guice/"&gt;Google-Guice&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-3701331783919092616?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/3701331783919092616/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/04/wicketguicewarp-persisthibernate.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/3701331783919092616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/3701331783919092616'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/04/wicketguicewarp-persisthibernate.html' title='Wicket+Guice+Warp-Persist+Hibernate配置'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-5788373974944297908</id><published>2009-04-29T19:17:00.000-07:00</published><updated>2009-04-29T19:43:17.120-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wicket'/><title type='text'>Wicket1.4中调用外部资源的方法</title><content type='html'>在wicket中，要使用js或css文件，需要将这些文件包装成ResourceReference，通过ResourceReference就可以将js或css文件加入到wicket页面对象中。因此，我分别创建了2个Enum对象：DefaultJavascript和DefaultStyle，如下：&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;public enum DefaultStyle {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;      Header("header.css"), MainPage("main-page.css");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;       private String cssName;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;      DefaultStyle(String cssName) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;           this.cssName = cssName;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;      public ResourceReference &lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;getResouceReference&lt;/span&gt;&lt;/span&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;          return new ResourceReference(DefaultStyle.class, cssName);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;      }&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;  }&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;&lt;/span&gt;通过DefaultStyle来将css文件封装成ResourceReference对象，js文件要照此处理，比较方便。&lt;br /&gt;&lt;br /&gt;要将ResourceReference加入到wicket中，在wicket1.4版本中，&lt;br /&gt;加css文件：&lt;br /&gt;&lt;blockquote&gt;add(&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;CSSPackageResource&lt;/span&gt;&lt;/span&gt;.getHeaderContribution(DefaultStyle.Popup&lt;br /&gt;             .getResouceReference()));&lt;/blockquote&gt;加js文件：&lt;br /&gt;&lt;blockquote&gt;add(&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;JavascriptPackageResource&lt;/span&gt;&lt;/span&gt;.getHeaderContribution(DefaultJavascript.JQuery&lt;br /&gt;                     .getResouceReference()));&lt;/blockquote&gt;稍微麻烦一点的是对图片的处理，一般存在三种方式：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;如果在页面中使用了&lt;span style="font-weight: bold;"&gt;Img&lt;/span&gt;标签，那可以按上面js或css方式来进行处理，通过ResourceReference对象来包装。&lt;/li&gt;&lt;li&gt;如果是在&lt;span style="font-weight: bold;"&gt;css文件中直接使用图片&lt;/span&gt;，可以根据css文件与图片文件所在的相对路径来直接设置。譬如：jquery.tab.css文件放在com.deversoft.web.tab包下，tab-bottom.gif图片放在com.deversoft.web.tab.images包下。那在css文件中可以直接通过&lt;span style="font-weight: bold;"&gt;images/tab-bottom.gif&lt;/span&gt;来进行使用。&lt;/li&gt;&lt;li&gt;如果是在&lt;span style="font-weight: bold;"&gt;js文件中直接使用图片&lt;/span&gt;，需要引用图片ResouceReference对象的路径。譬如，还是上面的图片tab-bottom.gif，在js中调用，就需要这样调用：&lt;span style="font-weight: bold;"&gt;resources/com.deversoft.web.tab.DefaultImage/tab-bottom.gif&lt;/span&gt;。这其实和第一种方式以相同的。&lt;/li&gt;&lt;/ol&gt;&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAUCAYAAACJfM0wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAAB90RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgOLVo0ngAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDQvMDQvMDhrK9wWAAACLklEQVQ4jbXUP0wTcRQH8O/9ekdjkT8CUqpee00bRyNNmSRSV0PcJJoQg2i6ODTExEUHg04OaNSppqtCjQ4ukDSKSuLUwcm4NNZcQYsIGtD+u/f7MZSWXltqo/Ul7/JL7u7z3r3fLye53e5xj8ejoYWRSCSSstfr1YLBYHcr4XA4rMmMMciy3EoXjDHIjDEoivL/4fefrP1P3nYEvqzLajOIo8fQz5/cfH3cnVttCM8udQaODBxQFx44Ye9h4HxvdGWtgMlbSXV2SQoMHf0RNcGSJJlmvPLdos7fdyIWL+D5myx+ZwwUDAIRh2EU1wYRFItA6FwvIjdcGJr4qFYakiSBlTavlABwsJth7mUWmSyBOAfnAkQE4gKccxBx/MoYmHmcxuH+NgAwGQ03j3NeRjjnoGqcC/zcIgghAMBkNISJuKlbEy4EaKdoKerC5nNMxQdlgVx+t0siKhYQovwV1rbdtyoNxlhxxoqilBMA0uuES6Pt6NqP2hHsoDarhJuXD2F5NV/uuJR1T4XLzvTJ25/VyHUnzgzba0YkKq6pdB4T00m47EyvPhU1M54asy3ee5o55bvwQQWAr/PHMBfbQGhGrykCANqARZ8asy3+ccYjg/K3kcF9UQAYvrJ29dmrDUxHlnOxu72P+rpYrq5eFU39K649TCF0tnPB0WdtCt2z48rQHIp+8XTHu9ET7alm0aY6fnFHjda98a/w3wZjDJLP5xv3+/1aK+F4PJ7cBm32CUNiyI2GAAAAAElFTkSuQmCC" style="position: absolute; visibility: hidden; z-index: 2147483647; left: 489px; top: 681px;" id="kosa-target-image" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-5788373974944297908?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/5788373974944297908/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/04/wicket14.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/5788373974944297908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/5788373974944297908'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/04/wicket14.html' title='Wicket1.4中调用外部资源的方法'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-1233130965421716150</id><published>2009-04-20T02:21:00.000-07:00</published><updated>2009-04-20T02:49:39.452-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wicket'/><title type='text'>可关闭的Wicket TabbedPanel</title><content type='html'>&lt;span style="font-family: webdings;"&gt;  Wicket中自带的TabbedPanel是不能关闭的，而在项目中，却要使用可以关闭的Tabs，因此参考Wicket Wiki上的例子，自己实现了一套带关闭图标的TabbedPannel。具体实现方式如下：&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: webdings; font-weight: bold;"&gt;第一步：创建一个abstract SimpleAbstractTab类，扩展AbstractTab。&lt;/span&gt;&lt;br /&gt;&lt;blockquote style="font-family: webdings;"&gt;public abstract class SimpleAbstractTab extends AbstractTab {&lt;br /&gt;private String title;&lt;br /&gt;private boolean canBeClosed;&lt;br /&gt;&lt;br /&gt;public SimpleAbstractTab(IModel iModel, String title, boolean canBeClosed) {&lt;br /&gt;  super(iModel);&lt;br /&gt;  this.title = title;&lt;br /&gt;  this.canBeClosed = canBeClosed;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getOngletTitle() {&lt;br /&gt;  return this.title;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public boolean isCanBeClosed() {&lt;br /&gt;  return canBeClosed;&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-family: webdings; font-weight: bold;"&gt;第二步：创建一个SimpleTabbedPanel，扩展TabbedPanel。&lt;/span&gt;&lt;br /&gt;&lt;blockquote style="font-family: webdings;"&gt;&lt;br /&gt;public class SimpleTabbedPanel extends Panel {&lt;br /&gt;private static final long serialVersionUID = 1L;&lt;br /&gt;public static final String TAB_PANEL_ID = "panel";&lt;br /&gt;&lt;br /&gt;private String whereAmI;&lt;br /&gt;private final List&lt;simpleabstracttab&gt; tabs;&lt;br /&gt;&lt;br /&gt;public SimpleTabbedPanel(String id, List&lt;simpleabstracttab&gt; tabs) {&lt;br /&gt;   super(id, new Model(new Integer(-1)));&lt;br /&gt;   add(CSSPackageResource.getHeaderContribution(DefaultStyle.TabbedPanel.getResouceReference()));&lt;br /&gt;   this.setOutputMarkupId(true);&lt;br /&gt;&lt;br /&gt;   if (tabs == null) {&lt;br /&gt;       throw new IllegalArgumentException("argument [tabs] cannot be null");&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   this.tabs = tabs;&lt;br /&gt;&lt;br /&gt;   final IModel tabCount = new AbstractReadOnlyModel() {&lt;br /&gt;       private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;       public Object getObject() {&lt;br /&gt;           return new Integer(SimpleTabbedPanel.this.tabs.size());&lt;br /&gt;       }&lt;br /&gt;   };&lt;br /&gt;&lt;br /&gt;   WebMarkupContainer tabsContainer = new WebMarkupContainer(&lt;br /&gt;           "tabs-container") {&lt;br /&gt;       private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;       protected void onComponentTag(ComponentTag tag) {&lt;br /&gt;           super.onComponentTag(tag);&lt;br /&gt;           tag.put("class", getTabContainerCssClass());&lt;br /&gt;       }&lt;br /&gt;   };&lt;br /&gt;   add(tabsContainer);&lt;br /&gt;&lt;br /&gt;   // add the loop used to generate tab names&lt;br /&gt;   tabsContainer.add(new Loop("tabs", tabCount) {&lt;br /&gt;       private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;       protected void populateItem(LoopItem item) {&lt;br /&gt;           final int index = item.getIteration();&lt;br /&gt;&lt;br /&gt;           final WebMarkupContainer titleLink = newLink("link", index);&lt;br /&gt;&lt;br /&gt;           titleLink.add(newTitle("title", SimpleTabbedPanel.this.tabs&lt;br /&gt;                   .get(index).getOngletTitle(), index));&lt;br /&gt;           item.add(titleLink);&lt;br /&gt;&lt;br /&gt;           final AjaxLink closeLink = newAjaxLink("closeTab", index);&lt;br /&gt;           closeLink.add(new Image("closeImg", DefaultImage.TabClosed.getResouceReference()));&lt;br /&gt;           if (!SimpleTabbedPanel.this.tabs.get(index).isCanBeClosed())&lt;br /&gt;               closeLink.setVisible(false);&lt;br /&gt;           item.add(closeLink);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       protected LoopItem newItem(int iteration) {&lt;br /&gt;           return newTabContainer(iteration);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;   });&lt;br /&gt;&lt;br /&gt;   this.whereAmI = this.tabs.get(0).getOngletTitle();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected LoopItem newTabContainer(int tabIndex) {&lt;br /&gt;   return new LoopItem(tabIndex) {&lt;br /&gt;       private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;       protected void onComponentTag(ComponentTag tag) {&lt;br /&gt;           super.onComponentTag(tag);&lt;br /&gt;           String cssClass = (String) tag.getString("class");&lt;br /&gt;           if (cssClass == null) {&lt;br /&gt;               cssClass = " ";&lt;br /&gt;           }&lt;br /&gt;           cssClass += " tab" + getIteration();&lt;br /&gt;&lt;br /&gt;           if (getIteration() == getSelectedTab()) {&lt;br /&gt;               cssClass += " selected";&lt;br /&gt;           }&lt;br /&gt;           if (getIteration() == getTabs().size() - 1) {&lt;br /&gt;               cssClass += " last";&lt;br /&gt;           }&lt;br /&gt;           tag.put("class", cssClass.trim());&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;   };&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void onBeforeRender() {&lt;br /&gt;   super.onBeforeRender();&lt;br /&gt;   if (!hasBeenRendered() &amp;amp;&amp;amp; getSelectedTab() == -1) {&lt;br /&gt;       // select the first tab by default&lt;br /&gt;       setSelectedTab(0);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected String getTabContainerCssClass() {&lt;br /&gt;   return "tab-row";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public final List&lt;simpleabstracttab&gt; getTabs() {&lt;br /&gt;   return tabs;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected Component newTitle(String titleId, String title, int index) {&lt;br /&gt;   return new Label(titleId, title);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void newTab(AjaxRequestTarget target, SimpleAbstractTab tab) {&lt;br /&gt;   this.tabs.add(tab);&lt;br /&gt;   this.setSelectedTab(this.tabs.size()-1);&lt;br /&gt;   target.addComponent(this);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void removeTab(AjaxRequestTarget target, int index) {&lt;br /&gt;   String titleDeletedTab = this.tabs.get(index).getOngletTitle();&lt;br /&gt;   this.tabs.remove(index);&lt;br /&gt;&lt;br /&gt;   if (titleDeletedTab.equals(this.whereAmI)) {&lt;br /&gt;       this.setSelectedTab(0);&lt;br /&gt;       this.whereAmI = this.tabs.get(0).getOngletTitle();&lt;br /&gt;   } else {&lt;br /&gt;       this.setSelectedTab(this.findSelectedTab(whereAmI));&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   target.addComponent(this);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected int findSelectedTab(String title) {&lt;br /&gt;   int result = 0;&lt;br /&gt;   for (int i = 0; i &lt; result =" i;"&gt;= tabs.size()) {&lt;br /&gt;       throw new IndexOutOfBoundsException();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   setDefaultModelObject(new Integer(index));&lt;br /&gt;&lt;br /&gt;   ITab tab = (ITab) tabs.get(index);&lt;br /&gt;&lt;br /&gt;   Panel panel = tab.getPanel(TAB_PANEL_ID);&lt;br /&gt;&lt;br /&gt;   if (panel == null) {&lt;br /&gt;       throw new WicketRuntimeException(&lt;br /&gt;               "ITab.getPanel() returned null. TabbedPanel [" + getPath()&lt;br /&gt;                       + "] ITab index [" + index + "]");&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if (!panel.getId().equals(TAB_PANEL_ID)) {&lt;br /&gt;       throw new WicketRuntimeException(&lt;br /&gt;               "ITab.getPanel() returned a panel with invalid id ["&lt;br /&gt;                       + panel.getId()&lt;br /&gt;                       + "]. You must always return a panel with id equal to the provided panelId parameter. TabbedPanel ["&lt;br /&gt;                       + getPath() + "] ITab index [" + index + "]");&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if (get(TAB_PANEL_ID) == null) {&lt;br /&gt;       add(panel);&lt;br /&gt;   } else {&lt;br /&gt;       replace(panel);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   this.whereAmI = this.tabs.get(index).getOngletTitle();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public final int getSelectedTab() {&lt;br /&gt;   return ((Integer) getDefaultModelObject()).intValue();&lt;br /&gt;}&lt;br /&gt;}&lt;/simpleabstracttab&gt;&lt;/simpleabstracttab&gt;&lt;/simpleabstracttab&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: webdings; font-weight: bold;"&gt;第三步：同时，创建一个SimpleTabbedPanel.html，页面如下：&lt;/span&gt;&lt;br /&gt;&lt;blockquote style="font-family: webdings;"&gt;&lt;br /&gt;[wicket:panel]&lt;br /&gt; [div wicket:id="tabs-container" class="tab-row"]&lt;br /&gt;    [ul]&lt;br /&gt;         [li wicket:id="tabs"]&lt;br /&gt;     [div class="tab"]&lt;br /&gt;                 [a href="#" wicket:id="link" class="tab-link"][span wicket:id="title"]tab title[/span][/a]&lt;br /&gt;       [a href="#" wicket:id="closeTab" class="tab-close"][img wicket:id="&lt;span style="font-weight: bold;"&gt;closeImg&lt;/span&gt;" alt="Close" border=0/][/a]&lt;br /&gt;     [/div]&lt;br /&gt;   [/li]&lt;br /&gt;  [/ul]&lt;br /&gt; [/div]&lt;br /&gt;  [div wicket:id="panel" class="tab-panel"]panel[/div]&lt;br /&gt;[/wicket:panel]&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-family: webdings; font-weight: bold;"&gt;第四步：创建一个css文件，并使用一个close的icon。&lt;/span&gt;&lt;br /&gt;&lt;blockquote style="font-family: webdings;"&gt;div.tabpanel div.tab-row ul {&lt;br /&gt; height: 20px;&lt;br /&gt; margin: 0;&lt;br /&gt; padding-left: 10px;&lt;br /&gt; background: url( images/tab_bottom.gif ) repeat-x bottom;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;div.tabpanel div.tab-row li {&lt;br /&gt; margin: 0;&lt;br /&gt; padding:0 5px 0 0;&lt;br /&gt; display: inline;&lt;br /&gt; list-style-type: none;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;div.tabpanel div.tab-row div.tab {&lt;br /&gt;float:left;&lt;br /&gt;display:block;&lt;br /&gt;background:#f3f3f3;&lt;br /&gt;padding:5px 7px 4px 20px;&lt;br /&gt;text-decoration:none;&lt;br /&gt;font-weight:bold;&lt;br /&gt;color:#9cf;&lt;br /&gt;border: 1px solid #ccc;&lt;br /&gt;white-space:nowrap;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;div.tabpanel div.tab-row a.tab-link:link, div.tabpanel div.tab-row a.tab-link:visited {&lt;br /&gt; float: left;&lt;br /&gt; background: #f3f3f3;&lt;br /&gt; font-size: 12px;&lt;br /&gt; line-height: 14px;&lt;br /&gt; font-weight: bold;&lt;br /&gt; padding:5px 10px 4px 10px;&lt;br /&gt; margin-right: 4px;&lt;br /&gt; text-decoration: none;&lt;br /&gt; color: #666;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;div.tabpanel div.tab-row li.selected a.tab-link:link, div.tabpanel div.tab-row a.tab-link:visited.active {&lt;br /&gt; border-bottom: 1px solid #fff;&lt;br /&gt; background: #fff;&lt;br /&gt; color: #000;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;div.tabpanel div.tab-row a.tab-link:hover {&lt;br /&gt; background: #fff;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;div.tabpanel div.tab-row a.tab-close:hover {&lt;br /&gt; background: #B9D4E8;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-family: webdings; font-weight: bold;"&gt;第五步：实现几个panel，如FirstTab等都是自己任意实现的Panel，调用SimpleTabbedPanel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: webdings;"&gt;//tabs&lt;br /&gt;      final List&lt;simpleabstracttab&gt; tabs = new ArrayList&lt;simpleabstracttab&gt;();&lt;br /&gt;      tabs.add(new SimpleAbstractTab(new Model&lt;string&gt;("first tab"), "simple tab1", true) {&lt;br /&gt;          @Override&lt;br /&gt;          public Panel getPanel(final String panelId) {&lt;br /&gt;              return new FirstTab(panelId);&lt;br /&gt;          }&lt;br /&gt;      });&lt;br /&gt;      final SimpleTabbedPanel tabbedPanel = new SimpleTabbedPanel("tabs", tabs);&lt;br /&gt;      add(tabbedPanel);&lt;br /&gt;&lt;br /&gt;      // The AjaxLink to new tab&lt;br /&gt;      add(new AjaxLink("newTab"){&lt;br /&gt;          public void onClick(AjaxRequestTarget target) {&lt;br /&gt;              tabbedPanel.newTab(target, new SimpleAbstractTab(new Model&lt;string&gt;("first tab"), "new Tab", true) {&lt;br /&gt;                  @Override&lt;br /&gt;                  public Panel getPanel(final String panelId) {&lt;br /&gt;                      return new NewTab(panelId);&lt;br /&gt;                  }&lt;br /&gt;              });&lt;br /&gt;          }&lt;br /&gt;      });&lt;/string&gt;&lt;/string&gt;&lt;/simpleabstracttab&gt;&lt;/simpleabstracttab&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAUCAYAAACJfM0wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAAB90RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgOLVo0ngAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDQvMDQvMDhrK9wWAAACMElEQVQ4ja3SP2gTcRQH8O8vvUtIGmkqTY3SaMVFz6KDW2ywg4s4dGgXp3SyVLIIthCKQxCCuoZaXaSO/ilKd4sSdXRL0EWtIRYaSkXsJTH33utwSZM01xo0D353v+N+97l33/upQCAwFgwGfehiFYtFUxsYGPCmUqmv3YQTicSwBgCapnXTBQBoSinout5VVCnVDr/44B/OZH0xs6KMThCfR3LRs+aTycjvbwfCmawvduZkn7EwN4TBfheY90fXN6uYuffdyGQRu3apkmyDmzM2K8pYmBvC6kcLK+/KMEsWLCIQMSyLULUIFhH0HsGNycNYnDuO6PRno9lQSsFVh+tDQSEY6MHymzJKFQILgxkgYhALmBnMDLNsIf1sA8cG3VDYYzhFAWWfRBjCAiIbIxYQE1ga17+2GSICKLQYznCtiATEDK6BIrU5MUhgd0+NH+AIt+5jshdqgkpVwEwNkBgs9lyE4XY3nnLMWNf13QEAG1uE2JVe9PUC5JCvCMPrVpifOor1YnW34/pw7NjvVbmZ+3ljcTaMq5EjbRFJ07Gw8QfTd9fg96rc3o7bMh4f9SytvDenLl7/ZADAl5cjWF7dwmy60PaSeiPjo56lv2Ycnzi0Fp9AEgAu39x8+urtT9x5/GP74a2++LlTuumo76kDd4W9ALj9qIDIiOfBhdO+jtB9O279TFcuet77fD7Wn+sU7ajj1+kTSccb/wv/aymloEKh0Fg4HPZ2E87n86Udvs4FoWqwSHUAAAAASUVORK5CYII=" style="position: absolute; visibility: hidden; z-index: 2147483647; left: 589px; top: 3790px; font-family: webdings;" id="kosa-target-image" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-1233130965421716150?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/1233130965421716150/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/04/wicket-tabbedpanel.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/1233130965421716150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/1233130965421716150'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/04/wicket-tabbedpanel.html' title='可关闭的Wicket TabbedPanel'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-6302952044675168827</id><published>2009-04-09T18:42:00.000-07:00</published><updated>2009-04-09T18:57:35.817-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><title type='text'>Install Mysql-Proxy 0.7.0 on openSUSE 11.1</title><content type='html'>&lt;span style=";font-family:verdana;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;steps&lt;/span&gt;:&lt;br /&gt;&lt;/span&gt;&lt;ol  style="font-family:verdana;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;install pkg-config (&lt;span style="font-style: italic;"&gt;yast2&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;install autotools &amp;amp;&amp;amp; libtool &amp;amp;&amp;amp; libmysql-devel &lt;/span&gt;&lt;span style="font-size:100%;"&gt;(&lt;span style="font-style: italic;"&gt;yast2&lt;/span&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;install libevent(&gt; 1.4.0) &amp;amp;&amp;amp; libevent-devel &lt;/span&gt;&lt;span style="font-size:100%;"&gt;(&lt;span style="font-style: italic;"&gt;yast2&lt;/span&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;install glib2(&gt;2.0)  &amp;amp;&amp;amp;  glib2-devel &lt;/span&gt;&lt;span style="font-size:100%;"&gt;(&lt;span style="font-style: italic;"&gt;yast2&lt;/span&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;install Lua 5.1 &amp;amp;&amp;amp; Lua-devel &lt;/span&gt;&lt;span style="font-size:100%;"&gt;(&lt;span style="font-style: italic;"&gt;yast2&lt;/span&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;download mysql-proxy 0.7.0 sources code&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;./autogen.sh &amp;amp;&amp;amp; ./configuration &amp;amp;&amp;amp; make &amp;amp;&amp;amp; install&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;export PATH=$PATH:/usr/local/sbin&lt;span style="font-family:monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;mysql-proxy -V&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAUCAYAAACJfM0wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAAB90RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgOLVo0ngAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDQvMDQvMDhrK9wWAAACLklEQVQ4jbXUP0wTcRQH8O/9ekdjkT8CUqpee00bRyNNmSRSV0PcJJoQg2i6ODTExEUHg04OaNSppqtCjQ4ukDSKSuLUwcm4NNZcQYsIGtD+u/f7MZSWXltqo/Ul7/JL7u7z3r3fLye53e5xj8ejoYWRSCSSstfr1YLBYHcr4XA4rMmMMciy3EoXjDHIjDEoivL/4fefrP1P3nYEvqzLajOIo8fQz5/cfH3cnVttCM8udQaODBxQFx44Ye9h4HxvdGWtgMlbSXV2SQoMHf0RNcGSJJlmvPLdos7fdyIWL+D5myx+ZwwUDAIRh2EU1wYRFItA6FwvIjdcGJr4qFYakiSBlTavlABwsJth7mUWmSyBOAfnAkQE4gKccxBx/MoYmHmcxuH+NgAwGQ03j3NeRjjnoGqcC/zcIgghAMBkNISJuKlbEy4EaKdoKerC5nNMxQdlgVx+t0siKhYQovwV1rbdtyoNxlhxxoqilBMA0uuES6Pt6NqP2hHsoDarhJuXD2F5NV/uuJR1T4XLzvTJ25/VyHUnzgzba0YkKq6pdB4T00m47EyvPhU1M54asy3ee5o55bvwQQWAr/PHMBfbQGhGrykCANqARZ8asy3+ccYjg/K3kcF9UQAYvrJ29dmrDUxHlnOxu72P+rpYrq5eFU39K649TCF0tnPB0WdtCt2z48rQHIp+8XTHu9ET7alm0aY6fnFHjda98a/w3wZjDJLP5xv3+/1aK+F4PJ7cBm32CUNiyI2GAAAAAElFTkSuQmCC" style="position: absolute; visibility: hidden; z-index: 2147483647; left: 219px; top: 19px;" id="kosa-target-image" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-6302952044675168827?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/6302952044675168827/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/04/install-mysql-proxy-070-on-opensuse-111.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/6302952044675168827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/6302952044675168827'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/04/install-mysql-proxy-070-on-opensuse-111.html' title='Install Mysql-Proxy 0.7.0 on openSUSE 11.1'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-508706898199512967</id><published>2009-04-07T22:29:00.000-07:00</published><updated>2009-04-08T18:54:19.333-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vmware'/><title type='text'>VMware Server2.0: install vmware tools</title><content type='html'>摆弄了VMware server 2.0一段时间，终于找到怎样来安装vmware tool了。当安装完虚机后，可以将虚机&lt;span style="font-weight: bold;"&gt;add virtual machine to Inventory&lt;/span&gt;。这样左边Inventory目录中就会显示该虚机名称。&lt;br /&gt;&lt;br /&gt;  先启动该虚机，当打开该虚机的&lt;span style="font-weight: bold;"&gt;summary tab&lt;/span&gt;页时，在右边显示的&lt;span style="font-weight: bold;"&gt;status&lt;/span&gt;信息栏中会出现&lt;span style="font-style: italic;"&gt;vmware tools&lt;/span&gt;的状态，如果已经安装了，就会显示出&lt;span style="font-style: italic;"&gt;running&lt;/span&gt;；如果没有安装，则会显示【&lt;span style="font-weight: bold;"&gt;install vmware tool&lt;/span&gt;】的链接。点击该链接，虚机中会自动加载vmware tools的cdrom。通过cdrom就可以安装vmware tools了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAUCAYAAACJfM0wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAAB90RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgOLVo0ngAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDQvMDQvMDhrK9wWAAACMElEQVQ4ja3SP2gTcRQH8O8vvUtIGmkqTY3SaMVFz6KDW2ywg4s4dGgXp3SyVLIIthCKQxCCuoZaXaSO/ilKd4sSdXRL0EWtIRYaSkXsJTH33utwSZM01xo0D353v+N+97l33/upQCAwFgwGfehiFYtFUxsYGPCmUqmv3YQTicSwBgCapnXTBQBoSinout5VVCnVDr/44B/OZH0xs6KMThCfR3LRs+aTycjvbwfCmawvduZkn7EwN4TBfheY90fXN6uYuffdyGQRu3apkmyDmzM2K8pYmBvC6kcLK+/KMEsWLCIQMSyLULUIFhH0HsGNycNYnDuO6PRno9lQSsFVh+tDQSEY6MHymzJKFQILgxkgYhALmBnMDLNsIf1sA8cG3VDYYzhFAWWfRBjCAiIbIxYQE1ga17+2GSICKLQYznCtiATEDK6BIrU5MUhgd0+NH+AIt+5jshdqgkpVwEwNkBgs9lyE4XY3nnLMWNf13QEAG1uE2JVe9PUC5JCvCMPrVpifOor1YnW34/pw7NjvVbmZ+3ljcTaMq5EjbRFJ07Gw8QfTd9fg96rc3o7bMh4f9SytvDenLl7/ZADAl5cjWF7dwmy60PaSeiPjo56lv2Ycnzi0Fp9AEgAu39x8+urtT9x5/GP74a2++LlTuumo76kDd4W9ALj9qIDIiOfBhdO+jtB9O279TFcuet77fD7Wn+sU7ajj1+kTSccb/wv/aymloEKh0Fg4HPZ2E87n86Udvs4FoWqwSHUAAAAASUVORK5CYII=" style="position: absolute; visibility: hidden; z-index: 2147483647; left: 301px; top: 2px;" id="kosa-target-image" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-508706898199512967?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/508706898199512967/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/04/vmware-server20-install-vmware-tools.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/508706898199512967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/508706898199512967'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/04/vmware-server20-install-vmware-tools.html' title='VMware Server2.0: install vmware tools'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-1267132501497813508</id><published>2009-04-03T02:42:00.000-07:00</published><updated>2009-04-08T18:52:55.941-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><title type='text'>mysql5主从备份</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;这两天在虚机(linux)上搭建了mysql5(imysam)的主从备份机制，廖作记录：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Master&lt;/span&gt;：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;new db ：2x_db,and new table: test, input some data;&lt;/li&gt;&lt;li&gt;mysqldump 2x_db to 2x_db_dump.sql,then transfer to slave machine;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;modify my.cnf:&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;log-bin  =  /var/lib/mysql/master.log&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;log-bin-index =  /var/lib/mysql/master.index.log&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;binlog-do-db = 2x_db&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;server-id = 1&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;pre&gt;   4. start mysql,and create replicate user:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%' IDENTIFIED BY 'replicator';&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; 5. flush privileges;&lt;br /&gt; 6.show master status,then record this info&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Slave&lt;/span&gt;:&lt;br /&gt; 1. modify my.cnf:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     server-id=2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     master-host=master machine's ip&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     master-user=replicator&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     master-password=replicator&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     master-log-file=master.000002 // from show master status: logfile&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     master-log-pos=98 // from show master status: logPos&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     master-connect-retry=60&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     replicate-do-db=2x_db&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2. start mysql,then new db: 2x_db&lt;br /&gt;3. load 2x_db.sql into 2x_db&lt;br /&gt;4. login in mysql,show slave status&lt;br /&gt;&lt;br /&gt;Test:&lt;br /&gt;1. login in master's mysql,insert one record;&lt;br /&gt;2. then login in slave's mysql,select this table;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-1267132501497813508?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/1267132501497813508/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/04/mysql5.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/1267132501497813508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/1267132501497813508'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/04/mysql5.html' title='mysql5主从备份'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-3443311875415192554</id><published>2009-03-27T02:40:00.000-07:00</published><updated>2009-04-08T18:53:41.133-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='vmware'/><title type='text'>VMWare Server 2.0 install Debian 5 Linux</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;   vmware server 2.0提供了web管理界面来管理虚机，令人印象深刻。在Debian5上安装vmware server 2.0非常的简单，只要注意几个地方即可：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;使用root用户；&lt;br /&gt;&lt;/li&gt;&lt;li&gt;apt-get update，并且install linux-headers-`uname -r`，与内容相同的版本；&lt;/li&gt;&lt;li&gt;debian默认安装了perl，你只需要记住安装gcc 4.1.3，因为vmware需要这个版本的gcc；如果机器上已经有，请ln -s gcc gcc-4.1.3；&lt;/li&gt;&lt;li&gt;执行./installVmware.pl，即可进行安装，安装过程中需要填的内容，一般缺省即可；&lt;/li&gt;&lt;li&gt;vmware server 2.0需要设置一个datastore path，即存储虚机文件的地方，在web管理界面中，引导iso文件时，只能从该目录中读取；&lt;/li&gt;&lt;li&gt;安装完成后，通过https://127.0.0.1:8333/来访问，登录用户名使用系统的root帐号。&lt;/li&gt;&lt;/ol&gt;   web管理界面还是比较简洁美观的，vmware的配置、启动都可以实现。但是我没有发现如何安装vmware tool，这是鼠标操作起来就不太方便了，而且好像无法全屏。&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img src="http://img.zemanta.com/pixy.gif?x-id=21477fae-c0bd-8751-90fc-dab219582994" class="zemanta-pixie-img" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-3443311875415192554?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/3443311875415192554/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/03/vmware-server-20-install-debian-5-linux.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/3443311875415192554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/3443311875415192554'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/03/vmware-server-20-install-debian-5-linux.html' title='VMWare Server 2.0 install Debian 5 Linux'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-6425313896904398864</id><published>2009-03-25T20:29:00.000-07:00</published><updated>2009-03-25T20:37:38.383-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mule'/><category scheme='http://www.blogger.com/atom/ns#' term='ESB'/><category scheme='http://www.blogger.com/atom/ns#' term='Smooks'/><title type='text'>Mule IDE 2.0的几个问题</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;    目前，Mule IDE 2.0发布了。试用了一下，总体上来说非常的好使，配置完MULE_HOME，可以创建mule project和mule config file，然后可以在IDE中直接运行起来。不过，也发现了IDE上的几个问题。&lt;br/&gt;&lt;br/&gt;    这几天，在了解Mule与Smooks集成方面的东西，在MuleForge上有一个项目：Smooks for Mule，现在已经可以支持Mule 2.1.X了。测试了一下，还不支持最新发布的Mule 2.2版本。&lt;br/&gt;&lt;br/&gt;    在Mule 2.1.2 上跑 Smooks for Mule 2.1.x的例子非常的顺畅，但是当使用Mule IDE 2.0来运行同样的例子，就报如下异常：&lt;br/&gt;&lt;br/&gt;&lt;i&gt;ERROR 2009-03-26 11:21:03,312 [main] org.mule.config.spring.SpringXmlConfigurationBuilder: Configuration with "org.mule.config.spring.SpringXmlConfigurationBuilder" failed.&lt;br/&gt;&lt;br/&gt;org.mule.api.lifecycle.InitialisationException: Initialisation Failure: Error creating bean with name 'BasicService': Cannot create inner bean '(inner bean)' of type [org.mule.routing.outbound.DefaultOutboundRouterCollection] while setting bean property 'outboundRouter'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Cannot create inner bean '(inner bean)' of type [org.milyn.smooks.mule.Router] while setting bean property 'routers' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Invocation of init method failed; nested exception is org.mule.api.lifecycle.InitialisationException: IOException while trying to get smooks instance: &lt;/i&gt;&lt;br/&gt;&lt;br/&gt;   没有仔细的查，初步怀疑这是Mule IDE的bug。&lt;br/&gt;&lt;br/&gt;   还有一个问题是，Mule IDE指定MULE_HOME以后，它只找到lib目录下的mule和opt目录中jar，而不去寻找user目录下的jar文件。这样，要运行一些其他的应用，必须要把相应的jar文件copy到opt目录中。&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=b610f5f2-9a84-4daa-a0f5-b34936ebad15' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-6425313896904398864?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/6425313896904398864/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/03/mule-ide-20.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/6425313896904398864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/6425313896904398864'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/03/mule-ide-20.html' title='Mule IDE 2.0的几个问题'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-1230047276142679513</id><published>2009-03-22T20:04:00.000-07:00</published><updated>2009-04-08T18:49:14.804-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>HTML Select's scrollbars</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;   IE6浏览器中，select中默认是没有horizontal scrollbar，如果option中的文字太长，就没法完整显示；而且option的title属性也不支持。&lt;br /&gt;&lt;br /&gt;   要实现horizontal scrollbar的效果，可以用DIV来进行模拟。要注意的是select不要设置width。代码示例如下：&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;lt;div &lt;span style="font-weight: bold;"&gt;style="overflow-x:scroll; width:100px; overflow: -moz-scrollbars-horizontal;"&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;select  size="3"&amp;gt; &lt;br /&gt;              &amp;lt;option&amp;gt;horizontal scrollbar test example 1&amp;lt;/option&amp;gt; &lt;br /&gt;              &amp;lt;option&amp;gt;horizontal scrollbar test example 10&amp;lt;/option&amp;gt; &lt;br /&gt;              &amp;lt;option&amp;gt;horizontal scrollbar test example 100&amp;lt;/option&amp;gt; &lt;br /&gt;              &amp;lt;option&amp;gt;horizontal scrollbar test example 1000&amp;lt;/option&amp;gt; &lt;br /&gt;              &amp;lt;option&amp;gt;horizontal scrollbar test example 10000&amp;lt;/option&amp;gt; &lt;br /&gt;         &amp;lt;select&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img src="http://img.zemanta.com/pixy.gif?x-id=4801d3e8-e230-4585-9b50-ec4e5262ce2f" class="zemanta-pixie-img" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-1230047276142679513?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/1230047276142679513/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/03/html-select-scrollbars.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/1230047276142679513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/1230047276142679513'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/03/html-select-scrollbars.html' title='HTML Select&amp;#39;s scrollbars'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-1933541769700371076</id><published>2009-03-20T01:20:00.000-07:00</published><updated>2009-03-20T01:20:00.931-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tool'/><title type='text'>一些常用的小工具</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;列一下自己常用的工具包：&lt;br/&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;FScapture&lt;/b&gt;：抓图工具，比较亮点的是抓完图后，还可对图片做编辑，比如加一个矩形框等；&lt;/li&gt;&lt;li&gt;&lt;b&gt;AdsClrPicker&lt;/b&gt;：取色工具，可以取屏幕上任何地方的色彩；&lt;/li&gt;&lt;li&gt;&lt;b&gt;IconWorkshop&lt;/b&gt;：图标编辑工具；&lt;br/&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;FeiQ&lt;/b&gt;：即时通讯工具，局域网中的QQ；&lt;/li&gt;&lt;li&gt;&lt;b&gt;Filezilla&lt;/b&gt;：FTP工具，包括客户端和服务器；&lt;/li&gt;&lt;li&gt;&lt;b&gt;7z&lt;/b&gt;：压缩工具；&lt;/li&gt;&lt;li&gt;&lt;b&gt;RocketDock&lt;/b&gt;：dock条工具，类似于Mac上的Dock；&lt;/li&gt;&lt;li&gt;&lt;b&gt;TortoiseSVN&lt;/b&gt;：Subversion客户端；&lt;/li&gt;&lt;li&gt;&lt;b&gt;Google Pinyin&lt;/b&gt;：Google拼音输入法；&lt;/li&gt;&lt;li&gt;&lt;b&gt;Evernote&lt;/b&gt;：日常记事工具；&lt;/li&gt;&lt;li&gt;&lt;b&gt;HttpWatch&lt;/b&gt;：Http查看工具；&lt;/li&gt;&lt;li&gt;&lt;b&gt;FileFox&lt;/b&gt;：火狐浏览器，装上插件，功能无限;&lt;/li&gt;&lt;li&gt;&lt;b&gt;UltraEdit&lt;/b&gt;：文本编辑器&lt;/li&gt;&lt;/ol&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=37469f77-a26e-42aa-b3f8-340d469e5809' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-1933541769700371076?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/1933541769700371076/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/03/blog-post.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/1933541769700371076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/1933541769700371076'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/03/blog-post.html' title='一些常用的小工具'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-5911917661728125679</id><published>2009-03-12T02:24:00.000-07:00</published><updated>2009-04-08T18:55:13.853-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>XOM利器：Simple-Xml</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;    一直以来，对XML文件的操作都让我恐惧。所以，一般在项目中，我都不主动引入XML配置文件。有一个项目里，我还用yaml来代替了xml作为配置文件。可以，yml文件对空格、位置排列限制比较严格，用起来不是很好。&lt;br /&gt;&lt;br /&gt;    这几天，找到了一个新的XOM工具：&lt;a href="http://simple.sourceforge.net/"&gt;Simple-Xml&lt;/a&gt;。可以通过annotation将xml直接转换为pojo，十分的方便。将一些使用心得整理一下：&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;安装设置简单，只需要3个jar包：simple-xml-2.0.3.jar，stax-1.2.0.jar和stax-api-1.0.1.jar；&lt;/li&gt;&lt;li&gt;Annotation使用简单，最常用的有：@Root,  @Attribute, @Text, @Element, @ElementList, @ElementMap等；&lt;/li&gt;&lt;li&gt;可以设置annotation的name属性来匹配xml文件中元素名词，譬如：@Element(name="simple-xml")；&lt;/li&gt;&lt;li&gt;可以使用inline=true来内联数组、列表和Map等；&lt;/li&gt;&lt;li&gt;可以通过${var}来共享变量，但必须用@Commit提交后方可使用。譬如：&amp;lt;property name="host.name"&amp;gt;qdlake&amp;lt;/property&amp;gt; &amp;lt;host&amp;gt;${host.name}&amp;lt;/host&amp;gt;；&lt;/li&gt;&lt;li&gt;支持nested object；&lt;/li&gt;&lt;li&gt;如果有对象继承，根对象上不要使用@Root注解；&lt;/li&gt;&lt;li&gt;@ElementMap注解使用时，会将此元素下的所有属性放入到map中，非常的方便。但切记，需要指定entry和key，并且value必须放置在&amp;lt;property key="k1"&amp;gt;&lt;strike&gt;VALUE&lt;/strike&gt;&amp;lt;/property&amp;gt;两标签之中位置，不能使用value="v1"的方式；&lt;/li&gt;&lt;li&gt;不加annotation的字段将不会被处理；&lt;/li&gt;&lt;li&gt;支持callback，譬如：@Validate，@Commit等。&lt;/li&gt;&lt;/ol&gt;先写这么多，以后用到其他功能时再补充。&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img src="http://img.zemanta.com/pixy.gif?x-id=c2531c43-1773-4a8a-aa2b-1a517dce499a" class="zemanta-pixie-img" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-5911917661728125679?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/5911917661728125679/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/03/xomsimple-xml.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/5911917661728125679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/5911917661728125679'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/03/xomsimple-xml.html' title='XOM利器：Simple-Xml'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-1987456748266276903</id><published>2009-03-10T06:09:00.000-07:00</published><updated>2009-04-08T18:54:54.010-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><title type='text'>Hooking into Equinox: The Hookable Adaptor</title><content type='html'>前几天正在摆弄equinox的插件体系，模仿equinox的插件，做了相应的简化。今天，看到了EclipseCon 2007上的一篇slide：【Equinox Framework: How to get Hooked】。自己的很多思路与这个有些相像。感觉是个不错的东东，以后有时间再好好看看。&lt;br /&gt;&lt;br /&gt;  需要了解相关内容，可以参考：&lt;a href="http://wiki.eclipse.org/Adaptor_Hooks"&gt;Adaptor Hooks&lt;/a&gt;。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-1987456748266276903?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/1987456748266276903/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/03/hooking-into-equinox-hookable-adaptor.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/1987456748266276903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/1987456748266276903'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/03/hooking-into-equinox-hookable-adaptor.html' title='Hooking into Equinox: The Hookable Adaptor'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-4156287988545079792</id><published>2009-03-06T01:47:00.000-08:00</published><updated>2009-04-08T18:51:16.459-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><title type='text'>Extension-Point和Extension</title><content type='html'>Eclipse的插件体系设计的非常精到，extension point和extension令人映像深刻。Extension-Point是指系统定义好的，想让别人来扩展的地方，有点类似于电脑主板上的各种插槽，可以插Cpu、内存条等。而Extension是指你根据提供的Extension-Point来进行的扩展实现，类似于你往主板上插上了不同Cpu、内存条。&lt;br /&gt;  在自己开发的插件中，可以自己灵活的定义Extension-Point，允许别人来进行扩展。譬如开发一个菜单的插件，然后提供扩展点，允许别人来往菜单上增加菜单项。&lt;br /&gt;  这几天，正在了解这方面的知识，Eclipse中的Extension-Point和Extension比较的复杂，自己想“山寨”一个简单一点的。不需要在写.exsd，而是只需要定义OSGI-INF/plugin/ext.xml，在ext.xml来定义extension-point、extension、param-def(name,type[string,class],optional)、param等元素，然后通过各元素的URI来进行绑定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-4156287988545079792?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/4156287988545079792/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/03/extension-pointextension.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/4156287988545079792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/4156287988545079792'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/03/extension-pointextension.html' title='Extension-Point和Extension'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-3030168016845833077</id><published>2009-03-05T01:27:00.000-08:00</published><updated>2009-03-05T01:38:01.535-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><title type='text'>Annotations for OSGi Declarative Services (A4DS)</title><content type='html'>在OSGi中，涉及到依赖注入的方法有：Declarative Services (DS)，Spring DM，iPOJO，Peaberry Guice等。iPOJO本人没有接触过，其它都略有了解。DS和DM都需要写component.xml；Peaberry虽然不需要xml文件，但是需要一些辅助代码，感觉都有些麻烦。&lt;br /&gt;&lt;br /&gt;今天，发现一个挺有意思的东西：&lt;a href="http://max-server.myftp.org/trac/pm/wiki/a4ds"&gt;Annotations for OSGi Declarative Services (A4DS)&lt;/a&gt; 。可以通过annotation来生产xml，比较方便。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-3030168016845833077?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/3030168016845833077/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/03/annotations-for-osgi-declarative.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/3030168016845833077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/3030168016845833077'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/03/annotations-for-osgi-declarative.html' title='Annotations for OSGi Declarative Services (A4DS)'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-4359721413754162141</id><published>2009-03-02T23:29:00.000-08:00</published><updated>2009-03-02T23:37:58.479-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><title type='text'>Embedding Equinox in Apusic 5.1</title><content type='html'>今天测试了一下，Equinox ServletBridge嵌入到Apusic中运行起来，在dos console界面中可输入OSGi的命令。我用的是（wicket + guice + hibernate） in OSGi的方式，访问的URL：http://localhost:6888/bridge/wicket/&lt;br /&gt;&lt;br /&gt;servletbridge的目录布局如下：&lt;br /&gt;WEB-INF/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/web.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/lib/servletbridge.jar&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/eclipse&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/configuration/config.ini&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/features&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/plugins&lt;br /&gt;只要将打好包的jar文件，放入到plugins目录中，并在config.ini中注明@start即可。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-4359721413754162141?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/4359721413754162141/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/03/equinox-servletbridgeapusic51.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/4359721413754162141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/4359721413754162141'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/03/equinox-servletbridgeapusic51.html' title='Embedding Equinox in Apusic 5.1'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-2827467428372779432</id><published>2009-03-02T00:05:00.000-08:00</published><updated>2009-03-02T00:21:05.675-08:00</updated><title type='text'>Hibernate-OSGi打包</title><content type='html'>把Hibernate打成符合OSGi规范的包，支持EJB3和annotation，则需要包含以下类包：&lt;br /&gt;antlr.jar&lt;br /&gt;asm.jar&lt;br /&gt;asm-attrs.jar&lt;br /&gt;cglib.jar&lt;br /&gt;dom4j.jar&lt;br /&gt;commons-collections.jar&lt;br /&gt;javassist.jar&lt;br /&gt;jta.jar&lt;br /&gt;log4j.jar&lt;br /&gt;slf4j-log4j12.jar&lt;br /&gt;slf4j-api.jar&lt;br /&gt;ejb3-persistence.jar&lt;br /&gt;hibernate-commons-annotations.jar&lt;br /&gt;hibernate-core.jar&lt;br /&gt;hibernate-annotations.jar&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-2827467428372779432?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/2827467428372779432/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/03/hibernate-osgi.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/2827467428372779432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/2827467428372779432'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/03/hibernate-osgi.html' title='Hibernate-OSGi打包'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2577232898547286851.post-3359780870401018018</id><published>2009-01-06T00:24:00.000-08:00</published><updated>2009-01-06T01:14:08.639-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><title type='text'>equinox 3.5启动参数</title><content type='html'>equinox 3.5 的启动参数配置如下：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;java -Dosgi.console -Dorg.osgi.service.http.port=9090 -jar org.eclipse.osgi_3.5.0.v20081201-1815.jar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;注：&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;-Dosgi.console：&lt;/span&gt;控制台&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;-Dorg.osgi.service.http.port：&lt;/span&gt;HTTP端口号&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;-Dosgi.configuration.area&lt;/span&gt;:config.ini文件所在目录&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2577232898547286851-3359780870401018018?l=qdlake.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qdlake.blogspot.com/feeds/3359780870401018018/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://qdlake.blogspot.com/2009/01/equinox-35.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/3359780870401018018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2577232898547286851/posts/default/3359780870401018018'/><link rel='alternate' type='text/html' href='http://qdlake.blogspot.com/2009/01/equinox-35.html' title='equinox 3.5启动参数'/><author><name>王释之</name><uri>http://www.blogger.com/profile/04548756849311271206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://3.bp.blogspot.com/_Qezq_4KA2Ek/Sc4odIBahWI/AAAAAAAAAEY/1SB9xoOeBRE/S220/2009-03-28_214234.jpg'/></author><thr:total>0</thr:total></entry></feed>
