<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>The Phantom Inker&apos;s blog</title>
  <link>http://phantom-inker.livejournal.com/</link>
  <description>The Phantom Inker&apos;s blog - LiveJournal.com</description>
  <lastBuildDate>Thu, 02 Apr 2009 13:17:41 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>phantom_inker</lj:journal>
  <lj:journalid>13221392</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <atom10:link rel='hub' href='http://pubsubhubbub.appspot.com/' />
  <image>
    <url>http://l-userpic.livejournal.com/63151690/13221392</url>
    <title>The Phantom Inker&apos;s blog</title>
    <link>http://phantom-inker.livejournal.com/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/12100.html</guid>
  <pubDate>Thu, 02 Apr 2009 13:17:41 GMT</pubDate>
  <title>The Last NVIDIA Card I&apos;ll Ever Own</title>
  <link>http://phantom-inker.livejournal.com/12100.html</link>
  <description>This is an angry rant about something that is simply plainly stupid.  Be forewarned.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bye bye, NVIDIA&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This computer has an NVIDIA GeForce 9600GSO video card in it.&lt;br /&gt;&lt;br /&gt;I bought this card last August (or thereabouts) to replace another NVIDIA card that was dying (sometimes it wouldn&apos;t display anything at all, at random).  I had purchased &lt;i&gt;that&lt;/i&gt; card only a year before that to replace another video card that was dying (the picture would occasionally fritz out or jump around the screen, until one day it simply displayed no picture at all).  I had gotten that card as a replacement for another card that was dying that was less than a year old.&lt;br /&gt;&lt;br /&gt;In total, in the last ten years I&apos;ve owned twelve cards with NVIDIA chipsets on them.  And if you do the math on that, the average card lasted less than a year.  In fact, there were &lt;i&gt;three years&lt;/i&gt; in the early 2000s that I had a card with ATI chips instead, so that means the average NVIDIA card has lasted less than eight months.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Simple Needs, Simply Unmet&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I don&apos;t know why I didn&apos;t learn my lesson before.  My needs are simple.  I don&apos;t do gaming.  I&apos;m just a software engineer, and I need two screens.  That&apos;s it.  That&apos;s all.  This current card has the issue that if I put the computer in hibernation, &lt;i&gt;sometimes&lt;/i&gt; one of my screens isn&apos;t working when I start it back up.  Oh, and there&apos;s also the issue that one of the two big 22&quot; widescreen displays I purchased for this computer doesn&apos;t work with the card at all (literally:  The screen goes randomly white when I connect it to this card, as though the card is using the wrong voltage; when I connect it to my wife&apos;s computer, it&apos;s fine, so my second monitor is her old small 17&quot; one, and she gets my second big one).&lt;br /&gt;&lt;br /&gt;The only fix for the non-working screen is to uninstall NVIDIA&apos;s drivers, reboot the computer, and completely reinstall them, and reboot again.  Then it works fine until I try to put the computer into hibernation, after which there&apos;s a 10% chance I&apos;ll have to do the same stupid thing all over again.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fool me once...&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I&apos;ve learned my lesson.  A dozen dead NVIDIA cards — I have a box of &apos;em here — each from different manufacturers leads me to conclude that it&apos;s not the manufacturer but the chip vendor.  So I say &lt;b&gt;never again.&lt;/b&gt;  Never again will I be held hostage to NVIDIA&apos;s broken garbage.  The three years I had that ATI card it performed flawlessly.  Perfect.  It never asked me any questions; it never told me any lies.  It just did what it was supposed to do.&lt;br /&gt;&lt;br /&gt;I&apos;ve contacted NVIDIA&apos;s tech support, of course, and they don&apos;t really seem to care.  They never have, not in ten years of buying their stupid crappy products.  So I repeat:  &lt;b&gt;NEVER AGAIN.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You hear that, NVIDIA?  You&apos;ve lost a customer for good, and not just any customer — I&apos;m technically saavy, and people all around me ask what they should buy and what they should avoid.  I&apos;ll be &lt;i&gt;teaching classes&lt;/i&gt; soon, and giving recommendations to dozens of novices on what kinds of computer equipment to buy — and &lt;i&gt;your name will be in the &quot;avoid at all cost&quot; list&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;You could have prevented this.  You could have fixed outstanding bugs instead of focusing on new software features.  You could have worked on your hardware quality control.  You could have at least acted like you cared when I called or e-mailed you in the last ten years.  But you didn&apos;t.  And I now have a mission:  To ensure that no-one I know ever buys your stupid broken garbage again.&lt;br /&gt;&lt;br /&gt;Lest you think I&apos;m just sour over everything computers, I intend to talk in another journal posting about some of the &quot;winner&quot; products I&apos;ve used over the last twenty years, and show what they do right that you&apos;re doing so wrong.  Because this is not a rant against everything computer-related:  This is a rant by someone who knows better against a company whose products define the very word &lt;b&gt;&lt;i&gt;fail&lt;/i&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And so, in summary, let me say this:  If you&apos;re an average user buying computer equipment, &lt;b&gt;&lt;i&gt;DON&apos;T BUY NVIDIA.  YOU HAVE BEEN WARNED.&lt;/i&gt;&lt;/b&gt;  I learned my lesson the hard way, and I&apos;ll never make this mistake again so long as I live.</description>
  <comments>http://phantom-inker.livejournal.com/12100.html</comments>
  <category>computers</category>
  <category>video cards</category>
  <category>nvidia</category>
  <lj:music>Different People (No Doubt)</lj:music>
  <media:title type="plain">Different People (No Doubt)</media:title>
  <lj:mood>angry</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/11811.html</guid>
  <pubDate>Fri, 20 Mar 2009 22:45:36 GMT</pubDate>
  <title>ProColor, Part 2:  Mouse Capturing</title>
  <link>http://phantom-inker.livejournal.com/11811.html</link>
  <description>It&apos;s time for the second article in my occasional series on the ProColor color-picker.  &lt;a href=&quot;http://phantom-inker.livejournal.com/11668.html&quot;&gt;Last time&lt;/a&gt;, I gave a rough overview of what ProColor is and why it&apos;s designed the way it is.  In this article, I&apos;m going to cover some the topics in reverse and discuss capturing the mouse on a web page.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;strong&gt;What&apos;s an event?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Let&apos;s start at the beginning:  What&apos;s an event, and why would you ever want to capture one?&lt;br /&gt;&lt;br /&gt;An event in most user-interfaces means an action performed by the user:  A key press, a mouse movement, or a mouse-button press, among others.  There are other kinds of events, too, but these are the ones we&apos;ll be concerned about.  Events are little structures, little tiny chunks of data, that describe what happened and where it happened, in full, so that they can be sent to appropriate places to be processed.  A key-press event, for example, typically includes which key was pressed, whether Ctrl or Shift or Alt was held down while it was being pressed, and maybe where the mouse was on screen at the time.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Capturing&lt;/em&gt; and &lt;em&gt;focusing&lt;/em&gt; are two different ways of ensuring that the events go where they need to.  Usually, events go to whatever window is appropriate for them:  A &amp;quot;this window was just hidden&amp;quot; event gets sent to the window that was hidden, for example.  But what about keypresses?  Where should they go?  The keyboard is external, after all, and not necessarily attached to any one window.&lt;br /&gt;&lt;br /&gt;Focusing solves this problem:  Only one window can have the focus at a time, and input from devices that have no way of directing themselves to a specific window (keyboards, joysticks, microphones, etc.) all have their input go to the focus window.  So when you click on, say, a textbox, the window system assigns that textbox the focus, and then all input events get directed to that textbox.  At least that&apos;s the theory:  Different window systems do this with different levels of directness and precision, but all of them have the concept of &lt;em&gt;focus&lt;/em&gt; for the keyboard device at least.&lt;br /&gt;&lt;br /&gt;Capturing solves a different problem.  Some devices, like the mouse, have the concept of &lt;em&gt;position&lt;/em&gt; built into them:  When you move the mouse, the window that should receive the events for that action is obvious, because the mouse is &amp;quot;over&amp;quot; it.  But what if your program doesn&apos;t want those events to go to that window?&lt;br /&gt;&lt;br /&gt;You might be wondering why events shouldn&apos;t go where they belong, but it&apos;s a common need in user interfaces.  When you press the mouse button while you&apos;re over a scrollbar&apos;s thumb, the scrollbar should receive all events until you release the mouse button so that the thumb can be dragged around to follow the mouse &amp;mdash; even if the mouse isn&apos;t over the scrollbar.&lt;br /&gt;&lt;br /&gt;Capturing mouse events, then, is a core component of modern window-system functionality, and most window systems provide some sort of tools to support it:  Microsoft gives us SetCapture(), X-Windows gives us XGrabPointer(), and others have a variety of ways to handle the problem, from calling functions to attaching event handlers to creating whole new specialized event-processing loops.&lt;br /&gt;&lt;br /&gt;Unfortunately, the web doesn&apos;t.&lt;br /&gt;&lt;br /&gt;And this means that implementing page elements that track the mouse &amp;mdash; elements that look like buttons or scrollbars or dropdowns, for example &amp;mdash; isn&apos;t something that&apos;s built into your web browser.  Fortunately, there&apos;s a very good way around this problem, and that&apos;s what we&apos;re going to talk about here.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;How events get dispatched&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Many of us programmers know how a traditional event-processing model works in a window system:  The window system collects events from devices, posts those events into a queue, and your program retrieves those events and (optionally) dispatches them to some target window or processes them directly.  Most window systems work like this; there&apos;s GetMessage() in Windows; there XNextEvent() in X-Windows; there&apos;s even EvtGetEvent() on the old Palm Pilot to retrieve events, and dispatching them is usually an indirect function call or giant switch statement.&lt;br /&gt;&lt;br /&gt;Sadly, the web doesn&apos;t work like that.&lt;br /&gt;&lt;br /&gt;On the web, the event-processing loop occurs &lt;em&gt;outside your page&lt;/em&gt; in the browser itself.  The browser collects events and dispatches them to the various page elements whenever it feels like doing so.  In current implementations, you at least have the guarantee that the events are dispatched using a single thread, but the Document Object Model (the DOM) doesn&apos;t actually guarantee even that much.  Worse, there&apos;s no function named Event.BeginCapturing or something like it.  So if event dispatching is totally outside your control, how do you take control of it?&lt;br /&gt;&lt;br /&gt;Well, the good news is that every time an event arrives and needs to be dispatched, the web browser sends it to not one page element but &lt;em&gt;several&lt;/em&gt;.  The event dispatches are grouped into two categories:  &lt;em&gt;capturing&lt;/em&gt; and &lt;em&gt;bubbling&lt;/em&gt;.  During the &lt;em&gt;capture&lt;/em&gt; phase, the web browser walks down the DOM tree until it reaches the target element, asking each parent element if it wants the event.  Then, during the &lt;em&gt;bubbling&lt;/em&gt; phase, the web browser goes back up the tree, asking each element again if it wants the event.  Only then if the event gets all the way back to the top of the tree and nobody wants it does the web browser perform default actions like &amp;quot;select text&amp;quot; or &amp;quot;click checkbox.&amp;quot;&lt;br /&gt;&lt;br /&gt;This is better explained visually.  Consider a very simple page like the one below.  It has a left sidebar with some links, and a central area with a form and an &amp;lt;input&amp;gt; field and also a &amp;lt;div&amp;gt; that has a background image that makes the &amp;lt;div&amp;gt; look like a snazzy shiny black pushbutton.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;http://img.photobucket.com/albums/v63/phantom-inker/event-dispatch.png&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Let&apos;s say the user clicks on the &amp;lt;div&amp;gt; &amp;quot;pushbutton.&amp;quot;  The web browser first follows the red arrows, asking the &amp;lt;body&amp;gt; and then the &amp;lt;div&amp;gt; and then the &amp;lt;form&amp;gt; and then finally the innermost &amp;lt;div&amp;gt; if they want the event (the &amp;quot;capturing&amp;quot; phase, so named because it was designed to make capturing events easy).  And then the browser goes back up the blue arrows, asking the innermost &amp;lt;div&amp;gt; and then the &amp;lt;form&amp;gt; and then the &amp;lt;div&amp;gt; and then finally the &amp;lt;body&amp;gt; if they each want the event (the &amp;quot;bubbling&amp;quot; phase, so named because the event seems to &amp;quot;bubble&amp;quot; to the top of the document).&lt;br /&gt;&lt;br /&gt;&amp;quot;Great,&amp;quot; you think.  &amp;quot;So all I have to do to capture events, then, is to attach an event-handling function to the &amp;lt;body&amp;gt; and have it grab events on their way down the tree, right?  Easy as pie!&amp;quot;&lt;br /&gt;&lt;br /&gt;Good thought, but sorry, you&apos;re wrong.&lt;br /&gt;&lt;br /&gt;You see, there&apos;s a minor problem with the above diagram, which is that&apos;s how &lt;em&gt;most&lt;/em&gt; web browsers send events.  Unfortunately, Internet Explorer does it differently:  IE doesn&apos;t do the &amp;quot;capturing&amp;quot; phase at all &amp;mdash; no red arrows, which means that an event handler attached to the &amp;lt;body&amp;gt; will never see an event if that innermost &amp;lt;div&amp;gt; &amp;mdash; or any other element higher up &amp;mdash; processes it first.&lt;br /&gt;&lt;br /&gt;Doesn&apos;t it figure that IE&apos;s the fly in our ointment?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Capturing events, portably&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Since you can&apos;t use the &amp;quot;capturing&amp;quot; side of event processing &amp;mdash; and the Prototype Javascript library doesn&apos;t even support that on non-IE browsers because they don&apos;t want you to get your hopes up that it&apos;ll actually work &amp;mdash; how do you actually &lt;em&gt;capture&lt;/em&gt;?  The answer, as is often true with hacky technology, is that you need to cheat.&lt;br /&gt;&lt;br /&gt;In this case, we&apos;re going to do something that you can do with web browsers but that you can&apos;t readily do with window systems:  We&apos;re going to use transparent objects.&lt;br /&gt;&lt;br /&gt;First, rather than thinking of your page as flat, imagine looking at it sideways.  Each element is like a flat chunk of plastic and sticks out just a little bit.  Elements are not &amp;quot;inside&amp;quot; other elements but &amp;quot;stack on top of&amp;quot; other elements, so that really &amp;quot;deep&amp;quot; elements in the tree are actually very &amp;quot;tall&amp;quot; when looked at from the side.  You can see this depicted below:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;http://img.photobucket.com/albums/v63/phantom-inker/divs-3d.png&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;br /&gt;From this perspective, the browser&apos;s actions during the bubbling phase take on a new appearance:  Rather than starting at the deepest element in the tree, the browser starts the event at the &lt;em&gt;highest&lt;/em&gt; element in the stack and walks down the stack with the event until it runs out of elements or until one of the elements actually claims the event.&lt;br /&gt;&lt;br /&gt;This distinction is important, because it allows us to take control of the dispatching in a way that&apos;s almost a little magical:  What if we had another element &lt;em&gt;higher&lt;/em&gt; than all the others?  If we did, that element would be the one that received the event first!  In fact, if that layer covers the &lt;em&gt;entire page&lt;/em&gt;, then the event will only &amp;quot;bubble&amp;quot; across two elements total:  That &amp;quot;cover&amp;quot; element and the &amp;lt;body&amp;gt; itself &amp;mdash; none of the other page elements would ever see the mouse event at all.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;http://img.photobucket.com/albums/v63/phantom-inker/divs-3d-with-capture-layer.png&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This, then, is how we reliably capture mouse events reliably in Javascript:  During the period where we want to capture events, we create a new topmost layer and attach the event handler to it, and then when we&apos;re done capturing, we destroy the topmost layer.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Implementing MouseCapture&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Once you know the principle, the code is pretty easy.  In fact, ProColor comes with a MouseCapture class that encapsulates this basic principle in a simple, reusable way.  The complete code for the MouseCapture class is short, and is included at the end of this article.&lt;br /&gt;&lt;br /&gt;Let&apos;s start by seeing how you might use the MouseCapture class to track a pushbutton.  I&apos;m going to dispense with the usual event-handling boilerplate code and just use a &lt;tt&gt;onmousedown&lt;/tt&gt; handler to keep the presentation simple (but note that in real code, you&apos;ll want to handle the &amp;quot;mousedown&amp;quot; events properly).&lt;br /&gt;&lt;br /&gt;Here&apos;s our example HTML:&lt;br /&gt;&lt;pre style=&quot;border: 1px solid rgb(204, 204, 204); background-color: rgb(238, 238, 238);&quot;&gt;
&amp;lt;img id=&apos;mybutton&apos; src=&apos;mybutton.png&apos; width=&apos;120&apos; height=&apos;30&apos;
    alt=&apos;Button&apos; onmousedown=&apos;TrackButton(&amp;quot;mybutton&amp;quot;)&apos; /&amp;gt;

&amp;lt;script type=&apos;text/javascript&apos;&amp;gt;&amp;lt;!--
function TrackButton(id) {
    $(id).src = &apos;mybutton_pressed.png&apos;;
    var capture = new MouseCapture;
    capture.begin(function(event) {
        switch (event.type) {
        case &apos;mouseup&apos;:
            $(id).src = &apos;mybutton.png&apos;;
            capture.end();
            break;
        }
    });
}
--&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;Let&apos;s look at how this works.  The TrackButton() function will get called when the mouse button is pressed over the image.  The TrackButton() function changes the image to appear &amp;quot;pressed,&amp;quot; and then creates a new MouseCapture object.  MouseCapture.begin() is used to initiate the capture, and it gets passed a callback function &amp;mdash; a function that will receive all of the events until the capture ends.  Our capture function here watches the events it receives, and when the mouse button is released (&amp;quot;mouseup&amp;quot;), it changes the image back to the unpressed version and ends the capture.&lt;br /&gt;&lt;br /&gt;Simple enough, really.  There are a few caveats.  First, the event&apos;s coordinates (the mouse&apos;s coordinates) are &lt;em&gt;relative to the entire document&lt;/em&gt; &amp;mdash; not any one specific element within it:  They&apos;re &lt;em&gt;absolute coordinates&lt;/em&gt;.  You can retrieve those coordinates by calling the standard Prototype functions event.pointerX() and event.pointerY().  You can also cheat by calling Element.isEventIn(), a custom function included with ProColor that tells you whether an event occurred within a given element.&lt;br /&gt;&lt;br /&gt;Let&apos;s use Element.isEventIn() to implement a second version of the tracking routine; in this version, if the user slides the mouse off of the &amp;quot;pushbutton,&amp;quot; the &amp;quot;pushbutton&amp;quot; will pop up:&lt;br /&gt;&lt;pre style=&quot;border: 1px solid rgb(204, 204, 204); background-color: rgb(238, 238, 238);&quot;&gt;
&amp;lt;img id=&apos;mybutton&apos; src=&apos;mybutton.png&apos; width=&apos;120&apos; height=&apos;30&apos;
    alt=&apos;Button&apos; onmousedown=&apos;TrackButton(&amp;quot;mybutton&amp;quot;)&apos; /&amp;gt;

&amp;lt;script type=&apos;text/javascript&apos;&amp;gt;&amp;lt;!--
function TrackButton(id) {
    $(id).src = &apos;mybutton_pressed.png&apos;;
    var button_is_pressed = true;
    var capture = new MouseCapture;
    capture.begin(function(event) {
        switch (event.type) {
        case &apos;mousemove&apos;:
            var mouse_is_over = Element.isEventIn(id, event);
            if (mouse_is_over != button_is_pressed) {
                if (mouse_is_over) $(id).src = &apos;mybutton.png&apos;;
                else $(id).src = &apos;mybutton_pressed.png&apos;;
                button_is_pressed = mouse_is_over;
            }
            break;
        case &apos;mouseup&apos;:
            $(id).src = &apos;mybutton.png&apos;;
            capture.end();
            break;
        }
    });
}
--&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;This is a slightly more complex version of the same routine.  This one watches when the mouse moves while the mouse button is being pressed, and if the mouse moves outside the &amp;quot;pushbutton&amp;quot;, the &amp;quot;pushbutton&amp;quot; is redrawn as unpressed; and if the mouse moves back in, the &amp;quot;pushbutton&amp;quot; is redrawn as pressed.&lt;br /&gt;&lt;br /&gt;You can use similar techniques for all sorts of tricks:  For example, ProColor uses the MouseCapture solution to handle dragging of the selection on the color wheel, to handle dragging of the slider next to the color wheel, to handle clicks on the color palette, and to handle clicks on the color-picker dropdown.  There are lots of other ways you could potentially use it as well.  Use your imagination:  The sky&apos;s the limit!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I hope I&apos;ve shed some light on how a very useful programming technique can be readily applied to elements on web pages as well.  The invisible upper-layer technique is simple and flexible, and works on every major browser; my MouseCapture class and example scripts will run just fine on IE6, IE7, IE8, Firefox, Safari, Opera 8+, and Chrome &amp;mdash; anywhere Prototype will run.&lt;br /&gt;&lt;br /&gt;In closing, below you can find the source code to my &lt;em&gt;MouseCapture&lt;/em&gt; class and the associated &lt;em&gt;Element.build()&lt;/em&gt; and &lt;em&gt;Element.isEventIn()&lt;/em&gt; methods.  This is designed to work with Prototype, but I have no doubt that with some effort, you could rework it to behave nicely with JQuery or Dojo.  If you have any questions, please feel free to post them:  This is a blog, and that&apos;s what the comment section is for!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Code&lt;/strong&gt;&lt;br /&gt;&lt;pre style=&quot;border: 1px solid rgb(204, 204, 204); background-color: rgb(238, 238, 238);&quot;&gt;
/*---------------------------------------------------------------------------------
**  Add two useful methods to Element.  Many other libraries add build(), and ours
**  is, in theory, compatible with all of their versions.
*/

Element.addMethods({
    /* Create a child element with the given options (attributes) and style. */
    build: function(element, type, options, style) {
        var e = $(document.createElement(type));
        $H(options).each(function(pair) { e[pair.key] = pair.value; });
        if (style) e.setStyle(style);
        element.appendChild(e);
        return e;
    },

    /* Return true if this event was a mouse event inside the given element. */
    isEventIn: function(element, event) {
        var d = element.getDimensions();
        var p = element.cumulativeOffset();
        var x = event.pointerX(), y = event.pointerY();
        return (x &amp;gt;= p.left &amp;amp;&amp;amp; y &amp;gt;= p.top
            &amp;amp;&amp;amp; x &amp;lt; p.left+d.width &amp;amp;&amp;amp; y &amp;lt; p.top+d.height);
    }
});


/*---------------------------------------------------------------------------------
**  This is a simple class for capturing all mouse input after a mouse button
**  is held down until the mouse button is released.
*/

var MouseCapture = Class.create({

    initialize: function() { },

    onEvent: function(event, callback) {
        if (callback &amp;amp;&amp;amp; event.type != &apos;mouseover&apos; &amp;amp;&amp;amp; event.type != &apos;mouseout&apos;)
            callback(event, event.type);
            event.stop();
    },

    setCursor: function(c) {
        if (this.div)
            this.div.setStyle({ cursor: c });
    },

    begin: function(callback) {
        /* Create our event listener.  We&apos;ll need this object now, and later on to
           be able to stop listening to events too. */
        this.listener = this.onEvent.bindAsEventListener(this, callback);

        /* Start observing events. */
        Event.observe(document, &apos;mouseup&apos;, this.listener);
        Event.observe(document, &apos;mousemove&apos;, this.listener);
        Event.observe(document, &apos;mousedown&apos;, this.listener);
        Event.observe(document, &apos;mouseover&apos;, this.listener);
        Event.observe(document, &apos;mouseout&apos;, this.listener);
        Event.observe(document, &apos;keyup&apos;, this.listener);
        Event.observe(document, &apos;keydown&apos;, this.listener);

        /* Don&apos;t let the browser perform text-selection while capturing. */
        this.old_body_ondrag = document.body.ondrag;
        this.old_body_onselectstart = document.body.onselectstart;
        document.body.ondrag = function () { return false; };
        document.body.onselectstart = function () { return false; };

        var body = Element.extend(document.body);
        var dim = body.getDimensions();

        /* Build a (nearly) invisible &amp;lt;div&amp;gt; that covers the entire document and that
           will capture all events, even those that would go to iframes. */
        this.div = body.build(&apos;div&apos;, { }, {
            display: &apos;block&apos;,
            position: &apos;absolute&apos;,
            top: &apos;0px&apos;, left: &apos;0px&apos;,
            width: dim.width + &apos;px&apos;, height: dim.height + &apos;px&apos;,
            zIndex: 999999999,
            cursor: &apos;default&apos;,
            backgroundColor: &apos;#FFFFFF&apos;,
            opacity: 0.0001
        });
    },

    end: function() {
        /* Remove our invisible event-capturing &amp;lt;div&amp;gt;. */
        this.div.remove();

        /* Stop event observing. */
        Event.stopObserving(document, &apos;mouseup&apos;, this.listener);
        Event.stopObserving(document, &apos;mousemove&apos;, this.listener);
        Event.stopObserving(document, &apos;mousedown&apos;, this.listener);
        Event.stopObserving(document, &apos;mouseover&apos;, this.listener);
        Event.stopObserving(document, &apos;mouseout&apos;, this.listener);
        Event.stopObserving(document, &apos;keyup&apos;, this.listener);
        Event.stopObserving(document, &apos;keydown&apos;, this.listener);

        /* Reenable selection. */
        document.body.ondrag = this.old_body_ondrag;
        document.body.onselectstart = this.old_body_onselectstart;
        delete this.old_body_ondrag;
        delete this.old_body_onselectstart;
    }
});
&lt;/pre&gt;</description>
  <comments>http://phantom-inker.livejournal.com/11811.html</comments>
  <category>dom</category>
  <category>prototype</category>
  <category>procolor</category>
  <category>events</category>
  <category>javascript</category>
  <lj:music>Battle (Colbie Callat)</lj:music>
  <media:title type="plain">Battle (Colbie Callat)</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/11668.html</guid>
  <pubDate>Thu, 12 Mar 2009 19:08:54 GMT</pubDate>
  <title>The ProColor color-picker</title>
  <link>http://phantom-inker.livejournal.com/11668.html</link>
  <description>I&apos;d like to talk a little bit about web coding, specifically client-side Javascript and DOM coding.&lt;br /&gt;&lt;br /&gt;For CMXpress, I needed a good drop-down/pop-up color-picker for use with Prototype, and it seemed to me like such a thing ought to be an easy thing to find, but in reality, it turned out to be as rare as a blue moon.  There are &lt;a href=&quot;http://www.colorjack.com/software/dhtml+color+picker.html&quot;&gt;some&lt;/a&gt; &lt;a href=&quot;http://johndyer.name/post/2007/09/PhotoShop-like-JavaScript-Color-Picker.aspx&quot;&gt;basic&lt;/a&gt; controls out there, some with &lt;a href=&quot;http://www.nogray.com/color_picker.php&quot;&gt;irritating popups&lt;/a&gt;, some with tolerable design but &lt;a href=&quot;http://colourmod.com/&quot;&gt;ugly licensing&lt;/a&gt;, and I couldn&apos;t have any of that.  CMXpress is open-source, under the BSD license, and I needed something that would play nice with that.  I also needed something that would play nice with Prototype, and that ideally would be friendly to your garden-variety end-user and that would also ideally look like a control that was native to the browser.&lt;br /&gt;&lt;br /&gt;So, since nothing fit the bill, I built ProColor.  You can see a screenshot below, or you can visit &lt;a href=&quot;http://procolor.sourceforge.net&quot;&gt;ProColor&apos;s website&lt;/a&gt; and download yourself a copy.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://img.photobucket.com/albums/v63/phantom-inker/cmxpress/procolor_scrnshot.jpg&quot; /&gt;&lt;/div&gt;&lt;br /&gt;In a future posting, I&apos;ll talk about &lt;em&gt;how&lt;/em&gt; ProColor works internally.  And if you want to learn how to use it, that&apos;s well-documented on ProColor&apos;s own website.  Here, I&apos;d just like to spend a little time elaborating on what it is, why it is that way, and what it can do for you.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;ProColor is a color-picker:  It lets end-users choose RGB colors, and it records the chosen color either in its Javascript object or in an input field (or both).  They can choose them by sliding the slider, moving around the color wheel, picking a color from a palette of &amp;quot;web-safe&amp;quot; colors, or typing in absolute values.  It&apos;s smooth and fast, even on Internet Explorer, and &amp;quot;feels&amp;quot; like a built-in popup box in most web browsers (with Safari being the notable exception, since it&apos;s styled to look very Windowsy).&lt;br /&gt;&lt;br /&gt;It&apos;s implemented as a single Javascript source file with some associated images, and the Javascript source file is available in compressed form.  It works properly on most modern browsers from IE6 upward, and has been tested on IE, Firefox, Opera, Chrome, and Safari.  It is accessibility-friendly, too, since it responds to keyboard events, has its internal controls able to take the focus, and can readily fall back to just a simple text field if necessary.  It&apos;s easy to insert into your sites, too, since it can be implemented with almost no Javascript coding (and can even be implemented with &lt;em&gt;no&lt;/em&gt; Javascript coding on your part in many cases).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Why is it designed the way it is?&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;ProColor has several features that are designed to come together from a user-interaction perspective.  First, it has the color wheel, which is arguably more artist-friendly than the &lt;a href=&quot;http://www.colorjack.com/software/dhtml+color+picker.html&quot;&gt;color wash&lt;/a&gt; or &lt;a href=&quot;http://johndyer.name/post/2007/09/PhotoShop-like-JavaScript-Color-Picker.aspx&quot;&gt;color wave&lt;/a&gt; used in some color pickers.  Yes, Photoshop uses the color wave model, but artists are taught to think in terms of the color wheel, so ProColor uses the color wheel to stick to artists&apos; mental model.&lt;br /&gt;&lt;br /&gt;It also displays the color palette.  Some people may wonder why there&apos;s a color palette when you have a color wheel, but there are good reasons:  First, the color palette consists only of &amp;quot;web safe&amp;quot; colors, and some web designers may prefer those for compatibility.  Second, a good user-interaction axiom is to present users with a few initial options and then let the user choose one and alter it, rather than forcing the user to choose everything from scratch, and ProColor believes in that:  A user who wants a shade of dark red, for example, could go the long route of choosing red on the wheel and then dark on the slider, but that&apos;s two clicks just to get to an initial value:  But with a color palette, the user can click &amp;quot;dark red&amp;quot; directly to choose the initial color, and then alter it with the other settings.  The color palette, in short, makes users able to &amp;quot;design&amp;quot; their colors faster.&lt;br /&gt;&lt;br /&gt;It displays the RGB value in two different forms, the #hex form in the input field (using a variety of formatting options), and the raw decimal values in the input boxes.  This lets users type in exact colors, and they can tab between the input fields.&lt;br /&gt;&lt;br /&gt;It displays the HSB value as well, since some users want to be able to work with that.&lt;br /&gt;&lt;br /&gt;It does &lt;em&gt;not&lt;/em&gt; display a CMYK equivalent, since the web&apos;s colors do not match those from printers very well.&lt;br /&gt;&lt;br /&gt;And all of the fields respond intelligently to the keyboard:  The wheel and slider move with the arrow keys and shift and ctrl and home/end/pageup/pagedown; and keys like Esc and Enter/Return close the popup, as you&apos;d expect.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What can it do for me?&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;For one thing, it&apos;s free, open-source, and well-documented.  You have no excuse not to use it, other than page-load times, and in the age of broadband, that&apos;s a poor excuse.&lt;br /&gt;&lt;br /&gt;For another, it&apos;s incredibly easy to use.  It can be attached to any &amp;lt;input&amp;gt; element on a page, and it even has an incredibly easy form where you can write this:&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&apos;text&apos; class=&apos;procolor&apos; value=&apos;...&apos; /&amp;gt;&lt;br /&gt;&lt;br /&gt;By simply adding &amp;quot;procolor&amp;quot; to the input field&apos;s classname, that input field will automatically have a color-picker dropdown button displayed beside it.  Or you can create ProColor objects dynamically in your Javascript.  The library is very flexible, and very customizable, and is designed to easily fit into any page you can throw at it.&lt;br /&gt;&lt;br /&gt;In short, if you have a page that ever asks users to type in colors, you can use ProColor to significantly improve the user-friendliness of your page.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;In my next few postings, I&apos;ll spend some effort talking about how ProColor works.&amp;nbsp; When I built ProColor, I found that there was very little good documentation out there on how to build good, native-feeling Javascript controls, and I think it&apos;ll be useful to tell people what I learned.&amp;nbsp; I think the sequence of blog postings will go something like this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ProColor&apos;s overall design&lt;/li&gt;&lt;li&gt;How web based color-pickers work&lt;/li&gt;&lt;li&gt;Building popup windows in Javascript&lt;/li&gt;&lt;li&gt;Capturing the mouse&lt;/li&gt;&lt;/ul&gt;If you have anything else you&apos;d like to know on this or a related topic, feel free to suggest it, and I&apos;ll be happy to cover it.&amp;nbsp; Information is a good thing :-)&lt;br /&gt;</description>
  <comments>http://phantom-inker.livejournal.com/11668.html</comments>
  <category>prototype</category>
  <category>procolor</category>
  <category>programming</category>
  <category>javascript</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/11292.html</guid>
  <pubDate>Sat, 29 Nov 2008 14:32:28 GMT</pubDate>
  <title>Gainless Employment :-(</title>
  <link>http://phantom-inker.livejournal.com/11292.html</link>
  <description>I&apos;ve been hunting for a new job since the start of October.&lt;br /&gt;&lt;br /&gt;It started out as a light search two months ago, but I&apos;m now searching really hard, and I&apos;m starting to be worried.&amp;nbsp; The economy&apos;s bad, and it&apos;s not a good time to be hunting for jobs.&amp;nbsp; In theory, I&apos;m in the one sector that has growth potential — computers, especially web programming — and I&apos;m highly skilled and well-educated, but those facts don&apos;t seem to be helping much.&lt;br /&gt;&lt;br /&gt;My current employment consists of a lot of consulting work, and some sales of some software I wrote.&amp;nbsp; That was fine when I was a bachelor, but now that I&apos;m married, I&apos;m earning for two, because my wife got laid off in July and hasn&apos;t successfully found full-time work yet.&lt;br /&gt;&lt;br /&gt;It&apos;s not like I&apos;m asking for much; I&apos;m a talented, skilled professional, darn it, but I&apos;m willing to work for peanuts just to get off my feet:&amp;nbsp; Several folks in the industry think I&apos;m worth about $75K/year, so I started out hoping for $70K/year with benefits, and I&apos;ve watched my price point slide from $65K to $60K to $50K and now I&apos;m getting close to being willing to settle for anything over minimum wage.&amp;nbsp; (Okay, I&apos;m not &amp;lt;i&amp;gt;quite&amp;lt;/i&amp;gt; that desperate yet, but ask me again in a month...)&lt;br /&gt;&lt;br /&gt;We&apos;re already not buying Christmas gifts this year, and we&apos;ve cut back on everything.&amp;nbsp; We don&apos;t waste money:&amp;nbsp; I&apos;m half Dutch and half Jewish!&amp;nbsp; We haven&apos;t bought electronics of any kind in over a year, we haven&apos;t bought clothes, we have a small 900-square-foot apartment — we&apos;ve been thrifty.&amp;nbsp; But even so, thanks to my wife&apos;s lack of income, her (large) student loan payments, the rising cost of everything (including our depressingly large health-insurance premiums), and my current meager income, about a week ago we hit negative for the first time:&amp;nbsp; We owe more money than we actually have.&amp;nbsp; I don&apos;t know how I&apos;ll pay December&apos;s bills when they come around, much less my $1000 quarterly tax bill in January.&lt;br /&gt;&lt;br /&gt;So the upshot is that lately I&apos;m highly unambitious about art and writing and life in general.&amp;nbsp; I&apos;m doing little else lately but job-searching and hearing &quot;You&apos;re a great candidate&quot; but never hearing anything beyond that, and I&apos;m feeling generally pummeled by the world.&amp;nbsp; Maybe this&apos;ll seem like nothing in a few months, but right now, I&apos;m at the bottom of a pit, and the narrow shaft of sunlight that&apos;s sustained me is thinning by the day, soon to vanish altogether.&lt;br /&gt;</description>
  <comments>http://phantom-inker.livejournal.com/11292.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/11085.html</guid>
  <pubDate>Thu, 06 Nov 2008 19:49:27 GMT</pubDate>
  <title>A Final Politics Post</title>
  <link>http://phantom-inker.livejournal.com/11085.html</link>
  <description>lj-music: Ikimono-gakari&lt;br /&gt;&lt;br /&gt;Well, folks, the election&apos;s done, and I wish to offer my heartfelt &lt;b&gt;congratulations to Barack Obama.&lt;/b&gt;  He won soundly, and earned his new job.  Let&apos;s now all cross our fingers and hope that he really is as good as we all think he is.  It&apos;s gonna be an interesting four years, folks.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;I&apos;d like to conclude the series of journals I&apos;ve been writing on politics here with a commentary on something I read in the news today.  It probably comes as no surprise that the Republican Party is doing some soul-searching right now, demonstrated well by this AP interview with RNC Chairman Mike Duncan:&lt;br /&gt;&lt;blockquote&gt;Republicans, Duncan said, &quot;are going to take a deep breath and listen to the American people.&quot; The party is creating a new online forum that will allow people to explain &quot;how we let them down&quot; and &quot;what we can do to restore confidence in our party,&quot; he said.&lt;/blockquote&gt;I&apos;m a registered Republican, a moderate centrist.  I voted for Obama.&lt;br /&gt;&lt;br /&gt;Why?  I voted for Obama not because he himself was a centrist — he&apos;s definitely not — but because the modern Republican Party and its platform moved so far away from the center that it didn&apos;t include me anymore, and Obama at least &lt;i&gt;tried&lt;/i&gt;.  There is no &quot;big-tent GOP;&quot; if anything, the GOP&apos;s tent shrank remarkably over the last few years to exclude nearly everyone who&apos;s not a hardcore evangelical Christian.&lt;br /&gt;&lt;br /&gt;So, GOP, when you get your forum up, here&apos;s what I&apos;d suggest if you want my vote again:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;No more dumb wars.&lt;/b&gt;  You can wage a war if you want, but focus on the target and have an end-game.  If you can&apos;t explain from the outset in exacting terms precisely what victory looks like, you shouldn&apos;t be involved in the war in the first place.  I know people who voted against you because they lost friends in Iraq — but you dishonored those losses by never giving them meaning, by never showing how they could add up to victory.  Iraq&apos;s a loser because it has no end-game; Afghanistan&apos;s tolerable to the American public because there&apos;s an exacting target: If we kill or capture bin Laden, the war&apos;s over.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Curb your evangelicals.&lt;/b&gt;  I know the Christian Coalition is a respectable chunk of the Republican base, but there are a lot of us out here who see the Jerry Falwells and Pat Robertsons of the world as cut from the same cloth as the Ayatollah.  The more influence they have over you, the less I want to be anywhere near you.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Prioritize wisely.&lt;/b&gt;  Guns, God, and gays are fine topics, but when there&apos;s a war on and the economy&apos;s in the toilet, most of the public doesn&apos;t care whether gays are marrying or teenagers are getting abortions because we have bigger problems to deal with.  All politics is local, and you lost because you didn&apos;t pay attention to the highest local priorities.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Litmus tests scare people away.&lt;/b&gt;  In the same vein, if you want a bigger tent, you&apos;d better be willing to let moderates back into it.  I don&apos;t cast my vote based on which candidate shouts loudest about abortion, pro or con:  I&apos;m more concerned with fiscal issues than social ones, so when you play up the social ones, I tune out, with good reason.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Remember your platform.&lt;/b&gt;  You&apos;re the party of small government and fiscal conservatism --- or at least you used to be.  For eight years now, you&apos;ve wasted money like a drunken teenager on spring break.  When you were actually conservative, people voted for you, but right now, you&apos;re more liberal than your opponents, and the voters can see that.&lt;/li&gt;&lt;/ul&gt;So there you go, GOP.  You have four years to reform yourself and show me why I should be voting for you again.  Good luck; you&apos;ll need it.</description>
  <comments>http://phantom-inker.livejournal.com/11085.html</comments>
  <category>politics</category>
  <lj:music>Ikimono-gakari</lj:music>
  <media:title type="plain">Ikimono-gakari</media:title>
  <lj:mood>calm</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/10755.html</guid>
  <pubDate>Sun, 26 Oct 2008 05:11:58 GMT</pubDate>
  <title>Inkscape 0.46</title>
  <link>http://phantom-inker.livejournal.com/10755.html</link>
  <description>I do most of my artwork with &lt;a href=&quot;http://www.corel.com/servlet/Satellite/us/en/Product/1191272117978#tabview=tab0&quot;&gt;CorelDRAW&lt;/a&gt; version 11, and today I was encouraged to try &lt;a href=&quot;http://www.inkscape.org/&quot;&gt;Inkscape&lt;/a&gt; (again).  Now the last time I tried Inkscape (about two years ago), it just wasn&apos;t even close to powerful enough for my needs.  I&apos;d get supremely frustrated if I tried to use it for anything big too; it was missing a large number of the features (especially PowerClip) that I (ab)use heavily to create drawings like this.&lt;br /&gt;&lt;br /&gt;So I played around with it, and it&apos;s improved a lot over the last couple of years, but it&apos;s still &lt;em&gt;incredibly&lt;/em&gt; weak in its handling of clipping objects, which are pretty much essential to all of my shading.  Its clipping support has gone from a usability grade of F to a grade of D+; that&apos;s an improvement, but it has a long way to go.  Overall, it went from a D- to B-; there&apos;s a lot to like there, but it feels very incomplete compared to its commercial competitors.  Much of what it improves over CorelDRAW 11 is stuff that CorelDRAW X4 or even CorelDRAW 12 has, if I ever get around to upgrading; and there&apos;s a &lt;em&gt;lot&lt;/em&gt; that CorelDRAW does that it doesn&apos;t.&lt;br /&gt;&lt;br /&gt;So if you ever talk to the Inkscape people, this is what I&apos;d need to see them change (at a minimum)&amp;nbsp;for me to consider switching to it:&lt;ul&gt;&lt;li&gt;A clipping system (like PowerClip) that (A) doesn&apos;t destroy or hide the clipping object, (B) lets me readily alter the clipping object&apos;s shape, (C) lets me easily add multiple objects to the clipping object or remove them on a whim, and (D) lets me go inside the clipping object and alter its contents without removing them first.  Their clipping system does none of these.&lt;/li&gt;&lt;li&gt;An objects docker that shows the entire document tree.  Maybe Inkscape has such a thing, but I couldn&apos;t find it, and I looked all over.  This is an incredibly useful tool, and I refer to it frequently.&amp;nbsp; It has other dockers (right-side tool panels); there&apos;s no reason it can&apos;t have this one too.&lt;/li&gt;&lt;li&gt;Direct import of CorelDRAW .cdr files; I won&apos;t switch if I can&apos;t bring my artwork with me.&amp;nbsp; Having a dubiously-supported third-party tool doesn&apos;t really cut the mustard.&lt;/li&gt;&lt;li&gt;Object blend.  I use this a lot, and while their path thing can do this (I think), it seems very cumbersome compared to simply selecting two objects and clicking &amp;quot;Blend.&amp;quot;&lt;/li&gt;&lt;li&gt;Right-click zoom-out.  When you have the zoom tool selected, the right mouse button should zoom &lt;em&gt;back&lt;/em&gt; to the previous zoom level, not pop up a menu.  There is not even a button anywhere in the interface that I can click on to perform this same simple task right now, which makes navigating around the picture a real chore.&lt;/li&gt;&lt;li&gt;An actual useful right-click menu for the node tool.  I expect node-related operations to be on its menu, not object-related operations.&amp;nbsp; Having to move the mouse up to the toolbar for every node operation involves a lot of wasteful mouse motion.&lt;/li&gt;&lt;/ul&gt;This doesn&apos;t even get into printing support, color management, paragraph text, or any of a hundred little niceties that are missing.  About the only thing it gives me over CorelDRAW is bug fixes for some features, and I&apos;m willing to place bets those bugs have been long since fixed in newer versions of CorelDRAW.&lt;br /&gt;&lt;br /&gt;On the plus side, some features I &lt;em&gt;did&lt;/em&gt; like in Inkscape were its nice handling of alpha on all objects and its ability to easily gaussian-blur objects.&amp;nbsp; Those are really neat features, great for performing really sophisticated shading, and I&apos;d love to have them be a part of my standard toolset; but things like PowerClip and blend and other tools I&amp;nbsp;use daily are more critical to me.&lt;br /&gt;&lt;br /&gt;So, well, good try, guys, and keep it up; you&apos;ll be competitive eventually, but for now, Inkscape is still a little too weak for me to use regularly; but, unlike two years ago, I can at least now see myself potentially using it in the future, if the feature set becomes capable enough for my needs.</description>
  <comments>http://phantom-inker.livejournal.com/10755.html</comments>
  <category>coreldraw</category>
  <category>inkscape</category>
  <lj:mood>okay</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/10589.html</guid>
  <pubDate>Wed, 01 Oct 2008 16:48:21 GMT</pubDate>
  <title>Wedded Bliss</title>
  <link>http://phantom-inker.livejournal.com/10589.html</link>
  <description>On Saturday, October 4, 2008, just as the fall leaves start to turn (and a mere three days from today), the lovely Songbird and I will be married near sunset in a little white Methodist church in the even littler town of New Milford, Pennsylvania, a pretty picture that&apos;s right out of a Norman Rockwell painting. Say hello to the soon-to-be Mr. and Mrs. Inker :)&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src=&quot;http://img.photobucket.com/albums/v63/phantom-inker/HappyCouple-small.jpg&quot; width=&quot;289&quot; height=&quot;400&quot; alt=&quot;Inker &amp;amp; Songbird :-)&quot; /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;We have about 120 guests who will be coming from all over the world (literally!). There&apos;ll be the ceremony itself (very traditional, too!), the reception, music, a sit-down dinner, dancing, and an open bar, so it&apos;s gonna be one heckuva party.&lt;br /&gt;&lt;br /&gt;On the night of the reception, she and I will disappear around ten o&apos;clock, to hop into our limousine to the Philadelphia International Airport to catch our early-morning flight to the sunny warm aqua waters and fresh winds of the Aloha State.&lt;br /&gt;&lt;br /&gt;Me, I&apos;m incredibly happy and terrified out of my knickers at the same time. I&apos;ve never been good in front of large crowds, and I&apos;m a lot more comfortable behind the scenes than being the center of attention. But I really, really want to be married to Songbird; she&apos;s the best thing that&apos;s ever happened to me, and if that means I have to spend a day scared [bleep]less, I&apos;ll do it in a heartbeat.  Songbird, I love you, and I can&apos;t wait to see you walking down the aisle on Saturday.</description>
  <comments>http://phantom-inker.livejournal.com/10589.html</comments>
  <category>marriage</category>
  <category>wedding</category>
  <category>songbird</category>
  <lj:mood>anxious</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/10015.html</guid>
  <pubDate>Sat, 13 Sep 2008 00:21:09 GMT</pubDate>
  <title>Update and Cleanup</title>
  <link>http://phantom-inker.livejournal.com/10015.html</link>
  <description>So it&apos;s been some time since I last posted here, not because I really wanted to delay, but because the past few weeks have been pretty rough.  First, I banged up my arms on the boat and could barely type for a week; then I accidentally jabbed a knife into my thumb (ow) and couldn&apos;t type for most of another week; and lately I&apos;ve just plain been busy.&lt;br /&gt;&lt;br /&gt;Part of that&apos;s because I&apos;ve been preparing (gulp) to go job hunting:  My current work is good, but I&apos;m getting married really soon, and my current income and Songbird&apos;s current income just aren&apos;t enough to cover our collective bills &amp;mdash; that, and I&apos;ve been thinking for a while now that it was time to start doing something different career-wise.&amp;nbsp; Despite the fact that I&amp;nbsp;own my own (very small)&amp;nbsp;company, I&amp;nbsp;really do feel like I&apos;m going in the wrong direction right now.&lt;br /&gt;&lt;br /&gt;Luckily, I work in the computer industry, and folks pay pretty well here, so we&apos;ll be okay once I find a new job, hopefully in web-dev stuff; that&apos;s been a lot of fun to work on as I&apos;ve been doing it more and more over the last couple of years, and it&apos;s a place where I feel like I can actually contribute something meaningful.&amp;nbsp; But job hunting is scary no matter when or where you do it, and as it&apos;s been seven years since I last did it, I&apos;m pretty rusty on the whole resume-and-interview process &amp;mdash; not on my work skills, which are, as always, in tip-top shape and very current, but on my interview skills.&lt;br /&gt;&lt;br /&gt;Anyway, to that end, I&apos;ve decided to clean up this blog a little; I&apos;ve removed some of the sillier postings and personal postings from awhile back, and left mainly the more recent postings and stuff about CMXpress, since that seems to be why most people are coming here anyway.  Anybody who really wants to delve into my private life can find plenty of it elsewhere online.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;But let&apos;s get into the meat of the topic:  What&apos;s the status of &lt;a href=&quot;http://www.mycmxpress.org&quot;&gt;CMXpress&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;The answer is that it&apos;s in progress.  We did a successful rollout of it to &lt;a href=&quot;http://www.crossworlds.ws&quot;&gt;Crossworlds&lt;/a&gt; back in June, and Crossworlds has been running on it ever since, which is good.  That said, I learned a &lt;em&gt;lot&lt;/em&gt; during that rollout, and realized that it wasn&apos;t quite ready for the general public yet.  Thom was willing to put up with some installation headaches to gain its administration tools, but the average Joe-on-the-street isn&apos;t going to be able to.  (C.D. Rudds, who draws and writes &lt;a href=&quot;http://www.sailorsun.org&quot;&gt;SailorSun.org&lt;/a&gt;, has been working with it a little bit for his new site, &lt;a href=&quot;http://www.wolfpac.ca&quot;&gt;Wolfpac&lt;/a&gt;, and that&apos;s also demonstrated some areas where it&apos;s needed more cleanup and end-user-friendly-ization.)&lt;br /&gt;&lt;br /&gt;So some parts of it were pulled back into the workshop for retooling; during the Crossworlds rollout, I went through three or four version numbers in a hurry, patching and fixing and upgrading.  I&apos;ve since done a lot of work on the installer, and fixed a lot of interesting (and ugly) bugs in the backend, and added in some services that really should&apos;ve been there since the start (like logging).  It also needs documentation by the barrel; this is a huge and powerful package, and right now, I&apos;m really the only person who understands it fully, and a lot of folks who are testing it have been griping about that fact.&lt;br /&gt;&lt;br /&gt;And, of course, there was about a month during July when I was swapping out its BBCode parser with &lt;a href=&quot;http://nbbc.sourceforge.net&quot;&gt;NBBC&lt;/a&gt;, because the old parser was slow and was covered under GPL, which isn&apos;t very friendly toward my preferred BSD license.&lt;br /&gt;&lt;br /&gt;So where&apos;s that leave us?  Right now, I&apos;m working on the logging-and-statistical facilities, so that site owners can get a handle on their visits and visitors, which is useful for a wide variety of purposes (not the least of which is paid advertising).  I&apos;ve backported some of the new code to the old &lt;a href=&quot;http://www.thewotch.com&quot;&gt;Wotch site&lt;/a&gt;, so that their database is kept in sync with CMXpress&apos;s preferred format (Lordy, Lordy, I can&apos;t wait to finally switch in the new code at the Wotch site).  The search engine is in pieces right now, too, and needs some work; and I&apos;ve seen a &lt;em&gt;lot&lt;/em&gt; of evidence from the test sites that the custom-page facilities will need to be &lt;em&gt;done&lt;/em&gt;, finis, finito before I can release CMXpress to the public too.&lt;br /&gt;&lt;br /&gt;I know I told folks that I was hoping to have it released this summer, and I&apos;m sorry for not releasing it yet.  But I think it&apos;s better this way:  The test sites have identified some places where it still needs work, and their discoveries (and my subsequent bug-fixes, patches, and upgrades) will help all of you who are waiting on it.  Ideally, this thing should just be install-and-go, but it&apos;s just not quite there yet.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;One other topic that arose as I was talking with &lt;a href=&quot;http://www.burgerbecky.com/&quot;&gt;Becky Heineman&lt;/a&gt; the other day was a simple enough question:  She pointed out that she&apos;d needed a webcomic engine for &lt;a href=&quot;http://www.sailorranko.com&quot;&gt;Sailor Ranko&lt;/a&gt;, and so she just built one in a weekend, and added most of the facilities she wanted within a week or two after that; and given that that was so easy for her to do, what was the point of CMXpress?  To this question, I have several answers, and I think they&apos;re all valid:&lt;ul&gt;&lt;li&gt;Most webcomic authors aren&apos;t a Becky Heineman, for one thing:  Becky&apos;s a star programmer, capable of coding anything she wants in relatively short time.  Whereas a typical webcomic author knows how to write and draw, and if he&apos;s lucky he can scrabble together a few lines of PHP to help automate the site a little, but coding a solid backend is beyond him.&lt;/li&gt;&lt;li&gt;Becky&apos;s engine is no doubt powerful and well-suited to her needs, but it probably doesn&apos;t scale to other sites.  That&apos;s the same problem the current Wotch code has and that many webcomic sites have:  The code&apos;s acceptable enough code for the needs of that site, but it was designed to run that &lt;em&gt;one&lt;/em&gt; site, not hundreds of others, and isn&apos;t easily customizable for another site.  There&apos;s a very good reason we&apos;ve repeatedly turned down requests for the current Wotch site code &amp;mdash; it&apos;s ugly and unportable.&lt;/li&gt;&lt;li&gt;CMXpress provides sophisticated &lt;em&gt;and&lt;/em&gt; easy-to-use administrative services.  A coded-over-the-weekend system provides very minimal administration (I should know; I&apos;ve built enough of those kinds of things).  A good general-purpose package should be so incredibly point-and-click-crowd-friendly that anybody can manage reams of data, and the Crossworlds rollout has shown CMXpress is meeting that goal:  Darin Brown, the artist for Crossworlds, is very computer-phobic but has used CMXpress to post a comic or two by himself, and I consider that a very successful benchmark.&lt;/li&gt;&lt;li&gt;CMXpress provides a solid API.  The API of most backends is somewhat ad-hoc:  You add stuff by altering a line of code here and there.  For CMXpress, I wanted to do better than my last webcomic engine, and build a system that a programmer could love, with a clean, tight API that makes a lot of nasty stuff (page templates, BBCode, form handling, administration, etc.) really easy, and that ensures that site changes can usually be done without altering the engine.  I&apos;m tired of reinventing the wheel, and I think that even the webcomic authors who &lt;em&gt;are&lt;/em&gt; programmers probably would rather the hardest work be done for them too.&lt;/li&gt;&lt;li&gt;CMXpress is maintained.  This thing was built first and foremost to meet the exotic needs of &lt;em&gt;the Wotch&lt;/em&gt;, and that means I still am going to be regularly adding features and patching bugs because of my involvement with them.  Although I&apos;ve drawn some webcomic pages in the past, I&apos;m not a webcomic author and don&apos;t really want to be; I&apos;m a coder, and I&apos;m quite happy with that job.  This means that you can fix bugs and add upgrades to your own site just by downloading the latest copy of CMXpress and installing it:  It&apos;s a lot easier to steal my bug fixes than to make them yourself, even if you &lt;em&gt;are&lt;/em&gt; a programmer.&lt;/li&gt;&lt;li&gt;CMXpress is needed &amp;mdash; whether any other site ever uses it or not, &lt;em&gt;Crossworlds&lt;/em&gt; is already using it, and &lt;em&gt;the Wotch&lt;/em&gt; needs it very badly, and Tsel&apos;s asked several times if he can install it on &lt;a href=&quot;http://cheer.thewotch.com/&quot;&gt;&lt;em&gt;Cheer!&lt;/em&gt;&lt;/a&gt; too.  For those reasons alone, I &lt;em&gt;will&lt;/em&gt; continue working on it.  People want it; it has a purpose; there&apos;s the answer.&lt;/li&gt;&lt;/ul&gt;All that said, there&apos;s nothing stopping anybody from building their own webcomic engine and distributing it; competition is healthy for the market, and in the end, the users win, and the readers (like me!) win too.&amp;nbsp;  I&apos;m gonna keep working on CMXpress because people want it and need it, but if a competitor arises? &amp;nbsp; May the best webcomic engine win :-)&lt;br /&gt;</description>
  <comments>http://phantom-inker.livejournal.com/10015.html</comments>
  <category>wotch</category>
  <category>cmxpress</category>
  <category>crossworlds</category>
  <lj:music>Ranma ½ season 5 closing music (yuck)</lj:music>
  <media:title type="plain">Ranma ½ season 5 closing music (yuck)</media:title>
  <lj:mood>optimistic</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/9869.html</guid>
  <pubDate>Fri, 22 Aug 2008 03:36:05 GMT</pubDate>
  <title>Oops</title>
  <link>http://phantom-inker.livejournal.com/9869.html</link>
  <description>I had a fight with a steak knife and lost today.  I&apos;m typing this one-handed right now.  My hand will heal, and I (thankfully) didn&apos;t need a hospital visit, but this touch-typist is down for the count right now.  So...  uh...  there you have it.  If I&apos;m not talking over IM or responding to your comments, now you know why.&lt;br /&gt;&lt;br /&gt;I&apos;m glad I knew to quickly apply a tourniquet, and I&apos;d like to thank my Songbird for her support; I doubt I&apos;d be doing well right now without her.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit, 12 hours later:&lt;/b&gt;  I can type a little better today (still minus a finger and on painkillers), so here&apos;s what happened:  Hold your hands out in front of you, palms down, about shoulder-width apart.  Pretend you have a knife in your right hand, and a scrubby brush in your left hand, and that your hands are over a sink.  You&apos;ve finished cleaning the knife, so you put the scrubby brush behind the sink.  You go to put the knife away in the rack to your left, but you miss, and the tip of the knife strikes the back of your thumb, right at the joint.&lt;br /&gt;&lt;br /&gt;Lots of blood spurts out of the stab wound, because you hit an artery.  You cry out, your fiancée comes over, and she quickly helps you apply a tourniquet to stop the bleeding while you wash it under cold water.  The stab wound is small but deep, but doesn&apos;t hit the bone, thankfully.  But the loss of blood is making you woozy, so you lay down.  She applies antibiotics to the cut, and then a bandage, and makes you take a bunch of painkillers, and you spend the next few hours laying down and drinking liquids, trying not to pass out.  Eventually, you slowly recover, but your thumb hurts like hell.  It&apos;s a very small but very deep cut, so there&apos;s not much a hospital could do, so you don&apos;t go, but it still hurts.&lt;br /&gt;&lt;br /&gt;Funny thing is, I know knife safety.  I carry a swiss army knife in my pocket, and have since I was 16, and I use it all the time.  I&apos;ve never gotten even so much as a tiny cut from it; I get more injuries from paper cuts than I do from knives.  But...  all it takes is one mistake.&lt;br /&gt;&lt;br /&gt;On the plus side, I learned firsthand that our new steak knives are really nice and sharp! :D</description>
  <comments>http://phantom-inker.livejournal.com/9869.html</comments>
  <category>sharp objects</category>
  <category>knives</category>
  <category>typing</category>
  <lj:mood>Ow.</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/9630.html</guid>
  <pubDate>Wed, 30 Jul 2008 22:44:44 GMT</pubDate>
  <title>NBBC and open-source thoughts</title>
  <link>http://phantom-inker.livejournal.com/9630.html</link>
  <description>As most of you know, I&apos;ve been working hard on a webcomic software package called &lt;a&gt;CMXpress&lt;/a&gt;, and one of its distinguishing features is that for nearly all the places where a user can type text, it uses BBCode to allow you to format it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;I discovered around the start of this month&lt;/b&gt; (July) that the BBCode parser I&apos;d been using was covered under the &lt;b&gt;GPL&lt;/b&gt;.&amp;nbsp; This is bad.&lt;br /&gt;&lt;br /&gt;See, here&apos;s the thing:&amp;nbsp; &lt;b&gt;CMXpress is covered under a BSD license&lt;/b&gt;, which is about as open as open-source gets:&amp;nbsp; Free as in speech, free as in beer, you can download your copy, modify it, sell it, do anything you damn well please with it --- you just can&apos;t claim you wrote it.&amp;nbsp; Which is fair, I think:&amp;nbsp; BSD and similar open licenses have helped spur the development and the spread of a huge number of software packages.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The major competing open-source license is the GPL&lt;/b&gt;, which is similar in principle, except for two things:&amp;nbsp; First, you can&apos;t take the code, modify it, and &lt;i&gt;not&lt;/i&gt; release your modifications to the public.&amp;nbsp; BSD allows you to have a private copy, effectively, and GPL doesn&apos;t.&amp;nbsp; Second, the GPL is, as Micro$oft rightly argues, somewhat like a virus:&amp;nbsp; It infects everything it touches, and overrides everything it touches.&amp;nbsp; If I had (stupidly) included that GPL&apos;ed BBCode parser with CMXpress, CMXpress itself &lt;i&gt;would have been forcibly covered under the GPL&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;I don&apos;t like people telling me what I can and can&apos;t do.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So the old GPL&apos;ed BBCode parser is out,&lt;/b&gt; and I couldn&apos;t be happier, really.&amp;nbsp; It wasn&apos;t really that great a piece of code to begin with; it was cranky and somewhat inflexible, didn&apos;t handle whitespace in ways I really wanted, and the original author stopped supporting it two years ago.&amp;nbsp; I did some searching, and there weren&apos;t any other good BBCode parsers out there; seems a lot of people are looking for one, and nobody&apos;s written one...&lt;br /&gt;&lt;br /&gt;...Until now.&amp;nbsp; &lt;b&gt;Introducing &lt;a href=&quot;http://nbbc.sourceforge.net/&quot;&gt;NBBC&lt;/a&gt;, a fast, flexible, well-documented BBCode parser that&apos;s covered under a BSD license&lt;/b&gt;.&amp;nbsp; Unlike most open-source code, it&apos;s &lt;a href=&quot;http://nbbc.svn.sourceforge.net/viewvc/nbbc/&quot;&gt;well-commented&lt;/a&gt;, includes a huge &lt;a href=&quot;http://nbbc.sourceforge.net/readme.php&quot;&gt;user&apos;s manual&lt;/a&gt;, includes several examples, and is small and lightweight to boot.&amp;nbsp; It&apos;s a &lt;i&gt;validating&lt;/i&gt; parser, meaning that no matter what broken garbage your users type in, you get XHTML 1.0 Strict out.&amp;nbsp; It runs under PHP 4.0.5 or later, and is everything that old parser wasn&apos;t.&amp;nbsp; It&apos;s long overdue.&amp;nbsp; &lt;a href=&quot;http://nbbc.sourceforge.net/&quot;&gt;&lt;b&gt;Go download your own copy now.&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NBBC will quickly replace all of the places where I used that old BBCode parser:&lt;/b&gt;&amp;nbsp; It&apos;s faster, more flexible, works flawlessly right out of the box, and has a nice API for adding extensions and new tags and smileys and other stuff.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NBBC is hosted by SourceForge,&lt;/b&gt; and I have mixed feelings about that.&amp;nbsp; On the one hand, SourceForge is a nice clearinghouse for open-source projects.&amp;nbsp; On the other hand, SourceForge seems to me to be a royal pain in the @$$ to work with, and somewhat slow.&amp;nbsp; Still, I&apos;m giving it a try, and maybe SourceForge will grow on me over time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;And those of you who have been wondering where CMXpress is can stop wondering:&lt;/b&gt;&amp;nbsp; CMXpress has been inside the garage while I replace its BBCode parser and get rid of anything that smells even vaguely like the stink of the GPL.</description>
  <comments>http://phantom-inker.livejournal.com/9630.html</comments>
  <category>open-source</category>
  <category>bsd</category>
  <category>sourceforge</category>
  <category>bbcode</category>
  <category>gpl</category>
  <category>nbbc</category>
  <lj:mood>satisfied</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/9140.html</guid>
  <pubDate>Mon, 16 Jun 2008 03:58:05 GMT</pubDate>
  <title>The Acceptance Speech</title>
  <link>http://phantom-inker.livejournal.com/9140.html</link>
  <description>My fiancée is a theater geek, and tonight&apos;s her big night of the year:&amp;nbsp; &lt;a&gt;the Tonys&lt;/a&gt;.&amp;nbsp; It&apos;s a bit more entertaining than the drivel embodied by most award shows, since theater tends to be a bit more substantive than most other fields of entertainment, but still, at three and a half hours, it drags like a bad prom dress.&lt;br /&gt;&lt;br /&gt;Much of the boring part is, of course the acceptance speeches.&amp;nbsp; Sometime around the 900,000,000,000th award, I found myself wishing that someone would stand up and actually make a &lt;i&gt;good&lt;/i&gt; and &lt;i&gt;entertaining&lt;/i&gt; acceptance speech for a change.&amp;nbsp; It would be spoken slowly, and it would go something like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&quot;I couldn&apos;t be here tonight, so I asked myself to come in my place and read this speech I wrote.&amp;nbsp; Please bear with me.&quot;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(He reaches into his jacket and withdraws a written acceptance speech.&amp;nbsp; He begins reading it slowly and carefully.)&lt;/i&gt;&amp;nbsp; &quot;Screw you.&amp;nbsp; I hate you all.&amp;nbsp; Backspace.&amp;nbsp; Backspace.&amp;nbsp; Backspace.&amp;nbsp; Thank you all so much for giving me this award in the field of acting, writing, and/or directing.&quot;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(Pause.)&lt;/i&gt;&amp;nbsp; &quot;Note to reader:&amp;nbsp; If I have been nominated for a different category, please alter the speech accordingly, and remove references of loathing and anger where appropriate.&quot;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(Deep breath.)&lt;/i&gt;&amp;nbsp; &quot;I could not have acted, written, or directed this play or musical without support from loved and cherished immediate family members whose names I conveniently forget when I write speeches.&amp;nbsp; I would like to thank the producers who saw my obvious brilliance and asked me to star, write, or direct this play or musical, knowing that my talents would win them an Oscar, a Tony, an Emmy, a Pulitzer Prize, and/or a Nobel Prize.&amp;nbsp; I would like to thank Jesus, Ghandi, Mohammed, Buddha, Zeus, and my mother, not necessarily in that order.&amp;nbsp; Finally, I would like to thank my wife, whose name I cannot recall, having just married her in Vegas last Thursday.&quot;&lt;br /&gt;&lt;br /&gt;&quot;Thank you all once again for this statue or certificate, and please know that if you were to star, write, or direct a play I would gladly give you a similar one in return, so long as it is made entirely of chocolate, preferably without nuts, as nuts are expensive.&quot;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;See that?&amp;nbsp; That&apos;s an acceptance speech with some cohones.&amp;nbsp; That&apos;s an acceptance speech they&apos;d be talking about around the water cooler the next day.&amp;nbsp; Anybody can thank everyone they&apos;ve ever met.&amp;nbsp; Not everybody can thank nobody, much less make it fun to watch.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;P.S.&lt;/b&gt;&amp;nbsp; If you&apos;re nominated for something and want to steal my speech, steal the damn thing.&amp;nbsp; Maybe that&apos;ll be one less boring, lame-ass acceptance speech I&apos;m stuck having to sit through.&amp;nbsp; Thank God for TiVo.</description>
  <comments>http://phantom-inker.livejournal.com/9140.html</comments>
  <category>tonys</category>
  <category>broadway</category>
  <category>award show</category>
  <category>acceptance speech</category>
  <lj:mood>blank</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/8888.html</guid>
  <pubDate>Sat, 17 May 2008 06:04:56 GMT</pubDate>
  <title>CMXpress, getting closer</title>
  <link>http://phantom-inker.livejournal.com/8888.html</link>
  <description>I built a comic-import tool for CMXpress over the past two days, mainly because while CMXpress makes it pretty easy to upload a comic, if you have to upload, say, a hundred of them at once, it can get to be a chore.&amp;nbsp; The initial test installation on the Crossworlds comic is going well; once I had the bugs worked out of the import tool, I was able to import, sort, and categorize all 93 comic pages (that&apos;s 75 in-canon comics, 2 cover pages, and 16 fillers) in the space of about a half hour; and most of that time was spent going through the comics and trying to decide which ones belonged in which story arcs.&lt;br /&gt;&lt;br /&gt;Overall, CMXpress is starting to feel very good.&amp;nbsp; It&apos;s still a little rough around the edges, and there are some bugs to deal with, and a few things that aren&apos;t fully implemented yet, but the overall feel, to compare it to cars, is &quot;Porche in need of some body work&quot; (which is a lot better than &quot;Yugo in need of demolition&quot;):&amp;nbsp; There&apos;s more work yet to do, but it&apos;s starting to finally really feel like something people can and would willingly use.&lt;br /&gt;&lt;br /&gt;For the record, the initial version of CMXpress we installed on the Crossworlds test site was v0.9.2, and the current version installed there is v0.9.4.</description>
  <comments>http://phantom-inker.livejournal.com/8888.html</comments>
  <category>cmxpress</category>
  <category>crossworlds</category>
  <lj:music>Shoebox (Barenaked Ladies)</lj:music>
  <media:title type="plain">Shoebox (Barenaked Ladies)</media:title>
  <lj:mood>*sigh*</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/8469.html</guid>
  <pubDate>Tue, 13 May 2008 05:46:45 GMT</pubDate>
  <title>CMXpress, rolling out like a snail</title>
  <link>http://phantom-inker.livejournal.com/8469.html</link>
  <description>Okay, we&apos;re not quite at the stage of a major rollout, but we hit a milestone with CMXpress tonight.&amp;nbsp; I got enough of the installer done that I was able to package up CMXpress in its current beta form and install it successfully on another site --- or, more accurately, I watched and fretted while my friend &lt;a href=&quot;http://www.crossworlds.ws&quot;&gt;Thom&lt;/a&gt; installed it ;-)&lt;br /&gt;&lt;br /&gt;There are a number of bugs to squish yet, but overall, I&apos;m pleased; we got it installed relatively painlessly on his site in about an hour and a half (it&apos;ll take only about fifteen minutes for most people to install once CMXpress is released, but we were finding and fixing bugs during the install), and the next step is to start configuring it to the needs of &lt;a href=&quot;http://www.crossworlds.ws&quot;&gt;Crossworlds&lt;/a&gt; and import his existing data.&lt;br /&gt;&lt;br /&gt;Based on his needs, I think I need to spend a lot of time working on importer code, even though that wasn&apos;t part of the original design spec, because he&apos;s got a decent-sized comic that really needs to be inhaled more easily than importing the comics one at a time, and he&apos;s also got a blog that he&apos;d like to turn into CMXpress&apos;s built-in news system.&amp;nbsp; A package for managing data isn&apos;t very useful if you can&apos;t get your data into and out of it easily.&lt;br /&gt;&lt;br /&gt;Still, though, I&apos;m a relatively happy camper; I&apos;ve suffered through far worse initial software rollouts than this.</description>
  <comments>http://phantom-inker.livejournal.com/8469.html</comments>
  <category>cmxpress</category>
  <category>crossworlds</category>
  <lj:mood>sleepy</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/8312.html</guid>
  <pubDate>Thu, 06 Mar 2008 16:09:03 GMT</pubDate>
  <title>The IE8 beta:  Nice try, guys</title>
  <link>http://phantom-inker.livejournal.com/8312.html</link>
  <description>&lt;b&gt;So today I tried out the newly-released &lt;a href=&quot;http://www.microsoft.com/windows/products/winfamily/ie/ie8/readiness/Install.htm&quot;&gt;Internet Explorer 8 beta&lt;/a&gt;.&lt;/b&gt;  You can download it and install it yourself, but it&apos;s a beta, not a final release, so don&apos;t expect polished edges.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Overall...  well...  my results were mixed.  &lt;/b&gt;Yes, it passes the vaunted &lt;a href=&quot;http://www.webstandards.org/action/acid2/&quot;&gt;ACID2&lt;/a&gt; test.  That&apos;s good.  It&apos;s definitely a step in the right direction.  However, ACID2 isn&apos;t a test of all of the CSS 2.1 language specification; it tests a lot of important cases, but not everything.  And while IE8 does correctly render ACID2, it definitely doesn&apos;t get all the other parts of the CSS 2.1 spec correct.&lt;br /&gt;&lt;br /&gt;I pointed IE8 today at the current build of CMXpress to see how it&apos;d handle it.  CMXpress is a very Web 2.0 program, and its back-end (the administration side of it) makes extensive use of CSS, XHTML, Javascript, and AJAX for its page layouts.  Its front-end (the part visitors see) uses whatever page template the site is set up with, and the default front-end I&apos;ve been working with is an XHTML+CSS variant of &lt;a href=&quot;http://www.thewotch.com&quot;&gt;the Wotch&lt;/a&gt;&apos;s front page.&lt;br /&gt;&lt;br /&gt;Both the back-end and front-end are rendered, perfectly, unchanged, by Firefox 2, Opera 9, and Safari 3.  They do have embedded IE-conditional comments so that they can render acceptably on IE6 and IE7 by including additional stylesheets.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IE8 gets it wrong.  &lt;/b&gt;Not massively wrong, but wrong enough that the site is unusable.  The front-end has a lot of formatting and layout glitches, with many of the link images being scattered around the page semi-randomly.  The back-end&apos;s Javascript is broken in its entirety; IE8 gives up somewhere in the middle of the code, and I&apos;m not really sure why yet.  Without that Javascript working, all the AJAX and Web 2.0 stuff that it does is non-functional, so the back-end is effectively unusable.&lt;br /&gt;&lt;br /&gt;Don&apos;t get me started on other Web 2.0 sites like the new &lt;a href=&quot;http://mail.yahoo.com&quot;&gt;Yahoo! Mail&lt;/a&gt; (crashes on a Javascript error) or &lt;a href=&quot;http://maps.google.com&quot;&gt;Google Maps&lt;/a&gt; (looks like it went through a blender) even a simple page like &lt;a href=&quot;http://script.aculo.us&quot;&gt;script.aculo.us&lt;/a&gt;&apos;s front page (flickers and animates all wrong).&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://img.photobucket.com/albums/v63/phantom-inker/other/google-maps-ie8beta.png&quot;&gt;&lt;img width=&quot;226&quot; height=&quot;200&quot; alt=&quot;Google Maps on IE8&quot; border=&quot;0&quot; src=&quot;http://img.photobucket.com/albums/v63/phantom-inker/other/google-maps-ie8beta-thumb.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Google Maps on IE8 or postmodern art?  You decide.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;And did I mention the speed?  &lt;/b&gt;You can tell when IE8 is rendering a page in &quot;Standards Mode&quot; because it&apos;s slow.  Slow like molasses in January.  Slow like a dead sea turtle crawling up the beach with a towtruck on its back.  Maybe they have a lot of debugging code in there:  I don&apos;t know.  But what I do know is that its page-render times are better-expressed in geologic terms than in seconds.  I dare you to resize the browser window.  Go on, do it.  Let me know how that turns out for you, if it ever finishes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Oh, about all those new features...&lt;/b&gt;  Yes, IE8 comes with a raft of new features, most of which seem to be designed to point IE&apos;s users at various Microsoft Live services.  You can right-click on text and search for it on Microsoft Live Search.  You can translate it with Microsoft Live.  You can post it to your blog on Windows Live Spaces.  Anybody see a trend here?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion?&lt;/b&gt;  IE8 breaks pages that worked under IE7.  We knew that going in, and that&apos;s okay, because IE7&apos;s rendering sucked.  The problem is that it didn&apos;t replace IE7&apos;s pseudo-standards mode with a real standards mode:  It still breaks pages that are standards-compliant, pages that work fine with three different competing renderers.  And it adds in new &quot;features&quot; that seem to me more about targeting people toward Microsoft services than anything else.  From my perspective, it looks like Microsoft spent some of their time making IE8 &lt;i&gt;appear&lt;/i&gt; less broken without actually &lt;i&gt;making&lt;/i&gt; it less broken, and the rest of their time extending the monopoly.&lt;br /&gt;&lt;br /&gt;I wanted to like IE8.  I really did.  I wanted to believe the hype about CSS compliance and all the other good rumors.  I&apos;ve been telling other devs, well, just wait for IE8, you&apos;ll see, it&apos;ll be great.  But this is just pathetic.  Seems to me like it&apos;s business as usual in Redmond, and now we web developers will have yet another nonstandard renderer to support.&lt;br /&gt;&lt;br /&gt;Thanks, guys, thanks a lot.</description>
  <comments>http://phantom-inker.livejournal.com/8312.html</comments>
  <category>ie8</category>
  <category>cmxpress</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/7942.html</guid>
  <pubDate>Fri, 29 Feb 2008 14:26:30 GMT</pubDate>
  <title>The lessons we learn</title>
  <link>http://phantom-inker.livejournal.com/7942.html</link>
  <description>&lt;b&gt;Nobody&apos;s above learning a new lesson, and I&apos;m no exception.&lt;/b&gt;  Today, I spent several hours going through many large chunks of PHP code I&apos;d written removing security vulnerabilities.  Yes, that includes the Wotch and CMXpress.&lt;br /&gt;&lt;br /&gt;On last week&apos;s 910CMX podcast, I explained that website coding should really be left to the experts:  If you want to have a webcomic site, let somebody else write the code, and stick to drawing and writing your script, because I can pretty well guarantee you&apos;ll produce code that&apos;s a hacker&apos;s dream.  There are a hundred well-known pitfalls, and there are really weird, obscure pitfalls too, like the two I cleaned up today.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;b&gt;The first pitfall&lt;/b&gt; was that of not including the &quot;D&quot; modifier on all regular expressions that use the &quot;$&quot; operator.  (If that sentence confuses you, you&apos;d better skip to the bottom of this post, because it only gets more technical from here.)  For those who don&apos;t know what the &quot;D&quot; modifier does, you&apos;re not alone:  It&apos;s not mentioned in most commentaries on preg_match().  But it does something very important:  It says that the &quot;$&quot; operator matches the end of the string, not the first newline embedded within it.&lt;br /&gt;&lt;br /&gt;This means that this simple-looking code has a huge, huge security vulnerability, a gaping hole big enough for a dragon to fly through:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;$page = $_GET[&apos;page&apos;];&lt;br /&gt;if (preg_match(&quot;/^[a-zA-Z0-9_]+$/&quot;, $page)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... do some stuff with $page, which has been checked and found safe ...&lt;br /&gt;}&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Don&apos;t see the hole?  You&apos;re not alone.  It&apos;s perfectly-reasonable code that checks to make sure that the incoming parameter &quot;page&quot; is a C-like identifier --- doesn&apos;t it?&lt;br /&gt;&lt;br /&gt;Turns out that it doesn&apos;t do that at all.  This code will allow &quot;apple&quot; through and &quot;apple2&quot; through...  and it&apos;ll also allow &quot;apple2\n@^#$&quot; through and &quot;x\n&amp;lt;script&amp;gt;Insert evil code here&amp;lt;/script&amp;gt;&quot; through, because the &quot;$&quot; operator will match any newline.  If a malicious attacker were to feed a newline into this script, he could insert any characters he wanted after that newline and they&apos;d go right through.&lt;br /&gt;&lt;br /&gt;The right way to code it is this:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;$page = $_GET[&apos;page&apos;];&lt;br /&gt;if (preg_match(&quot;/^[a-zA-Z0-9_]+$/D&quot;, $page)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... do some stuff with $page, which has been checked and found safe ...&lt;br /&gt;}&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;The all-important &quot;D&quot; modifier on the end says, &quot;Match the whole string, not just up to but not including the first newline.&quot;  Without it, an attacker can potentially inject anything he wants to into your variables, bypassing your checks.  Nasty.&lt;br /&gt;&lt;br /&gt;And this isn&apos;t just a PHP problem, either.  Anything using the PCRE library to process regular expressions is a potential victim --- Python, I&apos;m looking at you too, and I wouldn&apos;t be surprised if Ruby were also a victim here.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;b&gt;The second one I ran into is a PHP-only issue,&lt;/b&gt; which is that the $_SERVER[&apos;PHP_SELF&apos;] and $_SERVER[&apos;HTTP_HOST&apos;] parameters are wildly, terribly unsafe to use.  In fact, many security advocates are generally now recommending that people avoid using $_SERVER whenever possible.  Which, of course, it often isn&apos;t, but that&apos;s beside the point.&lt;br /&gt;&lt;br /&gt;The issue here is that PHP_SELF and HTTP_HOST &lt;i&gt;come from the client&lt;/i&gt; and aren&apos;t generated by the web server itself.  Which means that a suitably-nasty client can insert all sorts of unpredictable stuff into those, some of which will definitely break your code.  This is discussed much better &lt;a href=&quot;http://blog.phpdoc.info/archives/13-XSS-Woes.html&quot;&gt;here&lt;/a&gt;, if you want to study it in depth.&lt;br /&gt;&lt;br /&gt;The upshot is that in your code, you should never use the variables on the left below and always use the variables on the right:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold; color: rgb(128, 0, 0); text-decoration: line-through;&quot;&gt;PHP_SELF&lt;/span&gt;  ----&amp;gt;  &lt;span style=&quot;font-weight: bold; color: rgb(0, 102, 0);&quot;&gt;REQUEST_URI&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold; color: rgb(128, 0, 0); text-decoration: line-through;&quot;&gt;HTTP_HOST&lt;/span&gt;  ----&amp;gt;  &lt;span style=&quot;font-weight: bold; color: rgb(0, 102, 0);&quot;&gt;SERVER_NAME&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;As usual, you should never, ever, ever trust HTTP_USER_AGENT, because that can be (and often is) readily spoofed.  DOCUMENT_ROOT is marginally reliable, as it comes straight from the server&apos;s httpd.conf file.  SCRIPT_FILENAME is relatively safe, but often not useful; and SCRIPT_NAME should be avoided because it often isn&apos;t what you think it is (on a server that uses PHP in CGI mode, it points to the PHP binary, not to your script).&lt;br /&gt;&lt;br /&gt;Again, mishandling these can allow an attacker to inject nasty things into your variables that you don&apos;t expect to be there.&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;These holes now are &lt;i&gt;fixed&lt;/i&gt; on the sites I maintain (including &lt;a href=&quot;http://www.thewotch.com&quot;&gt;the Wotch&lt;/a&gt;), so don&apos;t bother trying to take advantage of them.  But before a few hours ago, they were there, which just goes to show how difficult web security can be:  By all measures, I&apos;m an expert --- I have a degree in computer science, I&apos;ve been coding for 23 years, and I speak PHP very fluently --- and I still made these mistakes.  So be careful when building web sites, folks, and if you&apos;re not sure what you&apos;re doing, leave the code to the experts (who at least know how to fix these problems when they learn about &apos;em).</description>
  <comments>http://phantom-inker.livejournal.com/7942.html</comments>
  <category>coding</category>
  <category>cmxpress</category>
  <category>php</category>
  <lj:mood>exhausted</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/7704.html</guid>
  <pubDate>Fri, 22 Feb 2008 19:31:39 GMT</pubDate>
  <title>On Commissions and Requests</title>
  <link>http://phantom-inker.livejournal.com/7704.html</link>
  <description>It&apos;s been asked (again) why I don&apos;t take commissions and don&apos;t do requests.  So I think I&apos;d better boil this down one more time.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;font color=&quot;#993300&quot;&gt;&lt;b&gt;Commissions:&lt;/b&gt;&lt;/font&gt;&lt;/u&gt;  To put it bluntly, you couldn&apos;t afford it.  Not because the art&apos;s so wonderful, but simply because it takes me hours and hours and hours to do a typical picture.  Lineart often takes four to ten hours, and a finished colored work can be anywhere from twenty to sixty hours.  At even ten bucks an hour, I&apos;d have to charge anywhere from $200 to $600 for a finished work, and that&apos;s far outside the price range of most potential commissioners --- especially for all-digital artwork where you don&apos;t even get a canvas in the mail for your money.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;font color=&quot;#993300&quot;&gt;&lt;b&gt;Requests:&lt;/b&gt;&lt;/font&gt;&lt;/u&gt;  I usually have plenty of ideas of my own, for one thing, and for another, most ideas that have been suggested don&apos;t inspire me.  My muse is fickle, and if she doesn&apos;t get inspired, I don&apos;t draw:  It&apos;s that simple.  You can propose a thousand ideas, but if none of them strike me, it just won&apos;t happen.  Sorry.  So to save you the embarrassment of being turned down a thousand times in a row, I just say upfront, &quot;No requests.&quot;&lt;br /&gt;&lt;br /&gt;That&apos;s it.  &lt;font color=&quot;#993300&quot;&gt;&lt;u&gt;&lt;b&gt;No commissions&lt;/b&gt;&lt;/u&gt;&lt;/font&gt; because you can&apos;t afford them, and &lt;u&gt;&lt;font color=&quot;#993300&quot;&gt;&lt;b&gt;no requests&lt;/b&gt;&lt;/font&gt;&lt;/u&gt; because my muse won&apos;t like them anyway.&lt;br /&gt;&lt;br /&gt;But, hey, if ya got a few hundred bucks burning a hole in your pocket and you&apos;re just &lt;i&gt;dying&lt;/i&gt; to get a PI original, maybe we can still talk ;-)</description>
  <comments>http://phantom-inker.livejournal.com/7704.html</comments>
  <category>artwork</category>
  <category>commissions</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/7454.html</guid>
  <pubDate>Mon, 21 Jan 2008 19:21:04 GMT</pubDate>
  <title>Antivirus Software Sucks</title>
  <link>http://phantom-inker.livejournal.com/7454.html</link>
  <description>&lt;p&gt;Okay, I&apos;m getting pissed.&lt;/p&gt;

&lt;p&gt;I just uninstalled my antivirus program (&lt;a href=&quot;http://www.kaspersky.com&quot;&gt;Kaspersky AntiVirus Trial Version&lt;/a&gt;) and it took a very large percentage of my computer&apos;s functionality with it when I did.  Everything worked fine yesterday before I uninstalled it, and now --- well, now it might be simpler just to reformat the thing and start over:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;b&gt;The Windows login screen is borked.&lt;/b&gt;  Clicking on names to login does nothing; you have to hit Ctrl+Alt+Del twice to get to the old login screen and login from there.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;

&lt;li&gt;&lt;b&gt;The mouse is borked.&lt;/b&gt;  I have a six-button mouse that now thinks it&apos;s a two-button mouse no matter what mouse drivers I have installed.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;

&lt;li&gt;&lt;b&gt;The UI is borked.&lt;/b&gt;  Clicking on windows to bring them forward often doesn&apos;t work, and neither does the taskbar and usually the only reliable way to switch between applications now is Alt+Tab (and even that doesn&apos;t always work).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;

&lt;li&gt;&lt;b&gt;The software is borked.&lt;/b&gt;  Sure, some stuff runs, but a lot of the most essential applications I use, like Firefox and CorelDRAW, now have weird glitches --- like in CorelDRAW, I can use all of the tools --- except the critical &lt;i&gt;select&lt;/i&gt; tool, which makes the entire package now utterly useless.  It&apos;s like having a word processor that lets you type text, but that prohibits you from changing anything you&apos;ve already typed in the document.&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;I &lt;i&gt;hate&lt;/i&gt; antivirus software.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;I &lt;i&gt;hate&lt;/i&gt; antivirus vendors.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;It wasn&apos;t always this way.  Once upon a time, an antivirus program was something you ran at your leisure, and it would search, find things, and then go away.  No intrusion, no logos, no blasting alerts in your face, no hooking its tendrils into the core of the operating system.&lt;/p&gt;

&lt;p&gt;But faced with declining revenues and declining interest, every one of the antivirus vendors now installs a package that is brutal, gargantuan, dictatorial, and, whether you ask for it or not, sinks its hooks into every last corner of the OS.  It&apos;s not just Kaspersky --- I&apos;ve seen the same exact behavior (on other computers, thank God) from McAfee, Norton, Trend Micro, Panda --- they &lt;i&gt;all&lt;/i&gt; uniformly suck.&lt;/p&gt;

&lt;p&gt;So, AV vendors, you want to mollify me?  I&apos;ve been in the computer industry longer than many of you have, and I have expectations.  If you want a thumbs-up from me, here&apos;s the criteria:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You add or modify a single file in &lt;tt&gt;C:\Windows&lt;/tt&gt; or any subdirectory under it?  &lt;b&gt;You fail.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;You may add &lt;b&gt;ONE&lt;/b&gt; key to the Registry under &lt;tt&gt;HKLM\Software&lt;/tt&gt; and &lt;tt&gt;HKCU\Software&lt;/tt&gt;, but if you add or change anything outside that key, &lt;b&gt;you fail&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;You may add &lt;b&gt;ONE&lt;/b&gt; directory under &lt;tt&gt;C:\Program Files&lt;/tt&gt;, and you may not place anything executable --- EXEs, DLLs, OCXs, you name it --- anywhere other than that directory.  You alter or replace any other EXEs or DLLs anywhere else?  &lt;b&gt;You fail.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;You may add &lt;b&gt;ONE&lt;/b&gt; directory under &lt;tt&gt;&lt;i&gt;[username]&lt;/i&gt;\Application Data&lt;/tt&gt; if you need to store configuration files somewhere.  Store them anywhere else, or alter files anywhere else?  &lt;b&gt;You fail.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;You may not &quot;call home&quot;.  No exceptions.  If you call home, &lt;b&gt;you fail&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;You may not use system hooks, API hooks, or input hooks of any kind, no exceptions.  If you hook anything, no matter how temporary the hook, &lt;b&gt;you fail&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;You may not monitor my actions, for good or for evil.  If you monitor even a single byte, &lt;b&gt;you fail&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;I will tolerate false negatives, but not false positives.  If you give me a false positive, &lt;b&gt;you fail&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;If you run without me explicitly asking you to run, &lt;b&gt;you fail&lt;/b&gt;.  No exceptions.&lt;/li&gt;
&lt;li&gt;If I cannot manually uninstall you by simply deleting your single directory like any other application, &lt;b&gt;you fail&lt;/b&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, antivirus vendors, you want my thumbs-up?  That&apos;s what it takes.  There&apos;s not a current antivirus product on the market that even comes &lt;i&gt;close&lt;/i&gt; to meeting those criteria --- most can&apos;t even meet two or three of those criteria, much less all of them.  Hell, by those criteria, &lt;i&gt;Notepad&lt;/i&gt; is a better antivirus program than any current antivirus software.  If you want my thumbs-up, those are my rules.  They&apos;re not hard rules to meet --- unless you don&apos;t give a flying f*** about your customers.&lt;/p&gt;

&lt;p&gt;Which, I think, pretty well explains most of the current antivirus software on the market.&lt;/p&gt;</description>
  <comments>http://phantom-inker.livejournal.com/7454.html</comments>
  <category>antivirus</category>
  <category>windows</category>
  <lj:mood>pissed off</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/7277.html</guid>
  <pubDate>Tue, 11 Dec 2007 08:04:44 GMT</pubDate>
  <title>Sheer Exhaustion</title>
  <link>http://phantom-inker.livejournal.com/7277.html</link>
  <description>&lt;b&gt;Well, folks, on Saturday (that&apos;s a mere four days from now by my clock), I&apos;ll be moving.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It&apos;s a big move, in that my fiancée, Songbird, and I, are moving to a new apartment together.&lt;br /&gt;&lt;br /&gt;All of my life is packed in boxes right now, from the credit-card bill I paid last week to the book of Christmas carols a six-year-old boy received and then kept for another twenty-five years.  It&apos;s a strange thing to have your life compressed down into countable units, to say, everything that defines me except for what&apos;s in my head is sitting in a Tetris-shaped pile on the floor, awaiting large men to whisk it away and my past, my present, and my future with it.&lt;br /&gt;&lt;br /&gt;Maybe that&apos;s a little too deep.  What can I say:  I&apos;m exhausted.&lt;br /&gt;&lt;br /&gt;The packing isn&apos;t done yet, either.&lt;br /&gt;&lt;br /&gt;We&apos;re moving to an apartment complex about a half hour away, and it&apos;s a nice place, with good nearby amenities, ready access to public transportation, a reasonable driving distance to Songbird&apos;s job, and a nice little office for my work.  I&apos;ve been here for eight years now, almost eight years on the dot since graduating college, and I&apos;ve felt a little like I was in a holding pattern the whole time, neither child nor adult, neither student nor salaryman, despite making a reasonable income and not being in any kind of school.&lt;br /&gt;&lt;br /&gt;I wonder at what point you go from being a boy to being a man.  I&apos;m certain that in elementary school and middle school, I was just a boy, but somewhere after that I evolved into just &quot;a guy,&quot; and I think I&apos;m still waiting for that next step where Mr. Name actually sounds normal instead of a phrase referring to my father.  I don&apos;t know if this move will do that, but it feels like it might.&lt;br /&gt;&lt;br /&gt;Or maybe getting married will.  We&apos;ll find out in ten months...&lt;br /&gt;&lt;br /&gt;Anyway, I&apos;m exhausted tired, and still haven&apos;t finished packing, and have four days of semi-coherent emboxing to perform before I can consider myself moved, followed by an equal quantity of imboxing (ain&apos;t English grand?).  I apologize if this posting was less lucid than most of my writing; it&apos;s 3 AM and I&apos;ve been running on very little sleep lately.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The upshot is that this week&apos;s and next week&apos;s &lt;i&gt;Caity&apos;s World&lt;/i&gt; installments will likely be delayed due to circumstances way, way, &lt;i&gt;way&lt;/i&gt; psychotically beyond my control.  Fear not, though:  The story will continue!&lt;/b&gt;</description>
  <comments>http://phantom-inker.livejournal.com/7277.html</comments>
  <category>marriage</category>
  <category>growing up</category>
  <category>caity&apos;s world</category>
  <category>moving</category>
  <category>songbird</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/6268.html</guid>
  <pubDate>Wed, 21 Nov 2007 16:33:30 GMT</pubDate>
  <title>Quickie CMXpress progress update</title>
  <link>http://phantom-inker.livejournal.com/6268.html</link>
  <description>Okay, so I don&apos;t have too much new to say about CMXpress, but I thought it&apos;d be nice to show off a few of the handful of new and changed things in it, especially since I get to show off the Wotch&apos;s current status page.  Here&apos;s a screenshot that gives you about 90% of what&apos;s new all at once:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href=&quot;http://img.photobucket.com/albums/v63/phantom-inker/cmxpress/cmxpress_scrnshot8.png&quot;&gt;&lt;img src=&quot;http://smg.photobucket.com/albums/v63/phantom-inker/cmxpress/th_cmxpress_scrnshot8.png&quot; width=&quot;160&quot; height=&quot;131&quot; alt=&quot;CMXpress screenshot&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;Here&apos;s what&apos;s new, in short:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Admin pages with a modern theme!  That&apos;s right, folks, the old flat-shaded &apos;90s Macintosh look is out, and a shiny new orange-and-blue theme is in!  Functionality is no less, and the software isn&apos;t significantly slower, so all hail the shiny and new!  (Admin-page themes are not swappable, at least not in the current design.  They might be in a later version, I suppose, but not for now.)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tip-of-the-day to help remind you of things you should remember to do or things you might not already know about CMXpress or (web)comics in general.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Artists&apos; comments (not shown) is about 80% done now, from its former ten-ish percent as of the last posting.  A lot of progress there, but the remaining 20% is gonna be a bear, since it&apos;s very AJAX-heavy.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Personal settings (not shown) allow individual administrators to set personal preferences for the admin pages, like how many comics you&apos;d like to see in a comic gallery or whether you&apos;d like to see tips-of-the-day.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;And last, but not least, there&apos;s the &quot;events&quot; feature, which congratulates you on having reached significant milestones.  It existed in the last announcement, but as you can see, &lt;a href=&quot;http://www.thewotch.com&quot;&gt;the Wotch&lt;/a&gt; has reached its 5th birthday today, so a &lt;b&gt;big hearty congratulations to Anne and Robin on reaching five years!&lt;/b&gt;</description>
  <comments>http://phantom-inker.livejournal.com/6268.html</comments>
  <category>cmxpress</category>
  <lj:music>Super Mario Galaxy music :D</lj:music>
  <media:title type="plain">Super Mario Galaxy music :D</media:title>
  <lj:mood>chipper</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/6074.html</guid>
  <pubDate>Fri, 02 Nov 2007 05:53:17 GMT</pubDate>
  <title>CMXpress Progress Report</title>
  <link>http://phantom-inker.livejournal.com/6074.html</link>
  <description>Okay, so here&apos;s what we&apos;re up to.  The official &lt;a href=&quot;http://www.mycmxpress.org&quot;&gt;CMXpress homepage&lt;/a&gt; is always reliable for the latest statistics, but as of midnight, November 1, 2007, this is what we&apos;re up to.  These are the completion levels of the code, more-or-less:&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/font&gt; &lt;ul style=&quot;margin-top: 0em;&quot;&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;strike&gt;Core page renderer&lt;/strike&gt; (100%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;strike&gt;Core admin system&lt;/strike&gt; (100%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;strike&gt;Database subsystem&lt;/strike&gt; (100%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;strike&gt;Security subsystem&lt;/strike&gt; (100%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;strike&gt;Template subsystem&lt;/strike&gt; (100%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;strike&gt;Plugin subsystem&lt;/strike&gt; (100%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;Standard plugins (85%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;strike&gt;News archives&lt;/strike&gt; (100%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;Comic archives (70%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;Custom page renderer (95%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;Search system (20%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;Admin: Comic mgt. (90%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;strike&gt;Admin: News&lt;/strike&gt; (100%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;Admin: Artist cmts. (10%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;Admin: Search (10%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;Admin: Custom pages (10%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;Admin: Site (75%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;Admin: Users (80%)&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;Installer (0%)&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt; And this is how much code there is in this thing.  (If you&apos;re thinking of writing your own Web 2.0 content-management engine, this ought to give you an idea of the kind of work that&apos;s involved.)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;563 kb : 15,753 lines : PHP
 87 kb :  2,501 lines : Javascript (custom for CMXpress)
 80 kb :  3,652 lines : CSS
 21 kb :    592 lines : HTML templates
 32 kb :    645 lines : CMXpress documentation (very minimal at present)
 35 kb :                GIF, JPEG, PNG images (custom for CMXpress)

 89 kb :  3,504 lines : BB code string parser 0.3.1 (PHP library)
333 kb :  9,982 lines : Smarty 2.6.0 (PHP library)
 96 kb :  3,276 lines : Prototype 1.5.1.1 (Javascript library)
140 kb :  4,030 lines : script.aculo.us 1.7.1-b3 (Javascript library)
 64 kb :  1,850 lines : Window 1.3 (Javascript library)
 11 kb :    308 lines : Misc. Javascript libraries (sprintf, Tab control)
  8 kb :    395 lines : Window CSS
 23 kb :                Window GIF and PNG images&lt;/pre&gt;&lt;br /&gt;Yep, that&apos;s a lot of code, with more yet to come.  I&apos;d estimate the overall completion level of the project at around 75%, give or take a bit.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Okay, numbers are nice, but new screenshots are more fun! :D&lt;br /&gt;&lt;br /&gt;Here we have the newly-completed news-management module, in two different configurations.  Most of the administrative stuff in CMXpress is designed so that you can look at your data from a variety of different angles, and &quot;News&quot; is no exception.  In the first screenshot, we have each posting in short form, and in the second screenshot, we&apos;re correlating news postings to whichever comic was posted closest to the same date.  Cool, huh?&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://smg.photobucket.com/albums/v63/phantom-inker/cmxpress/?action=view&amp;amp;current=cmxpress-scrnshot4.png&quot;&gt;&lt;img width=&quot;160&quot; height=&quot;92&quot; border=&quot;0&quot; src=&quot;http://smg.photobucket.com/albums/v63/phantom-inker/cmxpress/th_cmxpress-scrnshot4.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://smg.photobucket.com/albums/v63/phantom-inker/cmxpress/?action=view&amp;amp;current=cmxpress-scrnshot5.png&quot;&gt;&lt;img width=&quot;160&quot; height=&quot;96&quot; border=&quot;0&quot; src=&quot;http://smg.photobucket.com/albums/v63/phantom-inker/cmxpress/th_cmxpress-scrnshot5.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://smg.photobucket.com/albums/v63/phantom-inker/cmxpress/?action=view&amp;amp;current=cmxpress-scrnshot6.png&quot;&gt;&lt;img width=&quot;160&quot; height=&quot;106&quot; border=&quot;0&quot; src=&quot;http://smg.photobucket.com/albums/v63/phantom-inker/cmxpress/th_cmxpress-scrnshot6.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://smg.photobucket.com/albums/v63/phantom-inker/cmxpress/?action=view&amp;amp;current=cmxpress-scrnshot7.png&quot;&gt;&lt;img width=&quot;160&quot; height=&quot;103&quot; border=&quot;0&quot; src=&quot;http://smg.photobucket.com/albums/v63/phantom-inker/cmxpress/th_cmxpress-scrnshot7.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note that the &quot;Delete&quot; button you see there is safer than it looks:  Both news postings and comics don&apos;t simply vanish when you delete them; they simply get moved to the trash can.  At any time, you can empty the trash and destroy them for real, or pull them back out, just like managing files on your desktop.  CMXpress is designed from the perspective that its average user isn&apos;t likely to be a computer guru, and to that end, is designed to be safe and comprehensible for anybody who&apos;s even a little web-saavy.&lt;br /&gt;&lt;br /&gt;The third screenshot is from the arc-management module, which lets you organize your comics into larger sets.  Yes, we&apos;re in the process of using drag-and-drop to rearrange the arcs in this screenshot.  Drag-and-drop is cool and easy to use :D&lt;br /&gt;&lt;br /&gt;The fourth screenshot shows the user-management module.  CMXpress is a fully secure multiuser system, since many comics are managed by two or three people, and allows each user to be assigned different rights and access levels.  You can even grant limited comic-management rights by story arc, which is useful if you&apos;re going to have a guest artist provide filler:  The guest artist can be allowed to post their comics directly, but can still be prohibited from altering any of the comics you&apos;ve posted.&lt;br /&gt;&lt;br /&gt;What&apos;s next?  Artist comments have to be finalized, and some of the menu-management stuff has to be added, and the initial template has to be finished off.  Once that&apos;s done, we can roll this out on the &lt;a href=&quot;http://www.thewotch.com&quot;&gt;Wotch&lt;/a&gt; site and see how well it works under a heavy load of visitors (I expect it&apos;ll perform well).&lt;br /&gt;&lt;br /&gt;After the Wotch, assuming there are no major glitches, I need to build a simple installer, and then we&apos;ll be rolling it out on &lt;a href=&quot;http://www.crossworlds.ws&quot;&gt;Crossworlds&lt;/a&gt;, and after Crossworlds, &lt;a href=&quot;http://cheer.thewotch.com&quot;&gt;Cheer!&lt;/a&gt;.  If everything goes well with those three sites, then I&apos;ll open up a limited beta-testing program (a couple dozen people or so) to try to crush any remaining bugs in it and get some initial site templates built so that it can come prepackaged with a few so that true newbies can get a new webcomic up-and-rolling in a matter of minutes, no coding necessary.  Sometime around early 2008, CMXpress should be available to the public, and as I said before, it&apos;ll be &lt;a href=&quot;http://www.opensource.org/licenses/bsd-license.php&quot;&gt;100% free to use and abuse&lt;/a&gt; as you see fit.</description>
  <comments>http://phantom-inker.livejournal.com/6074.html</comments>
  <category>cmxpress</category>
  <lj:music>Best of Billy Joel</lj:music>
  <media:title type="plain">Best of Billy Joel</media:title>
  <lj:mood>content</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/5801.html</guid>
  <pubDate>Fri, 28 Sep 2007 15:28:19 GMT</pubDate>
  <title>CMXpress</title>
  <link>http://phantom-inker.livejournal.com/5801.html</link>
  <description>I&apos;ve been spending a lot of my time developing a piece of software called &lt;a href=&quot;http://www.mycmxpress.org&quot;&gt;CMXpress&lt;/a&gt;, a package which is designed for publishing webcomics.  (Pronounce it like &quot;Com-express&quot; or &quot;Comics press&quot;.)&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;http://mycmxpress.org/cmxpress-small.png&quot; alt=&quot;CMXpress Logo&quot; /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I&apos;ve actually been working on this thing for years, depending on how you look at it:  &lt;a href=&quot;http://www.thewotch.com&quot;&gt;The Wotch&lt;/a&gt; runs a (much) older version of the same software, and we&apos;ve gotten a lot of requests there by other people to let them use our software on their site.  For most of its history, the Wotch&apos;s software hasn&apos;t really been appropriate for other sites:  The administrative side was ugly as sin, and much of the code behind the front page was custom code for the Wotch site:  It simply wouldn&apos;t work on other sites.&lt;br /&gt;&lt;br /&gt;But the demand is there, since there&apos;s not really another really sophisticated, professional-grade webcomic-publishing package out there.  There&apos;s iStrip, but that feels more like a hacky student project than a professional software package, and as of a year ago, it&apos;s been &lt;a href=&quot;http://sourceforge.net/forum/forum.php?forum_id=608197&quot;&gt;officially abandoned&lt;/a&gt;.  You could publish with a provider like &lt;a href=&quot;http://www.drunkduck.com&quot;&gt;DrunkDuck&lt;/a&gt; or &lt;a href=&quot;http://www.comicgenesis.com&quot;&gt;ComicGenesis&lt;/a&gt;, but those don&apos;t help much if you want to run your own site, and from what I&apos;ve heard, the administrative systems there aren&apos;t all that great either.  There are addon packages for things like &lt;a href=&quot;http://drupal.org/&quot;&gt;Drupal&lt;/a&gt;, but that&apos;s not really designed for the specific (and I believe &lt;i&gt;unique&lt;/i&gt;) needs of webcomics.  There&apos;s no good, open-source, professional-grade webcomic-publishing package.  Yet.&lt;br /&gt;&lt;br /&gt;As long as Anne and Robin keep writing and drawing the &lt;i&gt;Wotch&lt;/i&gt; comics, they need &lt;i&gt;something&lt;/i&gt; to power their site, and since I&apos;m the head programmer around there, it&apos;s my responsibility to make it something good.  That&apos;s why I&apos;ve taken the backend there, given it a &lt;i&gt;massive&lt;/i&gt; overhaul, and renamed it CMXpress.  They&apos;re not using the new version yet, but they will be soon, probably by the end of October.  &lt;i&gt;The Wotch&lt;/i&gt; gets tens of thousands of readers every day, which means that CMXpress is gonna go through some pretty heavy testing before it ever gets released to the public.  Actually, a lot of it already &lt;i&gt;has&lt;/i&gt; gone through heavy testing, but even so, you&apos;re only gonna see it once it&apos;s had a chance to get most of the bugs worked out.&lt;br /&gt;&lt;br /&gt;The three biggest foci (that&apos;s plural &quot;focus,&quot; folks: check your dictionary) in CMXpress&apos;s design are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Security.&lt;/b&gt;  Webcomics are a major mega-high-profile target for people who like to hack stuff, and I&apos;ve put every bit of my two decades of experience into this code.  Database calls are all carefully protected against injections; all I/O is wrapped and checked with calls like htmlspecialchars() and preg_match(), all necessary web requests are checked for XSS and CSRF attacks, and generally the software is just plain paranoid.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Ease of use.&lt;/b&gt;  Most webcomic authors know computers about as well as I know rap music:  Not at all.  CMXpress is designed with a hefty dose of Web-2.0 and AJAX and cool clicky-draggy-droppy stuff so that it &lt;i&gt;feels &lt;/i&gt;easy to use.  The admin system &lt;i&gt;looks&lt;/i&gt; like a web site, but it really functions a lot closer to an application on your computer.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Customizability.&lt;/b&gt;  It&apos;s your site, not mine, which means I don&apos;t get to decide how your site looks.  The front-end for CMXpress is built around a sophisticated templates-and-plugins system, which allows you to pick (literally) any design you want for your site.  CMXpress does the grunt work, and if you want your site to look snazzy and cool or plain and ugly, that&apos;s your responsibility.  I&apos;m hoping that by the end, some people will contribute some initial style templates so that the system offers some nice defaults out-of-the-box:  The standard one that CMXpress will come with is probably gonna be pretty plain, but you can readily alter the HTML and CSS and CMXpress will happily deal with whatever you come up with.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;CMXpress runs under PHP4 or PHP5, and requires MySQL 3 or newer, and GD 2.0 or newer (GD is a common PHP extension).  It&apos;s only been tested on &apos;nix servers (specifically Linux and Apache) and, for various reasons, probably will &lt;i&gt;not&lt;/i&gt; run as-is on a Windows+IIS server.  Sorry.  CMXpress&apos;s administrative system requires a reasonably new-ish browser:  IE 6+, Firefox 1.0+, Opera 9+, or Safari 1.2+.  The user-side stuff requires whatever minimum browser your site template requires:  If you design a template that&apos;s pure HTML 1.0, your site will run even in Lynx; in the case of &lt;i&gt;the Wotch&lt;/i&gt;, we&apos;re targeting the same list of browsers I just gave, just because IE 5 and Netscape 4.7 are really old and moldy these days and not worth trying to support.&lt;br /&gt;&lt;br /&gt;CMXpress will be released under the &lt;a href=&quot;http://www.opensource.org/licenses/bsd-license.php&quot;&gt;BSD open-source license&lt;/a&gt; when it&apos;s finally released.&amp;nbsp; It uses a number of other packages, including Prototype and script.aculo.us, Christian Seiler&apos;s BBcode parser, the Smarty template engine, Sebastian Gruhier&apos;s window library, the PEAR JSON encoder/decoder, and even some modified Nuvola icons.&amp;nbsp; All of these are also open-source, and are included with CMXpress.&amp;nbsp; (If you need to find &apos;em all, use Google; I don&apos;t feel like looking up all the links again right now.)&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#cccccc&quot;&gt;(&lt;b&gt;And now this is the place where I get to gripe about IE, which I&apos;ve been waiting to do this entire post.&lt;/b&gt;  IE sucks.  Do you hear me, Microsoft?  IE is the least reliable, least compatible, most bug-ridden of any of the browsers I&apos;ve been testing in.  It&apos;s genuinely &lt;i&gt;painful&lt;/i&gt; for me to have to see how IE mangled my code when all the other three browsers get it right, and there&apos;s a &lt;i&gt;lot&lt;/i&gt; of IE-specific bugfixes in CMXpress, I&apos;m sorry to say.  About the only bad thing I can say about Firefox is that it doesn&apos;t support &quot;inline-block,&quot; but IE has barfed on almost every line of CSS and Javascript in this thing.  Market leader my ass!  IE7 not only produces the &lt;i&gt;worst&lt;/i&gt; appearance of any of the browsers I test in, it also is hands-down the &lt;i&gt;slowest&lt;/i&gt; of the browsers I test in too!  Drag-and-drop for rearranging things is &lt;i&gt;almost&lt;/i&gt; unusable in IE7 --- you people should see how slick the Opera 9.5 beta handles that!  Clean up your collective act or get your butts out of the browser business, because you&apos;re patently, obviously, utterly clueless.  IE8 had better have a &lt;i&gt;usable&lt;/i&gt; layout engine, or I&apos;m coming over there and stapling a big sign to your foreheads that says, &quot;HASLAYOUT IS STUPID!&quot;  Er...  oy.  End of rant.)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Anyway, let&apos;s show some screenshots!  I snapped these just a short while ago of the CMXpress beta running on the &lt;i&gt;Wotch&lt;/i&gt; site.  There&apos;s a bit of work yet to do, but you can get a feel from these what it&apos;s gonna be like.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://img.photobucket.com/albums/v63/phantom-inker/cmxpress/cmxpress-scrnshot1.png&quot;&gt;&lt;img border=&quot;1&quot; align=&quot;middle&quot; src=&quot;http://img.photobucket.com/albums/v63/phantom-inker/cmxpress/cmxpress-scrnshot1-thumb.jpg&quot; title=&quot;Click to enlarge&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       &lt;a href=&quot;http://img.photobucket.com/albums/v63/phantom-inker/cmxpress/cmxpress-scrnshot2.png&quot;&gt;&lt;img border=&quot;1&quot; align=&quot;middle&quot; src=&quot;http://img.photobucket.com/albums/v63/phantom-inker/cmxpress/cmxpress-scrnshot2-thumb.jpg&quot; title=&quot;Click to enlarge&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       &lt;a href=&quot;http://img.photobucket.com/albums/v63/phantom-inker/cmxpress/cmxpress-scrnshot3.png&quot;&gt;&lt;img border=&quot;1&quot; align=&quot;middle&quot; src=&quot;http://img.photobucket.com/albums/v63/phantom-inker/cmxpress/cmxpress-scrnshot3-thumb.jpg&quot; title=&quot;Click to enlarge&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Well, so there ya have it.&amp;nbsp; Keeps me busy, if not employed.&amp;nbsp; But it&apos;s long overdue.&lt;/div&gt;&lt;/div&gt;</description>
  <comments>http://phantom-inker.livejournal.com/5801.html</comments>
  <category>cmxpress</category>
  <category>programming</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/5461.html</guid>
  <pubDate>Sat, 15 Sep 2007 19:10:14 GMT</pubDate>
  <title>Fun with biology and statistics</title>
  <link>http://phantom-inker.livejournal.com/5461.html</link>
  <description>When your hobby is designing mythical creatures, sometimes you can produce better results by injecting them with a solid dose of reality.  I often read up on all sorts of random biology stuff, from simple stuff like the names of horse breeds to weird obscure things like the design of a spider&apos;s cardiovascular system (and yes, it&apos;s unusual).  One question that&apos;s often bugged me is:  &lt;b&gt;What is the mass of a centaur?&lt;i&gt;&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;It seems like a simple enough question at first, but it really isn&apos;t all that easy.&lt;br /&gt;&lt;br /&gt;First you have to guess what kind of proportions to use; in my case, I use a relatively small horse body and a normal-size human body, and generally assume that the resulting creature would be about a foot taller than it would if it were fully human:  Males average about 6&apos;9&quot;, and females average about 6&apos;4&quot;.  Some other artists make them smaller, and some make them larger; I think that results in fairly believable proportions, though.&lt;br /&gt;&lt;br /&gt;Anyway, so today, I stumbled across &lt;a href=&quot;http://msis.jsc.nasa.gov/sections/section03.htm#Figure%203.3.7.3.1.2-1&quot;&gt;this gem at NASA&lt;/a&gt;, which takes the human body and breaks it down into various parts and then measures the mass of each part individually.  There&apos;s a &lt;i&gt;ton&lt;/i&gt; of other biometric stuff on that page, so I&apos;ll copy it down for you here (50th percentile --- the classic &quot;average&quot; male body):&lt;br /&gt;&lt;br /&gt;&lt;div align=&quot;center&quot;&gt;&lt;br /&gt;&lt;table border=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img width=&quot;150&quot; height=&quot;322&quot; src=&quot;http://msis.jsc.nasa.gov/images/Section03/Image110.gif&quot; alt=&quot;NASA diagram&quot; /&gt;&lt;/td&gt;&lt;td style=&quot;font-family: Arial,Helv,Helvetica,sans; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;&quot;&gt;&lt;b&gt;Total mass:&lt;/b&gt; 77.1 kg = 170 lbs = 100%&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Head:&lt;/b&gt; 0.44 kg = 1.0 lbs = 0.6%&lt;br /&gt;&lt;b&gt;2. Neck:&lt;/b&gt; 1.1 kg = 2.4 lbs = 1.4%&lt;br /&gt;&lt;b&gt;3. Thorax:&lt;/b&gt; 26.11 kg = 57.6 lbs = 33.8%&lt;br /&gt;&lt;b&gt;4. Abdomen:&lt;/b&gt; 2.5 kg = 5.5 lbs = 7.1%&lt;br /&gt;&lt;b&gt;5. Pelvis:&lt;/b&gt; 12.3 kg = 27.1 lbs = 16.0%&lt;br /&gt;&lt;b&gt;6. Upper arms:&lt;/b&gt; 2.5 kg = 5.5 lbs = 3.2%&lt;br /&gt;&lt;b&gt;7. Forearms:&lt;/b&gt; 1.45 kg = 3.2 lbs = 1.9%&lt;br /&gt;&lt;b&gt;8. Hands:&lt;/b&gt; 0.53 kg = 1.2 lbs = 0.7%&lt;br /&gt;&lt;b&gt;9. Hips:&lt;/b&gt; 3.64 kg = 8.0 lbs = 4.7%&lt;br /&gt;&lt;b&gt;10. Thighs:&lt;/b&gt; 6.7 kg = 14.8 lbs = 8.7%&lt;br /&gt;&lt;b&gt;11. Calves:&lt;/b&gt; 4.04 kg = 8.9 lbs = 5.2%&lt;br /&gt;&lt;b&gt;12. Feet:&lt;/b&gt; 1.01 kg = 2.2 lbs = 1.3%&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1..8 Upper body:&lt;/b&gt; 46.93 kg = 103.5 lbs = 60.9%&lt;br /&gt;&lt;b&gt;9..12 Lower body:&lt;/b&gt; 30.17 kg = 66.5 lbs = 39.1%&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1..7 Upper body, no pelvis:&lt;/b&gt; 34.63 kg = 76.3 lbs = 44.9%&lt;br /&gt;&lt;b&gt;8..12 Lower body with pelvis:&lt;/b&gt; 42.47 kg = 93.6 lbs = 55.1%&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;(Note that the numbers for paired body parts represent &lt;i&gt;both&lt;/i&gt; parts:  For example, one hand weighs only 0.265 kg, while two weigh 0.53 kg, which is the number in the table above.  NASA&apos;s figures, by the way, are the value in kilograms; the pounds and percent I computed myself, and have been rounded to one decimal place.)&lt;br /&gt;&lt;br /&gt;Here&apos;s the same information, only as a pie chart this time:&lt;br /&gt;&lt;br /&gt;&lt;div align=&quot;center&quot;&gt;&lt;br /&gt;&lt;table border=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img width=&quot;301&quot; height=&quot;229&quot; src=&quot;http://img.photobucket.com/albums/v63/phantom-inker/RelativeHumanMass.gif&quot; alt=&quot;Pie chart&quot; /&gt;&lt;/td&gt;&lt;td style=&quot;font-family: Arial,Helv,Helvetica,sans; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;&quot;&gt;&lt;b&gt;Total:&lt;/b&gt; 77.1 kg = 170 lbs = 100%&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Head:&lt;/b&gt; 0.44 kg = 1.0 lbs = 0.6%&lt;br /&gt;&lt;b&gt;2. Neck:&lt;/b&gt; 1.1 kg = 2.4 lbs = 1.4%&lt;br /&gt;&lt;b&gt;3. Thorax:&lt;/b&gt; 26.11 kg = 57.6 lbs = 33.8%&lt;br /&gt;&lt;b&gt;4. Abdomen:&lt;/b&gt; 2.5 kg = 5.5 lbs = 7.1%&lt;br /&gt;&lt;b&gt;5. Pelvis:&lt;/b&gt; 12.3 kg = 27.1 lbs = 16.0%&lt;br /&gt;&lt;b&gt;6. Upper arms:&lt;/b&gt; 2.5 kg = 5.5 lbs = 3.2%&lt;br /&gt;&lt;b&gt;7. Forearms:&lt;/b&gt; 1.45 kg = 3.2 lbs = 1.9%&lt;br /&gt;&lt;b&gt;8. Hands:&lt;/b&gt; 0.53 kg = 1.2 lbs = 0.7%&lt;br /&gt;&lt;b&gt;9. Hips:&lt;/b&gt; 3.64 kg = 8.0 lbs = 4.7%&lt;br /&gt;&lt;b&gt;10. Thighs:&lt;/b&gt; 6.7 kg = 14.8 lbs = 8.7%&lt;br /&gt;&lt;b&gt;11. Calves:&lt;/b&gt; 4.04 kg = 8.9 lbs = 5.2%&lt;br /&gt;&lt;b&gt;12. Feet:&lt;/b&gt; 1.01 kg = 2.2 lbs = 1.3%&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;(Apparently the human brain isn&apos;t all that heavy, at least as far as NASA&apos;s concerned.)&lt;br /&gt;&lt;br /&gt;So armed with this information, we can reliably say that the upper half of an average male centaur is probably about 80 pounds.&lt;br /&gt;&lt;br /&gt;But there&apos;s a lot of weight in the equine pelvis and thorax though, and more still in all four legs.  If we assume that the equine pelvis region weighs about the same as the entire humanoid part (since they seem to have about the same volume), and again assume similar body-proportion ratios to those above (which is admittedly a big assumption too), then we can make a (very) rough guesstimate at around 500 pounds for the equine part, which seems reasonable.&amp;nbsp; (We arrive at this by noticing that the human pelvis is about 1/3 of an 80-pound torso; so if the equine pelvis is equal to the 80-pound human torso, then the equine parts have about three times the mass of their human equivalents.&amp;nbsp; Admittedly, that&apos;s a pretty big jump, but &lt;a href=&quot;http://www.omafra.gov.on.ca/english/livestock/horses/facts/98-093.htm&quot;&gt;the resulting numbers don&apos;t seem too unreasonable&lt;/a&gt;, especially considering we&apos;re talking about a fairly small horse here.)&lt;br /&gt;&lt;br /&gt;So the total, then, is that &lt;span style=&quot;font-weight: bold;&quot;&gt;a 6&apos;9&quot;-tall average male centaur weighs about 600 pounds&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;a href=&quot;http://pediatrics.about.com/cs/growthcharts2/f/avg_wt_female.htm&quot;&gt;weight of an average human female&lt;/a&gt; is about 86% of that of an &lt;a href=&quot;http://pediatrics.about.com/cs/growthcharts2/f/avg_wt_male.htm&quot;&gt;average human male&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If that ratio holds in centaurs also, then &lt;span style=&quot;font-weight: bold;&quot;&gt;a 6&apos;4&quot;-tall average female centaur weighs about 520 pounds&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Starting at an average human male weight of 170 pounds, we can note that below about 145 pounds, you have an underweight man, and above about 215 you have an overweight man.&amp;nbsp; This suggests that a valid healthy weight range for a human male is the average weight plus or minus about 15%.&amp;nbsp; If the same holds true for centaurs, we can say that &lt;span style=&quot;font-weight: bold;&quot;&gt;the&lt;/span&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;6&apos;9&quot; average male centaur would be underweight at 510 pounds and overweight at 690 pounds&lt;/span&gt;.&amp;nbsp; &lt;span style=&quot;font-weight: bold;&quot;&gt;The 6&apos;4&quot; average female centaur would be underweight at 440 pounds and overweight at 600 pounds.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Of course, sadly, there aren&apos;t any centaurs out there to actually put on a scale and find all this out.&amp;nbsp; But the science (what little there is of it) seems reasonable enough, and it&apos;s definitely a better set of numbers than just pulling something random out of the air.</description>
  <comments>http://phantom-inker.livejournal.com/5461.html</comments>
  <category>centaurs</category>
  <lj:security>public</lj:security>
  <lj:reply-count>13</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/5131.html</guid>
  <pubDate>Fri, 31 Aug 2007 17:06:37 GMT</pubDate>
  <title>Clinton Angrily Denies Surgery</title>
  <link>http://phantom-inker.livejournal.com/5131.html</link>
  <description>&lt;b&gt;New York (AP)&lt;/b&gt;&amp;nbsp; A defiant Hillary Clinton today denied rumors that her overnight stay at New York&apos;s Metropolitan Hospital was for the purpose of breast enhancement surgery.&amp;nbsp; &quot;My breasts are fine,&quot; said Clinton.&amp;nbsp; &quot;I do not need implants.&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Clinton was scheduled to speak at a rally in Iowa on Tuesday, but canceled at the last minute.&amp;nbsp; Aides claimed that she had caught the flu; however, a photographer from &lt;i&gt;People&lt;/i&gt; magazine caught her leaving her New York apartment on Wednesday and entering Metropolitan Hospital.&amp;nbsp; Rumors began circulating about plastic surgery on popular Republican blogs, and a media frenzy began outside the hospital.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Clinton staff members initially declined comment.&amp;nbsp; However, Clinton herself spoke today to calm worried supporters.&amp;nbsp; &quot;I did not get breast enhancement surgery.&amp;nbsp; I did, in fact, have an outpatient plastic surgery operation performed by Dr. Milo Bergstein.&amp;nbsp; It was a testicular implant.&amp;nbsp; But not breast enhancement surgery.&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; When asked whether she would consider said surgery, Clinton responded, &quot;Let&apos;s focus on what happened here.&amp;nbsp; I had a testicular implant.&amp;nbsp; That&apos;s balls.&amp;nbsp; Not a boob job, okay?&amp;nbsp; I don&apos;t need breast enhancement surgery and definitely don&apos;t want it.&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Clinton was asked as to the purpose of her surgery.&amp;nbsp; &quot;Republicans have pinned me as weak on Iraq and national security.&amp;nbsp; I am not weak and never have been, and the best way to demonstrate that with balls.&amp;nbsp; Real balls.&amp;nbsp; I can now say unequivocally that I have bigger balls than they have, and I will never be weak on my foreign-policy stances.&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bill Clinton, attending the rally, was asked for comment.&amp;nbsp; &quot;It&apos;s no big deal,&quot; he said.&amp;nbsp; &quot;I support her decision fully.&amp;nbsp; We haven&apos;t schtupped since the &apos;90s anyway.&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Barack Obama was asked about Clinton&apos;s surgery during a campaign stop in Muncie, Indiana.&amp;nbsp; &quot;You&apos;ve gotta be kidding me,&quot; said Obama.&amp;nbsp; &quot;How the heck can I be tied in the polls with her?&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; In related political news, Obama&apos;s support dropped by two percentage points today when his campaign publicly denied that he was Tiger Woods.&amp;nbsp; &quot;Muffy and I are just devastated,&quot; said Bentley H. Tuffington III, a former Obama supporter from Southampton, New York.&amp;nbsp; &quot;Even if he was once poor, he was a respectable golfer, and we rather liked that.&amp;nbsp; He seemed like a wonderful candidate when he won the Green Jacket.&amp;nbsp; We feel like we don&apos;t know anything about him now.&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Asked about the Obama campaign&apos;s statement, a Clinton aide said, &quot;Just vote for Hillary!&amp;nbsp; She can be whatever you people want her to be!&amp;nbsp; Really!&amp;nbsp; Black, white, a golfer, a basketball player, male, female, good, evil, anything!&amp;nbsp; Just tell us what you want and she&apos;ll do it!&amp;nbsp; I bet Obama won&apos;t tell you that!&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; All 193 other Democratic presidential candidates declined comment.</description>
  <comments>http://phantom-inker.livejournal.com/5131.html</comments>
  <category>politics</category>
  <category>satire</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/4935.html</guid>
  <pubDate>Tue, 28 Aug 2007 23:29:25 GMT</pubDate>
  <title>Bush Announces Months Bill</title>
  <link>http://phantom-inker.livejournal.com/4935.html</link>
  <description>&lt;b&gt;Washington, D.C. (AP)&lt;/b&gt;&amp;nbsp; President George W. Bush today announced a new Senate resolution, cosponsored by Sens. Orrin Hatch (R., Utah) and Zell Miller (D., Georgia), that aims to ease the burden on General David Petraeus&apos;s forthcoming status report on the ongoing conflict in Iraq.&amp;nbsp; The bill, if passed, would create four new months between August 2007 and September 2007 to give Petraeus&apos;s report, in the words of Bush Administration spokesman Tony Snow, &quot;more time to gel.&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The four new months would be named &quot;Octember,&quot; &quot;Quatember,&quot; &quot;Pentember,&quot; and &quot;Larry.&quot;&amp;nbsp; The last was chosen by Bush over the Pentagon&apos;s preferred &quot;Hexember&quot; or &quot;Sexember&quot; because, said Snow, &quot;we felt &apos;sex&apos; was simply inappropriate, and &apos;hex&apos; sounded too much like witchcraft.&quot;&amp;nbsp; The Christian Coalition has already filed suit against the Administration, claiming that the name &quot;Pentember&quot; is also too strongly related to the occult.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Each of the proposed new four months will be thirty-one days long, despite the Pentagon&apos;s recommendation that &quot;Larry&quot; be only thirty days.&amp;nbsp; &quot;We felt that it was best to keep them uniform,&quot; said Snow, &quot;to make them easier to remember, and so that you don&apos;t have to change the rhyme.&amp;nbsp; It&apos;s only coincidence that they have the same number of days as the month with the President&apos;s birthday.&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The bill will require that the onset of autumn be accordingly delayed by four months.&amp;nbsp; When asked whether that was possible, the Union of Concerned Scientists declined comment.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; However, the bill already faces heavy opposition from another Senate resolution, proposed by Sens. Ted Kennedy (D., La-La Land), and Hillary Clinton (D., New York), which proposes that &quot;time shall be stopped until all United States forces are withdraw [sic] from Iraq.&quot;&amp;nbsp; When asked, Clinton declined comment, but Kennedy stated:&amp;nbsp; &quot;This bill guarantees that children will not die in vain on those rice patties and in those jungles.&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Petraeus declined comment on both bills, but an aide, speaking on condition of anonymity, said, &quot;I think they&apos;re all a bunch of frickin&apos; crazies in the Senate.&amp;nbsp; By the way, you wouldn&apos;t be willing to let me borrow that flak jacket, would you?&quot;</description>
  <comments>http://phantom-inker.livejournal.com/4935.html</comments>
  <category>politics</category>
  <category>satire</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://phantom-inker.livejournal.com/4624.html</guid>
  <pubDate>Sun, 26 Aug 2007 17:32:41 GMT</pubDate>
  <title>An English Lesson</title>
  <link>http://phantom-inker.livejournal.com/4624.html</link>
  <description>Since so many people seem confused about centaur-related terms, let me help you with your grammar, if I might:&lt;br /&gt;&lt;br /&gt;&quot;Centaur&quot; is typically the male term, yes, but it&apos;s also commonly used to describe the species too.  Specialized female forms of the word do exist, though:  If she were young, you could call her a &quot;centaurette&quot;; but the general female term is a &quot;centauress&quot;.&lt;br /&gt;&lt;br /&gt;So you can correctly say:&lt;br /&gt;&lt;br /&gt;&quot;He is a centaur.&quot;&lt;br /&gt;&quot;She is a centaur.&quot;&lt;br /&gt;&quot;She is a centauress.&quot;&lt;br /&gt;&quot;They are centaurs.&quot;&lt;br /&gt;&quot;That little girl is a centaurette.&quot;&lt;br /&gt;&lt;br /&gt;But you can&apos;t say:&lt;br /&gt;&lt;br /&gt;&quot;He is a centauress.&quot;  (! wrong gender)&lt;br /&gt;&quot;That woman is a centaurette.&quot;  (! wrong age)&lt;br /&gt;&lt;br /&gt;The term &quot;centauroid&quot;, meaning &quot;centaur-like&quot;, refers to any creature with four legs and two arms.  &quot;Centaura&quot; is a poor back-formation, occasionally used by uneducated writers to refer to a female centaur, but it should generally not be used:  If you must refer to a female, use &quot;centaur&quot; or &quot;centauress&quot; or &quot;centaurette&quot;, or &quot;mare&quot; or &quot;filly&quot; or &quot;woman&quot; or &quot;girl&quot;, depending on your circumstances.&lt;br /&gt;&lt;br /&gt;The suffix &quot;-taur&quot; is generally used in English to describe other non-horse half-human creatures:  Cat-taur, zebra-taur, wolf-taur, lion-taur, human-taur (a four-legged human), and unicorn-taur, among others.  (Note that the hyphen is often omitted from these.)  You may also occasionally see &quot;alicentaur&quot; and &quot;alicorntaur&quot; used --- these refer to a winged centaur and a winged unicorn-taur, respectively.&lt;br /&gt;&lt;br /&gt;If a centauroid character is otherwise horse-based but has cloven hooves or horns or a slender tail or some other minor modification, the character still qualifies under the classical term &quot;centaur&quot;, just like a drawing of a human girl with a tail is still basically a &quot;human&quot; character.&lt;br /&gt;&lt;br /&gt;Despite modern usage, the term &quot;centaur&quot; does not, in fact, have anything to do with horses, etymologically speaking:  It is derived from &lt;i&gt;ken-&lt;/i&gt;, meaning &quot;pierce&quot; or &quot;slay&quot;, and &lt;i&gt;-taur&lt;/i&gt;, meaning &quot;bull&quot;.  Centaurs were said by the Greeks to be wild hunters, riding horses (or possibly part horse), so adept at their riding that they could readily slay a bull.  At least, that&apos;s one explanation; there are several differing theories as to the true origin of the term.  Either way, the original form is a combination of &quot;slay&quot; and &quot;bull&quot;, and has nothing whatsoever to do with current usage.&lt;br /&gt;&lt;br /&gt;(This is why &quot;minotaur&quot;, despite having a &quot;-taur&quot; suffix, refers to a creature that is otherwise a man but has the head of a bull:  It is literally the &quot;bull of Minos&quot; and refers to a specific monster that was said to lurk in underground caverns on the Greek island of Minos.)  &lt;br /&gt;&lt;br /&gt;By the way, &quot;dryad&quot; is a term used by &lt;i&gt;Warcraft III&lt;/i&gt; and &lt;i&gt;World of Warcraft&lt;/i&gt; to refer to elven goat-based part-tree &apos;taurs; historically, it has just meant &quot;tree girl&quot;, and refers to a spirit of the trees in Greek mythology.&lt;br /&gt;&lt;br /&gt;Oh, one last note, on spelling:&amp;nbsp; In the word &quot;centaur&quot;, the &quot;A&quot; comes before the &quot;U&quot;, just like it does in the alphabet:&amp;nbsp; A &quot;centaur&quot; is a horse-legged person; and a &quot;centuar&quot; is a spelling error.&lt;br /&gt;&lt;br /&gt;And now, just for completeness:  In French you will see &quot;centaure&quot; and &quot;centaures&quot;; in Spanish you will see &quot;centauro&quot; and &quot;centauros&quot;; in German you will see &quot;zentaur&quot; and &quot;zentaurin&quot;; and in Japanese you will see &quot;ケンタウロス&quot; (literally, &quot;kentauros&quot;) and occasionally &quot;馬人&quot; (horse person) or &quot;馬男&quot; (horse man) or &quot;馬女&quot; (horse woman).&lt;br /&gt;&lt;br /&gt;So there you have it.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;(Please excuse my placement of punctuation relative to quotation marks: I was going for preciseness in terminology here and not necessarily fully-valid punctuational constructs.  That said, I&apos;ve often had a beef with the &quot;punctuation always goes before the quotation mark&quot; rule, because it&apos;s logically inconsistent, and can readily produce meaningless sentences.  I know that it&apos;s supposed to be correct to write this:  She is called a &quot;centauress.&quot;  But that can imply that the period is part of the term itself, and not a separate construct that terminates the sentence.  English rules have really let me down on this, so in this posting I used what I consider to be the more meaningful way to structure it, even if the proscriptive grammarians in the audience will cry foul.)&lt;br /&gt;&lt;hr /&gt;&lt;b&gt;&lt;br /&gt;Edit, August 30:&lt;/b&gt; Added mare, filly, woman, and girl into the sentence on recommended replacements, and also changed &quot;effete&quot; to &quot;adept,&quot; a rather embarrassing error that was pointed out to me by Don Simpson.</description>
  <comments>http://phantom-inker.livejournal.com/4624.html</comments>
  <category>english</category>
  <category>centaurs</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
</channel>
</rss>
