<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Jeremy Thomerson</title>
	
	<link>http://www.jeremythomerson.com/blog</link>
	<description>Ramblings of a guy who loves technology.</description>
	<pubDate>Wed, 14 Oct 2009 03:09:49 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/JeremyThomerson" /><feedburner:info uri="jeremythomerson" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>More great reasons to go to ApacheCon US 2009</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/lPWXzR6BF7Y/</link>
		<comments>http://www.jeremythomerson.com/blog/2009/10/more-great-reasons-to-go-to-apachecon-us-2009/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 03:09:49 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[Wicket]]></category>

		<category><![CDATA[training]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=122</guid>
		<description><![CDATA[ApacheCon US 2009 is fast approaching.  And for all you Wicket lovers out there, or anybody interested in getting started with Wicket, you know that I will be presenting a one day training as well as an Introduction to Wicket session.  So if you haven&#8217;t done so already, go sign up!
More info on [...]]]></description>
			<content:encoded><![CDATA[<p>ApacheCon US 2009 is fast approaching.  And for all you Wicket lovers out there, or anybody interested in getting started with Wicket, you know that I will be presenting a one day training as well as an Introduction to Wicket session.  So if you haven&#8217;t done so already, go sign up!</p>
<p>More info on the Wicket training: <a href="http://www.jeremythomerson.com/blog/2009/07/wicket-training-at-apachecon-us-2009/">http://www.jeremythomerson.com/blog/2009/07/wicket-training-at-apachecon-us-2009/</a></p>
<p><strong><a href="http://guest.cvent.com/EVENTS/Info/Summary.aspx?e=440d29a5-1f93-4995-be43-1d34d6f25dd5">CLICK HERE TO REGISTER</a></strong></p>
<p>But what about more great reasons to register?  I&#8217;ve put together a list of the sessions that you might want to attend if you are interested in Wicket.  Of course, there are many great sessions, and you may (like me) have a hard time choosing.  You may be interested in the entire track on Lucene / Hadoop and the family.  Or in the business track.  But here are some that you may particularly like:<span id="more-122"></span></p>
<ul>
<li>Wednesday - 11:00am - <a href="http://www.us.apachecon.com/c/acus2009/sessions/318" target="_blank">Tomcat Community Overview</a></li>
<li>Wednesday - 1:30pm - <a href="http://www.us.apachecon.com/c/acus2009/sessions/278" target="_blank">An Introduction to Apache Velocity 1.6</a></li>
<li>Wednesday - 2:30pm - <a href="http://www.us.apachecon.com/c/acus2009/sessions/279" target="_blank">Introduction to Wicket</a></li>
<li>Wednesday - 4:00pm - <a href="http://www.us.apachecon.com/c/acus2009/sessions/319" target="_blank">Securing your Tomcat installation</a></li>
<li>Wednesday - 5:00pm - <a href="http://www.us.apachecon.com/c/acus2009/sessions/320" target="_blank">mod_jk / mod_proxy and others</a></li>
<li>Thursday - 9:00am - <a href="http://www.us.apachecon.com/c/acus2009/sessions/282" target="_blank">Content Driven Portals with Jetspeed and Jackrabbit</a></li>
</ul>
<ul>
<li>Thursday - 10:00am - It&#8217;s a toss-up between:
<ul>
<li><a href="http://www.us.apachecon.com/c/acus2009/sessions/283" target="_blank">JCR in Action - Content-based Applications with Jackrabbit</a></li>
<li><a href="http://www.us.apachecon.com/c/acus2009/sessions/461" target="_blank">Lucene Basics and New Features</a></li>
<li><a href="http://www.us.apachecon.com/c/acus2009/sessions/302" target="_blank">Hardening Enterprise Apache Installations Against Attacks</a></li>
</ul>
</li>
<li>Thursday - 2:00pm - <a href="http://www.us.apachecon.com/c/acus2009/sessions/305" target="_blank">Scalable Internet Architectures</a></li>
<li>Thursday - 4:30pm - <a href="http://www.us.apachecon.com/c/acus2009/sessions/330" target="_blank">Recent Developments in SSL and Browsers</a></li>
</ul>
<ul>
<li>Friday - 9:00am - <a href="http://www.us.apachecon.com/c/acus2009/sessions/336" target="_blank">Welcome to the Future! (httpd)</a></li>
<li>Friday - 10:00am - <a href="http://www.us.apachecon.com/c/acus2009/sessions/321" target="_blank">Deciphering mod_ssl: Using SSL with the Apache HTTP Server</a></li>
<li>Friday - 11:15am - <a href="http://www.us.apachecon.com/c/acus2009/sessions/467" target="_blank">Selling Open Source E-commerce and ERP</a></li>
<li>Friday - 2:00pm - <a href="http://www.us.apachecon.com/c/acus2009/sessions/335" target="_blank">Building Intelligent Search Applications with the Lucene Ecosystem</a></li>
<li>Friday - 3:00pm - <a href="http://www.us.apachecon.com/c/acus2009/sessions/462" target="_blank">Realtime Search</a></li>
</ul>
<p>For those who are more business-focused, here are a few alternative sessions that you may be interested in:</p>
<ul>
<li>Wednesday - 4:00pm - <a href="http://www.us.apachecon.com/c/acus2009/sessions/290" target="_blank">Open Source Business for Hackers</a></li>
<li>Wednesday - 5:00pm - <a href="http://www.us.apachecon.com/c/acus2009/sessions/291" target="_blank">Apache License as a Business Model - Challenges and Opportunities</a></li>
<li>Thursday - 9:00am - <a href="http://www.us.apachecon.com/c/acus2009/sessions/292" target="_blank">Making Sense of Open Source Licenses</a></li>
</ul>
<p>So, what are you waiting for?<br />
<strong><a href="http://guest.cvent.com/EVENTS/Info/Summary.aspx?e=440d29a5-1f93-4995-be43-1d34d6f25dd5">CLICK HERE TO REGISTER</a></strong></p>
<p>And don&#8217;t forget to register for your Wicket training!</p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/lPWXzR6BF7Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2009/10/more-great-reasons-to-go-to-apachecon-us-2009/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2009/10/more-great-reasons-to-go-to-apachecon-us-2009/</feedburner:origLink></item>
		<item>
		<title>Wicket Training at ApacheCon US 2009</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/OLnUfM0GJ74/</link>
		<comments>http://www.jeremythomerson.com/blog/2009/07/wicket-training-at-apachecon-us-2009/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 14:38:50 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<category><![CDATA[Wicket]]></category>

		<category><![CDATA[classes]]></category>

		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[training]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=115</guid>
		<description><![CDATA[I am very happy to announce that there will be a one day training course at the 2009 ApacheCon conference in Oakland, CA (USA).   Before I tell you more about it, consider the following &#8220;top ten&#8221; list:
Top Ten Reasons You Should Attend ApacheCon US 2009:
10: Hacking is encouraged at the Apache Hackathon two day event.
9: [...]]]></description>
			<content:encoded><![CDATA[<p>I am very happy to announce that there will be a one day training course at the 2009 ApacheCon conference in Oakland, CA (USA).   Before I tell you more about it, consider the following &#8220;top ten&#8221; list:</p>
<p><strong>Top Ten Reasons You Should Attend ApacheCon US 2009:</strong><br />
<strong>10: </strong>Hacking is encouraged at the Apache Hackathon two day event.<br />
<strong>9: </strong>Free beer! <a href="http://wiki.apache.org/apachecon/ApacheConUs2009Program">http://wiki.apache.org/apachecon/ApacheConUs2009Program</a><br />
<strong>8: </strong>Meet members of your favorite projects (i.e. me last year getting Martijn to sign my copy of Wicket in Action: <a href="http://www.jeremythomerson.com/blog/2008/11/18/wicket-in-action-book-signing/">see Martijn signing my book</a>)<br />
<strong>7: </strong>Free two day BarCamp<br />
<strong>6: </strong>Free meetups three nights of the week<br />
<strong>5: </strong>It&#8217;s always a good time to visit California: <a href="http://oaklandcvb.com/">http://oaklandcvb.com/</a><br />
<strong>4: </strong>Support the <strong>tenth anniversary</strong> of the Apache Software Foundation and the many other great projects that will be there.<br />
<strong>3: </strong>Did I mention <strong>FREE BEER</strong>?<br />
<strong>2: </strong>Two attendees in the class will receive <strong>FREE copies of Wicket in Action</strong><br />
<strong>1: WICKET TRAINING!</strong> (<a href="http://www.us.apachecon.com/c/acus2009/sessions/399">more info</a>)</p>
<p>More details will be coming soon, but if you are looking to get your feet wet with Wicket, you should certainly start making plans now to attend the 2009 US ApacheCon, and the Wicket training class that will be held.  <strong>Those who register early get discounts, too!</strong></p>
<p>The class will consist of fast-moving explanations of core design principles, Wicket components, and &#8220;The Wicket Way&#8221;, and each section will be followed by a coding practice where you can put into use what you just learned.  We will focus on laying a foundation - how to use Wicket, create pages, organize your application, and create a Wicket application.</p>
<p>We will cover the following:<br />
- The fundamentals of Wicket<br />
- Handling data / working with objects and models<br />
- Standard components provided by framework<br />
- Containers / Application / Session / Page<br />
- Effective code reuse strategies</p>
<p>ApacheCon site: <a href="http://www.us.apachecon.com">http://www.us.apachecon.com</a></p>
<p>November 2-6, 2009 in Oakland, CA.  Classes will be held on Monday and Tuesday.  Wednesday through Friday will be for the conference sessions.  The Wicket class will be held on Tuesday.</p>
<p>Follow ApacheCon on Twitter: <a href="http://twitter.com/apachecon">http://twitter.com/apachecon</a></p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/OLnUfM0GJ74" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2009/07/wicket-training-at-apachecon-us-2009/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2009/07/wicket-training-at-apachecon-us-2009/</feedburner:origLink></item>
		<item>
		<title>I’m now a Wicket core developer</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/C2JkB6qDeCM/</link>
		<comments>http://www.jeremythomerson.com/blog/2009/03/im-now-a-wicket-core-developer/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 04:51:58 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[Wicket]]></category>

		<category><![CDATA[Favorites]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=111</guid>
		<description><![CDATA[My intention is not to blow my own horn, but I was so excited to have been asked to join the Wicket development team (link) that I knew it was time to dust off the old blog and start trying to write some articles again.  And no more than an hour after it was announced, [...]]]></description>
			<content:encoded><![CDATA[<p>My intention is not to blow my own horn, but I was so excited to have been asked to join the Wicket development team (<a href="http://www.nabble.com/Welcome-Jeremy-Thomerson-as-a-core-team-member-td22380019.html" target="_blank">link</a>) that I knew it was time to dust off the old blog and start trying to write some articles again.  And no more than an hour after it was announced, I was asked about when 1.5 would be released! (a well-meaning joke).  I have a lot of respect for all of the Wicket developers who have brought the great framework this far, and I hope that I will do well in assisting to carry the torch further.</p>
<p>Thank you to everyone who has contributed countless hours to making Wicket a great product!  Now it&#8217;s time to roll up my sleeves and get to work!</p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/C2JkB6qDeCM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2009/03/im-now-a-wicket-core-developer/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2009/03/im-now-a-wicket-core-developer/</feedburner:origLink></item>
		<item>
		<title>Wicket Stuff Reorganization</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/c5YfXZtCnmA/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/12/wicket-stuff-reorganization/#comments</comments>
		<pubDate>Mon, 01 Dec 2008 20:05:39 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[Wicket]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=108</guid>
		<description><![CDATA[So last week and this weekend I was swamped spending pretty much every night trying to get the Wicket Stuff project organized.  When I started, the trunk of Wicket Stuff had over 85 folders (subprojects) in it.  It was a mess.  Tons of these have been abandoned over time, with no work done since the 1.3 [...]]]></description>
			<content:encoded><![CDATA[<p>So last week and this weekend I was swamped spending pretty much every night trying to get the <a href="http://wicketstuff.org">Wicket Stuff</a> project organized.  When I started, the trunk of Wicket Stuff had over 85 folders (subprojects) in it.  It was a mess.  Tons of these have been abandoned over time, with no work done since the 1.3 release of Wicket was cut and trunk changed to 1.4 development.  The biggest problem I wanted to address (and the community overwhelmingly agreed) was that there was no standard release pattern for nearly any WicketStuff project. </p>
<p><strong>What we decided</strong></p>
<p>It was decided to create a &#8220;core&#8221; project for WicketStuff where other projects would reside under it (using Maven modules).  We would get this core building and releasing snapshots in the wicketstuff.org maven repo so that if you were developing against Wicket 1.4-SNAPSHOT, you could also do the same for the WicketStuff projects.  Then, whenever a numbered release of Wicket came out (i.e. 1.4-rc2 soon), we would cut a release with the same number for WicketStuff.  This should make it much easier to use the WicketStuff projects, many of which have never had any numbered releases (you always had to compile your own to use).</p>
<p><strong>What was accomplished</strong></p>
<p>Here&#8217;s a quick summary of what was accomplished:</p>
<ul>
<li>21 projects were moved into the core (including &#8220;examples&#8221; projects) (UPDATE: more are being migrated - this number has grown)</li>
<li>32 folders were removed from trunk into the attic</li>
<li>All that in over 73 commits!</li>
<li>This left us with around 30-something folders left in trunk - and hopefully most of those will move into the core project.</li>
</ul>
<p>Here&#8217;s a status page that I&#8217;ll be updating as more progress is made:</p>
<p><a href="http://wicketstuff.org/confluence/display/STUFFWIKI/WicketStuff+Reorg+-+Status+and+List+of+Changes">http://wicketstuff.org/confluence/display/STUFFWIKI/WicketStuff+Reorg+-+Status+and+List+of+Changes</a></p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/c5YfXZtCnmA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/12/wicket-stuff-reorganization/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/12/wicket-stuff-reorganization/</feedburner:origLink></item>
		<item>
		<title>Wicket in Action Book Signing</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/RyKZzDO_p7Q/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/wicket-in-action-book-signing/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 17:10:18 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<category><![CDATA[Wicket]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=103</guid>
		<description><![CDATA[


Martijn signs my book!

Yes, it&#8217;s dumb, but I took advantage of ApacheCon 2008 by having Martijn Dashorst sign my personal copy of Wicket in Action.  Fortunately Bruno Borges was on-hand to document the momentous occasion!
Now I just need to meet Eelco&#8230;&#8230;
]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<dl id="attachment_104" class="wp-caption alignright" style="width: 160px;">
<dt class="wp-caption-dt"><a href="http://www.jeremythomerson.com/blog/wp-content/uploads/2008/11/wicket-in-action-book-signing.jpg"><img class="size-thumbnail wp-image-104" title="wicket in action book signing" src="http://www.jeremythomerson.com/blog/wp-content/uploads/2008/11/wicket-in-action-book-signing-150x150.jpg" alt="Martijn signs my book!" width="150" height="150" /></a></dt>
<dd class="wp-caption-dd">Martijn signs my book!</dd>
</dl>
<p>Yes, it&#8217;s dumb, but I took advantage of ApacheCon 2008 by having Martijn Dashorst sign my personal copy of Wicket in Action.  Fortunately Bruno Borges was on-hand to document the momentous occasion!</p></div>
<div class="mceTemp">Now I just need to meet Eelco&#8230;&#8230;</div>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/RyKZzDO_p7Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/wicket-in-action-book-signing/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/wicket-in-action-book-signing/</feedburner:origLink></item>
		<item>
		<title>Wicket QuickStart Tutorial</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/JCnOBETCpT0/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/wicket-quickstart-tutorial/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 01:26:56 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[Wicket]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=99</guid>
		<description><![CDATA[So, you posted something to the Wicket mailing list saying that you thought you found a bug or you had a problem and were told to &#8220;create a quickstart&#8221; duplicating the problem.  And then you said &#8220;how&#8221;?  There are two ways and each will be described here:

Wicket QuickStart - The Maven Way
If you already have [...]]]></description>
			<content:encoded><![CDATA[<p>So, you posted something to the Wicket mailing list saying that you thought you found a bug or you had a problem and were told to &#8220;create a quickstart&#8221; duplicating the problem.  And then you said &#8220;how&#8221;?  There are two ways and each will be described here:</p>
<p><span id="more-99"></span></p>
<h3>Wicket QuickStart - The Maven Way</h3>
<p>If you already have Maven running on your machine, I recommend using this method.  It is very simple, especially if you need to create more than one quickstart or if you hate downloading jars from all over the internet yourself.</p>
<ol>
<li>Enter the following command to create the archetype of a quickstart (a complete project, ready to run):
<ol>
<li>mvn archetype:create -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -DarchetypeVersion=1.4-SNAPSHOT -DgroupId=com.example -DartifactId=test -DremoteRepositories=http://wicketstuff.org/maven/repository/</li>
<li>For more about creating and using this quickstart, you can see: <a href="http://wicket.apache.org/quickstart.html">http://wicket.apache.org/quickstart.html</a></li>
</ol>
</li>
<li>Change directory into the project directory that was just created for you (i.e. &#8220;cd test&#8221;)</li>
<li>Now to get the project ready for your IDE of choice, you can also use Maven.  Here is an example of how to do so with Eclipse:
<ol>
<li>mvn eclipse:eclipse</li>
<li>Note that your workspace will have to have the classpath variable M2_REPO set to point to the directory where your local Maven repository exists.  You can see this page for how to do that with Eclipse: <a href="http://maven.apache.org/plugins/maven-eclipse-plugin/usage.html">http://maven.apache.org/plugins/maven-eclipse-plugin/usage.html</a></li>
</ol>
</li>
</ol>
<p>The quickstart is now created and ready for you to import into your IDE.  After you&#8217;ve imported it into your IDE, now comes the &#8220;duplicate the problem&#8221; part.  Try to create pages or components that reproduce the problem you were trying to report.  You can run the Start.java class from your IDE and go to <a href="http://localhost:8080/">http://localhost:8080/</a> to see your test application.</p>
<p><strong>Cleaning up before you submit the quickstart</strong></p>
<p>Once you have reproduced the desired behavior in your quickstart, it would be best to make it as small as possible before submitting.  The best way to do this is to run the &#8220;mvn clean&#8221; command from the project directory.  Then zip the whole directory up and submit the zip file.  (The mvn clean command removes all of the compiled classes and generated artifacts, generally in your &#8220;target&#8221; directory, leaving only the actual source.)</p>
<h3>Wicket QuickStart - The Zip File Way</h3>
<p>If you don&#8217;t have Maven installed, use these steps:</p>
<ol>
<li>Checkout the wicket-quickstart project by running this command:
<ol>
<li>svn co <a href="http://svn.apache.org/repos/asf/wicket/trunk/wicket-quickstart">http://svn.apache.org/repos/asf/wicket/trunk/wicket-quickstart</a></li>
</ol>
</li>
<li>Import or add that folder to your favorite IDE as a new project.</li>
<li>You&#8217;ll need to add the following jars to your build path:
<ol>
<li>wicket.jar (version of your choice)</li>
<li>slf4j (I used 1.5.0)</li>
<li>Some slf4j implementation (I used log4j which meant I also needed to add log4j to my build path)</li>
<li>junit (I used 4.4)</li>
<li>jetty and jetty-util (I used 6.1.11)</li>
<li>servlet-api (I used 2.4)</li>
</ol>
</li>
</ol>
<p>Now, you&#8217;ll need to do the same as above: add your classes to reproduce the problem, run Start.java and view <a href="http://localhost:8080/quickstart">http://localhost:8080/quickstart</a> to test it.  Once again, you&#8217;ll want to remove your &#8220;target&#8221; folder (or &#8220;bin&#8221;, etc) with all the compiled classes before submitting it.</p>
<p>If you choose this method, I&#8217;ve tried to assist by building this basic wicket quickstart zip file.  You should be able to download it (here: <a href="http://www.jeremythomerson.com/blog/wp-content/uploads/2008/11/wicket-quickstart.zip">wicket-quickstart</a>) and add it to Eclipse and just run with it.  I hope it works for you.  Of course, I provide no warranty for it, written or implied.</p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/JCnOBETCpT0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/wicket-quickstart-tutorial/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/wicket-quickstart-tutorial/</feedburner:origLink></item>
		<item>
		<title>Meet the Wicket Community - Little ol’ Me!</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/3895jrvihpk/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/meet-jeremy-thomerson-the-wicket-community/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 22:56:57 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<category><![CDATA[Wicket]]></category>

		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=96</guid>
		<description><![CDATA[After a great week at ApacheCon last week, it was an extra privilege to spend the time with Martijn Dashorst and Bruno Borges.  An added privilege was the opportunity to complete my interview with Martijn in person at ApacheCon.
To read more about me and my Wicket experiences, check out his interview with me at: http://wicketinaction.com/2008/11/meet-the-wicket-community-jeremy-thomerson/
]]></description>
			<content:encoded><![CDATA[<p>After a great week at ApacheCon last week, it was an extra privilege to spend the time with Martijn Dashorst and Bruno Borges.  An added privilege was the opportunity to complete my interview with Martijn in person at ApacheCon.</p>
<p>To read more about me and my Wicket experiences, check out his interview with me at: <a href="http://wicketinaction.com/2008/11/meet-the-wicket-community-jeremy-thomerson/">http://wicketinaction.com/2008/11/meet-the-wicket-community-jeremy-thomerson/</a></p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/3895jrvihpk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/meet-jeremy-thomerson-the-wicket-community/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/meet-jeremy-thomerson-the-wicket-community/</feedburner:origLink></item>
		<item>
		<title>ApacheCon - Java Monitoring and Troubleshooting Tools in Action</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/wKf1KxGSmD0/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/apachecon-java-monitoring-and-troubleshooting-tools-in-action/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 16:59:22 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<category><![CDATA[Favorites]]></category>

		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=90</guid>
		<description><![CDATA[Presented by Bill Au, of the Platform Infrastructure group at CNET
Bill is going to help us learn about how to troubleshoot and monitor java apps, thread and heap dumps, hung or slow apps, OutOfMemoryErrors, and JVM crashes.  All of the tools he is going to show us are free tools - open source or free for [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>Presented by </em></strong><a title="Bill Au" href="http://us.apachecon.com/c/acus2008/speakers/43"><strong><em>Bill Au</em></strong></a><strong><em>, of the Platform Infrastructure group at CNET</em></strong></p>
<p>Bill is going to help us learn about how to troubleshoot and monitor java apps, thread and heap dumps, hung or slow apps, OutOfMemoryErrors, and JVM crashes.  All of the tools he is going to show us are free tools - open source or free for download.</p>
<p>NOTE: This was a very interesting session.  One of the things I was impressed with was his demonstrations of some tools that I have not seen.  There was the HP JMeter tool, an open source tool called Samurai, and a perl script that he wrote.  All of them look very helpful, and I want to try them all out (not that I have every written any apps that ever have performance issues - but I&#8217;m sure I can help someone else look at theirs!)<br />
<span id="more-90"></span><br />
<strong><span style="text-decoration: underline;">Monitoring</span></strong></p>
<p>Within JDK 5 (Sun&#8217;s), there is a java.lang.management package that has quite a few MX beans (i.e. MemoryMXBean, RuntimeMXBean).  These beans will allow you to get all of the information you might need to monitor the JVM.  You can see sample code for how to use them in: $JAVA_HOME/demo/management.</p>
<p><strong><span style="text-decoration: underline;">Management tools</span></strong></p>
<ul>
<li>jinfo - for getting rutntime info</li>
<li>jmap - for getting heap info and taking heap dump</li>
<li>jstack - for thread dumps</li>
</ul>
<p>The tools above can be run against a running JVM or a core dump file if the JVM crashed.</p>
<p><span style="text-decoration: underline;">jstat</span> - can be run against a running instance from a command line to get monitoring information.<br />
<span style="text-decoration: underline;">jconsole</span> - a GUI for those not comfortable with the console - must open JMX port on running JVM (in JDK 6 there is an attach-on-demand functionality). jconsole also support plugins. There is an example in $JAVA_HOME/demo/management/JTop that is a very useful plugin.<br />
<span style="text-decoration: underline;">garbage collection</span> enable this because it is handy: -Xloggc:. It will give you the timestamp of GC events and size before and after.</p>
<p><strong><span style="text-decoration: underline;">Thread and Heap Dumps</span></strong></p>
<ul>
<li>kill -3 (or kill &#8211;SIGQUIT) will give you a thread dump</li>
<li>ThreadMXBean or jstack or jconsole can also give you thread dumps.</li>
</ul>
<p>Bill recommends taking one, and then after five seconds, take another (do this several times).  Once you have several, you can compare where threads are to see which ones are locking.</p>
<p>If you turn this option (-XX:+HeapDumpOnOutOfMemoryError) on, then if you get an OOM, the memory will be logged so that you can debug where the memory was used at the time of the crash.  jmap and jconsole also allow you to take heap dumps.  hprof can also give you information for the heap, but it was significant overhead - so you don&#8217;t want to use it in production.</p>
<p><strong><span style="text-decoration: underline;">Hung or Slow App - Debugging</span></strong></p>
<ol>
<li>Look in <span style="text-decoration: underline;">garbage collection</span> logs - how long is the application pausing for garbage collection (five seconds is a long time).  Look for how much overall time that the JVM is spending garbage collecting rather than running your code?  You can tune this by modifying the heap size - of course, a larger heap takes a longer time to garbage collect.  Making one change at a time obviously gives you more of an opportunity to see what actual worked.</li>
<li><span style="text-decoration: underline;">HPjmeter.jar</span> - a free tool from HP (this is not Apache JMeter).  This is a tool for monitoring HP&#8217;s JVM, but it can also analyze garbage collection logs from most JVMs.  It will give you a chart of how much time is spent in garbage collection, and how many GC events, as well as average duration, etc.</li>
<li>One comment was made that if you are using large heap sizes (8gb-16gb), you need to make sure to use the appropriate (larger) page size.  I&#8217;ll have to Google this to find out more.</li>
<li>Beware of over-optimizing - your app will change over time.  Bill suggests trying to find a good heap size, and perhaps using concurrent garbage collection rather than full garbage collection, even though this has higher overhead.</li>
<li><span style="text-decoration: underline;">Deadlock</span> - if you encounter a dead lock, you obviously want to take a thread dump (see above) to run the deadlock detector.</li>
<li><span style="text-decoration: underline;">Loop threads</span> - You may get certain threads in a long-running loop.  To find this, monitor your CPU times of threads, using ThreadMXBean or jconsole with jtop (see above for more details)</li>
<li><span style="text-decoration: underline;">Blocked threads</span> - there is an open source GUI tool called &#8220;samurai&#8221; that analyzes thread dumps for you.  It can also understand consequtive thread dumps and display the information in an easy-to-read format.</li>
<li>Bill also wrote a <span style="text-decoration: underline;">perl script</span> that gives you an overview of a thread dump.  Both of these tools are located in the same folder as his slides (link included at bottom of this post).  His perl script gives a very nice overview, including how many threads are locked, and where they are locked.  Running it against several thread dumps that are several seconds apart gives you a good look at what&#8217;s going on.</li>
<li><span style="text-decoration: underline;">Stuck threads</span> - you may not have deadlocks, but you can still get <em>stuck</em> threads.  Typical causes include network I/O without a timeout set.  You can use the thread dump techniques to analyze this the same as you would if you had deadlocked threads.</li>
</ol>
<p><strong><span style="text-decoration: underline;">OutOfMemoryError - heap</span></strong></p>
<p>Some common causes:</p>
<ul>
<li>Your heap may be too small, so you could increase the heap size (-Xms&lt;size&gt;)</li>
<li>Excessive use of finalizers (analyze with MemoryMXBean, jmap, jconsole)</li>
<li>look for logic error in array allocation code - allocating larger arrays than you need</li>
<li>Memory leak - take a heap dump (see above for helpful tools) and see if you are holding on to things that you didn&#8217;t think you were holding on to.</li>
<li><span style="text-decoration: underline;">jhat</span> - Java Heap Analysis Tool - this is a very helpful tool for analyzing a heap dump file that you have taken.  When you start it, you can browse <a href="http://localhost:7000">http://localhost:7000</a> and walk through the heap, seeing where everything is being referenced, and see where you&#8217;re holding on to objects that you shouldn&#8217;t be</li>
</ul>
<p><strong><span style="text-decoration: underline;">OutOfMemoryError - permgen</span></strong></p>
<p>Some common causes:</p>
<ul>
<li>If you hot-reload your webapp, your server uses a new classloader, and if somewhere in your code you accidentally held on to a classloader (or possibly class?) from the old classloader - those classes can&#8217;t be garbage collected, and you run out of perm gen space. </li>
<li>If you do have a leak like just described, look for threads that you started running in the background that may be holding on to old classes / classloaders.</li>
<li>You can use JHAT again - look for references to a class loader.  If you find what&#8217;s holding on to the classloader, you&#8217;ve found the leak.</li>
</ul>
<p><strong><span style="text-decoration: underline;">OutOfMemoryError - too many threads</span></strong></p>
<ul>
<li>You can run out of stack size if you have too many threads.  Each Java thread has a native thread and a stack.  You can either lower the maximum number of threads or decrease the maximum stack size (per thread) - but be careful - you may run into StackOverflowError</li>
</ul>
<p><strong><span style="text-decoration: underline;">OutOfMemoryError - native memory</span></strong></p>
<ul>
<li>This happens when your system actually runs out of memory, and you can&#8217;t allocate any more to the JVM.  Look for other processes that are using too much memory.</li>
<li>You may also have a leak in JNI or a native method.  The stack trace in the OOM will tell you what native thread caused this.</li>
<li>There have also been leaks in older JVM codes.  You will get an error log with the JVM crash.  Obviously the fix for this is to update to the latest JVM.  You can also look into hs_err_&lt;pid&gt;.log to see where it&#8217;s happening and possibly find a workaround.  Or you can check Sun&#8217;s bug database (<a href="http://bugs.sun.com/">http://bugs.sun.com/</a>) or post to Sun&#8217;s java forum and / or open a bug.  Bill says the Sun developers are very helpful.</li>
<li>One workaround he has had to use in the past was running the JVM in client mode rather than server mode (this only works in 32-bit systems - on 64-bit, it always runs in server mode, regardless of what you told it to do).</li>
</ul>
<p>You can download Bill&#8217;s slides here: <a href="http://people.apache.org/~billa/apacheconus2008/">http://people.apache.org/~billa/apacheconus2008/</a></p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/wKf1KxGSmD0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/apachecon-java-monitoring-and-troubleshooting-tools-in-action/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/apachecon-java-monitoring-and-troubleshooting-tools-in-action/</feedburner:origLink></item>
		<item>
		<title>ApacheCon - Guidelines and Best Practices - System Architecture of Web Applications</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/iYmCFTnsX68/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/apachecon-guidelines-and-best-practices-system-architecture-of-web-applications/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 00:02:48 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=78</guid>
		<description><![CDATA[Presented by Ravi Saraswathiamma, architect with AOL / Time-Warner
When setting up an application, you have to identify hardware / software / networking / infrastructure architecture.  How do you do this?  The first step is of course gathering the requirements - what is required?  What kind of application is it?  Do you need HTTPS, etc.  What are [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>Presented by Ravi Saraswathiamma, architect with AOL / Time-Warner</em></strong></p>
<p>When setting up an application, you have to identify hardware / software / networking / infrastructure architecture.  How do you do this?  The first step is of course gathering the requirements - what is required?  What kind of application is it?  Do you need HTTPS, etc.  What are the best practices?</p>
<p><span id="more-78"></span></p>
<p>Ravi&#8217;s team has done scalability tests with many of the possible applications out there.  The most performant combination they found was: Apache HTTPD / Tomcat / MySQL.  They don&#8217;t use EJB containers, and in 95% of their applications, they find that MySQL is better performing than commercial alternatives.</p>
<p>Most web applications can use a Layer 4 VIP (hardware load balancer) like NetScaler or Foundry, etc.  You can put a VIP in front of Apache, and also between Apache and Tomcat.  You can also just use a VIP in front of multiple Apache servers, and they point to multiple Tomcat servers.  Ravi goes through quite a few slides of various configurations that are possible.  I have attached them to this post so that you can download them in the future and review them (click here to download: <a href="http://www.jeremythomerson.com/blog/wp-content/uploads/2008/11/ravi_saraswathi_-_apacheconf_-_speaker_slides_ver01ppt.doc">Ravi Saraswathi - Slides</a>).</p>
<p>I recommend downloading the slides for the rest of the presentation.  It was hard to capture all of that information (mostly displayed as pictures) in the form of written notes.</p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/iYmCFTnsX68" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/apachecon-guidelines-and-best-practices-system-architecture-of-web-applications/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/apachecon-guidelines-and-best-practices-system-architecture-of-web-applications/</feedburner:origLink></item>
		<item>
		<title>ApacheCon - Securing Apache Tomcat for your Environment</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/9rf7UJ9HUU4/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/apachecon-securing-apache-tomcat-for-your-environment/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 23:22:19 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<category><![CDATA[Security]]></category>

		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=76</guid>
		<description><![CDATA[Presented by Mark Thomas, committer on Tomcat for five years
There have generally been few Tomcat threats in the wild (at least that have been reported). One in July 2008 was reported that was hackers installing a webapp, always named fex*.war (* for something - anything).  It allowed hackers to get access to a shell on your [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>Presented by Mark Thomas, committer on Tomcat for five years</em></strong></p>
<p>There have generally been few Tomcat threats in the wild (at least that have been reported). One in July 2008 was reported that was hackers installing a webapp, always named fex*.war (* for something - anything).  It allowed hackers to get access to a shell on your server.  If you were running as root, game over.  The way this was being installed was through deployed servers with a Tomcat admin that had not been secured (blank or default passwords).  This is obviously a very poor idea.</p>
<p>How can you protect yourself against Tomcat security attacks?  Read more to find out.</p>
<p><span id="more-76"></span></p>
<p>The first rule of thumb is to make sure you have taken your standard precautions, such as OS hardening, firewalls, etc.  Next, uninstall all of the default Tomcat applications, which are much better used in development environments (docs / examples / host-manager / manager / default ROOT application).  You can run Tomcat in a security manager, but this is not a well tested method - you will need to completely test your application before deploying with it.</p>
<p>Tomcat is reasonably secure by default.  One of the first things you can do is get rid of most of server.xml, including comments, to make it easier to read, etc.  Using port=&#8221;-1&#8243; disables a &lt;Server &#8230; /&gt; tag.  The shutdown port should obviously use a strong password (long, and random).  Another tip, not necessarily related to security, but to availability is that the &lt;Listener &#8230; /&gt; tag is not well supported natively on Solaris. </p>
<p>Note on the following points - there was a lot to cover, and he was moving through it quickly.  These notes are a bit sparse, but are his recommended best practices.  He said to email the users list if you have further questions.</p>
<p><strong><span style="text-decoration: underline;">&lt;Connector .. /&gt;</span></strong></p>
<ul>
<li>Do you need HTTP <strong><span style="text-decoration: underline;">and</span></strong> AJP enabled?</li>
<li>address=&#8221;&#8230;&#8221; (defaults to all) - can you lock this down to a single IP?  i.e. your proxy?</li>
<li>allowTrace=&#8221;false&#8221; - you should leave this off</li>
<li>xpoweredBy=&#8221;false&#8221; / server=&#8221;Server: Apache-Coyote/1.1&#8243; - you can change these to try &#8220;security by obscurity&#8221; by confusing hackers as to what server you are actually running.</li>
</ul>
<p><strong><span style="text-decoration: underline;">AJP specific configuration:</span></strong></p>
<ul>
<li>request.secret=&#8221;&#8230;&#8221; should be strong if used / although AJP connections are not encrypted, so this secret will be in plain text between the two servers - so not necessarily all that useful</li>
<li>tomcatAuthentication=&#8221;true&#8221; (default) - if you want httpd (for example) to do your authentication, you can set this to &#8220;false&#8221;, and configure mod_jk appropriately so that your front-end proxy can handle authentication and pass the username back to Tomcat</li>
</ul>
<p><strong><span style="text-decoration: underline;">&lt;Host &#8230; /&gt;</span></strong></p>
<ul>
<li>autoDeploy=&#8221;false&#8221; - should change it to false (defaults true)</li>
<li>deployOnStartup=&#8221;true&#8221; - if you change this and autoDeploy to false, the only apps deployed will be those defined in server.xml - which can block accidental (or malicious) app deployment</li>
</ul>
<p><strong><span style="text-decoration: underline;">&lt;Context &#8230; /&gt;</span></strong></p>
<ul>
<li>crossContext should normally be false</li>
<li>allowLinking - should not be changed on case-insensitive operating systems</li>
</ul>
<p><strong><span style="text-decoration: underline;">&lt;Valve &#8230; /&gt;</span></strong></p>
<ul>
<li>Always configure an access log valve so that you can confirm when things happened and debug issues</li>
<li>Remove / archive old log files</li>
<li>Typically, do one per host</li>
<li>Use a remote address filter where possible</li>
<li>using allow for this is better than deny - only allow known addresses that should be able to access the application (don&#8217;t forget to escape the periods in the IP address - this attribute is a regex - use \.)</li>
</ul>
<p><strong><span style="text-decoration: underline;">&lt;Realm &#8230; /&gt;</span></strong></p>
<ul>
<li>Don&#8217;t use memory or UserDatabase or JDBC realm in production.  The first two require Tomcat restart, and the JDBC only uses a single JDBC connection.</li>
<li>You can use DataSource realm.</li>
<li>JNDI realm also uses a single connection</li>
<li>JAAS realm is not wisely used, and commonly has unreported bugs.  They do support it, but because it&#8217;s not widely used, there can be untested issues that arise.</li>
<li>There is no account lock-out implemented - which allows brute-force attacks to work after some time.  They are trying to get a fix for this into 6.0.19</li>
<li>New in 6.0.19 should be LockOut realm - it wraps around standard realms and provides a lock-out mechanism for multiple failed attempts for the same user.  With this, there will also be the ability to have multiple realms for authentication - if any match, you get access - so you could use, for example, a tomcat users file for admins and a JNDI realm for users.</li>
</ul>
<p><strong><span style="text-decoration: underline;">&lt;Manager &#8230; /&gt;</span></strong></p>
<ul>
<li> entropy=&#8221;this.toString()&#8221; can be deterministic, so you can use APR or randomClass=&#8221;java.util.Random&#8221; to define a true random entropy provider</li>
</ul>
<p><strong><span style="text-decoration: underline;">System properties</span></strong></p>
<ul>
<li>org.apache.catalina.connector.RECYCLE_FACADES=&#8221;false&#8221; - I didn&#8217;t catch all of the details on this, but he said the docs are right - look at them, even though they sound counter-intuitive</li>
<li>org.apache.catalina.CoyoteAdapter.ALLOW_BACKSLASH=&#8221;false&#8221; - recommended setting</li>
<li>org.apache.tomcat.util.buf.Udecoder.ALLOW_ENCODED_SLASH=&#8221;false&#8221; - recommended setting</li>
<li>org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=&#8221;false&#8221; - recommended setting - if you turn it on, make sure that everything put into your sendError calls is in ASCII - don&#8217;t allow user data to be put into sendError calls</li>
</ul>
<p><strong><span style="text-decoration: underline;">Other points:</span></strong></p>
<ul>
<li>Consider locking your database down to where the username that your web app uses to access the DB is only valid when it comes from the IP of your Tomcat server.</li>
<li>in the default servlet, you should use -readonly=&#8221;true&#8221; and -listings=&#8221;false&#8221;.  For one thing, directory listings are not that secure of an idea, and they are very slow on Tomcat.  If you absolutely need them, there is a patch that speeds them up - you&#8217;ll need to research and apply yourself.</li>
<li>He says &#8220;the invoker servlet is horrible, evil - don&#8217;t even use it, ever&#8221;. </li>
<li>Most monitoring tools also provide management functionality, which introduces risk that you&#8217;ll need to really think about.  LambdaProbe is a good monitoring app, but weirdly disappeared from the net a couple months ago.  He says to email the users list and someone there will provide it for you.</li>
<li>Hash out what you will do in the even of an attack ahead of time - don&#8217;t waste the time <em>after</em> you were attacked.</li>
<li>Using a cluster obviously reduces downtime - load balance it with httpd or similar.</li>
<li>Easing upgrades - you can separate your configuration files from your binary tomcat files by using CATALINA_BASE=/your/instance/config/path, and then start and stop which binary dist you want to use.</li>
</ul>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/9rf7UJ9HUU4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/apachecon-securing-apache-tomcat-for-your-environment/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/apachecon-securing-apache-tomcat-for-your-environment/</feedburner:origLink></item>
		<item>
		<title>Wicket - the power of nested models</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/b-vkuNYzojA/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/wicket-the-power-of-nested-models/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 20:52:59 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[Wicket]]></category>

		<category><![CDATA[HOWTO]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=61</guid>
		<description><![CDATA[Many times on the Wicket user list, we hear questions like &#8220;How do I return a different value when my model object is null?&#8221;, or &#8220;how do I make a label that says &#8216;none&#8217; when the model object is null?&#8221;, or &#8220;How do I make a Label that capitalizes all it&#8217;s text?&#8221;&#8230;. You get the [...]]]></description>
			<content:encoded><![CDATA[<p>Many times on the Wicket user list, we hear questions like &#8220;How do I return a different value when my model object is null?&#8221;, or &#8220;how do I make a label that says &#8216;none&#8217; when the model object is null?&#8221;, or &#8220;How do I make a Label that capitalizes all it&#8217;s text?&#8221;&#8230;. You get the idea. Typically, the gut reaction is to do something like override getConverter in the Label or onComponentTagBody and sort of abuse that facility to change what value the Label uses.  This works, but it isn&#8217;t <em>reusable</em>.  One of the greatest powers of Wicket is creating <em>reusable</em> pieces of code that can be used anywhere in your application.</p>
<p>A great way to create a reusable piece of code to cover this scenario is to use <em><span style="text-decoration: underline;">nested models</span></em>.  If you are familiar with Wicket, you know that <em>models</em>, or implementations of <em>IModel</em>, are basically data locators - an abstraction layer that the component uses to locate it&#8217;s data.  One power that this layer of abstraction gives you is that a component doesn&#8217;t need to know where it&#8217;s data came from.  And, one model can use another model and add on to it&#8217;s behavior by composition.  Let&#8217;s look at some code for a couple of examples.</p>
<p><span id="more-61"></span><strong>EXAMPLE ONE - You want to provide a different value for the case when your model object is null</strong></p>
<pre name="code" class="java">

public class DefaultWhenNullModel implements IModel&lt;T&gt; {

private static final long serialVersionUID = 1L;

private final IModel&lt;T&gt; mNestedModel;
private final T mDefaultValue;

public DefaultWhenNullModel(IModel&lt;T&gt; nestedModel, T defaultValue) {
mNestedModel = nestedModel;
mDefaultValue = defaultValue;
}

public T getObject() {
T val = mNestedModel.getObject();
return val == null ? mDefaultValue : val;
}

public void setObject(T object) {
mNestedModel.setObject(object);
}

public void detach() {
mNestedModel.detach();
}
}
</pre>
<p><strong>EXAMPLE TWO - You want to capitalize the text in a label</strong></p>
<pre name="code" class="java">

public class CapitalizedStringModel implements IModel&lt;String&gt; {

private static final long serialVersionUID = 1L;

private final IModel&lt;String&gt; mNestedModel;

public CapitalizedStringModel(IModel&lt;String&gt; nestedModel) {
mNestedModel = nestedModel;
}

public String getObject() {
String value = mNestedModel.getObject();
return value.toUpperCase();
}

public void setObject(T object) {
mNestedModel.setObject(object);
}

public void detach() {
mNestedModel.detach();
}
}
</pre>
<p><strong>Use of these:</strong></p>
<pre name="code" class="java">

new Label(&quot;mylabel&quot;, new CapitalizeStringModel(new PropertyModel&lt;String&gt;(user, &quot;username&quot;)));
</pre>
<p>As you can see, both examples are very similar.  You can take this further by creating a class like AbstractNestedModel&lt;T&gt; (implementing IModel&lt;T&gt;) that takes care of holding the nested model and detaching the nested model, etc.  Then you could create these classes with only a getObject() method being implemented per type of model.</p>
<p><strong>Why is this better?</strong></p>
<p>Quite simply, because you can use this anywhere.  For instance, if you did this in a Label instead, you could only use it where you use labels.  But since models are used by all components that want to display data, you can reuse this for any component, not just a label.  For instance, you could use this in MultiLineLabel or a TextField (you may want to add functionality to setObject for a TextField since it is read AND write).</p>
<p>Hopefully you found this brief tutorial helpful.  If you are looking for professional Wicket training or support, check out <a href="http://www.wickettraining.com">http://www.wickettraining.com</a>.</p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/b-vkuNYzojA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/wicket-the-power-of-nested-models/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/wicket-the-power-of-nested-models/</feedburner:origLink></item>
		<item>
		<title>Great new tutorial on Wicket</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/4assKgiaLEA/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/great-new-tutorial-on-wicket/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 18:28:54 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[Wicket]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=55</guid>
		<description><![CDATA[Someone sent this to the wicket users list today.  There is a great article on IBM DeveloperWorks detailing how to get started with Wicket.  It covers a wide array of topics, and if you are thinking of getting started with Wicket (and haven&#8217;t yet bought Wicket in Action!), you should definitely check out this article:
https://www.ibm.com/developerworks/library/wa-aj-wicket/
Since [...]]]></description>
			<content:encoded><![CDATA[<p>Someone sent this to the wicket users list today.  There is a great article on IBM DeveloperWorks detailing how to get started with Wicket.  It covers a wide array of topics, and if you are thinking of getting started with Wicket (and haven&#8217;t yet bought Wicket in Action!), you should definitely check out this article:</p>
<p><a href="https://www.ibm.com/developerworks/library/wa-aj-wicket/">https://www.ibm.com/developerworks/library/wa-aj-wicket/</a></p>
<p>Since I&#8217;m busy at ApacheCon, I have not been able to read the entire thing.  I did notice that he still shows setting up your web.xml with a servlet, although the latest versions of Wicket are all based on a servlet <em><span style="text-decoration: underline;">filter</span></em> instead.  But, that&#8217;s a small detail - the amount of work Kumarsun put into this tutorial is definitely noteworthy!</p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/4assKgiaLEA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/great-new-tutorial-on-wicket/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/great-new-tutorial-on-wicket/</feedburner:origLink></item>
		<item>
		<title>ApacheCon - ModSecurity</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/KgGlRaQpy88/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/apachecon-modsecurity/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 16:55:02 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<category><![CDATA[Apache HTTPd]]></category>

		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=53</guid>
		<description><![CDATA[Presented by Ivan Ristic, a web application firewall expert and author of ModSecurity and Apache Security
The problem: HTTP and browsers are designed for document exchange.  We have web applications built using a number of loosely integrated technologies.  These are created without a lot of thought about security.  Things now are better than ten years ago, [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>Presented by Ivan Ristic, a web application firewall expert and author of <a href="http://www.modsecurity.org/">ModSecurity</a> and <a href="http://www.apachesecurity.net/">Apache Security</a></em></strong></p>
<p><strong>The problem: </strong>HTTP and browsers are designed for document exchange.  We have web applications built using a number of loosely integrated technologies.  These are created without a lot of thought about security.  Things now are better than ten years ago, but there are also more threats now to defend against.</p>
<p><strong>The solution: </strong>(or at least one solution) - a web application firewall.</p>
<p>I apologize in advance - Ivan was moving very fast, and many of the notes are sparse as he was jumping from slide to slide.  I couldn&#8217;t keep up.</p>
<p><span id="more-53"></span><br />
<strong>Part 1 - What are Web Application Firewalls?</strong></p>
<p>Web Application Firewalls are a cost-effective technology that works, and can be deployed easily.  Ivan explains that network firewalls do not work for many kind of attacks. </p>
<p><strong>Part 2 - ModSecurity</strong></p>
<p>What is it?  It&#8217;s an open source web application firewall.  According to some independent researchers, it is the most widely deployed WAF on the internet.  Commerical support has been available through Thinking Stone since 2004 and now Breach Security.  It doesn&#8217;t do anything implicitly - it&#8217;s goal is to empower the user to do what you need, and to do this, it needs to be configured.  Fortunately, one of the goals of the project is to be very well documented.  There is a separate project called ModSecurity Core Rules.  This provides a general set of rules that can typically be used for any web application.</p>
<p>Two ways that it can be used:</p>
<ul>
<li>Embed it into your existing web servers</li>
<li>Deploy it as a network gateway, using Apache proxy - putting it in front of all of your web servers.</li>
</ul>
<p>There are five phases:</p>
<ol>
<li>REQUEST HEADERS - run this as early as possible</li>
<li>REQUEST BODY - it inspects the request body before the Apache server gets it and starts processing it.</li>
<li>RESPONSE HEADERS</li>
<li>RESPONSE BODY</li>
<li>LOGGING</li>
</ol>
<p>With ModSecurity, you can log the entire transaction, or parts of it.  There are two formats: <em>Serial - </em>a single file, convenient but limited.  <em>Concurrent </em>- file per transaction, scalable but not suitable for manual handling.  Then you can use Mlogc which can take what you logged and send it to a central logging server.  There is a free (as in beer - not open source) tool available to analyze logs - ModSecurity Community Console.</p>
<p><strong>ModSecurity Rule Language</strong> - it&#8217;s a simple, event-based programming language, which lives within the Apache configuration syntax.  With it, you can look at any part of the transaction, can trasnform it as needed, and you can combine rules to form complex logic.  This means that common tasks are easy, and complex tasks are possible.</p>
<p>Basic syntax: SecRule TARGETS OPERATOR [ACTIONS]</p>
<p>Example: SecRule ARGS|REQUEST_HEADERS &#8220;&lt;script id:1001,msg:&#8217;XSS Attack&#8217;, severity:ERROR,deny,status:404&#8243;</p>
<p>Chaining example (blocks admin to only login from single IP):<br />
SecRule ARGS:username &#8220;@streq admin&#8221; chain,deny<br />
SecRule REMOTE_ADDR <a href="mailto:!@streq 192.168.1.1">!@streq 192.168.1.1</a></p>
<p>There are 22 different <strong>operators </strong>in the latest version that allow things like string operations, numerical comparison, XML validation (i.e. XPath - get piece of XML from request, and inspect it), and other operators like allowing external script to check uploaded files for viruses.</p>
<p><strong>Actions - </strong>Ations tell ModSecurity what to do when a match occurs.  There are 42 actions in the latest version, such as blocking a transaction, influencing logging, set / change / delete variables, or storing anomalies in a persistent storage for later review.</p>
<p><strong>Part 3 - Real-life examples</strong></p>
<p>Here&#8217;s an example of what Ivan calls &#8220;<span style="text-decoration: underline;">virtual patching</span>&#8220;.  The example is that you discover a SQL injection vulnerability in a script, in the input variable statID.  You don&#8217;t have someone on staff who can fix it right now, or you are not legally allowed to change the source code.  You can enforce a rule that the variable is only a number, thereby eliminating the SQL injection vulnerability.</p>
<p>&lt;Location /apps/script.php&gt;<br />
   SecRule $ARGS &#8220;!@eq 1&#8243;<br />
   SecRule ARGS_NAMES &#8220;!^statid$&#8221;<br />
   SecRule ARGS:statID &#8220;!^\d{1,3}$&#8221;<br />
&lt;/Location&gt;</p>
<p>Here&#8217;s a common request - the ability to <span style="text-decoration: underline;">whitelist or blacklist certain IP addresses</span>.</p>
<p>SecRule REMOTE_ADDR &#8220;@streq 192.168.254.1&#8243; allow,phase:1,nolog<br />
SecRule REMOTE_ADDR &#8220;@beginsWith 192.168.254.&#8221; allow,phase:1,nolog</p>
<p><span style="text-decoration: underline;">Tracking activity per IP adddress:</span></p>
<p>First, initialise an IP address collection:<br />
SecAction phase:1,initcol:ip=%{REMOTE_ADDR}mnolog,pass</p>
<p>Then, increment score in rule match:<br />
SecRule ARGS prttern phase:2,pass,setvar:ip.score=+1</p>
<p>Deny IP address whose scores are too high:<br />
SecRule IP:score &#8220;@gt 20&#8243; phase:1,log,deny</p>
<p><strong>Other related projects and features:</strong></p>
<p>You can also use Lua scripting language and call Lua scripts from ModSecurity rules.  This functionality is currently experimental.</p>
<p>There is a new tool called ModProfiler that attempts to analyze logged application traffic and tries to identify anomalies and create rules for you.</p>
<p>REMO is a community project to build a graphical rule editor.</p>
<p>Open Proxy Honeypots - a network of open proxy sensors that have the goal of observing what the bad guys are doing and fine tune detection rules.</p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/KgGlRaQpy88" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/apachecon-modsecurity/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/apachecon-modsecurity/</feedburner:origLink></item>
		<item>
		<title>ApacheCon - Hardening / Securing Enterprise Apache Installations</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/0yWqg9tvkNM/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/apachecon-hardening-securing-enterprise-apache-installations/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 15:50:14 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<category><![CDATA[Apache HTTPd]]></category>

		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=50</guid>
		<description><![CDATA[ 
The Threat Model - Who gets attacked?  Everyone!  Just because you’re small doesn’t matter.  What are the goals of those trying to attack?  The chart on the right shows a breakdown based on data from the Web Hacking Incidents Database.
Maybe not so surprisingly was the next slide, that showed that most successful attacks (I think [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<div id="attachment_51" class="wp-caption alignright" style="width: 310px"><a href="http://www.jeremythomerson.com/blog/wp-content/uploads/2008/11/incident_type_2007_graph.png"><strong><img class="size-medium wp-image-51" title="2007 Web Hacking Incident Graph" src="http://www.jeremythomerson.com/blog/wp-content/uploads/2008/11/incident_type_2007_graph-300x178.png" alt="2007 Web Hacking Incident Graph" width="300" height="178" /></strong></a><p class="wp-caption-text">2007 Web Hacking Incident Graph</p></div>
<p><strong>The Threat Model </strong>- Who gets attacked?  Everyone!  Just because you’re small doesn’t matter.  What are the goals of those trying to attack?  The chart on the right shows a breakdown based on data from the Web Hacking Incidents Database.</p>
<p>Maybe not so surprisingly was the next slide, that showed that most successful attacks (I think somewhere near 50%) were because of someone getting the admins passwords through some means, perhaps social engineering or phishing.  Sysadmins should definitely be more careful with this sensitive data.</p>
<p>So, how do you protect against these attacks?  That’s what Sander will cover in this session.</p>
<p><span id="more-50"></span></p>
<div class="mceTemp"><strong>Apache HTTP Server is Secure</strong></div>
<div class="mceTemp">There have been very few security vulnerabilities reported against Apache, and no critical vulnerabilities in the 2.2.x branch.  If you do think that you have found a security vulnerability in Apache, you can email <a href="mailto:security@apache.org">security@apache.org</a> and they will respond swiftly <span style="text-decoration: underline;">if it is a real vulnerability</span>.  This includes them reporting it to CVE, a government defense contractor that tracks vulnerabilities.</div>
<div class="mceTemp"> </div>
<div class="mceTemp"><strong>Installing Apache and Securing it</strong></div>
<div class="mceTemp">If you build Apache yourself, the default is a pretty secure installation.  If you install it from a distribution (such as a Linux RPM, etc), there are a variety of configurations and differences between packages.  For instance, RedHat 4 Enterprise includes 2.0.46 at this time, even though this is very old.  Then they manage pulling in and backporting patches themselves.  In this case, they have a secure version because of their tediously updating patches, but you must understand the difference between getting the “latest” version of Apache, and getting the “latest” from your particular distributor.</div>
<div class="mceTemp"> </div>
<div class="mceTemp"><strong>Apache Configuration Tips</strong></div>
<ul>
<li>
<div class="mceTemp">Sander suggests writing your own configuration file</div>
</li>
<li>
<div class="mceTemp">Use formal testing against your configuration.  Write a test script that tries to get various URLs from your server and make sure that you get expected behavior.</div>
</li>
<li>
<div class="mceTemp">He also suggests avoiding &lt;IfModule&gt; in your configuration.  If you don’t need the module, don’t include it.  If you do need it, you should want the server startup to fail if the module didn’t load.  This makes a lot of sense!</div>
</li>
<li>
<div class="mceTemp">Disable unused modules</div>
</li>
</ul>
<p class="mceTemp"><strong>Operating System Hardening (mostly Linux)</strong></p>
<ul>
<li>
<div class="mceTemp">Keep the amount of writable directories as low as possible. </div>
</li>
<li>
<div class="mceTemp">Since every Linux distro has a /tmp directory that is writable, you could try mounting that with NoExec so that even if someone targets the /tmp directory and successfully gets a file stored there, it can not be executed.</div>
</li>
<li>
<div class="mceTemp">Chroot / FreeBSD / Solaris Zones - look into these on Linux</div>
</li>
<li>
<div class="mceTemp">Turn off services that you are not using.  He suggests that you probably don’t</div>
</li>
<li>
<div class="mceTemp">Remove unused packages, such as header files and other things you are not using.  Uninstall the compiler on the web server.</div>
</li>
<li>
<div class="mceTemp">He also suggests that you consider having your web servers boot from a network server.</div>
</li>
</ul>
<p class="mceTemp"><strong>Windows </strong>- Use what you know!!  Sander says that a poorly maintained Linux installation by someone who doesn’t know what they’re doing is worse than a well maintained Windows installation by someone who is only familiar with Windows.</p>
<p class="mceTemp"><strong>Network Infrastructure</strong></p>
<ul>
<li>
<div class="mceTemp">Block outgoing connections.  Web servers only serve incoming connections, and typically do not need to go out to the web.  This will make running updates more difficult, but blocks malicious scripts from downloading things to your server and blocks other zombie activities.</div>
</li>
<li>
<div class="mceTemp">Minimize incoming connections - port 80 and 443 will probably need to be open, but do any others really need to be open?</div>
</li>
<li>
<div class="mceTemp">Use a firewall</div>
</li>
<li>
<div class="mceTemp">You can also block it so that SSH requests are only accepted from another machine within your hosted environment - not accepting requests from outside machines.  This means you have to SSH to your middle machine, and then to your web server, possibly through your VPN. </div>
</li>
</ul>
<p class="mceTemp"><strong>ModSecurity</strong> - the next session will talk more about ModSecurity, but basically it is a Web Application Firewall that runs right inside Apache.  It can do rule-based security, and a whole host of other things to protect you.  Since it runs inside Apache, it can also see inside HTTPS packets - something a hardware firewall couldn’t do.</p>
<p class="mceTemp"><strong>Always ask yourself “WHY”</strong></p>
<ul>
<li class="mceTemp">Why must the server have to “see” the net?</li>
<li class="mceTemp">Why can users upload stuff that gets executed?</li>
<li class="mceTemp">Many others….  Sorry, he moved to fast.</li>
</ul>
<p class="mceTemp"><strong>Change Management</strong> - you should implement change management for your server environment.  This means that you do not make changes to the configuration files on the live server.  Do them in a testing environment first (after asking “why?”).  Then apply them to the live server, with a backup of the previous configuration.  (Could you use a version control system for your config files?)</p>
<p class="mceTemp"><strong>Database Privileges</strong> - Many applications that you download to install (Joomla / WordPress / etc) have bad default configuration advice - like GRANT ALL PRIVILEGES.  Do you really need to do this?  No!  What app really needs create table and drop table privileges?  You will only need to do this to set up the application.</p>
<p class="mceTemp"><strong>PHP Configuration </strong>- Here are some configuration details to make your PHP installation more secure:</p>
<ul>
<li class="mceTemp">register_globals = Off</li>
<li class="mceTemp">allow_url_fopen = Off</li>
<li class="mceTemp">display_errors = Off (production - dump them to a log instead)</li>
<li class="mceTemp">enable_dl = Off</li>
</ul>
<p class="mceTemp"><strong>Further Reading</strong></p>
<ul>
<li>
<div class="mceTemp">Ryan C. Barnett, <em>Preventing Web SAttachs With Apache</em></div>
</li>
<li>
<div class="mceTemp">Ivan Ristic, <em>Apache Security</em></div>
</li>
<li>
<div class="mceTemp">Tony Mobily, <em>Hardening Apache</em></div>
</li>
<li>
<div class="mceTemp"><a href="http://apache.org/security_report.html">http://apache.org/security_report.html</a></div>
</li>
<li>
<div class="mceTemp"><a href="http://cisecurity.org/">http://cisecurity.org</a></div>
</li>
<li>
<div class="mceTemp">Mike Andrews and James A. Whittaker, <em>How to Break Web Softare</em></div>
</li>
<li>
<div class="mceTemp"><a href="http://owasp.org/">http://owasp.org</a></div>
</li>
</ul>
<p class="mceTemp">Sander says that he will be posting his slides at: <a href="http://people.apache.org/~sctemme/ApconUS2008/">http://people.apache.org/~sctemme/ApconUS2008/</a></p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/0yWqg9tvkNM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/apachecon-hardening-securing-enterprise-apache-installations/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/apachecon-hardening-securing-enterprise-apache-installations/</feedburner:origLink></item>
		<item>
		<title>ApacheCon - Wicket in Action</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/iygowh9_tq8/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/apachecon-wicket-in-action/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 00:20:38 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<category><![CDATA[Wicket]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=47</guid>
		<description><![CDATA[Presented by Martijn Dashorst, author of Wicket in Action and Vice President of the Wicket project
What is Wicket - if you ask me, Martijn, or many of the attendees of this class, it is simply the best java web framework available.  More technically, it is a component oriented open source web application framework using just [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>Presented by <a href="http://martijndashorst.com/">Martijn Dashorst</a>, author of <a href="http://wicketinaction.com/">Wicket in Action</a> and Vice President of the <a href="http://wicket.apache.org">Wicket</a> project</em></strong></p>
<p>What is Wicket - if you ask me, Martijn, or many of the attendees of this class, it is simply the best java web framework available.  More technically, it is a <strong>component oriented</strong> open source <strong>web application</strong> framework using <strong>just Java and HTML</strong>.  &#8220;Writing a Wicket app is rather more like writing an event-based desktop application than a web application&#8221; - Michael Porter.  How can you make use of this powerful, easy to use framework?  Read more to find out.</p>
<p>Need help or training using Wicket?  See <a href="http://www.wickettraining.com">http://www.wickettraining.com</a> for professional training services.  Team and individual training is available, as well as consulting, phone or email support, or custom coding on your project.</p>
<p><span id="more-47"></span></p>
<p>Wicket&#8217;s top five features (according to Martijn and the user list):</p>
<ol>
<li>Just Java and HTML - if you know Java and you know HTML, you can write a Wicket application.  This allows designers to work better with development teams.</li>
<li>No XML configuration - you can easily take this feature for granted if you have worked with Wicket for a while.  If you are running away from Tapestry, you&#8217;ll notice this feature right away.</li>
<li>Automatic back button support - since Wicket handles state for you, users can go back in their browser and pick up where they left off without any issues</li>
<li>Object Oriented programming for the web - you can use good, object-oriented design and apply it to your web components.</li>
<li>Easy custom component creation - you can easily make and use reusable components.</li>
</ol>
<p><strong>Just Java</strong> - components are POJO&#8217;s (just use extends).  It is also an unmanaged framework, which means that you can simply use the standard Java &#8220;new&#8221; keyword to create a new page or component - you don&#8217;t have to let the framework instantiate it based on a string in an XML file.</p>
<p><strong>Just HTML</strong> - we use regular old HTML - we don&#8217;t put logic into HTML, so designers can do their thing and preview components. </p>
<p>What is a <span style="text-decoration: underline;"><em>Component</em></span> in Wicket?  It is a Java object that can handle events and knows how to render itself.  It has an ID given to it at instantiation time (wicket:id) that matches the ID used to place it in the markup.  It may or may not have data associated with it.  If it does have data, this can be stored in the <span style="text-decoration: underline;"><em>Model</em></span>.  Models are wrappers or locators for pieces of data used by components.  You may think of it as a single layer of abstraction that hides where the data came from.  This way the component doesn&#8217;t have to know if the data came from a POJO in session, in the database, or a URL parameter. </p>
<p><span style="text-decoration: underline;"><em>Use of models</em></span> - Rather than sticking static data into the component at instantiation time (i.e. new Label(&#8221;mylabel&#8221;, customer.getName())), a model allows the components to always get the most up-to-date copy of the data.  For instance, if you changed that label creation to new Label(&#8221;mylabel&#8221;, new PropertyModel(customer, &#8220;name&#8221;), the label now could be used on the same page as an edit form.  When the form is submitted and the page is re-rendered, the label automatically shows the edited, up-to-date name.</p>
<p>Next, Martijn showed us a hello world example and a click counter example.  The click counter example is powerful for new users wanting to see how easy it is to create custom components and see how Wicket handles state for you.  I&#8217;d suggest you visit this page to see a similar example: <a href="http://wicket.apache.org/exampleajaxcounter.html">http://wicket.apache.org/exampleajaxcounter.html</a></p>
<p>Martijn then goes into an example that will be familiar to readers of <a href="http://wicketinaction.com/">Wicket in Action</a> - how to build a cheese store.  Rather than repeating that in this post, I will refer you to the book.  It is a very well-written book, and if you are thinking of doing any development with Wicket - <strong>buy a copy for everyone on the team</strong> - it&#8217;s definitely worth it!</p>
<p>In just twenty short minutes, Martijn was able to take HTML from a designer and create a functional cheese store with a shopping cart and checkout.  This well illustrates the power of Wicket. </p>
<p>After this, Martijn showed the testability of Wicket by showing how to use WicketTester to create the hello world and link counter examples.  Wicket makes testing individual components very easy.  Rather than needing to test an entire page, you can test individual components since you have the complete ability to instantiate new components and give them real or mock models for their data access.  Though I typically use whole-system testing much more (personally), this is a very important feature of Wicket, especially for teams of developers that have code coverage goals.</p>
<p>All in all, this was an excellent session.  I was very impressed with the turnout.  Thanks to Martijn for presenting it.</p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/iygowh9_tq8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/apachecon-wicket-in-action/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/apachecon-wicket-in-action/</feedburner:origLink></item>
		<item>
		<title>ApacheCon - Making Sense of Open Source Licenses</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/3uVkTMAnGsU/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/apachecon-making-sense-of-open-source-licenses/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 23:18:44 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<category><![CDATA[Open Source Licensing]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=41</guid>
		<description><![CDATA[Presented by J Aaron Farr, Treasurer for Apache Software Foundation
Aaron tries to unravel the mysteries of the various open source licenses for us.  Starting by answering questions from the floor (only one was asked), and then moving into an explanation of open source licenses that are available, he is covering a lot of ground in [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>Presented by <a title="J Aaron Farr - Apache Software Foundation Treasurer" href="http://apacheconus2008.crowdvine.com/profiles/27376">J Aaron Farr</a>, Treasurer for Apache Software Foundation</em></strong></p>
<p>Aaron tries to unravel the mysteries of the various open source licenses for us.  Starting by answering questions from the floor (only one was asked), and then moving into an explanation of open source licenses that are available, he is covering a lot of ground in fifty minutes.  I really enjoyed the breakdown of licenses into three categories and the simple explanation of these categories.</p>
<p><span id="more-41"></span><a href="http://www.jeremythomerson.com/blog/wp-content/uploads/2008/11/quick-guide-gplv3-compatibility.png"></a>The only question asked at the beginning of the session was &#8220;I have been told that as long as I am using open source code internally (setting up IT infrastructure for example), I do not have to worry much about licensing.  Is this true?&#8221;.  This seems to be a topic that is up for interpretation.  Aaron explained that if you are modifying an open source work and distributing it within your company, it seems that you are not &#8220;publicly distributing&#8221; and the source code is available within the company, so you are probably safe.  Of course, you still have to be careful not to accidentally include it in a commercial product without understanding the licensing.</p>
<p>Open source licensing is about giving you a certain set of rights and empowering you to do certain things with the source of a project.  The license determines the rules the community lives by.  We will look at the goals, philosophy, example uses, and community implications of some various licenses.</p>
<p>First, <em>why not release everything in the public domain? </em> First, there are jurisdictions in the world that do not have the concept of public domain.  Secondly, this doesn&#8217;t give you the ability to explain that you do not offer a warranty, which may leave you legally liable for some things.  Thirdly, most open source projects desire some sort of attribution requirements, as well as stipulating certain requirements on distribution and derivative works.</p>
<p>Some common goals among many licenses: Ensure that the code <em>remains</em> open source.  Reserve some sort of control.  Building a commercial coalition around an open source project.  Some licenses are chosen specifically for a market strategy, or to encourage a third party marketplace built around the project.</p>
<p>Most licenses can be broken down into three families:</p>
<ol>
<li>Give me credit - i.e. Apache License, BSD, MIT - primarily concerned that attribution is given</li>
<li>Give me the fixes - i.e. Mozilla (MPL), Eclipse (EPL), LGPL - I don&#8217;t care if it&#8217;s included in larger works, but I would like fixes to my software contributed back.</li>
<li>Give me everything - GPL - if it ends up in your redistributable, I want it.</li>
</ol>
<p><a href="http://www.jeremythomerson.com/blog/wp-content/uploads/2008/11/quick-guide-gplv3-compatibility.png"><img class="size-medium wp-image-42 alignright" title="GPLV3 Compatibility with other types of licenses" src="http://www.jeremythomerson.com/blog/wp-content/uploads/2008/11/quick-guide-gplv3-compatibility-300x251.png" alt="" width="300" height="251" /></a>The &#8220;<strong><span style="text-decoration: underline;">Give me credit</span></strong>&#8221; or &#8220;<strong><span style="text-decoration: underline;">permissive</span></strong>&#8221; licenses such as the Apache license say that derivatives can sub-license, and may have some conditions, such as warranty, but these are not required.  Credit to the original authors is required.  They allow anyone to contribute to it because everyone has free access afterwards.  It makes it difficult for any one entity to control, because at any time it could be taken and a separate commercial product could be made from it.  This allows for competing services based on a single product.  Typically, these licenses are found on a lot of lower-level projects.</p>
<p>The &#8220;<strong><span style="text-decoration: underline;">Give me fixes</span></strong>&#8221; or &#8220;<strong><span style="text-decoration: underline;">weak copylefts</span></strong>&#8221; licenses such as Mozilla, Eclipse, and LGPL.  These tend to end up with a single entity in control since all fixes flow back into that first project.  This ends up resulting in less forking, but is still very &#8220;business friendly&#8221;.  They also encourage incorporation of code into larger works.  These licenses tend to be used in a lot of libraries or platforms.</p>
<p>The &#8220;<strong><span style="text-decoration: underline;">Give me everything</span></strong>&#8221; or &#8220;<strong><span style="text-decoration: underline;">strong copylefts</span></strong>&#8221; licenses like GPL say that all derivate works must remain under the same license.  Linked works may also need to remain under the license (depends on type of linking).  This makes it hard to incorporate it into commercial products.  The original copyright holder ends up retaining a lot of control over derivative works.  For example, if you don&#8217;t want to open source your derivative work, you could go back to the original copyright holder and obtain a secondary type of licensing, similar to what MySQL offers.</p>
<p>The diagram above is one that he used during his presentation and is provided by the Free Software Foundation that shows how licenses work together. </p>
<p><strong><span style="text-decoration: underline;">Apache License</span></strong> - The Apache license is a permissive license, but requiress attribution via a NOTICE file.  There is no trademark grant - you can not use the trademark of Apache - you may say it is &#8220;based on Apache FOO&#8221;, but it could not be called &#8220;Apache FOO&#8221;.  The authors do grant use of any patents that are part of the software distributed under the license.</p>
<p><em>Disclaimer: These are simply my notes from his session at ApacheCon.  Neither myself, as maintainer of this blog, or J Aaron Farr, are lawyers.  Anything written on this page is not intended as advice, and you always bear your own responsibility for making sure that you are complying with all licensing and legal requirements of any software.  For more information, see <a href="http://opensource.org/">http://opensource.org/</a></em></p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/3uVkTMAnGsU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/apachecon-making-sense-of-open-source-licenses/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/apachecon-making-sense-of-open-source-licenses/</feedburner:origLink></item>
		<item>
		<title>ApacheCon - Top 10 Scalability Mistakes</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/AtPNI1HXgMs/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/apachecon-top-10-scalability-mistakes/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 20:50:53 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<category><![CDATA[Performance]]></category>

		<category><![CDATA[Scalability]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=39</guid>
		<description><![CDATA[Presented by John Coggeshall, author of PHP 5 Unleashed
The &#8220;fastest&#8221; approach isn&#8217;t always the most scalable.  John covers how to scale everything from your data, your code, to your team.  He quotes Theo Schlossnagle saying &#8220;Scalability marginally impacts procedure, procedure grossly impacts scalability&#8221;.
Performance and resource scalability requires forethought and process.  Besides obvious things like version [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>Presented by John Coggeshall, author of PHP 5 Unleashed</em></strong></p>
<p>The &#8220;fastest&#8221; approach isn&#8217;t always the most scalable.  John covers how to scale everything from your data, your code, to your team.  He quotes Theo Schlossnagle saying &#8220;Scalability marginally impacts procedure, procedure grossly impacts scalability&#8221;.</p>
<p>Performance and resource scalability requires forethought and process.  Besides obvious things like version control, it is very helpful to set performance goals and metric measurements ahead of time, as well as API documentation and internal development mailing lists.  One of the first things to consider is what it means to <em>your application and business</em> to perform - 10 / 100 / 1000 requests per second?  What are your performance requirements?</p>
<p>(Note that he focuses primarily on PHP, but some of the tips are generic for all apps)</p>
<p><span id="more-39"></span>Some performance metrics to consider: <strong>RESPONSE TIME</strong> - I agree with him that this is one of the biggest ones.  It&#8217;s what your users (and your boss) visibly see when they use your site.  Others he mentioned are resource usage (CPU / memory/ etc) and throughput (i.e. requests per second).</p>
<p>When it comes to scalability, you can either be <em><span style="text-decoration: underline;">reactive</span></em> or <em><span style="text-decoration: underline;">proactive</span></em>.  Twitter is a good example of a reactive app.  They have had horrible problems that have blown up on them.  If you build for a niche market (John writes ERP apps for car dealerships) - you know ahead of time that your userbase is limited.  Then you may not have to squeeze every ounce of performance out of every routine. </p>
<p>Quotable: <strong><span style="text-decoration: underline;">Don&#8217;t write</span></strong> an application you&#8217;ll need three years from now, write an application you need today.  HOWEVER - THINK about what you might need in three years.</p>
<p>One specific example of something  you may think about doing ahead of time:  Separate your database writes and reads ahead of time so that you could read from a replication server later, even if you start out with both of them hitting the same server.</p>
<p><strong><span style="text-decoration: underline;">John&#8217;s top ten scalability tips:</span></strong></p>
<p><strong>Network File Systems </strong>- Don&#8217;t use NFS to host your code base just because it&#8217;s easier to deploy the code.  Why? NFS / GFS is really slow and has tons of locking issues.  John recommends rsync - which I agree with if you&#8217;re deploying PHP / file-based apps, which he is primarily talking about.  What about run-time updates such as accepting file uploads that need to be replicated to all web servers?  First - consider - does it really need to be instantly replicated to all servers?  Most likely, it could be synced.  NFS may be an option for this, but not for hosting code.</p>
<p><strong>I/O Buffers</strong> - I/O buffers are there for a reason - to make things faster.  Sending 4098 bytes of data to the user when your system write blocks are 4096 bytes is stupid - it takes an additional block for two extra bytes.</p>
<p><strong>Ram Disk</strong> - ram disks improve performance, but are not appropriate for many things.  One example he gives of a good use case for ram disks are sessions - if you don&#8217;t mind if sessions are lost in worst-case-scenario.  This will improve performance, but is obviously risky if that data is critical.</p>
<p><strong>Bandwidth Optimization</strong> - You can optimize bandwidth various ways.  He&#8217;s discussing PHP apps - and recommends mod_deflate or Zlib.output_compression=1.</p>
<p><strong>Configuring PHP for speed</strong> - you&#8217;ll have to see the slides for the complete list of speed enhancements.  Here are most of them (too fast to add exactly what they each do) register_globals = off / output_buffering = 4096 / session.auto_start = off / session.gc_divisor = 10000 / session.use_trans_sid = off / register_argc_argv = off / auto_globals_jit = on</p>
<p><strong>Blocking calls </strong>- Blocking I/O can always be a problem in an application - i.e. attempting to open a remote URL from within your PHP scripts.  If the resource is locked / slow / unavailable, your script hangs while we wait for a timeout.  You may as well try to scale an application that has a sleep(30) in it.  At the very least, set the timeout to only two or three seconds.   Solutions: don&#8217;t use blocking calls in your application.  <em>Have out-of-process scripts responsible for pulling down data.  Then cache that data in your database, etc&#8230;  </em>Zend has a commercial solution for PHP apps to do background processing in job queues (<a title="Zend PHP job queues" href="http://www.zend.com/en/products/platform/product-comparison/job-queues">Zend job queues</a>)</p>
<p><strong>Caching</strong> - failing to cache or do so intelligently is one of the biggest pitfalls of scalability.  A lot of people don&#8217;t realize how much the can cache.  Use the op-code cache in PHP - this will keep your server from recompiling your script for every request.</p>
<p><strong>Semi-static caching</strong> - if your application has a lot of content that could change so it has to be stored in the DB, but most never does, you can use semi-static caching.  He suggests that instead of generating the HTML for the browser, make this script generate another PHP script that contains mostly static content (i.e. the content of an article), and has minimal dynamic code (ads / username on page).  Then you could do a mod_rewrite rule that redirects to your generated file.  <em><span style="text-decoration: underline;">I don&#8217;t personally recommend this unless you REALLY need it</span></em>&#8230;. I have seen it lead to bad problems.</p>
<p><strong>Poor database design</strong> - Using MyISAM everywhere instead of InnoDB is a bad idea.  John says <strong><span style="text-decoration: underline;">NEVER</span></strong> put logic in your code to say &#8220;if I can&#8217;t connect to this DB, switch to this DB&#8221;.  You may start writing to a second master while other threads are writing to the original.  He suggests using MySQL Proxy (for PHP) instead if necessary.</p>
<p><strong>Use SQLite </strong>- great for PHP if you are doing 99.999% reads.  You have to understand when to use it (a write locks the whole database basically).</p>
<p><strong>Knowing where to <span style="text-decoration: underline;">not</span> optimize</strong> - vmstat and iostat are your friends.  Use PHP profilers.  Log information so that you can see where your bottlenecks are.  Amdahl&#8217;s law: impoving code execution time by 50% when the executes only 2% of the time only nets a 1% improvement.  Optimizing code 10% better when it runs 40% of the time is MUCH better.</p>
<p>Final thoughts:</p>
<ul>
<li>Scalability is a two way street: scale up and down</li>
<li>WIthout process, you will fail</li>
<li>You have to be able to afford to write the program.</li>
<li>You have to be able to afford to make it ten times larger.</li>
</ul>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/AtPNI1HXgMs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/apachecon-top-10-scalability-mistakes/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/apachecon-top-10-scalability-mistakes/</feedburner:origLink></item>
		<item>
		<title>ApacheCon - Lucene / Solr Case Studies</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/32njWHqBsCE/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/apachecon-lucene-solr-case-studies/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 18:13:39 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<category><![CDATA[Lucene]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=36</guid>
		<description><![CDATA[Presented by Erik Hatcher - author of Lucene in Action
Reader beware - this post is not very interesting.  Maybe I was expecting too much, but I was a little disappointed by the session.  It was basically a list of projects that have used Lucene.  You can tell that Erik is very knowledgeable (obviously) in use of [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>Presented by <a title="Erik Hatcher" href="http://www.code4lib.org/blog/209">Erik Hatcher</a> - author of <a title="Lucene in Action" href="http://www.manning.com/hatcher2/">Lucene in Action</a></em></strong></p>
<p>Reader beware - this post is not very interesting.  Maybe I was expecting too much, but I was a little disappointed by the session.  It was basically a list of projects that have used Lucene.  You can tell that Erik is very knowledgeable (obviously) in use of Lucene.  Unfortunately, though, he starts by listing several projects that he did as pet projects that he has since let die, and most of the rest of the session was a list of projects that use Lucene or Solr.</p>
<p>My one takeaway is that I do need to look into Solr more - but I use Lucene already very extensively, and wasn&#8217;t introduced to anything in Lucene in this session that I haven&#8217;t already done.</p>
<p><span id="more-36"></span>Some interesting projects very briefly mentioned were:</p>
<ul>
<li>Internet Archive / Open Library</li>
<li>Smithsonian</li>
<li>Zappos</li>
<li>Netflix - powered by Solr - and uses it to power their ajax-suggest-dropdown</li>
<li>Krugle - a search engine for source code.</li>
<li>Howtoons</li>
</ul>
<p>Here are a list of projects he has worked on.  The first few are dead or dormant.</p>
<ul>
<li>The first was some system for indexing blogs - it&#8217;s dead now.</li>
<li>The second was <a href="http://www.lucenebook.com/">http://www.lucenebook.com/</a> - where he indexed the first edition of his book.  It has since gone offline, but I am confident that it will come back since he is finishing up the second edition now.</li>
<li>Then he mentions is <a href="http://www.rossettiarchive.org/rose">http://www.rossettiarchive.org/rose</a> - an example of a simple search engine on a site related to the writings of Dante Gabriel Rossetti.</li>
<li>Next was Collex - <a href="http://www.nines.org/collex">www.nines.org/collex</a>- now using Solr.  Nines is &#8220;a federation of peer-reviewed resources, citation records, and innovative research tools, made freely available to students and scholars of 19th-century culture.&#8221;</li>
<li>Blacklight - a search engine for a library system.  <a href="http://blacklightdev.lib.virginia.edu/">http://blacklightdev.lib.virginia.edu/</a> - which unfortunately for me right now doesn&#8217;t work.</li>
<li>Solr Flare - Ruby on Rails Lucene plugin for Solr UI</li>
<li><a title="Velocity Lucense Solr" href="http://www.nabble.com/-jira--Created:-(SOLR-620)-Velocity-Response-Writer-td18329978.html">VelocityResponseWriter</a>- a way of rendering lucene results from Solr - in its &#8220;fledgling state&#8221;</li>
</ul>
<p>For other systems that use Lucene, see: <a href="http://wiki.apache.org/lucene-java/PoweredBy">http://wiki.apache.org/lucene-java/PoweredBy</a></p>
<p>Some users of Lucene mentioned in the session (from the users list):</p>
<ul>
<li>Bixee news</li>
<li>MELT project</li>
<li>IBM workforce</li>
<li>Medicince search engine - <a href="http://www.vidal.fr">www.vidal.fr</a></li>
<li>SolrJS</li>
</ul>
<p>He also explained that his company, <a href="http://www.lucidimagination.com">www.lucidimagination.com</a>provides support, services, and value-add components for Lucene and Solr.</p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/32njWHqBsCE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/apachecon-lucene-solr-case-studies/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/apachecon-lucene-solr-case-studies/</feedburner:origLink></item>
		<item>
		<title>ApacheCon - Advanced Indexing with Lucene (Lucene Payloads)</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/l4qbSfAdfvI/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/apachecon-advanced-indexing-with-lucene-payloads/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 17:15:08 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<category><![CDATA[Lucene]]></category>

		<category><![CDATA[TODOAddImagesLater]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=30</guid>
		<description><![CDATA[Presented by Michael Busch of IBM
This class was packed out - people were sitting in every chair, and others on the floor in the back of the room.  Michael starts by briefly telling us about some new features in Lucene 2.4 - the latest release.  For instance, payloads have been introduced to allow a certain [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>Presented by Michael Busch of IBM</em></strong></p>
<p>This class was packed out - people were sitting in every chair, and others on the floor in the back of the room.  Michael starts by briefly telling us about some new features in Lucene 2.4 - the latest release.  For instance, payloads have been introduced to allow a certain amount of metadata to be stored in the index.   He gives a very good explanation of how inverted indexes work and how payloads work in the latest release. <span id="more-30"></span> I won&#8217;t try to explain it in depth to you without the slides - the pictures speak a thousand words.   Basically, for each word in any indexed document, they store an array of three pieces of information: <span style="text-decoration: underline;">document ID</span> - the ID of the document that it appeared in, <span style="text-decoration: underline;">position</span> - the position in the document, <span style="text-decoration: underline;">payload</span>- a byte array of metadata that you can access later when it is returned in a search result.  (I&#8217;ll try to upload a snapshot of the slide later - they&#8217;re not currently available on the ApacheCon site). </p>
<p><strong><span style="text-decoration: underline;">Payload Use Cases:</span></strong></p>
<p><em>Score certain occurrences of a term higher than others</em>.  This was slightly complicated, but basically you could store a number as the payload for terms that you wanted to boost.  Then you could create a type of term query that pays attention to that payload to boost the term in the results.</p>
<p><em>Store a unique document ID</em>.  If you&#8217;ve used Lucene, you are probably very aware that document IDs change if you reindex things.  With payloads, you can index a single term per document that stores a unique ID in the payload.  You&#8217;ll have to see the code in the slides to see exactly how to accomplish this.  In the usecase he gave, they wanted to cache the unique document ID indexed by the Lucene document ID.  To read them all into the cache, it only took 430 milliseconds as opposed to 16.5 seconds if you saved this as a term in the document.  This shows one strength of payloads -  iterating through documents to retrieve a certain piece of information.</p>
<p><em>Efficient Numeric Search.  </em>I think this is the most interesting yet since if you&#8217;ve done much Lucene indexing and searching / you realize the problem of searching for dates, especially with any fine level of granularity.  Every unique date is stored in the dictionary (index - list of terms).  I will definitely be investigating using this in my current Lucene use.  Using payloads, you could store the date in the payload.  But to search for it, you would need to iterate through all documents to find matching documents.  To improve this, he suggests a hybrid approach: store the month and year in the term, and then store the day in the payload.  This way, when you do a date search, you can use a regular TermQuery to search for documents that match the date and year, and refine it by day when necessary (this could easily be extended to day / hour / minute / etc).</p>
<p><strong><span style="text-decoration: underline;">Flexible Indexing</span></strong></p>
<p>Token has traditionally had only: tpye / offset / position increment / payload / flags.  This makes it hard to add additional data to the token.  There is work (uncommitted as of right now) to introduce a new Token API.  It will allow you to add new attributes to the token.  These changes will also split the DocumentsWriter into several classes, following a consumer model.  These improvements will make Lucene much more flexible - right now they are only in trunk (not in 2.4).  The search side of these additional attributes is not implemented yet.  There&#8217;s no API to search for your custom attributes for now - but there will be - stay tuned.</p>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/l4qbSfAdfvI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/apachecon-advanced-indexing-with-lucene-payloads/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/apachecon-advanced-indexing-with-lucene-payloads/</feedburner:origLink></item>
		<item>
		<title>ApacheCon Keynote - Learning from Apache to Create Open Specifications</title>
		<link>http://feedproxy.google.com/~r/JeremyThomerson/~3/KJuz855stK4/</link>
		<comments>http://www.jeremythomerson.com/blog/2008/11/apachecon-keynote-learning-from-apache-to-create-open-specifications/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 16:14:01 +0000</pubDate>
		<dc:creator>Jeremy Thomerson</dc:creator>
		
		<category><![CDATA[ApacheCon]]></category>

		<guid isPermaLink="false">http://www.jeremythomerson.com/blog/?p=20</guid>
		<description><![CDATA[Presented by David Recordon of the Open Web Foundation, and works at SixApart
&#8220;Open data is increasingly important as services move online&#8221; - Tom O&#8217;Reilly (OSCON &#8216;07).  We don&#8217;t necessarily want to run our own copy of products like GMail - but we need uninhibited access to our data everywhere.  This requires open specifications / open [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>Presented by <a title="David Recordon" href="http://www.davidrecordon.com/">David Recordon</a> of the Open Web Foundation, and works at SixApart</em></strong></p>
<p>&#8220;Open data is increasingly important as services move online&#8221; - Tom O&#8217;Reilly (OSCON &#8216;07).  We don&#8217;t necessarily want to run our own copy of products like GMail - but we need uninhibited access to our data everywhere.  This requires open specifications / open APIs and open data access. </p>
<p><span id="more-20"></span>He has a cool looking device (it was free swag from Yahoo) that is a GPS locator that works with satellites so that anywhere he is in the world, he can press a button and it will upload his location and a distress call.  It works with several services, including Yahoo maps to provide open access to his location data so that it can be focused on his website (or he could create &#8220;WhereIsDaveDrinking.com&#8221;).</p>
<p>Social applications like Twitter / Dopplr / Digg / Last.fm are interesting examples of social networks that would benefit from open standards.  However, some things are broken.  He shows us Digg&#8217;s registration page - 12 fields, all required.  Then on many sites after you have registered, you have to hand over some password to your address book so that you can import your contacts.  We shouldn&#8217;t be handing out our passwords to our GMail (example) accounts - since that&#8217;s also the same password for AdSense, Checkout, etc.  It&#8217;s like this for many sites.</p>
<p><strong>PROBLEM:</strong> you may be a member of over 20 social networks.  How many can you possibly keep up with before you break?  We need interoperable platforms - the OpenSocial specification (and the Apache Shindig project) is addressing this. </p>
<p>Another project that he mentions, and one I want to look into is <em><a href="http://pinaxproject.com/">pinax</a></em>.  It calls itself &#8220;a platform for rapidly developing websites&#8221; - a tool for developers. </p>
<p>David is mainly part of three of these open specifications communities: OpenID, OAUTH and OpenSocial. </p>
<p><strong>PROBLEM:</strong>  If your company is creating or thinking of praticipating in an open standard or specification, there are still a lot of unanswered questions regarding intellectual property, patents, and other legal problems.  We need a way of having something similar to open source licenses to apply to open specifications.</p>
<p>David&#8217;s organization is looking at creating the following things for open specifications:</p>
<ul>
<li><strong>Licensing </strong>(freely implementable by anyone)</li>
<li><strong>Copyright </strong>(ideally Creative Commons for each spec)</li>
<li><strong>Community </strong>(to support the Open Web)</li>
<li><strong>Incubation </strong>(creating new open specifications for the web)</li>
</ul>
<p>You&#8217;ll notice that <span style="text-decoration: underline;"><em>those are the key things that Apache provides for the open source community</em></span>.  Listening to everything that David and his organizations are going through right now helps me to appreciate how much the Apache Software Foundation has done for the open source software community.</p>
<p><strong>My takeaways:</strong></p>
<ul>
<li>While I am not a huge social network participant, it&#8217;s obviously a large part of the web now.  We must have a way to meld all of these separate platforms together.</li>
<li>Social networks are almost becoming like operating systems in many ways - and they are mostly as separated as operating systems - no enough interoperability.</li>
<li>There will be legal ramifications to figure out while opening up the specifications and data.</li>
<li>I&#8217;m not sure who will be the big champion in this open spec / open data arena, but I am sure that it will be a difficult project - to do it right, anyway.</li>
</ul>
<img src="http://feeds.feedburner.com/~r/JeremyThomerson/~4/KJuz855stK4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jeremythomerson.com/blog/2008/11/apachecon-keynote-learning-from-apache-to-create-open-specifications/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.jeremythomerson.com/blog/2008/11/apachecon-keynote-learning-from-apache-to-create-open-specifications/</feedburner:origLink></item>
	</channel>
</rss>
