<?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>refusal computing</title>
  <link>http://aaronhawley.livejournal.com/</link>
  <description>refusal computing - LiveJournal.com</description>
  <lastBuildDate>Tue, 08 Sep 2009 06:40:38 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>aaronhawley</lj:journal>
  <lj:journalid>14167250</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <atom10:link rel='hub' href='http://pubsubhubbub.appspot.com/' />
  <image>
    <url>http://l-userpic.livejournal.com/68128516/14167250</url>
    <title>refusal computing</title>
    <link>http://aaronhawley.livejournal.com/</link>
    <width>48</width>
    <height>48</height>
  </image>

<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/26901.html</guid>
  <pubDate>Tue, 08 Sep 2009 06:40:38 GMT</pubDate>
  <title>Coding Emacs&apos;s M-x in Lisp</title>
  <link>http://aaronhawley.livejournal.com/26901.html</link>
  <description>&lt;p&gt;I have always wondered what terms stipulate whether an Emacs internal routine is written in Emacs Lisp or if it exists as a built-in and part of Emacs&apos;s C source code.  I have grown accustomed to how most core Emacs commands and functions, no matter how small, are written in Emacs Lisp.  There is no doubt a lot of Emacs that has to be written in C.&lt;/p&gt;

&lt;p&gt;I recently wanted to change how `&lt;kbd&gt;M-x&lt;/kbd&gt;&apos; works.  The command behind it is called `&lt;code&gt;execute-extended-command&lt;/code&gt;&apos;.  It is written in C.  This is disappointing for my desires to tinker, but not all together surprising either.  It is a pretty central piece of the Emacs infrastructure.&lt;/p&gt;

&lt;p&gt;To extend the `&lt;kbd&gt;M-x&lt;/kbd&gt;&apos; command, I didn&apos;t want to jump into having to write C code.  Although, it was a chance to practice compiling Emacs, and potentially debugging my extension to the command.  I wanted to avoid this development cycle, so I tried translating the C code into Emacs Lisp.  Given how cleanly written the Emacs sources are, it was not a very difficult task.  For extra cuteness, I even carried over the C comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use at your own risk&lt;/strong&gt;.  I would be interested in feedback on how this works for people, but redefining a central command like this could potentially create a lot of problems for your Emacs.  With that out of the way, I have used this for a few weeks without a problem.&lt;/p&gt;

&lt;p&gt;The block of &lt;a href=&quot;http://cvs.savannah.gnu.org/viewvc/emacs/emacs/src/keyboard.c?annotate=1.1010#l10537&quot;&gt;C code for defining &lt;code&gt;Fexecute_extended_command&lt;/code&gt;&lt;/a&gt; hasn&apos;t changed significantly over the last ten years, so the Emacs Lisp version I present below should work as a replacement with the last two major releases of Emacs -- versions 22 and 23.&lt;/p&gt;

    &lt;pre&gt;
&lt;span style=&quot;color: #cd0000;&quot;&gt;;; Based on Fexecute_extended_command in keyboard.c of Emacs.
&lt;/span&gt;&lt;span style=&quot;color: #cd0000;&quot;&gt;;; Aaron S. Hawley &amp;lt;aaron.s.hawley(at)gmail.com&amp;gt; 2009-08-24
&lt;/span&gt;(&lt;span style=&quot;color: #00cdcd; font-weight: bold;&quot;&gt;defun&lt;/span&gt; &lt;span style=&quot;color: #0000ee; font-weight: bold;&quot;&gt;execute-extended-command&lt;/span&gt; (prefixarg)
  &lt;span style=&quot;color: #00cd00;&quot;&gt;&quot;Read function name, then read its arguments and call it.

To pass a numeric argument to the command you are invoking with, specify
the numeric argument to this command.

Noninteractively, the argument PREFIXARG is the prefix argument to
give to the command you invoke, if it asks for an argument.&quot;&lt;/span&gt;
  (interactive &lt;span style=&quot;color: #00cd00;&quot;&gt;&quot;P&quot;&lt;/span&gt;)
  &lt;span style=&quot;color: #cd0000;&quot;&gt;;; The call to completing-read wil start and cancel the hourglass,
&lt;/span&gt;  &lt;span style=&quot;color: #cd0000;&quot;&gt;;; but if the hourglass was already scheduled, this means that no
&lt;/span&gt;  &lt;span style=&quot;color: #cd0000;&quot;&gt;;; hourglass will be shown for the actual M-x command itself.
&lt;/span&gt;  &lt;span style=&quot;color: #cd0000;&quot;&gt;;; So we restart it if it is already scheduled.  Note that checking
&lt;/span&gt;  &lt;span style=&quot;color: #cd0000;&quot;&gt;;; hourglass_shown_p is not enough,  normally the hourglass is not shown,
&lt;/span&gt;  &lt;span style=&quot;color: #cd0000;&quot;&gt;;; just scheduled to be shown.
&lt;/span&gt;  (&lt;span style=&quot;color: #00cdcd; font-weight: bold;&quot;&gt;let*&lt;/span&gt; ((hstarted (and (symbolp window-system)&amp;gt;
                        (eq void-text-area-pointer &apos;hourglass)))
         (saved-keys (this-command-keys-vector)) &lt;span style=&quot;color: #cd0000;&quot;&gt;;; ?\M-x
&lt;/span&gt;         (buf (concat 
               (&lt;span style=&quot;color: #00cdcd; font-weight: bold;&quot;&gt;cond&lt;/span&gt; ((eq prefixarg &apos;-)
                      &lt;span style=&quot;color: #00cd00;&quot;&gt;&quot;- &quot;&lt;/span&gt;)
                     ((and (consp prefixarg)
                           (= (car prefixarg) 4))
                      &lt;span style=&quot;color: #00cd00;&quot;&gt;&quot;C-u &quot;&lt;/span&gt;)
                     ((and (consp prefixarg)
                           (integerp (car prefixarg)))
                      (format &lt;span style=&quot;color: #00cd00;&quot;&gt;&quot;%d &quot;&lt;/span&gt; (car prefixarg)))
                     ((integerp prefixarg)
                      (format &lt;span style=&quot;color: #00cd00;&quot;&gt;&quot;%d &quot;&lt;/span&gt; prefixarg))
                     (t &lt;span style=&quot;color: #00cd00;&quot;&gt;&quot;&quot;&lt;/span&gt;))
               &lt;span style=&quot;color: #00cd00;&quot;&gt;&quot;M-x &quot;&lt;/span&gt;))
         (function (completing-read buf obarray &apos;commandp t nil
                                    &apos;extended-command-history)))
    (&lt;span style=&quot;color: #00cdcd; font-weight: bold;&quot;&gt;if&lt;/span&gt; hstarted (setq void-text-area-pointer &apos;hourglass))
    (&lt;span style=&quot;color: #00cdcd; font-weight: bold;&quot;&gt;if&lt;/span&gt; (and (stringp function)
             (= (length function) 0))
        (&lt;span style=&quot;color: #cd0000;&quot;&gt;error&lt;/span&gt; &lt;span style=&quot;color: #00cd00;&quot;&gt;&quot;No command name given&quot;&lt;/span&gt;)
      &lt;span style=&quot;color: #cd0000;&quot;&gt;;; Set this_command_keys to the concatenation of saved-keys and
&lt;/span&gt;      &lt;span style=&quot;color: #cd0000;&quot;&gt;;; function, followed by a RET.
&lt;/span&gt;      (setq saved-keys (vconcat saved-keys
                                function
                                [return]))
      (setq function (intern function)))
    (setq prefix-arg prefixarg)
    (setq this-command function)
    (command-execute function &apos;record saved-keys)
    &lt;span style=&quot;color: #cd0000;&quot;&gt;;; If enabled, show which key runs this command.
&lt;/span&gt;    (&lt;span style=&quot;color: #00cdcd; font-weight: bold;&quot;&gt;if&lt;/span&gt; (and (not (null suggest-key-bindings))
             (null executing-kbd-macro))
        &lt;span style=&quot;color: #cd0000;&quot;&gt;;; If the command has a key binding, print it now.
&lt;/span&gt;        (&lt;span style=&quot;color: #00cdcd; font-weight: bold;&quot;&gt;let&lt;/span&gt; ((bindings (where-is-internal function
                                           overriding-local-map t))
              (waited))
          &lt;span style=&quot;color: #cd0000;&quot;&gt;;; But first wait, and skip the message if there is input.
&lt;/span&gt;          (&lt;span style=&quot;color: #00cdcd; font-weight: bold;&quot;&gt;if&lt;/span&gt; (and (not (null bindings))
                   (not (vectorp bindings))
                   (eq (aref bindings 0) &apos;mouse-movement))
              &lt;span style=&quot;color: #cd0000;&quot;&gt;;; If this command displayed something in the echo area;
&lt;/span&gt;              &lt;span style=&quot;color: #cd0000;&quot;&gt;;; wait a few seconds, then display our suggestion message.
&lt;/span&gt;              (&lt;span style=&quot;color: #00cdcd; font-weight: bold;&quot;&gt;if&lt;/span&gt; (null (current-message))
                  (setq waited (sit-for 0))
                (&lt;span style=&quot;color: #00cdcd; font-weight: bold;&quot;&gt;if&lt;/span&gt; (numberp suggest-key-bindings)
                    (setq waited (sit-for suggest-key-bindings))
                  (setq waited (sit-for 2)))))
          (&lt;span style=&quot;color: #00cdcd; font-weight: bold;&quot;&gt;if&lt;/span&gt; (and (null waited)
                   (consp unread-command-events))
              (&lt;span style=&quot;color: #00cdcd; font-weight: bold;&quot;&gt;with-temp-message&lt;/span&gt; (current-message)
                (&lt;span style=&quot;color: #00cdcd; font-weight: bold;&quot;&gt;let&lt;/span&gt; ((binding (key-description bindings)))
                  (message &lt;span style=&quot;color: #00cd00;&quot;&gt;&quot;You can run the command `&lt;/span&gt;&lt;span style=&quot;color: #cd00cd;&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;color: #00cd00;&quot;&gt;&apos; with %s&quot;&lt;/span&gt;
                           function binding)
                  (&lt;span style=&quot;color: #00cdcd; font-weight: bold;&quot;&gt;if&lt;/span&gt; (numberp suggest-key-bindings)
                      (setq waited (sit-for suggest-key-bindings))
                    (setq waited (sit-for 2))))))))))
&lt;/pre&gt;

&lt;p&gt;The result is half as many lines of code compared to the C.  But the real benefit is being able to mess around with it.  If this version that mimics the standard behavior is proved to be stable, I may try and see if a few customizations to these new bits will hold up as well.&lt;/p&gt;

&lt;p&gt;I currently put the above code in a file called &lt;tt&gt;m-x.el&lt;/tt&gt;, then put the file in my &lt;code&gt;load-path&lt;/code&gt; and add the following to my &lt;tt&gt;.emacs&lt;/tt&gt; file.&lt;/p&gt;

&lt;pre&gt;
  (load &quot;m-x&quot;)
&lt;/pre&gt;</description>
  <comments>http://aaronhawley.livejournal.com/26901.html</comments>
  <category>programming</category>
  <category>emacs</category>
  <category>free software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>9</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/25343.html</guid>
  <pubDate>Mon, 29 Jun 2009 21:26:19 GMT</pubDate>
  <title>Iran is not a twitter revolution</title>
  <link>http://aaronhawley.livejournal.com/25343.html</link>
  <description>&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Reese_Erlich&quot;&gt;Reese Erlich&lt;/a&gt; is a freelance journalist and author who&apos;s been covering recent events in Iran -- *from Iran* and not just his computer chair like many in the mainstream media have.&lt;/p&gt;

&lt;p&gt;He recently countered &quot;left-wing Doubting Thomas arguments&quot; in an &lt;a href=&quot;http://www.commondreams.org/view/2009/06/28-10&quot;&gt;article on Common Dreams .org&lt;/a&gt;.  In his arguments, I found these observations about Iranians &quot;fighting for political, social and economic justice&quot; inspiring.&lt;/p&gt;

&lt;blockquote&gt;

&lt;p&gt;[...]&lt;/p&gt;

&lt;p&gt;Assertion: The U.S. has a long history of meddling in Iran, so it must be behind the current unrest. &lt;/p&gt;

&lt;p&gt;[...]&lt;/p&gt;

&lt;p&gt;Frankly, based on my observations, no one was leading the demonstrations. During the course of the week after the elections, the mass movement evolved from one protesting vote fraud into one calling for much broader freedoms. You could see it in the changing composition of the marches. There were not only upper middle class kids in tight jeans and designer sun glasses. There were growing numbers of workers and women in very conservative chadors.&lt;/p&gt;

&lt;p&gt;Iranian youth particularly resented President Ahmadinejad&apos;s support for religious militia attacks on unmarried young men and women walking together and against women not covering enough hair with their hijab. Workers resented the 24 percent annual inflation that robbed them of real wage increases. Independent trade unionists were fighting for decent wages and for the right to organize.&lt;/p&gt;

&lt;p&gt;Some demonstrators wanted a more moderate Islamic government. Others advocated a separation of mosque and state, and a return to parliamentary democracy they had before the 1953 coup. But virtually everyone believes that Iran has the right to develop nuclear power, including enriching uranium. Iranians support the Palestinians in their fight against Israeli occupation, and they want to see the U.S. get out of Iraq.&lt;/p&gt;

&lt;p&gt;So if the [sic] CIA was manipulating the demonstrators, it was doing a piss poor job.&lt;/p&gt;

&lt;p&gt;[...]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;See also Erlich&apos;s &lt;a href=&quot;http://blogs.reuters.com/great-debate/author/reeseerlich/&quot;&gt;Iran is not a twitter revolution&lt;/a&gt;.&lt;/p&gt;</description>
  <comments>http://aaronhawley.livejournal.com/25343.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/25025.html</guid>
  <pubDate>Fri, 26 Jun 2009 15:04:37 GMT</pubDate>
  <title>How the culture is hostile to women</title>
  <link>http://aaronhawley.livejournal.com/25025.html</link>
  <description>&lt;p&gt;I&apos;ve written before how I believe that a lot of women aren&apos;t recruited or drawn into all levels of computing because the culture is male-centered and therefore not attractive to women.  I also believe a symptom of this disease -- that also only adds to make the situation even worse -- are the outright sexist and misogynistic acts by men.  Often, such harassment is acted out in private or in electronic forums -- these &lt;a href=&quot;http://geekfeminism.wikia.com/wiki/Online_harassment&quot;&gt;incidents are well-documented&lt;/a&gt;.  However, occasionally this hostility bubbles up and boils over into public and in-person situations.&lt;/p&gt;

&lt;p&gt;This month, there was a presentation at a Flash conference that sounded completely absurd.  Read about it at &lt;a href=&quot;http://www.geekgirlsguide.com/blog/2009/06/11/98/prude_or_professional_by_courtney_remes&quot;&gt;&lt;cite&gt;Prude or Professional?&lt;/cite&gt; by Courtney Remes&lt;/a&gt; at the &lt;span class=&apos;ljuser  ljuser-name_geekgirlsguide&apos; lj:user=&apos;geekgirlsguide&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://syndicated.livejournal.com/geekgirlsguide/profile&apos;&gt;&lt;img src=&apos;http://l-stat.livejournal.com/img/syndicated.gif&apos; alt=&apos;[info]&apos; width=&apos;16&apos; height=&apos;16&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://syndicated.livejournal.com/geekgirlsguide/&apos;&gt;&lt;b&gt;geekgirlsguide&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Earlier this year there was a similar presentation at a Ruby conference.  See &lt;a href=&quot;http://www.sarahmei.com/blog/2009/04/25/why-rails-is-still-a-ghetto/&quot;&gt;&lt;cite&gt;Why Rails is Still Ghetto&lt;/cite&gt;&lt;/a&gt; by &lt;span class=&apos;ljuser  ljuser-name_sarahmei&apos; lj:user=&apos;sarahmei&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://syndicated.livejournal.com/sarahmei/profile&apos;&gt;&lt;img src=&apos;http://l-stat.livejournal.com/img/syndicated.gif&apos; alt=&apos;[info]&apos; width=&apos;16&apos; height=&apos;16&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://syndicated.livejournal.com/sarahmei/&apos;&gt;&lt;b&gt;sarahmei&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; and &lt;a href=&quot;http://www.ultrasaurus.com/sarahblog/2009/04/gender-and-sex-at-gogaruco/&quot;&gt;&lt;cite&gt;gender and sex at gogaruco&lt;/cite&gt;&lt;/a&gt; by &lt;span class=&apos;ljuser  ljuser-name_ultrasaurus_fee&apos; lj:user=&apos;ultrasaurus_fee&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://syndicated.livejournal.com/ultrasaurus_fee/profile&apos;&gt;&lt;img src=&apos;http://l-stat.livejournal.com/img/syndicated.gif&apos; alt=&apos;[info]&apos; width=&apos;16&apos; height=&apos;16&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://syndicated.livejournal.com/ultrasaurus_fee/&apos;&gt;&lt;b&gt;Sarah Allen&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; for reports from a third of the women who attended the conference (2 out of 6 is one-third) and found the presentation offensive.&lt;/p&gt;

&lt;p&gt;On all this, I prefer to just quote some of what &lt;span class=&apos;ljuser  ljuser-name_volsunga&apos; lj:user=&apos;volsunga&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://syndicated.livejournal.com/volsunga/profile&apos;&gt;&lt;img src=&apos;http://l-stat.livejournal.com/img/syndicated.gif&apos; alt=&apos;[info]&apos; width=&apos;16&apos; height=&apos;16&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://syndicated.livejournal.com/volsunga/&apos;&gt;&lt;b&gt;volsunga&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; wrote in &lt;a href=&quot;http://www.theimpossiblegirl.co.uk/2009/04/porn-ruby-headdesk/&quot;&gt;&lt;cite&gt;Porn. Ruby. *headdesk*&lt;/cite&gt;&lt;/a&gt; rather than adding more meta-discussion to these controversies.  It is stated well.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[...] This is the classic &quot;it&apos;s more offensive for you to say I&apos;m a sexist than for me to actually be sexist!&quot; response. People with an agenda (usually those sneaky feminists) choose to find something offensive so they can have a whine and call someone mean names, like &quot;sexist&quot;. But what&apos;s at stake here isn&apos;t that the presentation was offensive per se, but that the context was inappropriate and potentially alienating to women developers, in an environment that&apos;s already default male by dint of numbers.&lt;/p&gt;

&lt;p&gt;There&apos;s also the classic &quot;you could just ignore it if you don&apos;t like it&quot; defence. [...]&lt;/p&gt;

&lt;p&gt;This presumes that people who don&apos;t like pictures of naked women went along just so they could complain. But even if everyone who thought they might not like the talk didn&apos;t go, it&apos;ll still be wrong to show it; the very presence of such a slideshow at the event creates an atmosphere where women are &quot;them&quot;, where some content is made solely for men, but as if &quot;male&quot; is &quot;default&quot;. [...]&lt;/p&gt;

&lt;p&gt;And it doesn&apos;t matter if it was intentional -- no one really thinks [the presenter] sat down and schemed to offend women in advance -- and by refocusing on intention [the presenter] is able to get away with all that &quot;poor little me&quot; stuff in his post, as if his whole character has been impugned.&lt;/p&gt;

&lt;p&gt;Newsflash: there&apos;s a difference between saying &quot;you&apos;re a sexist/racist/homophobe&quot; and &quot;some of the stuff you just did/said contributed to the sexist/racist/homophobic culture around X&quot;.&lt;/p&gt;

&lt;p&gt;Message to Ruby developers who think this is out of control/proportion/just a bit silly: all your rights to nod sympathetically/join in when someone bemoans the lack of women developers are entirely removed (for ever) if when women do speak up, you pull this self-pitying, I&apos;m-a-nice-guy-really, its-not-my-fault, thats-just-the-way-I-roll, stop-complaining bullshit. And if those who complained then get painted as moralistic, shrill and angry for the sake of it.&lt;/p&gt;

&lt;p&gt;There are various posts up and around about why this has become a blame game, and that it&apos;s counter-productive. It wouldn&apos;t be a blame game if there had been less bombastic denial and more listening on the part of the speaker in the first place. Blame games stop when someone puts their hands up and scrutinises their behaviour. So get on with it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A fun resource I found while poking around in this is &lt;a href=&quot;http://www.derailingfordummies.com/&quot;&gt;Derailing for Dummies&lt;/a&gt;.&lt;/p&gt;</description>
  <comments>http://aaronhawley.livejournal.com/25025.html</comments>
  <category>gender</category>
  <category>free software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/24759.html</guid>
  <pubDate>Wed, 24 Jun 2009 20:25:06 GMT</pubDate>
  <title>Drivable Motor Vehicle Act</title>
  <link>http://aaronhawley.livejournal.com/24759.html</link>
  <description>I noticed an &lt;a href=&quot;http://drupal.geek.nz/blog/richard-stallman-free-software-christchurch#comment-375&quot;&gt;old comment posted to someone&apos;s site&lt;/a&gt; by &lt;span class=&apos;ljuser  ljuser-name_mjd_blog&apos; lj:user=&apos;mjd_blog&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://syndicated.livejournal.com/mjd_blog/profile&apos;&gt;&lt;img src=&apos;http://l-stat.livejournal.com/img/syndicated.gif&apos; alt=&apos;[info]&apos; width=&apos;16&apos; height=&apos;16&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://syndicated.livejournal.com/mjd_blog/&apos;&gt;&lt;b&gt;Matthew Davidson&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; who wrote a car metaphor for free software.  This is a commonly used metaphor device, but I think it&apos;s especially good.  (I *swear* I didn&apos;t find this in a search for my own surname).&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;I drive a little Toyota hatchback. I do so because I got it relatively cheap from my sister-in-law. This was possible because she owned the car, [instead of having] a non-transferable license to use the car under certain conditions.&lt;br /&gt;&lt;br /&gt;I know how to pump up the tyres and refill the thing that squirts water on the windscreen. That&apos;s all I know about maintaining the vehicle, and probably all I ever will know. I take it to the local mechanic of my choice every couple of years and he fustigates the Smoot-Hawley flanges or whatever for me, at what I can only assume is a reasonable price.&lt;br /&gt;&lt;br /&gt;I am very glad that the bonnet was not locked shut at the factory by Toyota, and that there is not a Drivable Motor Vehicle Act (DMVA) to make it a criminal offense for anybody to attempt to service their own car, or pay somebody other than the manufacturer to service it. I may not personally know the first thing about its [sic] inner workings, but if I suspect I&apos;m being charged to much for some work on my car, I can go a few hundred metres up the road to the next mechanic who can provide me with a quote.&lt;br /&gt;&lt;br /&gt;Most of these mechanics probably chose this trade after opening up the bonnet of their own car and having a playful poke around, the same way I learned how to program computers. Now as Richard Stallman would say, the ethical issues around car manufacturing and software manufacturing are not the same; I don&apos;t have the legal right to make a perfect copy of my car, but that&apos;s okay because I don&apos;t have the practical means to do so -- no matter how much technical skill I am able to acquire, and neither does anybody but very large corporations, so losing that freedom (through patents) doesn&apos;t cost me anything, while potentially delivering the benefits to society that the patent system [for car manufacturing] is supposed to provide.&lt;br /&gt;&lt;br /&gt;But if somebody paid me to write some software for them and I said &quot;okay, I&apos;ll write it for you, but only under the condition that you don&apos;t copy it or attempt to fix or improve it yourself, or pay somebody else to fix or improve it,&quot; that would be a very bad deal for the customer, because the means to do these things are so cheap that you are practically only paying for the time of the person who does the work (or not, if you do it yourself). It would be such a bad deal in fact, that if I managed to convince a sucker to fall for it, I would have to regard my own behaviour as unethical.&lt;br /&gt;&lt;br /&gt;Granted there aren&apos;t as many programmers as motor vehicle mechanics in my town, but that can and should change. Already I can point to half a dozen people I know who could (and hopefully will) become as familiar with the inner workings of [the free software package] Drupal as myself with only a little effort. As this begins to happen across a wide range of software the real cost of proprietary software (as opposed to the mere price tag), and the benefits of freedom, will become apparent to even the most non-technical users.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Speaking of &quot;tryes&quot;, &quot;metres&quot; and &quot;bonnets&quot;; the &lt;a href=&quot;http://www.endsoftpatents.org/&quot;&gt;end software patents campaign&lt;/a&gt; needs help documenting the patent issue in &lt;a href=&quot;http://en.swpat.org/wiki/Australia&quot;&gt;Australia&lt;/a&gt; and &lt;a href=&quot;http://en.swpat.org/wiki/New_Zealand&quot;&gt;New Zealand&lt;/a&gt;, among other locales.</description>
  <comments>http://aaronhawley.livejournal.com/24759.html</comments>
  <category>free software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/24499.html</guid>
  <pubDate>Thu, 18 Jun 2009 18:05:14 GMT</pubDate>
  <title>Release of dump package</title>
  <link>http://aaronhawley.livejournal.com/24499.html</link>
  <description>The &lt;a href=&quot;http://dump.sourceforge.net/&quot;&gt;dump/restore package&lt;/a&gt; version 0.4b42 is being released today.  It is the first release in over 3 years.  &lt;a href=&quot;http://sourceforge.net/project/shownotes.php?group_id=1306&amp;amp;release_id=690716&quot;&gt;Read the release notes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It supports versions two through four of the Linux kernel&apos;s extended file system (ext2, ext3, ext4).  Technically, it is considered beta software, but I have reason to believe there are a lot of people who use it in production systems.  You can also use it for disk-based backups.  You don&apos;t need to have a &lt;a href=&quot;http://en.wikipedia.org/wiki/Tape_jukebox&quot;&gt;tape jukebox&lt;/a&gt; to use it, although it is designed for use with tape backups.</description>
  <comments>http://aaronhawley.livejournal.com/24499.html</comments>
  <category>unix</category>
  <category>free software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/24262.html</guid>
  <pubDate>Thu, 28 May 2009 19:39:53 GMT</pubDate>
  <title>Sorting UTF-8 strings in PHP</title>
  <link>http://aaronhawley.livejournal.com/24262.html</link>
  <description>&lt;p&gt;With Unicode characters, in this case the popular UTF-8, sometimes you need to convert characters to ASCII to get things done in PHP.  In the case of sorting Unicode, there are the existing solutions of &lt;a href=&quot;php.net/collator.sort&quot;&gt;collator_sort()&lt;/a&gt; for PHP5 and &lt;a href=&quot;http://php.net/strcoll&quot;&gt;strcoll()&lt;/a&gt; since PHP4.  However, they both assume a locale.  A hack that is locale-agnostic would just &quot;normalize&quot; Unicode characters to ASCII.&lt;/p&gt;

&lt;p&gt;This is far from complete, but seems to do the right thing.&lt;/p&gt;

&lt;pre&gt;
    &lt;span style=&quot;color: #da70d6;&quot;&gt;&amp;lt;?php&lt;/span&gt;

    &lt;span style=&quot;color: #b22222;&quot;&gt;/**&lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;
     * Normalize international characters for purposes like sorting and
     * searching by using a heuristic that just uses ASCII--the english
     * alphabet ordering--for a multilingual solution--no locale setting.
     &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;*/&lt;/span&gt;
    &lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;header(&lt;/span&gt;&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;Content-type: text/plain; charset=utf-8&quot;&lt;/span&gt;);

    &lt;span style=&quot;color: #b22222;&quot;&gt;/**&lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;
     * I&amp;#241;t&amp;#235;rn&amp;#226;ti&amp;#244;n&amp;#224;liz&amp;#230;ti&amp;#248;n
     *
     * Example from Sam Ruby
     * http://intertwingly.net/stories/2004/04/14/i18n.html
     * 
     * By way of WACT team
     * http://www.phpwact.org/php/i18n/charsets
     &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;*/&lt;/span&gt;
    $&lt;span style=&quot;color: #b8860b;&quot;&gt;internationalization&lt;/span&gt; = &lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;array(&lt;/span&gt;
				  &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;I&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;I
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xB1&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#241;
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;t&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;t
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xAB&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#235;
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;r&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;r
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;n&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;n
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xA2&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#226;
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;t&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;t
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;i&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;i
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xB4&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#244;
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;n&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;n
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xA0&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#224;
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;l&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;l
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;i&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;i
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;z&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;z
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xA6&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#230;
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;t&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;t
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;i&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;i
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xB8&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#248;
    &lt;/span&gt;                              &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;n&quot;&lt;/span&gt;); &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;n
    &lt;/span&gt;
    &lt;span style=&quot;color: #b22222;&quot;&gt;/** &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;
     * Use strtr() with this dictionary to convert to ASCII.
     * This data structure is not comprehensive.
     &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;*/&lt;/span&gt;
    $&lt;span style=&quot;color: #b8860b;&quot;&gt;utf8_dict&lt;/span&gt; = &lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;array(&lt;/span&gt;&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x80&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;A&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#192;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x81&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;A&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#193;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x82&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;A&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#194;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x83&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;A&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#195;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x84&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;A&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#196;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x85&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;A&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#197;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x86&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;A&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#198;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x9E&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;B&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#222;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x87&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;C&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#199;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC4\x86&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;C&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#262;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC4\x8C&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;C&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#268;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC4\x90&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;Dj&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#272;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x88&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;E&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#200;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x89&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;E&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#201;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x8A&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;E&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#202;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x8B&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;E&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#203;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC4\x9E&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;G&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#286;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x8C&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;I&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#204;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x8D&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;I&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#205;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x8E&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;I&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#206;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x8F&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;I&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#207;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC4\xB0&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;I&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#304;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x91&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;N&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#209;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x92&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;O&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#210;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x93&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;O&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#211;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x94&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;O&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#212;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x95&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;O&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#213;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x96&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;O&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#214;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x98&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;O&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#216;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x9F&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;Ss&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#223;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x99&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;U&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#217;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x9A&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;U&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#218;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x9B&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;U&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#219;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x9C&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;U&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#220;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\x9D&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;Y&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#221;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xA0&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;a&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#224;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xA1&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;a&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#225;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xA2&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;a&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#226;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xA3&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;a&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#227;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xA4&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;a&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#228;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xA5&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;a&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#229;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xA6&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;a&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#230;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xBE&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;b&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#254;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xA7&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;c&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#231;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC4\x87&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;c&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#263;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC4\x8D&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;c&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#269;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC4\x91&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;dj&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#273;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xA8&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;e&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#232;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xA9&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;e&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#233;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xAA&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;e&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#234;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xAB&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;e&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#235;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xAC&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;i&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#236;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xAD&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;i&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#237;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xAE&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;i&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#238;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xAF&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;i&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#239;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xB0&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;o&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#240;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xB1&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;n&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#241;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xB2&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;o&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#242;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xB3&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;o&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#243;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xB4&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;o&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#244;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xB5&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;o&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#245;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xB6&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;o&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#246;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xB8&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;o&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#248;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC5\x94&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;R&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#340;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC5\x95&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;r&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#341;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC5\xA0&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;S&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#352;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC5\x9E&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;S&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#350;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC5\xA1&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;s&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#353;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xB9&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;u&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#249;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xBA&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;u&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#250;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xBB&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;u&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#251;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xBC&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;u&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#252;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xBD&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;y&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#253;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xBD&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;y&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#253;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC3\xBF&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;y&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#255;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC5\xBD&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;Z&quot;&lt;/span&gt;, &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#381;
    &lt;/span&gt;                   &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\xC5\xBE&quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;z&quot;&lt;/span&gt;); &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;#382;
    &lt;/span&gt;
    $&lt;span style=&quot;color: #b8860b;&quot;&gt;i18n&lt;/span&gt; = &lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;join(&lt;/span&gt;&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;&quot;&lt;/span&gt;, $&lt;span style=&quot;color: #b8860b;&quot;&gt;internationalization&lt;/span&gt;);
    &lt;span style=&quot;color: #a020f0;&quot;&gt;print&lt;/span&gt; $&lt;span style=&quot;color: #b8860b;&quot;&gt;i18n&lt;/span&gt; . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\n&quot;&lt;/span&gt;;

    &lt;span style=&quot;color: #b22222;&quot;&gt;/**&lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;
     * UTF-8 regular expression from
     * http://php.net/manual/en/function.utf8-decode.php (comment 57069)
     &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;*/&lt;/span&gt;
    $&lt;span style=&quot;color: #b8860b;&quot;&gt;utf8_re&lt;/span&gt; = &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;/^([\\x00-\\x7f]|&quot;&lt;/span&gt;
      . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;[\\xc2-\\xdf][\\x80-\\xbf]|&quot;&lt;/span&gt;
      . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\\xe0[\\xa0-\\xbf][\\x80-\\xbf]|&quot;&lt;/span&gt;
      . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;[\\xe1-\\xec][\\x80-\\xbf]{2}|&quot;&lt;/span&gt;
      . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\\xed[\\x80-\\x9f][\\x80-\\xbf]|&quot;&lt;/span&gt;
      . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\\xef[\\x80-\\xbf][\\x80-\\xbc]|&quot;&lt;/span&gt;
      . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\\xee[\\x80-\\xbf]{2}|&quot;&lt;/span&gt;
      . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\\xf0[\\x90-\\xbf][\\x80-\\xbf]{2}|&quot;&lt;/span&gt;
      . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;[\\xf1-\\xf3][\\x80-\\xbf]{3}|&quot;&lt;/span&gt;
      . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\\xf4[\\x80-\\x8f][\\x80-\\xbf]{2})*$/&quot;&lt;/span&gt;;

    &lt;span style=&quot;color: #a020f0;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;Valid UTF-8?: &quot;&lt;/span&gt; . (&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;preg_match(&lt;/span&gt;$&lt;span style=&quot;color: #b8860b;&quot;&gt;utf8_re&lt;/span&gt;, $&lt;span style=&quot;color: #b8860b;&quot;&gt;i18n&lt;/span&gt;) &amp;gt; &lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;0&lt;/span&gt;
			      ? &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;true&quot;&lt;/span&gt; : &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;false&quot;&lt;/span&gt;) . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\n&quot;&lt;/span&gt;;

    &lt;span style=&quot;color: #a020f0;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;strtr(&lt;/span&gt;$&lt;span style=&quot;color: #b8860b;&quot;&gt;i18n&lt;/span&gt;, $&lt;span style=&quot;color: #b8860b;&quot;&gt;utf8_dict&lt;/span&gt;) . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\n&quot;&lt;/span&gt;;

    &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;Doesn&apos;t work in PHP4?
    &lt;/span&gt;$&lt;span style=&quot;color: #b8860b;&quot;&gt;sorted&lt;/span&gt; = &lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;preg_split(&lt;/span&gt;&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;//u&quot;&lt;/span&gt;, $&lt;span style=&quot;color: #b8860b;&quot;&gt;i18n&lt;/span&gt;, -&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color: #ff0000; font-weight: bold;&quot;&gt;PREG_SPLIT_NO_EMPTY&lt;/span&gt;);
    &lt;span style=&quot;color: #b22222;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;So, just use the original array, instead.
    &lt;/span&gt;$&lt;span style=&quot;color: #b8860b;&quot;&gt;sorted&lt;/span&gt; = $&lt;span style=&quot;color: #b8860b;&quot;&gt;internationalization&lt;/span&gt;;

    &lt;span style=&quot;color: #a020f0;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;compare&lt;/span&gt;($&lt;span style=&quot;color: #b8860b;&quot;&gt;s1&lt;/span&gt;, $&lt;span style=&quot;color: #b8860b;&quot;&gt;s2&lt;/span&gt;)
    {
      &lt;span style=&quot;color: #a020f0;&quot;&gt;global&lt;/span&gt; $&lt;span style=&quot;color: #b8860b;&quot;&gt;utf8_dict&lt;/span&gt;;
      &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;strcasecmp(strtr(&lt;/span&gt;$&lt;span style=&quot;color: #b8860b;&quot;&gt;s1&lt;/span&gt;, $&lt;span style=&quot;color: #b8860b;&quot;&gt;utf8_dict&lt;/span&gt;),
			&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;strtr(&lt;/span&gt;$&lt;span style=&quot;color: #b8860b;&quot;&gt;s2&lt;/span&gt;, $&lt;span style=&quot;color: #b8860b;&quot;&gt;utf8_dict&lt;/span&gt;));
    }

    &lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;usort(&lt;/span&gt;$&lt;span style=&quot;color: #b8860b;&quot;&gt;sorted&lt;/span&gt;, &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;compare&quot;&lt;/span&gt;);
    &lt;span style=&quot;color: #a020f0;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;join(&lt;/span&gt;&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;&quot;&lt;/span&gt;, $&lt;span style=&quot;color: #b8860b;&quot;&gt;sorted&lt;/span&gt;) . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\n&quot;&lt;/span&gt;;

    &lt;span style=&quot;color: #b22222;&quot;&gt;/**&lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;
     * Results:
     * 
     * I&amp;#241;t&amp;#235;rn&amp;#226;ti&amp;#244;n&amp;#224;liz&amp;#230;ti&amp;#248;n
     * Valid UTF-8?: true
     * Internationalization
     * &amp;#224;&amp;#230;&amp;#226;&amp;#235;Iiiil&amp;#241;nnn&amp;#248;&amp;#244;rtttz
     &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;*/&lt;/span&gt;
    &lt;span style=&quot;color: #da70d6;&quot;&gt;?&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;I tried the &lt;a href=&quot;http://pear.php.net/package/I18N_UnicodeNormalizer&quot;&gt;I18N_UnicodeNormalizer&lt;/a&gt; from the PHP PEAR project, and it didn&apos;t do what I wanted.&lt;/p&gt;

&lt;pre&gt;
    &lt;span style=&quot;color: #da70d6;&quot;&gt;&amp;lt;?php&lt;/span&gt;

    &lt;span style=&quot;color: #a020f0;&quot;&gt;require_once&lt;/span&gt;(&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&apos;I18N/UnicodeNormalizer.php&apos;&lt;/span&gt;);

    &lt;span style=&quot;color: #a020f0;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;I18N_UnicodeNormalizer&lt;/span&gt;::&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;toNFD(&lt;/span&gt;$&lt;span style=&quot;color: #b8860b;&quot;&gt;i18n&lt;/span&gt;) . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\n&quot;&lt;/span&gt;;
    &lt;span style=&quot;color: #a020f0;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;I18N_UnicodeNormalizer&lt;/span&gt;::&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;toNFC(&lt;/span&gt;$&lt;span style=&quot;color: #b8860b;&quot;&gt;i18n&lt;/span&gt;) . &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;\n&quot;&lt;/span&gt;;
    &lt;span style=&quot;color: #da70d6;&quot;&gt;?&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;There&apos;s a good chance I don&apos;t know what I&apos;m doing there with the PEAR library, however.&lt;/p&gt;</description>
  <comments>http://aaronhawley.livejournal.com/24262.html</comments>
  <category>programming</category>
  <category>php</category>
  <category>howto</category>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/23852.html</guid>
  <pubDate>Wed, 27 May 2009 18:33:38 GMT</pubDate>
  <title>Unicode hex in PHP string</title>
  <link>http://aaronhawley.livejournal.com/23852.html</link>
  <description>&lt;p&gt;In Emacs, insert UTF-8 hex value for a PHP string of the character at point.&lt;/p&gt;

&lt;pre&gt;
(defun php-hex-for-char ()
  (interactive)
  (insert
   (mapconcat (lambda (x) (format &quot;\\x%02X&quot; x))
              (encode-coding-char (char-after (point)) &apos;utf-8)
              &quot;&quot;)))

&lt;/pre&gt;

&lt;p&gt;Lisp lifted from `describe-char&apos; and `encoded-string-description&apos;.&lt;/p&gt;</description>
  <comments>http://aaronhawley.livejournal.com/23852.html</comments>
  <category>programming</category>
  <category>php</category>
  <category>emacs</category>
  <category>howto</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/23429.html</guid>
  <pubDate>Mon, 18 May 2009 22:26:06 GMT</pubDate>
  <title>Shell hack: Files with some DOS lines</title>
  <link>http://aaronhawley.livejournal.com/23429.html</link>
  <description>&lt;p&gt;I came across a project whose source code contains both DOS text files and Unix text files.  Some of the Unix files contain carriage return line endings.  Though, perhaps they were DOS files with Unix end lines!  I wanted to suggest converting those files with mixed line endings to Unix.&lt;/p&gt;

&lt;p&gt;Sometimes, the &lt;tt&gt;file&lt;/tt&gt; command is helpful for showing what files have a mixed end of line style, but not always.  For example, the &lt;tt&gt;file&lt;/tt&gt; command will say &quot;ASCII C program text, with CRLF, LF line terminators&quot;.  That&apos;s perfect.  However, sometimes the command just says, &quot;PHP script text&quot;.&lt;/p&gt;

&lt;p&gt;I wrote this &lt;tt&gt;find&lt;/tt&gt; expression that would get files that contain DOS carriage returns, but not entirely DOS files.&lt;/p&gt;

&lt;pre&gt;
$ find -type f -execdir grep -qe &apos;^V^M$&apos; {} \; \
       ! -execdir awk &apos;BEGIN{is_dos=1;}!/\r$/{is_dos=0}END{exit(!is_dos);}&apos; {} \; \
       -print
&lt;/pre&gt;

&lt;p&gt;The above doesn&apos;t work, since many DOS files don&apos;t end in a newline (and without a carriage return) as they do for Unix text files.&lt;/p&gt;

&lt;p&gt;Awk obviously considers the last line as a line, but since there&apos;s no carriage return the file is not considered a DOS file based on the logic I&apos;ve written.  This results in a false negative.&lt;/p&gt;

&lt;p&gt;This change to the Awk script makes this hack work as it should.&lt;/p&gt;

&lt;pre&gt;
$ find -type f -execdir grep -qe &apos;^V^M$&apos; {} \; \
       ! -execdir awk &apos;BEGIN{is_dos=1;}
                       !/\r$/ &amp;&amp; is_dos{is_dos=0;n=NR}
                       END{exit(!is_dos &amp;&amp; n != NR);}&apos; {} \; \
       -print
&lt;/pre&gt;</description>
  <comments>http://aaronhawley.livejournal.com/23429.html</comments>
  <category>programming</category>
  <category>unix</category>
  <category>howto</category>
  <category>free software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/23288.html</guid>
  <pubDate>Wed, 13 May 2009 20:43:10 GMT</pubDate>
  <title>Send Amazon&apos;s Bezos some peaches</title>
  <link>http://aaronhawley.livejournal.com/23288.html</link>
  <description>I just noticed there was a great action by the FSF&apos;s anti-DRM campaign last month against Amazon&apos;s Kindle electronic book.  See &lt;a href=&quot;http://www.defectivebydesign.org/impeach-jeff-bezos-for-kindle-swindle&quot;&gt;Defective by Design: Impeach Bezos for Amazon&apos;s Kindle Swindle&lt;/a&gt;.  The idea is to send baby food peaches to Jeff Bezos for having terms that allow Amazon to deny customer&apos;s access to read their electronic books.&lt;br /&gt;&lt;br /&gt;Sending baby food is pretty easy in the age of the Internet, see the link and instructions at the end of the post.</description>
  <comments>http://aaronhawley.livejournal.com/23288.html</comments>
  <category>free software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/22856.html</guid>
  <pubDate>Tue, 05 May 2009 18:08:18 GMT</pubDate>
  <title>Change log entries for HTML files</title>
  <link>http://aaronhawley.livejournal.com/22856.html</link>
  <description>&lt;p&gt;Someone asked me if there was a good way to annotate the changes of an HTML file.  It sounded like the person had to maintain some legacy, HTML-hell, home-brewed, template files for some business Web site.&lt;/p&gt;

&lt;p&gt;I suggested using the &lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Change-Log.html&quot;&gt;ChangeLog support of Emacs&lt;/a&gt;, and using HTML comments to organize sections of an HTML source file.  Here&apos;s a simple, made-up example of such an HTML file.&lt;/p&gt;

&lt;pre&gt;
&amp;lt;&lt;span style=&quot;color: #0000ff;&quot;&gt;html&lt;/span&gt;&amp;gt;
&amp;lt;&lt;span style=&quot;color: #0000ff;&quot;&gt;head&lt;/span&gt;&amp;gt;
&amp;lt;&lt;span style=&quot;color: #0000ff;&quot;&gt;title&lt;/span&gt;&amp;gt;&lt;span style=&quot;font-weight: bold; text-decoration: underline;&quot;&gt;Sample only&lt;/span&gt;&amp;lt;/&lt;span style=&quot;color: #0000ff;&quot;&gt;title&lt;/span&gt;&amp;gt;
&amp;lt;/&lt;span style=&quot;color: #0000ff;&quot;&gt;head&lt;/span&gt;&amp;gt;
&amp;lt;&lt;span style=&quot;color: #0000ff;&quot;&gt;body&lt;/span&gt;&amp;gt;
&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;lt;!-- begin header --&amp;gt;&lt;/span&gt;
&amp;lt;&lt;span style=&quot;color: #0000ff;&quot;&gt;p&lt;/span&gt;&amp;gt;[ &amp;lt;&lt;span style=&quot;color: #0000ff;&quot;&gt;a&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;top&quot;&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;href&lt;/span&gt;=&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;#bottom&quot;&lt;/span&gt;&amp;gt;bottom&amp;lt;/&lt;span style=&quot;color: #0000ff;&quot;&gt;a&lt;/span&gt;&amp;gt; ]&amp;lt;/&lt;span style=&quot;color: #0000ff;&quot;&gt;p&lt;/span&gt;&amp;gt;
&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;lt;!-- end header --&amp;gt;&lt;/span&gt;
&amp;lt;&lt;span style=&quot;color: #0000ff;&quot;&gt;h1&lt;/span&gt;&amp;gt;&lt;span style=&quot;font-weight: bold; text-decoration: underline;&quot;&gt;Sample title&lt;/span&gt;&amp;lt;/&lt;span style=&quot;color: #0000ff;&quot;&gt;h1&lt;/span&gt;&amp;gt;
&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;lt;!-- BEGIN: PAGE_CONTENT --&amp;gt;&lt;/span&gt;
&amp;lt;&lt;span style=&quot;color: #0000ff;&quot;&gt;div&lt;/span&gt;&amp;gt;
&amp;lt;&lt;span style=&quot;color: #0000ff;&quot;&gt;p&lt;/span&gt;&amp;gt;Testing.&amp;lt;/&lt;span style=&quot;color: #0000ff;&quot;&gt;p&lt;/span&gt;&amp;gt;
&amp;lt;/&lt;span style=&quot;color: #0000ff;&quot;&gt;div&lt;/span&gt;&amp;gt;
&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;lt;!-- END: PAGE_CONTENT --
  -- footer-bottom start --&amp;gt;&lt;/span&gt;
&amp;lt;&lt;span style=&quot;color: #0000ff;&quot;&gt;p&lt;/span&gt;&amp;gt;[ &amp;lt;&lt;span style=&quot;color: #0000ff;&quot;&gt;a&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;bottom&quot;&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;href&lt;/span&gt;=&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;#top&quot;&lt;/span&gt;&amp;gt;top&amp;lt;/&lt;span style=&quot;color: #0000ff;&quot;&gt;a&lt;/span&gt;&amp;gt; ]&amp;lt;/&lt;span style=&quot;color: #0000ff;&quot;&gt;p&lt;/span&gt;&amp;gt;
&lt;span style=&quot;color: #b22222;&quot;&gt;&amp;lt;!-- footer-bottom end --&amp;gt;&lt;/span&gt;
&amp;lt;/&lt;span style=&quot;color: #0000ff;&quot;&gt;body&lt;/span&gt;&amp;gt;
&amp;lt;/&lt;span style=&quot;color: #0000ff;&quot;&gt;html&lt;/span&gt;&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Unfortunately, support for either the above sectioning style, or even another alternative, is not provided by the &lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/HTML-Mode.html&quot;&gt;HTML mode&lt;/a&gt; that ships with Emacs.  This is understandable because there is no consistent standard of doing this, and people use other variations than even those covered in the example.  Not to mention, HTML comments are used for other reasons than naming regions of the file.&lt;/p&gt;

&lt;p&gt;Regardless, I&apos;ve put together the following regular expression for &lt;code&gt;add-log-current-defun-header-regexp&lt;/code&gt;.  It handles the cases in the example above.  It is set for all buffers using HTML mode.  Just put the following in your &lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Init-File.html&quot;&gt;&lt;tt&gt;.emacs&lt;/tt&gt; file&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;
    (add-hook &apos;html-mode-hook
        (lambda ()
          (make-local-variable
           &apos;add-log-current-defun-header-regexp)
           (setq add-log-current-defun-header-regexp
               (concat &quot;^[ \t]*&amp;lt;?!?--[ \t]*\\(?:begin\\|BEGIN\\|start\\)?&quot;
                       &quot;[ \t:]*\\([-_[:alnum:]]+\\)&quot;
                       &quot;[ \t]*\\(?:begin\\|BEGIN\\|start\\)?[ \t]*--&quot;))))
&lt;/pre&gt;

&lt;p&gt;Use it by typing `&lt;kbd&gt;C-x 4 a&lt;/kbd&gt;&apos; (&lt;tt&gt;add-change-log-entry-other-window&lt;/tt&gt;).  An entry like the following will be added in a nearby &lt;tt&gt;ChangeLog&lt;/tt&gt; file:&lt;/p&gt;
    &lt;pre&gt;
&lt;span style=&quot;color: #bc8f8f;&quot;&gt;2009-05-05  &lt;/span&gt;&lt;span style=&quot;color: #5f9ea0;&quot;&gt;Aaron S. Hawley&lt;/span&gt;  &amp;lt;&lt;span style=&quot;color: #b8860b;&quot;&gt;aaronhawley@livejournal.com&lt;/span&gt;&amp;gt;

        * &lt;span style=&quot;color: #0000ff;&quot;&gt;file.html&lt;/span&gt; (&lt;span style=&quot;color: #a020f0;&quot;&gt;PAGE_CONTENT&lt;/span&gt;): Add a test paragraph.
        (&lt;span style=&quot;color: #a020f0;&quot;&gt;footer-bottom&lt;/span&gt;): Added link to &quot;#top&quot;.
&lt;/pre&gt;

&lt;p&gt;This setup will work for most cases except for scenarios where there is nested sectioning or where you&apos;ve run `&lt;kbd&gt;C-x 4 a&lt;/kbd&gt;&apos; from a point outside of a &quot;section&quot; and get a false-positive.&lt;/p&gt;</description>
  <comments>http://aaronhawley.livejournal.com/22856.html</comments>
  <category>programming</category>
  <category>emacs</category>
  <category>howto</category>
  <category>free software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/22779.html</guid>
  <pubDate>Fri, 01 May 2009 09:26:43 GMT</pubDate>
  <title>Shell hack: Avoiding built-ins</title>
  <link>http://aaronhawley.livejournal.com/22779.html</link>
  <description>&lt;p&gt;To avoid using a &lt;em&gt;builtin&lt;/em&gt; command of a Bourne or Bash shell in a shell script, one can use the full path of the executable command.  For example, rather than&lt;/p&gt;

&lt;pre&gt;
$ echo Hello, World\!
Hello, World!
&lt;/pre&gt;

&lt;p&gt;you could&lt;/p&gt;

&lt;pre&gt;
$ /bin/echo Hello, World\!
Hello, World!
&lt;/pre&gt;

&lt;p&gt;Here&apos;s a way to show the difference--and make fun of the &lt;a href=&quot;http://www.gnu.org/prep/standards/&quot;&gt;GNU coding standards&lt;/a&gt; at the same time.&lt;/p&gt;

&lt;pre&gt;
$ echo --version
--version
&lt;/pre&gt;

&lt;pre&gt;
$ /bin/echo --version
echo (GNU coreutils) 6.12
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3 : GNU GPL version 3 or later &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Brian Fox and Chet Ramey.
&lt;/pre&gt;

&lt;p&gt;I prefer to use &lt;code&gt;exec&lt;/code&gt; than using the full path for a command so that the &lt;tt&gt;PATH&lt;/tt&gt; environment variable is used, and avoid the day should the full path to a binary change some day.&lt;/p&gt;

&lt;p&gt;Unfortunately, a consequence of &lt;code&gt;exec&lt;/code&gt; is that it runs the command in the current process and therefore will exit on completion, thus cutting short the life of your shell script.  To avoid that, just wrap an exec statement in a sub-shell by using parens:&lt;/p&gt;

&lt;pre&gt;
$ ( exec echo --version )
echo (GNU coreutils) 6.12
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3 : GNU GPL version 3 or later &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Brian Fox and Chet Ramey.
&lt;/pre&gt;

&lt;p&gt;I have never seen this written in a script before.  Perhaps, there&apos;s another way--that&apos;s a bit more canonical--to do this.  This construct is entirely redundant and contradictory--&quot;exec something in the current shell, but also in a sub-shell&quot;.  Further, it&apos;s probably pretty much always the case to opt for the shell built-in.  There are zero to no cases where you want to avoid the built-in.  My only scenarios are &lt;a href=&quot;http://aaronhawley.livejournal.com/9225.html&quot;&gt;timing processes in the shell&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;According to the &lt;a href=&quot;http://www.gnu.org/software/autoconf/manual/html_node/Limitations-of-Builtins.html&quot;&gt;Limitations of Shell Builtins&lt;/a&gt; section of the GNU Autoconf manual,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When it is desired to avoid a regular shell built-in, the workaround is
to use some other forwarding command, such as &lt;samp&gt;&lt;span class=&quot;command&quot;&gt;env&lt;/span&gt;&lt;/samp&gt; or
&lt;samp&gt;&lt;span class=&quot;command&quot;&gt;nice&lt;/span&gt;&lt;/samp&gt;, that will ensure a path search:&lt;/p&gt;

     &lt;pre class=&quot;example&quot;&gt;          $ &lt;kbd&gt;pdksh -c &apos;exec true --version&apos; | head -n1&lt;/kbd&gt;

          $ &lt;kbd&gt;pdksh -c &apos;nice true --version&apos; | head -n1&lt;/kbd&gt;
          true (GNU coreutils) 6.10
          $ &lt;kbd&gt;pdksh -c &apos;env true --version&apos; | head -n1&lt;/kbd&gt;
          true (GNU coreutils) 6.10
     &lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;That manual has everything it it.  I guess I&apos;ll go with &lt;code&gt;env&lt;/code&gt;, doesn&apos;t sound as nice as &quot;&lt;code&gt;exec&lt;/code&gt;&quot;, but it&apos;s a good mnemonic since it use the &lt;em&gt;environment&lt;/em&gt;&apos;s path variable to run the command.&lt;/p&gt;

&lt;pre&gt;
$ env echo --version
echo (GNU coreutils) 6.12
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Brian Fox and Chet Ramey.
&lt;/pre&gt;</description>
  <comments>http://aaronhawley.livejournal.com/22779.html</comments>
  <category>unix</category>
  <category>programming languages</category>
  <category>howto</category>
  <category>free software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/21792.html</guid>
  <pubDate>Sun, 26 Apr 2009 05:42:40 GMT</pubDate>
  <title>Shell hack: Date work</title>
  <link>http://aaronhawley.livejournal.com/21792.html</link>
  <description>&lt;p&gt;Needed to make some &lt;a href=&quot;http://httpd.apache.org/docs/2.0/mod/mod_alias.html#redirect&quot;&gt;Apache redirects&lt;/a&gt; for some links on a unix user&apos;s group Web site I maintain.  The new site is based in a Wiki, and a member of the group moved all the pages with meeting announcements by hand using more readable page names.  The old pages had the data as a four-digit year, two-digit month followed by the two-digit day (for example, &lt;samp&gt;20061219&lt;/samp&gt;).  The new pages have the spelled out version of the week day and month (for example, &lt;samp&gt;Tuesday, December 19, 2006&lt;/samp&gt;).&lt;/p&gt;

&lt;p&gt;Here&apos;s a sample of what I needed for the &lt;tt&gt;.htaccess&lt;/tt&gt; file.&lt;/p&gt;

&lt;pre&gt;
Redirect /group/meeting-20061219.html   http://host.org/group/wiki/index.php/Tuesday,_December_19,_2006
Redirect /group/meeting-20070417.html   http://host.org/group/wiki/index.php/Tuesday,_April_17,_2007
Redirect /group/meeting-20070515.html   http://host.org/group/wiki/index.php/Tuesday,_May_15,_2007
Redirect /group/meeting-20070717.html   http://host.org/group/wiki/index.php/Tuesday,_July_17,_2007
Redirect /group/meeting-20071128.html   http://host.org/group/wiki/index.php/Wednesday,_November_28,_2007
Redirect /group/meeting-20080618.html   http://host.org/group/wiki/index.php/Wednesday,_June_18,_2008
&lt;/pre&gt;

&lt;p&gt;I could do this by-hand, but I&apos;d rather get a shell script to do it right, the first time.  I found it easy to do with an &lt;a href=&quot;http://www.gnu.org/software/grep/doc/grep_12.html&quot;&gt;extended Grep expression&lt;/a&gt;, &lt;a href=&quot;http://www.gnu.org/software/gawk/&quot;&gt;awk&lt;/a&gt; and the &lt;tt&gt;date&lt;/tt&gt; command that comes with &lt;a href=&quot;http://www.gnu.org/software/coreutils/&quot;&gt;GNU coreutils&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;
$ ls -1 \
  | grep -Ee &apos;[0-9]{8}.html$&apos; \
  | perl -pe &apos;s/([0-9]{4})([0-9]{2})([0-9]{2}).html$/$&amp;\t\1-\2-\3/&apos; \
  | awk &apos;{printf $1 &quot;\t&quot;;
          system(&quot;date +\&quot;%A,_%B_%e,_%Y\&quot; -d &quot;  $2);}&apos; \
  | awk &apos;{print &quot;Redirect&quot;, &quot;/group/&quot; $1,
                &quot;http://host.org/group/wiki/index.php/&quot; $2;}&apos;
&lt;/pre&gt;

&lt;p&gt;I&apos;m thankful I consistently used a file naming convention with the old site.&lt;/p&gt;</description>
  <comments>http://aaronhawley.livejournal.com/21792.html</comments>
  <category>programming</category>
  <category>unix</category>
  <category>howto</category>
  <category>free software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>8</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/21687.html</guid>
  <pubDate>Fri, 24 Apr 2009 01:26:36 GMT</pubDate>
  <title>Database programming</title>
  <link>http://aaronhawley.livejournal.com/21687.html</link>
  <description>&lt;p&gt;This simple bit of PHP made some changes to a MediaWiki installation for me recently.  Don&apos;t use it.  My point here is in showing the satisfaction from changing a database with code that generates the SQL statements for you.   The golden rule for database applications is to make sure there&apos;s an interface or programming layer to the actual database to preserve data integrity and keep changes limited in scope.  One should use some of the scripts that come with MediaWiki--&lt;code&gt;batchMove.php&lt;/code&gt; or &lt;code&gt;namespaceDupes.php&lt;/code&gt; for example--to do this.  Such scripts are better trusted, but also handle the schema should it change in a later release of the software.&lt;/p&gt;

&lt;p&gt;Now that the disclaimer is out of the way, I was pleasantly surprised how consistent the schema for MediaWiki was for allowing me to rely on simple data structures and some for-loops to update 9 tables.  Clearly, the schema isn&apos;t entirely normalized, but I predict there is a rationale for having some of the data &lt;a href=&quot;http://en.wikipedia.org/wiki/Denormalization&quot;&gt;denormalized&lt;/a&gt;.  Given this scenario, it is a real compliment to a software package and its schema if one can write very concise code to generate a series of SQL statements for a task.&lt;/p&gt;

&lt;pre&gt;
&amp;lt;?php
// Move 3 pages, and start 2 namespaces.  Don&apos;t use this code!

$table = array(&apos;page&apos; =&amp;gt; &apos;mw_page&apos;,
	       &apos;rc&apos; =&amp;gt; &apos;mw_recentchanges&apos;,
	       &apos;pl&apos; =&amp;gt; &apos;mw_pagelinks&apos;,
	       &apos;pt&apos; =&amp;gt; &apos;mw_protected_titles&apos;,
	       &apos;qc&apos; =&amp;gt; &apos;mw_querycache&apos;,
	       &apos;qcc&apos; =&amp;gt; &apos;mw_querycachetwo&apos;,
	       &apos;rd&apos; =&amp;gt; &apos;mw_redirect&apos;,
	       &apos;tl&apos; =&amp;gt; &apos;mw_templatelinks&apos;,
	       &apos;wl&apos; =&amp;gt; &apos;mw_watchlist&apos;);

$namespaces = array(100 =&amp;gt; &apos;ThisWiki&apos;,
		    /* 101 =&amp;gt; &apos;ThisWiki talk&apos;, */
		    110 =&amp;gt; &apos;RPM&apos;,
		    /* 111 =&amp;gt; &apos;RPM talk&apos; */);

$rename = array(&apos;Changes_to_Wiki_database&apos; =&amp;gt; &apos;ThisWiki:Changes_to_database&apos;,
		&apos;LocalSettings.php&apos; =&amp;gt; &apos;ThisWiki:LocalSettings.php&apos;,
		&apos;Changes_to_Monobook_skin&apos;
		  =&amp;gt; &apos;ThisWiki:Changes_to_Monobook_skin&apos;);

foreach ($table as $short =&amp;gt; $t) {
  // Move:
  foreach ($rename as $orig =&amp;gt; $new) {
    foreach (array(0 =&amp;gt; &apos;&apos;, 1 =&amp;gt; &apos;Talk&apos;) as $old_ns =&amp;gt; $old_name) {
      printf(&quot;UPDATE %s\n&quot;
	     . &quot;SET %s_title = &apos;%s&apos;\n&quot;
	     . &quot;WHERE %s_title = &apos;%s&apos; AND %s_namespace = %d;\n&quot;,
	     $t, $short, $new, $short, $orig, $short, $old_ns);
    }
  }
  // Fix namespace:
  foreach ($namespaces as $num =&amp;gt; $name) {
    foreach (array(0 =&amp;gt; &apos;&apos;, 1 =&amp;gt; &apos;Talk&apos;) as $old_ns =&amp;gt; $old_name) {
      printf(&quot;UPDATE %s\n&quot;
	     . &quot;SET %s_title = REPLACE(%s_title, &apos;%s:&apos;, &apos;&apos;), &quot;
	     . &quot;%s_namespace = %d\n&quot;
	     . &quot;WHERE %s_title LIKE &apos;%s:%%&apos; AND %s_namespace = %d;\n&quot;,
	     $t, $short, $short, $name, $short, $num + $old_ns,
	     $short, $name, $short, $old_ns);
    }
  }
}
?&amp;gt;
&lt;/pre&gt;

&lt;p&gt;It&apos;s dangerous to show this code, because someone may come to this page after a Web search and erroneously think this is the way to introduce namespaces in MediaWiki or something.  I&apos;ll say it again: Don&apos;t use this!&lt;/p&gt;

&lt;p&gt;Unfortunately, generating SQL statements by-hand is a dirty little secret of database maintenance.  I&apos;ve seen database maintenance done by evaluating SQL commands one-at-time more often than I&apos;d like.  Instead of being programmatic and more efficient, &quot;easter egging&quot; methods often introduce typos by either rousing &quot;copy and paste&quot; hell or a &quot;search and replace&quot; hell, and therefore risks typo errors and who knows what else.  Writing database maintenance scripts programmaticaly enables you to work as a single transaction and study the results in each iteration.  This quality forces one to use a test version of the data and avoid another database &lt;em&gt;faux pas&lt;/em&gt; -- working on live databases.&lt;/p&gt;</description>
  <comments>http://aaronhawley.livejournal.com/21687.html</comments>
  <category>database</category>
  <category>programming</category>
  <category>free software</category>
  <category>software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/21031.html</guid>
  <pubDate>Sun, 19 Apr 2009 06:08:32 GMT</pubDate>
  <title>Study Emacs with Lisp or natural language?</title>
  <link>http://aaronhawley.livejournal.com/21031.html</link>
  <description>There was a back and forth between Emacs bloggers Jared Dilettante and Ian Eure about whether Emacs users should &lt;a href=&quot;http://curiousprogrammer.wordpress.com/2009/04/16/dangerous-elisp/&quot;&gt;write Emacs Lisp code for their own purposes&lt;/a&gt; or whether &lt;a href=&quot;http://atomized.org/2009/04/central-documentation-and-wasted-effort/&quot;&gt;working in Emacs Lisp should primarily be in support of existing modes&lt;/a&gt;--and with the mode&apos;s documentation thoroughly read.  At this point, the argument has fizzled out, but its worth pointing out that a manual for &lt;a href=&quot;http://www.geocities.com/kensanata/emacs-sql.html&quot;&gt;SQL mode&lt;/a&gt; doesn&apos;t seem to exist.  SQL mode, like most Emacs modes, is &lt;a href=&quot;http://www.emacswiki.org/emacs/SelfDocumentation&quot;&gt;self-documented&lt;/a&gt; well.  However, this argument is evidence that it could probably use a manual.&lt;br /&gt;&lt;br /&gt;As someone who&apos;s neither a trained writer nor a good one, I know that writing in one&apos;s own spoken language is difficult.  However, writing concise documentation about Emacs can be just as important as writing Emacs Lisp code, if not maybe more so.  Writing documentation will give you a deeper understanding of how something works and help you learn things you didn&apos;t already know.   It&apos;s also important because the documentation you write will help someone else to learn how to use Emacs, too.&lt;br /&gt;&lt;br /&gt;Documenting Emacs also improves your Emacs Lisp skills because you&apos;ll likely be reading other hacker&apos;s Emacs Lisp code.  Most important of all you&apos;ll be working on existing code for Emacs rather than making more when it is not entirely necessary to reinvent the wheel.&lt;br /&gt;&lt;br /&gt;Don&apos;t get me wrong.  It&apos;s fine to twiddle code.  Reinventing the wheel is the basis for higher education and university study and critical to life-long learning.  However, writing code and championing your work as a solution only acts to avoid studying and maintaining existing code and risks distracting the Emacs community from progress.  In a way, it&apos;s almost anti-social.&lt;br /&gt;&lt;br /&gt;I know some Emacs hackers think multiple implementations are important, and &quot;I wouldn&apos;t have learned as much if I didn&apos;t manage my own Emacs package&quot;.  These arguments are spurious, though.  One should be able to earn these same benefits--and more--by joining in on an existing project, rather than forking a new one.  It may take more effort but its the right thing to do and is under my column of &quot;best practices&quot;.&lt;br /&gt;&lt;br /&gt;The &lt;a href=&quot;http://www.gnu.org/copyleft/gpl.html&quot;&gt;GNU General Public License&lt;/a&gt; gives the Emacs hacker a lot of freedom, but we all could still use the occasional self-discipline.</description>
  <comments>http://aaronhawley.livejournal.com/21031.html</comments>
  <category>programming</category>
  <category>emacs</category>
  <category>free software</category>
  <category>software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/20794.html</guid>
  <pubDate>Mon, 13 Apr 2009 04:22:13 GMT</pubDate>
  <title>Cheap tricks in Emacs: Elisp manual</title>
  <link>http://aaronhawley.livejournal.com/20794.html</link>
  <description>Another subtle feature of Emacs that I hope doesn&apos;t go away any time soon is an easy way get to the Elisp manual.  The key sequence is  `&lt;kbd&gt;C-h r TAB RET&lt;/kbd&gt;&apos;.&lt;br /&gt;&lt;br /&gt; Here&apos;s how it works.  In Emacs 22, a new key binding appeared to access the Emacs manual, `&lt;kbd&gt;C-h r&lt;/kbd&gt;&apos;.  Conveniently the first cross reference in the Emacs manual is &quot;See Emacs Lisp(elisp)&quot;.  Hitting `&lt;kbd&gt;TAB&lt;/kbd&gt;&apos; skips you to the first cross reference, then `&lt;kbd&gt;RET&lt;/kbd&gt;&apos; follows the cross reference.</description>
  <comments>http://aaronhawley.livejournal.com/20794.html</comments>
  <category>emacs</category>
  <category>free software</category>
  <category>software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/20592.html</guid>
  <pubDate>Tue, 07 Apr 2009 04:16:21 GMT</pubDate>
  <title>DrScheme v. Emacs: Inferior REPL buffer</title>
  <link>http://aaronhawley.livejournal.com/20592.html</link>
  <description>&lt;a href=&quot;http://blog.plt-scheme.org/2009/03/drscheme-repl-isnt-lisp.html&quot;&gt;Interesting discussion on how the REPL buffer of DrScheme is not like Emacs&apos;s&lt;/a&gt;.  &lt;a href=&quot;http://plt-scheme.org/&quot;&gt;DrScheme&lt;/a&gt; is the GUI editor for PLT Scheme.  PLT was how I learned Scheme in school a decade ago.&lt;br /&gt;&lt;br /&gt;The argument pronounced by one of the academics who oversees the software&apos;s maintenance is essentially that having an inferior buffer to send and evaluate Scheme expressions is confusing for pedagogical reasons, and even to non-students.  Years later, many of PLT followers and supporters want this feature.  I recall seeing a PLT researcher who would argue that PLT was real-world, production-ready software.  &lt;br /&gt;&lt;br /&gt;My favorite is that the author starts it as a letter with the caustic greeting &quot;Dear old Lisper&quot;.  I&apos;ve never seen the author speak but have heard of his self-sown reputation as an &lt;a href=&quot;http://www.ccs.neu.edu/home/matthias/&quot;&gt;iconoclast&lt;/a&gt;.</description>
  <comments>http://aaronhawley.livejournal.com/20592.html</comments>
  <category>scheme</category>
  <category>emacs</category>
  <category>programming languages</category>
  <category>free software</category>
  <category>software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/20141.html</guid>
  <pubDate>Fri, 27 Mar 2009 19:55:20 GMT</pubDate>
  <title>Shell hack: Min function</title>
  <link>http://aaronhawley.livejournal.com/20141.html</link>
  <description>&lt;p&gt;I couldn&apos;t find a minimum function for my shell scripting, nor a utility on GNU/Linux, so I am using this function.&lt;/p&gt;

    &lt;pre&gt;
&lt;span style=&quot;color: #b22222;&quot;&gt;###&lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;
&lt;/span&gt; &lt;span style=&quot;color: #b22222;&quot;&gt;# &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;min NUM ...
&lt;/span&gt; &lt;span style=&quot;color: #b22222;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;
&lt;/span&gt; &lt;span style=&quot;color: #b22222;&quot;&gt;# &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;Find smallest value of NUMs.
&lt;/span&gt; &lt;span style=&quot;color: #b22222;&quot;&gt;##&lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color: #a020f0;&quot;&gt;function&lt;/span&gt; min() {
    &lt;span style=&quot;color: #da70d6;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;$@&quot;&lt;/span&gt; | tr &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&apos;[[:space:]]&apos;&lt;/span&gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&apos;\n&apos;&lt;/span&gt; \
     | grep -Ee &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&apos;^-?[[:digit:],]+(.[[:digit:]]*)?$&apos;&lt;/span&gt; \
     | sort -n | sed 1q
} &lt;span style=&quot;color: #b22222;&quot;&gt;## &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;end min
&lt;/span&gt;&lt;/pre&gt;

It supports floating point numbers with decimal notation, but does not support exponential notation or other.

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

&lt;p&gt;&lt;code&gt;min 1 0.2 1,023.56 -0 -1.3&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Gives: -1.3&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;max&lt;/code&gt; function is the same thing but needing to change either&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;kbd&gt;sort -nr&lt;/kbd&gt;&lt;/li&gt;&lt;li&gt;&lt;kbd&gt;sed &apos;$p;d&apos;&lt;/kbd&gt;&lt;/li&gt;&lt;li&gt;&lt;kbd&gt;sed -n &apos;$p&apos;&lt;/kbd&gt;&lt;/li&gt;&lt;/ul&gt;</description>
  <comments>http://aaronhawley.livejournal.com/20141.html</comments>
  <category>programming</category>
  <category>unix</category>
  <category>howto</category>
  <lj:security>public</lj:security>
  <lj:reply-count>7</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/19769.html</guid>
  <pubDate>Thu, 12 Mar 2009 20:51:34 GMT</pubDate>
  <title>PHP gets Lambda</title>
  <link>http://aaronhawley.livejournal.com/19769.html</link>
  <description>PHP has always had a hackish way to support first-class functions by making it possible to assign anonymous functions with &lt;a href=&quot;http://php.net/create_function&quot;&gt;&lt;code&gt;create_function&lt;/code&gt;&lt;/a&gt; and run them with any functions that support callbacks (See &lt;a href=&quot;http://php.net/array_map&quot;&gt;&lt;code&gt;array_map&lt;/code&gt;&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;PHP 5.3 (unreleased as of 2009-03-12) will introduce &lt;a href=&quot;http://wiki.php.net/rfc/closures&quot;&gt;Lambda functions and closures&lt;/a&gt;.  I&apos;m not really sure if the implementation is sound or complete, but I&apos;m sure there are enough functional programming language implementations and progammers to make sure its *doing the right thing*.  I&apos;m very glad because I was afraid PHP was going to be steered backwards by &lt;a href=&quot;http://blog.libssh2.org/index.php?/archives/60-create_function-is-not-your-friend.html&quot;&gt;opinions like this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;See also IBM Developer Works, which had an article on these forthcoming features in &lt;a href=&quot;http://www.ibm.com/developerworks/opensource/library/os-php-5.3new2/index.html&quot;&gt;What&apos;s new in PHP V5.3, Part 2: Closures and lambda functions&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Someone asked recently what the design philosophy of PHP was.  I had to say, &quot;PHP was meant to be a server-side include system for HTML documents with a Perl syntax. It&apos;s been trying to outrun its heritage ever since.&quot;</description>
  <comments>http://aaronhawley.livejournal.com/19769.html</comments>
  <category>php</category>
  <category>programming languages</category>
  <category>lambda</category>
  <category>free software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/19234.html</guid>
  <pubDate>Tue, 23 Dec 2008 21:09:44 GMT</pubDate>
  <title>Load all meta data of files into PostgreSQL</title>
  <link>http://aaronhawley.livejournal.com/19234.html</link>
  <description>&lt;p&gt;In the previous installment, I quickly showed how to use &lt;a href=&quot;http://www.gnu.org/software/findutils/&quot;&gt;GNU Findutils&lt;/a&gt; to load file system meta information into a PostgreSQL database.  I did so using a comma separated value (CSV) file generated from a tab delimited file.  The us of tabs limited the data set to files without newlines or tabs in their names.  Here I will show how to load any file name.&lt;/p&gt;

&lt;p&gt;The &lt;kbd&gt;find&lt;/kbd&gt; command can output all possible files by separating the fields in the output with nulls, and each line by double nulls.&lt;/p&gt;

&lt;p&gt;Here&apos;s the new &lt;code&gt;-printf&lt;/code&gt; statement that outputs nulls between records, and two nulls between each line.&lt;/p&gt;

&lt;p&gt;
&lt;tt&gt;$ &lt;/tt&gt;&lt;kbd&gt;find / -printf &apos;%i\0%f\0%p\0%h\0%y\0%u\0%U\0%g\0%G\0%M\0%m\0%s\0%b\0%k\0%l\0%n\0%AY-%Am-%Ad %AH:%AM:%AS\0%TY-%Tm-%Td %TH:%TM:%TS\0%CY-%Cm-%Cd %CH:%CM:%CS\0%F\0%D\0\0&apos; &amp;gt; finddb.txt&lt;/kbd&gt;
&lt;/p&gt;

&lt;p&gt;This Perl scriptlet will convert the output to CSV.&lt;/p&gt;

&lt;p&gt;
&lt;tt&gt;$ &lt;/tt&gt;&lt;kbd&gt;perl -mText::CSV_XS -e &apos;my $csv = Text::CSV_XS-&amp;gt;new ({ binary =&amp;gt; 1, eol =&amp;gt; $/ }); my $n = 21; my @c = (); local $/ = &quot;\0\0&quot;;&apos; -ne &apos;$_ .= &quot;\n&quot;; push(@c, split(/\0/)); pop(@c); if ($#c + 1 &amp;lt; $n) {next;} elsif ($#c + 1 &amp;gt; $n) {pop; if ($csv-&amp;gt;combine(@c[0 .. $n - 1])) {print $csv-&amp;gt;string;} else {printf STDERR $csv-&amp;gt;error_input;} @c = @c[$n .. $#_];}&apos; -e &apos;if (@c &amp;gt; 0) {printf STDERR (&quot;Extra fields at the end\n&quot;);}&apos; finddb.txt &amp;gt; finddb.csv&lt;/kbd&gt;
&lt;/p&gt;

&lt;p&gt;Coincidentally, double-nulls don&apos;t help delimit records in the output, since they could be confused as an empty field.  So the script above keeps an internal tally of fields in a record, and is hard-coded as 21.  Thus, when enough null-delimited fields are read, then the next record is read.&lt;/p&gt;

&lt;p&gt;With the resulting CSV file, loading into PostgreSQL is as easy as the following command.&lt;/p&gt;

&lt;p&gt;
&lt;tt&gt;$ &lt;/tt&gt;&lt;kbd&gt;psql -c &apos;\copy finddb from STDIN CSV FORCE NOT NULL path, symlink&apos; &amp;lt; finddb.csv&lt;/kbd&gt;
&lt;/p&gt;

&lt;p&gt;I put the CSV file generation bits together in a Perl script, &lt;a href=&quot;http://agave.garden.org/~aaronh/perl/find-csv.pl&quot;&gt;find-csv.pl&lt;/a&gt;.  It tries to maintain the consistency between GNU findutils &lt;code&gt;-printf&lt;/code&gt; formatting fields, the names of database columns, and the Perl code for generating CSV files.&lt;/p&gt;

&lt;p&gt;In a follow-up, I will give more tastings on possible database queries that can be made of this file system information.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;http://excession.spiral-arm.org/jay/&quot;&gt;James Youngman&lt;/a&gt; for reading a previous version of this article.  This post is the result of just one of his generous comments.&lt;/p&gt;</description>
  <comments>http://aaronhawley.livejournal.com/19234.html</comments>
  <category>database</category>
  <category>programming</category>
  <category>unix</category>
  <category>howto</category>
  <category>free software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/18533.html</guid>
  <pubDate>Thu, 11 Dec 2008 17:20:23 GMT</pubDate>
  <title>Samsung&apos;s YP-S2 flash player</title>
  <link>http://aaronhawley.livejournal.com/18533.html</link>
  <description>The &lt;a href=&quot;http://www.samsung.com/us/consumer/detail/detail.do?group=audiovideo&amp;amp;type=mp3players&amp;amp;subtype=flashmemory&amp;amp;model_cd=YP-S2ZB/XAA&quot;&gt;Samsung S2&lt;/a&gt; (YP-S2) is a new flash memory music player that advertises on the box to play &quot;Ogg&quot;.  At $40, it&apos;s one of the most inexpensive Ogg Vorbis playing devices yet.  The 1GB media players lacks a touch screen or any type of screen for that matter.  Its only interface are universally recognized playback buttons that include volume control.  It has a complicated &quot;Smart Button&quot; that you either press or hold while in different modes for different meanings, including changing either the sound engine, playback mode, turning off the LED light, changing the play list, and making new play lists.  It&apos;s &quot;smart&quot; because you need to be smart to use it.  &lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://pics.livejournal.com/aaronhawley/pic/00002fhh&quot; width=&quot;200&quot; height=&quot;150&quot; alt=&quot;Samsung S2 glowing LED&quot; /&gt;&lt;br /&gt;(Fits in the palm of your hand.)&lt;br /&gt;&lt;br /&gt;Marketed as &quot;the pebble&quot;, it is small and light.  Pictures on the Web don&apos;t really communicate its compactness until you experience it in-person.  I assumed it was the size of a hockey puck, but it fits the middle of your hand.  For better photos of the S2, see &lt;a href=&quot;http://www.anythingbutipod.com/archives/2008/06/samsung-s2-pebble-review.php&quot;&gt;the review of the S2 at anything but ipod.com&lt;/a&gt;.  The sound quality is surprisingly good.  Samsung is trying to compete with Apple&apos;s iPod Shuffle by price-point, but is a better alternative since it has out-of-the-box Ogg Vorbis support.  The iPod shuffle is not compared here.&lt;br /&gt;&lt;br /&gt;The S2 comes with a pair of earphones, a USB adapter and a tiny installation CD.  It requires being charged by USB when you take it out of the box.  The manual suggests charging for 2 hours.  The subtle and translucent LED light turns from red to green when the battery is fully charged.  While waiting for the S2 to charge, you should be transferring your files (see below).  The transfer rates are slow for USB (less than 1MB per second), but you can fill the S2 with 25 to 30 albums of music in 15 minutes.  (Copying from the drive is at speeds around 4MB per second.)&lt;br /&gt;&lt;br /&gt;The earphones have a special adapter on the plug to clasp the pebble tightly.  Combined with a nylon neck strap on the headphones, the S2 hangs on your chest quite comfortably.  The lanyard provides another nickname for the device, &quot;pendant&quot;.  There&apos;s no clothing clip for the S2, but securing it would only be necessary if you were bouncing during aerobic activity.&lt;br /&gt;&lt;br /&gt;The USB adapter for the S2 plugs into the same hole as the headphones.  After connecting the USB adapter into a GNU/Linux machine, it will be mounted as USB mass storage device called &quot;S2&quot;.  There are 3 folders on the S2 -- music, playlist and system.  I removed the demo mp3 files in the music folder and the one playlist file.  I copied my collection of Ogg files from the command-line with the command &lt;kbd&gt;cp -a ~/music/* /mnt/S2/Music&lt;/kbd&gt;.&lt;br /&gt;&lt;br /&gt;Its not clear if any of the default folders of the S2 are necessary.  They don&apos;t take up much space.  Should removing them disable the player, there&apos;s a system reset button available in a pin hole that advertises to re-initialize the system when the S2 &quot;won&apos;t play music, or isn&apos;t recognized by your computer when you connect it.&quot;&lt;br /&gt;&lt;br /&gt;Features like upgrading the firmware and programming playlists are available through the proprietary software that only runs on Microsoft Windows.  The device also enforces &lt;a href=&quot;http://www.defectivebydesign.org/&quot;&gt;Digital Restrictions Management&lt;/a&gt; -- by not playing them.  Fortunately, you can avoid these drawbacks by using Ogg Vorbis, and not downloading DRM-encumbered files.  You can manage the playlists from the player itself, but the button-pressing to do this is gruesome and playlists are limited to only 30 songs, anyway.  Since there isn&apos;t a way to navigate albums (folders), a playlist with a song from each album on the player would be useful, however.  According to the &lt;a href=&quot;http://wiki.xiph.org/index.php/PortablePlayers&quot;&gt;Portable players page at Xiph&lt;/a&gt; there are no techniques to over ride the S2&apos;s firmware, yet.&lt;br /&gt;&lt;br /&gt;The battery is advertised to last 13 hours, though that&apos;s hard to believe.  The ability to disable the LED light (see below) would probably not lengthen the battery&apos;s charge.  Turning down the volume would probably work better.  The battery does not appear to be replaceable, either.  The battery is likely covered by Samsung&apos;s one year warranty, however.&lt;br /&gt;&lt;br /&gt;The &lt;a href=&quot;http://ars.samsung.com/customer/usa/jsp/faqs/faqs_view.jsp?isREL=Y&amp;amp;SITE_ID=1&amp;amp;AT_ID=133075&amp;amp;ARS_ID=8443692&quot;&gt;S2&apos;s LED indicator&lt;/a&gt; is the only visual display -- if you can call it that.  There is a beeping system as well.  In addition to the battery status (see above), the light is blue when the player is turned on.  The LED is blue during regular playback, and red if playing a playlist.  If in shuffle mode, it cycles between all the colors (including green).  It signals red when the power is low, too.  Should you get sick of the light show, you can disable it by pausing the music, then holding the Smart button.  Doing the same again turns it back on.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://pics.livejournal.com/aaronhawley/pic/0000312t&quot; height=&quot;150&quot; width=&quot;125&quot; alt=&quot;Samsung S2 with headphones&quot; /&gt;&lt;br /&gt;(The S2&apos;s LED is glowing blue)&lt;br /&gt;&lt;br /&gt;If you don&apos;t have a USB adapter for your car stereo, then you&apos;ll need to purchase either an FM transmitter or get a standard 3.5 mm (1/8&quot;) audio cable (&lt;a href=&quot;http://en.wikipedia.org/wiki/TRS_connector&quot;&gt;TRS&lt;/a&gt;).  Unfortunately, there&apos;s no way to charge the device while it plays, but it could be charged in a USB car adapter that plugs into the cigarette lighter.&lt;br /&gt;&lt;br /&gt;Besides the S2&apos;s proprietary software support, the other major design flaw is the location of the headphone jack.  The instinct is to hold the headphone wire at the bottom of one&apos;s hand and use the thumb to hit buttons.  Instead, the jack is at the top of the device.  So when you grab the S2 upside down, adjust the volume slowly.  You may be cranking it up when you mean to turn it down.  Although not person-oriented, this configuration is natural for when the device is plugged into something else, like a stereo.&lt;br /&gt;&lt;br /&gt;Samsung will likely be releasing a 2GB version of the player.  This might be handy, but you&apos;ll run up against battery capacity before playing the first gigabyte of songs.  I&apos;d prefer owning two 1GB for that reason.  With two you get more battery, and on a really long car trip you could have one charging while the other is playing.&lt;br /&gt;&lt;br /&gt;Samsung should do more to support free software operating systems with the S2.  But, this is not surprise since &lt;a href=&quot;http://boycottnovell.com/2008/07/16/microsoft-and-samsung/&quot;&gt;Samsung is a deal-maker and collaborator with Microsoft against GNU/Linux&lt;/a&gt;.  Regardless of their hostility, the player is a great way to support the &lt;a href=&quot;http://playogg.org&quot;&gt;Play Ogg!&lt;/a&gt; movement.</description>
  <comments>http://aaronhawley.livejournal.com/18533.html</comments>
  <category>unix</category>
  <category>free software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/18216.html</guid>
  <pubDate>Wed, 10 Dec 2008 21:33:54 GMT</pubDate>
  <title>Emacs 23 fonts</title>
  <link>http://aaronhawley.livejournal.com/18216.html</link>
  <description>Here&apos;s another &quot;look at the shiny fonts in Emacs 23&quot; screenshot.  I compare it with Emacs 22.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/ashawley/3098095867/&quot; title=&quot;emacs-22v23 by ashawley, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3054/3098095867_2a870cdec3.jpg&quot; width=&quot;245&quot; height=&quot;500&quot; alt=&quot;emacs-22v23&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Click to see bigger versions at flickr.</description>
  <comments>http://aaronhawley.livejournal.com/18216.html</comments>
  <category>emacs</category>
  <category>free software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/18139.html</guid>
  <pubDate>Fri, 05 Dec 2008 22:14:14 GMT</pubDate>
  <title>Cheap tricks in Emacs: Buffers</title>
  <link>http://aaronhawley.livejournal.com/18139.html</link>
  <description>One nice feature of Emacs, that is as old as Emacs itself, are &lt;a href=&quot;http://www.gnu.org/software/emacs/manual//html_node/emacs/Buffers.html&quot;&gt;buffers&lt;/a&gt;.  Most Emacs users like them because you can have multiple buffers open at once and work on many things at once.  And for the record, I&apos;m actually a big fan of the &lt;a href=&quot;http://www.gnu.org/software/emacs/manual//html_node/emacs/List-Buffers.html&quot;&gt;Emacs buffer menu&lt;/a&gt;.  It looks primitive compared to a &lt;a href=&quot;http://www.emacswiki.org/emacs/TabBarMode&quot;&gt;tab bar&lt;/a&gt; or some such, but it gets things done.  But the Emacs buffer list isn&apos;t the embarrassing way I use buffers.&lt;br /&gt;&lt;br /&gt;I like buffers because they&apos;re &lt;em&gt;inexpensive&lt;/em&gt;.  &quot;Cheap&quot; as in they don&apos;t cost a lot to open.  I often have arbitrary text with an ephemeral quality that I want to edit.  I suppose the scratch buffer is the appropriate place to edit text with a short shelf-life.  But I often run `&lt;kbd&gt;C-x b b&lt;/kbd&gt;&apos; to open a buffer called &quot;b&quot;.  If I need another I&apos;ll often type `&lt;kbd&gt;C-x b b b&lt;/kbd&gt;&apos; to open another named &quot;bb&quot;.  Obviously I name the buffers of varying lengths of &quot;b&quot; since &quot;b&quot; is also the last character that&apos;s part of the &quot;switch to buffer&quot; command.  Since the buffer &quot;b&quot; doesn&apos;t exist for switching to, Emacs creates an empty one for you. &lt;br /&gt;&lt;br /&gt;Opening a blank buffer opens in the blink of an eye -- faster than it takes to request it.  It isn&apos;t associated with a file anywhere.  Although, you can later, and you may want to if you the file grows to something worth saving.  With a blank buffer, you can call an &lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Major-Modes.html&quot;&gt;Emacs mode&lt;a&gt; (or &lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Minor-Modes.html&quot;&gt;minor mode&lt;/a&gt;) that is appropriate for the text you&apos;re editing.  Sometimes a mode like &lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Mail-Mode.html&quot;&gt;Mail mode&lt;/a&gt; or &lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Mode.html&quot;&gt;Shell mode&lt;/a&gt; are useful.  More than likely I&apos;m copying in text from another program to use Emacs&apos;s &lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Rectangles.html&quot;&gt;rectangle commands&lt;/a&gt; to transform text, or unconditional &lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexp-Replace.html&quot;&gt;regular expression replacement&lt;/a&gt; or on occasion using &lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Keyboard-Macros.html&quot;&gt;keyboard macros&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Opening buffers with no file on disk associated means when you kill the buffer the data is gone -- unless its in the &lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Kill-Ring.html&quot;&gt;kill-ring&lt;/a&gt;.  Emacs won&apos;t ask if you&apos;re sure and can be a bit dangerous, but as I said, use `&lt;kbd&gt;C-x C-w&lt;/kbd&gt;&apos; to save.  This also has the added benefit of using Emacs&apos;s always reliable &lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Auto-Save.html&quot;&gt;Auto-save&lt;/a&gt; feature.&lt;br /&gt;&lt;br /&gt;Do folks have other small ways they use Emacs that definitely isn&apos;t described in the manual and doesn&apos;t necessarily seem &lt;em&gt;correct&lt;/em&gt;, but helps them get things done and they wouldn&apos;t want to give up?&lt;/a&gt;&lt;/a&gt;</description>
  <comments>http://aaronhawley.livejournal.com/18139.html</comments>
  <category>emacs</category>
  <category>free software</category>
  <category>software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/17912.html</guid>
  <pubDate>Tue, 25 Nov 2008 18:30:46 GMT</pubDate>
  <title>Why [everyone] should be involved in free software</title>
  <link>http://aaronhawley.livejournal.com/17912.html</link>
  <description>&lt;blockquote&gt;&lt;q&gt;There are two different sides of [why it is important to get women involved in free software].  One of them is for women themselves; to empower women who are using technology in general.  And I think free software is a natural choice for doing the right thing.  In the sense that if you want to empower yourself, proprietary software is not the right way to do so.  Free software gives you more possibility.  It&apos;s really you in charge of machines, of computers, of code, of everything and I think that&apos;s important.&lt;/q&gt;&lt;br /&gt;&lt;br /&gt;&lt;q&gt;The other reason it is important, is as a technical person, I think the more differing views we have to solve a technical problem the better. We know by fact that women in general -- I know there are exceptions, I&apos;m not saying there are none -- have a different approach to solving problems than men do.  So I think with the combination of more mixed people working in information technology we would have more interesting results from it.&lt;/q&gt; -- &lt;a href=&quot;http://en.wikipedia.org/wiki/Fernanda_G._Weiden&quot;&gt;Fernanda Weiden&lt;/a&gt;&lt;/blockquote&gt;</description>
  <comments>http://aaronhawley.livejournal.com/17912.html</comments>
  <category>gender</category>
  <category>free software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/17488.html</guid>
  <pubDate>Mon, 24 Nov 2008 03:16:25 GMT</pubDate>
  <title>Cheers to Internet Explorer 7</title>
  <link>http://aaronhawley.livejournal.com/17488.html</link>
  <description>I&apos;m in Utah on vacation, and happen to be using a friend&apos;s computer.  It has Windows Vista Home edition.  And it also has Intenet Explorer 7 (IE7).  I&apos;ve used IE7 once before when &lt;a href=&quot;http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;amp;articleId=9057618&quot;&gt;Windows Update snuck it by me&lt;/a&gt;.  (I used to run Windows Update a lot as a computer tech in the public school system.)  I vowed to avoid Internet Explorer 7 forever, but we meet again.&lt;br /&gt;&lt;br /&gt;It&apos;s not too bad, except the tabbed browsing is extremely slow.  I can take a sip of tea every time a new tab is opened.&lt;br /&gt;&lt;br /&gt;I haven&apos;t done any thorough Web design work with IE 7, but I have spoken with people who work in those mines, and apparently &lt;a href=&quot;http://en.wikipedia.org/wiki/Internet_Explorer_7#Standards_support&quot;&gt;Internet Explorer&apos;s following of Web standards&lt;/a&gt; is as weak as ever.&lt;br /&gt;&lt;br /&gt;Suggesting free software alternatives has never been easier.  Unfortunately, the Microsoft monopoly is probably worse than it was 10 years ago.  I wonder what the Barack Obama Justice Department will do?</description>
  <comments>http://aaronhawley.livejournal.com/17488.html</comments>
  <category>microsoft</category>
  <category>free software</category>
  <category>software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://aaronhawley.livejournal.com/17177.html</guid>
  <pubDate>Sun, 16 Nov 2008 20:44:44 GMT</pubDate>
  <title>Kickstarting a QEMU image with Fedora</title>
  <link>http://aaronhawley.livejournal.com/17177.html</link>
  <description>&lt;a href=&quot;https://fedoraproject.org/wiki/Make_QEMU_image_with_kickstart&quot;&gt;Making a QEMU image with kickstart&lt;/a&gt; would make it easier to build virtual Fedora systems.  Consequently, this could help create a team of virtual RPM-building servers at my work.&lt;br /&gt;&lt;br /&gt;Turn on, build everything, shut off.</description>
  <comments>http://aaronhawley.livejournal.com/17177.html</comments>
  <category>unix</category>
  <category>howto</category>
  <category>free software</category>
  <category>software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
</channel>
</rss>
