<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>Patchwork Psychology</title>
	<atom:link href="http://patchworkpsychology.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://patchworkpsychology.com</link>
	<description>The fabric forming the folds of a Hoss-brain</description>
	<pubDate>Thu, 10 Jan 2008 20:11:15 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Deploying Rails with Mongrels on a Shared Web Server</title>
		<link>http://patchworkpsychology.com/2008/01/10/deploying-rails-with-mongrels-on-a-shared-web-server/</link>
		<comments>http://patchworkpsychology.com/2008/01/10/deploying-rails-with-mongrels-on-a-shared-web-server/#comments</comments>
		<pubDate>Thu, 10 Jan 2008 20:11:15 +0000</pubDate>
		<dc:creator>Hoss</dc:creator>
		
		<category><![CDATA[Sysadmin]]></category>

		<guid isPermaLink="false">http://patchworkpsychology.com/2008/01/10/deploying-rails-with-mongrels-on-a-shared-web-server/</guid>
		<description><![CDATA[Rails probably won&#8217;t be the next big thing. With behemoths like ASP.NET offering tight integration with existing desktop apps and household names like PHP now bundled with every Linux distribution, Rails doesn&#8217;t have enough to offer the run-of-the-mill web developer to win them over.
But some know.
Once you&#8217;ve learned Rails (and thus Ruby), you think of [...]]]></description>
			<content:encoded><![CDATA[<p>Rails probably won&#8217;t be the next big thing. With behemoths like ASP.NET offering tight integration with existing desktop apps and household names like PHP now bundled with every Linux distribution, Rails doesn&#8217;t have enough to offer the run-of-the-mill web developer to win them over.</p>
<p>But some know.</p>
<p>Once you&#8217;ve learned Rails (and thus Ruby), you think of web application development in a whole new way.  A way where anything&#8217;s possible, and changing the design on the fly does not have to be your most annoying pet peeve.</p>
<p><span id="more-84"></span>Those who know are enjoying it&#8211;an API that works harder than they do.  If you&#8217;re writing your app from the ground up, choosing Rails will be guaranteed good experience and an experience of good.  No, it won&#8217;t be easy.  Ruby isn&#8217;t a simple language to pick up.  But the API documentation is *great* and the language offers a flexibility and semantic clarity that is unrivalled.</p>
<p>What <em>is</em> rivalled, however, is deployment.  Most of the popular languages of this day have plugins that allow them to run threads right in the web server, saving copious amounts of time precious time that would be spent with CGI forking, executing the interpreter and loading up the libraries.  Rails, if you want to use it with Apache, requires either you use CGI (which is fatally slow) or have access to the server-wide configuration to set up a proxy balancer.</p>
<p>These days, running one&#8217;s own server is just not practical.  To run your own server from your home is a real headache&#8211;limited upload bandwidth (on cable), service agreement issues&#8211;and the need to buy business-class connections to do it legally, and lest we forget, the complete pain of being responsible for keeping the server up and running.  Sure, you could buy a virtual server, but there are issues there as well, not the least of which is forking out $20-$30/mo for a mere 10GB of server space&#8211;and hardly enough memory to serve a single website with reasonable response.</p>
<p>No, these days, shared web servers are where it&#8217;s @.  Dreamhost (http://www.dreamhost.com) offers for $6-$11 500GB of space with 5TB of transfer per month, and once you sign up, you earn 2GB of storage and 40GB of transfer a week! With deals like this, it&#8217;s silly to pay $25/mo for the benefit of having access to the server-wide configuration.</p>
<p>It does pose an issue for Rails, however.  The Rails recommended practice is to use mongrels to serve up your page.  Without the ability to create a balancer in Apache, it&#8217;s not possible to directly coerce Apache into utilizing more than a single mongrel&#8211;which would have terrible performance (though still better than CGI).  Perhaps FastCGI would be a possible alternative, but that method is soon-to-be deprecated.  If you want to do it the right way, you need to use mongrels.</p>
<p><strong>Open Source to the Rescue</strong><br />
One intruiging fact about many shared web servers is that they allow you to compile and run your own packages.  In fact, I prefer to deploy Rails using my own ruby and gems.  I created a ~/.packages directory and used it as the configure prefix, and then added it first on my path (PATH=~/.packages/bin:$PATH).  Having your own local binaries of the important things adds a great deal of security to your situation&#8211;it feels good to know that your provider can&#8217;t update anything and throw off your app.  I guess in the case of gems, not freezing is asking for trouble, but just the same, having your own local ruby conveys a warm, fuzzy feeling.</p>
<p>So after using CGI for a day, something had to change.  FastCGI wasn&#8217;t working on the server (a shared web server from JaguarPC), and I didn&#8217;t feel like trying to work that issue out through support tickets.  Since FastCGI still wasn&#8217;t the right way to do it, I was trying to figure out how I could make mongrels work without trying to get JagPC to create a load balancer (which they probably wouldn&#8217;t do anyway).</p>
<p>Then I remembered an open source app: balance.  Balance a user-space TCP load balancer. It takes all of the options on the command line and just does its job.  Compile it up and run it.  It has proved very effective.</p>
<p><strong>The Strategy</strong><br />
The idea will be this:  spawn 5 mongrels starting on port 61501.  Spawn balance on 127.0.0.1:61500 with servers at 127.0.0.1:61501-61505.  Then, through a .htaccess file and mod_rewrite, pass all of the requests through to 127.0.0.1:61500 with rewrite flag P (to proxy).  It&#8217;s a cinch!</p>
<p>My deployment has a bit more complexity, as I am running three environments (DEV, TEST, and PROD) off of a single codebase (three copies, but all are checked out of the same SVN repository).  I wanted to keep the .htaccess files in the repository, so I needed a single version that could differentiate between the environments.  Not so hard, actually.</p>
<p><strong>.htaccess</strong></p>
<pre># General Apache options
AddHandler fastcgi-script .fcgi
AddHandler cgi-script .cgi
Options +FollowSymLinks +ExecCGI

# If you don't want Rails to look in certain directories,
# use the following rewrite rules so that Apache won't rewrite certain requests
#
# Example:
#   RewriteCond %{REQUEST_URI} ^/notrails.*
#   RewriteRule .* - [L]

# Redirect all requests not available on the filesystem to Rails
# By default the cgi dispatcher is used which is very slow
#
# For better performance replace the dispatcher with the fastcgi one
#
# Example:
#   RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
RewriteEngine On

# If your Rails application is accessed via an Alias directive,
# then you MUST also set the RewriteBase in this htaccess file.
#
# Example:
#   Alias /myrailsapp /path/to/myrailsapp/public
#   RewriteBase /myrailsapp
RewriteRule ^$ index.html [QSA]
#RewriteRule ^([^.]+)$ $1.html [QSA]

#Rewrite for Production environment
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{SERVER_NAME} (.*)my.domain
RewriteCond %1 !(test|dev)
RewriteRule ^(.*)$ http://127.0.0.1:61500/$1 [QSA,P]

#Rewrite for Test environment
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{SERVER_NAME} (.*)my.domain
RewriteCond %1 test
RewriteRule ^(.*)$ http://127.0.0.1:61600/$1 [QSA,P]

#Rewrite for Development environment
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{SERVER_NAME} (.*)my.domain
RewriteCond %1 dev
RewriteRule ^(.*)$ http://127.0.0.1:61700/$1 [QSA,P]

#RewriteRule ^(.*)$ dispatch.cgi [QSA,L]

# In case Rails experiences terminal errors
# Instead of displaying this message you can supply a file here which will be rendered instead
#
# Example:
#   ErrorDocument 500 /500.html

ErrorDocument 500 "&lt;h2&gt;Application error&lt;/h2&gt;Rails application failed to start properly"</pre>
<p>The file is based off of the one that is supplied by Rails.  It handles the separation of the environments pased on HTTP host header name sent by the client.  The dev environment is served from dev.my.domain, test from test.my.domain and prod from my.domain.</p>
<p>I also created a simple script to handle starting and stopping the mongrels (listed at the end of this article).  If I need to change the number of mongrels for each environment, I simply change the variables at the top of the script and restart the environment.</p>
<p>One last script I wrote runs from cron (which many shared web servers will also give you access too) to make sure that the mongrels and balancers are up.  It&#8217;s simple enough that I won&#8217;t list it here.  All it does is check for the processes, and if any are down it runs the above script to restart all of the environments.</p>
<p><strong>servers.sh (starts and stops mongrels and balance instances)</strong></p>
<pre>#!/bin/bash
. ~/.bash_profile
PROD_PORT=61500
TEST_PORT=61600
DEV_PORT=61700
PROD_PATH="~/Projects/MyApp/Production"
TEST_PATH="~/Projects/MyApp/Test"
DEV_PATH="~/Projects/MyApp/Development"
NUM_MONGRELS_PROD=5
NUM_MONGRELS_TEST=2
NUM_MONGRELS_DEV=2

function usage {
echo "usage: servers.sh start|stop production|test|development|all"
}

function stop_production {
PIDM=`ps aux | grep `whoami` | grep mongrel | grep production | awk '{ print $2}'`
PIDB=`ps aux | grep `whoami` | grep balance | grep $PROD_PORT | awk '{ print $2}'`
if [[ -n "$PIDM" || -n "$PIDB" ]];
then
kill  $PIDM $PIDB
fi
rm -f "$PROD_PATH/log/mongrel.pid"
}

function stop_test {
PIDM=`ps aux | grep `whoami` | grep mongrel | grep test | awk '{ print $2}'`
PIDB=`ps aux | grep `whoami` | grep balance | grep $TEST_PORT | awk '{ print $2}'`
if [[ -n "$PIDM" || -n "$PIDB" ]];
then
kill  $PIDM $PIDB
fi
rm -f "$TEST_PATH/log/mongrel.pid"
}

function stop_development {
PIDM=`ps aux | grep `whoami` | grep mongrel | grep development | awk '{ print $2}'`
PIDB=`ps aux | grep `whoami` | grep balance | grep $DEV_PORT | awk '{ print $2}'`
if [[ -n "$PIDM" || "$PIDB" ]];
then
kill  $PIDM $PIDB
fi
rm -f "$DEV_PATH/log/mongrel.pid"
}

function start_production {
#Start Production
mongrel_rails start -d -n $NUM_MONGRELS_PROD -e production -c "$PROD_PATH" -p $(($PROD_PORT+1))
MONGRELS=""
for i in `seq -s " " $(($PROD_PORT+1)) $(($PROD_PORT+$NUM_MONGRELS_PROD))`
do
MONGRELS="127.0.0.1:$i $MONGRELS"
done
balance $PROD_PORT $MONGRELS
echo -n production
}

function start_test {
#Start Test
MONGRELS=""
mongrel_rails start -d -n $NUM_MONGRELS_TEST -e test -c "$TEST_PATH" -p $(($TEST_PORT+1))
for i in `seq -s " " $(($TEST_PORT+1)) $(($TEST_PORT+$NUM_MONGRELS_TEST))`
do
MONGRELS="127.0.0.1:$i $MONGRELS"
done
balance $TEST_PORT $MONGRELS
echo -n " test"
}

function start_development {
#Start Development
MONGRELS=""
mongrel_rails start -d -n $NUM_MONGRELS_DEV -e development -c "$DEV_PATH" -p $(($DEV_PORT+1))
for i in `seq -s " " $(($DEV_PORT+1)) $(($DEV_PORT+$NUM_MONGRELS_DEV))`
do
MONGRELS="127.0.0.1:$i $MONGRELS"
done
balance $DEV_PORT $MONGRELS
echo -n " development"
}

case $1 in
start)
case $2 in
production)
stop_production
start_production;
;;
test)
stop_test
start_test
;;
development)
stop_development
start_development
;;
all)
stop_production
start_production
stop_test
start_test
stop_development
start_development
;;
*)
usage
;;
esac
;;
stop)
case $2 in
production)
stop_production
;;
test)
stop_test;
;;
development)
stop_development
;;
all)
stop_production
stop_test
stop_development
;;
*)
usage
;;
esac
;;
*)
usage
;;
esac
echo</pre>
]]></content:encoded>
			<wfw:commentRss>http://patchworkpsychology.com/2008/01/10/deploying-rails-with-mongrels-on-a-shared-web-server/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Serious Neckpain: Virtual Mail Hosting with Postfix and DBMail</title>
		<link>http://patchworkpsychology.com/2008/01/02/serious-neckpain-virtual-mail-hosting-with-postfix-and-dbmail/</link>
		<comments>http://patchworkpsychology.com/2008/01/02/serious-neckpain-virtual-mail-hosting-with-postfix-and-dbmail/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 20:17:40 +0000</pubDate>
		<dc:creator>Hoss</dc:creator>
		
		<category><![CDATA[Sysadmin]]></category>

		<guid isPermaLink="false">http://patchworkpsychology.com/?p=43</guid>
		<description><![CDATA[It&#8217;s supposed to be easier this way, right?  Doing virtual mail hosting with mbox files is just asking for it.  My manager recommended dbmail over dovecot, and he&#8217;s a smart guy, so I&#8217;ll go with it.  It can&#8217;t be that hard.  Much to my chagrin, there isn&#8217;t a single recent howto [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s supposed to be easier this way, right?  Doing virtual mail hosting with mbox files is just asking for it.  My manager recommended dbmail over dovecot, and he&#8217;s a smart guy, so I&#8217;ll go with it.  It can&#8217;t be that hard.  Much to my chagrin, there isn&#8217;t a single recent howto on how to combine these pieces in a way that makes sense anymore.  I&#8217;m having a hard time understanding how something so prolific as this has slipped through the cracks into open-source hell.  Oh well&#8230;they pay me to find the answers, not to piss and moan about them.</p>
<p><span id="more-43"></span>Ok, so here&#8217;s the plan.  My company&#8217;s customer email server is on a desktop-class machine (as is the mail server&#8211;and probably DNS servers, too&#8211;of any hosting company that got its start in the 90s), and I need to make a new mail server (which is actually a virtual machine, though that&#8217;s not really important) so we can shut down that desktop box for good.  The new server will use Postfix and DBMail on MySQL.  Our clients will be able to authenticate to the SMTP server, or do POP/IMAP before SMTP.  The box will run openSuSE 10.3.</p>
<p><b>Step 1: DBMail.</b><br />
Not a difficult step&#8211;in fact, this may be the easiest part of the whole process.  Really, the hardest part of this was making SuSE compatable init.d scripts.  I hate doing this, and so they&#8217;re pretty minimal.</p>
<p>Setting up DBMail is a cinch:  copy the sample dbmail.cf to the config directory and update the DB connection parameters.  I also set IMAP_BEFORE_SMTP to yes.  Then start the servers and DBMail is up.</p>
<p><b>Step 2: Postfix.</b><br />
This proved to be a real wriggling snake.  Postfix is rock solid, and it wouldn&#8217;t budge. First it wouldn&#8217;t deliver mail locally.  Then it wouldn&#8217;t deliver mail anywhere else.  Then it wouldn&#8217;t deliver mail anywhere.  Everyone was talking about the local_transport_maps setting.  As far as I could tell, my local_transport_maps were fine.  Then finally I figured it out.  If postfix wasn&#8217;t going to try to deliver every message locally or every message remotely, it needed to know which domains it delivered locally for, as I used to configure with the vmaildomains (virtual_mailbox_domains directive) file.</p>
<p>Since Postfix was not doing the virtual domains but rather DBMail, the domains need to appear as local domains rather than virtual domains to Postfix.  This is set up using the mydestination variable.<br />
<code></code></p>
<p><code>#from /etc/postfix/main.cf<br />
mydestination = $myhostname, localhost.$mydomain, mysql:/etc/postfix/local_domains.cf</code></p>
<p>Creating the proper SQL statement was no walk in the park, either (sure, it&#8217;s simple enough, but imagine having little idea of just exactly what the expected output is).  Postfix expects one one-column row back from the query based on the value that it puts in, a sort of key=value sort of thing.  It&#8217;ll submit the domain in and expect to get the domain out if it&#8217;s a local destination.  DBMail doesn&#8217;t keep a table with this, so I have to do some transformation from the aliases.</p>
<p>Since MySQL doesn&#8217;t let you use a column alias (i.e. SELECT field AS alias), I have to do the transformation twice: once in select column and once in the where section.  Using substring and locate I strip off the username and @ from the email alias and the Postfix query (in %s).  It&#8217;s a bit messy, but it works.<br />
<code></code></p>
<p><code>#/etc/postfix/local_domains.cf<br />
hosts = unix:/var/lib/mysql/mysql.sock<br />
user = dbmail<br />
password = ******<br />
dbname = dbmail<br />
query = SELECT substring(alias FROM locate('@',alias)+1) FROM dbmail_aliases WHERE alias LIKE CONCAT('%%',substring('%s' FROM LOCATE('@','%s')+1))  LIMIT 1</code></p>
<p>With this in place, Postfix and DBMail are happily married.  There is one problem yet: Authentication</p>
<p><b>Step 3: SASL</b><br />
Using the usual config for getting this going based on the usual howtos isn&#8217;t terribly hard, though it can be trying.  For the first two hours while beating on sasl2 I couldn&#8217;t figure out why it kept looking for the sasldb password file.  Then I figured out that the mysql auxprop plugin hadn&#8217;t been installed.  The OS had a package for it, at least.  After installing it, I still had the same problem, if I remember correctly.  I never did figure out what it was doing, but thankfully it stopped eventually and started using my database connection.</p>
<p><code>#/etc/sasl2/smtpd.conf<br />
pwcheck_method: auxprop<br />
auxprop_plugin: sql<br />
mech_list: plain login cram-md5 digest-md5 ntlm<br />
sql_engine: mysql<br />
sql_hostnames: localhost<br />
sql_user: dbmail<br />
sql_passwd: ******<br />
sql_database: dbmail<br />
sql_select: SELECT passwd FROM dbmail_users WHERE userid = '%u@%r'</code></p>
<p><b>Step 4: Migration</b><br />
I haven&#8217;t yet done the migration from the old server to this one&#8211;I&#8217;m still planning it.  There are a few hurdles to jump in the process:</p>
<ol>
<li>Importing the users</li>
<li>Importing the aliases</li>
<li>Importing the PASSWORDS!</li>
<li>Importing the mailboxes</li>
</ol>
<p>The user and alias imports will be easy enough to do with scripts.  The mailboxes can be part of that: DBMail ships with a python script that will copy messages out of a mbox or maildir format mailbox into a DBMail mailbox.  But the passwords&#8230;</p>
<p>The passwords are currently stored in a htpasswd-generated passwd file, which is simply formatted username:crypt_pass\n.  I&#8217;m in luck, right?  DBMail supports plain, crypt, and md5 passwords.  Oh but wait! The sasl2 sql auxprop plugin only supports plain passwords.  I didn&#8217;t find that out until I put a crypt password in and enjoyed great IMAP service and no SMTP service.  Apparently if you want to use a crypt password, you&#8217;ll be limited to the PLAIN mechanism (because the shared secret mechanisms require the unencrypted password) and you&#8217;ll have to do it with saslauthd through PAM.</p>
<p>So install the pam-devel package, download pam-mysql and compile it up.  Then edit the PAM config file for smtp:<br />
<code></code></p>
<p><code>#/etc/pam.d/smtp<br />
#%PAM-1.0<br />
auth     optional       pam_mysql.so user=dbmail host=localhost passwd=****** db=dbmail table=dbmail_users usercolumn=userid passwdcolumn=passwd crypt=1<br />
account  required       pam_mysql.so user=dbmail host=localhost passwd=****** db=dbmail table=dbmail_users usercolumn=userid passwdcolumn=passwd crypt=1 </code></p>
<p>Oh yeah, the sasl config as well:<br />
<code></code></p>
<p><code>/etc/sasl2/smtpd.conf<br />
pwcheck_method: saslauthd<br />
mech_list: plain login</code></p>
<p>You have to make sure to start the saslauthd with the &#8220;-a pam&#8221; option.  If you are authenticating with the full email address as the username, you&#8217;ll also need to specify the &#8220;-r&#8221; option which processes the full user@realm as the username.  I learned that the hard way.</p>
<p>Anyway, at this point I&#8217;m up and running with pam-mysql.  The only catch is that now I&#8217;m sending passwords in clear text over the wire.  SSL is probably a good idea before this box is production.</p>
<p><b>So</b> yeah, not as easy as some other solutions, but the payoff is good enough.  DBMail makes maintenance easier (especially with DBMail Administrator, a CGI frontend) and performance better.  I have no regrets in choosing it.</p>
<p>Here are my configuration files for the benefit of the world.</p>
<p><b>/etc/postfix/main.cf</b><br />
<code>biff = no<br />
broken_sasl_auth_clients = yes<br />
command_directory = /usr/sbin<br />
config_directory = /etc/postfix<br />
daemon_directory = /usr/lib/postfix<br />
debug_peer_level = 9<br />
debug_peer_list = 10.10.10.90<br />
defer_transports =<br />
disable_dns_lookups = no<br />
disable_mime_output_conversion = no<br />
html_directory = /usr/share/doc/packages/postfix/html<br />
inet_interfaces = all<br />
inet_protocols = all<br />
local_recipient_maps = mysql:/etc/postfix/local_recipients.cf<br />
mail_owner = postfix<br />
mail_spool_directory = /var/mail<br />
mailbox_size_limit = 0<br />
mailbox_transport = dbmail-lmtp:[127.0.0.1]:24<br />
mailq_path = /usr/bin/mailq<br />
manpage_directory = /usr/share/man<br />
masquerade_classes = envelope_sender, header_sender, header_recipient<br />
masquerade_exceptions = root<br />
message_size_limit = 10240000<br />
mydestination = $myhostname, localhost.$mydomain, mysql:/etc/postfix/local_domains.cf<br />
myhostname = mta-l-001.thissillydomain.com<br />
mynetworks = 127.0.0.0/8, 10.0.0.0/8 192.168.0.0/16, mysql:/etc/postfix/relay.cf<br />
mynetworks_style = subnet<br />
newaliases_path = /usr/bin/newaliases<br />
queue_directory = /var/spool/postfix<br />
readme_directory = /usr/share/doc/packages/postfix/README_FILES<br />
sample_directory = /usr/share/doc/packages/postfix/samples<br />
sendmail_path = /usr/sbin/sendmail<br />
setgid_group = maildrop<br />
smtp_sasl_auth_enable = no<br />
smtp_use_tls = yes<br />
smtpd_client_restrictions =<br />
smtpd_helo_required = no<br />
smtpd_helo_restrictions =<br />
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,check_relay_domains,reject_unauth_destination<br />
smtpd_sasl_auth_enable = yes<br />
smtpd_sasl_local_domain = $myhostname<br />
smtpd_sender_restrictions = hash:/etc/postfix/access<br />
smtpd_use_tls = no<br />
strict_8bitmime = no<br />
strict_rfc821_envelopes = no<br />
unknown_local_recipient_reject_code = 550</code></p>
<p><b>/etc/postfix/local_recipients.cf</b> (for local_transport_maps)<br />
<code>user = dbmail<br />
password = ******<br />
hosts = localhost<br />
dbname = dbmail<br />
table = dbmail_aliases<br />
select_field = alias<br />
where_field = alias</code></p>
<p><b>/etc/postfix/local_domains.cf </b>(for mydestination)<br />
<code>hosts = unix:/var/lib/mysql/mysql.sock<br />
user = dbmail<br />
password = ******<br />
dbname = dbmail<br />
query = SELECT substring(alias FROM locate('@',alias)+1) FROM dbmail_aliases WHERE alias LIKE CONCAT('%%',substring('%s' FROM LOCATE('@','%s')+1)) LIMIT 1</code></p>
<p><b>/etc/postfix/relay.cf </b>(for mynetworks/pop-before-smtp)<br />
<code>hosts = unix:/var/lib/mysql/mysql.sock<br />
user = dbmail<br />
password = ******<br />
dbname = dbmail<br />
table = dbmail_pbsp<br />
select_field = ipnumber<br />
where_field = ipnumber</code></p>
<p><b>/etc/postfix/master.cf</b><br />
<code>smtp      inet  n       -       n       -       -       smtpd<br />
pickup    fifo  n       -       n       60      1       pickup<br />
cleanup   unix  n       -       n       -       0       cleanup<br />
qmgr      fifo  n       -       n       300     1       qmgr<br />
rewrite   unix  -       -       n       -       -       trivial-rewrite<br />
bounce    unix  -       -       n       -       0       bounce<br />
defer     unix  -       -       n       -       0       bounce<br />
trace     unix  -       -       n       -       0       bounce<br />
verify    unix  -       -       n       -       1       verify<br />
flush     unix  n       -       n       1000?   0       flush<br />
proxymap  unix  -       -       n       -       -       proxymap<br />
smtp      unix  -       -       n       -       -       smtp<br />
relay     unix  -       -       n       -       -       smtp<br />
-o fallback_relay=<br />
showq     unix  n       -       n       -       -       showq<br />
error     unix  -       -       n       -       -       error<br />
discard   unix  -       -       n       -       -       discard<br />
local     unix  -       n       n       -       -       local<br />
virtual   unix  -       n       n       -       -       virtual<br />
lmtp      unix  -       -       n       -       -       lmtp<br />
anvil     unix  -       -       n       -       1       anvil<br />
scache    unix  -       -       n       -       1       scache<br />
maildrop  unix  -       n       n       -       -       pipe<br />
flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}<br />
cyrus     unix  -       n       n       -       -       pipe<br />
user=cyrus argv=/usr/lib/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}<br />
uucp      unix  -       n       n       -       -       pipe<br />
flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)<br />
ifmail    unix  -       n       n       -       -       pipe<br />
flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)<br />
bsmtp     unix  -       n       n       -       -       pipe<br />
flags=Fq. user=foo argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient<br />
procmail  unix  -       n       n       -       -       pipe<br />
flags=R user=nobody argv=/usr/bin/procmail -t -m /etc/procmailrc ${sender} ${recipient}<br />
retry     unix  -       -       n       -       -       error<br />
dbmail-lmtp     unix    -       -       n       -       -       lmtp</code></p>
<p><b>/etc/sasl2/smtpd.conf</b><br />
<code>pwcheck_method: saslauthd<br />
mech_list: plain login</code></p>
<p><b>/etc/pam.d/smtp</b><br />
<code>#%PAM-1.0<br />
auth     optional       pam_mysql.so user=dbmail host=localhost passwd=****** db=dbmail table=dbmail_users usercolumn=userid passwdcolumn=passwd crypt=1<br />
account  required       pam_mysql.so user=dbmail host=localhost passwd=****** db=dbmail table=dbmail_users usercolumn=userid passwdcolumn=passwd crypt=1</code></p>
<p><b>/etc/dbmail/dbmail.conf</b><br />
<code>[DBMAIL]<br />
driver               = mysql<br />
authdriver           = sql<br />
host                 =    localhost<br />
sqlport              =<br />
sqlsocket            =             /var/lib/mysql/mysql.sock<br />
user                 = dbmail<br />
pass                 =  ******<br />
db                   = dbmail<br />
table_prefix         = dbmail_<br />
encoding             = utf8<br />
default_msg_encoding = utf8<br />
sendmail              = /usr/sbin/sendmail<br />
TRACE_SYSLOG          = 3<br />
TRACE_STDERR          = 1<br />
EFFECTIVE_USER        = dbmail<br />
EFFECTIVE_GROUP       = dbmail<br />
BINDIP                = *<br />
NCHILDREN             = 2<br />
MAXCHILDREN           = 10<br />
MINSPARECHILDREN      = 2<br />
MAXSPARECHILDREN      = 4<br />
MAXCONNECTS           = 10000<br />
MAX_ERRORS            = 500<br />
TIMEOUT               = 300<br />
login_timeout         = 60<br />
RESOLVE_IP            = no<br />
logfile               = /var/log/dbmail.log<br />
errorlog              = /var/log/dbmail.err<br />
pid_directory         = /var/run<br />
state_directory       = /var/run<br />
[SMTP]<br />
[LMTP]<br />
PORT                  = 24<br />
[POP]<br />
PORT                  = 110<br />
POP_BEFORE_SMTP       = yes<br />
[IMAP]<br />
PORT                  = 143<br />
TIMEOUT               = 4000<br />
IMAP_BEFORE_SMTP      = yes<br />
[SIEVE]<br />
PORT                  = 2000<br />
[LDAP]<br />
PORT                  = 389<br />
VERSION               = 3<br />
HOSTNAME              = ldap<br />
BASE_DN               = ou=People,dc=mydomain,dc=com<br />
BIND_DN               =<br />
BIND_PW               =<br />
SCOPE                 = SubTree<br />
USER_OBJECTCLASS      = top,account,dbmailUser<br />
FORW_OBJECTCLASS      = top,account,dbmailForwardingAddress<br />
CN_STRING             = uid<br />
FIELD_PASSWD          = userPassword<br />
FIELD_UID             = uid<br />
FIELD_NID             = uidNumber<br />
MIN_NID               = 10000<br />
MAX_NID               = 15000<br />
FIELD_CID             = gidNumber<br />
MIN_CID               = 10000<br />
MAX_CID               = 15000<br />
FIELD_MAIL            = mail<br />
FIELD_QUOTA           = mailQuota<br />
FIELD_FWDTARGET       = mailForwardingAddress<br />
[DELIVERY]<br />
SIEVE                 = yes<br />
SUBADDRESS            = yes<br />
SIEVE_VACATION        = yes<br />
SIEVE_NOTIFY          = yes<br />
SIEVE_DEBUG           = no<br />
AUTO_NOTIFY           = no<br />
AUTO_REPLY            = no<br />
suppress_duplicates     = no</code></p>
<p>Good luck!</p>
]]></content:encoded>
			<wfw:commentRss>http://patchworkpsychology.com/2008/01/02/serious-neckpain-virtual-mail-hosting-with-postfix-and-dbmail/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pleading for Northern Ireland</title>
		<link>http://patchworkpsychology.com/2007/12/04/pleading-for-northern-ireland/</link>
		<comments>http://patchworkpsychology.com/2007/12/04/pleading-for-northern-ireland/#comments</comments>
		<pubDate>Wed, 05 Dec 2007 01:49:42 +0000</pubDate>
		<dc:creator>Hoss</dc:creator>
		
		<category><![CDATA[Art]]></category>

		<category><![CDATA[Change]]></category>

		<category><![CDATA[Life]]></category>

		<category><![CDATA[Music]]></category>

		<category><![CDATA[Natural]]></category>

		<guid isPermaLink="false">http://patchworkpsychology.com/?p=53</guid>
		<description><![CDATA[My heart bleeds as I try to rip it out of Ireland.  I&#8217;ve been here three weeks now, but that&#8217;s nearly irrelevant&#8211;I was attached in the first few days.
Tomorrow I&#8217;m taking a solo adventure to Belfast.  Perhaps I&#8217;ve romanticized Belfast to be something more than it is, but I&#8217;m stuck on it.  [...]]]></description>
			<content:encoded><![CDATA[<p>My heart bleeds as I try to rip it out of Ireland.  I&#8217;ve been here three weeks now, but that&#8217;s nearly irrelevant&#8211;I was attached in the first few days.</p>
<p><span id="more-53"></span>Tomorrow I&#8217;m taking a solo adventure to Belfast.  Perhaps I&#8217;ve romanticized Belfast to be something more than it is, but I&#8217;m stuck on it.  I want to live there.  I want to work there.  I want it.  But I can&#8217;t have it&#8211;and that perturbs me deeply.  At least I&#8217;ll be able to be with it one last time, just her and I, and I&#8217;ll walk her City Centre and at 4:47PM I&#8217;ll take the last train to Ballymoney from Great Victoria Street Station.  After that I&#8217;ll only see her again just long enough to get on the bus to Dublin and America.  I ache just thinking about it.</p>
<p>Even before the first week was out, I started getting my resume out and around Ireland.  From the best I can tell, most places aren&#8217;t interested in sponsoring me for a work permit.  I&#8217;ve chatted with a recruitment agency or two, and haven&#8217;t gotten too far.  If I were able to work in the UK, I would have no problem finding great paying work.</p>
<p>Sadly, the only way available to me to get a work permit is to get a job offer from a UK company and have them do the legwork to get a permit for me.  Had I completed my bachelor degree, I&#8217;d be a shoo-in for the UK&#8217;s Highly-Skilled Migrant Programme, which would allow me to go to the UK and find work.  That would be hot.  But since I&#8217;m still 55 credits short of a BS, that won&#8217;t work out.</p>
<p>At any rate, I think I&#8217;ve put myself out on the UK job market quite well, and a little bit on the Republic of Ireland also.  I guess I&#8217;m in a pretty good place when I can truly say that it&#8217;s completely in God&#8217;s hands right now.  It really is better for me to get back to the States and let the infatuation for Ireland wear off so I can actually reason through it.  If God wills it, an offer will come through.  Maybe in the mean time I can finish my degree.</p>
<p>All that silly work stuff aside, Ireland is the most beautiful place I&#8217;ve ever seen.  Take that with a grain of salt&#8211;I haven&#8217;t really seen much.  However, there is some amount of credence to my words.  Sometime in the first week I went to Portrush to check out a pub, and afterwards my party went down to the sea.  It was probably midnight, and the ocean was frustrated.  It wasn&#8217;t furious, just frustrated.  I stood on the beach and peered into my soul, it seemed, as I stared out into the blackness where the frigid water melted into the overcast sky.  I had no words in that moment, and I needed none.  The sea spoke ever word I might have needed.</p>
<p>This week we returned to the Giant&#8217;s Causeway.  The sea seems to have a profound effect on me.  Its incessant pummeling of the shoreline rocks is deeply, deeply inspirational.  I have to go back there. Friends, I miss it already.  I have to go back.  I have to.</p>
<p>PS: pictures are on Facebook</p>
]]></content:encoded>
			<wfw:commentRss>http://patchworkpsychology.com/2007/12/04/pleading-for-northern-ireland/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Oil Pastels</title>
		<link>http://patchworkpsychology.com/2007/09/12/oil-pastels/</link>
		<comments>http://patchworkpsychology.com/2007/09/12/oil-pastels/#comments</comments>
		<pubDate>Wed, 12 Sep 2007 17:43:59 +0000</pubDate>
		<dc:creator>Hoss</dc:creator>
		
		<category><![CDATA[Art]]></category>

		<category><![CDATA[Change]]></category>

		<category><![CDATA[Music]]></category>

		<category><![CDATA[Philosophy]]></category>

		<guid isPermaLink="false">http://patchworkpsychology.com/?p=52</guid>
		<description><![CDATA[I decided last night to pull out the sketch pad and oil pastels and flesh out some ideas I had for my upcoming EP.  I hadn&#8217;t really touched pastels in a serious way since elementary school, so it was a messy experience.  Thanks to some tips from roommate Mike, the product was much [...]]]></description>
			<content:encoded><![CDATA[<p align="left"><a href="http://patchworkpsychology.wordpress.com/?attachment_id=51"  rel="attachment wp-att-51" title="Dirty Oily Hands"><img src="http://patchworkpsychology.files.wordpress.com/2007/09/oil_hands.jpg" alt="Dirty Oily Hands" align="right" height="95" width="126" /></a>I decided last night to pull out the sketch pad and oil pastels and flesh out some ideas I had for my upcoming EP.  I hadn&#8217;t really touched pastels in a serious way since elementary school, so it was a messy experience.  Thanks to some tips from roommate Mike, the product was much more than I had hoped it could be.</p>
<p><span id="more-52"></span>This is my first real album, and so it&#8217;s mostly a new experience.  I don&#8217;t know what the heck I&#8217;m doing, but it doesn&#8217;t matter.  I don&#8217;t know what the heck I&#8217;m doing with most of life, and tackling that one moment at a time is what makes life come alive.  I guess that&#8217;s what this album is about in a way.</p>
<p>I&#8217;ve really been embracing the idea of my previous post.  In talking with friends, I&#8217;m learning how deeply rooted the bondage of premeditation of life is&#8211;and how widely-reaching the consequences are.  I think that I could mostly-correctly blame premeditation for many of the social ineptitudes that I think I have.  Perhaps the key is in the last four words of that sentence&#8211;&#8221;I think I have.&#8221;  I&#8217;m only troubled because I think I am.</p>
<p>At any rate, I&#8217;ve been writing songs.  Despite Scott&#8217;s advice (not that it&#8217;s bad advice), I&#8217;m not making an instrumental album this time around.  I will, and it will be awesome in its minimalism, but this is something I need to do right now.  I have to share these ideas, and right now my heart is pouring out with my voice more than my fingers.</p>
<p>I have three songs so far, so I&#8217;m about half-way.  I have no idea how good they are, but they come from deep inside, so whatever they are, they&#8217;re me.  I can&#8217;t wait to start arranging and recording.</p>
<p>But this post is about oil pastels.</p>
<p>I bought the pastels probably two years ago, thinking I could be an artist.  I thought about it way too much and came up with some junk that hearkened back to fifth grade.  So I packed &#8216;em up and didn&#8217;t look at them until yesterday.  I&#8217;m not sure how they didn&#8217;t get tossed out with the rest of the trash when I moved.</p>
<p>Really, when I was working on my idea, it was the same fifth-grade experience I had the last time I used pastels.  I knew that it was just going to be a really rough example of what I wanted, but it was worth it to get a visualization.  Then I did something unusual.</p>
<p>My roommate is a graphic designer.  He went to college for art.  He knows what he&#8217;s talking about.  Normally, for pride or whatever reason, I would shy away from consulting such a person who was my friend.  Perhaps I want them to think I&#8217;m awesome and can do anything or something.  Either way, I asked him for his thoughts on it&#8211;probably because I didn&#8217;t sit and premeditate the whole thing.  It made all the difference.</p>
<p>He said that when he last used pastels, he didn&#8217;t really rub (I had been rubbing the colors together and into the paper using my fingers) so much, but just used the pastels themselves to blend the colors&#8211;just pile up more and more oil until it&#8217;s there.  That seemed like a good idea, so I gave it a try.</p>
<p align="left"><a href="http://patchworkpsychology.wordpress.com/2007/09/12/oil-pastels/oily-workspace/"  rel="attachment wp-att-52" title="Oily Workspace"><img src="http://patchworkpsychology.files.wordpress.com/2007/09/oil_workspace.jpg" alt="Oily Workspace" align="left" height="119" width="182" /></a>Turns out that it&#8217;s pretty awesome.  In some ways it was less messy, but mostly it&#8217;s even more messy.  I love it.  I got oil everywhere, as you can kind of see in this picture.  It was definitely worth it.  Also note the extra items in this photo, including a <a href="http://www.sonofnels.com/"  title="Half Nelson">Half Nelson</a> disc (<em>Anomalism</em>) and a Jeremy Enigk disc (<em>Return of the Frog Queen</em>).</p>
<p align="left"> So blah blah blah, cool, awesome, etc.  Here&#8217;s what I have so far.  Imagine beneath the stars, in the field, the title of the album (which is yet to be decided) cut into the paper, just as the stars are (that&#8217;s why they&#8217;re so white&#8211;I scraped away the top fibers of paper that were saturated with oil.  It&#8217;s great.).</p>
<p align="left"><a href="http://patchworkpsychology.wordpress.com/2007/09/12/oil-pastels/album-art-medium-quality/"  rel="attachment wp-att-49" title="Album Art - Medium Quality"></a></p>
<p style="text-align:center;" align="left"><a href="http://patchworkpsychology.wordpress.com/2007/09/12/oil-pastels/album-art-medium-quality/"  rel="attachment wp-att-49" title="Album Art - Medium Quality"><img src="http://patchworkpsychology.files.wordpress.com/2007/09/oil_art_med.jpg" alt="Album Art - Medium Quality" height="305" width="403" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://patchworkpsychology.com/2007/09/12/oil-pastels/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Premeditated Life?</title>
		<link>http://patchworkpsychology.com/2007/08/29/premeditated-life/</link>
		<comments>http://patchworkpsychology.com/2007/08/29/premeditated-life/#comments</comments>
		<pubDate>Wed, 29 Aug 2007 06:16:52 +0000</pubDate>
		<dc:creator>Hoss</dc:creator>
		
		<category><![CDATA[Change]]></category>

		<category><![CDATA[Philosophy]]></category>

		<guid isPermaLink="false">http://patchworkpsychology.com/?p=47</guid>
		<description><![CDATA[I was tossing and turning just a minute ago, and yea [not yeah], I should be trying to sleep right now, but I had this idea and I just had to blog about it immediately (Katie, you know what I mean).  Actually this idea occurred to me last night while I was reading a [...]]]></description>
			<content:encoded><![CDATA[<p>I was tossing and turning just a minute ago, and yea [not yeah], I should be trying to sleep right now, but I had this idea and I just had to blog about it immediately (Katie, you know what I mean).  Actually this idea occurred to me last night while I was reading a somewhat gruesome story in the book <em>Velvet Elvis</em>.  The idea is that I spend more of my life imagining living than I do actually living.</p>
<p><span id="more-47"></span>Here&#8217;s a clipping from what I was reading.</p>
<blockquote><p>A young woman in our church gave birth last week to a two-pound baby who died the day after being born.  My friend Matt went into the hospital to visit them.  When he entered the room, he ralized the baby was still there.  And the couple was sitting in shock, stunned that this had hapened and happened to them.  Matt walked in, greeted the couple, and then took the baby in his arms and kissed it.</p>
<p><em>Velvet Elvis, page 75</em></p></blockquote>
<p>Yeah, it&#8217;s a little repulsive to think about. Perhaps that&#8217;s what stirred me to thinking.  I don&#8217;t know.  At any rate, here&#8217;s what I wrote in my journal just then.</p>
<blockquote><p>I was thinking just there how I would have no idea what I would do if I walked in on a couple whose 1/2 day old baby just died&#8230;<br />
My mind works in systems; I spend my days building systems so my mind can handle living life and I don&#8217;t have to.  These rare moments where I haven&#8217;t prefabbed a system are the moments when I&#8217;m truly living&#8230;</p>
<p>Yes, I should think about what I say before I say it.  Should I, though, premeditate every conversation?</p>
<p><em>Hoss&#8217;s Lyrics Moleskine #1</em></p></blockquote>
<p>As I become more aware of when I am premeditating life I can do something about it&#8211;but should I?</p>
<p>Quite often it&#8217;s about tough conversations for me:  I&#8217;ll writhe with whatever it is, whether it&#8217;s calling a friend out on something or asking a girl out (as if that happens often&#8211;perhaps the idea behind this blog entry is exactly why), for a while&#8211;usually when I want to sleep, then when I actually do have the convo, one of a few things happen:</p>
<ul>
<li>it goes just how I planned, and I have already lived it, so I am emotionless</li>
<li>it does not go how I planned and I am embarrassed</li>
</ul>
<p>I think that no matter what, with these situations that should require a little more of me to be present than usual, I&#8217;ve already lived it, so I&#8217;m detached throughout the whole thing.  Surely 5 minutes later my brain will turn back on and I&#8217;ll think of all of the stuff I should have said.  Surely.</p>
<p>It seems that this premeditation puts some undue stress on the whole situation.  Inside I&#8217;m worried that if it doesn&#8217;t happen like I planned it, then I&#8217;m in trouble because I&#8217;m not actually there&#8211;just my mind, all programmed up with the plan.  My consciousness is sitting behind the mirrored glass, watching the whole thing go down.  When it inevitably goes awry, I&#8217;ve got to run down there and try to fix things up.</p>
<p>Inevitably.</p>
<p>I don&#8217;t know how I convinced myself that I could plan my conversations out before even having them, but surely this has slowed me down.  Maybe I exaggerate a little&#8211;when you talk to me, it&#8217;s usually me that you&#8217;re talking to, not my pre-programmed message.  But I think all of the conversations that really matter that I had time to prepare for have been sadly wasted on my imagination.  I never really lived them beyond the theater in my head.  I&#8217;ve missed out on a lot!</p>
<p>The best I can do is take those thoughts captive as I recognize them.  I&#8217;m tired of living my life in my imagination.  I want to spend more time in reality, with people&#8211;who hopefully desire the same thing.</p>
]]></content:encoded>
			<wfw:commentRss>http://patchworkpsychology.com/2007/08/29/premeditated-life/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Not Light Like Honeydew</title>
		<link>http://patchworkpsychology.com/2007/08/27/not-light-like-honeydew/</link>
		<comments>http://patchworkpsychology.com/2007/08/27/not-light-like-honeydew/#comments</comments>
		<pubDate>Mon, 27 Aug 2007 18:31:05 +0000</pubDate>
		<dc:creator>Hoss</dc:creator>
		
		<category><![CDATA[Art]]></category>

		<category><![CDATA[Change]]></category>

		<category><![CDATA[Natural]]></category>

		<guid isPermaLink="false">http://patchworkpsychology.com/?p=46</guid>
		<description><![CDATA[Quotations of an excellent song by a somewhat well-know artist (mewithoutYou) aside, Saturday was a pretty cool day.  I woke up just after noon, did some baking, made a kick-butt salad, had a decent chat with a cool neighbor and learned I like the canceled TV series &#8220;Arrested Development&#8221;.  The baking was particularly [...]]]></description>
			<content:encoded><![CDATA[<p align="left"><a href="http://patchworkpsychology.com/?attachment_id=46"  title="Arrested Development"><img src="http://patchworkpsychology.files.wordpress.com/2007/08/6475600_2_23.jpg" alt="Arrested Development" align="right" height="93" width="115" /></a>Quotations of an excellent song by a somewhat well-know artist (mewithoutYou) aside, Saturday was a pretty cool day.  I woke up just after noon, did some baking, made a kick-butt salad, had a decent chat with a cool neighbor and learned I like the canceled TV series &#8220;Arrested Development&#8221;.  The baking was particularly interesting.</p>
<p><span id="more-46"></span>Perhaps it has something to do with moving into a new place, but I was inspired while making my grocery list this week to make some bread.  I like awesome bread, so I was looking for a pumpernickel recipe.  Interestingly enough, the key ingredients that transform normal rye bread into pumpernickel are molasses and cocoa.  I was a little surprised by that.</p>
<p>Bread making is not for the faint-of-heart, as they say&#8211;if you do it from scratch.  I didn&#8217;t want to be a poser of any sort, so I went the distance and did just that.  Basically, I had to mix all of the stuff together.  That&#8217;s a bit more tricky with a hand-powered beater.  I ended up resorting to a wooden spoon and finally just getting my hands into it once the dough started to become the consistency of dough.</p>
<p>Apparently I was then supposed to &#8220;turn the dough out onto a lightly floured surface&#8221; where I would then kneed the dough until it was &#8220;smooth and elastic&#8221;.  I hoped I would know what that meant when I got there.  However, I was foiled by the previous step of mixing in flour until the batter was &#8220;the consistency of a soft dough&#8221;, which I obviously had no idea of&#8211;when I plopped the dough onto my floured counter it stuck right on.  It was quite an adventure working that through, trying to mix in more flour, and cleaning out the bowl for the next step while having thick sticky dough webbed between my fingers.</p>
<p>Finally that was done, and my loaf was on the porch rising.  I was amazed when it actually did rise!  I though for sure I&#8217;d screw that up somehow.  But it seems a fairly resilient process, and despite my kitchen ineptitude the loaf rose.  &#8220;Punching down&#8221; the loaf was a new experience as well, and I don&#8217;t know if I did it right.  I don&#8217;t know if it can be done wrong.  All I know is that my loaves didn&#8217;t rise very much after I punched them down.  Maybe I waited too long before the punching phase?  That&#8217;s what I&#8217;m figuring.  If you have any input, please, let me know.</p>
<p>But the bread turned out pretty good, except for it&#8217;s flatness.  It&#8217;s a pretty dense bread, mostly because it didn&#8217;t rise as much as I wanted.  Perhaps my recipe alterations affected this as well:  I traded all of the &#8220;all-purpose&#8221; poop flour for whole-wheat flour.  Surely that contributed to its denseness!</p>
<p>Here&#8217;re a few photos from the experience.</p>
<p align="left"><a href="http://patchworkpsychology.com/?attachment_id=44"  title="Chef Hoss and his from-scratch flaxseed pumpernickel bread."><img src="http://patchworkpsychology.files.wordpress.com/2007/08/dsc00785_2.jpg" alt="Chef Hoss &amp; his homemade pumpernickel flaxseed bread" height="128" width="170" /></a></p>
<p align="left"> Chef Hoss and his from-scratch flaxseed pumpernickel bread</p>
<p align="right"><a href="http://patchworkpsychology.com/?attachment_id=45"  title="Just the bread."><img src="http://patchworkpsychology.files.wordpress.com/2007/08/dsc00788.jpg" alt="The bread." height="128" width="170" /></a></p>
<p align="right">Just the bread.</p>
<p>In general, it was a good experience. I’m excited to do it again…after the kitchen takes a good long break. Oh yeah, the chef, too.</p>
<blockquote><p><strong>Hoss&#8217;s Flaxseed Pumpernickel Bread</strong></p>
<p>Ingredients</p>
<ul>
<li>2 packages active dry yeast</li>
<li>1/4 cup cocoa</li>
<li>2 Tbsp sugar</li>
<li>some flaxseed</li>
<li>1 1/2 tsp salt</li>
<li>3 cup rye flour</li>
<li>2 cup water</li>
<li>1/4 cup molasses</li>
<li>1/4 cup butter</li>
<li>3 cupsish whole-wheat flour</li>
</ul>
<p>Directions</p>
<ol>
<li> Mix yeast, cocoa, sugar, flaxseed, salt, 2 cups rye flour in a large bowl and set aside.</li>
<li>Over low heat, combine molasses, water and butter and stir until butter is melted.</li>
<li>Beat molasses mixture into yeast mixture until well blended.  Blend in remaining cup of rye flour.</li>
<li>Blend in whole-wheat flour until the mixture is the consistency of a &#8220;soft dough&#8221;.</li>
<li>Turn dough out onto a lightly floured surface and knead until &#8220;smooth and elastic&#8221;.</li>
<li>Place dough ball in a greased bowl and turn over so that the entire ball is greased.</li>
<li>Cover bowl with a towel and let rise in a warm place until the dough has almost doubled in size, or approximately 3/4 to 1 hour.</li>
<li>Punch down dough and divide in half.  Let rest for 5 minutes, then form each half into a loaf and place at least 4 inches apart on a greased baking sheet.</li>
<li>Cover loaves and let rise until almost doubled again, or about 3/4 to 1 hour.</li>
<li>Diagonally slash each loaf crosswise three times.</li>
<li>Bake at 375 degrees Fahrenheit for 20 minutes.</li>
<li>Cover loaves loosely with foil and bake for another 15 minutes, or until loaves sound hollow when tapped.</li>
<li>Immediately remove from baking sheet.  Brush tops of hot loaves with butter.  Cool on racks.</li>
</ol>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://patchworkpsychology.com/2007/08/27/not-light-like-honeydew/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Skype Caveats</title>
		<link>http://patchworkpsychology.com/2007/08/23/skype-caveats/</link>
		<comments>http://patchworkpsychology.com/2007/08/23/skype-caveats/#comments</comments>
		<pubDate>Thu, 23 Aug 2007 17:42:24 +0000</pubDate>
		<dc:creator>Hoss</dc:creator>
		
		<category><![CDATA[Change]]></category>

		<category><![CDATA[Gripes]]></category>

		<category><![CDATA[Money]]></category>

		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://patchworkpsychology.com/?p=41</guid>
		<description><![CDATA[In a few moments of excitement for the upcoming Ireland tour, I bought a few Skype goodies, including a Skype Pro subscription and SkypeIn phone numbers in both Wisconsin and Belfast.  I got a little less than I had bargained for, unfortunately.
Skype has a few things figured out.  Their network makes calling places [...]]]></description>
			<content:encoded><![CDATA[<p>In a few moments of excitement for the upcoming Ireland tour, I bought a few Skype goodies, including a Skype Pro subscription and SkypeIn phone numbers in both Wisconsin and Belfast.  I got a little less than I had bargained for, unfortunately.</p>
<p><span id="more-41"></span>Skype has a few things figured out.  Their network makes calling places cheaper.  They connect people across the globe.  They do it for cheap.</p>
<p>They also have a few things that they need to get figured out a bit.  The day I bought all my Skype stuff, the entire Skype logon network crashed.  I bought this cool stuff, and I was locked out of it for a day-and-a-half.  Skype blames it on a Windows update.  Not impressive.</p>
<p>Then I see that when I call, I automatically lose 3 extra cents.  It&#8217;s not much, but I really need to increase my conversation length to make this effective.  There is a three cent connection fee.  I guess it&#8217;s not really a big deal, but my balance was dropping much faster than I had expected.  I will say that I was pleasantly surprised to see that all incoming calls are free&#8211;I guess that&#8217;s the American in me&#8230;I&#8217;m used to paying for my incoming phone calls.</p>
<p>And one last thing: outgoing caller ID <em>does not</em> work in the USA!  When calling in the UK, my Belfast number will show up, but when calling in the US, it simply shows as &#8220;Unknown Caller&#8221;.  There is no timeline on when Skype will finally support this.  We simply have to hope it&#8217;ll work sometime soon.</p>
<p>If I had it to do again, I wouldn&#8217;t spend on Skype.  They need to work out some of these silly bugs first.  Now that I&#8217;m committed for a year, plus I have a Skype wifi handset, I&#8217;m too invested to quit.  Dumb!</p>
]]></content:encoded>
			<wfw:commentRss>http://patchworkpsychology.com/2007/08/23/skype-caveats/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Goodbye Scrabble, Hello Europe</title>
		<link>http://patchworkpsychology.com/2007/08/22/goodbye-scrabble-hello-europe/</link>
		<comments>http://patchworkpsychology.com/2007/08/22/goodbye-scrabble-hello-europe/#comments</comments>
		<pubDate>Wed, 22 Aug 2007 18:35:24 +0000</pubDate>
		<dc:creator>Hoss</dc:creator>
		
		<category><![CDATA[Change]]></category>

		<category><![CDATA[Gripes]]></category>

		<guid isPermaLink="false">http://patchworkpsychology.com/?p=40</guid>
		<description><![CDATA[It&#8217;s been a fantastic past few weeks.  I&#8217;ve gotten plenty of time away from the cubicle, and I&#8217;m learning a lot about myself.  I&#8217;ve been writing music, finding faith, meeting people and losing weight.  Also, we traded Aer Lingus ~$1250 for three plane tickets to Ireland.  Sweet.
It&#8217;s enjoyable to have several [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a fantastic past few weeks.  I&#8217;ve gotten plenty of time away from the cubicle, and I&#8217;m learning a lot about myself.  I&#8217;ve been writing music, finding faith, meeting people and losing weight.  Also, we traded Aer Lingus ~$1250 for three plane tickets to Ireland.  Sweet.</p>
<p><span id="more-40"></span>It&#8217;s enjoyable to have several people come up and say, &#8220;Have you lost weight?&#8221; when you actually have.  It&#8217;s also enjoyable to have some people whose opinions matter complement your art.</p>
<p>It&#8217;s not enjoyable, however, to play scrabble.  <strong>At all.</strong>  Last week Katie and Scott picked up Travel Scrabble so that we could play whenever we&#8217;d have time.  It&#8217;s constructed quite well&#8211;you can pause mid-game, zip it up and easily resume without trouble at your next convenience.  The pieces all snap in and blah blah blah.</p>
<p>But Scrabble SUCKS!  I don&#8217;t know why, but Scrabble made me more bitter than the sum of anything either of my two travel companions have ever done. I think it started with Scott&#8217;s first word making him something like 62 points and mine equalling maybe 10.  I think I can&#8217;t deny that I have a competetive nature, and I pretty much felt shut out from the first move.  Every time I tried to muster the courage to look the adversity in the eye and believe that I could make a decent play, he&#8217;d make another 60 points with some word that completed three other EXTREMELY FAKE two-letter words.</p>
<p>And that&#8217;s the major gripe&#8211;Scrabble has further perverted the already bastardized English language to include words like &#8220;ef&#8221; (the sound of the letter &#8220;F&#8221;&#8211;properly spelled &#8220;eff&#8221;) and &#8220;de&#8221; (meaning from, probably in Latin or some other Romance language&#8211;but NOT English!).  Thusly I am crushed in a game where the ultimate object appears to be memorization of all of the fake words so that you can&#8230;.GAH!  I don&#8217;t even care.  Scrabble is a farce.</p>
<p>Ultimately I hope that there is simply not enough room in the luggage for travel scrabble to join us in Ireland.  I can&#8217;t imagine being held captive to that game for 8 hours over the Atlantic in an aluminum box.  I think it would negate even the most awesome experiences in Europe&#8211;especially when I&#8217;m faced with another 8 hours of death when returning.</p>
<p>That said, I&#8217;m excited to see Ireland, and maybe some other European destinations while we&#8217;re there.  Airfare to many destinations is pretty cheap once you get to Europe.  I think we each want to go somewhere different&#8211;I want to go to Prague, Katie wants to go to Paris (she&#8217;s such a girl), and Scott wants to go to Amsterdam.  I&#8217;d be OK with any of the destinations, but I do already have the quite sexy Moleskine City Notebook for Prague.  I guess I could get one of the others, but&#8230;but&#8230;</p>
<p>So until October, I&#8217;m pretty much stuck in my cubicle full-time, save a week of touring in Indiana, Ohio and Minnesota.  It&#8217;s for the best, though.  I need to stockpile about $1k-1.5k in my bank account for rent and loan paying.  I also need to accumulate another $1k-1.5k to make an EP before we go to Ireland.  Plus I need some cash to spend overseas.  Basically, I need to work <em>at least</em> full-time until we hit the road again in October.  Worth it?  You betchya.  Possible?  I hope so&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://patchworkpsychology.com/2007/08/22/goodbye-scrabble-hello-europe/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Off-the-cuff: Boot Camp, Parallels and Fusion</title>
		<link>http://patchworkpsychology.com/2007/08/02/off-the-cuff-boot-camp-parallels-and-fusion/</link>
		<comments>http://patchworkpsychology.com/2007/08/02/off-the-cuff-boot-camp-parallels-and-fusion/#comments</comments>
		<pubDate>Thu, 02 Aug 2007 17:11:34 +0000</pubDate>
		<dc:creator>Hoss</dc:creator>
		
		<category><![CDATA[Change]]></category>

		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://patchworkpsychology.com/?p=39</guid>
		<description><![CDATA[One of the last things I did before becoming a poor traveling musician was to spend part of my final salary paycheck on one more Windows-on-Mac product: VMWare Fusion.  My day job requires me to use some Windows apps (at least until Microsoft cranks out a Universal Binary version of Office this fall).  [...]]]></description>
			<content:encoded><![CDATA[<p>One of the last things I did before becoming a poor traveling musician was to spend part of my final salary paycheck on one more Windows-on-Mac product: VMWare Fusion.  My day job requires me to use some Windows apps (at least until Microsoft cranks out a Universal Binary version of Office this fall).  My free time requires me to run Windows in Boot Camp so I can play Battlefield 2.  I was tired of wasting precious harddisk real estate on two Windows installations.  So how to boot Boot Camp in Parallels or Fusion?</p>
<p><span id="more-39"></span>Well, much to my dismay, Parallels actually <em>does</em> boot the Boot Camp partition.  When I started with Parallels 2.5, it would not.  Apparently there was an update somewhere in there that enabled this.  Huh.</p>
<p>I guess it doesn&#8217;t matter&#8230;I&#8217;ve already shelled out for Fusion.  It was a hard deal to pass up&#8211;while Fusion is in beta, VMWare is offering half-off the retail price ($80&#8211;so $40 in the beta period).</p>
<p>Both solutions require you to set up Windows on Boot Camp first.  Boot Windows on Boot Camp, install the Apple driver disk, <em>then</em> try booting in the virtual environments.  With VMWare Fusion you have to wait a while for it to scan the partition before you see &#8220;Boot Camp partition&#8221; appear in the Virtual Machine Library.</p>
<p>I don&#8217;t remember exactly how it happens in Parallels, but it seems to me that it was more straight forward than Fusion.  Maybe not.</p>
<p>In both the first thing you&#8217;ll want to do is install the associated &#8220;Tools&#8221; package (&#8221;Parallels Tools&#8221; and &#8220;VMWare Tools&#8221;).  These packages allow the virtual environment to communicate with Windows and do things like adjust the screen resolution, switch the mouse between Mac and Windows and copy files between Mac and Windows.  In the case of using Boot Camp, the Tools utilities also handle any driver changes that need to happen when booting in the virtual environment rather than in Boot Camp.  This package is <strong>very</strong> important to keep your Boot Camp installation safe.</p>
<p>Here are a few thoughts I&#8217;ve had about these products&#8211;all of them are just off-the-cuff; I may have been doing something wrong, or maybe not.</p>
<ul>
<li>In the virtual environment, running Windows from Boot Camp seems to run slower than running Windows from a disk image.  There are a few theories for this, but my brief search didn&#8217;t yield anything useful.</li>
<li>Performance in Fusion is pretty lacking when set to the default single processor.  However, on the dual processor mode, it outperforms Parallels, even on the highest setting, at least in day-to-day operations.  Parallels doesn&#8217;t seem to have a place to get your hands dirty in their settings like Fusion.  I&#8217;ll have to keep looking.</li>
<li>At this time, Fusion&#8217;s &#8220;Unity&#8221; mode, which makes windows appear like they are directly in OS X (compare to Parallels&#8217;s &#8220;Coherence&#8221; mode) does not support multiple monitors.  It will only work on a single monitor.  In contrast, Parallels can support multiple monitors.  It&#8217;s a bit quirky, but it works.</li>
<li>Unity mode supports Expose much better than Coherence, though.  With Unity, each Windows window is displayed by itself in Expose. With Coherence, Expose just displays the entire Coherence work area.  It&#8217;s not as cool.</li>
<li>Fusion&#8217;s Unity mode also uses Mac OS minimize effects.  When you minimize a window, it&#8217;ll shrink down to the dock using whatever effect you have set.  With Coherence, it will disappear and possibly be accessible by a dock icon or option-tab, unless you&#8217;re using Witch.
     </li>
<li>In Coherence mode, clicking the Parellels icon in the dock will display the Start Menu just above the dock icon.  With Fusion, the Start Menu programs are listed in the menu bar or you can use the launcher window to start programs.  If you need the actual Start Menu you&#8217;ll need to switch back to window mode.</li>
</ul>
<p>Those are just a few things that I&#8217;ve noticed.  I&#8217;m working with Fusion 1.0RC1 (Build 50460) and Parallels 3.0 (Build 4560).  Probably there are settings that I don&#8217;t know about to tweak these difficulties.  Your mileage will vary.</p>
]]></content:encoded>
			<wfw:commentRss>http://patchworkpsychology.com/2007/08/02/off-the-cuff-boot-camp-parallels-and-fusion/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Going natural&#8230;</title>
		<link>http://patchworkpsychology.com/2007/08/01/going-natural/</link>
		<comments>http://patchworkpsychology.com/2007/08/01/going-natural/#comments</comments>
		<pubDate>Wed, 01 Aug 2007 18:13:30 +0000</pubDate>
		<dc:creator>Hoss</dc:creator>
		
		<category><![CDATA[Change]]></category>

		<category><![CDATA[Life]]></category>

		<category><![CDATA[Music]]></category>

		<category><![CDATA[Natural]]></category>

		<category><![CDATA[Philosophy]]></category>

		<guid isPermaLink="false">http://patchworkpsychology.com/?p=38</guid>
		<description><![CDATA[After going part-time at work (yeah, so much for paying off the student loans), I&#8217;ve been traveling more playing music with the Katie Nelson band.  I sure like not being at work, and since the rest of the trio is a bunch of health nuts, it became an excellent opportunity to take a look [...]]]></description>
			<content:encoded><![CDATA[<p>After going part-time at work (yeah, so much for paying off the student loans), I&#8217;ve been traveling more playing music with the Katie Nelson band.  I sure like not being at work, and since the rest of the trio is a bunch of health nuts, it became an excellent opportunity to take a look at a different lifestyle.</p>
<p><span id="more-38"></span>The first thing I did was to cut out soda altogether.  I&#8217;ve been drinking an average of 1.5 cans/day of the world-famous Mountain Dew since I was 12, and it shows.  Looking at my pilot&#8217;s medical certificates, I&#8217;ve been gaining about 20 lbs/3 years, or about 7 lbs/year since I graduated high school.</p>
<p>That change was made easier by increased water intake&#8211;and I mean increased.  Most doctors recommend 64 oz of water (1/2 gallon) per day.  However, this is an average.  An <em>average</em> person should drink 64 oz/day.  Any comments about &#8220;what exactly is an average person&#8221; aside, I&#8217;m not average.  I&#8217;ve read numerous articles that say a person should drink half of their body weight in ounces.  Being that I was 305 lbs, I guess that means somewhere around 150oz, or about 1.2 gallons&#8211;dang!</p>
<p>So those things were pretty cool&#8230;within a week I was noticing that I felt much better than I had in quite a while.  I was running to the restroom often, but I&#8217;d also read that that issue will resolve itself over time&#8211;and it pretty much has.  I also lost a few pounds of retained water.</p>
<p>There are also some other things.  One night while driving up to Peshtigo, I realized that I didn&#8217;t bring any soap or deodorant.  My bandmates promptly informed me that they used <em>neither</em> and hadn&#8217;t for some time.  Imagine my dismay, having come from a family where these were things essential to the day.  They recounted their journey to paraben freedom, and I listened critically.</p>
<p>I had to try it though.  Something about it just seemed right&#8211;soap bars don&#8217;t grow on trees.  Why would God create this body to require all of these chemicals to be socially acceptable?  Well anyway, I tried going soapless for a week, and I couldn&#8217;t tell the difference.  A nice warm shower was is all I really need to stay clean.</p>
<p>Deodorant was a different story.  The band spent a week at a nice conference center, where most of our time was spent wasting time on our Macs.  I decided that it was as good of a week as any to try to leave the deodorant behind&#8211;I was going to be in public maybe two hours each day.</p>
<p>Talk about unSure&#8211;my arms may as well have been glued to my sides.  I was so frustrated&#8211;even after a shower my pits were wretched!  I didn&#8217;t know what the deal was.  I figured it might be because I am losing weight or still flushing crap from my body.  I tried some natural enzymatic pit rub, but it made no difference.</p>
<p>Then while wasting time at work I stumbled across this video of some yahoo doctor who was talking about the risks and problems with the vast majority of deodorants.  His hippie-natural propaganda actually contained some good information, including this tip: try cleaning with alcohol to kill any stench causing bacteria.</p>
<p>It seemed weird, but at this point I was desperate to fit in with my band buddies that I decided to do it.  And lo, even after a day of moving my large furniture items across town, my pits smelled the same as any other part of me.  Success.</p>
<p>I&#8217;ll add on that I&#8217;ve also changed my eating habits.  I&#8217;m not calling it a diet for the sake of going on a diet, but it&#8217;s more of a lifestyle change.  I&#8217;ve been doing some research, and there is just a lot of crap that fast food and the like wants us to put in our bodies&#8211;or at least give them our money for.  I&#8217;ve realized that I don&#8217;t really want to put those things in me.  It&#8217;s more expensive to eat healthy, but it&#8217;s worth it.  I feel great, and on top of that I&#8217;m losing weight.  Best of all, I&#8217;m enjoying it.</p>
<p>If you&#8217;ve made it this far, kudos to you.  I offer this challenge:  examine your lifestyle and see what things you are doing because they&#8217;re all you know or you know no alternative, then see what you really think of those things.  Many of my routines had no reason other than &#8220;that&#8217;s what I&#8217;ve always done.&#8221;  Most of them were useless and bound me to consequences that were even more useless.</p>
<p>There&#8217;s little point in doing something if you don&#8217;t know why you do it, and there&#8217;s no good in continuing to do something if you know it does more harm than good.  I used to drink 1-2 cans of Mountain Dew per day because it tasted good&#8211;now I drink 1-2 gallons of water per day because it makes me healthy.</p>
]]></content:encoded>
			<wfw:commentRss>http://patchworkpsychology.com/2007/08/01/going-natural/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

