<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bit Mojo - Hiram Chirino</title>
	<atom:link href="http://hiramchirino.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://hiramchirino.com/blog</link>
	<description>My Ramblings on Hawt Tech</description>
	<lastBuildDate>Fri, 03 Feb 2012 14:25:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Apache Apollo 1.0 Released!</title>
		<link>http://hiramchirino.com/blog/2012/02/apache-apollo-1-0-released/</link>
		<comments>http://hiramchirino.com/blog/2012/02/apache-apollo-1-0-released/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 14:21:52 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Other]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/blog/?p=191</guid>
		<description><![CDATA[I&#8217;m pleased to announce the availability of Apache Apollo 1.0.  Apollo is a faster, more reliable, easier to maintain messaging broker built from the foundations of the Apache ActiveMQ project but with a radically different threading architecture which lets it scale to large number of concurrent connections and destinations while using a constant number of threads. Apollo [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m pleased to announce the availability of <a href="http://activemq.apache.org/apollo" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo?referer=');">Apache Apollo</a> 1.0.  Apollo is a faster, more reliable, easier to maintain messaging broker built from the foundations of the <a href="http://activemq.apache.org" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org?referer=');">Apache ActiveMQ</a> project but with a radically different threading architecture which lets it scale to large number of concurrent connections and destinations while using a constant number of threads.</p>
<p>Apollo features:</p>
<ul>
<li><a href="http://stomp.github.com/stomp-specification-1.0.html" onclick="pageTracker._trackPageview('/outgoing/stomp.github.com/stomp-specification-1.0.html?referer=');">Stomp 1.0</a> Protocol Support</li>
<li><a href="http://stomp.github.com/stomp-specification-1.1.html" onclick="pageTracker._trackPageview('/outgoing/stomp.github.com/stomp-specification-1.1.html?referer=');">Stomp 1.1</a> Protocol Support</li>
<li><a href="http://activemq.apache.org/apollo/documentation/user-manual.html#Destination_Types" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/documentation/user-manual.html_Destination_Types?referer=');">Topics and Queues</a></li>
<li><a href="http://activemq.apache.org/apollo/documentation/user-manual.html#Browsing_Subscriptions" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/documentation/user-manual.html_Browsing_Subscriptions?referer=');">Queue Browsers</a></li>
<li><a href="http://activemq.apache.org/apollo/documentation/user-manual.html#Topic_Durable_Subscriptions" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/documentation/user-manual.html_Topic_Durable_Subscriptions?referer=');">Durable Subscriptions on Topics</a></li>
<li><a href="http://activemq.apache.org/apollo/documentation/user-manual.html#Reliable_Messaging" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/documentation/user-manual.html_Reliable_Messaging?referer=');">Persistent/Reliable Messaging</a></li>
<li><a href="http://activemq.apache.org/apollo/documentation/user-manual.html#Message_Expiration" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/documentation/user-manual.html_Message_Expiration?referer=');">Message Expiration</a></li>
<li><a href="http://activemq.apache.org/apollo/documentation/architecture.html#Message_Swapping" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/documentation/architecture.html_Message_Swapping?referer=');">Message Swapping</a></li>
<li><a href="http://activemq.apache.org/apollo/documentation/user-manual.html#Message_Selectors" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/documentation/user-manual.html_Message_Selectors?referer=');">Message Selectors</a></li>
<li><a href="http://activemq.apache.org/apollo/documentation/user-manual.html#Authentication" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/documentation/user-manual.html_Authentication?referer=');">JAAS Authentication</a></li>
<li><a href="http://activemq.apache.org/apollo/documentation/user-manual.html#Authorization" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/documentation/user-manual.html_Authorization?referer=');">ACL based Authorization</a></li>
<li><a href="http://activemq.apache.org/apollo/documentation/user-manual.html#The_SSL_TLS_Transport" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/documentation/user-manual.html_The_SSL_TLS_Transport?referer=');">SSL/TLS Support</a> and Certificate based Authentication</li>
<li><a href="http://activemq.apache.org/apollo/documentation/management-api.html" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/documentation/management-api.html?referer=');">REST Management API</a></li>
</ul>
<p>Yes, it supports JMS!  Just <a href="http://activemq.apache.org/apollo/download.html" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/download.html?referer=');">download Apollo</a>, start it up using the <a href="http://activemq.apache.org/apollo/documentation/getting-started.html" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/documentation/getting-started.html?referer=');">getting started guide</a> and then check out the distribution&#8217;s <code>examples</code> directory.  Oh yeah, Apollo has great <a href="http://activemq.apache.org/apollo/documentation/user-manual.html" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/documentation/user-manual.html?referer=');">documentation</a>!</p>
<p>I&#8217;ve re-run the <a href="http://hiramchirino.com/stomp-benchmark/ec2-c1.xlarge/index.html">STOMP benchmarks</a> I covered in a <a href="http://hiramchirino.com/blog/2011/12/stomp-messaging-benchmarks-activemq-vs-apollo-vs-hornetq-vs-rabbitmq/">previous post</a> against the 1.0 release.  The benchmark uses the STOMP protocol to build an apples to apples performance comparison between all the major STOMP servers.  I&#8217;ve also built a new <a href="http://hiramchirino.com/jms-benchmark/ec2-c1.xlarge/index.html">JMS benchmark</a> which uses the JMS API build the same kind of performance comparisons.  Both benchmarks are open source and available to be tried out on your choice of hardware.  Or better yet, follow the simple instructions found in each project&#8217;s readme to run the benchmarks on EC2:</p>
<ul>
<li><a href="https://github.com/chirino/stomp-benchmark" onclick="pageTracker._trackPageview('/outgoing/github.com/chirino/stomp-benchmark?referer=');">https://github.com/chirino/stomp-benchmark</a></li>
<li><a href="https://github.com/chirino/jms-benchmark" onclick="pageTracker._trackPageview('/outgoing/github.com/chirino/jms-benchmark?referer=');">https://github.com/chirino/jms-benchmark</a></li>
</ul>
<p>For those of you wondering why the ActiveMQ project create new message broker as a subproject, it&#8217;s because we wanted to address the shift in the processor market to multi core for the next major release.  ActiveMQ currently employs complex thread locking which starts to become bottleneck as you increase the core count and you don&#8217;t end up fully exploiting the potential on large core count machines.  By developing the solution as a subproject, it&#8217;s easier to explore the best options without impacting current main line development of ActiveMQ 5.x.</p>
<p>Now that the Apollo sub project has proven itself, I think it&#8217;s time to start integrating it into ActiveMQ.  Ideally, ActiveMQ 6 switches Apollo&#8217;s messaging engine and adds/ports all the existing features we&#8217;ve come to expect out of ActiveMQ like networks of brokers and priority queues.  But we should really be talking about this on the<a href="http://activemq.apache.org/mailing-lists.html" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/mailing-lists.html?referer=');"> Apache mailing lists</a>.. join me there!</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2012/02/apache-apollo-1-0-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>STOMP Messaging Benchmarks: ActiveMQ vs Apollo vs HornetQ vs RabbitMQ</title>
		<link>http://hiramchirino.com/blog/2011/12/stomp-messaging-benchmarks-activemq-vs-apollo-vs-hornetq-vs-rabbitmq/</link>
		<comments>http://hiramchirino.com/blog/2011/12/stomp-messaging-benchmarks-activemq-vs-apollo-vs-hornetq-vs-rabbitmq/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 12:27:29 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Messaging]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[apollo]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[hornetq]]></category>
		<category><![CDATA[rabbitmq]]></category>
		<category><![CDATA[stomp]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/blog/?p=167</guid>
		<description><![CDATA[I&#8217;ve recently run STOMP benchmarks against the lastest releases of the 4 most feature packed STOMP servers: Apache ActiveMQ 5.5.1 Apache ActiveMQ Apollo 1.0 Beta 6 (an ActiveMQ Subproject) HornetQ 2.2.5 RabbitMQ 2.7.0 STOMP is an asynchronous messaging protocol with design roots are based on HTTP protocol.  It&#8217;s simplicity has made the protocol tremendously  popular since it reduces [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently run <a href="http://hiramchirino.com/stomp-benchmark">STOMP benchmarks</a> against the lastest releases of the 4 most feature packed STOMP servers:</p>
<ul>
<li><a href="http://activemq.apache.org/" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/?referer=');">Apache ActiveMQ</a> 5.5.1</li>
<li><a href="http://activemq.apache.org/apollo/" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo/?referer=');">Apache ActiveMQ Apollo</a> 1.0 Beta 6 (an ActiveMQ Subproject)</li>
<li><a href="http://www.jboss.org/hornetq" onclick="pageTracker._trackPageview('/outgoing/www.jboss.org/hornetq?referer=');">HornetQ</a> 2.2.5</li>
<li><a href="http://www.rabbitmq.com/" onclick="pageTracker._trackPageview('/outgoing/www.rabbitmq.com/?referer=');">RabbitMQ</a> 2.7.0</li>
</ul>
<p><a href="http://stomp.github.com" onclick="pageTracker._trackPageview('/outgoing/stomp.github.com?referer=');">STOMP</a> is an asynchronous messaging protocol with design roots are based on HTTP protocol.  It&#8217;s simplicity has made the protocol tremendously  popular since it reduces the complexity of integrating different platforms and languages.  There are a <a href="http://stomp.github.com/implementations.html" onclick="pageTracker._trackPageview('/outgoing/stomp.github.com/implementations.html?referer=');">multitude of client libraries</a> for your language of choice to interface with STOMP servers.</p>
<p>The benchmark focuses on finding the maximum producer and consumer throughput for a variety of messaging scenarios.  For example, it benchmarks a combination of all the following scenario options:</p>
<ul>
<li>Queues or Topics</li>
<li>1, 5, or 10 Producers</li>
<li>1, 5, or  10 Consumers</li>
<li>1, 5, or 10 Destinations</li>
<li>20 byte, 1k, or 256k message bodys</li>
</ul>
<p>The benchmark warms up each scenario for 3 seconds.  Then for 15 seconds it samples the total number of messages that were  produced/consumed every second.  Finally, the destination gets drained of any messages before benchmarking the next scenario.  The benchmark generates a little HTML report with a graph for each scenario run where it displays messaging rate for each of the servers over the 15 second  sampling interval.</p>
<p>I&#8217;ve run the benchmarks on a couple if different machines and I&#8217;ve posted the results at: <a href="http://hiramchirino.com/stomp-benchmark/">http://hiramchirino.com/stomp-benchmark/</a><br />
<em>Note: the graphs can take a while to load as they are being generated on the client side using the excellent <a href="http://code.google.com/p/flot/" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/flot/?referer=');">flot javascript library</a>.</em></p>
<p>Since anyone can get access to an EC2 instance to reproduce those results, the rest of this article will focus on the results of the obtained on the <a href="http://hiramchirino.com/stomp-benchmark/ec2-c1.xlarge/index.html">EC2 High-CPU Extra Large Instance</a>.  If you want to reproduce, just spin up a new Amazon Linux 64 bit AMI and then run the following commands in it:</p>
<pre style="padding-left: 30px;">sudo yum install -y screen
curl https://nodeload.github.com/chirino/stomp-benchmark/tarball/master | tar -zxv
mv chirino-stomp-benchmark-* stomp-benchmark
screen ./stomp-benchmark/bin/benchmark-all</pre>
<p>&nbsp;</p>
<p><em>Note: RabbitMQ 2.7.0 sometimes dies midway through the benchmark.  It seems RabbitMQ does not enforce very strict flow control and you can get into situations where it runs out of memory if you place too much load on it.  It seems that crash becomes more likely as you increase the core speed of the cpu or reduce the amount of physical memory on the box.  Luckily, the RabbitMQ folks <a href="http://comments.gmane.org/gmane.comp.networking.rabbitmq.general/10406" onclick="pageTracker._trackPageview('/outgoing/comments.gmane.org/gmane.comp.networking.rabbitmq.general/10406?referer=');">are aware of the issue</a> and hopefully will fix it by the next release.</em></p>
<p><em>The &#8216;Throughput to an Unsubscribed Topic&#8217; benchmarking scenario is interesting to just get a idea/base line what the fastest possible rate a producer can send to server.  Since there are not attached consumers, the broker should be doing very little work since it&#8217;s just dropping all the messages that get sent to it.</em></p>
<p><a href="http://hiramchirino.com/stomp-benchmark/ec2-c1.xlarge/index.html#throughput_to_topic"><img class="alignnone" src="http://idisk.me.com/chirino/Public/Pictures/Skitch/hiramchirino.com_stomp-benchmark_ec2-c1.xlarge_index.html-20111212-133242.jpg" alt="" width="575" height="112" /></a></p>
<p>The <strong>Queue Load/Unload</strong> scenarios a very important to look at if your application uses queues.  You often times run into situations where messages start accumulating in a queue with either no consumers or with not enough consumers to keep up with the producer load.  This benchmark first runs a producer for 30 seconds enqueuing non-persistant messages and then runs a producer enqueuing persistant messages  for 30 seconds.  Finally, it runs a consumer to dequeue the messages for 30 seconds.  An interesting observation in this scenario is that Apollo was the only sever which could dequeue at around the same maximum enqueue rates which is important if you ever want your consumers to catch up with fast producers.</p>
<p><a href="http://hiramchirino.com/stomp-benchmark/ec2-c1.xlarge/index.html#queue_load_unload"><img class="alignnone" src="http://idisk.me.com/chirino/Public/Pictures/Skitch/hiramchirino.com_stomp-benchmark_ec2-c1.xlarge_index.html-20111212-133519.jpg" alt="" width="552" height="141" /></a></p>
<p>&nbsp;</p>
<p>The <strong>Fan In/Out Load Scenarios</strong> help you look at cases where you have either multiple producers or multiple consumers running against a single destination.  It helps you see how performance will be affects as you scale up the producers and consumers.  You should follow the &#8220;10 Producers&#8221; columns and &#8220;10 Consumers&#8221; rows to really get a sense of which servers do well as the you increase the number of clients on a single destination.</p>
<p><a href="http://hiramchirino.com/stomp-benchmark/ec2-c1.xlarge/index.html#fan_in_out_load"><img class="alignnone" src="http://idisk.me.com/chirino/Public/Pictures/Skitch/Fullscreen-20111212-133808.jpg" alt="" width="420" height="363" /></a></p>
<p>The <strong>Partitioned Load Scenarios</strong> look at how well the server scales as you start to increase load on multiple destinations at different message sizes.</p>
<p>I&#8217;ve tried to make the benchmark as fair as possible to all the contenders, all the source code to the benchmark is available on <a href="https://github.com/chirino/stomp-benchmark" onclick="pageTracker._trackPageview('/outgoing/github.com/chirino/stomp-benchmark?referer=');">github</a>.  Please open an issue or send me pull request if you think of ways to improve it!</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2011/12/stomp-messaging-benchmarks-activemq-vs-apollo-vs-hornetq-vs-rabbitmq/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ActiveMQ Apollo Looking Impressive</title>
		<link>http://hiramchirino.com/blog/2011/01/activemq-apollo-looking-impressive/</link>
		<comments>http://hiramchirino.com/blog/2011/01/activemq-apollo-looking-impressive/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 20:47:08 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Other]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/blog/?p=154</guid>
		<description><![CDATA[ActiveMQ Apollo is a new generation of messaging broker built from the foundations of the ActiveMQ messaging broker, but using a radically different threading and message dispatching architecture.  In it&#8217;s current incarnation, Apollo only supports the STOMP protocol but just like the original ActiveMQ, it&#8217;s been designed to be a multi protocol broker and in future [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://activemq.apache.org/apollo" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/apollo?referer=');">ActiveMQ Apollo</a> is a new generation of messaging broker built from the foundations of the <a href="http://activemq.apache.org" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org?referer=');">ActiveMQ</a> messaging broker, but using a radically different threading and message dispatching architecture.  In it&#8217;s current incarnation, Apollo only supports the <a href="http://stomp.github.com/" onclick="pageTracker._trackPageview('/outgoing/stomp.github.com/?referer=');">STOMP</a> protocol but just like the original ActiveMQ, it&#8217;s been designed to be a multi protocol broker and in future iterations it should get OpenWire support so it can be compatible with ActiveMQ 5.x JMS clients.</p>
<p>The BIGGEST change in the broker architecture was a switch to a non-blocking threading model for message processing using the <a href="http://hiramchirino.com/blog/2010/07/hawtdispatch-event-based-io/">HawtDispatch</a> library.  This meant changing many of the APIs to using a continuation passing style so that caller never blocks on a request.  The upside of the new architecture is that the most complex and brittle areas of multi-threaded code in ActiveMQ 5.x  have now been tremendously simplified.  Those areas are using actor style coarse grained synchronization thanks to HawtDispatch.</p>
<p>It is impressive how well Apollo performs. Using a little <a href="https://github.com/chirino/stomp-benchmark" onclick="pageTracker._trackPageview('/outgoing/github.com/chirino/stomp-benchmark?referer=');">benchmarking tool</a>, I compared the performance of Apollo and three other STOMP server implementations.  The benchmark tests different combinations of consumers, destinations, producers, persistence options, message sizes for a total of 74 common usage scenarios.  I ran the benchmarks on two different boxes.  If you want to peek at the complete benchmark reports, see <a href="http://hiramchirino.com/stomp-benchmark/ubuntu-4-core-report.html">Ubuntu 4 Core report</a> and <a href="http://hiramchirino.com/stomp-benchmark/osx-8-core-report.html">OS X 8 Core report</a>.</p>
<p>Apollo ends up doing really well in comparison to other servers in most cases but in some cases it&#8217;s just mind blowing.  For example:</p>
<p><img class="alignnone" title="performance graph" src="http://idisk.me.com/chirino/Public/Pictures/Skitch/osx-8-core-report.html-20110117-153041.jpg" alt="" width="509" height="198" /></p>
<p>The  scenario above is the case where you have 10 producer and 10 consumers on a single topic moving non persistent STOMP messages with a 20 byte payload.   The graph shows that Apollo can easily sustain a total consumer processing rate of 1.2 Million messages per second while the closest contender could only reach about 105,000 thousand messages per second.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2011/01/activemq-apollo-looking-impressive/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>RestyGWT 1.0 Released</title>
		<link>http://hiramchirino.com/blog/2010/09/restygwt-1-0-released/</link>
		<comments>http://hiramchirino.com/blog/2010/09/restygwt-1-0-released/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 18:54:41 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[restygwt]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/blog/?p=149</guid>
		<description><![CDATA[I am pleased to announce the availability of RestyGWT 1.0. RestyGWT is a GWT generator for REST services and JSON encoded data transfer objects.  What I really like about it is that it allows you to write rich JAX-RS based services and access those services from at GWT client reusing all the same DTO objects [...]]]></description>
			<content:encoded><![CDATA[<p>I am pleased to announce the availability of <a href="http://restygwt.fusesource.org/" onclick="pageTracker._trackPageview('/outgoing/restygwt.fusesource.org/?referer=');">RestyGWT 1.0</a>.</p>
<p>RestyGWT is a GWT generator for REST services and JSON encoded data transfer objects.  What I really like about it is that it allows you to write rich JAX-RS based services and access those services from at GWT client reusing all the same DTO objects that you use on the server side.</p>
<p>In other words, it just as easy to use as GWT-RPC except it&#8217;s using simple RESTful URLs and JSON encoding of data when it access server side resources.  This has the nice benefit that you can implement the server side in something other than JAVA easily.</p>
<p>Further information see:</p>
<ul>
<li><a href="http://restygwt.fusesource.org" target="_blank" onclick="pageTracker._trackPageview('/outgoing/restygwt.fusesource.org?referer=');">Website</a></li>
<li><a href="http://restygwt.fusesource.org/community.html" onclick="pageTracker._trackPageview('/outgoing/restygwt.fusesource.org/community.html?referer=');">Community</a></li>
<li><a href="http://restygwt.fusesource.org/documentation/" onclick="pageTracker._trackPageview('/outgoing/restygwt.fusesource.org/documentation/?referer=');">Documentation</a></li>
<li><a href="http://restygwt.fusesource.org/download.html" onclick="pageTracker._trackPageview('/outgoing/restygwt.fusesource.org/download.html?referer=');">Download</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2010/09/restygwt-1-0-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HawtDispatch Event Based IO</title>
		<link>http://hiramchirino.com/blog/2010/07/hawtdispatch-event-based-io/</link>
		<comments>http://hiramchirino.com/blog/2010/07/hawtdispatch-event-based-io/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 16:28:50 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[HawtDispatch]]></category>
		<category><![CDATA[NIO]]></category>
		<category><![CDATA[Threading]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/blog/?p=142</guid>
		<description><![CDATA[My previous post promised a follow up to explain how network IO events are handled by HawtDispatch.  Before I get into the details, I urge you to read Mark McGranaghan&#8217;s post on Threaded vs Evented Servers.  He does an excellent job describing how event driven servers scale in comparison to threaded servers.   This post [...]]]></description>
			<content:encoded><![CDATA[<p>My <a href="http://hiramchirino.com/blog/2010/06/scaling-up-with-hawtdispatch/">previous post</a> promised a follow up to explain how network IO events are handled by <a href="http://hawtdispatch.fusesource.org" onclick="pageTracker._trackPageview('/outgoing/hawtdispatch.fusesource.org?referer=');">HawtDispatch</a>.  Before I get into the details, I urge you to read Mark McGranaghan&#8217;s post on <a href="http://mmcgrana.github.com/2010/07/threaded-vs-evented-servers.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/mmcgrana.github.com/2010/07/threaded-vs-evented-servers.html?referer=');">Threaded vs Evented Servers</a>.  He does an excellent job describing how event driven servers scale in comparison to threaded servers.   This post will try to highlight how HawtDispatch provides an excellent framework for the implementation of event based servers.</p>
<p>When implementing event based servers, there are generally 2 patterns used, the <a href="http://www.cs.wustl.edu/~schmidt/PDF/reactor-siemens.pdf" onclick="pageTracker._trackPageview('/outgoing/www.cs.wustl.edu/_schmidt/PDF/reactor-siemens.pdf?referer=');">reactor pattern</a> and the<a href="http://www.cs.wustl.edu/~schmidt/PDF/proactor.pdf" onclick="pageTracker._trackPageview('/outgoing/www.cs.wustl.edu/_schmidt/PDF/proactor.pdf?referer=');"> proactor pattern</a>.  The reactor pattern can be though of as being a synchronous version of the proactor pattern.  In a reactor pattern IO events are serviced by the thread in the IO handling loop.  In a proactor pattern the thread processing the IO event loop passes off the the IO event to another thread for processing.  HawtDispatch can support both styles of IO processing.</p>
<p>HawtDispatch uses a fixed sized thread pool sized to match the number of cores on your system.  Each thread in the pool runs an IO handling loop.  When a <a href="http://hawtdispatch.fusesource.org/#nio_dispatch_source" onclick="pageTracker._trackPageview('/outgoing/hawtdispatch.fusesource.org/_nio_dispatch_source?referer=');">NIO event source</a> is created, it gets assigned to one of the threads.  When network events occur the source causes callbacks to occur against on the dispatch queue targeted in the event source.  Typically that target dispatch queue is set to a serial queue which the application uses to handle the network protocol.  Since it&#8217;s a serial queue, the handling of the event can be done in a thread safe way.  The proactor pattern is being used since the serial queue can execute in any of the threads in the thread pool .</p>
<p>To use the reactor pattern, HawtDispatch supports &#8216;pinning&#8217; the serial queue to a thread.  When a dispatch source is created on a pinned dispatch queue, then the event source gets registered against the same &#8216;pinned&#8217; thread.  The benefit of the reactor pattern is that it avoids some of  cross thread synchronization needed for the proactor pattern and provides cheaper GCs.  The down side to the reactor pattern is that you may have to manage reblanacing network sources across all the available thread.  Lucky HawtDispatch does support moving pinned dispatch queues and sources to different threads.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2010/07/hawtdispatch-event-based-io/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Scaling Up with HawtDispatch</title>
		<link>http://hiramchirino.com/blog/2010/06/scaling-up-with-hawtdispatch/</link>
		<comments>http://hiramchirino.com/blog/2010/06/scaling-up-with-hawtdispatch/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 16:04:08 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[HawtDispatch]]></category>
		<category><![CDATA[NIO]]></category>
		<category><![CDATA[Threading]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/blog/?p=127</guid>
		<description><![CDATA[I just spotted an excellent article on how reducing the number of cores used by a multi-threaded actually increased it&#8217;s performance.  This seems counter intuitive at first, but it is a sad reality.  It is very easy to create contention across threads in a multi-threaded app which in turn lowers performance. A few months ago, [...]]]></description>
			<content:encoded><![CDATA[<p>I just spotted an<a href="http://mailinator.blogspot.com/2010/02/how-i-sped-up-my-server-by-factor-of-6.html" onclick="pageTracker._trackPageview('/outgoing/mailinator.blogspot.com/2010/02/how-i-sped-up-my-server-by-factor-of-6.html?referer=');"> excellent article</a> on how reducing the number of cores used by a multi-threaded actually increased it&#8217;s performance.  This seems counter intuitive at first, but it is a sad reality.  It is very easy to create contention across threads in a multi-threaded app which in turn lowers performance.</p>
<p>A few months ago, I experienced similar results while hacking on ActiveMQ.  I noticed that passing messages from producer connections to consumer connections was dramatically faster if the producer and consumer were being serviced by the same thread.  I decided that the next version of the broker would to be need to be built using a thread management framework which could optimize itself so that those connections could collocate onto one thread if possible.</p>
<p>Then I saw the the <a href="http://libdispatch.macosforge.org/" onclick="pageTracker._trackPageview('/outgoing/libdispatch.macosforge.org/?referer=');">libdispatch</a> API (it forms the foundation of the<a href="http://developer.apple.com/mac/articles/cocoa/introblocksgcd.html" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/mac/articles/cocoa/introblocksgcd.html?referer=');"> Grand Central Dispatch</a> technology in OS X) and fell in love with it&#8217;s simplicity and power.  I realized that implementation of that API could in theory provides the threading optimizations I was looking for.  So I started hacking on <a href="http://hawtdispatch.fusesource.org/" onclick="pageTracker._trackPageview('/outgoing/hawtdispatch.fusesource.org/?referer=');">HawtDispatch</a>, a Java/Scala clone of libdispatch.</p>
<p>The central concepts to libdispatch and hawtdispatch are global and serial queues.  Global queues are executors which execute tasks concurrently using a  fixed size thread pool. Serial queues are executors without an assigned thread and which execute tasks in FIFO order.   When tasks added to a serial queue, the serial queue gets added to a global queue so that the serial queue can execute it&#8217;s tasks.  Multiple serial queues execute concurrently on the global queue.</p>
<p>The overhead of a serial queue is very small, it&#8217;s just a several counters and a couple of linked lists.  You can use them like a lightweight thread. Feel free to create thousands of them.  If you squint at it just right, they allows you to use erlang style actor thread model.</p>
<p>Now that you have an idea how HawtDispatch is used, lets get back to what kinds of optimizations it can do to help with cross thread contention.  HawtDispatch generally uses a concurrent linked list to enqueue a task in serial queue, but there are times when it can avoid that synchronization of the concurrent linked list.  For example, if the serial queue is currently executing in the current thread, then an enqueue can just add the task to a non synchronized linked list.  HawtDispatch also supports &#8216;pining&#8217; a serial queue to one of the threads in the global queue&#8217;s thread pool.  This allows you to force serial queues to collocate onto one thread so that when they do need to communicate, there is no thread contention involved.</p>
<p>But you still run into cases where you need to move tons of events from one serial queue to another which is executing on a different thread.  For these cases, you use a custom event source.  It allows you to  coalesce a bunch of events generated on on thread as a single event delivered to the another queue.  HawtDispatch will aggregate custom events  into a thread local (to avoid contention) and once the current thread has drained all execution queues, it will deliver those custom events to their target queues.</p>
<p>This post is already getting kind of long, so I&#8217;ve have to do <a href="http://hiramchirino.com/blog/2010/07/hawtdispatch-event-based-io/">a follow up post</a> on how all that interacts with network IO events.  But the general idea is, yes, keeping stuff on 1 core is fast, but it won&#8217;t scale once your CPU bound, so having a framework like can HawtDispatch help minimize cross thread contention while still providing the ability to scale up to multiple cores as load increases.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2010/06/scaling-up-with-hawtdispatch/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jansi 1.2 Released</title>
		<link>http://hiramchirino.com/blog/2010/02/jansi-1-2-released/</link>
		<comments>http://hiramchirino.com/blog/2010/02/jansi-1-2-released/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 22:19:10 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jansi]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/blog/?p=125</guid>
		<description><![CDATA[I&#8217;m happy to announce that Jansi 1.2 has been released.  It addresses a couple of small bugs and adds a few minor enhancements.  See the full change log for more details.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m happy to announce that <a href="http://jansi.fusesource.org" onclick="pageTracker._trackPageview('/outgoing/jansi.fusesource.org?referer=');">Jansi</a> 1.2 has been released.  It addresses a couple of small bugs and adds a few minor enhancements.  See the <a href="http://github.com/chirino/jansi/blob/master/changelog.md" onclick="pageTracker._trackPageview('/outgoing/github.com/chirino/jansi/blob/master/changelog.md?referer=');">full change log</a> for more details.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2010/02/jansi-1-2-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mop 1.0 Milestone 1 Released!</title>
		<link>http://hiramchirino.com/blog/2009/12/mop-1-0-milestone-1-released/</link>
		<comments>http://hiramchirino.com/blog/2009/12/mop-1-0-milestone-1-released/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 12:58:15 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Other]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/blog/?p=123</guid>
		<description><![CDATA[I&#8217;m very excited to announce that Mop 1.0 M1 has been released. Mop is one of those tools that you wish you have had years ago. Most of you probably have not heard of mop yet. Mop is: &#8230; a small utility for executing Java programs which are stored as artifacts like jars or bundles [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m very excited to announce that <a href="http://mop.fusesource.org/" onclick="pageTracker._trackPageview('/outgoing/mop.fusesource.org/?referer=');">Mop</a> 1.0 M1 has been released.  Mop is one of those tools that you wish you have had years ago.  Most of you probably have not heard of mop yet.  Mop is:</p>
<blockquote><p>&#8230; a small utility for executing Java programs which are stored as artifacts like jars or bundles in a Maven repository.  MOP automatically deals with the following for you transitive dependencies downloading artifacts from remote repositories and caching them locally setting up your class path</p></blockquote>
<p>It&#8217;s a wonderfully <a href="http://mop.fusesource.org/downloads/index.html" onclick="pageTracker._trackPageview('/outgoing/mop.fusesource.org/downloads/index.html?referer=');">small download</a> that weighs in at only 3.2 megs.  Why don&#8217;t you try it out today?</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2009/12/mop-1-0-milestone-1-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fuse Community Day: San Francisco</title>
		<link>http://hiramchirino.com/blog/2009/12/fuse-community-day-san-francisco/</link>
		<comments>http://hiramchirino.com/blog/2009/12/fuse-community-day-san-francisco/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 18:20:33 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Integration]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[camel]]></category>
		<category><![CDATA[cxf]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[fuse]]></category>
		<category><![CDATA[servicemix]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/blog/?p=117</guid>
		<description><![CDATA[I just found out I&#8217;m going to heading out to San Francisco to attend the Fuse Community Day! Progress Software is sponsoring an Apache ServiceMix, ActiveMQ, CXF &#38; Camel Community Day on Thursday, December 10th, at the Hyatt Hotel in Burlingame. Join us at this free event and meet committers and founders of Apache ServiceMix, [...]]]></description>
			<content:encoded><![CDATA[<p>I just found out I&#8217;m going to heading out to San Francisco to attend the Fuse Community Day!</p>
<blockquote><p>Progress Software is sponsoring an Apache ServiceMix, ActiveMQ, CXF &amp; Camel Community Day on Thursday, December 10th, at the Hyatt Hotel in Burlingame. Join us at this free event and meet committers and founders of Apache ServiceMix, ActiveMQ, CXF and Camel that have successfully implemented enterprise application and deployed these projects in production.</p></blockquote>
<p>Should fun to meet users/developers of these kick ass Apache based projects.  If you plan on going, make sure your <a href="http://form.fusesource.com/forms/registersf2009" onclick="pageTracker._trackPageview('/outgoing/form.fusesource.com/forms/registersf2009?referer=');">register for the event</a>.  It&#8217;ll be nice to meet everyone!</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2009/12/fuse-community-day-san-francisco/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python messaging: ActiveMQ and RabbitMQ</title>
		<link>http://hiramchirino.com/blog/2009/10/python-messaging-activemq-and-rabbitmq/</link>
		<comments>http://hiramchirino.com/blog/2009/10/python-messaging-activemq-and-rabbitmq/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 17:15:55 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Messaging]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/blog/?p=107</guid>
		<description><![CDATA[Dejan just posted a nice writeup comparing the performance of ActiveMQ to RabbitMQ in the case of python clients.  Interesting results: &#8230; both ActiveMQ and RabbitMQ are decent brokers that will serve their purpose well in normal conditions, but put to their extremes in terms of throughput, scalability and reliability, ActiveMQ currently outperforms RabbitMQ for [...]]]></description>
			<content:encoded><![CDATA[<p>Dejan just posted a <a href="http://www.nighttale.net/activemq/python-messaging-activemq-and-rabbitmq.html" onclick="pageTracker._trackPageview('/outgoing/www.nighttale.net/activemq/python-messaging-activemq-and-rabbitmq.html?referer=');">nice writeup</a> comparing the performance of ActiveMQ to RabbitMQ in the case of python clients.  Interesting results:</p>
<blockquote><p>&#8230; both ActiveMQ and RabbitMQ are decent brokers that will serve their purpose well in normal conditions, but put to their extremes in terms of throughput, scalability and reliability, ActiveMQ currently outperforms RabbitMQ for messaging usage in Python.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2009/10/python-messaging-activemq-and-rabbitmq/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RestyGWT, a Better GWT RPC??</title>
		<link>http://hiramchirino.com/blog/2009/10/restygwt-a-better-gwt-rpc/</link>
		<comments>http://hiramchirino.com/blog/2009/10/restygwt-a-better-gwt-rpc/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 23:50:38 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[resty-gwt]]></category>
		<category><![CDATA[rpc]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/blog/?p=63</guid>
		<description><![CDATA[If your familiar with GWT RPC, then you you know that it&#8217;s it&#8217;s provides a very nice client side framework for doing AJAX requests against Java Servlets.  The sad part is that it uses a binary protocol.  That protocol is not easily understood by other languages or frameworks. Counter that with latest AJAX rage, RESTful [...]]]></description>
			<content:encoded><![CDATA[<p>If your familiar with <a href="http://code.google.com/webtoolkit/doc/1.6/DevGuideServerCommunication.html#DevGuideRemoteProcedureCalls" onclick="pageTracker._trackPageview('/outgoing/code.google.com/webtoolkit/doc/1.6/DevGuideServerCommunication.html_DevGuideRemoteProcedureCalls?referer=');">GWT RPC</a>, then you you know that it&#8217;s it&#8217;s provides a very nice client side framework for doing AJAX requests against Java Servlets.  The sad part is that it uses a binary protocol.  That protocol is not easily understood by other languages or frameworks.</p>
<p>Counter that with latest AJAX rage, RESTful services with a JSON or XML representation of the data.  The nice thing about using JSON with REST services is that clients and servers can easily be built it any language.  Wouldn&#8217;t it be nice if you use JSON RESTful services from GWT with the ease of GWT RPC?</p>
<p>That&#8217;s exactly the reason I started hacking on <a href="http://github.com/chirino/resty-gwt" onclick="pageTracker._trackPageview('/outgoing/github.com/chirino/resty-gwt?referer=');">RestyGWT</a>.  It uses a very similar development model as GWT RPC.  You create a service interface who&#8217;s implementation is code generated via Deferred Binding when your GWT module is built.  The developer maps the interface methods to RESTful HTTP requests using the excelent <a href="https://jsr311.dev.java.net/nonav/releases/1.0/index.html" onclick="pageTracker._trackPageview('/outgoing/jsr311.dev.java.net/nonav/releases/1.0/index.html?referer=');">JAX-RS</a> annotations.  Just like in GWT RPC, the interface must be &#8216;asynchronous&#8217;.  You must use callback method arguments to get the request results.  But unlike GWT RPC, the data sent and received will be JSON encoded.  <a href="http://github.com/chirino/resty-gwt" onclick="pageTracker._trackPageview('/outgoing/github.com/chirino/resty-gwt?referer=');">RestyGWT</a> will automatically code generate JSON encoders and decoders for any classes sent or received from the rest service.</p>
<p>For more details see the Git Hub home page at: <a href="http://github.com/chirino/resty-gwt" onclick="pageTracker._trackPageview('/outgoing/github.com/chirino/resty-gwt?referer=');">http://github.com/chirino/resty-gwt</a></p>
<p>As of this point, RestyGWT only implements the most basic JAX-RS annotations and provides a very simple JSON encoding scheme.  Despite that, the project is already extremely useful.  I would love here what folks think about it.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2009/10/restygwt-a-better-gwt-rpc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RMI via JMS 1.0 Released!</title>
		<link>http://hiramchirino.com/blog/2009/10/rmi-via-jms-1-0-released/</link>
		<comments>http://hiramchirino.com/blog/2009/10/rmi-via-jms-1-0-released/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 20:28:26 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Integration]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jms]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[remoting]]></category>
		<category><![CDATA[rmi]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/blog/?p=61</guid>
		<description><![CDATA[I&#8217;m pleased to announce the release of RMI via JMS 1.0!  RMI via JMS allows you do RMI style remoting over any JMS provider.  It combines the ease of RMI development with flexibility and loose coupling that JMS provides. It also supports and even simpler interface remoting model which does not mandate the throwing of [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m pleased to announce the release of <a href="http://rmiviajms.fusesource.org/repo/release/org/fusesource/rmiviajms/rmiviajms/1.0/rmiviajms-1.0.jar" onclick="pageTracker._trackPageview('/outgoing/rmiviajms.fusesource.org/repo/release/org/fusesource/rmiviajms/rmiviajms/1.0/rmiviajms-1.0.jar?referer=');">RMI via JMS 1.0</a>!  <a href="http://rmiviajms.fusesource.org/index.html" onclick="pageTracker._trackPageview('/outgoing/rmiviajms.fusesource.org/index.html?referer=');">RMI via JMS</a> allows you do RMI style remoting over any JMS provider.  It combines the ease of <a href="http://java.sun.com/docs/books/tutorial/rmi/index.html" onclick="pageTracker._trackPageview('/outgoing/java.sun.com/docs/books/tutorial/rmi/index.html?referer=');">RMI development</a> with flexibility and loose coupling that <a href="http://java.sun.com/products/jms/tutorial/1_3_1-fcs/doc/jms_tutorialTOC.html" onclick="pageTracker._trackPageview('/outgoing/java.sun.com/products/jms/tutorial/1_3_1-fcs/doc/jms_tutorialTOC.html?referer=');">JMS</a> provides.</p>
<p>It also supports and even simpler interface remoting model which does not mandate the throwing of <code>RemoteException</code> or extending the <code>RemoteObject</code> interfaces.  It even allows remoting classes which don&#8217;t implement any interfaces via ASM magic.</p>
<p>Documentation still needs a little work, but the project is now <a href="http://www.apache.org/licenses/LICENSE-2.0.html" onclick="pageTracker._trackPageview('/outgoing/www.apache.org/licenses/LICENSE-2.0.html?referer=');">ASL 2.0 Licensed</a> and looking for contributions!  Please join the <a href="http://rmiviajms.fusesource.org/community.html" onclick="pageTracker._trackPageview('/outgoing/rmiviajms.fusesource.org/community.html?referer=');">mailing lists</a> to get involved.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2009/10/rmi-via-jms-1-0-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Blogware Switch</title>
		<link>http://hiramchirino.com/blog/2009/09/blogware-switch/</link>
		<comments>http://hiramchirino.com/blog/2009/09/blogware-switch/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 18:29:05 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/blog/?p=36</guid>
		<description><![CDATA[Changed the blog over to WordPress from Blogger.  I am impressed how polished this app is.  Who would have thought a PHP app could get this good?]]></description>
			<content:encoded><![CDATA[<p><a href="wordpress.org"><img style="float:left; padding: 0 10px 10px 0" title="WordPress Logo" src="http://img.skitch.com/20090922-g543hs76g9yfp4p42a8xx5hpx8.png" alt="WordPress" width="105" height="66" /></a> Changed the blog over to WordPress from Blogger.  I am impressed how polished this app is.  Who would have thought a PHP app could get this good?</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2009/09/blogware-switch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>STOMP Clarification</title>
		<link>http://hiramchirino.com/blog/2009/09/stomp-clarification/</link>
		<comments>http://hiramchirino.com/blog/2009/09/stomp-clarification/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 13:22:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Messaging]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[stomp]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2009/09/stomp-clarification/</guid>
		<description><![CDATA[I just saw a tweet which demonstrates that the STOMP spec still needs more clarification. I think Brian McCallister, the founding architect of protocol, will agree that one of the tenets of the protocol was for it to be simple enough to even use by user which directly connects to a server via telnet. And [...]]]></description>
			<content:encoded><![CDATA[<p>I just saw a <a href="https://twitter.com/benjaminws/statuses/4112169015" onclick="pageTracker._trackPageview('/outgoing/twitter.com/benjaminws/statuses/4112169015?referer=');">tweet</a> which demonstrates that the <a href="http://activemq.apache.org/stomp/stomp10/specification.html" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/stomp/stomp10/specification.html?referer=');">STOMP spec</a> still needs more clarification.  I think <a href="http://skife.org/" onclick="pageTracker._trackPageview('/outgoing/skife.org/?referer=');">Brian McCallister</a>, the founding architect of protocol, will agree that one of the tenets of the protocol was for it to be simple enough to even use by user which directly connects to a server via telnet.</p>
<p>And to support that use case, newlines after the frame terminator are a natural occurrence.  But it might be easier to describe it as:
<ul>
<li>A stomp frame may have zero or more newlines preceding it&#8217;s command verb.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2009/09/stomp-clarification/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ActiveMQ Protobuf Implemtation Features</title>
		<link>http://hiramchirino.com/blog/2009/09/activemq-protobuf-implemtation-features/</link>
		<comments>http://hiramchirino.com/blog/2009/09/activemq-protobuf-implemtation-features/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 17:57:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[protobuf]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2009/09/activemq-protobuf-implemtation-features/</guid>
		<description><![CDATA[I promised I would follow up on my previous post on how the &#8220;The ActiveMQ Protobuf Implementation Rocks!&#8221;. So you might be asking yourself, what&#8217;s the secret sauce? Well before I get into that, let me first explain the class model that our proto compiler generates. For every message definition in the &#8216;.proto&#8217; file, the [...]]]></description>
			<content:encoded><![CDATA[<p>I promised I would follow up on my previous post on how the <a href="http://hiramchirino.com/blog/2009/09/the-activemq-protobuf-implementation-rocks">&#8220;The ActiveMQ Protobuf Implementation Rocks!&#8221;.</a></p>
<p>So you might be asking yourself, what&#8217;s the secret sauce? Well before I get into that, let me first explain the class model that our proto compiler generates.</p>
<p>For every message definition in the &#8216;.proto&#8217; file, the compiler will generate 3 classes:
<ul>
<li>the message interface: is implemented by the bean and buffer classes.  It has all the &#8216;getters&#8217;.</li>
<li>the bean class: has all the &#8216;setters&#8217; and &#8216;merge&#8217; methods</li>
<li>the buffer class: has all the encoding and decoding methods.  It does not allow mutation.</li>
</ul>
<p>The message interface also defines the freeze(), frozen(), and copy() methods which allow you to make an instance immutable, check to see if an instance is immutable, and create a mutable copy.  Buffer classes are alway immutable.  Bean class can transition to being immutable via freeze().  freeze() naturally returns a buffer object.  copy() naturally returns a bean object.</p>
<p>This bean model gives substantial flexibility.  Besides making it easy to transition from immutable to mutable and back, the message interface lets you implement business methods that operate against either type of instance.  You could use the bean class purely in a builder style to always generate a buffer instance, or you could just use them like traditional java bean objects.</p>
<p>Once a bean instance is frozen, any attempts to modify the instance will throw assertion errors if assertions are enabled in your JVM.  So the CPU cost of validating program correctness can can be disabled at run time.</p>
<p>Finally, the most important feature of the buffer class is that it holds on to either the byte array that it was created from or the frozen bean that created it, and sometimes both, after it builds one from the other.  This has several implications.  Firstly, once a buffer is encoded to a byte[], subsequent encoding passes are free.  This is also true when a buffer is decoded, as the next encoding is free since it still retains the original encoding of the message.  And the other benefit that this provides which the benchmark highlighted, is that deferred decoding is possible.  A newly created buffer class will not decode the data until a field is accessed.  This also true of the nested messages that are encoded in a buffer.  While the outer message may get decoded, the nested message will not be decoded until it&#8217;s fields are accessed.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2009/09/activemq-protobuf-implemtation-features/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The ActiveMQ Protobuf Implementation Rocks!</title>
		<link>http://hiramchirino.com/blog/2009/09/the-activemq-protobuf-implementation-rocks/</link>
		<comments>http://hiramchirino.com/blog/2009/09/the-activemq-protobuf-implementation-rocks/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 05:15:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[protobuf]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2009/09/the-activemq-protobuf-implementation-rocks/</guid>
		<description><![CDATA[While reading Comparing the Java Serialization Options I ran across the a cool google code project which has done an excellent job benchmarking a wide variety of serialization options for java. I&#8217;ve had been researching the protobuf encoding format for a while and really liked it. But I did not really like the Java implementation [...]]]></description>
			<content:encoded><![CDATA[<p>While reading <a href="http://www.theserverside.com/news/thread.tss?thread_id=57871" onclick="pageTracker._trackPageview('/outgoing/www.theserverside.com/news/thread.tss?thread_id=57871&amp;referer=');">Comparing the Java Serialization Options</a> I ran across the a <a href="http://code.google.com/p/thrift-protobuf-compare/" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/thrift-protobuf-compare/?referer=');">cool google code project</a> which has done an excellent job <a href="http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking?ts=1237772203&amp;updated=Benchmarking" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking?ts=1237772203_amp_updated=Benchmarking&amp;referer=');">benchmarking</a> a wide variety of serialization options for java.</p>
<p>I&#8217;ve had been researching the <span class="blsp-spelling-error" id="SPELLING_ERROR_0">protobuf</span> encoding format for a while and really liked it.  But I did not really like the Java implementation that Google had published.  It was kinda clunky to use and I saw several optimizations that could be used that were missing.  Optimizations that could create huge performance wins when applied to the usage patterns of an enterprise messaging system like <a href="http://activemq.apache.org/" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/?referer=');">Apache <span class="blsp-spelling-error" id="SPELLING_ERROR_1">ActiveMQ</span></a>.  So I created<a href="http://svn.apache.org/repos/asf/activemq/sandbox/activemq-flow/activemq-protobuf/" onclick="pageTracker._trackPageview('/outgoing/svn.apache.org/repos/asf/activemq/sandbox/activemq-flow/activemq-protobuf/?referer=');"> a new <span class="blsp-spelling-error" id="SPELLING_ERROR_2">protobuf</span> implementation</a> in the <span class="blsp-spelling-error" id="SPELLING_ERROR_3">ActiveMQ</span> project.</p>
<p>Naturally, I was curious to see how the <span class="blsp-spelling-error" id="SPELLING_ERROR_4">activemq</span> <span class="blsp-spelling-error" id="SPELLING_ERROR_5">protobuf</span> implementation stacked up against similar technologies.  So I grabbed the V1 benchmark source code and added our implementation to it.  If you want to do the same, apply <a href="http://code.google.com/p/thrift-protobuf-compare/issues/detail?id=8" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/thrift-protobuf-compare/issues/detail?id=8&amp;referer=');">this patch</a>.</p>
<p>Once I ran the benchmark and I was very pleased with the results.  I&#8217;m including the performance graphs of our <span class="blsp-spelling-error" id="SPELLING_ERROR_6">impl</span> and standard <span class="blsp-spelling-error" id="SPELLING_ERROR_7">protobuf</span> and thrift for comparison.</p>
<p><img src="http://chart.apis.google.com/chart?chtt=timeCreate&amp;chf=c%7C%7Clg%7C%7C0%7C%7CFFFFFF%7C%7C1%7C%7C76A4FB%7C%7C0%7Cbg%7C%7Cs%7C%7CEFEFEF&amp;chs=400x100&amp;chd=t:246.79,208.72,304.14&amp;chds=0,506&amp;chxl=0:%7Cprotobuf%7Cthrift%7Cactivemq%20protobuf&amp;lklk&amp;chdlp=t&amp;chco=660000%7C660033%7C660066%7C660099%7C6600CC%7C6600FF%7C663300%7C663333%7C663366%7C663399%7C6633CC%7C6633FF%7C666600%7C666633%7C666666&amp;cht=bhg&amp;chbh=10&amp;chxt=y&amp;nonsense=aaa.png" /></p>
<p><img src="http://chart.apis.google.com/chart?chtt=timeSer&amp;chf=c%7C%7Clg%7C%7C0%7C%7CFFFFFF%7C%7C1%7C%7C76A4FB%7C%7C0%7Cbg%7C%7Cs%7C%7CEFEFEF&amp;chs=400x100&amp;chd=t:3087.0,3121.5,3205.0&amp;chds=0,6274&amp;chxl=0:%7Cprotobuf%7Cthrift%7Cactivemq%20protobuf&amp;lklk&amp;chdlp=t&amp;chco=660000%7C660033%7C660066%7C660099%7C6600CC%7C6600FF%7C663300%7C663333%7C663366%7C663399%7C6633CC%7C6633FF%7C666600%7C666633%7C666666&amp;cht=bhg&amp;chbh=10&amp;chxt=y&amp;nonsense=aaa.png" /></p>
<p><img src="http://chart.apis.google.com/chart?chtt=timeDSer&amp;chf=c%7C%7Clg%7C%7C0%7C%7CFFFFFF%7C%7C1%7C%7C76A4FB%7C%7C0%7Cbg%7C%7Cs%7C%7CEFEFEF&amp;chs=400x100&amp;chd=t:53.5,3231.0,1936.5&amp;chds=0,3480&amp;chxl=0:%7Cprotobuf%7Cthrift%7Cactivemq%20protobuf&amp;lklk&amp;chdlp=t&amp;chco=660000%7C660033%7C660066%7C660099%7C6600CC%7C6600FF%7C663300%7C663333%7C663366%7C663399%7C6633CC%7C6633FF%7C666600%7C666633%7C666666&amp;cht=bhg&amp;chbh=10&amp;chxt=y&amp;nonsense=aaa.png" /></p>
<p><img src="http://chart.apis.google.com/chart?chtt=totalTime&amp;chf=c%7C%7Clg%7C%7C0%7C%7CFFFFFF%7C%7C1%7C%7C76A4FB%7C%7C0%7Cbg%7C%7Cs%7C%7CEFEFEF&amp;chs=400x100&amp;chd=t:3387.29,6561.219999999999,5445.639999999999&amp;chds=0,10262&amp;chxl=0:%7Cprotobuf%7Cthrift%7Cactivemq%20protobuf&amp;lklk&amp;chdlp=t&amp;chco=660000%7C660033%7C660066%7C660099%7C6600CC%7C6600FF%7C663300%7C663333%7C663366%7C663399%7C6633CC%7C6633FF%7C666600%7C666633%7C666666&amp;cht=bhg&amp;chbh=10&amp;chxt=y&amp;nonsense=aaa.png" /></p>
<p>As it turns out, our implementation looks <span class="blsp-spelling-corrected" id="SPELLING_ERROR_8">awesome</span> in the benchmark! How about that decoding<span class="blsp-spelling-error" id="SPELLING_ERROR_9"></span> speed!</p>
<p>It&#8217;s getting late here.. so I&#8217;ll have do a follow up post explaining how come we did so much better.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2009/09/the-activemq-protobuf-implementation-rocks/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Openwire Python Client for ActiveMQ</title>
		<link>http://hiramchirino.com/blog/2009/07/openwire-python-client-for-activemq/</link>
		<comments>http://hiramchirino.com/blog/2009/07/openwire-python-client-for-activemq/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 14:46:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Messaging]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[openwire]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2009/07/openwire-python-client-for-activemq/</guid>
		<description><![CDATA[Wow, I can&#8217;t believe I missed it. Python lovers rejoice! Seems some good folks have created a python client for ActiveMQ which is using the very robust ActiveMQ C++ client. And for those of you on Ubuntu, Dejan Bosanac has put together an excellent guide on how to build it on ubuntu.]]></description>
			<content:encoded><![CDATA[<p>Wow, I can&#8217;t believe I missed it.  Python lovers rejoice!  Seems some good folks have created a <a href="http://code.google.com/p/pyactivemq/" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/pyactivemq/?referer=');">python client</a> for <a href="http://activemq.apache.org/" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/?referer=');">ActiveMQ</a> which is using the very robust <a href="http://activemq.apache.org/cms/" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/cms/?referer=');">ActiveMQ C++ client</a>.</p>
<p>And for those of you on Ubuntu, <a href="http://www.nighttale.net/about/" onclick="pageTracker._trackPageview('/outgoing/www.nighttale.net/about/?referer=');">Dejan Bosanac</a> has put together an excellent guide on <a href="http://www.nighttale.net/activemq/pyactivemq-on-ubuntu.html" onclick="pageTracker._trackPageview('/outgoing/www.nighttale.net/activemq/pyactivemq-on-ubuntu.html?referer=');">how to build it on ubuntu</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2009/07/openwire-python-client-for-activemq/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jansi &#8211; Bringing ANSI Support to Java on Windows</title>
		<link>http://hiramchirino.com/blog/2009/07/jansi-bringing-ansi-support-to-java-on-windows/</link>
		<comments>http://hiramchirino.com/blog/2009/07/jansi-bringing-ansi-support-to-java-on-windows/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 14:37:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[ansi]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2009/07/jansi-bringing-ansi-support-to-java-on-windows/</guid>
		<description><![CDATA[Last weekend I got a little spare time an through together a small little library while should help with the problem of boring Java console applications on Windows. It&#8217;s called Jansi and it provides support for using ANSI escape sequences in your Java console applications on Windows. With ANSI escape sequences, you can fully control [...]]]></description>
			<content:encoded><![CDATA[<p>Last weekend I got a little spare time an through together a small little library while should help with the problem of boring Java console applications on Windows.
<p>It&#8217;s called <a href="http://jansi.fusesource.org/" onclick="pageTracker._trackPageview('/outgoing/jansi.fusesource.org/?referer=');">Jansi</a> and it provides support for using <a href="http://en.wikipedia.org/wiki/ANSI_escape_code" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/ANSI_escape_code?referer=');">ANSI escape sequences</a> in your Java console applications on Windows.
<p>With ANSI escape sequences, you can fully control the the cursor positioning and the foreground and background color of the console text output.  Here is quick example of what&#8217;s posssible:
<p><img src="http://jansi.fusesource.org/images/after-jansi-jna-windows.png"/></p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2009/07/jansi-bringing-ansi-support-to-java-on-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Checksum Plugin</title>
		<link>http://hiramchirino.com/blog/2008/08/new-checksum-plugin/</link>
		<comments>http://hiramchirino.com/blog/2008/08/new-checksum-plugin/#comments</comments>
		<pubDate>Sat, 02 Aug 2008 15:18:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[checksum maven-plugin]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2008/08/new-checksum-plugin/</guid>
		<description><![CDATA[So in my last post I was suggesting making it easier to include dependency checksums as part of a maven build. I decided that it should be simple enough to implement this as a Maven Plugin. For those of you interested, you can get the source to the new Checksum Plugin here. The basic problem [...]]]></description>
			<content:encoded><![CDATA[<p>So in <a href="http://hiramchirino.com/blog/2008/07/comments-on-maven-repository-security.html">my last post</a> I was suggesting making it easier to include dependency checksums as part of a maven build.  I decided that it should be simple enough to implement this as a Maven Plugin.  For those of you interested, you can get the source to the <a href="https://svn.apache.org/repos/asf/servicemix/maven-plugins/checksum-maven-plugin/trunk" onclick="pageTracker._trackPageview('/outgoing/svn.apache.org/repos/asf/servicemix/maven-plugins/checksum-maven-plugin/trunk?referer=');">new Checksum Plugin here</a>.</p>
<p>The basic problem the plugin is trying to solve is that it is possible that central repositories get hacked and the artifacts/dependencies of our builds get replaced with<br />malicious versions.  Right now we have no way to easily detect that<br />and we could potential create a release build of a project which<br />bundles one of those malicious dependencies.  In practice this rarely<br />occurs, but it&#8217;s not out of the realm of possibilities. </p>
<p>Basically the plugin supports generating a checksum.txt file that is included as part of the project build. This file holds all the checksums for the dependencies (including the dependencies&#8217; pom checksum).  Generating/updating is induced via the use of a maven profile.  This is only done when dependencies get updated.</p>
<p>In a normal build the plugin just validates the checksums of the downloaded dependencies against those stored in the checksum.txt file.</p>
<p>I wish I could move up the validation of the dependencies from their current maven life cycle locations, but it seems you can&#8217;t get the list of dependencies it gets moved up any more.  Any maven mojo hackers have any work arounds for that?</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2008/08/new-checksum-plugin/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Comments on the Maven Repository Security Proposal</title>
		<link>http://hiramchirino.com/blog/2008/07/comments-on-the-maven-repository-security-proposal/</link>
		<comments>http://hiramchirino.com/blog/2008/07/comments-on-the-maven-repository-security-proposal/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 20:07:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2008/07/comments-on-the-maven-repository-security-proposal/</guid>
		<description><![CDATA[For those of you who don&#8217;t know, Maven is an awesome build tool. It uses centralized repositories to share build artifacts. Right now there is a problem, where if a repository is hacked, malicious code could be injected into those artifacts and distributed by other builds. Lots of folks object to using maven solely due [...]]]></description>
			<content:encoded><![CDATA[<p>For those of you who don&#8217;t know, Maven is an awesome build tool.  It uses centralized repositories to share build artifacts.  Right now there is a problem, where if a repository is hacked, malicious code could be injected into those artifacts and distributed by other builds.  Lots of folks <a href="https://issues.apache.org/jira/browse/HADOOP-3302" onclick="pageTracker._trackPageview('/outgoing/issues.apache.org/jira/browse/HADOOP-3302?referer=');">object to using maven</a> solely due to this possibility.  It&#8217;s a good thing that the maven teams seems to be working on fix those problems.</p>
<p>First off, I love the <a href="http://docs.codehaus.org/display/MAVEN/Repository+Security" onclick="pageTracker._trackPageview('/outgoing/docs.codehaus.org/display/MAVEN/Repository+Security?referer=');">Maven Repository Security Proposal</a>.  I think that the &#8216;Specified Checksums&#8217; idea is awesome.  I think it needs to be made so easy to use that folks always use it.  Right now it&#8217;s a little ugly because it makes the dependency declaration much more verbose.  Plus it does not seem to cover transitive dependencies that are being used during the build, and I think that those checksums NEED to be included too.</p>
<p>I think that what would be better is if maven provided the tools to update the checksum information in the pom.</p>
<p>Lets say that a build for a module is setup in some strict mode where only artifacts with known checksums are allowed.  If the pom is updated to add a new dependency, I think there should be some maven command which automatically adds the checksum for the new dependency (and transitive dependencies).  Artifacts that are signed with a trusted key get added without prompting, and a confirmation prompt would be given for artifacts that are not GPG trusted.</p>
<p>So the question is why go through all that trouble?  So that folks get a trusted source distribution (out of SCM or a signed tar ball), can do a build and have a high level of guarantee that the dependencies that are being used in the source build match what was intended by the developers of the source distribution.  Furthermore, it will not matter if the transitive dependencies are signed and have keys in the end user&#8217;s keyring since all the checksums are include in the build.</p>
<p>Now, since there could be lots of dependencies in a build, due to the use of build plugins and transitive dependencies, it might be worth storing the checksum data in a file external to pom.xml, or at least in a different xml section from the dependencies declaration.</p>
<p>Things to think about: Having SNAPSHOT dependencies in the build could complicate things, as the build would be tied to a particular SNAPSHOT/checksum, but maybe that&#8217;s a good thing.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2008/07/comments-on-the-maven-repository-security-proposal/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Keep an eye out for ZooKeeper</title>
		<link>http://hiramchirino.com/blog/2008/07/keep-an-eye-out-for-zookeeper/</link>
		<comments>http://hiramchirino.com/blog/2008/07/keep-an-eye-out-for-zookeeper/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 19:04:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Integration]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[zookeeper]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2008/07/keep-an-eye-out-for-zookeeper/</guid>
		<description><![CDATA[Wow, I love the simplicity that ZooKeeper brings to a really hard set of distributed problems. Check out this Introductory Video that explains it more in depth. Basically group leadership/coordination and cluster wide configuration issues are taken care of if you Use ZooKeeper. Oh and it&#8217;s an Apache Project now. Yay! Seems like the project [...]]]></description>
			<content:encoded><![CDATA[<p>Wow, I love the simplicity that ZooKeeper brings to a really hard set of distributed problems.  Check out this <a href="http://developer.yahoo.com/blogs/hadoop/2008/03/intro-to-zookeeper-video.html" onclick="pageTracker._trackPageview('/outgoing/developer.yahoo.com/blogs/hadoop/2008/03/intro-to-zookeeper-video.html?referer=');">Introductory Video</a> that explains it more in depth.  Basically group leadership/coordination and cluster wide configuration issues are taken care of if you Use ZooKeeper. </p>
<p>Oh and it&#8217;s an Apache Project now.  Yay!  Seems like the project website is still not fully setup since they are migrating from SourceForge to Apache, be here&#8217;s a link to the <a href="https://svn.apache.org/repos/asf/hadoop/zookeeper/trunk" onclick="pageTracker._trackPageview('/outgoing/svn.apache.org/repos/asf/hadoop/zookeeper/trunk?referer=');">source tree</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2008/07/keep-an-eye-out-for-zookeeper/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TODO: Double Write Buffers</title>
		<link>http://hiramchirino.com/blog/2008/07/todo-double-write-buffers/</link>
		<comments>http://hiramchirino.com/blog/2008/07/todo-double-write-buffers/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 18:57:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Messaging]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[kahadb]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2008/07/todo-double-write-buffers/</guid>
		<description><![CDATA[Note to self: investigate implementing the Double Write Buffers idea in ActiveMQ. ActiveMQ keeps several indexes into the persistent messages that it&#8217;s holding and when ActiveMQ is shutdown ungracefully, we rebuild the indexes from the data logs due to them being in inconsistent state. If your queueing up millions of messages, building those indexes can [...]]]></description>
			<content:encoded><![CDATA[<p>Note to self: investigate implementing the <a href="http://www.mysqlperformanceblog.com/2006/08/04/innodb-double-write/" onclick="pageTracker._trackPageview('/outgoing/www.mysqlperformanceblog.com/2006/08/04/innodb-double-write/?referer=');">Double Write Buffers</a> idea in ActiveMQ.  ActiveMQ keeps several indexes into the persistent messages that it&#8217;s holding and when ActiveMQ is shutdown ungracefully, we rebuild the indexes from the data logs due to them being in inconsistent state.  If your queueing up millions of messages, building those indexes can take a long time.</p>
<p>Double buffering may allow us fix inconistencies in those index and gets us running faster..</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2008/07/todo-double-write-buffers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ActiveMQ/SpecJMS/Camel Webinar</title>
		<link>http://hiramchirino.com/blog/2008/06/activemqspecjmscamel-webinar/</link>
		<comments>http://hiramchirino.com/blog/2008/06/activemqspecjmscamel-webinar/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 19:30:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Integration]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[camel]]></category>
		<category><![CDATA[specjms]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2008/06/activemqspecjmscamel-webinar/</guid>
		<description><![CDATA[Whoa, time flies by, and I forgot to post about the upcoming webinar that I will be co-hosting with Rob Davies on June 10th. We will be covering some messaging basics, introducing Apache ActiveMQ and Apache Camel to the audience, but most interesting I think will be the section where Rob will be covering the [...]]]></description>
			<content:encoded><![CDATA[<p>Whoa, time flies  by, and I forgot to post about the <a href="https://cc.readytalk.com/cc/schedule/display.do?rfe=ub5sdagy3uis&amp;udc=ueryf6x63zus" onclick="pageTracker._trackPageview('/outgoing/cc.readytalk.com/cc/schedule/display.do?rfe=ub5sdagy3uis_amp_udc=ueryf6x63zus&amp;referer=');">upcoming webinar</a> that I will be co-hosting with <a href="http://rajdavies.blogspot.com/" onclick="pageTracker._trackPageview('/outgoing/rajdavies.blogspot.com/?referer=');">Rob Davies</a> on June 10th.  We will be covering some messaging basics, introducing Apache ActiveMQ and Apache Camel to the audience, but most interesting I think will be the section where Rob will be covering the results that IONA has been seeing benchmarking ActiveMQ against the SpecJMS2007 test suite.  I totally agree with <a href="http://rajdavies.blogspot.com/2008/05/specjms2007-using-activemq.html" onclick="pageTracker._trackPageview('/outgoing/rajdavies.blogspot.com/2008/05/specjms2007-using-activemq.html?referer=');">Rob&#8217;s comment </a>that &#8220;An independent benchmark is important, because it negates the chance to skew  home groan tests to a vendor&#8217;s strengths.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2008/06/activemqspecjmscamel-webinar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>InfoQ Covers ActiveMQ 5.1 Release</title>
		<link>http://hiramchirino.com/blog/2008/05/infoq-covers-activemq-5-1-release/</link>
		<comments>http://hiramchirino.com/blog/2008/05/infoq-covers-activemq-5-1-release/#comments</comments>
		<pubDate>Thu, 29 May 2008 19:51:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Messaging]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2008/05/infoq-covers-activemq-5-1-release/</guid>
		<description><![CDATA[InfoQ has posted nice article on the new features in the ActiveMQ 5.1 release versus the last 4.1 release: Apache ActiveMQ, an open source provider of enterprise messaging services, recently released version 5.1 which includes improvements in stability and performance of the message broker product. This version also includes support for priority message ordering and [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.infoq.com/news/2008/05/activemq-5.1-release;jsessionid=BFD02D79FC579EDFABD675E93D11BC13" onclick="pageTracker._trackPageview('/outgoing/www.infoq.com/news/2008/05/activemq-5.1-release_jsessionid=BFD02D79FC579EDFABD675E93D11BC13?referer=');">InfoQ</a> has posted nice article on the new features in the ActiveMQ 5.1 release versus the last 4.1 release:<br />
<blockquote>
<p><a href="http://activemq.apache.org/" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/?referer=');">Apache ActiveMQ</a>, an open source provider of enterprise messaging services, recently released <a href="http://activemq.apache.org/activemq-510-release.html" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/activemq-510-release.html?referer=');">version 5.1</a> which includes improvements in stability and performance of the message broker product. This version also includes support for priority message ordering and a Microsoft Message Queue (<a href="http://www.microsoft.com/windowsserver2003/technologies/msmq/default.mspx" onclick="pageTracker._trackPageview('/outgoing/www.microsoft.com/windowsserver2003/technologies/msmq/default.mspx?referer=');">MSMQ</a>) to ActiveMQ Bridge with the new <a href="http://cwiki.apache.org/confluence/display/CAMEL/msmq" onclick="pageTracker._trackPageview('/outgoing/cwiki.apache.org/confluence/display/CAMEL/msmq?referer=');">msmq</a> transport component. </p>
<p>There are also improvements in the <a href="http://activemq.apache.org/how-can-i-monitor-activemq.html" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/how-can-i-monitor-activemq.html?referer=');">monitoring</a> module of ActiveMQ container. A new DestinationSource class was added to access the available <a href="http://java.sun.com/javaee/5/docs/api/javax/jms/Queue.html" onclick="pageTracker._trackPageview('/outgoing/java.sun.com/javaee/5/docs/api/javax/jms/Queue.html?referer=');">Queues</a> or <a href="http://java.sun.com/javaee/5/docs/api/javax/jms/Topic.html" onclick="pageTracker._trackPageview('/outgoing/java.sun.com/javaee/5/docs/api/javax/jms/Topic.html?referer=');">Topics</a> or listen to Queues/Topics being created or deleted in the container. There is a new <a href="http://activemq.apache.org/maven/activemq-core/apidocs/org/apache/activemq/broker/region/DestinationStatistics.html" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/maven/activemq-core/apidocs/org/apache/activemq/broker/region/DestinationStatistics.html?referer=');">API</a> to help end users view available destinations and query them to find JMS statistics such as active queue count, queue depth, number of messages etc.</p>
<p><a href="http://www.infoq.com/news/2008/05/activemq-5.1-release;jsessionid=BFD02D79FC579EDFABD675E93D11BC13" onclick="pageTracker._trackPageview('/outgoing/www.infoq.com/news/2008/05/activemq-5.1-release_jsessionid=BFD02D79FC579EDFABD675E93D11BC13?referer=');">Read More&#8230;</a></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2008/05/infoq-covers-activemq-5-1-release/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ActiveMQ 5.1.0 Release</title>
		<link>http://hiramchirino.com/blog/2008/05/activemq-5-1-0-release/</link>
		<comments>http://hiramchirino.com/blog/2008/05/activemq-5-1-0-release/#comments</comments>
		<pubDate>Wed, 07 May 2008 16:56:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2008/05/activemq-5-1-0-release/</guid>
		<description><![CDATA[For all of you who ran into issues with ActiveMQ 5.0.0 when running it in anger, I highly recommend you give the just released ActiveMQ 5.1.0 a try. This release focused focused on making the broker rock solid. It resolved several bugs which only reared their heads in high load situations. Memory leaks have been [...]]]></description>
			<content:encoded><![CDATA[<p>For all of you who ran into issues with <a href="http://activemq.apache.org/" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/?referer=');">ActiveMQ</a> 5.0.0 when running it in anger, I highly recommend you give the just <a href="http://activemq.apache.org/activemq-510-release.html" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/activemq-510-release.html?referer=');">released ActiveMQ 5.1.0</a> a try.  This release focused focused on making the broker rock solid.  It resolved several bugs which only reared their heads in high load situations.  Memory leaks have been squashed and performance has even improved in several areas. </p>
<p>Even if you have not had seen any issues with your 5.0.0 installation, I&#8217;d highly recommend you upgrade to 5.1.0 to avoid running into <a href="http://issues.apache.org/activemq/secure/ReleaseNote.jspa?version=11802&amp;styleName=Html&amp;projectId=10520&amp;Create=Create" onclick="pageTracker._trackPageview('/outgoing/issues.apache.org/activemq/secure/ReleaseNote.jspa?version=11802_amp_styleName=Html_amp_projectId=10520_amp_Create=Create&amp;referer=');">some of the bugs</a> that have been addressed in the release.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2008/05/activemq-5-1-0-release/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mulitcast not working on a Linux box?</title>
		<link>http://hiramchirino.com/blog/2008/04/mulitcast-not-working-on-a-linux-box/</link>
		<comments>http://hiramchirino.com/blog/2008/04/mulitcast-not-working-on-a-linux-box/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 17:59:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Messaging]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[mutlticast]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2008/04/mulitcast-not-working-on-a-linux-box/</guid>
		<description><![CDATA[Just ran into a problem where some mutlicast tests were failing on a linux box and I could not figure out why. Did a little bit of research and found out that you may need to add a route for it first. So if you have this problem try running: route add 224.0.0.0 netmask 240.0.0.0 [...]]]></description>
			<content:encoded><![CDATA[<p>Just ran into a problem where some mutlicast tests were failing on a linux box and I could not figure out why.  Did a little bit of research and found out that you may need to add a route for it first.  So if you have this problem try running:<br />
<blockquote>route add 224.0.0.0 netmask 240.0.0.0 dev eth0</p></blockquote>
<p>or if you have an older version of linux like me:<br />
<blockquote>route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2008/04/mulitcast-not-working-on-a-linux-box/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More ActiveMQ Fanfare</title>
		<link>http://hiramchirino.com/blog/2008/01/more-activemq-fanfare/</link>
		<comments>http://hiramchirino.com/blog/2008/01/more-activemq-fanfare/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 14:59:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Messaging]]></category>
		<category><![CDATA[activemq]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2008/01/more-activemq-fanfare/</guid>
		<description><![CDATA[Nice to see the new year starting off right. I Noticed this post over at the eaimatrix.com: A plethora of message queuing products exist in today&#8217;s EAI market, all aimed at providing solutions to the problem of application integration. Few can however lay as much claim to fame as ActiveMQ, an open source Message Broker [...]]]></description>
			<content:encoded><![CDATA[<p>Nice to see the new year starting off right.  I Noticed this post over at the eaimatrix.com:</p>
<blockquote><p>A plethora of message queuing products exist in today&#8217;s EAI market, all aimed at providing solutions to the problem of application integration. Few can however  lay as much claim to fame as <a href="http://activemq.apache.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/?referer=');">ActiveMQ</a>, an open source Message Broker and <a href="http://java.sun.com/products/jms/index.jsp" target="_blank" onclick="pageTracker._trackPageview('/outgoing/java.sun.com/products/jms/index.jsp?referer=');">JMS</a>/<a href="http://activemq.apache.org/enterprise-integration-patterns.html" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/enterprise-integration-patterns.html?referer=');">Enterprise Integration Patterns</a> provider which is  licensed, developed and distributed under the open source Apache emblem.  <a href="http://activemq.apache.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/?referer=');">ActiveMQ</a> provides  support for <a href="http://activemq.apache.org/cross-language-clients.html" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/cross-language-clients.html?referer=');">Cross Language Client and Protocols</a> as well as a powerful messaging broker which is supported in Java, C, C++, C#, Ruby, Perl, Python, PHP.</p></blockquote>
<p><a href="http://eaimatrix.com/blogs/eai/archive/2008/01/01/enterprise-messaging-with-activemq.aspx" onclick="pageTracker._trackPageview('/outgoing/eaimatrix.com/blogs/eai/archive/2008/01/01/enterprise-messaging-with-activemq.aspx?referer=');">Read the full article</a> by Ade Ayonrinde.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2008/01/more-activemq-fanfare/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ActiveMQ Webinar</title>
		<link>http://hiramchirino.com/blog/2007/11/activemq-webinar/</link>
		<comments>http://hiramchirino.com/blog/2007/11/activemq-webinar/#comments</comments>
		<pubDate>Tue, 13 Nov 2007 15:29:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Messaging]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[webinar]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2007/11/activemq-webinar/</guid>
		<description><![CDATA[Late notice.. but James and I are doing an ActiveMQ Webinar in an hour and half. Sign up for it and let us know what you thought about it.]]></description>
			<content:encoded><![CDATA[<p>Late notice.. but <a href="http://macstrac.blogspot.com" onclick="pageTracker._trackPageview('/outgoing/macstrac.blogspot.com?referer=');">James</a> and I are doing an <a href="http://open.iona.com/resources/news/#webinar" onclick="pageTracker._trackPageview('/outgoing/open.iona.com/resources/news/_webinar?referer=');">ActiveMQ Webinar</a> in an hour and half.  Sign up for it and let us know what you thought about it.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2007/11/activemq-webinar/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Docbook is dead.. Long live HTML</title>
		<link>http://hiramchirino.com/blog/2007/10/docbook-is-dead-long-live-html/</link>
		<comments>http://hiramchirino.com/blog/2007/10/docbook-is-dead-long-live-html/#comments</comments>
		<pubDate>Tue, 02 Oct 2007 16:22:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[docbook]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[pdf]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2007/10/docbook-is-dead-long-live-html/</guid>
		<description><![CDATA[Yay.. The Apache Camel project has started to generate some beautiful looking PDF documentation from standard HTML by using prince and the Boom style sheet against our wiki. We contacted the Boom folks and they cleared up the license terms of the Boom file so that it&#8217;s officially open source. The Boom folks have relicensed [...]]]></description>
			<content:encoded><![CDATA[<p>Yay.. The <a href="http://activemq.apache.org/camel" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/camel?referer=');">Apache Camel</a> project has started to generate some beautiful looking <a href="http://people.apache.org/%7Echirino/camel-manual-1.1-SNAPSHOT.pdf" onclick="pageTracker._trackPageview('/outgoing/people.apache.org/_7Echirino/camel-manual-1.1-SNAPSHOT.pdf?referer=');">PDF documentation</a> from standard HTML by using <a href="http://www.princexml.com/" onclick="pageTracker._trackPageview('/outgoing/www.princexml.com/?referer=');">prince</a> and the <a href="http://www.alistapart.com/articles/boom" onclick="pageTracker._trackPageview('/outgoing/www.alistapart.com/articles/boom?referer=');">Boom</a> style sheet against our <a href="http://cwiki.apache.org/confluence/display/CAMEL/Index" onclick="pageTracker._trackPageview('/outgoing/cwiki.apache.org/confluence/display/CAMEL/Index?referer=');">wiki</a>.   We contacted the Boom folks and they cleared up the license terms of the Boom file so that it&#8217;s officially open source.  The Boom folks have <a href="http://people.opera.com/howcome/2005/ala/boom-mit.css" onclick="pageTracker._trackPageview('/outgoing/people.opera.com/howcome/2005/ala/boom-mit.css?referer=');">relicensed</a> under the very liberal MIT license.</p>
<p>Update:<br /><a href="http://www.theserverside.com/news/thread.tss?thread_id=47118" onclick="pageTracker._trackPageview('/outgoing/www.theserverside.com/news/thread.tss?thread_id=47118&amp;referer=');">An interesting thread</a> docbook and HTML is going on at The Server Side.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2007/10/docbook-is-dead-long-live-html/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Dip Your Toes in Some Camel Today</title>
		<link>http://hiramchirino.com/blog/2007/09/dip-your-toes-in-some-camel-today/</link>
		<comments>http://hiramchirino.com/blog/2007/09/dip-your-toes-in-some-camel-today/#comments</comments>
		<pubDate>Wed, 26 Sep 2007 15:36:00 +0000</pubDate>
		<dc:creator>Hiram Chirino</dc:creator>
				<category><![CDATA[Integration]]></category>
		<category><![CDATA[camel]]></category>

		<guid isPermaLink="false">http://hiramchirino.com/wordpress/2007/09/dip-your-toes-in-some-camel-today/</guid>
		<description><![CDATA[The James Strachan has put together an awesome intro to Apache Camel. A high quality version of the screencast also available.]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://macstrac.blogspot.com/" onclick="pageTracker._trackPageview('/outgoing/macstrac.blogspot.com/?referer=');">James Strachan</a> has put together an awesome intro to <a href="http://activemq.apache.org/camel" onclick="pageTracker._trackPageview('/outgoing/activemq.apache.org/camel?referer=');">Apache Camel</a>.</p>
<p><object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab" height="256" width="320"><param name="src" value="http://repo.open.iona.com/podcasts/camel/intro/camel-intro-medium.mov"><param name="autoplay" value="false"><param name="type" value="video/quicktime" height="256" width="320"><embed src="http://repo.open.iona.com/podcasts/camel/intro/camel-intro-medium.mov" height="256" width="320" autoplay="false" type="video/quicktime" pluginspage="http://www.apple.com/quicktime/download/"></embed></object></p>
<p>A <a href="http://repo.open.iona.com/podcasts/camel/intro/camel-intro-high.mov" onclick="pageTracker._trackPageview('/outgoing/repo.open.iona.com/podcasts/camel/intro/camel-intro-high.mov?referer=');">high quality version</a> of the screencast also available.</p>
]]></content:encoded>
			<wfw:commentRss>http://hiramchirino.com/blog/2007/09/dip-your-toes-in-some-camel-today/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://repo.open.iona.com/podcasts/camel/intro/camel-intro-medium.mov" length="11835785" type="video/quicktime" />
<enclosure url="http://repo.open.iona.com/podcasts/camel/intro/camel-intro-high.mov" length="27122960" type="video/quicktime" />
		</item>
	</channel>
</rss>

