tag:blogger.com,1999:blog-87345772024-03-13T06:06:12.214-07:00Strong, dynamicMostly about programming, mostly in Python.Unknownnoreply@blogger.comBlogger73125tag:blogger.com,1999:blog-8734577.post-6174809307629316592009-10-30T07:37:00.001-07:002009-10-31T08:49:44.208-07:00Behaving as a wave, not a particle<div xmlns='http://www.w3.org/1999/xhtml'><b>UPDATE</b>: Got one! Thanks, the webs. :-)<br/><strike>______________________________________</strike><br/>Dear Generousweb,<br/><br/>I'd like an invitation to <a href='http://wave.google.com/wave/'>Google Wave</a> so I can start porting my awesome <a href='http://vellumbot-source.goonmill.org/'>open source dicebot, Vellumbot</a>, to the new platform. (I've been talking about doing this since before it was cool--indeed, since before I knew Wave came with its own, apparently non-awesome dicebot.)<br/><br/>Anyone out there interested in helping a brother out?<br/><br/>Sincerely,<br/><br/>Cory<br/><br/></div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8734577.post-60629863067486631002009-09-19T00:37:00.000-07:002009-09-20T00:38:10.128-07:00Hypy 0.8.4 released<div xmlns='http://www.w3.org/1999/xhtml'>The main focus of this release is a couple of minor bugfixes.<br/><br/><div id='release-version-0-8-4-2009-09-19' class='section'> <h3>Release Version 0.8.4 (2009.09.19)</h3> <p>Bugfix release.</p> <ul class='simple'><li>It is now possible to construct an attribute-only search with None for search phrase.</li></ul> </div><strong><br/></strong></div>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-8734577.post-52140692919956624342009-02-27T07:22:00.001-08:002009-02-27T07:22:51.191-08:00Launched a new Google Group: hypy-discuss<div xmlns='http://www.w3.org/1999/xhtml'>More people are showing interest in the library, so we need a place to go to discuss things archivably: this <a href='http://groups.google.com/group/hypy-discuss'>Google Group for Hypy</a> is it.<br/><br/></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8734577.post-15774206094580447362009-02-21T22:22:00.001-08:002009-02-21T22:27:20.694-08:00Penny Arcade D&D Podcast - this one has Wil Wheaton<div xmlns='http://www.w3.org/1999/xhtml'><a href='http://www.wizards.com/default.asp?x=dnd/4pod/20090218'><img height='' src='http://www.wizards.com/dnd/images/podcast_papvp2_1th.jpg' style='max-width: 800px; float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;' title='podcast series 2 #1' alt='Gabe's artwork for series 2 #1'/></a><br />The <a href='http://www.wizards.com/default.asp?x=dnd%2F4pod%2F20090218'>newest series</a> of PA D&D Podcasts has started out at the <a href='http://www.wizards.com/default.asp?x=dnd%2F4pod%2F20090218'>maximum level for funny</a>. I was literally - not figuratively, not "LOL" but literally by which I mean with my literal lungs - walking around laughing out loud at this in a supermarket.<br /><br />(<a href='http://www.wizards.com/default.asp?x=dnd/drfe/20080530'>First series starts here</a>, but get a podcatcher and subscribe to the <a href='http://www.wizards.com/dnd/rsspodcast.xml'>feed</a> you technophobe.)</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8734577.post-33744646923758918052009-02-21T13:20:00.001-08:002011-03-26T15:24:29.344-07:00dpkg-origins: 0.9.1<div xmlns='http://www.w3.org/1999/xhtml'>Fixed a minor bug in dpkg-origins. It would crash when a partially-configured but obsoleted package was found in the index. (You might see this in dpkg -l as 'uc' or 'ic'.) You would probably see this after a dist-upgrade, like I did. Fixed this bug.<br/><br/>(See this <a href='http://strongdynamic.blogspot.com/2008/11/ubuntu-backup-tip-save-your-package.html'>post about dpkg-origins</a>.)<br/><br/>Go get the <a href='http://dl.dropbox.com/u/19400544/strongdynamic.blogspot.com/dpkg-origins'>dpkg-origins script</a>.<br/><br/><br/><div class='zemanta-pixie'><img src='http://img.zemanta.com/pixy.gif?x-id=3a9d8ea1-987e-4c66-b139-f006475d2bab' class='zemanta-pixie-img'/></div></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8734577.post-18824204132991000092009-01-20T21:52:00.001-08:002009-01-20T22:01:54.752-08:00Hypy 0.8.2 released<div xmlns='http://www.w3.org/1999/xhtml'>A minor version release of Hypy. No material bugs reported so far. That's good for my users, but bad for me because I can't do more releases until bugs get reported for me to fix. :-)<br/><br/>Some people would not have been able to easy_install release 0.8.1, so this release fixes that.<br/><br/>Hypy is a fulltext search interface for Python applications.<br/><br/>Homepage, downloads, everything: <a href='http://goonmill.org/hypy/'>http://goonmill.org/hypy/</a><br/><br/><u>Release Version 0.8.2 (2009-01-20)</u><br/><ul><li>I was unconditionally importing ez_setup in my setup.py and that makes it hard to easy_install. Don't do that.</li><li>No library functionality change, but now more users can install it.</li></ul><br/></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8734577.post-70760353019153816622009-01-06T22:22:00.001-08:002009-01-13T22:48:09.340-08:00On demonstrating the value of unit tests to beginners<div xmlns='http://www.w3.org/1999/xhtml'>A little anecdote. I'm slowly trying to get my team to wrap their heads around the idea that any new feature must be accompanied by unit tests as we near the point where they are absolutely required to write unit tests before they write code and the tests become part of the deliverable. One thing I know is that if you haven't written a lot of unit tests yet, you don't really understand the value of them except very much in the abstract, so I am also trying to point out the value to him as we go.<br/><br/>One of my developers is writing a function that uses the <font face='Courier New'>compiler</font> module to inspect some Python code, it's not really important why. He had just learned how to write some unit tests in Javascript and I was teaching him how to use the stdlib <font face='Courier New'>unittest</font> module for his unit tests written in Python. His implementation isn't written yet, he is just starting to figure out what the interfaces look like, which is a great time to start writing failing tests.<br/><br/>I told him, start with this:<br/><br/><small><font face='Courier New'>import unittest<br/><br/>class MyTestCase(unittest.TestCase):<br/> def test_myParseFunction(self):<br/> assert 0</font></small><br/><br/>.. and run that test, which he did, and it failed, and I said "good". I started pointing out to him ways he could make very minor modifications to his code to make it easier to test (not nearly enough has been written on the subject of making code easier to test, BTW--bloggers, get on it!).<br/><br/>One of the improvements I asked him to make was to move some functions into another, more relevant module than the one he was working in. He did that, then wrote version two of the unit test:<br/><br/><font face='Courier New'><small>import unittest<br/>import mynewmodule<br/><br/>class MyTestCase(unittest.TestCase):<br/> def test_myParseFunction(self):<br/> self.assertEqual(mynewmodule.myParseFunction("(python.code)"), [expected, output, structure]) </small><br/></font><br/>Now, remember that he hasn't implemented myParseFunction yet. So I asked him to run his failing test one more time. And, a surprise to both of us, we got this:<br/><br/><small><font face='Courier New'>[ERROR]: test_mymodule.MyTestCase.test_myParseFunction<br/><br/>Traceback (most recent call last):<br/> File "/usr/lib/python2.5/unittest.py", line 260, in run<br/> testMethod()<br/> File ".../test_mymodule.py", line 7, in test_myParseFunction<br/> self.assertEqual(mynewmodule.myParseFunction("(python.code)"), [expected, output, structure])<br/> File ".../mynewmodule.py", line 19, in myParseFunction<br/> return compiler.parse(s)<br/>exceptions.NameError: global name 'compiler' is not defined</font></small><br/><br/>What the.. oh right! He imported compiler in the original module, but forgot to move it to the new module. The unit test - so far, one line long and expected to fail in a relatively uninteresting way, had <i>already found a bug.</i> My favorite part was that it happened this way to someone learning <i>why</i> we put so much value on unit tests.</div>Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-8734577.post-60188878569911869032008-12-15T16:28:00.001-08:002009-01-13T22:48:22.324-08:00Hypy 0.8.1 - Get your search on here.<div xmlns='http://www.w3.org/1999/xhtml'>Hypy is a fulltext search interface for Python applications. Use it to index and search your documents from Python code. Hypy is based on the estraiernative bindings by Yusuke Yoshida.<br/><ul><li>Fast, scalable</li><li>Perfect recall ratio by N-gram method</li><li>High precision by hybrid mechanism of N-gram and morphological analyzer</li><li>Phrase search, regular expressions, attribute search (including numeric and date comparisons), and similarity search</li><li>Simple and powerful API</li></ul>Homepage, downloads, everything, etc.: <a href='http://goonmill.org/hypy/'>http://goonmill.org/hypy/</a><br/><br/>This is of course on pypi and can be installed with easy_install or pip. You will need Hyper Estraier installed to use it.<br/><br/><font face='monospace'>Release Version 0.8.1 (2008.12.15)<br/>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br/><br/>* Initial Public Opensourcing.<br/><br/></font><font face='monospace'>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br/></font><br/></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8734577.post-65779047474709589052008-12-12T09:30:00.001-08:002009-01-13T22:48:41.841-08:00Sometimes good User Experience means ignoring sanity<div xmlns='http://www.w3.org/1999/xhtml'>Found on Launchpad's "register a project" page, this was one of four FAQ-ish bullet points:<br /><ul style='font-size: larger;'><li style='margin-top: 1em;'><strong>Requesting Ubuntu CDs</strong> is done at <a href='https://shipit.ubuntu.com/' onclick='https://shipit.ubuntu.com/'>shipit.ubuntu.com</a> <input type='button' value='Oh, I want Ubuntu CDs'/> <br /><small>(this may sound weird to you, but a lot of people register projects asking for CDs!)</small></li></ul>I think this is a practical solution to a real, if insane, problem. Nice touch on the button, too.</div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8734577.post-89852992349564638062008-11-12T16:25:00.000-08:002009-01-13T22:48:56.310-08:00"phrase from nearest book" meme<a href="http://agiletesting.blogspot.com/2008/11/phrase-from-nearest-book-meme.html">From Agile Testing</a><br /><br />The meme:<blockquote><ul><li>Grab the nearest book.<br /><li>Open it to page 56.<br /><li>Find the fifth sentence.<br /><li>Post the text of the sentence in your journal along with these instructions.<br /><li>Don’t dig for your favorite book, the cool book, or the intellectual one: pick the CLOSEST.</ul></blockquote>I am about to make a parody of myself, but this is honest to god page 56 sentence 5 of the closest book to me (apart from a pamphlet on health insurance which was not 56 pages long).<br /><br />"Magical weapons and other spells (such as <span style="font-style:italic;">lightning bolt</span></span>) inflict normal damage on him."<br /><br />Yes, I am reading from the D&D <span style="font-style:italic;">Rules Cyclopedia</span>, a collection of all the Red box/Blue box D&D rules, published 1991.Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-8734577.post-61063006536847565922008-11-09T21:44:00.001-08:002011-03-26T15:23:19.685-07:00Update to dpkg-origins installed package lister<div xmlns='http://www.w3.org/1999/xhtml'>Fixed a serious bug with dpkg-origins (see this <a href='http://strongdynamic.blogspot.com/2008/11/ubuntu-backup-tip-save-your-package.html'>post about dpkg-origins</a>). I forgot to have it check for status 'rc' packages. These are packages that were installed and then removed.<br /><br />It now handles them correctly. (That's what I get for testing on a brand-spanking-new installation of Ubuntu.)<br /><br />I've also put a version string into it: 0.9, because I'm actually using it myself in my backup plan now, which makes it near production ready! Go get the <a href='http://dl.dropbox.com/u/19400544/strongdynamic.blogspot.com/dpkg-origins'>dpkg-origins script</a>.<br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8734577.post-32225913241729907302008-11-04T08:56:00.001-08:002009-01-13T22:49:25.261-08:00U.S. Citizens: Go Make History<div xmlns='http://www.w3.org/1999/xhtml'>Also, can I just say I'm really glad my polling place still uses black felt-tip pens and an optical scanner? I trust these things way more. No hanging chads, very nice paper trail.<br /><br />That is all.<br /><br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8734577.post-29285833104894096692008-11-02T15:20:00.001-08:002011-03-26T15:25:00.242-07:00Ubuntu backup tip: save your package selections, including third-party, for later recovery<div xmlns='http://www.w3.org/1999/xhtml'>Today I wrote a little Python script which will pull a list of all of your installed packages, and then group them by Canonical-supplied, third-party PPA supplied, and manually installed .deb files. This makes it a snap to automatically restore your package list if your system takes a dump, and even quickly put back your PPAs and manual debs as you go.<br /><br />It requires <b>python-twisted</b> and <b>python-apt</b> installed. Here is the script: <a href='http://dl.dropbox.com/u/19400544/strongdynamic.blogspot.com/dpkg-origins'>dpkg-origins</a>.<br /><br />Recommended usage: Add this command to a script inside /etc/cron.daily:<br /><font face='Courier New'> dpkg-origins | mail -s "Package selections for `hostname -s` as of `date`" yourname@youremail.com<br /></font><br />When calamity strikes and you need to restore, you can pipe this file directly:<br /><br /><font face='Courier New'> cat selections.txt | sudo dpkg --set-selections && apt-get -u dselect-upgrade<br /></font><br />This will begin installing all of the Canonical-supplied packages in selections.txt. All other packages are commented out, but the file itself contains instructions for restoring your PPA's; then you uncomment some more packages and run the above again. Finally, at the very top of the file, you will find a commented-out list of the packages (and versions) which were installed directly from a .deb file; manually download and install those.<br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8734577.post-82078060117676333532008-10-31T20:30:00.001-07:002009-01-13T22:45:35.684-08:00Hiring in Portland and Fresno<div xmlns='http://www.w3.org/1999/xhtml'>Decipher is hiring web developers. Decipher is <i>also</i> paying people who know web developers - up to $1000 just for knowing someone who needs a job. Details below.<br /><br />We're looking for a manual tester and test engineers in Fresno, CA.<br /><ul><li>Dice posting for our <a href='http://seeker.dice.com/jobsearch/servlet/JobSearch?op=302&dockey=xml/b/c/bcd5cda94a400eab347f8b095db9f996@endecaindex&source=19&FREE_TEXT=python+javascript&rating=99'>test engineer job</a>.</li></ul>We're looking for web designers, people experienced with design and prototyping on the web, and software engineers in Portland, OR.<br /><ul><li>Posting for <a href='http://seeker.dice.com/jobsearch/servlet/JobSearch?op=302&dockey=xml/0/e/0e8cf2c459457d5a0fc8ad417a400e98@endecaindex&source=19&FREE_TEXT=javascript&rating=99'>Web Modeler/Prototyper</a></li><li><a href='http://seeker.dice.com/jobsearch/servlet/JobSearch?op=302&dockey=xml/3/e/3efff98c7c0b60bc828f6e8d306d12ef@endecaindex&source=19&FREE_TEXT=javascript&rating=99'>Web Designer</a></li><li><a href='http://seeker.dice.com/jobsearch/servlet/JobSearch?op=302&dockey=xml/c/1/c18b514c4a8f7189b4960c4aeffa286f@endecaindex&source=19&FREE_TEXT=javascript&rating=99'>Software Engineer</a></li></ul>If you are one of these people, send us your resume! If you know one of these people, <i>send us their resume!</i> We are paying referral bonuses of $250 if we hire your referral, and an additional $750 if they stay at Decipher for 6 months!<br /></div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8734577.post-33522803589910057732008-10-15T21:00:00.000-07:002009-01-13T22:46:05.949-08:00This is that part in the painting where God's finger touches Adam's<div xmlns='http://www.w3.org/1999/xhtml'>I've been making very exciting progress on Goonmill lately. The user interface has undergone a complete overhaul, and I undertook a lot of interesting challenges in getting a precise, cross-browser layout with a maximum focus on GM usability.<br/><br/>I've gotten it up to the point where I can use it myself by maintaing (with Tomboy) a Dogfood list, a list of everything I've noticed which would annoy me too much to use it. As I go through and fix things, I would add to the list, so the list continually gets longer but the things remaining to fix still get shorter over time because I fix more than I find.<br/><br/>As of this writing, that list is 39 items, with 33 crossed off.<br/><br/>I really feel like Goonmill is going to become a useful resource to other people, and I'm looking forward to doing some blog posts or maybe even some kind of lightning talk somewhere on the application of Athena, Twisted and Prototype to a real, modern-look-and-feel web application with a purpose.</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8734577.post-91768030821201748882008-10-13T17:45:00.001-07:002009-01-13T22:46:26.208-08:00Goonmill - still seeking art - samples here!<div xmlns='http://www.w3.org/1999/xhtml'>I mentioned this <a href='http://strongdynamic.blogspot.com/2008/06/goonmill-seeking-art.html'>earlier</a>: I am seeking samples of art for monsters in the System Reference Document for D&D 3.5. These must be openly-licensed, i.e. CC-BY, public domain or other non-restrictive license. (It must allow derivatives and commercial uses.) The purpose is to pile the artwork up until every monster in the books has free token art to go with it. This will make it much easier to include with Virtual Gaming Tables, RPG management software, and the like, but I want it free enough that people can think of their own uses, and not have to worry about whether they are breaking copyright law. Publish it with your module PDF? Make a Flash game with it? I don't see why not.<br/><br/>I am publishing thumbnails of what I have so far, with a complete table of all the monsters. I need images of 500+ of these monsters, but I have 165 covered so far! A lot of them would be easy because there is so much repetition; for example, if I had one decent CC-licensed dragon, I could just recolor and reposition him and cover about 95 dragons in that list (not an exaggeration).<br/><br/>There are 110 unique, freely-licensed images in the index below, and (because of duplication) they cover about 165 of the monster entries.<br/><br/>The <a href='http://goonmill.org/static/srd-monsters.html'>sample page of my freely-licensed Monster Art</a>.<br/><br/>At the top of the page are thumbnails of all the images I have, culled from commons.wikimedia.org. Below that is a table with all the monsters in the SRD, next to the filename of an image if it has one. My top priority is getting the table filled; second priority is getting higher quality images and more variety for some of them. Third priority is getting alternate images for as many as possible, so that a creator has a choice of which token to use.<br/><br/>I will release the full archive (full-sized images) as soon as I get off my lazy butt and go get the attributions i need for some of those 110 images. While they are all freely licensed, some of them do require attribution, and I owe it to the creators to at least provide that before I publish fully.<br/><br/>The reason I am picking this back up again is the <a href='http://www.encounteraday.com/2008/10/13/a-community-monster-manual/'>Encounter-a-Day blog</a> is throwing around the idea of a monster manual wiki (which I think should be named the Mob Manual), and I have offered this index to help out.<br/></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8734577.post-6194003901729036052008-10-06T22:15:00.001-07:002009-01-13T22:46:50.638-08:00Prism on Ubuntu<div xmlns='http://www.w3.org/1999/xhtml'>I downloaded and started playing with <a href='http://labs.mozilla.com/2007/11/prism-prototype-now-available-on-mac-and-linux/'>Prism</a>. And it actually worked, which is cool. There were only two setup steps:<br/><ol><li>Unpack the tarball in /usr/local/prism, or /opt/prism or something.</li><li>Symlink /usr/lib/firefox/plugins <- /usr/local/prism/plugins so Flash etc. works.<br/></li></ol>Unsurprisingly, there are still some problems.<br/><ul><li>The Refractor for Prism extension doesn't work very well. Likely this is a problem with Refractor and not Prism, but what it does is it creates a shortcut icon on the desktop. The shortcut runs your system Firefox, i.e. the same executable you are using Refractor for. It doesn't ask for the location of the prism executable. It writes the webapp config to the wrong place, and it puts the wrong options into the Launcher. That's kinda useless by itself. <br/></li><li>Running /usr/local/prism/prism and then typing in a URL <i>did</i> create a working shortcut, but unlike Refractor, it didn't automatically grab an icon from the website. You can try, instead, using Refractor to create the launcher, and then editing the command line so it points to /usr/local/prism/prism, get rid of every option except the "-webapp xxx@xxx" arg, and then <b>move</b> the webapp config dir it creates from ~/.webapps to ~/.prism/<i>$profile</i>/webapps. It's about the same amount of work as downloading the icon yourself. Either way, the setup of a webapp is a bit of a mess right now.<br/></li><li>You get a blank profile, so your fonts, addons, user stylesheets etc. are all missing. You <i>might</i> be able to fix this by copying a profile from ~/.mozilla/firefox to ~/.prism, and then running prism -ProfileManager, but I didn't experiment.</li></ul>And one show-stoppingly dumb problem:<br/><ul><li><b>Every prism application runs in the same process.</b></li></ul>I created one for Pandora (which worked fine, once I symlinked Flash), and one for Google Reader. Ran them both. Pressed Ctrl+Q to quit one of them . . . and the other one shut down at the same time. I mean, <i>what?</i> Isn't a big part of the point of prism to isolate your apps from one another? If one of them crashes, they don't all crash, and that sort of thing? That's lame, so sorry, I won't be using Prism yet.</div>Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-8734577.post-10297623578089184532008-09-18T10:36:00.001-07:002009-01-13T22:46:58.550-08:00Bankers of the world: A request<div xmlns='http://www.w3.org/1999/xhtml'>If you're planning to throw yourself on a ritual funeral pyre in the next few days, do you think you could carry the record of my mortgage with you? Consider it a just atonement.<br/><br/>Thanks!<br/></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8734577.post-60321411024519594962008-09-17T09:35:00.001-07:002009-01-13T22:38:56.947-08:00People on the Internets: A request<div xmlns='http://www.w3.org/1999/xhtml'>Please put dates on your pages, such as release notes. I can't tell how old your page is otherwise. Thanks!<br/><br/>- Committee of Citizens Concerned About Bitrot on the Internet<br/></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8734577.post-56511896675889924272008-09-13T15:55:00.001-07:002009-01-13T22:39:16.937-08:00Chrome to have Extensions "Next"<div xmlns='http://www.w3.org/1999/xhtml'>About a week ago, a senior VP at Google announced that yes, <a href='http://news.cnet.com/8301-1001_3-10031764-92.html'>they are going to be putting extension support into Chrome</a>. I'm relieved to hear it.<br/></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8734577.post-69748657213281147672008-09-02T15:10:00.001-07:002009-01-13T22:39:35.544-08:00Google Chrome - no extensions!<div xmlns='http://www.w3.org/1999/xhtml'>So, ugh. <a href='http://www.google.com/support/chrome/bin/answer.py?answer=95695'>Chrome does not support extensions</a>. That means no Adblock Plus, no NoScript, no FireGPG, and all those other tweaks we all rely on to get through our day - for each of us, a different set of tweaks, adding up to thousands of features Google won't be developing on its own and therefore nobody will have.<br/><br/>They <i>have</i> to rectify this situation, or quickly see Chrome fork (or worse for them - an anti-Chrome developer groundswell). I can only assume that this is a temporary situation. To tell them what you think, and in the hopes that this situation is only temporary (it's a 0.2 browser right now, after all) go to the <a href='http://www.google.com/support/chrome/bin/request.py?contact_type=feedback'>support link</a>.<br/></div>Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-8734577.post-23027560427406930952008-09-01T21:21:00.001-07:002009-01-13T22:40:41.962-08:00The most exciting part of Google Chrome<div xmlns='http://www.w3.org/1999/xhtml'>You've probably already heard about tomorrow's release of Google's browser project, <a href='http://blogoscoped.com/archive/2008-09-01-n47.html'>Google Chrome</a>. (<a href='http://google.com/chrome/'>This link</a> is broken, but broken quite differently from other Google <a href='http://www.google.com/404'>404's</a>. It's a safe bet they are already proxying this page to some other server and will put something there When It's Ready.)<br/><br/>There are many awesome in this, but I'd like to draw you web developers' attention to something that promises to be as exciting as the browser itself:<br/><br/>Comic pages: <a href='http://blogoscoped.com/google-chrome/9'>page 9</a>, <a href='http://blogoscoped.com/google-chrome/10'>page 10</a>, <a href='http://blogoscoped.com/google-chrome/11'>page 11</a><br/><br/>These pages describe the testing apparatus used to develop Chrome. It describes a continuous integration server that processes every build against a perfect rendering of tens of thousands of sites. The perfect rendering is described as being "a schematic of what the browser thinks it's displaying". I read this as being an internal data structure representing the rendered view.<br/><br/>There are two reasons I love this. First, it means that Google will be Ready on Day One to render the web. It will be "another platform to support", but not to nearly the degree that (for example) Safari or IE7 is another platform to support. This kind of testing apparatus can only lead to a more compliant, more reasonable platform. (At the least, it should have only the same bugs Firefox does. I wonder what they used to make their benchmark renderings?) <b>Edit</b>: I know Chrome is based on WebKit, I should clarify that, if they used Firefox for reference renderings, then their rendering bugs will match Firefox's. Apparently WebKit already does this, but it wouldn't make much sense to use WebKit as the reference rendering for a test of WebKit! So they must be using some other browser; Firefox would make sense.<br/><br/>Second, it means we may finally get the holy grail of web testing: a headless DOM! We currently have a test apparatus that consists of a big, fast Mac machine with a 1920px display and 4 VMware machines, running Selenium on multiple browsers. Automating this is nightmarish, and completely unsuitable for agile development methodologies. We only have one of these, so access to it has to be gated, and the barrier to entry to test your code is huge. (You have to commit it, to start with.) The web badly needs a way to test applications without a browser showing up on your desktop. I just want to see green/red for the question "did my login page render the same way it did last time?"<br/><br/>The phrase "schematic" tantalizingly hints at a test suite with the ability to tell you about test failures in a descriptive way. I imagine seeing something like "div#nameEntry expected position:(258,317) got position(258,0)". But now we've veered away from speculation into wishful thinking.<br/><br/>This makes a big assumption that Google will release the code of the test apparatus. But I'm betting they will, because it makes extremely good business sense. If web devs start to rely on their test engine, their applications automatically support Chrome.</div>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-8734577.post-41021741557598549522008-08-31T12:09:00.001-07:002009-01-13T22:40:56.501-08:00Gnome/Firefox tip: Pandora as a Separate Application<div xmlns='http://www.w3.org/1999/xhtml'><b>The problem:</b> <a href='http://pandora.com/'>Pandora</a> is more like a desktop application than a website. It should stay open when you close your browser. If you do web development, or your browser tends to crash a lot, or you just like to close Firefox sometimes, you probably don't want to lose your tunes. Figure out a way to keep Pandora open when the rest of your web browsing session is gone.<br/><br/>This is a walkthrough for Gnome/Compiz users for isolating Pandora from the rest of Firefox cleanly. Much of this will be applicable to you if you don't use Compiz, and even if you don't use Gnome.<br/><br/>This assumes Firefox 3.0.1/Linux, I can't vouch for command line options on any other version.<br/><br/>When I refer to your Default Firefox Icon, I am talking about whatever means you usually use to launch Firefox, whether it's a toolbar icon, a menu icon, Alt+F2 "firefox", etc.<br/><b><br/></b><big><b>Create a Clean Pandora Profile</b><small><br/><br/>Start by shutting down all instances of firefox completely. Then bring up a Terminal window and type:<br/></small></big><blockquote><big><small><font face='Courier New'>firefox -no-remote -ProfileManager</font></small></big><br/></blockquote><big><small>You'll get the small Profile Manager window. Create a new profile, named 'pandora'. You may, if you wish, clean it up. I did all of the following:<br/></small></big><ul><li><big><small>moved all the controls to the menu bar line at the very top (right-click a blank space and "customize..."). </small></big></li><li><big><small>hid all the toolbars.</small></big></li><li><big><small>edit > preferences and changed the homepage to http://pandora.com/</small></big></li></ul><big><small>Now quit from that firefox window. Once again, run:<br/></small></big><blockquote><font face='Courier New'><big><small>firefox -no-remote -ProfileManager</small></big></font><br/></blockquote><big><small>Firefox makes your latest profile the default in all situations. To fix that (you don't want Pandora as your default browser): Select 'default' (or your original profile) from the window that just appeared, and let firefox open. Now your Default Firefox Icon won't open Pandora.<br/><br/></small></big><b><big>Make a Launcher</big></b><br/><big><small><br/>Right click on your Gnome menu panel, and "Add to Panel..." Select Custom Application Launcher. Enter the following:<br/></small></big><ul><li>Type: Application</li><li>Name: Pandora</li><li>Command: firefox -no-remote -P pandora</li><li>Comment: Opens in a separate Firefox process<br/></li></ul><big><small>(Only the Type and Command must match what I show above.)<br/><br/>Leave that window open for now. Re-launch Firefox using your Default Firefox Icon.<br/><br/>Let's get a pretty icon for the launcher you're about to make. In Firefox, visit: <br/><a href='http://pandora.com/favicon.ico'>http://pandora.com/favicon.ico</a> and save the file as ~/.mozilla/firefox/*.pandora/pandora.ico<br/><br/>Now, go <i>back</i> to your New Launcher window (you didn't close it, right? :) and click on the springy-looking icon to change the icon. Choose the icon file you just saved as your icon. Now finish/OK until you are out of the New Launcher window and you have a new launcher.<br/><br/><b><big>Bonus Compiz Step: Place Windows Support</big><br/></b><br/>The Compiz "Place Windows" plugin lets you put windows on a particular workspace automatically. I want Pandora windows to automatically be placed on desktop 8, and other Firefox windows to automatically be placed on desktop 3. <i>This was the trickiest part of the entire process.</i><br/><br/>This isn't an explanation of how to use Place Windows (find that <a href='http://wiki.compiz-fusion.org/Plugins/Place'>elsewhere</a>). This is an explanation of why using Place Windows for the tricked-out Pandora profile is difficult, and how you can fix it.<br/><br/><b>Problem: </b>Compiz requires you to identify the windows you want to place by window Class, Name, Title, Type, or a few other things. For all firefox windows, Class, Name, Type and so on are the same; so if you want some firefox windows to go one place and some to go another, well, you can't do that with Place Windows unless you can differentiate them by title. But firefox <i>always starts with the same title: "Mozilla Firefox".</i> Compiz only looks at the <i>initial </i>title when it tries to place a window.<br/><br/><b>Solution: </b>A plugin called <a href='https://addons.mozilla.org/en-US/firefox/addon/8660https://addons.mozilla.org/en-US/firefox/addon/8660'>MozFox</a>. This is a version of FireSomething, that plugin that lets you randomly name your browser "Fireslug", etc. Bring up your Pandora profile using your new launcher icon, and visit the link above. You will have to create an account and log in there because this is currently an "experimental" plugin.<br/><br/>Install the plugin, and let the Pandora profile restart. When it comes back up, Tools > Addons > MozFox > Preferences. You will have to manually delete everything in the three lists. (You can select multiple to delete at once, then right-click and "delete". This is a pain in the butt.)<br/><br/>Add to each list: "Pandora", "Fire", "fox".<br/><br/>Now in the Place Windows plugin, set it up to match "title=Pandora.*". (You must have Regex Matching on.) Close out of that window, and restart Pandora. When it comes back up, Compiz will automatically position it where you told it to go!<br/><br/><br/></small></big></div>Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-8734577.post-76853951417206794812008-06-27T16:20:00.001-07:002009-01-13T22:41:17.103-08:00Goonmill - seeking art<div xmlns='http://www.w3.org/1999/xhtml'>I am moving into the final phase before a first release of Goonmill. I am seeking art for <i>any</i> of the monsters found in the <a href='http://www.d20srd.org/indexes/monsters.htm'>D&D 3.5e SRD</a>.<br/><ul><li>The art must be CC-licensed, public domain, or otherwise free to distribute for any purpose. If CC licensed, it may be of the 'attribution' or 'no derivatives' types, but it must not be 'non-commercial'. Goonmill is arguably a commercial effort, even if it is open source.<br/></li><li>The more uncommon the creature for which you found art, the better. I think I can cover orcs, humans, goblins, human skeletons, human ghosts, and human zombies pretty easily. Variations are welcome.<br/></li><li>You may of course contribute your own art to the cause, as long as you are willing to license it compatibly.</li><li>Honestly, I'm not that picky about quality or style at this point. I am looking for 2d art, not models, though. Feel free to render your models to 2d art.</li><li>Prefer an isometric viewpoint, but not required.<br/></li></ul>I am collecting this art for use with the D&D 3.5 SRD monsters. It will be released freely once collected. Goonmill will use it as part of the application, but in addition the entire database of art and creature stats will be available for use in other applications or for any other purpose. The "any other purpose" part is why the art must not be CC-NC licensed.<br/></div>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-8734577.post-33799834273422562502008-06-23T07:29:00.001-07:002009-01-13T22:41:31.046-08:00Spam subject lines: A positive sign?<div xmlns='http://www.w3.org/1999/xhtml'>Actual spam subject line received today:<br /><blockquote>Obama grows great length through herbal supplements</blockquote><br />I think it's fair to say that your candidate is viewed in a positive light when he is used as a symbol of male virility. I never got any "Kerry's dong will please your woman all night long", for example.</div>Unknownnoreply@blogger.com1