<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Quality Software Development with Ease &#187; Java</title>
	<atom:link href="http://qualityswdev.com/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://qualityswdev.com</link>
	<description>Thoughts on better ways to develop high quality software by Manuel Küblböck. Agile and Lean methodologies, XP practices and other software development goodness.</description>
	<lastBuildDate>Sat, 05 Nov 2011 11:24:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='qualityswdev.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/616a91f395956dcbbef17b7fa1e2d403?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Quality Software Development with Ease &#187; Java</title>
		<link>http://qualityswdev.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://qualityswdev.com/osd.xml" title="Quality Software Development with Ease" />
	<atom:link rel='hub' href='http://qualityswdev.com/?pushpress=hub'/>
		<item>
		<title>Kotlin and Ceylon to open their doors by the end of the year</title>
		<link>http://qualityswdev.com/2011/09/21/kotlin-and-ceylon-to-open-their-doors-by-the-end-of-the-year/</link>
		<comments>http://qualityswdev.com/2011/09/21/kotlin-and-ceylon-to-open-their-doors-by-the-end-of-the-year/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 16:29:28 +0000</pubDate>
		<dc:creator>Manuel Küblböck</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Language]]></category>
		<category><![CDATA[Ceylon]]></category>
		<category><![CDATA[it-agile-blog-planet]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[Kotlin]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://qualityswdev.com/?p=566</guid>
		<description><![CDATA[The residents of Java are waiting. Waiting for the day when another city will rise to supremacy in JVMland. These days they are looking north towards the functional territories and watch with interest as the new cities Kotlin and Ceylon are being built. Many Java inhabitants are tired of the city they live in. Not just since <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=566&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://qualityswdev.files.wordpress.com/2011/09/simcitystart.png"><img class="alignleft size-thumbnail wp-image-571" style="margin:5px;" title="simcityStart" src="http://qualityswdev.files.wordpress.com/2011/09/simcitystart.png?w=135&#038;h=90" alt="sim city start" width="135" height="90" /></a></p>
<p>The residents of <a href="http://java.com/en/" target="_blank">Java</a> are waiting. Waiting for the day when another city will rise to supremacy in <a href="http://en.wikipedia.org/wiki/Java_Virtual_Machine" target="_blank">JVMland</a>. These days they are looking north towards the <a href="http://c2.com/cgi/wiki?FunctionalProgramming" target="_blank">functional territories</a> and watch with interest as the new cities <a href="http://confluence.jetbrains.net/display/Kotlin/Welcome" target="_blank">Kotlin</a> and <a href="http://in.relation.to/Tutorials/IntroductionToCeylon" target="_blank">Ceylon</a> are being built. Many Java inhabitants are <a href="http://raganwald.posterous.com/javas-comb-over" target="_blank">tired of the city they live in</a>. Not just since their home town is ruled by <a href="http://en.wikipedia.org/wiki/Amun" target="_blank">Amun</a>, who is said to have just swallowed his predecessor <a href="http://en.wikipedia.org/wiki/Ra" target="_blank">Ra</a>. For years they have been <a href="http://mail.openjdk.java.net/pipermail/lambda-dev/2011-August/003877.html" target="_blank">waiting for new facilities</a> to be constructed. Facilities they have seen on weekend trips to other cities like the very hip <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a> or which they got to <a href="http://en.wikibooks.org/wiki/Haskell/Pattern_matching" target="_blank">know</a> and <a href="http://en.wikibooks.org/wiki/Haskell/List_processing" target="_blank">love</a> while going to school in towns like <a href="http://www.haskell.org/haskellwiki/Haskell" target="_blank">Haskell</a>. The people of Java are restless. While they are very familiar with their home town which provides all the basic features to get by, they are craving for some place new and exciting.</p>
<p>While it is not impossible the move to another city the adventurous have to bear some risks. New cities are <a href="http://langpop.com/" target="_blank">having a hard time attracting companies</a> to create jobs for willing new citizens. Often only companies in niche industries are willing to venture outside the secure boundaries of the Java megalopolis. Not few explorers who sought their luck in other cities eventually came <a href="http://alarmingdevelopment.org/?p=562" target="_blank">back to Java</a> because in the end it turned out to be more convenient. Big companies and with them their employees won&#8217;t even consider moving, before a new city has a proven success record. <a href="http://radar.oreilly.com/2011/07/jvm-languages.html" target="_blank">Many cities tried.</a> Non succeeded so far.</p>
<p>The <a href="http://www.jetbrains.com/" target="_blank">creators</a> of Kotlin, still citizens of Java themselves, claim to have studied and learned from these failed attempts. They are promising all the best features from what is probably their biggest contender &#8211; <a href="http://www.scala-lang.org/" target="_blank">Scala town</a> &#8211; while having <a href="http://confluence.jetbrains.net/display/Kotlin/Comparison+to+Scala" target="_blank">way easier infrastructure</a>. They are also advertising stellar public transportation (aka <a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank"><strong>I</strong>nter <strong>D</strong>omicile <strong>E</strong>xpress</a>), which should help new citizens tremendously with getting to feel at home in the new environment. Like Scala they also aim for <a href="http://confluence.jetbrains.net/display/Kotlin/Java+interoperability" target="_blank">seamless communication with all districts in Java</a>.</p>
<p>On first glance <a href="http://in.relation.to/Bloggers/IntroductionToCeylonPart1" target="_blank">Ceylon&#8217;s layout</a> looks very similar to Kotlin&#8217;s and some even suggest they should <a href="http://youtrack.jetbrains.net/issue/KT-230" target="_blank">join forces</a> to enhance their chances to succeed. But since the foundations of both cities are already done and dusted this seems very unlikely.</p>
<p>Kotlin and Ceylon are planning to open their doors by the end of the year and the weary inhabitants of Java are sitting on their packed bags &#8211; waiting.</p>
<br /> Tagged: <a href='http://qualityswdev.com/tag/ceylon/'>Ceylon</a>, <a href='http://qualityswdev.com/tag/it-agile-blog-planet/'>it-agile-blog-planet</a>, <a href='http://qualityswdev.com/tag/java/'>Java</a>, <a href='http://qualityswdev.com/tag/jvm/'>JVM</a>, <a href='http://qualityswdev.com/tag/kotlin/'>Kotlin</a>, <a href='http://qualityswdev.com/tag/scala/'>Scala</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/qualityswdev.wordpress.com/566/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/qualityswdev.wordpress.com/566/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/qualityswdev.wordpress.com/566/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/qualityswdev.wordpress.com/566/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/qualityswdev.wordpress.com/566/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/qualityswdev.wordpress.com/566/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/qualityswdev.wordpress.com/566/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/qualityswdev.wordpress.com/566/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/qualityswdev.wordpress.com/566/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/qualityswdev.wordpress.com/566/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/qualityswdev.wordpress.com/566/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/qualityswdev.wordpress.com/566/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/qualityswdev.wordpress.com/566/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/qualityswdev.wordpress.com/566/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=566&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://qualityswdev.com/2011/09/21/kotlin-and-ceylon-to-open-their-doors-by-the-end-of-the-year/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9e8234609df154fdd93a08a885103a16?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">kueblboe</media:title>
		</media:content>

		<media:content url="http://qualityswdev.files.wordpress.com/2011/09/simcitystart.png?w=150" medium="image">
			<media:title type="html">simcityStart</media:title>
		</media:content>
	</item>
		<item>
		<title>The Bowling Game Kata in Scala</title>
		<link>http://qualityswdev.com/2011/03/14/the-bowling-game-kata-in-scala/</link>
		<comments>http://qualityswdev.com/2011/03/14/the-bowling-game-kata-in-scala/#comments</comments>
		<pubDate>Mon, 14 Mar 2011 20:06:42 +0000</pubDate>
		<dc:creator>Manuel Küblböck</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Kata]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://qualityswdev.com/?p=501</guid>
		<description><![CDATA[Here is the end result of my implementation of the Bowling Game Kata in Scala. You can see all steps including the tests on CodersDojo.org. Comparing this piece of code with the Java implementation from Uncle Bob (who, no doubt, knows how to write clean Java code) I would conclude that it is more expressive <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=501&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Here is the end result of my implementation of the <a href="http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata" target="_blank">Bowling Game Kata</a> in Scala. You can see all steps including the tests on <a href="http://codersdojo.org/statistics/38495f8ae5cf0048e3f2897423b64d91198e2648" target="_blank">CodersDojo.org</a>.</p>
<p><pre class="brush: scala; wrap-lines: false;">
class BowlingGame {

  var rolls: List[Int] = List()

  def roll(pins: Int): Unit = {
    rolls = rolls :+ pins
  }

  def score: Int = {
    scoreRecursive(0, 1, rolls)
  }

  def scoreRecursive(currentScore: Int, frame: Int, rolls: List[Int]): Int = {
    frame match {
      case 11 =&gt; currentScore
      case f =&gt; rolls match {
        case 10 :: rollsTail // strike
          =&gt; scoreRecursive(currentScore + (rolls take (3) sum), f + 1, rollsTail)
        case first :: second :: rollsTail if (first + second == 10) // spare
          =&gt; scoreRecursive(currentScore + (rolls take (3) sum), f + 1, rollsTail)
        case first :: second :: rollsTail // normal
          =&gt; scoreRecursive(currentScore + (rolls take (2) sum), f + 1, rollsTail)
        case _ // incomplete game
          =&gt; throw new Exception(&quot;Only complete games can be scored.&quot;)
      }
    }
  }
}
</pre></p>
<p>Comparing this piece of code with the <a href="http://butunclebob.com/files/downloads/Bowling%20Game%20Kata.ppt" target="_blank">Java implementation from Uncle Bob</a> (who, no doubt, knows how to write clean Java code) I would conclude that it is more expressive and concise. The pattern matching is a) shorter and b) makes the algorighm stand out more clearly. I do, however, appreciate that this might have to do with personal taste. But, what this implemenation with pattern matching does make trivial is to also score partial games. It just requires two more lines of code that seem almost obvious.</p>
<p><pre class="brush: scala; highlight: [23,24,25,26]; wrap-lines: false;">
class BowlingGame {

  var rolls: List[Int] = List()

  def roll(pins: Int): Unit = {
    rolls = rolls :+ pins
  }

  def score: Int = {
    scoreRecursive(0, 1, rolls)
  }

  def scoreRecursive(currentScore: Int, frame: Int, rolls: List[Int]): Int = {
    frame match {
      case 11 =&gt; currentScore
      case f =&gt; rolls match {
        case 10 :: rollsTail // strike
          =&gt; scoreRecursive(currentScore + (rolls take (3) sum), f + 1, rollsTail)
        case first :: second :: rollsTail if (first + second == 10) // spare
          =&gt; scoreRecursive(currentScore + (rolls take (3) sum), f + 1, rollsTail)
        case first :: second :: rollsTail // normal
          =&gt; scoreRecursive(currentScore + (rolls take (2) sum), f + 1, rollsTail)
        case last :: rollsTail // partial frame
          =&gt; currentScore + last
        case nil // partial game
          =&gt; currentScore
      }
    }
  }
}
</pre></p>
<p>As I described in my previous post (link), the variable <em>rolls</em> might indicate that the above code could be made more functional by replacing it with some other construct like list comprehension or recursion. However, thinking about it, it sort of makes sense since the rolls are indeed what changes as a game progresses. I couldn&#8217;t come up with a more functional implementation that is not less expressive. Can you?</p>
<br /> Tagged: <a href='http://qualityswdev.com/tag/functional-programming/'>Functional Programming</a>, <a href='http://qualityswdev.com/tag/java/'>Java</a>, <a href='http://qualityswdev.com/tag/kata/'>Kata</a>, <a href='http://qualityswdev.com/tag/scala/'>Scala</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/qualityswdev.wordpress.com/501/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/qualityswdev.wordpress.com/501/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/qualityswdev.wordpress.com/501/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/qualityswdev.wordpress.com/501/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/qualityswdev.wordpress.com/501/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/qualityswdev.wordpress.com/501/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/qualityswdev.wordpress.com/501/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/qualityswdev.wordpress.com/501/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/qualityswdev.wordpress.com/501/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/qualityswdev.wordpress.com/501/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/qualityswdev.wordpress.com/501/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/qualityswdev.wordpress.com/501/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/qualityswdev.wordpress.com/501/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/qualityswdev.wordpress.com/501/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=501&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://qualityswdev.com/2011/03/14/the-bowling-game-kata-in-scala/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9e8234609df154fdd93a08a885103a16?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">kueblboe</media:title>
		</media:content>
	</item>
		<item>
		<title>How to make your Scala code less imperative and more functional</title>
		<link>http://qualityswdev.com/2011/03/10/how-to-make-your-scala-code-less-imperative-and-more-functional/</link>
		<comments>http://qualityswdev.com/2011/03/10/how-to-make-your-scala-code-less-imperative-and-more-functional/#comments</comments>
		<pubDate>Thu, 10 Mar 2011 17:54:03 +0000</pubDate>
		<dc:creator>Manuel Küblböck</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://qualityswdev.com/?p=496</guid>
		<description><![CDATA[When first starting out with Scala after programming in Java for many years chances are you are still writing Java code just in Scala syntax. Meaning you are not leveraging all the functional goodness that is Scala. Functional code is usually more concise and can be more expressive than imperative code, because functional language constructs <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=496&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://qualityswdev.files.wordpress.com/2011/03/atlantis_start_dw_w_274223p.jpg"><img class="alignleft size-full wp-image-497" style="margin:5px;" title="atlantis_start" src="http://qualityswdev.files.wordpress.com/2011/03/atlantis_start_dw_w_274223p.jpg?w=510" alt="Atlantis Start"   /></a>When first starting out with Scala after programming in Java for many years chances are you are still writing Java code just in Scala syntax. Meaning you are not leveraging all the functional goodness that is Scala. Functional code is usually more concise and <strong>can be</strong> more expressive than imperative code, because functional language constructs operate on a higher level of abstraction than your ordinary execution path loop and fork. It is <strong>more </strong>about saying <strong>what </strong>you want and <strong>less </strong>about <strong>how </strong>you want it done.</p>
<p>I found the following actions helpful in my quest to make my Scala code less imperative and more functional:</p>
<ul>
<li><strong>Try to eliminate variables and loops by replacing them with list comprehensions and recursion.</strong></li>
<li><strong>Try to eliminate if statements by replacing them with pattern matching.</strong></li>
</ul>
<p>Basically, I look for the key words &#8216;var&#8217;, &#8216;for&#8217;, &#8216;while&#8217; and &#8216;if&#8217; in my code and try to think up a way to replace them with something more functional. The result is usually not obvious (for non-(not yet)-functional programmers that is anyway), but I tend to like it more than what I had before.</p>
<br /> Tagged: <a href='http://qualityswdev.com/tag/functional-programming/'>Functional Programming</a>, <a href='http://qualityswdev.com/tag/java/'>Java</a>, <a href='http://qualityswdev.com/tag/scala/'>Scala</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/qualityswdev.wordpress.com/496/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/qualityswdev.wordpress.com/496/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/qualityswdev.wordpress.com/496/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/qualityswdev.wordpress.com/496/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/qualityswdev.wordpress.com/496/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/qualityswdev.wordpress.com/496/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/qualityswdev.wordpress.com/496/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/qualityswdev.wordpress.com/496/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/qualityswdev.wordpress.com/496/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/qualityswdev.wordpress.com/496/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/qualityswdev.wordpress.com/496/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/qualityswdev.wordpress.com/496/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/qualityswdev.wordpress.com/496/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/qualityswdev.wordpress.com/496/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=496&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://qualityswdev.com/2011/03/10/how-to-make-your-scala-code-less-imperative-and-more-functional/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9e8234609df154fdd93a08a885103a16?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">kueblboe</media:title>
		</media:content>

		<media:content url="http://qualityswdev.files.wordpress.com/2011/03/atlantis_start_dw_w_274223p.jpg" medium="image">
			<media:title type="html">atlantis_start</media:title>
		</media:content>
	</item>
		<item>
		<title>Who will be Java&#8217;s successor?</title>
		<link>http://qualityswdev.com/2010/10/29/who-will-be-javas-successor/</link>
		<comments>http://qualityswdev.com/2010/10/29/who-will-be-javas-successor/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 09:30:38 +0000</pubDate>
		<dc:creator>Manuel Küblböck</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Language]]></category>
		<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://qualityswdev.com/?p=383</guid>
		<description><![CDATA[ThoughtWorks&#8217; technology radar suggested to start thinking about &#8216;Java end of life&#8216; in its January 2010 issue. In following issues of the same document they list several languages that strive to be Java&#8217;s successor on the JVM. In order to lure the Java community into their net all these languages promise to run on the <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=383&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://qualityswdev.files.wordpress.com/2010/10/baby.jpg"><img class="alignleft size-thumbnail wp-image-389" title="baby" src="http://qualityswdev.files.wordpress.com/2010/10/baby.jpg?w=150&#038;h=98" alt="" width="150" height="98" /></a><a href="http://www.thoughtworks.com/radar/" target="_blank">ThoughtWorks&#8217; technology radar</a> suggested to start thinking about &#8216;<strong>Java end of life</strong>&#8216; in its January 2010 issue. In following issues of the same document they list several languages that strive to be Java&#8217;s successor on the JVM. In order to lure the Java community into their net all these languages promise to run on the <strong>JVM</strong> with <strong>interoperability</strong> with existing Java code and familiar, but easier and <strong>more concise syntax</strong>. On top of that they pack recently buzzing <strong>functional programming features</strong>, which get sold on their ability of easier <strong>parallelization</strong>.</p>
<p>The most prominent candidates are (in alphabetical order)</p>
<ul>
<li><a href="http://clojure.org/" target="_blank">Clojure</a>,</li>
<li><a href="http://groovy.codehaus.org/" target="_blank">Groovy</a> and</li>
<li><a href="http://www.scala-lang.org/" target="_blank">Scala</a>.</li>
</ul>
<p>The ThoughtWorks guys see Groovy ahead of Clojure and Scala, whereas I personally see myself more drawn towards Scala. Which language shall it be? Groovy, Clojure, Scala, some other language? What&#8217;s your favorite and why?</p>
<p><strong>Update 13. Aug 2011:</strong> With <a href="http://confluence.jetbrains.net/display/Kotlin" target="_blank">Kotlin</a> there is soon to be a new language in the race for Java&#8217;s succession. It certainly sounds very promising. Also follow the discussion on <a href="http://www.quora.com/Which-language-will-be-Javas-successor-as-mainstream-language-on-the-JVM" target="_blank">Quora</a>.</p>
<br /> Tagged: <a href='http://qualityswdev.com/tag/clojure/'>Clojure</a>, <a href='http://qualityswdev.com/tag/functional-programming/'>Functional Programming</a>, <a href='http://qualityswdev.com/tag/groovy/'>Groovy</a>, <a href='http://qualityswdev.com/tag/java/'>Java</a>, <a href='http://qualityswdev.com/tag/scala/'>Scala</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/qualityswdev.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/qualityswdev.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/qualityswdev.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/qualityswdev.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/qualityswdev.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/qualityswdev.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/qualityswdev.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/qualityswdev.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/qualityswdev.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/qualityswdev.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/qualityswdev.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/qualityswdev.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/qualityswdev.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/qualityswdev.wordpress.com/383/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=383&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://qualityswdev.com/2010/10/29/who-will-be-javas-successor/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9e8234609df154fdd93a08a885103a16?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">kueblboe</media:title>
		</media:content>

		<media:content url="http://qualityswdev.files.wordpress.com/2010/10/baby.jpg?w=150" medium="image">
			<media:title type="html">baby</media:title>
		</media:content>
	</item>
		<item>
		<title>Automatic hashcode method generation</title>
		<link>http://qualityswdev.com/2010/03/11/automatic-hashcode-method-generation/</link>
		<comments>http://qualityswdev.com/2010/03/11/automatic-hashcode-method-generation/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 09:01:56 +0000</pubDate>
		<dc:creator>Manuel Küblböck</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://qualityswdev.com/?p=165</guid>
		<description><![CDATA[When reading the book Implementation Patterns on the bus to work one morning I came across a section that talks about implementing the equals and hashcode methods in Java. I don&#8217;t know how often I have read this rule by now: &#8220;If you implement equals you also have to implement hashcode&#8220;. Otherwise you get into <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=165&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="margin:5px;" title="Chang &amp; Eng Bunker (1835 or 1836) - public dom..." src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Chang-eng-bunker-PD.gif/300px-Chang-eng-bunker-PD.gif" alt="" width="92" height="128" />When reading the book <a href="http://www.amazon.com/Implementation-Patterns-Kent-Beck/dp/0321413091/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1262669201&amp;sr=8-1" target="_blank">Implementation Patterns</a> on the bus to work one morning I came across a section that talks about implementing the <em>equals</em> and <em>hashcode</em> methods in Java. I don&#8217;t know how often I have read this rule by now: &#8220;If you implement <em>equals</em> you also have to implement <em>hashcode</em>&#8220;. Otherwise you get into trouble when you try to use objects of your class as a key in a <em>Map</em> or <em>Set</em>. These two methods are basically <strong>Siamese twins</strong> that share vital organs. They can&#8217;t be separated.</p>
<p>Every time I implemented the twins I <strong>first created <em>equals</em></strong> based on the business logic I wanted to achieve. Then I just <strong>used the standard implementation of <em>hashcode</em></strong> from Joshua Bloch&#8217;s <a href="http://java.sun.com/docs/books/effective/index.html">Effective  Java</a> book using the same instance variables as in <em>equals</em>. Pretty straight forward and in 99% of all cases totally sufficient. You just shouldn&#8217;t forget about it.</p>
<p>Reading about it again that day made me wonder though: If it&#8217;s so straight forward, <strong>why doesn&#8217;t the compiler do it for me?</strong> I also asked myself why I have never questioned this rule before, or anyone else for that matter. Or did someone? A bit of research should prove just that. There are in fact several ways to avoid writing <em>equals </em>or <em>hashcode </em>yourself ever again.</p>
<ul>
<li><strong>Let your favorite IDE generate it for you</strong><br />
I can&#8217;t believe I&#8217;ve been developing in <a href="http://www.eclipse.org/" target="_blank">Eclipse</a> this long and never noticed the auto-generation function for <em>equals </em>and <em>hashcode</em>.</li>
</ul>
<ul>
<li><strong>Use the Apache Commons builder classes</strong><br />
The usual suspect for convenience classes strikes again. The <a href="http://commons.apache.org/lang/" target="_blank">commons-lang</a> library provides the classes <a href="http://commons.apache.org/lang/api/org/apache/commons/lang/builder/EqualsBuilder.html" target="_blank">EqualsBuilder</a> and <a href="http://commons.apache.org/lang/api/org/apache/commons/lang/builder/HashCodeBuilder.html" target="_blank">HashcodeBuilder</a> that allow you to build standard <em>equals </em>and <em>hashcode </em>methods by appending the required fields to a builder instance. Alternatively, there is a method that uses reflection to determine  the fields (all non-static, non-transient) at runtime.</li>
</ul>
<ul>
<li><strong>Use Lombok annotations</strong><br />
<a href="http://projectlombok.org/" target="_blank">Lombok</a> generates <em>equals </em>and <em>hashcode </em>at compile time from annotations in your source code and integrates well with Eclipse. Once you finish typing the annotation the methods even show up in the outline. Pretty neat. An additional bonus is that this boilerplate code no longer clutters your source code.</li>
</ul>
<p>My winner clearly is Lombok. But don&#8217;t take my word for it, try it out yourself. For a more detailed comparison of the above with code examples read this <a href="http://blog.springfuse.com/2009/10/project-lombok-must-have-in-your-java.html" target="_blank">review on the SpringFuse blog</a>.</p>
<h6>Image via <a href="http://commons.wikipedia.org/wiki/Image:Chang-eng-bunker-PD.gif">Wikipedia</a></h6>
<br /> Tagged: <a href='http://qualityswdev.com/tag/java/'>Java</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/qualityswdev.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/qualityswdev.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/qualityswdev.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/qualityswdev.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/qualityswdev.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/qualityswdev.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/qualityswdev.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/qualityswdev.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/qualityswdev.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/qualityswdev.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/qualityswdev.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/qualityswdev.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/qualityswdev.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/qualityswdev.wordpress.com/165/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=165&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://qualityswdev.com/2010/03/11/automatic-hashcode-method-generation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9e8234609df154fdd93a08a885103a16?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">kueblboe</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Chang-eng-bunker-PD.gif/300px-Chang-eng-bunker-PD.gif" medium="image">
			<media:title type="html">Chang &#38; Eng Bunker (1835 or 1836) - public dom...</media:title>
		</media:content>
	</item>
		<item>
		<title>Java Build Server</title>
		<link>http://qualityswdev.com/2010/01/23/java-build-server/</link>
		<comments>http://qualityswdev.com/2010/01/23/java-build-server/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 04:01:17 +0000</pubDate>
		<dc:creator>Manuel Küblböck</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Build Server]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Nexus]]></category>
		<category><![CDATA[Sonar]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://qualityswdev.com/?p=85</guid>
		<description><![CDATA[Update [15.05.2010]: I finally had a chance to try out SecureCI, which is pretty much exactly what I described in this post. The guys from Coveros did a great job, so I suggest after reading this post you head over to their website, download SecureCI and give it a go. Thanks John for pointing this <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=85&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="margin:5px;" src="http://farm4.static.flickr.com/3452/3204450759_acf201a8f8_m.jpg" alt="" width="144" height="108" /></p>
<p><strong>Update [15.05.2010]:</strong> I finally had a chance to try out <a href="http://www.coveros.com/research/research_stack.php" target="_blank">SecureCI</a>, which is pretty much exactly what I described in this post. The guys from Coveros did a great job, so I suggest after reading this post you head over to their website, download SecureCI and give it a go. Thanks John for pointing this out to me.</p>
<p>In my last Java project, I set up a <strong>build server with Continuous Integration (CI) capability</strong>. I am a big fan of Test Driven Development (TDD) and I quite enjoyed <a href="http://hudson-ci.org/" target="_blank">Hudson</a> telling us right away when someone checked in code that broke the build. It just gives you so much more confidence in your code and keeps it releasable at all times. In addition, we used <a href="http://sonar.codehaus.org/" target="_blank">Sonar</a> to measure the quality of our code. I found it quite interesting to study how the different metrics changed over the course of the project. We paid particular attention to code coverage and tried to keep it as close to 100% as possible. This should happen naturally anyway if you are practicing TDD.</p>
<p>Setting all this up was a good experience to learn how it all fits together &#8211; But I learned my lesson and I don&#8217;t really want to do it over and over again. So, I started looking for a <strong>Virtual Appliance</strong> that had most, if not all, of these capabilities. Setting up a build server must have been done by other developers a million times before. Surely, someone along the way stuck it all on a Virtual Machine (VM) and made it open source, right? Well, that&#8217;s what I thought, but I couldn&#8217;t find any. So, I decided to create one myself. Unfortunately, I am lacking the hardware to do so at the moment. I have even already created a project for it on <a title="Java Build Server" href="https://launchpad.net/java-build-server" target="_blank">https://launchpad.net/java-build-server</a>. Although, I haven&#8217;t come around to create the VM yet, I still wanted to share my idea here to maybe animate someone else to go ahead and give it a go. So here it is: my idea of a Java build server.</p>
<p>I planned to start with what I think of as a good enough build server: A VM based on <strong><a class="zem_slink" title="Ubuntu" rel="homepage" href="http://www.ubuntu.com/">Ubuntu</a></strong> Server <strong><a title="Just enough operating system" rel="wikipedia" href="http://en.wikipedia.org/wiki/Just_enough_operating_system" target="_blank">JeOS</a></strong> with pre-configured installations of <strong><a rel="homepage" href="http://subversion.tigris.org/" target="_blank">Subversion</a></strong> (Source Control), <strong><a href="http://www.vmware.com/products/server/" target="_blank">Hudson</a></strong> (Continuous Integration), <strong><a href="http://sonar.codehaus.org/" target="_blank">Sonar</a></strong> (Quality Metrics), <strong><a class="zem_slink" title="MySQL" rel="homepage" href="http://www.mysql.com/">MySQL</a></strong> (to store Quality Metrics), <strong><a href="maven.apache.org/" target="_blank">Maven</a></strong> (Build) and <strong><a href="http://nexus.sonatype.org/" target="_blank">Nexus</a></strong> (Enterprise Maven Repository). Once this is all working I am going to also <a href="http://trac.edgewall.org/wiki/TracInstall" target="_blank">install</a> <strong><a href="http://trac.edgewall.org/" target="_blank">Trac</a></strong> (Wiki and issue tracking system). You might of course have your own preferences for tools to use for the tasks listed above. Feel free to swap out whatever tool you wish. You might already have an enterprise Maven repository. Fine, just use your existing one. All I am saying is, these tools will be on my build server VM; pre-configured as much as possible with standards found in the tools&#8217; documentation, following the <a href="http://en.wikipedia.org/wiki/Convention_over_configuration" target="_blank"><strong>convention over configuration</strong></a> paradigm.</p>
<h4>Creating the VM</h4>
<p>Here is how I am planning to create my Java build server VM. I am using <a href="http://www.vmware.com/appliances/getting-started/learn/vmware_studio.html" target="_blank">VMware Studio</a> to create the VM. VMware Studio is a Virtual Appliance itself and I deployed it in <a href="http://www.vmware.com/products/server/" target="_blank">VMware Server 2.0</a>. First I created a basic VM based on Ubuntu 8.04.1. Studio automatically installs VMware tools and embeds an in-guest management component called Virtual Appliance Management Infrastructure (VAMI), which lets you configure the network settings of your VM after it has been built. This is essential, since you want your development team to be able to connect to your copy of the build server VM. Here is a list of the essential settings I used to create the base VM:</p>
<ul>
<li>ubuntu-8.04.1-dvd-i386</li>
<li>1 CPU</li>
<li>512 MB RAM</li>
<li>8 GB</li>
<li>Network settings: DHCP (to automatically find an IP address)</li>
<li>Target format: zip</li>
</ul>
<p>After the build finished, I downloaded the zipped VM and deployed it on my VMware Server instance. I started the VM and assigned it a static IP address on the boot screen. I logged in and carried out the following steps:</p>
<ul>
<li>Update Ubuntu (sudo apt-get update &amp;&amp; sudo apt-get upgrade)</li>
<li><a href="https://help.ubuntu.com/community/Repositories/CommandLine" target="_blank">Add the universe and multiverse Ubuntu repositories</a></li>
<li><a href="http://www.howtogeek.com/howto/linux/installing-tomcat-6-on-ubuntu/" target="_blank">Install Java and Tomcat</a> (with admin packages)</li>
<li><a href="http://odyniec.net/articles/ubuntu-subversion-server/" target="_blank">Install Subversion</a> (SVN)</li>
<li><a href="http://www.sonatype.com/books/maven-book/reference/installation-sect-maven-linux.html" target="_blank">Install Maven</a></li>
<li><a href="https://help.ubuntu.com/8.04/serverguide/C/mysql.html" target="_blank">Install MySQL</a></li>
<li><a href="http://hudson-ci.org/" target="_blank">Deploy Hudson</a> to Tomcat</li>
<li><a href="http://docs.codehaus.org/display/SONAR/Install+Sonar" target="_blank">Deploy Sonar</a> to Tomcat</li>
<li><a href="http://www.sonatype.com/books/nexus-book/reference/ch02s02.html" target="_blank">Deploy Nexus</a> to Tomcat</li>
</ul>
<h4>Using the VM</h4>
<p>Of course there are some project and company specific configurations that cannot be set in advance. Here is what is left to do:</p>
<ul>
<li>Install a VM container on a server (e.g. <a href="http://www.vmware.com/products/server/" target="_blank">VMware Server</a>)</li>
<li><a href="https://launchpad.net/java-build-server" target="_blank">Download</a> and start the VM in your container</li>
<li>Set the network details on the boot screen</li>
<li>Add your developers as users to Subversion (in /usr/local/svn/passwd-team)</li>
<li>Create a project</li>
<li>Create Hudson jobs to monitor your project</li>
</ul>
<h4><strong>What&#8217;s next?</strong></h4>
<p>To make using this Java build server even easier I am also planning to create the following:</p>
<ul>
<li>a <strong><a href="http://maven.apache.org/plugins/maven-archetype-plugin/" target="_blank">Maven archetype</a></strong> that only needs the IP address of the build server to be configured</li>
<li>a <strong>script to create a new project</strong> on the build server (create SVN project, create Hudson jobs, etc.)</li>
</ul>
<h6>Image by <a href="http://www.flickr.com/photos/44124412397@N01/3204450759">indigoprime</a> via Flickr</h6>
<br /> Tagged: Build Server, Continuous Integration, Hudson, Java, Maven, Nexus, Sonar, Subversion, Ubuntu <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/qualityswdev.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/qualityswdev.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/qualityswdev.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/qualityswdev.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/qualityswdev.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/qualityswdev.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/qualityswdev.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/qualityswdev.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/qualityswdev.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/qualityswdev.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/qualityswdev.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/qualityswdev.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/qualityswdev.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/qualityswdev.wordpress.com/85/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=85&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://qualityswdev.com/2010/01/23/java-build-server/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9e8234609df154fdd93a08a885103a16?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">kueblboe</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3452/3204450759_acf201a8f8_m.jpg" medium="image" />
	</item>
	</channel>
</rss>
