Raw Syntax

The stuff programs are made of

Reload Your App With Guard and Pow

About 6 months ago I started using Pow for serving my apps in development mode. It loads any RACK compatible app, and allows you to access your projects via the .dev and named symlinks stored in ~/.pow (for example http://my_project.dev). No need to specify a port either!

Very shortly afterwards I ran into a problem. When I’m working on a Sinatra app, normally I use the shotgun gem for automatic reloading. I can’t do that when I’m running Pow. So I dug into Pow’s documentation.

Pow supports passenger-style reloads via these commands:

touch tmp/restart.txt
touch tmp/always_restart.txt

That’s somewhat helpful. However, remembering to run touch tmp/restart.txt every time I make a change is a pain. Creating tmp/always_restart.txt reloads every time, but makes the app painfully slow. I don’t need a reload for every css / image / js asset that is fetched.

Guard to the rescue! Guard is a simple tool. Watch files; run commands on change. There is already a guard-pow gem. Which touches tmp/restart.txt on file change.

To use it, add guard-pow to your Gemfile. Then define a Guardfile telling it which files to watch. Your specific files may differ, but this works for my needs.

Finally, run bundle exec guard. It will print when it restarts pow. I like this approach because it can be adapted to any RACK compatible app by changing which files get watched. Also, it doesn’t require you to change any application specific code; It’s only necessary to add guard to the Gemfile.

Learn Emacs: How to Break Bad Habits

The best thing to do is never to form bad habits in the first place. However if you didn’t have any bad habits, you wouldn’t be reading this blog post. Here’s what has worked for me.

Make a Note of It

One of my bad habits was using the arrow keys for navigation in emacs. It’s inefficient. Emacs already has keybindings for next / previous and back / forward – and I don’t have to pick up my hands for those. The first thing I did was start keeping a short list of bad emacs habits.

Don’t think about fixing every bad habit immediately. Just note them and move on with real work. These also don’t have to be bad habits per say. They can be inefficiencies as well. Is there a better way to do that thing you do all the time, but you’ve been putting of putting in the time to build it?

Fix One Bad Habit

After years of using the arrow keys in emacs, I decided it was time for that to stop. Because my emacs config is versioned. I can see that I decided to stop on Fri Sep 16 10:53:49 2011 -0400. Work on fixing this one habit until its completely fixed. My fix was pretty simple.

Unbind the arrow keys and it becomes pretty tough to use them. I don’t use the arrow keys any more. Maybe your fix is more complicated. Maybe it’s writing an emacs macro for something you do frequently.

Schedule Time for This

Its a bad idea to try to fix emacs problems while on a tight deadline for a project. However you will find yourself with a spare 30 minutes or an hour here and there. Make that your emacs improvement time.

Almost a year ago I found myself with an ever growing emacs problem. My config files had grown out of control. They were a huge mess and impossible to manage. Even thoough I was using version control my config still had lots of local changes and files that weren’t tracked at all. And my github repo was never up to date. I was in need of a fresh emacs config. I needed organization and simplicity.

When would I ever have time to rewrite my entire emacs config?

I started making time on Tue Jun 21 18:18:41 2011 -0400 as I had read about emacs-starter-kit (v2). Its basis was emacs-24 paired with the marmalade-repo (for emacs-lisp packages). I put in an n hour here and there over the course of a few months. In mid September it was good enough to use as my full-time working config.

Learn Emacs: Swap Windows

When I use Emacs in GUI mode, I set it up to have two 80 column windows side by side. It’s extremely convention when you need to look at one section of the code while writing another. For instance, you can have the spec file side by side with the code when doing TDD. Sometimes I want to swap the windows. This kind of functionality does not come built in with emacs. I found the swap-windows function that I use in Steve Yegge’s .emacs file.

Troubleshooting Your Emacs Config

Up to this point my Learn Emacs series has been all about how to do cool stuff in emacs. One of my personal favorites is align-regexp. A while back that stopped working for me. Now I get an error: Wrong type argument: markerp, 0. Emacs doesn’t always do what I mean.

First Remove your Config

Whether you use a single .emacs file or a ~/.emacs.d/ directory it is time to remove it. Personally I keep ~/.emacs.d/ symlinked to my emacs.d github repo so it iss quite easy to remove the symlink. Alternatively you can start emacs with the --no-init-file option, to skip loading your files. The rationale for removing your config is simply that it reduces the number of variables you are dealing with. Is the problem with your config or with emacs itself?

Then Check your Emacs Version

After I removed my config and tried M-x align-regexp again, I got the same error. So its not my config. If you find you have a problem with a particular version of emacs M-x emacs-version will tell you what version you have. In my case it was

GNU Emacs 24.0.92.1 (x86_64-apple-darwin, NS apple-appkit-1038.36) of 2011-12-02 on bob.porkrind.org

As I get my emacs builds from EmacsForMacOSX or brew install them myself. At this point I’m fairly certain I’m getting the error as a result of running a nightly build. A quick google leads me to bug#10249: 24.0.92. I installed a pretest version, and align-regexp works fine like it used to.. I would prefer to be running the stable version, but I’m using emacs-starter-kit for my config, which requires emacs 24.

Version your Config

When functionality like this breaks it is really awesome to have an emacs configuration that is under version control. I can walk backwards through any recent changes to find what is causing breakage. So if your config isn’t already versioned, version it right now.

PS: I’m interested to know any emacs topics you’d like to see a blogpost on. I haven’t been hacking my emacs config much lately, so I’m short on ideas for emacs posts.

Stop Programming

Stop Programming

I’ve got some ideas on how you can improve your programming by not programming. Try something new this year.

Simplifying Too Much

About 4 years ago, I fell in love with minimalism and tried to get rid of most of my possessions. I went as far as selling my saxophone, (3) bass guitars, and bass rig. This meant not playing music any more. At the time I decided that playing music was nonessential since it did not relate to programming and didn’t make any money. I also sold my bicycle (which meant no more cycling).

Pretty soon after that I was just a guy who programmed at work and worked on programming projects at home. In other words, not very interesting.

The great secret of minimalism (taken to an extreme), is that if you take away everything you are left with nothing. In my case I realized I didn’t do anything for fun anymore. I’ve since bought a bass, bass rig, and bicycle and started teaching myself classical / flamenco guitar.

Be a Beginner Again

I think there’s a problem lurking in many programming communities (forums, IRC, mailing lists). Every so often a beginner comes a long and asks a basic question in the wrong way. He doesn’t follow the rules of the community. So a long-standing member of the community replies “use the search”, “read the FAQ”, or a similar useless answer. Go and search any forum you will find useless results like this. This is not only unfriendly, but can pollute search results for others that visit later with the same questions, which eventually renders the “use the search” solution useless.

While I agree that a community’s rules of etiquette should be followed, I think some members of these online communities have forgotten what it’s like to be a beginner. Often newbie may not know what to search or need some extra explanation regarding a common problem. I found this to be the case when starting out with emacs, wherein reading the manual and using the help system are actually part of emacs itself and can be confusing if you don’t even know how to use the thing.

That’s why I recommend trying something other than programming. Go for something unrelated. Something where you will be a complete beginner. Try learning a musical instrument, building a bike, woodworking, etc… Next time you’re helping out a beginner you may find yourself being more helpful and patient.

Expand Your Mind

The other reason to try something new is that it may eventually lead you to approach programming problems in a different or unconvential way. Much of what we do is done by way of analogy. OOP works by making a model that approximates real situations. Eventually you’ll run into a real programming problem that can be solved using methods from the real world.

Furthermore, programming is creative work. It can be helpful to look elsewhere for inspiration. Often I find myself thinking of programming as an art, as self-expression (albeit with many real world constraints; self-expression won’t necessarily create useful programs). To get a better idea of what I mean check out The Tao of Programming. Though it is written in a somewhat joking manner, there is truth in it.

My favorite section is 2.4:

A novice asked the Master: “Here is a programmer that never designs, documents or tests his programs. Yet all who know him consider him one of the best programmers in the world. Why is this?”

The Master replies: “That programmer has mastered the Tao. He has
gone beyond the need for design; he does not become angry when the
system crashes, but accepts the universe without concern. He has gone
beyond the need for documentation; he no longer cares if anyone else
sees his code. He has gone beyond the need for testing; each of his
programs are perfect within themselves, serene and elegant, their
purpose self-evident. Truly, he has entered the mystery of Tao.”

Though this style of programming is totally impractical for designing reliable extensible software, I ponder it every few months because it is such a different perspective. What if you were able to write a program that had the intuitive cohesion of a poem?

Now Go Do Something Else

That’s it. Try something different and new this year.

Building a Gaming PC

I recently built a gaming pc from parts, as my laptop was struggling to run the latest games even on very low settings. I did some googling and came to the obvious conclusion that building a desktop for gaming is way cheaper than trying to buy a new laptop, and the desktop gets way better performance. In fact, this makes it so that I can stretch my laptop for a few more years, as it’s only used for web programming at the moment (and it’s plenty fast due to its SSD).

At the end of this article I’ll be listing all the parts I used for my build.

Before Building a PC

You will need to take a few precautions. I recommend using an anti-static wrist-strap. They are about $5 and save you from frying your much more expensive components due to static electricity. Wear it like a watch and clamp it to an unpainted metal part of your computer case. I used the Belkin Anti-Static Wrist Band for my PC build.

Get some diagnostic software. I recommend the Ultimate Boot CD. This will come in handy if you have problems getting your system to boot or problems with it crashing. It has diagnostic tools for CPU, memory, hard drive, etc… I used it when troubleshooting my build and I found that it was just a bad memory stick causing all my issues.

Plan your build

Next you’ll want to spec out exactly what parts you’ll be using and ensure they are all compatible with each other. A good site for finding parts and getting the best price is PCPartPicker. If you need help deciding on a PC build that fits your budget, head on over to BuildAPC. I had them recommend me a gaming PC build for my budget. They can also help you with advice on how to actually put the parts together.

Actually Building a PC

I recommend that you build the PC with a TDD mentality. Put in only the parts necessary to get it to POST successfully. From then on, I would add individual components and test them with your UltimateBootCD. Only after all the hardware passes tests should you install an operating system and drivers.

I am recommending this approach after having done it the wrong way myself. I put everything in and the operating system before doing any testing, and I was having random crashes going on. It took hours of troubleshooting: read more about troubleshooting my build.

What Parts Did I Use?

LG Electronics GH22NS50 22X SATA Super Multi DVD+/-RW Internal Drive

So far I’ve only used it for running the UltimateBootCD.

Saitek Eclipse II Backlit Keyboard (PK02AU)

I like this keyboard because it lights up: red, blue, or purple.

Corsair Vengeance 8 GB (2 x 4 GB) DDR3 1600 MHz (PC3 12800) 240-Pin DDR3

I bought this ram after I had to return some G Skill ram that was bad.

Intel Core i5-2500K Processor

The important part here is that it’s the 2500k edition, which will allow overclocking if you’re into that.

Antec Computer Power Supply HCG-620

Be sure your power supply has enough watts for your pc build (and supports crossfire or SLI for your graphics card).

Sapphire DIRT 3 EDITION Radeon HD 6950 2 GB DDR5

This graphics card was said to be unlockable to a 6970, but my particular card was not. However, it’s still a very powerful card.

ASRock Z68 Gen3 Extreme3

This motherboard has some overclocking options built in.

Cooler Master HAF ATX Mid Tower Case

This case has great cooling, and is relatively quiet in my opinion. If you need quieter, I would replace the hard drive fan with a quieter one. It’s the loudest fan on this thing.

Seagate Barracuda 7200 500 GB SATA 6.0 Gb-s 16 MB Cache 3.5-Inch Internal Bare Drive ST500DM002

With hard drive prices the way they are now I wanted to save some money and 500GB is plenty of space for game files. Some people recommend a SSD for gaming boxes, and while the performance will certainly be better, I haven’t noticed load times being much longer with this disk. It’s fast enough.

Parts I Had Already

Dell UltraSharp U2410 24-inch Widescreen LCD High Performance Monitor with HDMI, DVI, DisplayPort and HDCP

Though I already had this monitor at the time, as I use it for work, I’m listing it here because I highly recommend it. The picture is great, it’s height-adjustable, rotatable, and can be mounted on a wall or monitor arm. If the new price is too much for you, you can always find a refurbished one for about $300. Most importantly the resolution is 1920x1200 not 1920x1080 like most monitors these days.

Razer DeathAdder - Gaming Mouse Left Hand Edition

This is the best left handed gaming mouse I have found on the market today. It also has drivers for both Windows and OS X. The only annoying thing about it is that the manufacturer switched the left and right click. So out of the box left-click and right-click are switched. Luckily this can be adjusted with the drivers. There are surprisingly few options for left-handed gamers, and the symmetrical mice don’t do it for me.

Build Results

All said and done this build cost me $922.79. It runs current games on Ultra High settings, and has some room for overclocking or adding a second video card. It is also said to support Ivy Bridge CPUs (when they come out).

Interestingly, building this way allows me to buy a cheaper laptop next time I replace it (I don’t have to care about the graphics card in my laptop). So overall it’ll work out cheaper, and I end up with a much better gaming experience.

Sometimes Side Projects Fail

Sometimes Side Projects Fail

I’ve worked on a few side projects over the years. Sometimes they’ve turned out well, and other times I stopped working on them. How do you know when it’s time to throw in the towel and when it’s time to push through?

Roughly a year ago a friend and I were working on a bill splitting system. It was supposed to solve the problem of splitting bills between friends. More specifically, splitting regularly occuring or one time expenses between roommates. Rather than worrying about having cash, or writing a check and waiting for it to cash, we built a system which piggybacked off of paypal’s API to send bill and payment notifications via email, which would generate a web checkout page where the debt could be paid online through paypal.

See how long the previous sentence is? Sounds too complicated already and I’m the one who built it. The eventual idea was that we would wrap this in a native client wrapper, so that if you’re out to dinner with your friends you don’t have to worry about splitting the bill. One person will pick up the entire bill, split it and send bill notifications via email to all the other people. Then the others pull out their phones and enter their paypal accounts and send payment for their portion of the bill. The bill can be settled on the spot.

Not Every Idea is a Hit

In a perfect world every side-project would be a hit that turns into a business that generates lots of profit for little work. In practice this actually can be quite difficult to pull off. Furthermore sometimes those big hits aren’t actually big hits when they start. It make take a couple of years of work to pull. But how do you know if your idea is taking a couple of years to get started or simply not good at all? Nobody wants to be a quitter, and worse nobody wants to quit a good idea that ends up making someone else rich. But there’s also more to life than money.

After working on this idea for a few hours a week for a couple months we eventually decided to scrap it. There really didn’t seem to be a simple way to make money with this idea. It may have been a useful service, but there are already similar free services out there for this. Over the years, I’ve grown to have an affinity for ideas that have monetization strategies that are simple to understand. In my experience, the more complicated it is, the less the likelyhood of actually making money.

Most importantly I wasn’t particularly passionate about the idea, and I didn’t like the idea of piggybacking off of Paypal because of their horrible customer service (I recently had my funds availability delayed for 3 weeks with no explanation, and I’ve had an account for 7 years and an ebay account with perfect feedback). But using another online payment system made the idea less useful because other peer to peer payment systems simply aren’t as ubiquitous.

Benefits of Side Projects

Often the benefits are not monetary in nature. In the case of this bill splitting website, I used it at the time to keep up to date with rails 3 and refresh my skills a little bit. I was using Merb for most projects at work at the time. Furthermore, working on small side projects now and then keeps you familiar with how to start a project from scratch and increases the breadth of your knowledge. If its a small project with just one person working on it, you have to be the one to do everything (or at least hire the contractors that will do the part outside your expertise, which is a skill in itself).

The most important thing is to simplify your idea. Then build the simplest thing that could possibly work. Then keep at it and don’t be afraid to re-evaluate your idea. It doesn’t make you a quitter to throw out a project that no longer seems reasonable.

Check out an older post of mine about side projects.

Verify Your Assumptions

Always verify your assumptions. It will save you time and headache. I’ll explain now.

Building a PC

I recently built a PC from parts I bought online. It had been 5 years since I’ve built a PC at the time so I’d forgotten my good habits. I put everything together: RAM, CPU, HDD, GPU, motherboard etc… and it booted up and POST’ed no problems. I thought I was good to go at this point. I managed to install windows and a bunch of drivers, but then I started getting random freeze ups.

Troubleshooting

I thought perhaps it was one of the drivers or something specific to windows 7 (this is a gaming box, not for work). So I did a little digging and actually ended up reinstalling windows bare to rule out any driver issues. Long story short, while the box would work fine for about 10 minutes, shortly thereafter the box would freeze up.

It was at this point that I decided to get a boot CD with some troubleshooting utilities. I chose Ultimate Boot CD because it’s free and has almost everything you could need for diagnostics.

Testing

For whatever reason, when I built the PC I did it wrong. I skipped the testing phase. I didn’t test first. So now I was in a situation where I was digging through everything to get to the root of the problem (and hopefully there’s only one!). First I tested the HDD using HDAT2. Many hours later, it came back clean. Then I tested using Memtest86. Within a couple of minutes it detected an error. So I pulled the 2 RAM sticks, and tested each individually, and determined that I had 1 bad stick of RAM.

The Point is

If I had built my system right: plug in as little as possible to get it to boot and run diagnostics before installing software, I would have found my problem much faster and saved hours of time. My problem here was that I assumed my RAM was good. So even when you’re not programming it’s important to verify your assumptions and don’t forget to test.

Purchasing Electronic Media

<rant>

$20

Recently I read Derek Webber’s post about Spotify, in which he says:

I am paid $0.00029 per stream of a song on Spotify, and even this amount depends on whether the song is being streamed by a paid user or someone using the service for free. This means it will take upwards of 3,500 streams of a single song on Spotify to earn $1.00 versus that same revenue for one iTunes song purchase

His article made me think of a time years ago when I wanted to be in the music business.

When I was about 12 or 13 I started playing bass guitar. From then on I was enamored with music. Playing it, listening to it, thinking about playing it etc… Then when I was in 11th grade I had the opportunity to take an AP computer science course. I took it, 5’ed the AP test, and promptly stopped programming at all. By the time I was in 12th grade I was convinced I’d go to college as a music business major. Play music and get paid? Sounds like a party right? Why not?

Getting Paid (for Music) is Complicated

My first semester in college we had a silly 0 credit hour course for 3 hours each week where the professors basically talked about the music business. They related anecdotal stuff about copyright, various record label / venue contract issues, and all kinds of other issues. This class was a big red flag for me. They went over how you get paid royalties in various situations and how little you get paid for them (even if you got a good deal).

The gist of the class as I understood it was that most of the money is in publishing, and if you’re not at the top already it’s basically a roll of the dice as far as making a comfortable living at it.

I Didn’t go to College to Roll the Dice

If being there wasn’t helping my chances of getting a good paying gig after graduating, then why was I there at all? Furthermore, I apparently had already taken in highschool all the required math for my major. I found that to be ridiculous because math is useful, and I’m a nerd at heart. It’s just that some how programming has become cool, or at least that’s what I tell myself.

While the music business classes were fun and pretty easy (admittedly these were only first year first semester courses), I got an eerie feeling that I would have a hard time getting paid after college because of all these issues that were outlined in that 0 credit hour class.

Oops, I skipped a part. I had a summer job at Kroger bagging groceries when I was 15. It was then that I realized that bagging groceries doesn’t pay enough, and that if I didn’t do something about it I could be bagging groceries for the rest of my life. There’s nothing wrong with that except for the fact that minimum wage isn’t a living wage (for me).

Ahh.. Back to Math!

As the semester drew to a close, I realized that what I most wanted to do was play with all the computer stuff in the recording studio. Namely, that G4 Macintosh running all the software. The choice became obvious to me. I changed my major to computer science and added a minor in math.

I felt like that was a pretty good bet for getting a job after college, and I knew I was reasonably good at it. Mostly importantly I felt like that was something worth spending 4 years at college doing. Now on to the topic of this post.

About Media

Enough about me, Back to Derek Webber’s article. He concludes his article by telling his fans to buy or download his music for free, but he spends most of the words in his article demonizing Spotify.

He’s mostly angry about how they pay him so little per streamed track, and how they don’t pay him the same as artists on big name labels. It seems to me, if you don’t like Spotify’s deal, don’t take it. His criticisms of Spotify seem to be at odds with his proclamation that record production costs are at an all time low (meaning the artist can produce and sell his/her own content independently).

Spotify is about adding another tool to the musicians toolbox. Yet another way to make money off your music, if you so choose. This is a huge difference from back in the day when musicians had to take the record label’s deal or not get any CDs pressed at all. If anything, these bad deals that Spotify is able to negotiate are evidence of musicians making bad deals. It’s in Spotify’s best interest to pay as little money as possible for music.

Anything Spotify says about being good for the music business or any other feel good talk is simply marketing speak. That is, it is their marketing department’s job to write up this kind of stuff.

The Problem Buying Media Legally

Now I’m not a Spotify fan even though it seems like I’m building them up. Spotify is part of the problem in a few ways. Ever since digital distribution of media started, piracy and DRM have had a symbiotic relationship. If there were no piracy, there’d be no need for DRM, and the presence of DRM punishes customers who try to do the right thing by not pirating media.

Customers think they are buying media, and publishers think they are
selling a license to use that media under certain conditions.

That is the core of the problem. When I buy an ebook I expect to be able to read it anywhere I want (like a printed book). When I buy music I expect to be able to listen to it under any conditions. If I want to record it to a cassette I should be able to.

Arguments about piracy are pretty pointless. On the one hand you have companies claiming that every act of piracy counts as a lost sale, when we know that’s not the case. A lot of pirates don’t buy anything, and then some pirates do make a purchase after trying it out for free (via a pirated copy).

It’s Not All Bad

There are a number of publishing companies that are doing this right. They give you an unencumbered copy of the media, and ask you to do the right thing and not share it. Pragmatic Programmers is one such company that is doing the right thing. That is a message I can relate to, and I have purchased a couple books from them.

Back to How Musicians Are Getting Screwed

I agree that generally musicians are getting a bad deal. It’s one of the reasons I decided not to do that for a living. I don’t agree with the idea that musicians deserve a better deal. The way the economy has been for the past few years is evidence that nobody is guaranteed a good deal. We are all taking our chances.

</rant>

Blogging on Jekyll: URL Redirects

About a month ago I migrated my blog from Tumblr to Octopress hosted on github-pages. I migrated because of Tumblr’s slow page loads and frequent downtime. I picked Octopress because it is built on top of Jekyll, and it comes with a reasonable default stylesheet. Jekyll is a static site generator, which ensures I can deploy my blog on any old server in the future, and continue to use these same old tools (because I have them, rather than tumblr having them).

Migrating broke my URL Structure

Running my site through Google’s Webmaster Tools showed that many sites are still linking to my old Tumblr blogpost urls. Tumblr’s url structure is another reason I migrated away from it. I should be in full control of the urls on my blog. Never the less, I need to support redirects from the old URLs to my new URL structure /blog/:post_title.

However Jekyll is just a static site, so there’s no ruby server to handle redirects. Other Jekyll users deploy to Heroku and use a small Sinatra app to handle redirects, but I feel like that is complicating my simple setup. If I were on a regular server I could setup an .htaccess file to handle the redirects, but github-pages does not support .htaccess.

Jekyll Plugins to the Rescue

One of the great things about Jekyll is its simple plugin system. On Jekyll’s Wiki I found the Alias Generator. It allows you to specify aliases on a per blogpost basis, in the YAML front matter.

This post’s YAML is:

---
layout: post
title: "Blogging on Jekyll: URL Redirects"
date: 2011-11-29 14:32
comments: true
categories: ["programming", "blogging"]
alias: [/blog/blogging-on-redirects]
---

Now when I rake generate my site, the Alias Generator will create another static html file for this post at /blog/blogging-on-redirects/index.html:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="refresh" content="0;url=/blog/blogging-on-jekyll-url-redirects/" />
</head>
</html>

Which will redirect here. Try it: /blog/blogging-on-redirects

It was almost that simple. The Alias Generator actually broke when I provided some of my old Tumblr urls. However, I forked it here and fixed it so it handles nested aliases properly now. I also opened a pull request to the owner to get this change merged in.

Jekyll’s Strengths

That experience is Jekyll’s strength as a blogging platform. The output is so simple any web server can serve it so it doesn’t matter where you deploy to. Its generation system is open source, hackable, and has a great plugin system.

But most importantly, even if the Jekyll project implodes tomorrow. I still have all my blog’s content versioned, and have all the tools necessary to maintain my blog. I am not relying on a hosted service to back up my blog’s content, or maintain the tools I edit it with.

Try Octopress

If you haven’t tried Octopress yet, I highly recommend it. It’s Jekyll based, but it has a decent default stylesheet, so it’s very easy to install and immediately start blogging. No programming or tweaking CSS to get in the way of writing content.