Cupcakes by Whipped Bakeshop
Wedding

Cake!

I used to be very anti-wedding. Everything about weddings seemed incredibly stupid and overdone. I was pretty adamant that should I ever get legally married, I would elope.

Then I saw this cake:

The most amazing cake I have ever seen

Upon seeing the miracles of icing one can produce with a wedding cake, I revised my statement: I would be willing to get married, but ONLY if I could have the most awesome cake in the world. Though since I was single it was hardly a pressing issue.

Fast forward a few years to now, Chris and I are indeed selecting a wedding cake. And oh my are there cakey options. We went to a cake tasting where we were presented an array of cupcakes in different flavors and icings. They were all incredibly delicious but by the time I left I was done with sugar for a week.

Cupcakes by Whipped Bakeshop
Cupcakes by Whipped Bakeshop

We ended up going with Whipped Bakeshop, a cute bakery in Philly which ironically enough got its start on Etsy.

In a rare fit of restraint we decided not to go the super video game route with our wedding decor, and instead opted for a much more mild “pixel” theme.

I realize Mrs Manners does not approve of “themes” at weddings. She believes the “theme” is marriage. And while I do take the teachings of Mrs Manners to heart, I’m letting this one slide. Mrs Manners will not be attending my wedding. Plus, we’re not including any of the tree-killing reply cards she so hates in our invitations. Clearly that’s what the custom wedding reservation CMS I’ve written is for.

Come on now, really, how could you have two web developers get married without one?

Here’s the sketch of our cake, I’m pretty excited to see it in person:
Cake Sketch

Not only does it look awesome, but it will be made of THREE different flavors (each on a different tier): chocolate, lemon, and carrot ginger.

Programming, Software

LEGO plans, now with better rendering

You may remember the “Legoizer” script I’ve been working on for Blender. It uses an existing script and one I’ve created to generate “layers” of LEGO patterns for building.

I got a lot of great suggestions on my last entry for how to automate the process of taking a screenshot, but sadly when it came down to implementing them things didn’t go so well. Luckily Angelo from Abandon Hope Games was kind enough to take the time to help me get the environmentals in Blender set up just right for rendering a “pattern slice.”

Step 0: Start with an object made of objects
The AddCells script uses DupliVerts to create an object made of references to another object. We’ll get to that in a minute, but first, let’s assume you have an object:

Step 1: Set up the camera
We want the camera to be facing down and rendering orthographic(all lines parallel) rather than perspective.

Make sure you’re in Object Mode and select the camera.
Press Alt+G and then Alt+R (confirming the dialogs) to return it to the origin.
Hit F9 to get into the Editing panel
Click the button labeled Orthographic in the Camera tab

Press 1 on your number pad to get a side view of the scene. Click the blue transform handle of your camera and move it up along the Z axis so it is well above your object.
Press 0 on your number pad and you should see a rectangular bounding box around your object (or perhaps around nothing) which represents the are which the camera sees.
Scroll the “lens” option right above the Orthographic button to zoom in/out so your

If you do a test render now with F12, you’ll probably see a badly lit (perhaps almost all black) render of your object from the top down.

Step 2: Set up the lighting

Select the existing light in your scene and press x on your keyboard to delete it.
Press space bar to bring up a dialog, and go to Add > Lamp > Sun
It doesn’t matter where the lamp is, as long as it’s facing down (which it is by default).

Step 3: Configure your materials

I mentioned earlier that our object was made up of DupliVerts.
These aren’t “real” objects, which is why I had such trouble applying materials to them. You need to apply the material to the reference object, which is generally somewhere in the middle of it. I usually do this by switching to the Outliner menu and finding the source cube manually.

Once we have our source object selected, hit F5 to bring up the Shading panel and click Add New under Links and Pipeline.
Pick a new color for your object. This will be the color of the lines in your final rendered image, so pick something that contrasts with your background color (which defaults to blue).
Click the Wire button under Links and Pipeline

Your object in the viewport should take on the color you’ve selected. If if doesn’t, you probably didn’t select the correct source object.

Hit F12 to render. Viola!

Now that we have our environment set up the way we want, rendering via script is easy. I’ve updated the script source (now on gist) to call Render when it’s done slicing and save the file to my hard drive.

This all works great, but of course there’s a new problem. Since we want to iterate over the entire object, I need to “reset” it back to being whole again. While I’ve saved an undo point I don’t think you can call that point via the API. In the current iteration of the script I save the vectors of each vertex before deleting it and then call verts.extend to add them back. This works great except…

The vectors for the verticies are transformed to be in the selected object’s local space, which is necessary for “layer 1” to be the first layer of the object and so forth. Unfortunately I haven’t yet figured out how to transform those verticies back. So when I run the script it dutifully reassembles my sphere originating from the center of the object. So there’s still some work to be done there.

Yaaaay... oh.

Programming, Software

Faking Blog Integration With XMLRPC and Ruby

I’m rebuilding indiecraftshows.com in RoR, but the blog will stay on WordPress. The rails app will be hosted on Heroku, and the blog will stay where it is at NearlyFreeSpeech.net. There’s one catch: I want the latest blog post to appear on the home page, which is part of the rails app.

To do this I’m using ruby’s included XMLRPC library to grab the latest post from WordPress and shove it into a YAML file named with the date and post ID. This happens in a cron job run daily. Since I only care about showing the most recent post, I don’t bother to check to see if there are other posts I don’t have.

I created a really simple object called (creatively) BlogPost, and chucked it in with the rest of my models in app/models. Note that BlogPost doesn’t inherit from ActiveRecord.

require 'xmlrpc/client'

class BlogPost
  def self.latest
    Dir.chdir(Rails.root.join('blog'))
    post_files = Dir["*.yaml"]
    most_recent_file = post_files.sort.last
    YAML::load(File.open(most_recent_file))
  end

  def self.fetch
    server = XMLRPC::Client.new2('http://www.kellbot.com/xmlrpc.php')

    blog_post = result = server.call("metaWeblog.getRecentPosts",1,YOUR USERNAME HERE,YOUR PASSWORD HERE,1)
    File.open(Rails.root.join('blog',"#{blog_post[0]["dateCreated"].to_time.to_i}-#{blog_post[0]["postid"]}.yaml"),'w') do |io|
      #we only want the published ones
      YAML.dump(blog_post[0], io) if blog_post[0]["post_status"] == "publish"
    end
  end
end

When the home page is called, the controller grabs the most recent yaml file (by name, not by time of creation, since WordPress allows you to lie about time). I just use the XMLRPC object as-is, but if I wanted to I could get fancy and do some post-processing to make it a little more friendly.

Business

When Free is Bad

Everyone likes free stuff. And some of the best technology and services I use are also conveniently free. But today I got a thorough lesson on the perils of free, and when you should pony up some cash for services.

Like many other people, I use Gmail for everything. Email for my various domains (10 last I counted) all ends up in Gmail. In short, Gmail contains my internet life.

I’m sure you can see where this is headed.

Earlier this afternoon, as I hit ‘send’ on an email to my dad, I was informed by Gmail that my session had expired. So I logged out, logged back in, and was then informed that my account was suspended for “unusual activity,” and that generally speaking, these things are resolved within 24 hours. There was no way to get in touch with anyone at Google, and no more information about why I’d been locked out.

As I generic cialis online was seething with rage and trying to figure out how to get in touch with all my business contacts to let them know that I wasn’t ignoring them, I realized that while Gmail kind of sucks, I also had unrealistic expectations of the service they were providing. For free.

Because Gmail is free, they have absolutely no obligation to me or my mail. There’s no obligation to provide anything resembling customer support. Customer support is expensive. So for a whopping total of free dollars, it’s not surprising I’m not getting any.

That’s the problem with free. As a customer you have no leverage. Telling a company I’m going to pack up and take my $0 elsewhere is hardly a compelling reason to do anything.

I use email for business all the time. And while I cursed all things Google and waited for the Gmail fairy to restore access to my mail, I signed up for an account at pobox. At $50 per year it’s not free, but as a business expense it’s pretty cheap. And then I set it up for use with my own domain. That way in the future if I’m not happy with my mail hosting, I can change without having to send out the “hey my email address is changing” message I’m writing right now.

My new email address will be @kellbot.com, but I can’t decide what. kellbot@kellbot.com seems redundant. kelly@kellbot.com does too. Maybe I’ll just set up a catch-all and make up my email addresses as I go along. Suggestions?

Uncategorized

Dead Nook

Up until this weekend, I loved my Barnes and Noble Nook. Sure, the B&N digital download store doesn’t have the selection that Amazon does, and the software is slow and bloated, but I love the hardware. It has the potential to be a really nice device.

But Barnes and Noble keeps screwing it up.

First, if the paperback version of a book is $16, and the hardcover is $24, charging $19 for the digital version is not a good deal. Stop trying to pretend like it is guys. Especially when Amazon offers the same book in digital format for $10.

But more importantly, and this goes for all companies: stop designing hardware for “optimal” use patterns. Design them for realistic ones.

This weekend I was irritated to find my nook crashed/froze while I was transferring some documents to it. I reseated the battery per the instructions on the website and all was well. Then, after only a few hours of reading, my nook was at  “critical battery level.” When I got home I promptly plugged it in, but noticed the charging light wasn’t on. After a few hours it was clear it wasn’t charging. I went through a myriad of troubleshooting tips from the B&N forums, but the thing is totally dead.

When I finally broke down and called tech support, I was told that charging my nook overnight, or more than 4 hours, is bad for the battery.  So is letting the battery dip below 20 or 30%. Apparently by using my nook the way I use every other portable electronic device I destroyed the battery.

It’s completely unreasonable to expect consumers not to charge devices overnight. It’s likewise unreasonable to expect them to never let  a battery run down.

So now I’m waiting on a replacement battery, and if that doesn’t work a replacement nook. I’m not happy about it. I read my nook almost every day on the subway. Not having it at the beach this weekend was frustrating. Going a week without it while B&N replaces it part by part isn’t making me any happier about it. Thankfully my friends with their dead tree books were kind enough to refrain from saying “hahaha my book never crashes” as I stared at the lifeless corpse of my nook.

The Kindle is looking pretty attractive right about now.

PS: Why on earth is B&N making me wait a week with a broken device when they carry the battery at one of their stores half a block away from me? I’d go down and just buy another battery, but right now I’m not in the mood to give B&N any more of my money. Unfortunately the Kindle 3 is sold out right now.

Update: While the rep on the phone said to expect my battery Monday, it actually showed up today. Later this evening we’ll know if it’s the battery or the nook.

Update #2: As expected, the battery is not the problem. The battery that I got did have cialis generic enough charge on it to boot, and the nook is just not charging it. They’re sending out a new nook, which I should have  Thursday or Friday of next week. I still fail to understand why it can’t be replaced at a B&N store, but at least they’re taking care of it.

Startup Life

Pivotal Tracker

I just finished up my third week at SkillSlate. For anyone who missed my last post about it, it’s a directory of handymen, personal trainers, and other service providers. Right now it’s just in New York City, but that will change soon.

SkillSlate uses Pivotal Tracker for task management. At this point I have used just about every task management tool under the sun. Bugzilla, Eventum, Trac, various offerings from 37 Signals… I even rolled my own using WordPress once. So far I can’t say that any one of them is my favorite. They each have their advantages and drawbacks.

Pivotal is interesting because it uses a model for estimating deadlines and organizing workloads that I haven’t seen elsewhere. You assign points to each task corresponding to how long you think it will take. The points are relative to each other, not time. So if you decide that changing the colors in the header is a one point task, you might decide that adding some validation to a form is a two point task, and totally rewriting the login system is a five point task.

Then, rather than assign tasks to releases or milestones, you create releases and arrange your various tasks as needing to happen either before or after said release. As you work and close out tasks Pivotal calculates how fast you work. Based on how fast you’re working and how much needs to be done, Pivotal will estimate when you’ll be finished (and whether you’ll hit your deadline if you’ve set one).

It’s an imperfect system, sure. First and foremost, every member of the team needs to be on the same page with their point estimations. Second, the UI is completely non-intuitive. I had to actually watch the help videos to understand what was going on. Each team likely has multiple projects, but switching between projects is a clunky process. And the various reports and charts seem scattered and hard to find.

After getting over the UI though, I love Pivotal Tracker. As someone who has an “amazing and somewhat alarming thirst for points” (Chris’s words), seeing my workload broken down visually is very handy. If you turn on the “charts” view you’ll get a graph of how many work units you need to plow through to release on time versus your current rate of work. It helps turn a mountain of endless tickets into something more organized and paced.

I’ll be interested to see how well the time estimates work. In order to provide useful estimates it needs at least a month worth of history, so it will be a little while before we get a really accurate reading for our team.

Organization

100 Things

Minimalism is gaining popularity on the internet.  There are blogs dedicated to living with as few items as possible, and a trend of narrowing down your possessions to 100 things. This is an achievable reality thanks to a few things (books, plates) not being counted as “things.”

I will never be a minimalist. I come from a strong pack rat heritage (though my mother has made leaps and bounds in the past 5 years at unearthing the basement). But reading these lists has made me think perhaps I could stand to pare it down a little.

Rather than cut down to 100 things, I have decided to get rid of 100 things. Given the amount of stuff I have crammed into our 1000 square foot condo it’s unlikely that ditching 100 items would actually make a noticeable dent. But I feel it’s a worthy challenge.

I found the following items in my immediate vicinity which I really don’t need to hang on to:

  1. A stuffed kiwi key chain (my keys are on a bottle opener that says “die in a fire” on it)
  2. A miniature plastic “book” containing a notepad and tiny pen
  3. A stuffed GIR key chain (don’t panic, I have another one)
  4. A board game I have played only once
  5. Three VHS cassettes (I contend these each count as one item) which are readily available on DVD. I haven’t owned a VHS player in years.
  6. A bread machine
  7. An extra kitchen timer
  8. A TV-B-Gone (fun as it is, I don’t really go places with TVs I wish to turn off)
  9. An envelope moistener I have never used
  10. A pair of Chuck Taylors I bought in 2000. They are full of holes and uncomfortable to wear.
  11. A pair of pants I have never worn which don’t fit. I lost the receipt, but they were only $5 so it’s not a big loss.
  12. A pair of pants which have never fit me well. Also $5
  13. A size 6 pair of jeans. I caved and rescued them. They’re expensive jeans!
  14. Six books (four paperback, two hardcover). I thought about listing them on PaperBackSwap, but with my Nook I really have no desire for printed books. The books are Freakonomics, The Five People You Meet in Heaven, Stranger in a Strange Land, Job: A Comedy of Justice, Anansi Boys and Zen and the Art of Motorcycle Maintenance.

With the exception of the chucks, which I threw in the trash with just a bit of a dramatic pout, everything else is headed to Goodwill (or NYC Resistor where appropriate).

20 items down, 80 to go.

Gaming

No Starcraft Until Midnight

As is often the case when one pre-orders games, I got my hands on Starcraft a little early.

Unfortunately, Blizzard would have none of it:

blizzard hate

On the plus side, at midnight when the game does go live, I’ll be playing Starcraft II instead of waiting in line at Gamestop.
Curiously, SCII comes with two “guest passes” for the game. Interested to find out the logistics of how those work.

Edit: or, I could just read the back of the card, duh. The “Guest Pass” is valid for 7 hours or 14 days, whichever comes first. This seems less useful than the “spawn” installations available with SCI, but since everyone I know has a copy of SCI, we never needed it anyway.

Startup Life

Big Changes Ahead

The past week has been eventful, to say the least.

I’m excited to announce that starting in August I’ll be joining the team at SkillSlate.com, working with their development team to launch the next version of their site. SkillSlate is a company that focuses on connecting freelancers and independent contractors with clients. Having spent the last two years freelancing and running my own business, I’m excited to work with a team again. I’m also bursting with ideas about various ways the site could be expanded, though I will be careful to avoid the dreaded “you should” in conversations with the rest of the company. It’s a pretty small team right now, so there will be plenty of learning opportunities as it grows. I’m sure I’ll blog about it, at least as much as my NDA allows.

I’m also incredibly sad to be leaving my job at NearlyFreeSpeech.Net. For the past year and a half I’ve worked on their customer support team. This blog, along with most of my other websites, is hosted at NFSN, and has withstood being Slashdotted, BoingBoing’d, Farked, and god knows what other horrible slew of internet traffic. It has been an privilege to work there, and I will continue to be a happy customer of theirs. If you are a command line ninja who can talk to humans (via email), you might want to consider being my replacement. Drop me a line (kellbot at gmail dot com) with some background and I’ll pass on the details.

As for my own startup, it’s on the back burner for now. We had a catch-22 where we couldn’t get funding without building the site first, but as freelancers we never had time to build the site without money. I still think it’s a good idea, but it will be a few years before I’m able to devote resources to it. The good news that after a few years of getting paid a real salary I’ll be able to fund my own projects. The new job is a great opportunity, one that was essentially dropped in my lap. But I can’t move forward without a longing look towards all the things I’m leaving behind, particularly a great part-time job and the luxury of working in my PJs until noon.

Uncategorized

Books are dead; Long live books!

My friend Phooky predicts that children born now will grow up with the same attitude towards printed paper books that I, having been born in the 80s, have towards vinyl records.

This prediction invariably causes our bibliophile friends to clutch their dead trees close to their chest, screaming “no, that could never happen,” and retreat into the stacks of books. As though the digital book revolution might bring with it some sort of mass burning. But friends (Romans, countrymen), I’ve had my nook for just over four months now. I have seen the future and I welcome our new e-paper overlords with open arms.

Before I got my nook, I couldn’t tell you the last book I’d read that wasn’t an O’Reilly manual. Reading wasn’t something I really did for fun, and it certainly wasn’t something I’d take with me on a trip. I’ve read more books, fiction and nonfiction, in the last four months than I have in the previous four years. For those of you on the fence about getting an ebook reader, I present my list of reasons digital readers will reign supreme over paper.

Portability

My nook remains the same weight, no matter how thick the book I’m reading. I have a herniated disc in my neck, so carrying even a purse around for a day is a big deal. Anyone who has ever lugged a copy of Harry Potter and the Half-Blood Prince can appreciate having a smaller form factor.

On the same note, I live in a 1000 square foot condo which, while spacious for New York standards, is pretty much out of space to store books. My nook on the other hand still has plenty of space in its on-board memory. Not to mention expansion cards.

Flexibility

Carrying an entire library around in your bag is amazing. I’m in the middle of about 4 different books, and can switch between them as the mood strikes. A few weeks ago I got trapped on the subway for an hour, finished the book I was reading, and started right up with the sequel.

Privacy

With an ebook, your reading selections are your own dang business. If I want to read Twilight, I can do so without embarrassment.  Sure, in a perfect world no one would need to feel embarrassed about their reading material of choice. But frankly, no one wants to be caught reading a self-help book on finding your inner tree spirit when they run into their boss on the A-train.

Convenience

If I decide at 3am that I really, really want to read David Sedaris’s latest, I can have it downloaded and waiting for me on my nook in the time it would take me to find pants, let alone a 24 hour book store.

I should mention that in the coming revolution, we’re going to end up killing brick-and-mortar stores which sell intellectual property (books, music, programs). Large chain bookstores will slowly die. And small locally-owned bookstores will need to take a lesson from the record stores that are still around if they want to survive the transition. Every time I visit my parents I heave a sigh of relief that Hole in the Wall Books is still open. Many great bookstores won’t make it, and the loss will be no small tragedy.

Why not?

Still, despite everything I love about my nook, the current hardware and software available for digital book readers isn’t there yet. There are still format wars being fought, and not nearly enough books available in digital format. While I love the nook hardware, the software is pretty weak. And there are some types of books, like textbooks, which none of the current ebook readers handle particularly well. So lovers of dead trees have no fear, the end of printed books is still some time off.