Splashy is a linux-boot graphical boot screen thinger. It aims to make your booting process into x11 more full of rounded corners and less of 1970’s terminal text streaking by.

Want to get rid of it? Well, make sure to purge it when you remove it, or your system will fail partway through the init scripts on the next boot. You won’t have x11 or networking or dbus. You will have a screen full of errors and a login prompt. So make sure you do:

sudo apt-get --purge remove splashy

However, if you already did just a apt-get remove splashy just like you’d do for any other package, and now your system suddenly won’t boot past 1980, what should you do? Kill the offending file.

sudo rm -ffffffffffffffff /etc/lsb-base-logging.sh

And reboot. Your system should come back up with networking and all. At this point you probably want to re-install splashy then re-remove it using the –purge option to get rid of all its last traces.

This is straight off GoDaddy’s FTP user password requirements for their shared linux hosting plans:

You must create a password for your account. This means that your password:

  • Must contain 7 to 14 characters.
  • Must contain at least one lowercase letter.
  • Must contain at least one uppercase letter.
  • Must contain at least one number.
  • Must begin with a letter.
  • Cannot contain the user name.
  • Cannot contain the following characters: question mark, space, caret, single quote, double quote, colon, backslash, dollar sign, ampersand, greater than, less than, tilde, semi-colon, or accent.

The result of these kind of password requirements is that your user has to come up with a new password, or a new variation on one of their existing passwords, just for your site.  Now in the perfect world, users would have a unique password for everywhere on the internet they have a login.  There are programs out there to help users do that.  But guess what.  People don’t use them.  For some good reasons too – like now a copy of your passwords, one way or another, are being stored somewhere that isn’t your brain.  Which is the whole idea – your password is something that only you can produce and you can do so anywhere anytime you need to.

So in reality, your users likely have somewhere between 10 and 100 logins across the internet. If they’re forced to try to remember a special username/password combo for your site – they won’t. They’ll write it down, and stick in their wallet. Or in the drawer next to their desk. Or in a plaintext file on their desktop. Which is about as secure as, well, putting something yummy in the snack room with a sign that says ‘yummy’.

When a hosting provider like GoDaddy does this kind of bad practice, it isn’t that big a deal. It just makes their FTP user base more likely to be compromised. Now when your bank does it (I believe all my banks do it at one level or another) it’s serious. This isn’t helping the security problem – it’s just passing the buck. Even though this makes the average user more vulnerable to attack, that’s no longer your bank’s fault. It was you who didn’t safely guard your 7 different usernames, 3 levels of passwords, and up to 5 variations on those different passwords for your various logins across the internet.  That’s what I’m up to: 7, 3 and 5. Now soon to be 6.

As a user, what do you guys use to manage all your usernames/passwords?  As a developer, what kind of restrictions do you apply for your users’ passwords and/or usernames?  Do you know of any standard set of password restrictions, or any standard algorithm for computing what constitutes a ‘good’ or a ‘weak’ password?

I’m no Rails expert, nor a Ruby expert, and this is only my second installation of Rails in 4 years, and my first on DreamHost.  So no promises.  But here are the steps I went through to get Rails working on DreamHost with MySQL.

  1. Set up a domain and directory. This where your Rails installation will live.  DreamHost’s preferred method of running Rails is now officially with Passenger (aka mod_rails) which they have on all their Apache 2 servers. You can use the DreamHost admin panel to set this up: go Domains->Manage Domains->Add New Domain/Sub-Domain and make sure to check off on “Ruby on Rails Passenger (mod_rails)”. If you plan on making ~/path/to/rails/root your root directory for your Rails installation, then you need set the web root directory to ~/path/to/rails/root/public when you add this domain using the DreamHost admin panel.

  2. Set up a database. You can do this through DreamHost’s admin panel as well.  Goodies->Manage MySQL->Create a new MySQL database.

  3. Set up Rails. Go to the directory you’re going to run your Rails installation out of (~/path/to/rails/root from step 1) and run:

    rails . -d mysql
    

    (Note the dot for ‘current directory’.)  This will create all the Rails directory structure and default starter files.

  4. Set the permissions. I’m not sure what the exact minimum possible permissions are to run Rails on DreamHost, but this created an acceptable situation for me for now: (note that I ran step 3 with a umask of 0027)

    find ./ -type d -exec chmod o+x {} \;
    find ./ -type f -exec chmod o+r {} \;
    chmod o-r config/database.yml
    

    You would absolutely want to lock these permissions down further if your application involved any sensitive data or services whatsoever. Leaving all your scripts world-readable allows any other DreamHost user to potentially scan your code and look for vulnerabilities.

  5. Do an intermediate test. At this point you should be able to navigate to your domain and see the Rails welcome page.  Note that the “About your application’s environment” link will not work in ‘production’ mode, DreamHost’s default. If things aren’t working, your friends are the logs in ~/logs/your.rails.domain.com/http and ~/path/to/rails/root/log.

  6. Set up the database connection. This involves editing the file config/database.yml.  DreamHost has its Virtual Hosts set up to default your Rails installation to run as ‘production’, but you can change this by setting ENV['RAILS_ENV'] in config/environment.rb.  Here’s a good way to do this automagically once you have development/staging/production sites all set up. After editing any of your Rails config files, you need to do:

    touch tmp/restart.txt
    

    to make sure Apache reloads the Rails config files on the next HTTP request.

  7. Test it. My test was to get the ’skeleton’ version of this project up and running by copying a few files into the Rails directory structure in the appropriate places.

Probability I find something wrong with these instructions in the next week or so?  ~80%.  I’ll update this post when I do.

Update:

Fyi, if you run the Webrick server in script/server, a DreamHost bot will auto email you telling you to please stop it:

From: DreamHost Policy Bot <support@dreamhost.com>
To: Michael Fogel <******@gmail.com>
Our automated system has come across the following activity under your account that is in violation of our Terms of Service.
We request that you take any necessary action to cease the activity as quickly as possible or we will be forced to take further action. If you were not aware of any such activity, please feel free to contact support and we can look into the issue further.

User **** running “ruby ./script/server”. This process is against our policies.

Please run ruby via cgi, not the built-in Webrick web server

They should add to this email a thinger about mod_rails being their preferred way to run Rails.

Update 2:

Ug, you can’t use HTTP Basic Auth with mod_rails (as of version 2.0.6). Note this is what DreamHost will set up for you if you use their web panel to set up authentication. Here’s a relatively simple if not elegant solution to the problem while we wait for mod_rails 2.1 to be released.

I got to say, the Internet, as a singular invention, just keeps climbing up that list of the ‘most important’ inventions of all time.  I expect in about 15 years time it’ll pass up electricity, the internal combustion engine and the printing press to take the number one spot.  Right about when some 90% of the earth’s population has high-speed wireless access (via your ‘phone’ more so than your laptop, though it’ll be a semi-hybrid of the two anyway) to the internet.

What will change when we hit that point?  Well, consider that:

  • The invention of writing effectively allowed humankind to ‘remember’ knowledge reliably for timescales longer than a generation.  That changed a lot.
  • The invention of the printing press effectively allowed groups of people to ‘discuss’ (mainly a one-to-many transmission) knowledge on the timescale of days to years, depending.  That arguably changed more.
  • The internet stands poised to allow 6+ billion minds to all digest and contribute to our collective body of thought – on the timescale of seconds.

Methinks that while I don’t know what change that last one will bring, I’m confident it’ll be solidly redonkulous.

This all makes a key assumption: that we’ll get to 90% global penetration of the Internet, in a form that’s still a relatively free, simple, and open communication, many-to-many style.  So are we really moving that way?  Well, this photo was taken last week in Siwa, an oasis some 300km out a not-entirely paved two lane dead-end road into the Egyptian Sahara desert by Libya.

internet access in siwa, middle of f-ing nowhere

It’s a little hard to see in between all the crumbling rubble – but the sign on that building in the lower left says (in arabic and english but not siwi) “Cafe” and “Net”.  Yup, free wifi with your foul.  We are definetely pushing those edges, we are pushing the Internet out to the edges of our civilization harder and faster than clean water or basic shelter.  And while that might not make a ton of sense – it sure is damn exciting.

This last month, blog.fogel.ca turned one.  Oh, how far we’ve came since we became self-aware in that basement internet cafe in La Paz, Mexico with an annoying international keyboard, a credit card, and a copy of putty.  We’ve now upgraded all the way to a regular cafe up in Menlo Park, 2nd biggest train-hating community in CA.  Oh boy!

So, I’d like to pay a quick salute to a year of full of travel and tech, cycling and cars, mexico and europe, rights and riots, stanford and cal, rants and rail, politics, oil, gay marriage, howto’s and whatever else was on the mind when the keyboard was dangerously near.  I hope it’s been as fun reading my electronic spewage as it has been expelling it.

And for better or for worse, a good stylesheet and some solid blogging software seems to give you a little assumed legitimacy in the internets these days. blog.fogel.ca has seen approx. 30x growth over the past year.  Weekday traffic these days surpasses that of the first few months.  Now if we can keep those trends up for just two more years….

up and to the right

A few musings about the past year and blog.fogel.ca:

  • Even though I don’t know jack about either, posts about cars and Mexico are the most popular.
  • Way, way too much traffic comes from searches for Mexican prostitutes and party favors.
  • And although it may be a big deal to me, apparently the internet just doesn’t care about the unprecedented success bike-to-work day was this year.  Only one lonely reader has ever (probably mistakenly) found themselves reading about commute hour bike traffic counts at the corner of Van Ness and Market.

Happy b-day blog!

CapsLock… who needs it?  If you’ve got a CapsLock problem, there is help.  Otherwise, if you happen to be an vi addict, then swapping CapsLock with ESC is pretty awesome since that Meta key is only rivaled by the space bar in terms of key presses per second.

Nowdays, a default Debian install with Gnome comes with a gnome-control-center capplet for gnome-keyboard-properties. If you go System->Preferences->Keyboard->Layouts->Layout Options->CapsLock Key behavior->”Swap ESC and CapsLock” then your ESC and CapsLock are swapped. More or less. I found a few problems with this on my T61p.

  • The little Thinkpad CapsLock LED does not do the swap.  It will toggle as you hit your new Meta (ESC) key, not your new CapsLock key.
  • Hibernation:  Depending on what combo of ESC and CapsLock are set when you initiate hibernation, when you come out of hibernation they can be in an inconsistent state.  The only GUI solution I’ve found to this is to reset my Keyboard Layout Options to the defaults, and then do the “Swap ESC and CapsLock” GUI chain again.  (No, I haven’t tracked this bug down and filed a report… I suspect it’s somehow unique to Thinkpads.)

Old skool to the rescue… Xmodmap.

Edit (create if non-existent) your ~/.Xmodmap file as follows:

! Swap Caps_Lock and Escape.
! see man xmodmap

remove Lock = Caps_Lock
keycode 0x9 = Caps_Lock
keycode 0x42 = Escape
add Lock = Caps_Lock

And restart your X session. Bam. The above two issues are solved.

I’ve made a few updates to the original AutoTracOnDreamHost.  They are:

  • Bumped up to Trac 0.11.2, just released last weekend.
  • The python version you use is now a config option in configure.inc – though Trac 0.11.2 proper requires python2.4, this is expected to be fixed in Trac 0.11.2.1.
  • If DH has installed setuptools on your machine, now AutoTracOnDreamHost doesn’t use it, as it may be too far out of date to install the latest and greatest mysqldb, genshi, or pygments.
  • Minor edits to the README.

Questions?  Bugs?  Please use the comments. Enjoy!

README:

AutoTracOnDreamHost: README

#################### LICENSE #####################

AutoTracOnDreamHost is free software: you can redistribute
it and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation, either
version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

http://www.gnu.org/licenses/gpl-3.0.html

#################### HowTo #######################

Preliminaries:

  1. Assuming you're going to use this with SVN, you need to already
     have an SVN repository setup and running.  The webserver needs
     to have at least read permissions to the repository.

  2. You need to have a complete domain/subdomain set up to use
     with trac or a subdirectory of an existing domain.

  3. A MySQL database ready to use with trac.  This doesn't have to
     be it's own database, but AFAIK, there is no good reason not
     to give each trac site it's own database.

  4. Trac 0.11.2.0 requires python 2.4, not 2.3.  Trac 0.11.2.1 (not
     out as of this writing) should fix this
     (http://trac.edgewall.org/ticket/7801).

  5. To avoid permission failings by apache, it's best to install this
     using the same user as you have apache doing it's cgi stuff under (If
     you didn't change anything from the dreamhost default - then you have
     only one user and you can ignore this step.)

Do once:

  1. Edit the configure.inc:

     - you probably want the latest and greatest of Trac, Genshi,
       MySQLDB, and Pygments.  Minor version releases of these
       shouldn't break this script.
     - alter the trac directory structure to your liking, or just
       run with my setup.

  2. Run the backend.sh.  This will set up all the parts of trac that
     are shared between all your trac sites (even if you have only one).

Do once per trac site:

  1. Run the site.sh.  This script will query you for details about
     the configuration of your database, your directory structure,
     svn repository, an admin trac user etc.

  2. Test it! Go to your new trac url and log in, browse the svn
     repository, create a dummy ticket etc.

#################### Help Me! ####################

I'll post about any major updates or known bugs on my blog.
http://blog.fogel.ca  In event of enough interest in these
scripts, I'll set up a public repository for it so we can
all contribute.

If you find any major bugs or want to submit a patch, you can
email me which is my first name (mike) at my domain (fogel.ca).
Requests for personalized help will be answered in the limit
of infinite free time, which I don't have, so no promises.

Elsewise, the best conglomeration of information about Trac
on DreamHost AFAIK is currently at on the DreamHost wiki.
http://wiki.dreamhost.com/Trac

##################################################

configure.inc:

# AutoTracOnDreamHost: configure.inc
# Released under GLPv3. http://www.gnu.org/licenses/gpl-3.0.html
# Copyright 2008 Michael Fogel. http://fogel.ca

# Abort on any errors
set -e

PYTHON_VERS=2.4
TRAC_VERS=0.11.2
GENSHI_VERS=0.5.1
MYSQLDB_VERS=1.2.2
PYGMENTS_VERS=0.11.1

# trac dir structure
TRAC_ROOT="${HOME}/trac"
PKG=${TRAC_ROOT}/packages
EGG=${TRAC_ROOT}/egg_cache
INSTALL=${TRAC_ROOT}/install
SITES=${TRAC_ROOT}/sites
SVN=${HOME}/svn
TRAC_SITE_PACKAGES=${PKG}/lib/python${PYTHON_VERS}/site-packages
TRAC_HTDOCS=${TRAC_SITE_PACKAGES}/Trac-${TRAC_VERS}-py${PYTHON_VERS}.egg/trac/htdocs

EXP_CMD1="export PYTHONPATH=$TRAC_SITE_PACKAGES"
EXP_CMD2="export PYTHON_EGG_CACHE=$EGG"
EXP_CMD3="export LD_LIBRARY_PATH=$PKG/lib"
EXP_CMD4="export PATH=$PKG/bin:\$PATH"

cat <<OutputDreamTracInstallReminder

==== Put the following in your ~/.bash_profile ====
Where trac/packages=PKG
$EXP_CMD1
$EXP_CMD2
$EXP_CMD3
$EXP_CMD4
===================================================

OutputDreamTracInstallReminder

# modify those env vars for the duration of this script too.
$EXP_CMD1
$EXP_CMD2
$EXP_CMD3
if [[ "$PATH" != *"$PKG/bin"* ]]; then export PATH=$PKG/bin:$PATH; fi

# Update version information here and DIRs below.

TRAC=http://ftp.edgewall.com/pub/trac/Trac-${TRAC_VERS}.tar.gz
GENSHI=http://ftp.edgewall.com/pub/genshi/Genshi-${GENSHI_VERS}.tar.gz
SETUPTOOLS=http://peak.telecommunity.com/dist/ez_setup.py
MYSQLDB=http://switch.dl.sourceforge.net/sourceforge/mysql-python/MySQL-python-${MYSQLDB_VERS}.tar.gz
PYGMENTS=http://pypi.python.org/packages/source/P/Pygments/Pygments-${PYGMENTS_VERS}.tar.gz

TRACDIR=Trac-${TRAC_VERS}
GENSHIDIR=Genshi-${GENSHI_VERS}
MYSQLDBDIR=MySQL-python-${MYSQLDB_VERS}
PYGMENTSDIR=Pygments-${PYGMENTS_VERS}

#### function getInupt - used primarily in site.sh #####
# arg 1: message
# arg 2: initial value
function getInput {
  MES="$1"
  eval "VAL=\$$2"
  echo ""
  echo "Press enter to accept the current value, or input a new value."
  TMP="$VAL"
  while [[ -n "$TMP" ]]; do
    VAL="$TMP"
    echo "$MES: $VAL"
    read TMP
  done
  echo "Using $MES: $VAL"
  eval "$2=\"$VAL\""
}

backend.sh:

# AutoTracOnDreamHost: backend.sh
# Released under GLPv3. http://www.gnu.org/licenses/gpl-3.0.html
# Copyright 2008 Michael Fogel. http://fogel.ca

source ./configure.inc

echo -e "\n==== Creating need dir structure ===="
[ ! -d ${PKG} ] && mkdir -p ${PKG}
# the egg_cache dir must be writable by your apache cgi/python user
[ ! -d ${EGG} ] && mkdir -p ${EGG} && chmod 770 ${EGG}
[ ! -d ${INSTALL} ] && mkdir -p ${INSTALL}
[ ! -d ${SITES} ] && mkdir -p ${SITES}

echo -e "\n==== Retrieving installation files ===="
cd ${INSTALL}
[ ! -f ${TRACDIR}.tar.gz ] && wget ${TRAC}
[ ! -f ${GENSHIDIR}.tar.gz ] && wget ${GENSHI}
[ ! -f ${MYSQLDBDIR}.tar.gz ] && wget ${MYSQLDB}
[ ! -f ${PYGMENTSDIR}.tar.gz ] && wget ${PYGMENTS}
[ ! -f ez_setup.py ] && wget ${SETUPTOOLS}

echo -e "\n==== Installing Setup Tools ===="
#Create site-packages directory. Script will fail without it.
mkdir -p ${TRAC_SITE_PACKAGES}
cd ${INSTALL} && python ez_setup.py --prefix=${PKG}

echo -e "\n==== Installing Pygments ===="
cd ${INSTALL} && tar xzf ${PYGMENTSDIR}.tar.gz
cd ${PYGMENTSDIR} && python setup.py install --prefix=${PKG}

echo -e "\n==== Installing MYSQLdb ===="
cd ${INSTALL} && tar xzf ${MYSQLDBDIR}.tar.gz
cd ${MYSQLDBDIR} && python setup.py install --prefix=${PKG}

echo -e "\n==== Installing Genshi ===="
cd ${INSTALL} && tar xzf ${GENSHIDIR}.tar.gz
cd ${GENSHIDIR} && python setup.py install --prefix=${PKG}

echo -e "\n==== Installing Trac ===="
cd ${INSTALL} && tar xzf ${TRACDIR}.tar.gz
cd ${TRACDIR} && python setup.py install --prefix=${PKG}
mkdir -p ${PKG}/share/trac
cp -fr ${INSTALL}/${TRACDIR}/cgi-bin ${PKG}/share/trac

echo -e "\n==== Setting permissions for Trac htdocs ===="
DIR=${TRAC_HTDOCS}
while [ "$DIR" != "$HOME" ]; do
  chmod o+x $DIR
  DIR=`dirname $DIR`
done
find ${TRAC_HTDOCS} -type d -exec chmod 751 {} \;
find ${TRAC_HTDOCS} -type f -exec chmod 644 {} \;

echo -e "\n==== Backend install complete ===="

site.sh:

# AutoTracOnDreamHost: site.sh
# Released under GLPv3. http://www.gnu.org/licenses/gpl-3.0.html
# Copyright 2008 Michael Fogel. http://fogel.ca

source ./configure.inc

# Prompt for project parameters, with defaults
PROJECT=somesvnproject;         getInput "Subversion Project ID"  PROJECT
DOMAIN=trac.somedomain.com;     getInput "Domain for Trac"        DOMAIN
DOMAINDIR=${HOME}/http/$DOMAIN; getInput "Path for domain root"   DOMAINDIR
TRACPATH=/trac;                 getInput "Relative Path for Trac" TRACPATH
MYSQLHOST=mysql.$DOMAIN;        getInput "MySQL hostname"         MYSQLHOST
MYSQLUSER=trac_username;        getInput "MySQL username"         MYSQLUSER
MYSQLPASSWD=trac_password;      getInput "MySQL password"         MYSQLPASSWD
MYSQLDBNAME=trac_$PROJECT;      getInput "MySQL DB name"          MYSQLDBNAME
TRAC_USER=admin;                getInput "Trac Admin username"    TRAC_USER
TRAC_PASSWORD=password;         getInput "Trac Admin password"    TRAC_PASSWORD

# confirm those values
echo "Please confirm the values you entered:"
echo "PROJECT:${PROJECT}"
echo "DOMAIN:${DOMAIN}"
echo "DOMAINDIR:${DOMAINDIR}"
echo "TRACPATH:${TRACPATH}"
echo "MYSQLHOST:${MYSQLHOST}"
echo "MYSQLUSER:${MYSQLUSER}"
echo "MYSQLPASSWD:${MYSQLPASSWD}"
echo "MYSQLDBNAME:${MYSQLDBNAME}"
echo "TRAC_USER:${TRAC_USER}"
echo "TRAC_PASSWORD:${TRAC_PASSWORD}"
echo "Look good?"
lookingGood=Yes;
getInput "Looking good? 'Yes' to continue, all else to quit." lookingGood
[ "$lookingGood" != "Yes" ] && exit 1;

# Vars for this site
WEBDIR=${DOMAINDIR}/${TRACPATH}
INDEX_CGI=${WEBDIR}/index.cgi
TRACINI=${SITES}/${PROJECT}/conf/trac.ini
HTACCESS=${WEBDIR}/.htaccess
HTPASSWD=${WEBDIR}/.htpasswd
NAME="Trac: ${DOMAIN}${TRACPATH}/"

echo "Setup site"
if [ ! -d ${SITES}/${PROJECT} ]; then

  #Setup Trac Environment for MySQL
  ${PKG}/bin/trac-admin ${SITES}/${PROJECT} \
    initenv ${PROJECT} \
    "mysql://${MYSQLUSER}:${MYSQLPASSWD}@${MYSQLHOST}/${MYSQLDBNAME}" \
    svn \
    ${SVN}/${PROJECT};

  # set admin user to premissions
  ${PKG}/bin/trac-admin ${SITES}/${PROJECT} \
  permission add $TRAC_USER TRAC_ADMIN
fi

echo "Make Trac Web Accessible"
# Make Trac Web Accessible
mkdir -p ${WEBDIR}
chmod 751 ${WEBDIR}

if [ -f "${INDEX_CGI}" ]; then
  rm ${INDEX_CGI}
fi
echo "#!/bin/bash" >> ${INDEX_CGI}
echo "export HOME=\"/home/${USER}\"" >> ${INDEX_CGI}
echo "export TRAC_ENV=\"$SITES/${PROJECT}\"" >> ${INDEX_CGI}
echo "$EXP_CMD1" >> ${INDEX_CGI}
echo "$EXP_CMD2" >> ${INDEX_CGI}
echo "$EXP_CMD3" >> ${INDEX_CGI}
echo "$EXP_CMD4" >> ${INDEX_CGI}
echo "exec $PKG/share/trac/cgi-bin/trac.cgi" >> ${INDEX_CGI}
chmod 755 ${INDEX_CGI}

# logo in trac.ini
sed -i "s/^alt = .*$/alt = trac_banner.png/" ${TRACINI}
# some fancy sed to escape forward slashes... simplier patches are welcome.
TRACPATH_S=`echo ${TRACPATH} | sed -e "s/\/$//" -e "s/\//\\\\\\ \//g" -e "s/ \//\//g"`
sed -i "s/^src = .*$/src = ${TRACPATH_S}\/chrome\/common\/trac_banner.png/"${TRACINI}

#Pretty URLs
mkdir -p ${WEBDIR}/chrome
chmod 751 ${WEBDIR}/chrome
ln -sf ${TRAC_HTDOCS} ${WEBDIR}/chrome/common

# .htaccess fun
if [ -f ${HTACCESS} ]; then
  rm ${HTACCESS}
fi

touch ${HTACCESS}
chmod 644 ${HTACCESS}

echo "AuthType Basic" >> ${HTACCESS}
echo "AuthUserFile ${HTPASSWD}" >> ${HTACCESS}
echo "AuthName '${NAME}'" >> ${HTACCESS}
echo "require valid-user" >> ${HTACCESS}
echo "" >> ${HTACCESS}
echo "DirectoryIndex index.cgi" >> ${HTACCESS}
echo "Options ExecCGI FollowSymLinks" >> ${HTACCESS}
echo "" >> ${HTACCESS}
echo "" >> ${HTACCESS}
echo "RewriteEngine On" >> ${HTACCESS}
echo "RewriteCond %{REQUEST_FILENAME} !-f" >> ${HTACCESS}
echo "RewriteCond %{REQUEST_FILENAME} !-d" >> ${HTACCESS}
echo "RewriteRule ^(.*)\$ ${TRACPATH}/index.cgi/\$1 [L]" >> ${HTACCESS}
echo "" >> ${HTACCESS}

#Create .htpasswd file for trac admin with password
htpasswd -bc ${HTPASSWD} $TRAC_USER "$TRAC_PASSWORD"

# Note: on DreamHost you avoid a world-readable htpasswd file by
# setting one up via panel.dreamhost.com->Goodies->Htaccess/WebDAV.
# This will make htpasswd and htaccess files (overwriting anything
# that's there) that has group dhapache, is group readable, and
# the apache user is in the dhapache group.  Baring this, you need
# to make your htpasswd file word-readable (or email support for
# some chgrp action as root)
chmod 644 ${HTPASSWD}

echo ---------- SITE INSTALL COMPLETE! ----------

The worst part about being proficient with vi is when you use anything else.  It’s all annoyingly slow to have to move your fingers away from the home position, or (gasp) move your whole hand off the keyboard to use the mouse.  The user’s hands/fingers are the bottleneck for this whole human-computer interaction thing.  We want to remove as much complexity as practical from that task to speed the whole process up.

VIMperator does just that.  Highly recommended.

:o fivethirtyeight.com
ctrl-d
ctrl-d
k
ctrl-u
/obama predicted victory margin
/mccain antidepressants
j
j
:q

See, I’m getting more productive already!

At some point, this just starts getting ridiculous.  Wifi access, anyone?

wifi networks

Yup, you’ll notice that 1200 vertical pixels isn’t enough to even display them all.  A little iwlist wlan0 scan reveals 32 networks in range.  Talk about redundant access.  80% of these likely funnel through the same 3 or 4 bottlenecks a few hops up anyway.  But, I have to say… 32 networks?  Sweeeeeet!

Taken at the intersection of Cowper and University, Palo Alto, at Gyros and Gyros, sitting and enjoying a lamb & beef gyros – inside.

Best name for a Wifi network ever: MyLawsuit.  lol! Only topped by… MyDivorce.

My new T61p shipped with this awesome beep that would go off whenever the power state changed. Beep when it comes out of hibernation. Beep when you plug it in. Beep, beep beep beeeeppppp…. annoying & embarrassing.  I’ve been generally very pleased with my T61p, but seriously, how does a default setting like that get out the door?  And seriously, why did it take two months before I found the time to figure out how to change it?

Let’s turn it off!

  1. It’s a bios beep.  During startup press F1 to get into the bios ulitity (alternatively, press the ‘Blue ThinkVantage Button’ and then press F1 at the first menu.
  2. Config->Alerts and just disable them all.  No more beeps!
  3. Save and Exit.