{"version":"1.0","encoding":"UTF-8","feed":{"xmlns":"http://www.w3.org/2005/Atom","xmlns$openSearch":"http://a9.com/-/spec/opensearchrss/1.0/","xmlns$georss":"http://www.georss.org/georss","xmlns$thr":"http://purl.org/syndication/thread/1.0","id":{"$t":"tag:blogger.com,1999:blog-396730"},"updated":{"$t":"2011-09-19T14:02:46.228-05:00"},"category":[{"term":"dojo workish"},{"term":"dojo"},{"term":"javascript"},{"term":"regexp workish"},{"term":"javascript air"},{"term":"javascript rhino"},{"term":"testing UI dojo workish javascript"},{"term":"play"},{"term":"workish dojo air testing"},{"term":"BarCampLeeds08 adobeair dojo workish"},{"term":"osx"},{"term":"rhino"},{"term":"workish"}],"title":{"type":"text","$t":"Sam Foster, Web Dev."},"subtitle":{"type":"html","$t":"Infrequent thoughts on web development and similar"},"link":[{"rel":"http://schemas.google.com/g/2005#feed","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/posts/default"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default?alt\u003djson"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/"},{"rel":"hub","href":"http://pubsubhubbub.appspot.com/"},{"rel":"next","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default?alt\u003djson\u0026start-index\u003d26\u0026max-results\u003d25"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"generator":{"version":"7.00","uri":"http://www.blogger.com","$t":"Blogger"},"openSearch$totalResults":{"$t":"163"},"openSearch$startIndex":{"$t":"1"},"openSearch$itemsPerPage":{"$t":"25"},"entry":[{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-2097743024933865579"},"published":{"$t":"2009-04-09T04:01:00.002-05:00"},"updated":{"$t":"2009-04-09T04:23:00.583-05:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"workish dojo air testing"}],"title":{"type":"text","$t":"AIR command line arguments"},"summary":{"type":"text","$t":"I've been working on the next release of the Dojo Toolbox - which is an Adobe AIR app, using the Dojo Toolkit. I'm taking a TDD kind of approach to get on a better footing for evolving this thing, and needed a quick way to run a particular set of unit tests.\n\nI wanted to be able to do something like this: \n$ adl runTests.xml testModule\u003dtoolbox.tests.SomeThing\n\nGetting command line arguments in "},"link":[{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/2097743024933865579/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d2097743024933865579","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/2097743024933865579"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/2097743024933865579"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2009/04/air-command-line-arguments.html","title":"AIR command line arguments"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-8479403736592008609"},"published":{"$t":"2009-02-27T17:05:00.002-06:00"},"updated":{"$t":"2009-02-27T17:15:02.347-06:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"javascript rhino"}],"title":{"type":"text","$t":"A rhino prompt"},"summary":{"type":"text","$t":"I'm tinkering with another ill-conceived friday night project that may or may not see the light of day. But in the meantime, I just put together this little snippet that illustrates a lot of what's to like about rhino: \n\nvar getInput \u003d function() {\n var br \u003d new java.io.BufferedReader(\n new java.io.InputStreamReader(java.lang.System[\"in\"])\n );\n return br.readLine();\n};\n\nvar greetUser \u003d "},"link":[{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/8479403736592008609/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d8479403736592008609","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/8479403736592008609"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/8479403736592008609"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2009/02/rhino-prompt.html","title":"A rhino prompt"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-5357904816512927772"},"published":{"$t":"2009-01-08T15:28:00.004-06:00"},"updated":{"$t":"2009-02-17T05:38:59.174-06:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"javascript"},{"scheme":"http://www.blogger.com/atom/ns#","term":"osx"},{"scheme":"http://www.blogger.com/atom/ns#","term":"rhino"}],"title":{"type":"text","$t":"Setting up Rhino"},"summary":{"type":"text","$t":"I've been using the Rhino engine more and more to run command-line scripts, fiddle and try things out. But my setup has taken shape slowly, and it wasn't much fun to be honest when I first got started. \n\nI'm on a mac (Leopard), and here's how I've got it now: \n\n\nDownload the Rhino .jar file, you'll find it inside the latest (binary) release. \n\nDrop it in your {user}/Library/java/Extensions folder"},"link":[{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/5357904816512927772/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d5357904816512927772","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/5357904816512927772"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/5357904816512927772"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2009/01/setting-up-rhino.html","title":"Setting up Rhino"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-6538263946869165511"},"published":{"$t":"2008-12-08T04:47:00.002-06:00"},"updated":{"$t":"2008-12-08T06:06:29.394-06:00"},"title":{"type":"text","$t":"Barcamp Liverpool"},"summary":{"type":"text","$t":"I took in the first day of BarCamp Liverpool. It was Liverpool's first, and my second, and went off well I thought. I learnt some things, saw some new and familiar stuff and felt it was time extremely well spent. It was great to see people coming out of the woodwork and talking about what they are doing. \n\nThere was much talk of iPhone apps, and the economic opportunities (or not) that presents "},"link":[{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/6538263946869165511/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d6538263946869165511","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/6538263946869165511"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/6538263946869165511"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2008/12/barcamp-liverpool.html","title":"Barcamp Liverpool"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-5210050637771187117"},"published":{"$t":"2008-11-06T17:06:00.003-06:00"},"updated":{"$t":"2008-11-07T05:30:24.164-06:00"},"title":{"type":"text","$t":"String repetition in javascript"},"summary":{"type":"text","$t":"This is about a little snippet I came up with the other month, while a colleague and I were talking about string building and its performance in javascript. I was looking for a neat way to front-pad or indent a string, and missing the x operator in perl.\n\nIt turns out there is a succinct, one-line idiom:\nvar indent \u003d new Array(10).join(\" \")\n\nThat gets you a 9-spaces-long string. Using the formal "},"link":[{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/5210050637771187117/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d5210050637771187117","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/5210050637771187117"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/5210050637771187117"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2008/11/string-repetition-in-javascript.html","title":"String repetition in javascript"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-8443817861744719240"},"published":{"$t":"2008-08-16T17:41:00.004-05:00"},"updated":{"$t":"2008-08-19T04:11:07.209-05:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"BarCampLeeds08 adobeair dojo workish"}],"title":{"type":"text","$t":"BarCampLeeds 08"},"summary":{"type":"text","$t":"What a day. Who knew that Leeds was this nascent tech hub. I had a hunch of course (and followed it by moving back here), but there's enery and talent oozing out the edges here, and its surely only a matter of time before it reaches critical mass and becomes a real tech ecosystem. \n\nWhat'd I learn? I started the day with an into to geocaching. Which I'd of course heard of, but somehow had lumped "},"link":[{"rel":"related","href":"http://www.barcampleeds.com/","title":"BarCampLeeds 08"},{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/8443817861744719240/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d8443817861744719240","title":"1 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/8443817861744719240"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/8443817861744719240"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2008/08/barcampleeds-08.html","title":"BarCampLeeds 08"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"1"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-1894098019425452325"},"published":{"$t":"2008-08-12T04:51:00.003-05:00"},"updated":{"$t":"2008-08-12T05:12:03.893-05:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"testing UI dojo workish javascript"}],"title":{"type":"text","$t":"doh.robot"},"summary":{"type":"text","$t":"New automated UI testing goodies just landed in dojo, and I'm moved to blog about them. Getting test coverage of the messy stuff - user interactions, mouse-movement, clicks, drags - has always been an achiles heel of testing web UIs. Any kind of automated testing is better than none (provided you are testing the right things and keeping a good testing/developing balance), but for UI testing so "},"link":[{"rel":"related","href":"http://dojotoolkit.org/2008/08/11/doh-robot-automating-web-ui-unit-tests-real-user-events","title":"doh.robot"},{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/1894098019425452325/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d1894098019425452325","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/1894098019425452325"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/1894098019425452325"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2008/08/dohrobot.html","title":"doh.robot"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-6973744421928743266"},"published":{"$t":"2008-03-07T08:31:00.002-06:00"},"updated":{"$t":"2008-03-07T08:50:08.724-06:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"dojo workish"}],"title":{"type":"text","$t":"dijit.byNode and firebug fun"},"summary":{"type":"text","$t":"Here's a little tip if you're working with dojo widgets. In firebug you can select an element in the HTML view. Back in the firebug console, your selected node is available as $1 So, $1.tagName shows you the element name, etc. \n\nIf you've got dojo on your page you can use anything dojo has provided in the console, and if you're using dijit, you also have that stuff too. So, in the HTML view click"},"link":[{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/6973744421928743266/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d6973744421928743266","title":"1 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/6973744421928743266"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/6973744421928743266"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2008/03/dijitbynode-and-firebug-fun.html","title":"dijit.byNode and firebug fun"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"1"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-7097869770505043773"},"published":{"$t":"2008-02-22T23:03:00.006-06:00"},"updated":{"$t":"2008-02-25T22:08:56.897-06:00"},"title":{"type":"text","$t":"Restoring SVN repositories from disk - a story"},"summary":{"type":"text","$t":"I recently had to move off a company laptop I'd been using for a while, and (thanks to the flu) didnt have much time to do it. So, I backed up those directories I knew had any personal projects and data in and crossed-fingers I'd be able to get what I needed out of there when the time came.\n\nOne of the directories I got housed my subversion respositories (I'd been using the flat-file db option). "},"link":[{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/7097869770505043773/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d7097869770505043773","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/7097869770505043773"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/7097869770505043773"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2008/02/restoring-svn-repositories-from-disk.html","title":"Restoring SVN repositories from disk - a story"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-1394018761950592367"},"published":{"$t":"2008-01-15T12:45:00.000-06:00"},"updated":{"$t":"2008-01-15T13:10:59.765-06:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"workish"}],"title":{"type":"text","$t":"A Parable"},"summary":{"type":"text","$t":"A man was asked to do some renovation on a house. He worked steadily at it for several weeks and finally called his client to come take a look around.\n\nHe said, \"I was able to keep a lot of the original flooring. I got a good match for the wood and finish where I had to patch and extend the floor. I'm nearly done. I just need to pick up my offcuts and sweep up.\"\n\n\"Oh good\" said the client. \"So "},"link":[{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/1394018761950592367/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d1394018761950592367","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/1394018761950592367"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/1394018761950592367"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2008/01/parable.html","title":"A Parable"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-5729859044270293024"},"published":{"$t":"2008-01-14T16:23:00.000-06:00"},"updated":{"$t":"2008-01-14T16:46:03.593-06:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"dojo workish"}],"title":{"type":"text","$t":"dijit.Declaration and its mixins"},"summary":{"type":"text","$t":"I love the dijit.Declaration widget introduced into the dojo toolkit around version 0.9+. It lets you declare a new widget class inline in your html - which can be very useful, especially when you want the widget templateString to be dynamic output from the server.\n\nJust a little tip - I had been getting a m._findMixin is not a function error when instantiating widgets from my Declaration. If "},"link":[{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/5729859044270293024/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d5729859044270293024","title":"1 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/5729859044270293024"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/5729859044270293024"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2008/01/dijitdeclaration-and-its-mixins.html","title":"dijit.Declaration and its mixins"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"1"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-1124153050077393405"},"published":{"$t":"2007-11-30T11:42:00.000-06:00"},"updated":{"$t":"2007-11-30T11:54:12.812-06:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"regexp workish"}],"title":{"type":"text","$t":"Regexp to match only html filenames and directory names"},"summary":{"type":"text","$t":"I've been working on a script to create filtered directory tree listings. It can be configured with both include conditions, and exclude conditions. If something passes the include filters, it then checks to see if its explicitly excluded. For example, I want to exclude cgi-bin, but include all other directories and files. \n\nSo its useful to have a good catch-all pattern for including only the "},"link":[{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/1124153050077393405/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d1124153050077393405","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/1124153050077393405"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/1124153050077393405"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2007/11/regexp-to-match-only-html-filenames-and.html","title":"Regexp to match only html filenames and directory names"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-7404557467596899193"},"published":{"$t":"2007-11-28T01:47:00.000-06:00"},"updated":{"$t":"2007-11-28T01:52:49.252-06:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"javascript"},{"scheme":"http://www.blogger.com/atom/ns#","term":"workish"},{"scheme":"http://www.blogger.com/atom/ns#","term":"play"},{"scheme":"http://www.blogger.com/atom/ns#","term":"dojo"}],"title":{"type":"text","$t":"Simple Clocks with the Dojo Toolkit"},"summary":{"type":"text","$t":"Something I was playing with - this page shows a couple of javascript clock/countdown treatments. None are as whizzy as the dojox.gfx (vector graphics) clock you might have seen around, or your various dashboard widgets - but this is just dojo core + 6k (uncompressed) of code."},"link":[{"rel":"related","href":"http://sam-i-am.com/work/sandbox/simplClock/test_DojoClock.html","title":"Simple Clocks with the Dojo Toolkit"},{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/7404557467596899193/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d7404557467596899193","title":"1 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/7404557467596899193"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/7404557467596899193"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2007/11/simple-clocks-with-dojo-toolkit.html","title":"Simple Clocks with the Dojo Toolkit"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"1"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-2655276403368988322"},"published":{"$t":"2007-11-27T23:57:00.000-06:00"},"updated":{"$t":"2007-11-28T00:27:32.629-06:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"javascript"},{"scheme":"http://www.blogger.com/atom/ns#","term":"workish"}],"title":{"type":"text","$t":"string.replace with substitution by function"},"summary":{"type":"text","$t":"It may or may not be news to you that in Javascript you can do: \nsomeString.replace(\n /\\w+/g, \n function(match) {\n return \"blah\"\n }\n);\nWhich in this case turns \"the original string\" into \"blah blah blah\". Your function is passed the match, and you return whatever you want. That's pretty handy, as you can run the match through transformations, or even use it to lookup or generate some "},"link":[{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/2655276403368988322/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d2655276403368988322","title":"1 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/2655276403368988322"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/2655276403368988322"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2007/11/stringreplace-with-substitution-by.html","title":"string.replace with substitution by function"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"1"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-3362311160525754039"},"published":{"$t":"2007-10-24T08:25:00.000-05:00"},"updated":{"$t":"2007-10-24T08:46:10.091-05:00"},"title":{"type":"text","$t":"TAE keynote and CSS layout"},"summary":{"type":"text","$t":"the Ajaxian folks are doing their little summary of the past year or so as pertains to Ajax. One of the \"trends\" or opportunities they observe is doing layout using javascript. CSS got a panning. Now I understand that CSS layout is complex - no argument there. But doing layout in javascript is hardly new and proven to be a dead-end - at least with current browsers. In Dojo 0.9 the widget and "},"link":[{"rel":"related","href":"http://ajaxexperience.techtarget.com/east/","title":"TAE keynote and CSS layout"},{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/3362311160525754039/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d3362311160525754039","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/3362311160525754039"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/3362311160525754039"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2007/10/tae-keynote-and-css-layout.html","title":"TAE keynote and CSS layout"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-8203757001964707197"},"published":{"$t":"2007-09-06T20:34:00.000-05:00"},"updated":{"$t":"2007-09-06T20:53:24.126-05:00"},"title":{"type":"text","$t":"Sortable list with dojo 0.9"},"summary":{"type":"text","$t":"This is a quick proof of concept of a sortable, data-store backed list (using dojo 0.9). The store (a dojo.data.ItemFileReadStore instance) does the sorting. Each list-item has an id, that is mapped to the store item identifier. So when the re-sorted list comes back I just look up the list-item node and appendChild it to move it in the list.\n\nThe store has 52 items (its a list of states) and "},"link":[{"rel":"related","href":"http://sam-i-am.com/work/sandbox/dojo0.9/samiam/sortableList.html","title":"Sortable list with dojo 0.9"},{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/8203757001964707197/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d8203757001964707197","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/8203757001964707197"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/8203757001964707197"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2007/09/sortable-list-with-dojo-09.html","title":"Sortable list with dojo 0.9"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-2743040805604954402"},"published":{"$t":"2007-07-21T03:12:00.000-05:00"},"updated":{"$t":"2007-07-21T07:56:51.596-05:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"javascript air"}],"title":{"type":"text","$t":"Adobe AIR tour"},"summary":{"type":"text","$t":"I made a quick trip to Dallas to catch the Adobe AIR bus tour there. You know, it was pretty interesting. I was braced for a 4 hour long vendor sales demo, and it kind of was that, but with enough hands-on detail to keep my attention. Plus, it looks like a sweet product.\n\nA few misunderstandings that got cleared up for me:\n\nAIR is specifically the runtime. Think the .NET runtime - its a "},"link":[{"rel":"related","href":"http://onair.adobe.com/bus/","title":"Adobe AIR tour"},{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/2743040805604954402/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d2743040805604954402","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/2743040805604954402"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/2743040805604954402"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2007/07/adobe-air-tour.html","title":"Adobe AIR tour"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-6209494422817027010"},"published":{"$t":"2007-07-11T15:34:00.000-05:00"},"updated":{"$t":"2007-07-11T15:38:20.461-05:00"},"title":{"type":"text","$t":"Moving your Firefox profile"},"summary":{"type":"text","$t":"Little tip. You can easily move your FF profile directory to another local drive/directory e.g. thumb drive, or a backed-up directory. In my case it was to a directory that doesn't have every read/write scanned by anti-virus software. (I can see how this might be prudent and all, but it was making for a very slow browsing experience on my pc.)"},"link":[{"rel":"related","href":"http://www.mozilla.org/support/firefox/profile","title":"Moving your Firefox profile"},{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/6209494422817027010/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d6209494422817027010","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/6209494422817027010"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/6209494422817027010"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2007/07/moving-your-firefox-profile.html","title":"Moving your Firefox profile"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-4835855610844351355"},"published":{"$t":"2007-02-22T08:33:00.000-06:00"},"updated":{"$t":"2007-02-22T08:45:13.415-06:00"},"title":{"type":"text","$t":"RefreshAustin is 1yr Old"},"summary":{"type":"text","$t":"I'm prompted to post because almost a year after we disbanded the Austin Web Standards Meetup, and merged with RefreshAustin I'm still getting email from meetup.com with people signing up for future web standards meetups in Austin. Folks, the group is alive and well, we meet at least monthly, but we now fly a \"Refresh\" banner instead of the web standards meetup one. \n\nThe Refresh format is simple"},"link":[{"rel":"related","href":"http://refreshaustin.org/","title":"RefreshAustin is 1yr Old"},{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/4835855610844351355/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d4835855610844351355","title":"1 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/4835855610844351355"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/4835855610844351355"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2007/02/refreshaustin-is-1yr-old.html","title":"RefreshAustin is 1yr Old"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"1"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-655192680246971231"},"published":{"$t":"2007-01-12T10:32:00.000-06:00"},"updated":{"$t":"2007-01-12T10:57:11.192-06:00"},"title":{"type":"text","$t":"Terminal funkiness with ActiveState perl"},"summary":{"type":"text","$t":"I just finally got on top of an annoyance I've had for a while: on my work machine I use MKS Toolkit - which provides a lot of the common unix tools for developers using windows. It provides its own Perl build, but I've been using ActiveState's for a while, and didnt want to complicate synchronizing my work across the different machines I use perl on.\nAn unhappy side-effect of installing MKS "},"link":[{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/655192680246971231/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d655192680246971231","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/655192680246971231"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/655192680246971231"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2007/01/terminal-funkiness-with-activestate.html","title":"Terminal funkiness with ActiveState perl"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-116129273001449461"},"published":{"$t":"2006-10-19T16:11:00.000-05:00"},"updated":{"$t":"2006-12-06T01:41:06.226-06:00"},"title":{"type":"text","$t":"Javascript shell with Rhino"},"summary":{"type":"text","$t":"The Rhino javascript interpreter (from Mozilla, sister to SpiderMonkey) has an interactive mode:\n\nC:\\dojo\\buildscripts\u003ejava -jar lib/js.jar\nRhino 1.5 release 3 2002 01 27\njs\u003e print('boo');\nboo\njs\u003e\n\nThe Rhino jar is a part of the dojo distribution, so if you've got dojo (from SVN, not the pre-built releases) you already have it.\nThe Scripting Java page from Mozilla has these and other details. "},"link":[{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/116129273001449461/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d116129273001449461","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/116129273001449461"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/116129273001449461"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2006/10/javascript-shell-with-rhino.html","title":"Javascript shell with Rhino"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-115714575521775737"},"published":{"$t":"2006-09-01T16:19:00.000-05:00"},"updated":{"$t":"2006-09-01T16:22:35.230-05:00"},"title":{"type":"text","$t":"Soft-wrapping long words"},"summary":{"type":"text","$t":"The issue of long, non-breaking words like urls has been around for a while on the web - and the impact this can have on layouts and other places where width is constrained for whatever reason.\n \nI've been going back and forth on this, and dug up and old test page on No-wrapping and Soft-wrapping. This has some test cases using \u003cnobr\u003e, \u003cwbr\u003e and the soft-hyphen character \u0026shy;. The results aren't"},"link":[{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/115714575521775737/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d115714575521775737","title":"1 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/115714575521775737"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/115714575521775737"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2006/09/soft-wrapping-long-words.html","title":"Soft-wrapping long words"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"1"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-115678924977587118"},"published":{"$t":"2006-08-28T13:08:00.000-05:00"},"updated":{"$t":"2006-09-01T16:25:20.776-05:00"},"title":{"type":"text","$t":"Re: Has accessibility been taken too far?"},"summary":{"type":"text","$t":"(Jeff Croft posted this provocative article which seemed to tap a common feeling that accessibility is a pain in the ass, strictly optional and web designers should be cut some slack)\n\nIf you wade through the slop of the first round of comments to this post, there's actually some reasonable debate that follows. Jeff came out saying he wanted to provoke discussion and (eventually) seems to have "},"link":[{"rel":"related","href":"http://www2.jeffcroft.com/2006/aug/21/has-accessibility-been-taken-too-far/","title":"Re: Has accessibility been taken too far?"},{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/115678924977587118/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d115678924977587118","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/115678924977587118"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/115678924977587118"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2006/08/re-has-accessibility-been-taken-too.html","title":"Re: Has accessibility been taken too far?"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-115579211145302457"},"published":{"$t":"2006-08-17T00:20:00.000-05:00"},"updated":{"$t":"2006-08-17T00:24:18.113-05:00"},"title":{"type":"text","$t":"\"Surveying OS Ajax Toolkits\" article on infoworld"},"summary":{"type":"text","$t":"This is well worth a read. Unlike most reviews I've seen, this author\nobviously spent sometime with each of the libraries he includes -\nenough to get a meaningful impression of the strengths and weaknesses.\nFor me, he's right on the money with Dojo, YUI, Rico, Atlas. I differ\na little on GWT, but in truth it sounds like he spent more time with\nit than I did.\nBeing a dojo guy at present, I think "},"link":[{"rel":"related","href":"http://www.infoworld.com/article/06/07/31/31FEajax_3.html","title":"\"Surveying OS Ajax Toolkits\" article on infoworld"},{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/115579211145302457/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d115579211145302457","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/115579211145302457"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/115579211145302457"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2006/08/surveying-os-ajax-toolkits-article-on.html","title":"\"Surveying OS Ajax Toolkits\" article on infoworld"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-396730.post-115107352813089369"},"published":{"$t":"2006-06-23T09:33:00.000-05:00"},"updated":{"$t":"2006-06-23T10:20:35.876-05:00"},"title":{"type":"text","$t":"Krugle - open source code search engine"},"summary":{"type":"text","$t":"I bumped into one of Krugle's developers at the Ajax experience conference. Looks like they just came out of beta and are open to the public. This is sweet, I can't emphasize enough how useful this is already proving. 90% of all code (I reckon) is boiler-plate, but by the time you've tracked down an implementation (and possibly ported it to your language of choice) its easier (say, 75% of the "},"link":[{"rel":"related","href":"http://www.krugle.com","title":"Krugle - open source code search engine"},{"rel":"replies","type":"application/atom+xml","href":"http://samfosteriam-work.blogspot.com/feeds/115107352813089369/comments/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"http://www.blogger.com/comment.g?blogID\u003d396730\u0026postID\u003d115107352813089369","title":"2 Comments"},{"rel":"edit","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/115107352813089369"},{"rel":"self","type":"application/atom+xml","href":"http://www.blogger.com/feeds/396730/posts/default/115107352813089369"},{"rel":"alternate","type":"text/html","href":"http://samfosteriam-work.blogspot.com/2006/06/krugle-open-source-code-search-engine.html","title":"Krugle - open source code search engine"}],"author":[{"name":{"$t":"Sam-I-Am"},"uri":{"$t":"http://www.blogger.com/profile/05557174239716985941"},"email":{"$t":"noreply@blogger.com"}}],"thr$total":{"$t":"2"}}]}}