GIT For Backup

With an ESXi box at home and one in a datacenter, I'm having all kinds of fun toying with interesting computer experiments. This weekends endeavor was to replace (more or less) Dropbox.

There area few key things Dropbox does for me:

  • Backup files to a remote location, securely (more or less)
  • Keep versioned copies of the files I backup (indefinitely)
  • Provide remote access to files

Dropbox does more than this, but this is all I use it for. I decided that this all sounds erily like what a GIT repository can do.

CAVEAT AHOY!

I do not edit my documents in any place but my home (source) machine. Dropbox is more about backup than sync for me. This fact greatly simplifies my workflow such this project doesn't have to deal with "the document was modified on my iPhone and desktop -- auto resolve/raise issue" etc. Continuing on...

Overview

The general idea here is to setup a network share over Samba which I can mount to my Windows7 machine and work with as normal. As I work, the change will be auto committed, and once in a while the whole git repo will get mirrored off to my backup machine.

More Specifically

A GIT repository, one which is mirrored off-site, will provide all primary features of Dropbox: remote backup, versioning, and remote access (with a bit extra work). However, I don't want to think about GIT while I am doing these things -- like Dropbox, I just want a folder that stays backed up and safe.

I use Windows as my primary OS. I do my development, putzing about, and gaming on this machine. I'm slowly pairing it down to a beefy graphics card, ram, and a few SSD's -- leaving my ESXi to hold loads of large HD's and keep a low, but always on, power signature. So, when I want a convenient place to store files, I put together a Samba share on my CentOS6.2 minimal install. Toss it under an LVM so I can add more space later (surprisingly not that hard), and I've got an expandable, safe file storage area. (All my phyical disks on the ESXi sit in some kind of RAID mirror.)

Once I've connected and mounted to that, I have a Dropbox-esque area to save files, work on them, and generally use.

Automatic Versioning & Syncing

Like I said, I don't want to deal with GIT add, commit, branch -- I don't want to see it at all, to be honest, I just want whatever is in the share to be saved. GIT is pretty good about tracking changes, be it renames, moves, edits, deletes, or new files -- you just git add -A && git commit -am 'files changed' and you're good to go. The trick is getting that to trigger.

Thankfully, linux has a nice helper, as part of the inotify-tools package called inotifywait which will wait for various events to occur on your watched folders/files, and then do something. In my case, the "something" is the GIT sequence above.

With that in place watching the share, I now have "if something changes, there's a record" setup. Awesome.

The syncing part is quite simple -- you have a remote git repo, you push to it with git push --mirror remote and you're set. Toss that into a cronjob and kick back.

Take Away Notes

Not everything went perfectly smooth:

  • inotify-tools, for centos6.2, is in EPEL. I did a minimal install, so I didn't have EPEL and needed to add it.
  • Windows 7 can't login as two different users to the same network host (or share, for that matter). Fortunately, Windows' idiocy is also our saving grace: Edit your HOSTS file and add several alias to the same IP address and use those to connect as different users.
  • You can run inotifywait in a loop or in daemon mode. If you run it in a loop, it's possible that while the commands in the loop are run, you'll miss of file modifications because you're not "waiting" anymore. In daemon mode, you never miss anything, but running commands seemed trickier. Personally, I just liked the loop better, and it didn't really come out to matter, ultimately.
  • The loop process ran into the cronjob once or twice, thus I had one process trying to git add/commit stuff while another was trying to git push. Between that and needing inotifywait to be in a constant loop, I may end up dropping the bash script and instead move towards a single script that (attempts) a git add -A && git commit every 5 minutes, and then will follow up with a push on the hourly update. However, doing so would mean losing the incremental updates that inotify can give me right now.
  • The first time you drag & drop several gigbytes of files into the directory you'll causes a series of git commits that are just KILLER. But, that's to be expected -- if you git init && git add -A && git commit -a a 100GB directory you're gonna be in for a long wait no matter what you do.

Gibson (II) Retirement, Gibson (III) Build Log

Towards the end of 2011, my colocated server, Gibson (II) started experiencing what I assumed was hard drive issues. This is the work log for the replacement of the machine.

The server ("Gibson") which normally hosts the website you are looking for is currently offline.

After roughly 5 years of service, Gibson is experiencing significant drive failures and needs down time to be replaced.

I will keep a work log here of progress on the rebuild (all updates are in reverse chronology):

  • 2012-05-08
    UP AND RUNNING!
    If you are still seeing this, give it some time. DNS needs to propogate
    RAID system repaired, Gibson2 image booting, functionality to be restored soon. *cross fingers*
  • 2012-05-07
    So close. Datacenter people reseated some cords and all drives show up now, so RAID has been restored. However, the KVM has ceased working at this point, which is a problem. Trying to get that sorted out.
  • 2012-05-06
    Ugh. Got the KVM working and one of the drives is not showing up in the RAID controller. My guess, at this point and would be a best case scenario, is that a cable came loose during shipping. Really hope that's the issue.
  • 2012-05-05
    Waiting to hear back from datacetner about the server. In the mean time, I'm reconditioning what's left of Gibson 2. It had 4 drives in it: 2 x 150GB WD Raptors, and 2 x 400GB WD RE2's (Raid Edition). All but one Raptor are dead. (They make the most wonderfully horrible clanking noises if you try to read from them.) The fact that Gibson even booted and worked at all for the last however-long these drives were out is a testament to the RAID card it had. Sheesh.
  • 2012-05-04
    The server has been racked and turned on -- and the RAID is missing. And the KVM (remote management) is not responding. Not sure what's going on yet.
  • 2012-05-03
    Server has arribed at datacenter a day early. Waiting to hear back on when it will be re-racked.
  • 2012-05-02
    UPS tracker says server is in TX at airport.
  • 2012-05-01
    Server in UPS hands. Off it goes, should arrive at DC on Friday.
  • 2012-04-30
    Work day; got SSL certs for remote management purchased, installed, and tested. Setup ip addresses for DC network. Zip-tied up all the interior cords nice and snazzy, secured the top cover, put it in the shipping bag, moved the cats, and boxed it up. It'll hit the road wednesday morning. Probably get to the DC by saturday. Hopefully come sunday we'll all be looking at normal websites again. At which point I can start the long process of upgrading the OS from Fedora 6 to something not made 3 years ago.
  • 2012-04-29
    Added commenting ability below.
    Very excited about this screenshot:

    remote configuration setup
    Click to enlarge

    What you are looking at is my ability to completely, remotely control the server with KVM over IP, plus monitor fan speeds, temperatures gauges, etc. Additionally, the SSD drives and 6TB RAID5 array is running in VMWare. Finally, the single virtual image installed? All of the sites that would normally be hosted here -- ready to go once the machine makes it back to the DC (and after a little network configuration repair). This is very exciting.
    100% formatted, total: 57h 01m
  • 2012-04-28
    92% complete @ 51h 04m -- Finally going to wrap up sometime while I sleep.
    Discovered that old Gibson, while supporting PWM (variable speed) fans, was built with 3 pin fans instead -- so they've been cranking full speed for the last 5 years. Ooops. I ordered new 4 pin fans to replace the old ones to reduce noise as I am recommissioning it as my home server.
    86% complete @ 46h 18m
    71% complete @ 37h 40m
  • 2012-04-27
    44.7% after 22 hours. Looks like my jibe about it "taking 40 hours" was closer to accurate than I thought.
  • 2012-04-26
    Initializing RAID5 array. This should only take, like, 40 hours update: estimate sits at 24 hours
    RAID card successfully integrated with VMWare ESXi5
    Moved the raid card from G2 to G3 and getting it rebuilt. Considering getting the raid card bios up to date.
    The drive copy went smashingly. The old gibson OS has no idea its now living in a virtual wonderland -- outside of resetting its ethernet adapter. Database checked out fine, files all present. Yay!
  • 2012-04-25
    This things fans are intense. Hard drive image copy underway -- once the image is stored, it will be moved to the new server and started up as a virtual machine.
    Server just arrivd back. Yay! I expected fully evolved, walking, talking dust bunnies but was surprised to find the chassis almost dust free. Naturally, the cats approved of this shipment.
  • 2012-04-24
    Gibson has landed in San Jose. Should be on a truck to my place tomorrow.
  • 2012-04-23
    The server is on a plane from Texas to California. Flyyin, on a jet plane. Don't know when I'll boot up agaaaaiiin.
  • 2012-04-22
    Got the server scheduled for pickup on Monday, delivered from Texas to CA by Wednesday.
  • 2012-04-21
    Gibson has been unracked, packed up, and will be getting shipped back to me tomorrow. Will take a few days to get here.
  • 2012-04-20
    The server migration/upgrade has begun. If you are seeing this then Gibson is no longer serving requests for the website you're looking for.
  • 2012-03-09
    Gibson has been holding up quite well over the last few days, actually, none-the-less, the replacement build is nearly complete. At this point, I am only waiting on the cpu heatsink/fan parts to come in. All drives have been wired, fans hooked up, etc.
  • 2012-03-05
    Gibson looks like it ate dirt today.
    Yeah, crashed, but came back up. Hopefully it'll hold for another few weeks while the new server is pieced together.
  • 2012-03-01
    The majority of the parts are in. Still missing heat sinks, some moliex->esata power adapters. Everything I have so far is installed$
  • 2012-02-25
    New parts ordered. Dual Xeon motherboard, two 5606 processors, 64GB ram, 4x2TB WD HD, 2x32GB SSD, Chenbro 3u rackmount.

Caching Data Structures in PHP

In one of my projects I need to create and use several fairly large, non-changing data structures — hash tables of string values, array’s of objects, nested object definitions several layers deep, etc. For example, from my battlefield 2 stats website I have several very large arrays that describe every award you can get, a sample:

    '9' => array(
        'short'     => 'MgySgt', 
        'long'      => 'Master Gunnery Sergeant', 
        'unlock'    => true, 
        'notes'     => '', 
        'thisrank'  => '9',
        'nextrank'  => '12',
        'requires'  => array(
            'awards'  => '', 
            'rank'    => '7', 
            'score'   => '50000', 
            'round'   => ''
            ) 
        ),

So the question arises, how do you store this data, load it, and use it?

First Step: Research

Of course, I found a page on StackOverflow about php storage. Perusing the article, you’ll see most people break down the caching theory into three options:

  1. json_encode the data into a file, load it, json_decode
  2. serialize the data into a file, load it, unserialize
  3. var_export the data into a file, require() it

One responder (who should have more votes, if it was up to me) went pretty far and did a serious amount of benchmarking for the php array storage issue.

I won’t go into a lot of details on each method as the linked articles cover them each pretty well, but I want to open two other options and redo the benchmarks because something smelled fishy when JSON has been coming out the winner…

The Purported Winner, JSON

JSON certainly has some advantages: the cached file sizes are smaller (especially when you saving a numericly indexed array), it is usually faster to write, and if you have a highly JS oriented site architecture being able to make HTTP requests for your JSON data files can be quite useful.

What irked me is that, for my purposes, none of those things really truly matter. File size isn’t a real concern because my largest cached file weighs in at about 50KB. I won’t be distributing the data to JS applications, and writes only happens once.

So, what does matter? Read speed. And with that in mind, what I found out is that JSON can’t hold a candle to the other two methods.

Cons of var_export

I’d first like to rebut the cons list that var_export was given on Procurious.nl:

  1. Needs PHP wrapper code.
  2. Can not encode Objects of classes missing the __set_state method.
  3. When using an opcode cache your cache file will be stored in the opcode cache. If you do not need a persistant cache this is useless, most opcode caches support storing values in the shared memory. If you don’t mind storing the cache in memory, use the shared memory without writing the cache to disk first.
  4. Another disadvantage is that your stored file has to be valid PHP. If it contains a parse error (which could happen when your script crashes while writing the cache) your application will not work anymore.

  1. Wrapper code exists for your other caching methods as well, it’s just placed inside the loading function instead of in the cached file itself.
  2. If you encoding objects created with classes, JSON is going to fail worse here. The more likely scenario, however, is that you are just using “dumb” stdClass objects, in which case it is super easy to overcome the stdClass::__set_state() blunder. str_replace('stdClass::__set_state(', '(object)', var_export($data,true)) done and fixed.
  3. The point of pushing the cache data into a file is for longevity. Your APC cache will not survive a server restart, a cached file will. Additionally, I have too much data to reliably cache in memory1; using the opcache provides the built in “most used gets kept around” optimization.
  4. This point could be made about ANY of these methods. A broken serialized file or cut-in-half JSON object is just as likely to cause errors.

Don’t Discount The Opcode Cache

I find it odd that the opcode cache was so readily dismissed; it’s a surefire way to speed up ANY of these operations. To that point, let’s introduce two other caching methods that an that can make unserialize and json_decode even faster. How? Just wrap the data up inside a PHP file!

json_data_cache.php:
<?php return json_decode('{"your": "json", "goes": "here"}');

The same treatement can be applied to unserialize. By introducing this boiler plate routine into your serialized/json_encode’ed data you can take advantage of the opcode cache. When you’ll see later is that even if you decide to go with JSON, doing this will lead to a significant speed up.

Test Script

Here you will find the test script for benchmarking php caching with json, serialize, and var_export. A quick overview of how this is intended to be used:

  1. Install to a webserver (apache, lighttpd, etc) that has PHP with APC installed.
  2. Call script from browser as test.php?m=gen

    This step will create all the cached data files. These files should be the same as the data files I (or any one else) would use to test as long as the $setsize value is the same.
  3. Call the sript again as test.php?m=test

    This will run the load & parse tests on each cache file created.

The data generated by this script is fairly comprehesive. It will test arrays of strings, ints, and objects. The arrays are indexed by numeric and string keys. Additionally, it will test two object collections. In all cases, the script creates a Large, Medium, and Small set of data based on the $setsize value (100% size, 50% and 10%).

When you are running the test, I highly recommend you run with the same $setsize and $itterations value with APC off, APC enabled (apc.stat=1), and finally APC enabled(apc.stat=0) restarting your webserver between each execution. apc.stat instructs APC to check the file for modifications to see if it should be recompiled before using the opcache variant. Turning this off eeks a bit of performance out of APC at the cost of needing to manually clear the APC cache if you update files. The testing, however, shows that you may or may not think this is valuable — the performance difference is very, very minimal.

Also, for the APC enabled test runs, perform then twice to ensure that your APC cache is primed.

Results, Man!

I ran this test on a Fedora 15 virtual box on top of a Win7 install on a Corei7 machine with the settings $setsize=2500 and $itterations=200. The webserver was Apache/2.2.21 with PHP 5.3.8 with APC 3.1.9.

Here’s a graph comparing the best runs of each decoding situation:

And an ODS (Open Office Calc) file of the raw results and a few other graphs.

What you are looking at here is the decoding of each type of data structure by method, as compared to the fastest method, which is var_export with APC.

Take aways:

  1. var_export with APC caching (apc.stat on or off) is about 270% faster than anything else
  2. If you want to keep your data in JSON format, keep it in the json.php data structure — the opcode cache makes this method an average of 150% faster than loading JSON from a file and even if you don’t have an opcache you’ll not lose any performance anyway
  3. The jump in performance between var_export with and without opcode cacheing is as dramatic as I had expected
  4. Important You must know your deployment environment — var_export without opcode caching is by far and away the very slowest method

If you have any suggestions, feedback, or wish to contest the results, feel free to leave a comment or submit a patch.

1 If you have a small enough data cache, you should be reading up on Redis, and this whole discussion becomes pointless very quickly.

Battlefield 3 Open Beta Reaction

Had a nice long post about this, got eaten by expired session. Engage tl;dr

  • Love Battlelog
  • Battlelog better not stay stuck behind the login gate
  • Forced to load game and spawn before you can change options? Yeah, dumb. People scream for options any time — no, better would be to move options into Battlelog.
  • Gameplay and graphics are killer and perform quite well even on my starting-to-get-2-years-old hardware.
  • The closely interwoven Blaze, ESN, and Origin system dependencies scream “Multiple single-points-of-failure!!” which does not bode well for initial stability nor game longevity.
  • For the love of all that is holy, in-game text and squad systems better be about 1000% better by release.
  • Overall: Probably taking some time off at release.

Static Blog

Who doesn’t like a little weekend project, right?

A combination of things has recently pushed me towards moving away from Wordpress — primarily the ever present threat of a high profile suite of software requiring constant upgrades to keep safe. Because of how rarely a I post (sometimes less often than Wordpress releases updates) I run a fairly high risk of having security holes in active code on my webserver. Between that and the fact that I simply don’t require such up-to-the-refresh dynamic flexibility (typically I only make layout changes once every 2 years or so) it just doesn’t make sense to use something so dynamic, thus I am ready to stop playing the upgrade game1.

Being that I keep exposed to new technologies, the Jekyll project has come across my path a few times. Between that and wanting to play around with the Phar format, I decided to have a go at the same concept written in PHP.

First, I looked around for some alternatives, and I did find one: Phrozn. However, while Phrozn is geared towards static site generation, it lacks some functionality unique to blogs: namely “tags” and chronological pagination.

So I figured, if the world could use one more PHP MVC framework2, then why not another static site generation script?

Thus, Alkemy was born.

Alkemy, like Jekyll, will take a list of posts, parse them up (Textile, Markdown, HTML, or just plaintext), smash them through some template files, and smoosh out a website. The website is fully generated and completely static. You serve nothing but set-in-stone HTML files and other non-code-interpreted content. This has 2 really big advantages:

  1. Damn if it isn’t fast — Static content requires no programming overhead; served direct from disk (or memory) to network pipe.
  2. Secure as all getout — there’s no php to hack, no python to work around, no perl to xss inject, no java stack traces, nothing interpreted but GET requests for static files.

Of course, one must eat his own dog food, so this blog is now managed by Alkemy. I have a local copy, versioning using Mercurial, where I get things written and tested. After I’m happy with my latest post, I commit locally, push to the server, and have the server run an update. My webserver has the repo’s “site” folder setup as the docroot and “TADA!” the site is updated.

You can find Alkemy at http://alkemy.info/ along with documentation and examples.

1 I have often wished Wordpress offered a LTS version of their software for this sole reason.

2 Not really.


UPDATE: Turns out static blogging like this kind of sucks. The overhead in producing the content, editing it in the right area, re-running the generation, and getting it synced up is too much of a burden. Compared to something like “Login, type, post” or even easier, bookmarklets (ala tumblr/posterous), it’s just no comparison. As such, this blog never even got off the ground with that code (not externally anyway) but instead is running some custom tumblresque software. Alkemy will stay released, in any case.

Portal 2

Portal 2 was fantastic. Portal 1 was mostly about the new “portal” dynamic with enough fun story just to make it stick together. Portal 2 really took the universe of the story and pulled it together. Plus the co-op was a blast — felt like a whole extra game, for free!

Wordbooker

My blog now posts directly to Facebook, and if everything works right, comments from my blog will sync to this topic, and comments on FB will sync to the blog. Very cool stuff. If you’ve got a self-hosted WP blog, check out Wordbooker.

Absurd

Being gone 2.5 years and things change a bit. I was caught off guard by this today.

My car registration needs to get “up to date” with the DMV. I tried to do it online, but the system just gives me errors and non-sense. So, yay, time to go visit the DMV.

I tried to schedule an appointment, but waiting over 40 days for the next available slot seemed ludicrous. I can spare the 2-3 hours and just go wait in line, I don’t want to wait nearly two and a half months to save me that much time; that’s just silly.

So, I cleared out my Saturday to go do this — wrong! After checking out several offices on their site and a quick google search, it was revealed to me that the DMV no longer operates on any weekends and they’re closed most fridays as well.

How incredibly dumb.

I have to take off work to go to the DMV.
And while I am not working, I am not getting paid.
And while I’m not getting paid, I’m not paying taxes.
And when I’m not paying taxes, the DMV isn’t getting any funding.

So, due to budget issues, I can now only go to the DMV on days which would continue to hurt their budget. Genius!

A short letter:

Dear DMV,

I understand times are tough and the Governator is ‘cuttin ur bugets’, but if you’ve only got enough cash to be open 4 days a week, Saturday, Sunday, Tuesday, and Wednesday would be ideal days. Then people can keep working and paying taxes so you can stay open, yay!

Thanks,

Everyone who has to wait 2-5 hours with ticket in hand after taking off time so you don’t get tax revenues

Seriously.

Facebook's Privacy is not Sensational

A lot of people are getting up in arms over this anonymous tell all article about the kind of insight Facebook has into your browsing habits, messaging history, and more.

I can tell you that nothing, nothing, in that article made my eyes pop out of my head or my anger rise to boiling levels. They aren't doing anything that users haven't explicitly agreed to.

  • Tracking profiles you visit
    Of course they do this. So does every single website you ever visit that is worth its salt. It's called web analytics. We not only can (and do) track what pages you've been to, but we also track the paths you take to get from A to B to C and so on. This is an industry standard since the invention of cookies.
  • Storing snapshots of data
    This is called making backups. It's a smart thing to do. How many of you very active users of Facebook have your pictures elsewhere? How about all those status updates? Friend connections? Notes? If Facebook lost all the running data, you'd probably be up in arms over the fact that they couldn't recover your data -- so backups are essential.
  • Global Login
    This is, again, a standard industry practice. Support engineers and technical staff always have need for this. Perhaps to verify a bug that just your account is experiencing or to diagnose some other problem specific to your instance. There's always the off chance that people (as this employee even admitted to) use it for invasive purposes, but that's generally not the goal. Also, you should take solace in the fact that Facebook seems to take this very seriously and even fires people when abuse is discovered.

What it boils down to is that you have no real privacy on Facebook -- but this is not news. And if it is news to you, welcome to every website you visit and have an account at (and some you don't...) Twitter knows who you visit and tracks you. Flickr support reps can login as you and see all your photos. Google probably knows you better than you do: email habits, favorite websites, calendar events, uploaded documents, and way more!

Moving Sweden to US

A few months back I decided to move back to the US after having lived in Sweden for just over 2 years. It was a personal decision about where “home” was, and a sad decision too because the job and friends in Sweden were amazing. I won’t miss the winters one bit, but that’s about it :)

In any case, any international move is tough. Sweden to US is a bit easier, however, because the two regions can each marginally speak English. The move is particularly less hassle for me because I am a US citizen — which lifts a lot of red tape out of the way.

There are a few key things that moving back, I’ve needed to take care of:

  • Leaving the previous job
  • Preparing/getting for a new job
  • A place to live where I was headed
  • Banking
  • Moving my belongings
  • Transporting cats


I’ll talk about how each went for me.

Leaving the previous job

This one was sad. The job I had in Sweden, working as a web producer for DICE, was why I went there in the first place, and it is what kept me there through that first winter. I built many great relationships and helped to create a product which I’m astoundingly proud of. That said, there were a few things to get in order. I reviewed my contract and made sure all my benefits were taken care of. (Turns out I’d missed 2 bonuses — oops…) I sold off all my stock options because you can’t take those when ya go. And I made sure that my replacement had a few weeks with me on site so as much knowledge transfer could happen as possible. All things considered it went quite well. In an unfortunately brief good-bye party, I was quite honored by the enthusiasm of the send off.

Preparing for the a new job

Getting a job in the US, when you’re not yet in the US, sucks. Telephone interviews at weird hours, people not fully understanding your situation (one place thought I was a Swede IN the states already…) and so on. The fact that I was already moving and already a citizen made this process a bit better though — I can’t imagine how impossible getting a job in the US without having both of those checked off could be. Sheesh.

A place to live

I was very fortunate in this regard. I was planning on moving in with a friend from the states, so we’d been comparing notes about places that looked nice for a few months to get a feel for what the both of us wanted. About a month before I moved, we hit upon a nice 2 bedroom apartment just one block from where I used to live in SF. It was pretty much exactly what we wanted. So we took it — turned out, it also included a 2 car garage in the price — for SF, that was huge news. In any case, having a place to definitely say, “When I get to the US, I will be living here.” was immensely helpful when filling out customs forms, shipping forms, etc etc.

Banking

Wow. Just wow. Here’s the tale of “Jeff, the Money Runner”.

A week before departure, I went to the bank and (in true Swedish fashion) took a number, waited my turn, and got to the teller. I explained my situation and asked for the checklist of things to do before leaving the country for good. Got the info I needed and was ready. The next week, two days before my plane leaves, I go again and ask to make the transfer. I give them the “IBAN” number they asked for. This new teller says I need 2 other numbers as well. Wait. “What? Just last week that lady (pointing) said I only needed this one!” Ok now what? Well, I waited to 4pm for the US bank to open, called them to get the new number and found out my US bank doesn’t even HAVE one of these numbers and they are quite adamant that I only need the IBAN. Soooo, go to the Swedish bank again, get number, wait turn, relay discoveries. Nothing they can do, it seems.

Yay, let’s leave all my money stuck in a Swedish bank account! How about you just write me a cashiers check. Oh wait, no, they don’t do those. So instead I asked for the cash. Just cash me out — well, for the amount I had saved, that can only be done with 3 days notice. AAAarrrgggg, but you said I’d be able to make the transfer and now I’m out of time! The lady talked to the manager and withdrew the cash anyway.

And thus I traveled with 2.5 years worth of savings tucked into my carry on bag. My whole monetary foundation wrapped up in a tightly taped up envelope. Man, one serious way to turn the “super paranoid” mode on. This is part of the reason I didn’t sleep a wink the entire 26 hour journey.

After it was completed, however, my money did make it here and has is now safely in my account. Phew.

Moving my belongings

This is quite tricky. I actually needed to use some of those business skills here, namely, ROI. See, you can ship everything you want back — no problem. Toss it on a boat for a month or two and it’ll show up at your door. However, it’s bloody expensive. My quite modest accomodations would have been nearly 6,000 $ to ship back. This is where ROI comes into play. See, I could have, instead, not ship anything at all back, pocketed the 6,000 and buy it all again in the states. The cost to replace everything? About 4,000. See — makes much more sense to ship nothing!

Of course, you find a middle ground. Some things you don’t want to replace, some are hard to get rid of, some are sentimental. I shipped back maybe 1/3 of the stuff I had.

I did try to donate the rest, but that was a fairly epic fail. I arranged for a donation company to come by and pick everything up. I figured, must be like the donation center in the US, Salvation Army. They take your used/well-used goods and resale them at steep discounts. The people in Sweden flat out refused to take any of my items stating that, “Lightly cat-scratch-marked furniture can’t be resold.” I was astounded. How affluent can the society be that even the donation center won’t take a functionally perfect bed and couch for a few minor cosmetic flaws. Blew my mind. Instead a company had to come by to simply haul all of it to the dump. What a massive waste.

Transporting cats

Actually, this was remarkably easy. Put cats in crate, add to flight, inspect at US, move on. As long as your cats show no signs of infectious disease, they are clear to come in. Pretty easy. They didn’t like the flight much, but they are just fine and dandy (and spoiled, Heather) in the new place. The inspection at the US customs went like this:

Ding dong (Ringing the bell to get the attendant)

“Oh hi! I am just in from Stockholm, taking these two freaked out little ones to SF”

“How are they doing then? Looking well?”

“Yeah, they are a little skitish, but fine.”

Scrible scrible scrible

“Ok dear, take this paper to the other gentlemen and you’ll be right on your way”

“Erm, ok, thanks”


The whole exchange happened in less time than it took to get the lady to answer the doorbell thing.

End Game

All things told, my move was mostly smooth. With the exception of the whole bank fiasco, it went quite well. I owe a lot of gratitude to Anna Kylin for her amazing help in getting a lot of the roadblocks out of the way. If you EVER need any assistance moving into or our of Sweden, you would do very well to hire her.

Now, about that job… :)

California Host Beyond Cheap

Browsing though some job listings, this one in particular piqued my interest, so I thought I’d write a letter to the company.

Dear California Host,

Hello! I would like to book your services to host a get away training seminar for my staff of 20 in Hawaii!

Please book a 5 star hotel and first class round trip flights — only the best for my folks! Additionally, I’d like to make sure we’ve got after day plans like skiing, snorkeling, a luau, etc. The conference center you arrange must be secure, well situated, and absolutely gorgeous. We’re going to require several projectors, advanced white board systems, sound equipment, and other high end devices to properly run this event, so please have those arranged for as well.

Please also have a trained wait staff, fully stocked bars, and masseuses at the ready as this is going to be an intense session and we’re going to need lots of attention. We expect you’ll have a representative ready to attend to any needs we have while we’re on this trip — just in case anything comes up. We require that your staff has at least 10 years of training and experience and must be deeply familiar with the intricacies and nuances of serving our needs and ready to react at a moments notice.

Also, we’re planning several other small, day trip training sessions for focused groups over the next few weeks and we’d like you to set those up for us as well.

Naturally, this is a project based non-paid internship which is great for our bottom line.

Thanks, can’t wait to hear back!

- Jeff Minard

p.s. Fuck you, assholes.

Un-freaking-believable.

Out for a Walk

I awoke today to my cats sitting on my bed, chewing on loose threads. The sun was streaming in through the window and I felt nicely rested — I’d had a late night.

I got up, ate some breakfast, and lazily watched a tv show. 2 hours or so gone by and I was feeling restless. After cleaning up a bit, the outside was calling — it was a wonderfully beautiful day. I figured I’d go for a walk.

I got myself together and headed out. I took my usual route — down towards the station, but veering off towards the park. I continued into the park and stopped at the water fountain. I enjoy sitting, watching, and listening there. Something was off though, not quite right.

I was the only one there.

This is a rather large park — there are almost always people there: picnics, walks, biking, out with the kids, sunbathing, etc. Today, however, I was the only one. I looked around, behind me, and all I found was a seagull and another bird fighting over a piece of bread.

I whipped out the iPod i was carrying to check…

8:13 AM

Damn you Sweden, damn you and your extreme lattitude.

Remixing

I linked to this a while ago, the excellent "Thru You" remix project.

The project was bouncing around my head recently and reminded me of these "OS Sounds turn into music" compositions as well. So I spent some time youtubing it up and pulled out quite a few good ones.

Enjoy!

Google Chrome Javascript Benchmarks

One of Google’s big claims-to-fame with it’s new Chrome browser is that it is blazing fast with it’s amazing new V8 Javascript engine.

Here are a few image comparisons of the speed of Firefox 3 running speed tests, followed then by the results from Chrome running the same tests.

(Each image links to the test)

http://dromaeo.com/

http://mootools.net/slickspeed/

http://www2.webkit.org/perf/sunspider-0.9/

http://celtickane.com/webdesign/jsspeed2007.php

As you can see Chrome delivers on that promise in 3 out of 4 cases and does so exceptionally well. I don’t use many of Google’s services (like mail, calendar, etc) but I imagine those JS heavy services are feeling a LOT snappier in their own motherships browser.

As for the rest of it, being a very heavy FF user, this feels pretty dang nice. Outside of missing all the snazz add-ons I have for firefox (Web Developer Extention, I’ll never leave you!) I haven’t found any reasons to use one over the other. Chrome is a truly outstanding first step into the browser market and I’ll be giving it more of a fair chance than I did Opera. :)

This post brought to you by Chrome.

There was no Flash Back

Kim and I went to a house warming party for a co-worker last night. He, like probably 90% of 08’ers*, lives in an apartment building and resides on its second floor.

This apartment building had a central stair case which twisted upwards around a central shaft elevator. Also all elevators in Stockholm of these types have a 3 person limit. So, on our way to the roof, me and two other people clamber into the elevator and get ready to go to the roof. However, a fourth gentlemen starts stepping into the elevator as well. Despite our shouting of “No! 3 people only! Serious! Wait!” he stumbled in.

When the sign said “3 people only” it really meant it.

As soon as his other foot hit the elevator floor the counter weight was out done. The lift door still open the elevator started moving downwards. At this point, all I can recall thinking about was hoping that the last guy was all the way in because we were going past that opening and I didn’t want him half in and half out. Shudder.

The next concern is, of course, “oh shit, this isn’t going to nicely stop…“ However, I was hardly able to finish that thought before SMASH and we’d arrived at ground floor. Holy Shit. Elevator was still in tact and no one was dead, but lights were blinking and we were half way into the floor — not at quite the right level with the floor outside. We’re all standing there and one of the other guys who had dropped a beer on the floor, decided to pick it up. Upside down. Pointed at my pants. Sigh. After a few moments collecting his sanity, the fellow at the front finds the handle to open the door and we all step out.

End of the story: I’ve survived being in a 2 story drop in a small metal cage of death with 3 other men and I managed to walk away with nothing more than some jitters and a long beer stain down my pants.

Fun.

* 08 is the Stockholm extension. It’s like saying “I’m a 415er” for people in San Francisco

 

JM

  1. Posts
  2. Images
  3. Status
  4. Videos
  5. Audio
  6. Links
  7. About
  8. Contact