<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>http://tristandunn.com/</id>
  <title>Tristan Dunn</title>
  <link href="http://tristandunn.com/atom.xml" rel="self"/>
  <link href="http://tristandunn.com/"/>
  <author>
    <name>Tristan Dunn</name>
    <email>hello@tristandunn.com</email>
  </author>
  <updated>2010-10-21T19:33:13-04:00</updated>

  <entry>
    <title>Multiple Sessions in Cucumber &#38; Selenium</title>
    <link href="http://tristandunn.com/2010/10/21/multiple-sessions-cucumber-selenium.html"/>
    <updated>2010-10-21T00:00:00-04:00</updated>
    <id>http://tristandunn.com/2010/10/21/multiple-sessions-cucumber-selenium</id>
    <content type="html">&lt;h2 id=&quot;the_problem&quot;&gt;The Problem&lt;/h2&gt;

&lt;p&gt;Multiple sessions are not often needed when writing Cucumber scenarios. Normally to validate that a user can or can not see what another user created you would simply sign in as another user. However, this is not the case when you use WebSockets to deliver information in real-time. If you were to sign in as another user there would be no record of the previous events.&lt;/p&gt;

&lt;h2 id=&quot;the_solution&quot;&gt;The Solution&lt;/h2&gt;

&lt;p&gt;While searching for a solution I found &lt;a href=&quot;http://imanel.org/2010/03/cucumber-testing-for-multiple-users-continuation/&quot;&gt;Cucumber Testing for Multiple Users&lt;/a&gt; by Bernard Potocki. He shows how to achieve multiple sessions with Cucumber and Selenium, but I wanted to make it easier.&lt;/p&gt;

&lt;p&gt;Drop the following into &lt;code&gt;cucumber/support/sessions.rb&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;k&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Capybara&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Driver&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Sessions&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;set_session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;no&quot;&gt;Capybara&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;instance_variable_set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;@session_pool&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
         &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Capybara&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;current_driver&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Capybara&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;object_id&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;vg&quot;&gt;$sessions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

      &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;in_session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;vg&quot;&gt;$sessions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
        &lt;span class=&quot;vg&quot;&gt;$sessions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Capybara&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;current_session&lt;/span&gt;
        &lt;span class=&quot;vg&quot;&gt;$sessions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;       &lt;span class=&quot;o&quot;&gt;||=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Capybara&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Session&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Capybara&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;current_driver&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Capybara&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;set_session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;set_session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;no&quot;&gt;World&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Capybara&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Sessions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now you can write step definitions such as:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Given&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt; /^a user named &amp;quot;([^&amp;quot;]*)&amp;quot; is online$/&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;in_session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;no&quot;&gt;Given&lt;/span&gt; &lt;span class=&quot;sx&quot;&gt;%{I am on the homepage}&lt;/span&gt;
    &lt;span class=&quot;no&quot;&gt;When&lt;/span&gt;  &lt;span class=&quot;sx&quot;&gt;%{I fill in &amp;quot;Name&amp;quot; with &amp;quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sx&quot;&gt;&amp;quot;}&lt;/span&gt;
    &lt;span class=&quot;no&quot;&gt;And&lt;/span&gt;   &lt;span class=&quot;sx&quot;&gt;%{I submit the new user form}&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Which allows for scenarios to deal with multiple sessions.&lt;/p&gt;

&lt;p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;cucumber&quot;&gt;&lt;span class=&quot;nt&quot;&gt;@javascript&lt;/span&gt;&lt;span class=&quot;nf&quot; /&gt;
&lt;span class=&quot;k&quot;&gt;Scenario:&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt; Visitor creates a user successfully with another user is online&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;  Given &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;a user named &amp;quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Sue&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;&amp;quot; is online             &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Create a new session and user.&lt;/span&gt;&lt;span class=&quot;nf&quot; /&gt;
&lt;span class=&quot;nf&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;And &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;I go to the homepage                       &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Back in the original session.&lt;/span&gt;&lt;span class=&quot;nf&quot; /&gt;
&lt;span class=&quot;nf&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;When &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;I fill in &amp;quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;&amp;quot; with &amp;quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Bob&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;And &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;I submit the new user form&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Then &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;I should be on the users page&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;And &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Sue should see &amp;quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Bob has entered the room.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;&amp;quot; &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Switches to the &amp;quot;Sue&amp;quot; session.&lt;/span&gt;&lt;span class=&quot;nf&quot; /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;h2 id=&quot;conclusion__example&quot;&gt;Conclusion &amp;#38; Example&lt;/h2&gt;

&lt;p&gt;It&amp;#8217;s very comforting knowing that I can test interactions between two users now. And while I have not tried it yet, you can potentially test interactions between a group of users.&lt;/p&gt;

&lt;p&gt;I have created a basic example, &lt;a href=&quot;http://github.com/tristandunn/cucumber-websocket-example/&quot;&gt;cucumber-websocket-example&lt;/a&gt;, which demonstrates the above code.&lt;/p&gt;</content>
  </entry>

  <entry>
    <title>Tips for a Successful Rails Rumble Project</title>
    <link href="http://tristandunn.com/2010/09/20/rails-rumble-2010.html"/>
    <updated>2010-09-20T00:00:00-04:00</updated>
    <id>http://tristandunn.com/2010/09/20/rails-rumble-2010</id>
    <content type="html">&lt;p&gt;With this being my fourth year participating in the &lt;a href=&quot;http://railsrumble.com&quot;&gt;Rails Rumble&lt;/a&gt; I&amp;#8217;d like to share tips for successfully completing a Rails Rumble project.&lt;/p&gt;

&lt;h2 id=&quot;the_idea&quot;&gt;The Idea&lt;/h2&gt;

&lt;p&gt;While the most obvious item to not skimp on, the idea can often be overlooked. In 2009 my teammate and I neglected to settle on an idea until the first hour of the competition. While fun, the entry was hands down the worst we made in the three years of competing together.&lt;/p&gt;

&lt;p&gt;Thinking of an interesting or original idea is undoubtedly the hardest part of the competition, but make sure it is a site &lt;strong&gt;you&lt;/strong&gt; would actually use. &lt;a href=&quot;http://gettingreal.37signals.com/ch02_Whats_Your_Problem.php&quot;&gt;Building for yourself&lt;/a&gt; is nothing new, but can really help your execution.&lt;/p&gt;

&lt;h2 id=&quot;preparation&quot;&gt;Preparation&lt;/h2&gt;

&lt;p&gt;Once you have an idea (hopefully a week or two before the competition) you should immediately start sketching, with your team if you have one. This helps with design, but is also great for deciding the priority of must-have features and what the nice-to-have features&amp;#160;are.&lt;/p&gt;

&lt;p&gt;Seriously, plan the order of features and tasks. It makes the weekend easier to manage, especially the last six hours.&lt;/p&gt;

&lt;h2 id=&quot;the_first_hour&quot;&gt;The First Hour&lt;/h2&gt;

&lt;p&gt;The first year I participated in the Rumble we had no idea on how to setup our Linode VPS. It ended up costing us close to eight hours, which is a lot of lost development time.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re serious about it, you could buy a Linode VPS and practice. Fortunately I realized, while a great part of the competition, it&amp;#8217;s really not worth spending more than an hour on. The result is &lt;a href=&quot;http://github.com/tristandunn/sprinkle-linode&quot;&gt;sprinkle-linode&lt;/a&gt;, a collection of &lt;a href=&quot;http://github.com/crafterm/sprinkle&quot;&gt;Sprinkle&lt;/a&gt; scripts for setting up a Debian 5.0 server for Rails development on Linode. It provides a base to get up and running quickly.&lt;/p&gt;

&lt;p&gt;Teammates? While one of you are setting up the server the others should start setting up the repository and getting to work.&lt;/p&gt;

&lt;p&gt;Additionally you should deploy as soon as you have the server setup and an application generated. You don&amp;#8217;t want to be down to the wire and trying to get your application deployed.&lt;/p&gt;

&lt;h2 id=&quot;the_first_eight_hours_or_the_sleep_schedule&quot;&gt;The First Eight Hours, or The Sleep Schedule&lt;/h2&gt;

&lt;p&gt;Living in the US means the competition usually starts in the evening. It&amp;#8217;s tempting to work through the night, but I have to recommend against it. You probably just worked a full week at your day job and can end up burnt out early on.&lt;/p&gt;

&lt;p&gt;The first year we thought it would be a good idea to alternate taking one to two hour naps. This resulted in lots of caffeine and near exhaustion by the end, which did not help our speed or code quality.&lt;/p&gt;

&lt;p&gt;The second year I believe we executed the perfect schedule, resulting in winning the most complete category. The first night go to sleep around the normal time you would on a Friday night and wake up the next day at a reasonable time. By that night you will have close to 3 business days of progress done. Now here&amp;#8217;s the secret: Start showing it to people! If your idea is semi-interesting people will start complementing you and it boosts your confidence a ton. It boosted ours so much that we worked through the night to the end of the competition, thanks to our prior full night of sleep.&lt;/p&gt;

&lt;h2 id=&quot;the_final_countdown&quot;&gt;The Final Countdown&lt;/h2&gt;

&lt;p&gt;Once you have the majority of must-have features implemented you can move on to the fun items. This is where having development planned out ahead of time helps even more. Put all the remaining and nice-to-have items on a whiteboard, or on sticky notes. Each teammate takes one, works on it, erases it, and repeats. It&amp;#8217;s amazing how fast you can tear through these and seeing the progress gives you the boost of energy you need to power through the last few hours.&lt;/p&gt;

&lt;p&gt;Finally, be sure to reserve two to four hours at the end for testing and cleanup. The last thing you want is a stray &lt;code&gt;console.log&lt;/code&gt;, invalid link path, or weird CSS issue in a certain browser to cost you votes. And it happens more often than you would imagine.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Like all software development, good planning, a sustainable pace, prioritization, testing, and just staying focused can really help the final product. And don&amp;#8217;t forget to have fun!&lt;/p&gt;</content>
  </entry>

  <entry>
    <title>Using Hoptoad with node.js</title>
    <link href="http://tristandunn.com/2010/06/13/node-hoptoad-notifier.html"/>
    <updated>2010-06-13T00:00:00-04:00</updated>
    <id>http://tristandunn.com/2010/06/13/node-hoptoad-notifier</id>
    <content type="html">&lt;p&gt;With a &lt;a href=&quot;http://dailyjs.com/2010/03/15/hosting-nodejs-apps/&quot;&gt;couple&lt;/a&gt; &lt;a href=&quot;http://howtonode.org/deploying-node-upstart-monit&quot;&gt;of&lt;/a&gt; &lt;a href=&quot;http://remysharp.com/2010/02/14/slicehost-nodejs-websockets/&quot;&gt;guides&lt;/a&gt; explaining how to setup and host a node.js application and the recent &lt;a href=&quot;http://blog.heroku.com/archives/2010/4/28/node_js_support_experimental/&quot;&gt;addition of experimental support&lt;/a&gt; to Heroku, it seems node.js will be a server-side contender. As any server-side application grows it can be harder and harder to track down and manage errors.&lt;/p&gt;

&lt;h2 id=&quot;the_solution&quot;&gt;The Solution&lt;/h2&gt;

&lt;p&gt;The Ruby community, along with many others, have long had a solution: &lt;a href=&quot;http://hoptoadapp.com/&quot;&gt;Hoptoad&lt;/a&gt;. For some reason, I spent a bit of time at RailsConf this past week creating &lt;a href=&quot;https://github.com/tristandunn/node-hoptoad-notifier&quot;&gt;node-hoptoad-notifier&lt;/a&gt;. With it you can easily capture and send exceptions to Hoptoad, either with an &lt;a href=&quot;http://nodejs.org/api.html#event-uncaughtexception-52&quot;&gt;&lt;code&gt;uncaughtException&lt;/code&gt;&lt;/a&gt; listener, &lt;code&gt;try&lt;/code&gt;/&lt;code&gt;catch&lt;/code&gt; block, or manually.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s ready for Heroku with support for setting the API key and environment with configuration variables. Unfortunately, Heroku does not appear to currently support the &lt;code&gt;uncaughtException&lt;/code&gt; listener.&lt;/p&gt;

&lt;h2 id=&quot;the_future&quot;&gt;The Future&lt;/h2&gt;

&lt;p&gt;I&amp;#8217;m excited to see the node.js community growing and evolving so rapidly. I hope to release more libraries and experiments with it over time. And maybe I&amp;#8217;ll even pick a side in the emerging package wars soon.&lt;/p&gt;</content>
  </entry>

  <entry>
    <title>Web Standards &#38; Gaming</title>
    <link href="http://tristandunn.com/2010/04/04/fun-with-canvas-and-websocket.html"/>
    <updated>2010-04-04T00:00:00-04:00</updated>
    <id>http://tristandunn.com/2010/04/04/fun-with-canvas-and-websocket</id>
    <content type="html">&lt;p class=&quot;image image-right&quot;&gt;
  &lt;img src=&quot;/images/2010-04-04-canvas-weewar.png&quot; /&gt;
  Weewar map &quot;Aruba&quot; rendered with Canvas.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://weewar.com&quot;&gt;Weewar&lt;/a&gt; recently switched from a static to Flash interface, which is sad in my opinion. Web standards are rapidly improving and Flash will soon be left behind, apart from it&amp;#8217;s stranglehold on streaming video. It&amp;#8217;s further saddening to know it can no longer &lt;a href=&quot;http://blog.weewar.com/2007/06/30/others-have-unpacking-videos-we-have-weewar-on-the-iphone/&quot;&gt;run on the iPhone&lt;/a&gt; or the iPad for that matter, which would be a great device to play on.&lt;/p&gt;

&lt;p&gt;I spent a few hours this afternoon creating a &lt;a href=&quot;http://screenr.com/1lM&quot;&gt;very primitive version in Canvas&lt;/a&gt; using &lt;a href=&quot;http://github.com/tristandunn/node-websocket&quot;&gt;node-websocket&lt;/a&gt;. A lot is still missing, most notably combat, but it seems promising.&lt;/p&gt;

&lt;p&gt;There aren&amp;#8217;t many web-based games utilizing the latest technology. I hope to help change that and a few others already are with a great example being &lt;a href=&quot;http://jfd.github.com/wpilot/&quot;&gt;WPilot&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>

</feed>

