<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5498556369630320111</id><updated>2011-11-27T20:10:10.518-05:00</updated><category term='Dungeons and Dragons'/><category term='Python'/><category term='CheckboxTableViewer'/><category term='RCP'/><category term='Glade'/><category term='plugin'/><category term='ComboBox'/><category term='Eclipse'/><category term='TreeViewer'/><category term='Complainery'/><category term='Hibernate'/><category term='TextView'/><category term='pysqlite'/><category term='PyGTK'/><category term='TiddlyWiki'/><category term='SQLite'/><category term='Java'/><title type='text'>D&amp;D Player's Companion Journal</title><subtitle type='html'>Development notes about Grendel, a Pathfinder character manager for iPhone, Android, and other 320x devices. Based on 3.5e rules.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>61</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-8481189870494077358</id><published>2011-10-19T05:55:00.001-04:00</published><updated>2011-10-19T05:55:03.968-04:00</updated><title type='text'>Port to Coffeescript</title><content type='html'>A new part of the v7 plan is a port to &lt;a href="http://jashkenas.github.com/coffee-script/"&gt;Coffeescript&lt;/a&gt;.  I'd like to jump directly to Dart, but that's a long way off.I'm also looking to write some test code using some of the JS/CS testing frameworks:  http://macwright.org/2011/10/18/adventures-in-testing.html, http://docs.jquery.com/Qunit. Refactoring has become more difficult and error prone, and I can't put off best practice forever.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-8481189870494077358?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/8481189870494077358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=8481189870494077358' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8481189870494077358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8481189870494077358'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2011/10/port-to-coffeescript.html' title='Port to Coffeescript'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-7044075393290418827</id><published>2011-09-02T06:33:00.000-04:00</published><updated>2011-09-02T11:33:24.072-04:00</updated><title type='text'>Resumption of Activities</title><content type='html'>After a long hiatus, development of the Player's Companion has resumed:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://charmgr.stepnext.net/"&gt;http://charmgr.stepnext.net&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This version (0.7) is a port to the &lt;a href="http://paizo.com/pathfinderRPG/v5748btpy88yj&amp;amp;source=top"&gt;Pathfinder rules&lt;/a&gt;.  The Ranger class is complete, and Sorcerer is coming along.  Also damage reduction and special saves (eg v petrification, poison, etc) is now implemented. &amp;nbsp;Skills with subtypes (eg. Knowledge, Perform, etc) are now correctly handled.&lt;br /&gt;&lt;br /&gt;The application is hosted on a Amazon EC2 instance, served by &lt;a href="http://nodejs.org/"&gt;node.js&lt;/a&gt;.  The code is now hosted on &lt;a href="https://github.com/chambery/charmgrjs"&gt;Github&lt;/a&gt;, using (predictably) &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt; for SCM. Development has been massively simplified by these changes.  &lt;br /&gt;&lt;br /&gt;Also, I got a Macbook Air.  It is wunderbar.&lt;br /&gt;&lt;br /&gt;&lt;div style="clear: both;"&gt;&lt;a href="http://3.bp.blogspot.com/-k1fvXPU1iSw/TmC4EPtZErI/AAAAAAAA5vE/xkq9YeYEHyk/s1600/Screen+Shot+2011-09-02+at+7.01.43+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-k1fvXPU1iSw/TmC4EPtZErI/AAAAAAAA5vE/xkq9YeYEHyk/s320/Screen+Shot+2011-09-02+at+7.01.43+AM.png" width="159" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-4JcR_oQgCOs/TmDzKYyHYtI/AAAAAAAA5vI/TJ6yaJgmPwg/s1600/Edit+Character.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-4JcR_oQgCOs/TmDzKYyHYtI/AAAAAAAA5vI/TJ6yaJgmPwg/s320/Edit+Character.png" width="182" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-7044075393290418827?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/7044075393290418827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=7044075393290418827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7044075393290418827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7044075393290418827'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2011/09/resumption-of-activities.html' title='Resumption of Activities'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-k1fvXPU1iSw/TmC4EPtZErI/AAAAAAAA5vE/xkq9YeYEHyk/s72-c/Screen+Shot+2011-09-02+at+7.01.43+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-8107463704181460404</id><published>2011-03-18T11:11:00.001-04:00</published><updated>2011-03-18T11:11:42.957-04:00</updated><title type='text'>SharePoint via Java</title><content type='html'>God bless you, sir!&lt;br /&gt;&lt;br /&gt;http://davidsit.wordpress.com/2010/02/10/reading-a-sharepoint-list-with-java-tutorial/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-8107463704181460404?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/8107463704181460404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=8107463704181460404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8107463704181460404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8107463704181460404'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2011/03/sharepoint-via-java.html' title='SharePoint via Java'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-3719334713591333667</id><published>2011-02-12T08:02:00.000-05:00</published><updated>2011-02-12T08:52:25.187-05:00</updated><title type='text'>Another Scintilla Editor</title><content type='html'>http://caladbolg.net/luadoc/textadept/manual/1_Introduction.html&lt;br /&gt;&lt;br /&gt;require 'textadept'&lt;br /&gt;&lt;br /&gt;local keys = _G.keys&lt;br /&gt;local b, v = 'buffer', 'view'&lt;br /&gt;local gui = gui&lt;br /&gt;&lt;br /&gt;keys.can = { new_buffer }&lt;br /&gt;keys.cl  = { 'char_right',        b }&lt;br /&gt;keys.cL  = { 'char_right_extend',        b }&lt;br /&gt;keys.cal = { 'word_right',        b }&lt;br /&gt;keys.caL = { 'word_right_extend',        b }&lt;br /&gt;keys.cj  = { 'char_left',        b }&lt;br /&gt;keys.cJ  = { 'char_left_extend',        b }&lt;br /&gt;keys.caj = { 'word_left',        b }&lt;br /&gt;keys.caJ = { 'word_left_extend',        b }&lt;br /&gt;keys.ck  = { 'line_down',        b }&lt;br /&gt;keys.cak = { 'line_down',        b }&lt;br /&gt;keys.cK  = { 'line_down_extend',        b }&lt;br /&gt;keys.caK = { 'line_down_extend',        b }&lt;br /&gt;keys.ci  = { 'line_up',        b }&lt;br /&gt;keys.cai = { 'line_up',        b }&lt;br /&gt;keys.cI  = { 'line_up_extend',        b }&lt;br /&gt;keys.caI = { 'line_up_extend',        b }&lt;br /&gt;keys.ch  = { 'vc_home',        b }&lt;br /&gt;keys.cah = { 'vc_home',        b }&lt;br /&gt;keys.cH  = { 'home_extend',        b }&lt;br /&gt;keys.caH = { 'home_extend',        b }&lt;br /&gt;keys['c;']  = { 'line_end',        b }&lt;br /&gt;keys['ca;'] = { 'line_end',        b }&lt;br /&gt;keys['c:']  = { 'line_end_extend',        b }&lt;br /&gt;keys['ca:'] = { 'line_end_extend',        b }&lt;br /&gt;keys.cd  = { 'clear',             b }&lt;br /&gt;keys.caN = { gui.switch_buffer           }&lt;br /&gt;keys.cn  = { 'goto_buffer', v, 1, false  }&lt;br /&gt;keys.cN  = { 'goto_buffer', v, -1, false }&lt;br /&gt;keys.ce  = {&lt;br /&gt;  function()&lt;br /&gt;    buffer:line_end_extend()&lt;br /&gt;    buffer:cut()&lt;br /&gt;  end&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-3719334713591333667?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/3719334713591333667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=3719334713591333667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/3719334713591333667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/3719334713591333667'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2011/02/another-scintilla-editor.html' title='Another Scintilla Editor'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-6082210516602919271</id><published>2011-01-03T14:40:00.000-05:00</published><updated>2011-01-03T14:43:32.633-05:00</updated><title type='text'>Installing a Bluetooth Headset on Windows 7</title><content type='html'>Thanks to &lt;a href="http://blog.komeil.com/2009/05/installing-bluetooth-headset-in-windows.html"&gt;Komeil Bahmanpour&lt;/a&gt; I can use my LG HBM-235 bluetooth earpiece with GMail phone calling.&lt;br /&gt;&lt;br /&gt;(Windows will install the device but can't find the driver.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-6082210516602919271?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/6082210516602919271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=6082210516602919271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6082210516602919271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6082210516602919271'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2011/01/installing-bluetooth-headset-on-windows.html' title='Installing a Bluetooth Headset on Windows 7'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-903580119950418739</id><published>2010-12-31T08:47:00.001-05:00</published><updated>2010-12-31T08:50:03.094-05:00</updated><title type='text'>Building a CLASSPATH in Windows</title><content type='html'>Thanks to &lt;a href="http://www.rgagnon.com/javadetails/java-0587.html"&gt;Real's How To&lt;/a&gt;:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 10px; line-height: 16px; "&gt;&lt;pre style="font-size: 12px; font-family: 'Lucida Console', 'Courier New', Courier, monospace; overflow-x: auto; overflow-y: auto; "&gt;@echo off&lt;br&gt;setlocal ENABLEDELAYEDEXPANSION&lt;br&gt;if defined CLASSPATH (set CLASSPATH=%CLASSPATH%;.) else (set CLASSPATH=.)&lt;br&gt;FOR /R .\lib %%G IN (*.jar) DO set CLASSPATH=!CLASSPATH!;%%G&lt;br&gt;Echo The Classpath definition is %CLASSPATH%&lt;br&gt; ... &lt;br&gt;java MyClass&lt;br&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-903580119950418739?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/903580119950418739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=903580119950418739' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/903580119950418739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/903580119950418739'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/12/building-classpath-in-windows.html' title='Building a CLASSPATH in Windows'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-9063771992034253646</id><published>2010-12-14T09:44:00.000-05:00</published><updated>2010-12-15T09:40:18.652-05:00</updated><title type='text'>Notepad++, The New Editor King (or, jEdit Dethroned)</title><content type='html'>I finally gave Notepad++ an honest going over, and it is unquestionably the most flexible tool for editing text the internet has to offer. It:&lt;div&gt;&lt;ul&gt;&lt;li&gt;handles my keybinding scheme&lt;/li&gt;&lt;li&gt;is fast(er than jEdit)&lt;/li&gt;&lt;li&gt;handles large files without choking&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;You can customize it to a ridiculous degree, and because it uses &lt;a href="http://www.scintilla.org/"&gt;Scintilla &lt;/a&gt;for the editor, schemes should be portable across platforms (&lt;a href="http://www.geany.org/"&gt;Geany&lt;/a&gt;, &lt;a href="http://www.scintilla.org/ScintillaRelated.html"&gt;others&lt;/a&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Notepad++'s only real deficiency is its lack of full regex support. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-9063771992034253646?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/9063771992034253646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=9063771992034253646' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/9063771992034253646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/9063771992034253646'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/12/notepad-new-editor-king-or-jedit.html' title='Notepad++, The New Editor King (or, jEdit Dethroned)'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-2453176919474612036</id><published>2010-12-01T11:39:00.000-05:00</published><updated>2010-12-01T11:55:27.315-05:00</updated><title type='text'>Generalizing for Pathfinder Compatibility</title><content type='html'>I've looking at Pathfinder for a while (bought the core rulebooks and a few modules), but since listening the &lt;a href="http://www.justiceradio.net/podcast/"&gt;Chronicles: Pathfinder Podcast&lt;/a&gt; I'm energized to fix up the Grendel to be compatible with the core rules.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As always, I need knowledgeable testers to validate my suspicions (also some data entry help would be a huge help):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://backdraft.cs.binghamton.edu:8080/cm-dev/unferth/grendel.html"&gt;   http://backdraft.cs.binghamton.edu:8080/cm-dev/unferth/grendel.html&lt;/a&gt;  (short link:  &lt;a href="http://goo.gl/LbwE4"&gt;http://goo.gl/LbwE4&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you're unfamiliar with Pathfinder, it's essentially a light extension of the 3.5 rules in a well-articulated campaign setting.  It's published by the old publishing arm of Wizards of the Coast, Paizo Publishing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Interesting fact about Paizo: the publisher writes modules.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-2453176919474612036?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/2453176919474612036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=2453176919474612036' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/2453176919474612036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/2453176919474612036'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/12/generalizing-for-pathfinder.html' title='Generalizing for Pathfinder Compatibility'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-5013454069001566986</id><published>2010-10-04T07:54:00.000-04:00</published><updated>2010-11-07T08:46:25.414-05:00</updated><title type='text'>Fixing XP</title><content type='html'>Here's a list of utility programs that make Windows XP a little nicer:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://alwact.blogspot.com/"&gt;Alwact Clock&lt;/a&gt;:   Onscreen click-through clock&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.autohotkey.com/"&gt;AutoHotkey&lt;/a&gt;: keyboard mapping and scripting&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;SetCapsLockState, AlwaysOff&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CapsLock &amp;amp; a::&lt;/div&gt;&lt;div&gt;IfWinExist jEdit&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;WinActivate&lt;/div&gt;&lt;div&gt;else&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Run C:\PROGRA~1\jEdit\jedit.bat&lt;/div&gt;&lt;div&gt;return&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CapsLock &amp;amp; q::&lt;/div&gt;&lt;div&gt;IfWinExist ahk_class Chrome_WidgetWin_0&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;WinActivate&lt;/div&gt;&lt;div&gt;else&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Run "C:\Program Files\Chrome\chrome.exe" --enable-accelerated-compositing&lt;/div&gt;&lt;div&gt;return&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CapsLock &amp;amp; s::&lt;/div&gt;&lt;div&gt;IfWinExist xplorer²&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;WinActivate&lt;/div&gt;&lt;div&gt;else&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Run "C:\Program Files\zabkat\xplorer2_lite\xplorer2_lite.exe""&lt;/div&gt;&lt;div&gt;return&lt;/div&gt;&lt;/blockquote&gt;&lt;a href="http://www.osmstudios.com/display.asp?page=PathTooLong"&gt;PathTooLong&lt;/a&gt;:  If you can't delete a directory because the path is too long&lt;br /&gt;&lt;a href="http://www.abstractpath.com/powermenu/"&gt;Power Menu&lt;/a&gt;:  Window always-on-top&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/powerresizer/"&gt;Power Resizer&lt;/a&gt;:  Windows 7-style window resizing (half-screen on edge)&lt;br /&gt;&lt;a href="http://antibody-software.com/web/software/software/wizmouse-makes-your-mouse-wheel-work-on-the-window-under-the-mouse/"&gt;WizMouse&lt;/a&gt;:  Scroll the window under the mouse&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-5013454069001566986?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/5013454069001566986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=5013454069001566986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/5013454069001566986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/5013454069001566986'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/10/fixing-xp.html' title='Fixing XP'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-4343669787959974514</id><published>2010-09-06T15:01:00.000-04:00</published><updated>2010-09-06T15:13:43.544-04:00</updated><title type='text'>Also, Character Sheets</title><content type='html'>&lt;div&gt;Here it is, a character sheet:&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_U8QoBSDZQUk/TIU9MD9PQXI/AAAAAAAAmEA/nwzTsr5Lwi0/s1600/character+sheet.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 290px; height: 320px;" src="http://3.bp.blogspot.com/_U8QoBSDZQUk/TIU9MD9PQXI/AAAAAAAAmEA/nwzTsr5Lwi0/s320/character+sheet.png" alt="" id="BLOGGER_PHOTO_ID_5513880596214923634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;The nice thing is, if you don't like it, they're easy to make and easy to fill in with character data.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-4343669787959974514?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/4343669787959974514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=4343669787959974514' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4343669787959974514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4343669787959974514'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/09/also-character-sheets.html' title='Also, Character Sheets'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_U8QoBSDZQUk/TIU9MD9PQXI/AAAAAAAAmEA/nwzTsr5Lwi0/s72-c/character+sheet.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-1761272762401748689</id><published>2010-08-14T22:48:00.000-04:00</published><updated>2010-08-18T18:32:31.510-04:00</updated><title type='text'>multi-class in motion</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.ggpht.com/_U8QoBSDZQUk/TGdgXquS2mI/AAAAAAAAmAU/0eGvv4ND5aA/s800/main.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 43px; height: 144px;" src="http://lh4.ggpht.com/_U8QoBSDZQUk/TGdgXquS2mI/AAAAAAAAmAU/0eGvv4ND5aA/s800/main.png" border="0" alt="" /&gt;&lt;/a&gt;  &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh3.ggpht.com/_U8QoBSDZQUk/TGdgX76se0I/AAAAAAAAmAc/dtqCA04WwMc/s800/edit.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 81px; height: 144px;" src="http://lh3.ggpht.com/_U8QoBSDZQUk/TGdgX76se0I/AAAAAAAAmAc/dtqCA04WwMc/s800/edit.png" border="0" alt="" /&gt;&lt;/a&gt;  &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/_U8QoBSDZQUk/TGdgYQwIzOI/AAAAAAAAmAk/t6lP97iznOA/s800/spells.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 70px; height: 144px;" src="http://lh5.ggpht.com/_U8QoBSDZQUk/TGdgYQwIzOI/AAAAAAAAmAk/t6lP97iznOA/s800/spells.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Help me test v0.6!&lt;/div&gt;&lt;div&gt;&lt;a href="http://backdraft.cs.binghamton.edu:8080/cm-dev/wiglaf/grendel.html"&gt;http://backdraft.cs.binghamton.edu:8080/cm-dev/wiglaf/grendel.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This version is undergoing regular development, so the usual caveats apply.  If you find what think is a bug, please create an issue on my &lt;a href="http://code.google.com/p/charactermanager/issues/list"&gt;Google Code project site&lt;/a&gt;, or leave a comment on a recent blog posting.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-1761272762401748689?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/1761272762401748689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=1761272762401748689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1761272762401748689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1761272762401748689'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/08/multi-class-in-motion.html' title='multi-class in motion'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_U8QoBSDZQUk/TGdgXquS2mI/AAAAAAAAmAU/0eGvv4ND5aA/s72-c/main.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-7909313438835889043</id><published>2010-08-14T08:53:00.000-04:00</published><updated>2010-08-16T21:25:47.973-04:00</updated><title type='text'>Batch upload script for CouchDB (using curl and jsawk)</title><content type='html'>I looked all over for something small and simple like this, but couldn't find anything.&lt;br /&gt;&lt;br /&gt;Dependencies:&lt;br /&gt;&lt;a href="http://packages.debian.org/sid/spidermonkey-bin"&gt;spidermonkey&lt;/a&gt; (required by jsawk)&lt;br /&gt;&lt;a href="http://packages.debian.org/sid/libmozjs2d"&gt;libmozjs2d&lt;/a&gt; (required by spidermonkey)&lt;br /&gt;&lt;a href="http://github.com/micha/jsawk"&gt;jsawk&lt;/a&gt; (for parsing CouchDB response)&lt;br /&gt;curl&lt;br /&gt;&lt;br /&gt;Ubuntu doesn't include spidermonkey in the repositories (it uses rhino instead) so you'll have to grab spidermonkey from the Debian.&lt;br /&gt;&lt;br /&gt;Copy the below script (change http://localhost:5984/cm-dev/hrothgar to your server/db/document) and save yourself a lot of clicks in Futon.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: bash" style="font-size: small"&gt;&lt;br /&gt;Usage: upload.sh [path containing the files to upload]&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: shell"&gt;&lt;br /&gt;hput () {&lt;br /&gt;  eval hash"$1"='$2'&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;hget () {&lt;br /&gt;  eval echo '${hash'"$1"'#hash}'&lt;br /&gt;}&lt;br /&gt;hput js javascript&lt;br /&gt;hput html html&lt;br /&gt;hput css css&lt;br /&gt;&lt;br /&gt;directory=$@&lt;br /&gt;if [ -z "$directory" ]&lt;br /&gt;then&lt;br /&gt; directory="."&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;filetypes="$directory/*.css&lt;br /&gt;$directory/*.html&lt;br /&gt;$directory/*.js"&lt;br /&gt;&lt;br /&gt;for file in $filetypes&lt;br /&gt;do&lt;br /&gt; filename=`basename "$file"`&lt;br /&gt; ext=`hget ${filename##*.}`&lt;br /&gt; rev=`curl -sX GET 'http://grendel.cloudant.com/cm-dev/hrothgar/' | jsawk 'return this._rev'`&lt;br /&gt; echo File              : $file&lt;br /&gt; echo Current revision  : $rev&lt;br /&gt; echo Uploading document: $filename&lt;br /&gt; echo "${ext}"&lt;br /&gt; echo curl              : curl -X PUT http://grendel.cloudant.com/cm-dev/hrothgar/$filename?rev=$rev --data-binary @$file -H 'Content-Type: text/'$ext&lt;br /&gt; &lt;br /&gt; curl -X PUT http://grendel.cloudant.com/cm-dev/hrothgar/$filename?rev=$rev --data-binary @$file -H 'Content-Type: text/'$ext&lt;br /&gt; echo --------------------------------------------&lt;br /&gt; echo&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Thanks to Micha for jsawk.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-7909313438835889043?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/7909313438835889043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=7909313438835889043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7909313438835889043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7909313438835889043'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/08/batch-upload-script-for-couchdb-using.html' title='Batch upload script for CouchDB (using curl and jsawk)'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-5556054423933060397</id><published>2010-07-20T20:53:00.000-04:00</published><updated>2010-08-08T21:15:48.378-04:00</updated><title type='text'>Multi-class support</title><content type='html'>&lt;div&gt;&lt;img src="https://docs.google.com/drawings/pub?id=1C39usHKgs1Plve9tvc1AaKJPihwXyp2TWZtHO47SnaM&amp;amp;w=324&amp;amp;h=481"&gt;&lt;/div&gt;&lt;div&gt;The major feature for v0.6 will be multi-class character support.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Post your thoughts on what to put in the space created by the edit page rearrangement.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;chardata.class_name =&gt; chardata.classes[name]=level&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;edit: current look&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_U8QoBSDZQUk/TF9V86jQb9I/AAAAAAAAl_U/l9x5hHoEa4g/s1600/class+feature+section.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 206px; height: 320px;" src="http://1.bp.blogspot.com/_U8QoBSDZQUk/TF9V86jQb9I/AAAAAAAAl_U/l9x5hHoEa4g/s320/class+feature+section.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5503211774667681746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-5556054423933060397?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/5556054423933060397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=5556054423933060397' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/5556054423933060397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/5556054423933060397'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/07/multi-class-support.html' title='Multi-class support'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_U8QoBSDZQUk/TF9V86jQb9I/AAAAAAAAl_U/l9x5hHoEa4g/s72-c/class+feature+section.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-5410356599902932843</id><published>2010-05-26T09:27:00.000-04:00</published><updated>2010-05-30T18:24:57.543-04:00</updated><title type='text'>Flexible UI</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_U8QoBSDZQUk/TALlgsH0HPI/AAAAAAAAlxM/pOk_n_c9SJ4/s1600/GrendelUI-768x.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 235px; height: 320px;" src="http://3.bp.blogspot.com/_U8QoBSDZQUk/TALlgsH0HPI/AAAAAAAAlxM/pOk_n_c9SJ4/s320/GrendelUI-768x.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5477192446598454514" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I'm cooking the new UIs for v0.6, starting with 768x1024 (and 1024x768), since that's the iPad resolution, and I know a couple people with iPads (it also maps nicely to a sheet of paper).  Everyone has opinions on what makes a good character sheet and pretty much everybody can draw, I'd appreciate some feedback on the new layout.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you're feeling particularly contributory, send me a note and I'll add you to the drawing so you manipulate the bits yourself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-5410356599902932843?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/5410356599902932843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=5410356599902932843' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/5410356599902932843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/5410356599902932843'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/05/flexible-ui.html' title='Flexible UI'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_U8QoBSDZQUk/TALlgsH0HPI/AAAAAAAAlxM/pOk_n_c9SJ4/s72-c/GrendelUI-768x.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-9074256265320832690</id><published>2010-05-16T19:06:00.000-04:00</published><updated>2010-08-05T15:32:18.167-04:00</updated><title type='text'>Ideas for v0.6</title><content type='html'>If I ever get v0.5 to run on an iPhone, here are some ideas for v0.6:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Expandable UI&lt;/span&gt;&lt;br /&gt;Depending on the size of browser viewport, the UI will reconfigure itself to better utilize the available space.  Thinking the 2-column sections go 3 or 4, eliminate multiple edit screens (leaving just &lt;span style="font-style: italic;"&gt;main&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;edit&lt;/span&gt;).&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://docs.google.com/drawings/pub?id=1tXdMAS952cSz50uMj1Js9VHwBOK2zX-IDQU4diMqjOk&amp;amp;w=315&amp;amp;h=261" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, the Google Drawing app is just about "good enough".  Still needs connectors.&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: bold;"&gt;Multi-class support&lt;/span&gt;&lt;/div&gt;&lt;div&gt;See later post for details.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-weight: bold;"&gt;Fast character switching&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Currently, switching between characters requires a full reload of the webapp, should be able to change change character data without loading all the application data.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-weight: bold;"&gt;Use Google CDN for JQuery resources&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;The images for the JQueryUI haven't displayed correctly since I moved to CouchDB.  Hopefully will fix that.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-9074256265320832690?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/9074256265320832690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=9074256265320832690' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/9074256265320832690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/9074256265320832690'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/05/ideas-for-v06.html' title='Ideas for v0.6'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-6199464298431667270</id><published>2010-05-14T06:33:00.000-04:00</published><updated>2010-05-16T19:06:15.831-04:00</updated><title type='text'>Firebug to the rescue</title><content type='html'>Firebug has a more readable and perhaps more insightful profiler than Chrome:&lt;br /&gt;&lt;iframe width='500' height='300' frameborder='0' src='https://spreadsheets.google.com/pub?key=0AnjzlW1wnPUZdHZLejBhZXgwczdHZFVZNVVnT3h6N0E&amp;hl=en&amp;output=html&amp;widget=true'&gt;&lt;/iframe&gt;&lt;br /&gt;My reckless use of TaffyDB is the biggest offender, with &lt;code&gt;isNumeric()&lt;/code&gt; way out of proportion (I mean, is it a number, or isn't it?).&lt;br /&gt;&lt;br /&gt;UPDATE:&lt;br /&gt;It appears the horrendous performance suction was caused my ordering of all static data elements:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;  spells.orderBy({name:&amp;quot;logical&amp;quot;});&lt;br /&gt;  feats.orderBy({name:&amp;quot;logical&amp;quot;});&lt;br /&gt;  races.orderBy({name:&amp;quot;logical&amp;quot;});&lt;br /&gt;  domains.orderBy({name:&amp;quot;logical&amp;quot;});&lt;br /&gt;  classs.orderBy({name:&amp;quot;logical&amp;quot;});&lt;br /&gt;  schools.orderBy({name:&amp;quot;logical&amp;quot;});&lt;br /&gt;  weapons.orderBy({name:&amp;quot;logical&amp;quot;});&lt;br /&gt;  armors.orderBy({name:&amp;quot;logical&amp;quot;});&lt;br /&gt;  skills.orderBy({name:&amp;quot;logical&amp;quot;});&lt;br /&gt;  languages.orderBy({name:&amp;quot;logical&amp;quot;});&lt;br /&gt;  deitys.orderBy({name:&amp;quot;logical&amp;quot;});&lt;br /&gt;  specials.orderBy({name:&amp;quot;logical&amp;quot;});&lt;br /&gt;  favored_enemys.orderBy({name:&amp;quot;logical&amp;quot;});  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;I found the offending block by starting and stopping the Firebug profiler between breakpoints.  It posts the results in the console, in the context of the logging.  Just phenomenal tool.&lt;br /&gt;Down to 4 secs:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_U8QoBSDZQUk/S-2zuezg6zI/AAAAAAAAlok/KKgwEJRLHgw/s1600/Developer+Tools+-+http:--backdraft.cs.binghamton.edu:8080-cm-dev-hrothgar-charmgr.html_005.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 313px;" src="http://1.bp.blogspot.com/_U8QoBSDZQUk/S-2zuezg6zI/AAAAAAAAlok/KKgwEJRLHgw/s400/Developer+Tools+-+http:--backdraft.cs.binghamton.edu:8080-cm-dev-hrothgar-charmgr.html_005.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5471226733449505586" /&gt;&lt;/a&gt;This doesn't mean it will work on the iPhone, but it can't hurt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-6199464298431667270?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/6199464298431667270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=6199464298431667270' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6199464298431667270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6199464298431667270'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/05/firebug-to-rescue.html' title='Firebug to the rescue'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_U8QoBSDZQUk/S-2zuezg6zI/AAAAAAAAlok/KKgwEJRLHgw/s72-c/Developer+Tools+-+http:--backdraft.cs.binghamton.edu:8080-cm-dev-hrothgar-charmgr.html_005.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-7073488872845662612</id><published>2010-05-13T06:50:00.001-04:00</published><updated>2010-05-15T07:25:38.444-04:00</updated><title type='text'>localStorage for offline use</title><content type='html'>I've put in some caching for the static data using the HTML5 feature "localStorage",  localStorage is essentially a cookie, but without  a cookie's size limit, and it will not get sent to the server (something I didn't even know about cookies).  The Player's Companion should now be able to function offline, but unfortunately it does not appear to have any impact on load performance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-7073488872845662612?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/7073488872845662612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=7073488872845662612' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7073488872845662612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7073488872845662612'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/05/localstorage-for-offline-use.html' title='localStorage for offline use'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-8053123047683217331</id><published>2010-05-02T08:46:00.001-04:00</published><updated>2010-05-02T09:07:47.283-04:00</updated><title type='text'>v0.5 in Testing</title><content type='html'>&lt;a href="http://backdraft.cs.binghamton.edu:8080/cm-dev/hrothgar/grendel.html"&gt;v0.5&lt;/a&gt; involved a complete rewrite of the data load scheme, and the way rules are handled.  Basically, to add feat attack effects before, I had to add some JS to the calc_attack function (messy and does not scale).  Now, I ask for all feats with an &lt;span style="font-style:italic;"&gt;attack&lt;/span&gt; attribute (which is a function), and execute that block of code:&lt;br /&gt;&lt;br /&gt;feat description:&lt;br /&gt;&lt;code&gt;&lt;br /&gt; attack: "if(weapon.category == 'exotic') { attacks.weapon_proficiency = 0; } return attacks;",&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;function calc_attack() {&lt;br /&gt; ...&lt;br /&gt; char_feats.get({ attack : { "!is": null } }).forEach( function(feat, i) {&lt;br /&gt;   // TODO - can we do this by reference&lt;br /&gt;  console.log("attack: " + feat.name);&lt;br /&gt;  attacks = feat.attack(attacks, weapon);&lt;br /&gt;  return attacks;&lt;br /&gt; });&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;While it's probably technically better, an unfortunate side-effect is that it no longer works on my friends' iPhones or my Android emulator.  Must be my IBM training to write software for next-next generation hardware (I'm still waiting for a machine to run Lotus Notes).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-8053123047683217331?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/8053123047683217331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=8053123047683217331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8053123047683217331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8053123047683217331'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/05/v05-in-testing.html' title='v0.5 in Testing'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-3128377406648434061</id><published>2010-04-02T07:29:00.000-04:00</published><updated>2010-04-02T15:41:52.598-04:00</updated><title type='text'>jEdit, Lord of the Text Editors</title><content type='html'>After a brief dalliance Sublime Text, I'm back to jEdit.  Faster with large files, customizable keybinding, cross platform, truly awesome find/replace and it's Open Source (Sublime Text costs $60).&lt;br /&gt;&lt;br /&gt;Plugins:&lt;br /&gt;JDiffPlugin&lt;br /&gt;TextTools&lt;br /&gt;FirstMate (http://www.rutherfurd.net/jedit/plugins/firstmate/)&lt;br /&gt;Minimap&lt;br /&gt;Whitespace&lt;br /&gt;Beauty&lt;br /&gt;&lt;br /&gt;Two features I'm missing are next/previous recent buffer, and true full screen (a la Darkroom).&lt;br /&gt;&lt;br /&gt;Thank you, jEdit!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-3128377406648434061?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/3128377406648434061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=3128377406648434061' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/3128377406648434061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/3128377406648434061'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/04/jedit-lord-of-text-editors.html' title='jEdit, Lord of the Text Editors'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-1920472580328384521</id><published>2010-03-10T20:52:00.000-05:00</published><updated>2010-03-10T20:56:40.921-05:00</updated><title type='text'>jEdit Maths</title><content type='html'>Search: &lt;code&gt;^(\s+)"(.+?)" : ([0-9])(,?)&lt;/code&gt;&lt;br /&gt;Replace: &lt;code&gt;_1 + "\"" + _2 + "\":" + (Integer.parseInt(_3) + 1) + _4&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-1920472580328384521?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/1920472580328384521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=1920472580328384521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1920472580328384521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1920472580328384521'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/03/jedit-maths.html' title='jEdit Maths'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-7702486088658908741</id><published>2010-02-09T07:11:00.000-05:00</published><updated>2010-02-09T20:42:01.714-05:00</updated><title type='text'>Favored Enemies</title><content type='html'>"Operational" favored enemies for Ranger class are now on http://bit.ly/wiglaf.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/_U8QoBSDZQUk/S3IM2TftFiI/AAAAAAAALcA/nybHSRuqNMw/s288/favored_enemies_main1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 190px; height: 288px;" src="http://lh5.ggpht.com/_U8QoBSDZQUk/S3IM2TftFiI/AAAAAAAALcA/nybHSRuqNMw/s288/favored_enemies_main1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/_U8QoBSDZQUk/S3IM2kdofII/AAAAAAAALcE/NEaUZT3i290/s288/favored_enemies_main2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 204px; height: 288px;" src="http://lh5.ggpht.com/_U8QoBSDZQUk/S3IM2kdofII/AAAAAAAALcE/NEaUZT3i290/s288/favored_enemies_main2.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-7702486088658908741?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/7702486088658908741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=7702486088658908741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7702486088658908741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7702486088658908741'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/02/favored-enemies.html' title='Favored Enemies'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_U8QoBSDZQUk/S3IM2TftFiI/AAAAAAAALcA/nybHSRuqNMw/s72-c/favored_enemies_main1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-1951608126950813375</id><published>2010-01-24T10:16:00.000-05:00</published><updated>2010-01-24T10:27:21.099-05:00</updated><title type='text'>Remote Storage, Part II</title><content type='html'>The remote store is up and running at:&lt;br /&gt;&lt;br /&gt;    http://bit.ly/wiglaf&lt;br /&gt;&lt;br /&gt;The practical effect of this is the ability to create your character on a computer, and load it on your portable device.  Character data is automatically synced to the remote store, and can be retrieved using the char-&gt;load menu by entering the character name.&lt;br /&gt;&lt;br /&gt;At this time (since I'm the only one using it), THERE IS NO OVERWRITE PROTECTION!!!  If you create a character named "Bob" and some other dood creates a "Bob", the last guy's data will blow away the Bob data.  I have a fix in mind where you enter an owner name to distinguish your Bob the other guy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-1951608126950813375?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/1951608126950813375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=1951608126950813375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1951608126950813375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1951608126950813375'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/01/remote-storage-part-ii.html' title='Remote Storage, Part II'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-4560590994703826451</id><published>2010-01-15T10:38:00.000-05:00</published><updated>2010-01-15T22:10:42.005-05:00</updated><title type='text'>Storing data online with CouchDB</title><content type='html'>I'm looking at using a remote &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt; as a store for character data.  With some sync code, characters should be transparently available on any device you're using.&lt;br /&gt;&lt;br /&gt;CouchDB looks cool, but the documentation is horrible (at least for starting out using Javascript).&lt;br /&gt;&lt;br /&gt;Something I didn't fully appreciate is that you can't call out to different a server from Javascript directly (this is "cross-site scripting", and there are workarounds).  Essentially, it's assumed any connections will be performed on the server side and the client (browser) connects to a single server.  The quick-and-dirty solution is to host the Player's Companion from my local CouchDB instance:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Log in to Futon:  http://localhost:5984/_utils/index.html&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create a database (charmgr) to host the files&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create a document (id: "charmgr")&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Upload all the files as attachments to the document&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Go to:  http://localhost:5984/charmgr/charmgr/charmgr.html, et voila!&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;In the code, writing out the data is direct:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  var db = new CouchDB(cookie_name.toLowerCase(), {"X-Couch-Full-Commit":"false"});&lt;br /&gt;  db.createDb();&lt;br /&gt;  db.save(data); &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Thanks to Justin Walgran:  http://mail-archives.apache.org/mod_mbox/couchdb-user/200812.mbox/%3Cf893e2810812262119k3163421ds372d4b7a2eac22c1@mail.gmail.com%3E&lt;br /&gt;&lt;br /&gt;Useful: http://sitr.us/2009/06/30/database-queries-the-couchdb-way.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-4560590994703826451?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/4560590994703826451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=4560590994703826451' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4560590994703826451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4560590994703826451'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/01/storing-data-online.html' title='Storing data online with CouchDB'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-5365745864913197233</id><published>2010-01-10T17:06:00.000-05:00</published><updated>2010-01-10T17:16:12.687-05:00</updated><title type='text'>Multi-character Support</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh6.ggpht.com/_U8QoBSDZQUk/S0pQW1mEPvI/AAAAAAAALPw/oPBl47gaLeY/s800/multi_char.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 353px; height: 165px;" src="http://lh6.ggpht.com/_U8QoBSDZQUk/S0pQW1mEPvI/AAAAAAAALPw/oPBl47gaLeY/s800/multi_char.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Some refactoring and now I can switch between multiple character sheets.  Basically names the cookie after the character name, and lists all "named cookies" in the file menu.&lt;br /&gt;&lt;br /&gt;Addition of the file menu is something of a failure, since now it's no longer a toaster.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-5365745864913197233?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/5365745864913197233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=5365745864913197233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/5365745864913197233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/5365745864913197233'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2010/01/multi-character-support.html' title='Multi-character Support'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_U8QoBSDZQUk/S0pQW1mEPvI/AAAAAAAALPw/oPBl47gaLeY/s72-c/multi_char.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-832000109891334696</id><published>2009-12-01T06:13:00.000-05:00</published><updated>2009-12-01T06:21:00.651-05:00</updated><title type='text'>Testing on Android</title><content type='html'>I got a BlackBerry device from work, but unfortunately the included (or any other) browser is not up to the strenuous demands of the Grendel.  Using the AVD, I have a much better idea of real-world usage:&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;width: 320px; height: 480px;" src="http://lh6.ggpht.com/_U8QoBSDZQUk/SwaGGediEII/AAAAAAAALKg/JZN8PeOxhek/s800/main-android.png" border="0" alt="" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-832000109891334696?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/832000109891334696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=832000109891334696' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/832000109891334696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/832000109891334696'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/12/testing-on-android.html' title='Testing on Android'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_U8QoBSDZQUk/SwaGGediEII/AAAAAAAALKg/JZN8PeOxhek/s72-c/main-android.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-8117238990328963892</id><published>2009-12-01T06:07:00.000-05:00</published><updated>2009-12-01T06:13:43.348-05:00</updated><title type='text'>Close a JQuery Dialog by clicking outside of it</title><content type='html'>Thank you David Little:  http://www.littled.net/new/2009/11/30/how-to-close-a-jquery-dialog-box-by-clicking-outside-of-it/&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;function show_dialog(title, content) {&lt;br /&gt;  // close dialog when clicking outside of it&lt;br /&gt;  $(&amp;quot;.ui-widget-overlay&amp;quot;).live(&amp;quot;click&amp;quot;, function() {  $(&amp;quot;#mydialog&amp;quot;).dialog(&amp;quot;close&amp;quot;); } );&lt;br /&gt;  $(&amp;quot;#mydialog&amp;quot;).html(content);&lt;br /&gt;  $('#mydialog').dialog('option', 'title', title);&lt;br /&gt;  $(&amp;quot;#mydialog&amp;quot;).dialog( {&lt;br /&gt;    modal : true,&lt;br /&gt;    autoOpen : false,&lt;br /&gt;    title : title,&lt;br /&gt;    position: 'left'&lt;br /&gt;  });&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-8117238990328963892?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/8117238990328963892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=8117238990328963892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8117238990328963892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8117238990328963892'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/12/close-jquery-dialog-by-clicking-outside.html' title='Close a JQuery Dialog by clicking outside of it'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-8472963029056555457</id><published>2009-11-24T10:19:00.000-05:00</published><updated>2009-11-24T10:24:23.390-05:00</updated><title type='text'>Tags location on Tiddlywiki</title><content type='html'>To move the tags box from the top right corner to the bottom:&lt;br /&gt;&lt;br /&gt;&amp;lt;div class='tagged...&lt;br /&gt;&lt;br /&gt;Must be moved below &amp;lt;div class='viewer...  And above &amp;lt;div class='tagClear...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-8472963029056555457?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/8472963029056555457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=8472963029056555457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8472963029056555457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8472963029056555457'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/11/tags-location-on-tiddlywiki.html' title='Tags location on Tiddlywiki'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-8060014065942326164</id><published>2009-11-01T09:11:00.000-05:00</published><updated>2009-11-01T09:41:02.455-05:00</updated><title type='text'>v0.3.2 available for download</title><content type='html'>v0.3.2 features:&lt;br /&gt;&lt;br /&gt;* Logging - Save game notes with xp, hp context&lt;br /&gt;* Equipment - Magic items may have skill, ability, or other (fort, att, ac, etc) numerical benefits&lt;br /&gt;* Monk special abilities - Flurry of blows&lt;br /&gt;* Rogue special abilities&lt;br /&gt;* Spell data complete&lt;br /&gt;* Skill data complete&lt;br /&gt;* Special ability (non-operational) data complete&lt;br /&gt;&lt;br /&gt;Plenty of bug fixes (and probably plenty introduced).&lt;br /&gt;&lt;br /&gt;Taking a break until I get a superphone, or even one human being besides myself shows some interest.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-8060014065942326164?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/8060014065942326164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=8060014065942326164' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8060014065942326164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8060014065942326164'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/11/v032-available-for-download.html' title='v0.3.2 available for download'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-6110483989329117816</id><published>2009-10-06T00:07:00.000-04:00</published><updated>2009-10-06T00:21:42.576-04:00</updated><title type='text'>v0.3 available for download</title><content type='html'>After fixing the Load character data functionality, I felt a small celebration was in order.  Thus a new zip is available for download.  This release has some boring improvements, like Special Abilities (though this isn't data-complete) and more spell and skill data, but the major change was a refactoring of how weapon and armor selector work on the edit page. &lt;br /&gt;&lt;br /&gt;Javascript's flexible typing and giant hash object reference model(?) lets you do some neat tricks to reuse code.  Essentially you can pass in the string names of attributes or functions to be acted on, rather than defining interfaces as you would in Java.  For example, weapons and armor have a similar structure, and the edit UI for both behaves in exactly the same way.  Some stuff about the code below.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;function populate_data_part(chardata, data_name, id_name) {&lt;br /&gt; for (var j in chardata[data_name]) {&lt;br /&gt;  var item = window[data_name].first( {&lt;br /&gt;   id : chardata[data_name][j][id_name + '_id']&lt;br /&gt;  });&lt;br /&gt;  $("#" + id_name + "_" + j + " option[id='" + id_name + "_" + j + "_option_" + item.id + "']").attr("selected", true);&lt;br /&gt;  // TODO - this part might be better in recalc&lt;br /&gt;  for(var i in window[id_name + "_edit_data"]) {&lt;br /&gt;   var edit_attr_name = window[id_name + "_edit_data"][i];&lt;br /&gt;   var value = chardata[data_name][j][edit_attr_name] == null ? item[edit_attr_name] : chardata[data_name][j][edit_attr_name];&lt;br /&gt;   $("#" + id_name + "_" + j + edit_attr_name).val(value == null ? "" : value);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For 0.4, I'll refactor the steaming pile that is feats.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-6110483989329117816?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/6110483989329117816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=6110483989329117816' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6110483989329117816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6110483989329117816'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/10/v03-available-for-download.html' title='v0.3 available for download'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-4411844876152875692</id><published>2009-10-03T10:35:00.000-04:00</published><updated>2009-10-03T10:38:45.419-04:00</updated><title type='text'>Windows 7 window tricks in XP</title><content type='html'>The most (only?) compelling feature of Windows 7 for me is the automatic window resizing.  When you grab a window and bang it against an edge, the window is resized to fill half the screen (either horizontally or vertically).&lt;br /&gt;&lt;br /&gt;You can get the same functionality for XP with &lt;a href="http://powerresizer.sourceforge.net/"&gt;PowerResizer&lt;/a&gt;.  Brilliant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-4411844876152875692?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/4411844876152875692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=4411844876152875692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4411844876152875692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4411844876152875692'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/10/windows-7-window-tricks-in-xp.html' title='Windows 7 window tricks in XP'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-7106068367241928557</id><published>2009-09-22T10:25:00.000-04:00</published><updated>2009-09-22T10:29:42.050-04:00</updated><title type='text'>Motorola Razr V3 keys not working</title><content type='html'>I had to look around for a bit to find the answer, so maybe this will save somebody some time:&lt;br /&gt;&lt;br /&gt;The keys (except for the red on/off button) on my Motorola Razr V3 stopped working during our trip to the beach.  Turns out the phone is sensitive to humidity, so putting the phone on the air conditioning vent for a little bit got it working again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-7106068367241928557?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/7106068367241928557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=7106068367241928557' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7106068367241928557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7106068367241928557'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/09/motorola-razr-v3-keys-not-working.html' title='Motorola Razr V3 keys not working'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-4210171871159633235</id><published>2009-08-21T04:47:00.000-04:00</published><updated>2009-08-21T04:57:11.870-04:00</updated><title type='text'>Safari Books Online</title><content type='html'>I recently got a Safari Books subscription from work, and it is awesome.  I don't enjoy reading long form content on the computer screen, but having access to concise, correct examples and solutions is a revelation when compared to sifting through the Google.  &lt;br /&gt;I loathe subscription fees but access to this technical library would be worth it, even if I had to (ugh) pay for it myself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-4210171871159633235?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/4210171871159633235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=4210171871159633235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4210171871159633235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4210171871159633235'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/08/safari-books-online.html' title='Safari Books Online'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-4833205245546598721</id><published>2009-08-17T06:51:00.000-04:00</published><updated>2009-08-18T12:54:13.891-04:00</updated><title type='text'>Javascript Development Environment</title><content type='html'>Doing this for a couple weeks, I now have a stable environment for javascript development:&lt;br /&gt;&lt;br /&gt;Eclipse 3.5 - Web Tools, XML Tools, Javascript, Subclipse&lt;br /&gt;Firefox - Firebug&lt;br /&gt;Chrome&lt;br /&gt;&lt;br /&gt;Development is leagues away from the effortless task of Java development, where Eclipse gives such an enormous lift it's hard to adjust to the basic help you get with dynamic languages. The Javascript editor is very good, but because of the language, there are no sophisticated refactoring tools included.  This important, especially when working on a new project, because you learn the specifics of the problem domain as you go.  With Java + Eclipse, agile development of sort "get it to work, get it work right, get it work fast" is perfectly natural.&lt;br /&gt;&lt;br /&gt;In any case, Firebug is immensely powerful as a debugging tool.  Critically, it has mouseover variable information.  There are some bridges between Eclipse and Firebug, but I could not get them to reliabily work on Linux, so it's: make a small change in the IDE, switch to Firefox reload, inspect.  Firebug has one annoying bug in that it shows errors in red over the top of the text of the line that is causing the problem.  If your lines are long you can't read them.  So I load the page in Google Chrome and inspect the code in its very pretty but less sophisticated debugging environment, and get the error in the console. Chrome is also damned fast, and formats things slightly different, so it useful if only as a second opinion.&lt;br /&gt;&lt;br /&gt;Even if Eclipse had no Javascript editor, context help, large file support, great search capabilities, intuitive diff comparison, unparalleled Team support, SVN integration, or Mylyn task tracking, its ludicrously configurable keybindings have me hooked.  I've configured a rational homerow editor navigation scheme that makes all others (emacs, vi, etc) blush in shame:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_U8QoBSDZQUk/Sok9xfWQ7XI/AAAAAAAAK6U/ZYolyC8TiqI/s1600-h/keybindings.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 126px;" src="http://1.bp.blogspot.com/_U8QoBSDZQUk/Sok9xfWQ7XI/AAAAAAAAK6U/ZYolyC8TiqI/s320/keybindings.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5370891951053794674" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(I'm happy to send the key prefs to any who request it).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-4833205245546598721?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/4833205245546598721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=4833205245546598721' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4833205245546598721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4833205245546598721'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/08/javascript-development-environment.html' title='Javascript Development Environment'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_U8QoBSDZQUk/Sok9xfWQ7XI/AAAAAAAAK6U/ZYolyC8TiqI/s72-c/keybindings.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-4071767021101179748</id><published>2009-08-15T06:53:00.000-04:00</published><updated>2009-08-21T05:03:37.759-04:00</updated><title type='text'>The house was decorated by an evil dolphin</title><content type='html'>I now have weapon deletion working (but not with the fancy JQueryUI blind effect I want), but I had to do something weird with my weapons array.  Simple remove of the weapon from the array:&lt;br /&gt;&lt;br /&gt;chardata.weapons.splice(weapon_idx, 1);&lt;br /&gt;&lt;br /&gt;does not "reorder" the array. Eg., &lt;br /&gt;&lt;br /&gt;&lt;div class="javascript" style="font-family:monospace;color: #006; border: 1px solid #d0d0d0; background-color: #f0f0f0;"&gt;&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;foo&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;bar&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;monkey&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;.&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;splice&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;does not just create [{foo}, {monkey}]. It's stored as &lt;br /&gt;&lt;br /&gt;["0":{foo}, "2":{monkey}]&lt;br /&gt;&lt;br /&gt;which causes a problem with the way I'm handling the UI.  My solution was to copy the array with slice(), then reassign it back to the real chardata object:&lt;br /&gt;&lt;br /&gt;chardata.weapons.splice(weapon_idx, 1);&lt;br /&gt;var foo = chardata.weapons.slice();&lt;br /&gt;chardata.weapons = foo;&lt;br /&gt;&lt;br /&gt;The indexes are sequential with no gaps. Weird, but it works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-4071767021101179748?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/4071767021101179748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=4071767021101179748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4071767021101179748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4071767021101179748'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/08/house-was-decorated-by-evil-dolphin.html' title='The house was decorated by an evil dolphin'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-6233759424147275542</id><published>2009-08-10T07:56:00.000-04:00</published><updated>2009-08-10T08:16:48.292-04:00</updated><title type='text'>Extracting a JSON array from a cookie</title><content type='html'>Knowing nothing, I had assumed that when you JSON-ify an array, then parse it back into an object, it comes out exactly as it went in.  No so, gentle reader.  Arrays are stored as named objects:&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; "spells":{"0":{"0":113,"1":135},"1":{},"2":{"0":227},"3":{"0":209,"1":186}}  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This means all arrays must be reconstituted manually:&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; // spells     &lt;br /&gt; if (chardata.spells != null) {  &lt;br /&gt;  char_spells = [];  &lt;br /&gt;  for (spell_lvl_idx in chardata.spells) {  &lt;br /&gt;   char_spells.push([]);  &lt;br /&gt;  for (char_spell in chardata.spells[spell_lvl_idx]) {  &lt;br /&gt;  char_spells[parseInt(spell_lvl_idx)].push(parseInt(chardata.spells[spell_lvl_idx][char_spell]));  &lt;br /&gt;  }  &lt;br /&gt;  }  &lt;br /&gt;  chardata.spells = char_spells;  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In this case, a multi-dimensional array of [spell level[spells per level]].&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-6233759424147275542?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/6233759424147275542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=6233759424147275542' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6233759424147275542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6233759424147275542'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/08/extracting-json-array-from-cookie.html' title='Extracting a JSON array from a cookie'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-6249259426301141838</id><published>2009-08-10T07:43:00.000-04:00</published><updated>2009-08-10T08:06:13.719-04:00</updated><title type='text'>v0.1</title><content type='html'>After solving a particularly nasty scoping issue (my loop counter &lt;span style="font-style:italic;"&gt;i&lt;/span&gt; was being used and updated in a nested function), v0.1 is out!  Everything basically works, provided you have the right browser and cookie permissions. To circumvent smartphone limitations, I've hosted it on my friends (slow) site:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://chambery.subfire.org/charmgrjs/edit.htm"&gt;http://chambery.subfire.org/charmgrjs/edit.htm&lt;/a&gt;l&lt;br /&gt;&lt;br /&gt;I created a branch (thanks to &lt;a href="http://dougr.net/?p=27"&gt;dougr&lt;/a&gt; for help with this): &lt;br /&gt;&lt;br /&gt;&lt;a href="http://charactermanager.googlecode.com/svn/branches/v0_1/"&gt;http://charactermanager.googlecode.com/svn/branches/v0_1/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The only trick is to create your branches/ directory first in the SVN Repository Explorer, before creating your tag.&lt;br /&gt;&lt;br /&gt;Further on down the road:&lt;br /&gt;0.2: Consolidate the separate .html files, make the javascript purely functional (no global data apart from the cookie which is loaded on initialization)&lt;br /&gt;0.3: Implement feats (yikes!)&lt;br /&gt;&lt;br /&gt;Along the way, I'll be transcribing the skill and spell data into the DB when I need a thinking break.  If anyone would like to help with this simple (though less than rewarding) task, shoot me an email.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-6249259426301141838?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/6249259426301141838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=6249259426301141838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6249259426301141838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6249259426301141838'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/08/v01.html' title='v0.1'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-1400815278055581737</id><published>2009-08-07T06:49:00.000-04:00</published><updated>2009-08-12T06:58:29.920-04:00</updated><title type='text'>Dialog for to show detail info</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_U8QoBSDZQUk/SnwHAPSdz1I/AAAAAAAAK4U/9GrHkyaya4U/s1600-h/skill_detail_dialog.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 149px; height: 200px;" src="http://4.bp.blogspot.com/_U8QoBSDZQUk/SnwHAPSdz1I/AAAAAAAAK4U/9GrHkyaya4U/s200/skill_detail_dialog.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5367172556604165970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Got the JQueryUI Dialog working (for some reason this was quite a struggle for me).  Clicking a spell, feat, or skill brings up a model dialog containing the full details of the selected element.&lt;br /&gt;&lt;br /&gt;The issue was the title.  The title is set on creation, and dialog doesn't get recreated on invocation(?), so you have to do some special thing to set it after initialization.  In any case, here's the code:&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt;   &lt;br /&gt;   content = '';&lt;br /&gt;   title = name;&lt;br /&gt;&lt;br /&gt;   $("#mydialog").html(content);  &lt;br /&gt;   $('#mydialog').dialog('option', 'title', title);  &lt;br /&gt;   $("#mydialog").dialog({  &lt;br /&gt;     modal: true,  &lt;br /&gt;     autoOpen: false,  &lt;br /&gt;     title: title  &lt;br /&gt;   });  &lt;br /&gt;   $("#mydialog").dialog('open');  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-1400815278055581737?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/1400815278055581737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=1400815278055581737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1400815278055581737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1400815278055581737'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/08/dialog-for-to-show-detail-info.html' title='Dialog for to show detail info'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_U8QoBSDZQUk/SnwHAPSdz1I/AAAAAAAAK4U/9GrHkyaya4U/s72-c/skill_detail_dialog.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-1911791235870637315</id><published>2009-08-07T06:22:00.001-04:00</published><updated>2009-08-07T06:43:36.968-04:00</updated><title type='text'>Loading and Saving TaffyDB data from cookies</title><content type='html'>I flopped around a good long time over this one:&lt;br /&gt;&lt;br /&gt;I'm using cookies as a datastore, but had an issue with TaffyDB not stringify correctly.  The TaffyDB author, &lt;a href="http://blog.joesgoals.com/"&gt;Ian Smith&lt;/a&gt; provided some critical help, and here is the working (though probably not ideal solution):&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; function clone(o) {  &lt;br /&gt;   if(typeof(o) != 'object') return o;  &lt;br /&gt;   if(o == null) return o;  &lt;br /&gt;   var newO = new Object();  &lt;br /&gt;   for(var i in o) newO[i] = clone(o[i]);  &lt;br /&gt;    return newO;  &lt;br /&gt; }  &lt;br /&gt; function sav(){  &lt;br /&gt;   var cookieData = clone(chardata);  &lt;br /&gt;   cookieData.skills = cookieData.skills.get();  &lt;br /&gt;   cookieData = TAFFY.JSON.stringify(cookieData);  &lt;br /&gt;   var d = new Date(2020, 02, 02);  &lt;br /&gt;   document.cookie = 'chardata=' + cookieData + ';expires=' + d.toUTCString();  &lt;br /&gt; }  &lt;br /&gt; function lod(){  &lt;br /&gt;   if (document.cookie.length &amp;gt; 0) {  &lt;br /&gt;     c_start = document.cookie.indexOf("chardata=");  &lt;br /&gt;     if (c_start != -1) {  &lt;br /&gt;       c_start = c_start + 9 //c_name.length + 1;  &lt;br /&gt;       c_end = document.cookie.indexOf(";", c_start);  &lt;br /&gt;       if (c_end == -1) {  &lt;br /&gt;         c_end = document.cookie.length;  &lt;br /&gt;       }  &lt;br /&gt;       cookie_data = document.cookie.substring(c_start, c_end);  &lt;br /&gt;       chardata = TAFFY.JSON.parse(unescape(cookie_data));  &lt;br /&gt;       chardata.skills = TAFFY(chardata.skills);  &lt;br /&gt;     }  &lt;br /&gt;   }  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The biggest stumbling block came from the fact that assigning chardata to a temporary var (and then stringify-ing it) changed my Taffy object into a string.  Cloning the db fixed the issue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-1911791235870637315?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/1911791235870637315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=1911791235870637315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1911791235870637315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1911791235870637315'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/08/loading-and-saving-taffydb-data-from.html' title='Loading and Saving TaffyDB data from cookies'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-7543248123382896445</id><published>2009-08-02T19:20:00.000-04:00</published><updated>2009-08-07T06:44:19.781-04:00</updated><title type='text'>Iterate over object attributes using JQuery</title><content type='html'>&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; var obj = {  &lt;br /&gt; foo: "bar",  &lt;br /&gt; baz: "quux"  &lt;br /&gt; };  &lt;br /&gt; jQuery.each(obj, function(name, value) {  &lt;br /&gt; alert(name + ": " + value);  &lt;br /&gt; });  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/1096924/iterating-a-javascript-objects-properties-using-jquery"&gt;http://stackoverflow.com/questions/1096924/iterating-a-javascript-objects-properties-using-jquer&lt;/a&gt;y&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-7543248123382896445?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/7543248123382896445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=7543248123382896445' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7543248123382896445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7543248123382896445'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/08/iterate-over-object-attributes-using.html' title='Iterate over object attributes using JQuery'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-2424134064386172936</id><published>2009-08-01T12:23:00.000-04:00</published><updated>2009-08-01T12:26:07.533-04:00</updated><title type='text'>Edit spells screen</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_U8QoBSDZQUk/SnRskw2UCrI/AAAAAAAAK3o/iRtciVn_BwQ/s1600-h/spells+screen.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 167px; height: 200px;" src="http://2.bp.blogspot.com/_U8QoBSDZQUk/SnRskw2UCrI/AAAAAAAAK3o/iRtciVn_BwQ/s200/spells+screen.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5365032434948901554" /&gt;&lt;/a&gt;&lt;br /&gt;Spells screen loads the available spells for the class, and prevents you from selecting more spells than allowed by the "spells known" table.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-2424134064386172936?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/2424134064386172936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=2424134064386172936' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/2424134064386172936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/2424134064386172936'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/08/edit-spells-screen.html' title='Edit spells screen'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_U8QoBSDZQUk/SnRskw2UCrI/AAAAAAAAK3o/iRtciVn_BwQ/s72-c/spells+screen.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-8353705595465128836</id><published>2009-07-31T07:10:00.000-04:00</published><updated>2009-08-02T19:57:54.611-04:00</updated><title type='text'>Biking in Pisgah National Forest</title><content type='html'>I've spent a good chunk of my vacation pounding on this project (it's fun, really), but took a break to bike a small part of the &lt;a href="http://maps.google.com/maps?q=fish+hatchery+pisgah+national+forest&amp;ie=UTF8&amp;hl=en&amp;ll=35.287491,-82.800779&amp;spn=0.018776,0.038581&amp;z=15&amp;iwloc=A"&gt;Pisgah National Forest near the Fish Hatchery&lt;/a&gt;.  Just amazing fun: downhill in a rainstorm on a modern mountain bike (my Trek 920 is so old it was Made in the USA).&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://www.biowheels.com/"&gt;Bio-Wheels&lt;/a&gt; in Asheville for the expert and friendly advice that came with the bike rental.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-8353705595465128836?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/8353705595465128836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=8353705595465128836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8353705595465128836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8353705595465128836'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/07/biking-in-pisgah-national-forest.html' title='Biking in Pisgah National Forest'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-1353401987038502503</id><published>2009-07-29T07:00:00.000-04:00</published><updated>2009-08-07T06:45:00.197-04:00</updated><title type='text'>Javascript isNumeric()</title><content type='html'>After flopping around looking for a Javascript isNumeric() function, &lt;a href="http://rosettacode.org/wiki/IsNumeric#JavaScript"&gt;Rosetta Code&lt;/a&gt; came to the rescue with &lt;code&gt;isFinite(num)&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; string value = "123.45e7";  &lt;br /&gt; if (isFinite(value))   &lt;br /&gt; {  &lt;br /&gt;  // do something  &lt;br /&gt; }  &lt;br /&gt; //Or, in web browser in URL box:  &lt;br /&gt; // javascript:value="123.45e4"; if(isFinite(value)) {alert('numeric')} else {alert('non-numeric')}  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-1353401987038502503?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/1353401987038502503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=1353401987038502503' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1353401987038502503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1353401987038502503'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/07/javascript-isnumeric.html' title='Javascript isNumeric()'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-3483808512723088688</id><published>2009-07-29T06:55:00.001-04:00</published><updated>2009-08-07T06:46:08.009-04:00</updated><title type='text'>Getting a value from JQuery .each()</title><content type='html'>I struggled mightily trying to get an attribute out of what gets returned from the JQuery .each() function, but eventually tried this and it works:&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;td id="skill_0_ranks" skill_id="0" align="right"&amp;gt;0a&amp;lt;/td&amp;gt;  &lt;br /&gt; // update skill mods  &lt;br /&gt; $('td[skill_id]').each(function(i, element){  &lt;br /&gt;  skill_id = $(element).attr('skill_id')  &lt;br /&gt;  update_skill(skill_id)  &lt;br /&gt; })  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Incidentally, found a cool site for code formatting: &lt;a href="http://codeformatter.blogspot.com/2009/06/about-code-formatter.html"&gt;http://codeformatter.blogspot.com/2009/06/about-code-formatter.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-3483808512723088688?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/3483808512723088688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=3483808512723088688' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/3483808512723088688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/3483808512723088688'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/07/getting-value-from-jquery-each.html' title='Getting a value from JQuery .each()'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-5035276174891467185</id><published>2009-07-23T08:30:00.000-04:00</published><updated>2009-07-23T22:49:16.565-04:00</updated><title type='text'>Edit Screen</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_U8QoBSDZQUk/SmkgxTkbI0I/AAAAAAAAK2k/AY0nG-X7Tf0/s1600-h/main+screen.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 154px;" src="http://4.bp.blogspot.com/_U8QoBSDZQUk/SmkgxTkbI0I/AAAAAAAAK2k/AY0nG-X7Tf0/s200/main+screen.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5361852862800012098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_U8QoBSDZQUk/SmkgtEayC0I/AAAAAAAAK2c/U5pMW_8oP6k/s1600-h/edit+screen.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 148px;" src="http://2.bp.blogspot.com/_U8QoBSDZQUk/SmkgtEayC0I/AAAAAAAAK2c/U5pMW_8oP6k/s200/edit+screen.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5361852790013561666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Edit and Main screens as they are today.  The should be functional on a 320x smartphone screen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-5035276174891467185?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/5035276174891467185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=5035276174891467185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/5035276174891467185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/5035276174891467185'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/07/edit-screen.html' title='Edit Screen'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_U8QoBSDZQUk/SmkgxTkbI0I/AAAAAAAAK2k/AY0nG-X7Tf0/s72-c/main+screen.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-1641360288846299674</id><published>2009-07-20T00:14:00.000-04:00</published><updated>2009-07-20T00:23:39.983-04:00</updated><title type='text'>From the top, but this time with feeling</title><content type='html'>A character manager for a smartphone actually makes sense, so I'm writing it over again in Javascript.  By the time I finish I may actually own one of these phones.  What finally sent me over the edge was &lt;a href="http://taffydb.com/"&gt;TaffyDB&lt;/a&gt;, a "database" for the browser.  I can store all the data in these hashes, and Taffy gives you a nice way way to pull the data you're interested in.  I think of the databases as Excel sheets (or Calc sheets, for the FOSS folks), and there are goodly number of Excel-based character managers out there, so I should be able to pull this off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-1641360288846299674?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/1641360288846299674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=1641360288846299674' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1641360288846299674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1641360288846299674'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2009/07/from-top-but-this-time-with-feeling.html' title='From the top, but this time with feeling'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-4499802261892483923</id><published>2007-06-26T08:55:00.000-04:00</published><updated>2008-12-10T05:46:26.312-05:00</updated><title type='text'>This is the end (for now)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_U8QoBSDZQUk/RoEOl3UuFqI/AAAAAAAAAbE/a_vAZTLwBL4/s1600-h/charmgrv1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_U8QoBSDZQUk/RoEOl3UuFqI/AAAAAAAAAbE/a_vAZTLwBL4/s320/charmgrv1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5080357898319435426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The thing is done.  The database is fairly stable, the edit perspective is basically done, and most importantly, I'll never use it.&lt;br /&gt;&lt;br /&gt;Todos:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Feat special rules need to be implemented&lt;/li&gt;&lt;br /&gt;&lt;li&gt;MainPerspective calculated values (melee, damage, etc.)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create charactersheet print out&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-4499802261892483923?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/4499802261892483923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=4499802261892483923' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4499802261892483923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4499802261892483923'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/06/this-is-end-for-now.html' title='This is the end (for now)'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_U8QoBSDZQUk/RoEOl3UuFqI/AAAAAAAAAbE/a_vAZTLwBL4/s72-c/charmgrv1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-690407595078712145</id><published>2007-06-25T16:42:00.000-04:00</published><updated>2007-06-26T08:55:39.432-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CheckboxTableViewer'/><category scheme='http://www.blogger.com/atom/ns#' term='RCP'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>CheckboxTableViewer.setChecked() fails silently</title><content type='html'>Took me a while to figure this out:&lt;br /&gt;&lt;br /&gt;If you have a CheckboxTableViewer and want to set the initial state of the table contents as (un)checked, you &lt;span style="font-weight:bold;"&gt;cannot do the initialization in the LabelProvider&lt;/span&gt;.  It seemed like the most logical place, and the viewer does enter the code for setChecked(element, true), but nothing is displayed.  Turns you have to let the table draw first (I don't understand why):&lt;br /&gt;&lt;br /&gt;&lt;code&gt; public void update() {&lt;br /&gt;  // inputs the same&lt;br /&gt;  tableViewer.setInput("");&lt;br /&gt;  tableViewer.refresh();&lt;br /&gt;&lt;br /&gt;  List&lt;DAO&gt; weapons = WeaponHome.inst.findAll();&lt;br /&gt;  for (DAO weapon : weapons) {&lt;br /&gt;   if (Ctx.getChar().weapons.contains(weapon)) {&lt;br /&gt;    ((CheckboxTableViewer) tableViewer).setChecked(weapon, true);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For the record, this is the code that &lt;span style="font-weight:bold;"&gt;does not work&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;  public String getColumnText(Object element, int columnIndex) {&lt;br /&gt;   String value = "";&lt;br /&gt;   Weapon weapon = (Weapon) element;&lt;br /&gt;   if (isEditable()) {&lt;br /&gt;    if (Ctx.getChar().weapons.contains(weapon)) {&lt;br /&gt;     ((CheckboxTableViewer) tableViewer).setChecked(element, true);&lt;br /&gt;    }&lt;br /&gt;   }&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-690407595078712145?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/690407595078712145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=690407595078712145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/690407595078712145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/690407595078712145'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/06/checkboxtableviewersetchecked-fails.html' title='CheckboxTableViewer.setChecked() fails silently'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-1214544047352358650</id><published>2007-05-29T18:57:00.001-04:00</published><updated>2007-05-29T19:03:23.173-04:00</updated><title type='text'>Expandable SWT/JFace Dialog</title><content type='html'>This confounded me for a while, so here's the short:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Extend JFace Dialog&lt;/li&gt;&lt;li&gt;Keep a handle to the content of your expandable section&lt;/li&gt;&lt;li&gt;Do this (from ErrorDialog):&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;code&gt;    private void toggleDetailsArea() {&lt;br /&gt;        Point windowSize = getShell().getSize();&lt;br /&gt;        Point oldSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);&lt;br /&gt;        if (listCreated) {&lt;br /&gt;            list.dispose();&lt;br /&gt;            listCreated = false;&lt;br /&gt;            detailsButton.setText(IDialogConstants.SHOW_DETAILS_LABEL);&lt;br /&gt;        } else {&lt;br /&gt;            list = createDropDownList((Composite) getContents());&lt;br /&gt;            detailsButton.setText(IDialogConstants.HIDE_DETAILS_LABEL);&lt;br /&gt;        }&lt;br /&gt;        Point newSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);&lt;br /&gt;        getShell()&lt;br /&gt;                .setSize(&lt;br /&gt;                        new Point(windowSize.x, windowSize.y&lt;br /&gt;                                + (newSize.y - oldSize.y)));&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-1214544047352358650?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/1214544047352358650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=1214544047352358650' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1214544047352358650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1214544047352358650'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/05/expandable-swtjface-dialog.html' title='Expandable SWT/JFace Dialog'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-4963451715694186769</id><published>2007-05-20T08:39:00.000-04:00</published><updated>2008-12-10T05:46:26.443-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RCP'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='TreeViewer'/><title type='text'>Working with Checkboxes in TreeItems</title><content type='html'>I spent some time working out how to get my Tree checkboxes functional.  I'm reusing the SpellsView across the display and edit view (with AbstractSpellsView:&lt;br /&gt;&lt;code&gt;&lt;br /&gt; public void createPartControl(Composite parent) {&lt;br /&gt;...&lt;br /&gt;  if (isEditable()) {&lt;br /&gt;   // select checkbox&lt;br /&gt;   TreeColumn treeColumn11 = new TreeColumn(tree, SWT.NONE);&lt;br /&gt;   treeColumn11.setWidth(60);&lt;br /&gt;  }&lt;br /&gt;  TreeColumn nameCol = new TreeColumn(tree, SWT.NONE);&lt;br /&gt;  nameCol.setWidth(60);&lt;br /&gt;  nameCol.setText("Name");&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_U8QoBSDZQUk/RlBQVMnv-VI/AAAAAAAAAYM/ZwXvHwVgw8M/s1600-h/Checkbox+TreeViewer.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_U8QoBSDZQUk/RlBQVMnv-VI/AAAAAAAAAYM/ZwXvHwVgw8M/s320/Checkbox+TreeViewer.png" alt="" id="BLOGGER_PHOTO_ID_5066637905887230290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The subclasses override the getInput(), the abstract view includes a switch in the create and LabelProviders to update or ignore the checkbox.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-4963451715694186769?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/4963451715694186769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=4963451715694186769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4963451715694186769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4963451715694186769'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/05/working-with-checkboxes-in-treeitems.html' title='Working with Checkboxes in TreeItems'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_U8QoBSDZQUk/RlBQVMnv-VI/AAAAAAAAAYM/ZwXvHwVgw8M/s72-c/Checkbox+TreeViewer.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-1664284627222106211</id><published>2007-05-12T10:56:00.000-04:00</published><updated>2008-12-10T05:46:26.700-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RCP'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>One Perspective to Rule Them All</title><content type='html'>I've had a few discussion about the "failings" of the Eclipse perspective model to effectively deal with the complexity of information management within an IDE.  While most of his arguments are perfectly loony, he made the point that Eclipse imposes a "Debug Perspective" on you while coding, causing the developer to lose focus as you switch from whatever his main work perspective is.  This bugged me enough in the past to create a new window to house the Debug perspective.  The new solution:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_U8QoBSDZQUk/RkXYCNpfe4I/AAAAAAAAAYE/LfzUlMtCA78/s1600-h/Screenshot-Debug+-++Eclipse+SDK+.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_U8QoBSDZQUk/RkXYCNpfe4I/AAAAAAAAAYE/LfzUlMtCA78/s320/Screenshot-Debug+-++Eclipse+SDK+.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5063690888583019394" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-1664284627222106211?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/1664284627222106211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=1664284627222106211' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1664284627222106211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1664284627222106211'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/05/one-perspective-to-rule-them-all.html' title='One Perspective to Rule Them All'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_U8QoBSDZQUk/RkXYCNpfe4I/AAAAAAAAAYE/LfzUlMtCA78/s72-c/Screenshot-Debug+-++Eclipse+SDK+.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-7713350378029901024</id><published>2007-05-12T09:49:00.000-04:00</published><updated>2008-12-10T05:46:27.100-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RCP'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><title type='text'>Porting to RCP</title><content type='html'>After taking the charmgr as far as I could with PyGTK, I've decided to port it over to the Eclipse RCP.  Whatever its failings, I love the frameworks and architecture, and expertise in Eclipse is marketable.  The philosophy is about 180 degrees from Python (I've read many posts lauding Python's lack of rigid frameworks), but being from Java, the RCP is my comfort zone.&lt;br /&gt;&lt;br /&gt;Porting the UI was trivial using the Visual Editor (though not nearly as simple as Glade):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_U8QoBSDZQUk/RkXKHdpfe1I/AAAAAAAAAXs/BVuBYNYqhjk/s1600-h/Charmgr+RCP+Screenshot.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_U8QoBSDZQUk/RkXKHdpfe1I/AAAAAAAAAXs/BVuBYNYqhjk/s320/Charmgr+RCP+Screenshot.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5063675585614543698" /&gt;&lt;/a&gt;&lt;br /&gt;I used Derby as a replacement for SQLite, and after populating the Spell tree using straight SQL, I thought I'd look into Hibernate for data access.  The Hibernate framework hides the SQL from the code, provides a lot of connection management functionality, and has the added benefit of generating most of the boilerplate DAO code.  Unfortunately I ran into an access problem when trying to initialize Hibernate from the RCP:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; private Object getInput() {&lt;br /&gt;  logger.debug("getInput()");&lt;br /&gt;&lt;br /&gt;  HibernateUtil.currentSession();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Basically get a ClassNotFoundException on Session.  This solved by creating a &lt;a href="http://www.hibernate.org/311.html"&gt;plugin from the jar&lt;/a&gt; and registering it in the MANIFEST.MF.&lt;br /&gt;&lt;br /&gt;After flopping around for a bit, I violated good practice and copied the &lt;span style="font-weight:bold;"&gt;hibernate.cfg.xml&lt;/span&gt; file to the root of the org.hibernate plugin.  This solved the problem for the short term.  I then moved all the dependent jars to their rightful place in the hibernate plugin and as well the creating an org.apache.logging plugin for those libs (so both hibernate and charmgr can access the logging).  I cheated again by copying the &lt;span style="font-weight:bold;"&gt;log4j.xml&lt;/span&gt; to the logging plugin to resolve that little classpath issue.&lt;br /&gt;&lt;br /&gt;So my current workspace looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_U8QoBSDZQUk/RkXU_dpfe2I/AAAAAAAAAX0/pSlaOUf7gnQ/s1600-h/Plugin+Structure.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_U8QoBSDZQUk/RkXU_dpfe2I/AAAAAAAAAX0/pSlaOUf7gnQ/s320/Plugin+Structure.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5063687542803495778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and the main view is now functional:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_U8QoBSDZQUk/RkXVatpfe3I/AAAAAAAAAX8/IrLc1V79y3g/s1600-h/Screenshot-Character+Manager+.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_U8QoBSDZQUk/RkXVatpfe3I/AAAAAAAAAX8/IrLc1V79y3g/s320/Screenshot-Character+Manager+.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5063688010954931058" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-7713350378029901024?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/7713350378029901024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=7713350378029901024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7713350378029901024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7713350378029901024'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/05/porting-to-rcp.html' title='Porting to RCP'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_U8QoBSDZQUk/RkXKHdpfe1I/AAAAAAAAAXs/BVuBYNYqhjk/s72-c/Charmgr+RCP+Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-4263104561665759890</id><published>2007-03-11T17:37:00.000-04:00</published><updated>2007-03-13T18:05:27.832-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TiddlyWiki'/><title type='text'>TiddlyWiki Customization Notes</title><content type='html'>&lt;a href="http://www.tiddlywiki.com/"&gt;TiddlyWiki&lt;/a&gt; rocks the house, of course.  Fantastic tool for a professional diary, and it's been tweaked for all kinds of tasks. I'm experimenting with using it as an content manager for static media, so I want to remove/hide the sidebar (what contains the search, options, tabs, etc):&lt;br /&gt;&lt;br /&gt;1. remove the &amp;lt;div&amp;gt; sidebar stuff:&lt;br /&gt;&lt;blockquote&gt;        &amp;lt;div id='sidebar'&amp;gt;\n&amp;lt;div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'&amp;gt;&amp;lt;/div&amp;gt;\n&amp;lt;div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'&amp;gt;&amp;lt;/div&amp;gt;\n&amp;lt;/div&amp;gt;\n (249:780)&lt;/blockquote&gt;&lt;br /&gt;2. recover the space for the content area:&lt;br /&gt;&lt;blockquote&gt;        #displayArea {\n margin: 1em &lt;span style="font-weight:bold;"&gt;0em&lt;/span&gt; 0em 14em;\n} (247:4250)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The search box is the only thing I'm interested in keeping from the sidebar, so I move it to the MainMenu (right sidebar) simply by adding &amp;lt;&amp;lt;search&amp;gt;&amp;gt; to the content of MainMenu.&lt;br /&gt;&lt;br /&gt;Because the content of the wiki will be static (it will eventually be the gateway to CD of deliverable documentation), I want to remove the editor and creation/modification date information on tiddler subtitle found on the ViewTemplate:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;\n&amp;lt;div class='subtitle'&amp;gt;&amp;lt;span macro='view modifier link'&amp;gt;&amp;lt;/span&amp;gt;, &amp;lt;span macro='view modified date [[DD MMM YYYY]]'&amp;gt;&amp;lt;/span&amp;gt; (&amp;lt;span macro='message views.wikified.createdPrompt'&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span macro='view created date [[DD MMM YYYY]]'&amp;gt;&amp;lt;/span&amp;gt;)&amp;lt;/div&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I also changed all refs to "tiddler" to "entry" to grow things up a little bit.&lt;br /&gt;&lt;br /&gt;I don't like the way the heading are formatted by default, viz. the blue background,  so that's the next to go:&lt;br /&gt;&lt;blockquote&gt;background: [[ColorPalette::PrimaryPale]];\n(246,446)&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-4263104561665759890?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/4263104561665759890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=4263104561665759890' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4263104561665759890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/4263104561665759890'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/03/tiddlywiki-customization-notes.html' title='TiddlyWiki Customization Notes'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-6477232307918485045</id><published>2007-02-18T11:52:00.000-05:00</published><updated>2007-02-18T16:22:51.554-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TextView'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='PyGTK'/><title type='text'>Getting text from a TextView</title><content type='html'>It took some searching to see how to get the string contained in a TextView with a string (hint: there's no textview.get_text()), but here's the snippet I came up with:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;notes_txt = self.widgets.get_widget('notesTxt').get_buffer()&lt;br /&gt;startiter, enditer = notes_txt.get_bounds()&lt;br /&gt;character = dbaccess.fetch_character(self.char_id)&lt;br /&gt;notes_file = open(character['name'] + "-notes.txt", "w")&lt;br /&gt;notes_file.write(notes_txt.get_text(startiter, enditer))&lt;br /&gt;notes_file.close()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Basically, you have to find the start and end Iters to set the bounds of the text you want.&lt;br /&gt;&lt;br /&gt;Populating is trivial:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;try:&lt;br /&gt;  notes_file = open(character['name'] + "-notes.txt", "r")&lt;br /&gt;  text = self.widgets.get_widget('notesTxt').get_buffer()&lt;br /&gt;  text.set_text(notes_file.read())&lt;br /&gt;  notes_file.close()&lt;br /&gt;except:&lt;br /&gt;  print "No notes file found: ", character['name'] + \&lt;br /&gt;    "-notes.txt"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-6477232307918485045?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/6477232307918485045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=6477232307918485045' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6477232307918485045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6477232307918485045'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/02/setting-text-in-textview.html' title='Getting text from a TextView'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-5648079603354587926</id><published>2007-02-10T12:19:00.000-05:00</published><updated>2007-02-18T16:09:22.973-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComboBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='PyGTK'/><title type='text'>Setting the active text on a ComboBox</title><content type='html'>I had some trouble finding this on the Interweb, so here's how you set the active text on a ComboBox:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    def set_combo_value(self, combo, value):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        model=combo.get_model()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        for item in model:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            if item[0]==value:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                combo.set_active_iter(item.iter)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                break&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Setting the active item by index you can get right off the ComboBox API.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-5648079603354587926?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/5648079603354587926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=5648079603354587926' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/5648079603354587926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/5648079603354587926'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/02/setting-active-text-on-combobox.html' title='Setting the active text on a ComboBox'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-8561223179435219005</id><published>2007-02-07T15:04:00.000-05:00</published><updated>2008-12-10T05:46:27.321-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='pysqlite'/><title type='text'>SQLLite Database Browser</title><content type='html'>Here's a nice tool for browsing the contents of the Character Manager db:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/project/showfiles.php?group_id=87946"&gt;SQLLite Database Browser &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Runs as a single .exe, no dependency downloading nonsense.  Excellent work, guys!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_U8QoBSDZQUk/Rcoxzc7AzzI/AAAAAAAAAGI/J_zKLAvMfl4/s1600-h/sqllitedbbrowser-screenshot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_U8QoBSDZQUk/Rcoxzc7AzzI/AAAAAAAAAGI/J_zKLAvMfl4/s320/sqllitedbbrowser-screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5028886693919379250" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-8561223179435219005?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/8561223179435219005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=8561223179435219005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8561223179435219005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/8561223179435219005'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/02/sqllite-database-browser.html' title='SQLLite Database Browser'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_U8QoBSDZQUk/Rcoxzc7AzzI/AAAAAAAAAGI/J_zKLAvMfl4/s72-c/sqllitedbbrowser-screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-2337957917708970417</id><published>2007-02-03T11:18:00.000-05:00</published><updated>2007-03-12T10:01:42.652-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComboBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='Glade'/><category scheme='http://www.blogger.com/atom/ns#' term='PyGTK'/><title type='text'>Populating a ComboBox</title><content type='html'>I'm using Glade to design my UI, which introduced some difficulty in figuring out how to populate my ComboBox (of which there are 2 versions in PyGTK).   The &lt;a href="http://www.pygtk.org/pygtk2tutorial/sec-ComboBoxAndComboboxEntry.html#sec-ComboBox"&gt;PyGTK Tutorial&lt;/a&gt; was helpful, and the &lt;a href="http://www.pygtk.org/feedback.html"&gt;PyGTK IRC Channel&lt;/a&gt; took me the last mile.&lt;br /&gt;&lt;br /&gt;The short of it is, a ComboBox works like a &lt;a href="http://www.pygtk.org/pygtk2tutorial/ch-TreeViewWidget.html"&gt;TreeView&lt;/a&gt;:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   &lt;br /&gt;&lt;span style="font-style: italic;"&gt;       # create a store&lt;/span&gt;&lt;br /&gt;    weapon_store=gtk.ListStore(gobject.TYPE_STRING)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;       # populate the store&lt;/span&gt;&lt;br /&gt;    for w in weapon_names:&lt;br /&gt;        row=weapon_store.insert_after(None, None)&lt;br /&gt;        weapon_store.set_value(row, 0, w)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;       # get the Glade widget&lt;/span&gt;&lt;br /&gt;    left_hand_weapon_cbo=self.widgets.get_widget('leftHandWeapon')&lt;br /&gt;    left_hand_weapon_cbo.set_model(weapon_store)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        # the business bit&lt;/span&gt;&lt;br /&gt;    cell=gtk.CellRendererText()&lt;br /&gt;    left_hand_weapon_cbo.pack_start(cell)&lt;br /&gt;    left_hand_weapon_cbo.add_attribute(cell, 'text', 0)&lt;br /&gt;    left_hand_weapon_cbo.set_wrap_width(3)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It would be nice if the Glade/PyGTK infrastructure would do more of the work of setting up the widgets with sensible defaults.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-2337957917708970417?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/2337957917708970417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=2337957917708970417' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/2337957917708970417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/2337957917708970417'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/02/populating-combobox.html' title='Populating a ComboBox'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-213508557253732093</id><published>2007-02-01T21:14:00.000-05:00</published><updated>2008-12-10T05:46:27.415-05:00</updated><title type='text'>Edit Character Screenshot</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_U8QoBSDZQUk/RcKesrgAWcI/AAAAAAAAAFI/P0Gjl4ytRzY/s1600-h/checkbox.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_U8QoBSDZQUk/RcKesrgAWcI/AAAAAAAAAFI/P0Gjl4ytRzY/s320/checkbox.png" alt="" id="BLOGGER_PHOTO_ID_5026754624527292866" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-213508557253732093?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/213508557253732093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=213508557253732093' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/213508557253732093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/213508557253732093'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/02/edit-character-screenshot.html' title='Edit Character Screenshot'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_U8QoBSDZQUk/RcKesrgAWcI/AAAAAAAAAFI/P0Gjl4ytRzY/s72-c/checkbox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-6064863326652998456</id><published>2007-01-23T07:06:00.000-05:00</published><updated>2008-12-10T05:46:27.526-05:00</updated><title type='text'>Screenshot</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_U8QoBSDZQUk/Rb0qb7gAWbI/AAAAAAAAAE4/pPemyGBRpy8/s1600-h/Screenshot-Character+Manager.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_U8QoBSDZQUk/Rb0qb7gAWbI/AAAAAAAAAE4/pPemyGBRpy8/s320/Screenshot-Character+Manager.png" alt="" id="BLOGGER_PHOTO_ID_5025219418532108722" border="0" /&gt;&lt;/a&gt;First pass with by-level spell table populated from the character file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-6064863326652998456?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/6064863326652998456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=6064863326652998456' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6064863326652998456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6064863326652998456'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/01/screenshot.html' title='Screenshot'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_U8QoBSDZQUk/Rb0qb7gAWbI/AAAAAAAAAE4/pPemyGBRpy8/s72-c/Screenshot-Character+Manager.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-1140884465361455581</id><published>2007-01-22T13:47:00.000-05:00</published><updated>2007-03-12T10:02:56.348-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='Glade'/><title type='text'>First Thoughts</title><content type='html'>&lt;a href="http://glade.gnome.org/"&gt;Glade&lt;/a&gt; is quite nice apart from the GIMP-style multi window UI.  It's incredibly frustrating to have a web page with instructions (or another app with a mockup)  underneath Glade, then click that app and then have to raise each of the four Glade windows separately.  Makes absolutely no sense.  A friend of mine suggests that's what multiple desktops are for, but this is a clumsy workaround.&lt;br /&gt;&lt;br /&gt;Found a  good &lt;a href="http://handhelds.org/%7Enelson/pyglade/pyglade-tutorial"&gt;tutorial on Glade + Python&lt;/a&gt;.  It's all text, and somewhat outdated, but was the most helpful of the stuff I read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-1140884465361455581?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/1140884465361455581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=1140884465361455581' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1140884465361455581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/1140884465361455581'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/01/first-thoughts.html' title='First Thoughts'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-6351442489754590940</id><published>2007-01-22T10:28:00.000-05:00</published><updated>2007-03-12T10:01:14.131-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Complainery'/><title type='text'>Kicking the Java Desktop</title><content type='html'>&lt;a href="http://mooseyard.com/Jens/2007/01/in-which-i-think-about-java-again-but-only-for-a-moment/"&gt;This guy&lt;/a&gt; makes some disparaging (but empty) comments about Java on the Desktop.  It's early days, but my own experience with Python + Glade leaves &lt;span style="font-style: italic;"&gt;much&lt;/span&gt; to be desired.  Java tools are massive levers of productivity, Eclipse foremost among them.  Why anyone would prefer working in a bare text editor + commandline is beyond me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-6351442489754590940?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/6351442489754590940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=6351442489754590940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6351442489754590940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/6351442489754590940'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/01/kicking-java-desktop.html' title='Kicking the Java Desktop'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5498556369630320111.post-7537275179301289426</id><published>2007-01-22T10:25:00.000-05:00</published><updated>2007-03-12T10:00:34.580-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dungeons and Dragons'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='PyGTK'/><title type='text'>First Post</title><content type='html'>This is experimental blog tied to the development &lt;a href="http://code.google.com/p/charactermanager"&gt;Character Manager&lt;/a&gt; application.  This will be the journal for development (containing editorial content), leaving the wiki for "factual" data.  The Character Manager application is a simple UI for managing characters used in the &lt;a href="http://en.wikipedia.org/wiki/Dungeons_&amp;amp;_Dragons"&gt;Dungeons and Dragons game&lt;/a&gt;.  It is inspired by &lt;a href="http://home.redblade.org/"&gt;RedBlade&lt;/a&gt;, but it's chief purpose is to teach me Python + GTK UI development.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5498556369630320111-7537275179301289426?l=charactermanager.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://charactermanager.blogspot.com/feeds/7537275179301289426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5498556369630320111&amp;postID=7537275179301289426' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7537275179301289426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5498556369630320111/posts/default/7537275179301289426'/><link rel='alternate' type='text/html' href='http://charactermanager.blogspot.com/2007/01/first-post.html' title='First Post'/><author><name>Felonious Ham</name><uri>http://www.blogger.com/profile/10641505328073733042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
