This is not how to be lazy

I've always believed in giving children an allowance. It teaches them proper money managment, gives them motivation for doing a task well, and gives you something to take away if they do it poorly. I got an allowance growing up, and it was something I wanted to do for my son.

One problem: I suck at carrying cash.

Stop me at any time, and chances are, I won't have enough cash in my wallet to cover a soda. I live off of my cards, and for the most part, this hasn't inconvenienced me much. Even food carts take plastic these days, thanks to smart phones. Unfortunately, my son doesn't take cards.

I had an Aha moment after reading a great Mint blog post about starting your own bank for allowances. The basic idea was to open a fake bank, complete with deposits, debits and interest. I could do that! I drafted up a spreadsheet in Google Docs, and shared it with the boy. He was delighted, and I didn't have to worry about finding cash every Friday. All I had to do was calculate interest once a month and remember to add an entry every Friday for his allowance.

Another problem: I am not good with schedules.

After a few weeks, I found myself wishing that the spreadsheet would automatically update itself every Friday. Sure, it was only a minute of effort, but it was every week! The web interface for Google Spreadsheets sucks, so I have to do it when I'm at a desk, and honestly, if I'm at a desk, don't I have better things to do? Like work on my dwarf mountain in Minecraft? Isn't this why we have technology? So that we can be spared the tedium of repetative tasks?

Wait a minute... -I- do technology! I could just turn this into a Django app! 

Of course, if i'm going to make it an app, I might as well make it so that more than one person can have access... Oh, and I could add a goals section, so he can plan out things he wants to get and see how much he has to save a week! Oh, and notifications if he gets low on funds, or when a deposit goes in! Hm, I wonder if entries should be tagged, so he can see how much he's spending in certain categories... Oh, and I totally need a web interface!

Long story short, I've probably spend 20 hours at this point creating a site to save me one minute a week. I expect I'll need another 20 before I'm ready to actually launch and use the site. I'll break even in... about 46 years.

A tip for speakers

First off, to everyone that spoke at DjangoCon, I salute you. I have immense respect for those that are naturally shy by nature getting on a stage in front of an uncertain number of people and talking. It's hard. It pushes you to know your material like you never thought you would have to, even if it's just to put that jerk in the audience with the stupid question in his place.

That said... we have to talk.

When I sit down for a talk at a conference, I don't expect Steve Jobs. Steve has, no doubt, had a boatload of money put into people who train him on how to speak and time his movements on stage. Those talks that I've watched are not a one man operation done on the fly. They're carefully staged and rehearsed over several weeks. The average speaker at a conference could barely afford to get there without living on ramen for a few months, and probably finished his talk five minutes before taking the podium.

In other words, I don't expect you to be awesome. But there are probably some things that every speaker could do to help from sabotaging your talk. I'm just going to focus on one thing.

Movement

Stop. Moving.

I had a drama teacher that kept a collection of lightweight plastic cups she could throw at us if we moved without a good reason. Her aim was spectacular, and it broke all of us of moving while giving a speech.

Please note, that you can move when giving a talk, but it has to be rehearsed and in time with what you're saying. It's big league stuff. It's stuff that you do when you've actually written your talk in advance, and you've had someone else watch you give it. It's not for those of us who wrote it on the plane and have never even read it the whole way through.

If you aren't skilled enough to move with a talk, the next best thing is to take the podium... then move to the side. Make sure the audience can see you. This is a good thing. We like seeing the whole person. Once you're out there, stand still. Don't sway. Try not to lean. Keep your hand movements to, maybe, one every five minutes.

This works really well if you're actually calm and well-rested. This being a conference... We all know how well-rested we are on any particular day. If you're not jet-lagged, you're hung-over. I'd give the advice to get a full night's sleep the night before, but that's about as likely to happen as a person finishing their talk more than 48 hours in advance.

If you're tired, stay behind the podium and grab it. This isn't the best thing in the world, as it weakens your visual presence, but it also won't be distracting your audience.

And if you're nervous, thinking that if you screw up that you'll forever ruin your reputation in the community due to fidgeting a tiny bit too much? Chill out. We're all still working on our talks.

Django on the high seas!

There was a question on the DjangoCon user satisfaction survey that actually made me gasp.

"Would you be interested in a Django Cruise?"

Oh. Hell. Yes. There was a price point question after it, and they should have had an option to hand over first born.

I'm a huge fan of cruises. Since I'm the primary vaction planner, it's like taking a vacation on easy mode. You don't have to worry about food, entertainment, the hotel, entertaining the kids, or feeding the vegan or the gluten-hater. It's all done for you by very cheerful people with a smorgasboard of charming accents.

And the bars open at 10:30am.

A Django Cruise would be beyond awesome, and for some reasons that some people may not see right away.

Family

A cruise would be very friendly to those of us with families. When I go to a conference, I have to:

On a Django cruise? I can bring the fam! Carnival has day camps for children, so I could get my geek on while they're off doing treasure hunts. They also have an adult-only deck, so the SO can take his Kindle there and read while waiters bring him his Bloody Marys. We can all meet up later to do family things, or even let them get to know the Django community themselves.

Food

Food is expensive for a conference, and, no matter the efforts of the organizers, will always disappoint someone. Maybe someone is vegan, and they put cheese on the salad, or someone is gluten-free, and everything is wrapped in a flaky crust. Conferences cannot afford to offer us bacon, lest they bankrupt themselves.

On a cruise? Limitless bacon.

Also, since we're all on a ship for dinner, it's more likely that we'll all eat together. I always take care to arrange for large dinner seatings when I go to a conference, but that requires me logging into Open Table during the morning talks to find a restaurant good enough that has seating for ten. On a cruise? You have a standing reservation for as large a table as your group needs every night.

They also accomodate different diets with ease, up to creating a custom menu. When my son went on his first cruise at four, he was extremely picky. The chef made him a grilled cheese to order every night for dinner.

Oh, and food is omnipresent. If the buffet is closed down, there's 24-hour pizza and ice cream.

No internet

That sounds like a bad thing, right? I mean, with no internet, how will we organize or work?

I'd ask a different question: how many of us were pulled away from the conference for a work issue? I'd hazard to say that by your third conference, you've missed several hours of a conference due to something setting itself on fire.

Not having internet can be a blessing. I've been at my most productive on the train, where I don't have wireless access and therefore can't check Twitter every fifteen seconds. Most blogs written about how to focus, talk about turning off the internet while you're trying to get something done. This is a week of being free of email, social networks, and the beeps and pings that go with being online.

Of course, it would take some forethought to arrange this, if any actual hacking were to be done on a cruise. I'd recommend mirroring pypi to a spare laptop, but I confess to having no clue how much hard drive space that would take. Perhaps projects could be arranged beforehand, with the required instillations bought on USB keys or external hard drives.

I'm not going to suggest that we install everything beforehand. By god, we're Python developers! We can't get our tutorials and presentations done more than eight hours before we give them.

TL;DR

This could be so awesome. A family-friendly geekfest with no external distractions and easy access to food. People, start buzzing. I would love to see this happen.

State of Django Explorer

At DjangoCon 2011, I gave a lightning talk about an app I'm writing, called Django Explorer. I got a ton of positive feedback, and even more important, intense social pressure to actually deliver it.

What is it?

Django Explorer is an package explorer for Android. It's based off of the Java style API explorers I have to use in my Android work... but useful. See, Java-style docs fall flat when you get to the actual class you want to work with. There's almost never a usage example, even less cautionary advice, and never ever anything about best practices. While I find it useful to be able to browse all the packages in a framework, I hate it when I see a really cool looking sub-package... and now have to go look elsewhere to find out what the heck it is.

It's also free, and is not ad-supported!

What is it not?

It's not the Django Docs in offline mode. If you want that, you can download them from the Django site (they come in HTML, PDF, ePub, and cuniform flavors).

It's not official. I got the go-ahead from Django's lawyer, but that's not the same as endorsement. That's enough to not get me sued and ripped off the market.

How's it going, Katie?

I have the structure completely done! This is a good thing! Now I have a skeleton for all my luscious data!

... Oh, that's right. The data. Guess I have to go and make some, now?

See, all that kvetching I did above about docs not being useful? Someone actually has to write all the useful bits that I want. Lacking a documentation fairy in a bottle, I have to write those myself.

The first version will be a little... sparse. It will also be only for beta testers who feel like downloading and installing it themselves.

Give me a date!

By the end of October, I hope to have the app out for beta, and 50% filled.

I want to help!

At the moment, what I will really need are testers, and people's opinions. Already, the feedback I've gotten has been huge, giving me ideas about what would actually be helpful to the community. If you want to submit an idea, go over to Django Explorer's issue tracker and submit it!

I have an iPhone...

I've had a few vollunteers to do the iOs version, and, to be honest, I'd like to dive in there, too. It won't come out until after the Android version comes out, though. I'd like to get all the UI quirks sorted before I move on to having to support two devices.

I have a Blackberry!

I.. I am so, so sorry :( How about a hug instead?

Design by faking

I am not a designer.

I was in art class for many, many years, but really, my aim there wasn't to be a designer. It was to take something in the real world and make it very flat. This doesn't give me the magic ability to make websites pretty.

When I do side projects, however, I'm called on to be my own designer. It would be awesome if I had a designer tied up in my basement to do all that typography and spacing for me, but after the last one got out... Well. I learned to cheat.

A caveat before I delve into my stash of tools: this is not meant to minimize what a good designer can bring to your project. They are invaluable. Wait... no. They have a value. It's spendy. That's the issue with personal projects. They have a budget of no dollars.

Now, my tools...

Wireframing

When I have an idea for a site, I often want to wireframe it first. This is wrong. I should not do this. I should be finding content and working on my pitch. I find focused doodling to be the best motivator for me, though, and with personal projects, motivation is one of the hardest things to keep going.

A designer once sat me down after I completely destroyed her beautiful comp with my indifferent CSS and explained the grid system to me. Everything looks better when it's in a box, whether you draw the box or not. When you make the browser bigger or smaller, your logos and titles and text shouldn't jump around. They should be like good little soldiers and stay where they are.

It was like someone told me Santa was real, and I just needed to get on his mailing list to get free gifts.

For my wireframes, I go to 960.gs for all my gridding needs. There, by clicking on the big ol' download button, I can get templates, CSS, and templates for Acorn (the only graphics program I've bothered to shell out money for). The physical templates are the most important to me. When I'm dreaming, I want a pencil in my hand and some paper in front of me. I can come up with some quick ideas and trash them if they're bad, or pin them up if they might work.

IA

Check me out, using the designer lingo!

IA stands for information architecture, and is hugely important even for the smallest sites. For this, I go old school. I get out my index cards.

On each card, write up one piece of content that will be on your site. This should be more atomic than 'blog'. These should be the aspects that can't be broken down into more granular parts. 'Blog' is bad. 'How to deploy Django using nothing more than a Razr in the middle of the desert' is good.

Create as many of these cards as you can, even if you don't have the content yet. Once you're done, start organizing them into piles based on similarity. What similarty? That's up to you. Feel free to free-associate at this point. Maybe, rather than have a blog section, you realize you want a section for each content type.

Once you're happy with your piles, give them names. If you have friends, have them repeat the exercise.

When you have enough data (or as much as you can wring out of friends and family) look at the labels you've accrued. Chances are, you'll see a pattern emerge. Congrats! You have the start of an architecture.

Color

In college, I learned through a class experiment that I'm slightly color-blind (apparently, I'm missing some pinks). Due to this, I have no faith in my ability to select colors that appeal to sensible human beings. I also have no faith that I'll be able to pick a palatte from a palatte collection site that isn't really eye-bleedingly bad.

Because of this, I lean heavily on sites that allow me to pretend like I can make my own palette. My favorite is Colr Scheme Designer for the amount of control it gives me, and the ability to save my palatte for later without having to give it a goofy name or registering for an account.

I tend to go easier on colors and pick the complement color option. For example, here is my color scheme for The Real Katie. Clicking on "Color List" gives me all the colors I'll be using throughout the site.

Patterns and texture

For the longest time, I shied away from tilable patterns on my site. Sure, they're pretty (when done right), but I lacked the tools and patience to make them correctly. Then, Jesse Noller pointed me towards COLOURLovers. You can take a pattern and add your own colors, then save it.

I lost an afternoon to this thing.

For when I need a more subtle texture, I hit up Subtle Patterns. They're low-key, already optimized, and they tile. Really, I don't need much more most days.

CSS frameworks

I've only just started dipping my toe into CSS frameworks. I have to admit, I can be a bit stubborn when it comes to magic. I'm proud enough to think that I really should be doing this on my own, but never remember that the time I have to allocate to personal projects is almost nothing.

Designer Bill turned me on to Bootstrap, by Twitter. When a designer gives his stamp of appoval on a CSS tool, I listen.

What does it do? It takes all those things you always forget to get around to doing and does them for you. Pretty forms? Done! Cross-browser compatability? No problem! Style ALL the headings? Yes! It even gives you some extrememly useful (and totally optional) javascript. I downloaded it, and within fifteen minutes wanted to have its babies. 

Once again...

None of the above replaces a designer, of course, but until Django grows to the point where we have a stable of available design guys loafing about, I hope some of these things make your lives a bit easier.

The home office

Setting up a home office should be easy, right? I mean, I know how to work. I know what I need to work. I should know what should go into a home office, right? I thought I knew what I was doing until I scored a job that was 100% remote.

Until then, I'd only worked one day a week at home. It's possible to tolerate anything for one day a week. Would I last with this set-up five days a week, eight hours a day?

I googled, and came to the conclusion that people that write articles that are SEO'd for 'home office supplies' are idiots. Number one on their list? A computer.

No, really? How did you think I was going to work? Banging rocks together? Cuniform tablets? Smoke signals are most certainly low bandwidth!

After taking a few deep breaths, I moved my question to Twitter and G+, with much better results.

Suggestions

A standing desk

This seems to be spreading to everyone in the Python community, starting with patient zero, Jesse Noller. Every week, someone else converts. I've been poring over set-ups for months.

At the moment, I can't get one of the awesome Geek Desks, as I just got a desk which I adore. No reason I can't fake it, though. I have a slot ready, full of books, which will double as a makeshift standing desk.

A door

This, sadly, isn't going to happen. For an office, I had two options: a small, dark room next to the laundry with no windows, or a nice open spot next to the den. I put the play room in the less favorable room, because if someone's getting shut in the dark, smelly place, it ain't me.

I may end up switching us, and I know that, as we look for a house, an office is a must. It's just not happening here.

A dedicated space

See above. This is going to be hard. What I think I'll have to do is banish all non-work stuff to other places in the house. This does mean I'll have to put off getting a tower, but it does mean that I can start to set up the mental boundaries that I'm going to need.

Speakers

For the past ten years, I've worked in offices where, if your computer made any sort of sound, you were fair game for a keel-hauling. Speakers were paired with every desktop, but it was a joke. Turn them up, face dire consequences. As a result, I have spent a not-insignificant amount of money on headphones.

When Nick spoke, up I realized something. I... I don't need to wear headphones anymore. There's no one else to disturb!

I ended up buying a Bose Bluetooth Travel Speaker. Expensive, yes, but I've learned the hard way that cheap speakers eventually let you down. This thing pairs to my phone and sounds like a dream. And it travels! When momma's gone, no one gets tunes!

Lighting

Good lighting is key, and happily, I have that in spades. We have tons of light in our den/office area. Natural light is scarce, but if I start to grow mushrooms, I can move to the kitchen, where we have tons of natural light.

How good is the light? Ten 100 watt bulbs in in a slightly large living room. Hell yeah!

Shelving

Oh, yeah. I have shelving in spades, baby. I ended up getting the Expedit desk from Ikea, so I have sixteen cubbies for all my stuff.

This presented a problem, however, as I had to think about how to best use all my little cubbies. I realized that some of them, due to the desk, will be hard to reach, whereas others will be right next to me. I sat down, then determined which cubbies would be hardest to reach.

With that in mind, I planned at least a few of them, trying to put some actual thought into them.

As you can see, it's not done. I told you I had hella shelves.

A good chair

I ended up spending as much on my chair as I did on my desk. I strongly encourage going to a store and sitting on every chair until you find THE ONE. If they're out, don't take number two. Leave, go hit up another store. 

One thing I've discovered over the years is that all desks are slightly too tall for me. Rather than pay more for a shorter desk, I've found putting a ottoman pillow under my desk made a huge difference. 

Mini-fridge

I thought this was silly at first, but I realized that the kitchen was an invitation to distraction, and ages away when I'm in the middle of a meeting. Also, I could stock the mini-fridge only with things that are good for me, since the wicked snacks that lurk in the pantry are my downfall on many a homebound day.

Magnetic white board

This appeared on nary a list I found, which only confirmed their idiocy. I have a wall picked out already for a nice size white board.

Back when I was looking for a cheap white board, I found a neat hack: tile board. You can get HUGE sheets of it at Lowe's for $10-$12, and though it's not magnetic, being cheap certain counts for something.

Multi-function printer

I realized how important this was when I was doing paperwork for the new gig. No matter how modern the development lab is, HR is often left behind, doing many things by hand.

Happily, I had purchased an Epson All-in-One a few weeks ago. Was it after countless hours of research? ... No. It was an impulse buy at Target. I had the sudden urge to SCAN ALL THE THINGS. That said, the non-lizard part of my brain remembered that of all the printers out there, I love Epson the most, so this probably wasn't a totally crap decision.

Also, their inks are cheap, and you remember your ink type by remembering what picture is associated with your printer. That is genius.

A place to spread

I confess, I hadn't even thought about this. In an office, there's always a conference room open for you to spread out, if a certain stage of planning requires surface area. That's something I don't have here. Sure, I have tons of flat open space upstairs in the kitchen, but my family has the unfortunate habit of wanting to be fed now and then. I need that space open.

I found my ideal solution in a surprising space: Ikea's dining area. The Norden is perfect: attractive enough to sit out, but folds down to a narrow profile. It has storage (of which I can never have enough), and doesn't need to be moved to extend it out halfway. Of all the things I found while putting together my office, this was the prize.

A cable solution

I'm actually fortunate in this. My desk is facing the SO+'s desk, which is a mirror image of mine. The gap between the two is surpisingly good at cord management.

I am going to have to watch my charging area, though. I have a lot of gadgets that need to be plugged in, and I'm not crowding my computer's USB ports with them. To that end, one shelf is now a dedicated charging shelf, complete with its own power supply. One important thing I have to do is loop all my cords, then double-tie them. I also know now that I need more power slots than I thought I would need.

A place to stuff children

Ideally, when I'm working, the children will not be in the house. I have no desire to try working, day in, day out, with She Who Will Not Be Denied (the boy is less of an issue, since I can stick him in front of the XBox).

This doesn't mean that, on occassion, I might have to work with them around. Baby sitters get sick. Children get sick. Snow comes and screws everyone over. I need a plan for when they're around.

I have a play room for them (okay, okay, for the girl, who took it over pretty quickly), but that only works so long. What I need, I've decided, is a stash of excellent, forbidden toys that shall only come out when momma needs to get her code on. Things I'm adding to the pile: special DS games, paint, dry erase markers (to be used with some tile board of their own), a spare phone with cool games on it, and a cleaning rag.

Yeah. That last one is a threat.

A maid service

This last one, no one suggested, but I knew I would need. With one person being home all day, the house is going to get a lot more dirty. I won't be able to concentrate if I'm thinking about how we need to vacuum, dust, or scour the bathrooms.

Having someone come twice a month cost only a little more than my transportation to the old job, so I'm breaking even on this. Besides, would you work in an office where no one ever vacuumed, windexed, or cleaned the toilets?

Thanks!

Lazyweb really came through on this one. I think I'm on the way to a kickass home office. 

Pictures! I demand them!

From server hater to server lover

I am not a lover of server work.

Don't get me wrong, I love development. Coding is crazy fun. But screaming at servers? It's like comparing the fun of playing with an adorable toddler to dealing with the sullen teenager they become a few years later. There's no comparison.

I don't even mind dorking around on servers, as long as they've been set up for me. In most development environments, this isn't a problem. Engineers set up the servers for the developers, and come grumbling out of their cubes when the developers inevitably break them.

A while back, though, it started to bug me that I didn't know how to set up a server. What if I went somewhere where I was expected to be my own engineer? What about if I started to do side jobs? I needed to be able to do this myself.

I grabbed my fiance's trusty Unix guide and sat down to educate myself. Step one: install the OS on a spare box.

Oh, that's nice. The author assumes I have a spare box just lying about. Well, the SO had several. Maybe I could snag one of his... I continued reading. What followed was several hours of tweaking, fretting over hardware, and basically an outline for the most boring afternoon ever. I put down the book and never picked it up again.

Lesson learned: setting up a box is not step one, no matter what they say.

There had to be another option, I thought, for people who didn't want to become a sys admin, but still wanted to know about maintaining their own server. Besides, the whole 'setting up my own box' thing was essentially a waste of time: local broadband providors frowned upon the act, and it could get your service cut. I needed a box... out there, somewhere.

That was when I remembered the nice people at Slicehost (now Rackspace).

Within minutes, I was set up to make all the slices my little heart desired. Sure, it cost money, where stealing my SO's box would have cost me nothing, but my sanity is worth way more than twenty bucks a month.

Since we used Red Hat at work, I decided to go with CentOS, which in theory is a clone of Red Hat (I would later watch that assumption break our sys admin). I would be more useful at work, and, if I got stuck, I could ask our engineers for help. Wins all around!

I got to work installing Django and documenting every step. The results were... varied. The first time, I got my site up, but my media was missing. I hit the wrong key, and everything went pear-shaped. I tried again, but now, the components wouldn't install. What had I done? What god did I anger? I tried a third time, then cried out to Twitter.

"Just use Ubuntu" was the resounding response. I relented, recreated my slice with Ubuntu... and had a working site in under thiry minutes.

Lesson learned: just use Ubuntu.

At this point, all of my deploy scripts were in my documentation. This was a habit I had picked up at NASA, and I found out what a dangerous habit it was. I was terrified of losing my site, now that it was up and happily working. That was when a co-worker introduced me to fabric.

At first, I only used fabric to set up my server, meaning I could go grab a cuppa while my slice was updated and my packages were installed. I then branched out to getting it to install my site. After a while, I had developed a script for everything. It became almost completely unnecessary to every SSH to my server. My site became insanely stable, and my nerves started to ease about it going down.

Lesson learned: script everything

I have to admit, learning to script everything was a bumpy process. I would leave things out on occassion, leading to some very confusing debugging sessions. Happily, I learned this lesson before keeping a stable site up was a necessity. The best insurnace, I found, was killing your slice (or making a new one), and running all your scripts again. And again. And again. After the fourth time, I felt assured that I could get my server up again if terrible things befell it.

Lesson learned: rinse and repeat

These days, I'm still no server ninja. I believe that no one can ascend to that level of expertise without doing this full-time for several years, possibly more. I can, however, point to my site with no small amount of pride and say, yeah, I did that.

In a month!?

Years ago, I participated in something called Nanowrimo: National Novel Writing Month. If you've never done it, I can tell you, it's hilarous. You take the month of November, and in those 30 days, you write a book, start to finish. It will be bad. It will need a lot of work. It may not even be salvagable. I have never picked up the book I wrote that month and thought, yeah, I can do something with this. It got shut in a drawer and eventually tossed.

So why do it?

Get all the bad out

There's a theory, amongst writers, that you have to write so many bad words before you get to the good ones. One author figured that you had to write a million words of really bad prose before you started churning out the truly awesome stuff. Nanowrimo was a way to get through a huge chunk of those words rather quickly.

It seems a bit silly, but there's some wisdom to it. You accept that, yes, you will write crap, and that you're going to have to write quite a bit of it. It takes dedication to write a million words of prose. Even if you write a the frantic Nanowrimo pace of 1667 words a day with no vacations, you're still going to be writing for almost two years before you run out of crap. How can you not be better off after two years of constant practice?

Community

The community is amazing. I mean that. I don't do Nanowrimo anymore, but I still read the forums. These people are experts at blowing off steam, calming each other down, coming up with new ideas, and helping each other with research. They have a whole forum dedicated to finding an expert in whatever field you need for your crap book.

Take the idea for a test ride

We've all had those ideas, those ones that seem very close to good. They're the ideas we return to when we're in our cups. All of our friends have heard the muddled pitch, and have patiently sat through it until they can find something to distract us with.

This is a chance to take an idea for a drive around the block without having to commit too much to it. Maybe you'll finally find that fatal flaw in it and abandon it for better ideas. Or, maybe you'll take its flaws, smooth them out, and actually find something worth working on.

Learning

You learn a lot about yourself when you try to do something epic in a month. You learn what you don't know, for one. When there's no deadline, it can be easy to spend months working on a very simple task. When the loss of three days is catastrophic, you figure out what you have to get smart on, fast.

You also learn how tolerant you are to losing those pockets of free time. Did you notice that you were watching less TV? Happy about it? Or were you stealing time from things like laundry or dishes or those pesky family things that live with you?

So... why am I talking about this?

This would be awesome as a coding challenge.

Sure, sure, I know that day-long, week-long, and month-long coding challenges abound, but most of these focus on groups of coders working on a set of features. Nanowrimo is about writing a complete novel in one month, in only the spare time afforded to you. A coding version of that would be about getting a complete project out in thirty days. You start with nothing but a few napkin sketches, and end with a real, live site. And you do it alone.

Why alone? Because most of our personal projects wallow as we wait for some slack-ass friend to finally get around to helping us out, or we convince ourselves that the fantastic designer we get coffee with will join us, if we just make our pitch perfect enough. Guess what? Ain't gonna happen, people. Most of our projects will only be gotten off of the ground alone, only to be joined later by friends and collegues.

So, you would have a month to finally get off your butt and do that cool thing that you've really wanted to do.

Rules

How to figure out if you won

That last one is sort of important.

I think I'm going to take this idea for a test run by actually making a site for it in November. Anyone else care to join me?

Django Explorer - What's up?

Hey! Katie said Django Explorer would be done by now! What the hell?

Okay, okay, I did say I would be done with Django Explorer by now, and that it would be ready for a beta test. I'm not quite there, though I do hope another month will get me there.

What went wrong?

I was actually spot on for a beta-test for the end of the month. My week off between jobs gave me lots of time for data entry. A sprint at a coffee-shop got me even closer. I wasn't all the way done, but I was happy enough to toss it out there for a beta.

And then... an ocelot ate my OS.

The SO+ noted one day that my version of Ubuntu (10.04) was rather behind the times. It was? I checked, and woah! Yes! We were up to 11.10! That was lightyears away! I happily updated my Ubuntu machine, expecting to spend hours delighting in the new baubles that come with major releases.

What actually happened:

Ornery indeed.

Without Eclipse, I can't make APK's, which means I can't give you anything to play with. I'm sure there are ways to do this without Eclipses help, but I decided my time was better spent getting more data entered.

What is done?

I got tired of entering in data by hand, so I wrote up a little Django site for data entry. I then remembered that both my site and my app use SQLite, so I wrote up a script for converting my Django database to an Android database. It is stupidly easy, and I'll write up how I did it later.

Data-wise, I'm past the mountain of contrib and working on the much smaller packages. I plan on getting it released with everything entered up to Middleware. The documentation is very sparse at this point, as I'm taking pass approach to data entry. Each pass will get more detailed and refined, which is easier to do than 'completely' documenting each module before moving onto the next. Right now, it's the most basic description. Next iteration should have a usage for each, if applicable, or openly state that this isn't a package you should use directly.

Interface-wise, I have that mostly done. All that's left is to tweak padding, add search, and add bookmarking.

Okay, so I'm using a loose definition of 'mostly.'

I still want it naaaooooowww

Heh. Funny you should mention it. Technically, the apk has been up on Github since I first added it to the repo, months ago. I never advertised it, since it was rough, but if you want to install it, you can download it from there. Just keep in mind that you're going to have to check the option to allow third-party applications to be installed. If you uncheck this, you will probably not be able to run the app anymore.

Code Month: Day one

No, I'm not going to torment everyone with a day-by-day blow of my Code Month trials. the last thing I want to do is destroy feeds.

What you need to be doing

If you're joining me, you need to post somewhere, publically, what you'll be doing. Twitter is okay, but due to tweets evetually fading away into the ether, it's not the best. If you've never had a blog before now, this might be a good time to start one.

You also probably want to grab a domain, and make sure you have a server and development environment ready. Me, I use Rackspace for my hosting needs, and I develop on Ubuntu. I'm on travel this week, so my first efforts are going to be on a Mac. 

What did Katie get done?

Well, I did get a domain! Setting up a server, though? I'm on travel, so I went out to dinner, went back to the hotel, watched some My Little Pony (don't you dare judge me) and passed out. I'm hoping I can get my server set up after work today. I have a fabric script that should make it super easy... hopefully.

My project

As I said before, I want to get a site set up for a full on code month next year. This year will not only be about getting it up, but also recording the trials that pop up. Features will be pretty basic: registration, a public check-list, the ability to add items to a check list, and some sort of communication device. Oh, and maybe a board of some sort? Or blogging functionality?

*rereads that list*

Okay, so maybe not so basic...

Coming to DC?

Mad props to Jackie Kazil, who helped me write this post!

So, apparently y'all are coming to my neck of the woods next year?

I felt I should start a guide to DC that caters to those coming to next year's DjangoCon. I plan on updating this and re-posting this every few months, as the conference grows closer, and more tips come in via Twitter and the comments.

The location

DjangoCon DC is actually in Northern Virginia, not in the heart of the Capitol. Specifically, it's being held in Crystal City at the Hyatt Regency, which is close to the Crystal City Metro Station (the yellow and blue metro lines) and one stop away from Reagan National Airport (DCA).

I have worked in the area for many years, and while it doesn't have as much of the DC grit and history, it makes up for in being a great nexus between convenience and cost. As someone who's been to several conferences in DC, I can tell you this is a good thing. It is a safe, clean, affordable and transportation accessible part of the DC metro area that is littered with Django developers.

If, for some reason, you aren't going to be staying at the conference's hotel, you're in luck. DC has a LOT of hotels. In general, the closer they are to a metro stop, the more expensive they are, but it's still possible to find no-frills hotels very close to a metro stop. If you want to remain close to the main action, I would get a hotel at L'Enfant (which is close to the Mall), Crystal City, or National Airport. Franconia/Springfield may look convenient, but it's actually not close to anything.

Getting to DC

Flying


View DC airports in a larger map

There are three airports in the D.C. region. Travel sites like Hipmunk and Kayak try to make all our local airports equivalent, as if it's just a short jaunt from each to DC. This is a dirty, nasty lie.

The airport visible from the hotel is Reagan National. It is only one metro stop from the hotel (or just under a mile walk if you are crazy). The other airports, Dulles and BWI, are inconvenient but usually cheaper if you are on a budget and willing to spend an extra hour to two hours using a combination of shuttle services, Amtrak, buses, metro. If you choose to stomach one of the other options, then add about $15 to your trip. If you take a taxi, you could end up spending more than the cost of your savings.

If you're coming in on an international flight, it may be worth looking for a flight that lands at some other international airport like Atlanta or New York, then catch a flight into Reagan. Trust me, you will not regret this.

Train

The train station is located at Union Station. It can be nice way to travel if you are on the Eastern Seaboard. The commute from Union Station to the conference isn't bad, since Union Station is also a metro stop.

Chinatown buses and other bus services

For those on a budget or looking for adventure and located on the Eastern Seaboard you might check look into the Chinatown buses. Various companies in Chinatown shuttle to Baltimore, Philideplia, New York, and Boston. D.C. to New York is between three and five hours (depending on your driver aherance to the speed limit) and costs around $20 each way. They will drop you off in Chinatown near the metro, which is the same metro line that you would need to get to the conference. Sometimes you can find a service that offers wifi and plugs and sometimes there are live animals and sketchy late night stops. Adventure!

Other buses services will drop you off in other parts, but they are usually close to a metro stop. Bolt Bus is probably one of the nicest.

Driving

Don't. It's not worth it unless you are car pooling. You won't need your car while visiting. If you do though, you can park you car at the Hotel (expect to pay a pretty hefty amount per night, though).

Transportation

DC's metro is stupidly simple and is probably going to all the places you want to go. DC metro area cabs are priced pretty well as a back up. I wouldn't bother to rent a car.

However, if you want to rent a bike, I have good news! There's a Revolution Cycles in Crystal City that rents bikes by the week. I spoke with the owners, and they have about 100 bikes available. Given how many people are going to be in town, they recommended reserving one ahead of time.

I'm no bike enthusiast (I still think my green Huffy was pretty rad), but I have been informed by bike geeks that these are good bikes.

There is also BikeShare, which is like Zipcars for bikes, through DC and in the conference hotel neighbor. Bring your own helmet, though. Don't be one of those guys. But there are only 10 spots at the hotel, so don't count on easily finding a bike at the conference. This is a better option used to tool around D.C. for a couple hours.

At the moment, I don't have much information regarding bike parking at the hotel. Hotels in the region are starting to have bike parking sections available, but if you're renting a bike for the week, keep in mind that you might be keeping it in your room (I hope I'm wrong).

More soon...

This list is highly incomplete. As time passes, I will post more info on entertainment, food, cultural activities, and going out. I hope to add to this guide and re-post it every few months. Have some suggestions? Hit me up in the comments, or find me out there in the ether.

Code Month: Mid-Point

So, upon working on Code Month, I've realized some things I don't have in my toolkit that would have made things much, much easier.

Fab scripts

I already had a fab script to set up my server, which was awesome. Within a few minutes I had a patched Ubuntu server with everything I needed running. Go me!

I then started to set up my local... and everything went to hell.

I always forget how to set up my media directories correctly in Django. Always. For the most part, I'm working on sites where this has already been done, so I'm doing this from scratch, at most, a couple of times a year. That isn't enough to burn the process into my brain. Add to that that, between versions, it seems to shift slightly, and my new projects always seem to be timed for just after a feature release.

Lesson learned: If you can't rattle off how to do it from the top of your head, script it.

New tools

When starting a new project, it's tempting to think about all the cool tools you've been meaning to look up and use. If you have loads of time, and the tool fits the project, I heartily recommend going and getting those tools and taking them for a test drive.

If you want a project done in a month, you do not have a lot of time.

I was bitten by the optimism bug, and it cost me precious time. My particular downfall was thinking, hey, I haven't looked at Pinax in a while! I bet I could use that to do most of my work for me!

That is a true statement: Pinax will do much of the work for me. However, I lost several days reading up on it, getting distracted by OHH SHINEY, finding inconsistencies in the docs that I tried foolishly to overcome by sheer force of stubbornness.

Lesson learned: stick to the tools you know. The cool stuff can come in after launch.

Comps

I really should have had more comps at the ready when I started. Ideas are awesome, really. I love ideas. But they are not welcome when I need to actually be coding something. If I have a comp, the project is no longer full of potential places to put awesome things: it's a concrete thing that I need to work towards.

Lesson learned: my brain hates me and will undermine me if I don't give it a solid task list.

Time

I can't put the family up for adoption for a month. I can't stop working (and I refuse to work on the project during any work hours). People still want to see me on occasion. So, what to do?

I've had issues carving out time, always assuming that I would be fine coding in the evening. I'm not. I'm tired, and I turn into a pumpkin way early. Next time, I'll get in the habit of getting up early instead.

Lesson learned: Know when you're going to get this done when you start.

So where am I?

Ugh. Not as far as I'd wanted to be. This was only meant as the trial run, however, so the real product of this month might be all of the things I'm beginning to realize I need rather than an awesome site.

GDD - RSS Feeds

I've decided to start a new occassional series, called God Dammit, Django. If I say "God DAMMIT, Django!" more than three times in one coding session before solving my problem, that's a sign that I need to blog about the solution.

Why do this? One of my regrets as I've learned new systems is that I didn't blog as I went, documenting my pitfalls for the benefit of others. I dearly wish I had done this for my time with Android: now, many of the system's foibles are second-nature to me, and I struggle to explain them to a novice. At the time, when I googled furiously, my nerves frayed and my patience worn thin, I wondered why no one had posted about this small gap in the documentation. Today, I have determined that at the very least, I will be that person.

Today, I talk about Django's syndication framework.

Django and RSS feeds

RSS feeds are actually quite simple to set up in Django, once you know the ins and outs. It's easy to put up a working feed. It's not as easy to put up a feed that works well, however.

When I started blogging again, I decided that I wanted to be in the Django Feed. In order to do this, I needed an actual feed for all of my Django posts. I looked at the Django documentation, and made a rough feed in a just a few minutes. I tested it. Hm... It was just the title of my posts. That wasn't good. I really wanted to submit my feed by the end of the day, though (I had a blog post coming up that I wanted to hit the community), so I went ahead and submitted it. I could always fix it over the weekend!

Oh, silly me.

For the record, this was my feeds.py file at the time:

from django.contrib.syndication.views import Feed
from basic.blog.models import Post

class DjangoEntriesFeed(Feed):
    title = "Latest Django entries from The Real Katie"
    link = "/blog"
    description = "All of the latest blog entries tagged with Django from thereakatie.net"
    def items(self):
        posts = Post.objects.filter(tags__contains='django').filter(status=2)
        return posts.order_by('-created')[:5]
        
    def item_title(self, item):
        return item.title

    def item_content(self, item):
        return item.body

class LatestEntriesFeed(Feed):
    title = "TRK Latest Entries (All)"
    link = "/blog/"
    description = "All of the latest blog entriest from TheRealKatie.net"

    def items(self):
        posts = Post.objects.filter(status=2)
        return posts.order_by('-created')[:5]

    def item_title(self, item):
        return item.title
    
    def item_content(self, item):
        return item.body

Time passed. I kept meaning to go back to it, but life kept either tossing challenges my way or wonderful shiny things. RSS feeds aren't fun. On occassion, I'd pick up the docs and think about sorting out my RSS feed, but after a few half-hearted attempts, I'd return to other things.

This weekend, I determined that I wasn't going to let this feed get the better of me any more. I would SORT IT OUT.

Early Sunday morning, I settld in with my coffee and my laptop and dove into the docs. After not seeing anything obvious, I googled around. I went back to the docs. I pulled up the Django code for their syndication framework. I googled.

I'd like to be able to point to one post that made it all better, but then this would be a very short blog post. What I discovered came from the docs, the code, and many, many blogs.

Round one

A-HAH! I hadn't overridden a function correctly! My second go looked like this:

from django.contrib.syndication.views import Feed
from basic.blog.models import Post

class DjangoEntriesFeed(Feed):
    title = "Latest Django entries from The Real Katie"
    link = "/blog"
    description = "All of the latest blog entries tagged with Django from thereakatie.net"
    def items(self):
        posts = Post.objects.filter(tags__contains='django').filter(status=2)
        return posts.order_by('-created')[:5]
        
    def item_title(self, item):
        return item.title

    def item_content(self, item):
        return item.body

class LatestEntriesFeed(Feed):
    title = "TRK Latest Entries (All)"
    link = "/blog/"
    description = "All of the latest blog entriest from TheRealKatie.net"

    def items(self):
        posts = Post.objects.filter(status=2)
        return posts.order_by('-created')[:5]

    def item_title(self, item):
        return item.title
    
    def item_content(self, item):
        return "OH HAI THERE"     # You can see one of my tried and true methods here: Break the hell out of things.

    def item_description(self, item):
	return item.body

The important bit is item_description. Finally, the feed had the actual content of my posts. Two problems: one, I didn't want my whole post in the feed, and two, the HTML had been escaped out. God dammit, Django.

Round two

We were closer, but I couldn't post this monstrosity as my feed. It was hideous. I mocked people who posted feeds like this. Back to the trifecta of google, the docs, and messing around with random things.

After a few minutes, I realized that I needed some templates. The Django syncdication framework comes with its own handy templates, but they love their autoescaping and hate all HTML. The ones I made were mind-crushingly simple:

posts/post_partial_body.html

{{ obj.body }}

posts/post_title.html

{{ obj.title }}

And I added them to the feed class:

from django.contrib.syndication.views import Feed
from basic.blog.models import Post

class DjangoEntriesFeed(Feed):
    title = "Latest Django entries from The Real Katie"
    link = "/blog"
    description = "All of the latest blog entries tagged with Django from thereakatie.net"
    def items(self):
        posts = Post.objects.filter(tags__contains='django').filter(status=2)
        return posts.order_by('-created')[:5]
        
    def item_title(self, item):
        return item.title

    def item_content(self, item):
        return item.body

class LatestEntriesFeed(Feed):
    title = "TRK Latest Entries (All)"
    link = "/blog/"
    description = "All of the latest blog entriest from TheRealKatie.net"
    title_template = "feeds/post_title.html"
    description_template = "feeds/post_partial_body.html"

    def items(self):
        posts = Post.objects.filter(status=2)
        return posts.order_by('-created')[:5]

    def item_title(self, item):
        return item.title
    
    def item_content(self, item):
        return "OH HAI THERE"

    def item_description(self, item):
	return item.body

I tested. Yes, the feed still looked like crap, but now I had a place to put my fixes.

I changed posts_partial_body.html to this:

{{ obj.body|striptags|truncatewords:50 }}

I reloaded, and... Yay! The tags were gone, and only the first fifty words of my post appeared! Huzz-- wait. What's that hashtag doing there?

Django was autoescaping out my apostrophes. God dammit, Django. Fine. Autoescape ALL the things.

{% autoescape off %}
{{ obj.body|striptags|truncatewords:50 }}
{% endautoescape %}

I'll take my chances with those hussy aprostrophes.

Round three

Seems like I was done at that point, right? Almost. Halfway through writing this post, I realized I'd never updated my Django feed (the feed I ACTUALLY wanted to fix. D'oh.) Then, looking over the code once more, I realized that I didn't actually need some of the stuff that was in there, now that I had my templates. Double d'oh.

I brought up my editor again and ended up with this:

from django.contrib.syndication.views import Feed
from basic.blog.models import Post

class DjangoEntriesFeed(Feed):
    title = "Latest Django entries from The Real Katie"
    link = "/blog"
    description = "All of the latest blog entries tagged with Django from thereakatie.net"
    title_template = "feeds/post_title.html"
    description_template = "feeds/post_partial_body.html"

    def items(self):
        posts = Post.objects.filter(tags__contains='django').filter(status=2)
        return posts.order_by('-created')[:5]
        
class LatestEntriesFeed(Feed):
    title = "TRK Latest Entries (All)"
    link = "/blog/"
    description = "All of the latest blog entriest from TheRealKatie.net"
    title_template = "feeds/post_title.html"
    description_template = "feeds/post_partial_body.html"

    def items(self):
        posts = Post.objects.filter(status=2)
        return posts.order_by('-created')[:5]

Much, much nicer. I could stop cussing at Django again.

Katie finally talks about her fabfiles

Every time I post about using Fabric, I get the same request: please post my Fabric files. I always intend to, but stop short. Commenter Justin made me realize what had been holding me up. Fab files are usually honed for the style of the developer and project.

So, rather than just post my fab files, I'm going to talk about the kinds of fabfiles I've created.

Building the server

This was the first thing I wanted to automate, mostly because building servers is a long task, and I'd rather being running out for a coffee than hovering over a command line, hoping I don't have to hit yes or something (it's a 10mb download onto a 1TB machine, YES I AM COOL WITH THIS). It's also something that is a must if you're still learning about servers, as you ARE going to break your server at some point.

All I really want after running this script is an environment where I can start doing my work. All the stupid paths are where they need to be, and have the right permissions, and all my packages are installed and ready to go.

Below is the very first script I had for setting up a server, pulled out from the archives of my Git repo:

from fabric.api import run, sudo, hosts, settings, abort, warn, cd, local, put, get
from fabric.contrib.console import confirm
from fabric.contrib.files import exists, sed

import string, random

PACKAGES=('apache2',
          'libapache2-mod-python',
          'subversion',
          'sqlite3',)
          
DJANGO_REPO="http://code.djangoproject.com/svn/django/tags/releases/1.2.3/"

def add_user(user):
    sudo('useradd %s' % user)
    sudo('echo "%s ALL=(ALL) ALL" >> /etc/sudoers' % user)
    password = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(8))
    sudo('echo "%s:%s" | chpasswd' % (user, password))
    print "Password for %s is %s" % (user, password)
    
def setup_server():
    for p in PACKAGES:
        sudo('apt-get -y install %s' % p)
    sudo('cp /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled')
    
        
def django_setup():
    sudo('svn co %s /usr/share/django' % DJANGO_REPO)
    sudo('chown -R www-data:www-data /usr/share/django')
    sudo('ln -s /usr/share/django/django /usr/lib/python2.6/dist-packages/django')
    sudo('ln -s /usr/share/django/django/bin/django-admin.py /usr/local/bin/django-admin.py')
    sudo('mkdir -p /var/www/mydjango/django_projects/data')
    sudo('mkdir -p /var/www/mydjango/django_templates')
    sudo('mkdir -p /var/www/mydjango/media')
    sudo('ln -s /usr/share/django/django/contrib/admin/media /var/www/mydjango/admin_media')
    sudo('chown -R kcunning:kcunning /var/www/mydjango')
    sudo('rm -rf /etc/apache2/sites-available/default')
    sudo('rm -rf /etc/apache2/sites-enabled/*default')
    
def django_site():
    sudo('chown www-data /var/mydjango/django_projects/data')
    sudo('chown www-data /var/mydjango/django_projects/data/realkatie.db')
    sudo('service apache2 restart')
    
def put_files():
    sudo('mkdir -p /tmp/deploy/')
    local('git clone git@github.com:kcunning/The-Real-Katie.git')
    local('tar cvf deploy-files.tar The-Real-Katie/*')
    put('deploy-files.tar', '/tmp/')
    sudo('tar xvf /tmp/deploy-files.tar -C /tmp/deploy')
    local('rm -rf The-Real-Katie')
    
def place_files():
    sudo('mv /tmp/deploy/The-Real-Katie/config/therealkatie.net /etc/apache2/sites-available/')
    sudo('mkdir -p /var/www/mydjango/django_projects/realkatie')
    sudo('mv /tmp/deploy/The-Real-Katie/django/*.py /var/www/mydjango/django_projects/realkatie')
    sudo('mv /tmp/deploy/The-Real-Katie/django/realkatie.db /var/www/mydjango/django_projects/data/')
    sudo('chown www-data /var/www/mydjango/django_projects/data/')
    sudo('chown www-data /var/www/mydjango/django_projects/data/realkatie.db')
    sudo('rm -rf /tmp/deploy')
    
def services():
    sudo('a2ensite therealkatie.net')
    sudo('service apache2 restart')
    
def deploy():
    add_user('kcunning')
    setup_server()
    put_files()
    django_setup()
    place_files()
    services()

Is this the prettiest fabfile ever? Oh, hell no. Looking back at it, I see I had, at some crazy point in my past, decided to use mod-python rather than mod-wsgi. I had my database checked into my git repo (to be fair, it was small, and my repo is private). It got the job done, though. I could take a blank server and get my site up really quickly. And those paths? From a blog post I had turned to in a moment of desperation. Ugh.

Some patterns were set up that helped mold my later fabfiles, though. If you look at my deploy function, you can see what might as well be a checklist all my server setup fabfiles:

Once you have that working, you'll want to build some other fabfiles to help you out.

Updating your apps

I have a set of files I use to update various sections of my application. Ideally, I should never, ever, EVER have to log onto my server, nor should I have to push anything by hand. Every fabfile checks out my code from my git repo. This keeps me honest: it's way too easy to assure yourself that you'll check it in 'later'.

At this point, you've probably got some cross-over in your code, so I'd recommend building a library. I won't post my library (once again, it's something that would only work if you knew my logic for how I set up my server), but the list of functions should give you an idea of what you need:

This way, I can write up a few small fab files for doing regular tasks like updating templates, media, or my application files without having to do a bunch of rewriting. Short fabfiles are happy fabfiles. For example, this is the file I use to update templates, media, and application files:

from fabric.api import run, sudo, hosts, settings, abort, warn, cd, local, put, get
from fabric.contrib.console import confirm
from fabric.contrib.files import exists, sed

from library import get_files, put_files, place_files, services
    
site_url = "therealkatie.net"
site = "realkatie"
    
UPDATE_SETTINGS = (
    
    )
    
UPDATE_TEMPLATES = (
    ('base.html', ''),
    )
    
UPDATE_MEDIA = (
    ('main.css', 'css'),
    )

    
def deploy():
    get_files(UPDATE_TEMPLATES=UPDATE_TEMPLATES, UPDATE_MEDIA=UPDATE_MEDIA, site=site)
    put_files()
    place_files(UPDATE_TEMPLATES=UPDATE_TEMPLATES, UPDATE_MEDIA=UPDATE_MEDIA, site=site)
    services(site_url = site_url)

The only thing I change is which files I'm updating. Why not use my last checkin? I tend towards the explicit when it comes to updating files, as I'm a big ol' scaredy cat, but that doesn't mean there's anything wrong with just grabbing the files from your last checkin and working with those. You badass.

For when you are very, very bad

I also have one last file, and it's for when I'm a very bad person. I know that, ideally, I should never change things on production without them being checked into my repo. The world I live in is far from idea, so sometimes I need to grab what I've changed on my server and make sure it gets checked in.

You are also not a good person. Make sure you write something to sync your files down. I recommend having the fabfile call you bad names, so you'll stop doing that.

Code Month: Post Mortem

I had meant to post something on the first, but life got away from me in a crazy way.

Last month, I talked about doing a Nanowrimo-style sprint-of-one for getting a website up. How'd that turn out? I didn't get the site up (otherwise, you would have had a joyous post gushing about it), but that really wasn't what I wanted to come away with. I wanted to get a sense of what might be helpful in helping others do a code month.

The timing

Is November the right month to do this? Nanowrimo officials make a great case for using November: life is busy. You have to learn to fit writing into your already busy life, so why not start out at the start of the holiday season, when demands on your time are high? I like that, and the time I actually finished a novel, I did have to work hard to make sure that I used those bits of time. I woke up early and wrote for thirty minutes before going to work. I wrote on my lunch break. I cranked out a few more words while dinner was cooking.

Does this work for coding?

Honestly, I don't think it does. Sure, I've made sites on my commute in and out of the city, but I always had to keep an eye on my progress. Stopping in the middle of a bit of tricky code can be dangerous. In general, these were simple things, and they ended up taking me a lot longer to make because I kept having to slam my laptop shut and get off the train.

The take-away from a Code Month isn't utilizing tiny pockets of time. It's about organizing yourself, knowing your limits, and knowing what pockets of time work for you. Prose doesn't break if you start and stop: it's just not as good as it could be. Code will break, costing you hours as you try to unbreak it to save that one nugget of good within.

Another issue with November is Nanowrimo. Many of the people who talked about Code Month talked about having to either give up Nanowrimo, or try and do both. That's not good for these people, and I hated the idea of people rushing to do two Herculean tasks and failing at both. Sure, they might learn some valuable lessons about stretching oneself too thin, but they also might burn themselves out.

Community

I knew I wasn't going to have any community when I started this, and I was interested to see how my motivation stood up to that. It didn't. I got some impressive things done, but when other things came up, there was no pressure to keep going. I didn't have any of my friends pestering me about my site, or lording their progress over me. I didn't have a page I could update to show everyone how awesome I was. Nothing nagged me.

Asides from the nagging and bragging, I was missing out on a community of people doing approximately the same thing at the same time. Sure, I can find tons of blog posts about installing whatever I want, but many are written with hindsight firmly in place. They forget tiny steps, or the blog post only applies to older versions of its *nix distro.

What about asking in other channels? Sure, I can do that (and did), but when everyone's in the same boat, there's a different urgency in the answers. They know I have to get my server up this week, or I'll be falling behind. In a general channel, urgent questions seem to inspire some answers, and much more philosophical debate.

"Does anyone know how to get X set up on Ubuntu 10.04?"
"But why are you using 10.04 Ubunut?"
"It's what I know, and I don't really have time--"
"You realize that we're up to 11.10, now, right?"
"Yes. I get that. But I don't have time to learn the issues with the new release. Do you know how to--"
"There really are a lot of great things in 11.10. Let me show you my diagrams."

Is it done yet?

When doing Nanowrimo, it's easy to see how close you are to 'done': you do a word count. Sure, if you're trying to write a proper novel, you might keep track of your pacing, but it's completely kosher to pull a Gainax Endingon November 30th, ten minutes to midnight.

How do you do the same thing for a website? When is it 'done'? Rather than engaging in a philosophical debate about the benefits of permanent beta, I realized that what I wanted was some sort of metric to judge my pacing. That way, I could see if I was falling behind and compare myself to others. I had a loose idea of what these things might be (it's not my first rodeo, after all), but the timing was something that would have been useful. Can I afford to send three days playing with Pinax? How long should I be tweaking CSS?

The future

After bringing it up at the last DC PyLadies meeting, it was proposed that I move Code Month to June. That way, students can participate without worrying about fitting it into their classes, and us working schleps won't be balancing family life and holidays with hacking. By then, I'll have launched the site and had time to refine the checklist and community aspects. Hopefully, by then, a bit more interest will have been drummed up, and we'll have some people to populate the community tools.

If you have any ideas or suggestions, or just want to help, please let me know in the comments, or email me.

A year looking back, and looking forward

I'm not big into resolutions. I've only had it work one year, and that was because my resolution was to go on a cruise. That's not exactly the most strenuous goal to work towards, is it?

I still like the end of the year, though, for a chance to look back. After the insanity that is Christmas with two children and a large family, there really is no better time of year to just chill and think for a bit.

2011 was a busy year for me. I moved in with my then-boyfriend, now-fiancé. I got engaged. I switched jobs, and really, ecosystems. No longer stuck in the mire of government red-tape, I'm now in the fast-paced environment of the media. I went from trudging to an office every day to working from home. I got back into conferences. I signed a deal to write a book. I went on a family vacation, and we all survived without getting boiled or strangling each other. I survived my first flight with the kids, and they didn't punch each other over who got the window seat.

2012 will be busier.

That book I mentioned? It's due in May. I've obligated myself to two conferences. I have a tutorial (though most of the heavy work goes to my co-presenter, thank ghu), a presentation, and a poster to do. I'm going to be pushing accessibility at Cox. I'm taking over running PyLadies DC, which includes a introductory class. The boy starts middle school. The girl gets older and smarter, and will start preschool. I'll upgrade the SO+ to a DH. I'll be releasing Django Explorer(really, really!).

Aside from all the things I -must- do, I like to add in some things that I would like to do. I believe in the developer's standard of learning a language a year. Last year was Lisp. I still suck at Lisp, but it did make me think about certain problems differently. This upcoming year, I'm breaking out the box of Arduino and actually making something, using C. Sure, I could just learn C on its own, but without a project, I find that it can quickly go to the wayside. This is part of the reason I suck at Lisp, but do well in Android. I had a project with Android.

I also want to re-introduce the boy to the world of table-top gaming. Long ago, I had started to game with him, but then I became pregnant with his little sister, and she wiped my energy stores. Further proof that little sisters ruin everything. I should know. I am one.

It's a good thing a year has twelve months. I think 2012 will be learning about how hard I can push myself and not end up as a pile of goo.

Fab for All

So, you know how you think you're going to get home from the conference and hop on your computer and do all sorts of awesome things like you said you would? And you know how that's complete and utter BS? I came home and collapsed for about a week. Or two.

At PyCon2012, I gave a talk about setting up your first site in the cloud. It was well received, and there were many requests for me to put up my fab files, in spite them being utter crap. Well, I've gone and done that.

The fab files are very rough. I tried to tidy them up a bit, but in the end, ended up hitting commit and hoping for the best. My hope for this repo is:

I'd really like, at the end of the day, to have a set of scripts that are not only functional, but easy to learn from, and easy to use. And I'd really welcome community support on this!

(Sorry about the cross-posts on Planet Django and Planet Python! I usually try to pick one!)

DjangoCon - DC Tips

Mad props to Jackie Kazil, who helped me write this post!

So, coming to DjangoCon in September? Let's have a chat about DC.

The location

DjangoCon DC is actually in Northern Virginia, not in the heart of the Capitol. Specifically, it's being held in Crystal City at the Hyatt Regency, which is close to the Crystal City Metro Station (the yellow and blue metro lines) and one stop away from Reagan National Airport (DCA).

I worked in the area for many years, and while it doesn't have as much of the DC grit and history, it makes up for in being a great nexus between convenience and cost. As someone who's been to several conferences in DC, I can tell you this is a good thing. It is a safe, clean, affordable, and transportation-accessible part of the DC metro area that is littered with Django developers.

If, for some reason, you aren't going to be staying at the conference's hotel, you're in luck. DC has a LOT of hotels. In general, the closer they are to a metro stop, the more expensive they are, but it's still possible to find no-frills hotels very close to a metro stop. If you want to remain close to the main action, I would get a hotel at L'Enfant (which is close to the Mall), Crystal City, or National Airport. Franconia/Springfield may look convenient, but it's actually not close to anything.

Getting to DC

Flying


View DC airports in a larger map

There are three airports in the D.C. region. Travel sites like Hipmunk and Kayak try to make all our local airports equivalent, as if it's just a short jaunt from each to DC. This is a dirty, nasty lie.

The airport visible from the hotel is Reagan National. It is only one metro stop from the hotel (or just under a mile walk if you are crazy). The other airports, Dulles and BWI, are inconvenient but usually cheaper if you are on a budget and willing to spend an extra hour to two hours using a combination of shuttle services, Amtrak, buses, metro. If you choose to stomach one of the other options, then add about $15 to your trip. If you take a taxi, you could end up spending more than the cost of your savings.

If you're coming in on an international flight, it may be worth looking for a flight that lands at some other international airport like Atlanta or New York, then catch a flight into Reagan. Trust me, you will not regret this.

Train

The train station is located at Union Station. It can be nice way to travel if you are on the Eastern Seaboard. The commute from Union Station to the conference isn't bad, since Union Station is also a metro stop.

Chinatown buses and other bus services

For those on a budget or looking for adventure and located on the Eastern Seaboard you might check look into the Chinatown buses. Various companies in Chinatown shuttle to Baltimore, Philideplia, New York, and Boston. D.C. to New York is between three and five hours (depending on your driver aherance to the speed limit) and costs around $20 each way. They will drop you off in Chinatown near the metro, which is the same metro line that you would need to get to the conference. Sometimes you can find a service that offers wifi and plugs and sometimes there are live animals and sketchy late night stops. Adventure!

Other buses services will drop you off in other parts, but they are usually close to a metro stop. Bolt Bus is probably one of the nicest.

Driving

Don't. It's not worth it unless you are car pooling. You won't need your car while visiting. If you do though, you can park you car at the Hotel (expect to pay a pretty hefty amount per night, though). If you want to bring your car, bring a GPS and some antacids. I've been told we're pretty bad drivers around here.

Transportation

DC's metro is stupidly simple and is probably going to all the places you want to go. DC metro area cabs are priced pretty well as a back up. I wouldn't bother to rent a car.

However, if you want to rent a bike, I have good news! There's a Revolution Cycles in Crystal City that rents bikes by the week. I spoke with the owners, and they have about 100 bikes available. Given how many people are going to be in town, they recommended reserving one ahead of time.

I'm no bike enthusiast (I still think my green Huffy was pretty rad), but I have been informed by bike geeks that these are good bikes.

There is also BikeShare, which is like Zipcars for bikes, through DC and in the conference hotel neighbor. Bring your own helmet, though. Don't be one of those guys. But there are only 10 spots at the hotel, so don't count on easily finding a bike at the conference. This is a better option used to tool around D.C. for a couple hours.

At the moment, I don't have much information regarding bike parking at the hotel. Hotels in the region are starting to have bike parking sections available, but if you're renting a bike for the week, keep in mind that you might be keeping it in your room (I hope I'm wrong).

More soon!

I'm going to post something about our tourist scene, if anyone is interested in seeing the sites while you're here.

DjangoCon 2012 - Life in DC

As long as you're in town, you might as well see some of the sights, right?

Smithsonian

When people come into town, I always point them at the Smithsonian. It's an awesome set of museums that are completely free. You can spend a week going through them and still not see all of the exhibits. They're also only closed two days a year, and neither of those days are during the conference.

If you're a gamer, make sure to check out The Art of Video Games at the American Art Museum. If gaming isn't your thing, there's still plenty to see.

Other museums

I adore the International Spy Museum and the Museum of Crime and Punishment. They film America's Most Wanted in the latter! You can get deals for both museums off of Groupon on a regular basis, so keep an eye out for those.

Nearby, there's also a Madame Tussauds if you want to go look at creepy wax people. Also, the National Academy of Sciences has a museum that's super cheap and has some awesomely detailed exhibits. It's not a huge museum, but it's packed with information. They're closed on Tuesdays, so plan accordingly.

And there's so many more! We have no shortage of museums.

Monuments!

If you want to see monuments, buy a step-on-step-off tour. Seriously. The monuments are NOT close to each other, and some of them are surrounded by highway. The buses come by every thirty minutes, which is about how long a monument is likely to entertain most people.

I wanna run!

I confess: I'm not a runner. I've toyed with Couch-to-5k a few times, but the summer always beats me. I did, however, find this trail right by the hotel. amk also recommended Bike Washington for some multi-purpose trails.

I need to go shopping

You forgot to pack socks. We're hit by a freak snow storm. They lost your luggage. Your kids will not let you back in the house without souvenirs. The vendors ran out of your t-shirt size. It's cool. We've got you covered. We're right by the Crystal City Shops. They're easy to miss because the shops are hidden inside the buildings at Crystal City, behind the restaurants.

If your needs aren't covered by those stores, you can ride one metro stop over to Pentagon City Mall and pick up almost everything you need, from clothes to Apple connectors. They even have a Costco, if you need a palate of danishes or something.

Next: FOOD

Yes, you want to eat and possibly hit up a bar while you're here. I'm still compiling that list! Locals, shout out your favorites so I can add them.

DjangoCon 2012 - Eating in DC

A caveat: When I'm eating in DC, it's usually because there's a Capitals game going on. I have very deep knowledge of the food options near the Verizon center and that's about it. Happily, DC people are heavy users of Yelp and such, so finding the good places isn't too difficult.

I highly recommend making reservations if you can. DC is unpredictable. I've walked into a restaurant on Friday night and found it dead. I've gone back a few weeks later on a Tuesday, and it's jammed. You don't know when conferences will be in town, so just save yourself some heartache and use Open Table.

That said, here's my list of places to eat and drink in DC!

Near the hotel

The hotel is near quite a bit of food. Some of the restaurants are chains (though higher-quality chains) and some are family owned.

Let's go to the city!

The city is a short metro ride away. I highly recommend making the trek at least once.

Chinatown

Um, this is awkward. See, we have a Chinatown... and we put a stadium in the middle of it. As a result, our Chinatown isn't what most people expect. We have a Ruby Tuesdays with Chinese calligraphy all over it. It's a bit weird.

It's still a great place to go grab something to eat. There's a ton of restaurants down there, and they range from the extremely pricey to the fairly cheap. If I'm with a group of mixed gastrointestinal needs, I'll head to Chinatown.

Downtown

If you're visiting the Mall, do yourself a favor and DO NOT eat on the Mall. It's expensive. Walk a few blocks away.

Also recommended, for those wanting to put on fancy clothes, is The Capital Grille.

Old Town Alexandria

If, for some reason, you don't want to go to the city, take the metro down to King Street. There, you'll be in Old Town Alexandria. Lots of shopping, bars, and privately owned restaurants. This is a quieter option for those that don't want to be in the city (DC really isn't that busy, though, unless you're driving).

Food trucks

We have food trucks! Though the conference provides lunch, it can be fun to go track one of these down instead. Also, many are open for breakfast as well.

They move around from day to day, so check out Food Truck Fiestafor what's going on by us that day.

I'm ________

Paleo: Many restaurants will have some sort of meat 'n' veggies option. Retro Rays seems to be popular with the paleo crowd, though, and the buffalo at Ted's is grass-fed. And really, you can't go wrong with Fago de Chao.

Vegan: I rarely dine with vegans in DC. Most of my friends in the area are vegetarian, and that's completely different when looking for a restaurant. Happily, Urban Spoonhas a list for you! I can highly recommend 2Amys, Clydes, and Busboys and Poets.

Gluten-free: Many places around here offer gluten-free options. Urban Spoononce again comes through with a list of GF places.

Triple D likes...

These places!

I need to do this on the cheap

Every year, The Washingtonian Magazine puts together a list of Cheap Eatsfor the DC area. It's seriously worth checking out. I recommend hitting Five Guys if you can. This goes double for you West Coasters, so you can compare it to In-N-Out.

Next time!

How to Metro!

DjangoCon 2012 - Metro

The DC area has a commuter rail called the Metro. It's pretty easy to use in my opinion. Still, I've had to give enough impromptu lessons to tourists to know it's not completely intuitive.

The Map

A map of the Metro rail system

Do yourself a favor and get a copy of the Metro's rail map now, whether you store it on your phone or in your backpack. They have one of these maps on every car and in every station, but sometimes people stand in front of them.

Lines are indicated by color (that part should be intuitive). Stops are indicated by circles. If a stop appears on more than one line, then you can transfer there.

A close up of the Metro map, showing which stations are transfer points, and which are not. In spite being next to an orange line, one station is red line only because the station dot is not on the orange line.

Why are some of the stops double circles? Because they're the first or last place you can transfer to a new line. They're not the only places you can transfer. Any circle on any color (even those that run under two other lines of color) are transfer stations. For example, at L'Enfant Plaza you can transfer to orange, blue, green, and yellow lines.

One metro stop where four lines stop.

Something to keep in mind: The map is not to scale. Some stops, you can get off and walk to the next stop with no issues. Some will land you miles away from where you wanted to be. Unless you know for certain that another stop is a good alternative, do not get off of the Metro at a stop that seems to be 'close'.

Catching a train

Trains are labeled by two things: color and end destination. When you're in a station, look for the platform that matches the color of the train you're trying to get and the end destination of that line. So, if you're at the Crystal City station and you want to go to Gallery Place / Chinatown, get on the platform for the Yellow Line, on the side that ends in Fort Totten (or Greenbelt, if you happen to see a yellow train going to Greenbelt. Either works).

To find your platform, follow the signs and pillars for your line's color AND final destination. In some stations, one line has trains in both direction serviced by one track. In others, you're on completely different levels.

Once you're at your platform, there should be a sign announcing when the next train is, what color it is, what it's final destination is, and how many cars it has. Trains stop at the end of the platform (consider the opening where the train is coming from the beginning).

The stations

On the escalators: Stand on the right, walk on the left. For the love of god, please do this so you don't give some poor Washingtonian a coronary.

The stations in the city are all underground, while the ones outside of the city are a mixed bag (though mostly above ground).

Many of the stations have cell service in the stations. This drops in the tunnels for some carriers. Get your stuff done before the train moves.

There's often more than one exit for a station. Some people look at one of the posted maps to figure out which one would be best for them. Me? I take the closest one, then turn on my GPS to figure out how to get where I'm going.

Tickets and fare

Fare is determined by three things: where you are, your destination, and what time it is. Either use the trip planner tool or look at the fair list in your beginning station (the fare list is almost always right above the rail map). Fares are one-way, and you need to add a dollar each way if you're using a paper ticket.

You can get either a FastPass or a paper ticket. If you're going to do any more Metroing besides going to and from the Regean National Airport, get a FastPass. It costs five dollars (you pay ten, but it comes with five bucks on it). Also, if your FastPass doesn't have enough money to get out of the station, it'll let you go negative. With a paper pass, you simply won't get out until you up the balance.

FastPasses are magnetic cards, so just touch the FastPass card to the FastPass shield, and the gates will open. A screen should show you how much you have on your card.

Transfers are free. Screwing up and going too far is free. Metro doesn't charge you until you leave the station.

We do not run 24 hours

We are not a cool train system that runs at all hours. It was a fight to get them to stay open past eleven, trust me.

Each station closes at a different time, so they each post a sign as you go in, stating when the last train will leave that station. There might be separate times for each line.

Rush+

UGH. Why did you do this to me, Metro? Rush+ was added recently to make trips a bit shorter for people working in the city who work off of one line, but live / park on another.

Anyway, some trains only run on certain tracks and certain times. These are indicated by the dashed lines (for example, a Yellow Rush+ train runs from King Street to Franconia-Springfield).

Rush+ trains only run Monday through Friday in the morning (6:30am - 9:00am) and in the evening (3:30pm - 6:00pm).

Mobility challenged

Every station has escalators and elevators. That said, they go out of service. It's rare that I walk into a Metro station and don't see an escalator / elevator outage warning. If you can't use the stairs, keep an eye on the outages, either on WMATA's site or through one of the Metro apps.

If there is an outage, they'll usually pick another stop and offer a shuttle from that one to the stop with the outage.

Next

I think that's it for now! If you have any questions, hit me up in the comments!

Accessibility: Look at What's Out!

Overnight, my book on making accessible websites was released. It's my first book, and I'm completely over the moon. Not only do I get my own animal, but I get to put a book out on something I'm passionate about. I get to help break the paradigm that accessibility is too expensive, just about the blind, or only benefits a small portion of the population.

Even better is the timing: I'm teaching a tutorial at DjangoCon on making accessible websites. I've been super jazzed about being able to do more than drive-by conversations with people about accessibility. It's one of those topics that many people approach with skeptisism, but leave with a budding interest. This time, I'll be able to take that interest and mold it into a deeper understanding in what it means to be accessible.

We also get to improve a really bad restaurant site, which I think will be cathartic for most of us.

There's space at the tutorial, so if you're at DjangoCon or in the DC area, you can still sign up! And heck, you can say you took a class on accessibility from the woman who wrote a book on it.