Lessons Learned for Lightweight Travel to Europe

Now that my Europe trip has ended, I need to leave a note of things I wish I had done better, both travel-wise, and the stuff I brought along.

I like to travel light, and find it a little comical when I see people struggling with giant 70L backpacks; I always do carry-on, no matter for a two week trip, or two months. (This means my packs have to weigh less than 7KG). Even in winter it is possible to pack light. The trick seems to be only packing what one will use regularly, with no duplicates, of appropriate size, and hopefully reusable for other purposes. Don’t pack anything you would be gutted if it broke.

The lessons below are not just to pack light, but also to reduce stress. Some really only apply to me for next time :) This is not a howto list on packing light for travel, just a few things I need to do better for next time.

Electronics
Only bring electronic devices that can be charged by USB, which leads me to my next point…

Look on eBay for a USB charger that has multiple inputs (make sure it has enough amps if you are charging certain phones). It became a hassle trying to charge four or five devices using just one USB charger. The charger, if going to Europe, should have room to accept a ground, or be able to get around the ground plug used in many places. In other words, get one like (broken old link) not like (another broken link) (basically, not like any of the block ones from eBay). Once again, try to get a 4-port one with travel adaptors included.

I’m going to consider not bringing my Kindle next time, but instead bring one paperback book. The weight might be about the same. I might not even bring a book - less stuff to break or get wet. I don’t do much reading on my travels anyway, instead writing in a journal or finding out what to do next.

Get an Eye-Fi or be able to read a USB stick with my phone. I need to figure out a way to backup photos from my camera to the cloud every night using only my phone (if the hotel has free wi-fi). Sorry if you are the guest next door…

Going Light

Don’t bring jeans, or bring only one nice pair of pants for semi-formal situation. I have to admit, I almost never wore my jeans. After only wearing them once or twice they would get wet, dirty, and/or smelly, so I would be forced to wear my Columbia hiking pants over and over! The pants are not particularly stylish, especially in European cities, but they are reasonable warm, repel water, dry quickly, and are exceptionally light. After weeks of abuse they didn’t smell, or look dirty, somehow. I’m a bit of a Columbia fan…

Try to find one pair of shoes that are ergonomic and athletic enough for walking 20KM/day, or on a trail, but also stylish enough to go into a nice restaurant and not draw too much attention. And dry quickly. I don’t really have any suggestions, since I’m still looking, but I’m certainly never going to put my Allen Edmonds in a backpack.

Bring cotton undershirts instead of normal shirts for winter travel. I never ended up wearing a t-shirt on the outside, so the shirts were basically just used to keep the rest of my clothing clean. I may look into undershirts that wick better than cotton.

Replace my money belt with something. It is just uncomfortable. I am trying to find an alternative, maybe something that goes over the shoulder instead. I only need something for my passport.

My fingerless gloves worked really well, because I could still use my mobile phone without taking off my gloves.

Staying Clean and Healthy

Bring two large dry bags for dirty clothing, a dry bag for larger electronics, a dry bag for electronic cords/cables/chargers, and a dry bag for lotions and creams. Or get indestructible bags. The zip-loc bags I brought all had holes within the first few days of travel, spewing my cables everywhere. The corners on any bottle tears straight through them. I have since bought some Loksak bags, and a year later they are still holding up.

Bring more vitamins, both Multi and C, especially if in winter. A tube from an energy capsule mix would work well to store them in, or Vitamin C fits well into a Tic-Tac container. Only bring enough pills that you need. For instance, I usually only bring two pills of Gastro-Stop, because that stuff works maybe too well. Also, vitamins were really inexpensive in parts of Europe compared to most places I have lived.

Long Johns next time I travel in winter and it looks to go below 0C. I were OK, but that extra layer would have been nice.

Buy a Mach 3 as soon as possible. I tried shaving in Prague before the opera with a normal three blade razor, and it was horrible. I had to use an entire pack just to see skin, and even then had little patches of hair that I couldn’t get. I’m never making that mistake again. Alternatively, I’m thinking of getting a portable Sanyo electric razorthat I saw my dad use when I were in New Zealand.

RELATED: I have added a similar entry on my recent trip to Nepal (12/2012).

Lessons Learned: Losing Parts

I don’t know how many times I’ve lost tiny parts and had to spend time trying to find them. I realized after removing the back of my monitor that I’m starting to learn from those mistakes; instead of just sticking the screws in a box with other screws, and then having to dig them out, I taped them to the back of the monitor.

This sounds small, but after doing it I realised how many times I had to hunt through a box of screws trying to find the exact one that fit. Lesson learned.

Destroying Hard Drives

If you’re like me there is a box of hard drives sitting in a dusty corner somewhere. Some are mine, some are others’, but they are all in a failed or semi-failed state. So, why have I lugged them around? I’ve been a bit paranoid about throwing them away. Some of the hard drives are encrypted, others aren’t, and the drives from friends certainly aren’t. Although the chances of somebody getting the drive from a landfill and restoring it is minimal, I never wanted to take the chance.
So, I kept lugging a bag of drives through each move.
My friend Clinton has recently returned from Europe, and he brought me a gift: a Swiss-made Victorinox, the ‘CyberTool’. After playing with it for several minutes I noticed it came with a Torx 8, 10 and 15 bit. This was a reminder that one method of mostly disabling a hard drive is to destroy the platters.
Other methods I have heard are to use a hammer and nails - which I unfortunately don’t have in our tiny apartment. Whilst finishing Dexter I started pulling apart the box of hard drives, and it surprisingly didn’t take long to disable them.
Step 1: Remove Torx screws

Hint: Don’t forget the screw covered under the paper.
Step 2: Use a flathead and pop off the cover

Step 3: Stare at the shiny platters

Step 4: Scratch platters with flathead, and bend platters if possible

Step 5: Dispose of bits and pieces

Warning! The CyberTool didn’t have a Torx small enough to open the 2.5" hard drives, but I could just use a pair of pliers to lift up the cover and jam a flathead in there. However, and here’s the warning, 2.5" platters are sometimes not made of metal. I forgot about this on the third 2.5" hard drive and covered the desk I share with YS with shards of glass.

Fusion Tables and 131500 Stops

A short while ago I wrote about visualizing transport by using 131500’s TDX data, converted to GTFS, and served by GeoServer. Because I’ve started playing around with Google’s Fusion table, I thought it would be interesting to see what all the transit stops in Sydney look like in FT. So, voila!

Reload a Cisco Router WIthout Worry

Recently I tried editing my Cisco’s ACL at home on the train. It went something like this:

  • I logged in
  • I started updating the ACL
  • I hit a blackspot in my 3g coverage
  • My command stops at “router(config)#access-”
  • I get an alert saying my home internet was down

Although it is simple enough to just ask her to “flip the switch on the black box”, I still don’t like doing it. Plus, if she’s not home, I’m stuck. This accident immediately reminded me of one of a trait of the ‘reload’ command: it can be scheduled.

In the case of updating a device remotely, it is as easy as:

router# reload in 2
router# conf t
router(config)# [type in desired commands]
router(config)# exit
router# reload cancel

If the commands are entered in fine, then cancel the reload. If there is a problem, then the router will reboot and resort to the startup config.

Converting GTFS to GraphServer

If you want to use Graphserver to do some analysis with GTFS, you will need to convert GTFS into the database. This is how I did it.

Get an appropriate AMI from Amazon’s EC2

I used the following AMI. If you have enough memory, you don’t need to do this.

ami-7000f019

Lookup and read the GTFSDB INSTALL.txt document

Prepare system

sudo apt-get install mercurial
hg clone https://gtfsdb.googlecode.com/hg/ gtfsdb
sudo apt-get install python-setuptools
sudo easy_install psycopg2
sudo apt-get install build-essential

Download GTFS database

ubuntu@domU-12-31-39-00-5D-B8:/mnt/gtfsdb$ pwd
/mnt/gtfsdb
sudo python setup.py install
sudo wget http://cdn.kelvinism.com/google_transit.zip
sudo apt-get install python-psycopg2

EDIT 16-03-2025: I’ve since removed these files.

Prepare configuration file

#default.cfg
[options]
create = True
database = postgresql://nsw:[email protected]:5432/nsw
filename = /mnt/google_transit.zip
geospatial = True
#schema = None

Perform import

screen
python gtfsdb/scripts/load.py

Visualizing Transport

I’ve had several conversations with neighbors and co-workers about the “lack” of forward thinking, or at least the lack of forward action. Of course, I keep in the back of my mind that we aren’t “experts”, and the more I learn about transport the more I learn how complex it is. Dr. Sussman’s CLIOS process (Complex, Large-
Scale, Integrated, Open Systems) appears more and more true the longer I work in and study transport. There is a plethora of excuses that can be made, but the general conclusion was that the earlier we prepare the better. I can remember working near Zhongshan 7-8 years ago and driving around on huge roads in the middle of empty fields. There weren’t even stoplights at every intersection. It was then that I had an epiphany of how smart the planning was to build the infrastructure before the masses arrived.

Sydney is estimated to increase by some 1.7 million people by 2036, and I can tell you, from a transportation (private and public) standpoint, that sort of scares me. When people ask me why transport is so difficult I justify it by with my uneducated guess that the CBD is next to the ocean, so everybody travels in from just 180 degrees instead of 360. Maybe this is why the NSW government created the “City of Cities” strategy. I realized this within the first few weeks: most people live west but work east.

Tonight (a Saturday) I was bored, and should have been studying, but wanted to create a few visualizations first.

The below maps were created using TDX data released from 131500. After converting it to GTFS I imported it into PostGIS using GTFSDB, and then could serve it via GeoServer. Finally, I could access it via WMS in QGIS. I added the stops into a map of Sydney and added some boundaries, and added the Growth Zones. The result was a map with every bus/train/ferry stop. Darker areas have stops that are closer (not necessarily more frequent service).

One of the first things I noticed is that there isn’t much physical infrastructure in these areas. There also aren’t many transit stops; I suppose this is why the South West Rail Link is going to be so important. I don’t know all of the political ramifications, but let’s hope the North West Rail Link is built as well?

Removing Unused ContentTypes

I’ve been cleaning up my personal blog a bit, and I noticed that my tagging system recently broke. I’ve investigated the cause, and it appears to be because I removed some apps but the contenttypes remained. This meant that whenever I tried calling a tag with a TaggedItem that had been deleted, I was getting this error:

'NoneType' object has no attribute '_meta'

The solution is to first list all app_labels for contenttypes, and then delete any not in use.

In [61]: from django.contrib.contenttypes.models import ContentType
 
In [62]: for ct in ContentType.objects.all(): print ct.app_label
   ....:
picasaweb
lifestream
readernaut
delicious
mapfeed
comments
...

I could then delete the unused contenttypes.

ct_list = ["delicious", "flickr", "photologue", "twitter"]
 
for ct_label in ct_list:
    for ct in ContentType.objects.filter(app_label=ct_label):
        ct.delete()
    

And no more errors! For more details take a look at David’s article.

Integrate imified into Django

I recently had the desire to send small updates to my so called lifestream page via XMPP/GTalk. I played around with Twisted Words and several other Python XMPP clients, but I didn’t really want to keep a daemon running if unnecessary. It turns out imified took a lot of the pain out of it. The steps for me were as follows:
Create an account with imified, and create a URL, e.g. /app/api/
We then configure the urls.conf

urlpatterns = patterns('',  
    (r'^app/api/$', bot_stream),
)

We then create the necessary views. So, in views.py:

from django.shortcuts import render_to_response
from django.http import HttpResponse
from lifestream.forms import *
from datetime import datetime
from time import time
 
def bot_stream(request):
    if request.method == 'POST':
        botkey = request.POST.get('botkey')
        username = request.POST.get('user')
        msg = request.POST.get('msg')
        network = request.POST.get('network')
    
    if username == "[email protected]" or network == "debugger":
        blob_obj = Blob(id=time(), body=msg, service_name="Mobile",
        link="http://www.kelvinism.com/about-me/", published=datetime.now())
        blob_obj.save()
        resp = "OK"
    else:
        resp = "Wrong username %s" % username
    else:
        resp = "No POST data"
    return HttpResponse(resp)

To complete this little example, you can see what I used for my models.py

class Blob(models.Model):
    id = models.CharField(max_length=255, primary_key=True)
    body = models.TextField(max_length = 1024, null = True, blank = True)
    service_name = models.CharField(max_length=50, null=True, blank=True)
    link = models.URLField(max_length=255, verify_exists=False, null=True, blank=True)
    published = models.DateTimeField(null=True, blank=True)
 
def __unicode__(self):
    return self.id
 
class Meta:
    ordering = ['-published']
    verbose_name = 'Blob'
    verbose_name_plural = 'Blobs'
 
def get_absolute_url(self):
    return "/about-me/"

It maybe isn’t super elegant, but it works just fine, and maybe can provide a hint if somebody else is contemplating using a homebuilt xmpp solution, or just pawning it off on IMified.

Stock Android and Postfix

I was having some issues with my personal mail server (Postfix) and my phone (Android). The logs depicted the below issue:

Jan  9 09:19:53 ip-11-222-23-223 postfix/smtpd[12345]: NOQUEUE: reject: RCPT from 12-13-14-15.abc.com.au[12.13.14.15]: 504 5.5.2 <localhost>: Helo command rejected: need fully-qualified hostname; from=<emailaddr kelvinism.com="kelvinism.com"> to=<emailaddr gmail.com="gmail.com"> proto=ESMTP helo=<localhost>
</localhost></emailaddr></emailaddr></localhost>

We can see here that the stock Android email client is doing a ‘helo localhost’. One part of my main.cf file specifies this:

smtpd_helo_required = yes
smtpd_helo_restrictions =
    permit_mynetworks,
    reject_non_fqdn_helo_hostname,
    reject_invalid_helo_hostname,
    permit_sasl_authenticated,
    permit

To resolve, unfortunately, just change the order to authenticated clients are permitted earlier:

smtpd_helo_required = yes
smtpd_helo_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_non_fqdn_helo_hostname,
    reject_invalid_helo_hostname,
    permit

You also may need to do the same for smtpd_recipient_restrictions and/or smtpd_sender_restrictions (i.e. put permit_sasl_authenticated above the reject lines).