<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Refactored scope</title>
	<atom:link href="http://ominian.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://ominian.com</link>
	<description>PyMethius project notes</description>
	<lastBuildDate>Sat, 06 Mar 2010 11:49:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Hosting local, the ghetto fabulous way</title>
		<link>http://ominian.com/2010/03/05/hosting-local-the-ghetto-fabulous-way/</link>
		<comments>http://ominian.com/2010/03/05/hosting-local-the-ghetto-fabulous-way/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 10:31:47 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[simpleCodeTricks]]></category>

		<guid isPermaLink="false">http://ominian.com/?p=17</guid>
		<description><![CDATA[   One of the first big draws of Ruby on Rails in late 2006 was the ability to host my development environment locally.  Not only did this cut down on the chore work of developing in an environment, but it probably also boosted productivity for me substantially.  A year later when [...]]]></description>
			<content:encoded><![CDATA[<p>   One of the first big draws of Ruby on Rails in late 2006 was the ability to host my development environment locally.  Not only did this cut down on the chore work of developing in an environment, but it probably also boosted productivity for me substantially.  A year later when I started teaching myself Python, another nail was hammered into the coffin that is my opinion of PHP.   That said, I&#8217;ve toyed with a lot of different idea&#8217;s of hosting a PHP environment locally but to a degree stymied in the effort.<br />
<span id="more-17"></span><br />
   Late last year I asked on <a href="http://stackoverflow.com/questions/1679084/lightweight-development-web-server-with-support-for-php-v2">Stack overflow</a> a question of how to accomplish the above for PHP.  Results were somewhat mixed and it looks like everyone who provided an answer was ultimately punished for their effort.  As of March 5, 2010 the only answer with a positive vote is because I up voted it up.</p>
<p>   Now a few months down the road, I&#8217;ve been playing with a much simpler approach using Lighttpd.  It&#8217;s not perfect for a couple reasons I will point out&#8230;but good enough for me, for now.</p>
<pre>
# default document-root
  var.baseDir = var.CWD
  server.document-root = var.baseDir + "/"
   index-file.names   = ( "index.php", "index.html", "index.htm", "default.htm" )

  # TCP port
  server.port = 8000

  # selecting modules
  server.modules = ("mod_rewrite", "mod_accesslog", "mod_fastcgi")

  #logs
  accesslog.filename = var.baseDir + "/access.log"
  server.errorlog = var.baseDir + "/error.log"

    server.dir-listing = "enable"
    mimetype.use-xattr = "enable"
    mimetype.assign = (
  ".html" => "text/html",
  ".txt" => "text/plain",
  ".jpg" => "image/jpeg",
  ".png" => "image/png",
  ".js" => "text/javascript"
  )

  static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
  fastcgi.server = (
  ".php" =>
  (( "host" => "127.0.0.1",
     "port" => 9000,
      "bin-path" => "/usr/bin/php5-cgi"
  )))
</pre>
<p>   What seems like a lifetime ago, I was <em>the</em> database administrator for a very heavily trafficked web SaaS site.  One thing I remembered vividly was that for a poorly configured development instance of MySQL, random logging and utility files would crop up in strange places.  Since I was already spending a good portion of my life at that time with MySQL, I spent some extra time to figure out that these files were showing up because my.cnf was configured with relative file paths.  Taking that memory alongside my habit of relaying on document relative paths in Apache, I wondered if I could do the same for lighttpd.</p>
<p>   Turns out you can actually.  So using the above template, I can host arbitrary locations in my /home directory by simply running &#8220;lighttpd -f lighttpd.conf -D&#8221; which translates out to:  Lighttp&#8217;y run using this specific configuration file ( -F lighttpd.conf ) in the current PWD and stay resident to the console -D so I can shut you down later&#8221;</p>
<h2>Problems</h2>
<p>    Unless you change the local config file to something else, you can&#8217;t run two instances of lighttp&#8217;y concurrently.  First reason is that the second instance would try to listen to the same port for http traffic.  This is pretty easy to fix, just change sever.port to some other port #.   The second problem is that fastcgi.server also has to have it&#8217;s own port to listen for fastcgi traffic.</p>
<p>    Also, it might not be to obvious, but if you ran the above config on a non-firewalled, internet homed box, someone could find your development environment and possibly cause havoc.</p>
<h2>Solutions</h2>
<p>    The first problem is a doozy that won&#8217;t have an easy fix&#8230; and its debatable whether investing time to come up with a fix.</p>
<p>   Second problem is stupid easy by adding:</p>
<pre>
   server.bind = "127.0.0.1"
</pre>
<p>  to tell your instance to home on the loopback address.</p>
]]></content:encoded>
			<wfw:commentRss>http://ominian.com/2010/03/05/hosting-local-the-ghetto-fabulous-way/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bridging the gap:  GIT &amp; SVN, B.F.F.</title>
		<link>http://ominian.com/2010/03/02/bridging-the-gap-git-svn-b-f-f/</link>
		<comments>http://ominian.com/2010/03/02/bridging-the-gap-git-svn-b-f-f/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 05:24:29 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://ominian.com/?p=14</guid>
		<description><![CDATA[Background
  I&#8217;ve been using SVN for several years now, since late 2005 or early 2006, and its done me well since then.  But a new darling has entered my life and its name is Git.  I like git for some very specific reasons:  It&#8217;s stupid easy to work with and as [...]]]></description>
			<content:encoded><![CDATA[<h3>Background</h3>
<p>  I&#8217;ve been using SVN for several years now, since late 2005 or early 2006, and its done me well since then.  But a new darling has entered my life and its name is Git.  I like git for some very specific reasons:  It&#8217;s stupid easy to work with and as good or better then SVN for reliability.  Also it helps that my preferred IDE, Komodo, recognizes and works with Git as well.<br />
   That said, I use google code for hosting my public projects and it only supports SVN and HG.  So one night I read up on git and noticed that it had a plugin/support for bridging to a SVN managed repo.  So began my journey.<br />
<span id="more-14"></span></p>
<p>!Note &#8211; I am using a client side credentials manager, if access to your repo requires authentication credentials you will need to supply them where appropriate.</p>
<h3>Initialization</h3>
<p>Bridging a new Git Repo to a new directory in SVN<br />
Step 1:</p>
<pre>
$svn mkdir https://devdave.googlecode.com/svn/trunk/javascript/canvastag/cnvLib

Committed revision 26.
</pre>
<p>      Now I&#8217;ve got a fresh/empty svn directory</p>
<pre>
   $git svn init https://devdave.googlecode.com/svn/trunk/javascript/canvastag/cnvLib
   Initialized empty Git repository in ~/dev/javascript/cnvLib/.git/
</pre>
<p>      Now I&#8217;ve got a local git repo that has most of the information I need for the bridge, to verify everything is hunky dory so far:</p>
<pre>
    $git svn fetch
    #r26 = a47a908ea96bec2d737f6646c47418778ce6ad32 (git-svn)
</pre>
<p><a href="http://ominian.com/wp-content/uploads/2010/03/cnvLib_initial.jpeg"><img src="http://ominian.com/wp-content/uploads/2010/03/cnvLib_initial-300x130.jpg" alt="Before the graft" title="Before the graft" width="300" height="130" class="alignnone size-medium wp-image-16" /></a></p>
<h3>Final steps, the graft</h3>
<p>Some tutorials out there say you should run git svn rebase or such, but doing so has gone poorly for me with results like </p>
<pre>
$ git svn rebase
      fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
      Use '--' to separate paths from revisions
      log --no-color --first-parent --pretty=medium HEAD: command returned error: 128
</pre>
<p>  I believe the problem relates to lining up your local Git repository with the remote SVN repository.   Unfortunately I was somewhat stuck in trying to figure out how the hell to fix this problem for a long time.  Fortunately Google search is the modern day version of a genie, it can grant you the information you seek, but first you have to know what to ask.  Which led me to finding <a href="http://eikke.com/importing-a-git-tree-into-a-subversion-repository/">this</a> blog post.</p>
<p>  I am not doing things &#8220;exactly&#8221; like the aforementioned blog, but close enough that I can get a similar result.</p>
<pre>
$ git show-ref
2a41e85e0dc264cfdb6c04b59547a3093c02f64f refs/heads/master
a47a908ea96bec2d737f6646c47418778ce6ad32 refs/remotes/git-svn
$ git log --pretty=oneline master
2a41e85e0dc264cfdb6c04b59547a3093c02f64f Initial import, copied from ping project
$ echo "2a41e85e0dc264cfdb6c04b59547a3093c02f64f a47a908ea96bec2d737f6646c47418778ce6ad32" >> .git/info/grafts
</pre>
<p><a href="http://ominian.com/wp-content/uploads/2010/03/cnvLib_aftergraft.jpeg"><img src="http://ominian.com/wp-content/uploads/2010/03/cnvLib_aftergraft-300x130.jpg" alt="After the Graft" title="After the Graft" width="300" height="130" class="alignnone size-medium wp-image-15" /></a>       </p>
<p>Since I am doing things a little odd/differently, there is no &#8220;trunk&#8221; branch available.  But the idea is close enough to duplicate.  I&#8217;ve already made some add/commit&#8217;s to my local Git repo but there isn&#8217;t a logical way to tell git/git-svn that this local commit also belongs to my remote SVN remote.  A more human friendly version of git show-ref is<br />
available via:</p>
<pre>
$ git branch -a
* master
  remotes/git-svn
</pre>
<p>So the concatenation of the two internal reference&#8217;s into .git/info/graft helps git-svn understand that the two separate repositories belong to each other.   Sometimes it&#8217;s nice when a configuration structure does what it&#8217;s called.</p>
<p>That said, on to the next obvious step, actually pushing changes from a local Git repo to SVN.</p>
<pre>
$ git svn dcommit
Committing to https://devdave.googlecode.com/svn/trunk/javascript/canvastag/cnvLib ...
        A       app.canvas.js
        A       app.input.js
        A       app.main.js
        A       app.mainloop.js
        A       app.shapes.js
Committed r27
        A       app.canvas.js
        A       app.mainloop.js
        A       app.input.js
        A       app.shapes.js
        A       app.main.js
r27 = ae1cd1055deffe4209ab89d1316c97336c731c39 (git-svn)
No changes between current HEAD and refs/remotes/git-svn
Resetting to the latest refs/remotes/git-svn
</pre>
<h2>What&#8217;s going on here?</h2>
<p>    As I am still learning the finer points of Git, it was important to me to understand what exactly .git/info/grafts does.  So turning to my favorite resource for arbitrary questions&#8230; I found an answer on Stack overflow: <a href="http://stackoverflow.com/questions/161928/what-are-git-info-grafts-for">What are git info grafts for</a>?   And a more official answer in the Git Wiki <a href="http://git.wiki.kernel.org/index.php/GraftPoint">http://git.wiki.kernel.org/index.php/GraftPoint</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ominian.com/2010/03/02/bridging-the-gap-git-svn-b-f-f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Canvas tag: Collision detection &amp; pixel decay</title>
		<link>http://ominian.com/2010/03/02/canvas-tag-collision-detection-pixel-decay/</link>
		<comments>http://ominian.com/2010/03/02/canvas-tag-collision-detection-pixel-decay/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 22:49:55 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://ominian.com/?p=13</guid>
		<description><![CDATA[Continuing my tests/experiments with the Canvas tag has led to the Ping prototype.  I had 3 minimal things I wanted to accomplish:  Detecting the intersection of a 360 degree arc of ray/line segments to previously defined in map shapes; a visual decay/fade out of intersection points on the canvas, and lastly a test [...]]]></description>
			<content:encoded><![CDATA[<p>Continuing my tests/experiments with the Canvas tag has led to the <a href="http://ominian.com/examples/js/canvastag/ping">Ping prototype</a>.  I had 3 minimal things I wanted to accomplish:  Detecting the intersection of a 360 degree arc of ray/line segments to previously defined in map shapes; a visual decay/fade out of intersection points on the canvas, and lastly a test of performance.  In addition I decided to experiment with another approach to Javascript object construction in the hopes of getting a performance gain.<br />
<span id="more-13"></span><br />
<strong> performance</strong><br />
None of the code involved is optimized or really geared towards performance [ I am using JQuery.each(array|object, function() ) ] and a fairly inefficient pattern for determining intersection ( leveraging CPU with little or no caching ) but was mostly happy with the results when using Google Chrome on Ubuntu 9.10 and utterly surprised with Firefox 3.5 &amp; 3.6 on the same system.  It was literally a night and day difference with Chrome purring along and Firefox struggling to keep up.</p>
<p><strong>JS Objects</strong></p>
<p>Besides the canvas tag related stuff, I was experimenting with another approach to class construction that for the moment seems to goofy to be viable.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">appLib.<span style="color: #660066;">Point</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span> <span style="color: #339933;">=</span> x<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span> <span style="color: #339933;">=</span> y<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
app.<span style="color: #660066;">w</span><span style="color: #009900;">&#40;</span>appLib.<span style="color: #660066;">Point</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">dist</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> tX <span style="color: #339933;">=</span> Math.<span style="color: #660066;">pow</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span> <span style="color: #339933;">-</span> o.<span style="color: #660066;">x</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> tY <span style="color: #339933;">=</span> Math.<span style="color: #660066;">pow</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span> <span style="color: #339933;">-</span> o.<span style="color: #660066;">y</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">return</span> Math.<span style="color: #660066;">sqrt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>tX<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>tY<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">/**
     *Bad design choice
     *@deprecated */</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">slope</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span> <span style="color: #339933;">-</span> o.<span style="color: #660066;">y</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span> <span style="color: #339933;">-</span> o.<span style="color: #660066;">x</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>app.w( scope, anonymous) basically makes this in context of the anonymous function == scope.prototype.  Therefore making it easier to add prototypical methods to the final product.  My thought was to avoid closure based creation and rely on Function.prototype.method = function to make the objects leaner/faster.  I figured that Javascript engines have already been optimized to a degree to build an object from it&#8217;s prototype.   From my perspective, there didn&#8217;t seem to be a noticeable difference.</p>
<p><strong>Final thoughts</strong><br />
Ping functions as expected on Chrome but otherwise if not for my quad-core environment, I imagine it would be a rather abysmal user experience.  According to top and Chrome&#8217;s built in task manager, its devouring near 100% cpu time and has a semi-stable memory leak ( drifting up and down around 1,500 KB ever 30 seconds ) when in a resting state.</p>
]]></content:encoded>
			<wfw:commentRss>http://ominian.com/2010/03/02/canvas-tag-collision-detection-pixel-decay/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Playing with canvas tag</title>
		<link>http://ominian.com/2010/02/22/playing-with-canvas-tag/</link>
		<comments>http://ominian.com/2010/02/22/playing-with-canvas-tag/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 08:05:49 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://ominian.com/?p=12</guid>
		<description><![CDATA[   I am taking a break from the server code to give me sometime to think about how I want to resolve some of the issues that Rob N. @ Bivio software pointed out to me.  In the interim, I&#8217;ve moved back to the making games theme.

LunarLander &#8211; Rough draft Project page
 [...]]]></description>
			<content:encoded><![CDATA[<p>   I am taking a break from the server code to give me sometime to think about how I want to resolve some of the issues that Rob N. @ Bivio software pointed out to me.  In the interim, I&#8217;ve moved back to the making games theme.<br />
<span id="more-12"></span><br />
LunarLander &#8211; Rough draft <a href="http://code.google.com/p/devdave/wiki/LunarLander">Project page</a></p>
<p>    This will be the third time I&#8217;ve implemented a Lunar lander simulation game; the first was in C++ using inline ASM and mode 13H as my graphics interface.  Fun stuff.  The second was in Java in the late 90&#8217;s and not so fun ( My last line of Java was 2000 for a reason).   Now comes the third iteration, implemeneted in Javascript using the Canvas tag.  Overall the experience wasn&#8217;t so bad, I was initially <del datetime="2010-02-22T05:06:22+00:00">frustrated</del> annoyed at the lack of a simple putPixel like mechanism, but canvasContext2d.arc or rect with a size/width of 1 pixel is a relatively good substitute.</p>
<p>    I decided to go with a run loop pattern instead of a tickless/event driven mechanism.  Sure, a tickless system is more efficient ( avoiding unecessary redraws ) but it&#8217;s also a tad more complicated and prone to error.  Also, I am relying HEAVILY on JIT javascript interpreters to make the MainLoop class efficient.  Normally you want to minimize as much as possible unnecessary function calls but MainLoop&#8217;s logic handler has a stack and list mechanism that it iterates over, every tick.<br />
    The list is a constant actions function, every tick the logic handler calls each element which is an anonymous function.  In Lunar lander I used this to split off the status board in two,  key state&#8217;s being handled by an anonymous function, while the other stats are handled by the Game logic class itself.<br />
    The stack on the other hand will be used for staggered events, one anonymous function being popped off and executed per tick.  Some in-efficient idea&#8217;s for using it would be for animation effects.  Push 10 actions onto the stack, each action drawing say an explosion image frame in progressing fashion.</p>
<p>    LunarLander&#8217;s logic add&#8217;s a hook onto MainLoop&#8217;s constant action list and from there its pretty straight forward.  Every tick, add a gravity value amount to the Y delta velocity, then add this to the current Y position.  If Y is > then the height of the screen, then the lander has crashed/landed.</p>
]]></content:encoded>
			<wfw:commentRss>http://ominian.com/2010/02/22/playing-with-canvas-tag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thoughts on my corner of the Web industry</title>
		<link>http://ominian.com/2010/02/03/thoughts-on-my-corner-of-the-web-industry/</link>
		<comments>http://ominian.com/2010/02/03/thoughts-on-my-corner-of-the-web-industry/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 22:55:58 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://ominian.com/?p=9</guid>
		<description><![CDATA[    I&#8217;ve been busy with professional contractination work, which is a word I just made up to describe the chaos that goes on while being vetted for a new client.  &#8220;Do you know PHP5?&#8221;, &#8220;What is class inheritence?&#8221;, &#8220;What&#8217;s the difference between include and require?&#8221;, etc.  I wish I could [...]]]></description>
			<content:encoded><![CDATA[<p>    I&#8217;ve been busy with professional contractination work, which is a word I just made up to describe the chaos that goes on while being vetted for a new client.  &#8220;Do you know PHP5?&#8221;, &#8220;What is class inheritence?&#8221;, &#8220;What&#8217;s the difference between include and require?&#8221;, etc.  I wish I could make a indexed video of me answering these questions but I don&#8217;t think that would work for some reason.  Still its just par for the course and I really don&#8217;t blame the client or the client&#8217;s gatekeeper asking because I&#8217;ve been on the other side of the fence, vetting out people and its a miserable task.</p>
<p>    My resume shows 5 years of contract work and I&#8217;ve got half a dozen references ranging from developer peer&#8217;s to team managers and c-letter people&#8230;but from what I&#8217;ve seen none of that matters.   Out of respect for all involved, I won&#8217;t be mentioning names, employer, or anything specific.  Last thing I want is to kill someone&#8217;s career or tarnish a client&#8217;s reputation.  That said,  I&#8217;ve seen some pretty terrible &#8220;Senior&#8221; developers.  What I mean by terrible has little to do with how they solve problems, but the fact that they don&#8217;t solve problems.  </p>
<p>     One recent case, I worked with a &#8220;Sr.&#8221; developer that proclaimed themselves &#8220;Team lead&#8221;, &#8220;Chief Architect&#8221;, and &#8220;Dev. manager&#8221; which was surprising because I finished three different projects on time and tested for production use in the time that this individual struggled with one project.   Speaking to the CTO of the company I got to look at the person&#8217;s resume and it all made sense.  They had been in the industry for 4-5 years as well, but 3 and a half of those years was as a &#8220;junior&#8221; developer in a fairly large team.  Then they jumped or got booted and fell into my client&#8217;s company and became the defacto &#8220;Senior&#8221; developer because there was no one else.   I think two things fed this person&#8217;s loose grip on their reality.  In very large company&#8217;s, I&#8217;ve noticed that junior developers are not to be seen or heard and instead are programmers.  They aren&#8217;t given opportunities to grow through mistakes and failures because that&#8217;s not what they are there for.  Then the other side is that without peer review from competent peers&#8230; its easy to imagine your poop smells like roses.</p>
<p>    Another case was a peer that got signed to the same company as me, both as contract to hire.  One unique thing about this situation was that I knew NOTHING about the language or technology being used.  The only saving grace is that the team leads had re-implemented a better/saner version of a framework pattern I had designed a few years ago.   So of course I struggled in the first week and somewhat into the second week, but fortunately the language in use was imperative object oriented so everything eventually clicked for me.   I won&#8217;t lie and say I was a super star, but I did my best to pull the line and help the team meet its goals.  Meanwhile the other contract made a lot of mistakes:  it&#8217;s generally a bad thing to hit on the female staff at work,  if the product lead takes the time out to give you advice&#8230; its probably cause your fucking up, and lastly do not alienate your peers.  Healthy dev. teams are like Survivor&#8230; if you become the weakest link and cause others to work harder to cover your ass, you will find yourself out of a job.</p>
<p>    What I am getting at is that, in both cases it would be tough to figure out if someone can actually do the work needed for an employer.  Their resume might look amazing or their credentials impeccable, but neither really mean much.   The subject of vetting out good candidates has been covered over and over across the web and print&#8230;so I will keep my advice simple.  If you have a small team or no team, go with established recruiting firms that will incur penalties to themselves if they recommend a dud ( generally 5-10 business days covered ) or if you do have a team, get them involved in the last stage interviews and see if this person fits in.   I am sorry, I know this would seem to eliminate anyone who has text anxiety or social disorders&#8230; but time after time Geeks &#038; Nerds recognize their own.</p>
]]></content:encoded>
			<wfw:commentRss>http://ominian.com/2010/02/03/thoughts-on-my-corner-of-the-web-industry/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slightly stuck</title>
		<link>http://ominian.com/2010/02/01/slightly-stuck/</link>
		<comments>http://ominian.com/2010/02/01/slightly-stuck/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 17:30:38 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://ominian.com/?p=8</guid>
		<description><![CDATA[    I freely admit I am probably over thinking the problem for the moment, but there is some doubts that maybe I am not.  The problem is my concern of overloading Pymetheus with non-command &#038; control messages, specifically low priority stuff like a chat scenario between user A &#038; B.  [...]]]></description>
			<content:encoded><![CDATA[<p>    I freely admit I am probably over thinking the problem for the moment, but there is some doubts that maybe I am not.  The problem is my concern of overloading Pymetheus with non-command &#038; control messages, specifically low priority stuff like a chat scenario between user A &#038; B.   A types &#8220;Hey B, how&#8217;s it going?&#8221; which currently would need to descend down to a chat handler, run through some sort of sanitizer, then interface to auth.realm.UserRegistry to find the specific user, and then push a message to this person.</p>
<p>   Its not really so bad to do this and in a lot of ways, it makes sense.  All the information and constructs to accomplish the task is there, but it would need to be immediately refactor&#8217;d out at the first opportunity for one single reason: scalability.   If Pymetheus suddenly starts taking on more and more trivial tasks, one day I am going to wake up and have this monolithic super process that does everything and has a memory profile similar to a swamp.</p>
<p>The ideal solution in my mind is:<br />
   User A &#038; B connects and should be granted Chat privileges, accounts are created or activated on a xmmp server alongside pymetheus which returns connection credentials to Pymetheus which passes this back to each User.   A &#038; B now connect to the xmpp server and can chat away to their hearts content.    Alongside some of the weirder xmmp sub-protocols this solves a whole slew of things that must be implemented ( presence, offline messaging, event notification, etc ).</p>
]]></content:encoded>
			<wfw:commentRss>http://ominian.com/2010/02/01/slightly-stuck/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A DRY abomination</title>
		<link>http://ominian.com/2010/01/30/a-dry-abomination/</link>
		<comments>http://ominian.com/2010/01/30/a-dry-abomination/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 06:48:36 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[hacks]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://ominian.com/?p=6</guid>
		<description><![CDATA[   One of my habits when presented with a new framework/platform is to implement a problem I know like the back of my hand.   Usually the user interface isn&#8217;t of concern so I haven&#8217;t done much to improve on the logic there.   I decided to try something different with [...]]]></description>
			<content:encoded><![CDATA[<p>   One of my habits when presented with a new framework/platform is to implement a problem I know like the back of my hand.   Usually the user interface isn&#8217;t of concern so I haven&#8217;t done much to improve on the logic there.   I decided to try something different with this implementation of Tic-Tac-Toe:</p>
<p>Given the following</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">table</span> <span style="color: #000066;">border</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;height:100%; width:100%&quot;</span> &gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">tr</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;x0&quot;</span>&gt;</span>
                <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y0&quot;</span>&gt;</span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
                <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y1&quot;</span>&gt;</span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
                <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y2&quot;</span>&gt;</span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">tr</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;x1&quot;</span>&gt;</span>
                <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y0&quot;</span>&gt;</span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
                <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y1&quot;</span>&gt;</span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
                <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y2&quot;</span>&gt;</span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">tr</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;x2&quot;</span>&gt;</span>
                <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y0&quot;</span>&gt;</span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
                <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y1&quot;</span>&gt;</span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
                <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y2&quot;</span>&gt;</span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">table</span>&gt;</span></pre></div></div>

<p>I used the following logic to determine the coordinates from a user click</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> clickHandler <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #006600; font-style: italic;">//Recieves a plan/jQuery managed event object                    </span>
       <span style="color: #003366; font-weight: bold;">var</span> element <span style="color: #339933;">=</span> e.<span style="color: #660066;">target</span><span style="color: #339933;">;</span>
       <span style="color: #003366; font-weight: bold;">var</span> parent  <span style="color: #339933;">=</span> element.<span style="color: #660066;">parentNode</span><span style="color: #339933;">;</span>                    
       <span style="color: #003366; font-weight: bold;">var</span> x<span style="color: #339933;">,</span>y<span style="color: #339933;">;</span>
       <span style="color: #006600; font-style: italic;">//Below is fine for 0-9 scenario's but will need to be refactored for more</span>
       <span style="color: #006600; font-style: italic;">//advanced/larger grids.</span>
       <span style="color: #000066; font-weight: bold;">try</span><span style="color: #009900;">&#123;</span>
            y <span style="color: #339933;">=</span> element.<span style="color: #660066;">classNames</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">detect</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>cls<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #009966; font-style: italic;">/y\d/</span>.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span>cls<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            x <span style="color: #339933;">=</span> parent.<span style="color: #660066;">classNames</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">detect</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>cls<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #009966; font-style: italic;">/x\d/</span>.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span>cls<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            console.<span style="color: #660066;">debug</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
         console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Coordinate &quot;</span> <span style="color: #339933;">+</span> x <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;,&quot;</span> <span style="color: #339933;">+</span> y<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>    The cool thing about this, is that with jQuery I can do jQuery(&#8220;#myTable tr.x2 td.y0&#8243;) and get the exact cell I am looking for&#8230; or even crazier stuff like:<br />
&#8220;#myTable td.y0&#8243; to select vertically down a row<br />
OR<br />
&#8220;#myTable tr.x0&#8243; to select horizontally.</p>
]]></content:encoded>
			<wfw:commentRss>http://ominian.com/2010/01/30/a-dry-abomination/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adventures in Javascript dependancy loading</title>
		<link>http://ominian.com/2010/01/29/adventures-in-javascript-dependancy-loading/</link>
		<comments>http://ominian.com/2010/01/29/adventures-in-javascript-dependancy-loading/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 20:35:39 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[browser maddness]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[javascript dependancies]]></category>

		<guid isPermaLink="false">http://ominian.com/?p=5</guid>
		<description><![CDATA[One of my most personally successful philosophy&#8217;s in dealing with Web browsers is never blindly trust them.
My initial solution to loading in dependencies depended on a switchboard style approach, if browser support onready or similar events then bind an anonymous function to make the appropriate notice.  Else spin up a interval based checker anonymous function [...]]]></description>
			<content:encoded><![CDATA[<p>One of my most personally successful philosophy&#8217;s in dealing with Web browsers is never blindly trust them.</p>
<p>My initial solution to loading in dependencies depended on a switchboard style approach, if browser support onready or similar events then bind an anonymous function to make the appropriate notice.  Else spin up a interval based checker anonymous function that looked every few seconds for the script for about a minute.    This solution kind of worked, but not reliably because it depended on browser detection vs. capabilities detection.</p>
<p>Instead of reworking things to attempt to ferret out what capabilities a foreign browser supports, I went with a brute force approach that will eventually be a foundation for a much more advanced system.</p>
<p>So the prototype works like such.</p>
<p>wm.loader.load(&#8220;someModule&#8221;) which becomes the path  &#8220;/mods/someModule.js&#8221; and that is applied to a new script tag as it&#8217;s src attribute.  This is then appended to the head tag.  All pretty standard stuff actually.  What&#8217;s different is the notification process.</p>
<p>someModule.js contains a simple line &#8220;wm.loader.notify(&#8220;someModule&#8221;) &#8221; which hits an internal dictionary and if this is the first notification, fire&#8217;s of a notice to the server.</p>
<p>Simple and guaranteed to work reliably.   Plus it gives me room to grow for later.</p>
<p>Like adding a call like &#8220;wm.loader.multi(&#8220;lib1&#8243;,&#8221;lib2&#8243;,&#8221;lib3&#8243;, 10,  function(){   doSomethingWhen Dependancies met });</p>
<p>arguments[0-2] can be detected and pushed to a callstack array, any integer can be assumed to be a time out period, and the last argument as an anonymous function can be assumed to be a onSuccess callback.   A dependency failure mechanism could be incorporated into the actual loader lib as either an observable emitter or just a cry for help back to the service.</p>
<p>More involved:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">wm.<span style="color: #660066;">loader</span>.<span style="color: #660066;">multi</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
          <span style="color: #003366; font-weight: bold;">var</span> dependancies <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>  timeOut <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span>  callBack <span style="color: #339933;">=</span> None<span style="color: #339933;">;</span>
&nbsp;
          loop through arguments<span style="color: #339933;">:</span>
                    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> current <span style="color: #000066; font-weight: bold;">instanceof</span> string <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                           append to dependancies
                    <span style="color: #009900;">&#125;</span> 
                    <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> current <span style="color: #000066; font-weight: bold;">instanceof</span> integer<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                             append to timeOut
                    <span style="color: #009900;">&#125;</span> 
                    <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> current <span style="color: #000066; font-weight: bold;">instanceof</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                                assign to callBack
                     <span style="color: #009900;">&#125;</span>
&nbsp;
              <span style="color: #003366; font-weight: bold;">var</span> dependancyCheck <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>loadedLib<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                                          pop loadLib from dependancies<span style="color: #339933;">;</span>
                                         <span style="color: #000066; font-weight: bold;">if</span> dependancies.<span style="color: #660066;">length</span> <span style="color: #339933;">&lt;=</span> <span style="color: #CC0000;">0</span> then
                                                     cancel timeOut 
                                                     call  callback<span style="color: #339933;">;</span>
                                 <span style="color: #009900;">&#125;</span>
             dependancies.<span style="color: #660066;">map</span><span style="color: #009900;">&#40;</span> wm.<span style="color: #660066;">loader</span>.<span style="color: #660066;">load</span><span style="color: #339933;">,</span> dependancyCheck <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>I would be lying if I said I knew this construct would work perfectly once I implement it, but I think the general idea is something to work with.</p>
]]></content:encoded>
			<wfw:commentRss>http://ominian.com/2010/01/29/adventures-in-javascript-dependancy-loading/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pymetheus</title>
		<link>http://ominian.com/2010/01/29/pymetheus/</link>
		<comments>http://ominian.com/2010/01/29/pymetheus/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 19:53:50 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://ominian.com/?p=4</guid>
		<description><![CDATA[So I am not much for talk right now so straight to the points:
Origins:
I started Pymetheus originally to create a platform for a near real time web based multi-user dungeon&#8230; but I wasn&#8217;t satisfied with what was available as far as feature complete frameworks and toolsets.  I wanted to create a VERY rich web application that used [...]]]></description>
			<content:encoded><![CDATA[<p>So I am not much for talk right now so straight to the points:</p>
<p>Origins:</p>
<p>I started Pymetheus originally to create a platform for a near real time web based multi-user dungeon&#8230; but I wasn&#8217;t satisfied with what was available as far as feature complete frameworks and toolsets.  I wanted to create a VERY rich web application that used as much of the newer possibilities being rolled out by HTML 5.  Specifically web sockets, local &amp; session storage, and then branch out to using the Canvas tag and whatever else I could pull off.  So a normal bread &amp; butter html</p>
<p>Change of plans:</p>
<p>I&#8217;ve had more rewarding of an experience making the platform then I have making the game.  Of course I can&#8217;t make the game until the platform is stable, but with few exceptions, when is a platform ever completely stable when it involves the internet?</p>
<p>Brief outline:</p>
<p>Client side is a rich web application that relies completely on dynamically injected/loaded content and logic to function.   On the initial load, there is nothing but a blank blue page and about half a dozen scripts src&#8217;d in.</p>
<p>From authentication, modules,  mini-app like bundles, are bootstrapped into the client by means of dynamically injecting new script tag&#8217;s with src links to corresponding logic.  If any of the modules depends on external content like images or extensive HTML markup, that logic is dynamically loaded in as well.</p>
<p>While all of this is happening, the service side is merely instantiating classes called handlers to provide the business logic and hold some of the more important parts of the module&#8217;s state.   One trick about these handlers is that they don&#8217;t have to belong to the platform but instead can come from any package available on the Python import path.    The closest comparable design to this would be a WSGI based application, where a WSGI app can include other WSGI apps according to the URL path.</p>
<p>Anyway, I have the platform up and running and the three parts I feel need to be hammered out some more are</p>
<ol>
<li>Working example of a Model system</li>
<li>Cleanup the user management system, it&#8217;s functional but has some weak points in it&#8217;s design</li>
<li>Implement a multiplexing message system that won&#8217;t encumber the platform, specifically for passing non-control messages between users.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://ominian.com/2010/01/29/pymetheus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mission statement and introductions</title>
		<link>http://ominian.com/2010/01/29/mission-statement-and-introductions/</link>
		<comments>http://ominian.com/2010/01/29/mission-statement-and-introductions/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 16:46:23 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[intro]]></category>

		<guid isPermaLink="false">http://ominian.com/?p=3</guid>
		<description><![CDATA[This blog is dedicated specifically to the trials and tribulations of Pymetheus and what I learned/accomplished the along the way to it&#8217;s creation.  I won&#8217;t be going into much depth about the project with this post.
Otherwise, about me.  I began my trials with computers somewhere around the late 80&#8217;s with a Apple &#124;&#124;e personnel computer. [...]]]></description>
			<content:encoded><![CDATA[<p>This blog is dedicated specifically to the trials and tribulations of Pymetheus and what I learned/accomplished the along the way to it&#8217;s creation.  I won&#8217;t be going into much depth about the project with this post.</p>
<p>Otherwise, about me.  I began my trials with computers somewhere around the late 80&#8217;s with a Apple ||e personnel computer.  I wish I still had a copy of the first few scripts I wrote, but the more advanced of them was a simple alternating game loop structure.  In the initial state, the computer would randomly pick a number from 1-10 and the user had to guess it.  After 3 tries, the person would then pick a number in their head and the computer would pick 3 random numbers.   So input could be summarized in a regex like ( [0-9]{1}| [YyNn]{1}) and the whole deal was something I could do in a minute.  It&#8217;s kind of funny to think about because It took me a few days to get that working right.</p>
<p>After that, I didn&#8217;t do much programming but I did spend a considerable amount of time of trial and error time with computers, at one time landing myself a part time job at age 14-15 doing computer repair &amp; support.   What got me back into the programming game was when i first played Quake&#8217;s demo and then later learned that you could modify the game logic api for free&#8230; you just had to learn c/c++.    So began a lovely adventure into the world of compiled strictly typed langues and pointers.   I actually miss that environment but its pretty rare for me to fire up gcc and build up binary exectuables</p>
<p>After that the rest of my life got kind of weird, i knew i wanted to be a professional programmer but a lot of things got in the way, the biggest one being the economy and the death of the web for a time.</p>
]]></content:encoded>
			<wfw:commentRss>http://ominian.com/2010/01/29/mission-statement-and-introductions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->