<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>A Better Way</title>
 <link href="http://www.thejacklawson.com/atom.xml" rel="self"/>
 <link href="http://www.thejacklawson.com"/>
 <updated>2013-06-14T17:42:59-07:00</updated>
 <id>http://www.thejacklawson.com</id>
 <author>
   <name>Jack Lawson</name>
 </author>

 
 <entry>
   <title>Lua Unit Testing With Busted</title>
   <link href="http://www.thejacklawson.com//2013/06/lua-unit-testing-with-busted/index.html"/>
   <updated>2013-06-14T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2013/06/lua-unit-testing-with-busted/lua-unit-testing-with-busted</id>
   <content type="html">&lt;h3&gt;History of Busted&lt;/h3&gt;

&lt;p&gt;You may have been hearing a lot about Lua; it's used in an awful lot of
&lt;a href=&quot;http://redis.io/commands/eval&quot;&gt;neat&lt;/a&gt;
&lt;a href=&quot;https://blog.wikimedia.org/2013/03/11/lua-templates-faster-more-flexible-pages/&quot;&gt;places&lt;/a&gt;
&lt;a href=&quot;http://leafo.net/lapis/&quot;&gt;nowadays&lt;/a&gt;. Lua's actually been used in lots of neat
places for a while, but it seems that it's gotten a bit of spotlight recently,
with things like Redis integration, Wikipedia templates, mobile development,
and gaming of all sorts.&lt;/p&gt;

&lt;p&gt;Lua's &lt;em&gt;really&lt;/em&gt; fast, especially with Luajit (it's been removed from the
&lt;a href=&quot;http://benchmarksgame.alioth.debian.org/&quot;&gt;benchmarks game&lt;/a&gt;, but you can look
at the Lua benchmarks and extrapolate data from the official
&lt;a href=&quot;http://luajit.org/performance_x86.html&quot;&gt;Luajit benchmarks&lt;/a&gt;). It's also fairly
widely used in the gaming world, and it's a fun and easy language to use.
So, for some fun projects,
&lt;a href=&quot;https://www.github.com/Olivine-Labs&quot;&gt;my friends and I&lt;/a&gt; are building
games using Lua to run RESTful game servers, with Node.js to build the
web game interfaces.&lt;/p&gt;

&lt;p&gt;The only issue we've had so far with Lua is that we've had to build a few tools
ourselves to get the same environment that we enjoy in other languages, like
Node.js, so we can be just as effective. One of the tools we built is
&lt;a href=&quot;https://olivinelabs.com/busted&quot;&gt;busted&lt;/a&gt;, a testing framework written in Lua
for Lua. It started off as a few assertions, and has grown into a full library
including everything from testing deep-equality of tables (Lua's version of
objects), to spies and mocks, to asynchonous, time-based tests.&lt;/p&gt;

&lt;p&gt;Our first goal was to make it simple and easy to use, taking cues from such
frameworks as Jasmine, Mocha, RSpec, JUnit, and others. We also wanted to have
really nice terminal output and integration with testing frameworks, so you
could run your Lua tests from systems like Travis CI, Jenkins, and anything
else. We integrated i18n support through
&lt;a href=&quot;https://olivinelabs.com/say&quot;&gt;a simple i18n library&lt;/a&gt;, and we're now translated
into 9 different langauges!&lt;/p&gt;

&lt;p&gt;Busted uses our &lt;a href=&quot;https://github.com/Olivine-Labs/luassert&quot;&gt;luassert&lt;/a&gt; library,
which is separated from busted itself so that any testing library can use them.&lt;/p&gt;

&lt;p&gt;Busted also supports &lt;a href=&quot;http://moonscript.org/&quot;&gt;Moonscript&lt;/a&gt;, a Coffeescript
analogue, and &lt;a href=&quot;terralang.org&quot;&gt;Terra&lt;/a&gt;, a low-level counterpart to Lua.&lt;/p&gt;

&lt;p&gt;With that background, let's dig a little into how to use busted for your own
projects.&lt;/p&gt;

&lt;h3&gt;Installation&lt;/h3&gt;

&lt;p&gt;The first thing you'll need to do is install Luarocks. Depending on your
environment, you can &lt;code&gt;apt-get luarocks&lt;/code&gt;, &lt;code&gt;brew install luarocks&lt;/code&gt;, or otherwise
get it from &lt;a href=&quot;http://www.luarocks.org&quot;&gt;luarocks.org&lt;/a&gt;. That done, you can run
&lt;code&gt;luarocks install busted&lt;/code&gt; to install the busted runtime and executable script,
which will run in most variations of Linuxes, OSX, and Windows.&lt;/p&gt;

&lt;h3&gt;Writing Tests&lt;/h3&gt;

&lt;p&gt;The homepage has an example that looks something like:&lt;/p&gt;

&lt;pre&gt;&lt;code data-language=&quot;lua&quot;&gt;describe(&quot;Busted unit testing framework&quot;, function()
  describe(&quot;should be awesome&quot;, function()
    it(&quot;should be easy to use&quot;, function()
      assert.truthy(&quot;Yup.&quot;)
    end)

    it(&quot;should provide some shortcuts to common functions&quot;, function()
      assert.are.unique({
        { thing = 1 },
        { thing = 2 },
        { thing = 3 }
      })
    end)

    it(&quot;should have mocks and spies for functional tests&quot;, function()
      local thing = require(&quot;thing_module&quot;)
      spy.on(thing, &quot;greet&quot;)
      thing.greet(&quot;Hi!&quot;)

      assert.spy(thing.greet).was.called()
      assert.spy(thing.greet).was.called_with(&quot;Hi!&quot;)
    end)
  end)
end)
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;If you save this to a file like &lt;code&gt;spec/busted_spec.lua&lt;/code&gt;, you can run &lt;code&gt;busted&lt;/code&gt;,
which will automatically look for files matching &lt;code&gt;spec/*_spec.lua&lt;/code&gt;,
recursively. You can also use command-line options to change the pattern.&lt;/p&gt;

&lt;p&gt;At the top of the spec file, after doing any &lt;code&gt;require&lt;/code&gt;ing of code or
initialization of globals, you can start writing a &lt;code&gt;describe&lt;/code&gt; block. That block
will take a name and a function. Inside the block, you can write &lt;code&gt;it&lt;/code&gt; blocks,
which are the tests themselves and will contain any &lt;code&gt;assert&lt;/code&gt;s; you can also
write &lt;code&gt;pending&lt;/code&gt; blocks for tests you'll come back to later.&lt;/p&gt;

&lt;p&gt;Busted's super easy to get started with; read up in the docs to find out more
about spies, async tests, assertions, internationalization, and more!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Hubot A Look Inside Our Robot Friend</title>
   <link href="http://www.thejacklawson.com//2013/04/03/hubot-a-look-inside-our-robot-friend.html"/>
   <updated>2013-04-03T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2013/04/03/hubot-a-look-inside-our-robot-friend</id>
   <content type="html">&lt;div class=&quot;media-container&quot;&gt;
  &lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/18126860&quot; width=&quot;427&quot; height=&quot;356&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen webkitallowfullscreen mozallowfullscreen&gt; &lt;/iframe&gt; &lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;http://www.slideshare.net/ajacksified/hubot-a-look-inside-our-robot-friend&quot; title=&quot;Hubot: a look inside our robot friend&quot; target=&quot;_blank&quot;&gt;Hubot: a look inside our robot friend&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/ajacksified&quot; target=&quot;_blank&quot;&gt;ajacksified&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;
&lt;/div&gt;



</content>
 </entry>
 
 <entry>
   <title>Dismantling the Monorail</title>
   <link href="http://www.thejacklawson.com//2012/03/dismantling-the-monorail/index.html"/>
   <updated>2013-03-06T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2012/03/dismantling-the-monorail/dismantling-the-monorail</id>
   <content type="html">&lt;div class=&quot;media-container&quot;&gt;
  &lt;iframe src=&quot;http://player.vimeo.com/video/61043049&quot; width=&quot;400&quot; height=&quot;300&quot; frameborder=&quot;0&quot; webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;
&lt;/div&gt;



</content>
 </entry>
 
 <entry>
   <title>Fixing Bundle '.ccache' Permission Denied Issues on OSX</title>
   <link href="http://www.thejacklawson.com//2012/02/fixing-bundle-ccache-permission-denied-issues-osx/index.html"/>
   <updated>2013-02-20T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2012/02/fixing-bundle-ccache-permission-denied-issues-osx/bundle-ccache-problems-fixed</id>
   <content type="html">&lt;p&gt;I was attempting to install a gem, capybara-webkit, and kept getting errors on
OSX 10.8.2. Viewing the gem output log, it was attempting to create a file at
&lt;code&gt;/Users/jack/.ccache/a/1/&amp;lt;random letters&amp;gt;&lt;/code&gt; and getting a 'permission
denied' issue. You can't &lt;code&gt;sudo&lt;/code&gt; bundler, but &lt;code&gt;sudo gem install capybara-webkit&lt;/code&gt;
executed just fine.&lt;/p&gt;

&lt;p&gt;My solution seemed to fix things:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
sudo chown -R airbnb /Users/jack/.ccache
&lt;/code&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Super Awesome Git Deployment Across Autoscaling Groups with GlusterFS</title>
   <link href="http://www.thejacklawson.com//2012/02/glusterfs-autoscaling-gentoo-ops/index.html"/>
   <updated>2013-02-06T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2012/02/glusterfs-autoscaling-gentoo-ops/glusterfs-autoscaling-gentoo-ops</id>
   <content type="html">&lt;p&gt;The cool thing about having a never-ending side project is that you get to do
all kinds of crazy, fun things that might be outside the normal bounds of your
day-to-day work. In my case, I'm rebuilding a super old text-based RPG, which
leaves a ton of opportunity to learn new things. So recently, tired of FTPing
updates to a handful of micro EC2 instances, and with a new application on the
way, we decided to improve deployment.&lt;/p&gt;

&lt;h2&gt;Background&lt;/h2&gt;

&lt;p&gt;We're working on a browser text-based RPG that we took
over in 2005, originally from late 2001. It's a PHP 3 app with frames, a relic
of the glorious days before Ajax was really a &lt;em&gt;thing&lt;/em&gt;. We deployed either
through FTP or a series of bash-scripted &lt;code&gt;scp&lt;/code&gt;s. We moved our hosting to EC2
a couple years ago, but we were still managing servers-- a couple micro
web servers, plus a larger database instance-- manually. To upgrade packages,
we'd have to look up the DNS, ssh in, and update. There was no autoscaling, so
we'd just run between 3 and 6 instances and scale up or down manually. It
&lt;em&gt;worked&lt;/em&gt;, but it was super annoying to get anything done.&lt;/p&gt;

&lt;p&gt;We're also rebuilding the entire game under a brand-new stack. I'll talk about
that architecture in a later post, but it's all service-based, with super fast
Lua / Nginx servers handling data and exposing an API and some Node servers
serving assets and handling browser web requests. This new stack will require
running a lot of discete services, so time spent in ops has the likelihood of
exponential complexity.&lt;/p&gt;

&lt;h2&gt;Requirements&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Easy deployment. Preferrably, git deployment. We would need both file
transfer and a mechanism for reloading services. Something like Heroku's
deployment.&lt;/li&gt;
&lt;li&gt;Easy authentication, preferrably with ssh keys. LDAP would be cool.&lt;/li&gt;
&lt;li&gt;Easy ops. Move passwords and config into environment variables, and have a
way to update these across all the servers.&lt;/li&gt;
&lt;li&gt;Availability / durability. No single point of failure, and the option for
multi-zone and eventually multi-region scaling.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Server Setup&lt;/h2&gt;

&lt;p&gt;We ended up using Gentoo for our servers, because even if it's a little
&lt;em&gt;weird&lt;/em&gt;, it's &lt;strong&gt;really fast&lt;/strong&gt;. Everything is compiled right for the hardware.
Additionally, to make ops easy, we can build our own portage tree and
update and install our applications through our own package manager. We can
also mask releases (mark some as dangerous) until testing passes, giving the
option to run beta / test / non-passing versions of an application if it's
useful, such as in test images.&lt;/p&gt;

&lt;p&gt;We built base images for test and prod for each application, and &lt;a href=&quot;http://www.cardinalpath.com/autoscaling-your-website-with-amazon-web-services-part-2/&quot;&gt;set up
autoscaling groups&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Deployment and Security&lt;/h2&gt;

&lt;p&gt;Next, we set up LDAP / LPK on a server so that we could quickly SSH into servers.
Gentoo's great about LDAP, so that didn't take terribly long. That allowed us
to use things like &lt;code&gt;ssh jlawson@files.application.com&lt;/code&gt; (previously, we shared
the EC2 pems on Google Docs. Don't look at me like that, I know, it's
awful.)&lt;/p&gt;

&lt;p&gt;We knew we wanted git deployment, but copying an application's files to multiple
servers &lt;em&gt;feels bad man&lt;/em&gt;, and would be worse with a ton of servers. That decision
made, we built a file server using
&lt;a href=&quot;http://www.gluster.org/&quot;&gt;GlusterFS&lt;/a&gt;. &lt;em&gt;Note: we had to unmask and use GlusterFS 3.3
in order to get multiple groups working with LDAP.&lt;/em&gt; We mounted GlusterFS onto the
filesystem on our application AMI, and installed git on the GlusterFS file server.
This allowed us to deploy using our ssh credentials stored in LDAP to the file
server hosting git, and because the application servers had the file server
mounted like a real directory, we would instantly have all application changes
without having to push to each individual application server. It was awesome to
&lt;code&gt;git remote add test jlawson@files.application.com/files/test&lt;/code&gt; and
&lt;code&gt;git remote add production jlawson@files.application.com/files/production&lt;/code&gt;. This
meant that deploys to update to &lt;em&gt;all of the servers&lt;/em&gt; was as easy as
&lt;code&gt;git push test master&lt;/code&gt; or &lt;code&gt;git push origin master&lt;/code&gt;. Goodbye, FTP. Goodbye,
complicated bash scripts.&lt;/p&gt;

&lt;p&gt;All services for a single application deploy to the same GlusterFS file server.
This allows any application server to load up whatever app it needs to run.&lt;/p&gt;

&lt;p&gt;We can also cluster GlusterFS into multiple zones and, eventually, regions.&lt;/p&gt;

&lt;h2&gt;Server Configuration&lt;/h2&gt;

&lt;p&gt;We made a git repository for server configs and git hooks for the application.
In it was an app configuration file that set environment variables, like&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
APP_ENV=prod
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It also contained additional &lt;code&gt;test&lt;/code&gt; and &lt;code&gt;prod&lt;/code&gt; folders with appropriate
configurations, so we could then load up the proper environment variables
per environment. This was loaded onto GlusterFS and symlinked into
&lt;code&gt;/etc/conf.d&lt;/code&gt;. We determined that having each application control its own
config made things a whole lot simpler than trying to load 1-n configs on a
server-by-server basis. The whole point of this system is automating ops, so we
can spend time building stuff; the less we're &lt;code&gt;ssh&lt;/code&gt;ed, the better.&lt;/p&gt;

&lt;p&gt;We also put our post-receive git hooks in this repository, which symlinks the
git deploy for the application to read and notifies our Hubot of deploys in
chat.&lt;/p&gt;

&lt;h2&gt;Next Steps&lt;/h2&gt;

&lt;p&gt;We want to introduce a daemon in each application server that watches for
changes in the files, in case we're running applications that need to be
restarted. We're thinking of introducing a common format, such as requiring
Makefiles in our applications that expose &lt;code&gt;install&lt;/code&gt;, &lt;code&gt;restart&lt;/code&gt;, &lt;code&gt;stop&lt;/code&gt;, and
&lt;code&gt;start&lt;/code&gt; so that we can, for example, reboot Nginx or restart Node or whatever.
We like the idea of a common makefile so that applications can manage themselves, and
the server does not have to be aware of what's running on it.&lt;/p&gt;

&lt;p&gt;We want to open-source our git hooks and autoscaling configuration scripts
at some point soonish.&lt;/p&gt;

&lt;p&gt;We also want to set up a constantly-running instance that always builds the
latest Gentoo packages and builds our applications on a custom portage tree so
that we can be up-to-date on both external system packages (like nginx) and our
own applications.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;All of our ops are automated really well now; Amazon automatically scales
groups up and down, deploying changes (or reverting changes) is a git push and
doesn't get in the way of our workflow, and we can submit no-downtime sub-second
application deploys.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>WebSockets, A Guide</title>
   <link href="http://www.thejacklawson.com//2012/10/websockets-a-guide/index.html"/>
   <updated>2012-10-25T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2012/10/websockets-a-guide/websockets-a-guide</id>
   <content type="html">&lt;p&gt;I had &lt;a href=&quot;http://buildnewgames.com/websockets/&quot;&gt;an article published&lt;/a&gt; April 2:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;WebSockets provide two-way realtime communication between a client and server, and thus are exceedingly useful in building modern web games. Browser-based games can profit from an always-on, low-latency connection by enabling the rapid transmission of information about player and global game state previously emulated by methods such as Ajax polling and Comet. It is useful to first look at the history of WebSockets and gain an understanding of how WebSockets work at a technical level before we examine how we may use WebSockets most effectively. Armed with this knowledge, we can simplify the network layer and build amazingly responsive games that provide a high level of multiplayer interactions.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://buildnewgames.com/websockets/&quot;&gt;Check out the rest&lt;/a&gt; as well as a bunch
of other awesome articles at &lt;a href=&quot;http://buildnewgames.com/&quot;&gt;Build New Games&lt;/a&gt;,
sponsored by Bocoup and Microsoft.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Adaptive Game Design</title>
   <link href="http://www.thejacklawson.com//2012/10/adaptive-game-design/index.html"/>
   <updated>2012-10-25T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2012/10/adaptive-game-design/adaptive-game-design</id>
   <content type="html">&lt;p&gt;I had another article published through &lt;a href=&quot;http://buildnewgames.com/&quot;&gt;Build New Games&lt;/a&gt;
on what I call &lt;a href=&quot;http://buildnewgames.com/a-study-in-adaptive-game-design/&quot;&gt;adaptive game design&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;There is, however, an interesting and compelling way around this conundrum to engage a much larger market. We can shift around the problem entirely by providing an entirely new class of entertainment to our end user. What I propose is a progressively enhanced, responsively designed approach to web gaming that encompasses all devices, everywhere, by providing engagement across all levels.&lt;/p&gt;

&lt;p&gt;This involves breaking away from the idea of building a game, and instead, building a lasting, engaging experience.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://buildnewgames.com/a-study-in-adaptive-game-design/&quot;&gt;Check out the rest&lt;/a&gt; as well as a bunch
of other awesome articles at &lt;a href=&quot;http://buildnewgames.com/&quot;&gt;Build New Games&lt;/a&gt;,
sponsored by Bocoup and Microsoft.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Switching Package Versions with Brew</title>
   <link href="http://www.thejacklawson.com//2012/09/switching-package-versions-with-brew/index.html"/>
   <updated>2012-09-11T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2012/09/switching-package-versions-with-brew/switching-package-versions-with-brew</id>
   <content type="html">&lt;p&gt;I use &lt;a href=&quot;mxcl.github.com/homebrew/&quot;&gt;homebrew&lt;/a&gt; to manage installations of things
like Lua, node, mysql, redis, vim, and more on OSX; I find brew essential to
setting up and maintaining a dev environment. It has a ton of packages
available and makes it super easy to stay up to date with the latest packages.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://olivinelabs.com/busted&quot;&gt;busted&lt;/a&gt; relies on a package called luafilesystem
for directory traversal; however, lfs relies on Lua 5.1.x. The version in
homebrew is 5.2. Switching is as easy as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
brew versions lua
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;which returns&lt;/p&gt;

&lt;pre&gt;
5.2.1    git checkout 894f668 /usr/local/Library/Formula/lua.rb
5.1.4    git checkout 7e5bc89 /usr/local/Library/Formula/lua.rb
&lt;/pre&gt;


&lt;p&gt;so I can&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
brew switch lua 5.1.4
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And use 5.1.4 instead of 5.2.1, allowing me to use busted (and test lfs fixes
in 5.2!) This works, in theory, with any brew package.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Lua Testing with Busted and Travis-CI</title>
   <link href="http://www.thejacklawson.com//2012/09/lua-testing-with-busted-and-travis-ci/index.html"/>
   <updated>2012-09-06T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2012/09/lua-testing-with-busted-and-travis-ci/lua-testing-with-travis-ci</id>
   <content type="html">&lt;p&gt;Lua's an awesome language. If you already know what Lua is, skip ahead to
the Busted section. If not, here's a brief overview.&lt;/p&gt;

&lt;p&gt;Lua is a lightweight (&amp;lt; 500kb), super fast (fastest scripting language in
almost all benchmarks when using the Luajit interpreter), simple language. It's
primarily used in building game scripts, such as World of Warcraft plugins,
but is also used in applications like Adobe Lightroom (which is, or was, largely
written in Lua) and Redis's new scripting capabilities. It isn't very opinionated,
and I find it to be similar to Javascript in its flexibility; it can be used
functionally, OO, or procedurally which provides a wide range of applicability.&lt;/p&gt;

&lt;p&gt;It's also, in my opinion, totally underutilized.&lt;/p&gt;

&lt;h2&gt;Busted&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://olivinelabs.com/busted&quot;&gt;Busted&lt;/a&gt; is a simple unit testing framework that
styles itself after such test frameworks as Mocha, Jasmine, RSpec, and *Unit.
An example might look like this, taken from the official documentation:&lt;/p&gt;

&lt;pre&gt;&lt;code data-language=&quot;lua&quot;&gt;require(&quot;busted&quot;)

describe(&quot;Busted unit testing framework&quot;, function()
  describe(&quot;should be awesome&quot;, function()
    it(&quot;should be easy to use&quot;, function()
      assert.truthy(&quot;Yup.&quot;)
    end)

    it(&quot;should have lots of features&quot;, function()
      -- deep check comparisons!
      assert.are.same({ table = &quot;great&quot;}, { table = &quot;great&quot; })

      -- or check by reference!
      assert.are_not.equal({ table = &quot;great&quot;}, { table = &quot;great&quot;})

      assert.true(1 == 1)
      assert.falsy(nil)
      assert.has.error(function() error(&quot;Wat&quot;) end, &quot;Wat&quot;)
    end)

    it(&quot;should provide some shortcuts to common functions&quot;, function()
      assert.are.unique({ { thing = 1 }, { thing = 2 }, { thing = 3 } })
    end)

    it(&quot;should have mocks and spies for functional tests&quot;, function()
      local thing = require(&quot;thing_module&quot;)
      spy.spy_on(thing, &quot;greet&quot;)
      thing.greet(&quot;Hi!&quot;)

      assert.spy(thing.greet).was.called()
      assert.spy(thing.greet).was.called_with(&quot;Hi!&quot;)
    end)
  end)
end)
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Our goal was to make it super easy to read and write; to not have to look up
documentation every time you want a test, but at the same time, build in
flexibility to cover enough use cases to make it usable by the entire Lua
community. So, we provide things like internationalization support (with 6
languages built in at time of writing), definable output types (for human or
machine consumption), and composable assertions.&lt;/p&gt;

&lt;p&gt;Testing using busted is really easy. The convention I usually follow is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a &lt;code&gt;spec&lt;/code&gt; folder in my code repository&lt;/li&gt;
&lt;li&gt;Write &lt;em&gt;module&lt;/em&gt;_spec.lua files to hold unit tests, broken up by classes or
some other granular unit of functionality&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;busted spec&lt;/code&gt; from project root.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Installing&lt;/h3&gt;

&lt;p&gt;Installing busted is easy:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OSX&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;brew install luajit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brew install luarocks&lt;/code&gt; (luarocks is the &quot;ruby gems&quot; of Lua)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;luarocks install busted&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Linux&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo apt-get install luajit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo apt-get install luarocks&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo luarocks install busted&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(Forthcoming when I bug my Windows-using friend about it. Install lua, then
Luarocks, then &lt;code&gt;luarocks install busted&lt;/code&gt;.)&lt;/p&gt;

&lt;h3&gt;Further Discussion on Busted&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;http://olivinelabs.com/busted&quot;&gt;busted docs&lt;/a&gt; are fairly solid; I reocmmend
you check them out. There's also plenty of information on the internet about
testing and TDD and the like. So let's move on to integrating with Travis!&lt;/p&gt;

&lt;h2&gt;Travis&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://travis-ci.org&quot;&gt;Travis&lt;/a&gt; is a &lt;em&gt;really cool&lt;/em&gt; tool that watches changes to
Github repositories and automatically runs tests. It's particularly useful
because you can check, every time you commit code, if you derped and broke
something that you shouldn't have. It has built-in support for many popular
languages, such as Ruby, Javascript, and others, but nothing for Lua yet.
However, it's pretty easy to abuse a worker meant for another language to get
it running busted specs.&lt;/p&gt;

&lt;p&gt;Create an account on &lt;a href=&quot;http://travis-ci.org&quot;&gt;Travis&lt;/a&gt;, then enable Travis to watch
your repository. Next, you'll create a &lt;code&gt;.travis.yml&lt;/code&gt; file in the root of your project.&lt;/p&gt;

&lt;p&gt;In this example &lt;code&gt;.travis.yml&lt;/code&gt; file, we'll fake out an erlang worker and run our
busted specs using both lua 5.1 and luajit. We define a series of installation
steps that will get everything installed and run the script, then post the
results to a web hook and send an email to me.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language: erlang

env:
  - LUA=&quot;&quot;
  - LUA=&quot;luajit&quot;

branches:
  only:
    - master

install:
  - sudo apt-get install luajit
  - sudo apt-get install luarocks
  - sudo luarocks install luafilesystem
  - sudo luarocks install busted

script: &quot;busted spec&quot;

notifications:
  webhooks:
    - http://my-url/travis-results
  recipients:
    - engineering@company.com
  email:
    on_success: change
    on_failure: always
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;At Olivine Labs, our webhook is actually a hubot endpoint that uses this
&lt;a href=&quot;https://gist.github.com/3660666&quot;&gt;travis-ci hubot script&lt;/a&gt;.  This allows our
chatbot to display the status in chat every time someone makes a commit or
pull request.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-----------------
PASSED on Lua &amp;lt;luassert&amp;gt; [06aad23b79686b6b1293eafcac687658823fd18b]
Compare: https://github.com/Olivine-Labs/luassert/compare/066101917a96...06aad23b7968
Committed by Jack Lawson at 2012-09-06T20:04:34Z
-----------------
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Check it out, and feel free to leave feedback and questions!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Inherited Initialization in Backbone</title>
   <link href="http://www.thejacklawson.com//2012/04/inherited-initialization-in-backbone/index.html"/>
   <updated>2012-04-18T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2012/04/inherited-initialization-in-backbone/inherited-intialization-in-backbone</id>
   <content type="html">&lt;p&gt;One of the niceties that Backbone provides is the ability to perform some level
of inheritance in your Backbone objects. You can, for example, create 'base'
models that provide some kind of functionality; perhaps they override the fetch
method to match your API. Views can share similar functionality or use sub-views
to share functionality across various pages.&lt;/p&gt;

&lt;p&gt;Here's an example of an application that has two pages: a &lt;em&gt;home&lt;/em&gt; page and a member's
&lt;em&gt;personal gallery&lt;/em&gt; page, might look like this. This uses Twitter's
&lt;a href=&quot;http://twitter.github.com/hogan.js/&quot;&gt;Hogan.js&lt;/a&gt; (essentially, mustache templates.)
with Backbone code written in Coffeescript. Both render a photo gallery, based on
a model consisting of a collection of photos.&lt;/p&gt;

&lt;pre&gt;&lt;code data-language=&quot;coffeescript&quot;&gt;App.Views.Home ||= {}

class App.Views.Home.IndexView extends Backbone.View
  template: HoganTemplates['photos/index']

  initialize: () -&gt;
    @model.bind('reset', @render)
    @render()

  render: =&gt;
    html = @template.render({ photos: @model.toJSON() }, { 
      photoGallery: HoganTemplates['shared/_photoGallery'],
    })

    @$el.find(&quot;.photoGallery&quot;).html(html)

    @$el.find('.photoGallery').flexslider();

App.Views.Members ||= {}

class App.Views.Members.GalleryView extends Backbone.View
  template: HoganTemplates['members/personalGallery']

  initialize: () -&gt;
    @model.bind('reset', @render)

  render: =&gt;
    html = @template.render({ photos: @model.toJSON() }, { 
      photoGallery: HoganTemplates['shared/_photoGallery'],
    })

    @$el.find(&quot;.photoGallery&quot;).html(html)

    @$el.find('.photoGallery').flexslider();
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;As you can see, &lt;em&gt;they're almost the same thing&lt;/em&gt;. We can make a base class
to inherit from, such as a GalleryView that sets up the initialize and render
functions; but, that limits us from the ability to add custom initialize and
render functions on our individual page views.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;or does it?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With a little trick, you can have your initialize and eat it, too. You can
call your ancestor's initialize function, and call your own function, at the
same time with a code sippet that looks like:&lt;/p&gt;

&lt;p&gt;(javascript)&lt;/p&gt;

&lt;pre&gt;&lt;code data-language=&quot;javascript&quot;&gt;this.constructor.__super__.initialize.apply(this, [options]);&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;(coffeescript)&lt;/p&gt;

&lt;pre&gt;&lt;code data-language=&quot;coffeescript&quot;&gt;super&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;And turn that initial code into this:&lt;/p&gt;

&lt;pre&gt;&lt;code data-language=&quot;coffeescript&quot;&gt;App.Views.Base ||= {}
class App.Views.Base.GalleryView extends Backbone.View
  initialize: () -&gt;
    @model.bind('reset', @render)
    @render()

  render: =&gt;
    @galleryView = new App.Views.Gallery.GalleryView({ model: @model, el: @$el.find(&quot;.photoGallery&quot;) })

App.Views.Gallery ||= {}
class App.Views.Gallery.GalleryView extends Backbone.View
  template: HoganTemplates['shared/_photoGallery']

  initialize: () -&gt;
    @model.bind('reset', @render)
    @render()

  render: () -&gt;
    html = @template.render({ photos: @model.toJSON() }, { 
      photoGallery: HoganTemplates['shared/_photoGallery'],
    })

    @$el.html(html)
    @$el.flexSlider()

App.Views.Home ||= {}

class App.Views.Home.IndexView extends App.Views.Base.GalleryView
  template: HoganTemplates['photos/index']

  initialize: () -&gt;
    @render()
    super

  render: =&gt;
    html = @template.render({ })
    @$el.html(html)
    super

    @$el.find('.photoGallery').flexslider();


App.Views.Members ||= {}

class App.Views.Members.GalleryView extends Backbone.View
  template: HoganTemplates['members/personalGallery']

  initialize: () -&gt;
    @render()
    super

  render: =&gt;
    html = @template.render({ })
    @$el.html(html)
    super

    @$el.find('.photoGallery').flexslider();
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Super calls it's ancestor's functions. Once the base template is rendered,
it calls the base view's, which builds a gallery and sets it up as a slider.&lt;/p&gt;

&lt;p&gt;Neat!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wrap Lines in Vim</title>
   <link href="http://www.thejacklawson.com//2012/04/wrap-lines-in-vim/index.html"/>
   <updated>2012-04-05T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2012/04/wrap-lines-in-vim/wrap-lines-in-vim</id>
   <content type="html">&lt;p&gt;If you search for things like 'how to wrap lines in vim', 'line wrapping vim',
'80 characters vim', etc, you will often find people saying ':set textwidth=XX'.&lt;/p&gt;

&lt;p&gt;But if you want to break, say, selected lines - or if this just plain doens't
work for you, try this: &lt;code&gt;!fold -w##&lt;/code&gt;. Add -s on the end to break at words. To,
for example, select text and wrap it at 80-line sentences, breaking at words,
you would select the text and use &lt;code&gt;!fold -w80 -s&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Magic!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Your Most Valuable Asset</title>
   <link href="http://www.thejacklawson.com//2012/02/your-most-valuable-asset/index.html"/>
   <updated>2012-03-28T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2012/02/your-most-valuable-asset/your-most-valuable-asset</id>
   <content type="html">&lt;p&gt;Your most valuable asset, as an engineer, is not your particular set of skills,
however specialized. It is the combination of your skills and experience that
put you at a unique position to be able to deliver innovative concepts.&lt;/p&gt;

&lt;p&gt;An engineer who knows Ruby, Python, and Javascript is an entirely different
developer than an engineer who knows C#, Java, and Javascript, even when coding
in the same language. Both have relevant experience; both may be the best in
their fields. A team, however, is made up of both; conflicting and harmonizing
experiences which can merge together to forge something that can take the best of
all. Likewise, the engineer who has a degree in Chemistry and who does 3D art
on the side, and the engineer who has an MBA and is just learning to develop
can join the team and offer further, unique perspectives on software
development. The young mind is as important to the team as the veteran. Without
different personalities, different points of view, the team simply marches on
without anyone to challenge assumptions. It's easy to fall into a trap of
comfort and assumptions, and that trap is the hardest to get out of.&lt;/p&gt;

&lt;p&gt;This doesn't just apply to engineers, although engineers are what I have the
most experience with. I see the same thing in all facets of a company. A
company without innovation is a company that is waiting to be destroyed,
which cannot adapt to new situations, and must maintain the status quo and hope
for the best. It won't be long until that status quo is disrupted by someone
who &lt;em&gt;can&lt;/em&gt; innovate, by someone who knows innovation means they can take the
undeserved, underserved customers and build something new.&lt;/p&gt;

&lt;p&gt;A homogonized culture is the death of a company.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Redesign</title>
   <link href="http://www.thejacklawson.com//2012/02/redesign/index.html"/>
   <updated>2012-02-27T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2012/02/redesign/redesign</id>
   <content type="html">&lt;p&gt;About two months ago, I wrote about &lt;a href=&quot;http://thejacklawson.com/2012/01/ditching-twitter-bootstrap/index.html&quot;&gt;ditching Twitter Bootstrap&lt;/a&gt;.
I had put up a temporary design that was, more or less, a clone of my existing
Bootstrap site; brown instead of black and white, but more or less the same.
I've decided to revisit some of my decisions, such as the use of a grid system
and roughly applied CSS and remove some of the unnecessary stuff.&lt;/p&gt;

&lt;p&gt;This new design, then, has much less complexity; it sticks with a very limited
palette and uses typography better to set the feel of the site.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Big Picture</title>
   <link href="http://www.thejacklawson.com//2012/02/the-big-picture/index.html"/>
   <updated>2012-02-01T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2012/02/the-big-picture/the-big-picture</id>
   <content type="html">&lt;p&gt;I had written &lt;a href=&quot;http://thejacklawson.com/2011/12/HTML/index.html&quot;&gt;a post&lt;/a&gt; a
couple months ago, stressing the importance of semantic HTML. I feel good about
that article, but I had originally meant to write more about the importance of
progressive enhancement. Today, while I was reading an article by Bruce Lawson
where he &lt;a href=&quot;http://www.brucelawson.co.uk/2012/reading-list-mobile-development-approaches/&quot;&gt;posted a list of interesting articles&lt;/a&gt;
as he is wont to do, the last article really grabbed my attention. It opened
with:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It seems to me that we are slowly switching from publishing content for the
Web, to making content accessible to Screen-Readers (SR) - from targeting
users, to focusing on devices and modern browsers.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;We seem to be in the &lt;em&gt;exact same&lt;/em&gt; prediciment that
caused the stagnated IE: we're targetting specific browers, even when we have
the tools, knowledge, and more importantly foresight to be better than this.
To be better than building &quot;Webkit only&quot; sites. I highly suggest
that you &lt;a href=&quot;http://www.css-101.org/articles/the_power_of_the_web_is_in_its_universality/strive_to_make_content_accessible_to_all.php&quot;&gt;read it here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you want to find out more about progressive enhancement, check out
&lt;a href=&quot;http://filamentgroup.com/dwpe/&quot;&gt;Designing with Progressive Enhancement&lt;/a&gt;
by the excellent people at Filament Group.&lt;/p&gt;

&lt;p&gt;Don't make the mistakes of the past.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Getting Backbone</title>
   <link href="http://www.thejacklawson.com//2012/01/getting-backbone/index.html"/>
   <updated>2012-01-30T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2012/01/getting-backbone/getting-backbone</id>
   <content type="html">&lt;p&gt;Backbone is a javascript MVC-like (we'll get to that in a minute) framework
with a goal of giving your javascript some structure. It provides a lightweight
collection of objects for binding data from your server to visual elements on
your web browser, providing a seperation of concerns and helping you write DRY
code.&lt;/p&gt;

&lt;p&gt;Get Backbone at &lt;a href=&quot;http://documentcloud.github.com/backbone/#&quot;&gt;the website&lt;/a&gt; or
&lt;a href=&quot;https://github.com/documentcloud/backbone/&quot;&gt;the Github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the spirit of Backbone's version 0.9.0 release, which is effectively a RC
for the 1.0 release, I'd like to talk about how I make sense of Backbone and
use it in my day-to-day development cycle. I come from a background using MVC
frameworks, with Rails, &lt;a href=&quot;https://github.com/Olivine-Labs/Mint&quot;&gt;PHP&lt;/a&gt;, and .NET
with WPF and Silverlight applications; and thus I will start with my first
epiphany towards using Backbone effectively:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backbone is not MVC.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is no &quot;C&quot;. There's a Router, which used to be called a Controller early
in Backbone's history, but the Router functions purely as a way to map views
to URLs. There is no &quot;path&quot; to post data to, although you can use parameters
in your route. It is, quite simply, a map between routes and functions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In Backbone, the popular paradigm is to have your models do the talking.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your models will sync themselves to the server (which is super easy if you have
a RESTful persistance layer that Backbone can automatically hook itself into.)
Your views will accept models, then make changes back to them (say, based on a
form) or do things like call the model's persistance methods like &lt;code&gt;save&lt;/code&gt; or
&lt;code&gt;fetch&lt;/code&gt;. Thanks to version 0.9.0, the models even have a default method to
parse JSON retrieved from the server, so you don't even have to massage the
data on the server- just let your model handle it. We're talking smart models,
not dumb models.&lt;/p&gt;

&lt;p&gt;Your backbone application may look something like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User hits URL&lt;/li&gt;
&lt;li&gt;Page instantiates router object&lt;/li&gt;
&lt;li&gt;Router object finds what route you're at, news up a model, which syncs its data
from the server, and sticks it into a view&lt;/li&gt;
&lt;li&gt;The view hooks model up to the UI, the user performs actions on the form, which
performs actions on the model, which syncs to the server&lt;/li&gt;
&lt;li&gt;User clicks link, which maps to the router, continues the cycle&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;But wait. You &lt;em&gt;might not even use a router.&lt;/em&gt; For example, maybe you want the
awesomeness of Backbone, but you don't plan on building a single-page app, or maybe
you plan on building one later but can't do it all at once. That scenario might look
more like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User hits URL&lt;/li&gt;
&lt;li&gt;Page instantiates model with data from the server (so we don't have to make
two trips), instantiates view with this model&lt;/li&gt;
&lt;li&gt;View hooks model up to the UI, performs actions on the model, which syncs to
the server&lt;/li&gt;
&lt;li&gt;User clicks link, which goes to a different page&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;The traditional controller is more baked into the models, and the router is entirely
for convenience if you want to manage history to enable some back-button functionality
for the user or if you want to store a bookmarkable state such as if you're building a
single-page-app.&lt;/p&gt;

&lt;p&gt;Backbone's starting to look a whole lot more flexible now, more as a framework for
splitting up DOM and data manipulation and less as a web application composing kit.
It &lt;em&gt;can&lt;/em&gt; certainly do that- and it does that well. But it doesn't have to if you're
not building it that particular way, or if you're working on it but can't get there
&lt;em&gt;today&lt;/em&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Javascript</title>
   <link href="http://www.thejacklawson.com//2012/01/javascript/index.html"/>
   <updated>2012-01-09T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2012/01/javascript/javascript</id>
   <content type="html">&lt;p&gt;Disclaimer: this is a rant at 1AM. Content subject to change when I wake up in
the morning.&lt;/p&gt;

&lt;p&gt;Javascript is not a classical OO language.&lt;/p&gt;

&lt;p&gt;Here it is again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Javascript is not a classical OO language.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You &lt;em&gt;can&lt;/em&gt; use classes. You &lt;em&gt;can&lt;/em&gt; pervert it into things like Dart, or use
gobs of inheritance to build a classical structure. By doing so, you're
limiting yourself and destroying the flexibility that Javascript provides. Stop
thinking of Javascript like Java, because it isn't. Use object instances and
build prototypical objects when it makes code cleaner, not as the general rule.
These things aren't evil in any way- but they should be used &lt;em&gt;where appropriate.&lt;/em&gt;
You don't need contracts. I don't even like typing the word 'contract.' It's
ugly. It's ugly in Javascript. It's ugly everywhere, really.&lt;/p&gt;

&lt;p&gt;Protip: learn Scheme. Try out &lt;a href=&quot;http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of-computer-programs-spring-2005/&quot;&gt;MIT's free online courses&lt;/a&gt;.
Then come back and try out Javascript again.&lt;/p&gt;

&lt;p&gt;I went through this phase. I learned Javascript, and used it for horrific DOM
manipulations. Then I learned C#. I went through a phase where everything was
an object, everything was namespaced. Then I learned Scheme, and bounced around
in Python and Ruby a bit. Once you've grasped procedural, functional, and
classic OO programming, you begin to see that the patterns in Javacript aren't
ugly, aren't random and messy; that you don't need obese structure and &lt;em&gt;contracts&lt;/em&gt;
and type checking. You can elegantly and concisely pass around functions and
objects and whatever, because they're all the same thing anyway, more or less.&lt;/p&gt;

&lt;p&gt;Structure is overbearing. Javascript is freedom.&lt;/p&gt;

&lt;p&gt;I guess the whole point I'm trying to make here is, I hate sauerkraut.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Alchemy Websockets</title>
   <link href="http://www.thejacklawson.com//2012/01/alchemy-websockets/index.html"/>
   <updated>2012-01-07T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2012/01/alchemy-websockets/alchemy-websockets</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.alchemywebsockets.net&quot;&gt;Alchemy Websockets&lt;/a&gt; is a C# .NET library
that allows a web browser that supports the WebSockets protocol to connect
to a server application using a peristant TCP connection. This means that we
can employ real-time, stateful communication between web applications and server
applications. WebSockets are supported by current versions of Chrome, FireFox,
Safari, and Opera and Opera Mobile with special configuration settings set.
IE10 will also have WebSockets. Alchemy can run on Mono (which means EC2 is a go)
and supports most versions of the protocol, stretching from hybi-00 to the
latest (and final) RFC spec.&lt;/p&gt;

&lt;p&gt;We (Drew and I and &lt;a href=&quot;http://www.olivinelabs.com&quot;&gt;Olivine Labs&lt;/a&gt;) had started
considering how to use WebSockets for some of the games we were building and
planning. At the time, we were thinking about using them for chat for the
now-defunct &lt;a href=&quot;https://github.com/Olivine-Labs/Chrysellia&quot;&gt;Chrysellia&lt;/a&gt;; and we
have plans to build a game that uses WebSockets fully as its transport. Our
search took us first to &lt;a href=&quot;http://socket.io&quot;&gt;socket.io&lt;/a&gt;, a Node.js implementation
that gave not only WebSockets, but also fallbacks with Comet and Ajax
long-polling and other hackish methods of doing socket-like communication.&lt;/p&gt;

&lt;p&gt;However, while I, a javascript developer, originally lobbied for Node.js and Socket.io,
we decided to move forward with C#. It isn't the new, sexy language, but it is
a language that we both know well; and better, we could take advantage of C#'s
amazing microthreading. We built the library around this core threading model so that
it could &lt;em&gt;very&lt;/em&gt; efficiently handle hundreds of thousands of simultaneous connects,
disconnects, and messages on a single server. Drew was able to get around 200k
live connections on his dev box before he ran out of memory for the &lt;em&gt;clients&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Alchemy also includes a WebSocket client for server intercommunication that uses the
latest protocol version &lt;a href=&quot;http://tools.ietf.org/html/rfc6455&quot;&gt;rfc6455&lt;/a&gt; to talk
to anything else running WebSockets (whether Alchemy or otherwise.)&lt;/p&gt;

&lt;p&gt;We'll be putting it up to a big test with a server infrastructure management API
that we've called Tiamat and an API command router called Vocale that will be
built over the coming months (we plan to MIT / LGPL these as well).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Ditching Twitter Bootstrap</title>
   <link href="http://www.thejacklawson.com//2012/01/ditching-twitter-bootstrap/index.html"/>
   <updated>2012-01-05T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2012/01/ditching-twitter-bootstrap/ditching-twitter-bootstrap</id>
   <content type="html">&lt;p&gt;Until recently, my blog was using a fairly vanilla version of the CSS framework put
together by the developers at Twitter, &lt;a href=&quot;http://twitter.github.com/bootstrap&quot;&gt;Bootstrap&lt;/a&gt;.
It's a really full-featured framework that gives grids, headings, links, buttons,
and all manner of form elements a clean and consistent design. You can see another
example at the &lt;a href=&quot;http://alchemywebsockets.net&quot;&gt;Alchemy Websockets&lt;/a&gt; site.
I used it- as I think many people do- as a way to get a decent site deisgn up
in a matter of minutes; one can download or clone the repository, and use as-is
or tweak a few LESS variables and compile a new version complete with new colors
and gradients.&lt;/p&gt;

&lt;p&gt;I put a bit more work into the Alchemy site than I did on my blog; I originally
was more concerned about setting up jekyll correctly and getting everything
online than learning &lt;em&gt;another&lt;/em&gt; layer of abstraction between me and my code.
In fact, that's probably Bootstrap's greatest contribution to me - I learned more
about LESS while tweaking link colors and gradient styles for Alchemy. I'm still
not sold on the concept of CSS preprocessors on a wide-scale team use, but I'm
experimenting with it on the new Neflaria site and hope to have a much more
substantial recommendation once that project is complete (fingers crossed,
June.)&lt;/p&gt;

&lt;p&gt;As all bootstrapping frameworks must (or, should), the monotony eventually got to me.
I only used about 10% of the features, and the design just didn't feel right if it
wasn't either heavily customized or built from the ground-up. It is my blog,
after all - and even if it'll take a little work to bring it back up to speed,
to homogenize the components and get all the elements lined up correctly, it feels
a little more like home now.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href=&quot;http://subtlepatterns.com&quot;&gt;subtlepatterns.com&lt;/a&gt; is amazing. Also, I'm
a happy user of the &lt;a href=&quot;http://cssgrid.net/&quot;&gt;1140 grid&lt;/a&gt; which provides a fluid-ish
responsive grid system.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Vim "Can't Open Errorfile" Issue</title>
   <link href="http://www.thejacklawson.com//2011/12/vim-cant-open-errofile/index.html"/>
   <updated>2011-12-14T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2011/12/vim-cant-open-errofile/vim-cant-open-errofile</id>
   <content type="html">&lt;p&gt;tl;dr: put &lt;code&gt;set shell=bash&lt;/code&gt; in your .vimrc&lt;/p&gt;

&lt;p&gt;I recently had to reinstall OS X after a catastrophic hard drive failure. I had
most of my configuration &lt;a href=&quot;https://github.com/ajacksified/Config&quot;&gt;on Github&lt;/a&gt; (which is
something I &lt;em&gt;highly&lt;/em&gt; recommend), luckily, so it was a pretty easy move thanks
to that and some well-placed backups.&lt;/p&gt;

&lt;p&gt;So, I pulled down my config, loaded the submodules, and threw it all in my
~/.vim directory. Everything went smooth as butter until I tried to run vim-ack.
I had originally thought that it was an error with vim-ack, and tried alternate
versions of vim-ack. But I still got an error. So I tried five different
snapshots of MacVim. I still got the error. Then I tried copying a file with
NERDTree, and I got &lt;em&gt;another&lt;/em&gt; error. Delete and add worked, but not copy.
Mystifying.&lt;/p&gt;

&lt;p&gt;vim-ack error:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Searching ...
Error detected while processing function &amp;lt;SNR&amp;gt;21_Ack:
line   23:
E40: Can't open errorfile /var/folders/98/_ymf2wy554n6qrs32ptrwrl40000gn/T/vx96wXC/2
Press ENTER or type command to continue
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/WED9C.png&quot; alt=&quot;Error executing vim-ack&quot; /&gt;&lt;/p&gt;

&lt;p&gt;NERDTree error:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Cannot execute shell /usr/local/bin/bash
Error detected while processing function &amp;lt;SNR&amp;gt;19_showMenu..30..47..NERDTreeCopyNode..54..112:
line    8:
E484: Can't open file /var/folders/98/_ymf2wy554n6qrs32ptrwrl40000gn/T/vx96wXC/3
Error detected while processing function &amp;lt;SNR&amp;gt;19_showMenu..30..47:
line    6:
E171: Missing :endif
Error detected while processing function &amp;lt;SNR&amp;gt;19_showMenu..30:
line   19:
E171: Missing :endif
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/aTr3T.png&quot; alt=&quot;Error executing NERDTree copy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I tried chowning the temp files; I tried unsetting TEMPDIR. Nothing worked.&lt;/p&gt;

&lt;p&gt;After browsing page after page of non-helpful Google results, I came back to
a &lt;a href=&quot;http://vim.1045645.n5.nabble.com/E40-quot-Can-t-open-errorfile-quot-td1217809.html&quot;&gt;three-year-old conversation&lt;/a&gt;
that I had already been to twice. I noticed one little line in there:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;set shell=bash
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And thought &quot;Well, I've tried everything else.&quot;&lt;/p&gt;

&lt;p&gt;It worked.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>HTML</title>
   <link href="http://www.thejacklawson.com//2011/12/HTML/index.html"/>
   <updated>2011-12-06T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2011/12/HTML/html</id>
   <content type="html">&lt;p&gt;I have a strong belief in &lt;em&gt;HTML that means something&lt;/em&gt;. HTML can be viewed as a
vessel for delivering content; however, HTML- and especially more so with HTML5-
defines a mechanism with which we can not only deliver content, but describe
what the content &lt;em&gt;is&lt;/em&gt;. This is what is called &lt;em&gt;semantic markup&lt;/em&gt;; it is not an
obtuse buzzword, but rather an important design methodology.&lt;/p&gt;

&lt;p&gt;It is easy to fall into one of two pitfalls: &quot;just get the thing done&quot; and
&quot;write the minimal amount of code possible&quot;. One is caused by a developer
who does not understand (or does not care to understand) the importance of markup;
one is caused by a developer who is foregoing semantics in favor of misguided
&quot;efficiency&quot; gains, whether personally (writing less code) or for the server
(sending less code.) However, in the long run, this serves only as a barrier
to maintainance and usability.&lt;/p&gt;

&lt;p&gt;&amp;#167;&lt;/p&gt;

&lt;p&gt;There was a large movement towards using &lt;code&gt;div&lt;/code&gt; tags for markup, moving away
from monolithic table-based markup. This was done in order to reduce the
coupling between styles and content, making changes easier, content easier
to consume, and code easier to maintain. It also allowed designs to be fluid,
flowing around the content rather than constraining content into boxes.  Instead
of shuffling table cells, we now only have to switch out a class, or in extreme
examples, the order of a few &lt;code&gt;div&lt;/code&gt; containers in order to update a design. This
was an important step forward in the evolution of modern web development.
However, while progressive, divs were found to be meaningless. No reasonable
heirarchy of data could be constructed; a side-bar was virtually indistinguishable
from main content, a site's heading didn't stand out except through primitive
&lt;code&gt;h#&lt;/code&gt; tags.&lt;/p&gt;

&lt;p&gt;HTML5 then gave us elements such as &lt;code&gt;header&lt;/code&gt;, &lt;code&gt;footer&lt;/code&gt;, &lt;code&gt;time&lt;/code&gt;, &lt;code&gt;nav&lt;/code&gt;, &lt;code&gt;section&lt;/code&gt;,
&lt;code&gt;article&lt;/code&gt;, &lt;code&gt;aside&lt;/code&gt;, and more; new properties and attributes such as input types
and input placeholders; and more (which you can read about in the
&lt;a href=&quot;http://www.w3.org/TR/html5-diff/#new-elements&quot;&gt;W3C Specs&lt;/a&gt; and at the excellent
&lt;a href=&quot;http://html5doctor.com/element-index/&quot;&gt;html5 doctor&lt;/a&gt;. html5- true html5, not
&quot;marketing buzzword&quot; html5- has a rich and beautiful focus on semantic markup
that allows for clear consumption and maintainance of content.&lt;/p&gt;

&lt;p&gt;It is not only html5 that has semantic meaning, though; looking back through
html4 and earlier iterations gives us examples of &lt;code&gt;hr&lt;/code&gt; for splitting content
sections, &lt;code&gt;table&lt;/code&gt; for data, &lt;code&gt;form&lt;/code&gt; for form, &lt;code&gt;a&lt;/code&gt; for links. Many of these base
tags are, however, ignored or forgotten in return for generic &lt;code&gt;div&lt;/code&gt; zealotry.
Links are built with div tags and javascript onclick events, 'ajax' forms are
built using generic elements, and images are simply &lt;code&gt;div&lt;/code&gt; tags with background
images. We have begun to lose meaning not only to the browsers that consume our
content, but also to ourselves, as developers. With semantic elements, one can
view an &lt;code&gt;article&lt;/code&gt; tag and understand where it begins and ends without following
a chain of generic &lt;code&gt;div&lt;/code&gt; tags; with a &lt;code&gt;form&lt;/code&gt;, one can understand that its
contained inputs are part of a collection to be submitted, rather than a random
cluster of inputs, any of which might be sent out to a server; with an &lt;code&gt;a&lt;/code&gt;, we
know it goes somewhere, and with a &lt;code&gt;button&lt;/code&gt;, we know it performs an action.&lt;/p&gt;

&lt;p&gt;Semantically relevant code is both code and documentation. With consistency,
we can reduce the number of one-off styles and the amount of javascript logic
we have to write. Instead of coupling our styles to our code, as we may have
coupled our content to tables in the past, let us define code that uses
elements that can describe what the content is. Style a &lt;code&gt;time&lt;/code&gt; element instead
of a &lt;code&gt;time&lt;/code&gt; class on a span; write javascript based on buttons instead of divs
coerced into acting like buttons.&lt;/p&gt;

&lt;p&gt;Thus we may reduce our code and provide meaning to our content, while providing
a normalized experience to machines who read our content, be they search
engines, browsers, or screen readers.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is dedicated to my colleague, Tony DeSylva, for whom I wrote this.&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>On Modern Web Development</title>
   <link href="http://www.thejacklawson.com//2011/11/on-modern-web-development/index.html"/>
   <updated>2011-11-17T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2011/11/on-modern-web-development/on-modern-web-development</id>
   <content type="html">&lt;p&gt;I shall begin thusly:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;HTML5 and related technologies provide tools with which to enhance
accessibility through well-structured, sementically-defined content.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;And I will asert this:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The ability to build an application with a javascript framework, even
with &quot;modern&quot; development practices, is meaningless if you use these
tools like you would Flash.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Lately, there have been a lot of blog posts, links on &lt;a href=&quot;http://news.ycombinator.com&quot;&gt;hacker news&lt;/a&gt;,
links on &lt;a href=&quot;http://www.reddit.com&quot;&gt;reddit&lt;/a&gt;, and elsewhere where someone's showing off their latest application or framework. Javacript application
frameworks have never been more popular- like my personal favorite, &lt;a href=&quot;documentcloud.github.com/backbone/&quot;&gt;backbone&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With these tools, it's easy and simple to build single-page applications. One looks at Twitter, or Facebook, or Grooveshark, and admires the clean
presentation and seamless(ish) transitions between application areas. So, developers go forth with the intent to replicate this kind of experience.
We import a framework like Backbone, and start coding away. Maybe you use something Rails and TDD our way through a nice group of controllers serving
JSON right to our client-side models. We use Jasmine, and TDD our way through the client-side, and use all the &quot;best practices&quot; that we've been tought,
and we deliver a great product on time.&lt;/p&gt;

&lt;p&gt;You've built an application that looks pretty, that's fast and performant and efficient, that followed &quot;best practices&quot; for development technique,
but it has one major problem: if there's no non-javascript representation, it isn't machine-readable. Or in other words, if it's a strictly
javascript-based application, that does everything client-side except for the retrievel and storage of data, then you're just as good off as having
built it in Flash; maybe even worse.&lt;/p&gt;

&lt;h2&gt;SEO Implications&lt;/h2&gt;

&lt;p&gt;Googlebot &lt;em&gt;has&lt;/em&gt; an API for ajax calls, but you have to conform to their specifications. Search engines work by scraping your site's content; and if you
don't have an html representation of you data, it can't scrape anything.&lt;/p&gt;

&lt;h2&gt;Accessibility Implications&lt;/h2&gt;

&lt;p&gt;You're going to be alienating a lot of users who use screen readers. Some can watch for new content, but not all.&lt;/p&gt;

&lt;h2&gt;Availability Implications&lt;/h2&gt;

&lt;p&gt;A javascript-heavy website on a first-gen iPad or a lower-powered tablet does not run well. Also consider set-top boxes like Google TV.
Modern mobile devices have no problem, but earlier devices won't even be able to use your application.&lt;/p&gt;

&lt;p&gt;I can't guess or give you recommendations on how many people you might be ignoring. But I can try to make a case and tell you that
there's a &lt;em&gt;right&lt;/em&gt; way to build web applications where you won't run into these problems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start by building your client through HTML. No styles, no javascript. Just HTML. That means using plain, old, boring vanilla links and forms.
&lt;em&gt;note: this is a good spot to use html5. section, head, aside, footer, input types, etc. are all there for a reason. This is that reason.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Build your server-side:

&lt;ul&gt;
&lt;li&gt;With a RESTful interface. This will let you route HTML request, ajax / JSON requests, and anything else through a common API that you can use
internally and have the option to externalize. You're building for the future - you can build any client that can produce a RESTful call,
which is pretty much anything. You'll use the same routes whether requesting JSON or HTML, which means you have to change nothing to switch
between calls.&lt;/li&gt;
&lt;li&gt;With logicless templating. I can go on forever about how great &lt;a href=&quot;http://mustache.github.com/&quot;&gt;Mustache&lt;/a&gt; is. Fill these views with a flattened-down
version of your model (also known as a viewmodel in some circles.) This will allow you to use the same logic and output whether outputting HTML,
JSON, XML, or anything. If it's a JSON request, JSONify the viewmodel. If it's HTML, fill a mustache (or erb, or whatever) template with this
viewmodel and send that. One line of code difference between request type is the goal.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Layer on your css. This probably sounds like Progressive Enhancement, because it is.&lt;/li&gt;
&lt;li&gt;Now, add your framework on top. If you're using a framework that supports Mustache templates, you can use the same code on your client that you are
on your server - which means no duplication. Same html, same css, same everything.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;You're probably doing most of this already anyway.  The major thing to take away is that now you're building your templates first instead of implementing your
client framework first. With a very small change, if you're already writing well-structured markup (which you can easily check while you're building your
css-less templates), you've built yourself a single-page app that's also accessible. You've built an application that can handle any request type, that provides
an API, that is easily scalable (thanks to RESTfulness, you can easily replicate it across webservers as quick as you can clone them), and that re-uses
as much code as possible, and is therefore easily maintainable.&lt;/p&gt;

&lt;p&gt;So my plea: Build in html everything you can. Don't develop Flash in HTML5.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The only thing I can think of that could probably get away from it is a completely interactive experience such as an online game. But even then, giving
your players forums, stores, chat rooms, etc. to discuss the game in is just as important to the health and growth of your game as the game itself is.
Having these tools available can make a world of difference.&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>New Game Conf Liveblog, Day 2</title>
   <link href="http://www.thejacklawson.com//2011/11/new-game-conf-liveblog-2/index.html"/>
   <updated>2011-11-02T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/11/new-game-conf-liveblog-2/new-game-conf-liveblog-2</id>
   <content type="html">&lt;p&gt;I combined the notes for day 1 and 2 into a megasuperpost. Check it out at:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://thejacklawson.com/2011/11/new-game-conf-liveblog/index.html&quot;&gt;New Game Conf Liveblog&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>New Game Conf Liveblog</title>
   <link href="http://www.thejacklawson.com//2011/11/new-game-conf-liveblog/index.html"/>
   <updated>2011-11-01T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/11/new-game-conf-liveblog/new-game-conf-liveblog</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Note: Combined the first and second day for a mega-wall-o-text.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Day 1 - November 1, 2011&lt;/h2&gt;

&lt;p&gt;This is a live blog for the &lt;a href=&quot;http://www.newgameconf.com&quot;&gt;New Game Conference&lt;/a&gt;.
I'll keep quick notes during the presentations, and clean up grammar / confusing
structures during breaks.  The Q &amp;amp; A sections are paraphrased. Any quotes will
be signified as such.  Please leave corrections and requests for clarification in
the comments here.&lt;/p&gt;

&lt;p&gt;Also check out #ngc11 and #bbg on irc.freenode.net&lt;/p&gt;

&lt;p&gt;Also also check out &lt;a href=&quot;http://newgameconf.qotr.net/Quotes/List/&quot;&gt;New Game Conf Quotes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've used images that people post to Twitter; &lt;em&gt;none of them are mine&lt;/em&gt;. I've used
small versions of the images and linked to the original posting.&lt;/p&gt;

&lt;p&gt;Some of the slides and are also linked at &lt;a href=&quot;http://confswag.com/2011/newgame/&quot;&gt;confswag&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Keynote by Richard Hilleman&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Nov 1, 9:00 - 10:00&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Richard Helleman is VP CCD at Electronic Arts.&lt;/p&gt;

&lt;p&gt;Started a little late to liveblog this, so here's a synopsis and high points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Called the current web a Playstation 2 grade platform&lt;/li&gt;
&lt;li&gt;html5 needs platform predictibility, killer game to be successful&lt;/li&gt;
&lt;li&gt;Estimates that 75% of EA platform games (e.g. Playstation 2 games) could be
converted relatively easily to web&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;img src=&quot;http://s1-05.twitpicproxy.com/photos/large/439077657.jpg&quot; title=&quot;Opening Keynote&quot; alt=&quot;Opening Keynote&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://j.mp/s9pkUG&quot;&gt;photo source: @newgameconf&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Debugging and Optimizing WebGL Applications by Ben Vanik &amp;amp; Ken Russel&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Nov 1, 10:15 - 11:00&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://webglsamples.googlecode.com/hg/newgame/2011/&quot;&gt;Slides and Samples&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;WebGL support in browsers opens the door to immersive 3D content, especially
games, which is delivered with no end user installation, runs on multiple
platforms and requires no porting effort.  Debugging and tuning WebGL
applications for highest performance can be challenging, in particular due to
the low-level nature of the WebGL and OpenGL APIs. This session will introduce
the WebGL Inspector and explore several complex real-world applications to show
how they achieved their results and how the tool can be used to learn more
about an application through a way most never see.&lt;/p&gt;

&lt;p&gt;Techniques that will be covered include batching of geometry, using texture
atlases, pipelining data, reducing the amount of data transferred to the GPU,
offloading computation to the GPU, and using web workers to parallelize
applications. Workarounds and gotchas will be described for the differences
between WebGL and other common implementations (such as OpenGL ES on iOS) and
limitations imposed for security reasons.&lt;/p&gt;&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;WebGL is coming out of &quot;Experimental&quot;

&lt;ul&gt;
&lt;li&gt;Pros and cons of Webgl&lt;/li&gt;
&lt;li&gt;Pros

&lt;ul&gt;
&lt;li&gt;Directly exposes GPU&lt;/li&gt;
&lt;li&gt;Very high performance&lt;/li&gt;
&lt;li&gt;Not a plugin&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cons

&lt;ul&gt;
&lt;li&gt;Much lower level than DOM&lt;/li&gt;
&lt;li&gt;Harder to learn, debug, optimize&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Debugging Tips&lt;/h3&gt;

&lt;p&gt;Check for OpenGL errors; restart with a good known base; start adding code
back in until it breaks.&lt;/p&gt;

&lt;p&gt;To debug shaders, remove functionality, output constant color (like red) in
the regions of the shader where you're trying to identify what's going on.&lt;/p&gt;

&lt;p&gt;Try a library like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.khronos.org/webgl/wiki/Debugging&quot;&gt;webgl-debug.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Firefox web console&lt;/li&gt;
&lt;li&gt;Open web console&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Handling Context Loss:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Power loss on device, GPU reset, webgl-debug can help&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;&lt;a href=&quot;http://benvanik.github.com/WebGL-Inspector/&quot;&gt;WebGL Inspector&lt;/a&gt; by Ben Vanik&lt;/h3&gt;

&lt;p&gt;Showing off webgl inspector with aquarium demo. Logs and shows all calls, steps
through draw calls to see scene reconstructed in order. Highlights redundant
calls that don't actually change meaningful state. Isolates draw calls, and you
can see what was affected directly and get information about the call, such as
sample state, vertex attributes, texture urls, etc.&lt;/p&gt;

&lt;h3&gt;GPU Optimization&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Retest often; automated tests where possible&lt;/li&gt;
&lt;li&gt;Reduce the number of draw calls per frame; could block GPU. Watch for
highlights in WebGL Inspector&lt;/li&gt;
&lt;li&gt;Use RequestAnimationFrame for a more robust framerate; fallback with
setTimeout if you have to&lt;/li&gt;
&lt;li&gt;Disable unused WebGL features, such as blending, alpha texturing, etc&lt;/li&gt;
&lt;li&gt;Link infrequently; shader verification / translation can take a long time,
esp. on Windows&lt;/li&gt;
&lt;li&gt;Change Framebuffers, not Renderbuffers, which require a lot of validation
(this is counter to iOS guidelines)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://http.developer.nvidia.com/GPUGems/gpugems_ch28.html&quot;&gt;Graphics Pipeline Performance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Optimizing Drawing (Scenes)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Canvas is drawn, sorting by z-index&lt;/li&gt;
&lt;li&gt;Sorting by z-index is terrible for WebGL, which should be sorted by state,
then depth, by using the depth buffer&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Depth buffers can sort fragments per pixel; is relatively cheap for the GPU.
Depth testing can increase performance dramatically, even in 2d apps.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Draw objects ordered by most expensive first; blending/clipping first&lt;/li&gt;
&lt;li&gt;Sort scene ahead of time and maintain as sorted list in app memory if possible&lt;/li&gt;
&lt;li&gt;Generate content that can be easily batched by merging buffers / textures&lt;/li&gt;
&lt;li&gt;Draw opaque objects front-to-back, then layer on translucent objects
back-to-front&lt;/li&gt;
&lt;li&gt;Make sure to use index buffers, which enable additional GPU performance
features like caching&lt;/li&gt;
&lt;li&gt;Dynamically changing index buffers requires re-validation in WebGL. This is
bad.&lt;/li&gt;
&lt;li&gt;Always ask yourself: can this be a constant? Make it so.&lt;/li&gt;
&lt;li&gt;Compute early, one matrix multiply on CPU is better than thousands on GPU&lt;/li&gt;
&lt;li&gt;Estimate numbers; lower precision, prefer &quot;close enough&quot; to &quot;perfect&quot;&lt;/li&gt;
&lt;li&gt;Lower level of detail (for example, for objects in the distance&lt;/li&gt;
&lt;li&gt;Use mipmapping&lt;/li&gt;
&lt;li&gt;Schedule math between sampling so that the GPU is not idle&lt;/li&gt;
&lt;li&gt;Scale canvas to smaller and css to set width/height larger if you have a set
size&lt;/li&gt;
&lt;li&gt;GPU hardware is massively parallel; use if possible&lt;/li&gt;
&lt;li&gt;Pushing frames from GPU can cause stalls; try to spread updates across
multiple frames.
Number of uploads don't matter, size of frames does.&lt;/li&gt;
&lt;li&gt;Double / triple buffer if possible; makes frame upload consistent&lt;/li&gt;
&lt;li&gt;Decouple GPU and CPU; re-send GPU older data if CPU hasn't caught up yet. If
you perform the same translation sequence twice, re-send the old GPU data and
fake it.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Use there tricks wisely; not all are useful everywhere. Start simple, test and
debug continuously.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt; 10:54 ajacksified_ I heard you like spinning cubes&lt;/p&gt;

&lt;p&gt; 10:55 segdeha So I put a cube in your cube&lt;/p&gt;

&lt;p&gt; 10:55 ajacksified_ so you can spin your cube while you spin your cube&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://webglsamples.googlecode.com/hg/newgame/2011/05-pipelining.html&quot;&gt;Relevant&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Q &amp;amp; A&lt;/h3&gt;

&lt;p&gt;When will be a good time to start using WebGL for clients?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;You can begin to be it on it now. Consider progressive ehancement with canvas
fallbacks.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;How does WebGL affect mobile battery life?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;WebGL is fairly similar to native code. It uses the GPU, and it will drain the
battery more than jut using the CPU, but that's the tradeoff for more power.
requestAnimationFrame helps because it throttles requests.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Does WebGL give you a way to use a secondary display?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;That is up to browser implementation. WebGL renders into the canvas directly.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;Lessons from the (Mobile) Trenches by Justin Quimby&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Nov 1, 11:15 - 12:00&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Moblyng has been developing HTML5 games for the past 3 years.
This talk is an overview of the lessons learned from that experience
covering multiple code frameworks, business partners, and revenue models.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Justin Quimbly: COO of Moblyng&lt;/p&gt;

&lt;h3&gt;Moblyng&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Developed 13 production html5 games&lt;/li&gt;
&lt;li&gt;Startup in Redwood City&lt;/li&gt;
&lt;li&gt;Started with poker games, word games, war-style rpgs&lt;/li&gt;
&lt;li&gt;Playdom: Social City, Sorority Life, Mobsters&lt;/li&gt;
&lt;li&gt;WeeWorld: WeeMee Life&lt;/li&gt;
&lt;li&gt;Facebook: Social Poker Life&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Strategy of Mobile Development&lt;/h3&gt;

&lt;p&gt;Point of html5: accessibility to all devices&lt;/p&gt;

&lt;p&gt;Social games are a great fit for light, engaging games. There is a big market opportunity
and distribution opportunities in the mobile space, especially for people
already on Facebook. These can be augmented with native apps, which can be no more than
wrappers around the html5 games.&lt;/p&gt;

&lt;p&gt;Products run on all devices, because of html5. Doesn't matter who &quot;wins&quot; the
mobile OS war.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&quot;How many of you building HTML5 games are targeting mobile?&quot; Everyone raises
their hand. #ngc11 Mobile HTML5 games = huge opportunity&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://j.mp/sfvH8q&quot;&gt;source: @joemccann&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Technology Framework&lt;/h4&gt;

&lt;p&gt;Huge numbers of mobile, internet-connected devices being shipped.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;There is a huge market for playing games on your refrigerator.&lt;/p&gt;&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;No html5 &lt;code&gt;canvas&lt;/code&gt; - too slow / unreliable. Moblyng uses javascript / css&lt;/li&gt;
&lt;li&gt;Moblyng shell handles native hooks&lt;/li&gt;
&lt;li&gt;Benefits of wrapper: native app in app stores for distribution and consumer
access&lt;/li&gt;
&lt;li&gt;Right now, if you need super blazing-fast peformance, you're going to have to
write native code. Intense apps and light apps are different products for
different platforms.&lt;/li&gt;
&lt;li&gt;Invest in a ton of varying mobile devices, so you dont have to wait and can
experience the hardware personally&lt;/li&gt;
&lt;li&gt;Devices are expensive: paying premium prices for brand-new devices&lt;/li&gt;
&lt;li&gt;Make devices readily available for rapid testing&lt;/li&gt;
&lt;li&gt;Android fragmentation is an issue; have to target 2.1+ for mass penetration&lt;/li&gt;
&lt;li&gt;Some phones may not implement spec properly; one older Motorola was totally
broken. Was fixed, but you have to be ready to respond to hardware
manufacturers.&lt;/li&gt;
&lt;li&gt;Consumers won't ever do what you expect them to do. Being behind on updates
is a problem.&lt;/li&gt;
&lt;li&gt;Can't count on the same screen resolution; have desktop / tablet / phone
versions&lt;/li&gt;
&lt;/ul&gt;


&lt;blockquote&gt;&lt;p&gt;If you need super blazing-fast peformance, you're going to have to
write native code. Intense apps and light apps are different products for
different platforms.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h4&gt;Discovery and Distrubtion&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;If nobody can find it, your product won't be successful&lt;/li&gt;
&lt;li&gt;Android market getting a lot better&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Things to Avoid&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;App startup sounds - players are probably playign somewhere where they don't
want to be disturbed. Meetings, bathrooms, bed, etc.&lt;/li&gt;
&lt;li&gt;Device orientation matters - portrait / landscape. Portrait's the way to go
to play games during the work day. Discreetness!&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Things to Do&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hands-on Demo. Show users that the app works and is fun.&lt;/li&gt;
&lt;li&gt;Speed matters, especially on mobile devices.&lt;/li&gt;
&lt;li&gt;Launches should take &amp;lt; 10 seconds.&lt;/li&gt;
&lt;li&gt;Touch response speed. Is the interface responsive?&lt;/li&gt;
&lt;li&gt;Scroll speed; no stuttering, no delay.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Other Notes&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mobile metrics suck; cache clears on iOS power cycle, Android
inconsistencies, hard to verify&lt;/li&gt;
&lt;li&gt;Better off rolling your own metric solution&lt;/li&gt;
&lt;li&gt;Work on great relationships with hardware manufacturers to test your app
before new hardware/software releases to reduce surprise problems&lt;/li&gt;
&lt;li&gt;General dev practices; source control, make dev / build / deployment systems
are the same&lt;/li&gt;
&lt;li&gt;Automate build / deployment (css / js minification, for example)&lt;/li&gt;
&lt;li&gt;Set up IE8 / 9 stations&lt;/li&gt;
&lt;li&gt;Cross-training; designers / developers&lt;/li&gt;
&lt;li&gt;Swap devices between people (android, winmo, ios, etc.)&lt;/li&gt;
&lt;li&gt;Work on relationships with other devs who you interface with&lt;/li&gt;
&lt;li&gt;NO ABSOLUTE POSITIONING. You're fired.&lt;/li&gt;
&lt;li&gt;jQuery, WebGL, Canvas slow or non-functional on a lot of devices&lt;/li&gt;
&lt;li&gt;Android shipments have passed iOS shipments. For maximum availability,
support Android, not just iOS.&lt;/li&gt;
&lt;li&gt;Minimize technical risk. Use stable bits of html5. Consider that technologies
may be alienating consumers.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Q &amp;amp; A&lt;/h2&gt;

&lt;p&gt;Can you put perspective on company size of Moblyng, and how that impacts your
decisions? Where would you prioritize with a smaller headcount?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Moblyng has around 35 employees. The key to all of this is the game itself.
At the end of the day, if your game sucks, noone's gonna care. Your team is
initially going to probably be split 2-1; two for the game, one for system
integration. Closer to the ship date, that ratio should split as you
integrate with social systems. After shipment, it will reverse again as you
respond to metrics and game mechancis updates.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;What do you know about iOS vs Android users paying more?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It depends on the game type more than the platform.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Do you still target devices outside of Android and iOS?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;We target devices outside of Android and iOS; the lion's share are in iOS
and Android. Because we're venture-backed, we want to go big, and build games
that work on various devices. The html5-running refrigerator validates our
strategy; will our game work there?&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Focusing on user acquisition, can you speak to the difference in different
advertising schemes?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Part of the reason we target high distrubition is because it's hard to
estimate; it depends on the product.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Can you talk a bit about how the platforms you choose to support influences your
development process? Do you focus on one and expand to other platforms?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The evolution was focusing on phone; and now, it's foucsing on three platforms,
phone, tablet, and desktop. Part of our initial product plan is to mock up UIs
for each platform; user flows are somewhat different between platforms. We look
at everything from day one.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Can you speak to experiences in doing work in-house vs. using contractors?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;A good rule of thumb is: anything you can throw away 90% of, and still be ok,
is a good thing to outsource. Artwork is a good idea. If you say &quot;we need 100
swords&quot;, you may get 10 that are good. Development should happen in-house.
Face-to-face communication is important.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;What would you say to people who want to focus on a specific technology,
instead of taking on more platforms?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;There is a huge market; if you want to focus on a specific technology,
and do it well, then that's a good strategy too. For us, in our history
we've always focused on distribution. Either is a viable business
strategy.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Can you talk about how beta testing has influenced development?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Automated client-side testing is difficult, because resource use for the game
leaves little room. We do automated testing on desktops. Automated testing is
less important than having a good game. Make sure you can make money on a game,
then spend time automating tests.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;Lunch Break&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;http://s1-04.twitpicproxy.com/photos/large/439186499.jpg&quot; alt=&quot;The weather in San Francisco is amazing!&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://j.mp/tUJBw9&quot;&gt;Source: @robhawkes&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Fieldrunners HTML5: Bringing a Hit iOS Game to the Web by Darius Kazemi&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Nov 1, 1:15 - 2:00&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://fieldrunnershtml5.appspot.com/&quot;&gt;FieldRunners&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Just this past summer, Bocoup and Gradient Studios worked with Subatomic
Studios to port their smash-hit iOS tower defense game Fieldrunners to HTML5.
This post mortem will cover porting OpenGL ES to WebGL, using the Web Audio API
for game audio, integrating microtransactions and DLC, and a detailed look at
graphics performance.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Darius Kazemi is a game developer at Bocoup in Bosten; did FB games at Blue Fang,
foudned / ran game analytics middleware Orbus Gameworks, data analyst at Turbine on
MMORPGs.&lt;/p&gt;

&lt;p&gt;Fieldrunners was released oct 2008, one of the first hit iOS games. Much more
polished, higher fidelity than other games. Was ported to Nintendo DSi, PSP,
PS3, etc. Bocoup was contacted to convert it to html5 / Chrome Web Store, which
began July 2011.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Took 12 weeks to port&lt;/li&gt;
&lt;li&gt;3 weeks prepro and testing&lt;/li&gt;
&lt;li&gt;1 programmer, 3 QA, 2 producers&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Technologies Used&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;WebGL&lt;/li&gt;
&lt;li&gt;Web Audio API&lt;/li&gt;
&lt;li&gt;Html5 Audio&lt;/li&gt;
&lt;li&gt;Google In-App Purchaes&lt;/li&gt;
&lt;li&gt;JS&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Target Platforms&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Chrome / Chrome Web Store&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Plan of Attack&lt;/h3&gt;

&lt;p&gt;2-week milestones; built demos at end of each milestone.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Milestone 1

&lt;ul&gt;
&lt;li&gt;Tech Design Doc&lt;/li&gt;
&lt;li&gt;Workflow (check-in flow)&lt;/li&gt;
&lt;li&gt;Production risk assessment&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Milestone 2

&lt;ul&gt;
&lt;li&gt;C++ to JS conversion&lt;/li&gt;
&lt;li&gt;Particle system prototypes

&lt;ul&gt;
&lt;li&gt; high risk - no clue if would destroy framerates until it was built&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Milestone 3 - beta

&lt;ul&gt;
&lt;li&gt;Finish game

&lt;ul&gt;
&lt;li&gt;Optimizations&lt;/li&gt;
&lt;li&gt;Gameplay&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Milestone 4 - beta

&lt;ul&gt;
&lt;li&gt;Monetization&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;First steps: get stuff to render; parse animation files, load images, render
to WebGL; build sprite demo.&lt;/p&gt;

&lt;p&gt;Basic functionality came next; porting tower functionality, entities, particle
system.&lt;/p&gt;

&lt;p&gt;Awesome particle effects made for rare units, like flame towers; was able to
mitigate performance issues by limiting number of special, GPU-heavy units.&lt;/p&gt;

&lt;p&gt;Took demo, packaged it up, cleaned off any private data, and posted it on blog to watch
people's framerates in order to test on different configurations. Used
Google Analytics event API to send framerate data for tracking through Google
Analytics every 8th frame. Allowed comparision between browsers, operating
systems, and other user breakdowns for average user framerate. Ended up gathering
framerate data &lt;em&gt;and&lt;/em&gt; the demo generated buzz about the game.&lt;/p&gt;

&lt;p&gt;The target framerate was 30fps.&lt;/p&gt;

&lt;p&gt;The next step was porting maps, enemies, and menus. Menus accounted for a
majority of the work for this milestone.&lt;/p&gt;

&lt;p&gt;Next was making it feel &quot;webby&quot;; SD / HD modes, detecting WebGL, Web Audio,
window size, and general responsiveness; setting up hosting and caching.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It's  weird to see what happens when the game dev and web dev worlds collide,
and see what sparks happen.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h3&gt;Things Learned&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cached requests dramatically reduced CPU Usage.&lt;/li&gt;
&lt;li&gt;Wrote a Python script for a machine port; a big mess of regexes did a lot of the
work, which was later cleaned up manually.&lt;/li&gt;
&lt;li&gt;Used Web Audio APi for SFX, which was released with Chrome 14. HTML5 Audio was
used for background music. Targetting Chrome specifically made this easy.&lt;/li&gt;
&lt;li&gt;Pack data into arrays where it makes sense.&lt;/li&gt;
&lt;li&gt;Javascript scope was generally a headache; use a good JSHint to help
mitigate issues.&lt;/li&gt;
&lt;li&gt;Fault Tolerance: sometimes http requests fail, resulting in a black screen.
Attempt to load everything up to 3 times; test on a server that behaves in a
faulty way; include heavily delayed responses as well (up to 500ms latency)&lt;/li&gt;
&lt;li&gt;In many situations, execution is dependent on content being loaded, such as
menu screens. Wait for / chain onload events.&lt;/li&gt;
&lt;li&gt;Decision to launch only on Chrome makes sense in order to deliver a
high-quality game in a timely manner. Pick two: browser reach, quality, or
cost.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Q &amp;amp; A&lt;/h3&gt;

&lt;p&gt;Is using WebGL Overkill?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;We used WebGL because it was an easy port; our existing game was built with
OpenGL.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;During the development, did you feel like WebGL was the best choice?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Because we were porting the already aggressively-optimized OpenGL game
built for iOS, the performance was already excellent.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;If you didn't have the original code in WebGL, would you still use WebGL?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It's all about the context of your project; if the original game wasn't in
OpenGL, we would have probably spent time testing canvas, and looking closely
at the markets and seeing what browsers could run WebGL. It would have been a
more difficult decision.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;What three things did you take away, that you wish you knew before you started
the project? Also, what can do we do to not have to compromise so much on the
reach-quality-cost triange?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;We need more compliance between browsers. Features like audio have to conform
to the lowest-common-denominoator between the platforms you're targetting.
It would be great if everyone had the same standards; that was a huge
stumbling block to getting it on more browsers. Having browsers that auto-
update would be useful as well, so you know where users are at. As far as
some takeaways- I wish I knew server management was as time-consuming
as it was for us.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Was the caching issue with game assets, or something else?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Yes, that was about using the appropriate server headers so that I only have
to download if I have to.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Is audio your biggest issue?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It is. We want awesome, synchronous audio in all browsers.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;SONAR - WebGL, JavaScript, and Gaming by Sean Middleditch and Jason Meisel&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;November 1, 2:15 - 3:00&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/110MxOqut_y7KOW1pNwIdcccisIA3ooJwVR-xm-ecuc4/view&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;SONAR is one of the first complete HTML5 games implemented with WebGL,
targeting the Chrome platform via the Chrome Web Store. The first part of this
talk covers the technical details of our development environment, including our
engine architecture and asset pipeline, as well as the problems we ran into
with the HTML5/WebGL platform and the workarounds we deployed. The second part
is a classical post-mortem.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h3&gt;Engine Composition&lt;/h3&gt;

&lt;p&gt;Behavior composition - built so that there were few dependencies between behaviors, and behaviors
could be stacked&lt;/p&gt;

&lt;p&gt;Pass-by-referene - be careful of unintended references, where you may
accidentally modify a value&lt;/p&gt;

&lt;p&gt;Use Chrome Profiler to help find places for optimization, but test
&quot;optimizations&quot; carefully&lt;/p&gt;

&lt;p&gt;Avoid creating temporary variables to reduce garbage collection pressure&lt;/p&gt;

&lt;p&gt;Keep in mind object typing in Javascript; when using the &quot;+&quot; operator, for instance.
&quot;1&quot; + 1 = 11&lt;/p&gt;

&lt;h3&gt;WebGL&lt;/h3&gt;

&lt;p&gt;WebGL doesn't use plugins, mostly cross browser (not IE), hardware
accellerated. SONAR was 2D, wanted to move to 3D, so went with WebGL&lt;/p&gt;

&lt;h4&gt;Pros&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Easy to use&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://learningwebgl.com&quot;&gt;LearningWebGL.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://benvanik.github.com/WebGL-Inspector/&quot;&gt;WebGL Inspector&lt;/a&gt; is awesome&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Cons&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;No DirectX 10+ or OpenGL 3+ features

&lt;ul&gt;
&lt;li&gt;Geometry shaders, etc&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Debugging is difficult

&lt;ul&gt;
&lt;li&gt;Bad error reporting&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Javascript's Design&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Not originally designed for real-time applications&lt;/li&gt;
&lt;li&gt;Needs fast SIMD Math for graphics, physics, and game logic&lt;/li&gt;
&lt;li&gt;Real-time applications

&lt;ul&gt;
&lt;li&gt;Hard; only have 16ms per frame for calculations&lt;/li&gt;
&lt;li&gt;Garbage collector is a killer&lt;/li&gt;
&lt;li&gt;Dynamic VBO updates are inefficient&lt;/li&gt;
&lt;li&gt;Offload as much as possible to the GPU&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Garbage Collector&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Avoid GC at all costs&lt;/li&gt;
&lt;li&gt;No allocation means no collection&lt;/li&gt;
&lt;li&gt;Causes of allocation / GC:

&lt;ul&gt;
&lt;li&gt;&quot;new&quot; is easy to spot and avoid. Don't use it if possible&lt;/li&gt;
&lt;li&gt;Object and Array literals are harder to avoid&lt;/li&gt;
&lt;li&gt;Creating new closures creates a new object; bad in loops&lt;/li&gt;
&lt;li&gt;DOM element manipulation&lt;/li&gt;
&lt;li&gt;Hidden things in 3rd party libs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pre-allocate objects&lt;/li&gt;
&lt;li&gt;Use Chrome debugger to watch memory&lt;/li&gt;
&lt;li&gt;&quot;private globals&quot; by using a consturctor that returns an object which is a
subset of the parent&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Art pipeline&lt;/h3&gt;

&lt;p&gt;Make transition from blender -&gt; game as easy as possible&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blender

&lt;ul&gt;
&lt;li&gt;Pros

&lt;ul&gt;
&lt;li&gt;Free&lt;/li&gt;
&lt;li&gt;Nice animation features&lt;/li&gt;
&lt;li&gt;Extensive Python API&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cons

&lt;ul&gt;
&lt;li&gt;Revision change lead to lack of documentation&lt;/li&gt;
&lt;li&gt;Few pro artists are trained in Blender&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Tried using both JSON and binary formats for files; binary was hard to work with in
Javascript, and thus was not worth it. JSON was good enough and far easier to work
with. Don't bother with binary until you're sending to the GPU.&lt;/p&gt;

&lt;p&gt;Meshes were loaded into vertex buffer objects&lt;/p&gt;

&lt;p&gt;Used animation JSON files for describing animation frames&lt;/p&gt;

&lt;p&gt;Javascript was not integration-friendly; difficult to work with binary files,
poor support for loading files from disk, difficult to get models into engine
for preview&lt;/p&gt;

&lt;p&gt;Should have used an intermediary format (FPX) for 3D models like, so that artists
were not locked down to using Blender&lt;/p&gt;

&lt;h3&gt;html5, CSS, Canvas for 2D games&lt;/h3&gt;

&lt;p&gt;Assets need to be built for menus, debugging, editors, etc. CSS3 can be used
for advanced animations for interfaces.&lt;/p&gt;

&lt;p&gt;Rendering text in webgl is tricky; html overlays make it easy. Composite WebGL,
html, and canvas together in layers.&lt;/p&gt;

&lt;p&gt;Note: be wary of alpha on your webgl canvas. Also, moving 2D elements on top
of WebGL can cause framerates to drop. There are simple fixes.&lt;/p&gt;

&lt;h3&gt;Editor / Content Creation Pipeline&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tile-based editor&lt;/li&gt;
&lt;li&gt;Line-based doors, glass&lt;/li&gt;
&lt;li&gt;Triggger zones&lt;/li&gt;
&lt;li&gt;Entitiy placement&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Having a seperate editor from the game made testing slow; an editor should have
been built into the game.&lt;/p&gt;

&lt;h4&gt;Technology&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Canvas for tiles&lt;/li&gt;
&lt;li&gt;jQuery for UI controls&lt;/li&gt;
&lt;li&gt;Seperate app from the game&lt;/li&gt;
&lt;li&gt;Custom scripting

&lt;ul&gt;
&lt;li&gt;Allowing javascript in game opens security (XSS) issues; better to hack
together something&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Web APIs for games&lt;/h3&gt;

&lt;p&gt;APIs that are on their way that are helpful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web Audio

&lt;ul&gt;
&lt;li&gt;Chorus effects, 3d positioning, no flash&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html&quot;&gt;w3 audio spec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;FileSystem

&lt;ul&gt;
&lt;li&gt;Store files locally, no cookies or lost data&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ww.html5rocks.com/en/tutorials/file/filesystem/&quot;&gt;Filesystem spec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MouseLock

&lt;ul&gt;
&lt;li&gt;Mandatory for FPS and useful for action games&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://chromestory.com/2011/10/developer-news-mouse-lock-api/&quot;&gt;Mouselock api&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Joystick

&lt;ul&gt;
&lt;li&gt;Gamepad support&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.chromium.org/developers/joystick-api&quot;&gt;Chromium Joystick api&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Q &amp;amp; A&lt;/h3&gt;

&lt;p&gt;What gave you the inspiration to make it a papercraft visually-styled game?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It actually started as a graphics bug, where our charaters were flatfaced,
and our designers really liked the idea.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Have you actually cut out any papercraft models?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;We considered it, but we haven't had the chance.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;Cross Platform Game Programming with PlayN by Lilli Thompson&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;November 1, 3:15 - 4:00&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://code.google.com/p/playn/&quot;&gt;PlayN&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Began as console developer, now a software engineer with chrome and PlayN
advocate&lt;/p&gt;

&lt;p&gt;PlayN allows you to compile out versions of your single-codebase game onto
multiple platforms: write in GWT / Java, export to html5, flash, and Android.
Used to be called &quot;ForPlay&quot;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;--ed: You can guess why that got changed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Angry Birds was written with PlayN; announced with &quot;Kick Ass Game Programming
With GWT&quot; talk&lt;/p&gt;

&lt;p&gt;Tries to solve the problem of picking a platform to port to; does the porting
for you. Solves problems with html5 non-compliance.&lt;/p&gt;

&lt;p&gt;GWT is a framework that focuses on removing unused code, doing compile-time
checking of syntax, inlines, optimizaes, obfuscates output, and adjusts
the code for browser quirks.&lt;/p&gt;

&lt;p&gt;Uses whatever's best available: WebGL, Canvas2D, CSS 3; also abstracts audio.&lt;/p&gt;

&lt;p&gt;&quot;Service Provider Interface&quot; structure - core platform, with platform-specific
implementation modules. PlayN is not a game engine - it is a platform
abstraction. You add game enginy things on top, such as Box2D. Components
include the game loop, I/O system, and Asset Management.&lt;/p&gt;

&lt;p&gt;Build game engine by extending PlayN-provided interface, which gives you
access to the game loop / i/o system / asset management structures.&lt;/p&gt;

&lt;p&gt;PlayN provides a way to access the local device for its resolution:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;graphics().setSize(
  graphics().screenWidth()

  graphics().screenHeight()
)
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Compositing Layers&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Layer

&lt;ul&gt;
&lt;li&gt;SurfaceLayer&lt;/li&gt;
&lt;li&gt;ImageLayer&lt;/li&gt;
&lt;li&gt;CanvasLayer&lt;/li&gt;
&lt;li&gt;GroupLayer

&lt;ul&gt;
&lt;li&gt;1-n child layers&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;ImageLayer&lt;/h4&gt;

&lt;p&gt;High performance, render images and forget. Good for static
images like UI, logos, overlays. Doesn't get added to scene graph.&lt;/p&gt;

&lt;h4&gt;CanvasLayer&lt;/h4&gt;

&lt;p&gt;Mirrors much of the html5 canvas api. Procedural circles, lines, points, etc.
Slow, but can be optimized; make as small as possible, translate in place.&lt;/p&gt;

&lt;h4&gt;GroupLayer&lt;/h4&gt;

&lt;p&gt;Groups layers.&lt;/p&gt;

&lt;h3&gt;I/O Abstractions&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pointer

&lt;ul&gt;
&lt;li&gt;General, non-specific input device; most widely available&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mouse&lt;/li&gt;
&lt;li&gt;Touch&lt;/li&gt;
&lt;li&gt;Keyboard&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Cross-playform input: support things like touch-based zoom where available&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if(platformType().equals(Platform.Type.ANDROID){
    touch().setListener( ... )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Asset Management&lt;/h3&gt;

&lt;p&gt;Resource management through the asset manager:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Image getImage(String path)
Sound getSound(String path)
// etc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Sound abstraction: html5 version uses web audio api where avilable via
gwt-voices; falls back to flash.&lt;/p&gt;

&lt;h3&gt;Data Storage&lt;/h3&gt;

&lt;p&gt;Android local store, html5 local storage, whatever's available. Simple API that
uses calls like &lt;code&gt;setItem(key, value)&lt;/code&gt;, &lt;code&gt;removeItem(key)&lt;/code&gt;, &lt;code&gt;getItem(key)&lt;/code&gt;.
Includes JSON abstraction for storing / retrieving data.&lt;/p&gt;

&lt;h3&gt;Compiling to platforms&lt;/h3&gt;

&lt;p&gt;To compile, extend the class you're porting to, and use the platform-specific
core objects. Centeral codebase lives seperately from platform-specific code,
which passes in objects like HtmlStorage or FlashAudio as interfaces to the
game loop.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;public class MyGameHtml extends HtmlGame&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;PlayN for the Future&lt;/h3&gt;

&lt;p&gt;Framework allows easy extension to new platforms. Takes any Java-based library
and can compile it down to all platforms.&lt;/p&gt;

&lt;p&gt;More native input abstractions, better asset managmeent and audio featutes,
integration with other products- in-app payments, other software ecosystems&lt;/p&gt;

&lt;h3&gt;Q &amp;amp; A&lt;/h3&gt;

&lt;p&gt;What happens when you don't support a particular piece of functionality?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It's open source, so if it isn't working for you, consider adding the
functionality; that's available to you. Another option is to compile
another project that imports the extra code.&quot;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;What's compelling about this is that Java's a nice language. How do you do the
compilation to, say, Flash?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It's different on each platform; it translates to legible actionscript, then
compiles a swf. It compiles into obfuscated Javascript, so it doesn't work
that way always.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;What if your phone doesn't have a GPU?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;We don't have set requirements; our default path is to compile to Android
OpenGL. Android Canvas is available, but not as fast; I'm not sure if that
is an option during Android compilation.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;From Apple Store to CWS by Miguel Angel Pastor&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Nov 1, 4:15 - 5:00&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.mandreel.com/downloads/From_Apple_Store_to_Chrome_Web_Store.pdf&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;This talk covers our experience porting more than 7 iOS games to the Chrome
Web Store. Topics discussed include: using Mandreel to convert C++ into
JavaScript, using Google App Engine to host applications, saving data in the
cloud, implementing IAP and Facebook Connect, differences between Firefox and
Chrome, dealing with huge JavaScript files, and application caching.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Co-founder of Onan Games; small company (5 people, all engineers, no designers)&lt;/p&gt;

&lt;p&gt;Began porting iOS games to html5 using a framework called andreel, which
converts C++ / Objective C to html5 and flash. Targets all browsers, and the
conversion process takes only a few days.&lt;/p&gt;

&lt;p&gt;Published games (available in chrome web store)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/cknghehebaconkajgiobncfleofebcog&quot;&gt;Monter Dash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/dogopgiahgigenndhchnnahmibmjghbn&quot;&gt;Great Little War Game&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/ciamkmigckbgfajcieiflmkedohjjohh&quot;&gt;Gun Bros&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/ajplbhgiljhgjomddcnchfoimakkbmkc&quot;&gt;Big Time Gangsta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/meklndaflopgghbomkdpofehonfclipi&quot;&gt;Contract Killer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/lgoenphchcpbgebeednhcdmepodabeig&quot;&gt;Mad Skills Motocross&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/pabppflkalbniedjechdomdnofnogcfh&quot;&gt;Bug Village&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/epbeobdmeddlnkokfiaijkfabecpmifa&quot;&gt;A Space Shooter for free&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/efjdaaaepgacfpadimoljoefkmnnkpkm&quot;&gt;Kroll&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Chrome web store options: packaged application, website&lt;/p&gt;

&lt;p&gt;Chrome default max size: 5MB; installed apps have unlimitied storage&lt;/p&gt;

&lt;p&gt;Can do synchronous loading with XHR&lt;/p&gt;

&lt;h3&gt;Application Manifest Cache&lt;/h3&gt;

&lt;p&gt;The manifest cache file lists resources for the app to load. Progress event is
available to update user to download status for larger downloads.&lt;/p&gt;

&lt;p&gt;To update new files, modify the mainfest cache file; update verion number.
This reloads all the files.&lt;/p&gt;

&lt;p&gt;App engine limits max file size to 32MB, so large files must be split.&lt;/p&gt;

&lt;h3&gt;FileSystem API&lt;/h3&gt;

&lt;p&gt;Only works in chrome; allows filesystem access within a sandbox. Request amount
of storage, which the user can deny / allow, and allows you to create files
and load resources asynchronously.&lt;/p&gt;

&lt;p&gt;For performance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pack files into one large file for faster downloads&lt;/li&gt;
&lt;li&gt;Compress with LZMA&lt;/li&gt;
&lt;li&gt;Use XHR async loading&lt;/li&gt;
&lt;li&gt;Store uncompressed data in FileSystem API&lt;/li&gt;
&lt;li&gt;Keep uncompressed data in memory (not feasible for large games)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;iOS games store game progess in internal memory; html5 apps can use
localstorage. Another option is to use XHR to store progress remotely.&lt;/p&gt;

&lt;p&gt;Can generate JS larger than 10mb; AppEngine can only handle 1mb. Load
compressed JS via XHR.&lt;/p&gt;

&lt;p&gt;Mandreel supports OpenGL ES 1.1, PVR textures; does not have fixed pipeline
support. PNGs are best for textures.&lt;/p&gt;

&lt;p&gt;In-app payments can be done through google IAP API&lt;/p&gt;

&lt;p&gt;iOS uses OpenAL for sound. Started trying to load sounds with the html5 audio
tag, but it doesn't work well with many simultaneous sounds. Web Audio API
gives needed support. Flash is a fallback.&lt;/p&gt;

&lt;p&gt;App engine issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static files can't add custom headers&lt;/li&gt;
&lt;li&gt;Max application file size is 150MB (use blobs)

&lt;ul&gt;
&lt;li&gt;Check for &quot;206&quot; response code when pulling blobs&lt;/li&gt;
&lt;li&gt;Audio tags won't work properly&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Q &amp;amp; A&lt;/h3&gt;

&lt;p&gt;With the issues you've had, if you went back in time, woudl you do it again?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Absolutely.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;Extreme Mobile HTML5 Graphics Performance by Sam Abadir&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;November 1, 5:05 - 5:25&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;This short-form talk will discuss how to use hardware accelerated
DirectCanvas to take games from 2 frames per second to 30. This will show you
how to use DirectCanvas while running on mobile and deploy the same code to
desktop browsers using the standard HTML5 Canvas.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Sponsored by &lt;a href=&quot;http://appmobi.com&quot;&gt;AppMobi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AppMobi is an alternate mobile browser that provides better canvas, sound, and
other gamey things. Supports ImpactJS and PhoneGap, and apps can be packaged
with AppMobi to provide things like phone vibration.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;html5 was built for desktop, but mobile is more important&lt;/li&gt;
&lt;li&gt;DirectCanvas is an html5 stop-gap&lt;/li&gt;
&lt;li&gt;The DOM is your enemy; gets in the way of game rendering&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Found that DirectCanvas had an average performance increase of 500% vs.
normal canvas by bypassing the DOM with DirectCanvas&lt;/p&gt;

&lt;h3&gt;Using DirectCanvas&lt;/h3&gt;

&lt;p&gt;Seperate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DOM context (menuing, page layout)&lt;/li&gt;
&lt;li&gt;DirectCanvas context (gameplay renddering)&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Communicate between contexts AppMobi.canvas.execute() or AppMobi.view.execute()&lt;/p&gt;

&lt;p&gt;DirectCanvas renders under the dom context, so dom shouldn't have background
images, colors, etc.&lt;/p&gt;

&lt;h3&gt;Sound&lt;/h3&gt;

&lt;p&gt;Supports multi-channel sound&lt;/p&gt;

&lt;h2&gt;The End of Day 1&lt;/h2&gt;

&lt;p&gt;Day 1 of the conference is over; time to head next door for Microsoft-sponsored open bar.&lt;/p&gt;

&lt;h2&gt;Day 2 - November 2, 2011&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://thejacklawson.com/2011/11/new-game-conf-liveblog/index.html&quot;&gt;Day 1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a live blog for the second official day of
&lt;a href=&quot;http://www.newgameconf.com&quot;&gt;New Game Conference&lt;/a&gt;. I'll keep quick notes during
the presentations, and clean up grammar / confusing structures during breaks.
The Q &amp;amp; A sections are paraphrased. Any quotes will be signified as such.
Please leave corrections and requests for clarification in the comments here.&lt;/p&gt;

&lt;p&gt;Also check out #ngc11 and #bbg on irc.freenode.net&lt;/p&gt;

&lt;p&gt;Also also check out &lt;a href=&quot;http://newgameconf.qotr.net/Quotes/List/&quot;&gt;New Game Conf Quotes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've used images that people post to Twitter; &lt;em&gt;none of them are mine&lt;/em&gt;. I've used
small versions of the images and linked to the original posting.&lt;/p&gt;

&lt;h2&gt;Notes on Chromebooks&lt;/h2&gt;

&lt;p&gt;Non-US residents will pick up physical devices. US residents will receive
vouchers to order Chromebooks, which will be shipped to your house.&lt;/p&gt;

&lt;h2&gt;Keynote by Paul Bakaus&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Nov 1, 9:00 - 9:45&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;CEO of Zynga Germany, creator of jQuery UI, creator of Aves Engine; heads
html5 initiatives in Zynga.&lt;/p&gt;

&lt;p&gt;Zynga is the world's leading social develop; 232M monthly active users. Played
in over 166 countries in 17 languages.&lt;/p&gt;

&lt;p&gt;Paul started because there were no html5 game engines; nothing suited his
needs, so he went out to create an engine.&lt;/p&gt;

&lt;p&gt;Problem: game developers are way faster than browser developers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;html5 audio: no common codecs across browsers, audio playback is restricted
differently across browsers (some don't have multichannel, some restrict
what can start sounds to user actions)&lt;/li&gt;
&lt;li&gt;Device apis still missing: camera, file system, etc. Google is working
towards access with latest version of Android. 20 device APIs available for
mobile safari, 1500 for native apps.&lt;/li&gt;
&lt;li&gt;Debugging is difficult on mobile; good tools exist on desktop, especially
webkit's debugger&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Canvas, right now, is really only being used for charts and graphs. It isn't
applied to much more content; many games in production don't use canvas.&lt;/p&gt;

&lt;p&gt;WebGL demos look like old games; partially because hard computation must be
done on CPU, in javascript. Another problem is that WebGL is a totally new
language to be picked up; there's only really one big WebGL library,
&lt;a href=&quot;https://github.com/mrdoob/three.js/&quot;&gt;three.js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Games that are too realistic (3d) have trouble appealing to the wide audience
that 2d games do.&lt;/p&gt;

&lt;p&gt;New good things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebSockets in iOS&lt;/li&gt;
&lt;li&gt;Hardware-accelerated canvas&lt;/li&gt;
&lt;li&gt;&lt;code&gt;webkit-overflow-scrolling: touch&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Theory 1: &quot;good devs&quot; don't want to learn html5
Theory 2: Companes are scared to ditch IE &amp;lt; 9 from their supported platforms&lt;/p&gt;

&lt;p&gt;It isn't good to give people what they want on older browsers: they have no
incentive to upgrade, and thus we are stuck with old, dead tech.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Try to come up with great new stuff that only works in modern browsers&lt;/p&gt;

&lt;p&gt;Traditional game devs get people to buy new hardware, and web devs can't
even get users to install free software.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Reminder: html5 was created as a markup language to create documents.
Not games. The W3C and WHATWG historically had no members from gaming
companies.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Web devs are seldom good game devs, and vice versa&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;html5 gaming is very painful but very fun.&lt;/p&gt;

&lt;p&gt;What we need most is creativity; we have capabilities and need to stop being
lazy. We need AAA game devs as well to not just port games, but invent new
full-blown titles with html5.&lt;/p&gt;

&lt;p&gt;Zynga's mission: connecting th eworld through games&lt;/p&gt;

&lt;p&gt;Driving:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;W3C Participation&lt;/li&gt;
&lt;li&gt;Dialog with browsers&lt;/li&gt;
&lt;li&gt;Open-sourcing things (&lt;a href=&quot;https://github.com/zynga&quot;&gt;github&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Open Source&lt;/h3&gt;

&lt;h4&gt;&lt;a href=&quot;https://github.com/zynga/viewporter&quot;&gt;Viewporter&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Triggers native resolution whenever it can, and watches device orientation.
Solves obvious-sounding but difficult problems with handling resolution /
orientation. Handles dpi as well. Available for iOS and Android.&lt;/p&gt;

&lt;h4&gt;&lt;a href=&quot;https://github.com/zynga/scroller&quot;&gt;Scroller&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Handles panning (not scrolling) for html and canvas. 100% event-driven; only
logic, does not apply any translations. Supports DOM, Canvas, SVG, and WebGL.
Scrolling, zooming, snapping, and more. Extremely performant.&lt;/p&gt;

&lt;h4&gt;&lt;a href=&quot;https://github.com/zynga/jukebox&quot;&gt;Jukebox&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Jukebox handles audio by dealing with sound sprites simple. Works around iOS
and multi-channel constraints; can pause / resume background audio if there
is a cosntraint around number of channels. Used in Zynga's production code&lt;/p&gt;

&lt;p&gt;You have to be agile about development; techniques that helped performance
years ago no longer do. For example, direct DOM manip is now faster than
innerHTML, and inline styles don't cuser performance penalties.&lt;/p&gt;

&lt;p&gt;Goal: hot swapping webgl / canvas / html&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Let's work together to make 2012 the year of html5 gaming.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;Diving Deep into Canvas by Grant Skinner&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;November 2, 10:00 - 10:45&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://gskinner.com/talks&quot;&gt;slides&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dev shop was originally considered a flash development shop; was approached
by Microsoft to see if they could build a fully html5 game for the IE9 launch.
Built Priates Love Daisies, and had to build a lot of their own tools using
canvas.&lt;/p&gt;

&lt;p&gt;Talk will be about Canvs, and specifically 2D Context, and challenges and
solutions; also, open-sourced lib &lt;a href=&quot;http://easeljs.com/&quot;&gt;EaselJS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Canvas: html5 element specifically for dynamic drawing with multiple contexts.&lt;/p&gt;

&lt;p&gt;3D context: WebGL
2D Context: vector, bitmap, and pixel graphics&lt;/p&gt;

&lt;p&gt;Canvas is broadly available (~80%), including mobile; consistently implemented,
even between browsers. Easy to learn; increasingly performant with hardware
acceleration.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://desmond.yfrog.com/Himg863/scaled.php?tn=0&amp;amp;server=863&amp;amp;filename=2v8ts.jpg&amp;amp;xsize=480&amp;amp;ysize=480&quot; title=&quot;Grant Skinner&quot; alt=&quot;Grant Skinner&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://j.mp/uHmQ6i&quot;&gt;source: @ajacksified&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Canvas Libraries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://processingjs.org/&quot;&gt;Processing.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mrdoob/three.js/&quot;&gt;Three.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://craftyjs.com&quot;&gt;Crafty.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://easeljs.com/&quot;&gt;EaselJS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;EaselJS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DisplayObject

&lt;ul&gt;
&lt;li&gt;Shape&lt;/li&gt;
&lt;li&gt;Graphic&lt;/li&gt;
&lt;li&gt;Bitmap&lt;/li&gt;
&lt;li&gt;Bitmapsequence&lt;/li&gt;
&lt;li&gt;Text&lt;/li&gt;
&lt;li&gt;Container&lt;/li&gt;
&lt;li&gt;Stage&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DOMElement&lt;/li&gt;
&lt;li&gt;Ticker&lt;/li&gt;
&lt;li&gt;..more&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;EaselJS isn't a game engine as much as a graphics library. Built to have good
docs, as a generic visual-work-library, modular architecture for extended
functionality, performant with minimal overhead, and open-sourced on Github
with an MIT license&lt;/p&gt;

&lt;p&gt;Canvas does not have anything for motion tracking. Some libs ignore mouse
movement, use tiles, or overlay DOM elements. EaselJS tracks specific pixels
for accurate movement. This is done by transforming everything to a flat system
and manipulating pixel matrices.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;daisy.onPress = function(evt) {
  evt.target.alpha = 0.5;
  evt.onMouseMove = function(evt){ ... }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Text in canvas is difficult; but, it can be overlaid with DOM elements which
are good at handling text. The UI can be built in the DOM, the game engine
in Canvas.&lt;/p&gt;

&lt;p&gt;CSS transforms allow the same math to transform the DOM that transforms the
Canvas.&lt;/p&gt;

&lt;p&gt;Integrating web technologies, like DOM and web APIs, allow you to add more than
what is traditionally possible with games.&lt;/p&gt;

&lt;p&gt;Canvas performance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redraw only when / what is needed.&lt;/li&gt;
&lt;li&gt;Choose a reasonable framerate. Consistency is more important than speed.&lt;/li&gt;
&lt;li&gt;Minimize vector and text draws&lt;/li&gt;
&lt;li&gt;Draw to offscreen canvases to cache, then pull in the static canvases into
the main game canvas&lt;/li&gt;
&lt;li&gt;Reduce total pixel count&lt;/li&gt;
&lt;li&gt;Shadows are evil&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;img src=&quot;http://desmond.yfrog.com/Himg876/scaled.php?tn=0&amp;amp;server=876&amp;amp;filename=5w7v.jpg&amp;amp;xsize=640&amp;amp;ysize=640&quot; title=&quot;Canvas Buffer Demo&quot; alt=&quot;Canvas Buffer Demo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://j.mp/tFT3IS&quot;&gt;source: @ajacksified&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Desktop: Safari and IE9 have the best canvas performance; Chrome 14+ has
hardware rendering, FireFox catching up&lt;/p&gt;

&lt;p&gt;Mobile: iOS5 / iPad 2 is, by a huge margin, the best. iOS 4, Galaxy Tab 10.1,
Playbook is far slower.&lt;/p&gt;

&lt;p&gt;Oft-requested features for EaselJS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Draw boundaries&lt;/li&gt;
&lt;li&gt;Fast shaders for canvas(see &lt;a href=&quot;http://www.adobe.com/devnet/html5/articles/css-shaders.html&quot;&gt;css3 shaders&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;quads / perspective / 2.5D (some kind of perspective distortion)&lt;/li&gt;
&lt;li&gt;Drawing DOM elements&lt;/li&gt;
&lt;li&gt;State introspection&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Tools for canvas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sprite sheets: Zoe, Flash Pro &quot;Reuben&quot;, SWFSheet&lt;/li&gt;
&lt;li&gt;Profiling: browser dev tools, system gauges&lt;/li&gt;
&lt;li&gt;EaselJS Export panel (export from Flash to EaselJS / Canvas)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Many display options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SVG/DOM: ill-suited for interactive, performance-depenent games&lt;/li&gt;
&lt;li&gt;WebGL: Fast, but new, and steep learning curve&lt;/li&gt;
&lt;li&gt;Canvas: Ubiqutious, consistent, but lacks tools&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Future vision: non-display-dependent. Single API for WebGL, Canvas, DOM.&lt;/p&gt;

&lt;h3&gt;Q &amp;amp; A&lt;/h3&gt;

&lt;p&gt;How are you driving all of the animation?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;You have three options; setinterval, settimeout, and requestanimationframe.
We use settimeout or requestanimationframe; RAF is usually said to be more
performant, but we've seen the opposite.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;The State of HTML5 Games in Asia by Robert Van Os &amp;amp; Chen Qi&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;November 2, 11:00 - 11:45&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;This talk will discuss markets in China, Japan, and South Korea. Spil Games
is the first company to launch HTML5 mobile games in China and Japan, and we
have extensive experience with daily operations and customer feedback. We'll
discuss how HTML5 games make money in Asia -- and yes, they do make money! We
focus on mobile, and we'll cover lessons learned from HTML5 mobile games.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;http://desmond.yfrog.com/Himg861/scaled.php?tn=0&amp;amp;server=861&amp;amp;filename=83858346.jpg&amp;amp;xsize=640&amp;amp;ysize=640&quot; alt=&quot;Robert Van Os, Chen Qi&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://j.mp/traja9&quot;&gt;source: @ajacksified&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Traditional game stores, iOS market, Android market limits distribution. html5
provides distribution opportunities. Users don't care what technology something
is built in; they just want to play.&lt;/p&gt;

&lt;p&gt;Company overview for &lt;a href=&quot;http://www.spilgames.com/&quot;&gt;spilgames&lt;/a&gt;: spilgames is a
large-scale distribution platform with a focus on age-based audience;
teens, girls, and family. 140M uniqe visitors a month, 19 different languages.
Targets localization as part of the core game experience.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;85M of the 140M users are female&lt;/li&gt;
&lt;li&gt;2.5B page views / month&lt;/li&gt;
&lt;li&gt;In companies:

&lt;ul&gt;
&lt;li&gt;#1 in Brazil, Mexico, Indonesia, Argentina, Poland, Italy, Columbia,
and Sweden&lt;/li&gt;
&lt;li&gt;#1 in US for female game players&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Split fairly evenly across continents&lt;/li&gt;
&lt;li&gt;First company with html5 mobile game portal&lt;/li&gt;
&lt;li&gt;Not a social network - socially available. Share high scores, achievements,
etc across social networks&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Asia&lt;/h3&gt;

&lt;p&gt;Focuses heavily on html5 on mobile. Two parts: game portal, and distribution
network. Partners with local social networks like Baidu, Tencent. This allows
for a much larger distribution. Was the first html5 mobile game portal in China
and the first html5 game application in Mixi, the largest social network in
Japan.&lt;/p&gt;

&lt;p&gt;Co-founded html5 dev community in China; 40k developers&lt;/p&gt;

&lt;p&gt;Huge number of mobile users in China;: US has 295M mobile users; China has 900M&lt;/p&gt;

&lt;p&gt;China has much smaller 3G penetration; Japan and South Korea has good penetration
(Japan about the same as the US)&lt;/p&gt;

&lt;p&gt;Smartphones rapidly increasing in South Korea (40% of phones), Japan (10%)
and China (4%). In 2015, 200M of phones will be smartphones. Japan will have
over 76M. This means a &lt;em&gt;huge&lt;/em&gt; potential market.&lt;/p&gt;

&lt;p&gt;Interacting with local social networks is crucial for html5 games; Facebook is
very unpopular in Asian countries (blocked in China); small userbase in Japan,
South Korea, etc. The top local social networks support html5 apps.&lt;/p&gt;

&lt;p&gt;From 2005 to 2009, microtransactions grew heavily as compared to purchasing
software up-front. The market for virtual items is huge; USD$1.3B in sales
on the DeNA network, $1-2B on Facebook, $0.6-1B on Zynga.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;In Japan, there are more mobile users than PC users.&lt;/p&gt;

&lt;p&gt;ARPU in Japan for DeNA network is 15x that of Zynga. Wow. #ngc11
&lt;a href=&quot;http://j.mp/sGbryd&quot;&gt;source: @kentquirk&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Regulation can be an issue - China has the &quot;Great Firewall&quot;, which can make
using cloud services difficult (or impossible.) You have to host your game from
within China, with regulated licensing. Most sites are blocked by default in
China; you have to have a license number on your website.&lt;/p&gt;

&lt;p&gt;In order to deal with Korea, you also have to conform to Japanese regulations
and deal with strict content regulations.&lt;/p&gt;

&lt;p&gt;You can use a communication service, but it can cause communication issues;
speed of development and communication can become an issue. It's easier to
have a local presence.&lt;/p&gt;

&lt;h3&gt;Best Practices&lt;/h3&gt;

&lt;h4&gt;App Discovery&lt;/h4&gt;

&lt;blockquote&gt;&lt;p&gt;Don't just bet on an app store; be everywhere!&lt;/p&gt;&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Only have one substantial Android market (the Google market; alternatives
such as the Amazon market exists, but splintering is an issue)&lt;/li&gt;
&lt;li&gt;Huge Android market fragmentation&lt;/li&gt;
&lt;li&gt;Apple has substantial userbase&lt;/li&gt;
&lt;li&gt;Restricted open web; business licensing, government restrictions; many users
use start pages to begin with. Advertising can be done on these start pages,
but cost ramps up heavily over time. This is why owning your own portal is
key to success.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;em&gt;--ed: like old AOL's start page?&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;Payments&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Western: local payment methods, mobile payment methods like SMS, Offer-based
to target groups&lt;/li&gt;
&lt;li&gt;Eastern: Credit cards unpopular (but rising); SMS payments popular&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Audience&lt;/h4&gt;

&lt;p&gt;Localizing is more than just language; but also cultural differences.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;In China, users may want to harvest rice; in Ireland, users may harvest
potatoes&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Keep time zones in mind; peak hours for users is different. 4pm in China, where
users play at the end of the work day; 7pm in Japan, where users play once they
get home.&lt;/p&gt;

&lt;p&gt;In Western cultures, you can usually get away with games in English in
non-English countries (France, Spain, etc.) because most people understand
English. Language is much more fragmented in Eastern markets.&lt;/p&gt;

&lt;h3&gt;Tips&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Compatibility issues exist, but as Android upgrades come along, it gets much
better (specifically with Android 2.3.&lt;/li&gt;
&lt;li&gt;Lots of difference between iOS and Android; find a balance between
functionality and user experience. For example, multi-touch in older versions
of Android isn't available.&lt;/li&gt;
&lt;li&gt;Android marketshare in Korea is 70% (10M); smaller but growing in Japan and China
(5% [5M] and 2% [20M])&lt;/li&gt;
&lt;li&gt;Chinese and Japanese users are used to playing games in portrait mode&lt;/li&gt;
&lt;li&gt;Many users play games as convenient, with one hand (on the train, etc.)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Still some challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;html5 audio&lt;/li&gt;
&lt;li&gt;canvas performance&lt;/li&gt;
&lt;li&gt;saving data traffic for users&lt;/li&gt;
&lt;li&gt;browser adoption is high, but user adoption of new browsers is low&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;spilgames Offerings&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Global infastructure platform&lt;/li&gt;
&lt;li&gt;Feature detection API&lt;/li&gt;
&lt;li&gt;Localization support&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Payments&lt;/li&gt;
&lt;li&gt;Hosting&lt;/li&gt;
&lt;li&gt;Social graph (Friends, events, notifications); can cross-post across social
networks&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Q &amp;amp; A&lt;/h3&gt;

&lt;p&gt;In 2011, are you seeing more Facebook penetration (in comparison to existing
networks like Mixi?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;No. It's not taking over nearly as rapidly as other networks we've seen.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;Lunch!&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Nov 2, 11:45 - 1:00&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://desmond.yfrog.com/Himg860/scaled.php?tn=0&amp;amp;server=860&amp;amp;filename=jmng.jpg&amp;amp;xsize=640&amp;amp;ysize=640&quot; title=&quot;Lunch&quot; alt=&quot;Lunch&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://j.mp/vvCaSV&quot;&gt;source: @ajacksified&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Porting Emberwind to HTML5 by Erik Moller&lt;/h2&gt;

&lt;blockquote&gt;&lt;p&gt;Emberwind is a platform game published on Win/Mac/iOS. This talk is the story
of how Erik Möller took its 100,000 line C++ code-base and turned it into an
HTML5 game running on desktop, mobile and even TVs!&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://t.co/q1qMP1Yd&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://operasoftware.github.com/Emberwind/&quot;&gt;Emberwind html5 (Github Pages)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/operasoftware/Emberwind&quot;&gt;Emberwind (Github source)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.timetrap.se/emberwind/index.php&quot;&gt;Emberwind home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://my.opera.com/emoller/blog/&quot;&gt;Erik's blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;img src=&quot;http://desmond.yfrog.com/Himg739/scaled.php?tn=0&amp;amp;server=739&amp;amp;filename=vuomd.jpg&amp;amp;xsize=640&amp;amp;ysize=640&quot; title=&quot;Erik Moller&quot; alt=&quot;Erik Moller&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://j.mp/s8BrS7&quot;&gt;source: @ajacksified&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twitter poll, checking who here is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traditional Console Developers (a few)&lt;/li&gt;
&lt;li&gt;Traditional PC Game Developers (a few more)&lt;/li&gt;
&lt;li&gt;Traditional Web Developers (most)&lt;/li&gt;
&lt;/ul&gt;


&lt;blockquote&gt;&lt;p&gt;I used to work at this company where we had this one web developer, and we
used to laugh at him.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Web developement was a totally different set of skills from game development.&lt;/p&gt;

&lt;p&gt;AAA titles saturate both GPU and CPU; unlikely to see AAA titles in html5
soon due to the level of abstraction for html5.&lt;/p&gt;

&lt;p&gt;Goal was to convert Emberwind to html5, totally flash-free. It's valuable for
Opera to develop an application with their own technology, just like a game
console company would never build a console without testing it out with their
own software. It also helps find bugs, and determine what needs to be
optimized.&lt;/p&gt;

&lt;p&gt;Emberwind has been tested in IE, FF, Chrome, Safari, and Opera;  on mobile,
Opera, Android browser, and Safari. It's open source on Github.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://desmond.yfrog.com/Himg741/scaled.php?tn=0&amp;amp;server=741&amp;amp;filename=h97iqu.jpg&amp;amp;xsize=640&amp;amp;ysize=640&quot; title=&quot;Emberwind Demo&quot; alt=&quot;Emberwind Demo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Emberwind has an in-game switch between canvas and WebGL, allowing testing
either easily. Canvas renders in an off-screen buffer to emulate some WebGL
features, so performance suffers somewhat.&lt;/p&gt;

&lt;p&gt;Emberwind has 8 audio channels. To make this flash free, sound sprites were
used with multiple audio tags. Worked for Emberwind, which was fairly simple;
looking forward to Audio API.&lt;/p&gt;

&lt;p&gt;Built-in debugger that shows canvas layers being built one-at-a-time. WebGL was
far more efficient than Canvas, and can draw most of the screen in a single
draw call; this was made easier by using texture atlases.&lt;/p&gt;

&lt;h3&gt;Lessons Learned&lt;/h3&gt;

&lt;p&gt;Porting javascript was easy.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;--ed: probably because Javacript rocks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Time invested in tools for the rest of the team was a good investment. The
designer was able to go away for a couple weeks, and return with a mostly-
completed game. But do this pragmatically - particle effects were easier to
hardcode.&lt;/p&gt;

&lt;p&gt;Reduce draw cals and state changes as much as possible.&lt;/p&gt;

&lt;p&gt;Cheat where possible: all that matters is the end user experience. Estimate
physics using spheres for all the things. (Assume a spherical cow...)&lt;/p&gt;

&lt;p&gt;Texture atlasses == CSS Sprites&lt;/p&gt;

&lt;h3&gt;New Demo: 'Odin'&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;WebGL game with lightmaps, normal maps, animations, skinning, shadow maps,
and shader preprocessors&lt;/li&gt;
&lt;li&gt;Works with COLLADA source assets&lt;/li&gt;
&lt;li&gt;Open source on &lt;a href=&quot;http://github.com/operasoftware/Odin&quot;&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;em&gt;-- ed: the pictures don't do it justice; very smooth-looking 3D asset loading
and editing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://desmond.yfrog.com/Himg615/scaled.php?tn=0&amp;amp;server=615&amp;amp;filename=y7evky.jpg&amp;amp;xsize=640&amp;amp;ysize=640&quot; title=&quot;Odin&quot; alt=&quot;&amp;quot;Odin&amp;quot;&quot; /&gt;
&lt;img src=&quot;http://desmond.yfrog.com/Himg532/scaled.php?tn=0&amp;amp;server=532&amp;amp;filename=hper.jpg&amp;amp;xsize=640&amp;amp;ysize=640&quot; title=&quot;Odin&quot; alt=&quot;&amp;quot;Odin&amp;quot;&quot; /&gt;&lt;/p&gt;

&lt;iframe width=&quot;853&quot; height=&quot;480&quot; src=&quot;http://www.youtube.com/embed/wlu9-3zMctM&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;


&lt;p&gt;Took a video; not the best quality, and not very long, but you can see how
smooth the animation is.&lt;/p&gt;

&lt;p&gt;WebGL allows you to specify vertex indeces; but Windows has performance issues.&lt;/p&gt;

&lt;h3&gt;A &amp;amp; Q&lt;/h3&gt;

&lt;p&gt;Have you looked into shader preprocessing?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not yet; I thought ours was a simple approach, bt I'm sure that there are
better alternatives to what we used. If anyone has any suggestions, feel free
to file bugs or fork the Github project.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;How easy or difficult was it to use your art asset pipeline?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I had a couple of issues with COLLADA initially; the support is somewhat
spotty, unless you're using a plugin. But, exporting to COLLADA and running
a python script to output assets was pretty easy. It'll be easier once we get
runtime conversion in.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Odin demo, are you doing the animation in Javascript?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Yes, that's done in Javascript; some of the devices like set-top boxes can't
handle too much work in the shaders.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You had 36k triangls in the Odin demo; what's a reasonable scene size?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;There is a lot of difference in performance between the set-top boxes, mobile
phones, and desktop boxes; it depends on the platform you are developing for.
Javascript doesn't make much of a difference in performance; the layer is thin
between the javascript and the driver.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Can you discuss the specs of the set-top box your Odin demo was for?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm not sure.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What was the process like converting from the 100k lines+ of C++ code? Was it
automated?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;It was all manual; we had the C++ source on one screen, and Javascript on
another. It took three unexperienced interns two months to port everything.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When will Opera Mini (Mobile) have WebGL supprt?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All of the technology is made in core, and trickles down to the platform team;
it will be in Opera 12 for the desktop, and will make its way down.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Using Google Closure for Lean and Mean Javascript Projects by Richard Anaya&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;November 2, 2:00 - 2:45&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.twitter.com/richard_anaya&quot;&gt;@richard_anaya&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Creating high quality optimized code in javascript has many challenges. Why
not have a powerful tool by your side? This session will teach you about Google
Closure: a powerful set of tools from Google to help make large javascript
projects ( like game engines! ) easy to manage and optimize. We'll be talking
about code optimization, localization, templates, and documentation.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;http://desmond.yfrog.com/Himg739/scaled.php?tn=0&amp;amp;server=739&amp;amp;filename=buvhb.jpg&amp;amp;xsize=640&amp;amp;ysize=640&quot; title=&quot;Richard Anaya&quot; alt=&quot;Richard Anaya&quot; /&gt;&lt;/p&gt;

&lt;p&gt;How do you build a large project with quality code that is maintainable over time?&lt;/p&gt;

&lt;p&gt;We're trying to figure out how to use modern technology; modern compilers,
design patterns. We're trying to bring large, bold ideas to the web with code
that is increasingly complex; and we want to be proud of clean, elegant code.&lt;/p&gt;

&lt;h3&gt;Javascript&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Good

&lt;ul&gt;
&lt;li&gt;Speedy&lt;/li&gt;
&lt;li&gt;No types; dynamicness lends to rapid development&lt;/li&gt;
&lt;li&gt;OOP through prototypes&lt;/li&gt;
&lt;li&gt;Cross-platforms&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bad

&lt;ul&gt;
&lt;li&gt;No types; less compile-time checking&lt;/li&gt;
&lt;li&gt;Inconsistencies across browsers&lt;/li&gt;
&lt;li&gt;Little help for organization &lt;em&gt;--ed: RequireJS / AMD?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Code is an open book; minifiers only help so much&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Google Closure&lt;/h3&gt;

&lt;p&gt;Closure is a production-ready collection of tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Closure Compiler&lt;/li&gt;
&lt;li&gt;Closure library (jQuery-like library)&lt;/li&gt;
&lt;li&gt;Closure templates (high-performance templates)&lt;/li&gt;
&lt;li&gt;Closure Linter (style checking)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Collection of tools to help make consistent code, and gives the user the
absolute minimum needed to run an app.&lt;/p&gt;

&lt;h4&gt;Optimizations&lt;/h4&gt;

&lt;p&gt;The compiler helps concatenate dependencies and minimize unused paths to send
to the client. Closure compiler reads the code to find its intent, to optimize
execution paths and remove dead code.&lt;/p&gt;

&lt;h4&gt;Typing&lt;/h4&gt;

&lt;p&gt;Closure also figures out intent of code to provide type-switching for strings /
integers (to avoid 1 + &quot;1&quot; = 11 type issues)&lt;/p&gt;

&lt;h4&gt;Templates&lt;/h4&gt;

&lt;p&gt;Template files are written seperately, and Closure reads these files and can
quickly parse and return formatted text. Helps seperate language from templates
for internationalization. Give template sections the &lt;code&gt;desc&lt;/code&gt; attribute, and the
closure compiler outputs XML files that can be localized.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{namespace template.typerunner}

{template .instructions}
  &amp;lt;h1&amp;gt;{msg desc=&quot;TypeRunner}&amp;lt;/h1&amp;gt;
{/template}
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Compiler Tips&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;JSDoc your code often; add comments to classes / methods&lt;/li&gt;
&lt;li&gt;Look at &lt;a href=&quot;http://code.google.com/closure/library/&quot;&gt;Closure Library&lt;/a&gt; for examples for everything&lt;/li&gt;
&lt;li&gt;Follow the &lt;a href=&quot;http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml&quot;&gt;Google javascript guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;gjslint early and often&lt;/li&gt;
&lt;li&gt;Test in advanced mode often&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Using closure&lt;/h3&gt;

&lt;p&gt;Expose compiled code publicly using exports
&lt;code&gt;goog.exportSymbol('typerunner.TypeRunner')&lt;/code&gt; allows you to define externally-
usable things (to the window). Also, &quot;externals&quot; define what symbols should not
be renamed during compilation.&lt;/p&gt;

&lt;p&gt;The gdream: turning good habits and quality code to well-optimized, obfuscated
code.&lt;/p&gt;

&lt;h3&gt;Q &amp;amp; A&lt;/h3&gt;

&lt;p&gt;I found myself using uglifyjs because I wasn't willing to buy into some of the
exports paradigms.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;There are some minification and truncation things you can do at the local
scope; but there aren't a ton of advantages of closure over other systems if
you're just compiling your code with simple compliation. You'll want to use
the other Closure offerings to really get the most out of optimizations.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;How would one use Closure with unit testing systems?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Within the Closure compiler, there is a unit testing framework; if you're
looking to using all Google libraries, you can use the framework within
Closure.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I come from using RequireJS; the workflow is build code, optimize, then minify;
can you run the Closure code without compiling anything?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;You can run the code, if you run using a harness that includes the Closure
libraries, but it's meant to be run as compiled. We do this to try to make
browser testing easy, as you'll only need to include a single file. Compliation
is very quick. The Compilation is good practice.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I've got a large project in javascript already with a bunch of jsdoc
annotations; running it through Closure, I get a ton of warnings. What would
you recommend to how I could produce my old documentation extensions to use
with Closure compiler?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;People have gone into the Closure code and done their own modifications to the
compilation process; I'd recommend using the Google Closure linter and go step-
by-step over your code to see if everything follows Google standards. I
personally haven't done much modification there, but there are people who have.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;Prizes and stuff&lt;/h2&gt;

&lt;p&gt;People got free O'Reilly books, Windows phones, and announced the winners of
the New Game Conf coding contest.&lt;/p&gt;

&lt;h2&gt;An Initiative and Framework for 3D Gaming with HTML5 by Alan Kligman and Bobby Richter&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Nov 2, 3:00 - 3:45&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://wiki.mozilla.org/Paladin&quot;&gt;Mozilla Paladin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/benrito/paladin_presentations/blob/master/Paladin_NewGame.pdf&quot;&gt;Presentation Slides&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Paladin is an initiative by the Mozilla community at the intersection of 3D
gaming, JavaScript framework and library development, and the browser. We're
tied into the bits of the web that are up-and-coming, and intend to weaponize
them for gaming. And where the web is missing critical gaming support, we aim
to fill those gaps.&lt;/p&gt;

&lt;p&gt;Three pieces are already spinning up: a framework written in JavaScript to
support 3D gaming in HTML5, a first game to help drive development of that
framework, and a web joystick API for Firefox. The framework currently offers
3D modelling via CubicVR, physics by ammo.js (a cross-compilation of Bullet),
loading via require.js, and sound. More subsystems are likely to be up and
running by the time of this talk, where I'll review our goals, progress, and
opportunities to get involved.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;http://desmond.yfrog.com/Himg740/scaled.php?tn=0&amp;amp;server=740&amp;amp;filename=atqog.jpg&amp;amp;xsize=640&amp;amp;ysize=640&quot; title=&quot;Alan Kligman and Bobby Richter&quot; alt=&quot;Alan Kligman and Bobby Richter&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Started as the demo &lt;a href=&quot;http://mzl.la/fotn-ff&quot;&gt;Flight of the Navigator&lt;/a&gt; to push
forward&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FF Audio Data API&lt;/li&gt;
&lt;li&gt;WebGL&lt;/li&gt;
&lt;li&gt;Emscripten&lt;/li&gt;
&lt;li&gt;JS Enahancements&lt;/li&gt;
&lt;li&gt;Processing.js, Popcorn.js&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Paladin aims to &quot;weaponize&quot; the web platform for 3D gaming by collaborating on
tools, libraries, and open standards.&lt;/p&gt;

&lt;h3&gt;Gladius&lt;/h3&gt;

&lt;p&gt;Game engine writen in js / html5. Relies on libraries for graphics and physics;
graphics provided by &lt;a href=&quot;http://www.cubicvr.org/&quot;&gt;CubicVR.js&lt;/a&gt;, and physics provided
by &lt;a href=&quot;https://github.com/kripken/ammo.js/&quot;&gt;ammo.js&lt;/a&gt;. Built to encompass modern
game engine design; modularity allows replacing chunks of functionality through
interfaces. Also provides an entity component system, allowing developers to
compose packages of components and extend the engine for specific games.&lt;/p&gt;

&lt;h4&gt;CubicVR.js&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/cjcliffe/CubicVR.js/wiki/Examples-and-Demos&quot;&gt;Demos&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Written along-side three.js; has grown into its own 3D engine, seperate from
but used in Gladius.&lt;/p&gt;

&lt;p&gt;Asset pipeline: use Blender for modeling / animation, with COLLADA export
with scene data in XML / json.&lt;/p&gt;

&lt;h3&gt;RescueFox&lt;/h3&gt;

&lt;p&gt;First game prototype; quick and dirty demo, uses CubicVR.js and ammo.js. Helped
to figure out how to interface with APIs.&lt;/p&gt;

&lt;h3&gt;Supporting APIs / Frameworks&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://moz.la/mozgamepad&quot;&gt;html5 api spec for gamepad support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://browserid.org/&quot;&gt;BrowserID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mouse-lock API&lt;/li&gt;
&lt;li&gt;Upcoming: Node editor for animations / composting&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Getting involved:
* &lt;a href=&quot;http://wiki.mozilla.org.Paladin&quot;&gt;Paladin Wiki&lt;/a&gt;
* #paladin on irc.mozilla.org
* paladin-dev on Google Groups&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.twitter.com/alankligman&quot;&gt;@alankligman (Alan Kligman)&lt;/a&gt;
&lt;a href=&quot;http://www.twitter.com/secretrobotron&quot;&gt;@secretrobotron (Bobby Richter)&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Q &amp;amp; A&lt;/h3&gt;

&lt;p&gt;What are the biggest gaps you see in the WebGL API that prevent you from
getting games ready?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;We've been making do with what we have available today. There has been some
noise about compressed textures, but all of CubicVR runs really well. We
haven't seen any big gaps; things like compressed textures are nice to have,
but WebGL is great for its 1.0 and I'm looking forward to the next revision.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;Web Audio API and other new features by Rachel Blum&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Nov 2, 4:00 - 4:45&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://ngc11-groby.appspot.com/#1&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;There are lots of cool things in HTML5. Even better, there are lots of cool
things being &lt;em&gt;added&lt;/em&gt; to HTML5 and Chrome all the time, quite a few with a focus
on games. This talk is going to showcase some very recent and still-in-progress
features, including a long look at the Web Audio API.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;http://desmond.yfrog.com/Himg576/scaled.php?tn=0&amp;amp;server=576&amp;amp;filename=jwcx.jpg&amp;amp;xsize=640&amp;amp;ysize=640&quot; title=&quot;Rachel Blum&quot; alt=&quot;Rachel Blum&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Goal: develop on single platform. Moved to Chrome for the ability to push
forward standards and help make html5 better.&lt;/p&gt;

&lt;p&gt;Good resouce: &lt;a href=&quot;http://caniuse.com&quot;&gt;caniuse.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Graphics, physics improving rapidly; WebGL is pushing 3D graphics forward.&lt;/p&gt;

&lt;p&gt;WebSockets allow low-latency, full-duplex UTF8 communication to servers for
realtime apps / games. Chrome 15 now supports binary, and UDP is being
discussed for WebSockets.&lt;/p&gt;

&lt;p&gt;The asset pipeline is being improved with WebStorage, indexedDB, File API, and
Application Cache APIs.&lt;/p&gt;

&lt;p&gt;File System API gives you a local, sandboxed filesystem to cache files such as
binary blobs; is Chrome-only, but hopefully will be adopted by other browsers.
It caches the entire app locally; is beneficial so that assets don't have to be
loaded during gameplay.&lt;/p&gt;

&lt;p&gt;Add Cache Manifest file to specify files for caching; also allows fallback
files in case user is disconnected. Chrome allows debugging cache through
about:appCacheInternal. The Javascript console can also show what has been
cached. &lt;a href=&quot;http://www.html5rocks.com/en/tutorials/appcache/beginner/&quot;&gt;html5rocks&lt;/a&gt;
is a good resource.&lt;/p&gt;

&lt;h3&gt;New Things&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Page Visibility API: detects if a user has the page in focus, to allow things
like pausing&lt;/li&gt;
&lt;li&gt;Fullscreen API; allow fullscreen, chromeless apps; Chrome 16&lt;/li&gt;
&lt;li&gt;Connection checking API; ability to detect if online or not.&lt;/li&gt;
&lt;li&gt;requestAnimationFrame; allows better synchronization with CSS / SVG
animation, browser doesn't render if page is not in focus&lt;/li&gt;
&lt;li&gt;Web Audio API; low-level audio API&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Web Audio API&lt;/h3&gt;

&lt;p&gt;Previously had &lt;code&gt;&amp;lt;bgsound &quot;something.mid&quot; &amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;embed src=&quot;stuff.wav&quot;&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now have audio, but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Codec support varies across browsers&lt;/li&gt;
&lt;li&gt;Latency issues&lt;/li&gt;
&lt;li&gt;Glitches&lt;/li&gt;
&lt;li&gt;No effects, filters, or other low-level manipulation&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;When developing a low-level audio API, had many constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't want to use javascript, which is busy doing other things (app logic)&lt;/li&gt;
&lt;li&gt;Audio processing is more suited to CPU than GPU; many CPUs have audio
processing functions built-in. Also, not all devices have a GPU.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Desired features, built into the Audio API&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long sounds can be streamed through an audio source&lt;/li&gt;
&lt;li&gt;Javascript source nodes; you can generate wave forms in javascript&lt;/li&gt;
&lt;li&gt;Sample-accurate scheduling&lt;/li&gt;
&lt;li&gt;Gain control; allows cross-fading between channels&lt;/li&gt;
&lt;li&gt;Filter effects; low-pass, high-pass, band-pass, low shelf, high shelf,
peaking / EQ&lt;/li&gt;
&lt;li&gt;notch&lt;/li&gt;
&lt;li&gt;allpass&lt;/li&gt;
&lt;li&gt;DelayNode for chorus effects&lt;/li&gt;
&lt;li&gt;DynamicCompressorNode for control / sweetening of the mix&lt;/li&gt;
&lt;li&gt;AudioPannerNode gives 3d positioning of sounds&lt;/li&gt;
&lt;li&gt;ConvolverNode, provides room ambience and other special effects&lt;/li&gt;
&lt;li&gt;Node Graph - doppler effect&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Behind the Scenes&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;2008: early prototype built based on OpenAL&lt;/li&gt;
&lt;li&gt;2009:

&lt;ul&gt;
&lt;li&gt;June: API design, find limitations of OpenAL, look for good design for the
web&lt;/li&gt;
&lt;li&gt;September: Webkit &amp;amp; js bindings, demoed together with Box2D&lt;/li&gt;
&lt;li&gt;December: continued design work, presentation with Apple WebKit team&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2010:

&lt;ul&gt;
&lt;li&gt;January: initial web audio integration; decisionon was made that web audio
work should be done on seperate branch&lt;/li&gt;
&lt;li&gt;May: Audio incubator with Mozilla Audio Data&lt;/li&gt;
&lt;li&gt;September: redesign &amp;amp; refactor, merge approval with WebKit&lt;/li&gt;
&lt;li&gt;Late 2010: merge with main webkit branch&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2011:

&lt;ul&gt;
&lt;li&gt;Early:

&lt;ul&gt;
&lt;li&gt;W3C Audio Group&lt;/li&gt;
&lt;li&gt;Chrome 10: OSX Web Audio behind a flag&lt;/li&gt;
&lt;li&gt;Lots of porting&lt;/li&gt;
&lt;li&gt;Chrome 12 brought on Windows and Linux&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://labs.dinahmoe.com/plink/&quot;&gt;Plink&lt;/a&gt; and &lt;a href=&quot;http://www.chromeexperiments.com/detail/tonecraft/&quot;&gt;ToneCraft&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Late:

&lt;ul&gt;
&lt;li&gt;September: Chrome 14 exposes Web Audio by default&lt;/li&gt;
&lt;li&gt;October: &lt;a href=&quot;http://audiojedit.herokuapp.com/&quot;&gt;AudioJedit&lt;/a&gt;, sample
editor in html5 w/ Web Audio API&lt;/li&gt;
&lt;li&gt;October: Apple enables Web Audio in nightlies&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Participation&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Participate in W3C Groups&lt;/li&gt;
&lt;li&gt;Write your own code&lt;/li&gt;
&lt;li&gt;File bugs (&lt;a href=&quot;http://crbugs.com&quot;&gt;crbugs.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Talk to Developer Relations&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Upcoming Features&lt;/h3&gt;

&lt;h4&gt;Mouse Lock&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.w3.org/2010/webevents/&quot;&gt;Web Events WG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dvcs.w3.org/hg/webevents/raw-file/default/mouse-lock.html&quot;&gt;Draft W3C Spec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://crbug.com/72754&quot;&gt;crbug.com/72754&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://src.chromium.org/viewvc/chrome/trunk/src/ppapi/examples/mouse_lock/&quot;&gt;Pepper API sample: ppapi/examples/mouse_lock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Why so long?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Time to first draft: June 2011&lt;/li&gt;
&lt;li&gt;W3C spec &amp;amp; discussions&lt;/li&gt;
&lt;li&gt;Coordination between WebKit teams&lt;/li&gt;
&lt;li&gt;Security implications, defining user experience&lt;/li&gt;
&lt;li&gt;Permissions UI&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Joystick API&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;W3C Draft Spec&lt;/li&gt;
&lt;li&gt;crbug.com/79100&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;WebRTC&lt;/h4&gt;

&lt;p&gt;Plugin-free high quality real-time voice / video communication in the browser;
BSD licensed&lt;/p&gt;

&lt;p&gt;Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Echo cancellation&lt;/li&gt;
&lt;li&gt;Voice Engine&lt;/li&gt;
&lt;li&gt;Video Engine&lt;/li&gt;
&lt;li&gt;Peer-to-peer connection stack&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://webrtc.org&quot;&gt;webrtc.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.w3.org/2011/webrtc/editor/webrtc.html&quot;&gt;W3C Draft Spec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Other Stuff&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Orientation lock - lock phone screen position&lt;/li&gt;
&lt;li&gt;Hardware Feature Detect&lt;/li&gt;
&lt;li&gt;High-performance timers&lt;/li&gt;
&lt;li&gt;In-app bug reports (&lt;a href=&quot;http://crbug.com/83642&quot;&gt;crbug.com/83642&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Q &amp;amp; A&lt;/h3&gt;

&lt;p&gt;You mentioned that indexDB isn't suitable for putting in large binary assets;
why's that?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Let me rephrase that: you can do that, but it seems like it's overkill. You
don't need a transactional database to hold game data. I don't have any
performance numbers, but it seems like it would be slower than raw file access.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I'd like to hear a little more around your thought process around the
variability of hardware, and how performance is managed. PC games have
come up with some solutions, like minimum specs. Can we use that model?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I think we can do some things, but we can't actually spec out what exactly
you would need to run a web app. The amount of devices is so vast that any
specs are unlikely to be accurate. You might be able to say what features you
support, that a device needs to support those features - but not a hardware
performance requirement.&lt;/p&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>A Realization</title>
   <link href="http://www.thejacklawson.com//2011/10/a-realization/index.html"/>
   <updated>2011-10-29T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/10/a-realization/a-realization</id>
   <content type="html">&lt;p&gt;So, I was looking over the work that &quot;I&quot; did- why I put &quot;I&quot; in quotes will be
revealed- putting together this blog and I was completely blown away by the
complexity that occurs just to display a simple html and css file.&lt;/p&gt;

&lt;p&gt;Here's how it's all structured:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Github hosts code that is&lt;/li&gt;
&lt;li&gt;Parsed by the Jekyll templating language which&lt;/li&gt;
&lt;li&gt;Compiles and aggregates posts written in Markdown that include&lt;/li&gt;
&lt;li&gt;The html5 boilerplate, which itself is worthy of several blogposts, because it contains all kinds of other javascript and css frameworks. But I also included&lt;/li&gt;
&lt;li&gt;Twitter's Bootstrap css template which is&lt;/li&gt;
&lt;li&gt;Passed back down through http to your browser&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The sheer amount of engineering effort that has preceeded me to create this
structure is staggering. Each step of the way includes countless man-hours of
effort put into each system, and its subsystems, by people all over the world.
And not only that, but the whole technology stack (save bits of the hosting)
is open source, even down to the http protocol and, chances are, the browser
you're using. It's all pretty incredible.&lt;/p&gt;

&lt;p&gt;To hop onto a tangent, I also find it pretty fascinating that even with this
vertigo-inducing complexity, its interface with me, the human, is quite simple.
Writing this post as as easy as banging out some text in my favorite text
editor, vim, in a nicely human-readable markup, Markdown, and I run two commands
to publish the whole thing on to the internet, onto this massive tower of
complexity.&lt;/p&gt;

&lt;p&gt;Need to stop before I start thinking about the complexity down to the hardware
layer, whereupon my mind melts.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Finished converting from Wordpress to Jekyll</title>
   <link href="http://www.thejacklawson.com//2011/10/finished-converting-from-wordpress-to-jekyll/index.html"/>
   <updated>2011-10-28T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/10/finished-converting-from-wordpress-to-jekyll/First-Jekyll-Post</id>
   <content type="html">&lt;p&gt;I'm writing this post in vim, using markdown, and in a minute I'm going to
publish it by using &quot;git push&quot; in iTerm. How cool is that?&lt;/p&gt;

&lt;p&gt;It took a little work converting my old Wordpress blog over to Jekyll- long
enough that I'll have to save the &quot;how&quot; post and the &quot;why&quot; post until later-
but ultimately satisfying.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>#bbg</title>
   <link href="http://www.thejacklawson.com//2011/10/bbg/index.html"/>
   <updated>2011-10-04T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/10/bbg/bbg</id>
   <content type="html">&lt;p&gt;I've recently joined a community for browser-based games developers. I've had to fire up IRC for the first time in a while, but IRC has that kind of nostalgic hot-chocolate-by-a-snowy-window comfortable feel to it, doesn't it? Well, that might just be me, I don't know. But, at any rate, there's always a good conversation going on in the IRC channel or in the forums, so if you're interested in browser-based-games development, it's definitely worth checking out.&lt;/p&gt;

&lt;p&gt;The IRC channel is #bbg at irc.freenode.net (&lt;a title=&quot;Freenode Web IRC Client&quot; href=&quot;http://webchat.freenode.net/&quot; target=&quot;_blank&quot;&gt;web client here&lt;/a&gt;) and the forums are at &lt;a title=&quot;BBGameZone&quot; href=&quot;http://community.bbgamezone.net/&quot; target=&quot;_blank&quot;&gt;community.bbgamezone.net&lt;/a&gt;. One of the members also maintains a list of games that some of the members have / are developing at &lt;a title=&quot;Fleeting Fantasy Game List&quot; href=&quot;http://fleetingfantasy.com/game-list&quot; target=&quot;_blank&quot;&gt;fleetingfantasy.com/game-list&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Mediator.js 0.6.0</title>
   <link href="http://www.thejacklawson.com//2011/09/mediator-js-0-6-0/index.html"/>
   <updated>2011-09-15T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/09/mediator-js-0-6-0/mediator-js-0-6-0</id>
   <content type="html">&lt;p&gt;Yeah, so, I skipped a version number again. Version 0.5.0 is a pretty hefty
update, followed by 0.5.1 and 0.6.0 (which are quite a bit smaller.) Here's
what's new:&lt;/p&gt;

&lt;h2&gt;0.5.0&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Subscribers are now a real object instead of an anonymous collection of data&lt;/li&gt;
&lt;li&gt;Contain a guid for an id for access later&lt;/li&gt;
&lt;li&gt;Update function that allows you to modify its function, options, or context
after adding it&lt;/li&gt;
&lt;li&gt;You can change subscriber's priority (as an index with the other subscribers
within your channel), so if you want one to fire &lt;em&gt;first&lt;/em&gt;, you can do so either
as an option on Subscribe or later using Mediator.SetPriority(id/fn,
&amp;lt;channelname&amp;gt;). Channelname makes this run significantly faster, but is not
required.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;0.6.0&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Channel is returned at the end of the data arguments for callbacks. Within a
callback function, you can run channel.StopPropagation() to stop further
subscribers from being notified.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;There's probably a significant amount of cleanup left to do on it, but I think
it's fairly fully-featured, and it's unit tested pretty solidly.&lt;/p&gt;

&lt;p&gt;The latest is &lt;a href=&quot;https://github.com/ajacksified/Mediator.js&quot;&gt;up on Github&lt;/a&gt; with
an updated readme file that explains how to use everything.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Mediator.js 0.3 and 0.4</title>
   <link href="http://www.thejacklawson.com//2011/09/mediator-js-0-3-and-0-4/index.html"/>
   <updated>2011-09-13T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/09/mediator-js-0-3-and-0-4/mediator-js-0-3-and-0-4</id>
   <content type="html">&lt;p&gt;(&lt;a title=&quot;jsfiddle showing example of using Mediator.js 0.4&quot;
href=&quot;http://jsfiddle.net/ajacksified/vazAV/&quot;&gt;Skip to the jsfiddle&lt;/a&gt; if you'd
like to see a live example)&lt;/p&gt;

&lt;p&gt;I made some changes to Mediator.js which were originally going to be in 0.3,
but just as I was about to push an update (the update being &quot;assigning
predicates to channels&quot;), I decided to to go ahead and implement namespacing.
You can now subscribe to things like &quot;application:chat:receiveMessage&quot;
directly, or subscribe higher up on &quot;application:chat&quot; to receive everything
under the namespace. Callbacks are applied recursively. Subscribing,
publishing, and removing all work recursively with namespaces.&lt;/p&gt;

&lt;p&gt;It was an interesting engineering challenge to turn &quot;x:y:z&quot; into
Channel[x][y][z]; the transformation was pretty simple, but there's still
something in the back of my mind shouting that &quot;there's a better way to do
this&quot;. Right now, it loops through and generates new Channel objects until it
runs out of the split string's index, as such:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var namespaceHeirarchy = namespace.split(':');

if(namespaceHeirarchy.length &amp;gt; 0){

  for(var i = 0, j = namespaceHeirarchy.length; i &amp;lt; j; i++){
    if(!channel.HasChannel(namespaceHeirarchy[i])){
      channel.AddChannel(namespaceHeirarchy[i]);
    }

    channel = channel.ReturnChannel(namespaceHeirarchy[i]);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Some of the method signatures have been changed so that things make a little
more sense; Subscribe now uses (channel, callback, &lt;em&gt;options&lt;/em&gt;, &lt;em&gt;context&lt;/em&gt;) where
it used to use (channel, callback, &lt;em&gt;context&lt;/em&gt;, &lt;em&gt;options&lt;/em&gt;). It didn't make sense
having callback come before options (especially as options are more likely to
be used than context.) Options now holds the predicate (if there is one),
rather than using the predicate as a channel. And as always, we have no
external library dependencies. The minified/gzipped library is up to 580 bytes
now, over my goal by 80... version 0.4.1 may be tweaked to get us back under
that limit.&lt;/p&gt;

&lt;p&gt;An internal change is that &lt;em&gt;Channel&lt;/em&gt; is now its own object with AddChannel,
AddSubscriber , Remove, Publish, HasChannel commands, which makes it easier to
nest channels in channels and tack on callbacks without losing track of
context. It's all only used internally within Mediator (and, of course, all
tested.)&lt;/p&gt;

&lt;p&gt;The latest is &lt;a href=&quot;https://github.com/ajacksified/Mediator.js&quot;&gt;up on Github&lt;/a&gt; with
an updated readme file that explains how to use everything.
I've also updated &lt;a href=&quot;http://jsfiddle.net/ajacksified/vazAV/&quot;&gt;my example on 
jsfiddle&lt;/a&gt; with
the latest method signature changes.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Steve, the Framework: or How Not to Get Caught Up in Details During a  Discussion</title>
   <link href="http://www.thejacklawson.com//2011/09/steve-the-framework-or-how-not-to-get-caught-up-in-details-during-a-discussion/index.html"/>
   <updated>2011-09-09T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/09/steve-the-framework-or-how-not-to-get-caught-up-in-details-during-a-discussion/steve-the-framework-or-how-not-to-get-caught-up-in-details-during-a-discussion</id>
   <content type="html">&lt;p&gt;We had a several-hour-long code-review-turned-meeting a few days ago. Generally
these are accompanied by much groaning and frustration- but, this particular
meeting was extremely productive. The discussion was over various UI
technologies we're using, and what direction we wanted to head in.&lt;/p&gt;

&lt;p&gt;At one point, we started discussing how we handle data persistance, and the
potential for a piece to fit in to translate javascript models from our UI into
data persistance objects for the server. One team member casually mentioned
that &lt;em&gt;Steve&lt;/em&gt;- by which he deftly named the persistence layer- would handle the
translation by (..trail off into technical discussion.) From that point on, we
called the persistance layer &lt;em&gt;Steve.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This lead me to a thought today: although it seemed so simple at the time,
giving &lt;em&gt;unknown object / function / class library / thing&lt;/em&gt; an arbitrary name
that we could refer to later in the discussion was a great move. It allowed us
to move forward without getting lost in a long and tedious discussion on what
to call it, because what was important was the &lt;em&gt;idea&lt;/em&gt; of Steve, not the
implementation. What could have been an additional hour added into the meeting
was saved, thanks to Steve.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Mediator.js v0.2</title>
   <link href="http://www.thejacklawson.com//2011/09/mediator-js-v0-2/index.html"/>
   <updated>2011-09-06T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/09/mediator-js-v0-2/mediator-js-v0-2</id>
   <content type="html">&lt;p&gt;Source: &lt;a href=&quot;https://github.com/ajacksified/Mediator.js&quot;&gt;Mediator.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Original post: &lt;a href=&quot;http://thejacklawson.com/2011/06/mediators-for-modularized-asynchron%0Aous-programming-in-javascript/index.html&quot;&gt;Mediators for Modularized Asynchronous Programming in
Javascript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I was reading Addy Osmani's excellent post
&lt;a href=&quot;http://addyosmani.com/largescalejavascript/&quot;&gt;Patterns For Large-Scale JavaScript Application
Architecture&lt;/a&gt;,
I came to the realization that I had made some past changes to my own
Mediator.js library, but had failed to both upload the changes to Github &lt;em&gt;and&lt;/em&gt; 
use some of the tricks I've picked up since originally writing the library. So,
version 0.2 is out, with the following changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API changes&lt;/li&gt;
&lt;li&gt;&quot;Subscribe&quot; in place of &quot;Add&quot;&lt;/li&gt;
&lt;li&gt;&quot;Publish&quot; in place of &quot;Call&quot;&lt;/li&gt;
&lt;li&gt;Subscribe now takes a context object, to allow you to pass in what @this@
should be when the callback is called&lt;/li&gt;
&lt;li&gt;Mediator no longer forces you to use it as a singleton&lt;/li&gt;
&lt;li&gt;No longer looks for &quot;type&quot; as part of a data object; rather, uses channels to
sub/pub&lt;/li&gt;
&lt;li&gt;Code a whole lot cleaner; objects to pass around subscriber info rather than
numerically-indexed arrays&lt;/li&gt;
&lt;li&gt;Passes arguments you pass into publish onto subscriber callbacks, rather than
a data object&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;  var m = new Mediator();
  m.Subscribe(&quot;test&quot;, function(arg1, arg2){ console.log([arg1, arg2]); }
  m.Publish(&quot;test&quot;, &quot;arg1&quot;, &quot;arg2&quot;);
  // output &gt; [&quot;arg1&quot;, &quot;arg2&quot;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Meta changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Tests are now &quot;real&quot; tests, using Jasmine&lt;/li&gt;
&lt;li&gt;Updated Readme file to reflect new information&lt;/li&gt;
&lt;li&gt;Added minified js (and under 500 bytes, too)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I think the main difference between this and most available and/or
roll-your-own Mediators is the predicate matching, although that may also be
what makes this more / different than a traditional Mediator. Mediator+? A
meatier mediator? Meatiator.&lt;/p&gt;

&lt;p&gt;Anyway,&lt;a href=&quot;http://jsfiddle.net/ajacksified/dCwaK/3/&quot;&gt;here's an example on
jsfiddle&lt;/a&gt;. Try chatting, and using
the same name for the from/to fields.  Shows predicates, subscriptions, and
removing subscriptions.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Crafty.js Presentation at the San Francisco GamesJS Meetup</title>
   <link href="http://www.thejacklawson.com//2011/08/craftyjs-presentation-at-the-first-san-fransisco-gamesjs-meetup/index.html"/>
   <updated>2011-08-28T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/08/craftyjs-presentation-at-the-first-san-fransisco-gamesjs-meetup/craftyjs-presentation-at-the-first-san-fransisco-gamesjs-meetup</id>
   <content type="html">&lt;p&gt;A couple weeks ago, I did a presentation for a brand-new meetup group called
&lt;a href=&quot;http://gamesjs.com&quot;&gt;GamesJS&lt;/a&gt;, an HTML5 game development meetup in San
Francisco.  We did a few lightning talks, followed around by general
hanging-about-and-finishing-the-remaining-food. Another talk was on
&lt;a href=&quot;http://sibblingz.com/technology.html&quot;&gt;Spaceport&lt;/a&gt; a game engine built for
performance that uses javascript and vector-based graphics in an
Actionscript-like API (allowing easy ports from existing AS3 code). The game
logic is written in javascript, while the graphics processing is handled by
whatever's fastest and available - native code for iOS, WebGL for Chrome, etc.
His slides are available on the &lt;a href=&quot;http://gamesjs.com/meetups/javascript-and-html5-games-kickoff-meeting&quot;&gt;GamesJS
site&lt;/a&gt;.
The third and final talk was on &lt;a href=&quot;http://code.google.com/p/playn/&quot;&gt;Google
PlayN&lt;/a&gt;, Google's GWT-based engine that is
built to allow you to write your game in Java, and export to various platforms,
such as a native Android app, html5, and even flash, with as little change as
possible.   Her slides were also &lt;a href=&quot;http://goo.gl/qGZMG&quot;&gt;available online&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://gamesjs.com/presentations/craftyjs/slides.html&quot;&gt;My slides&lt;/a&gt;  are a short
dozen that walk you through the creation of a &lt;em&gt;really&lt;/em&gt; simple Crafty game by
example. It shows how to set up the canvas, instantiate objects, create and
inherit classes (&quot;modules&quot;), animation, and collision. All of my sourcecode is
&lt;a href=&quot;http://jsfiddle.net/ajacksified/NJ3Ub/&quot;&gt;up on jsFiddle&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>XCode 4.1 on Mac OSX Installation Trouble (fix)</title>
   <link href="http://www.thejacklawson.com//2011/08/xcode-4-1-on-mac-osx-installation-trouble-fix/index.html"/>
   <updated>2011-08-17T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/08/xcode-4-1-on-mac-osx-installation-trouble-fix/xcode-4-1-on-mac-osx-installation-trouble-fix</id>
   <content type="html">&lt;p&gt;I upgraded to OSX Lion, and decided one day to use &lt;a href=&quot;http://mxcl.github.com/homebrew/&quot;&gt;homebrew&lt;/a&gt;
to give a package called &lt;a href=&quot;https://github.com/nvie/gitflow&quot;&gt;git-flow&lt;/a&gt; a shot. The installation failed with a somewhat
cryptic message, but suggested running &quot;brew doctor&quot; to find out what was
wrong. And, indeed, XCode was gone from Lion - it was on my previous Snow
Leopard installation, but failed to carry over. &quot;No big deal,&quot; says I, &quot;a
simple reinstall.&quot;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Wrong.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The trouble started when I found out that you have to download XCode from the
App Store. &quot;Ah,&quot; says I, &quot;I guess this makes sense, they want to push everyone
through the app store. Annoying, but whatever.&quot; And so I download the 3gb-ish
file, and the App Store cheerily let me know that it was, indeed &quot;Installed.&quot; I
tried brew again, and no dice. Apparently all the app store downloads is an
installer. So, by &quot;installed&quot;, it means &quot;downloaded installer, but nothing's
actually installed.&quot; And so, with great joy, I clicked &quot;Install XCode&quot; from
within the applications folder.&lt;/p&gt;

&lt;p&gt;Nope.&lt;/p&gt;

&lt;p&gt;After running for a few minutes, it failed and suggested looking at the log,
which, after several thousand status messages, let me know that one of the
packages failed to extract properly. After a quick Googling, I found that many
other people had the same problem, and suggested re-downloading it; so, I did.
This time a different package failed. The fourth and fifth installs failed,
too. I tried copypasting it in other directories, tried opening the package and
running the xcode package directly, and nothing worked. I hunted down and ran
the uninstall script for the old version of XCode that was still hanging round.
At last, I finally saw someone who &lt;a href=&quot;https://discussions.apple.com/message/15931741#15931741&quot;&gt;brilliantly suggested&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo mv /Applications/Install\ Xcode.app/ /Applications/Install_Xcode.app
sudo open /Applications/Install_XCode.app
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And suddenly, XCode worked!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Game Development with Crafty.js</title>
   <link href="http://www.thejacklawson.com//2011/07/game-development-with-crafty-js/index.html"/>
   <updated>2011-07-25T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/07/game-development-with-crafty-js/game-development-with-crafty-js</id>
   <content type="html">&lt;p&gt;I was recently looking around for some examples in Javascript for an isometric
proof-of-concept I'm working on, when I came upon &lt;a href=&quot;http://craftyjs.com/&quot;&gt;Crafty.js&lt;/a&gt;&quot;&gt;.
It had some neat demos, and it was MIT licensed, so I got to work - and I was
pleasantly surprised by the library. The documentation itself is a little
lacking- and its official tutorial (at the time of this post) was using an
outdated version of the library (which has had several breaking changes), but I
managed to come across an excellent tutorial by &lt;a href=&quot;https://github.com/starmelt/craftyjstut/wiki&quot;&gt;&quot;Starmelt&quot; on
GitHub&lt;/a&gt; that takes you through the process of building a simple game in
Crafty. It introduces you to entity creation, the game loop, the eventing
structure, and more - and once you're done, it's easy to add on to (for
example, I kept a global high scores list, and added a &quot;reset&quot; button.)&lt;/p&gt;

&lt;p&gt;Also, Crafty includes an &lt;a href=&quot;http://craftyjs.com/demos/isometric/&quot;&gt;isometric demo&lt;/a&gt;,
which works once you replace &quot;Crafty.isometric.init&quot; with
&quot;Crafty.isometric.size&quot; in the source code.&lt;/p&gt;

&lt;p&gt;I recommend playing around with the code - it's very lean and flexible. It's
definitely worth checking out if you're looking for a springboard into JS game
development. Here's a few notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Switch between canvas and DOM with no code changes (besides telling it which
to render in)&lt;/li&gt;
&lt;li&gt;Claims to support IE6+&lt;/li&gt;
&lt;li&gt;Easily extensible - build entities using interface-like structures&lt;/li&gt;
&lt;li&gt;Seemed fast in the demos I was trying&lt;/li&gt;
&lt;li&gt;Handles animations through tweening over the game loop (you can set the fps)&lt;/li&gt;
&lt;li&gt;Mouse  and keyboard events&lt;/li&gt;
&lt;li&gt;Collision detection, dragging API&lt;/li&gt;
&lt;li&gt;Hard-to-find documentation on available events and modules (it's possible
that I'm blind, and am looking right past it, too)&lt;/li&gt;
&lt;li&gt;MIT license&lt;/li&gt;
&lt;li&gt;Excellent tutorial by &lt;a href=&quot;https://github.com/starmelt/craftyjstut/wiki&quot;&gt;Starmelt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Permission denied to access property object : Easy Fix</title>
   <link href="http://www.thejacklawson.com//2011/06/permission-denied-to-access-property-object-easy-fix/index.html"/>
   <updated>2011-06-09T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/06/permission-denied-to-access-property-object-easy-fix/permission-denied-to-access-property-object-easy-fix</id>
   <content type="html">&lt;p&gt;Recently, I was working on an application using comet. To get around some
issues opening multiple connections in older browsers (ahem, IE6), we injected
an iframe using another domain into the page that hosted the application, which
allowed more persistant connections.&lt;/p&gt;

&lt;p&gt;The parent held details about the chat (username, other people online, etc.),
which needed to be passed to the child. The trouble was, the child couldn't
access properties of the object sent from parent, due to access restrictions -
It would throw a &quot;Permission denied to access property object&quot; error in
FireFox. This didn't matter if I sent in the object as a parameter in a method,
or tried cloning the object - nothing worked. I could see the object, I could
log the object, but I couldn't access any properties&lt;/p&gt;

&lt;p&gt;After several attempts to get around this, I fell upon an easy and elegant
solution: since I could access the object, just not its properties, I would
encode the object as a JSON string and parse it on the client. Using&lt;br/&gt;
&lt;a href=&quot;https://github.com/douglascrockford/JSON-js&quot;&gt;Douglas Crockford's json2.js&lt;/a&gt;, when sending the parent objects I encoded them as
JSON using JSON.stringify(object). On the child, I did a JSON.parse(object) -
and I had a fresh new copy of everything to work with. I could access
everything with no trouble, as it's now an entirely new object.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Mediators for Modularized Asynchronous Programming in Javascript</title>
   <link href="http://www.thejacklawson.com//2011/06/mediators-for-modularized-asynchronous-programming-in-javascript/index.html"/>
   <updated>2011-06-04T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/06/mediators-for-modularized-asynchronous-programming-in-javascript/mediators-for-modularized-asynchronous-programming-in-javascript</id>
   <content type="html">&lt;p&gt;(&lt;a href=&quot;http://jsbin.com/iceru6/2/edit&quot;&gt;jsbin&lt;/a&gt; / &lt;a href=&quot;https://github.com/ajacksified/Mediator.js&quot;&gt;github&lt;/a&gt; / &lt;a href=&quot;http://www.thejacklawson.com/2011/09/mediator-js-0-6-0/&quot;&gt;latest version&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Author's note: this probably doesn't match the Mediator pattern &lt;em&gt;exactly&lt;/em&gt;, but
it's the closest pattern I could find to what I had in mind. Also, check out
the &quot;latest version post&quot; link at the top of this post to see the latest
update.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As I was writing a simple chat application&lt;br/&gt;
&lt;a href=&quot;https://github.com/Olivine-Labs/Alchemy-Websockets-Example&quot;&gt;for my websocket library&lt;/a&gt;,
I caught myself doing a lot of this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;AlchemyChatServer.MessageReceived = function(event) {
  ParseResponse(event.data);
};

function ParseResponse(response) {
  var data = JSON.parse(response);

  if (data.Type == 0) {
    var message = data.Data.Name + ' connected!';
  } else if (data.Type == 1) {
    var message = data.Data.Name + ' disconnected!';
  } else if (data.Type == 2 &amp;amp;amp;amp;&amp;amp;amp;amp; data.Data.Name != me.Name) {
    ...
  } else if (data.Type == 9999999....)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So, while this works &lt;em&gt;ok&lt;/em&gt;, as you can see, it gets a little... big over time.
That's a lot of if statements to go through. That's a lot of dom interaction
being called from the same chunk of code that's dealing with the messages.
That's tight coupling. So, what happens when, say, we want Chrome to use&lt;br/&gt;
&lt;a href=&quot;http://0xfe.blogspot.com/2010/04/desktop-notifications-with-webkit.html&quot;&gt;desktop notifications&lt;/a&gt;?
Well, we're nesting more if
statements based on data type. Maybe even copypasting this notification code
several times. As we add more conditional logic, it gets heavier, and heavier,
and heavier...&lt;/p&gt;

&lt;p&gt;And that's when it struck me - there is a better way! What if I used an object
that held functions in an array based on response type, and called those
functions when I received a call with that response type? It would be fast, as
an array lookup, and it would let me add any arbitrary amount of functions
based on logic without having to tie it into a massive if/then statement. And,
as an added bonus, we get a &lt;em&gt;really easy&lt;/em&gt; method of testing our application
without being connected to a server, by directly passing our Mediator object
some mocked data.&lt;/p&gt;

&lt;p&gt;I sat down and got together a little utility class that allows you to add
methods based on data type (which we assume to be there. More on this in a
bit.) I added a remove method that allows you to remove all associations for a
given type, or to remove associations based on a type for a specific function
that you've wired up. (Like the jQuery bind / unbind.) I finally added a Call
method, which accepts an object. Easy and elegant.&lt;/p&gt;

&lt;p&gt;And then I got thinking about ways to take it a step further. In our example
chat application - what if I want different logic if it's a chat message with
my username in it? If we allow our Add method to take a predicate as an
alternative to a &quot;type&quot;, we can now say things like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Mediator.Add(DirectedAtMe, DisplayMessageThatIsToMe);

function DirectedAtMe(data){
  if(data.Type == 1 &amp;amp;amp;amp;&amp;amp;amp;amp; data.To == myUserName){
    return true;
  }
}

function DisplayMessageThatIsToMe(data){
  ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So, I came up with this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(function() {
  var Mediator = function() {};

  Mediator.prototype = {
    _callbacks: {
      Predicates: []
    },

    Add: function(condition, fn) {
      if (typeof condition === &quot;function&quot;) {
        this._callbacks.Predicates.push([condition, fn]);
        return;
      }

      if (!this._callbacks[condition]) {
        this._callbacks[condition] = [];
      }

      this._callbacks[condition].push(fn);
      return;
    },

    Remove: function(condition, fn) {
      if (this._callbacks.Predicates.length &amp;gt; 0 &amp;amp; amp; amp; &amp;amp; amp; amp; typeof condition == &quot;function&quot;) {
        var counter = 0;
        for (var x in this._callbacks.Predicates) {
          if (this._callbacks.Predicates[x][0] == condition &amp;amp; amp; amp; &amp;amp; amp; amp;
          (!fn || fn == this._callbacks.Predicates[x])) {
            this._callbacks.Predicates.splice(counter, 1);
            counter--;
          }

          counter++;
        }

        return;
      }

      if (this._callbacks[condition]) {
        if (!fn) {
          this._callbacks[condition] = [];
          return;
        }

        for (var y in this._callbacks[condition]) {
          if (this._callbacks[condition][y] == fn) {
            this._callbacks[condition].splice(y, 1);
          }
        }
      }
    },

    Call: function(data) {
      if (data.Type !== undefined &amp;amp; amp; amp; &amp;amp; amp; amp; this._callbacks[data.Type]) {
        for (var x in this._callbacks[data.Type]) {
          this._callbacks[data.Type][x](data);

        }
      }

      for (var y in this._callbacks.Predicates) {
        if (this._callbacks.Predicates[y][0](data)) {
          this._callbacks.Predicates[y][1](data);
        }
      }
    }
  }

  window.Mediator = Mediator.prototype;
})(window);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Wow, neat-o! So, as long as our &quot;data&quot; object contains a &quot;type&quot;, we can call
anybody who's registered to that type. We can also remove objects, either by
typed, or if it's a named function, by passing in the function. (Note:
anonymous functions won't work here.)&lt;/p&gt;

&lt;p&gt;To see it in action:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function Test(){
    Mediator.Add(0, function(){ alert(&quot;Tested adding typed anonymous functions.&quot;) });

  Mediator.Call({Type: 0});
  Mediator.Remove(0);
  Mediator.Call({Type: 0});

  Mediator.Add(1, AlertMessage);
  Mediator.Add(1, LogMessage);
  Mediator.Call({ Type: 1, Message: &quot;I am alerted and logged.&quot; });
  Mediator.Remove(1, AlertMessage);
  Mediator.Call({ Type: 1, Message: &quot;I am only logged.&quot; });

  Mediator.Add(FilterMessages, AlertMessage);
  Mediator.Call({ From: &quot;Audrey&quot;, Message: &quot;This message shouldn't apear.&quot; });
  Mediator.Call({ From: &quot;Jack&quot;, Message: &quot;This message should ony appear once.&quot; });
  Mediator.Remove(FilterMessages);
  Mediator.Call({ From: &quot;Jack&quot;, Message: &quot;This message should only appear once.&quot; });
}

function AlertMessage(data){
  alert(data.Message);
}

function LogMessage(data){
  console.log(data.Message);
}

function FilterMessages(data){
  return data.From == &quot;Jack&quot;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There it is - I've only spent an hour on it, so I'm sure there's about a
billion refactor points. But,
&lt;a href=&quot;https://github.com/ajacksified/Mediator.js&quot;&gt;here it is on Github&lt;/a&gt;.
Feedback and improvements absolutely welcome.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Venturing Forth to San Francisco</title>
   <link href="http://www.thejacklawson.com//2011/06/venturing-forth-to-san-francisco/index.html"/>
   <updated>2011-06-02T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/06/venturing-forth-to-san-francisco/venturing-forth-to-san-francisco</id>
   <content type="html">&lt;p&gt;Today was my last day at &lt;a href=&quot;http://www.pillartechnology.com/&quot;&gt;Pillar
Technology&lt;/a&gt;. I had an awesome time learning from the great people I worked
with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tim Wingfield (&lt;a href=&quot;http://twitter.com/#!/timwingfield&quot;&gt;@timwingfield&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Michael Kramer (&lt;a href=&quot;http://twitter.com/#!/michaelkramer&quot;&gt;@michaelkramer&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Rebecca Denning (&lt;a href=&quot;http://twitter.com/#!/RebeccaDenning&quot;&gt;@rebeccadenning&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Todd Kauffman (&lt;a href=&quot;http://twitter.com/#!/toddkauffman&quot;&gt;@toddkauffman&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Phil Jordan (&lt;a href=&quot;http://twitter.com/#!/philipjordan&quot;&gt;@philipjordan&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Tyler Wymer (&lt;a href=&quot;http://www.twitter.com/twymer&quot;&gt;@twymer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I learned an incredible amount of time in the short time I was there,
especially about Agile practices, TDD, proper spiraling of footballs, to blame
Phil for everything, to embrace new technologies- even Apple, and how to
pronounce &quot;facade&quot;. That's &quot;fuh-cade&quot; with a long &quot;a&quot; and a hard &quot;c&quot;. I've
begun using vim for everything, I learned how to use Git, and I've picked up
ReSharper and a finer understanding of development productivity.&lt;/p&gt;

&lt;p&gt;I also, in turn, hope that I leave the team with a finer method of brewing
coffee (fill the filter to the top, use fresh water, wash out the pot every
time.) The proper times to do this are 9:15, 10:45, and 2:30.&lt;/p&gt;

&lt;p&gt;As I move forward in my career to San Francisco, I'll look back upon this time
and the knowledge and experienceI've gained, and I hope to retain these
relationships.&lt;/p&gt;

&lt;p&gt;And I'll continue to blame Phil.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dynamic Pages with Perch CMS</title>
   <link href="http://www.thejacklawson.com//2011/05/dynamic-pages-with-perch-cms/index.html"/>
   <updated>2011-05-25T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2011/05/dynamic-pages-with-perch-cms/dynamic-pages-with-perch-cms</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://grabaperch.com&quot;&gt;Perch CMS is pretty awesome&lt;/a&gt;. It's a CMS that stays out
of your way as you're building, allowing you to handcraft html and css (rather
than you having to trust that whatever you're using is outputting good and
efficient code. It's probably not.) And it's absolutely worth the small
licensing fee to save the amount of time you'd spend building a solution /
hacking an existing solution.&lt;/p&gt;

&lt;p&gt;A brief overview of how it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drop the perch directory into your site root (if your site root is
/var/www/herpinderpin.com, your perch directory will be
/var/www/herpinderpin.com/perch)&lt;/li&gt;
&lt;li&gt;Run the perch install&lt;/li&gt;
&lt;li&gt;On your site pages, include a reference to perch/runtime.php&lt;/li&gt;
&lt;li&gt;On your site pages, use &lt;code&gt;perchcontent(&quot;this is a content block&quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Visit the page&lt;/li&gt;
&lt;li&gt;Edit the page content in the Perch administration area&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;It's easy! It's fast! And it's... extremely barebones! Exactly what I want, as
someone who takes pride in my html &amp;amp; css. It has enough flexibility to create
new &quot;content&quot; templates for your non-technical user to use from within perch,
and enough simplicity to let you define how everything is rendered without
having to learn a complicated templating system.&lt;/p&gt;

&lt;p&gt;But, enough about that. Here's the real meat of this subject: how to create
dynamic pages in Perch. It ended up being a lot simpler than I first thought it
would be. You see, Perch doesn't create pages; it simply allows you to edit
content on existing pages. So, if you have a 50-page site, and you want to move
things around, it gets difficult. Note: this works because all of my pages have
the same template. You can get fancier with your .htaccess or page file and
have different page types based various parts of the requested url. I'm showing
a simple case.&lt;/p&gt;

&lt;p&gt;Here's how I solved my problem:&lt;/p&gt;

&lt;p&gt;Create an .htaccess file that points all non-existing files to page.php&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ page.php?_route_=$1 [L,QSA]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Create page.php base template and define good / bad urls&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$route = strtolower($_GET['_route_']);
//we'll make a list of valid pages
$validRoutes = array(
  &quot;derp&quot;,
  &quot;derp/herp&quot;,
  &quot;derp/mcburp&quot;

  &quot;page-not-found&quot;
);

if(!in_array($route, $validRoutes)){
  //if not a valid route, redirect to our custom 404 page
  header('Location: /page-not-found');
  exit;
}

include('./perch/runtime.php');

if($route != ''){
  PerchSystem::set_page($route); // &amp;lt;- MAGIC HERE
}

...

&amp;lt;section&amp;gt;
  &amp;lt;h1&amp;gt;&amp;lt;?php perch_content('Page title') ?&amp;gt;&amp;lt;/h1&amp;gt;
  &amp;lt;?php perch_content('Main content'); ?&amp;gt;
&amp;lt;/section&amp;gt;

&amp;lt;aside&amp;gt;
  &amp;lt;h1&amp;gt;&amp;lt;?php perch_content('Adbar heading'); ?&amp;gt;&amp;lt;/h1&amp;gt;
  &amp;lt;?php perch_content('Adbar content'); ?&amp;gt;
&amp;lt;/aside&amp;gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Saw that &lt;code&gt;PerchSystem::set_page($route);&lt;/code&gt; ? Well, that lets us force the perch
&quot;page&quot; so that we can fake it. Even though everything's loading from page.php,
Perch sees &quot;derp/herp&quot; as the path, and in the content management, let us edit
as if we were within that page!&lt;/p&gt;

&lt;p&gt;We also check valid routes so by nefariousness or mistake, someone can't spam a
bunch of junk urls, filling up your poor CMS editing screen.&lt;/p&gt;

&lt;p&gt;An infinite number of pages, all spawned through a single page! Easy enough,
right?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;there is a Pages plugin, but it writes out all the files statically, and it's messy.&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PHP 5.3.3 with MySQL on IIS7: Issue Solved</title>
   <link href="http://www.thejacklawson.com//2010/10/php-5-3-3-with-mysql-on-iis7-issue-solved/index.html"/>
   <updated>2010-10-15T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2010/10/php-5-3-3-with-mysql-on-iis7-issue-solved/php-5-3-3-with-mysql-on-iis7-issue-solved</id>
   <content type="html">&lt;p&gt;Running Server 2008 - After following all of the normal install guides for PHP
5.3.3, I kept running across an error where the page would hang for about 60
seconds, and then give me a database connection issue. Strange indeed!&lt;/p&gt;

&lt;p&gt;After struggling with this for a while, I came across &lt;a href=&quot;http://blog.tjitjing.com/index.php/2010/02/php-5-3-1-upgrade-on-iis7-and-mysqlgives-internal-server-error.html&quot;&gt;an enlightening blog
post&lt;/a&gt;
that had a simple fix: remove the IPv6 definition for localhost, and
everything was magical and happy and wonderful.&lt;/p&gt;

&lt;p&gt;Open up your host file at c:/windows/system32/drivers/etc/hosts, and comment out
&lt;code&gt;::1 localhost&lt;/code&gt; so it looks like&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;127.0.0.1 localhost
#::1 localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And problem solved.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>HTML 5: Why and How</title>
   <link href="http://www.thejacklawson.com//2010/08/html-5-why-and-how/index.html"/>
   <updated>2010-08-10T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2010/08/html-5-why-and-how/html-5-why-and-how</id>
   <content type="html">&lt;p&gt;HTML has been around for a
while- since the original HTML spec designed by Tim Berners-Lee in 1990. In
those 20 years, HTML has evolved to include new syntax, tags, and style, both
in its original form as well as in branching to create the commonly-used xhtml
format.&lt;/p&gt;

&lt;p&gt;HTML 5 brings with it changes in syntax, loosens some of the tight restrictions
of xhtml strict, and adds new tags, attributes, attribute values, and API
methods. The goal of these changes is to make a more semantic, robust internet
within which one may create web applications with a focus on accessibility and
without the necessity to rely on third-party plugins for interactivity.&lt;/p&gt;

&lt;h2&gt;Benefits to Upgrading Existing Code&lt;/h2&gt;

&lt;p&gt;Existing code, written in xhtml transitional, or even HTML 4, works fine today
just like any vetted code or framework. However, HTML 5 brings many benefits to
both the developer as well as the end user.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More semantic markup using  tags such as “section”, “aside”, “header”,
“footer”, and “nav”&lt;/li&gt;
&lt;li&gt;Developers can clearly see more clearly what different pieces of code are
without having to fully understand a page or control within a website, and are
thus less likely to make mistakes&lt;/li&gt;
&lt;li&gt;Users’ browsing tools gain better ability to, based on content type, perform
functions such as zooming or screen-reading, now that they have context&lt;/li&gt;
&lt;li&gt;New media tags such as “video”, “audio”&lt;/li&gt;
&lt;li&gt;Developers can now assign captions, pictures, and other pieces of useful data
to video and audio which helps accessibility as well as gives users more
information about the multimedia&lt;/li&gt;
&lt;li&gt;No more reliance on 3&lt;sup&gt;rd^&lt;/sup&gt; party technologies like Flash and Silverlight for
audio and video rendering&lt;/li&gt;
&lt;li&gt;Support by popular mobile devices such as iPhones, iPads and Android devices&lt;/li&gt;
&lt;li&gt;Metadata

&lt;ul&gt;
&lt;li&gt;Metadata allows developers to classify blocks of markup as a data object.
This allows users’ browsers and tools to parse this data; for example,
classifying an event and adding that event to a Google calendar. Metadata also
influences search results and provides additional information to users, where
they can be parsed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Standards-setting body is not owned by a profit-driven corporation

&lt;ul&gt;
&lt;li&gt;Adobe could collapse, leaving us stuck with old, dead technology; the W3C is
made of representatives from many organizations that acts as a governing body&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Offline storage database allows you to set your application to “offline mode”
and work, and save changes later&lt;/li&gt;
&lt;li&gt;Browser-based drag-and-drop API, reducing need for a javascript-based solution&lt;/li&gt;
&lt;li&gt;Geolocation API&lt;/li&gt;
&lt;li&gt;New form input types: date, time, email, url, search, color&lt;/li&gt;
&lt;li&gt;These will restrict and validate inputs for you (as implemented). Some will
be new controls (date, time, and color) that will appear when you click on the
input field; some do things like dynamically changing the keyboard layout,
based on type, on input devices such as the iPhone and Android phones.&lt;/li&gt;
&lt;li&gt;HTML 5 is designed such that old controls (such as an input with type
“color”) work with browsers without HTML 5 support&lt;/li&gt;
&lt;li&gt;HTML 5 is supported in Chrome, FireFox, Safari, Opera, and IE 9&lt;/li&gt;
&lt;li&gt;Some elements will be dropped from the HTML 5 spec. These elements are:
&lt;em&gt;acronym, applet, basefont, big, center, dir, font, frame, frameset, isindex,
noframes, s, strike, tt, u&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Potential Setbacks to Updating Code&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Time used in training developers and updating old code&lt;/li&gt;
&lt;li&gt;No browser support in IE 6-8&lt;/li&gt;
&lt;li&gt;Can be mitigated by a piece of Javascript code that “creates” the elements
within the browser&lt;/li&gt;
&lt;li&gt;Spec is not 100% locked down and may change during browser implementation&lt;/li&gt;
&lt;li&gt;Browser differences can be mitigated by using a “reset stylesheet” that
forces all elements to remain unstyled until specifically styled by the
developer the same way differences are fixed in xhtml elements we use today in
elements like “ul” and “body” which use padding or margin depending on browser&lt;/li&gt;
&lt;li&gt;HTML 5 does not require the same strict markup that xhtml does, such as
closing /&gt;, quotes around attributes, requiring attributes to have values, and
requiring lower-case names and attributes. This can result in “ugly” code if
standards are not followed.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;HTML 5 Implementation&lt;/h2&gt;

&lt;p&gt;Implementing the technology can be boiled down to two steps:  installing the
“shiv” and reset stylesheet for IE, and using the new tags. However, in order
to take advantage of these new tags, existing code should be updated where
appropriate to use them. Some divs may be renamed to “section”, “article”, or
“aside” tags; heading levels may change based on their position within
sections; input fields may be changed to specify input type such as “email”.
This work may be done as areas of code are refactored, or it may be done as
part of an overall initiative to update to html 5 at once.&lt;/p&gt;

&lt;p&gt;The benefit of updating as refactoring occurs is that the developer is already
in the code, causing changes and testing to happen regardless, and upgrading
some elements to the latest could piggyback as part of the project. However, a
partially-converted project results and it may not be able to take full
advantage of the benefits provided by html 5. Converting an entire project at
once allows all benefits to be had, but causes an additional time sink that may
be unavailable.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>ASP.NET 4.0 Changes tl;dr</title>
   <link href="http://www.thejacklawson.com//2010/06/asp-net-4-0-changes-tldr/index.html"/>
   <updated>2010-06-25T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2010/06/asp-net-4-0-changes-tldr/asp-net-4-0-changes-tldr</id>
   <content type="html">&lt;p&gt;&lt;em&gt;ASP.NET 4.0 Updates&lt;/em&gt; -
&lt;a href=&quot;http://www.asp.net/learn/whitepapers/aspnet4&quot;&gt;http://www.asp.net/learn/whitepapers/aspnet4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;tl;dr:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stuff moved from web.config to machine.config&lt;/li&gt;
&lt;li&gt;More robust XSS checking and form post validation&lt;/li&gt;
&lt;li&gt;More streamlined inclusion of Microsoft AJAX framework (UpdatePanels), and
jQuery (which Microsoft officially includes now)&lt;/li&gt;
&lt;li&gt;More control over viewstate&lt;/li&gt;
&lt;li&gt;Built-in page routing for webforms (how MVC urls work, but now works with
webforms. &lt;a href=&quot;http://www.mem.com/contentdisplay/5123431&quot;&gt;www.mem.com/contentdisplay/5123431&lt;/a&gt; for example)&lt;/li&gt;
&lt;li&gt;Setting client IDs on controls instead of ASP.NET building it for you&lt;/li&gt;
&lt;li&gt;New Chart control&lt;/li&gt;
&lt;li&gt;Project templates slimmed down&lt;/li&gt;
&lt;li&gt;Better CSS styling on controls, option to not render tables around some
controls (formview, login, stuff like that)&lt;/li&gt;
&lt;li&gt;ASP.NET MVC2&lt;/li&gt;
&lt;li&gt;Intellisense improvements&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Tl;dr: tl;dr: Lots of little updates that will make asp.net better.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;C# 4.0 Updates&lt;/em&gt; - &lt;a href=&quot;http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=cs2010samples&amp;amp;DownloadId=10177&quot;&gt;MSDN C# 2010 Samples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;tl;dr:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Dynamic binding; create objects and use methods and properties that may not
exist yet on a “dynamic” typed object. This gets resolved at runtime. Upside:
use non-type-safe languages and crazy voodoo magic where you don’t know the
type. Downside: you only catch bugs at runtime. Use sparingly, but for awesome
things. “dynamic” objects can literally do anything, as long as whatever it
ends up as supports it. No lambdas on dynamic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tl;dr: magic, type safety is so 2009&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Named and optional arguments; you don’t have to enter in your parameters in
order, or even enter in all of them.&lt;/li&gt;
&lt;li&gt;“string”- that’s lower-case, kids- is an object now.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Tl;dr: tl;dr: Dynamic programming is the key word. Also VB updates, but if a
tree falls in the forest and nobody’s around to hear it, does anyone care?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ASP.NET 4.0 Breaking Changes&lt;/em&gt; - &lt;a href=&quot;http://www.asp.net/learn/whitepapers/aspnet4/breaking-changes&quot;&gt;.NET 4 Breaking changes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;tl;dr:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A bunch of stuff you can do to revert changes, so I dunno why they’re in the
“Breaking changes list”. Read for details, sorry.&lt;/li&gt;
&lt;li&gt;Stronger .aspx parsing, controls with random characters breaking stuff will
break stuff. Our code should be clean, but needs to be looked at anyway.&lt;/li&gt;
&lt;li&gt;Stronger request validation, so errors may occur on posts that didn’t
previously. To revert, we can add a line in the web.config if it gets crazy.
Definitely check pages with rich text controls.&lt;/li&gt;
&lt;li&gt;Update your projects through visual studio to .net 4.0 so your web config
doesn’t get borked. They support it, but it’ll make life easier.&lt;/li&gt;
&lt;li&gt;A bunch of troubleshooting options&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;tl;dr: tl;dr: More stuff, almost definitely won’t break existing code we have.
Double-check pages submitting HTML (rich text areas.)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;tl;dr: Better standards, MVC 2, Dynamic typing, stronger parsing and
validation&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>HTML5 Site – Waterford Family Bowl (Part 3 of n)</title>
   <link href="http://www.thejacklawson.com//2010/05/html5-site-waterford-family-bowl-part-3/index.html"/>
   <updated>2010-05-04T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2010/05/html5-site-waterford-family-bowl-part-3/html5-site-waterford-family-bowl-part-3</id>
   <content type="html">&lt;p&gt;(&lt;a href=&quot;http://www.thejacklawson.com/index.php/2010/04/html5-site-waterford-family-bowl-part-1-of-n/&quot;&gt;Back to beginning of series&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Part 3: Site Architecture Design&lt;/p&gt;

&lt;p&gt;Now that I had the majority of the HTML and CSS down, I had more to figure out
about how to implement the various features (like image gallery, news,and
mailing list). Should I write my own, or should I use existing tools? What
language should I use? What database system? Which pages should be static,
which dynamic? The process of building he site was all about efficiency:
getting the most done, using the best tools, in the least amount of time. That
would allow me to focus as much time as possible in my before my deadline
towards the things that will make a difference: site design, usability, and the
the use of the features on the site.&lt;/p&gt;

&lt;p&gt;I came with the conclusion that I could, and should, develop most of the data
management using external tools. Spending time re-inventing the wheel and
rebuilding tools that already have dedicated teams would be wasteful,
especially when they all had some sort of hook (mostly RSS feeds) that I could
just pull into the site. I was familiar with all the 3rd party tools I needed,
so I was already comfortable with using them and knew they had the features
that I needed. I came up with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.google.com/apps/intl/en/business/index.html&quot;&gt;Google Apps&lt;/a&gt; for
email and calendar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://om4.com.au/client/embedding-google-apps-calendar/&quot;&gt;Here's a good
tutorial&lt;/a&gt;. It was a
little messy at first, but it gives you an iframe (the only standards-breaking
thing on the site... thanks, Goog) that you can just drop in.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://picasa.google.com/&quot;&gt;Picasa&lt;/a&gt; for photo gallery&lt;/li&gt;
&lt;li&gt;I chose Picasa for a few reasons, the largest of which was the integration of
the Google Apps account. While there's no &quot;Picasa&quot; section of Google Apps, I
could use the account I set up to minimize the logins I'm using, now that I'm
using four tools. I used the RSS feed to export to the image gallery and to
make an image gallery  RSS link on the home page.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wordpress.org/&quot;&gt;Wordpress&lt;/a&gt; for dynamic pages and news&lt;/li&gt;
&lt;li&gt;The reason I used Wordpress, and I didn't just slap together my own editor,
was the &lt;a href=&quot;http://wordpress.org/extend/plugins/page-feeder/&quot;&gt;WCM Page Feeder&lt;/a&gt;
plugin. It allows you to serve individual Wordpress pages as an RSS feed. This
means that I could use WP's superior news-serving tools along with their page
editing tools with very simple integration. I also added an RSS link to the
home page, for news.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pommo.org/Main_Page&quot;&gt;Pommo&lt;/a&gt; for mailing list management&lt;/li&gt;
&lt;li&gt;I tried out a few tools, and found this to be the easiest to set up. Makes
adding an email form pretty simple, manages everything for me. Another several
hours saved to these guys. Here's some credit :D&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I also used a couple 3rd party PHP Libraries so that I could hook all of this
lovliness together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://simplepie.org/&quot;&gt;Simplepie&lt;/a&gt; RSS Reader&lt;/li&gt;
&lt;li&gt;Note: I had to switch my Wordpress RSS feeds over to Atom, even though SP
claims it can read the RSS 2.0 standard. This was a simple checkbox in the
&quot;Writing&quot; section of the Wordpress settings.&lt;/li&gt;
&lt;li&gt;phpmailer for mail functions&lt;/li&gt;
&lt;li&gt;A little messy to set up to go through Google Apps mail. I had to set &lt;a href=&quot;http://pastebin.com/GDP5XKCq&quot;&gt;these settings&lt;/a&gt; in
class.phpmailer.php in order to connect without errors. Once you have this part
right, though, you're good to go. I'll go into more detail about this in the
next article.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Once all of these tools were in place, it was a simple matter of dumping their
content, using Simplepie, into my template. I'll talk about the actual hooking
up of everything, and setting up the custom code I did write, in the next
article.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>HTML5 Site WFB Site UI Design / HTML Structure (Part 2 of n)</title>
   <link href="http://www.thejacklawson.com//2010/04/html5-site-wfb-site-ui-design-html-structure-part-2-of-n/index.html"/>
   <updated>2010-04-29T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2010/04/html5-site-wfb-site-ui-design-html-structure-part-2-of-n/html5-site-wfb-site-ui-design-html-structure-part-2-of-n</id>
   <content type="html">&lt;p&gt;i_
(&lt;a href=&quot;http://www.thejacklawson.com/index.php/2010/04/html5-site-waterford-family-bowl-part-1-of-n/&quot;&gt;Back to beginning of series&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Part 2: Site UI Design / HTML Structure&lt;/p&gt;

&lt;p&gt;When I first picked up the project, I had a few things to consider: what
requirements do I have, and once I had those, how would I display these feature
in a neat manner, and what technologies would I use to implement them. The
requirements part came out pretty easily, after a couple of phone conversations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calendar of events&lt;/li&gt;
&lt;li&gt;Photo Gallery&lt;/li&gt;
&lt;li&gt;News section&lt;/li&gt;
&lt;li&gt;A few generic pages&lt;/li&gt;
&lt;li&gt;Email mailing list&lt;/li&gt;
&lt;li&gt;Misc. vital information (times open, address, that sort of thing)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;And now I needed to put together some kind of design. I had recently finished
reading a few usability books, so I was feeling pretty good about putting some
of these ideas to work. I knew that people coming to the website were probably
going for directions, a phone number, or hours of operation, so I put high
priority on these being visible and easy to use (such as a Google Maps link for
the address). I also wanted to entice people to explore other areas, so I added
some photos from the photo gallery towards the top of the page. Finally, I
included elements from all the page- just little teasers- across the front
page, such as a small calendar of events, news block, and a blurb and picture
about their restaurant. Now, I had a home page with all the information a user
needs, quickly and at the top, while encouraging visitors to browse a little
and check out the gallery and other pages for even more information.&lt;/p&gt;

&lt;p&gt;With this sketched out on paper, it was time to actually write out the HTML. I
came up with a structure similar to &lt;a href=&quot;http://www.thejacklawson.com/index.php/2010/04/my-html5-template/&quot;&gt;my HTML5 Template&lt;/a&gt;
(and in fact, it's what I based my
template off of.) I wanted to use the new semantic HTML5 elements and
attributes, such as example text on textboxes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; name=&quot;Email&quot; id=&quot;email&quot; maxlength=&quot;60&quot; placeholder=&quot;email@youraddress.com&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I used the help of a &lt;a href=&quot;http://jquery-watermark.googlecode.com/&quot;&gt;jQuery Watermark plugin&lt;/a&gt;
to help style the textboxes as
well, since few browsers actually pay attention to the placeholder attribute
yet. Further HTML5 inclusions were sections for the individual blocks of text,
an aside for the side column, header, footer, and nav elements. Besides the
HTML5, I also implemented a link tag for the news RSS feed:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&quot;alternate&quot; type=&quot;application/rss+xml&quot; title=&quot;RSS&quot; href=&quot;http://www.waterfordfamilybowl.com/wordpress/index.php/feed/&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This allows browsers and whatever happens to crawl your site to say &quot;hey,
there's an RSS feed here&quot; and allow users to easily pick up the news RSS feed.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>HTML5 Site – Waterford Family Bowl (Part 1 of n)</title>
   <link href="http://www.thejacklawson.com//2010/04/html5-site-waterford-family-bowl-part-1-of-n/index.html"/>
   <updated>2010-04-03T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2010/04/html5-site-waterford-family-bowl-part-1-of-n/html5-site-waterford-family-bowl-part-1-of-n</id>
   <content type="html">&lt;p&gt;A little while ago, my aunt approached me- she needed a website for her bowling
alley. &quot;Sure,&quot; I said. &quot;Let's go over what you want and we'll build something
that works for you.&quot;  In the back of my mind, I was thinking &quot;awesome! Perfect
timing to flex my HTML5 muscles and try jQuery 1.4 in a production environment;
will it work?&quot;&lt;/p&gt;

&lt;p&gt;The site's now completed, and in production. Go ahead and check it out at
&lt;a href=&quot;http://www.waterfordfamilybowl.com/&quot;&gt;http://www.waterfordfamilybowl.com&lt;/a&gt;. I'm going to, over a
series of 4 or 5 posts, go over how the site works- how and why I used PHP,
jQuery, HTML 5, jQuery, Wordpress, Picasa, Google Analytics and Webmaster
tools, and Google Apps; and, how I merged them all to create a dynamic, easy to
use and easy to edit website. I used principles from books like &quot;The Design of
Everyday Things&quot; and &quot;Don't Make Me Think&quot;, and I'll explain how and where
these came into play.   The process I took made even IE 6 compatibility a
breeze!&lt;/p&gt;

&lt;p&gt;Brief overview on how I plan to break it down:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Intro to series&lt;/li&gt;
&lt;li&gt;Design - architecturally and graphically&lt;/li&gt;
&lt;li&gt;Implementation of Wordpress, Picasa, etc.&lt;/li&gt;
&lt;li&gt;&quot;Contact Us&quot;, finishing touches&lt;/li&gt;
&lt;li&gt;Google Analytics and Google Webmaster Tools overviews&lt;/li&gt;
&lt;li&gt;Wrap-up (maybe?)&lt;/li&gt;
&lt;/ol&gt;

</content>
 </entry>
 
 <entry>
   <title>Wacom Bamboo Tablet Experience</title>
   <link href="http://www.thejacklawson.com//2010/02/wacom-bamboo-tablet-experience/index.html"/>
   <updated>2010-02-18T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2010/02/wacom-bamboo-tablet-experience/wacom-bamboo-tablet-experience</id>
   <content type="html">&lt;p&gt;(This post was started using my new tablet!)&lt;/p&gt;

&lt;p&gt;Well, I suppose that now that I have a tablet, I oughta start practicing. You
see, I've never been one to have exceptional handwriting skills, so it's a good
thing that I now have a computer that can understand my handwriting better than
my 8th-grade Spanish teacher could. I used to get a LOT of 0s on my
homework.&lt;/p&gt;

&lt;p&gt;(At this point, I'm back to my keyboard because my hand began cramping up. I
tried, at least... Typing at 90WPM  on my keyboard is superior to writing using
a plastic pen on a mat.)&lt;/p&gt;

&lt;p&gt;I've long dreamed of owning a graphics tablet, for quick mockups (I included my
first here. Creative Commons license, feel free to derive from its
awesomeness.) I picked up the
&lt;a href=&quot;http://www.amazon.com/gp/product/B002OOWC3S?ie=UTF8&amp;amp;tag=thbape-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B002OOWC3S&quot;&gt;Wacom Pen &amp;amp; Touch&lt;/a&gt;.
Three days in, it has been fun to play with; while it hasn't been
100% everything that I ever imagined it would be, I think that it may be more
of a learning curve issue rather than an issue with the technology itself. I'm
used to using a mouse that I have to throw all over a mousepad, not a pen and a
tablet that maps 1:1 with my monitor (originally, it mapped to both monitors
before I turned off the second monitor in the tablet settings.)&lt;/p&gt;

&lt;p&gt;One of the troubles I was having was that it seemed somewhat laggy when I was
using my pen on Windows 7 with Photoshop CS3. I noticed mostly that when I was
writing, I couldn't add small details well (look at how crazy all of the lines
in my As are); it would sort of &lt;em&gt;stick&lt;/em&gt; and think it was supposed to pull up
some kind of command menu. I'd like to blame it on myself, as a user error...
but it isn't at all obvious how I fix that issue, if it is one.&lt;/p&gt;

&lt;p&gt;Regardless, I'm going to soldier on and try a few more mockups before passing
more severe judgement. There are probably some hidden settings somewhere to
fix; and once I have those figured out, I'll post a follow-up on how I did it.
Hopefully I do it. Don't crush my dreams, Wacom.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>jQuery 1.4.2 updates, and the release of jQuery UI 1.8rc2</title>
   <link href="http://www.thejacklawson.com//2010/02/jquery-1-4-2-jquery-ui-1-8rc2/index.html"/>
   <updated>2010-02-16T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2010/02/jquery-1-4-2-jquery-ui-1-8rc2/jquery-1-4-2-jquery-ui-1-8rc2</id>
   <content type="html">&lt;p&gt;&lt;a class=&quot;zem_slink&quot; title=&quot;JQuery&quot; rel=&quot;homepage&quot;
href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt; 1.4.2 is out- not officially on their
website, but you can be sneaky and get it here:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://code.jquery.com/jquery-1.4.2.js&quot;&gt;http://code.jquery.com/jquery-1.4.2.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a
href=&quot;http://code.jquery.com/jquery-1.4.2.min.js&quot;&gt;http://code.jquery.com/jquery-1.4.2.min.js&lt;/a&gt; (not really &quot;minified&quot; as much as &quot;closure compiled&quot;... can we
get a verb for that?) The changelog isn't up yet, but that's generally the last
thing to go (and hey, we snuck in the back door to grab the update anyway,
right?) I imagine it'll eventually find it's way to &lt;a
href=&quot;http://api.jquery.com/category/version/1.4.2/&quot;&gt;their API page for 1.4.2&lt;/a&gt;.  I ran a quick diff; here's some changes that I found notable from
jQuery 1.4.1 to 1.4.2:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Optimizations for the body selector&lt;/li&gt;
&lt;li&gt;A few changes to how arrays of elements selected are built, I'll go with my
gut and say that they're optimizations too&lt;/li&gt;
&lt;li&gt;Trimming whitespace from JSON data responses, for good ol' IE&lt;/li&gt;
&lt;li&gt;A more few various bugfixy-looking things, mostly targeting IE&lt;/li&gt;
&lt;li&gt;It looks like there was a lot done to the event-adding code; I think mostly
internal changes. Probably more optimizations? I'll leave it to Resig or
someone to explain whenever the changelog comes out. A few (generally pretty
deep) methods had some parameters changed, or were renamed (things like
&quot;jQuery.event.special.submit.remove&quot; becoming
&quot;jQuery.event.special.submit.teardown&quot;)&lt;/li&gt;
&lt;li&gt;A smattering of changes within &quot;live&quot; and &quot;die&quot; mostly centering around the
usage of namespaces&lt;/li&gt;
&lt;li&gt;Blackberry browser bugfix concerning converting NodeLists to arrays&lt;/li&gt;
&lt;li&gt;jQuery.getText changed to jQuery.text&lt;/li&gt;
&lt;li&gt;Changes to caching fragments to help out WebKit and IE 6&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I haven't really dug too deeply in the jQuery core before, so I'm not totally
qualified to give a whole lot more detail than that. I used SourceGear
Diffmerge between 1.4.1 and 1.4.2 to find out what I found out.&lt;/p&gt;

&lt;p&gt;Also, in related (and perhaps more &lt;em&gt;official &lt;/em&gt;news),  the jQuery UI team &lt;a
href=&quot;http://blog.jqueryui.com/2010/02/jquery-ui-18rc2/&quot;
target=&quot;_blank&quot;&gt;released jQuery UI 1.8rc2&lt;/a&gt; - which includes bugfixes in the
already pretty stable 1.8rc1 (&lt;a
href=&quot;http://jqueryui.com/docs/Changelog/1.8rc2&quot;
target=&quot;_blank&quot;&gt;changelog&lt;/a&gt;). You can grab it:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://jquery-ui.googlecode.com/files/jquery-ui-1.8rc2.zip&quot;
target=&quot;_blank&quot;&gt;http://jquery-ui.googlecode.com/files/jquery-ui-1.8rc2.zip&lt;/a&gt;
(development bundle)&lt;/p&gt;

&lt;p&gt;As of right now, I'm testing it in our application at MeM. Let's see how things
go!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>ASP.NET Controls, How I Hate Them</title>
   <link href="http://www.thejacklawson.com//2010/02/asp-net-controls-how-i-hate-them/index.html"/>
   <updated>2010-02-08T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2010/02/asp-net-controls-how-i-hate-them/asp-net-controls-how-i-hate-them</id>
   <content type="html">&lt;p&gt;I've always, for some reason, felt innately that &lt;a class=&quot;zem_slink&quot;
title=&quot;PHP&quot; rel=&quot;homepage&quot; href=&quot;http://www.php.net/&quot;&gt;PHP&lt;/a&gt; allowed me more
control over my code than &lt;a class=&quot;zem_slink&quot; title=&quot;ASP.NET&quot; rel=&quot;homepage&quot;
href=&quot;http://www.asp.net&quot;&gt;ASP.NET&lt;/a&gt;. My &lt;em&gt;brain &lt;/em&gt;kept saying &quot;but .NET is more
organized! It compiles! It's faster! It's easier to write,&quot; but my &lt;em&gt;mind &lt;/em&gt;kept
saying &quot;PHP lets me do what I want how I want it... screw .NET!&quot;&lt;/p&gt;

&lt;p&gt;What I finally figured out was that I love C#, I even like the &lt;a
class=&quot;zem_slink&quot; title=&quot;.NET Framework&quot; rel=&quot;homepage&quot;
href=&quot;http://msdn.microsoft.com/netframework/&quot;&gt;.NET framework&lt;/a&gt;, but I hate
is, in fact, ASP.NET.&lt;/p&gt;

&lt;p&gt;Every time I see an example of simple, elegant code, the most complex control
on the page is a label or a panel. While the intentions behind FormView may be
good, writing my own forms and hooking them up saves hundreds of lines
(literally- I just refactored almost 800 lines of code into 150 by &lt;em&gt;removing &lt;/em&gt;a
formview) as well as reduces complexity and maintenance (now I no longer have
to maintain view and edit and whatever other modes FormView has.) ASP.NET
perhaps made sense in a day before OO principles and ORMs came into play; the
controls were written for the same kind of people that use the drag-and-drop
design mode. Easy to slap down haphazardly, not so easy to maintain.&lt;/p&gt;

&lt;p&gt;We replaced every ASP.NET &lt;a class=&quot;zem_slink&quot; title=&quot;ASP.NET AJAX&quot;
rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/ASP.NET_AJAX&quot;&gt;Ajax&lt;/a&gt;
control we used anywhere (after I evangelized it, to my chagrin) with &lt;a
class=&quot;zem_slink&quot; title=&quot;JQuery&quot; rel=&quot;homepage&quot;
href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt; after about 6 months of use; while the
controls did what we needed on the surface, underneath there was &lt;em&gt;always&lt;/em&gt; some
caveat, like the linked DropDowns needed web services, or the datepicker
control had missing options... there was always something somewhere that I
needed a bit of flexibility on that just wasn't there, or was buggy. It seemed
very odd for it to be out of beta in such a state. So, I ended up starting my
own control library using jQuery, and now it's easily extensible, easy to
modify from the client, and I can control the markup.&lt;/p&gt;

&lt;p&gt;Oh, and the markup... don't get me started on the markup. Tables for
&lt;em&gt;everything&lt;/em&gt;. I can't rearrange the otherwise useful Wizard control because
it's so static in its display.&lt;/p&gt;

&lt;p&gt;So, I guess the point I'm trying to make is, that the longer I use .NET, the
less and less I use the complex controls and the more I roll my own. Because
it's &lt;em&gt;easier&lt;/em&gt;.
Kind of ironic.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>A Switch to Chrome (Mostly): A Followup</title>
   <link href="http://www.thejacklawson.com//2010/01/a-switch-to-chrome-mostly-a-followup/index.html"/>
   <updated>2010-01-21T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2010/01/a-switch-to-chrome-mostly-a-followup/a-switch-to-chrome-mostly-a-followup</id>
   <content type="html">&lt;p&gt;A follow-up to my &lt;a href=&quot;http://www.thejacklawson.com/index.php/2009/07/a-switch-to-chrome-mostly/&quot;&gt; original post from July&lt;/a&gt;, a mere 6 months ago.&lt;/p&gt;

&lt;p&gt;I have, now, totally switched to Chrome. And yes, it was exactly for the reason
I fully expected to: extensions came out. Sort of like Google's this big
Overmind that watches all...&lt;/p&gt;

&lt;p&gt;Then again, I guess it is, isn't it.&lt;/p&gt;

&lt;p&gt;Anyway, the performance difference between FireFox and Chrome is clear. In
direct contrast to one comment left on my original post, I have as many
extensions in Chrome as I do in FireFox, performing the same activities (with
one caveat)- and it is noticeably faster. I load up FF when I do IE: to test
the differences in rendering engines across browsers, so that I can fix the CSS
and Javascript bugs. To be fair, FF has the best debugging (that version of
FireBug is far superior to anything I've seen yet), which makes testing so much
easier. But, FF is on my machine only for that. For debugging. Not for browsing.&lt;/p&gt;

&lt;p&gt;Honestly, I see absolutely no compelling reasons to use anything but Chrome;
it's what I install on all of my relative's computers, and it's what I use
every day at work and home.&lt;/p&gt;

&lt;p&gt;All hail the Overmind!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Don't Make Me Think: Book Review Part 2</title>
   <link href="http://www.thejacklawson.com//2010/01/dont-make-me-think-book-review-part-2/index.html"/>
   <updated>2010-01-19T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2010/01/dont-make-me-think-book-review-part-2/dont-make-me-think-book-review-part-2</id>
   <content type="html">&lt;p&gt;The first section of the book, called &quot;Guiding Principles&quot;, lays the foundation
to begin thinking about usability. It explains the thought process that the end
user takes; it's never what you plan, but with proper design, you can help
guide and funnel them in the right direction.&lt;/p&gt;

&lt;p&gt;I've explained it in another post before: developers often think exactly like
their application: we think, &quot;if the user clicks X, they'll see a menu for Y,
which they can click to get to Z. Wire it up!&quot; but in reality, the user isn't a
developer and doesn't know the application end-to end. They have to muddle
their way through the website, and if they're lucky, they'll manage to follow
your carefully laid track. The only way we can have a hope to get them from
X-&gt;Y-&gt;Z is by making each link, button, or step as clear as possible by
developing controls that are self-explanatory in use. Buttons should look
clickable, links should stand out from the text, headers should be obvious, and
navigation should be clear. The user shouldn't have to look up help text,
experiment, or even pause to think in their quest to get to Z.&lt;/p&gt;

&lt;div class=&quot;zemanta-pixie&quot; style=&quot;margin-top: 10px; height: 15px;&quot;&gt;In other 
words, if you think, &quot;we'll just add explanatory text right here,&quot; You're Doing 
It Wrong.&lt;/div&gt;


&lt;div class=&quot;zemanta-pixie&quot; style=&quot;margin-top: 10px; height: 15px;&quot;&gt;Stay tuned 
for Part 3!&lt;/div&gt;


&lt;div class=&quot;zemanta-pixie&quot; style=&quot;margin-top: 10px; height: 15px;&quot;&gt;&lt;a 
href=&quot;http://www.thejacklawson.com/index.php/2010/01/dont-make-me-think-book-rev
iew-part-1/&quot;&gt;Part 1&lt;/a&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>jQuery 1.4 Released! (Let's have an end-to-end testing party)</title>
   <link href="http://www.thejacklawson.com//2010/01/jquery-1-4-released-lets-have-an-end-to-end-testing-party/index.html"/>
   <updated>2010-01-16T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2010/01/jquery-1-4-released-lets-have-an-end-to-end-testing-party/jquery-1-4-released-lets-have-an-end-to-end-testing-party</id>
   <content type="html">&lt;p&gt;Query 1.4 was released as final on January 14, 2010, at 1pm (or so) EST.  The
day it came out, I went to my boss and said &quot;let's update! Woohoo! I'll order
some cake&quot; and he (yeah, yeah, rightfully) said &quot;we need to discuss
implications.&quot; Which was a good thing, because- well, why should we even bother
with the days of testing that it'll require to switch out our framework?&lt;/p&gt;

&lt;p&gt;I did some research, and there are some very, very compelling reasons. Here's
what I wrote to our team:&lt;/p&gt;

&lt;p&gt;We may want to look at updating, or at least putting it in and testing, soon.&lt;/p&gt;

&lt;p&gt;Benefits of upgrading:
* Performance updates
* IE fixes, including some fixes to IE event bubbling
* Includes extra API calls and additions to existing functions
* Maintaining possibility to use new plugins as they are created for
the latest version of jQuery
* Better handling for events (outside of just IE)- we can (should)
refactor and reduce a lot of our jQuery code using events
* Better support for multiple simultaneous animations
* More granular &quot;does my browser support X&quot; checks&lt;/p&gt;

&lt;p&gt;The downside is that we're going to have to do pretty thorough testing in all
browsers to make sure that the update hasn't broken anything. The main areas to
hit will be places that plugins are used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Autocomplete for country/state&lt;/li&gt;
&lt;li&gt;Loading screen in DE / Admin&lt;/li&gt;
&lt;li&gt;Media plugin that sets up flash for Audio Guest Book in display&lt;/li&gt;
&lt;li&gt;Simple Uploader&lt;/li&gt;
&lt;li&gt;Help boxes in DE&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;We'll need to spot-check around other areas of the site for javascript errors
as well. jQuery still supports the same browsers- FF 2+, IE 6+, Safari 3+,
Opera 9+, Chrome 1+ (&lt;a href=&quot;http://docs.jquery.com/Browser_Compatibility%22%0Atarget=%22_blank%22&gt;http://docs.jquery.com/Browser_Compatibility&amp;lt;/a&gt;&quot;&gt;&lt;/a&gt; so we
shouldn't expect any new weirdness in archaic browsers like IE6.&lt;/p&gt;

&lt;p&gt;More information about the update can be found at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://css.dzone.com/articles/jquery-14-improves-code-and&quot;&gt;http://css.dzone.com/articles/jquery-14-improves-code-and&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://api.jquery.com/category/version/1.4/&quot;&gt;http://api.jquery.com/category/version/1.4/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.jquery.com/JQuery_1.4_Roadmap&quot;&gt;http://docs.jquery.com/JQuery_1.4_Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jquery14.com/day-01/jquery-14&quot;&gt;http://jquery14.com/day-01/jquery-14&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Also: &quot;&lt;a href=&quot;http://net.tutsplus.com/tutorials/javascript-ajax/jquery-1-4-released-the-15-new-features-you-must-know/&quot;&gt;15 new features you must know&lt;/a&gt;&quot;:&lt;/p&gt;

&lt;p&gt;(Lower is better):
&lt;a title=&quot;Performance of .html() by John Resig, on Flickr&quot; href=&quot;http://www.flickr.com/photos/jeresig/4271691747/&quot;&gt;&lt;img class=&quot;alignleft&quot;
src=&quot;http://farm5.static.flickr.com/4037/4271691747_0cce01a33d.jpg&quot;
alt=&quot;Performance of .html()&quot; width=&quot;240&quot; height=&quot;180&quot; /&gt;&lt;/a&gt;&lt;a
title=&quot;Performance of .remove() and .empty() by John Resig, on Flickr&quot;
href=&quot;http://www.flickr.com/photos/jeresig/4271690883/&quot;&gt;&lt;img class=&quot;alignleft&quot;
src=&quot;http://farm3.static.flickr.com/2693/4271690883_3224979b9b.jpg&quot;
alt=&quot;Performance of .remove() and .empty()&quot; width=&quot;240&quot; height=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a title=&quot;Performance of .css() by John Resig, on Flickr&quot;
href=&quot;http://www.flickr.com/photos/jeresig/4271691599/&quot;&gt;&lt;img class=&quot;alignleft&quot;
src=&quot;http://farm5.static.flickr.com/4055/4271691599_8a2f2e0624.jpg&quot;
alt=&quot;Performance of .css()&quot; width=&quot;240&quot; height=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a title=&quot;Performance of DOM Insertion by John Resig, on Flickr&quot;
href=&quot;http://www.flickr.com/photos/jeresig/4271691471/&quot;&gt;&lt;img class=&quot;alignleft&quot;
src=&quot;http://farm5.static.flickr.com/4029/4271691471_1240afd5af.jpg&quot;
alt=&quot;Performance of DOM Insertion&quot; width=&quot;240&quot; height=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a title=&quot;# of Function Calls for Popular jQuery Methods by John Resig, on
Flickr&quot; href=&quot;http://www.flickr.com/photos/jeresig/4271691293/&quot;&gt;&lt;img
src=&quot;http://farm3.static.flickr.com/2781/4271691293_324e506c7b.jpg&quot; alt=&quot;# of
Function Calls for Popular jQuery Methods&quot; width=&quot;240&quot; height=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Cleanup</title>
   <link href="http://www.thejacklawson.com//2010/01/cleanup/index.html"/>
   <updated>2010-01-15T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2010/01/cleanup/cleanup</id>
   <content type="html">&lt;p&gt;I'm going through and cleaning up some of my old posts- especially some of the
ones with code examples. They're pretty ugly at times, and it just so happens
that two of the worst are the two most popular posts here (the one about &lt;a
href=&quot;http://www.thejacklawson.com/index.php/tag/datapager/&quot;&gt;DataPagers and
Listviews desynching&lt;/a&gt;, and the one about &lt;a
href=&quot;http://www.thejacklawson.com/index.php/tag/flex-dynamic-stylesheets/&quot;&gt;Flex
 External Stylesheets&lt;/a&gt;.) Things may be rocky as I find a good syntax
highlighter. It's already proven to be much more difficult than it should be.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Don't Make Me Think: Book Review Part 1</title>
   <link href="http://www.thejacklawson.com//2010/01/dont-make-me-think-book-review-part-1/index.html"/>
   <updated>2010-01-14T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2010/01/dont-make-me-think-book-review-part-1/dont-make-me-think-book-review-part-1</id>
   <content type="html">&lt;p&gt;After a 4-month break in which I was too busy getting ready for, delivering, and caring for our second child (Penelope Rose- November 16, 2009), I return!&lt;/p&gt;

&lt;p&gt;I've had some pretty strange and interesting things go on in the meantime. The first of which that I will relay on to you will be some thoughts on the fantastic book &quot;&lt;a class=&quot;zem_slink&quot; title=&quot;Don't Make Me Think: A Common Sense Approach to Web Usability, 2nd Edition&quot; rel=&quot;amazon&quot; href=&quot;http://www.amazon.com/Dont-Make-Me-Think-Usability/dp/0321344758%3FSubscriptionId%3D0G81C5DAZ03ZR9WH9X82%26tag%3Dzemanta-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321344758&quot;&gt;Don't Make Me Think&lt;/a&gt;&quot; by the brilliant &lt;a class=&quot;zem_slink&quot; title=&quot;Steve Krug&quot; rel=&quot;homepage&quot; href=&quot;http://www.sensible.com/&quot;&gt;Steve Krug&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I used to think of &lt;a class=&quot;zem_slink&quot; title=&quot;Usability&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Usability&quot;&gt;usability&lt;/a&gt; like it was some horrible sea monster, constraining design and getting in the way of just plain moving forward. But then some space ray hit a neuron in my brain, and suddenly I was interested in usability. &quot;Can you develop fast, beautifully, and usable? Is it all about plain blue underlined links, and Times New Roman, or is usability something else?&quot;&lt;/p&gt;

&lt;p&gt;My first stop was another excellent book, &lt;a href=&quot;http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0465067107/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1263514728&amp;sr=8-1&quot; target=&quot;_blank&quot;&gt;The Design of Everyday Things&lt;/a&gt; by &lt;a class=&quot;zem_slink&quot; title=&quot;Donald Norman&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Donald_Norman&quot;&gt;Donald A. Norman&lt;/a&gt;. I started with this much heavier book when I saw it on &lt;a class=&quot;zem_slink&quot; title=&quot;Jeff Atwood&quot; rel=&quot;homepage&quot; href=&quot;http://www.codinghorror.com&quot;&gt;Jeff Atwood&lt;/a&gt;'s reading list; it's a more general book that covers design everywhere, whether &lt;a class=&quot;zem_slink&quot; title=&quot;Industrial design&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Industrial_design&quot;&gt;industrial design&lt;/a&gt;, architecture, interface design... it was about the obvious dos and don'ts. I think that even though it was a heavier book, if I did it again I'd still start with it. It explains very well that usability isn't about killing desig- it's about making design accessible.&lt;/p&gt;

&lt;p&gt;Then, one day when I was browsing around &lt;a class=&quot;zem_slink&quot; title=&quot;Barnes &amp; Noble&quot; rel=&quot;homepage&quot; href=&quot;http://www.barnesandnobleinc.com/&quot;&gt;Barnes and Nobles&lt;/a&gt; (my wife in the children's section, me in the computer), I saw in big letters &quot;Don't Make Me Think.&quot; Having recently finished helping redesign several key areas of our website, all because these specific areas were a little rocky to use, I was intrigued. So, I picked it up... and two hours later, the store started to close while I was leafing through mid-book, my Peppermint Mocha congealed and cold.&lt;/p&gt;

&lt;p&gt;There are two key points to Don't Make Me Think that make it a joy to read: it's brevity and bluntness, and it's humor. It's less than 200 pages, and the entire book could be read in a 4-hour sitting; but the wealth of information contained within it will impact for a lifetime.  I'll be posting more over the coming weeks pertaining to specific chapters and sections of the book. Yay Usability!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>On Boating</title>
   <link href="http://www.thejacklawson.com//2009/09/on-boating/index.html"/>
   <updated>2009-09-23T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/09/on-boating/on-boating</id>
   <content type="html">&lt;p&gt;An aircraft carrier is incredibly secure; it's safe, it's backed by the government, it's got infrastructure and it's built to last.&lt;/p&gt;

&lt;p&gt;But everyone still wants to ride the luxury yacht.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Drawing Inspiration - an Overview on Sketchflow</title>
   <link href="http://www.thejacklawson.com//2009/09/drawing-inspiration-an-overview-on-sketchflow/index.html"/>
   <updated>2009-09-22T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/09/drawing-inspiration-an-overview-on-sketchflow/drawing-inspiration-an-overview-on-sketchflow</id>
   <content type="html">&lt;p&gt;If you've downloaded &lt;a class=&quot;zem_slink&quot; title=&quot;Microsoft Expression Blend&quot;
rel=&quot;homepage&quot;
href=&quot;http://www.microsoft.com/products/expression/en/expression-blend/&quot;&gt;Blend&lt;/
a&gt; 3- or if you've heard a bit about it- you may have heard of the &lt;a
class=&quot;zem_slink&quot; title=&quot;Software prototyping&quot; rel=&quot;wikipedia&quot;
href=&quot;http://en.wikipedia.org/wiki/Software_prototyping&quot;&gt;prototyping&lt;/a&gt; tool
&lt;a
href=&quot;http://www.microsoft.com/expression/products/SketchFlow_OverView.aspx&quot;&gt;Sketchflow&lt;/a&gt;. It's an extension of the &lt;a
href=&quot;http://www.microsoft.com/expression/&quot;&gt;Microsoft Expression&lt;/a&gt; Blend
tool, and allows you to quickly &lt;a class=&quot;zem_slink&quot; title=&quot;Design&quot;
rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Design&quot;&gt;design&lt;/a&gt; a site's
flow, page by page, and then define the components within it.
I started playing around with Sketchflow when I was tasked with coming up with
a &quot;grand master plan&quot; for a project that I wanted to take on. Creating the page
flow seemed easy enough; it wasn't long before I had a nice little tree drawn
that covered everything from the first page to the last, with neat little
arrows directing the user's flow. When you hit F5 (or build), you're taken to a
compiled version of the site, from which you can navigate to each of your
pages. Pretty neat.
The real power came out when I started dropping in labels, textboxes, and
buttons, and then attaching events from each of those buttons to navigate to
other pages. Suddenly, I was able to take my prototype to the next level-
instead of bits of scrap paper, I was creating an interactable demo that I
could show off, that saved notes and annotations for later reviewal.  As soon
as I had it figured out (mostly), I showed the other person that I was working
with how to set up, and within a matter of minutes, we were designing away.
There's a big difference when you can show off a &quot;working&quot; prototype instead of
a few concept drawings; you could get a feel for the flow of the application,
and because it felt more real, you could do a bit more of a gut-check. It felt
closer to production, even though it really wasn't any further than that scrap
paper; and it took about as much time (in fact, probably less, edits are easier
in digital format). And if you do feel inclined to shuffle around dead plants,
you can always export the whole project as a &lt;a class=&quot;zem_slink&quot;
title=&quot;Microsoft Word&quot; rel=&quot;homepage&quot;
href=&quot;http://office.microsoft.com/word&quot;&gt;Word&lt;/a&gt; doc.
P.S., one small hint- the &quot;sketch&quot; style is not on by default. It's hidden
under the controls chevron, if you click the triangle next to &quot;Styles&quot; and then
&quot;Sketchflow&quot;. It is a HUGE PAIN to change styles... which kind of baffles me.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Google PageSpeed, a Beautiful Thing</title>
   <link href="http://www.thejacklawson.com//2009/09/google-pagespeed-a-beautiful-thing/index.html"/>
   <updated>2009-09-15T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/09/google-pagespeed-a-beautiful-thing/google-pagespeed-a-beautiful-thing</id>
   <content type="html">&lt;div class=&quot;zemanta-img&quot; style=&quot;margin: 1em; display: block;&quot;&gt;
&lt;div&gt;&lt;dl class=&quot;wp-caption alignright&quot; style=&quot;width: 260px;&quot;&gt; &lt;dt class=&quot;wp-caption-dt&quot;&gt;&lt;a href=&quot;http://www.crunchbase.com/company/google&quot;&gt;&lt;img title=&quot;Image representing Google as depicted in Crunc...&quot; src=&quot;http://www.crunchbase.com/assets/images/resized/0002/9578/29578v7-max-450x450.jpg&quot; alt=&quot;Image representing Google as depicted in Crunc...&quot; width=&quot;250&quot; height=&quot;99&quot; /&gt;&lt;/a&gt;&lt;/dt&gt; &lt;dd class=&quot;wp-caption-dd zemanta-img-attribution&quot; style=&quot;font-size: 0.8em;&quot;&gt;Image via &lt;a href=&quot;http://www.crunchbase.com&quot;&gt;CrunchBase&lt;/a&gt;&lt;/dd&gt; &lt;/dl&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;More &lt;a class=&quot;zem_slink&quot; title=&quot;Google&quot; rel=&quot;homepage&quot; href=&quot;http://google.com&quot;&gt;Google&lt;/a&gt; loving! This time, it's a plugin for &lt;a class=&quot;zem_slink&quot; title=&quot;Firebug (Firefox extension)&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Firebug_%28Firefox_extension%29&quot;&gt;Firebug&lt;/a&gt; (the best tool in the world for developers- get it now) that Google created, called &lt;a href=&quot;http://code.google.com/speed/page-speed/&quot; target=&quot;_blank&quot;&gt;Page Speed&lt;/a&gt;. Here's the breakdown, and here's why it rocks.
Page Speed analyzes your code, running the same checks that Google uses for their own sites- checking for things like unoptimized images, un-gzipped code, slow &lt;a class=&quot;zem_slink&quot; title=&quot;Cascading Style Sheets&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Cascading_Style_Sheets&quot;&gt;CSS&lt;/a&gt;, uncompressed &lt;a class=&quot;zem_slink&quot; title=&quot;JavaScript&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/JavaScript&quot;&gt;Javascript&lt;/a&gt;, and more; and then it delivers you a neat little report, which you can then use as a checklist of things to fix. Page Speed allowed me to cut over half a meg from the page requests from one of the projects I was working on; kind of a big deal. Even if you think your application is amazing, there's a small chance that a quick 20-second test can tell you something that'll save you bandwidth, and by extension, money. Saving money is good, and saving your visitors time and bandwidth is great.
Check it out, and revel in the awesomeness.&lt;/p&gt;

&lt;div class=&quot;zemanta-pixie&quot; style=&quot;margin-top: 10px; height: 15px;&quot;&gt;&lt;a class=&quot;zemanta-pixie-a&quot; title=&quot;Reblog this post [with Zemanta]&quot; href=&quot;http://reblog.zemanta.com/zemified/46c69175-8d0c-443b-8b68-6063760520c1/&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; style=&quot;border: medium none; float: right;&quot; src=&quot;http://img.zemanta.com/reblog_e.png?x-id=46c69175-8d0c-443b-8b68-6063760520c1&quot; alt=&quot;Reblog this post [with Zemanta]&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;zem-script more-related pretty-attribution&quot;&gt;&lt;script src=&quot;http://static.zemanta.com/readside/loader.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>Tracking AJAX in ASP.NET with Google Analytics</title>
   <link href="http://www.thejacklawson.com//2009/09/tracking-ajax-in-asp-net-with-google-analytics/index.html"/>
   <updated>2009-09-01T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/09/tracking-ajax-in-asp-net-with-google-analytics/tracking-ajax-in-asp-net-with-google-analytics</id>
   <content type="html">&lt;div class=&quot;zemanta-img&quot; style=&quot;margin: 1em; display: block;&quot;&gt;
&lt;div&gt;&lt;dl class=&quot;wp-caption alignright&quot; style=&quot;width: 250px;&quot;&gt; &lt;dt class=&quot;wp-caption-dt&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/76347018@N00/2290586287&quot;&gt;&lt;img title=&quot;Google analytics for recruitment&quot; src=&quot;http://farm4.static.flickr.com/3243/2290586287_6c02972b60_m.jpg&quot; alt=&quot;Google analytics for recruitment&quot; /&gt;&lt;/a&gt;&lt;/dt&gt; &lt;dd class=&quot;wp-caption-dd zemanta-img-attribution&quot; style=&quot;font-size: 0.8em;&quot;&gt;Image by &lt;a href=&quot;http://www.flickr.com/photos/76347018@N00/2290586287&quot;&gt;carveconsulting&lt;/a&gt; via Flickr&lt;/dd&gt; &lt;/dl&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;em&gt;(skip down a little further if you don't need an introduction to &lt;a class=&quot;zem_slink&quot; title=&quot;Google Analytics&quot; rel=&quot;homepage&quot; href=&quot;http://www.google.com/analytics&quot;&gt;Google Analytics&lt;/a&gt;.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I love &lt;a class=&quot;zem_slink&quot; title=&quot;Google&quot; rel=&quot;homepage&quot; href=&quot;http://google.com&quot;&gt;Google&lt;/a&gt; Analytics. In fact, I'm a big fan of Google as a whole, and I do the majority of my work using Google &lt;a class=&quot;zem_slink&quot; title=&quot;Google Docs&quot; rel=&quot;homepage&quot; href=&quot;http://docs.google.com/&quot;&gt;Docs&lt;/a&gt;, &lt;a class=&quot;zem_slink&quot; title=&quot;Google Calendar&quot; rel=&quot;homepage&quot; href=&quot;http://google.com/calendar&quot;&gt;Calendar&lt;/a&gt;, and Gmail (online collaboration! oh, and free) and Google Analytics is a beautiful tool for businesses, whether their &lt;a class=&quot;zem_slink&quot; title=&quot;Website&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Website&quot;&gt;website&lt;/a&gt;'s primary focus is online sales or just a small info-about-my-business site. If you don't have some kind of tracking, you're missing out on very important information; GA is a good place to start. Anybody can put GA into their website, and everybody should put something in.&lt;/p&gt;

&lt;p&gt;The way GA works is by dropping a snippet of &lt;a class=&quot;zem_slink&quot; title=&quot;JavaScript&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/JavaScript&quot;&gt;Javascript&lt;/a&gt; into your page; this javascript runs a series of tests against the visitor's browser, checking &lt;a class=&quot;zem_slink&quot; title=&quot;Display resolution&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Display_resolution&quot;&gt;screen resolution&lt;/a&gt;, flash capabilities, seeing if the user is unique, watching the user's path through the website, checking the user's location, and much, much more (all collected anonymously). This is all put into an interface where you can see the data collected and organized. However, &lt;a class=&quot;zem_slink&quot; title=&quot;Ajax (programming)&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Ajax_%28programming%29&quot;&gt;AJAX&lt;/a&gt; applications don't function as normal websites- you don't get a new &lt;a class=&quot;zem_slink&quot; title=&quot;Hit (internet)&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Hit_%28internet%29&quot;&gt;page hit&lt;/a&gt; every time you fire off an UpdatePanel, because it's not a full page refresh. So, we need to do a little trickery to get things to work the way we want them to.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(you can start reading again if you skipped earlier.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you have the Google Analytics in the host page (whether the aspx page, or more likely, the master page), then you have to register a client script block that calls the trackpageview method. If you use &lt;a class=&quot;zem_slink&quot; title=&quot;JQuery&quot; rel=&quot;homepage&quot; href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt;, it'll look something like:&lt;/p&gt;

&lt;p&gt;@ScriptManager.RegisterClientScriptBlock(UpdatePanelID, typeof(UpdatePanel), &quot;uniqueIdentifierString&quot;, &quot;$(document).ready(function(){ pageTracker._trackPageview('/pagename'); });&quot;, true);@&lt;/p&gt;

&lt;p&gt;If you're not using jQuery, you'll have to do a little more work to attach to the window's onload event, but it's pretty similar.
What you're doing is registering a script block to execute when the UpdatePanel updates (because it won't execute JS returned in the text), and using the pageTracker object (that the GA code you copied when you first set up GA on your site created) to force a pageview for a page you define. For my applications, I generally use something like &quot;/dataentry/guestbook/edit&quot; or &quot;/dataentry/guestbook/delete&quot; so that I can easily track guestbook views, as well as edits / deletes. It's both a way to track controls you load via AJAX, and a cheap shot at logging (not perfect data, though, so you're still best off doing all of your own logging on events, of course.)&lt;/p&gt;

&lt;p&gt;The official Google help doc on the subject is also here: &lt;a href=&quot;http://www.google.com/support/analytics/bin/answer.py?hl=en&amp;answer=55519&quot; target=&quot;_blank&quot;&gt;http://www.google.com/support/analytics/bin/answer.py?hl=en&amp;amp;answer=55519&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;zemanta-pixie&quot; style=&quot;margin-top: 10px; height: 15px;&quot;&gt;&lt;a class=&quot;zemanta-pixie-a&quot; title=&quot;Reblog this post [with Zemanta]&quot; href=&quot;http://reblog.zemanta.com/zemified/570dfef3-4261-4739-9d63-560430307e2b/&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; style=&quot;border: medium none ; float: right;&quot; src=&quot;http://img.zemanta.com/reblog_e.png?x-id=570dfef3-4261-4739-9d63-560430307e2b&quot; alt=&quot;Reblog this post [with Zemanta]&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;zem-script more-related pretty-attribution&quot;&gt;&lt;script src=&quot;http://static.zemanta.com/readside/loader.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>A Switch to Chrome (Mostly)</title>
   <link href="http://www.thejacklawson.com//2009/07/a-switch-to-chrome-mostly/index.html"/>
   <updated>2009-07-06T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/07/a-switch-to-chrome-mostly/a-switch-to-chrome-mostly</id>
   <content type="html">&lt;div class=&quot;zemanta-img&quot; style=&quot;margin: 1em; display: block;&quot;&gt;
&lt;div&gt;&lt;dl class=&quot;wp-caption alignright&quot; style=&quot;width: 250px;&quot;&gt;&lt;dt class=&quot;wp-caption-dt&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/32346232@N05/3037237384&quot;&gt;&lt;img title=&quot;Google Chrome&quot; src=&quot;http://farm4.static.flickr.com/3179/3037237384_707c01eb11_m.jpg&quot; alt=&quot;Google Chrome&quot; /&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd class=&quot;wp-caption-dd zemanta-img-attribution&quot; style=&quot;font-size: 0.8em;&quot;&gt;Image by &lt;a href=&quot;http://www.flickr.com/photos/32346232@N05/3037237384&quot;&gt;Matrixizationized&lt;/a&gt; via Flickr&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I've almost totally exclusively switched to &lt;a class=&quot;zem_slink&quot; title=&quot;Google Chrome&quot; rel=&quot;homepage&quot; href=&quot;http://www.google.com/chrome&quot;&gt;Chrome&lt;/a&gt;, kind of.&lt;/p&gt;

&lt;p&gt;It's so much better than &lt;a class=&quot;zem_slink&quot; title=&quot;Firefox&quot; rel=&quot;homepage&quot; href=&quot;http://www.mozilla.com/en-US/firefox/&quot;&gt;FireFox&lt;/a&gt;. Don't get me wrong- FireFox is great- but it's just not Chrome.  I recently caught myself in the act of groaning when I had to open up FireFox just so that I could run (the absolutely FANTASTIC) FireBug, the same way that a year ago I groaned when I had to open up IE for testing. It just takes &lt;em&gt;so long&lt;/em&gt; to boot, and in those eight seconds, I could have opened Chrome a dozen times. I'm writing this post in FireFox because it has &lt;a href=&quot;http://www.thejacklawson.com/index.php/2009/04/zemanta-is-awesome/&quot; target=&quot;_blank&quot;&gt;Zemanta&lt;/a&gt;, not because I want to.&lt;/p&gt;

&lt;p&gt;It's strange when a browser that I fought against, and then fought for, fell so quickly when Google threw it's weight into the arena. I was crazy about FireFox; every day I extolled its merits to coworkers, to family, to strangers who happened to glance my way. I do the same thing now, but haltingly, with a line like  &quot;but if you really want to see something fast check &lt;em&gt;this&lt;/em&gt; out,&quot; as I load up Chrome.&lt;/p&gt;

&lt;p&gt;Oh, come quickly, Chrome extensions, and may I banish FireFox to the realm of &quot;browsers to load when testing&quot;. FireFox, it was great while it lasted. Maybe someday.&lt;/p&gt;

&lt;div class=&quot;zemanta-pixie&quot; style=&quot;margin-top: 10px; height: 15px;&quot;&gt;&lt;a class=&quot;zemanta-pixie-a&quot; title=&quot;Reblog this post [with Zemanta]&quot; href=&quot;http://reblog.zemanta.com/zemified/19721008-95be-4c12-8f8c-dc32ebd1966b/&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; style=&quot;border: medium none; float: right;&quot; src=&quot;http://img.zemanta.com/reblog_e.png?x-id=19721008-95be-4c12-8f8c-dc32ebd1966b&quot; alt=&quot;Reblog this post [with Zemanta]&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;zem-script more-related pretty-attribution&quot;&gt;&lt;script src=&quot;http://static.zemanta.com/readside/loader.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>When is a Technology Dead?</title>
   <link href="http://www.thejacklawson.com//2009/06/when-is-a-technology-dead/index.html"/>
   <updated>2009-06-10T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/06/when-is-a-technology-dead/when-is-a-technology-dead</id>
   <content type="html">&lt;div class=&quot;zemanta-img&quot; style=&quot;margin: 1em; display: block;&quot;&gt;
&lt;div&gt;&lt;dl class=&quot;wp-caption alignright&quot; style=&quot;width: 142px;&quot;&gt;&lt;dt class=&quot;wp-caption-dt&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Image:Internet_Explorer_logo_old.png&quot;&gt;&lt;img title=&quot;Previous logo of Microsoft Internet Explorer u...&quot; src=&quot;http://upload.wikimedia.org/wikipedia/en/0/0f/Internet_Explorer_logo_old.png&quot; alt=&quot;Previous logo of Microsoft Internet Explorer u...&quot; width=&quot;132&quot; height=&quot;139&quot; /&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd class=&quot;wp-caption-dd zemanta-img-attribution&quot; style=&quot;font-size: 0.8em;&quot;&gt;Image via &lt;a href=&quot;http://en.wikipedia.org/wiki/Image:Internet_Explorer_logo_old.png&quot;&gt;Wikipedia&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I wish I could call &lt;a class=&quot;zem_slink&quot; title=&quot;Internet Explorer 6&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Internet_Explorer_6&quot;&gt;IE6&lt;/a&gt; dead.&lt;/p&gt;

&lt;p&gt;I've spent hundreds of &lt;a class=&quot;zem_slink&quot; title=&quot;Man-hour&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Man-hour&quot;&gt;man-hours&lt;/a&gt; doing &lt;a class=&quot;zem_slink&quot; title=&quot;Cascading Style Sheets&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Cascading_Style_Sheets&quot;&gt;CSS&lt;/a&gt; fixes for it, and every day, I check &lt;a class=&quot;zem_slink&quot; title=&quot;Google Analytics&quot; rel=&quot;homepage&quot; href=&quot;http://www.google.com/analytics&quot;&gt;Google Analytics&lt;/a&gt; to see how close we are to its death... and every day, I'm disappointed.&lt;/p&gt;

&lt;p&gt;Technically, it is dead. Most standards say the latest 2 versions (of course, that got really big when &lt;a class=&quot;zem_slink&quot; title=&quot;Internet Explorer 8&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Internet_Explorer_8&quot;&gt;IE8&lt;/a&gt; came out, excellent excuse to drop it), and it's 6 years old by now, well past the average lifespan of any technology. But, the problem is, for all of my idealism and complaints and loss of efficiency, we still have over 30% of our users on the ancient mind-breaker. So, unfortunately, for all of my complaints, for all of my IE6 specific cde and CSS fixes.. it's not dead. It's not defined by age, but by users. So until the time comes when IE updates become mandatory, or our users finally move on... it's still very alive, in my nightmares and in my everyday coding experiences.&lt;/p&gt;

&lt;div class=&quot;zemanta-pixie&quot; style=&quot;margin-top: 10px; height: 15px;&quot;&gt;&lt;a class=&quot;zemanta-pixie-a&quot; title=&quot;Reblog this post [with Zemanta]&quot; href=&quot;http://reblog.zemanta.com/zemified/8b545c24-c9b9-441a-8355-a73b8814e315/&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; style=&quot;border: medium none; float: right;&quot; src=&quot;http://img.zemanta.com/reblog_e.png?x-id=8b545c24-c9b9-441a-8355-a73b8814e315&quot; alt=&quot;Reblog this post [with Zemanta]&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;zem-script more-related pretty-attribution&quot;&gt;&lt;script src=&quot;http://static.zemanta.com/readside/loader.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>APIs and Extensibility</title>
   <link href="http://www.thejacklawson.com//2009/06/apis-and-extensibility/index.html"/>
   <updated>2009-06-05T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/06/apis-and-extensibility/apis-and-extensibility</id>
   <content type="html">&lt;div class=&quot;zemanta-img&quot; style=&quot;margin: 1em; display: block;&quot;&gt;
&lt;div&gt;&lt;dl class=&quot;wp-caption alignright&quot; style=&quot;width: 172px;&quot;&gt; &lt;dt class=&quot;wp-caption-dt&quot;&gt;&lt;a href=&quot;http://www.crunchbase.com/product/flickr&quot;&gt;&lt;img title=&quot;Image representing Flickr as depicted in Crunc...&quot; src=&quot;http://www.crunchbase.com/assets/images/resized/0001/0830/10830v1-max-450x450.png&quot; alt=&quot;Image representing Flickr as depicted in Crunc...&quot; width=&quot;162&quot; height=&quot;63&quot; /&gt;&lt;/a&gt;&lt;/dt&gt; &lt;dd class=&quot;wp-caption-dd zemanta-img-attribution&quot; style=&quot;font-size: 0.8em;&quot;&gt;Image via &lt;a href=&quot;http://www.crunchbase.com&quot;&gt;CrunchBase&lt;/a&gt;&lt;/dd&gt; &lt;/dl&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;More and more often, it becomes obvious to me how important an external &lt;a class=&quot;zem_slink&quot; title=&quot;Application programming interface&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Application_programming_interface&quot;&gt;API&lt;/a&gt; is. What better way is there to share your product, then to let people build on top of your &lt;a class=&quot;zem_slink&quot; title=&quot;Service layer&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Service_layer&quot;&gt;service layer&lt;/a&gt; and customize their own interface? If someone doesn't like the look of your program, or how it feels, they may leave; but a missed opportunity can quickly turn into another user when they find someone else's implementation of your &lt;a class=&quot;zem_slink&quot; title=&quot;Application software&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Application_software&quot;&gt;application&lt;/a&gt;. Or, other applications may pull your data into their product, giving you another &lt;a class=&quot;zem_slink&quot; title=&quot;Revenue stream&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Revenue_stream&quot;&gt;revenue stream&lt;/a&gt; (or just more users), more popularity, your name thrown around more; it's free advertising and a great testimony to your product that someone liked it so much that they included it in their product.&lt;/p&gt;

&lt;p&gt;I recently looked into &lt;a class=&quot;zem_slink&quot; title=&quot;Flickr&quot; rel=&quot;homepage&quot; href=&quot;http://www.flickr.com&quot;&gt;Flickr&lt;/a&gt;'s API, for integration into a project I was working on, which spawned this thought. It is absolutely fantastic that I can call a URL with some credentials, and bam, I have the file I need. The user doesn't have to upload (or worse, download from Flickr and reupload) to another photo-sharing application; they can just point out a url, and I can display it. It's really awesome. &lt;a class=&quot;zem_slink&quot; title=&quot;Twitter&quot; rel=&quot;homepage&quot; href=&quot;http://twitter.com&quot;&gt;Twitter&lt;/a&gt; has feeds, that I can pull into my blog; even my blog has an API that will allow other sites to post comments to me without ever loading my site. That's pretty cool stuff.&lt;/p&gt;

&lt;p&gt;For an information-hosting web app, this is one of the best things you can do to increase views and popularity. If you have a good service layer, expose some of it (with the right security, of course), let other people use your app. More users is never a bad thing.&lt;/p&gt;

&lt;div class=&quot;zemanta-pixie&quot; style=&quot;margin-top: 10px; height: 15px;&quot;&gt;&lt;a class=&quot;zemanta-pixie-a&quot; title=&quot;Reblog this post [with Zemanta]&quot; href=&quot;http://reblog.zemanta.com/zemified/d95e66f8-f407-431d-ac9d-fab33225b4ff/&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; style=&quot;border: medium none; float: right;&quot; src=&quot;http://img.zemanta.com/reblog_e.png?x-id=d95e66f8-f407-431d-ac9d-fab33225b4ff&quot; alt=&quot;Reblog this post [with Zemanta]&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;zem-script more-related pretty-attribution&quot;&gt;&lt;script src=&quot;http://static.zemanta.com/readside/loader.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>On Agility</title>
   <link href="http://www.thejacklawson.com//2009/05/on-agility/index.html"/>
   <updated>2009-05-30T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/05/on-agility/on-agility</id>
   <content type="html">&lt;div class=&quot;zemanta-img&quot; style=&quot;margin: 1em; display: block;&quot;&gt;
&lt;div&gt;&lt;dl class=&quot;wp-caption alignright&quot; style=&quot;width: 310px;&quot;&gt; &lt;dt class=&quot;wp-caption-dt&quot;&gt;&lt;a href=&quot;http://commons.wikipedia.org/wiki/Image:Supertanker_AbQaiq.jpg&quot;&gt;&lt;img title=&quot;...structures and vehicles of all sizes...&quot; src=&quot;http://upload.wikimedia.org/wikipedia/commons/thumb/7/75/Supertanker_AbQaiq.jpg/300px-Supertanker_AbQaiq.jpg&quot; alt=&quot;...structures and vehicles of all sizes...&quot; width=&quot;300&quot; height=&quot;109&quot; /&gt;&lt;/a&gt;&lt;/dt&gt; &lt;dd class=&quot;wp-caption-dd zemanta-img-attribution&quot; style=&quot;font-size: 0.8em;&quot;&gt;Image via &lt;a href=&quot;http://commons.wikipedia.org/wiki/Image:Supertanker_AbQaiq.jpg&quot;&gt;Wikipedia&lt;/a&gt;&lt;/dd&gt; &lt;/dl&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The most important quality of any IT company- web-based or otherwise- is the ability to quickly change, to turn on a dime. The openness and ability to foster innovation is absolutely critical, even expanding past IT companies; without change, you fall behind. And when you fall behind, it is only a matter of time before the inevitable collapse.&lt;/p&gt;

&lt;p&gt;I read an interesting article in &lt;a class=&quot;zem_slink&quot; title=&quot;Wired (magazine)&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Wired_%28magazine%29&quot;&gt;Wired&lt;/a&gt; yesterday about car companies. It suggested they become more like the computer industry, setting standards for components and allowing hundreds of parts manufacturers develop these sort of plug-in devices. These manufacturers would be smaller and agile, developing new, efficient parts, which not only helps the company sell more, but also gives consumers the chance to purchase better products. The big car companies would be like &lt;a class=&quot;zem_slink&quot; title=&quot;Dell&quot; rel=&quot;homepage&quot; href=&quot;http://www.dell.com/&quot;&gt;Dell&lt;/a&gt;, offering a sort of base upon which to customize and put together these parts.&lt;/p&gt;

&lt;p&gt;The key here is that in a vertical company, where all processes are overseen by a massive beauracracy, is unable to change, while the hundreds of small parts manufacturers, overseen by a standards commitee, are each able to introduce breakthroughs in their respective areas. It is the same way with any IT company; one who is overseen by a large beauracracy is never going to stay with modern times. They are the ones still using IE6, to support their apps and unwillingness to change, while small 5-man companies are able to revolutionize the web with things like &lt;a class=&quot;zem_slink&quot; title=&quot;YouTube&quot; rel=&quot;homepage&quot; href=&quot;http://www.youtube.com/&quot;&gt;Youtube&lt;/a&gt;, &lt;a class=&quot;zem_slink&quot; title=&quot;Flickr&quot; rel=&quot;homepage&quot; href=&quot;http://www.flickr.com&quot;&gt;Flickr&lt;/a&gt;, &lt;a class=&quot;zem_slink&quot; title=&quot;Twitter&quot; rel=&quot;homepage&quot; href=&quot;http://twitter.com&quot;&gt;Twitter&lt;/a&gt;. When was the last time a large company built an app like that?&lt;/p&gt;

&lt;p&gt;A lot of this requires upfront planning. The huge company is reluctant to change after investing millions in a system that is rigid; a properly planned system is one that is flexible; one should never think that you can build the perfect long-lasting solution. You can get close, but five years down the road, something will inevatably be superior and your app must be rewritten. Modularize your development and make this possible, because it is a matter of when, not if.&lt;/p&gt;

&lt;p&gt;It is imperative that innovation is prized, that a company does demand absolute, 100% control, because when this happens, a company loses its character and becomes dead in the water.&lt;/p&gt;

&lt;div class=&quot;zemanta-pixie&quot; style=&quot;margin-top: 10px; height: 15px;&quot;&gt;&lt;a class=&quot;zemanta-pixie-a&quot; title=&quot;Reblog this post [with Zemanta]&quot; href=&quot;http://reblog.zemanta.com/zemified/d9b9308e-5afb-49db-9710-40c1b2b98ef5/&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; style=&quot;border: medium none; float: right;&quot; src=&quot;http://img.zemanta.com/reblog_e.png?x-id=d9b9308e-5afb-49db-9710-40c1b2b98ef5&quot; alt=&quot;Reblog this post [with Zemanta]&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;zem-script more-related pretty-attribution&quot;&gt;&lt;script src=&quot;http://static.zemanta.com/readside/loader.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>When Does a Framework Become a Language?</title>
   <link href="http://www.thejacklawson.com//2009/05/when-does-a-framework-become-a-language/index.html"/>
   <updated>2009-05-26T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/05/when-does-a-framework-become-a-language/when-does-a-framework-become-a-language</id>
   <content type="html">&lt;p&gt;A friend of mine posed this question a few days ago: at
what point does a framework become ubiquitous enough to be a language on its
own?&lt;/p&gt;

&lt;p&gt;This came after a brief discussion about jQuery, where the
point was made that we hardly ever use traditional, raw Javascript anymore. We
use jQuery to write the core of our applications,  jQuery to do UI effects,
jQuery for validation. We hardly ever even use the word Javascript. But, the
question he posed is, is jQuery the same thing as Javascript? Is it different
enough to be considered something else, or should it just be considered a
framework – the same way .NET is a framework to C#, or Rails is a framework to
Ruby?&lt;/p&gt;

&lt;p&gt;Our conversation came down to semantics. The same way we
(or at least I) call tissues not by tissues, but by Kleenex, or the way Texans
call soda “Coke”, and although jQuery does not (in a technical sense) replace  
Javascript (rather, extending it), perhaps it is simply cognitive recognition
that presses us to call anything Javascript related jQuery. Someday, will
everyone call Javascript by jQuery? It very well could be.  We’re still not
calling it ECMAScript.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Zemanta is Awesome</title>
   <link href="http://www.thejacklawson.com//2009/04/zemanta-is-awesome/index.html"/>
   <updated>2009-04-30T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/04/zemanta-is-awesome/zemanta-is-awesome</id>
   <content type="html">&lt;div class=&quot;zemanta-img zemanta-action-dragged&quot; style=&quot;margin: 1em; display: block;&quot;&gt;
&lt;div&gt;&lt;dl class=&quot;wp-caption alignright&quot; style=&quot;width: 216px;&quot;&gt;&lt;dt class=&quot;wp-caption-dt&quot;&gt;&lt;a href=&quot;http://www.crunchbase.com/company/zemanta&quot;&gt;&lt;img title=&quot;Image representing Zemanta as depicted in Crun...&quot; src=&quot;http://www.crunchbase.com/assets/images/resized/0001/6433/16433v1-max-450x450.png&quot; alt=&quot;Image representing Zemanta as depicted in Crun...&quot; width=&quot;206&quot; height=&quot;73&quot; /&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd class=&quot;wp-caption-dd zemanta-img-attribution&quot; style=&quot;font-size: 0.8em;&quot;&gt;Image via &lt;a href=&quot;http://www.crunchbase.com&quot;&gt;CrunchBase&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I wanted to make a quick plug for &lt;a class=&quot;zem_slink&quot; title=&quot;Zemanta&quot; rel=&quot;homepage&quot; href=&quot;http://www.zemanta.com&quot;&gt;Zemanta&lt;/a&gt;; a utility that- I think, anyway- has helped me rapidly improve the quality of my blog posts. Yeah, the awful writing style's still the same, but it allows me to throw in pictures, and pictures make everything better! It also has tools that link up key words to &lt;a class=&quot;zem_slink&quot; title=&quot;Wikipedia&quot; rel=&quot;homepage&quot; href=&quot;http://www.wikipedia.org&quot;&gt;Wikipedia&lt;/a&gt; articles and other websites (all I did was select which words I wanted linked; I didn't actually make the links on this post links manually), help you tag your posts, and give you a list of other blog posts that are related to the one you're currently writing. It integrates perfectly seamlessly into &lt;a class=&quot;zem_slink&quot; title=&quot;WordPress&quot; rel=&quot;homepage&quot; href=&quot;http://wordpress.org&quot;&gt;WordPress&lt;/a&gt;, and gives you &quot;reblog&quot; links on other people's &lt;a class=&quot;zem_slink&quot; title=&quot;Blog&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Blog&quot;&gt;blogs&lt;/a&gt; to quickly jump in and respond. I love the program; I highly suggest it to anyone.&lt;/p&gt;

&lt;p&gt;A shameless plug, yes; but a worthy one.&lt;/p&gt;

&lt;div class=&quot;zemanta-pixie&quot; style=&quot;margin-top: 10px; height: 15px;&quot;&gt;&lt;a class=&quot;zemanta-pixie-a&quot; title=&quot;Zemified by Zemanta&quot; href=&quot;http://reblog.zemanta.com/zemified/48ef38e8-9a72-47e5-b8ab-dd1ed5bcfa78/&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; style=&quot;border: medium none; float: right;&quot; src=&quot;http://img.zemanta.com/reblog_e.png?x-id=48ef38e8-9a72-47e5-b8ab-dd1ed5bcfa78&quot; alt=&quot;Reblog this post [with Zemanta]&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;zem-script more-related&quot;&gt;&lt;script src=&quot;http://static.zemanta.com/readside/loader.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>The Death of Flash</title>
   <link href="http://www.thejacklawson.com//2009/04/the-death-of-flash/index.html"/>
   <updated>2009-04-28T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/04/the-death-of-flash/the-death-of-flash</id>
   <content type="html">&lt;p&gt;I'm &lt;em&gt;excited&lt;/em&gt;. Not because a technology is dying, necessarily, but because
something far, far better has risen in it's place. Because now I, as a
developer, can use a language (no, &lt;a class=&quot;zem_slink&quot; title=&quot;ActionScript&quot;
rel=&quot;wikipedia&quot;
href=&quot;http://en.wikipedia.org/wiki/ActionScript&quot;&gt;ActionScript&lt;/a&gt; is not a
language, at least in my book) that works for rapid development, that leverages
my existing knowledge of &lt;a class=&quot;zem_slink&quot; title=&quot;Cascading Style Sheets&quot;
rel=&quot;wikipedia&quot;
href=&quot;http://en.wikipedia.org/wiki/Cascading_Style_Sheets&quot;&gt;CSS&lt;/a&gt;, and that
users won't have to use a plugin for.&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;zem_slink&quot; title=&quot;Adobe Flash&quot; rel=&quot;wikipedia&quot;
href=&quot;http://en.wikipedia.org/wiki/Adobe_Flash&quot;&gt;Flash&lt;/a&gt; is dead, long live &lt;a
class=&quot;zem_slink&quot; title=&quot;JQuery&quot; rel=&quot;homepage&quot;
href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I've recently been playing around on a few pseudo-projects, where I've just
done as much &quot;flashy&quot; stuff as I can (Maybe I'll update these later if I ever
have anything finished.) So far, I've had things fade in, things move, things
flash, things animate to different colors, things change when they're focused
on, or moused over, or clicked on... almost everything anyone used flash for in
the past, I've been able to replicate. The only thing I haven't tried so far is
embedding multimedia (I have used a sound plugin that works beautifully,
though.) And all of this with a few lines of code, no compiling.. and only a
19kb download.&lt;/p&gt;

&lt;p&gt;Almost everything I've ever wanted to do with jQuery already exists in a
plugin. Everything else was either a tweak of another plugin, or something I
built myself, and always under 20 lines of code. Make that happen with
Actionscript.&lt;/p&gt;

&lt;p&gt;I guess what I'm saying is: jQuery is easier for the developer to develop, and
it's easier for the client computer to run (no plugins, faster, direct dom
manipulation). So, why is anyone still using Flash?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Snakes on a Compiler</title>
   <link href="http://www.thejacklawson.com//2009/04/66/index.html"/>
   <updated>2009-04-26T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/04/66/66</id>
   <content type="html">&lt;p&gt;p. I went to the Day of &lt;a class=&quot;zem_slink&quot; title=&quot;.NET Framework&quot;
rel=&quot;homepage&quot; href=&quot;http://www.microsoft.com/net/&quot;&gt;.NET&lt;/a&gt;, an all-day
&quot;geekfest&quot;, a sea of polos and khakis; and there, I made the final decision of
what language I would learn next: &lt;a class=&quot;zem_slink&quot; title=&quot;Python
(programming language)&quot; rel=&quot;homepage&quot;
href=&quot;http://www.python.org/&quot;&gt;Python&lt;/a&gt;. Well, specifically, &lt;a
class=&quot;zem_slink&quot; title=&quot;IronPython&quot; rel=&quot;homepage&quot;
href=&quot;http://www.codeplex.com/IronPython&quot;&gt;IronPython&lt;/a&gt;. I guess a normal
Python isn't scary enough, so we'll make it out of metal. (&lt;a
href=&quot;http://www.darrellhawley.com/&quot; target=&quot;_blank&quot;&gt;Presenter's website&lt;/a&gt;;
&lt;a href=&quot;http://bit.ly/zL7Ff&quot; target=&quot;_blank&quot;&gt;presenter's slides&lt;/a&gt;; &lt;a
href=&quot;http://twitter.com/darrellhawley&quot; target=&quot;_blank&quot;&gt;presenter's twitter&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The really, really cool thing about IronPython is the ease in which I can pull
in other &lt;a class=&quot;zem_slink&quot; title=&quot;Common Language Runtime&quot; rel=&quot;wikipedia&quot;
href=&quot;http://en.wikipedia.org/wiki/Common_Language_Runtime&quot;&gt;CLR&lt;/a&gt; languages;
namely, C#. This will supposedly get better when &lt;a class=&quot;zem_slink&quot;
title=&quot;Microsoft Visual Studio&quot; rel=&quot;homepage&quot;
href=&quot;http://msdn.microsoft.com/vstudio/&quot;&gt;Visual Studio&lt;/a&gt; 2010 comes out and
the &lt;a href=&quot;http://en.wikipedia.org/wiki/Dynamic_Language_Runtime&quot;
target=&quot;_blank&quot;&gt;DLR&lt;/a&gt; is revamped and IronPython support grows. What this
will allow me to do is build all of my base classes, and my data layer, which
I'm more comfortable with, and use Python for all the fun stuff- services, and
display. I've been considering writing my next game in Python anyway,
influenced by &lt;a class=&quot;zem_slink&quot; title=&quot;Eve Online&quot; rel=&quot;wikipedia&quot;
href=&quot;http://en.wikipedia.org/wiki/Eve_Online&quot;&gt;Eve Online&lt;/a&gt;'s incredible
sucess using the language, so this fits in perfectly with my prior knowledge.&lt;/p&gt;

&lt;p&gt;I'm pretty excited. I've never heard a negative thing about Python; everyone
I've ever heard who uses it loves it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Library Museum</title>
   <link href="http://www.thejacklawson.com//2009/04/the-library-museum/index.html"/>
   <updated>2009-04-22T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/04/the-library-museum/the-library-museum</id>
   <content type="html">&lt;p&gt;I was recently debating, with a friend, about the pervasiveness of technology; my point was that information should be available whenever, wherever, to whomever chooses to call upon it; my friend believes that the internet has a profound negative impact, breeding an obsession with &lt;a class=&quot;zem_slink&quot; title=&quot;Deferred gratification&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Deferred_gratification&quot;&gt;instant gratification&lt;/a&gt; and dependency on the virtual world.&lt;/p&gt;

&lt;p&gt;Where it began was when I read an older &lt;a href=&quot;http://www.wired.com/gadgets/mods/news/2006/06/71087&quot; target=&quot;_blank&quot;&gt;Wired article&lt;/a&gt; about a specific type of &quot;body-modding&quot;; I didn't even know there was a group of people who claims body mods as their hobby until today. But it spawned a question: if I was given the opportunity to &quot;upgrade&quot; a body part- say, swap out my eyes for a pair of zoom-capable, infrared cameras, would I and should I?  My answer was yes, I would; why not upgrade my body? Why shouldn't I treat my body as some sort of machine, ready to upgrade? Is my body anything other than a robot controlled by my&lt;/p&gt;

&lt;div class=&quot;zemanta-img zemanta-action-dragged&quot; style=&quot;margin: 1em; display: block;&quot;&gt;
&lt;div&gt;&lt;dl class=&quot;wp-caption alignright&quot; style=&quot;width: 210px;&quot;&gt; &lt;dt class=&quot;wp-caption-dt&quot;&gt;&lt;a href=&quot;http://commons.wikipedia.org/wiki/Image:Toiletpapier_%28Gobran111%29.jpg&quot;&gt;&lt;img title=&quot;Toilet paper&quot; src=&quot;http://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Toiletpapier_%28Gobran111%29.jpg/200px-Toiletpapier_%28Gobran111%29.jpg&quot; alt=&quot;Toilet paper&quot; width=&quot;200&quot; height=&quot;150&quot; /&gt;&lt;/a&gt;&lt;/dt&gt; &lt;dd class=&quot;wp-caption-dd zemanta-img-attribution&quot; style=&quot;font-size: 0.8em;&quot;&gt;Image via &lt;a href=&quot;http://commons.wikipedia.org/wiki/Image:Toiletpapier_%28Gobran111%29.jpg&quot;&gt;Wikipedia&lt;/a&gt;&lt;/dd&gt; &lt;/dl&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;brain? Is it something I should hold holy and sacred, or is it something I'll just be throwing away in 70 years? But, rather than getting too philosophical on this leading note, we then turned to a similar discussion of optical implants that displayed data inside your eye; a kind of mini-projector that would project a computer's display so that it seemed as if the world was one big HUD. &quot;I want information,&quot; I said, &quot;and I want to be able to &lt;a href=&quot;http://www.ted.com/index.php/talks/pattie_maes_demos_the_sixth_sense.html&quot; target=&quot;_blank&quot;&gt;check user reviews on toilet paper&lt;/a&gt; at Target instantly.&quot;&lt;/p&gt;

&lt;p&gt;However, my friend disagreed. She believes that in instantly calling up knowledge, you lose important skills; by not having to put time and dedication into researching topics, and by having, instantly, anything you wanted, you could no longer appreciate your final work. When you have instant gratification on the internet, you begin to expect it everywhere. That it's about the journey, not the final destination; &quot;I'd rather live in a farm in &lt;a class=&quot;zem_slink&quot; title=&quot;Nicaragua&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Nicaragua&quot;&gt;Nicaragua&lt;/a&gt;,&quot; she noted, &quot;although you'd probably prefer &lt;a class=&quot;zem_slink&quot; title=&quot;Tokyo&quot; rel=&quot;wikipedia&quot; href=&quot;http://en.wikipedia.org/wiki/Tokyo&quot;&gt;Tokyo&lt;/a&gt;.&quot;&lt;/p&gt;

&lt;p&gt;We left our discussion in an agree-to-disagree state. I believe in efficiency, productivity, minimum effort for maximum effect; she believes in taking your time, enjoying the journey and doing things yourself. They both certainly have their merits; however, I do believe the world is rapidly spinning my way; we'll trade character for progress, for better or for worse.&lt;/p&gt;

&lt;div class=&quot;zemanta-pixie&quot; style=&quot;margin-top: 10px; height: 15px;&quot;&gt;&lt;a class=&quot;zemanta-pixie-a&quot; title=&quot;Zemified by Zemanta&quot; href=&quot;http://reblog.zemanta.com/zemified/d04ef8f8-352f-44cb-9090-099faf54d56c/&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; style=&quot;border: medium none; float: right;&quot; src=&quot;http://img.zemanta.com/reblog_e.png?x-id=d04ef8f8-352f-44cb-9090-099faf54d56c&quot; alt=&quot;Reblog this post [with Zemanta]&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;zem-script more-related&quot;&gt;&lt;script src=&quot;http://static.zemanta.com/readside/loader.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>Thinking Outside the Cube</title>
   <link href="http://www.thejacklawson.com//2009/04/thinking-outside-the-cube/index.html"/>
   <updated>2009-04-17T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/04/thinking-outside-the-cube/thinking-outside-the-cube</id>
   <content type="html">&lt;p&gt;&lt;a class=&quot;zem_slink&quot; title=&quot;Learning&quot; rel=&quot;wikipedia&quot;
href=&quot;http://en.wikipedia.org/wiki/Learning&quot;&gt;Learning&lt;/a&gt; outside of the
workplace is, in my opinion, of the utmost importance. Whether it's reading a
book, going to a convention, visiting community websites, keeping a blog, doing
freelance work, or just messing around with code for the heck of it- we must &lt;a
href=&quot;http://www.codinghorror.com/blog/archives/001236.html&quot;
target=&quot;_blank&quot;&gt;sharpen our&lt;/a&gt; saw.&lt;/p&gt;

&lt;p&gt;I believe the key point of this is that it must not feel like &lt;em&gt;work&lt;/em&gt;. You
shouldn't feel pressured, or dread doing something; you should do it because
you want to do it. The great thing about  our profession is that we can get
away and do several things, all subject to our whims; if we spent all day in a
chair at a desk, and we want to get up, go to a meeting like the &lt;a
href=&quot;http://www.dodn.org/&quot; target=&quot;_blank&quot;&gt;Day of .NET&lt;/a&gt; (&lt;a
href=&quot;http://cinnug.org/cododn/default.aspx&quot; target=&quot;_blank&quot;&gt;Central Ohio this
Saturday!&lt;/a&gt;) If you like to read, do that instead; it's good to keep a
bookshelf full of interesting books. Go into some kind of technical &lt;a
class=&quot;zem_slink&quot; title=&quot;Cross-training&quot; rel=&quot;wikipedia&quot;
href=&quot;http://en.wikipedia.org/wiki/Cross-training&quot;&gt;cross-training&lt;/a&gt;, such as
learning a new language. Do &lt;a class=&quot;zem_slink&quot; title=&quot;Design&quot; rel=&quot;wikipedia&quot;
href=&quot;http://en.wikipedia.org/wiki/Design&quot;&gt;design&lt;/a&gt; if you're a devleoper, or
develop if you're a designer. Just do &lt;em&gt;something&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In this way, we can continue to work on our skills, learn new things and keep
from being bored. And, at least in my experience, you can bring new skills and
solutions to problems you're already facing at work.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Music Discovery</title>
   <link href="http://www.thejacklawson.com//2009/04/music-discovery/index.html"/>
   <updated>2009-04-15T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2009/04/music-discovery/music-discovery</id>
   <content type="html">&lt;div class=&quot;zemanta-img&quot; style=&quot;margin: 1em; display: block;&quot;&gt;
&lt;div&gt;&lt;dl class=&quot;wp-caption alignright&quot; style=&quot;width: 261px;&quot;&gt; &lt;dt class=&quot;wp-caption-dt&quot;&gt;&lt;a href=&quot;http://www.crunchbase.com/product/last-fm&quot;&gt;&lt;img title=&quot;Image representing Last.fm as depicted in Crun...&quot; src=&quot;http://www.crunchbase.com/assets/images/resized/0000/2848/2848v3-max-450x450.jpg&quot; alt=&quot;Image representing Last.fm as depicted in Crun...&quot; width=&quot;251&quot; height=&quot;72&quot; /&gt;&lt;/a&gt;&lt;/dt&gt; &lt;dd class=&quot;wp-caption-dd zemanta-img-attribution&quot; style=&quot;font-size: 0.8em;&quot;&gt;Image via &lt;a href=&quot;http://www.crunchbase.com&quot;&gt;CrunchBase&lt;/a&gt;&lt;/dd&gt; &lt;/dl&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I've recently started using &lt;a href=&quot;http://www.last.fm&quot; target=&quot;_blank&quot;&gt;Last.fm&lt;/a&gt;. I made an account a while ago, but I never used it; I thought it was a little awkward to use, and I didn't totally understand how the whole thing worked. My initial thoughts were, &quot;I don't want to have to manually add every band I like, and I don't want to have to listen to a single song at a time!&quot; But, this is because I didn't understand anything about how it worked, or it's purpose. All I thought it was was a way to look at one song at a time; how wrong I was.&lt;/p&gt;

&lt;div class=&quot;zemanta-img zemanta-action-dragged&quot; style=&quot;margin: 1em; display: block;&quot;&gt;
&lt;div&gt;&lt;dl class=&quot;wp-caption alignleft&quot; style=&quot;width: 160px;&quot;&gt; &lt;dt class=&quot;wp-caption-dt&quot;&gt;&lt;a href=&quot;http://www.daylife.com/image/09498DBgBb5gR?utm_source=zemanta&amp;utm_medium=p&amp;utm_content=09498DBgBb5gR&amp;utm_campaign=z1&quot;&gt;&lt;img title=&quot;LONDON - FEBRUARY 25:  (UK TABLOID  Alex Kapra...&quot; src=&quot;http://cache.daylife.com/imageserve/09498DBgBb5gR/150x100.jpg&quot; alt=&quot;LONDON - FEBRUARY 25:  (UK TABLOID  Alex Kapra...&quot; width=&quot;150&quot; height=&quot;100&quot; /&gt;&lt;/a&gt;&lt;/dt&gt; &lt;dd class=&quot;wp-caption-dd zemanta-img-attribution&quot; style=&quot;font-size: 0.8em;&quot;&gt;Image by &lt;a href=&quot;http://www.daylife.com/source/Getty_Images&quot;&gt;Getty Images&lt;/a&gt; via &lt;a href=&quot;http://www.daylife.com&quot;&gt;Daylife&lt;/a&gt;&lt;/dd&gt; &lt;/dl&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;So, when I revisited it yesterday, I decided to take a better look at what was going on. I went to a band I liked (&lt;a href=&quot;http://www.last.fm/music/Franz+Ferdinand&quot; target=&quot;_blank&quot;&gt;Franz Ferdinand&lt;/a&gt;, to be specific), and tried out the &quot;Listen to Franz Ferdinand Radio&quot; button; and this is where everything totally turned around for me.&lt;/p&gt;

&lt;p&gt;Last.fm began picking songs from a group of similar artists tagged by other users, playing more similar artists more often. Within an hour, I had listened to about 15 bands I didn't even know existed, that are now some of my favorite bands. The real power in Last.fm- at least for a casual listener- is in this, finding new music. For a while, I had been waiting to hear new songs on the radio that I enjoyed, and then trying to track down a copy; and then, I would listen to it until it burned out and I was totally done with it for another year. Now, I can listen to a variety of music that I'll &lt;em&gt;probably&lt;/em&gt; like (and if I don't, I can always skip it), and it'll take an entire genre to be burned out before I run out of fresh music to listen to.&lt;/p&gt;

&lt;div class=&quot;zemanta-pixie&quot; style=&quot;margin-top: 10px; height: 15px;&quot;&gt;&lt;a class=&quot;zemanta-pixie-a&quot; title=&quot;Reblog this post [with Zemanta]&quot; href=&quot;http://reblog.zemanta.com/zemified/abca6249-c780-4a19-9f67-a09907a34e4c/&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; style=&quot;border: medium none; float: right;&quot; src=&quot;http://img.zemanta.com/reblog_e.png?x-id=abca6249-c780-4a19-9f67-a09907a34e4c&quot; alt=&quot;Reblog this post [with Zemanta]&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;zem-script more-related pretty-attribution&quot;&gt;&lt;script src=&quot;http://static.zemanta.com/readside/loader.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>The Tables Test</title>
   <link href="http://www.thejacklawson.com//2009/02/the-tables-test/index.html"/>
   <updated>2009-02-04T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2009/02/the-tables-test/the-tables-test</id>
   <content type="html">&lt;p&gt;As I've noted before, I believe that you should only use tables if you have an
explicit reason to. Here's the test I use, and I'm totally open for comments
and suggestions.&lt;/p&gt;

&lt;p&gt;1. Am I going to change the layout much?
If a lot, then I'll use CSS; and even if it's only a little, use CSS. It's
easier to make far-reaching changes to a couple classes in a single file, than
to modify the HTML structure of several pages. It's also easier to add a new
box, or some kind of widget, to a CSSed design, since they stretch well, unlike
many table-based designs that can explode when you go a pixel too far. You can
do it with tables, but in the end, it turns out to be a kluge.&lt;/p&gt;

&lt;p&gt;2. Am I worried about different screen resolutions?
For me, this is very important; I design from 1024x768 (downgrading gracefully,
but not fully supporting 800x600 unless I have to; see stats here) all the way
up to 1650. The problem with tables, is it's tricky to get a well-stretched
website; it can be done, but it's usually akward. So, I always use the CSS way,
where I can float elements, and create fixed- and fluid- width columns.&lt;/p&gt;

&lt;p&gt;3. Do I care about accessibility?
The answer should always be &quot;yes&quot; here as well. Screen readers have a lot of
trouble parsing tabilized content (in what order should it read?), whereas a
well-designed, minimalistic HTML structure can be designed to order the content
in the way it's meant to be read, and then placed in the correct places using
CSS.&lt;/p&gt;

&lt;p&gt;4. Do I ever want to read the code again?
A mess of tag-heavy &amp;lt;table&gt;s,&amp;lt;tr&gt;s, &amp;lt;td&gt;s, and the occasionally sprinkled-in
&amp;lt;th&gt; gets in the way; especially if you've got more than one nested table. It's
annoying to read the code and get from one logical place to the next. However,
with a tag-light mix of &amp;lt;div&gt;s with applied classes and IDs, you can see what's
going on; you can see through all the gunk and mess of the markup and cut
straight to the content.&lt;/p&gt;

&lt;p&gt;5. Do I care about several media types (print, mobile)?
Tables don't always render right when printing a page; and they very rarely
render correctly on a cellphone. That's where the @media attribute of CSS comes
in; you don't have to make a totally seperate version of a site to allow your
users to print, or to view from their cell. You can specifiy a simpler design
that's easier to print, and a more compact design that's easier to view on a
340x200 screen with ease.&lt;/p&gt;

&lt;p&gt;6. Do I care about search engines?
Search engines do a much better job at reading code-light pages, where the
content's at the top and the markup is light.&lt;/p&gt;

&lt;p&gt;7. Is this tabular data?
Use a table.&lt;/p&gt;

&lt;p&gt;Tables were awesome back in 1995. But today, the trend is heavily in the favor
of CSS and maintainable code for a reason.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Re: "Why CSS should not be used for layout"</title>
   <link href="http://www.thejacklawson.com//2009/02/re-why-css-should-not-be-used-for-layout/index.html"/>
   <updated>2009-02-02T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2009/02/re-why-css-should-not-be-used-for-layout/re-why-css-should-not-be-used-for-layout</id>
   <content type="html">&lt;p&gt;First, &lt;a title=&quot;CSS Rant&quot; href=&quot;http://www.flownet.com/ron/css-rant.html&quot;
target=&quot;_blank&quot;&gt;read this&lt;/a&gt;. Then come back.&lt;/p&gt;

&lt;p&gt;I'll wait here.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;Ok, good. Now, here's why the article's complete and total garbage.&lt;/p&gt;

&lt;p&gt;On his first point:
bq. The CSS layout primites are inadequate because they do not allow elements
to be positioned relative to each other, only relative to their containers.
They don't? What about floats... do they not effect direct siblings? Can you
not change positioning? Maybe I'm missing something here, but we've got the
ability to change element positioning relative to other elements as well as the
container (or even display on the screen at all times (&quot;floating&quot; elements on
the screen), or display anywhere on the page). Using the table method that Ron
advocates only allows you to position relative to it's sibling. A table cell,
which spans 1-n rows. A table cell that requires you to restructure your HTML
(or at least move your content) if you want to move a section from the left, to
the right. Whereas I could just swap the float, changing a couple lines of CSS.
bq. The way CSS layout is rendered results in unavoidable interactions between
the style sheets and the underlying content.  So even when CSS is used exactly
as intended, it is not possible to separate content from layout.
Unavoidable interactions? Giving elements IDs (which is good practice anyway),
classes, and a &amp;lt;link&gt; tag? Is this worse than creating an immutable structure?
Again, perhaps I'm missing something somewhere, but the liquidity of a &amp;lt;div&gt;
layout is far superior. It's changable, it's easier to get things where you
want them to go, it's less HTML markup gunking up your content. A nicely
&quot;divved&quot; layout is cleaner, easier to modify. Yes, I have to add IDs and
classes... but a semantic, descriptive markup is far easier to read anyway.
bq. One of the problems with criticising CSS is that it's very hard to write
good CSS, so pointing out problems with CSS begs the question of whether this
is an indictment of CSS or one's coding ability.
Hard for who? And regardless of difficulty, it's a bit strange to denounce an
entire language (markup syntax?) because it's &quot;hard&quot;. C# and Ruby and Python
and baking and riding bicycles can be hard for beginners too.&lt;/p&gt;

&lt;p&gt;Ron follows his CSS bashing up with a kluge of examples that do nothing except
show he has no idea what he's doing, and badly mangles examples, saying &quot;look,
I reversed it, and it 'sploded! css sux&quot;.
bq. But the point is &lt;em&gt;they have to be fixed!&lt;/em&gt; The correct CSS is &lt;em&gt;inextricably
bound&lt;/em&gt; to the content.  Smarter people than me have tied themselves into knots
trying to figure out how to make a three-column CSS layout that doesn't have
these problems.  To my knowledge, no one has succeeded.  It may be possible.
To his knowledge, nobody's suceeded? Funny, because several of my own websites
use 3-column CSS layouts, without &quot;these problems&quot;. Because I understand how
CSS &lt;em&gt;works&lt;/em&gt;. Because I'm not afraid to get my hands a little dirty, and because
I don't base my knowledge on display-view of Dreamwaver.&lt;/p&gt;

&lt;p&gt;All it comes down to is the ranting of a man who has no idea what he's talking
about. CSS is perfect for layouts. It's hard, as he readily admits, but once
you understand it's semantics, understand when and how and what to apply,
there's nothing better.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Bookshelf</title>
   <link href="http://www.thejacklawson.com//2009/01/bookshelf/index.html"/>
   <updated>2009-01-17T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2009/01/bookshelf/bookshelf</id>
   <content type="html">&lt;p&gt;&lt;img title=&quot;Bookshelf&quot; src=&quot;http://i188.photobucket.com/albums/z177/jclawson06/0117091157.jpg&quot; alt=&quot;My bookshelf&quot; width=&quot;592&quot; height=&quot;444&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I've got a lot of books; just recently I ran to Ikea to pick up a huge shelf to
manage the overflow. But, there's a group of books that I keep by my bookshelf,
just in case I need a quick reference, or just feel like reading. Here's a
breakdown, from right to left:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Manual for an &lt;a href=&quot;http://www.newegg.com/Product/Product.aspx?Item=N82E16813130136&quot;&gt;MSI K9A2
Platinum motherboard&lt;/a&gt; (honestly, not quite sure how that snuck in there)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0465067107/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1232213595&amp;sr=8-1&quot;&gt;The Design of Everyday
Things&lt;/a&gt;, an absolutely fantastic book; I'm only about 1/4 of the way through
it, and already I love it. It's about the tiny little nuances about designing
user-friendly things; it's not explicitly technical (more about physical
objects than virtual ones), but it's definitely easy to cross it over into the
web development / designing realm. I picked it up on reccomendation of &lt;a
href=&quot;http://www.codinghorror.com/blog/archives/000020.html&quot;&gt;Jeff Atwood&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Dreaming-Code-Programmers-Transcendent-Software/dp/1400082471/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1232213621&amp;sr=1-1&quot;&gt;Dreaming In
Code&lt;/a&gt;, another really good book; I saw it in the library one day and decided
to flip through it. It's a fantastic rendition of the exploits of the
developers of Chandler, a personal information manager, and explains in detail
how many things can go wrong with a software project; software is never on
time, and the author (a reporter) does a great job in explaining how this
phenomenon occurs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Art of War, by Sun Tzu; it's hard to find a copy that's just the Art of
War, and not 'the art of war in relation to business' or some such. It's pretty
fascinating; it's about military strategy. I couldn't find this specific copy
on Amazon; I think I got it from Barnes and Noble about two years back.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/jQuery-Action-Bear-Bibeault/dp/1933988355/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1232213742&amp;sr=1-1&quot;&gt;jQuery in Action&lt;/a&gt;; I love jQuery,
more and more as each day passes, and I figured it was about time I picked up
the book. The online documentation will always be more up-to-date, but I can't
bring that in the car with me (without a 3G netbook, anyway), and the book is
written so that I can read it from cover to cover. It has several interesting
insights into the technical reasons of jQuery's architecture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Comet-Reverse-Ajax-Next-Generation-Firstpress/dp/1590599985/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1232213806&amp;sr=1-1&quot;&gt;Comet and Reverse
Ajax&lt;/a&gt;; one of the 'reccomended books' Amazon advertised to me while I was
ordering jQuery in Action. It's really, really short, but it explains how to do
something I never really thought possible with HTTP protocol: use a server
push, instead of a client pull. This may mean Neflaria gets a real-time chat.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Red-Hat-Linux-8-Dummies/dp/0764516817/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1232213835&amp;sr=1-1&quot;&gt;Red Hat Linux 8 for Dummies&lt;/a&gt;; picked it
up a long time ago when I was first experimenting with Linux. It does a really
good job at getting a Linux dummy up to speed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Self-Paced-Training-70-536-70-528-70-547/dp/0735623767/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1232213880&amp;sr=1-1&quot;&gt;MCTS and MCPD books for
.Net Framework 2.0 web development&lt;/a&gt;; a set of 3 books written to get my
MCPD. I hate the whole idea of certifications (I'm a firm believer that skill &gt;
credentials), but I figure I should get them eventually (because very few other
people believe that).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/MCTS-Self-Paced-Training-70-431-Pro-Certification/dp/073562271X/ref=sr_1_2?ie=UTF8&amp;s=books&amp;qid=1232213913&amp;sr=1-2&quot;&gt;MCTS for SQL
Server 2005&lt;/a&gt;; see above. Although, has actually useful information, not
garbage to memorize in the rare event that Visual Studio's intellisense and
Google collectively collapse.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Top to bottom on left stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.wired.com/&quot;&gt;Wired&lt;/a&gt; magazines; Wired's awesome. It's
like &lt;a href=&quot;http://www.gizmodo.com&quot;&gt;Gizmodo&lt;/a&gt;, only in more detail.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Swing-Hacks-Tips-Tools-Killer/dp/0596009070/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1232214019&amp;sr=1-1&quot;&gt;Swing Hacks&lt;/a&gt;; when we (Don and I)
were first looking at developing an MMORPG, we were trying to decide what
language to use; consequently, I picked up a few Java books, this and the next
two. I knew very little about Java at the time; it was the cross-platform
compatibility that attracted me. It was the entire language that turned me off.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Wicked-Cool-Java-Open-Source-Libraries/dp/1593270615/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1232214038&amp;sr=1-1&quot;&gt;Wicked Cool Java&lt;/a&gt;; has a
lot of cool project ideas for developers at any stage. If you want to mess
around with Java a bit, this is the book to get.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Killer-Game-Programming-Andrew-Davison/dp/0596007302/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1232214063&amp;sr=1-1&quot;&gt;Killer Game Programming in
Java&lt;/a&gt;; what I expected, and yet somehow not. It takes you from developing
your own graphical engine all the way through game mechanics, which is awesome;
but, with the abundance of pre-made 3d/physics engines out there, it's more
than I needed, so I never got more than halfway.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Starting-Out-Java-Control-Structures/dp/1576761711/ref=sr_1_3?ie=UTF8&amp;s=books&amp;qid=1232214083&amp;sr=1-3&quot;&gt;Starting out with Java 5&lt;/a&gt;;
my CS classes were in Java, and this was the book I used. Highly reccomended
for beginners.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The next book to go up there will be Digital Security, which is another amazing
book; it totally opened my eyes, and changed the way I thought about security. 
I'm only halfway through it now, so it's by my bed instead of on my bookshelf.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Goodbye, Movable Type; Hello, Wordpress</title>
   <link href="http://www.thejacklawson.com//2009/01/goodbye-movable-type-hello-wordpress/index.html"/>
   <updated>2009-01-12T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2009/01/goodbye-movable-type-hello-wordpress/goodbye-movable-type-hello-wordpress</id>
   <content type="html">&lt;p&gt;I've been using &lt;a href=&quot;http://movabletype.org/&quot; target=&quot;_blank&quot;&gt;Movable Typ&lt;/a&gt;&lt;a href=&quot;http://movabletype.org/&quot;&gt;e&lt;/a&gt; for a few months now. I've liked it, but it wasn't great; it worked well, but I wasn't blown away. After a while, it moved slow; there was no way to remove a lot of comment spam at once (which I seemed to be particularly prone to), and I had a few bugs, such as having to log in twice each session. Maybe they weren't all MT's fault; but I had trouble finding support.&lt;/p&gt;

&lt;p&gt;So, when we set up our new Windows Server 2008 machine using a 64-bit edition, I hit a wall: there's no MySQL support for ActivePerl x64. There isn't any official support for x86 either; but there are workarounds for that (use external repositories). It also came at a time when I was deciding whether or not I wanted to switch, so it pretty much cinched it up; I decided to try out &lt;a href=&quot;http://wordpress.org/&quot; target=&quot;_blank&quot;&gt;WordPress&lt;/a&gt;. It was a PHP/MySQL system, both of which I had already set up, so I expected (or at least hoped) that it'd be pretty simple to get running.&lt;/p&gt;

&lt;p&gt;The first thing I had to do was back up my old MT database. I expected some long, tortourous sequence of MySQL edits or something, but &lt;a href=&quot;http://www.sixapart.com/movabletype/docs/3.2/01_installation_and_upgrade/mt_export.html&quot; target=&quot;_blank&quot;&gt;all it came down to&lt;/a&gt; was logging in, clicking &quot;Import/Export&quot;, and then export. It spit out a text file, which I saved to my desktop. Next, I unzipped a WordPress download into my blog folder (and set up the requisite site in IIS). I set up a database and a user in MySQL for my blog. I then edited the wp-config-sample.php, filling in the requisite database information and renaming it to wp-config.php, visited the site in my browser, and hit 'go'. Seconds later, I had a new, live WP blog.&lt;/p&gt;

&lt;p&gt;From the admin panel of my blog, I went to tools, hit &quot;import&quot;, selected &quot;Movable Type&quot; from the list, browsed to my file, and uploaded. And that was it. I had totally converted to Wordpress in minutes. I was absolutely astounded by the ease. It was already much faster (with the help of WP-Cache), and running well.&lt;/p&gt;

&lt;p&gt;Next stop: new design. WP looks like it'll be much easier to work with, so hopefully we'll be up soon.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Kubuntu 8.10 and Wireless</title>
   <link href="http://www.thejacklawson.com//2008/12/kubuntu-810-and-wireless/index.html"/>
   <updated>2008-12-06T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2008/12/kubuntu-810-and-wireless/kubuntu-810-and-wireless</id>
   <content type="html">&lt;p&gt;After using Vista for a while (and after my brief &lt;a href=&quot;http://www.thejacklawson.com/2008/05/ubuntu-84-and-kde4.html&quot;&gt;experimentation with Ubuntu 8.04&lt;/a&gt;), I decided to go ahead and create another partition for Kubuntu 8.10, with KDE 4.1. I did it with the latest version of Wubi. It installed fast, booted fast, and left me without wireless (as I expected). Problem is, I had moved my office downstairs, leaving the router upstairs; I had to get wireless working somehow.&lt;/p&gt;

&lt;p&gt;So, I booted up my laptop and began a search. &quot;Install &lt;a href=&quot;http://sourceforge.net/projects/ndiswrapper/&quot;&gt;Ndiswrapper&lt;/a&gt;&quot;, was the first bit of advice I got; so, I downloaded this onto a flash drive, plugged it into my new Linux machine (which found the drive and popped it up helpfully), and tried to install it. I followed the instructions left by the developer in the 'Install' notes; however, to my dismay, I was unable to due to an error that read &quot;error: too few arguments to function 'iwe_stream_add_value' &quot;. Having no clue what it meant, I did a quick Google search, and found out I had to patch the Ndiswrapper with &lt;a href=&quot;http://www.slackware.com/%7Ealien/slackbuilds/ndiswrapper/build/ndiswrapper_kernel_2.6.27.patch&quot;&gt;this patch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I copied the patch file into the directory, then ran&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;patch -p0 &gt; ndiswrapper_kernel_2.6.27.patch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;... and again, I hit a wall; it threw up an error that the patch command is not recognized. So, again, I hit google and found that I needed to now download and run the &lt;a href=&quot;http://packages.ubuntu.com/intrepid/patch&quot;&gt;&quot;Patch&quot; installation file&lt;/a&gt; (I already had all the dependencies installed). Now, I ran the patch command, and it worked! I installed Ndiswrapper, then followed the guide &lt;a href=&quot;http://ubuntuforums.org/showthread.php?t=9454&quot;&gt;here&lt;/a&gt;&amp;nbsp; to get it up and running.&lt;/p&gt;

&lt;p&gt;So, this was posted from Firefox in my new linux installation.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Back from Vacation</title>
   <link href="http://www.thejacklawson.com//2008/12/back-from-vacation/index.html"/>
   <updated>2008-12-02T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2008/12/back-from-vacation/back-from-vacation</id>
   <content type="html">&lt;p&gt;Just got back from spending a week in Arizona- that's right, the middle of the
desert on the border of Mexico- where it rained for three days. We couldn't get
to part of the Grand Canyon because of the &lt;strong&gt;snow&lt;/strong&gt;. In &lt;strong&gt;Arizona&lt;/strong&gt;. Did I
leave Ohio?&lt;/p&gt;

&lt;p&gt;I don't want to complain too much, though; the &lt;a
href=&quot;http://www.shellhospitality.com/hotels/orange_resort/&quot;&gt;resort we stayed
at&lt;/a&gt; was very nice, and Audrey's aunt was kind enough to pay for everyone's
stay. And the &lt;a href=&quot;http://www.rawhide.com/&quot;&gt;Thanksgiving dinner &lt;/a&gt;was
something I won't forget (the link will explain all).&lt;/p&gt;

&lt;p&gt;Anyway, first thing I did when I got back and settled (besides scavenging a
cheap turkey from the grocery store... 12-pounder for $10) was delete 400ish
spam messages. Sorry for the garbage; the new version of MovableType supposedly
clears that issue. I also upgraded my theme; still not a custom one yet, but
I'll get there once I get the time.&lt;/p&gt;

&lt;p&gt;I also installed &lt;a
href=&quot;http://www.ipi.fi/%7Erainy/legacy.html&quot;&gt;Rainmeter&lt;/a&gt;, &lt;a
href=&quot;http://www.samurize.com/modules/news/&quot;&gt;Samurize&lt;/a&gt;, and &lt;a
href=&quot;http://www.rainlendar.net/cms/index.php&quot;&gt;Rainlendar &lt;/a&gt;- they are &lt;a
href=&quot;http://lifehacker.com/5087956/customize-your-own-killer-enigma-desktop&quot;&gt;ab
solutely fantastic&lt;/a&gt; desktop-managing applications. And, if that wasn't
enough: I installed a new hard drive and I'm in the process of installing 5
virtual drives; Windows Server 2k3 and 2k8, Windows XP, the latest version of
Kubuntu, and Fedora 10. That is, if I can get the last two working with &lt;a
href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyId=04D26402-3199-48A
3-AFA2-2DC0B40A73B6&amp;displaylang=en&quot;&gt;Windows Virtual PC 2k7&lt;/a&gt;.. I've seen it
done, but I know it's tricky. The goal is to have plenty of development
platforms with which to do my work; I'll be able to test web apps in the
virtualized servers before I push to production on CD.&lt;/p&gt;

&lt;p&gt;Speaking of CD, we've got our new website up; I was inspired by &lt;a
href=&quot;http://www.youtube.com/watch?v=VUhhIVN6eBI&quot;&gt;a Keane song&lt;/a&gt;, and somehow
came up with this. My brain goes through somewhat strange processes sometimes,
but I'm pretty happy with the result. JQueried it up, even, much to the chagrin
of my budding Ajax framework project.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Bluetooth Issue on My Dell Laptop</title>
   <link href="http://www.thejacklawson.com//2008/09/bluetooth-issue-on-my-dell-laptop/index.html"/>
   <updated>2008-09-11T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2008/09/bluetooth-issue-on-my-dell-laptop/bluetooth-issue-on-my-dell-laptop</id>
   <content type="html">&lt;p&gt;I've got a Dell Latitude D820, with a Toshiba 350 bluetooth card. Don't ask me
why Dell used a competing laptop brand's hardware, because obviously it isn't
working out.... the fact that the Toshiba &quot;Dell&quot; drivers are two years old,
while there are drivers out &quot;for Toshiba laptops only&quot; that are significantly
newer. But I digress.&lt;/p&gt;

&lt;p&gt;My issue was in connecting my &lt;a href=&quot;http://estore.vzwshop.com/dare/&quot;&gt;LG
Dare&lt;/a&gt; (&lt;strong&gt;fantastic &lt;/strong&gt;phone, I might add) via Bluetooth. I used the drivers
right off of Dell's website, which installed the &quot;Bluetooth Stack By Toshiba
For Windows&quot; (what a mouthful). I was able to use dial-up-networking and use it
as a modem, as well as setting up a serial port.. but couldn't do file
transfers or use bluetooth programs. It just wouldn't find the phone.&lt;/p&gt;

&lt;p&gt;So, after an unsucessful hour and a half on the phone with Dell tech support,
and a full day of Googling, I decided to try something totally crazy: uninstall
the Bluetooth Stack from add/remove programs, and then do a 'scan for hardware
changes' in the device manager. (make sure the bluetooth is active (check for a
blue icon next to your power icon on the screen hinge.) if it isn't there,
you'll have to download the driver from dell's site, activate it, and then
uninstall it.) And, woah, it worked! It now showed up as a bluetooth device,
rather than a network device, and I could now do all the file transfer stuff.&lt;/p&gt;

&lt;p&gt;Now, my next step is using some of the &lt;a
href=&quot;http://www.microsoft.com/express/samples/c4fdevkit/default.aspx&quot;&gt;Bluetooth
 API stuff from C4F&lt;/a&gt;, and make a proximity-based application.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Flex Dynamic External Stylesheets Revisited</title>
   <link href="http://www.thejacklawson.com//2008/09/flex-dynamic-external-stylesheets-revisited/index.html"/>
   <updated>2008-09-09T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2008/09/flex-dynamic-external-stylesheets-revisited/flex-dynamic-external-stylesheets-revisited</id>
   <content type="html">&lt;p&gt;Well, it seems that my article on &lt;a
href=&quot;http://www.thejacklawson.com/index.php/2008/05/flex-dynamic-external-style
sheets/&quot;&gt;Flex Dynamic External Stylesheets&lt;/a&gt; is the most popular on my blog;
and, given that, I should probably explain what I did a bit better. The last
article was more of a discussion on what I went through to get it working,
whereas this will be more of a tutorial of sorts.&lt;/p&gt;

&lt;p&gt;Note: this is using Flex 3; Flex 2 may be similar, but I can't guarantee
anything.&lt;/p&gt;

&lt;p&gt;First thing:&lt;em&gt; you cannot load a CSS file into your SWF.&lt;/em&gt; It's just not
possible. It's what I struggled with, and finally had to come to the
realization of; you have to compile the .css into a .swf file (as I explain
further down.) Also, the &quot;css&quot; that flex uses isn't CSS, it's some convoluted
garbage they call CSS. It should be called &lt;em&gt;FSS&lt;/em&gt;. But I digress.&lt;/p&gt;

&lt;p&gt;The first thing I did was get the CSS written that I wanted to change, and put
it in a CSS file. It had background-color changes that overwrote the CSS in the
main file. So, if the main CSS file was called default.css, and said:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.blueBox {
  color: #fffffff;
  background-color: #000066;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;My new CSS file was called newBlue, and said:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.blueBox {
  color: #ccccff;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or whatever you happen to choose. This causes my new CSS file's font color to
overwrite the old one, just like real CSS.&lt;/p&gt;

&lt;p&gt;I then right-clicked my new CSS file, and set it to &quot;compile to swf&quot;. Don't do
this with default.css, that'll be ok to compile into the original swf; the
compile-to-swf option creates a seperate  SWF file specifically for your CSS
(because it'd be way too easy to just load a .css file, right?)&lt;/p&gt;

&lt;p&gt;The next step was to modify the ActionScript file. I was passing through a
parameter called &quot;Theme&quot;, so I used that to call the compiled CSS that I wanted
to load, and overwrite the main. I passed through the theme parameter as a
querystring parameter on the flash file name (flash.swf?Theme=jack)&lt;/p&gt;

&lt;p&gt;The actionscript was something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;//(function called by creationComplete
CSSFormat();

//(somewhere further down the page)
public function CSSFormat():void{
  //this will load up default.css, so we always have something.
  //however, the theme will flash the default color before it
  //loads the new theme you're trying, so keep that in mind.

  var theme:String = &quot;default&quot;var themeSWF:String = &quot;default&quot;

  //This grabs &quot;Theme&quot; from the parameters.

  if(Application.application.parameters.Theme != undefined) { 
      theme= Application.application.parameters.Theme;
  }

  themeSWF = theme;

  //note: swf files don't like compiling with hyphens.
  //your url will obviously change, depending on where you decide to
  //store your swf. Mine's in the app_themes directory for an
  //asp.net application.

  var css_url:String = &quot;App_Themes/&quot; + theme + &quot;/&quot; + themeSWF + &quot;.swf&quot;;
  StyleManager.loadStyleDeclarations(css_url);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And, now when I publish, it spits out the .css file I created into a .swf file.
Put that into the directory I specified in the css_url, and it'll load it up!
And, even if it doesn't, it'll still load the default (don't set default.css to
compile).&lt;/p&gt;

&lt;p&gt;Hope this helps everyone else that is remotely as frustrated as I was!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pop-Up Windows Are A Terrible Solution</title>
   <link href="http://www.thejacklawson.com//2008/08/pop-up-windows-are-a-terrible-solution/index.html"/>
   <updated>2008-08-19T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2008/08/pop-up-windows-are-a-terrible-solution/pop-up-windows-are-a-terrible-solution</id>
   <content type="html">&lt;p&gt;Pop-up windows are one of the biggest UI blunders ever. They create seperation
from your website, they detract from the main content, and they are far from a
'seamless' data entry mechanism.&lt;/p&gt;

&lt;p&gt;Let's start from the beginning. One day, some developer thought to himself,
'Hey! I want my user to stay on our website, and stay on the page to he
maintains state, but also to enter data. How can I do that?' After a little
Javascript tinkering, he created a button / link / something that pops up a
window with a form, or with a help section, or something. Fantastic!&lt;/p&gt;

&lt;p&gt;But then, some internet advertiser said 'Hey! I want my consumer to see our
ads, all ten of them, even if he moves to different sites.' So, he added
javascript of his own, and the community responded with pop-up blockers. So,
internet advertiser went back to normal banners. However, this left the first
developer in a bit of a hard place. His website was developed with those
pop-ups in mind... so what now?&lt;/p&gt;

&lt;p&gt;First, never, ever, ever have the browser pop up a new window in the first
place. Ever. There is absolutely no reason for it, and there are easy ways
around it that can avoid pop-up blockers totally screwing your user experience:
for example, modal windows. They're an extremely easy mechanism to put in place
(you can even use frameworks, like Scriptaculous or components from the Ajax
toolkit for .NET), and they get around pop-up blockers. And, not only that- but
you don't have the issue of not being able to send commands to your parent
window! In this, it lends itself heavily to Ajax applications, in that you can
also update content on the main page after submitting data from the modal.
Seamless transitions are the best; make your web app behave like a desktop app.
You also know that your user won't be messing with anything on the parent, out
of order with the pop-up. It fits everything in place and creates a nice flow
to the website.&lt;/p&gt;

&lt;p&gt;So, please, please remove your pop-up windows and stop keeping your users from
having to disable pop-up blockers!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>"Make More Money!"</title>
   <link href="http://www.thejacklawson.com//2008/08/make-more-money/index.html"/>
   <updated>2008-08-06T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2008/08/make-more-money/make-more-money</id>
   <content type="html">&lt;p&gt;Every time I listen to the radio, there's inevitabley a commercial along these
lines:&lt;/p&gt;

&lt;p&gt;&quot;Are you unhappy in your job? Want to make more money? Be a part of the new and
exciting IT Industry! Take our classes and become a Certified Professional...&quot;&lt;/p&gt;

&lt;p&gt;It's absolutely disgusting and wrong.&lt;/p&gt;

&lt;p&gt;You shouldn't entice people into &quot;the new and exciting IT Industry&quot; by money.
People who want to be in IT, should be in IT (sometimes not then, but that's
for another topic), and people who think that some magical position in a
software company is going to change their entire life, are going to find out
the hard way that it won't. People who think to themselves, &quot;I'm going to make
a drastic career change because I want more money&quot;, are going to fail.&lt;/p&gt;

&lt;p&gt;I'm not saying that someone can't learn to be a developer, or a network admin,
or any of a variety of careers. I'm saying that you should be in a job that you
like to do, and that you have a skill set and a natural disposition for. You
can't just go through some distorted MCP bootcamp and expect to make it to the
top, or even the bottom. You won't, unless you know what you're doing and
you're good at it, and you want to do it for the sake of doing it.&lt;/p&gt;

&lt;p&gt;Developing has a personality with it. It's not for everyone; it takes a certain
mindset. The person who speeds through certifications for the sake of
certifications (the idea of certifications being totally wrong anyway) is going
to work horribly with others and is going to feel like an akward part of any
team. IT has a certain passion to it that can't be faked, no matter what the
radio advertisements will try to tell you in loud voices over techno music.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How I Got Started Programming</title>
   <link href="http://www.thejacklawson.com//2008/07/how-i-got-started-programming/index.html"/>
   <updated>2008-07-29T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2008/07/how-i-got-started-programming/how-i-got-started-programming</id>
   <content type="html">&lt;p&gt;This one's been floating around the internet (although I appear to be late on
the trend). However, here goes:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How old were you when you started programming?&lt;/em&gt;
I was in 5th grade, so I was ten, I think.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How did you get started in programming?
&lt;/em&gt;My friend Logan and I decided we were going to create Tomb Raider 4, so we
each bought copies of &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Learn_to_Program_BASIC&quot;&gt;Learn to Program Basic&lt;/a&gt;&quot;.&lt;/p&gt;

&lt;p&gt;We didn't quite make it all the way to that particular game.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What was your first language?&lt;/em&gt;
Something InterPlay tried to pass off as Basic. My first profitable language
was HTML, when I made a bowling website for my aunt Sue when I was 12.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What was the first real program you wrote?&lt;/em&gt;
I made a pretty extensive text-based RPG. It started on BASIC, then moved to my
TI-83 during Trig class, and eventually evolved into Gevalum.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What languages have you used since you started programming?&lt;/em&gt;
BASIC, TI-83 BASIC, HTML (XHTML), Javascript, CSS, Java, C++, ASP.NET, C#,
ActionScript, ASP, PHP, SQL, XML, VB.NET. I wouldn't call myself proficient
with several of the aforementioned, but I have used them.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What was your first professional programming gig?&lt;/em&gt;
I worked for a little 3-man web shop in Middletown, OH, doing ASP and SQL,
mostly administrative back-ends to websites. It was the month after I turned 16.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you knew then what you know now, would you have started programming?&lt;/em&gt;
Absolutely. I probably would have started with something like Java instead of
Basic and PHP instead of ASP, though. I love development and wouldn't trade it
for any other job.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If there is one thing you learned along the way that you would tell new
developers, what would it be?&lt;/em&gt;
Learn to use Google.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What's the most fun you've ever had ... programming?&lt;/em&gt;
My online game, Gevalum. Although it's been surplanted by something else (a
story which I may delve into sometime), I put two years into developing
something I thought was fantastic. It went from ASP with frames to PHP with
AJAX, and to watch it grow was fantastic.&lt;/p&gt;

&lt;p&gt;That's the end of the questions: there you have it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Software Piracy</title>
   <link href="http://www.thejacklawson.com//2008/07/software-piracy/index.html"/>
   <updated>2008-07-07T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2008/07/software-piracy/software-piracy</id>
   <content type="html">&lt;p&gt;As I was mowing the lawn last night (something I try to avoid as much as
popssible, much to the detriment of my relations with the neighbors), I began
to think. Why is it that people pirate software, who does it, and why is it
bad? Is it bad? There are two answers to my last question. One is based on bias
and deceit and twisting statistics, and the other one is truth. You're welcome
to discern for yourself, based upon what I have here to present.&lt;/p&gt;

&lt;p&gt;The BSA (Business Software Alliance, &lt;a
href=&quot;http://www.bsa.org&quot;&gt;www.bsa.org&lt;/a&gt;) &lt;a
href=&quot;http://global.bsa.org/idcglobalstudy2007/&quot;&gt;claims that&lt;/a&gt; &quot;dollar
lossesfrom [sic] piracy rose by $8 billion to nearly $48 billion.&quot; That's a
huge number! That's 19,200,000 copies of, say, the Adobe CS3 Master Collection,
at $2500 a pop. But, what does that really mean? We must examine this claim of
&quot;dollar losses&quot;. The term implies that that company actually lost money
(&lt;em&gt;losses&lt;/em&gt;) and went &lt;em&gt;negative&lt;/em&gt;; it implies that the software industry in
general had a $48 billion loss in 2007. However, this is entirely untrue.&lt;/p&gt;

&lt;p&gt;Software companies use money in the development (and later on, time supporting)
the software create. There is, from that point, no finite quanitity of items
that can be sold; copies can be produced and reproduced indefinitely.&lt;/p&gt;

&lt;p&gt;That said, taking one copy, and making five others, does not cost the company
money. You're not stealing five iPods from a store that carries 100, which they
then have to spend money to replace; there is no &quot;replace&quot; in software. There
is no hole left by a &quot;missing&quot; quanitity. The virtual world is far different
from the physical; and different ways of thinking must apply.&lt;/p&gt;

&lt;p&gt;An argument at this point may be &quot;those five copies were given to people who
didn't pay for it, so the company made five sales less than it would have!&quot;.
Again, from a surface view, this makes sense; in the same way that &quot;the earth
is flat&quot; makes sense. It works, and you don't have to think about it. End of
story for the BSA, let's just publish the numbers and throw people in lawsuits.&lt;/p&gt;

&lt;p&gt;However, in &quot;not thinking&quot;, as happens terribly often, you lose something. You
must examine the demographic of those &quot;pirates&quot;; looking at the &lt;a
href=&quot;http://global.bsa.org/idcglobalstudy2007/pr/pr_us.pdf&quot;&gt;BSA's own
report&lt;/a&gt; shows that the highest rates of pirates exist in two areas; nations
with &lt;em&gt;developing economies&lt;/em&gt;, and nations with &lt;em&gt;restrictions on software&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This means that &lt;em&gt;most of the pirates are people who cannot afford, or cannot
buy, the software&lt;/em&gt;. This means that they are people who would have otherwise
never bought the software they pirated. Can a 14-year-old boy in Pakistan who
wants to try his hand at design really afford the Adobe CS3 Design Studio, at
well over $1000? Of course not. Does he deserve any less because of his unlucky
predicament? Of course not. Back to my earlier point, I'm not advocating
stealing that BMW because you can't afford it and want out of your Geo Metro,
I'm talking about &lt;em&gt;giving opportunites that costs the company absolutely
nothing&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;As for the rest - that 20% rate in the U.S. - many are people, again, who would
have otherwise not bought the product. This is, I'll admit, purely from my own
research of people I know personally, but the general age demographic falls
between 16-22. High school and college kids, people who are trying to
forge a way into an IT industry, but without the means to pay huge sums of
money to get started.&lt;/p&gt;

&lt;p&gt;I'm not advocating piracy, and I'm not saying that piracy is the best option.
Designers can use Gimp, developers can use Notepad++ or Eclipse, anyone can use
Linux. However, the software that gets pirated is generally the best of the
best. People pirate it because it's the software above all others they choose
to use; it's worth risking a lawsuit for. It is, in my opinion, one of
software's highest honors to have 500 seeds on a torrent; it means people are
going out of their way to give up some of their time, their bandwidth to give
what are essentially &quot;extended trials&quot; of your software. They're being
downloaded by people who will become professionals in that field, and who will
be hired by a company who buys legit copies - or start their own business, and
get their own corporate licenses.&lt;/p&gt;

&lt;p&gt;Piracy is not a bad thing, for software. It's free publicity, it gets people
talking about your product. Free market exposure, which means more long-term
sales. Piracy helps sales, not harms it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Perl and Movable Type</title>
   <link href="http://www.thejacklawson.com//2008/06/perl-and-movable-type/index.html"/>
   <updated>2008-06-24T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2008/06/perl-and-movable-type/perl-and-movable-type</id>
   <content type="html">&lt;p&gt;I finally made the switch for my blog to our own server, after Don got our new
server up and running. We hammered through some &lt;a
href=&quot;http://www.fatalerroronline.com/2008/06/installing-and-configuring-dns.htm
l&quot;&gt;DNS fun&lt;/a&gt; and then some &lt;a
href=&quot;http://www.fatalerroronline.com/2008/06/php-horror.html&quot;&gt;PHP Horror&lt;/a&gt;,
and then, after everything was set up, it was Perl time.&lt;/p&gt;

&lt;p&gt;What went through my head was a little chant: 'not a PHP install all over
again.. not a PHP install all over again.. not a PHP install all over again.. '&lt;/p&gt;

&lt;p&gt;And, it wasn't &lt;strong&gt;quite &lt;/strong&gt;that bad. Close, but not quite. The difference was
that in the Perl install, most of my guesses were correct. Because, as always,
installing any non-Microsoft language on a 2k3 box with IIS is never going to
be fun. I unzipped the MovableType (version 4.12) file into my web directory,
and set off to configure everything. (I already had IIS and MySQL installed at
this point).&lt;/p&gt;

&lt;p&gt;That said, the first thing I did was install &lt;a
href=&quot;http://activestate.com/Products/activeperl/index.mhtml&quot;&gt;ActivePerl&lt;/a&gt;
from ActiveState, version 5.10.0.1003. At the time of writing, this was the
latest &lt;strike&gt;and greatest&lt;/strike&gt;. I did the install (something that, if
following this as instructions, I urge &lt;strong&gt;not &lt;/strong&gt;to do, at least of that
version... follow further down), and everything worked... except that there was
no MySQL module to be found. Bummer.&lt;/p&gt;

&lt;p&gt;So, after hours of troubleshooting that I won't bore you with, I finally
googled around and found out that the 5.8 version (5.8.8.822, to be exact)
still had the MySQL module. I uninstalled the old version and installed this
older version, set up the extensions (IIS manager -&gt; web site -&gt; right-click,
properties -&gt; home directory -&gt; configuration, add .cgi with the extension set
to the perl.exe file where you installed perl, with the headers locked down to
GET, HEAD, and POST). Basically, I followed this: &lt;a
href=&quot;http://www.movabletype.org/documentation/installation/windows.html&quot;&gt;MT
Windows Installation&lt;/a&gt;. However, after all that was said and done, I still
had the problem of it &lt;strong&gt;not working.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first problem I had was that when I went to check the install by going to
mt-check.cgi, it errored out halfway down the page. So, I opened up the
ActivePerl Manager and set DBI and DBD-MySQL to reinstall. I also took the
-original off of the &quot;mt-config.cgi-original&quot; file name.&lt;/p&gt;

&lt;p&gt;The next thing to do is to open up that config file, and comment out
all of the data sources you're not using.  Mine looked something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;##          Movable Type configuration file                   ##
##                                                            ##
## This file defines system-wide settings for Movable Type    ##
## In total, there are over a hundred options, but only those ##
## critical for everyone are listed below.                    ##
##                                                            ##
## Information on all others can be found at:                 ##
## config

################################################################
##################### REQUIRED SETTINGS ########################
################################################################

# The CGIPath is the URL to your Movable Type directory
CGIPath    http://www.crimsondeviations.com/blog/

# The StaticWebPath is the URL to your mt-static directory
# Note: Check the installation documentation to find out 
# whether this is required for your environment.  If it is not,
# simply remove it or comment out the line by prepending a &quot;#&quot;.
StaticWebPath    http://www.crimsondeviations.com/blog/mt-static

#================ DATABASE SETTINGS ==================
#   REMOVE all sections below that refer to databases 
#   other than the one you will be using.

##### MYSQL #####
ObjectDriver DBI::mysql
Database movabletype
DBUser ********
DBPassword *************
DBHost localhost

##### POSTGRESQL #####
#ObjectDriver DBI::postgres
#Database DATABASE_NAME
#DBUser DATABASE_USERNAME
#DBPassword DATABASE_PASSWORD
#DBHost localhost

##### SQLITE #####
#ObjectDriver DBI::sqlite
#Database /path/to/sqlite/database/file
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then again, the mt-wizard page continued to error with &quot;CGI Error. The
specified CGI application misbehaved by not returning a complete set of HTTP
headers&quot;.  After more Googling around, I found out that you have to replace a
line in every page in the main directory (luckily, not many: I opened them all
in &lt;a href=&quot;http://notepad-plus.sourceforge.net/uk/site.htm&quot;&gt;Notepad++&lt;/a&gt; and
did a &quot;replace all in opened files&quot;). You have to change:
use lib $ENV{MT_HOME} ? &quot;$ENV{MT_HOME}/lib&quot; : 'lib';
to
use lib $ENV{MT_HOME} ? &quot;$ENV{MT_HOME}/lib&quot; : 'Y:wwwblogcgi-binmt4lib';
(replacing, of course, with whatever your path is).&lt;/p&gt;

&lt;p&gt;Which then fixed my errors of it not finding the right data source, having
wrong headers, and it magically worked, and I was on my way to blogdom!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Analytics</title>
   <link href="http://www.thejacklawson.com//2008/06/analytics/index.html"/>
   <updated>2008-06-24T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2008/06/analytics/analytics</id>
   <content type="html">&lt;p&gt;Having searched through a large number of analytics software, I was extremely
surprised at the lack of, well, good software. It seemed that there were two
ends on the spectrum: cheap (or free) software that took years to parse through
IIS log files and then still recompiled every time you clicked a link, or there
was the really, really expensive stuff that did everything you wanted and sends
a team to wash your car every other Tuesday. Having looked through about a
dozen tools, I finally found a fit: Google Analytics.&lt;/p&gt;

&lt;p&gt;GA is a beautiful tool; just throw in a .js file, a couple variable
configurations, and you're done. It'll show you everthing from the most common
city people are visiting from, to the highest web browser / OS combo (which is
extremely useful.. can we drop IE 6 YET? The CSS support is killing me). It's
got every metric I could hope to track. However, that doesn't solve all
problems - what do we do with old trending data? How do we get them together?
How do we archive these Google reports?&lt;/p&gt;

&lt;p&gt;Even then, the answer is clear: the holy grail of universal data format, XML.
Google Analytics very conveniently exports all reports as XML format, so it's
really just a matter of taking all of the old data and pushing it through a
little tool thrown together quickly using Visual Studio, which parses and
exports data in Google's XML format. Now we've got all of our data stored
and backed up, and even ready for the next thing to come after Google.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Aggregation</title>
   <link href="http://www.thejacklawson.com//2008/05/aggregation/index.html"/>
   <updated>2008-05-07T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2008/05/aggregation/aggregation</id>
   <content type="html">&lt;p&gt;It's recently occurred to me that it may be a good idea to go ahead and
accumulate both of my blogs, my websites, and those of my colleagues. I
purchased a domain name off of a whim (I found some humor in the domain
name, http://internetvir.us, but not everybody shares my humor, I
guess) and started mocking up a design. And, while I was at it, figured
what the heck, and made it XHTML-strict compliant.&lt;/p&gt;

&lt;p&gt;So, sooner or
later, InternetVirus will be running on my Ubuntu box mentioned
earlier. Just gotta figure out the whole nameserver thing, and I should
be good to go.&lt;/p&gt;

&lt;p&gt;On the recommendation of a coworker, I'm looking at installing &lt;a href=&quot;http://movabletype.org/&quot;&gt;MovableType&lt;/a&gt;
for his blogging engine. I might switch as well, haven't decided yet; I
like the idea of hosting my own engine, though. Blogger's been good to
me, but it just may be time to switch over. I just need to weigh out
the options and really decide what I want.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Ubuntu 8.4 and KDE4</title>
   <link href="http://www.thejacklawson.com//2008/05/ubuntu-84-and-kde4/index.html"/>
   <updated>2008-05-06T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2008/05/ubuntu-84-and-kde4/ubuntu-84-and-kde4</id>
   <content type="html">&lt;p&gt;Well, the first thing I should tell you, is that I'm not a Linux guy.
I've always been with Microsoft; I develop in asp.net/c# primarily
(although I do venture into PHP often). I prefer the range of tools
with Microsoft, they're better developed and have that intuitivity (if
that's a word) that many open-source projects lack.&lt;/p&gt;

&lt;p&gt;However, I
do occasionally dabble in Linux. I started with a RedHat 7 dual-boot in
a laptop I had back in 01, and since then I've occasionally installed
Ubuntu in dual-boot partitions. However, nothing has impressed me quite
as much as the latest version of Ubuntu, coupled with KDE4.&lt;/p&gt;

&lt;p&gt;It's
great stuff. First off, the interface was great. KDE4 has a lot to say
for itself; it fixes the usability problem. I like to cite the
'grandpa' test; if my grandparents can use it, then it'd be ok. And, I
actually think that this might be the ticket; this could be the thing
that brings Linux out of the boxes of computer engineers and into the
hands of the public. I instinctively was able to move about, find
things, install things (how I love the Adept package manager. Windows,
take tips), run things. I was able to set up a media server with my
entire media library without a hitch, following a tutorial. And it
worked &lt;span style=&quot;font-style: italic;&quot;&gt;exactly&lt;/span&gt; how it was supposed to be.  This is big for me. I never get Linux to run right.&lt;/p&gt;

&lt;p&gt;That
said, if you're looking to start a media server of your own, check out
Jinzora2. It's an easy-to-set-up program running PHP and MySQL, and it
will load your music library for you, and even find all the metadata
from cover art to lyrics. Check out the tutorial I followed &lt;a href=&quot;http://rubbervir.us/projects/ubuntu_media_server/&quot;&gt;here&lt;/a&gt; and the sequel &lt;a href=&quot;http://rubbervir.us/projects/ubuntu_media_server/part2.html&quot;&gt;here&lt;/a&gt;
and go for it. So far, my server's been up about a week without a
hitch. I can finally say 'Yay Linux' and embrace the penguin (although
in a fit of irony, I set it up using Putty from my Vista machine.)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Flex Dynamic External Stylesheets</title>
   <link href="http://www.thejacklawson.com//2008/05/flex-dynamic-external-stylesheets/index.html"/>
   <updated>2008-05-05T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2008/05/flex-dynamic-external-stylesheets/flex-dynamic-external-stylesheets</id>
   <content type="html">&lt;p&gt;Note: an updated version can be found &lt;a href=&quot;http://www.thejacklawson.com/index.php/2008/09/flex-dynamic-external-stylesheets-revisited/&quot;&gt;here&lt;/a&gt;, which only has the relevant stuff if you're trying to figure out how to do this.&lt;/p&gt;

&lt;p&gt;After a short hiatus succeeding my random anti-RIAA rant, I'm back with
some information on an interesting Flex issue that I had.&lt;/p&gt;

&lt;p&gt;Flex is the new(ish) Adobe tool that lets you develop flash-like
applications in a new way. It's Actionscript based, but has a more web
development feel to it than the Flash applications of yore.
Unfortunately, though, being a new language, it's lacking a lot. And I
mean &lt;span style=&quot;font-style: italic;&quot;&gt;a lot&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Recently, I was tasked with augmenting an application that we have where I work.
It's an image gallery, which reads lists of files fed to it via XML and
displays everything. It used a flex stylesheet (which is mostly CSS,
with some extra proprietary stuff mixed in), which is all good and
dandy- except that it didn't change depending on theme. And, since we
have several websites that are the same, with different styles applied,
the image gallery looked the same, whether or not it matched. So, my
job was to take this flex doodad and spice it up, so it could change
depending on theme.&lt;/p&gt;

&lt;p&gt;My first thought was &quot;this can't be too bad,
it uses these CSS-like sheets, I can just reference externally.&quot; Well,
this wasn't quite true. I Googled around a bit, to no avail; so, my
next step was to check the new version, Flex 3. What I had was Flex 2,
and lo and behold, Flex 3 claimed 'external stylesheet report'. I was
in, or so I thought.&lt;/p&gt;

&lt;p&gt;p. I set up my .net app to send the theme name
through a querystring, with which I'd be able to pick up the stylesheet
(thinking I'd just drop it in the theme-specific folder and grab the
path through application logic in the flex program). I did it and it
spectacularly failed. Frustrated, I tried several configurations, but
nothing worked. So, I made my way over to the Actionscript.org forums
to see what I could dig up. As you can see &lt;a href=&quot;http://www.actionscript.org/forums/showthread.php3?p=722679&quot;&gt;here&lt;/a&gt;,
I didn't make much progress. Apparently, I was going completely the
wrong way (and may have thrown a little tantrum in the progress, but
we'll look over that, heh.)&lt;/p&gt;

&lt;p&gt;But just then, a fellow named Jeff with a blog post saved the day. After &lt;a href=&quot;http://jeff.mxdj.com/changing_flex_style_sheets_at_runtime.htm&quot;&gt;reading his instructions&lt;/a&gt;,
I got correct results instantly! Fantastic. I now had my working
project, which changed styles based on the asp.net theme I was in. I
guess flex and asp.net just isn't quite right to be married to each
other yet, no matter how much XML you pass back and forth.&lt;/p&gt;

&lt;p&gt;Here's what I did:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;__After init()__
public function CSSFormat():void{
  var theme:String = &quot;default&quot;
  var themeSWF:String = &quot;default&quot;

if(Application.application.parameters.Theme != undefined) { 
  theme= Application.application.parameters.Theme;
}

themeSWF = theme;

//conditional comments to take out hyphens were here, but I took them out to shorten it a bit. some directories use hyphens, while the swf files themselves have issues compiling like that.

var css_url:String = &quot;App_Themes/&quot; + theme + &quot;/&quot; + themeSWF + &quot;.swf&quot;;StyleManager.loadStyleDeclarations(css_url);}&amp;lt;/pre&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Moral of the story? Although I got it to work, I'm sticking to Silverlight.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>On Management</title>
   <link href="http://www.thejacklawson.com//2008/03/on-management/index.html"/>
   <updated>2008-03-11T00:00:00-07:00</updated>
   <id>http://www.thejacklawson.com//2008/03/on-management/on-management</id>
   <content type="html">&lt;p&gt;There are two kinds of managers, the way I look at things: managers who stifle creativity, and those who endorse it.&lt;/p&gt;

&lt;p&gt;Looking
back through my life, I find that I have had huge problems with the
first kind, and I've had a great time with the second. It usually
seemed to rear it's head during my math classes. It started in
elementary class, and continued to fight and struggle every year except
one- my senior year. I remember back in Freshman year, during geometry
we were doing math problems that took half a page to complete. &quot;Aha,&quot; I
noticed, &quot;I can just use the pythagorean theorem and cut it down to
about three lines.&quot; Of course, this didn't fly with my teacher, who
held a strong affinity towards doing things the way the book did them.
Now, I'll agree, there are arguments towards doing it by the book
(&quot;teaches you how to do it that way&quot; is the general response), but I'm
a huge proponent of if it works better another way, then do it. As I
argued then- I know how to do it, and I know how to do it faster,
better, and with less points of failure.&lt;/p&gt;

&lt;p&gt;This all continued, and
came to a huge head during Trig, Junior year. A friend and I wrote
programs every day, instead of taking the notes, that did the homework
for us. We even accomodated to our teacher's archaic views and
developed the programs so that they showed the work; she, of course,
hated it, but it worked quite well. Then, finally, my senior year I had
Calculus AP; the first math that really challenged me, but at the same
time, the first math class I enjoyed for 5 years. It was only myself
and one other person in the class- we had started with 11, and the
other 9 dropped out- along with our teacher.&lt;/p&gt;

&lt;p&gt;The reason I liked
the class so much was because she didn't require work, and she didn't
require that you simplify answers, and she didn't care about the final
format, as long as it was right. It helped to show your work, so that
you could find errors, but you didn't have to. You had the freedom to
do the work however you wanted to, you could find shortcuts and ways
around that worked better and made sense.&lt;/p&gt;

&lt;p&gt;I find myself
harboring the same feelings in the workplace. I was an intern at a
company for about 8 months, where the projects came three-a-day, and it
was 85% copy and paste from other code. The other 15% was debugging. It
was all classic ASP (which suprised me more and more as time went by..
it was 2007, after all), and it was badly written. Something needed to
be done; however, there was no room for innovation, no room for, say, a
nice .net framework, not anything except heads-down coding. I was,
effectively, a code monkey.&lt;/p&gt;

&lt;p&gt;My current place, however, is an
exception. In the same way as I found myself in a wonderful place after
moving from Trig to Calc, I find myself with creative freedom; if I
have an idea that will speed up processes, or that will help out in
some other way, and I've got down time- I can work on something.
Recently, I made a program that took some basic copy-paste work we did
from 20 minutes down to about 2- something I was a bit apprehensive to
show off, but, finally did to great reception. It gave me new hope that
there was somewhere that I could fit in and try new things out. We
later attempted integrating a wiki, which also worked wonders; the
whole team could now communicate and store data, instead of throwing
word docs around in VSS.&lt;/p&gt;

&lt;p&gt;Now, I'm not advocating running off and
doing projects whenever you feel like it, and wasting company time to
try some thought out. However, I am advocating that if there's a
genuinely good idea, and you're not hammered down with work- creative
freedom is the best kind. It helps thoughts flow, and it sometimes pans
out to be a great development that can help out, and even occasionally
revolutionize the whole development team.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Sideways</title>
   <link href="http://www.thejacklawson.com//2008/02/sideways/index.html"/>
   <updated>2008-02-13T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2008/02/sideways/sideways</id>
   <content type="html">&lt;p&gt;So, I've recently had a pretty cool idea. I'm sure it's something
that's been done before by somebody, but it's a first for me, and after
a few weeks I'm still the only one in the office to have done this: I
took my two LCD monitors, and turned them sideways.&lt;/p&gt;

&lt;p&gt;At first,
I'll admit, it was a bit of a joke. I didn't think I'd actually leave
it that way, but I wanted to see how it would work out. So, I've now
got two 19&quot; widescreen monitors combined into one, slightly angled
large one. I'm actually really happy with the concept, too. It allows
me to see twice as much code, and most websites and applications are
designed for a 1024x768 screen resolution anyway; I've got a resolution
of 1024x1280 on each (2048x1040, technically), so I get the width while
having a nice newspaper-style height.&lt;/p&gt;

&lt;p&gt;It also rocks using the
program UltraMon, which gives you a few easy little bits of
functionality like a button to switch from one monitor to the other, or
to stretch your taskbar across both screens, or even stretch a window
across both screens. It works out suprisingly well on Visual Studio to
stretch the window across for long lines, but be able to see a ton
vertically.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Perfect Team</title>
   <link href="http://www.thejacklawson.com//2008/02/the-perfect-team/index.html"/>
   <updated>2008-02-05T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2008/02/the-perfect-team/the-perfect-team</id>
   <content type="html">&lt;p&gt;A Perfect World?
In a perfect world, designers know how to develop, and developers know how to design. However, this is often not the case, and as has been brought to my attention recently, it can seriously bog down and lessen the quality of any user interface. There is a layer of overlap between the design and development teams of any project that needs to exist to facilitate perfect cooperation and a flawless user experience.&lt;/p&gt;

&lt;p&gt;Problem Number One: Designers who don't understand code
There are two main strains of this problem that I have seen take place. The first is that the designer holds himself back from creating a perfect design, unsure of whether or not things are possible. &quot;Is it feasible to have X feature?&quot;, he asks himself, and ultimately leaves it out of the design. Although the final product looks good, it could look better. The second problem that I have noticed is when designers go over the top with their designs, and implement design features that go against the code base, adding awkward features that look great but don't necessarily scale. What works in flash, for example, does not always work so well in plain old HTML. This is where the code knowledge comes in.&lt;/p&gt;

&lt;p&gt;A designer with at least a little development experience should have a general idea of what he can do, and will feel more comfortable speaking with developers with the &quot;How about this?&quot; sort of question. The developer and designer will be able to speak the same language, and can come up with a farsuperior solution.&lt;/p&gt;

&lt;p&gt;Problem Number Two: Developers who don't understand design
This is, in my opinion, far worse than the above problem. I have seen countless examples of perfect, flawless, completely unusable applications. Many developers see things very differently than designers: they design to display the data they output, and organize layouts according to the back-end. I frequently have drawn-out debates with a friend of mine, with whom I have been working on an online game. A recent argument went something like this:&lt;/p&gt;

&lt;p&gt;&quot;Matt: The defend and the attack forms are the exact same.
Me: Yes, but, they serve very different purposes. Defend is set-and-forget, attack is something that changes every round.
Matt: But the forms are the exact same, so they should go in the same place.
Me: No, the attack form should go where the attacks happen, the defend should go with the long-term options storage, since you only set it once, like the other options...&quot;&lt;/p&gt;

&lt;p&gt;And, so on, for a few hours. I'll spare you the details. I'm sure you can tell who's who: Matt is a developer, and only a developer. He is right; they are the same fields, the same select boxes, the same buttons. However, from a user's perspective, they are radically different, because one is reset every few seconds during a fight. Matt is a brilliant developer; but, an intermediary needs to fight for the user, because the developer cannot always see from their standpoint when they're used to thinking about pure functionality.&lt;/p&gt;

&lt;p&gt;Go to the Library
What this all comes down to, is that each side should take a moment, and sit down and learn the other's trade. Developers should see why designers do what they do, and designers should feel open to taking suggestions and discussing ideas with developers. It is when this happens that well-designed, attractive, usable applications can be developed.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>One Million Little Ideas</title>
   <link href="http://www.thejacklawson.com//2008/02/one-million-little-ideas/index.html"/>
   <updated>2008-02-05T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2008/02/one-million-little-ideas/one-million-little-ideas</id>
   <content type="html">&lt;p&gt;I've got a little problem. Everyone has their quirks; mine's finishing projects.&lt;/p&gt;

&lt;p&gt;It's
some weird form of subversive ADD, lurking until I'm about 50% done
with a project and then viciously attacking with full force. It's the
thing that fills up my hard drive with templates in PSDs and hundreds
of visual studio files named 'test_X' or 'X_POC'. So, consequently, I
end up starting a good-sized handful of projects at once, making
commitments, and inevitably failing at actually completing anything
unless I secure a pot of coffee and stay up to 4 in the morning (90% of
Gevalum's coding was done after 9PM, and 98% of it was with coffee in
hand. I estimated that I've consumed a total 65.3 gallons of coffee
since March 10, 2006, it's beginning, assuming an average of a cup and
a half of coffee per day.)&lt;/p&gt;

&lt;p&gt;Currently, my to-do list includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gevalum's big 5.2 update, including a new monster fighting system, a
new player-versus-player system, lots of little interface updates, and
streamlining the engine&lt;/li&gt;
&lt;li&gt;Bookloft, a site where users can get on and discuss their favorite books&lt;/li&gt;
&lt;li&gt;Getting a huge enterprise-level application ready for a Star-Wars group
(asp.net, has to be scalable enough to add sub-groups with sub-groups
with sub-groups..etc and personal websites for each group commander,
and training manuals, and all sorts of stuff)&lt;/li&gt;
&lt;li&gt;Another one for a different group. Not as big, but still nothing to shake a lightsaber at.&lt;/li&gt;
&lt;li&gt;Some kind of time manager. Probably something I'd open-source
eventually.. will provide more details in another post, if I get it to
it. It's at the bottom of my priorities.&lt;/li&gt;
&lt;li&gt;Studying for the MCTS certifications for .NET 2.0 web-based development (70-536,70-528), and then the MCPD test (70-547)&lt;/li&gt;
&lt;li&gt;Studying for the MCTS in SQL Server 2k5 Implementation/Maintenance (70-431)&lt;/li&gt;
&lt;li&gt;Learning openSUSE 10.3 inside and out&lt;/li&gt;
&lt;li&gt;Setting up my new server&lt;/li&gt;
&lt;li&gt;And spending as little time as possible doing these, so I can be with my pregnant wife. The list never ends.&lt;/li&gt;
&lt;li&gt;I guess that's where open-sourcing things comes in handy.&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>A Better Way</title>
   <link href="http://www.thejacklawson.com//2008/02/a-better-way/index.html"/>
   <updated>2008-02-04T00:00:00-08:00</updated>
   <id>http://www.thejacklawson.com//2008/02/a-better-way/a-better-way</id>
   <content type="html">&lt;p&gt;A Better Way, my new blog, is where I can dump all of the stuff that
doesn't really pertain to my other blog, &quot;Coffee Grounds and Crumpled
Paper&quot;. CGCP is the blog that I run for an online game that I, along
with a friend from Sweden, made named Gevalum. It's an online, free,
browser-based RPG where players can create accounts and play a fairly
simple but addictive game. It's got a pretty advanced AJAX framework
that I wrote up; I did the design and laid out much of the framework,
and my friend (Matt) filled in the spots with our back-end PHP and
database design and with much of the javascript. But, the Gevalum
design is for another post.&lt;/p&gt;

&lt;p&gt;I am a 19 year old web application
developer. I've been making websites since I was 10 years old, and
learned my first programming language (BASIC) at 11. Though I'm
relatively young in the field, I've got plenty of experience, along
with a knack to finding a more efficient, prettier way around things
since I haven't been brought up in the kind of environment that stifles
that kind of thought.&lt;/p&gt;

&lt;p&gt;I know ASP, PHP, ColdFusion, HTML, CSS,
JavaScript, a little Java, some C++, and my favorite: ASP.NET with C#.
I love the syntax, and I love the scalability that ASP.NET/C# offers.
However, for lightweight applications, I prefer a simple PHP back-end,
called through AJAX for seamlessness on xhtml-compliant interfaces.
(Oh, yeah. I also design all of my interfaces, using Adobe Photoshop
CS2, or C4D if I'm feeling adventurous).&lt;/p&gt;

&lt;p&gt;The reason for this
blog is simple: a brain dump, where I can post my ideas on how to break
down barriers, and how to level the fact that the &lt;em&gt;old&lt;/em&gt; way is the &lt;em&gt;good&lt;/em&gt; way. Sometimes it works, but more often than not- there's a better way.&lt;/p&gt;
</content>
 </entry>
 
 
</feed>
