<?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-6915374309937688673</id><updated>2011-07-08T08:31:41.874-04:00</updated><category term='OpenBSD'/><title type='text'>NacreData L.L.C.</title><subtitle type='html'>(return to &lt;a href="http://www.nacredata.com"&gt;home page&lt;/a&gt;)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6915374309937688673.post-3903999192973387177</id><published>2010-04-21T17:51:00.003-04:00</published><updated>2010-04-21T18:06:20.690-04:00</updated><title type='text'>Showing events from multiple public Google Calendars using your own custom CSS</title><content type='html'>Today I hacked some code to produce a result I know others are looking for, so I thought I would share. So far what I have is the result of of an hour or so exploring the code to see if this was possible. In other words, there is room to make this much more elegant and I hope to do so at some point. &lt;br /&gt;&lt;br /&gt;The seed of the issue is the inane inability to cusomize the color of the frame when embeding a Google Calendar. That really, really ought to be fixed by Google. &lt;br /&gt;&lt;br /&gt;One solution to this problem which I found (yes, by Googling it...) is "calvis". The project home page is here: &lt;a href="http://code.google.com/p/calvis/"&gt;http://code.google.com/p/calvis/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Calvis uses the Google Data API to pull down calendar events and display them in on screen using JavaScript. &lt;br /&gt;&lt;br /&gt;Unlike the embeded calendar, Calvis does not support displaying multiple Google Calendars. There is some discussion of this issue on the site's issue tracker (issue #3). This is the problem for which I now have a working solution. &lt;br /&gt;&lt;br /&gt;Note that this solution has only been tested for the cases where all calendars used are public and will probably not work in its current form for private calendars. &lt;br /&gt;&lt;br /&gt;Here's what I did:&lt;br /&gt;&lt;br /&gt;The majority of the changes are within calvis-core.js and &lt;a href="http://nacredata.com/calvis.js.diff"&gt;you can download the diff here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;1) I don't think it matters, but for what it's worth I replaced the projects jQuery 1.3.2 with the latest 1.4.2&lt;br /&gt;&lt;br /&gt;2) I added a new variable, calList to the variables defined in the main() javascript funtion which is defined in-line on the calendar page. This variable holds an array of the calendars to be combined. Here's what my declaration looks like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  var calList = [ 'google@communitygreenguide.org', &lt;br /&gt;    'b0prga519c0g0t3crcnc0g9in0@group.calendar.google.com' ];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3) Also within the main() javascript function on the calendar page, I set the calList variable within the Calendar object, using a new setCalList() method defined in calvis-core.js (more on this in a minute). &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  calendar.setCalList(calList);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4) In the Calendar constructor, create a calList variable set to null:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  this.calList = null;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;5) Defind the setCalList() method:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  calvis.Calendar.prototype.setCalList = function(calList) {&lt;br /&gt;    this.calList = calList;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;  &lt;br /&gt;6) Modify the existing getFeedUrl() method so that it returns an array of calendars and not just one calendar feed:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  calvis.Calendar.prototype.getFeedUrl = function() {&lt;br /&gt;    &lt;br /&gt;    feedUrlArray = new Array();&lt;br /&gt;    calList = this.calList;&lt;br /&gt;    &lt;br /&gt;    for( var i=0; i &lt; calList.length; i++ ) {&lt;br /&gt;      feedUrlArray[i] = ['http://www.google.com/calendar/feeds/', &lt;br /&gt;        calList[i], '/', this.visibility, '/full'].join('');&lt;br /&gt;    }&lt;br /&gt;         &lt;br /&gt;    return feedUrlArray;    &lt;br /&gt;  };&lt;br /&gt;  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;7) Change some code in the initLoginControl() method so that it can deal with getting an array of calendars. I don't believe this code will actually serve any purpose since we're only using public calendars, so I just use the first calendar in the array. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  var feeds = calendar.getFeedUrl();&lt;br /&gt;  var scope = feeds[0];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;8) In the two places overlayGData() is called, modify the calling code so that it calls overlayGData() once for each calendar, passing in the feedUrl as an attribute. This code appears near the bottom of the updateWeekView() method and at the bottom of the updateMonthView() method:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  var feedUriArray = this.getFeedUrl();&lt;br /&gt;  calendar = this;&lt;br /&gt;  for( var i=0; i&lt; feedUriArray.length; i++ ) {&lt;br /&gt;    calendar.overlayGData(firstDate, lastDate, feedUriArray[i]);&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;9) Change the method signature of overlayGData so that it will acced the feedUri as a parameter:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  calvis.Calendar.prototype.overlayGData = function(startDate, endDate, feedUri) &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;10) Remove the line in the existing overlayGData() method that retrieved the feedUri from the object:&lt;br /&gt;&lt;span style="text-decoration: line-through; padding-left: 10px;"&gt;&lt;br /&gt;  var feedUri = calendar.getFeedUrl();  &lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-3903999192973387177?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/3903999192973387177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=3903999192973387177' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/3903999192973387177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/3903999192973387177'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2010/04/showing-events-from-multiple-public.html' title='Showing events from multiple public Google Calendars using your own custom CSS'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-4565053624584722268</id><published>2009-11-24T14:32:00.003-05:00</published><updated>2009-12-01T13:56:18.462-05:00</updated><title type='text'>Uploading Files to a webserver from CKEditor under mod_perl</title><content type='html'>Just got a request to elaborate on this topic which I had mentioned in a recent tweet. So here's some more details. Note that there is no file-type checking here. In my case the uploads are only being allowed from logged-in administrators, so I can assume they are not uploading malicious files.&lt;br /&gt;&lt;br /&gt;1) Of course, remember to use  enctype="multipart/form-data" in the HTML form. Obvious but I've forgotten it more than once over the years...&lt;br /&gt;&lt;br /&gt;2) To tell CKEditor what URL to send the uploaded file to, I pass the target URL to the CKEditor command which replaces the form &amp;lt;textarea&amp;gt; with a rich text editor: &lt;br /&gt;&lt;br /&gt;CKEDITOR.replace( 'form_textarea', { filebrowserUploadUrl : '/upload_file' } );&lt;br /&gt;&lt;br /&gt;In my case I did this inside a jQuery "ready" handler:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$(document).ready( &lt;br /&gt;  function() {&lt;br /&gt;    CKEDITOR.replace( 'form_textarea', { filebrowserUploadUrl : '/upload_file' } );&lt;br /&gt;  }&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3) Map the URL to a mod_perl handler&lt;br /&gt;&lt;br /&gt;I'm using object oriented perl handlers, so the relevant portion of my httpd.conf file looks something like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Location ~ "^/upload_file$"&amp;gt;&lt;br /&gt;  SetHandler perl-script&lt;br /&gt;  PerlHandler NacreData::Controllers::FormHandler-&amp;gt;upload_file&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This will look different if you're using a procedural handler or mod_request or some such.&lt;br /&gt;&lt;br /&gt;4) Require/Use a perl module to do the uploading &lt;br /&gt;&lt;br /&gt;The one I got to work is Apache::Upload::Slurp&lt;br /&gt;&lt;br /&gt;I installed this with CPAN and used a PerlModule directive in httpd.conf to make sure it was loaded at runtime. &lt;br /&gt;&lt;br /&gt;5) Write the mod_perl handler&lt;br /&gt;&lt;br /&gt;Here's a cleaned up version of what mine looks like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  sub upload_file( $$ ) {&lt;br /&gt;    my ( $self, $r ) = @_;&lt;br /&gt;    &lt;br /&gt;    use Apache::Constants qw( :common );&lt;br /&gt;    my $apr = Apache::Request-&amp;gt;instance( $r );&lt;br /&gt;    $r-&amp;gt;content_type('text/html');&lt;br /&gt;    $r-&amp;gt;send_http_header;&lt;br /&gt;&lt;br /&gt;    require Apache::Upload::Slurp;&lt;br /&gt;    my $Uploader = new Apache::Upload::Slurp;&lt;br /&gt;    my $uploads  = $Uploader-&amp;gt;uploads();&lt;br /&gt;    my $upload = $uploads-&amp;gt;[0];&lt;br /&gt;    my $dir    = '/upload_files'; # directory where the uploaded files will go&lt;br /&gt;    return unless $upload;&lt;br /&gt;    return unless $upload-&amp;gt;{data};&lt;br /&gt;&lt;br /&gt;    # make this into a nice filename, no special chars, no spaces, etc.&lt;br /&gt;    my $filename = $upload-&amp;gt;{filename};&lt;br /&gt;    $filename    =~ m{([^\\/]+$)};&lt;br /&gt;    $filename    = $1;&lt;br /&gt;    $filename    =~ s/[^.\w]//g;&lt;br /&gt;    $filename    =~ s/__+/_/g;&lt;br /&gt;    $filename    =~ s/^_//;&lt;br /&gt;    $filename    =~ s/_$//;&lt;br /&gt;    $filename  ||= 'file';&lt;br /&gt;&lt;br /&gt;    # make sure we don't overwrite another file by the same name&lt;br /&gt;    while( -f $dir.'/'.$filename || -d $dir.'/'.$filename ) {&lt;br /&gt;      my $ext = '';&lt;br /&gt;      if( $filename =~ m/(\.[^.]+$)/ ) {&lt;br /&gt;        $ext = $1;&lt;br /&gt;        $filename =~ s/\.[^.]+$//;&lt;br /&gt;      }&lt;br /&gt;      my $d = 0;&lt;br /&gt;      if( $filename =~ m/(\d+)$/ ) {&lt;br /&gt;        $d = $1;&lt;br /&gt;        $filename =~ s/\d+$//;&lt;br /&gt;      }&lt;br /&gt;      $d++;&lt;br /&gt;      $filename = $filename . $d . $ext;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    my $fh;&lt;br /&gt;    $filename =  $dir.'/'.$filename;&lt;br /&gt;    open ( $fh, '&amp;gt;', $filename ) || die "can't open $filename";&lt;br /&gt;    print {$fh} $upload-&amp;gt;{data};&lt;br /&gt;    close $fh;&lt;br /&gt;&lt;br /&gt;    # now we return the information about the uploaded file to CKEditor.&lt;br /&gt;&lt;br /&gt;    # reference passed in from CKEditor. We use this to call back, letting&lt;br /&gt;    # the editor know we've don the upload.&lt;br /&gt;    my $funcNum = $apr-&amp;gt;param('CKEditorFuncNum'); &lt;br /&gt;&lt;br /&gt;    $filename =~ s|^/htdocs||; # path under document root to uploaded file&lt;br /&gt;    # you probably need ot change this line -- in my case, since I'm &lt;br /&gt;    # running under chroot, the webroot is just "/" and docroot /htdocs&lt;br /&gt;&lt;br /&gt;    my $hostname = $r-&amp;gt;server-&amp;gt;server_hostname;&lt;br /&gt;    $hostname =~ m{(\w+\.\w{2,4})$};&lt;br /&gt;    my $url = 'http://' . $hostname . $filename;&lt;br /&gt;&lt;br /&gt;    print "&amp;lt;script&amp;gt;parent.CKEDITOR.tools.callFunction( $funcNum, '$url' );&amp;lt;/script&amp;gt;";&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/6915374309937688673-4565053624584722268?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/4565053624584722268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=4565053624584722268' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/4565053624584722268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/4565053624584722268'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2009/11/uploading-files-to-webserver-from.html' title='Uploading Files to a webserver from CKEditor under mod_perl'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-5483072972773966926</id><published>2008-09-02T00:09:00.003-04:00</published><updated>2008-09-02T00:17:57.067-04:00</updated><title type='text'>BBEdit 9.0 -- First Impressions</title><content type='html'>After a little more than one working day using the newly released BBEdit 9.0, my impressions is positive. &lt;br /&gt;&lt;br /&gt;First of all, I am glad to see that a trusted tool works largely as expected as it keeps pace. This is to me much more important than flashy new interfaces or features. The search interface is cleaner, which is nice, but over all I had no problem at all getting right back to work after the upgrade. &lt;br /&gt;&lt;br /&gt;My favorite new feature is the variable auto-completion I noticed this evening while working on an approximately 400-line perl script with many, many variables. The auto-completion gave me great assurance without any split screens or searching that I had the spelling and capitalization of previously used variables correct. &lt;br /&gt;&lt;br /&gt;Thanks, &lt;a href="http://www.barebones.com/products/bbedit/"&gt;BareBones&lt;/a&gt; for the continued good work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-5483072972773966926?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/5483072972773966926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=5483072972773966926' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/5483072972773966926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/5483072972773966926'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2008/09/bbedit-90-first-impressions.html' title='BBEdit 9.0 -- First Impressions'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-7200600347746601219</id><published>2008-08-02T00:48:00.000-04:00</published><updated>2008-08-02T00:49:49.062-04:00</updated><title type='text'>Some links about current DNS attack</title><content type='html'>&lt;a href="http://entropy.dns-oarc.net/test"&gt;&lt;br /&gt;Is your ISP using a correctly patched DNS server&lt;/a&gt;? &lt;br /&gt;&lt;br /&gt;Or are you open to attack? &lt;a href="http://www.nytimes.com/idg/IDG_852573C4006938800025748F007863C4.html?ref=technology"&gt;Could the websites you see not really be what they appear to be? &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.grc.com/securitynow.htm#155"&gt;Listen to a podcast&lt;/a&gt; with a very complete explanation of DNS and the attack.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-7200600347746601219?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/7200600347746601219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=7200600347746601219' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/7200600347746601219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/7200600347746601219'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2008/08/some-links-about-current-dns-attack.html' title='Some links about current DNS attack'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-4338287252781728050</id><published>2008-08-01T22:51:00.002-04:00</published><updated>2008-08-01T23:40:05.033-04:00</updated><title type='text'>Product Review: Tone 12 GB USB 2.0 Mini Hard Drive</title><content type='html'>Very cute, casing matches my MacBook Pro. Works reliably so far. Took formatting to Mac (Extended, case-insensitive, journaled) no problem. Slow as molasses, though. The speed really cuts into it's utility for my intended use in loading virtual machines.&lt;br /&gt;&lt;br /&gt;Launch VMWare and open a suspended WinXP virtual machine:&lt;br /&gt;&lt;br /&gt;* Over the network from G5 dual 1.8GHz PowerPC to MacBook Pro: 58 seconds&lt;br /&gt;(54 seconds to suspend, saving state back to disk)&lt;br /&gt;&lt;br /&gt;* Same virtual machine from Tone 12 GB attached to MacBook Pro directly: 1:02 minute. Saving state: 1:41 - 3:09 minutes.&lt;br /&gt;&lt;br /&gt;* Same virtual machine loading directly from MacBook Pro HD: 17 seconds; suspend: 4.4 seconds&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-4338287252781728050?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/4338287252781728050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=4338287252781728050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/4338287252781728050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/4338287252781728050'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2008/08/product-review-tone-12-gb-usb-20-mini.html' title='Product Review: Tone 12 GB USB 2.0 Mini Hard Drive'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-5219652662215929064</id><published>2008-07-05T18:43:00.002-04:00</published><updated>2008-07-05T18:53:42.900-04:00</updated><title type='text'>Green Business Leadership</title><content type='html'>We'd heard that some rental car companies are renting hybrids. Calling around today, my wife was frustrated to learn that the options are few and far between in the Triangle area. Seems that just like the car manufactures, most rental companies are followers, looking behind, instead of business leaders looking forward.&lt;br /&gt;&lt;br /&gt;Which gets me thinking—how can NacreData LLC do a better job of being a green business leader? Feel free to leave your suggestions in the comments.&lt;br /&gt;&lt;br /&gt;Our transportation costs are largely non-existent — I work in a home office and everyone else currently doing NacreData work is also a home-based.&lt;br /&gt;&lt;br /&gt;We're not a bulk hosting company, but I've read a few times (see &lt;a href="http://blogs.business2.com/greenwombat/2007/02/photo_originall.html"&gt;http://blogs.business2.com/greenwombat/2007/02/photo_originall.html&lt;/a&gt; for instance) that server farms are power hogs. We're beginning to move more of the sites we manage onto virtual-machine based servers, where several server environments can share the resources of one physical machine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-5219652662215929064?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/5219652662215929064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=5219652662215929064' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/5219652662215929064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/5219652662215929064'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2008/07/green-business-leadership.html' title='Green Business Leadership'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-2395289615512198450</id><published>2007-12-28T12:58:00.000-05:00</published><updated>2007-12-28T13:37:14.941-05:00</updated><title type='text'>Getting SpamAssassin's spamc to work with Qmail</title><content type='html'>One of the recommended ways of setting up &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2FSpamAssassin-Alan-Schwartz%2Fdp%2F0596007078%2F&amp;amp;tag=nallc-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325"&gt;SpamAssassin&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=nallc-20&amp;amp;l=ur2&amp;amp;o=1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; to work with &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2Fqmail-John-R-Levine%2Fdp%2F1565926285%2F&amp;amp;tag=nallc-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325"&gt;Qmail&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=nallc-20&amp;amp;l=ur2&amp;amp;o=1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; is to move the binary "qmail-queue" to a different name, say qmail-queue.orig, then create a shell script named qmail-queue which passes the email through SpamAssassin then on to the original qmail-queue. &lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One problem with that set up which I've been noticing is that it passes &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;every&lt;/span&gt; email through the spam filter, even though the vast majority of email coming into the server is addressed to non-existent users. The time taken to scan all those emails was noticeably slowing down the system. &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So what I really wanted to do was call the spam filter from the .qmail files for real users. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Qmail's default delivery mechanism, set to contain just "#" in .qmail-default, will then drop all emails sent to non-existent users without calling SpamAssassin. &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I wanted to use the spamc utility, written in C, as a filter to call the already running spamd deamon from the user's spamc with the "-c" switch so that non-spam messages will return 0 (zero)  and thus pass on to delivery. One small problem, though, is that the exit value for an email determined to be spam is 1. Qmail will interpret an exit value of 1 as a temporary failure and keep trying to deliver the message. This will create a backlog of undelivered messages and slow down the email server. &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To get around this, I changed the exit value for spam emails in spamc. First I downloaded the latest SpamAssassin and untarred the download file. In the "spamc" subfolder I found a file named "libspamc.h". On or around line 85 is the line:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;#define EX_ISSPAM   1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I simply changed this to &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;#define EX_ISSPAM   99&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;and then completed the installation steps:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;perl Makefile.PL&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;make&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;sudo make install&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;which installed SpamAssasissin including spamc with the altered exit value.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lastly, from my user .qmail files, I call spamc. For example for &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;.qmail-devin&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;|/usr/local/bin/spamc -c&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;./devin/Maildir/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;and now SpamAssassin is run only for email coming to real users and all messages determined to be spam are silently dropped. The return value of 99 tells Qmail that the message has been completely processed and no further delivery steps need be taken. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&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/6915374309937688673-2395289615512198450?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/2395289615512198450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=2395289615512198450' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/2395289615512198450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/2395289615512198450'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2007/12/getting-spamassassins-spamc-to-work.html' title='Getting SpamAssassin&apos;s spamc to work with Qmail'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-931406800920498419</id><published>2007-08-09T18:24:00.000-04:00</published><updated>2007-08-09T18:29:07.113-04:00</updated><title type='text'>MySQL: To Good to Be True</title><content type='html'>In the back of my mind for some time now I've planned to move all NacreData projects away from MySQL to a more truly open source solution (almost surely &lt;a href="http://www.postgresql.org/about/"&gt;PostgreSQL&lt;/a&gt;), and &lt;a href="http://www.linux.com/feature/118489"&gt;today's news&lt;/a&gt; pretty much cinches it. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-931406800920498419?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/931406800920498419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=931406800920498419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/931406800920498419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/931406800920498419'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2007/08/mysql-to-good-to-be-true.html' title='MySQL: To Good to Be True'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-3964206230332112228</id><published>2007-07-29T23:20:00.000-04:00</published><updated>2007-07-29T23:45:40.612-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenBSD'/><title type='text'>Painting myself into a corner and working back out...</title><content type='html'>Upon leaving my friend's place in Indiana recently (see previous post) I brought back home with me an old iMac, a "blueberry", one of the blue-and-white cute cpu-and-monitor triangle shaped deals. It has a G3 processor and had a broken installation of OS 9. I recovered the important data and transferred it to a couple other media at my friend's place, then started tinkering. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Having noticed the PPC disk in the OpenBSD distributions I decided to give it a go. Being the last to &lt;a href="http://en.wikipedia.org/wiki/RTFM"&gt;RTFM,&lt;/a&gt; as they say, I blithely blew away the machine's partitions and installed the usual set I'm used to with OpenBSD. The install went fine, but the machine could not be booted off the new OS at all. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I read. Don't delete the Mac's boot partition it says. The Mac ROM needs to see a HFS boot partition or it won't go nowhere. Drat. The first many resources I found all describe how to set up the installation presuming you knew this and presuming you were intending to make a dual-boot machine with Mac on the other side. Finally I did find a &lt;a href="http://home.pcisys.net/~bpc/laptop/ibookobsd.html"&gt;couple&lt;/a&gt; &lt;a href="http://mail-index.netbsd.org/port-macppc/2006/08/13/0000.html"&gt;links&lt;/a&gt; which provided the clues needed about how to rectify the situation. Use pdisk to create an HFS ("Apple_HFS") partition of at least 1MB size named "boot", along with the other partitions usually used (/, swap, /tmp, /var/, /usr, /home). Then re-do the install. Then mount the OpenBSD install CD and the HD's boot partition and copy the open firmware program "ofwboot" to the "boot" partition. Finally, remove all CD's and boot with Command-option-o-f and issue the command &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:courier new;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;boot hd:,ofwboot /bsd&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" font-weight: bold;font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Voilà, it works and I'm off and running :-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-3964206230332112228?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/3964206230332112228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=3964206230332112228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/3964206230332112228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/3964206230332112228'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2007/07/painting-myself-into-corner-and-working.html' title='Painting myself into a corner and working back out...'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-6846269529198676025</id><published>2007-07-24T19:26:00.000-04:00</published><updated>2007-07-24T19:35:30.760-04:00</updated><title type='text'>PC Eudora to Mac Mail Conversion</title><content type='html'>I had a wonderful few days visiting friends in southern Indiana and setting up a network at their rural property where there are outbuildings used for conferences. I went with the latest D-Link b/g/n router over the Apple Airport for cost and the flexibility of a web-based configuration interface for the wireless component of the system.&lt;br /&gt;&lt;br /&gt;We also moved over 103,000 emails from Eudora 7 on a Win XP machine to Mac Mail on a new MacBook Pro. This was a bit of a pain. Our original plan was to move to Mac Eudora 6.2 for consistency, but the Eudora help for this process was entirely inadequate, and in places just flat wrong. Eudora 6.2 for OS X still uses OS 9 line endings (CR) for some reason, rather than the LF used by all UNIX based systems. Overall Eudora 6.2 felt like an outdated OS 9 piece of software I thought. The Mail importer, however, worked reasonably well (though slow) on the Eudora message files. Multiple levels of nested mailboxes were retained.&lt;br /&gt;&lt;br /&gt;The third-party &lt;a href="http://homepage.mac.com/aamann/Eudora_Mailbox_Cleaner.html"&gt;Eudora Mailbox Cleaner&lt;/a&gt; did a good job with the multiple address books, but the Filter-&gt;Rules import only imported the name of the filters, not any of the content, which was disappointing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-6846269529198676025?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/6846269529198676025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=6846269529198676025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/6846269529198676025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/6846269529198676025'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2007/07/pc-eudora-to-mac-mail-conversion.html' title='PC Eudora to Mac Mail Conversion'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-7570865355248832814</id><published>2007-06-11T00:43:00.000-04:00</published><updated>2007-06-11T00:54:13.027-04:00</updated><title type='text'>Updated site, new email gateway</title><content type='html'>Eva's design work is up now at &lt;a href="http://guide.BuyLocalCA.org/"&gt;http://guide.BuyLocalCA.org/&lt;/a&gt; and it looks rather nice I think. This is the next version of the site, which I've been working with for a couple years, which formerly looked pretty much like &lt;a href="http://www.BuyLocalPA.org/"&gt;http://www.BuyLocalPA.org/&lt;/a&gt; (designed by &lt;a href="http://www.dfsi.org/"&gt;Design for Social Impact&lt;/a&gt;). NacreData's role in the new CA site, aside from hosting and getting the existing database to display information in the new design, was the integration of Google Maps into the search display. What do you think? I went with the "bounding coordinates" method for the zip code search -- calculate the lat/long coordinates corresponding to the bounding points of map X miles from the center of the chosen zip code and search the database for lat/long values falling within those bounds. This was quicker than comparing the distance of every listing in the database.&lt;br /&gt;&lt;br /&gt;I also set up a new email gateway, OpenBSD 4.1 / Postfix to handle the primary flow from the &lt;a href="http://www.sustainableagriculture.net/"&gt;National Campaign for Sustainable Agriculture&lt;/a&gt;. The qmail server on the web server machine was getting inundated and the old machine serving as secondary was failing, so time to upgrade. Seems to be working fine, though it seems such a shame for a nice fast machine to spend 99% of its time refusing emails sent to non-existent email address...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-7570865355248832814?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/7570865355248832814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=7570865355248832814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/7570865355248832814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/7570865355248832814'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2007/06/updated-site-new-email-gateway.html' title='Updated site, new email gateway'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-3654519030658826216</id><published>2007-05-07T09:53:00.000-04:00</published><updated>2007-05-07T10:08:22.400-04:00</updated><title type='text'>Updated Sites</title><content type='html'>I should mention a couple of the sites I've been working which have recently been posted. First, the &lt;a href="http://www.heartwood.org/"&gt;Heartwood website&lt;/a&gt; has had a long-overdue complete overhaul. See see the &lt;a href="http://www.heartwood.org/content/post.html?id=6"&gt;article on the site&lt;/a&gt; for a full list of attributions and thanks to all who contributed!&lt;br /&gt;&lt;br /&gt;Also at the first of May we launched the wholesalers portion of the &lt;a href="http://www.buylocalpa.org/wholesale_index.php"&gt;Philadelphia area online local food guide&lt;/a&gt;. The &lt;a href="http://www.buylocalcville.org/"&gt;local food guide for Charlottesville, Virginia&lt;/a&gt; is also freshly live, though I have some adjustments to make to the categories on the site. Should be done today.&lt;br /&gt;&lt;br /&gt;Lastly, I love my new office at our new home. I feel more productive already :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-3654519030658826216?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/3654519030658826216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=3654519030658826216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/3654519030658826216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/3654519030658826216'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2007/05/updated-sites.html' title='Updated Sites'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-1103634203685728828</id><published>2007-03-10T00:05:00.000-05:00</published><updated>2007-03-10T00:08:31.705-05:00</updated><title type='text'>On second thought...</title><content type='html'>You know all those things you're not supposed to have to worry about with high-level language? You know, like memory management and declaring variables?&lt;br /&gt;&lt;br /&gt;Yeah, right.&lt;br /&gt;&lt;br /&gt;Then you read books on security and run into crashing database server hung on aborted connections and, well...&lt;br /&gt;&lt;br /&gt;Worry about those little things.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-1103634203685728828?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/1103634203685728828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=1103634203685728828' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/1103634203685728828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/1103634203685728828'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2007/03/on-second-thought.html' title='On second thought...'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-8300508230404538295</id><published>2007-02-03T22:19:00.000-05:00</published><updated>2007-02-03T22:26:17.002-05:00</updated><title type='text'>for the want of a "6"</title><content type='html'>More interesting chroot challenges today.&lt;br /&gt;&lt;br /&gt;First the challenge of perl modules which want to  use Dynaloader to  load shared C  libraries at run time.  Not gonna happen if the  path isn't the same under the chroot, which it surely isn't. I got around this one with mod_perl and a startup perl script, so that the perl module is run as root, loading the libraries, before the chroot happens.&lt;br /&gt;&lt;br /&gt;Then LWP returned an obscure error about tcp being a bad protocol. Hm. Google groups search to the rescue, and we find there is a table I never noticed before relating named protocol names to numeric values which also couldn't be found. Simply copied this table into the chroot with read-only permissions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-8300508230404538295?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/8300508230404538295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=8300508230404538295' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/8300508230404538295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/8300508230404538295'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2007/02/for-want-of-6.html' title='for the want of a &quot;6&quot;'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-8810430758548731333</id><published>2007-01-23T12:10:00.000-05:00</published><updated>2007-01-23T12:15:23.135-05:00</updated><title type='text'>SSL on alternative ports</title><content type='html'>There are penalties to trying to be too clever.&lt;br /&gt;&lt;br /&gt;Having already set up  an SSL VirtualHost for one client on my main PHP webserver, I decided to set up a second under a port other than the standard :443. This worked, and allowed for more than one SSL certificate to be used on that server without using additional IP's.&lt;br /&gt;&lt;br /&gt;Unfortunately I soon began getting complaints from a few folks that the pages in question wouldn't load for them. Turns out several of them were coming from the same public library and another from a University account. So it appears that there are a significant number of people accessing sites from behind restrictive firewalls where SSL on an alternative port won't work.&lt;br /&gt;&lt;br /&gt;Now I'll have to use additional IP's, something name-based VirtualHosting and HTTP 1.1 was designed to get around. Well, I tried. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-8810430758548731333?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/8810430758548731333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=8810430758548731333' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/8810430758548731333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/8810430758548731333'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2007/01/ssl-on-alternative-ports.html' title='SSL on alternative ports'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-1615303461130552596</id><published>2007-01-12T21:02:00.000-05:00</published><updated>2007-01-12T21:08:39.491-05:00</updated><title type='text'>Net::UPS Patch</title><content type='html'>Perl is such a great environment because when you need to do something like develop an interface to the UPS XML services, and you start mucking around with LWP and wonder why their service doesn't expect POST to have key=&gt;value pairs, you suddenly realize someone has written Net::UPS and the problem has already been solved.&lt;br /&gt;&lt;br /&gt;The 0.4 version of Net::UPS, however, doesn't deal with the new  "your prices may vary" warning UPS attaches to every query as a warning. The following simple patch, similar but somewhat simpler and more general, than one already submitted to the module's author, works to remedy the situation:&lt;br /&gt;&lt;br /&gt;--- /usr/local/lib/perl5/site_perl/5.8.8/Net/UPS.orig   Fri Jan 12 20:56:28 2007&lt;br /&gt;+++ /usr/local/lib/perl5/site_perl/5.8.8/Net/UPS.pm     Fri Jan 12 20:54:10 2007&lt;br /&gt;@@ -307,7 +307,10 @@&lt;br /&gt;                                            KeyAttr =&gt; [],&lt;br /&gt;                                            ForceArray =&gt; ['RatedPackage', 'RatedShipment']);&lt;br /&gt;    if ( my $error  =  $response-&gt;{Response}-&gt;{Error} ) {&lt;br /&gt;-       return $self-&gt;set_error( $error-&gt;{ErrorDescription} );&lt;br /&gt;+       $self-&gt;set_error( $error-&gt;{ErrorDescription} );&lt;br /&gt;+       if ( $error-&gt;{ErrorSeverity} eq 'Hard' ) {&lt;br /&gt;+           return $self-&gt;set_error( $error-&gt;{ErrorDescription} );&lt;br /&gt;+       }  &lt;br /&gt;    }&lt;br /&gt;    my @services;&lt;br /&gt;    for (my $i=0; $i &lt; @{$response-&gt;{RatedShipment}}; $i++ ) {&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-1615303461130552596?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/1615303461130552596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=1615303461130552596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/1615303461130552596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/1615303461130552596'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2007/01/netups-patch.html' title='Net::UPS Patch'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-974598447527721136</id><published>2007-01-09T00:44:00.000-05:00</published><updated>2007-01-09T00:49:37.217-05:00</updated><title type='text'>One last OpenBSD/qmail thought for the night...</title><content type='html'>&lt;div style="text-align: left;"&gt;As mentioned here &lt;a href="http://forum.qmailrocks.org/showthread.php?t=3205"&gt;http://forum.qmailrocks.org/showthread.php?t=3205&lt;/a&gt; and probably other places I didn't find when searching, there is an nosuid entry which prevents setuid programs from operating under the /var directory. This could be disabled; I got around it by moving the entire /var/qmail directory&lt;br /&gt;&lt;br /&gt;mv /var/qmail /usr/local/qmail&lt;br /&gt;ln -s /usr/local/qmail /var/qmail&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/6915374309937688673-974598447527721136?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/974598447527721136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=974598447527721136' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/974598447527721136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/974598447527721136'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2007/01/one-last-openbsdqmail-thought-for-night.html' title='One last OpenBSD/qmail thought for the night...'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-4269594290933549772</id><published>2007-01-08T22:22:00.000-05:00</published><updated>2007-01-09T00:50:07.408-05:00</updated><title type='text'>Also useful...</title><content type='html'>cr.yp.to seems to be unreachable tonight. A couple mirror links for application downloads:&lt;br /&gt;&lt;a href="http://blogs.sun.com/BableOn/entry/virtual_email_server_qmail_vpopmail"&gt;&lt;br /&gt;http://blogs.sun.com/BableOn/entry/virtual_email_server_qmail_vpopmail&lt;/a&gt;&lt;br /&gt;&lt;a href="http://public.www.planetmirror.com/pub/djbdns/daemontools/?fl="&gt;&lt;br /&gt;http://public.www.planetmirror.com/pub/djbdns/daemontools/?fl=&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-4269594290933549772?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/4269594290933549772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=4269594290933549772' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/4269594290933549772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/4269594290933549772'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2007/01/also-useful.html' title='Also useful...'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-8788467346347267193</id><published>2007-01-08T22:17:00.000-05:00</published><updated>2007-01-08T22:19:23.722-05:00</updated><title type='text'>had to stick this somewhere to remember it...</title><content type='html'>Shell script to set up qmail users in OpenBSD 4.0&lt;br /&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;groupadd nofiles&lt;br /&gt;useradd  -G nofiles -d /var/qmail/alias -s /nonexistent alias&lt;br /&gt;useradd -G nofiles -d /var/qmail -s /nonexistent qmaild&lt;br /&gt;useradd -G nofiles -d /var/qmail -s /nonexistent qmaill&lt;br /&gt;useradd -G nofiles -d /var/qmail -s /nonexistent qmailp&lt;br /&gt;groupadd qmail&lt;br /&gt;useradd -G qmail -d /var/qmail -s /nonexistent qmailq&lt;br /&gt;useradd -G qmail -d /var/qmail -s /nonexistent qmailr&lt;br /&gt;useradd -G qmail -d /var/qmail -s /nonexistent qmails&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-8788467346347267193?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/8788467346347267193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=8788467346347267193' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/8788467346347267193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/8788467346347267193'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2007/01/had-to-stick-this-somewhere-to-remember.html' title='had to stick this somewhere to remember it...'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-6746136200632668231</id><published>2006-12-23T22:52:00.000-05:00</published><updated>2007-01-12T21:27:43.887-05:00</updated><title type='text'>DBD::mysql done</title><content type='html'>Installing the perl module DBD::mysql is notoriously plagued by glitches. Getting it going on my MacBook Pro proved no different. I found some references to others having issues, but none the same as mine. Perhaps this is because I have installed perl 5.8.8 (placing it in /usr/local/bin, archiving the existing install (5.8.6), and symbolically linking /usr/bin/perl to the new install). Or maybe it's the phase of the moon.&lt;br /&gt;&lt;br /&gt;The error I got at the "make" stage listed two /tmp/&lt;something&gt;.out files and told me they were both i386 architecture files and couldn't be bundled together. The Makefile.PL uses the output form mysql_config to set the -cflags directive by default, so I took a look at this. It was:&lt;br /&gt;&lt;br /&gt;-I/usr/local/mysql/include -Os -arch i386 -fno-common&lt;br /&gt;&lt;br /&gt;removing the "-arch" flag worked. All I had to do was:&lt;br /&gt;&lt;br /&gt;mysql -u root -p&lt;br /&gt;password: *****&lt;br /&gt;&gt; grant all on test.* to ''@localhost&lt;br /&gt;OK&lt;br /&gt;&gt; quit&lt;br /&gt;&lt;br /&gt;make clean&lt;br /&gt;perl Makefile.PL -cflags="-I/usr/local/mysql/include -Os -fno-common"&lt;br /&gt;make&lt;br /&gt;make test&lt;br /&gt;sudo make install&lt;/something&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-6746136200632668231?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/6746136200632668231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=6746136200632668231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/6746136200632668231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/6746136200632668231'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2006/12/dbdmysql-done.html' title='DBD::mysql done'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-8169488249544967340</id><published>2006-12-17T23:07:00.001-05:00</published><updated>2006-12-17T23:07:48.702-05:00</updated><title type='text'>Wow</title><content type='html'>What a wonderful birthday weekend it's been. I feel very loved. Thanks everyone.&lt;br /&gt;&lt;br /&gt;:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-8169488249544967340?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/8169488249544967340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=8169488249544967340' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/8169488249544967340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/8169488249544967340'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2006/12/wow.html' title='Wow'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-8478824799668630770</id><published>2006-12-08T09:42:00.000-05:00</published><updated>2006-12-08T09:47:06.513-05:00</updated><title type='text'>Ginkgo Biloba</title><content type='html'>Well, cool. The nice gentleman at the apple store took the memory and the MacBook Pro in the back and came back out with it working. Not sure what he did that I didn't, but that's ok.&lt;br /&gt;&lt;br /&gt;More memory is nice since I've been running more applications at once since I downloaded &lt;a href="http://desktopmanager.berlios.de/"&gt;Desktop Manager&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-8478824799668630770?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/8478824799668630770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=8478824799668630770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/8478824799668630770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/8478824799668630770'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2006/12/ginkgo-biloba.html' title='Ginkgo Biloba'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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-6915374309937688673.post-915499601223580249</id><published>2006-12-07T17:16:00.000-05:00</published><updated>2006-12-07T17:18:26.897-05:00</updated><title type='text'>Bad Memory</title><content type='html'>New memory module for MacBook Pro came by FedEx. Install seemed easy enough, but the machine won't even turn on with it in. Damn. Appt. at Apple store this evening, we'll see what they have to say about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6915374309937688673-915499601223580249?l=nacredata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nacredata.blogspot.com/feeds/915499601223580249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6915374309937688673&amp;postID=915499601223580249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/915499601223580249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6915374309937688673/posts/default/915499601223580249'/><link rel='alternate' type='text/html' href='http://nacredata.blogspot.com/2006/12/bad-memory.html' title='Bad Memory'/><author><name>devin</name><uri>http://www.blogger.com/profile/02243833007672105761</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></feed>
