<?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>Saga Blog</title>
	<atom:link href="http://blog.sagaoftherealms.net/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.sagaoftherealms.net</link>
	<description>Mental dumping ground of a young dev.</description>
	<lastBuildDate>Sun, 07 Feb 2010 21:02:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Developing Judy 1: Logins without Java code.</title>
		<link>http://blog.sagaoftherealms.net/?p=84</link>
		<comments>http://blog.sagaoftherealms.net/?p=84#comments</comments>
		<pubDate>Sun, 07 Feb 2010 20:42:22 +0000</pubDate>
		<dc:creator>Hoyt Summers Pittman</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.sagaoftherealms.net/?p=84</guid>
		<description><![CDATA[A relatively small project fell in my lap recently. My adviser needed new judging software for her game conference, Indiecade, which had to do the following: 1.Developers needed to be able to register and upload games. 2.Jurors had to be to be invited and judge games. 3.Administrators had to be able to administrate. 4.There had [...]]]></description>
			<content:encoded><![CDATA[<p>A relatively small project fell in my lap recently.  My adviser needed new judging software for her game conference, <a href="http://www.indiecade.com/">Indiecade</a>, which had to do the following:</p>
<ul>
<li>1.Developers needed to be able to register and upload games.</li>
<li>2.Jurors had to be to be invited and judge games. </li>
<li>3.Administrators had to be able to administrate. </li>
<li>4.There had to be a way to manage contact between jurors and developers for the purpose of technical support.</li>
</ul>
<p>This, of course, includes all of the common hall marks of modern web apps (database storage, email notifications, security, etc).  I am providing this and the next few posts as documentation of my experience with the hope it can serve as a reasonable reference for similar projects.  The web app, Judy (after Judge Judy), will use Spring 3.0 (Core, MVC, and Security modules) and be built with Netbeans and Maven.  </p>
<p>For these posts I will make the assumption that you have a passing familiarity with the technologies behind Spring, Maven, and Netbeans.  As such, this series will be more functions by rote and iteration than long prose explaining behind the scenes details.  Should you want such things, I suggest the official <a href="http://www.springsource.org/documentation">Spring project documentation</a> and any books from <a href="http://www.manning.com/">Manning</a> on the topic you wish to study.</p>
<p>First let&#8217;s create the project in Netbeans as a Maven Web Application.  I named it &#8220;IndiecadeJudy&#8221; and left the other options as default.</p>
<p>Spring, Spring MVC, and Spring Security require the following maven dependencies which I added to my pom.xml</p>
<pre class="brush: xml;">
&lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;spring-webmvc&lt;/artifactid&gt;
            &lt;version&gt;3.0.0.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework.security&lt;/groupid&gt;
            &lt;artifactid&gt;spring-security-core&lt;/artifactid&gt;
            &lt;version&gt;3.0.1.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework.security&lt;/groupid&gt;
            &lt;artifactid&gt;spring-security-web&lt;/artifactid&gt;
            &lt;version&gt;3.0.1.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework.security&lt;/groupid&gt;
            &lt;artifactid&gt;spring-security-config&lt;/artifactid&gt;
            &lt;version&gt;3.0.1.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework.security&lt;/groupid&gt;
            &lt;artifactid&gt;spring-security-acl&lt;/artifactid&gt;
            &lt;version&gt;3.0.1.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;
</pre>
<p>Next, I added the applicationContext.xml file to configure Spring. I created the following directory tree: src/main/resources/META-INF.  Inside META-INF I saved my applicationContext.xml file.  I used the Netbeans template from the &#8220;New File&#8221; dialog and did not create any beans. Finally, I created the web.xml file (Standard Deployment Descriptor (web.xml) in the &#8220;New File&#8221; dialog) in the WEB-INF directory.</p>
<p>Next, we add the Spring information to the web.xml file.</p>
<pre class="brush: xml;">
&lt;!-- Spring Config file setup --&gt;
    &lt;context -param&gt;
        &lt;param -name&gt;contextConfigLocation&lt;/param&gt;
        &lt;param -value&gt;
            classpath:META-INF/applicationContext.xml
        &lt;/param&gt;
    &lt;/context&gt;

    &lt;listener&gt;
        &lt;/listener&gt;&lt;listener -class&gt;
            org.springframework.web.context.ContextLoaderListener
        &lt;/listener&gt;
    </pre>
<p>At this point I ran my project and made sure there were no errors.  Now I had the basic structure developed and could begin implementation of some features.  I chose to begin with logins and permissions as I had not had any experience with Spring Security since Acegi 1.0.</p>
<p>Judy needed three basic roles: ADMIN, DEVELOPER, and JUROR.  I created the folders  “admin”, “developer”, and “juror” in “Web Pages” for each role respectively.  Then I copied the default index.jsp from the web root into each of these folders.  Finally, I created a file &#8220;login.jsp&#8221; in the web root.</p>
<p>The source for login.jsp:</p>
<pre class="brush: xml;">
&lt;%@page contentType=&quot;text/html&quot; pageEncoding=&quot;UTF-8&quot;%&gt;

&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;
   &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;

&lt;html&gt;
    &lt;head&gt;
        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
        &lt;title&gt;JSP Page&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
      &lt;form action=&quot;j_spring_security_check/&gt;&quot; method=&quot;POST&quot; &gt;
        &lt;fieldset&gt;
            &lt;label for=&quot;j_username&quot;&gt;User:&lt;/label&gt;&lt;input type='text' name='j_username' /&gt;
            &lt;label for=&quot;j_password&quot;&gt;Password:&lt;/label&gt;&lt;input type='password' name='j_password'/&gt;
            &lt;button name=&quot;submit&quot; type=&quot;submit&quot;&gt;Submit&lt;/button&gt;
        &lt;/fieldset&gt;

    &lt;/form&gt;
    &lt;/body&gt;
&lt;/html&gt;
</pre>
<p>I added the following lines to my web.xml file after the Spring Context Listener tag.  This will put the Spring Security listeners into the web project and give us security.</p>
<pre class="brush: xml;">
    &lt;!-- Spring Security setup --&gt;
    &lt;filter&gt;
        &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;
        &lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class&gt;
    &lt;/filter&gt;
    &lt;filter-mapping&gt;
        &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;
        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;
</pre>
<p>Finally, I had to wire the Security beans.  This provided basic users, roles, and permissions to each of the namespaces in web root.</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:security=&quot;http://www.springframework.org/schema/security&quot;

    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd&quot;&gt;

    &lt;security:global-method-security secured-annotations=&quot;enabled&quot; &gt;
    &lt;/security:global-method-security&gt;

    &lt;security:http auto-config=&quot;true&quot;&gt;
        &lt;security:intercept-url pattern=&quot;/developer/**&quot; access=&quot;ROLE_DEVELOPER&quot; /&gt;
        &lt;security:intercept-url pattern=&quot;/juror/**&quot; access=&quot;ROLE_JUROR&quot; /&gt;
        &lt;security:intercept-url pattern=&quot;/admin/**&quot; access=&quot;ROLE_ADMIN&quot; /&gt;
        &lt;security:intercept-url pattern=&quot;/public/**&quot; access=&quot;IS_AUTHENTICATED_ANONYMOUSLY&quot; /&gt;
        &lt;security:intercept-url pattern=&quot;/login.jsp&quot; access=&quot;IS_AUTHENTICATED_ANONYMOUSLY&quot; /&gt;
        &lt;security:intercept-url pattern=&quot;/index.jsp&quot; access=&quot;IS_AUTHENTICATED_ANONYMOUSLY&quot; /&gt;
    &lt;/security:http&gt;

    &lt;security:authentication-manager&gt;
        &lt;security:authentication-provider&gt;
            &lt;security:password-encoder hash=&quot;md5&quot;/&gt;
            &lt;security:user-service&gt;
                &lt;security:user name=&quot;developer&quot; password=&quot;5f4dcc3b5aa765d61d8327deb882cf99&quot; authorities=&quot;ROLE_DEVELOPER&quot; /&gt;
                &lt;security:user name=&quot;juror&quot; password=&quot;5f4dcc3b5aa765d61d8327deb882cf99&quot; authorities=&quot;ROLE_JUROR&quot; /&gt;
                &lt;security:user name=&quot;administrator&quot; password=&quot;5f4dcc3b5aa765d61d8327deb882cf99&quot; authorities=&quot;ROLE_ADMIN&quot; /&gt;
            &lt;/security:user-service&gt;
        &lt;/security:authentication-provider&gt;
    &lt;/security:authentication-manager&gt;

&lt;/beans&gt;
</pre>
<p>With everything configured, I ran the application and saw the “Hello World!” index.jsp.  To test. I navigated to admin/index.jsp and was correctly redirected to the login.jsp page.  I logged in as administrator with the credentials administrator and the password password.  I could access the admin/index.jsp page correctly and received a 403 error if I tried the juror/index.jsp or the developer.jsp page.</p>
<p>What I was not expecting when I began this project was how my first few iterations of basic functions would not involved any Java coding.  Spring Security has definantly come a long way since Acegi and the whole stack is much more conducive to prototype style development.  Coming up next, I will show how I setup seed data and database backed users with permissions using Hibernate hbm2ddl and DBUnit.</p>
<p><a href='http://blog.sagaoftherealms.net/wp-content/uploads/2010/02/Judy-blog.zip'>Source code in this post.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sagaoftherealms.net/?feed=rss2&amp;p=84</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuring Nexus to work with Spring&#8217;s EBR</title>
		<link>http://blog.sagaoftherealms.net/?p=72</link>
		<comments>http://blog.sagaoftherealms.net/?p=72#comments</comments>
		<pubDate>Fri, 29 Jan 2010 06:05:36 +0000</pubDate>
		<dc:creator>Hoyt Summers Pittman</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.sagaoftherealms.net/?p=72</guid>
		<description><![CDATA[There are alot of different blog and forum posts which reference different repositories to use to get Spring&#8217;s OSGi bundles. There are four current ones in Spring&#8217;s Enterprise Bundle Repository (EBR) system. They are : &#160;&#160;&#160;&#160;&#160;&#60;repository&#62;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;id&#62;com.springsource.repository.bundles.release&#60;/id&#62;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;name&#62;SpringSource&#160;Enterprise&#160;Bundle&#160;Repository&#160;-&#160;SpringSource&#160;Bundle&#160;Releases&#60;/name&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;url&#62;http://repository.springsource.com/maven/bundles/release&#60;/url&#62;&#160; &#160;&#160;&#160;&#160;&#160;&#60;/repository&#62;&#160; &#160;&#160;&#160;&#160;&#160;&#60;repository&#62;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;id&#62;com.springsource.repository.bundles.external&#60;/id&#62;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;name&#62;SpringSource&#160;Enterprise&#160;Bundle&#160;Repository&#160;-&#160;External&#160;Bundle&#160;Releases&#60;/name&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;url&#62;http://repository.springsource.com/maven/bundles/external&#60;/url&#62;&#160; &#160;&#160;&#160;&#160;&#160;&#60;/repository&#62; &#160;&#160;&#160;&#160;&#160;&#60;repository&#62;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;id&#62;com.springsource.repository.libraries.release&#60;/id&#62;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;name&#62;SpringSource&#160;Enterprise&#160;Bundle&#160;Repository&#160;-&#160;SpringSource&#160;Library&#160;Releases&#60;/name&#62;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;url&#62;http://repository.springsource.com/maven/libraries/release&#60;/url&#62;&#160; &#160;&#160;&#160;&#160;&#160;&#60;/repository&#62;&#160; &#160;&#160;&#160;&#160;&#160;&#60;repository&#62;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;id&#62;com.springsource.repository.libraries.external&#60;/id&#62;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;name&#62;SpringSource&#160;Enterprise&#160;Bundle&#160;Repository&#160;-&#160;External&#160;Library&#160;Releases&#60;/name&#62;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;url&#62;http://repository.springsource.com/maven/libraries/external&#60;/url&#62;&#160; &#160;&#160;&#160;&#160;&#160;&#60;/repository&#62;&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>There are alot of different blog and forum posts which reference different repositories to use to get Spring&#8217;s OSGi bundles.</p>
<p>There are four current ones in <a href="http://www.springsource.com/repository/app/">Spring&#8217;s Enterprise Bundle Repository</a> (EBR) system. They are : </p>
<blockquote><p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;repository&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;id&gt;com.springsource.repository.bundles.release&lt;/id&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;SpringSource&nbsp;Enterprise&nbsp;Bundle&nbsp;Repository&nbsp;-&nbsp;SpringSource&nbsp;Bundle&nbsp;Releases&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url&gt;http://repository.springsource.com/maven/bundles/release&lt;/url&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/repository&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;repository&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;id&gt;com.springsource.repository.bundles.external&lt;/id&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;SpringSource&nbsp;Enterprise&nbsp;Bundle&nbsp;Repository&nbsp;-&nbsp;External&nbsp;Bundle&nbsp;Releases&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url&gt;http://repository.springsource.com/maven/bundles/external&lt;/url&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/repository&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;repository&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;id&gt;com.springsource.repository.libraries.release&lt;/id&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;SpringSource&nbsp;Enterprise&nbsp;Bundle&nbsp;Repository&nbsp;-&nbsp;SpringSource&nbsp;Library&nbsp;Releases&lt;/name&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url&gt;http://repository.springsource.com/maven/libraries/release&lt;/url&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/repository&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;repository&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;id&gt;com.springsource.repository.libraries.external&lt;/id&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;SpringSource&nbsp;Enterprise&nbsp;Bundle&nbsp;Repository&nbsp;-&nbsp;External&nbsp;Library&nbsp;Releases&lt;/name&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url&gt;http://repository.springsource.com/maven/libraries/external&lt;/url&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/repository&gt;&nbsp;
</p></blockquote>
<p>I added them to my Nexus install as proxy repositories and turned off indexing which made a lot of headaches go away.  If you are interested in doing some OSGi + Spring + Maven work, you may use my Nexus repositories which I will try to keep current with the Spring resources.</p>
<blockquote><p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;repository&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;id&gt;libs-releases&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;libs-releases&lt;/name&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url&gt;http://www.sagaoftherealms.net/nexus/content/groups/libs-releases&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/repository&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;repository&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;id&gt;libs-releases&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;libs-releases&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;snapshots&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;enabled&gt;true&lt;/enabled&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/snapshots&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url&gt;http://www.sagaoftherealms.net/nexus/content/groups/libs-snapshots&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/repository&gt;
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.sagaoftherealms.net/?feed=rss2&amp;p=72</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to patch EVE Online in Linux</title>
		<link>http://blog.sagaoftherealms.net/?p=64</link>
		<comments>http://blog.sagaoftherealms.net/?p=64#comments</comments>
		<pubDate>Fri, 29 Jan 2010 03:42:24 +0000</pubDate>
		<dc:creator>Hoyt Summers Pittman</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.sagaoftherealms.net/?p=64</guid>
		<description><![CDATA[I didn&#8217;t find a simple HOW-TO on this so I will let you guys in on the secret. A quick note, these instructions are specific to Cedega. Download the patch from CCP Open Cedega Click &#8220;Install&#8221; Select &#8220;EVE Online&#8221; as the GDDB Profile Under Program select your patch file. Click &#8220;Install&#8221; . Now just follow [...]]]></description>
			<content:encoded><![CDATA[<p>I didn&#8217;t find a simple HOW-TO on this so I will let you guys in on the secret.  A quick note, these instructions are specific to Cedega.</p>
<ul>
<li>Download the patch from <a href="http://www.eveonline.com/patches/patches.asp?s=&#038;test=&#038;system=win">CCP</a></li>
<li>Open Cedega</li>
<li> Click &#8220;Install&#8221;</li>
<li> Select &#8220;EVE Online&#8221; as the GDDB Profile</li>
<li> Under Program select your patch file.</li>
<li> Click &#8220;Install&#8221;</li>
<li>. Now just follow the directions in the installer.  </li>
</ul>
<p>A special note, if you choose the wrong version to patch from, the installer will let you know.  So just redownload the correct patch file and start over.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sagaoftherealms.net/?feed=rss2&amp;p=64</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EVE and Wine</title>
		<link>http://blog.sagaoftherealms.net/?p=62</link>
		<comments>http://blog.sagaoftherealms.net/?p=62#comments</comments>
		<pubDate>Mon, 25 Jan 2010 02:01:57 +0000</pubDate>
		<dc:creator>Hoyt Summers Pittman</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.sagaoftherealms.net/?p=62</guid>
		<description><![CDATA[I am a bit of a gamer, but I have stayed out of the MMO game in part because I never felt like dealing with the headaches of Wine and online games. Last year, however, I tried out EVE Online on a Windows box I had lying around and rather enjoyed it. Once I reinstalled [...]]]></description>
			<content:encoded><![CDATA[<p>I am a bit of a gamer, but I have stayed out of the MMO game in part because I never felt like dealing with the headaches of Wine and online games.  Last year, however, I tried out EVE Online on a Windows box I had lying around and rather enjoyed it.  Once I reinstalled my Ubuntu I decided to plunge into the hairy world of Wine and gaming.</p>
<p>Between Crossover gaming, Cedega/WineX, and vanilla Wine I had my work cut out for me.  For brevity&#8217;s sake Cedega has worked the best and is a wonderful choice well worth the little bit of money they ask.  The application ships with a library of installers and getting Eve installed was as simple as downloading the off line installer from CCP and running the setup program available in Cedega.</p>
<p>Getting EVE to actually run on the other hand was at best a colossal pain in the ass and at worst took two years off my life.  I own an ATI video card (AGP 3650 HD to be more specific), and the game would crash when I tried to start.  This was cause by Cedega having issues with ATI cards and FBO&#8217;s.  Finally I found a group of settings that worked, and EVE plays very nicely and beautifully.</p>
<p>The magic combination seemed to be disable “Framebuffer Object”, set “Pixel Shaders” to 3.0, and “Vertex Shaders” to 2.0.  Otherwise, the defaults are fine.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sagaoftherealms.net/?feed=rss2&amp;p=62</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Netbeans 6.7 Maven and Hudson Demo</title>
		<link>http://blog.sagaoftherealms.net/?p=56</link>
		<comments>http://blog.sagaoftherealms.net/?p=56#comments</comments>
		<pubDate>Fri, 24 Jul 2009 22:11:35 +0000</pubDate>
		<dc:creator>Hoyt Summers Pittman</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.sagaoftherealms.net/?p=56</guid>
		<description><![CDATA[Netbeans 6.7 has excellent integration with both Hudson and Maven. This video is a demonstration of creating a web application starting with a Maven project, building in Hudson, and deploying in Tomcat in less than two and a half minutes.]]></description>
			<content:encoded><![CDATA[<p>Netbeans 6.7 has excellent integration with both Hudson and Maven.  This video is a demonstration of creating a web application starting with a Maven project, building in Hudson, and deploying in Tomcat in less than two and a half minutes.</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/kciBbIwhABw&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/kciBbIwhABw&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sagaoftherealms.net/?feed=rss2&amp;p=56</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rant on Testing Darkstar</title>
		<link>http://blog.sagaoftherealms.net/?p=47</link>
		<comments>http://blog.sagaoftherealms.net/?p=47#comments</comments>
		<pubDate>Fri, 24 Jul 2009 13:11:39 +0000</pubDate>
		<dc:creator>Hoyt Summers Pittman</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming/Technology]]></category>

		<guid isPermaLink="false">http://blog.sagaoftherealms.net/?p=47</guid>
		<description><![CDATA[I have been using the Darkstar server / framework to develop my game, Mooks. I have also been trying to adhere to TDD principles. What makes this difficult is that Darkstar uses a set of static objects to provide access to the model and service layers. While they do provide a way to inject you [...]]]></description>
			<content:encoded><![CDATA[<p>I have been using the Darkstar server / framework to develop my game, Mooks.  I have also been trying to adhere to TDD principles.  What makes this difficult is that Darkstar uses a set of static objects to provide access to the model and service layers.  While they do provide a way to inject you own services into this static context, when you begin testing different implementations of those services or using different mocks things break in unique ways.</p>
<p>Let&#8217;s take the following function </p>
<pre class="brush: java;">
     function ManagedReference getReferenceFromObject(ManagedObject o) {
           return Appcontext.getDataManager().createReference(o);
     }
</pre>
<p>This code accesses the static DataManager instance.</p>
<p>Now let&#8217;s look at the following two tests:</p>
<pre class="brush: java;">
    @Test(expected=RuntimeException.class)
    public void testThrowsException() {
         DataManager throwsException = EasyMock.createNiceMock(DataManager.class);
         EasyMock.expect(throwsException.createReference(null)).andThrow(new RuntimeException(&quot;Expected&quot;));
         InternalContext.setDataManager(throwsException)
    }
</pre>
<p>and</p>
<pre class="brush: java;">
    @Test
    public void testReturns() {
         DataManager returnsNull = EasyMock.createNiceMock(DataManager.class);
         EasyMock.expect(returnsNull .createReference(null)).andReturn(null);
         InternalContext.setDataManager(returnsNull);
         assertIsNull(getReferenceFromObject(null));
    }
</pre>
<p>As long as the tests are running sequentially, this is all fine.  Once you run the tests concurrently, it becomes a race as to which DataManager is used.  Additionally, if one were to write a bad test that assumed the DataManager being set, it would pass as long as the correct test was run prior to it.  This breaks some of the &#8220;unitness&#8221; of unit tests.</p>
<p>What would be nice if there were a documented way to configure HOW Darkstar does its deserialization and injection into the context in such a way that it will instead inject its managers into the helper layer.  Something as simple as Spring&#8217;s @Autowired annotation would be sufficient.</p>
<p>Of course part of this rant is just a cry for help, maybe someone somewhere knows how to get better DI into Darkstar and I am just barking up a dead tree.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sagaoftherealms.net/?feed=rss2&amp;p=47</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Meetup</title>
		<link>http://blog.sagaoftherealms.net/?p=46</link>
		<comments>http://blog.sagaoftherealms.net/?p=46#comments</comments>
		<pubDate>Thu, 23 Jul 2009 12:51:14 +0000</pubDate>
		<dc:creator>Hoyt Summers Pittman</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.sagaoftherealms.net/?p=46</guid>
		<description><![CDATA[Monday July 20, 2009, I attended the Google Meetup at Steel in Midtown Atlanta. My boss had sent out a message about it on Yammer which piqued my curiosity and then sealed my attendance (and this post) with the promise of free food; he sure knows how to motive his part time grad student employees! [...]]]></description>
			<content:encoded><![CDATA[<p>Monday July 20, 2009, I attended the Google Meetup at Steel in Midtown Atlanta.  My boss had sent out a message about it on Yammer which piqued my curiosity and then sealed my attendance (and this post) with the promise of free food; he sure knows how to motive his part time grad student employees!</p>
<p>The purpose of Google Meetup was for the company to get the feel of the community at large.  For the most part, the social media crowd was well-represented with a punkish self employed blogger, a few students, two representatives from Georgia Tech, some sales guys, and a few managers in the audience.   Google was represented by an engineer from Atlanta who works on the GWT project, a project manager for Google Search, and a couple of sales/public relations representatives.</p>
<p>The first half of the meetup was an informal meet and greet.  The second half was a Q&#038;A session were the Googlers took questions from the audience as well as from questions which had previously been posted on the meet up ad.</p>
<p>The questions generally led to some informative answers, or at least clarifications.  The representatives spoke about Chrome, ChromeOS, Android, and the plans and motivations behind the projects.  They also explained some of the community initiatives that Google was running such as Google.org and Google 101.  One of the common themes in the answers was that the community that Google operates in does affect the company.  For instance, the effort to port Android to netbooks by the community led Google to pre-annouce ChromeOS so that the volunteers would not feel like they had been led on.</p>
<p>Overall, I was a little disappointed that the session wasn’t as technology heavy as I had expected.  The crowd was typically older and more management or marketing targeted.  This may have been a side effect of the event being advertised solely through Meetup and word-of-mouth.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sagaoftherealms.net/?feed=rss2&amp;p=46</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dev Bits Weekly Updates for 2009-06-28</title>
		<link>http://blog.sagaoftherealms.net/?p=45</link>
		<comments>http://blog.sagaoftherealms.net/?p=45#comments</comments>
		<pubDate>Mon, 29 Jun 2009 03:00:00 +0000</pubDate>
		<dc:creator>Hoyt Summers Pittman</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.sagaoftherealms.net/?p=45</guid>
		<description><![CDATA[Mooks is building in Hudson. Yay for 1)trial and error and 2) breaking initialize() in Darkstar while I was testing locally. # Thinking about installing/hacking on pygowave. # I have installed pygowave on my server, but I need to work through some bugs still. (http://bit.ly/PDQX9 # https://svn.sagaoftherealms.net now has a real ssl cert on it. [...]]]></description>
			<content:encoded><![CDATA[<ul class="aktt_tweet_digest">
<li>Mooks is building in Hudson. Yay for 1)trial and error and 2) breaking initialize() in Darkstar while I was testing locally. <a href="http://twitter.com/summerspittman/statuses/2275154328">#</a></li>
<li>Thinking about installing/hacking on pygowave. <a href="http://twitter.com/summerspittman/statuses/2306613938">#</a></li>
<li>I have installed pygowave on my server, but I need to work through some bugs still.  (<a href="http://bit.ly/PDQX9" rel="nofollow">http://bit.ly/PDQX9</a> <a href="http://twitter.com/summerspittman/statuses/2330827860">#</a></li>
<li><a href="https://svn.sagaoftherealms.net" rel="nofollow">https://svn.sagaoftherealms.net</a> now has a real ssl cert on it. <a href="http://twitter.com/summerspittman/statuses/2361751942">#</a></li>
<li>Moved all of my game into Hudson and Maven. <a href="http://twitter.com/summerspittman/statuses/2368824659">#</a></li>
<li>Running PMD, Findbugs, and Checkstyle on my code to see how annoyed I can make myself. <a href="http://twitter.com/summerspittman/statuses/2378329786">#</a></li>
<li>So make that PMD and Fingbugs.  Checkstyle really doesn&#39;t help you if you are only one person. <a href="http://twitter.com/summerspittman/statuses/2379313264">#</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.sagaoftherealms.net/?feed=rss2&amp;p=45</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dev Bits Weekly Updates for 2009-06-21</title>
		<link>http://blog.sagaoftherealms.net/?p=43</link>
		<comments>http://blog.sagaoftherealms.net/?p=43#comments</comments>
		<pubDate>Mon, 22 Jun 2009 03:00:00 +0000</pubDate>
		<dc:creator>Hoyt Summers Pittman</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.sagaoftherealms.net/?p=43</guid>
		<description><![CDATA[Brag is done. I discovered that you have to use a database to host authentication credentials in Darkstar. # At the doctor reading up on Google Wave. Yay for medically induced hookey. # While a wave server may be fun to make, I am enjoying working on my Darkstar project. I have channels and logins [...]]]></description>
			<content:encoded><![CDATA[<ul class="aktt_tweet_digest">
<li>Brag is done.  I discovered that you have to use a database to host authentication credentials in Darkstar. <a href="http://twitter.com/summerspittman/statuses/2178872408">#</a></li>
<li>At the doctor reading up on Google Wave.  Yay for medically induced hookey. <a href="http://twitter.com/summerspittman/statuses/2223296717">#</a></li>
<li>While a wave server may be fun to make, I am enjoying working on my Darkstar project.  I have channels and logins now! <a href="http://twitter.com/summerspittman/statuses/2245308266">#</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.sagaoftherealms.net/?feed=rss2&amp;p=43</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rambling updates</title>
		<link>http://blog.sagaoftherealms.net/?p=38</link>
		<comments>http://blog.sagaoftherealms.net/?p=38#comments</comments>
		<pubDate>Fri, 19 Jun 2009 23:18:26 +0000</pubDate>
		<dc:creator>Hoyt Summers Pittman</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.sagaoftherealms.net/?p=38</guid>
		<description><![CDATA[Last week I rode the BRAG (www.brag.org). I didn&#8217;t take any pictures this year, but it was worth while. Among other things, I got a chance to work on my game, Mooks, and I experienced the utter suck of filtered public school internet. For some reason, everything with &#8220;blog&#8221; in the url was pretty throughly [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I rode the BRAG (www.brag.org).  I didn&#8217;t take any pictures this year, but it was worth while.  Among other things, I got a chance to work on my game, Mooks, and I experienced the utter suck of filtered public school internet.  For some reason, everything with &#8220;blog&#8221; in the url was pretty throughly blocked.  Additionally Facebook, several email services, and Twitter were locked down so my updates slowed to a crawl.</p>
<p>I have learned a few things about the Darkstar project so far.  First, it needs more documentation.  For instance, there is no official doc regarding for performing client authentication.  For the curious you set &#8220;com.sun.sgs.app.authenticators&#8221; in your properties file to a class which implements &#8220;com.sun.sgs.auth.IdentityAuthenticator&#8221;.  Note, you have to access an external data store because queries to the Darkstar DataManager won&#8217;t work until you have logged in.</p>
<p>I also got a chance to read the Google Wave protocol document.  I may take the time to write my own Wave server just to get experience doing that type of thing.  If you haven&#8217;t taken the time to watch the Wave keynote, please do.</p>
<p>Meanwhile, Netbeans 6.7 has been rocking so far.  The integration with Maven, Mercurial, and Hudson have really made getting work done on my project much less painful.  Originally I had started doing personal work in Netbeans because Eclipse felt too much like work, but now I am starting to honestly prefer Netbeans to Eclipse.</p>
<p>I apologize that this post was so scatter shot, I promise to make the next one much more technical.  I have yet to begin work on the second part of my FirstCup series, but that should be out in a couple of weeks.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sagaoftherealms.net/?feed=rss2&amp;p=38</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
