<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-21734857</id><updated>2012-01-02T16:29:07.044-06:00</updated><category term='pictures'/><category term='animals'/><category term='media'/><category term='yahoo'/><category term='cryptography'/><category term='finance'/><category term='safari css keyboarding accessibility'/><category term='movies'/><category term='books'/><category term='comics'/><category term='perl'/><category term='scifi'/><category term='environment'/><category term='privacy'/><category term='eeepc'/><category term='belize'/><category term='firefox'/><category term='redhat'/><category term='travel'/><category term='n800'/><category term='python'/><category term='rss'/><category term='dams'/><category term='vim'/><category term='zendcon08'/><category term='rant'/><category term='database'/><category term='science'/><category term='rfid'/><category term='humor'/><category term='linux'/><category term='apache'/><category term='clouds'/><category term='centos'/><category term='sunset'/><category term='diy'/><category term='mysql'/><category term='photography'/><category term='php'/><category term='x11'/><category term='vmware'/><category term='oscon07'/><category term='security'/><category term='politics'/><category term='culture'/><category term='lake'/><category term='zendcon09'/><category term='mindbending'/><category term='music'/><category term='ssh'/><category term='sunrise'/><category term='literature'/><category term='energy'/><category term='wireless'/><category term='software'/><category term='flickr'/><category term='startrek'/><category term='history'/><category term='microsoft'/><category term='mp3'/><category term='e-voting'/><category term='ubuntu'/><category term='blogging'/><category term='writing'/><category term='google'/><title type='text'>Carl's Whine Rack</title><subtitle type='html'>Using GNU/Linux through creative laziness (and other topics as they strike my fancy)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default?start-index=101&amp;max-results=100'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>244</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-21734857.post-5403309915691355621</id><published>2011-08-24T07:38:00.004-05:00</published><updated>2011-08-24T07:53:10.386-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>setting the session.cookie_path in PHP (redirection loop)</title><content type='html'>This is a quick note about a bug in some PHP code I was working on the other day. It took me a while to figure it out. I was developing and initially testing in google chrome, which is evidently forgiving of this kind of error. Maybe writing this will help someone (and maybe it'll help me not to make the same mistake again).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This was for an application which requires authentication. The controller sends the browser a redirect (to the login URL) if the user is not authenticated. I had set the cookie path with something like the following:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;$baseUrl = 'https://www.example.com/gakkk/';&lt;br /&gt;// several lines later...&lt;br /&gt;ini_set('session.cookie_path', $baseUrl);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This worked OK in chrome, but Firefox and MSIE both got locked up in redirection loops. After scratching my head for a while, I finally figured out that I should be doing this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;ini_set('session.cookie_path', '/gakkk/');&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The cookie_path (it has that name for a reason) should exclude the protocol, hostname, and port. Information security auditors like to complain about web applications that don't set the cookie path.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5403309915691355621?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5403309915691355621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5403309915691355621' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5403309915691355621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5403309915691355621'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2011/08/setting-sessioncookiepath-in-php.html' title='setting the session.cookie_path in PHP (redirection loop)'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-4366771159977423334</id><published>2011-07-14T07:39:00.001-05:00</published><updated>2011-07-14T07:42:20.379-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Testing an SSL-enabled service for cipher strength</title><content type='html'>&lt;div class="content clear-block"&gt;     &lt;p&gt;Vulnerability scans sometimes find that an SSL-enabled service  allows clients to connect using ciphers which have key lengths shorter  than 128 bits. Most services have configuration directives to disable  these connections. Here's how to test a service for key length (without  doing a new nessus scan, or whatever).&lt;/p&gt; &lt;p&gt;openssl ciphers -v&lt;/p&gt; &lt;p&gt;This gives a list of ciphers that the openssl client can use, and the  output indicates the key length. openssl's s_client command can take an  argument which specifies the cipher(s) to use. So after reconfiguring  the server, run the following two commands (the first should fail, and  the second should succeed):&lt;/p&gt; &lt;p&gt;openssl s_client -ign_eof -connect target:port -cipher RC4-MD5&lt;/p&gt; &lt;p&gt;openssl s_client -ign_eof -connect target:port -cipher  DHE-RSA-AES256-SHA&lt;/p&gt; &lt;p&gt;(You should replace target:port with something like www.example.com:443)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-4366771159977423334?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/4366771159977423334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=4366771159977423334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4366771159977423334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4366771159977423334'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2011/07/testing-ssl-enabled-service-for-cipher.html' title='Testing an SSL-enabled service for cipher strength'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-238279819588310350</id><published>2011-02-04T08:53:00.001-06:00</published><updated>2011-02-04T08:57:02.813-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='safari css keyboarding accessibility'/><title type='text'>Safari Issues</title><content type='html'>I learned a couple of things about Safari yesterday. When using the @import syntax for CSS, make sure you remember the semi-colon after the URL (outside the quotes):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;style type="text/css" media="screen"&amp;gt;@import "styles.css";&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Firefox and Internet Explorer are forgiving about a missing semi-colon, but Safari won't load the stylesheet without it.&lt;br /&gt;&lt;br /&gt;And by default Safari has only limited support for tabbing through Web pages (something that's probably pretty important to keyboard users). The default setting will allow you to tab from form field to form field, but you can't focus on links by tabbing. You can enable this behavior (which is behavior I've come to expect from using Firefox and Internet Explorer) by going to the Advanced tab of the Preferences menu and clicking the checkbox that says something like "Press Tab to highlight..."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-238279819588310350?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/238279819588310350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=238279819588310350' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/238279819588310350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/238279819588310350'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2011/02/safari-issues.html' title='Safari Issues'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-2996949198680978388</id><published>2010-03-14T18:51:00.003-05:00</published><updated>2010-03-14T18:58:00.666-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>added READONLY option to password wallet</title><content type='html'>Made an update to my &lt;a href="http://code.google.com/p/password-wallet/"&gt;password wallet&lt;/a&gt;. You can now have the READONLY attribute in your .walletrc file: this disables updates to the wallet (w/ the -e option). I keep my wallet in two places (work and home), and a cron job copies from work to home daily. So I need to make sure that I only update the wallet at work. I once updated it at home, and the next run of that cron job overwrote the update (a new password).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-2996949198680978388?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/2996949198680978388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=2996949198680978388' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/2996949198680978388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/2996949198680978388'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2010/03/added-readonly-option-to-password.html' title='added READONLY option to password wallet'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5720503406898333002</id><published>2010-01-29T13:15:00.010-06:00</published><updated>2010-01-29T16:41:55.547-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='privacy'/><title type='text'>panopticlick</title><content type='html'>I've seen several posts about the panopticlick project in the last few days. If you go to the &lt;a href="http://panopticlick.eff.org/"&gt;panopticlick Web page&lt;/a&gt; and click the "test me" button, it'll tell you how identifiable your Web browser is. The idea is that it might be possible for someone to track your Web browsing based solely on certain characteristics of your Web browser (without using cookies or even IP addresses).&lt;br /&gt;&lt;br /&gt;So I hit the "test me" page with several different kinds of browsers to see what kind of results I would get. The results are given below (all Firefox browsers below have the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/722"&gt;NoScript&lt;/a&gt; extension). In terms of security, these are like golf scores: you want low numbers in the second (BII="bits of identifying information") and third (NIF="number of identical fingerprints") columns. And in terms of security, being unique is bad (it makes it easy to identify you).&lt;br /&gt;&lt;br /&gt;&lt;div class="bordered-table-container"&gt;&lt;br /&gt;&lt;table border="1" cellpadding="5" cellspacing="0" style="overflow: scroll;"&gt;&lt;br /&gt;&lt;thead&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;browser/platform&lt;/th&gt;&lt;br /&gt;&lt;th&gt;&lt;acronym title="bits of identifying information"&gt;BII&lt;/acronym&gt;&lt;/th&gt;&lt;br /&gt;&lt;th&gt;&lt;acronym title="number of identical fingerprints"&gt;NIF&lt;/acronym&gt;&lt;/th&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/thead&gt;&lt;br /&gt;&lt;tbody&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;MSIE7 on XP&lt;/td&gt;&lt;br /&gt;&lt;td&gt;17.64&lt;/td&gt;&lt;br /&gt;&lt;td&gt;unique in 204,788&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Firefox 3.6 on XP&lt;/td&gt;&lt;br /&gt;&lt;td&gt;8.62&lt;/td&gt;&lt;br /&gt;&lt;td&gt;one in 392&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Firefox 3.6 on Ubuntu&lt;/td&gt;&lt;br /&gt;&lt;td&gt;12.64&lt;/td&gt;&lt;br /&gt;&lt;td&gt;one in 6,364&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;MSIE6 via &lt;a href="http://www.winehq.org/"&gt;wine&lt;/a&gt; on Ubuntu&lt;/td&gt;&lt;br /&gt;&lt;td&gt;17.66&lt;/td&gt;&lt;br /&gt;&lt;td&gt;unique in 207,713&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;lynx on Ubuntu&lt;/td&gt;&lt;br /&gt;&lt;td&gt;14.67&lt;/td&gt;&lt;br /&gt;&lt;td&gt;one in 26,001&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;elinks on Ubuntu&lt;/td&gt;&lt;br /&gt;&lt;td&gt;17.67&lt;/td&gt;&lt;br /&gt;&lt;td&gt;unique in 208,111&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;wget on Ubuntu&lt;/td&gt;&lt;br /&gt;&lt;td&gt;9.57&lt;/td&gt;&lt;br /&gt;&lt;td&gt;one in 761&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;curl on CEntOS&lt;/td&gt;&lt;br /&gt;&lt;td&gt;17.67&lt;/td&gt;&lt;br /&gt;&lt;td&gt;unique in 208,688&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Firefox 3.6 on XP did pretty well, so I captured the HTTP request headers from that browser:&lt;br /&gt;&lt;pre class="auto_scroll"&gt;&lt;br /&gt;GET / HTTP/1.1&lt;br /&gt;Host: vmware:8000&lt;br /&gt;User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)&lt;br /&gt;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&lt;br /&gt;Accept-Language: en-us,en;q=0.5&lt;br /&gt;Accept-Encoding: gzip,deflate&lt;br /&gt;Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7&lt;br /&gt;Keep-Alive: 115&lt;br /&gt;Connection: keep-alive&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then I installed the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/967"&gt;Modify Headers&lt;/a&gt; extension to Firefox on Ubuntu and set the User-Agent header to the value from the request headers above. After doing that, Firefox 3.6 on Ubuntu got panopticlick scores like Firefox 3.6 on XP.&lt;br /&gt;&lt;br /&gt;An interesting side effect of this is that the &lt;a href="https://addons.mozilla.org/en-US/firefox/"&gt;Firefox Add-Ons&lt;/a&gt; site uses the User-Agent header. So if you do this and want to add extensions later, you will probably need to disable the header. And I've just done this today, so I don't yet know what effect this will have on updating extensions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5720503406898333002?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5720503406898333002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5720503406898333002' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5720503406898333002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5720503406898333002'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2010/01/panopticlick.html' title='panopticlick'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-6765396066365771590</id><published>2009-11-03T21:48:00.002-06:00</published><updated>2009-11-03T22:06:24.038-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cryptography'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>pager in wallet program</title><content type='html'>I recently got an email from someone who has been using the &lt;a href="http://mbrisby.blogspot.com/2008/02/password-wallet-update.html"&gt;password wallet program&lt;/a&gt;. The reader asked about the possibility of using a different pager when viewing the password file (the "less" pager is hard-coded into the program).&lt;br /&gt;&lt;br /&gt;I thought this was a good idea, so I've changed the wallet program to allow the user to specify the pager using the WALLET_PAGER environment variable (which defaults to "less"). You can also put this in the .walletrc file. The reader wants to use w3m, so this should now work in .walletrc:&lt;br /&gt;&lt;br /&gt;WALLET_PAGER="w3m -o bg_color=blue"&lt;br /&gt;&lt;br /&gt;I've updated the program in the &lt;a href="http://code.google.com/p/password-wallet/"&gt;google code repository&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-6765396066365771590?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/6765396066365771590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=6765396066365771590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/6765396066365771590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/6765396066365771590'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2009/11/pager-in-wallet-program.html' title='pager in wallet program'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-4419106777913021627</id><published>2009-10-24T10:23:00.004-05:00</published><updated>2009-10-26T19:01:25.682-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zendcon09'/><category scheme='http://www.blogger.com/atom/ns#' term='pictures'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Zendcon 2009</title><content type='html'>Got home last night from &lt;a href="http://zendcon.com/"&gt;Zendcon &lt;/a&gt;2009. Good conference.&lt;br /&gt;&lt;br /&gt;Here are a few of the main things I'm taking away from it:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I'm a fool not to be using &lt;a href="http://pecl.php.net/package/APC"&gt;APC &lt;/a&gt;(and maybe &lt;a href="http://www.danga.com/memcached/"&gt;memcache&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Zendconners really like twitter (I got sucked in: &lt;a href="http://twitter.com/carl_welch"&gt;@carl_welch&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;I need to learn more about dependency injection and better OOP methods&lt;/li&gt;&lt;li&gt;I need to give &lt;a href="http://git-scm.com/"&gt;git &lt;/a&gt;a try (had a good visit with the guy at the &lt;a href="http://github.com/"&gt;github &lt;/a&gt;booth)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Update (Monday 26 October): I took some pictures, and &lt;a href="http://www.flickr.com/photos/mbrisby/tags/sanjose/"&gt;I've posted them to flickr&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mbrisby/4047643969/" title="civic center (nighttime) by mbrisby, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2803/4047643969_d1249e1773_m.jpg" width="240" height="180" alt="civic center (nighttime)" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mbrisby/4047680005/" title="palm trees by mbrisby, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2584/4047680005_67725c723a_m.jpg" width="180" height="240" alt="palm trees" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-4419106777913021627?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/4419106777913021627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=4419106777913021627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4419106777913021627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4419106777913021627'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2009/10/zendcon-2009.html' title='Zendcon 2009'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2803/4047643969_d1249e1773_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-3652626669640677134</id><published>2009-05-16T12:55:00.001-05:00</published><updated>2009-05-16T12:58:26.950-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pictures'/><category scheme='http://www.blogger.com/atom/ns#' term='animals'/><title type='text'>Barnswallows' return</title><content type='html'>The barnswallows are back. Considering the placement of the nest, I assume that it has to be the &lt;a href="http://mbrisby.blogspot.com/search?q=barnswallows"&gt;same ones as last year&lt;/a&gt;. I've been taking &lt;a href="http://www.flickr.com/photos/mbrisby/tags/barnswallows/"&gt;a few pictures&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-3652626669640677134?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/3652626669640677134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=3652626669640677134' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3652626669640677134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3652626669640677134'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2009/05/barnswallows-return.html' title='Barnswallows&apos; return'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-1669546029053342038</id><published>2009-04-26T12:02:00.002-05:00</published><updated>2009-04-26T12:11:48.787-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='environment'/><category scheme='http://www.blogger.com/atom/ns#' term='science'/><title type='text'>belated Earth Day</title><content type='html'>Here are a few interesting articles I found this past week:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.sciam.com/article.cfm?id=the-next-generation-of-biofuels&amp;amp;print=true"&gt;The Next Generation of Biofuels&lt;/a&gt; (Scientific American) and &lt;a href="http://wwwp.dailyclimate.org/tdc-newsroom/ethanol/california-takes-on-king-corn"&gt;California Takes on King Corn&lt;/a&gt; (The Daily Climate) talk about alternatives to corn-based ethanol&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.newsweek.com/id/194610/output/print"&gt;How to Fix a Climate Emergency&lt;/a&gt; (Newsweek) is a pretty interesting look at some radical ideas about slowing down global climate change (and it makes a good point about how this shouldn't be a replacement for cutting emissions)&lt;/li&gt;&lt;li&gt;and Wil Wheaton found a &lt;a href="http://wilwheaton.typepad.com/wwdnbackup/2009/04/like-it-or-not-for-the-moment-the-earth-is-where-we-make-our-stand.html"&gt;cool video of Earth rising over the moon's horizon&lt;/a&gt; (must have been taken near new moon)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-1669546029053342038?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/1669546029053342038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=1669546029053342038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1669546029053342038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1669546029053342038'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2009/04/belated-earth-day.html' title='belated Earth Day'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-7008997282396939877</id><published>2009-03-29T10:46:00.002-05:00</published><updated>2009-03-29T10:58:03.468-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='environment'/><category scheme='http://www.blogger.com/atom/ns#' term='science'/><title type='text'>bad news for iron fertilization</title><content type='html'>I follow a few environmental blogs, and for a while I was occasionally seeing posts about the possibility of using &lt;a href="http://en.wikipedia.org/wiki/Iron_fertilization"&gt;iron fertilization&lt;/a&gt; for &lt;a href="http://en.wikipedia.org/wiki/Carbon_sequestration"&gt;carbon sequestration&lt;/a&gt;. The idea (as I understand it) is that scientists would dissolve a bunch of iron near the ocean surface, phytoplankton would consume the iron (causing the phytoplankton to flourish), the phytoplankton would inhale a bunch of carbon dioxide, and the phytoplankton would sink to the bottom of the ocean, taking the CO2 with it, forever.&lt;br /&gt;&lt;br /&gt;So they tried it.&lt;br /&gt;&lt;br /&gt;They dumped a bunch of iron in the ocean, and the phytoplankton dutifully multiplied (and presumably inhaled a lot of CO2). But before the phytoplankton could sink, &lt;a href="http://news.slashdot.org/article.pl?sid=09/03/26/1622243&amp;amp;from=rss"&gt;it ended up at the bottom of the food chain&lt;/a&gt; of a series of increasingly large sea creatures that live near the surface.&lt;br /&gt;&lt;br /&gt;Nice try.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-7008997282396939877?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/7008997282396939877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=7008997282396939877' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7008997282396939877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7008997282396939877'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2009/03/bad-news-for-iron-fertilization.html' title='bad news for iron fertilization'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-844730167829232590</id><published>2009-03-25T11:20:00.002-05:00</published><updated>2009-03-25T11:28:14.544-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comics'/><category scheme='http://www.blogger.com/atom/ns#' term='movies'/><title type='text'>Batman logos</title><content type='html'>There's a &lt;a href="http://www.slashfilm.com/2009/03/25/votd-evolution-of-the-batman-logo/"&gt;post on /Film&lt;/a&gt; highlighting a youtube video showing various incarnations of the Batman logo. The video includes logos from various comic book titles, TV series, and films. It's not exhaustive, but it's a cool presentation of a good sampling.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-844730167829232590?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/844730167829232590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=844730167829232590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/844730167829232590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/844730167829232590'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2009/03/batman-logos.html' title='Batman logos'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-350269273712775668</id><published>2009-03-18T07:30:00.000-05:00</published><updated>2009-03-18T07:30:00.991-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>saving space in firefox</title><content type='html'>I found a cool Firefox extension a day or two ago. It's called &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/4110"&gt;Menu Mod&lt;/a&gt;, and it's good for saving some space on the Firefox window (particularly if you have a small screen, like on a netbook). It can collapse all the standard menu items into a single menu item (after installing/restarting, do Tools-&gt;Add-ons, click Menu Mod, click Preferences, select "Place all menus inside another"). This isn't all that helpful on its own, but try also doing the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;do Menus-&gt;View-&gt;Toolbars-&gt;Customize&lt;/li&gt;&lt;li&gt;drag all the stuff from the navigation bar (Back/Forward/Refresh/Stop/Home buttons, address bar, etc.) up next to the newly-collapsed menu&lt;/li&gt;&lt;li&gt;get rid of the search field by dragging it to the "Customize Toolbar" window&lt;/li&gt;&lt;li&gt;do Menus-&gt;View-&gt;Toolbars and uncheck the Navigation toolbar&lt;/li&gt;&lt;/ol&gt;If you do this and start to miss the search toolbar, try this:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;go to www.google.com (or whatever your favorite search engine is)&lt;/li&gt;&lt;li&gt;right-click in the search field and select "Add a keyword for this search..."&lt;/li&gt;&lt;li&gt;add something descriptive for the Name field (like "search" or "google")&lt;/li&gt;&lt;li&gt;add something short for the Keyword field (I used "g")&lt;/li&gt;&lt;li&gt;next time you want to do a search, open a new tab (Ctrl-T is as easy as Ctrl-K), then type the keyword ("g" for me) followed by a space and your search term(s)&lt;/li&gt;&lt;/ol&gt;If you use the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/60"&gt;Web Developer extension&lt;/a&gt;, do Menus-&gt;View-&gt;Toolbars-&gt;Customize and drag the "Web Developer" item so that it's to the left of the URL bar. Clicking this new item is a quick way to hide/display the Web Developer Toolbar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-350269273712775668?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/350269273712775668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=350269273712775668' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/350269273712775668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/350269273712775668'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2009/03/saving-space-in-firefox.html' title='saving space in firefox'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-3659449087108868123</id><published>2009-03-17T07:30:00.000-05:00</published><updated>2009-03-17T07:30:01.114-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='eeepc'/><title type='text'>xampp</title><content type='html'>At times I've wanted to try doing some development work on my eeepc, but the default distribution doesn't come with a &lt;a href="http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29"&gt;LAMP stack&lt;/a&gt; (and so far I've been too chicken to try installing &lt;a href="http://www.antipope.org/charlie/blog-static/2009/01/i_get_mail.html"&gt;something&lt;/a&gt; &lt;a href="http://ask.slashdot.org/article.pl?sid=09/02/24/1544229&amp;amp;from=rss"&gt;else&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Today I tried installing &lt;a href="http://www.apachefriends.org/en/xampp.html"&gt;xampp&lt;/a&gt;, and that seems to work pretty well. So far my only complaint is that it doesn't seem to come with any version control tools (like svn), and I don't see an easy way to add/compile them (the eeepc doesn't have gcc).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-3659449087108868123?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/3659449087108868123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=3659449087108868123' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3659449087108868123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3659449087108868123'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2009/03/xampp.html' title='xampp'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-7702550769978969412</id><published>2009-03-16T07:30:00.000-05:00</published><updated>2009-03-16T07:30:01.839-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>ESC key alternative in vim</title><content type='html'>I've been using vim for a couple of years now, and I really like it. But one thing that's always been a nuisance to me is reaching for the escape key. I often hit the wrong key (like the tilde or F1), and/or I have to glance at the keyboard to find it.&lt;br /&gt;&lt;br /&gt;A &lt;a href="http://weierophinney.net/matthew/archives/211-Why-Vim-Plugins-for-IDEs-Fail.html"&gt;recent post by Matthew Weier O'Phinney&lt;/a&gt; suggested binding the 'jj' sequence to &amp;lt;ESC&amp;gt;. I've been trying that for the last day or so, and I'm finding that to be a pretty good trick. Here's what I added to &lt;code&gt;~/.vimrc&lt;/code&gt; to make it work:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;:map! jj &amp;lt;ESC&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-7702550769978969412?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/7702550769978969412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=7702550769978969412' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7702550769978969412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7702550769978969412'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2009/03/esc-key-alternative-in-vim.html' title='ESC key alternative in vim'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-386635530457813530</id><published>2009-02-01T09:41:00.002-06:00</published><updated>2009-02-01T09:47:32.092-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><category scheme='http://www.blogger.com/atom/ns#' term='scifi'/><title type='text'>Star Trek Old School</title><content type='html'>&lt;a href="http://www.youtube.com/watch?v=9xNnEYAiTWE"&gt;Funny stuff&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Uhuru is my favorite.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-386635530457813530?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/386635530457813530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=386635530457813530' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/386635530457813530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/386635530457813530'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2009/02/star-trek-old-school.html' title='Star Trek Old School'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-1960012228995372183</id><published>2008-12-19T07:30:00.000-06:00</published><updated>2008-12-19T07:30:00.504-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='belize'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><title type='text'>Belize: Day Off, Return</title><content type='html'>(This is part 6 of a 6-part description of a trip I took to Belize with friends just after Thanksgiving 2008. I put my pictures a &lt;a href="http://flickr.com/photos/93512143@N00/tags/belize/"&gt;flickr&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;We didn't plan anything for Thursday, so we slept in. After a leisurely breakfast, we headed north into the shopping areas of San Pedro. We visited several shops looking for souvenirs and gifts. I found that most of the offerings seemed to be overpriced tourist junk, but I did splurge on a couple of Belikin Beer T-shirts. This shopping trip was also a pub crawl: we hit four or five bars, having lunch in one of them. There are lots of dogs in San Pedro. One would adopt us for a while as we walked along, and another would pick us up as we left a shop or bar. We finished out our last full day of the trip with a delicious dinner at the restaurant of a nearby coastal resort.&lt;br /&gt;&lt;br /&gt;We took it easy again Friday morning. I partook of some wireless Internet by the Xanadu pool (my friends were impressed that I'd held out for nearly a week), L and KL swam a bit, and H and K did a little more shopping. Then we packed up and took a cab back to the San Pedro airport. Another Tropic Air flight with more breathtaking views of the Caribbean took us directly to the Belize City International Airport. Other than K having a bit of trouble with immigration/customs in Houston, we had an uneventful trip home. The temperature change was pretty startling: from somewhere around 85F to 33F. Ouch. Back to reality. *shrug*&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3094843750/" title="Caye Caulker by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3103/3094843750_56387097ba_m.jpg" width="240" height="180" alt="Caye Caulker" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It was a fabulous trip. I'd do it again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-1960012228995372183?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/1960012228995372183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=1960012228995372183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1960012228995372183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1960012228995372183'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/12/belize-day-off-return.html' title='Belize: Day Off, Return'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3103/3094843750_56387097ba_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-8707807700916763995</id><published>2008-12-18T07:30:00.000-06:00</published><updated>2008-12-18T07:30:00.792-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='belize'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='animals'/><title type='text'>Belize: Caye Caulker and Snorkling</title><content type='html'>(This is part 5 of a 6-part description of a trip I took to Belize with friends just after Thanksgiving 2008. I put my pictures a &lt;a href="http://flickr.com/photos/93512143@N00/tags/belize/"&gt;flickr&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Wednesday morning started with another speedboat pickup from Searious Tours. They took us and several other tourists back to the Searious pier where we piled onto a catamaran. There were ten of us on the tour with two crewmembers. We headed out toward a popular snorkling spot just inside the barrier reef. I'd never been snorkling before, so I didn't know what to expect, but this turned out to be my favorite part of the whole trip. The water was only twenty or thirty feet deep, and it was teeming with fish. We even saw a few stingrays and a couple of moray eels. The fish would swim almost right up to me: I guess they get lots of practice sharing the water with snorklers. We probably got to spend the better part of an hour in the water at this spot.&lt;br /&gt;&lt;br /&gt;After another short run on the catamaran, we found ourselves at what the crew called "&lt;a href="http://ambergriscaye.com/pages/town/parksharkrayalley.html"&gt;Shark Ray Alley&lt;/a&gt;." As the name suggests, it's an area frequented by predators. One of the crew (Daniel) jumped in and caught a nurse shark. Daniel said that the animals are used to him, and they just swim right up to him. The shark was about four feet long, and it just sat patiently in Daniel's arms while we touched it. Its skin was courser than I would have guessed. After we'd all checked out the shark, Daniel released it and grabbed a stingray, which had a much smoother skin. Anyway, the underwater petting zoo was pretty cool.&lt;br /&gt;&lt;br /&gt;Back on the catamaran, we sailed south to the island of Caye Caulker, with plenty of Bob Marley, Belikin, and rum punch along the way. The crewmembers jokingly described Caye Caulker as a drinking village with a fishing problem. We had a delicious lunch of ceviche and fish burritos, followed by a little shopping.&lt;br /&gt;&lt;br /&gt;The return trip was straight into the wind (and seemed to narrowly avoid some bad weather), so the crew had to rely on the two outboard motors. Back at Xanadu, we made sandwiches for dinner and again fell into bed pretty early, most of us nursing sunburns.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3093963845/" title="Caribbean waters by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3150/3093963845_8fc9ab7eb8_m.jpg" width="240" height="180" alt="Caribbean waters" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-8707807700916763995?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/8707807700916763995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=8707807700916763995' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8707807700916763995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8707807700916763995'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/12/belize-caye-caulker-and-snorkling.html' title='Belize: Caye Caulker and Snorkling'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3150/3093963845_8fc9ab7eb8_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-6528273503681126035</id><published>2008-12-17T07:30:00.000-06:00</published><updated>2008-12-17T07:30:00.695-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='belize'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='pictures'/><title type='text'>Belize: Altun Ha</title><content type='html'>(This is part 4 of a 6-part description of a trip I took to Belize with friends just after Thanksgiving 2008. I put my pictures a &lt;a href="http://flickr.com/photos/93512143@N00/tags/belize/"&gt;flickr&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;We got up early Tuesday morning and were picked up from the Xanadu pier by a speedboat from &lt;a href="http://seariousadventuresbelize.com/index.html"&gt;Searious Tours&lt;/a&gt;. There were already several other tourists on board (along with the three crewmembers), and we picked up a few more at other resorts along the coast. Then we headed out over the open waters toward the mainland.&lt;br /&gt;&lt;br /&gt;The fellow from Searious who drove the boat (a two-engine job, about 40 feet long) and served as our tour guide as we left San Pedro was named Willie. He was very knowledgeable about the local flora and fauna, and he was fun to listen to: his speech was sort of a toned-down version of the frequently-overblown Caribbean stereotype (I'm thinking &lt;a href="http://www.imdb.com/title/tt0100403/"&gt;Predator 2&lt;/a&gt; here). On the way to the mainland, we got to see a couple of bottle-nosed dolphins break the surface pretty close to the boat.&lt;br /&gt;&lt;br /&gt;Once we reached the coast, we went up the Belize River a bit. We saw an iguana lounging about in one of the trees. We stopped at a dock and transferred to a van which took us to Altun Ha. The ruins there are pretty spectacular--I'll let the photos speak for themselves. We stayed for an hour or so. We got to climb to the top of one of the structures, and that was a real kick. There were no guardrails or anything to prevent a careless tourist from falling over the side--one of the many differences with tourist attractions in the litigation-happy US.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3094602188/" title="Belize River by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3206/3094602188_a6bc721a6c_m.jpg" alt="Belize River" height="180" width="240"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3094602226/" title="iguana by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3044/3094602226_7c1a9d061b_m.jpg" alt="iguana" height="180" width="240"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3093859073/" title="Temple of the Green Tomb by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3130/3093859073_9151121d12_m.jpg" alt="Temple of the Green Tomb" height="180" width="240"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After Altun Ha we spent a couple of hours at the &lt;a href="http://www.maruba-spa.com/"&gt;Maruba Spa&lt;/a&gt;. They apparently offer massages, mud treatments, and several other odd things. We enjoyed a nice lunch and some time by the pool. Then we rode back to the dock (with one of the tour guides acting as bartender in the back of the van: Belikin and rum punch) and took the boat back to Ambergris Caye (the ride back offered a pretty spectacular sunset). That evening we walked up the beach to the Blue Water grill for some fantastic seafood (I had some snapper), and then we headed back to Xanadu and fell into bed.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3093917861/" title="Maruba Resort pool by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3017/3093917861_9439b15b71_m.jpg" alt="Maruba Resort pool" height="180" width="240"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3093944237/" title="Caribbean sunset by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3268/3093944237_b214c62282_m.jpg" width="240" height="180" alt="Caribbean sunset" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-6528273503681126035?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/6528273503681126035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=6528273503681126035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/6528273503681126035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/6528273503681126035'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/12/belize-altun-ha.html' title='Belize: Altun Ha'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3206/3094602188_a6bc721a6c_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-547755063416007601</id><published>2008-12-16T07:30:00.000-06:00</published><updated>2008-12-16T07:30:01.709-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='belize'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='pictures'/><title type='text'>Belize: San Pedro</title><content type='html'>(This is part 3 of a 6-part description of a trip I took to Belize with friends just after Thanksgiving 2008. I put my pictures a &lt;a href="http://flickr.com/photos/93512143@N00/tags/belize/"&gt;flickr&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;We had pretty luxurious accommodations in San Pedro, which is on the island of Ambergris Caye. We were in a three-level dome-topped structure, and we had the top two levels. Our downstairs had a well-equipped kitchen, a dining area, a common area (TV and couches), and a bedroom (L and KL took that one). There were two more bedrooms upstairs: I took one, and H and K took the other. Each bedroom had its own bathroom. There was a wonderful wooden deck/balcony off of our downstairs, and it looked out over the water. It was really quite fancy.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3093978893/" title="view from Xanadu balcony by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3144/3093978893_8e1f495cef_m.jpg" width="240" height="180" alt="view from Xanadu balcony" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The beach wasn't quite what I expected, because I hadn't read about the barrier reef. Ocean waves strike the reef, rather than the coast, which is a big part of why the water here is so clear. But that means that we didn't see or hear waves, which is one of my favorite ocean things. So that was a very minor disappointment, but it was still very cool being by the water. The reef is not that far out, so we could see waves breaking out on the reef just below the horizon, and that was pretty awesome to watch. The beach itself is very clean white sand, and it was fun walking around.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3094843710/" title="Caribbean barrier reef by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3055/3094843710_4c5d2bda70_m.jpg" width="240" height="180" alt="Caribbean barrier reef" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3093978905/" title="San Pedro coast by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3168/3093978905_0e0c35f3b8_m.jpg" width="240" height="180" alt="San Pedro coast" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That first afternoon in San Pedro we didn't do much more than have a good meal and settle in to Xanadu. We turned in early, because we knew we had an early start the next morning: the Mayan ruins at &lt;a href="http://en.wikipedia.org/wiki/Altun_Ha"&gt;Altun Ha&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-547755063416007601?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/547755063416007601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=547755063416007601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/547755063416007601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/547755063416007601'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/12/belize-san-pedro.html' title='Belize: San Pedro'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3144/3093978893_8e1f495cef_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-726345510506335956</id><published>2008-12-15T07:30:00.000-06:00</published><updated>2008-12-15T07:30:01.034-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='belize'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='pictures'/><title type='text'>Belize: Pook's Hill</title><content type='html'>(This is part 2 of a 6-part description of a trip I took to Belize with friends just after Thanksgiving 2008. I put my pictures a &lt;a href="http://flickr.com/photos/93512143@N00/tags/belize/"&gt;flickr&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;David introduced us to his co-manager (and wife) Kat and the owner (Ray) and took our bags to our cabanas (I'd never seen a thatched roof up close before). We took it easy that afternoon, and it got dark around 6PM. After the amazing sunsets, we mostly hung out at the main cabana, which has hammocks, chairs, a well-stocked bar, and a few sugar-water dispensers that were very popular with the local hummingbirds. This gave us an opportunity to get acquainted with some of the other guests: at one point I got to have a fun visit with a self-described "petrol head" from Britain, and we talked about &lt;a href="http://www.imdb.com/name/nm0000537/"&gt;Steve McQueen&lt;/a&gt; movies. After a few drinks, dinner was served downstairs, and we were treated to a delicious buffet-style meal. After some after-dinner coffee and tea (and maybe a few more cocktails), we retired to our cabanas for the night. I found that I really enjoyed falling asleep to the sounds of the jungle.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3094377978/" title="Pook's Hill sunset by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3284/3094377978_845f392bcb_m.jpg" width="240" height="180" alt="Pook's Hill sunset" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3094377960/" title="American oil palm by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3277/3094377960_29f9dce1ec_m.jpg" width="240" height="180" alt="American oil palm" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3094481766/" title="main cabana by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3179/3094481766_c134909453_m.jpg" width="180" height="240" alt="main cabana" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The next morning (Saturday), my companions went on the &lt;a href="http://en.wikipedia.org/wiki/Actun_Tunichil_Muknal"&gt;Actun Tunichil Muknal&lt;/a&gt; (ATM) adventure tour. I picked up a charming sinus infection around the time we began this trip, so I stayed at Pook's. My friends said that it was a great experience, in which they hiked, explored some caverns, and visited Mayan ruins. The hike to the ATM cave requires four river crossings each way, and there are no bridges: you swim across. So, although they said it was lots of fun, my friends told me that I'd made a good decision to skip it. So I had a quiet morning at Pook's, and by afternoon I felt perked up enough to do part of one of the hiking trails. By the time I got back to the lodge, my friends had returned from the ATM trip, and we enjoyed another evening at the main cabana.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3094399854/" title="Americal oil palm by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3142/3094399854_de33c307bf_m.jpg" width="180" height="240" alt="Americal oil palm" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sunday morning we finished out the hiking trail I'd started the previous afternoon. That route took us across a large meadow and along several well-kept jungle trails. That afternoon we had a real treat: we went inner-tubing down the Roaring River. It was surprisingly fun and relaxing. The water was cool but not cold, and it was amazingly clear. There was a great swimming hole in a bend of the river, and we had a high time hanging around there for about an hour. We saw some sleeping bats hanging from a tree, some fresh footprints (probably a tapir) on the riverbank, and we got a kick out of watching the smaller fish nibbling at the skin of our feet (that tickled a bit).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3093585339/" title="canopy entry by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3237/3093585339_4709107b30_m.jpg" width="240" height="180" alt="canopy entry" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3093585357/" title="River Trail bush by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3027/3093585357_889eaecb1f_m.jpg" width="240" height="180" alt="River Trail bush" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3093585337/" title="looking across the Roaring River by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3163/3093585337_403d5c9d17_m.jpg" width="240" height="180" alt="looking across the Roaring River" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3093585327/" title="standing in the Roaring River by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3099/3093585327_8615fc2c82_m.jpg" width="240" height="180" alt="standing in the Roaring River" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sunday evening's pre-dinner drinking was on the roof of the owner's house, which is up at the top of the hill and afforded a breathtaking view of the valley. We saw several egret flocks fly to their nighttime nesting areas, and we were up high enough to see the hills.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3093612711/" title="flight of egrets by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3109/3093612711_7fff4aa7d0_m.jpg" width="240" height="180" alt="flight of egrets" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Monday morning we spent a little time on one of the other hiking trails near Pook's, this one through the jungle above the owner's house. At one point we all heard something moving around to our left, but we never saw what it was. And then we took the monstrously-bumpy road back to Teakettle Village, the Western Highway back to Belize City and its municipal airport, and a Tropic Air prop to San Pedro on Ambergris Caye. That was a really cool flight out over the water. It offered a great view of the clear waters of the Carribean and the barrier reef. A short cab ride got us to our home for the next four days: &lt;a href="http://www.xanaduresort-belize.com/"&gt;Xanadu Resort&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3094577828/" title="Caribbean by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3133/3094577828_89ef05f380_m.jpg" width="240" height="180" alt="Caribbean" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-726345510506335956?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/726345510506335956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=726345510506335956' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/726345510506335956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/726345510506335956'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/12/belize-pooks-hill.html' title='Belize: Pook&apos;s Hill'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3284/3094377978_845f392bcb_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-2418117605870289451</id><published>2008-12-14T07:30:00.000-06:00</published><updated>2008-12-14T07:30:00.540-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='belize'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='pictures'/><category scheme='http://www.blogger.com/atom/ns#' term='animals'/><title type='text'>Belize: Arrival</title><content type='html'>(This is part 1 of a 6-part description of a trip I took to Belize with friends just after Thanksgiving 2008. I put my pictures a &lt;a href="http://flickr.com/photos/93512143@N00/tags/belize/"&gt;flickr&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Two friends of mine (L and KL) and I flew to Houston on Thanksgiving where we were met by two other friends (K and H). We spent the night there and then got up the next morning and took a Continental jet to the Belize City International Airport. After going through immigration and customs, we stepped outside and were met by David, one of the managers at &lt;a href="http://www.pookshilllodge.com/"&gt;Pook's Hill Lodge&lt;/a&gt;. Pook's is a great place in the jungle of the Cayo District, far away from any population centers.&lt;br /&gt;&lt;br /&gt;David packed us and our stuff into a van, and we headed westward on the Western Highway. After about an hour, we stopped at a restaurant called Amigos and had a delicious lunch of stewed chicken, rice and beans, and &lt;a href="http://en.wikipedia.org/wiki/Belikin"&gt;Belikin beer&lt;/a&gt;. Due to import restrictions, Belikin is about the only beer you can get in Belize--fortunately it's very good.&lt;br /&gt;&lt;br /&gt;After lunch we went to the &lt;a href="http://www.belizezoo.org/"&gt;Belize Zoo&lt;/a&gt;, which features howler monkeys, spider monkeys, owls, &lt;a href="http://en.wikipedia.org/wiki/Tapir"&gt;tapirs&lt;/a&gt; (which were quite a bit bigger than I expected), otters, &lt;a href="http://en.wikipedia.org/wiki/Coati"&gt;coatis&lt;/a&gt;, a puma (also larger than I expected), a pair of HUGE crocodiles, a couple of jaguars, and some really foul-smelling wild pigs called peccaries. I didn't get many good pictures, but I got a short &lt;a href="http://www.flickr.com/photos/93512143@N00/3104508167/"&gt;movie of one of the jaguars&lt;/a&gt; (he came right up to the fence).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/3094299688/" title="crocodile by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3074/3094299688_994f9b4a5c_m.jpg" alt="crocodile" height="180" width="240"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Another hour on the Western Highway brought us to Teakettle Village. We took a monstrously bumpy dirt road for about a half an hour, and then we arrived at Pook's Hill Lodge, where we spent the next three days.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-2418117605870289451?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/2418117605870289451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=2418117605870289451' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/2418117605870289451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/2418117605870289451'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/12/belize-arrival.html' title='Belize: Arrival'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3074/3094299688_994f9b4a5c_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-3031497685451012918</id><published>2008-09-18T18:32:00.001-05:00</published><updated>2008-09-18T18:34:24.173-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='zendcon08'/><title type='text'>Thursday at ZendCon</title><content type='html'>Today is the final day of &lt;a href="http://www.zendcon.com/ZendCon08/public/content/home"&gt;ZendCon&lt;/a&gt;, and it's a half day. It started with sessions, rather than a keynote (the keynote is at the end). I was having trouble figuring out which session to attend, but then I looked at the presenter names, and that made it easy to pick "Scaling Mozilla's websites with PHP" with Laura Thomson. I've heard her speak at &lt;a href="http://mbrisby.blogspot.com/2007/07/oscon-2007-tuesday.html"&gt;OSCON&lt;/a&gt;, and she always gives a good talk. She didn't disappoint today, as she told us about how she helped Mozilla get ready for the Firefox 3 "Download Day" (or, as she called it, D-Day). It was a fascinating case study of query/code optimizations, caching solutions, MySQL replication tricks, and other goodness. A couple of fun facts are that &lt;a href="http://mozilla.com/"&gt;mozilla.com&lt;/a&gt; uses &lt;a href="http://drupal.org/"&gt;drupal&lt;/a&gt;, and D-Day saw saw 14Gb/s of downloads and 2Gb/s of web traffic.&lt;br /&gt;&lt;br /&gt;Next Stefan Priebsch gave a good discussion and demonstration of &lt;a href="http://selenium.openqa.org/"&gt;Selenium&lt;/a&gt;. Several people have talked about Selenium at this conference, and it really looks like a great resource.&lt;br /&gt;&lt;br /&gt;The closing keynote is by David J. Neff from the American Cancer Society. He told us about &lt;a href="http://sharinghope.tv/"&gt;sharinghope.tv&lt;/a&gt;, a site with user-generated content from people affected by cancer. Pretty cool.&lt;br /&gt;&lt;br /&gt;Here's a picture from the closing keynote. That's &lt;a href="http://calevans.com/"&gt;Cal Evans&lt;/a&gt; (ZendCon program chair) on the stage, and the (backs of the) heads of Laura Thomson and Paul Reinheimer. Sebastian Bergmann was also milling about (which would have put my three favorite speakers in the shot), but he wouldn't hold still long enough.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/2869175972/" title="Cal on stage by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3113/2869175972_f3ab20721e_m.jpg" width="240" height="180" alt="Cal on stage" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-3031497685451012918?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/3031497685451012918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=3031497685451012918' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3031497685451012918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3031497685451012918'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/09/thursday-at-zendcon.html' title='Thursday at ZendCon'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3113/2869175972_f3ab20721e_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-76958646596502948</id><published>2008-09-17T21:39:00.003-05:00</published><updated>2008-09-17T21:50:29.686-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='zendcon08'/><title type='text'>Wednesday at ZendCon</title><content type='html'>&lt;a href="http://www.zendcon.com/ZendCon08/public/content/home"&gt;ZendCon&lt;/a&gt; started with a really interesting keynote today (I'm usually not big on keynotes). The first speaker was a Zend Framework developer named Wil Sinclair, and he talked about how PHP applications have evolved over time. He introduced the CEO and CTO of &lt;a href="http://www.varien.com/"&gt;Varien&lt;/a&gt;, and then talked about their company's development of &lt;a href="http://www.magentocommerce.com/"&gt;Magento&lt;/a&gt;. Magento looks really cool. It's an open-source e-commerce built on Zend Framework. It appears to be as full-featured as big commercial e-commerce sites like amazon.com. They apparently wrote the whole thing in a matter of months. Impressive. I'll definitely try it if I ever need to make an online store.&lt;br /&gt;&lt;br /&gt;Then I checked out "Architecting for PHP5..." with Elizabeth Smith. She covered some of the features new to PHP5 and again encouraged us to use extensions whenever possible ("C is faster than PHP"). Looks like I need to read more about the &lt;a href="http://us2.php.net/spl"&gt;SPL&lt;/a&gt; and the &lt;a href="http://pecl.php.net/package/filter"&gt;filter extension&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Stefan Esser gave a really good talk called "Lesser Known Security Problems in PHP Applications." Some of it was kind of scary. We even got to hear him announce a 0-day vulnerability with the &lt;a href="http://us2.php.net/zip"&gt;ZipArchive extension&lt;/a&gt; (along with a more obscure problem with HTTP response splitting affecting users of older Netscape proxies).&lt;br /&gt;&lt;br /&gt;After lunch was another keynote: "The State of AJAX" with &lt;a href="http://ajaxian.com/"&gt;Ben Galbraith&lt;/a&gt;. Not a lot of technical information, so not too interesting to me. It was mostly a survey of lots of shiny-looking, bleeding-edge stuff (which may or may not be around in six months). He speculated that &lt;a href="http://www.w3.org/TR/html5/"&gt;HTML5&lt;/a&gt; and &lt;a href="http://gears.google.com/"&gt;(google) gears&lt;/a&gt; will be important to the future of AJAX. I was hoping he'd tell me which AJAX framework to use, and he did address this point. He said that it's sort of a toss-up between &lt;a href="http://dojotoolkit.org/"&gt;Dojo&lt;/a&gt;, &lt;a href="http://www.prototypejs.org/"&gt;Prototype&lt;/a&gt;/&lt;a href="http://script.aculo.us/"&gt;script.aculo.us&lt;/a&gt;, and &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;, because they're all small, powerful, extensible (with community support) frameworks. So pick one. &lt;em&gt;*sigh*&lt;/em&gt; Thanks.&lt;br /&gt;&lt;br /&gt;In his "Phar Scape" talk, Marcus Boerger showed us some neat tricks to do with phar, a deployment tool modeled after Java's JAR.&lt;br /&gt;&lt;br /&gt;I went to another talk by Sebastian Bergmann, this one called "phpUnderControl: A Quick Start to Continuous Integration." I'm pretty much the only PHP programmer where I work, so I don't really have to integrate my work with a team. But &lt;a href="http://www.phpundercontrol.org/about.html"&gt;phpUnderControl&lt;/a&gt; looks cool enough that I'd like to try it. Besides, it makes nice pictures that could distract managers. (And Sebastian says that he likes &lt;a href="http://www.stack.nl/%7Edimitri/doxygen/"&gt;doxygen&lt;/a&gt; more than &lt;a href="http://www.phpdoc.org/"&gt;phpDocumentor&lt;/a&gt;, so I'll give that a try, too.)&lt;br /&gt;&lt;br /&gt;I finished out the day with an &lt;a href="http://www.zendcon.com/ZendCon08/public/wiki/UnCon_Home"&gt;UnCon&lt;/a&gt; session called "Subversion Tips and Tricks" with Lorna Mitchell and Matthew Weier O'Phinney. It turned out to be mostly introductory in nature, but I still picked up a few things. It was very informal, and it was fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-76958646596502948?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/76958646596502948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=76958646596502948' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/76958646596502948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/76958646596502948'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/09/wednesday-at-zendcon.html' title='Wednesday at ZendCon'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-8469932630588997597</id><published>2008-09-17T21:39:00.001-05:00</published><updated>2008-09-17T21:41:50.555-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><title type='text'>ScribeFire</title><content type='html'>&lt;span class="description"&gt;I've been playing with &lt;a href="http://www.scribefire.com/"&gt;ScribeFire&lt;/a&gt; (a Firefox extension) today, and I'm finding it to be a pretty good HTML editor. It runs right in the browser (one of the configuration items lets you run it in its own tab, which is cool). It'll save drafts locally, which is good for offline writing. And if I put a URL in the copy-and-paste buffer, when I highlight some text in ScribeFire and click the URL button, the URL in the buffer automagically appears in the URL dialog box.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-8469932630588997597?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/8469932630588997597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=8469932630588997597' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8469932630588997597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8469932630588997597'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/09/scribefire.html' title='ScribeFire'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-4939329512893072886</id><published>2008-09-16T21:20:00.002-05:00</published><updated>2008-09-16T21:24:30.945-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='zendcon08'/><title type='text'>Tuesday at ZendCon</title><content type='html'>Kind of a slow morning at &lt;a href="http://www.zendcon.com/ZendCon08/public/content/home"&gt;ZendCon&lt;/a&gt; (to me, anyway). Started off with the keynote by Harold Goldberg, Zend Technologies CEO. Mostly business-speak, so not too exciting (I'm a nuts-and-bolts sort, I guess).&lt;br /&gt;&lt;br /&gt;Then I went to &lt;a href="http://wwww.derickrethans.nl/talks.php"&gt;"Of Haystacks and Needles"&lt;/a&gt; by Derrick Rethans. This looked interesting to me because of &lt;a href="http://mbrisby.blogspot.com/2008/08/feedback-to-phparch-article.html"&gt;my php|arch article&lt;/a&gt;. One of the people who wrote about my article seemed to advocate storing records as documents, like maybe XML documents. I think that's a pretty interesting idea, because storing it like that sidesteps the whole issue of different records having different sets of fields. And I could just store the XML string in a text column or something. But I didn't know how I'd do searches--if I want to find a record submitted by someone whose &lt;em&gt;last_name&lt;/em&gt; is Smith, it seems like I'd have to run a DB query to get the XML string for &lt;strong&gt;every&lt;/strong&gt; record, pull it out of the DB and into application memory, parse each XML string, and look for any that match. So I was hoping that this would give me some ideas of how to do this (although lately I've been thinking about stored procedures). Anyway, the talk gave me several things to look at more closely later:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://lucene.apache.org/java/docs/"&gt;Apache Lucene&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://framework.zend.com/manual/en/zend.search.lucene.html"&gt;Zend Lucene&lt;/a&gt; (PHP port of Adobe Lucene, lacking some of the former's features)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://lucene.apache.org/solr/"&gt;Apache Solr&lt;/a&gt; (an extension of Apache Lucene w/ a Web services API)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/marjory/"&gt;marjory&lt;/a&gt; (like Solr but written in PHP, supports other backends like &lt;a href="http://www.sphinxsearch.com/"&gt;sphinx&lt;/a&gt; and &lt;a href="http://xapian.org/"&gt;xapian&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Lunch was a catered affair again, but no celebrities this time (not that I realized, anyway).&lt;br /&gt;&lt;br /&gt;Things picked up after lunch, starting with "PECL Picks..." with Elizabeth Smith. This was a whirlwind survey of some PECL projects that Elizabeth deems "cool." Here are some of the ones that look interesting to me:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://pecl.php.net/package/uploadprogress"&gt;uploadprogress&lt;/a&gt; (useful in AJAX applications)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://pecl.php.net/package/haru"&gt;Haru&lt;/a&gt; (for PDF manipulation)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://pecl.php.net/package/svn"&gt;SVN&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://pecl.php.net/package/ssh2"&gt;ssh2&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://pecl.php.net/package/sphinx"&gt;sphinx&lt;/a&gt; and &lt;a href="http://pecl.php.net/package/clucene"&gt;clucene&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Next was "Knight Rider Methodology to Software Develoment" in which &lt;a href="http://eliw.com"&gt;Eli White&lt;/a&gt; covered a lot of development tools and techniques. The theme was how Michael Knight got lots done on (the 80s TV show) &lt;a href="http://en.wikipedia.org/wiki/Knight_rider"&gt;"Knight Rider"&lt;/a&gt; by using the tools at his disposal (well, tool: the car, KITT). The talk was punctuated by clips from the show (one of my favorites as a kid, and it's far cheesier than I remembered--wow). Here are some fun quotes from Eli's talk:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;"hardware is cheaper than people"&lt;/li&gt;&lt;br /&gt;&lt;li&gt;"use someone else's time as your own" (use libraries rather than re-inventing the wheel)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;"nothing is right the first time: even 'hello, world!' needs internationalization" (debuggers)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;After his talk, I'm looking forward to trying out some subversion GUIs like &lt;a href="http://subcommander.tigris.org/"&gt;subcommander&lt;/a&gt; and &lt;a href="http://rapidsvn.tigris.org/"&gt;rapidsvn&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Paul Reinheimer gave a great talk about how Web 2.0 breaks the browser's Back button, and he talked about a really interesting solution using the &lt;a href="http://developer.yahoo.com/yui/"&gt;yahoo user interface (YUI)&lt;/a&gt;. He also talked about how to deal with AJAX responses coming back in an order different from that in which they were sent. I think that'll take a few reads for it to sink in for me, but I'm looking forward to trying it out. Paul does PHP training, and he's a really good speaker.&lt;br /&gt;&lt;br /&gt;Finally, &lt;a href="http://karnaf.info/sessions/"&gt;Eddo Rotman&lt;/a&gt; gave a good presentation about PHP errors and exceptions. His talk has inspired me to write a cron job which knows a list of PHP application error logs and emails me the entries made in the last 24 hours: maybe it'll append a marker to each log file and email the entries written since the previous marker.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-4939329512893072886?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/4939329512893072886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=4939329512893072886' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4939329512893072886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4939329512893072886'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/09/tuesday-at-zendcon.html' title='Tuesday at ZendCon'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-4007916275242021736</id><published>2008-09-15T21:25:00.002-05:00</published><updated>2008-09-15T21:33:37.066-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='zendcon08'/><category scheme='http://www.blogger.com/atom/ns#' term='eeepc'/><title type='text'>Monday at ZendCon</title><content type='html'>Today at &lt;a href="http://www.zendcon.com/ZendCon08/public/content/home"&gt;ZendCon&lt;/a&gt; I attended two tutorials, and I enjoyed them both. In both cases, there was a lot of review, but I also learned new things in both. The morning session was "PHP Developer Best Practices" with Matthew Weier O'Phinney and Mike Naberenzy. They covered a pretty broad set of topics:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;They spent quite a bit of time on source control. They talked mostly about subversion, but they also discussed some git's advantages, particuarly for offline development (like on a laptop on a plane). Some of the other things that were interesting to me were the ability to link one SVN repository to another with the svn:internals feature, using post-commit hooks to send emails (to other developers) or to rebuild documentation (e.g., via phpdoc), and using branches for maintaining older product lines (the example that occurred to me is that the Apache developers might have a branch for the 1.3.x line).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;They talked a lot about coding standards, and then advocated the PEAR standard. I think that's the default standard which is enforced by &lt;a href="http://pear.php.net/package/PHP_CodeSniffer/"&gt;PHP_CodeSniffer&lt;/a&gt;, which is one of the coding tools they discussed (which I started using a few weeks ago).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;They spent some time on testing, and they pointed out that when coupled with &lt;a href="http://www.xdebug.org/"&gt;xdebug&lt;/a&gt;, &lt;a href="http://www.phpunit.de/"&gt;PHPUnit&lt;/a&gt; can do coverage analysis. I didn't know that, and I think that's pretty cool. I've never been able to get xdebug to work for me, but that's a good reason to try again. They also made &lt;a href="http://phpundercontrol.org/about.html"&gt;PHPUndercontrol&lt;/a&gt; look interesting enough to play with.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;They talked about &lt;a href="http://www.phpdoc.org/"&gt;phpDocumentor&lt;/a&gt;, which is something I've been using and enjoying lately. They also touched on DocBook, which evidently is just fairly straightforward XML. I'll have to give that a try.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;They concluded with a few remarks about deployment issues. I'd hoped they'd talk about &lt;a href="http://phing.info/"&gt;phing&lt;/a&gt; or &lt;a href="http://pecl.php.net/package/phar/"&gt;phar&lt;/a&gt;, and they might have, but they sort of ran out of time.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Lunch was catered box lunches, served in a large room with lots of big tables. So I had lunch with strangers, but one of them turned out to be &lt;a href="http://www.jpipes.com/"&gt;Jay Pipes&lt;/a&gt;. I'd heard him speak at OSCON previously, and he had some interesting insights about Sun's MySQL acquisition (he said that Sun had so far mostly left MySQL alone). Jay was wearing a cool T-shirt with the &lt;a href="http://en.wikipedia.org/wiki/Decepticon"&gt;Decepticon&lt;/a&gt; logo. And &lt;a href="http://blog.preinheimer.com/"&gt;Paul Reinheimer&lt;/a&gt; was sitting behind me. I don't know his face, but I recognized his &lt;a href="http://c7y.phparch.com/c/tag/podcast"&gt;voice&lt;/a&gt;. Sounded like he was keeping his tablemates well entertained.&lt;br /&gt;&lt;br /&gt;The afternoon session was "Quality Assurance in PHP Projects" with Sebastian Bergmann. I've been fiddling with PHPUnit for a little while, and the talk gave me several things I want to research a bit more when I have time:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;the &lt;code&gt;--testdox&lt;/code&gt; option&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the &lt;code&gt;@group&lt;/code&gt; phpdoc tag&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.bookpool.com/sm/0131495054"&gt;xUnit Test Patterns&lt;/a&gt;, a language-agnostic book about software testing&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the DbUnit feature&lt;/li&gt;&lt;br /&gt;&lt;li&gt;using sqlite for testing DB stuff&lt;/li&gt;&lt;br /&gt;&lt;li&gt;using the dataProvider feature for throwing a large stack of specific test data at the code&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Sebastian also talked a lot about mocks and stubs and such, but that's still a bit over my head. But we got to see the &lt;code&gt;--ansi&lt;/code&gt; feature of the shiny new &lt;a href="http://www.phpunit.de/wiki/ChangeLog33"&gt;v3.3.0&lt;/a&gt; (which he just released this morning).&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://mbrisby.blogspot.com/2008/09/eee-pc.html"&gt;eee pc&lt;/a&gt; had good moments and bad. This convention center did a pretty poor job of providing power outlets (people were sitting up front so that they could plug into surge suppressors for the sound systems, and others even pried some metal plates off the floor to get at electrical outlets), so I was on battery all morning (I scored an outlet in the afternoon). The eee pc battery held, but perhaps only because I dimmed the screen and turned off the wireless. But I'm still happy with it--it's light enough that I don't feel tired or sore at the end of the day. And although I make more mistakes than usual on the little keyboard, it's plenty good enough for note-taking.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-4007916275242021736?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/4007916275242021736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=4007916275242021736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4007916275242021736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4007916275242021736'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/09/monday-at-zendcon.html' title='Monday at ZendCon'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5074683013716998451</id><published>2008-09-15T21:19:00.002-05:00</published><updated>2008-09-15T21:25:37.519-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='pictures'/><category scheme='http://www.blogger.com/atom/ns#' term='zendcon08'/><category scheme='http://www.blogger.com/atom/ns#' term='animals'/><title type='text'>Sunday at/before ZendCon</title><content type='html'>I'm at &lt;a href="http://www.zendcon.com/ZendCon08/public/content/home"&gt;ZendCon&lt;/a&gt; this week. I flew in to San Jose airport yesterday and got the hotel shuttle to the &lt;a href="http://www.hotelbiltmore.com/"&gt;hotel&lt;/a&gt; (which is in Santa Clara). I got in pretty early (around 10AM local time), but my room was already ready, so I got to go straight in.&lt;br /&gt;&lt;br /&gt;A bit later I took the hotel shuttle to the &lt;a href="http://www.santaclara.org/conventioncenter/"&gt;Santa Clara Convention Center&lt;/a&gt;, which is where the conference is being held. Conference check-in only took a few minutes (I gave them my name, and they gave me my conference packet), so I had the rest of the afternoon play.&lt;br /&gt;&lt;br /&gt;I had the hotel shuttle take me to the local &lt;a href="http://www.caltrain.com/"&gt;CalTrain&lt;/a&gt; station, and I took that into San Francisco. I was wanting to go to &lt;a href="http://www.pier39.com/"&gt;Pier 39&lt;/a&gt; (a touristy shopping area with Bay cruises and an &lt;a href="http://www.aquariumofthebay.com/"&gt;aquarium&lt;/a&gt;), but I had a terrible time finding the right bus. The nice woman who answered the Pier 39 phone number told me to take the 9x bus. As far as I can tell, that particular bus runs approximately once every two weeks. I only ever saw one 9x bus, and it was going the wrong way. I almost gave up a couple of times and just took the train back early.&lt;br /&gt;&lt;br /&gt;I eventually got to Pier 39 (I caught the 10 bus, which runs fairly regularly, and which got me to within a block of the pier), but I didn't have much time there (I needed to get back to the train station by 7PM for the return to Santa Clara). But the pier offers a nice view of the Bay, and I took several pictures. I could see &lt;a href="http://www.flickr.com/photos/93512143@N00/2861614892/"&gt;Alcatraz Island&lt;/a&gt;, and there was a neat view of the &lt;a href="http://farm4.static.flickr.com/3063/2861614916_93d14c510a_m.jpg"&gt;Golden Gate Bridge&lt;/a&gt; in the distance. Some of the other &lt;a href="http://farm4.static.flickr.com/3243/2861614926_cdd48d5bc1_m.jpg"&gt;shorelines were wrapped in a neat fog&lt;/a&gt;, and seeing the &lt;a href="http://www.pier39.com/m/a/#SeaLions"&gt;sea lions&lt;/a&gt; was cool.&lt;br /&gt;&lt;br /&gt;I got back to the hotel and had some dinner in the hotel restaurant. By then I was pretty tired (I didn't sleep much the night before, and the time change added an extra two hours to the day), so I turned in a bit early.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/2861614874/" title="pier39_skyline by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3108/2861614874_aea0c3b0e1_m.jpg" alt="pier39_skyline" height="180" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/2861614852/" title="pier39_sea_lion by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3163/2861614852_b73d9e7c2d_m.jpg" alt="pier39_sea_lion" height="180" width="240" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5074683013716998451?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5074683013716998451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5074683013716998451' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5074683013716998451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5074683013716998451'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/09/sunday-atbefore-zendcon.html' title='Sunday at/before ZendCon'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3108/2861614874_aea0c3b0e1_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-4132758101987953852</id><published>2008-09-08T07:00:00.000-05:00</published><updated>2008-09-08T07:00:00.338-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='movies'/><title type='text'>Robocop vs. Terminator</title><content type='html'>&lt;a href="http://www.toplessrobot.com/"&gt;Topless Robot&lt;/a&gt; had a post a couple of days ago about a fan mashup on &lt;a href="http://www.youtube.com/"&gt;youtube&lt;/a&gt; called &lt;a href="http://www.toplessrobot.com/2008/09/robocop_versus_terminator.php"&gt;Robocop vs. Terminator&lt;/a&gt;. Mindless fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-4132758101987953852?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/4132758101987953852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=4132758101987953852' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4132758101987953852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4132758101987953852'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/09/robocop-vs-terminator.html' title='Robocop vs. Terminator'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5728436644420419940</id><published>2008-09-07T18:41:00.003-05:00</published><updated>2008-09-07T19:03:50.336-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eeepc'/><title type='text'>eee pc</title><content type='html'>I got an &lt;a href="http://eeepc.asus.com/global/"&gt;Asus eee pc&lt;/a&gt; (model 900) the other day (I ordered it through &lt;a href="http://www.buy.com/"&gt;buy.com&lt;/a&gt;). I'm going to a conference next week (&lt;a href="http://www.zendcon.com/ZendCon08/public/content/home"&gt;zendcon&lt;/a&gt;), and I didn't want to lug around my laptop (it gets pretty heavy after a few hours). I didn't need much--something with a Web browser, an ssh client, something to pull images off of my camera (a Kodak Easyshare v1003), and a text editor for taking notes. The eee pc fits that nicely, and it only weighs about 2.5 pounds.&lt;br /&gt;&lt;br /&gt;It's got an 8" screen which I'm finding to be perfectly readable. The keyboard is pretty small, but I'm getting used to it (I'm posting this from the eee pc).&lt;br /&gt;&lt;br /&gt;It has an SD/MMC card reader, 3 USB 2.0 ports, and built-in wireless (802.11 g/b). It has 1GB of RAM and a 20GB solid-state hard drive (the thing boots to the login prompt in about 30 seconds). It even has an integrated 1.3Mpixel Web cam.&lt;br /&gt;&lt;br /&gt;I'm finding the &lt;a href="http://wiki.eeeuser.com/"&gt;eeeuser wiki&lt;/a&gt; to be very helpful (especially &lt;a href="http://wiki.eeeuser.com/gwenviewui-rc_file_fix"&gt;a post about getting gwenview to import photos&lt;/a&gt; from my camera).&lt;br /&gt;&lt;br /&gt;One little wrinkle I experienced was that the wireless adapter was inadvertently disabled, and it took me a little while to figure out what had happened. The eee pc typically recovers well from going to standby mode, but once when I tried to resume, the screen looked like static and I couldn't get it to do anything. I had to hold down the power button and reboot. When it came back, it refused to join my wireless network. I finally figured out (with the help of the diagnostic tools) that the wireless adapter had been disabled (dunno if I accidentally did that, or if it was a fluke). Anyway, holding down the special function key ("Fn" in the lower left) and hitting F2 toggles the adapter, and I was back in business.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5728436644420419940?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5728436644420419940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5728436644420419940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5728436644420419940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5728436644420419940'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/09/eee-pc.html' title='eee pc'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-1288428582508639034</id><published>2008-08-30T15:05:00.005-05:00</published><updated>2008-09-07T18:22:16.415-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='writing'/><title type='text'>feedback to php|arch article</title><content type='html'>I noticed a couple of blog posts written in response to my (somewhat) recent &lt;a href="http://mbrisby.blogspot.com/2008/07/phparch-article.html"&gt;php|arch article&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.adaniels.nl/articles/an-alternative-way-of-eav-modeling/"&gt;An alternative way of EAV modeling&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ishouldbecoding.com/2008/07/19/eav-modeling---square-peg-in-a-round-hole"&gt;EAV Modeling - Square Peg in a Round Hole?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Reading these was initially discouraging, as both authors are critical of the concept of my article. Although I don't necessarily agree with them, they both make good points in their posts, and I encourage you to read them both if you are interested in the topic. I particularly appreciate the point about table-level locking in MyISAM tables, and how that might affect performance in the frequently-updated value tables.&lt;br /&gt;&lt;br /&gt;Although this is not a very useful rebuttal, about all I can say is that the EAV method has worked well for me. As with anything, your mileage may vary. I'm not running reddit or facebook, and the systems I've built on EAV don't have thousands of simultaneous users. So I really can't say how well it would perform in a large-scale deployment.&lt;br /&gt;&lt;br /&gt;After I sort of got over being defensive about the whole thing, I'm just glad that people found the article interesting enough to talk about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-1288428582508639034?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/1288428582508639034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=1288428582508639034' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1288428582508639034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1288428582508639034'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/08/feedback-to-phparch-article.html' title='feedback to php|arch article'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-8373658199098657802</id><published>2008-08-23T09:06:00.002-05:00</published><updated>2008-08-23T09:12:22.570-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>LAMP pconnect</title><content type='html'>I had a bad experience a few years ago using pconnect() in a PHP program running in/on/under Apache on Linux to talk to a MySQL database. My memory is somewhat vague, but we had to restart the MySQL service (and switch to non-persistent connections). Ever since then, I've had an irrational fear of pconnect() and have never used it.&lt;br /&gt;&lt;br /&gt;Looks like I'm not the only one who &lt;a href="http://www.objectivelyoriented.com/2008/08/to_persist_or_not_to_persist.html"&gt;doesn't trust pconnect()&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-8373658199098657802?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/8373658199098657802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=8373658199098657802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8373658199098657802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8373658199098657802'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/08/lamp-pconnect.html' title='LAMP pconnect'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-891578810880166011</id><published>2008-08-16T14:54:00.003-05:00</published><updated>2008-08-16T15:26:26.084-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>HTTPS in Apache in Ubuntu</title><content type='html'>If there's an easy way to make Apache in Ubuntu (v7.10, gutsy) do HTTPS, I can't find it. So I played around with it this morning and got it working.&lt;br /&gt;&lt;br /&gt;First you need to generate an SSL certificate. I just went with self-signed certificates:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;openssl genrsa -out apache.key 1024&lt;br /&gt;openssl req -new -key apache.key -x509 -out apache.crt \&lt;br /&gt;    -days 365 -set_serial `date +%s`&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I saved these two files as &lt;code&gt;/etc/ssl/certs/apache.crt&lt;/code&gt; and&lt;br /&gt;&lt;code&gt;/etc/ssl/private/apache.key&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;And then I saved the following as&lt;br /&gt;&lt;code&gt;/etc/apache2/sites-available/default-ssl&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;NameVirtualHost *:443&lt;br /&gt;&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;    DocumentRoot "/var/www"&lt;br /&gt;    ServerName www.example.com:443&lt;br /&gt;    ErrorLog /var/log/apache2/ssl_error.log&lt;br /&gt;    TransferLog /var/log/apache2/ssl_access.log&lt;br /&gt;    LogLevel warn&lt;br /&gt;    SSLEngine on&lt;br /&gt;    SSLCertificateFile /etc/ssl/certs/apache.crt&lt;br /&gt;    SSLCertificateKeyFile /etc/ssl/private/apache.key&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then after enabling the new site (&lt;code&gt;a2ensite default-ssl&lt;/code&gt;) and restarting Apache (&lt;code&gt;/etc/init.d/apache2 reload&lt;/code&gt;), I was able to connect to https://localhost/. FireFox3 complained bitterly about the self-signed certificate, but adding the exception straightened that out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-891578810880166011?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/891578810880166011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=891578810880166011' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/891578810880166011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/891578810880166011'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/08/https-in-apache-in-ubuntu.html' title='HTTPS in Apache in Ubuntu'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-1708384042089813022</id><published>2008-07-27T16:56:00.002-05:00</published><updated>2008-07-27T16:58:34.442-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='animals'/><title type='text'>barn swallows: alive and well</title><content type='html'>Today I saw the four fledgelings perched on a nearby railing. Their parents still bring them food.&lt;br /&gt;&lt;br /&gt;When I got home last night, two of them were perched on a door frame near where the nest used to be.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/2707399529/" title="railing by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3013/2707399529_3d37fc0588_m.jpg" width="240" height="180" alt="railing" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-1708384042089813022?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/1708384042089813022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=1708384042089813022' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1708384042089813022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1708384042089813022'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/07/barn-swallows-alive-and-well.html' title='barn swallows: alive and well'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3013/2707399529_3d37fc0588_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-8609632200369763347</id><published>2008-07-24T22:32:00.002-05:00</published><updated>2008-07-24T22:38:23.978-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='animals'/><title type='text'>barn swallows: moving on</title><content type='html'>When I left for work this morning, the nest appeared to be empty--I didn't even see Stoopy lurking in it. I guess they were all off doing...well, whatever barn swallows do (eat insects and make poop, I suppose).&lt;br /&gt;&lt;br /&gt;When I got home from work, I saw that the painters had taken down the nest so that they could paint the entryway. Lame, but at least they waited until the hatchlings had become fledgelings. If that was a deliberate decision, it was a nice one.&lt;br /&gt;&lt;br /&gt;This evening as I left for a bike ride, the entire crew swooped past me single file through the entryway, as if to say "hello" (or perhaps "oh god it's a human fly away as fast as you can"--it's a subtle difference). And when I came back, one of the fledgelings was perched on the doorframe close to where the nest used to be.&lt;br /&gt;&lt;br /&gt;So I guess they'll be OK. It was nice having them as neighbors for a while.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-8609632200369763347?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/8609632200369763347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=8609632200369763347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8609632200369763347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8609632200369763347'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/07/barn-swallows-moving-on.html' title='barn swallows: moving on'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-1127426514027965746</id><published>2008-07-23T17:48:00.003-05:00</published><updated>2008-07-23T20:38:04.545-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='animals'/><title type='text'>fledgeling barn swallows</title><content type='html'>Maybe they hatched earlier than I thought, because a couple of them were flying a bit today.&lt;br /&gt;&lt;br /&gt;When I came home from work, one of them was perched on a rail about 30 feet away from the nest.&lt;br /&gt;&lt;br /&gt;Another one was fluttering around a bit near my doorway. He didn't seem comfortable going too far, but he was able to hover and then land on the nest. (That was pretty cool to see.)&lt;br /&gt;&lt;br /&gt;A third one was staying in the nest. That one holds his (her?) wings a bit funny--up higher closer to his head. It almost makes him look like an old man with a stoop. I'm wondering if that one is healthy.&lt;br /&gt;&lt;br /&gt;When one of the parents came to bring food, Stoopy was the only one I saw stick his head out of the nest. So I can't account for one of the hatchlings. I looked around a bit but didn't find the fourth anywhere nearby on the ground.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: I just stepped outside to have a look, and all four hatchlings are back in the nest. They're big enough now that it's pretty crowded.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-1127426514027965746?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/1127426514027965746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=1127426514027965746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1127426514027965746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1127426514027965746'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/07/fledgeling-barn-swallows.html' title='fledgeling barn swallows'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-7473136433374098330</id><published>2008-07-22T17:56:00.002-05:00</published><updated>2008-07-22T18:04:16.556-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pictures'/><category scheme='http://www.blogger.com/atom/ns#' term='animals'/><title type='text'>barn swallows; bigger and bolder</title><content type='html'>They're painting my building, so each day I fear that I'll come home to find that the painters have "evicted" the hatchlings (which they probably wouldn't survive). But they were still there again today.&lt;br /&gt;&lt;br /&gt;It amazes me how much they've grown in just over a week. &lt;a href="http://en.wikipedia.org/wiki/Barn_swallow"&gt;wikipedia&lt;/a&gt; says that barn swallows fledge (I believe that more-or-less means "leave the nest") after about 18-23 days, so they've got another week or two.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/2694238406/" title="3 of the hatchlings by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3095/2694238406_3cf78f9477_m.jpg" width="240" height="180" alt="3 of the hatchlings" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-7473136433374098330?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/7473136433374098330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=7473136433374098330' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7473136433374098330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7473136433374098330'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/07/barn-swallows-bigger-and-bolder.html' title='barn swallows; bigger and bolder'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3095/2694238406_3cf78f9477_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5948100989539545389</id><published>2008-07-17T07:30:00.000-05:00</published><updated>2008-07-17T07:30:01.272-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='writing'/><title type='text'>php|arch article</title><content type='html'>I got another article published. In fact, it looks like I made the cover of the &lt;a href="http://phparch.com/c/magazine/issue/76"&gt;June 2008 issue of php|architect&lt;/a&gt;. The article is titled "EAV Modeling" and talks about a database design I've used in a couple of recent projects.&lt;br /&gt;&lt;br /&gt;Working with the editor on this assignment was a good experience. She made me feel a lot more involved in the process than I did with the &lt;a href="http://www.linuxjournal.com/article/9861"&gt;&lt;span style="font-weight: bold;"&gt;Linux Journal&lt;/span&gt; article&lt;/a&gt;.&lt;span style="font-weight: bold;"&gt; *shrug*&lt;/span&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5948100989539545389?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5948100989539545389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5948100989539545389' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5948100989539545389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5948100989539545389'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/07/phparch-article.html' title='php|arch article'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-3689123818308610200</id><published>2008-07-16T07:30:00.001-05:00</published><updated>2008-07-16T07:30:00.802-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pictures'/><category scheme='http://www.blogger.com/atom/ns#' term='animals'/><title type='text'>barn swallows</title><content type='html'>About a month ago I started noticing a bird's nest attached to the wall near the door to my apartment. I'd occasionally see a couple of small, orange-and-black birds coming and going. Because of something that happened a couple of days ago, I wanted to find out what kind of birds they were.&lt;br /&gt;&lt;br /&gt;A Web search directed me to &lt;a href="http://whatbird.com/"&gt;whatbird.com&lt;/a&gt;. This site has a pretty cool search feature allowing you to enter certain characteristics of a bird (size, color, tail shape, etc.), and it'll help you figure out what kind of bird it is. Turns out that my neighbors are &lt;a href="http://identify.whatbird.com/obj/191/_/Barn_Swallow.aspx"&gt;barn swallows&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The thing that happened earlier in the week is that their eggs hatched. So now I have about four other new neighbors. I took a few pictures and posted some of the better ones to my &lt;a href="http://www.flickr.com/photos/93512143@N00/"&gt;flickr&lt;/a&gt; account:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/2671957655/" title="closeup by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3166/2671957655_716d285ace_m.jpg" width="240" height="180" alt="closeup" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/2671967719/" title="feeding by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3218/2671967719_cb3f665a2c_m.jpg" width="240" height="180" alt="feeding" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-3689123818308610200?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/3689123818308610200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=3689123818308610200' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3689123818308610200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3689123818308610200'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/07/barn-swallows.html' title='barn swallows'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3166/2671957655_716d285ace_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-9223352870535531077</id><published>2008-07-12T15:08:00.003-05:00</published><updated>2008-07-12T15:26:53.562-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>PHP frameworks: performance</title><content type='html'>For some time now I've been trying to figure out what to do about PHP frameworks. Most notably I've been wondering which one would be best for my needs and whether or not it's worth my time learning one. The problem is that there are so many. &lt;a href="http://framework.zend.com/"&gt;Zend&lt;/a&gt;, &lt;a href="http://cakephp.org/"&gt;Cake&lt;/a&gt;, and &lt;a href="http://www.symfony-project.org/"&gt;Symfony&lt;/a&gt; appear to be pretty popular (at least, they are frequently mentioned in PHP blogs).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.developertutorials.com/"&gt;developertutorials.com&lt;/a&gt; has a post which highlights a recent &lt;a href="http://www.developertutorials.com/blog/php/benchmarking-php-frameworks-315/"&gt;performance analysis&lt;/a&gt; of Zend, Cake, and &lt;a href="http://codeigniter.com/"&gt;CogeIgniter&lt;/a&gt;. The concluding sentence is a good summation:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;...if you’re building small applications, CakePHP will clearly save you time in development, CodeIgniter will offer massive performance benefits, and Zend will give you a reasonable middle ground.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Still not sure which one I want to try, but I lean a bit toward Zend (although it has received some &lt;a href="http://thislab.com/2008/07/05/zend-framework-where-do-you-want-to-go-tomorrow/"&gt;recent criticism&lt;/a&gt; regarding its coding conventions and documentation). I like it that you can use it as a full-blown framework or just import the features you need for your application.&lt;br /&gt;&lt;br /&gt;When I get some time, I guess &lt;span style="font-weight: bold;"&gt;*shrug*&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-9223352870535531077?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/9223352870535531077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/9223352870535531077'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/07/php-frameworks-performance.html' title='PHP frameworks: performance'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-4694447771902129868</id><published>2008-07-07T07:30:00.005-05:00</published><updated>2008-07-07T07:30:01.122-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='redhat'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>mod_security</title><content type='html'>mod_security is an open source Web application firewall which operates as an &lt;a href="http://httpd.apache.org/"&gt;Apache&lt;/a&gt; module. mod_security inspects incoming requests (and, I believe, can also inspect outgoing responses) and take certain actions if a request (or response) matches a pattern. These actions can include logging and/or blocking the request. mod_security works sort of like anti-virus software, in that it comes with a ruleset which can identify common malicious activity (like cross-site scripting and SQL injection attempts). Like anti-virus software, it's necessary to update the ruleset from time to time.&lt;br /&gt;&lt;br /&gt;I installed &lt;a href="http://www.modsecurity.org/"&gt;mod_security&lt;/a&gt; on a couple of production RHEL5 Web servers lately, and here are a few of my observations.&lt;br /&gt;&lt;br /&gt;Installing mod_security is pretty easy and is documented in the mod_security download. I found that I needed to install the following packages to meet some dependencies and to build mod_security:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;apr-devel&lt;/li&gt;&lt;li&gt;gcc-c++&lt;/li&gt;&lt;li&gt;httpd-devel&lt;/li&gt;&lt;li&gt;pcre and pcre-devel&lt;/li&gt;&lt;li&gt;libxml2-devel&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I had the support of my managers to put mod_security in full blocking mode, so after copying the rules directory to &lt;code&gt;/etc/httpd/modsecurity.d&lt;/code&gt;, I saved the following in &lt;code&gt;/etc/httpd/conf.d/modsecurity.conf&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;LoadFile /usr/lib/libxml2.so.2&lt;br /&gt;&lt;br /&gt;LoadModule security2_module modules/mod_security2.so&lt;br /&gt;LoadModule unique_id_module modules/mod_unique_id.so&lt;br /&gt;&lt;br /&gt;&amp;lt;IfModule mod_security2.c&amp;gt;&lt;br /&gt;Include modsecurity.d/*.conf&lt;br /&gt;Include modsecurity.d/optional_rules/*.conf&lt;br /&gt;&amp;lt;/Ifmodule&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The Web servers run a variety of custom Web applications as well as some canned software like &lt;a href="http://www.k5n.us/webcalendar.php"&gt;Webcalendar&lt;/a&gt; and &lt;a href="http://www.wordpress.org/"&gt;Wordpress&lt;/a&gt;. I didn't experience any problems with the custom applications or Webcalendar, but mod_security took issue when someone tried to edit an existing blog post in Wordpress (curiously, there wasn't any trouble when submitting a new post). So I put the following in &lt;code&gt;/etc/httpd/modsecurity.d/modsecurity_crs_15_customrules.conf&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Directory /path/to/wordpress/wp-admin&amp;gt;&lt;br /&gt;SecRuleEngine Off&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I'm in the fortunate (and perhaps unusual) situation of being able to restrict access to the &lt;code&gt;wp-admin&lt;/code&gt; directory by IP address, so I don't have the entire Internet hammering at the thing. Looks like blogsecurity.net has a &lt;a href="http://blogsecurity.net/wordpress/modsecurity-and-wordpress-defense-in-depth/"&gt;custom mod_security configuration for Wordpress&lt;/a&gt; which I just haven't had time to try yet.&lt;br /&gt;&lt;br /&gt;Another wrinkle I had was that some command-line Perl programs I run would be blocked because they weren't providing "accept" and "user-agent" request headers. One of these programs looked something like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/perl -w&lt;br /&gt;&lt;br /&gt;use strict;&lt;br /&gt;use HTTP::Request::Common;&lt;br /&gt;use LWP::UserAgent;&lt;br /&gt;&lt;br /&gt;my $ua = LWP::UserAgent-&gt;new();&lt;br /&gt;my $uri = shift @ARGV;&lt;br /&gt;my $res = $ua-&gt;request( GET $uri );&lt;br /&gt;print $res-&gt;content();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I had to make the following two changes/addition:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ua-&gt;agent('whinerack');&lt;br /&gt;my $res = $ua-&gt;request( GET $uri, accept =&gt; 'text/html' );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(Looks like just about any non-blank user-agent will do.)&lt;br /&gt;&lt;br /&gt;Another trick I've learned is that instead of using &lt;code&gt;SecRuleEngine Off&lt;/code&gt; (like I did for the Wordpress &lt;code&gt;wp-admin&lt;/code&gt; directory, which makes mod_security totally ignore that directory), you can use &lt;code&gt;SecRuleEngine DetectionOnly&lt;/code&gt;, which makes mod_security log what it &lt;span style="font-style: italic;"&gt;would&lt;/span&gt; do without actually blocking requests. This can be good for debugging.&lt;br /&gt;&lt;br /&gt;And although I haven't needed it, the mod_security documentation &lt;a href="http://www.modsecurity.org/documentation/modsecurity-apache/2.1.7/modsecurity2-apache-reference.html#N10F8D"&gt;suggests&lt;/a&gt; a way to whitelist requests from a specific host:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SecRule REMOTE_ADDR "^192\.168\.1\.100$" nolog,phase:1,allow&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;All in all, installing mod_security has been a fairly easy transition, and it's nice having another layer of protection.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-4694447771902129868?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/4694447771902129868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=4694447771902129868' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4694447771902129868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4694447771902129868'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/07/modsecurity.html' title='mod_security'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-7546607595192112138</id><published>2008-07-06T09:00:00.000-05:00</published><updated>2008-07-06T09:00:01.132-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='science'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>xephem in Ubuntu</title><content type='html'>I was out with friends last night (4th of July fireworks), and they asked me to identify a bright object in the sky (I used to be an astronomer). I'm really out of practice at that kind of thing, so I speculated that it was Sirius (there was some light cloud cover, and I couldn't see whether or not this object was southeast of Orion, but it was pretty bright). Turns out I was wrong.&lt;br /&gt;&lt;br /&gt;There's a really cool desktop ephemeris program called &lt;a href="http://www.clearskyinstitute.com/xephem/"&gt;Xephem&lt;/a&gt; from the Clear Sky Institute. So I installed that on my Ubuntu desktop this morning to find what that thing was last night. I had to fulfill a few dependencies to compile xephem. Here's what I had to install first (I just explicitly installed the ones in bold--&lt;code&gt;apt-get&lt;/code&gt; installed the packages in parentheses as dependencies):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;libxt-dev&lt;/span&gt; (libsm-dev, libice-dev)&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;x11proto-print-dev&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;libxp-dev&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;libxext-dev&lt;/span&gt; (x11proto-xext-dev)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;libxmu-headers&lt;/span&gt; (?)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;libxmu-dev&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;(I'm not sure I needed libxmu-headers.)&lt;br /&gt;&lt;br /&gt;After that I mostly just followed the directions in the INSTALL file from the xephem download. I copied the data directories (&lt;code&gt;auxil&lt;/code&gt;, &lt;code&gt;catalogs&lt;/code&gt;, &lt;span style="font-style: italic;"&gt;etc.&lt;/span&gt;) to &lt;code&gt;/usr/share/xephem&lt;/code&gt; (a directory I created) and put the following in &lt;code&gt;~/.xephem/XEphem&lt;/code&gt; (xephem didn't seem to want to read &lt;code&gt;/usr/X11R6/lib/X11/app-defaults/XEphem&lt;/code&gt; as the &lt;code&gt;INSTALL&lt;/code&gt; file suggested):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;XEphem.ShareDir: /usr/share/xephem&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I also &lt;code&gt;gzip&lt;/code&gt;ed the man page (xephem.1) before copying it to &lt;code&gt;/usr/share/man/man1/xephem.1.gz&lt;/code&gt;. And I created &lt;code&gt;/usr/share/doc/xephem-3.7.3/&lt;/code&gt; and copied in the &lt;code&gt;Copyright&lt;/code&gt;, &lt;code&gt;INSTALL&lt;/code&gt;, and &lt;code&gt;README&lt;/code&gt; files.&lt;br /&gt;&lt;br /&gt;By the way, that object turned out to be Jupiter. &lt;span style="font-style: italic; font-weight: bold;"&gt;shrug&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-7546607595192112138?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/7546607595192112138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=7546607595192112138' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7546607595192112138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7546607595192112138'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/07/xephem-in-ubuntu.html' title='xephem in Ubuntu'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-747286700948797187</id><published>2008-07-05T10:57:00.002-05:00</published><updated>2008-07-05T11:03:41.406-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>apt-get: "kept back"</title><content type='html'>I have the following (executable) file in /etc/cron.daily on my Ubuntu desktop:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;apt-get update&lt;br /&gt;apt-get -s upgrade&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This lets me know when updates are available: the &lt;code&gt;-s&lt;/code&gt; option lists available updates without running them unattended.&lt;br /&gt;&lt;br /&gt;Occasionally I'll get a list saying that some updates have been "kept back." I always have trouble remembering what to do in this case. It's typically just some dependency problem. This issue is addressed in the &lt;a href="http://www.debian.org/doc/manuals/apt-howto/ch-apt-get.en.html#s-upgrade"&gt;APT HOWTO&lt;/a&gt; on the Debian Web site. In my (limited) experience, this has always been overcome by doing &lt;code&gt;apt-get instal pgkname&lt;/code&gt;, where &lt;em&gt;pkgname&lt;/em&gt; is the offending package which is being "kept back."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-747286700948797187?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/747286700948797187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=747286700948797187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/747286700948797187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/747286700948797187'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/07/apt-get-kept-back.html' title='apt-get: &quot;kept back&quot;'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-128496305036436903</id><published>2008-06-29T17:57:00.002-05:00</published><updated>2008-06-29T18:07:39.059-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='n800'/><title type='text'>n800 maemo updates</title><content type='html'>I got a &lt;a href="http://www.nseries.com/products/n800/"&gt;Nokia n800 Internet tablet&lt;/a&gt; a few months ago and installed the &lt;a href="http://maemo.org/"&gt;Maemo os2008&lt;/a&gt; software platform. I put the n800 in &lt;a href="http://maemo.org/community/wiki/applicationmanagerredpillmode/"&gt;red pill mode&lt;/a&gt; to install some packages, and I just left it that way and forgot all about red/blue pill mode.&lt;br /&gt;&lt;br /&gt;It didn't take long for me to find that updates just didn't work, but I never put the two things (red pill mode and broken updates) together. Looks like this is a well-known problem (see the bottom of the red pill mode wiki page linked above).&lt;br /&gt;&lt;br /&gt;So if you put your n800 in red pill mode and updates don't work (mine complained that it needed to resolve libglade dependencies: it seemed to want to update to a version which was already installed), put it back in blue pill mode and try running updates. That worked for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-128496305036436903?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/128496305036436903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=128496305036436903' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/128496305036436903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/128496305036436903'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/06/n800-maemo-updates.html' title='n800 maemo updates'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-320575532022845498</id><published>2008-06-22T08:00:00.000-05:00</published><updated>2008-06-22T08:00:02.295-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>mcrypt randomness in PHP</title><content type='html'>The other day I was trying to debug a PHP program which was being really slow. I'm not bright enough to use proper debugging tools (like &lt;a href="http://xdebug.org/"&gt;xdebug&lt;/a&gt;), so I just sprinkled in a bucketload of &lt;code&gt;error_log()&lt;/code&gt; calls until I figured out what was gumming up the works.&lt;br /&gt;&lt;br /&gt;It turned out to be an &lt;code&gt;mcrypt_create_iv()&lt;/code&gt; call. Sometimes that call would run in a fraction of a second, and sometimes it would take over a minute, with no discernible pattern. I had pretty much done a copy-and-paste from the &lt;a href="http://www.php.net/manual/en/function.mcrypt-module-open.php"&gt;&lt;code&gt;mcrypt_module_open()&lt;/code&gt; manual page&lt;/a&gt;, which shows using the &lt;code&gt;MCRYPT_DEV_RANDOM&lt;/code&gt; constant as the second argument to &lt;code&gt;mcrypt_create_iv()&lt;/code&gt;. It finally occurred to me to try using the &lt;code&gt;MCRYPT_DEV_URANDOM&lt;/code&gt; constant (note the "U"), instead, and the encryptions immediately became consistently fast.&lt;br /&gt;&lt;br /&gt;This was happening on a VMWare ESX guest running RHEL4. A Web search or two found a &lt;a href="http://stupefydeveloper.blogspot.com/2007/12/random-vs-urandom.html"&gt;good comparison&lt;/a&gt; of &lt;code&gt;/dev/random&lt;/code&gt; v. &lt;code&gt;/dev/urandom&lt;/code&gt;, and my problem turned out to be a good illustration of &lt;code&gt;/dev/random&lt;/code&gt; blocking the caller until sufficient entropy is attained.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-320575532022845498?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/320575532022845498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=320575532022845498' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/320575532022845498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/320575532022845498'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/06/mcrypt-randomness-in-php.html' title='mcrypt randomness in PHP'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-4433686865723304990</id><published>2008-06-21T08:00:00.000-05:00</published><updated>2008-06-21T08:07:48.192-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>HTML form attack</title><content type='html'>The other day I came across a &lt;a href="http://www.cgisecurity.com/2008/06/08"&gt;post about the HTML form attack&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I don't think I'd seen this before, and I'm not well versed in JavaScript attacks (authors of the &lt;a href="http://planet-websecurity.org/"&gt;planet-websecurity.org&lt;/a&gt; blogs would probably point, laugh, and yell "NOOB!"). But when I sort of figured out what it was talking about, it occurred to me that a form on a page which is vulnerable to cross-site scripting could be made to POST to an arbitrary location. Try the following in a JavaScript-enabled browser, and see where it ends up taking you when you click the submit button:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;form id="gakkk" action="/good.html"&amp;gt;&lt;br /&gt;&amp;lt;input type="submit" /&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;// &amp;lt;![CDATA[&lt;br /&gt;document.getElementById('gakkk').action = '/bad.html';&lt;br /&gt;// ]]&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-4433686865723304990?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/4433686865723304990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=4433686865723304990' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4433686865723304990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4433686865723304990'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/06/html-form-attack.html' title='HTML form attack'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-2471286839659904492</id><published>2008-06-20T18:46:00.003-05:00</published><updated>2008-06-20T19:12:11.099-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>GPG wallet in cygwin</title><content type='html'>The other day it occurred to me try my &lt;a href="http://www.linuxjournal.com/article/9861"&gt;password wallet&lt;/a&gt; in &lt;a href="http://www.cygwin.com/"&gt;cygwin&lt;/a&gt;. The wallet requires &lt;a href="http://invisible-island.net/dialog/"&gt;dialog&lt;/a&gt;, but cygwin doesn't seem to have a dialog package. So I figured I'd try building it.&lt;br /&gt;&lt;br /&gt;dialog requires ncurses, which meant that I needed to install the &lt;span style="font-style: italic;"&gt;ncurses-devel&lt;/span&gt; cygwin package (using the cygwin setup tool). Then I downloaded the dialog source and did &lt;code&gt;configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;/code&gt;, and that "just worked" to get dialog in cygwin. And then the wallet "just worked," too.&lt;br /&gt;&lt;br /&gt;So if you're running Windows and want to try the password wallet, install cygwin and give a wallet a try.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-2471286839659904492?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/2471286839659904492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=2471286839659904492' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/2471286839659904492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/2471286839659904492'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/06/gpg-wallet-in-cygwin.html' title='GPG wallet in cygwin'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-6962628648508792042</id><published>2008-06-19T07:30:00.000-05:00</published><updated>2008-06-19T07:30:00.925-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>AdoDB, PHP, MySQL, SSL</title><content type='html'>(I'm practicing for an "Unreadable blog post title" contest.)&lt;br /&gt; &lt;br /&gt;Here are a few hints on how to use SSL certificates when connecting to MySQL from a PHP program using the &lt;a href="http://adodb.sourceforge.net/"&gt;AdoDB database abstraction layer&lt;/a&gt;. (You may want to see my previous post on &lt;a href="http://mbrisby.blogspot.com/2008/06/ssl-in-mysql-connections.html"&gt;setting up SSL certificates for MySQL connections&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;The trick is to use a DSN in the NewADOConnection() call (rather than authenticating with a Connect() call) &lt;strong&gt;and&lt;/strong&gt; to use the &lt;em&gt;mysqli&lt;/em&gt; driver (looks like the &lt;em&gt;mysql&lt;/em&gt; driver won't work for this). The DSN syntax allows you to supply client flags, and there's a &lt;em&gt;mysqli&lt;/em&gt; flag for using SSL certificates.&lt;br /&gt;&lt;br /&gt;After creating a CA certificate (we'll say it's at &lt;code&gt;/path/to/ca-cert.pem&lt;/code&gt;), make sure that the following item is in the &lt;code&gt;[client]&lt;/code&gt; stanza of &lt;code&gt;/etc/my.cnf&lt;/code&gt; or the connecting user's &lt;code&gt;~/.my.cnf&lt;/code&gt; on the client host:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ssl-ca=/path/to/ca-cert.pem&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then try the following PHP program:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// these are part of the AdoDB library&lt;br /&gt;require '/path/to/adodb-exceptions.inc.php';&lt;br /&gt;require '/path/to/adodb.inc.php';&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* I got the '2048' from running&lt;br /&gt;* printf( "%d\n", MYSQLI_CLIENT_SSL )&lt;br /&gt;* in a PHP program (w/ the mysqli extention installed)&lt;br /&gt;*/&lt;br /&gt;$dsn = 'mysqli://ssluser:sslpass@dbhost/test?clientflags=2048';&lt;br /&gt;&lt;br /&gt;$dbh = NewADOConnection($dsn);&lt;br /&gt;&lt;br /&gt;$sql = "show status like 'ssl_cipher'";&lt;br /&gt;$res =&amp;amp; $dbh-&gt;Execute($sql);&lt;br /&gt;print_r( $res-&gt;fields );&lt;br /&gt;$res-&gt;Close();&lt;br /&gt;$dbh-&gt;Close();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This should generate output similar to like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Array&lt;br /&gt;(&lt;br /&gt;  [0] =&gt; Ssl_cipher&lt;br /&gt;  [Variable_name] =&gt; Ssl_cipher&lt;br /&gt;  [1] =&gt; DHE-RSA-AES256-SHA&lt;br /&gt;  [Value] =&gt; DHE-RSA-AES256-SHA&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-6962628648508792042?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/6962628648508792042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=6962628648508792042' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/6962628648508792042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/6962628648508792042'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/06/adodb-php-mysql-ssl.html' title='AdoDB, PHP, MySQL, SSL'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-2697193023180710924</id><published>2008-06-17T07:30:00.001-05:00</published><updated>2008-06-17T07:30:01.245-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>SSL in MySQL connections</title><content type='html'>Last week I wanted to figure out how to use SSL certificates in MySQL connections. This is &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/secure-connections.html"&gt;well-documented&lt;/a&gt; on the MySQL Web site, but here are a few wrinkles I experienced while figuring out how to get this working (this was with MySQL5 on CentOS5 and RHEL5).&lt;br /&gt;&lt;br /&gt;After creating the certificate authority (CA) certificate/keyfile pair, you can specify them in the &lt;em&gt;mysqld&lt;/em&gt; section of &lt;code&gt;/etc/my.cnf&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;ssl-ca=/etc/pki/CA/ca-cert.pem&lt;br /&gt;ssl-cert=/etc/pki/tls/certs/mysql-server-cert.pem&lt;br /&gt;ssl-key=/etc/pki/tls/private/mysql-server-key.pem&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When making certificates for a client connecting locally (e.g., &lt;em&gt;ssluser@localhost&lt;/em&gt;), it's important to supply &lt;em&gt;localhost&lt;/em&gt; as the "common name" when prompted by openssl. (Yes, it's probably pretty silly to use SSL for a connection over the loopback interface, but you might be in this situation if you were testing.)&lt;br /&gt;&lt;br /&gt;If you want to specify the CA (whose signature must appear in client certificates) when setting up a MySQL user (as you might when using the &lt;span style="font-weight: bold;"&gt;require x509&lt;/span&gt; syntax), the fields should be separated by backslashes ('/'): &lt;code&gt;grant usage on *.* to ssluser@localhost require issuer '/C=GB/ST=Berkshire/L=Newbury/O=My Company Ltd/CN=www.example.com/emailAddress=webmaster@example.com';&lt;/code&gt;&lt;br /&gt;The following command will more-or-less correctly format the issuer for the grant statement:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;openssl x509 -text -in /path/to/ca-cert.pem | grep Issuer \&lt;br /&gt;| cut -d':' -f2 | sed -e 's/, /\//g'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Using &lt;strong&gt;issuer&lt;/strong&gt; and &lt;strong&gt;subject&lt;/strong&gt; items &lt;span style="font-style: italic;"&gt;imply&lt;/span&gt; &lt;strong&gt;x509&lt;/strong&gt;, and it's an error to try using &lt;strong&gt;x509&lt;/strong&gt; &lt;em&gt;and&lt;/em&gt; &lt;strong&gt;issuer&lt;/strong&gt;.&lt;p&gt;&lt;/p&gt; &lt;p&gt;Depending on the &lt;em&gt;require&lt;/em&gt; clause in the &lt;em&gt;grant&lt;/em&gt; statement, you can use one or more of the following to connect to the SSL-enabled server:&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;mysql -u ssluser -p&lt;/li&gt;&lt;br /&gt;&lt;li&gt;mysql -u ssluser --ssl-ca=ca-cert.pem -p&lt;/li&gt;&lt;br /&gt;&lt;li&gt;mysql -u ssluser --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -p&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;If you use &lt;em&gt;require none&lt;/em&gt; or omit the &lt;em&gt;require&lt;/em&gt; clause, you can use any of the three connection commands. If you use &lt;em&gt;require ssl&lt;/em&gt;, you can use #2 or #3. And if you use &lt;em&gt;require x509&lt;/em&gt;, you have to use #3 (note that #3 includes the &lt;code&gt;--ssl-ca&lt;/code&gt; option). After connecting, type &lt;em&gt;status&lt;/em&gt; (or just &lt;em&gt;\s&lt;/em&gt;) and make sure that the &lt;strong&gt;SSL&lt;/strong&gt; item says something encryptiony (mine says &lt;code&gt;Cipher in use is DHE-RSA-AES256-SHA&lt;/code&gt;).&lt;br /&gt;&lt;br /&gt;Unless client certificates are really necessary (extra client-level authentication), it's probably adequate just to use &lt;em&gt;require ssl&lt;/em&gt; and to have the client provide the CA certificate (this appears to provide as high a level of encryption as the client certificate does). But note that you still need to generate the server certificate and key, even if you're not using client certificates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-2697193023180710924?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/2697193023180710924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=2697193023180710924' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/2697193023180710924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/2697193023180710924'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/06/ssl-in-mysql-connections.html' title='SSL in MySQL connections'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-7979147628184800547</id><published>2008-06-15T18:31:00.003-05:00</published><updated>2008-06-15T18:44:52.449-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>MIME-decoding email attachments</title><content type='html'>Occasionally a friend will forward a message to my gmail account, and the forwarded message ends up as a plain-text attachment in the message I receive. If the original message had an attachment, that attachment appears as a MIME-encoded section of the attachment.&lt;br /&gt;&lt;br /&gt;If this happens to you, you could try the following. Save the attachment as a text file, and open that file in a text editor. Delete all the lines except the lines which represent the encoded attachment (don't keep the attachment headers, just the lines of text which are 76 characters wide [the last line may be shorter--keep that one, too]). Don't forget to get rid of the lines &lt;span style="font-style: italic;"&gt;after&lt;/span&gt; the attachment. Save the file as &lt;code&gt;encoded.txt&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Save the following to an executable file called &lt;code&gt;mime_decode&lt;/code&gt; somewhere in your &lt;span style="font-weight: bold;"&gt;$PATH&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/perl -w&lt;br /&gt;&lt;br /&gt;use strict;&lt;br /&gt;use diagnostics;&lt;br /&gt;&lt;br /&gt;use Carp;&lt;br /&gt;use MIME::Base64;&lt;br /&gt;&lt;br /&gt;my $usage = "$0 infile outfile";&lt;br /&gt;if ( @ARGV != 2 ) {&lt;br /&gt;    die "usage: $usage\n";&lt;br /&gt;}&lt;br /&gt;my ( $infile, $outfile ) = @ARGV;&lt;br /&gt;&lt;br /&gt;open my $fh, '&lt;', $infile or croak "cannot read $infile";&lt;br /&gt;my $encoded = join '', &lt;$fh&gt;;&lt;br /&gt;close $fh;&lt;br /&gt;&lt;br /&gt;my $decoded = decode_base64($encoded);&lt;br /&gt;open $fh, '&gt;', $outfile or croak "cannot write $outfile";&lt;br /&gt;print {$fh} $decoded;&lt;br /&gt;close $fh;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then run the following command:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mime_decode encoded.txt decoded&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;decoded&lt;/code&gt; should be the original attachment.&lt;br /&gt;&lt;br /&gt;If you know of a standard utility which does this (especially if it doesn't require the user to prune the email message), please leave a comment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-7979147628184800547?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/7979147628184800547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=7979147628184800547' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7979147628184800547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7979147628184800547'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/06/mime-decoding-email-attachments.html' title='MIME-decoding email attachments'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-6571907070508169515</id><published>2008-06-13T23:04:00.003-05:00</published><updated>2008-06-13T23:08:39.565-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><title type='text'>Gump</title><content type='html'>As a big Transformers fan and someone who, well, goes to the bathroom, I thought this was &lt;a href="http://www.slashfilm.com/2008/06/09/lol-transformers-septicon-warrior-concept-art/"&gt;pretty cool&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-6571907070508169515?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/6571907070508169515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=6571907070508169515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/6571907070508169515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/6571907070508169515'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/06/gump.html' title='Gump'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-4927096040992101077</id><published>2008-06-01T20:24:00.003-05:00</published><updated>2008-06-01T20:30:35.778-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pictures'/><title type='text'>Fallen Tree</title><content type='html'>There was a ferocious wind-and-rain storm here a week ago, and it knocked over some trees. I took some pictures of one of the more impressive casualties. I think it was an elm tree, and (judging by the rings) it appears to have been around forty years old. They cut it up to cart it off, and they made a cut just above the roots. It was probably around two feet in diameter at the base.&lt;br /&gt;&lt;br /&gt;Here are a couple of the pictures...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/2542807863/" title="another ring detail by mbrisby, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2399/2542807863_241264d335_m.jpg" width="240" height="180" alt="another ring detail" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/2542784605/" title="gnarled roots by mbrisby, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3071/2542784605_de80b55271_m.jpg" width="240" height="180" alt="gnarled roots" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-4927096040992101077?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/4927096040992101077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=4927096040992101077' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4927096040992101077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4927096040992101077'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/06/fallen-tree.html' title='Fallen Tree'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2399/2542807863_241264d335_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-3828624655064677351</id><published>2008-06-01T14:37:00.003-05:00</published><updated>2008-06-01T14:47:03.975-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='movies'/><title type='text'>Burning Universal Studios</title><content type='html'>A couple of years ago I visited L.A. with friends, and we checked out &lt;a href="http://mbrisby.blogspot.com/2006/09/la-trip.html"&gt;Universal Studios&lt;/a&gt;. We took the tour, which included the cheesy-but-fun King Kong attraction.&lt;br /&gt;&lt;br /&gt;That part of the tour was &lt;a href="http://www.scifi.com/scifiwire/index.php?id=55130"&gt;destroyed by fire&lt;/a&gt; this morning. The same fire damaged the town hall clocktower from the &lt;a href="http://www.imdb.com/title/tt0088763/"&gt;&lt;span style="font-weight: bold;"&gt;Back to the Future&lt;/span&gt;&lt;/a&gt; set, and damaged over 40,000 reels of film (fortunately, there are duplicates in another location--someone was awake during the "Make Backups" lecture at film school).&lt;br /&gt;&lt;br /&gt;Tourist attractions have had a &lt;a href="http://mbrisby.blogspot.com/2008/05/bletchley-park-financial-problems.html"&gt;hard&lt;/a&gt; &lt;a href="http://mbrisby.blogspot.com/2008/05/star-trek-experience-maybe-closing.html"&gt;time&lt;/a&gt; of it lately.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-3828624655064677351?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/3828624655064677351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=3828624655064677351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3828624655064677351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3828624655064677351'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/06/burning-universal-studios.html' title='Burning Universal Studios'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-8549168692556971572</id><published>2008-05-24T13:04:00.003-05:00</published><updated>2008-05-24T13:22:32.619-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><title type='text'>RPMs on a tight filesystem</title><content type='html'>I've ended up managing a couple of &lt;a href="http://www.centos.org/"&gt;CentOS&lt;/a&gt; servers which don't have much free space left on their root (/) filesystems. I was looking through their lists of installed packages, and I discovered a useful trick. The following command will give the size (in bytes) of the original RPM of an installed package:&lt;br /&gt;&lt;pre&gt;rpm -q --qf '%{archivesize}\n' pkgname&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So if you needed a report indicating roughly how much filesystem space each installed package on an RPM-based distribution was consuming, you could try this:&lt;br /&gt;&lt;pre&gt;rpm -qa --qf '%{archivesize} %{name}\n' | sort -rn&lt;/pre&gt;&lt;br /&gt;When I did this on a CentOS4 box with a full install, I was rather unsurprised to find that the top offender is the OpenOffice.org internationalization package openoffice.org-i18n.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-8549168692556971572?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/8549168692556971572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=8549168692556971572' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8549168692556971572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8549168692556971572'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/05/rpms-on-tight-filesystem.html' title='RPMs on a tight filesystem'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5365277965397093480</id><published>2008-05-21T21:26:00.002-05:00</published><updated>2008-05-21T21:30:17.209-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Hard Time</title><content type='html'>From the &lt;a href="http://news.yahoo.com/s/ap/20080521/ap_on_en_mu/people_lou_pearlman"&gt;AP news wire&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Lou Pearlman, the man who created the &lt;span class="yshortcuts" id="lw_1211384004_0"&gt;Backstreet Boys&lt;/span&gt; and '&lt;span class="yshortcuts" id="lw_1211384004_1"&gt;N Sync&lt;/span&gt;, was sentenced Wednesday to 25 years in federal prison for engineering a decades-long scam that bilked thousands of investors out of their life savings.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Well, at least he's going to jail, even if it may be for the wrong reason.&lt;br /&gt;&lt;br /&gt;And I willfully acknowledge the irony of tagging this post with the 'music' label.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5365277965397093480?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5365277965397093480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5365277965397093480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5365277965397093480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5365277965397093480'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/05/hard-time.html' title='Hard Time'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-6451921783375106904</id><published>2008-05-19T07:00:00.001-05:00</published><updated>2008-05-19T07:00:02.200-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>root ssh access trick</title><content type='html'>Free Software Daily had an &lt;a href="http://www.fsdaily.com/EndUser/The_Ultimate_SSH_Security_Tutorial"&gt;interesting post the other day about securing SSH services&lt;/a&gt; (that post points to a &lt;a href="http://tuxtraining.com/2008/05/14/the-ultimate-ssh-security-tutorial/"&gt;Tux Training article&lt;/a&gt;). This particular tutorial included a configuration item I hadn't seen before. It's a configuration value for the &lt;span style="font-weight: bold;"&gt;PermitRootLogin&lt;/span&gt; field.&lt;br /&gt;&lt;br /&gt;If I'm running an SSH service which is visible to the Internet (or even a large intranet), I tend to disable &lt;span style="font-weight: bold;"&gt;PermitRootLogin&lt;/span&gt; (&lt;code&gt;PermitRootLogin no&lt;/code&gt;), because the script kiddies can be reasonably sure that an SSH service will have a user called root, and if they try hard enough, they might get lucky with the password.&lt;br /&gt;&lt;br /&gt;(I'm also a big fan of the &lt;code&gt;AllowUsers&lt;/code&gt; option, which allows you to provide a list of users allowed to log in via ssh. If a valid user not on that list tries to log on, ssh acts as though the user has provided the wrong password.)&lt;br /&gt;&lt;br /&gt;The new (new to me, anyway) trick in this tutorial is setting &lt;code&gt;PermitRootLogin without-password&lt;/code&gt;. This allows root to log in with a key, but &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; with a password. This is a really good compromise if you have a server where you need root to be able to log in over ssh. Backups over rsync are a good example of this: to preserve file ownership and permissions, it's sometimes necessary to have rsync run as root.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-6451921783375106904?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/6451921783375106904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=6451921783375106904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/6451921783375106904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/6451921783375106904'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/05/root-ssh-access-trick.html' title='root ssh access trick'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-7804480829413717549</id><published>2008-05-18T11:50:00.004-05:00</published><updated>2008-05-18T12:02:45.350-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cryptography'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><title type='text'>Bletchley Park financial problems</title><content type='html'>A &lt;a href="http://it.slashdot.org/article.pl?sid=08/05/16/1225225&amp;amp;from=rss"&gt;recent Slashdot post&lt;/a&gt; talks about financial problems at &lt;a href="http://en.wikipedia.org/wiki/Bletchley_park"&gt;Bletchley Park&lt;/a&gt;. Bletchley Park was home and workplace to Allied cryptographers in WWII. Some say that their success at deciphering German &lt;a href="http://en.wikipedia.org/wiki/Enigma_%28machine%29"&gt;Enigma&lt;/a&gt; messages was responsible for the Allied victory against the Nazis. At the very least, their efforts probably significantly shorted the war (in the European theatre, anyway).&lt;br /&gt;&lt;br /&gt;It's sad to me to see such an important historical site threatened. They'd probably turn it into condos and shopping centers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-7804480829413717549?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/7804480829413717549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=7804480829413717549' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7804480829413717549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7804480829413717549'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/05/bletchley-park-financial-problems.html' title='Bletchley Park financial problems'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-7208605730527686129</id><published>2008-05-16T19:49:00.003-05:00</published><updated>2008-05-16T19:56:25.255-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flickr'/><category scheme='http://www.blogger.com/atom/ns#' term='movies'/><category scheme='http://www.blogger.com/atom/ns#' term='scifi'/><title type='text'>lunchpails</title><content type='html'>The other day Film School Rejects (great &lt;a href="http://www.filmschoolrejects.com/"&gt;blog&lt;/a&gt;, with a great &lt;a href="http://www.fatguysatthemovies.com/"&gt;podcast&lt;/a&gt;) has a &lt;a href="http://www.filmschoolrejects.com/officially-cool/retro-70s-lunchboxes.php"&gt;post&lt;/a&gt; about a &lt;a href="http://www.flickr.com/photos/edowney9/sets/72157600039759305/"&gt;flickr set of lunchpails&lt;/a&gt;. Reminded me of a &lt;a href="http://en.wikipedia.org/wiki/Hong_Kong_Phooey"&gt;Hong Kong Phooey&lt;/a&gt; lunchpail I used to have.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-7208605730527686129?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/7208605730527686129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=7208605730527686129' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7208605730527686129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7208605730527686129'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/05/lunchpails.html' title='lunchpails'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-3176722553181979471</id><published>2008-05-10T15:30:00.004-05:00</published><updated>2008-05-10T16:06:58.768-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='redhat'/><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>problem w/ PHPUnit reports on CentOS5/RHEL5</title><content type='html'>Yesterday I was trying &lt;a href="http://www.phpdoc.org/"&gt;PHPDocumentor&lt;/a&gt; and was going through its &lt;a href="http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_phpDocumentor.quickstart.pkg.html"&gt;Quickstart guide&lt;/a&gt;. After I ran &lt;span style="font-weight: bold;"&gt;phpdoc&lt;/span&gt; on the sample code, I threw the reports in my CentOS5 Apache document root so that I could look at the output. Several of the pages wouldn't load. After a quick look at the Apache error log, I saw that those pages were generating PHP errors (the T_&lt;span style="font-weight: bold;"&gt;STRING&lt;/span&gt; gripe), even though the files were named something like &lt;code&gt;sample.php.html&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;(CentOS5 and RHEL5 have Apace v2.2.x.)&lt;br /&gt;&lt;br /&gt;It took me a while to figure it out, but it's due to an odd feature of Apache which honors &lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_mime.html#multipleext"&gt;multiple extensions in filename&lt;/a&gt;. RHEL5 does an &lt;code&gt;AddHandler php5-script .php&lt;/code&gt; which tells Apache to run all files with a .php extension through the PHP5 interpreter. I didn't know this, but it even does this for files with names like &lt;code&gt;sample.php.html&lt;/code&gt;, where .php isn't at the &lt;span style="font-weight: bold;"&gt;end&lt;/span&gt; of the filename. So even though the &lt;span style="font-weight: bold;"&gt;phpdoc&lt;/span&gt; output files should just render as HTML, they were being interpretted as PHP and were throwing errors.&lt;br /&gt;&lt;br /&gt;So I created a directory called &lt;code&gt;/var/www/html/phpdoc&lt;/code&gt; and added the following to &lt;code&gt;/etc/httpd/conf.d/php.conf&lt;/code&gt; in a &lt;code&gt;Directory&lt;/code&gt; container (and restarted Apache): &lt;code&gt;RemoveHandler .php&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;That convinced Apache not to run any files in that directory through the PHP5 interpreter. Incidentally, I had previously tried &lt;code&gt;SetHandler default-handler&lt;/code&gt; for that directory, and it disabled PHP5, but it also disabled nice things like autoindexing (which broke URLs like &lt;code&gt;http://localhost/phpdoc/sample/&lt;/code&gt;: Apache would refuse to serve a directory).&lt;br /&gt;&lt;br /&gt;By the way, this doesn't seem to affect CentOS4/RHEL4 (Apache 2.0.x and PHP4), because Apache sets up PHP a little differently: it does an &lt;code&gt;AddType&lt;/code&gt;, so there's no conflict of having both a &lt;code&gt;text/html&lt;/code&gt; content type &lt;span style="font-weight: bold;"&gt;and&lt;/span&gt; a PHP5 handler.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-3176722553181979471?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/3176722553181979471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=3176722553181979471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3176722553181979471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3176722553181979471'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/05/problem-w-phpunit-reports-on.html' title='problem w/ PHPUnit reports on CentOS5/RHEL5'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5994703132687257873</id><published>2008-05-08T07:00:00.001-05:00</published><updated>2008-05-08T07:00:01.721-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Batdance</title><content type='html'>Today &lt;a href="http://digg.com/"&gt;digg&lt;/a&gt; had &lt;a href="http://digg.com/music/The_11_Best_Songs_from_Geek_Movie_Soundtracks"&gt;a story&lt;/a&gt; highlighting a &lt;a href="http://www.toplessrobot.com/"&gt;topless robot&lt;/a&gt; post offering&lt;br /&gt;&lt;a href="http://www.toplessrobot.com/2008/05/the_11_best_songs_from_geekmovie_soundtracks.php#" rel="bookmark"&gt;The 11 Best Songs from Geek-Movie Soundtracks&lt;/a&gt;. Most of the 11 songs didn't really do it for me, but one of them was &lt;a href="http://en.wikipedia.org/wiki/Prince_%28musician%29"&gt;Prince&lt;/a&gt;'s &lt;a href="http://youtube.com/watch?v=ahoRt1eLEIk"&gt;Batdance&lt;/a&gt; from &lt;a href="http://www.imdb.com/title/tt0096895/"&gt;&lt;span style="font-weight: bold;"&gt;Batman&lt;/span&gt;&lt;/a&gt;. I probably hadn't seen that in fifteen years, and it was fun watching it again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5994703132687257873?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5994703132687257873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5994703132687257873' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5994703132687257873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5994703132687257873'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/05/batdance.html' title='Batdance'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-7820233003139393239</id><published>2008-05-07T19:00:00.002-05:00</published><updated>2008-05-07T19:04:47.881-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='environment'/><title type='text'>Satellite imagery of post-cyclone Myanmar</title><content type='html'>Estimates of the death toll in Myanmar have gone up and up over the last few days, and a &lt;a href="http://dotearth.blogs.nytimes.com/"&gt;Dot Earth&lt;/a&gt; post showing &lt;a href="http://dotearth.blogs.nytimes.com/2008/05/07/myanmars-delta-water-world/"&gt;satellite images before and after the cyclone&lt;/a&gt; illustrate why.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-7820233003139393239?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/7820233003139393239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=7820233003139393239' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7820233003139393239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7820233003139393239'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/05/satellite-imagery-of-post-cyclone.html' title='Satellite imagery of post-cyclone Myanmar'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-4702376329664160313</id><published>2008-05-06T07:00:00.000-05:00</published><updated>2008-05-06T07:00:01.687-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='startrek'/><category scheme='http://www.blogger.com/atom/ns#' term='scifi'/><title type='text'>"Star Trek: The Experience" maybe closing</title><content type='html'>I went to Las Vegas with friends a few years ago, and one of the things we did was to check out &lt;a href="http://www.lvhilton.com/entertainment/startrek.shtml"&gt;Star Trek: The Experience&lt;/a&gt; at the Vegas Hilton. It's expensive, but you can walk through a museum which has props from the shows and a timeline of the Star Trek universe, there's a bar modeled after Quark's in &lt;span style="font-style: italic;"&gt;DS9&lt;/span&gt;, and there are two rides: &lt;span style="font-weight: bold;"&gt;The Borg Invation 4D&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;Klingon Encounter&lt;/span&gt;. I actually didn't much care for the Borg show, the the Klingon ride was pretty cool. Walking through the museum was fun, and Quark's was a kick. There's also a good gift shop that'll be happy to overcharge you for souvenirs.&lt;br /&gt;&lt;br /&gt;Looks like they may be &lt;a href="http://trekmovie.com/2008/05/02/future-of-star-trek-the-experience-in-doubt/"&gt;shutting the thing down&lt;/a&gt;. So if you're in Vegas before September, and if you like Star Trek (and are OK with throwing away some cash), go check it out while you still can.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-4702376329664160313?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/4702376329664160313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=4702376329664160313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4702376329664160313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4702376329664160313'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/05/star-trek-experience-maybe-closing.html' title='&quot;Star Trek: The Experience&quot; maybe closing'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-8209419382550457932</id><published>2008-05-05T18:00:00.000-05:00</published><updated>2008-05-05T18:00:03.890-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>MySQL query optimization from Jay Pipes</title><content type='html'>&lt;a href="http://jpipes.com/"&gt;Jay Pipes&lt;/a&gt; has posted &lt;a href="http://jpipes.com/index.php?/archives/231-Join-fu-The-Art-of-SQL-Tuning.html"&gt;slides&lt;/a&gt; from a recent presentation in which he discussed query optimization in &lt;a href="http://mysql.com/"&gt;MySQL&lt;/a&gt;. Pretty good pointers, worth a look.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-8209419382550457932?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/8209419382550457932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=8209419382550457932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8209419382550457932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8209419382550457932'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/05/mysql-query-optimization-from-jay-pipes.html' title='MySQL query optimization from Jay Pipes'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-1349676195356566741</id><published>2008-05-01T12:02:00.001-05:00</published><updated>2008-05-01T12:05:01.791-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rss'/><title type='text'>RSS day</title><content type='html'>As &lt;a href="http://mbrisby.blogspot.com/2007/04/hopeless-rss-addiction.html"&gt;a proponent of RSS&lt;/a&gt;, here's a shout out to &lt;a href="http://rssday.org/spread/"&gt;RSS day&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-1349676195356566741?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/1349676195356566741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=1349676195356566741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1349676195356566741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1349676195356566741'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/05/rss-day.html' title='RSS day'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-3485429216173641139</id><published>2008-04-26T08:55:00.001-05:00</published><updated>2008-04-26T08:59:08.414-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>updated WordPress security whitepaper</title><content type='html'>&lt;a href="http://blogsecurity.net/"&gt;blogsecurity.net&lt;/a&gt; has released &lt;a href="http://blogsecurity.net/wordpress/wordpress-whitepaper-rev-12-new-release/"&gt;version 1.2 of their "How to secure WordPress" whitepaper&lt;/a&gt;. Looks like they've added some v2.5-specific details along with updated information about security-related plugins.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-3485429216173641139?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/3485429216173641139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=3485429216173641139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3485429216173641139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3485429216173641139'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/04/updated-wordpress-security-whitepaper.html' title='updated WordPress security whitepaper'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-2604852326081357575</id><published>2008-04-25T20:03:00.003-05:00</published><updated>2008-04-25T20:17:24.590-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><title type='text'>Wil Wheaton and Radio Free Burrito</title><content type='html'>I've recently started reading &lt;a href="http://wilwheaton.typepad.com/wwdnbackup/"&gt;Wil Wheaton's blog&lt;/a&gt;, and I've really enjoyed it. He's a very good writer with a lot to say.&lt;br /&gt;&lt;br /&gt;Perhaps like many viewers, I felt that Wesley was one of the dimmer lights in &lt;span style="font-weight: bold;"&gt;Star Trek: The Next Generation&lt;/span&gt;. I think Wil might reply to that kind of comment with something along the lines of "I was a kid. I did what they told me to do." Look me in the eye and tell me you'd have done any differently. Thought so. And me neither.&lt;br /&gt;&lt;br /&gt;(Besides, he got to make out with &lt;a href="http://images.google.com/images?q=ashley+judd"&gt;Ashley Judd&lt;/a&gt;. Look me in the eye and tell me you'd have done any differently. Thought so. And me neither.)&lt;br /&gt;&lt;br /&gt;Anyway, this week he posted a couple of episodes of his &lt;a href="http://creativecommons.org/"&gt;Creative Commons&lt;/a&gt; podcast called &lt;span style="font-weight: bold;"&gt;Radio Free Burrito&lt;/span&gt;, on which he plays some music from &lt;a href="http://music.podshow.com/"&gt;podsafe&lt;/a&gt;. It's totally awesome and you're totally a hoser for not listening. So get over &lt;a href="http://wilwheaton.typepad.com/wwdnbackup/podcast/index.html"&gt;there&lt;/a&gt; and start listening.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-2604852326081357575?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/2604852326081357575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=2604852326081357575' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/2604852326081357575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/2604852326081357575'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/04/wil-wheaton-and-radio-free-burrito.html' title='Wil Wheaton and Radio Free Burrito'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5702828823761002510</id><published>2008-04-18T07:30:00.001-05:00</published><updated>2008-04-18T07:52:36.482-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scifi'/><title type='text'>BSG</title><content type='html'>&lt;a href="http://www.scifi.com/battlestar/"&gt;Battlestar Galactica&lt;/a&gt; is finally back, and I'm really enjoying it. The other day I found the &lt;a href="http://en.battlestarwiki.org/wiki/Main_Page"&gt;Battlestar Wiki&lt;/a&gt; and thought it was pretty cool. I'm pretty eager to find out who the twelfth Cylon is. My money is on &lt;a href="http://en.battlestarwiki.org/wiki/Tom_Zarek"&gt;Tom Zarek&lt;/a&gt;. Or maybe &lt;a href="http://en.battlestarwiki.org/wiki/Dualla"&gt;Dualla&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5702828823761002510?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5702828823761002510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5702828823761002510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5702828823761002510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5702828823761002510'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/04/bsg.html' title='BSG'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-7991000642457979393</id><published>2008-04-16T07:30:00.000-05:00</published><updated>2008-04-16T08:24:14.720-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>Prompt for new firefix window</title><content type='html'>I tend to run my window manager (&lt;a href="http://fluxbox.sourceforge.net/"&gt;fluxbox&lt;/a&gt;) with four desktops, and I typically have firefox windows open in two of them. Occasionally I have to open a firefox window on the third or fourth desktop, and it's a nuisance to go to one of the first two desktops, open a new window (Ctrl-N), and move the new window to the other desktop (and I acknowledge the irony of considering that a "nuisance").&lt;br /&gt;&lt;br /&gt;I recently discovered the &lt;code&gt;-new-window&lt;/code&gt; command-line option to firefox. It takes a URL as an argument, and it opens that URL in a new window. So I wrote a shell script that prompts me for a URL and then opens that page in a new browser window. If you want to try this, save the following to a file (I saved it to &lt;code&gt;~/bin/ffwin&lt;/code&gt;), and remember to make the file executable:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;URL=$( dialog --stdout \&lt;br /&gt;  --backtitle ffwin \&lt;br /&gt;  --title 'new Firefox window' \&lt;br /&gt;  --inputbox 'URL:' 8 40 )&lt;br /&gt;if [ ! -z "$URL" ]; then&lt;br /&gt;  exec firefox -new-window $URL&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When you run this, a new xterm window will open, and dialog will prompt you for the URL. Preceding the firefox call with &lt;code&gt;exec&lt;/code&gt; means that the xterm will go away after you enter the URL.&lt;br /&gt;&lt;br /&gt;As a further refinement, make it so that you can run this from a menu-click. I added the following entry to &lt;code&gt;~/.fluxbox/menu&lt;/code&gt;, so that I just have to right-click on the desktop and select "ffwin":&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[exec] (ffwin) {xterm -e ~/bin/ffwin}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Other window managers would likely allow you to create a custom application launcher from a toolbar or menu or widget or something.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-7991000642457979393?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/7991000642457979393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=7991000642457979393' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7991000642457979393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7991000642457979393'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/04/prompt-for-new-firefix-window.html' title='Prompt for new firefix window'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-4232750804370328325</id><published>2008-04-14T07:30:00.000-05:00</published><updated>2008-04-14T08:02:08.617-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>XML in PHP5: the weather</title><content type='html'>My favorite weather-related Web site is the &lt;a href="http://www.wunderground.com/"&gt;weather underground&lt;/a&gt;, but their pages can be a bit heavy. Usually I just want a quick summary of current conditions and a forecast for the next day or two. Thankfully, wunderground provides this in XML format. Here's the example for Portland, Oregon: &lt;a href="http://www.wunderground.com/US/OR/Portland.html"&gt;HTML&lt;/a&gt;, &lt;a href="http://rss.wunderground.com/auto/rss_full/OR/Portland.xml?units=both"&gt;XML&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I thought it would be fun to write a quick PHP program to download the XML file, parse it, and present it in an easy-to-read format. I decided to use the &lt;a href="http://www.php.net/manual/en/book.simplexml.php"&gt;SimpleXML&lt;/a&gt; extension for PHP5, because my XML-parsing needs are pretty modest for this project. And I'll use the &lt;a href="http://mbrisby.blogspot.com/2008/04/fopenurl-v-curl-in-php.html"&gt;curl extension&lt;/a&gt; to fetch the XML file.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$url = 'http://rss.wunderground.com/auto/rss_full'&lt;br /&gt;  . '/OR/Portland.xml?units=both';&lt;br /&gt;&lt;br /&gt;$ch = curl_init($url);&lt;br /&gt;curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );&lt;br /&gt;curl_setopt( $ch, CURLOPT_HEADER, 0 );&lt;br /&gt;$xmlstr = curl_exec($ch);&lt;br /&gt;$res_info = curl_getinfo($ch);&lt;br /&gt;curl_close($ch);&lt;br /&gt;if ( $res_info['http_code'] != 200 ) {&lt;br /&gt;  header( 'content-type: text/plain' );&lt;br /&gt;  die("couldn't open $url");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$xml = new SimpleXMLElement($xmlstr);&lt;br /&gt;$epoch = strtotime( $xml-&gt;channel-&gt;pubDate );&lt;br /&gt;$date = date( 'H:i:s l j F Y', $epoch );&lt;br /&gt;$report_uri = htmlentities(&lt;br /&gt;  $xml-&gt;channel-&gt;item[0]-&gt;link );&lt;br /&gt;$content = '';&lt;br /&gt;$forecast_items = array();&lt;br /&gt;foreach ( $xml-&gt;channel-&gt;item as $item ) {&lt;br /&gt;$desc = strip_tags( $item-&gt;description );&lt;br /&gt;$forecast_items[] = array(&lt;br /&gt;  'guid' =&gt; $item-&gt;guid,&lt;br /&gt;  'desc' =&gt; htmlentities( html_entity_decode($desc) ),&lt;br /&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;echo '&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Weather Underground Report&amp;lt;/h1&amp;gt;',&lt;br /&gt;  '&amp;lt;h2&amp;gt;Portland, Oregon: ', $date, '&amp;lt;/h2&amp;gt;';&lt;br /&gt;foreach ( $forecast_items as $item ) {&lt;br /&gt;  $id = '';&lt;br /&gt;  if ( !empty($item['guid']) ) {&lt;br /&gt;      $id = ' id="' . $item['guid'] . '"';&lt;br /&gt;  }&lt;br /&gt;  echo "&amp;lt;p$id&amp;gt;", $item['desc'], '&amp;lt;/p&amp;gt;';&lt;br /&gt;}&lt;br /&gt;echo '&amp;lt;p&amp;gt;&amp;lt;a href="', $report_uri, '"&amp;gt;Full report&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;',&lt;br /&gt;  '&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;';&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There's some magic in the first &lt;code&gt;foreach&lt;/code&gt; loop. Just as you should never trust anything typed into a Web form, you should also be skeptical of content from a foreign XML document, hence the &lt;code&gt;strip_tags()&lt;/code&gt; and &lt;code&gt;htmlentities()&lt;/code&gt; calls. But some of the characters in the wunderground XML are already HTML-encoded (like the degree symbol), so it's useful to call &lt;code&gt;html_entity_decode()&lt;/code&gt; first (otherwise the temperature might look like "75&amp;amp;#176;F", rather than "75°F").&lt;br /&gt;&lt;br /&gt;The code is otherwise straightforward. If you look at the raw XML, you'll find that the entire report is wrapped in a &amp;lt;channel&amp;gt; container, inside which the report date is wrapped in a &amp;lt;pubDate&amp;gt; container, etc. As its name implies, SimpleXML makes parsing XML pretty easy, and it's a great choice for small projects like this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-4232750804370328325?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/4232750804370328325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=4232750804370328325' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4232750804370328325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4232750804370328325'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/04/xml-in-php5-weather.html' title='XML in PHP5: the weather'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-7961759280145307771</id><published>2008-04-08T08:20:00.000-05:00</published><updated>2008-04-08T08:21:15.968-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>fopen($url) v. curl in PHP</title><content type='html'>Occasionally you'll see PHP code which uses &lt;code&gt;require()&lt;/code&gt; or &lt;code&gt;include()&lt;/code&gt; or &lt;code&gt;fopen()&lt;/code&gt; or &lt;code&gt;file_get_contents()&lt;/code&gt; to import code from a remote location (the argument to those functions can be a URL). This sort of thing is generally considered to be a &lt;a href="http://phpsec.org/projects/phpsecinfo/tests/allow_url_fopen.html"&gt;bad security practice&lt;/a&gt;, especially if you don't control the code at the remote location (it could unexpectedly change in such a way as to do something destructive to your application).&lt;br /&gt;&lt;br /&gt;Many PHP security experts tend to recommend disabling the &lt;code&gt;allow_url_fopen&lt;/code&gt; option in &lt;code&gt;php.ini&lt;/code&gt;. Disabling this feature can even serve to prevent inadvertent code injection. Imagine an application which calls &lt;code&gt;require($file)&lt;/code&gt; where &lt;code&gt;$file&lt;/code&gt; is dynamically determined. If your application has some sort of problem which allows an attacker to set the value of &lt;code&gt;$file&lt;/code&gt;, the attacker can inject the code of his/her choosing into your application.&lt;br /&gt;&lt;br /&gt;So I feel that disabling &lt;code&gt;allow_url_fopen&lt;/code&gt; is a good idea, but sometimes you need to initiate HTTP requests in your PHP code. The &lt;a href="http://www.php.net/manual/en/ref.curl.php"&gt;curl extension&lt;/a&gt; provides a good way of doing this. The following snippet will put the contents of the Web page at &lt;code&gt;$url&lt;/code&gt; into the &lt;code&gt;$page&lt;/code&gt; variable:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ch = curl_init($url);&lt;br /&gt;curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );&lt;br /&gt;curl_setopt( $ch, CURLOPT_HEADER, 0 );&lt;br /&gt;$page = curl_exec($ch);&lt;br /&gt;curl_close($ch);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The previous example is a GET request, but you can also do POST:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$postdata = 'var1=value1&amp;amp;var2=value2';&lt;br /&gt;$ch = curl_init($url);&lt;br /&gt;curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );&lt;br /&gt;curl_setopt( $ch, CURLOPT_HEADER, 0 );&lt;br /&gt;curl_setopt( $ch, CURLOPT_POSTFIELDS, $postdata );&lt;br /&gt;$page = curl_exec($ch);&lt;br /&gt;curl_close($ch);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-7961759280145307771?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/7961759280145307771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=7961759280145307771' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7961759280145307771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7961759280145307771'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/04/fopenurl-v-curl-in-php.html' title='fopen($url) v. curl in PHP'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-8113469642913616726</id><published>2008-04-07T08:30:00.001-05:00</published><updated>2008-04-07T08:28:16.207-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>undeclared attributes in PHP classes</title><content type='html'>I was recently surprised to discover that a PHP object can have attributes (variables) not declared in the class. The following works in PHP4 and PHP5 (it prints 'ick' and then 'yark'):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Gakkk {}&lt;br /&gt;&lt;br /&gt;$gakkk = new Gakkk();&lt;br /&gt;$gakkk-&gt;blech = 'ick';&lt;br /&gt;echo $gakkk-&gt;blech, "\n";&lt;br /&gt;$gakkk-&gt;blech = 'yark';&lt;br /&gt;echo $gakkk-&gt;blech, "\n";&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;At best, this strikes me as a very poor programming practice. Who knows when this sort of thing will stop working (in a future version of PHP)? And what kind of code readability is this?&lt;br /&gt;&lt;br /&gt;I really like PHP, but this is just weird to me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-8113469642913616726?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/8113469642913616726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=8113469642913616726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8113469642913616726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8113469642913616726'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/04/undeclared-attributes-in-php-classes.html' title='undeclared attributes in PHP classes'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-2204493547915144904</id><published>2008-04-06T08:30:00.000-05:00</published><updated>2008-04-06T08:32:12.868-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='redhat'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>PHP4 in RHEL4</title><content type='html'>Since last year's &lt;a href="http://www.php.net/archive/2007.php#2007-07-13-1"&gt;announcement&lt;/a&gt; that PHP4 will reach end-of-life this summer, I've been wondering what will become of PHP in the versions of Red Hat's Enterprise Linux distribution which shipped with PHP4. Looks like Red Hat will &lt;a href="http://kbase.redhat.com/faq/FAQ_80_10912.shtm"&gt;continue&lt;/a&gt; to provide bugfix and security updates for PHP4 throughout the lifetime of its PHP4-relevant distributions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-2204493547915144904?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/2204493547915144904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=2204493547915144904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/2204493547915144904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/2204493547915144904'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/04/php4-in-rhel4.html' title='PHP4 in RHEL4'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-4224721572395276429</id><published>2008-04-05T12:36:00.004-05:00</published><updated>2008-04-05T12:48:53.451-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mindbending'/><category scheme='http://www.blogger.com/atom/ns#' term='energy'/><title type='text'>Falkirk Wheel</title><content type='html'>Friends of mine like roller coasters. Screw that. I wanna ride the Falkirk Wheel:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Falkirk_Wheel"&gt;wikipedia entry&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=OZnhZcczQXE"&gt;youtube video&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.metacafe.com/watch/543974/falkirk_wheel_scotland/"&gt;metacafe video&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;I've long been fascinated by locks and canals (I walked over the Erie Canal twice a day my first year of grad school), and this is one of the cooler mechanisms I've seen. It's even quite energy efficient: because the two caissons (the 'chairs' of this two-chair merry-go-round) always weigh the same, it takes very little energy to run the thing.&lt;br /&gt;&lt;br /&gt;If I'm ever in Scotland, I'm totally checking this out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-4224721572395276429?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/4224721572395276429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=4224721572395276429' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4224721572395276429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4224721572395276429'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/04/falkirk-wheel.html' title='Falkirk Wheel'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5437310286999583429</id><published>2008-03-24T09:00:00.000-05:00</published><updated>2008-03-24T08:58:04.071-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>rate-limiting in iptables</title><content type='html'>I recently learned about a useful feature in iptables which might help prevent denial of service (DOS) attacks. The iptables "recent" extension dynamically creates a list of source addresses against which your ruleset can match, for example, to block someone who is making too many connection attempts in a given time interval. The &lt;a href="http://www.debian-administration.org/about/Debian%20Administration"&gt;Debian Administration blog&lt;/a&gt; has a good &lt;a href="http://www.debian-administration.org/articles/187"&gt;example&lt;/a&gt; of using this to block DOS attacks against an ssh server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5437310286999583429?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5437310286999583429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5437310286999583429' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5437310286999583429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5437310286999583429'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/03/rate-limiting-in-iptables.html' title='rate-limiting in iptables'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-1968432699817379182</id><published>2008-03-23T01:32:00.003-05:00</published><updated>2008-03-23T01:53:18.461-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>iterating through an array in bash</title><content type='html'>Every now and then I need to iterate through an array of items in a bash script, and I can never remember the syntax--I always have to look it up. So here's a quick example...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;things=( first second third )&lt;br /&gt;&lt;br /&gt;for i in ${things[@]}&lt;br /&gt;do&lt;br /&gt;  echo $i&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If the number of array elements is large, it can be useful to have one element per line:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;things=( \&lt;br /&gt;first \&lt;br /&gt;second \&lt;br /&gt;third \&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-1968432699817379182?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/1968432699817379182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=1968432699817379182' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1968432699817379182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1968432699817379182'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/03/iterating-through-array-in-bash.html' title='iterating through an array in bash'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5095941815045348634</id><published>2008-03-16T20:40:00.003-05:00</published><updated>2008-03-16T21:08:52.287-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='movies'/><title type='text'>another Highlander sequel</title><content type='html'>The other day I rented &lt;a href="http://www.imdb.com/title/tt0299981/"&gt;&lt;span style="font-weight: bold;"&gt;Highlander: the Source&lt;/span&gt;&lt;/a&gt;, and I watched it this evening. Although the &lt;a href="http://www.imdb.com/title/tt0091203/"&gt;original film&lt;/a&gt; is one of my favorites, I didn't have very high hopes for this one: all of the sequels have been disappointments (although I seem to remember thinking that the &lt;a href="http://www.imdb.com/title/tt0144964/"&gt;fourth film&lt;/a&gt; wasn't horrible).&lt;br /&gt;&lt;br /&gt;But I got a bit of a surprise. There's more to say about this movie than I would have imagined. I was surprised because this newest installment is actually &lt;span style="font-style: italic;"&gt;worse&lt;/span&gt; than &lt;a href="http://www.imdb.com/title/tt0102034/"&gt;&lt;span style="font-weight: bold;"&gt;Highlander II&lt;/span&gt;&lt;/a&gt;, which I did not think was humanly possible. &lt;span style="font-weight: bold;"&gt;Highlander II&lt;/span&gt; at least had a fun villain. This film stars Adrian Paul as Duncan MacLeod from the &lt;a style="font-style: italic;" href="http://www.imdb.com/title/tt0103442/"&gt;Highlander&lt;/a&gt; TV show, and in the film Paul is surrounded by a handful of characters who are even less interesting than he is.&lt;br /&gt;&lt;br /&gt;So if you're in the video store and you see a copy of &lt;span style="font-weight: bold;"&gt;Highlander: the Source&lt;/span&gt;, keep walking, and rent something better, like &lt;a style="font-weight: bold;" href="http://www.imdb.com/title/tt0093278/"&gt;Ishtar&lt;/a&gt;, &lt;a href="http://www.imdb.com/title/tt0093278/"&gt;&lt;span style="font-weight: bold;"&gt;Plan 9 From Outer Space&lt;/span&gt;&lt;/a&gt;, or &lt;span style="font-weight: bold;"&gt;Highlander II&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5095941815045348634?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5095941815045348634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5095941815045348634' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5095941815045348634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5095941815045348634'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/03/another-highlander-sequel.html' title='another Highlander sequel'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5829530725308227890</id><published>2008-03-15T14:15:00.003-05:00</published><updated>2008-03-15T14:32:26.355-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mindbending'/><category scheme='http://www.blogger.com/atom/ns#' term='finance'/><category scheme='http://www.blogger.com/atom/ns#' term='science'/><title type='text'>relativistic economics</title><content type='html'>There was an interesting &lt;a href="http://slashdot.org/"&gt;Slashdot&lt;/a&gt; article the other day about a satirical speculative analysis of the &lt;a href="http://science.slashdot.org/article.pl?sid=08/03/12/0112205"&gt;economics of interstellar trade&lt;/a&gt;. The idea is that if you're shipping something to another star system, you've made a significant financial investment in the goods you are shipping, and the duration of the voyage will be long enough that there should be an interest rate applied to your investment.&lt;br /&gt;&lt;br /&gt;The interesting wrinkle appears when you consider that for interstellar trade to be worthwhile, the cargo vessels will need to travel at relativistic speeds. &lt;a href="http://en.wikipedia.org/wiki/Special_relativity"&gt;Special relativity&lt;/a&gt; describes the effect of time dilation, the phenomenon of a measurable discrepancy in the voyage duration as measured by the ship's crew versus that of a stationary observer (like the investor).&lt;br /&gt;&lt;br /&gt;So whose measurement of time do you use to compute the interest?&lt;br /&gt;&lt;br /&gt;To extend this nonsense to other predictions of special relativity, the ship's mass and length will also be affected, which might complicate matters for the interstellar equivalents of weigh stations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5829530725308227890?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5829530725308227890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5829530725308227890' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5829530725308227890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5829530725308227890'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/03/relativistic-economics.html' title='relativistic economics'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5885870750589520972</id><published>2008-03-09T17:33:00.002-05:00</published><updated>2008-03-09T18:07:33.517-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Class::Accessor constructors</title><content type='html'>I'm a pretty big fan of &lt;a href="http://search.cpan.org/perldoc?Class::Accessor"&gt;Class::Accessor&lt;/a&gt;. It's great for those occasions when you need to write a Perl module which has lots of attributes. You tell your module to inherit from Class::Accessor, provide a list of attributes, and your module automatically has accessors and mutators for all of those attributes. Class::Accessor even takes care of creating your module's constructor.&lt;br /&gt;&lt;br /&gt;That last point was actually giving me some trouble the other day. I was writing a Perl module, and it turned out to have several attributes (counters that needed to be incremented while parsing a file), so I decided to have my module inherit from Class::Accessor. But one of the attributes was going to be an instance of another class (I wanted to use &lt;a href="http://en.wikipedia.org/wiki/Object_composition"&gt;composition&lt;/a&gt;, rather than multiple inheritance), and I wanted to instantiate this object when &lt;span style="font-style: italic;"&gt;my&lt;/span&gt; object is instantiated. But since Class::Accessor creates my constructor automatically, it wasn't clear to me how I'd do this.&lt;br /&gt;&lt;br /&gt;With a little fiddling, I was able to override the Class::Accessor constructor in such a way that it still created my accessors and mutators, but also allowed me to do other object initialization tasks:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package Gakkk;&lt;br /&gt;&lt;br /&gt;use strict;&lt;br /&gt;use diagnostics;&lt;br /&gt;use warnings;&lt;br /&gt;&lt;br /&gt;use base qw/ Class::Accessor /;&lt;br /&gt;Gakkk-&gt;mk_accessors(&lt;br /&gt;   qw/&lt;br /&gt;        flamningle&lt;br /&gt;        line_number&lt;br /&gt;        num_parse_errors&lt;br /&gt;        num_zortbiptons&lt;br /&gt;        /&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;use Some::Other::Class;&lt;br /&gt;&lt;br /&gt;sub new {&lt;br /&gt;   my $class = shift @_;&lt;br /&gt;&lt;br /&gt;   my $self = $class-&gt;SUPER::new(@_);&lt;br /&gt;   $self-&gt;flamningle( Some::Other::Class-&gt;new() );&lt;br /&gt;   $self-&gt;line_number(0);&lt;br /&gt;   $self-&gt;num_parse_errors(0);&lt;br /&gt;   $self-&gt;num_zortbiptons(0);&lt;br /&gt;&lt;br /&gt;   return $self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# other methods, ...&lt;br /&gt;&lt;br /&gt;1;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The call to &lt;code&gt;$class-&gt;SUPER::new(@_)&lt;/code&gt; gives what's left of the argument list (&lt;code&gt;@_&lt;/code&gt;) to the constructor of the parent class (Class::Accessor) and returns an instance of my class. I'm then able to initialize my object attributes without requiring that the calling code do it explicitly. Without overriding the constructor, the caller would have to do something like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;my $gakkk = Gakkk-&gt;new(&lt;br /&gt;    {&lt;br /&gt;        flamningle       =&gt; Some::Other::Class-&gt;new(),&lt;br /&gt;        line_number      =&gt; 0,&lt;br /&gt;        num_parse_errors =&gt; 0,&lt;br /&gt;        num_zortbiptons  =&gt; 0,&lt;br /&gt;    }&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Having overridden the constructor, the caller can instantiate the class like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;my $gakkk = Gakkk-&gt;new();&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5885870750589520972?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5885870750589520972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5885870750589520972' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5885870750589520972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5885870750589520972'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/03/classaccessor-constructors.html' title='Class::Accessor constructors'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-3096747196299348149</id><published>2008-03-01T14:46:00.002-06:00</published><updated>2008-03-01T14:52:46.605-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>IntranetAddress PHP class</title><content type='html'>I've added another Google code project. This one is called &lt;a href="http://code.google.com/p/phpclass-intranetaddress/"&gt;IntranetAddress&lt;/a&gt;, and it's a PHP class which you can use to determine whether or not an IPv4 address belongs to a set of network ranges (specified in &lt;a href="http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing"&gt;CIDR&lt;/a&gt; notation in a configuration file). The class requires the &lt;a href="http://pear.php.net/package/Net_IPv4"&gt;Net::IPv4&lt;/a&gt; PEAR package, and a &lt;a href="http://www.phpunit.de/"&gt;PHPUnit&lt;/a&gt; test suite in included.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-3096747196299348149?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/3096747196299348149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=3096747196299348149' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3096747196299348149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3096747196299348149'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/03/intranetaddress-php-class.html' title='IntranetAddress PHP class'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-4458506635532108214</id><published>2008-02-19T07:00:00.000-06:00</published><updated>2008-02-19T08:10:34.415-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>password wallet in google code</title><content type='html'>I put my &lt;a href="http://www.linuxjournal.com/article/9861"&gt;password wallet&lt;/a&gt; in a &lt;a href="http://code.google.com/p/password-wallet/"&gt;google code project&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-4458506635532108214?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/4458506635532108214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=4458506635532108214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4458506635532108214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4458506635532108214'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/02/password-wallet-in-google-code.html' title='password wallet in google code'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-6971638409426012650</id><published>2008-02-18T09:12:00.003-06:00</published><updated>2008-02-18T09:18:12.578-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sunrise'/><category scheme='http://www.blogger.com/atom/ns#' term='lake'/><category scheme='http://www.blogger.com/atom/ns#' term='pictures'/><title type='text'>overnight at the lake</title><content type='html'>I'm writing this from my friends' lakehouse. I've been here since yesterday afternoon, and it's been a nice break from routine. I took a few pictures which I think came out pretty well.&lt;br /&gt;&lt;br /&gt;There was a brief snowstorm yesterday afternoon with wonderfully large snowflakes:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/2273362842/" title="lake snowstorm 12 of 15 by mbrisby, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2363/2273362842_b0a2001bf2_m.jpg" width="240" height="180" alt="lake snowstorm 12 of 15" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This morning I took a picture from a similar angle. The lake was so still this morning--like looking at glass:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/93512143@N00/2274655942/" title="lake sunrise 2 of 7 by mbrisby, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2032/2274655942_3c230430b1_m.jpg" width="240" height="180" alt="lake sunrise 2 of 7" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-6971638409426012650?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/6971638409426012650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=6971638409426012650' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/6971638409426012650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/6971638409426012650'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/02/overnight-at-lake.html' title='overnight at the lake'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2363/2273362842_b0a2001bf2_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-7305011716017694049</id><published>2008-02-16T21:37:00.003-06:00</published><updated>2008-02-16T21:59:47.460-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>password wallet update</title><content type='html'>Yesterday I discovered an interesting (and somewhat alarming) problem with my &lt;a href="http://www.linuxjournal.com/article/9861"&gt;password wallet&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I use vim for my text editor (I have &lt;code&gt;export VISUAL="/usr/bin/vim"&lt;/code&gt; in my ~/.bashrc). Yesterday I used the wallet script to update my password list, and then later I was using vim to edit a totally unrelated text file. I fat-fingered what I was doing and typed some magical set of keystrokes (still not sure just how I did that), and suddenly I was looking at several lines from my password file. I recognized those lines as lines that I had highlighted, deleted, and then pasted to a new location when editing the password file when I was using wallet. I then had a forehead-slapping moment when I realized that such edits are saved for posterity in the ~/.viminfo file.&lt;br /&gt;&lt;br /&gt;Oops. That's a potential information leakage vulnerability.&lt;br /&gt;&lt;br /&gt;But it is easily remedied by adding the following line to ~/.walletrc:&lt;br /&gt;&lt;pre&gt;VISUAL="/usr/bin/vim -i NONE"&lt;/pre&gt;&lt;br /&gt;The -i option tells vim to use some file other than ~/.viminfo for its state information. In this case, it tells vim not to store state information at all. The trick of putting it in ~/.walletrc (rather than in ~/.bashrc) means that vim only skips storing state information when running wallet--vim will keep state information in ~.viminfo any other time you run vim.&lt;br /&gt;&lt;br /&gt;So if you're using wallet with vim, I urge you to make the above change to your ~/.walletrc file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-7305011716017694049?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/7305011716017694049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=7305011716017694049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7305011716017694049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7305011716017694049'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/02/password-wallet-update.html' title='password wallet update'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-4709503505838367599</id><published>2008-02-06T19:26:00.000-06:00</published><updated>2008-02-06T19:32:11.706-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>securing WordPress with blogsecurity.net</title><content type='html'>I needed to set up a &lt;a href="http://wordpress.org/"&gt;WordPress&lt;/a&gt; blog at work this week, and I decided to try following the &lt;a href="http://blogsecurity.net/wordpress/wordpress-security-whitepaper/"&gt;WordPress Security Whitepaper&lt;/a&gt; at &lt;span style="font-weight: bold;"&gt;blogsecurity.net&lt;/span&gt;. It was pretty easy, and (hopefully) has made that WordPress installation a bit more secure.&lt;br /&gt;&lt;br /&gt;blogsecurity.net is a blog about security issues relating to blogging. It's pretty interesting and has lots of good information and resources.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-4709503505838367599?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/4709503505838367599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=4709503505838367599' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4709503505838367599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/4709503505838367599'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/02/securing-wordpress-with-blogsecuritynet.html' title='securing WordPress with blogsecurity.net'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-9208046585632755797</id><published>2008-02-02T07:55:00.000-06:00</published><updated>2008-02-02T08:17:02.819-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='redhat'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Python 3.0 To Be Backwards Incompatible</title><content type='html'>According to &lt;a href="http://it.slashdot.org/article.pl?sid=08/02/01/1624247&amp;amp;from=rss"&gt;a Slashdot post&lt;/a&gt;, just about all python code will require at least some changes when python 3.0 comes out in early 2008. I've never learned python, and news like this makes me glad that I've never bothered. (Besides, a syntax predicated on whitespace just seems weird to me.)&lt;br /&gt;&lt;br /&gt;I wonder how Red Hat feels about this, considering that a lot of the RHEL system scripts are in python. They'll probably have a lot of rewriting to do for RHEL6.&lt;br /&gt;&lt;br /&gt;I suppose that similar criticism could be leveled at Perl6 v. Perl5 (although there is talk of some sort of compatibility mode as well as a Perl5-to-Perl6 translater). But it's probably a moot point: as far as I can tell, Perl6 will never, ever be released.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-9208046585632755797?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/9208046585632755797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=9208046585632755797' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/9208046585632755797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/9208046585632755797'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/02/python-30-to-be-backwards-incompatible.html' title='Python 3.0 To Be Backwards Incompatible'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-1351654641634532853</id><published>2008-02-01T17:03:00.000-06:00</published><updated>2008-02-01T17:10:53.327-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flickr'/><category scheme='http://www.blogger.com/atom/ns#' term='yahoo'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Microsoft buying Yahoo?</title><content type='html'>So  I started going through my RSS feeds this morning, and I saw that a big news item was &lt;a href="http://www.news.com/Microsoft-bids-44.6-billion-for-Yahoo/2100-1014_3-6228705.html?tag=nefd.lede"&gt;Microsoft's $44.6 billion offer to buy Yahoo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm not sure how I feel about this. If the purchase goes through, I hope MS won't screw up flickr.&lt;br /&gt;&lt;br /&gt;I think Yahoo uses open source technology for a lot of their services. I'd hate to see that change, too.&lt;br /&gt;&lt;br /&gt;Someone posted an interesting &lt;a href="http://www.linuxjournal.com/content/what-happens-if-microsoft-buys-yahoo#comment-312624"&gt;comment at Linux Journal&lt;/a&gt;. The commenter pointed out that Yahoo owns &lt;a href="http://www.zimbra.com/"&gt;Zimbra&lt;/a&gt;, a potential Exchange competitor. I wonder how much that contributed to Microsoft's offer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-1351654641634532853?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/1351654641634532853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=1351654641634532853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1351654641634532853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1351654641634532853'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/02/microsoft-buying-yahoo.html' title='Microsoft buying Yahoo?'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-3321102834510190577</id><published>2008-01-27T19:21:00.000-06:00</published><updated>2008-01-27T19:27:40.707-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>syntax highlighting in vim in Ubuntu</title><content type='html'>Today I finally noticed that syntax highlighting wasn't working in vim in Ubuntu. Installing &lt;span style="font-weight: bold;"&gt;vim-full&lt;/span&gt; and adding &lt;code&gt;syntax on&lt;/code&gt; to &lt;span style="font-style: italic;"&gt;~/.vimrc&lt;/span&gt; did the trick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-3321102834510190577?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/3321102834510190577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=3321102834510190577' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3321102834510190577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/3321102834510190577'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/01/syntax-highlighting-in-vim-in-ubuntu.html' title='syntax highlighting in vim in Ubuntu'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5055713711354143968</id><published>2008-01-18T12:07:00.000-06:00</published><updated>2008-01-18T12:24:14.470-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>google code, trac-backup</title><content type='html'>In the current episode (season 5, episode 9) of &lt;a href="http://www.lugradio.org/"&gt;LugRadio&lt;/a&gt;, Stuart Langridge says that his new year resolution is to start releasing some of the little scripts and programs he writes. He says that he writes lots of these things, but tends not to release them, because he thinks that they're not very user-friendly. I really identified with him when he said that, and it's inspired me to try doing the same.&lt;br /&gt;&lt;br /&gt;So I created a project in &lt;a href="http://code.google.com/"&gt;Google Code&lt;/a&gt; for the trac backup script I described in &lt;a href="http://mbrisby.blogspot.com/2007/11/trac-backups-gantt-plugin-concluding_13.html"&gt;a previous post&lt;/a&gt;. Creating the Google Code project was pretty easy (although someone unfamiliar with subversion might have a hard time). I've updated the script according to a comment on the previous post about a problem with a new version of trac. If you are interested, please have a look at &lt;a href="http://code.google.com/p/trac-backup/"&gt;trac-backup&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'll probably add more projects in the coming weeks:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a versioned backup system based on subversion, which is pretty good for backing up configuration data&lt;/li&gt;&lt;li&gt;maybe some other backup programs I've written&lt;/li&gt;&lt;li&gt;the password wallet I wrote about in the &lt;a href="http://www.linuxjournal.com/article/9861"&gt;January issue of Linux Journal&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5055713711354143968?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5055713711354143968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5055713711354143968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5055713711354143968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5055713711354143968'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/01/google-code-trac-backup.html' title='google code, trac-backup'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5266247423690734963</id><published>2008-01-06T16:35:00.000-06:00</published><updated>2008-01-06T16:35:28.317-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='n800'/><title type='text'>WPA2 Enterprise on the Nokia N800</title><content type='html'>I got a &lt;a href="http://www.nokiausa.com/A4410954"&gt;Nokia N800&lt;/a&gt; as a holiday gift, and I took it to work the other day. The N800 is an "Internet Tablet" which is a bit larger than a cell phone and much smaller than a laptop. It's a WiFi device which runs Linux, and it's a pretty neat toy. If you get one, definitely go the software available at  &lt;a href="http://maemo.org/"&gt;maemo.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Anyway, I had a bit of trouble getting the N800 to talk to the wireless network at work, which is WPA2-Enterprise authenticating against an Active Directory domain. But a google search found a page describing &lt;a href="http://www.internettablettalk.com/forums/showthread.php?p=107367#post61755"&gt;how to configure a connection&lt;/a&gt;, and that worked right away. The following is a direct copy-and-paste of that post:&lt;br /&gt;&lt;pre class="auto_scroll"&gt;&lt;br /&gt;page 1: Connection type = WLAN&lt;br /&gt;page 2: Network mode = Infrastructure; Security method = WPA with EAP&lt;br /&gt;page 3: EAP type = PEAP&lt;br /&gt;page 4: Select certificate = None; EAP method = EAP MSCHAPv2&lt;br /&gt;page 5: You can enter your login information if you don't want to log in manually each time&lt;br /&gt;page 6: Click "Advanced" button&lt;br /&gt;Other tab: Enable "WPA2-only mode"&lt;br /&gt;EAP tab: Enable "Use manual user name"; enter your "Manual user name"; Disable "Require client authentication" (I thought I had this one enabled initially, but it will now only work if disabled)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I set it not to remember my password (in case the N800 is lost or stolen).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5266247423690734963?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5266247423690734963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5266247423690734963' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5266247423690734963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5266247423690734963'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/01/wpa2-enterprise-on-nokia-n800.html' title='WPA2 Enterprise on the Nokia N800'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5891003600405906730</id><published>2008-01-05T21:46:00.000-06:00</published><updated>2008-01-05T21:55:29.238-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='movies'/><title type='text'>No Country For Old Men</title><content type='html'>I saw the Coen brothers' &lt;a href="http://www.imdb.com/title/tt0477348/"&gt;&lt;span style="font-weight: bold;"&gt;No Country For Old Men&lt;/span&gt;&lt;/a&gt; with a friend last night. It's probably the best film I've seen in a long time. It's pretty violent, but it's well worth seeing. It's more of a character study (like &lt;a href="http://www.imdb.com/title/tt0113277/"&gt;&lt;span style="font-weight: bold;"&gt;Heat&lt;/span&gt;&lt;/a&gt; or &lt;a href="http://www.imdb.com/title/tt0105265/"&gt;&lt;span style="font-weight: bold;"&gt;A River Runs Through It&lt;/span&gt;&lt;/a&gt;) than a narrative, and it definitely doesn't have a traditional Hollywood ending (in fact, the movie ends rather abruptly). But I thought it was seven shades of awesome. Javier Bardem was a fantastic villain, and Tommy Lee Jones also gave a great performance. Guess I'll be adding Cormac McCarthy (the author of the book on which the movie is based) to my reading list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5891003600405906730?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5891003600405906730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5891003600405906730' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5891003600405906730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5891003600405906730'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2008/01/no-country-for-old-men.html' title='No Country For Old Men'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-7814344116254673857</id><published>2007-12-31T09:02:00.000-06:00</published><updated>2007-12-31T09:02:12.097-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu asking for the CD to install software</title><content type='html'>Sometimes I ask apt-get or synaptic to install something, and it asks for the CD. Turns out that this is an easily-remedied nuisance. A &lt;a href="http://fosswire.com/2007/12/27/prevent-ubuntu-asking-for-the-cd-to-install-packages/"&gt;fosswire post&lt;/a&gt; (which I found by way of &lt;a href="http://www.fsdaily.com/EndUser/Prevent_Ubuntu_asking_for_the_CD_to_install_packages"&gt;fsdaily&lt;/a&gt;) gives a GUI-based solution. An equivalent solution is to comment out the line in &lt;code&gt;/etc/apt/sources.list&lt;/code&gt; which starts w/ '&lt;font style="font-weight: bold;"&gt;deb cdrom:&lt;/font&gt;' (that's probably line 1).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-7814344116254673857?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/7814344116254673857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=7814344116254673857' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7814344116254673857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/7814344116254673857'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2007/12/ubuntu-asking-for-cd-to-install.html' title='Ubuntu asking for the CD to install software'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-652845326308078970</id><published>2007-12-30T12:15:00.000-06:00</published><updated>2007-12-30T12:10:31.223-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu firewall</title><content type='html'>This post offers a way of telling your Ubuntu system to set up a simple firewall at boot time. It assumes that you have a single network adapter called eth0.&lt;br /&gt;&lt;br /&gt;I saved my firewall rules (in &lt;code&gt;iptables-save&lt;/code&gt; format) to &lt;code&gt;/etc/network/fwrules&lt;/code&gt;. My firewall rules are fairly specific to my setup, but the following might serve as a good starting point if you want to try this:&lt;br /&gt;&lt;pre class="auto_scroll"&gt;&lt;br /&gt;*filter&lt;br /&gt;:INPUT DROP [0:0]&lt;br /&gt;:FORWARD DROP [0:0]&lt;br /&gt;:OUTPUT ACCEPT [0:0]&lt;br /&gt;-A INPUT -i lo -j ACCEPT &lt;br /&gt;-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT &lt;br /&gt;-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT &lt;br /&gt;COMMIT&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And then I just saved the following to &lt;code&gt;/etc/network/if-pre-up.d/fw&lt;/code&gt;:&lt;br /&gt;&lt;pre class="auto_scroll"&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;iptables-restore &lt; /etc/network/fwrules&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(Be sure to make this file executable: &lt;code&gt;sudo chmod 755 /etc/network/if-pre-up.d/fw&lt;/code&gt;).&lt;br /&gt;&lt;br /&gt;This loads the firewall rules prior to bringing up the network interface, so that the firewall is in place by the time the network connection is active.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-652845326308078970?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/652845326308078970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=652845326308078970' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/652845326308078970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/652845326308078970'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2007/12/ubuntu-firewall.html' title='Ubuntu firewall'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-317110284385866306</id><published>2007-12-28T10:25:00.000-06:00</published><updated>2007-12-28T10:25:04.636-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>udev in Ubuntu</title><content type='html'>This post will be a recipe for configuring udev in Ubuntu so that if you plug in a USB storage device (like a flash drive, an MP3 player, etc.), it will get a consistent and predictable device name which you can attache as a non-root user to a fixed mount point. I'll be using my new Verbatim thumb drive as an example.&lt;br /&gt;&lt;br /&gt;Plug in the flash drive, wait a few seconds, and type '&lt;code&gt;dmesg | tail&lt;/code&gt;'. The last few lines should show the USB system detecting the device and giving it the first available device name. In my case, the flash drive got &lt;code&gt;/dev/sdd&lt;/code&gt;. Next, ask udevinfo for details about the device:&lt;br /&gt;&lt;pre class="auto_scroll"&gt;udevinfo -a -p $( udevinfo -q path -n /dev/sdd ) | less&lt;/pre&gt;&lt;br /&gt;Page through the output looking for the device's values for idVendor and idProduct. The udevinfo output for my thumb drive contained the following lines:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   ATTRS{idProduct}=="1e23"&lt;br /&gt;   ATTRS{idVendor}=="13fe"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next thing is to tell udev about the device. Create a udev rule file (I used &lt;code&gt;/etc/udev/rules.d/99-thumb.rules&lt;/code&gt;) with something like the following:&lt;br /&gt;&lt;pre class="auto_scroll"&gt;&lt;br /&gt;SUBSYSTEMS=="usb", SYSFS{idVendor}=="13fe", SYSFS{idProduct}=="1e23", NAME="thumb", MODE="0660" OWNER="mbrisby" GROUP="mbrisby"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(Naturally, replace &lt;span style="font-style: italic;"&gt;mbrisby&lt;/span&gt; with your username and group name.) You may need to run &lt;code&gt;udevcontrol reload_rules&lt;/code&gt; to tell udev to read the new addition into its in-memory ruleset.&lt;br /&gt;&lt;br /&gt;Now you can make a mount point:&lt;br /&gt;&lt;pre class="auto_scroll"&gt;&lt;br /&gt;$ sudo mkdir /media/thumb&lt;br /&gt;$ sudo chown mbrisby.mbrisby /media/thumb&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Finally, add the mount point to &lt;code&gt;/etc/fstab&lt;/code&gt;:&lt;br /&gt;&lt;pre class="auto_scroll"&gt;&lt;br /&gt;/dev/thumb /media/thumb vfat user,noauto 0 0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And from now on, you should be able to plug in the thumb drive, wait a couple of seconds, type &lt;code&gt;mount /media/thumb&lt;/code&gt;, and start accessing the files at &lt;code&gt;/media/thumb&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-317110284385866306?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/317110284385866306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=317110284385866306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/317110284385866306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/317110284385866306'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2007/12/udev-in-ubuntu.html' title='udev in Ubuntu'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-8328727644098027802</id><published>2007-12-27T11:36:00.000-06:00</published><updated>2007-12-27T12:14:48.069-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>fetchmail in Ubuntu</title><content type='html'>I recently wrote about using &lt;a href="http://mbrisby.blogspot.com/2007/11/fetchmail-for-gmail.html"&gt;fetchmail for gmail&lt;/a&gt;. In the meantime I've &lt;a href="http://mbrisby.blogspot.com/2007/12/desktop-ubuntu.html"&gt;switched my main desktop (at home) from CentOS to Ubuntu&lt;/a&gt;. Ubuntu's fetchmail build is a bit more picky about SSL certificates than the CentOS build, so this post will describe some of the changes I had to make to my &lt;code&gt;~/.fetchmailrc&lt;/code&gt; file.&lt;br /&gt;&lt;br /&gt;(By the way, fetchmail should work OK without these changes, it'll just whine about the certificates.)&lt;br /&gt;&lt;br /&gt;First I needed to install the &lt;span style="font-weight: bold;"&gt;ca-certificates&lt;/span&gt; package from the Ubuntu repositories, and then I needed to change the gmail line of my &lt;code&gt;~/.fetchmailrc&lt;/code&gt; file from &lt;pre class="auto_scroll"&gt;poll imap.gmail.com protocol IMAP user "my_gmail_username@gmail.com" there with password "my_password" nofetchall keep ssl&lt;/pre&gt; to &lt;pre class="auto_scroll"&gt;poll imap.gmail.com protocol IMAP user "my_gmail_username@gmail.com" there with password "my_password" nofetchall keep ssl sslcertck sslcertpath /etc/ssl/certs&lt;/pre&gt; This tells fetchmail where to find the public certificate it needs to verify the SSL connection to the gmail server.&lt;br /&gt;&lt;br /&gt;I also use fetchmail to check some IMAP accounts on a server using self-signed certificates, certificates which don't appear in &lt;code&gt;/etc/ssl/certs&lt;/code&gt;. One way of doing this is to compute the IMAP certificate's fingerprint and telling that to fetchmail. If the IMAP server is imap.example.com and it's running on the standard port (993), you can use openssl to grab the certificate like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;openssl s_client -ign_eof -connect imap.example.com:993 &gt; imap.cert&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(You may need to Contol-C to get back to the command prompt.)&lt;br /&gt;Then use openssl to find the MD5 fingerprint:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;openssl x509 -fingerprint -md5 -in imap.cert&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The output of this latter command should contain a line starting with &lt;em&gt;MD5 Fingerprint&lt;/em&gt;. Add the fingerprint to your &lt;code&gt;~/.fetchmailrc&lt;/code&gt; file with something like this:&lt;br /&gt;&lt;pre class="auto_scroll"&gt;&lt;br /&gt;poll mail.example.com via imap.example.com protocol IMAP user mbrisby there with password "my_password" nofetchall nokeep ssl sslfingerprint "4C:69:E2:E6:F9:6B:6C:4E:E9:8B:E1:C8:2B:B9:4F:B9"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And then just run fetchmail in cron every now and then.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-8328727644098027802?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/8328727644098027802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=8328727644098027802' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8328727644098027802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8328727644098027802'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2007/12/fetchmail-in-ubuntu.html' title='fetchmail in Ubuntu'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-8496838922509542152</id><published>2007-12-25T06:29:00.000-06:00</published><updated>2007-12-25T06:56:48.514-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>desktop Ubuntu</title><content type='html'>I &lt;a href="http://mbrisby.blogspot.com/2007/12/ubuntu.html"&gt;recently converted my laptop&lt;/a&gt; from CentOS 5 to Ubuntu 7.10 and liked the change. So I did the same to my main desktop at home this weekend. Naturally, there were a few bumps in the road. Over the next several days I'll be posting about some of them.&lt;br /&gt;&lt;br /&gt;But first, a couple of annoyances.&lt;br /&gt;&lt;br /&gt;Ubuntu likes to beep. It rings the system bell a lot more than CentOS seemed to do: tab completion at the bash prompt, unsuccessful page text searches in Firefox, trying to go past the end of the file in vim, etc. It really enjoyed beeping at me, and putting &lt;code&gt;set bell-style none&lt;/code&gt; in ~/.inputrc didn't help much.&lt;br /&gt;&lt;br /&gt;It turns out to be a kernel module. A &lt;a href="http://lists.us.dell.com/pipermail/linux-desktops/2007-June/000468.html"&gt;post in Dell's Linux desktop forums&lt;/a&gt; suggested &lt;code&gt;modprobe -r pcspkr&lt;/code&gt;, and that worked right away. The post also suggests putting &lt;code&gt;blacklist pcspkr&lt;/code&gt; in a file in &lt;code&gt;/etc/modprobe.d&lt;/code&gt; to make the change permanent (I haven't rebooted yet, but I figure that oughtta do it.)&lt;br /&gt;&lt;br /&gt;The other annoyance is that Ubuntu's grep isn't compiled with &lt;a href="http://www.pcre.org/"&gt;libpcre&lt;/a&gt; support (that's the Perl-compatible regular expression library). One of the bash scripts I use for backups has a &lt;code&gt;grep -P&lt;/code&gt; in it. The -P options tells grep to regard the search pattern as a Perl-style regex. This gives the following charming error message:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;The -P option is not supported&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Someone else noticed this and filed a &lt;a href="https://bugs.launchpad.net/debian/+source/grep/+bug/15051"&gt;bug report&lt;/a&gt;. Looks like the Ubuntu developers aren't interested in fixing it in this version. Someone suggested installing the pcregrep package, but this has a few problems:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;the binary is installed as /usr/bin/pcregrep&lt;/li&gt;&lt;li&gt;pcregrep doesn't have the same performance or options as grep&lt;/li&gt;&lt;li&gt;oddly, pcregrep doesn't accept the -P option (you'd think it would just ignore it)&lt;/li&gt;&lt;/ol&gt;So pcregrep is hardly a drop-in replacement for grep, even if you rename the binary to /bin/grep.&lt;br /&gt;&lt;br /&gt;As it happens, I got lucky. My the regex in my bash script is dull enough that I was able to replace &lt;code&gt;grep -P&lt;/code&gt; with &lt;code&gt;egrep&lt;/code&gt;. But if you use something more sophisticated, you'll have a harder time of it.&lt;br /&gt;&lt;br /&gt;But all in all, I'm enjoying my shiny new Ubuntu installation. I'll be back later to yammer on about using udev, fetchmail, iptables, and maybe some other stuff in Ubuntu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-8496838922509542152?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/8496838922509542152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=8496838922509542152' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8496838922509542152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8496838922509542152'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2007/12/desktop-ubuntu.html' title='desktop Ubuntu'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-6375318256252728198</id><published>2007-12-11T22:18:00.000-06:00</published><updated>2007-12-11T22:25:48.900-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Inspekt PHP library</title><content type='html'>A &lt;a href="http://planet-websecurity.org/Slides+from+DC+PHP/"&gt;recent post on the Planet-Websecurity.org blog&lt;/a&gt; got me interested in &lt;a href="http://code.google.com/p/inspekt/"&gt;Inspekt&lt;/a&gt;. It's a secure input validation library for PHP. It reminds me a bit of Perl's taint switch, in that Inspekt prevents you from directly using $_POST, $_GET, and their ilk.&lt;br /&gt;&lt;br /&gt;Looks like it hasn't really hit release status yet, but I think it's going to be worth watching.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-6375318256252728198?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/6375318256252728198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=6375318256252728198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/6375318256252728198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/6375318256252728198'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2007/12/inspekt-php-library.html' title='Inspekt PHP library'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-1901320465435652675</id><published>2007-12-06T07:00:00.000-06:00</published><updated>2007-12-06T08:11:57.850-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu</title><content type='html'>I finally gave &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; a try recently. I'd previously tried it as a VMWare Server guest and hated it. But that probably wasn't a fair shake, so I installed it on my laptop last week. I was really impressed by how easy it was to get everything set up. It only took a few hours to get it installed and pretty highly customized with some of my favorite packages, including gtkpod, grip, easytag, mplayer, fluxbox, VMWare Server, gkrellm (and a few of its plugins), and grisbi.&lt;br /&gt;&lt;br /&gt;About the only thing that really took a while was getting fluxbox to work, and that's because Ubuntu does it rather differently than CentOS (what I'm used to). It took me a little while to realize that I needed to be using &lt;code&gt;~/.fluxbox/startup&lt;/code&gt; rather than &lt;code&gt;~/.Xclients&lt;/code&gt;, and it took me forever to cotton on to the fact that the &lt;code&gt;~/.fluxbox/keys&lt;/code&gt; syntax had changed between v0.9.x and v1.0.x. I'd never had the following three lines in my &lt;code&gt;keys&lt;/code&gt; file before, but they're pretty important (you can't easily get to the fluxbox menu without them):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;OnDesktop Mouse1 :HideMenus&lt;br /&gt;OnDesktop Mouse2 :Workspacemenu&lt;br /&gt;OnDesktop Mouse3 :RootMenu&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;About the only thing I couldn't do was install native drivers for one of my wireless cards. I have two cards: a Linksys WPC11v4 802.11b card and a Netgear 802.11g card. The Linksys card has &lt;a href="http://mbrisby.blogspot.com/2007/06/rtl8180-chipset.html"&gt;open-source drivers&lt;/a&gt; which support monitor mode (so that I can run kismet), while the Netgear card only has Windows drivers. It was very easy getting ndiswrapper and wpa_supplicant set up for the Netgear card, but I never got the Linksys drivers working. Looks like &lt;a href="http://ubuntuforums.org/showthread.php?s=bbb7ed3f790c0260ad069fe47342cf18&amp;amp;t=95879"&gt;other people have had the same trouble&lt;/a&gt;, and the solution may be to try a different kernel. Oh, well.&lt;br /&gt;&lt;br /&gt;Anyway, it was all pretty easy, and I may start using Ubuntu on all my desktops. And O'Reilly's &lt;a href="http://www.oreilly.com/catalog/ubuntuhks/"&gt;Ubuntu Hacks&lt;/a&gt; was pretty helpful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-1901320465435652675?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/1901320465435652675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=1901320465435652675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1901320465435652675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/1901320465435652675'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2007/12/ubuntu.html' title='Ubuntu'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-9142463909305912779</id><published>2007-12-05T22:00:00.000-06:00</published><updated>2007-12-05T22:31:33.176-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>fetchmail for gmail</title><content type='html'>If you have lots of email accounts, it can be a real pain checking all of them. But if you're running a mail server on a Linux box somewhere (like postfix on your workstation at home, for example), you can use fetchmail to download the messages from your IMAP and POP3 mail accounts. That way, all your mail is in one place (and you only have to go to one place to read it).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gmail.com/"&gt;gmail&lt;/a&gt; recently added IMAP support (it's one of the tabs under &lt;span style="font-style: italic;"&gt;Settings&lt;/span&gt;). Once you enable IMAP support in your gmail account, you could add something like the following to your ~/.fetchmailrc file:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;poll imap.gmail.com protocol IMAP user "my_gmail_username@gmail.com" there with password "my_password" nofetchall keep ssl&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;nofetchall&lt;/span&gt; just gets the new messages, &lt;span style="font-style: italic;"&gt;keep&lt;/span&gt; prevents fetchmail from deleting the messages off your gmail account (so that you can still read them by logging on the gmail), and &lt;span style="font-style: italic;"&gt;ssl&lt;/span&gt; keeps your password encrypted when fetchmail connects to gmail. Then just run &lt;code&gt;fetchmail -s&lt;/code&gt; in cron every now and then.&lt;br /&gt;&lt;br /&gt;Something to keep in mind is that although this won't delete your messages from gmail, it'll mark them as read. So if you log in to gmail, new messages won't look new, they'll look read (because fetchmail has read them).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-9142463909305912779?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/9142463909305912779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=9142463909305912779' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/9142463909305912779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/9142463909305912779'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2007/11/fetchmail-for-gmail.html' title='fetchmail for gmail'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5182595883344948358</id><published>2007-11-23T22:08:00.000-06:00</published><updated>2007-11-23T22:17:17.503-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comics'/><title type='text'>Bats in the belfry</title><content type='html'>The other day &lt;a href="http://www.joshshill.com/2007/11/21/the-ascension-of-a-batman/"&gt;I read&lt;/a&gt; that DC Comics is planning to 'promote' Bruce Wayne to the ranks of the &lt;a href="http://en.wikipedia.org/wiki/New_Gods"&gt;New Gods&lt;/a&gt;. Despite the departure of Bruce Wayne, there will still be a Batman to watch over Gotham City. The role will be filled by Jason Todd, the second Robin.&lt;br /&gt;&lt;br /&gt;Jason Todd was murdered by the Joker (beaten to death with a crowbar, if memory serves).&lt;br /&gt;&lt;br /&gt;If the last couple of paragraphs don't make any sense to you, then you and I are of like mind.&lt;br /&gt;&lt;br /&gt;This sounds like a publicity stunt to me, like when DC briefly &lt;a href="http://en.wikipedia.org/wiki/Death_of_superman"&gt;killed Superman&lt;/a&gt; in the early 90s.&lt;br /&gt;&lt;br /&gt;Guess they're running out of ideas over there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5182595883344948358?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5182595883344948358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5182595883344948358' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5182595883344948358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5182595883344948358'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2007/11/bats-in-belfry.html' title='Bats in the belfry'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-2689595620421825618</id><published>2007-11-19T06:46:00.000-06:00</published><updated>2007-11-19T06:55:21.526-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Lame OpenDocument Foundation Blathering</title><content type='html'>I &lt;a href="http://mbrisby.blogspot.com/2007/11/opendocument-foundation-reversal.html"&gt;recently wrote&lt;/a&gt; about some strange announcements from the OpenDocument Foundation (which has since totally dissolved), and I said I didn't know what that meant for the OpenDocument format (ODF).&lt;br /&gt;&lt;br /&gt;Not much, it seems. An &lt;a href="http://www.robweir.com/blog/2007/11/document-formats-guide-for-perplexed.html"&gt;Antic Disposition post&lt;/a&gt; has clarified the matter somewhat:&lt;br /&gt;&lt;blockquote&gt;The adoption of the ODF standard is promoted by several organizations, most prominently the &lt;a href="http://www.odfalliance.org/"&gt;ODF Alliance&lt;/a&gt; (with over 400 organizational members in 52 countries), the &lt;a href="http://www.opendocumentfellowship.com/"&gt;OpenDocument Fellowship&lt;/a&gt; (around 100 individual members) and the &lt;a href="http://www.opendocsociety.org/"&gt;OpenDoc Society&lt;/a&gt; (a new group with a Northern European focus, with around 50 organizational members). To put this in perspective, the OpenDocument Foundation, before it changed its mission and dissolved, had only 3 members.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-2689595620421825618?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/2689595620421825618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=2689595620421825618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/2689595620421825618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/2689595620421825618'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2007/11/lame-opendocument-foundation-blathering.html' title='Lame OpenDocument Foundation Blathering'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-5393387596495616385</id><published>2007-11-17T06:27:00.000-06:00</published><updated>2007-11-17T06:33:26.798-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comics'/><title type='text'>Origin of Kryptonite</title><content type='html'>According to &lt;a href="http://en.wikipedia.org/wiki/Main_Page"&gt;Wikipedia&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Kryptonite"&gt;Kryptonite&lt;/a&gt; (a fictional mineral, the green variety of which is toxic to &lt;a href="http://en.wikipedia.org/wiki/Superman"&gt;Superman&lt;/a&gt;) was originally introduced in 1943 (about five years after Superman's first appearance in comic books) in the radio show. It was a plot device used to allow the actor portraying Superman the opportunity to take some vacation time.&lt;br /&gt;&lt;br /&gt;Wacky.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-5393387596495616385?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/5393387596495616385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=5393387596495616385' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5393387596495616385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/5393387596495616385'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2007/11/origin-of-kryptonite.html' title='Origin of Kryptonite'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21734857.post-8414625684084517278</id><published>2007-11-13T07:00:00.000-06:00</published><updated>2007-11-13T08:19:06.464-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>trac: backups, Gantt plugin, concluding remarks</title><content type='html'>This is the third installment of a series on trac, Web-based pr0ject management software. The previous segments talked about &lt;a href="http://mbrisby.blogspot.com/2007/11/installing-trac.html"&gt;installing&lt;/a&gt; and &lt;a href="http://mbrisby.blogspot.com/2007/11/using-trac.html"&gt;using&lt;/a&gt; trac.&lt;br /&gt;&lt;br /&gt;trac comes with a command-line utility called &lt;code&gt;trac-admin&lt;/code&gt;, which can (among other things) perform backups of individual trac projects. The following is a shell script you could put in &lt;code&gt;/etc/cron.daily&lt;/code&gt; to back up all your trac projects each night:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;TRAC_ROOT=/var/www/trac/tracroot&lt;br /&gt;TRAC_BAC_ROOT=/var/trac_bac&lt;br /&gt;&lt;br /&gt;TODAY=$( date +%Y%m%d%H%M%S )&lt;br /&gt;mkdir -p $TRAC_BAC_ROOT/$TODAY&lt;br /&gt;for i in $TRAC_ROOT/*&lt;br /&gt;do&lt;br /&gt; DEST=$TRAC_BAC_ROOT/$TODAY/$( basename $i )&lt;br /&gt; DEST_TARGZ=${DEST}.tar.gz&lt;br /&gt; /usr/bin/trac-admin $i hotcopy $DEST&lt;br /&gt; tar czf $DEST_TARGZ $DEST&lt;br /&gt; rm -rf $DEST&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This uses the &lt;code&gt;trac-admin&lt;/code&gt; &lt;span style="font-weight: bold;"&gt;hotcopy&lt;/span&gt; feature to make a compressed archive of each individual project (putting them in time/date-labeled directories in &lt;code&gt;/var/trac_bac&lt;/code&gt;).&lt;br /&gt;&lt;br /&gt;This series discussed the WebAdmin plugin. I also tried the &lt;a href="http://willbarton.com/code/tracgantt/"&gt;TracGantt plugin&lt;/a&gt;, which makes &lt;span style="font-weight: bold;"&gt;Gantt&lt;/span&gt; charts of your project. I found that I didn't much care for this plugin. You have to enter an extra four data fields for each ticket, one of which is a list of ticket dependencies (e.g., completion of this ticket is dependent on completion of that ticket). The Gantt charts don't clearly display these ticket dependencies, so it seems like a wasted effort. And for a large project, the chart becomes too big for useful printouts, and the plugin doesn't offer exports in other formats. So TracGantt didn't really do it for me. &lt;span style="font-weight: bold;"&gt;shrug&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In closing, I really like trac, and it's been very helpful to me in my work. Clearly, trac is designed to manage software development projects. But with a little imagination, I think it could be used quite effectively to manage just about any kind of project, even something as simple as a running 'to-do' list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21734857-8414625684084517278?l=mbrisby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbrisby.blogspot.com/feeds/8414625684084517278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21734857&amp;postID=8414625684084517278' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8414625684084517278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21734857/posts/default/8414625684084517278'/><link rel='alternate' type='text/html' href='http://mbrisby.blogspot.com/2007/11/trac-backups-gantt-plugin-concluding_13.html' title='trac: backups, Gantt plugin, concluding remarks'/><author><name>mbrisby</name><uri>http://www.blogger.com/profile/06111867459021395319</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry></feed>
