<?xml version="1.0" encoding="utf-8"?>
			
			<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://web.resource.org/cc/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">

			<channel>
			<title>Adam Howitt&apos;s Blog - Java</title>
			<link>http://www.webdevref.com/blog/index.cfm</link>
			<description>A blog for ColdFusion, iPhone Development and other musings</description>
			<language>en-us</language>
			<pubDate>Wed, 08 Sep 2010 05:34:46 -0400</pubDate>
			<lastBuildDate>Tue, 19 Jan 2010 18:48:00 -0400</lastBuildDate>
			<generator>BlogCFC</generator>
			<docs>http://blogs.law.harvard.edu/tech/rss</docs>
			<managingEditor>adamhowitt@gmail.com</managingEditor>
			<webMaster>adamhowitt@gmail.com</webMaster>
			<itunes:subtitle></itunes:subtitle>
			<itunes:summary></itunes:summary>
			<itunes:category text="Technology" />
			<itunes:category text="Technology">
				<itunes:category text="Podcasting" />
			</itunes:category>
			<itunes:category text="Technology">
				<itunes:category text="Tech News" />
			</itunes:category>
			<itunes:keywords></itunes:keywords>
			<itunes:author></itunes:author>
			<itunes:owner>
				<itunes:email>adamhowitt@gmail.com</itunes:email>
				<itunes:name></itunes:name>
			</itunes:owner>
			<itunes:image href="" />
			<image>
				<url></url>
				<title>Adam Howitt&apos;s Blog</title>
				<link>http://www.webdevref.com/blog/index.cfm</link>
			</image>
			<itunes:explicit>no</itunes:explicit>
			
			
			
			
			
			<item>
				<title>Run your ass off this year!</title>
				<link>http://www.webdevref.com/blog/index.cfm/2010/1/19/Run-your-ass-off-this-year</link>
				<description>
				
				After another 200 hour programming marathon spread over 4 months I&apos;m thrilled to announce the release of version 3 of WalkJogRun&apos;s iPhone App &lt;a href=&quot;http://www.walkjogrun.net/iphone/go.cfm?m=wdrblog&quot;&gt;&quot;WalkJogRun Running Routes&quot;&lt;/a&gt;.

&lt;h3&gt;What does it do?&lt;/h3&gt;
The most significant change version 2 was the addition of &lt;a href=&quot;http://www.walkjogrun.net/iphone/training-plans.cfm&quot;&gt;23 training plans&lt;/a&gt; created by Coach Jenny Hadfield of Runners World fame.  Once you sign up for a training plan and pick a start date you&apos;ll get alerts every morning at 6am (silent so they don&apos;t wake you) to tell you how far to run, how fast and give you motivation.  Tap the find routes button to find a training route in your neighborhood from the 600,000  routes at &lt;a href=&quot;http://www.walkjogrun.net&quot;&gt;WalkJogRun.net&lt;/a&gt;

&lt;h3&gt;What if I&apos;ve never run before?&lt;/h3&gt;
We&apos;ve got plans for beginners, intermediate and advanced runners including one called &quot;&lt;a href=&quot;http://www.walkjogrun.net/iphone/5k/training-plan.cfm?planId=5k-beg-sofa&quot;&gt;Run your first 5k&lt;/a&gt;&quot; designed to take you from the sofa to being able to run a 5k race in 10 weeks.  We&apos;ve also got &lt;a href=&quot;http://www.walkjogrun.net/iphone/10k/training-plans.cfm&quot;&gt;10k training plans&lt;/a&gt;, &lt;a href=&quot;http://www.walkjogrun.net/iphone/half-marathon/training-plans.cfm&quot;&gt;half marathon training plans&lt;/a&gt; and &lt;a href=&quot;http://www.walkjogrun.net/iphone/marathon/training-plans.cfm&quot;&gt;full marathon training plans&lt;/a&gt;.

&lt;h3&gt;Gimme the nerdy stuff&lt;/h3&gt;
The programs themselves are delivered as in-app purchases using the StoreKit framework on the device to process payments and then send receipts to the ColdFusion server to register the subscription and begin delivery of the alerts.

The alerts are delivered as Apple Push Notifications generated by ColdFusion.  No mean feat I can tell you using Java in ColdFusion to connect to a streaming data socket to send and receive the bytes and then drop the encoded JSON packets off on your phone.  The phone gets the alert, opens the app and takes you to the training session for the day to show you your training tip.

Download a copy of &lt;a href=&quot;http://www.walkjogrun.net/iphone/go.cfm?m=wdrblog&quot;&gt;&quot;WalkJogRun Running Routes&quot;&lt;/a&gt; before it gets too late!
				
				</description>
						
				
				<category>Tech</category>				
				
				<category>Sport</category>				
				
				<category>Coldfusion</category>				
				
				<category>News</category>				
				
				<category>Java</category>				
				
				<pubDate>Tue, 19 Jan 2010 18:48:00 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2010/1/19/Run-your-ass-off-this-year</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Eclipse Ganymede and Java 6 update 10 RC</title>
				<link>http://www.webdevref.com/blog/index.cfm/2008/9/22/Eclipse-Ganymede-and-Java-6-update-10-RC</link>
				<description>
				
				&lt;p&gt;Just a word of warning - my copy of Google Chrome suggested I install Java 6 update 10 RC last night to allow me to upload pics to facebook. &amp;nbsp;&lt;/p&gt;&lt;p&gt;Everything went okay but this morning Eclipse Ganymede was dead with no indication of why except a dialog box containing runtime parameters. &amp;nbsp;I uninstalled the new Java update and everything is fine again.&lt;/p&gt;
				
				</description>
						
				
				<category>Eclipse</category>				
				
				<category>Java</category>				
				
				<pubDate>Mon, 22 Sep 2008 16:26:52 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2008/9/22/Eclipse-Ganymede-and-Java-6-update-10-RC</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Help with OO Problem</title>
				<link>http://www.webdevref.com/blog/index.cfm/2007/1/9/Help-with-OO-Problem</link>
				<description>
				
				I&apos;ve studied OO at University in the shape of Eiffel, I&apos;ve programmed OO somewhat lightly in Java and developed OO in CFCs but there are some classes of problem I just don&apos;t get.&amp;nbsp; If anyone reading this could offer insight from their own experience that would be great!&amp;nbsp; I&apos;ll offer problem 1 for now and dependent on the response I might hit you up for problem 2.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&amp;quot;is related to&amp;quot;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;I&apos;ve called this &amp;quot;is related to&amp;quot; because I&apos;m talking about the modelling of relationships between classes.&amp;nbsp; This comes in the context of how to use objects in a Content Management System.&lt;br /&gt;&lt;br /&gt;For example, lets say I have a website with an about us section and in that section, an programmer list with a list of the key skills of each programmer.&amp;nbsp; There is also a &amp;quot;key skills list&amp;quot; which has a list of programmers who are in posession of the skill.&amp;nbsp; Programmers own skills but they aren&apos;t necessarily composed of those skills e.g. &amp;quot;has a&amp;quot; and this isn&apos;t inheritance since programmers aren&apos;t a type of ColdFusion.&lt;br /&gt;&lt;br /&gt;So, to make it real, under the list of programmers I have Ben Forta, DHH, Adam Howitt, Sean Corfield and Cameron Childress.&amp;nbsp; If you view the detail for each programmer you will see that all but DHH have ColdFusion experience.&amp;nbsp; All have MySQL experience and lastly Adam and DHH have dabbled in Rails.&amp;nbsp; If I navigate to the ColdFusion page I see a list: Adam, Ben, Cameron, Sean with a brief snippet of the full bio under each.&lt;br /&gt;&lt;br /&gt;On the ColdFusion page I would fetch the ColdFusion object and dutifully write out each attribute before getting the related programmers:&lt;div class=&quot;code&quot;&gt;&amp;lt;h1&amp;gt;#skillObj.getTitle()#&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;#skillObj.getBody()#&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;h2&amp;gt;Related Programmers&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;lt;cfset stProgrammers=skillObj.getProgrammers()&amp;gt;&lt;br /&gt;&amp;lt;cfloop collection=&amp;quot;#stProgrammers#&amp;quot; item=&amp;quot;programmer&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;cfset currentProgrammer=stProgrammers[programmer]&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;#currentProgrammer.getFirstName# #currentProgrammer.getLastName#&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;#currentProgrammer.getShortBio()#&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/cfloop&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;My question is how do you implement getProgrammers and what do the classes look like?&amp;nbsp; My initial thought is that there is a Programmer class and a Skill class.&amp;nbsp; Now for the chicken and the egg: does a programmer has a struct of skills (order isn&apos;t important) or does the skill have a struct of programmers (again, order not important).&amp;nbsp; Or both?&amp;nbsp; What do I store? The struct of class instances (programmer objects) or the struct of ids?&amp;nbsp; If I use a struct of objects, the call getProgrammers has all the information it needs to print this page.&lt;br /&gt;&lt;br /&gt;If I store the ids of the objects then I increase cohesiveness by requiring the method to call a function to instantiate the skill class for each id. Storing the ids creates a new issue - I have to load each skill one by one, making multiple database calls for each page request instead of a single database call to load all related skills.&amp;nbsp; In the current system, I load all skilll attributes with one query, all related programmers with another then display them to the screen. &amp;nbsp;&lt;br /&gt;&lt;br /&gt;The biggest issue I am having trouble understanding is what gets stored in memory.&amp;nbsp; We don&apos;t really have a Programmer or a Skills page, but model the employee structure and skills profiles of clients in the service industry.&amp;nbsp; Some clients have over a thousand employees with experience or skills selected from a list of over a hundred.&amp;nbsp; Adding up the potential number of objects, some clients may have over 5,000 content objects which may be called by any number of pages at a given time.&amp;nbsp; The current procedural approach works but we&apos;re trying to see if there is a better OO design to fit the purpose.
				
				</description>
						
				
				<category>Coldfusion</category>				
				
				<category>SQL</category>				
				
				<category>UML</category>				
				
				<category>Java</category>				
				
				<pubDate>Tue, 09 Jan 2007 10:47:53 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2007/1/9/Help-with-OO-Problem</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Eclipse uncovers ColdFusion&apos;s Secret Powers</title>
				<link>http://www.webdevref.com/blog/index.cfm/2005/3/2/Eclipse-uncovers-ColdFusion&apos;s-Secret-Powers</link>
				<description>
				
				If you have ever seen a tech tip about ColdFusion leveraging the built in hidden methods of Java and wondered &quot;how the heck do they know this stuff?&quot;, Eclipse can help you see the wizard behind the curtain.

Yesterday I was doofing around trying to discover a way to access the SQL statement passed by cfquery and cfstoredproc so I could log it on my production server without duplicating the code block.  I figured, if CF knows what the parsed statement is, why can&apos;t I access it after the statement executes as, say, cfquery.parsedSqlStatement.  I know it exists because if my code errors, I see it in the resulting error dump.

I started out looking for posts that utilize some of these hidden Java methods and came across Sam&apos;s post on &lt;a href=&quot;http://www.rewindlife.com/archives/000023.cfm&quot;&gt;&quot;Handling file uploads without CFFILE&quot;&lt;/a&gt;.  The important snippet was &lt;br /&gt;
cls = s.getClass();&lt;br /&gt;
stringCLass = cls.forName(&quot;java.lang.String&quot;);&lt;br /&gt;
Armed with this info I started to experiment by dumping out the stringClass variable to see the list of methods.  

Next I threw a DB error deliberately and expanded the stack trace to get a list of CFClasses which were involved in the error.  I constructed this little test:
&lt;div class=&quot;code&quot;&gt;
&amp;lt;cfquery datasource=&quot;ll_site&quot; name=&quot;qTest&quot;&gt;&lt;br /&gt;
select * from object_tb&lt;br /&gt;
&amp;lt;/cfquery&gt;&lt;br /&gt;
&amp;lt;cfset cls = qTest.getClass()&gt;&lt;br /&gt;
&amp;lt;cfdump var=&quot;#cls.getName()#&quot;&gt;&lt;br /&gt;
&amp;lt;cfset stringClass = cls.forName(&quot;coldfusion.sql.QueryTable&quot;)&gt;&lt;br /&gt;
&amp;lt;cfdump var=&quot;#stringCLass#&quot;&gt;&lt;br /&gt;
&lt;/div&gt;

Unfortunately my research stopped there because there just wasn&apos;t much to see.  No properties or methods easily listed to help me on my quest.  This was when I had a brainwave.  &lt;b&gt;Eclipse is a Java development tool, ColdFusion comes as a deployable ear file and has a list of classes: maybe Eclipse can see more than just a .ear file!&lt;/b&gt;

So I opened Eclipse, created a new Java project and set the location of my EAR file as the directory under &quot;Create project at external location&quot;.  Create a name for the project and hit Finish.  Eclipse then prompted me to switch to the Java perspective (from CFEclipse which is my default) and to my amazement, I see a list of jar files and packages!  I click to expand cfusion.jar and it expands to show me a list of coldfusion packages.  I click to expand coldfusion.sql and I see a list of classes and properties.   I expand SqlImpl.class and see methods and properties which I may be able to leverage.

So I&apos;m still no closer to getting the exact SqlStatement because I&apos;m still unsure as to how to access the property I need.  If anyone following these steps is able to point this out I would greatly appreciate it.

Now THAT is something Homesite and Dreamweaver can&apos;t do ;-)
				
				</description>
						
				
				<category>Eclipse</category>				
				
				<category>Coldfusion</category>				
				
				<category>Java</category>				
				
				<pubDate>Wed, 02 Mar 2005 14:26:56 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2005/3/2/Eclipse-uncovers-ColdFusion&apos;s-Secret-Powers</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>He3 SQL Integration</title>
				<link>http://www.webdevref.com/blog/index.cfm/2004/7/13/He3-SQL-Integration</link>
				<description>
				
				In case you hadn&apos;t heard, I am helping code &lt;a href=&quot;http://richpalette.com/products.html&quot;&gt;He3&lt;/a&gt; as part of the &lt;a href=&quot;http://richpalette.com/&quot;&gt;RichPalette.com&lt;/a&gt; team.  My specific focus is to deliver the SQL editor and database integration features.  

This is of particular interest to me as a corporate IT Application Development programmer since 60 to 80 percent of my day is spent writing ad-hoc queries to support our user base.  The remainder of my work on new development is focused on delivering ColdFusion interfaces and SQL Server stored procedures to deliver more efficient versions of components of our ERP system.

I&apos;ve essentially started from the point of &quot;what do SQL Query Analyzer and Enterprise Manager offer me that I find useful and what do I wish it would do?&quot;.  I&apos;ve solicited the input of many local developers at the last Atlanta ColdFusion User Group meeting about SQL IDE&apos;s and asked for the best and worst features of &lt;a href=&quot;http://www.toadsoft.com/&quot;&gt;Toad&lt;/a&gt;, &lt;a href=&quot;http://otn.oracle.com/tech/sql_plus/index.html&quot;&gt;SQL *Plus&lt;/a&gt; and also some Eclipse SQL IDE&apos;s.

I will be publishing a list of the initial SQL features soon to test interest levels.  I thought I would throw the floor open to anyone who reads this blog for further suggestions until I can get the public bug tracker and feature request page configured.  So have at it.  There have already been some excellent suggestions across other blogs about non-SQL features.  

Which databases are you guys and gals using with ColdFusion?  My assumptions are SQL Server, Oracle, Access and MySql.  What else would you need to see support for?
				
				</description>
						
				
				<category>Coldfusion</category>				
				
				<category>SQL</category>				
				
				<category>Java</category>				
				
				<pubDate>Tue, 13 Jul 2004 11:09:31 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2004/7/13/He3-SQL-Integration</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Fame, Dodgeball, dynamic images, bad jokes and PHP</title>
				<link>http://www.webdevref.com/blog/index.cfm/2004/6/21/Fame,-Dodgeball,-dynamic-images,-bad-jokes-and-PHP</link>
				<description>
				
				This weekend I read a PHP and MySQL book cover to cover, watched Dodgeball at the Regal 24, met the lead singer of Keane and then was caught on camera in the background of a Fox 5 Atlanta outside broadcast this morning while I sipped my coffee and read the closing chapter of the &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0786260033/thesurgerepor-20&quot;&gt;Benjamin Franklin&lt;/a&gt; book.

As a veteran CFer and SQL Programmer I was intrigued to read about PHP and MySQL in &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/067232525X/thesurgerepor-20&quot;&gt;&quot;PHP and MySQL Web Development, Second Edition&quot; by Luke Welling and Laura Thompson&lt;/a&gt;.  Learning a new language is always going to reveal some interesting things and one that was particularly intersting was the availability of the &lt;a href=&quot;http://www.boutell.com/gd/&quot;&gt;GD libraries&lt;/a&gt; to allow the creation of dynamic images.  This was of relevance to a recent &lt;a href=&quot;http://www.houseoffusion.com/cf_lists/index.cfm/method=messages&amp;threadid=33293&amp;forumid=4&quot;&gt;thread on CF-Talk&lt;/a&gt; where someone brought up the idea of CAPTCHA images from a CF only standpoint.  PHP uses the GD libraries to generate GIF, JPEG and PNG images which allow you to combine text and images on the fly for buttons or, indeed, CAPTCHA images.  I reviewed the C code to implement this and it struck me as something which could be easily migrated to CF as a custom tag.  

Imagine being able to call &lt;BR&gt;
&amp;lt;cfdraw imageName=&quot;myImage&quot; height=&quot;300&quot; width=&quot;300&quot; format=&quot;JPG&quot;&gt;&lt;BR&gt;
&amp;nbsp;circle(10,100,50,red);&lt;BR&gt;
&amp;nbsp;text(verdana,10,50,50,black);&lt;BR&gt;
&amp;lt;/cfdraw&gt;&lt;BR&gt;
to see a dynamic JPEG image of a circle at 10,100 50 pixels wide in red with some black text over the top in Verdana 10px font at 50,50.

That would be fun.  The book was a little disappointing from an established programmer perspective.  I would guess that 80% of what someone with existing programming skills would need to know to write code in PHP with MySQL is presented in the first 258 pages.  Then pages 259 through 436 offer some advanced topics including the dynamic image information before the remaining 350 pages describe 8 example applications and offer some information on building large projects and debugging them.

A great book I recently finished was &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/1592400876/thesurgerepor-20&quot;&gt;&quot;Eats, Shoots and Leaves&quot;&lt;/a&gt; by Lynne Trusse.  I heard an interview with Lynne on NPR and thought the book sounded like fun.  The British author takes a dicatatorial stance on the issue of punctuation and its abuse (note the correct absence of an apostrophe in its).  Not only did I learn about the subtle mistakes in my own writing but I have a keener eye for spotting errors elsewhere.   The book is a quick read with delightfully humorous examples taken from the media and her local environment.  One example which stands out is the sign &quot;Book&apos;s, DVD&apos;s and CD&apos;s&quot;  - where book&apos;s should be apostropheless since it is a plural whereas CD&apos;s and DVD&apos;s is correct since the apostrophe indicates the contraction of the word discs to d&apos;s.  

Pick up a copy of &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/1861004370/thesurgerepor-20&quot;&gt;&quot;Beginning Java Databases&quot;&lt;/a&gt; for an incredibly good account of writing Java to connect to a database, run queries and extract metadata about the database.  Here the first 60 pages are a &quot;what you need to know&quot; quick-start guide to querying a database followed by a more detailed discussion of SQL concepts and JDBC application development.  I have thoroughly enjoyed the book and it is empowering in many ways since it takes what you know about databases in ColdFusion and escalates you to the underlying principles.

Watch Dodgeball with Ben Stiller and Vince Vaughn.  Seriously.  It makes great light relief after a week of geeky books and it has to be my favorite movie of the year so far, ranking as high as Old School, maybe higher.  

&lt;img src=&quot;images/picture005.jpg&quot; align=&quot;left&quot;&gt;...and finally, after the Keane concert at the Cotton Club in Atlanta on Friday night I had a surprise opportunity to chat with Tom Chaplin, the lead singer of Keane.  For the uninitiated, Keane&apos;s album &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B000268QB2/thesurgerepor-20&quot;&gt;&quot;Hopes and Fears&quot;&lt;/a&gt; is number one in the British album chart and they are making waves on US radio stations currently with &quot;Somewhere only we know&quot;.  There is a good review of the band at &lt;a href=&quot;http://www.metrowestdailynews.com/artsCulture/view.bg?articleid=70622&quot;&gt;MetroWest Daily News&lt;/a&gt;.  The fun part was knowing that this has the potential of another Coldplay.  I saw Coldplay at the Reading-Leeds festival in 1999 when the band were new to the scene but still with a good crowd.  When I moved to the US in 2000 I saw them play at a small club, maybe Metro, and there were fewer than 100 people there.  Big contrast with the 2002 concert I attended in Atlanta at the Gwinett Civic Center where I strained my eyes to make out the band members on the stage from the rediculously priced seats I bought for Melissa and I.
				
				</description>
						
				
				<category>Movies</category>				
				
				<category>Books</category>				
				
				<category>Coldfusion</category>				
				
				<category>SQL</category>				
				
				<category>Music</category>				
				
				<category>Java</category>				
				
				<pubDate>Mon, 21 Jun 2004 12:00:36 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2004/6/21/Fame,-Dodgeball,-dynamic-images,-bad-jokes-and-PHP</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Pt 2: Howitt&apos;s Anagram Theory</title>
				<link>http://www.webdevref.com/blog/index.cfm/2003/12/2/Pt-2:-Howitt&apos;s-Anagram-Theory</link>
				<description>
				
				Here is my code for the Anagram program so far:

public class Anagram {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;String initialWord;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuffer anagrams=new StringBuffer();&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;public Anagram(String word) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;//constructor for an anagram&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.initialWord = word;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;public void makeAnagram (String separator) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;//to create an anagram call this method with the separator you wish to use&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;//in the resulting StringBuffer to separate words e.g. &quot;&amp;lt;br&amp;gt;&quot; for 
web apps&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;anagrams.delete(0,anagrams.length());&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;makeAnagram(&quot;&quot;,this.initialWord,separator);&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;public String deleteAt(String word, int pos) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;//this method takes a string and returns the same string less the character&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;//at the position specified by the integer pos&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (pos &gt; 0 &amp;&amp; pos &lt; word.length()-1) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return word.substring(0,pos)+word.substring(pos+1,word.length());&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (pos==0) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return word.substring(pos+1,word.length());&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (pos == word.length()-1) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return word.substring(0,pos);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return word;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;private void makeAnagram (String wordStart, String word, String separator) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;//this is the recursive method which actually generates the list of anagrams&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;//initially wordStart is the empty string but as it loops into the code it loops over&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;//all the possible word beginnings&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String wordCopy = word;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i&lt; word.length(); i++) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//hide dupes: only run this word if it is the first instance of the letter in the word&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (word.indexOf(word.charAt(i))  == i) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//remove the current character from the letters to be passed to the &lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//next recursion since we are adding it to the wordStart segment&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wordCopy=deleteAt(word,i);&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (word.length() &gt; 1) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//complex case - current word is longer than 1 character so the current&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//character is added to the wordStart segment &lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;makeAnagram(wordStart + word.charAt(i),wordCopy,separator);&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//trivial case - word length is 1 so only 1 permutation&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (anagrams.length() == 0) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//our list shouldn&apos;t start with a list separator&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;anagrams.append(wordStart).append(word);&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;anagrams.append(separator).append(wordStart).append(word);&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;public int countInstances(String word, char letter) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;//this method determines how many copies of a specific character are in the string&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i=0;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (word.indexOf(letter) &gt;= 0) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;word=word.substring(word.indexOf(letter)+1,word.length());&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i++;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return i;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;public static double factorial(int x) {  &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;// This method computes x! &lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (x &lt; 0)              &lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    return 0.0;         &lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double fact = 1.0;      &lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(x &gt; 1) {          &lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    fact = fact * x;    &lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    x = x - 1;          &lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}                       &lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return fact;            &lt;BR&gt;
    }  &lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;public double calcAnagram () {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;//This method uses my theory - Howitt&apos;s Anagram Theory to calculate the number&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;//of unique permutations possible for the given words.&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;//THEORY: UniquePermutations = factorial(word.length) &lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;divided by  the product of the factorials of the count of instances of each &lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;letter in the word.  e.g. aabbbc would be 6!/(2!*3!*1!) = 720/(2*6*1) = 60&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String word = this.initialWord;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double factSum = 1;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i&lt; word.length(); i++) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (word.indexOf(word.charAt(i))  == i) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;factSum  = factSum * factorial(countInstances(word,word.charAt(i)));&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return factorial(word.length())/factSum;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&lt;BR&gt;
}&lt;BR&gt;

Here is the code to test it:

public class TestAnagram {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;public static void main(String[] args) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Anagram words = new Anagram(args[0]);&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String separator;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//if a &quot;y&quot; is passed as a second variable, then display the anagrams else don&apos;t&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//if a 3rd argument is supplied, it is used as the separator to display the anagrams&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (args.length &gt;= 2 &amp;&amp; args[1].indexOf(&quot;y&quot;)&gt;=0) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (args.length &gt;= 3) {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;separator = &quot;,&quot;;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;separator = &quot;&amp;lt;BR&amp;gt;&quot;;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;words.makeAnagram(separator);&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(words.anagrams);&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(words.calcAnagram());&lt;BR&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;
}&lt;BR&gt;&lt;BR&gt;
				
				</description>
						
				
				<category>Java</category>				
				
				<pubDate>Tue, 02 Dec 2003 11:12:49 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2003/12/2/Pt-2:-Howitt&apos;s-Anagram-Theory</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Howitt&apos;s Anagram Theory</title>
				<link>http://www.webdevref.com/blog/index.cfm/2003/12/1/Howitt&apos;s-Anagram-Theory</link>
				<description>
				
				I am reading Dan Brown&apos;s &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0385504209/thesurgerepor-20&quot;&gt;&quot;The Da Vinci Code&quot;&lt;/a&gt; and in addition to the fact that it is a great read chock full of geek codebreaking goodness, it renewed my interest in anagrams.  

Employing my best Java to write an anagram generator I am trying to work out the quickest way to generate all the possible anagrams of a sentence in as little time as possible.

During my search I came across what appears to be a solid fact about anagrams (please post a comment if you find it to be inaccurate):
&lt;b&gt;the total number of unique anagrams generated from an input string n characters long will be n! (factorial) divided by the the product of all the u! (factorial) where u is a unique character in the input string&lt;/b&gt;
e.g. aaabb will be 5!/(3!*2!) = 10

I haven&apos;t found a case where this doesn&apos;t work but similarly don&apos;t have a full mathematical proof either.
				
				</description>
						
				
				<category>Java</category>				
				
				<pubDate>Mon, 01 Dec 2003 14:44:37 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2003/12/1/Howitt&apos;s-Anagram-Theory</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Flash Scrabble/Wordblog With Scoring</title>
				<link>http://www.webdevref.com/blog/index.cfm/2003/9/23/Flash-Scrabble/Wordblog-With-Scoring</link>
				<description>
				
				The scoring for the &lt;a href=&quot;http://www.puzzleblog.com&quot;&gt;wordblog/puzzleblog site&lt;/a&gt; was simple to add.  I&apos;ve also changed the alpha settings of the letter tiles so you can still get an idea of which bonuses exist underneath the letters.  Please leave feedback in the comments section if you find bugs, think it could be done differently or just to say you like it! (and of course give your best words/scores):

&lt;OBJECT classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0&quot; WIDTH=&quot;450&quot; HEIGHT=&quot;200&quot; id=&quot;scrScore&quot;  ALIGN=&quot;&quot;&gt;&lt;PARAM NAME=movie VALUE=&quot;scrScore.swf?letters=milkman&amp;board=01d20304&quot;&gt;&lt;PARAM NAME=quality VALUE=high&gt;&lt;PARAM NAME=bgcolor VALUE=#000000&gt;&lt;EMBED src=&quot;scrScore.swf&quot; quality=high bgcolor=#000000 WIDTH=&quot;450&quot; HEIGHT=&quot;200&quot; NAME=&quot;scrScore&quot; ALIGN=&quot;&quot; TYPE=&quot;application/x-shockwave-flash&quot; PLUGINSPAGE=&quot;http://www.macromedia.com/go/getflashplayer&quot;&gt;&lt;/EMBED&gt;
&lt;/OBJECT&gt;
				
				</description>
						
				
				<category>Flash</category>				
				
				<category>Tech</category>				
				
				<category>Blogging</category>				
				
				<category>Java</category>				
				
				<pubDate>Tue, 23 Sep 2003 22:44:56 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2003/9/23/Flash-Scrabble/Wordblog-With-Scoring</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Flash Scrabble/Wordblog Minus scoring</title>
				<link>http://www.webdevref.com/blog/index.cfm/2003/9/23/Flash-Scrabble/Wordblog-Minus-scoring</link>
				<description>
				
				This is the almost complete application for the wordblog/puzzleblog site.  Please leave feedback in the comments section if you find bugs, think it could be done differently or just to say you like it!

&lt;OBJECT classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0&quot; WIDTH=&quot;450&quot; HEIGHT=&quot;200&quot; id=&quot;realOoScr&quot;  ALIGN=&quot;&quot;&gt;&lt;PARAM NAME=movie VALUE=&quot;realOoScr.swf?letters=boredom&amp;board=01d02340&quot;&gt;&lt;PARAM NAME=quality VALUE=high&gt;&lt;PARAM NAME=bgcolor VALUE=#000000&gt;&lt;EMBED src=&quot;realOoScr.swf&quot; quality=high bgcolor=#000000 WIDTH=&quot;450&quot; HEIGHT=&quot;200&quot; NAME=&quot;realOoScr&quot; ALIGN=&quot;&quot; TYPE=&quot;application/x-shockwave-flash&quot; PLUGINSPAGE=&quot;http://www.macromedia.com/go/getflashplayer&quot;&gt;&lt;/EMBED&gt;
&lt;/OBJECT&gt;
				
				</description>
						
				
				<category>Flash</category>				
				
				<category>Tech</category>				
				
				<category>Blogging</category>				
				
				<category>Java</category>				
				
				<pubDate>Tue, 23 Sep 2003 19:02:54 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2003/9/23/Flash-Scrabble/Wordblog-Minus-scoring</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Flash WordBlog/Scrabble Engine</title>
				<link>http://www.webdevref.com/blog/index.cfm/2003/9/22/Flash-WordBlog/Scrabble-Engine</link>
				<description>
				
				Here&apos;s the flash WordBlog/Scrabble Engine as it stands.  The last part for me to write is the interface, which calls the methods in the game engine.  This is a good example of separating logic from the interface.  I hope to nail this by this afternoon and then I&apos;ll post the final app on here.

&lt;style&gt;
.code {font: System;}
&lt;/style&gt;
&lt;div class=&quot;code&quot;&gt;
function Tile (letter,pv) {&lt;BR&gt;
	this.displayChar=letter;&lt;BR&gt;
	this.pointsValue=pv;&lt;BR&gt;
&lt;BR&gt;
	Tile.prototype.getValue = function () {&lt;BR&gt;
		return this.pointsValue;&lt;BR&gt;
	}&lt;BR&gt;
	&lt;BR&gt;
	Tile.prototype.toString = function () {&lt;BR&gt;
		return &quot;This tile is the letter &quot; + this.displayChar + &quot; and it is worth &quot; + this.pointsValue;&lt;BR&gt;
	}&lt;BR&gt;
}&lt;BR&gt;
&lt;BR&gt;
function Square(contents,bonusMult,bonusType,x,y) {&lt;BR&gt;
	this._x = x;&lt;BR&gt;
	this._y = y;&lt;BR&gt;
	this.currentTile = contents; 		&lt;BR&gt;
	this.bonusMultiplier = bonusMult;	//bonus multiplier is typically 1,2 or 3	&lt;BR&gt;
	this.bonusType = bonusType;			//bonus type is either w=word, l=letter&lt;BR&gt;
&lt;BR&gt;
	Square.prototype.getCurrentTile = function () {&lt;BR&gt;
		return	this.currentTile;&lt;BR&gt;
	}&lt;BR&gt;
&lt;BR&gt;
	Square.prototype.setCurrentTile = function (tile) {&lt;BR&gt;
		if (this.currentTile != null) {&lt;BR&gt;
			return false;&lt;BR&gt;
		} else {&lt;BR&gt;
			this.currentTile = tile;&lt;BR&gt;
			return true;&lt;BR&gt;
		}&lt;BR&gt;
	}&lt;BR&gt;
&lt;BR&gt;
	Square.prototype.getContents=function () {&lt;BR&gt;
		if (this.currentTile == null) {&lt;BR&gt;
			return &quot;has no tile&quot;;&lt;BR&gt;
		} else {&lt;BR&gt;
			return &quot;has the letter &quot; + this.currentTile.displayChar + &quot;, worth &quot; + this.currentTile.pointsValue+&quot; points&quot;;&lt;BR&gt;
		}&lt;BR&gt;
	}&lt;BR&gt;
	&lt;BR&gt;
	Square.prototype.isEmpty=function () {&lt;BR&gt;
		if (this.currentTile == null) {&lt;BR&gt;
			return true;&lt;BR&gt;
		} else {&lt;BR&gt;
			return false;&lt;BR&gt;
		}&lt;BR&gt;
	}&lt;BR&gt;
	&lt;BR&gt;
	Square.prototype.getBonusType=function () {&lt;BR&gt;
		if (this.bonusType == &apos;l&apos;) {&lt;BR&gt;
			return &quot;letter&quot;;&lt;BR&gt;
		} else {&lt;BR&gt;
			return &quot;word&quot;;&lt;BR&gt;
		}&lt;BR&gt;
	}&lt;BR&gt;
&lt;BR&gt;
	Square.prototype.getMultiplierType = function () {&lt;BR&gt;
		switch(this.bonusMultiplier) {&lt;BR&gt;
			case 2: &lt;BR&gt;
				return &quot;double&quot;;&lt;BR&gt;
			case 3: &lt;BR&gt;
				return &quot;triple&quot;;&lt;BR&gt;
			default:&lt;BR&gt;
				return &quot;&quot;+this.bonusMultiplier + &quot;X&quot;;&lt;BR&gt;
		}&lt;BR&gt;
	}&lt;BR&gt;
	&lt;BR&gt;
	Square.prototype.summarizeSquare = function () {&lt;BR&gt;
		if (this.bonusMultiplier == 1) { &lt;BR&gt;
			return &quot;is a basic blank square&quot;;&lt;BR&gt;
		} else {&lt;BR&gt;
			return &quot;has a &quot; + this.getMultiplierType() + &quot; &quot; + this.getBonusType() + &quot; bonus&quot;;&lt;BR&gt;
		}&lt;BR&gt;
	}&lt;BR&gt;
	&lt;BR&gt;
	Square.prototype.toString = function () {&lt;BR&gt;
		return &quot;This square is at {&quot; + this._x + &quot;,&quot; +this._y + &quot;}, &quot; + this.getContents() + &quot; and &quot; + this.summarizeSquare();&lt;BR&gt;
	}&lt;BR&gt;
}&lt;BR&gt;
&lt;BR&gt;
function RackSquare(contents,x,y) {&lt;BR&gt;
	this._x = x;&lt;BR&gt;
	this._y = y;&lt;BR&gt;
	this.currentTile = contents;&lt;BR&gt;
	&lt;BR&gt;
	RackSquare.prototype.setCurrentTile = function (tile) {&lt;BR&gt;
		if (this.currentTile != null) {&lt;BR&gt;
			return false;&lt;BR&gt;
		} else {&lt;BR&gt;
			this.currentTile = tile;&lt;BR&gt;
			return true;&lt;BR&gt;
		}&lt;BR&gt;
	}&lt;BR&gt;
&lt;BR&gt;
	RackSquare.prototype.getCurrentTile = function () {&lt;BR&gt;
		return	this.currentTile;&lt;BR&gt;
	}&lt;BR&gt;
	&lt;BR&gt;
	RackSquare.prototype.getContents=function () {&lt;BR&gt;
		if (this.currentTile == null) {&lt;BR&gt;
			return &quot;has no tile&quot;;&lt;BR&gt;
		} else {&lt;BR&gt;
			return &quot;has the letter &quot; + this.currentTile.displayChar + &quot;, worth &quot; + this.currentTile.pointsValue+&quot; points&quot;;&lt;BR&gt;
		}&lt;BR&gt;
	}&lt;BR&gt;
	&lt;BR&gt;
	RackSquare.prototype.toString = function () {&lt;BR&gt;
		return &quot;This square is at {&quot; + this._x + &quot;,&quot; +this._y + &quot;} and &quot; + this.getContents();&lt;BR&gt;
	}&lt;BR&gt;
}&lt;BR&gt;
&lt;BR&gt;
function WordBlog(letters, squares) {&lt;BR&gt;
	this.rack = Array(letters.length);&lt;BR&gt;
	this.board = Array(squares.length);&lt;BR&gt;
	this.letters=letters;&lt;BR&gt;
	this.squares=squares;&lt;BR&gt;
	trace(&quot;Setup parameters: &apos;&quot; +letters+ &quot;&apos; are the letters and &apos;&quot; +squares + &quot;&apos; are the squares&quot;);&lt;BR&gt;
	&lt;BR&gt;
	WordBlog.prototype.init = function() {&lt;BR&gt;
		this.initRack(this.letters);&lt;BR&gt;
		this.initBoard(this.squares);&lt;BR&gt;
	}&lt;BR&gt;
	&lt;BR&gt;
	WordBlog.prototype.getPv = function(currentLetter) {&lt;BR&gt;
		if (&quot;aeilnostu&quot;.indexOf(currentLetter) != -1) {currentPv=1;};&lt;BR&gt;
		if (&quot;gd&quot;.indexOf(currentLetter) != -1) {currentPv=2;};&lt;BR&gt;
		if (&quot;bcmp&quot;.indexOf(currentLetter) != -1) {currentPv=3;};&lt;BR&gt;
		if (&quot;vwyhf&quot;.indexOf(currentLetter) != -1) {currentPv=4;};&lt;BR&gt;
		if (&quot;k&quot;.indexOf(currentLetter) != -1) {currentPv=5;};&lt;BR&gt;
		if (&quot;jx&quot;.indexOf(currentLetter) != -1) {currentPv=8;};&lt;BR&gt;
		if (&quot;qz&quot;.indexOf(currentLetter) != -1) {currentPv=10;};&lt;BR&gt;
		return currentPv;&lt;BR&gt;
	}&lt;BR&gt;
	&lt;BR&gt;
	WordBlog.prototype.initRack = function (letters) {&lt;BR&gt;
		currentX = 35;&lt;BR&gt;
		for (i=0;i&lt;letters.length;i++) {&lt;BR&gt;
			currentLetter=letters.charAt(i);&lt;BR&gt;
			currentPv=this.getPv(currentLetter);&lt;BR&gt;
			currentTile= new Tile(currentLetter,currentPv);&lt;BR&gt;
			this.rack[i]=new RackSquare(currentTile,currentX,35);&lt;BR&gt;
			currentX=currentX+100;&lt;BR&gt;
		}&lt;BR&gt;
		this.showRack();&lt;BR&gt;
	}&lt;BR&gt;
	&lt;BR&gt;
	WordBlog.prototype.initBoard = function (squares) {&lt;BR&gt;
		currentX = 35;&lt;BR&gt;
		for (i=0;i&lt;squares.length;i++) {&lt;BR&gt;
			currTile = null;&lt;BR&gt;
			currentSquare=squares.charAt(i);&lt;BR&gt;
			switch (currentSquare) {&lt;BR&gt;
				case &quot;0&quot;: sqContents = null; bonusMult=1; bonusType = null; break;&lt;BR&gt;
				case &quot;1&quot;: sqContents = null; bonusMult=2; bonusType = &apos;l&apos;; break;&lt;BR&gt;
				case &quot;2&quot;: sqContents = null; bonusMult=2; bonusType = &apos;w&apos;; break;&lt;BR&gt;
				case &quot;3&quot;: sqContents = null; bonusMult=3; bonusType = &apos;l&apos;; break;&lt;BR&gt;
				case &quot;4&quot;: sqContents = null; bonusMult=3; bonusType = &apos;l&apos;; break;&lt;BR&gt;
				default: &lt;BR&gt;
					sqContents = currentSquare; &lt;BR&gt;
					bonusMult=1; &lt;BR&gt;
					bonusType =null; &lt;BR&gt;
					currentPv=this.getPv(currentLetter);&lt;BR&gt;
					currTile = new Tile(sqContents,currentPv);&lt;BR&gt;
			}&lt;BR&gt;
			this.board[i]= new Square(currTile,bonusMult,bonusType,currentX,200);&lt;BR&gt;
			currentX=currentX+100;&lt;BR&gt;
		}&lt;BR&gt;
		this.showBoard();&lt;BR&gt;
	}&lt;BR&gt;
	WordBlog.prototype.showBoard = function () {&lt;BR&gt;
		for (i=0;i&lt;this.board.length;i++) {&lt;BR&gt;
			trace(this.board[i].toString());&lt;BR&gt;
		}&lt;BR&gt;
	}&lt;BR&gt;
	&lt;BR&gt;
	WordBlog.prototype.showRack = function () {&lt;BR&gt;
		for (i=0;i&lt;this.rack.length;i++) {&lt;BR&gt;
			trace(this.rack[i].toString());&lt;BR&gt;
		}&lt;BR&gt;
	}&lt;BR&gt;
	&lt;BR&gt;
	WordBlog.prototype.moveTile = function (src,dest) {&lt;BR&gt;
		trace(&quot;Src:&quot;+src.getCurrentTile().toString());&lt;BR&gt;
		trace(&quot;Dest:&quot;+dest.getCurrentTile().toString());&lt;BR&gt;
		if (dest.isEmpty() == true ) {&lt;BR&gt;
			dest.setCurrentTile(src.getCurrentTile());&lt;BR&gt;
			src.currentTile = null;&lt;BR&gt;
			return true;&lt;BR&gt;
		} else {&lt;BR&gt;
			return false;&lt;BR&gt;
		}&lt;BR&gt;
	}&lt;BR&gt;
}&lt;BR&gt;
myGame=new WordBlog(&quot;abcdefg&quot;,&quot;01010ddd&quot;);&lt;BR&gt;
myGame.init();&lt;BR&gt;
&lt;BR&gt;
trace(&quot;move a tile init&quot;);&lt;BR&gt;
myGame.moveTile(myGame.rack[1],myGame.board[1]);&lt;BR&gt;
myGame.showRack();&lt;BR&gt;
myGame.showBoard();&lt;BR&gt;
&lt;BR&gt;
trace(&quot;move a tile illegally&quot;);&lt;BR&gt;
myGame.moveTile(myGame.rack[1],myGame.board[2]);&lt;BR&gt;
myGame.showRack();&lt;BR&gt;
myGame.showBoard();&lt;BR&gt;
&lt;/Div&gt;
				
				</description>
						
				
				<category>Flash</category>				
				
				<category>Tech</category>				
				
				<category>Java</category>				
				
				<pubDate>Mon, 22 Sep 2003 13:27:40 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2003/9/22/Flash-WordBlog/Scrabble-Engine</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Scrabble Project Management Spreadsheet</title>
				<link>http://www.webdevref.com/blog/index.cfm/2003/9/17/Scrabble-Project-Management-Spreadsheet</link>
				<description>
				
				I&apos;ve been a big fan of &lt;a href=&quot;http://www.joelonsoftware.com&quot;&gt;Joel Spolsky&apos;s approach to software&lt;/a&gt; for some time now and I&apos;ve converted my previous project plan over to use his &lt;a href=&quot;http://www.joelonsoftware.com/articles/fog0000000245.html&quot;&gt;template for software design&lt;/a&gt;:

&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
  &lt;tr&gt;
    &lt;td colspan=&quot;9&quot;&gt;Project Plan &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Type &lt;/td&gt;
    &lt;td&gt;Class &lt;/td&gt;
    &lt;td&gt;Data Members &lt;/td&gt;
    &lt;td&gt;WordBlog &lt;/td&gt;
    &lt;td&gt;Priority &lt;/td&gt;
    &lt;td&gt;Orig Est Hrs &lt;/td&gt;
    &lt;td&gt;Curr Est Hrs &lt;/td&gt;
    &lt;td&gt;Elapsed Hrs &lt;/td&gt;
    &lt;td&gt;Remain &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Class &lt;/td&gt;
    &lt;td&gt;Letter &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Data Member &lt;/td&gt;
    &lt;td&gt;Char letter &lt;/td&gt;
    &lt;td&gt;A-Z plus _ for blank &lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Data Member &lt;/td&gt;
    &lt;td&gt;Int pointsValue &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Class &lt;/td&gt;
    &lt;td&gt;Tile &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;2 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Data Member &lt;/td&gt;
    &lt;td&gt;Letter letter &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;2 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Method &lt;/td&gt;
    &lt;td&gt;int getValue() &lt;/td&gt;
    &lt;td&gt;How many points is the tile worth &lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;2 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1&lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Class &lt;/td&gt;
    &lt;td&gt;Square &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;3 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Data Member &lt;/td&gt;
    &lt;td&gt;Tile currentTile &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;3 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Data Member &lt;/td&gt;
    &lt;td&gt;Int bonusMultiplier &lt;/td&gt;
    &lt;td&gt;1,2 or 3 &lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;3 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Data Member &lt;/td&gt;
    &lt;td&gt;Char bonusType &lt;/td&gt;
    &lt;td&gt;w=won, l=lost &lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;3 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Class &lt;/td&gt;
    &lt;td&gt;Board &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;4 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Data Member &lt;/td&gt;
    &lt;td&gt;Square[][] squares &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;4 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Method &lt;/td&gt;
    &lt;td&gt;void resetBoard() &lt;/td&gt;
    &lt;td&gt;Create default board &lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;4 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Method &lt;/td&gt;
    &lt;td&gt;void createBoard(Square [][] squares) &lt;/td&gt;
    &lt;td&gt;Create a board as specified &lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;4 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Class &lt;/td&gt;
    &lt;td&gt;BoardSegment &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Data Member &lt;/td&gt;
    &lt;td&gt;Square startSquare &lt;/td&gt;
    &lt;td&gt;Pointer to a square on the board &lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Data Member &lt;/td&gt;
    &lt;td&gt;Int squareCount &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Data Member &lt;/td&gt;
    &lt;td&gt;Char direction &lt;/td&gt;
    &lt;td&gt;h=horizontal, v=vertical &lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Class &lt;/td&gt;
    &lt;td&gt;Rack &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;6 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Data Member &lt;/td&gt;
    &lt;td&gt;LinkedList currentRack &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;6 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Method &lt;/td&gt;
    &lt;td&gt;tile removeSpecific(Lette r target) &lt;/td&gt;
    &lt;td&gt;Remove a specific letter &lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;6 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Method &lt;/td&gt;
    &lt;td&gt;void addTile(Tile tile) &lt;/td&gt;
    &lt;td&gt;Adds a tile &lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;6 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Method &lt;/td&gt;
    &lt;td&gt;void addTile(Tile[] tiles) &lt;/td&gt;
    &lt;td&gt;Adds several tiles &lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;6 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Class &lt;/td&gt;
    &lt;td&gt;Move &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;7 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Data Member &lt;/td&gt;
    &lt;td&gt;Tile currentTile &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;7 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Data Member &lt;/td&gt;
    &lt;td&gt;Square square &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;7 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Class &lt;/td&gt;
    &lt;td&gt;Turn &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;8 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Data Member &lt;/td&gt;
    &lt;td&gt;Move[] turn &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;8 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Method &lt;/td&gt;
    &lt;td&gt;int move(Move[] moves) &lt;/td&gt;
    &lt;td&gt;Apply the moves comprising the turn and return the score for the turn &lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;8 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.5 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Class &lt;/td&gt;
    &lt;td&gt;void main(String[] args) &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0.1 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Other time &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Vacation &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Debugging &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;5.4 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;5.4 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;5.4 &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Totals &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Yes &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;10.8 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;10.7 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;0 &lt;/td&gt;
    &lt;td align=&quot;right&quot;&gt;10.7 &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
				
				</description>
						
				
				<category>Java</category>				
				
				<pubDate>Wed, 17 Sep 2003 16:18:24 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2003/9/17/Scrabble-Project-Management-Spreadsheet</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Methods and Data Members for Scrabble</title>
				<link>http://www.webdevref.com/blog/index.cfm/2003/9/17/Methods-and-Data-Members-for-Scrabble</link>
				<description>
				
				Here is my first pass at a list of Classes, their data members and their methods for the &lt;a href=&quot;http://www.knowmysize.com/blog/index.cfm?mode=entry&amp;entry=81&quot;&gt;Scrabble game&lt;/a&gt;.

&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
  &lt;tr&gt;
    &lt;td height=&quot;40&quot; colspan=&quot;5&quot; class=&quot;xl25&quot;&gt;&lt;div align=&quot;center&quot;&gt;
      &lt;p&gt;&lt;strong&gt;Scrabble Class Plan &lt;/strong&gt;&lt;span class=&quot;style1&quot;&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/div&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td class=&quot;xl24&quot;&gt;&lt;strong&gt;Class &lt;/strong&gt;&lt;/td&gt;
    &lt;td class=&quot;xl24&quot;&gt;&lt;strong&gt;Data Members &lt;/strong&gt;&lt;/td&gt;
    &lt;td class=&quot;xl24&quot;&gt;&lt;strong&gt;Data Member Notes &lt;/strong&gt;&lt;/td&gt;
    &lt;td class=&quot;xl24&quot;&gt;&lt;strong&gt;Methods &lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;&lt;strong&gt;Method Notes &lt;/strong&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Letter &lt;/td&gt;
    &lt;td&gt;Char letter &lt;/td&gt;
    &lt;td&gt;A-Z plus _ for blank &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Int pointsValue &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Tile &lt;/td&gt;
    &lt;td&gt;Letter letter &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;int getValue() &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;How many points is the tile worth &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Square &lt;/td&gt;
    &lt;td&gt;Tile currentTile &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Int bonusMultiplier &lt;/td&gt;
    &lt;td&gt;1,2 or 3 &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Char bonusType &lt;/td&gt;
    &lt;td&gt;w=won, l=lost &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Board &lt;/td&gt;
    &lt;td&gt;Square[][] squares &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void resetBoard() &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Create default board &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void createBoard(Square[][] squares) &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Create a board as specified &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;BoardSegment &lt;/td&gt;
    &lt;td&gt;Square startSquare &lt;/td&gt;
    &lt;td&gt;Pointer to a square on the board &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Int squareCount &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Char direction &lt;/td&gt;
    &lt;td&gt;h=horizontal, v=vertical &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Bag &lt;/td&gt;
    &lt;td&gt;LinkedList currentBag &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void resetBag() &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Create default bag and randomize the contents &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void resetBag(Tile[] tiles) &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Create bag to serve tiles in a specified order &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;tile[] removeRand(Int quantity) &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Remove a set number of random tiles &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;tile removeRand() &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Remove a random tile &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;tile removeSpecific(Letter target) &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Remove a specific letter &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;tile[] removeSpecific(Letter[] targets) &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Remove a set of specific letters &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Rack &lt;/td&gt;
    &lt;td&gt;LinkedList currentRack &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;tile removeSpecific(Letter target) &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Remove a specific letter &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void addTile(Tile tile) &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Adds a tile &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void addTile(Tile[] tiles) &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Adds several tiles &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Player &lt;/td&gt;
    &lt;td&gt;String firstName &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;String lastName &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Seat &lt;/td&gt;
    &lt;td&gt;Rack playersRack &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void resetScore() &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Resets the player score to zero &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Int gameScore &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void throwRack() &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Transfers the remaining tiles on the rack for the seat back into the bag &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Player currentPlayer &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;int addPoints(Int numPoints) &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Increase the score for the seat &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;int removePoints(Int numPoints) &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;Decrease the score for the seat &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Players &lt;/td&gt;
    &lt;td&gt;CircLinkedList players (type GamePlayer) &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void deletePlayer(Player player) &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;GamePlayer currentPlayer &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void addPlayer(Player player) &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;player nextPlayer() &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Move &lt;/td&gt;
    &lt;td&gt;Tile currentTile &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Square square &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Turn &lt;/td&gt;
    &lt;td&gt;Move[] turn &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;int move(Move[] moves) &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Player player &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void skipGo() &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Int moveCounter &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Game &lt;/td&gt;
    &lt;td&gt;Seat[] seats &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void deleteMove(Move targetMove) &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Boolean finished &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void playNextMove() &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Turn[] turnHistory &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void rollBackMove() &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Board gameBoard &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void rollBackMove(Int numberToRoll) &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Tile[] gameTiles &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;void rollBackMoves() &lt;/td&gt;
    &lt;td class=&quot;xl26&quot;&gt;reset board but maintain history &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;Bag bag &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;GameSystem &lt;/td&gt;
    &lt;td&gt;Game[] games &lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
				
				</description>
						
				
				<category>Java</category>				
				
				<pubDate>Wed, 17 Sep 2003 14:18:24 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2003/9/17/Methods-and-Data-Members-for-Scrabble</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Designing a scrabble engine</title>
				<link>http://www.webdevref.com/blog/index.cfm/2003/9/17/Designing-a-scrabble-engine</link>
				<description>
				
				After I came across &lt;a href=&quot;http://everythinghurts.typepad.com/scrabblog/&quot;&gt;WordBlog&lt;/a&gt; on &lt;a href=&quot;http://www.bump.net/archives/2003_09_01_index.html#106329203913545991&quot;&gt;Bump&lt;/a&gt; I offered to build a Flash MX version of the daily puzzle for the author to add to the site.

I envisaged a Flash app which would accept a collection of &quot;squares&quot; , a collection of fixed tiles on the &quot;board&quot; and then a &quot;rack&quot; of &quot;tiles&quot;.  The display would be identical to the current graphics on the site with the addition of a score keeper and some extra buttons to reset the board, a score panel and drag and drop functionality to move tiles from the rack to the board.

From there my mind moved on to the bigger idea of coding a scrabble game using my newly acquired Java development and design skills.  In this and future posts I will describe my design and coding process both as a personal development diary and as a tutorial for development.  If anyone has any suggestions along the way about the way things are progressing I would encourage you to add comments to the relevant post.

&lt;b&gt;Initial step&lt;/b&gt;&lt;BR&gt;
After having the initial idea, my first thought was to get some ideas down on paper.  I know that use cases are typically a good starting point but there are two issues here.  First, I want to implement the application for WordBlog&apos;s website in Flash but am seeing the design in Java.  This isn&apos;t a problem since Flash MX is (loosely) object oriented so I should be able to port some concepts over.  This has created the issue of over-engineering and scope creep straight off the bat.  I want to design the application correctly for future enhancements and expansions (good idea) but as a result i&apos;ve had to expand the scope of the design to incorporate these features.  I should then be able to take the class design for the elements essential to this phase of the design and implement them, in the knowledge that further development won&apos;t require a rework of the base classes.

Here&apos;s the initial design notes I planned out last night:&lt;BR&gt;
Games:&lt;BR&gt;
Play a whole game&lt;BR&gt;
Play a single player rack&lt;BR&gt;
Play multiplayer racks //each player faces the same random racks as the other.  points deducted/added for speed e.g. 10 seconds = 100%, 20 seconds = 80%, 30 seconds = 60%, 40 secs 40%, 50 seconds 20%, 1 minute 0 and bad words forfeit rack&lt;BR&gt;
Play a single player whole game //play out the bag with random pics&lt;BR&gt;

Activities:&lt;BR&gt;
Invite a player&lt;BR&gt;
Register as a player&lt;BR&gt;
Design a board&lt;BR&gt;
Design a rack&lt;BR&gt;
Place Hint //enter a word on your rack and find matching locations&lt;BR&gt;
Word Hint //Gives you suggested words for your rack&lt;BR&gt;
WordPlace Hint //what to spell and where to put it

Implementing Methods:&lt;BR&gt;
Pass in the letter list and square definitions, including fixed tiles.&lt;BR&gt;
Initialize board&lt;BR&gt;
Drag a piece onto the board&lt;BR&gt;
Drag a piece off the board&lt;BR&gt;
Score the word&lt;BR&gt;
Lookup the word &lt;BR&gt;
Wait for network players&lt;BR&gt;

Classes:&lt;BR&gt;
Letter : letter, value&lt;BR&gt;
Tile : letter, getValue&lt;BR&gt;
Board : 2d array of square objects, resetBoard(), &lt;BR&gt;
BoardSegment : Pointer to a start square and a count&lt;BR&gt;
Square : Tile object, bonusMultiplier(1/2/3), bonusType (w/l)&lt;BR&gt;
Bag : Collection of tile objects, resetBag(), removeRand(), removeSpecific(), pickTiles(Int numTiles)&lt;BR&gt;
Rack : Collection of tile objects, removeSpecificTile(), addTile(Tile), addTile(Tile[]), move(tile,square), move() //skip go&lt;BR&gt;
Move : tile, moveCounter, player and square&lt;BR&gt;
Players : Circular linked list of player objects &lt;BR&gt;
Player : rack, score, name&lt;BR&gt;
Game : players, finished flag, history&lt;BR&gt;
History : Array of moves, deleteMove(), playNextMove(),rollBackMoves(Int numberToRoll), 
rollBackMoves() //resets board,&lt;BR&gt;

This morning while I was creating an excel file with the list of classes, methods and data members I was able to see the picture a little clearer.  I&apos;ll add the excel file in a subsequent post but basically:
&lt;ul&gt;
&lt;li&gt;We have a class GameSystem which has many games.&lt;/li&gt;
&lt;li&gt;We have a class Game which has many Seats (gameplayers), MoveHistory, GameTiles, a Board and a Bag.&lt;/li&gt;
&lt;li&gt;GameTiles is a collection of Tiles for the game&lt;/li&gt;
&lt;li&gt;The Board is a collection of Squares&lt;/li&gt;
&lt;li&gt;A board segment has a start Square, a direction and a number of squares to define a view of a piece of the board&lt;/li&gt;
&lt;li&gt;Each Square has a current Tile, bonus multiplier and a bonus type&lt;/li&gt;
&lt;li&gt;Each Bag has a subset of the GameTiles collection (Note: Bag + sum of Racks + sum of Tiles on Squares = GameTiles collection) &lt;/li&gt;
&lt;li&gt;Each Tile has a Letter associated with it.&lt;/li&gt;
&lt;li&gt;Each Letter has a pointsvalue assigned to it based on the Game setup.&lt;/li&gt;
&lt;li&gt;The MoveHistory contains many Turns (a collection of one piece moves comprising a specific players turn&lt;/li&gt;
&lt;li&gt;Each turn has a GamePlayer associated with it. (Note: if a player is switched out of a seat, the system should still track the fact that the previous player was responsible for the turn)&lt;/li&gt;
&lt;li&gt;Each Seat has a Rack and a Player who is currently playing the rack.&lt;/li&gt;
&lt;li&gt;Each Rack has a set number of Tiles determined by the Game setup&lt;/li&gt;
&lt;/ul&gt;
				
				</description>
						
				
				<category>Java</category>				
				
				<pubDate>Wed, 17 Sep 2003 11:56:03 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2003/9/17/Designing-a-scrabble-engine</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Code off web application contest</title>
				<link>http://www.webdevref.com/blog/index.cfm/2003/9/11/Code-off-web-application-contest</link>
				<description>
				
				It started on the way to work this morning and 5 hours later and several emails with Burr Sutter (Atlanta Java User Group) we&apos;ve got the foundations for an event in Atlanta.  

Under the guise of a web development cook off, we will attempt to demonstrate the relative merits of ASP.net, JSP, Coldfusion, PHP and any other web application development languages.  I&apos;m not sure what the format will be just yet but it seems obvious that 3 hours may be too short a period for this type of an event.  Maybe a one day conference, the Hotlanta Cook Off, would be fitting.  

If anyone reading this thinks they can help with any of the following items, please let me know either in the comments here or shoot me an email at adamhowitt@yahoo.com:
&lt;ul&gt;&lt;li&gt;has some ideas to build on this&lt;/li&gt;&lt;li&gt;would like to sponsor such an event&lt;/li&gt;&lt;li&gt;would like to participate as one of the coders&lt;/li&gt;&lt;li&gt;has a well designed spec for a simple site we could all build&lt;/li&gt;&lt;li&gt;or, would like to help define the spec for the developers to hit&lt;/li&gt;&lt;/ul&gt;

I&apos;m thinking this could be a good opportunity for developers to &quot;SEE outside the box&quot;, let alone think outside of it!  It will be nice to see some tricks and maybe have a couple of speakers while the code challenge is going on to offer &quot;an introduction to...&quot; speech for each language and then some &quot;how to use x with y&quot; where x and y are two of the technologies on show, for example &quot;Coldfusion and Java&quot;.
				
				</description>
						
				
				<category>Tech</category>				
				
				<category>Coldfusion</category>				
				
				<category>Java</category>				
				
				<pubDate>Thu, 11 Sep 2003 15:16:51 -0400</pubDate>
				<guid>http://www.webdevref.com/blog/index.cfm/2003/9/11/Code-off-web-application-contest</guid>
				
			</item>
			
		 	
			</channel></rss>