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.

Gaming, Software

DSx86

Every now and then I come across something that I can’t believe someone has taken the time to write.

In this case, it’s a DOS emulator for the Nintendo DS, the DSx86.

As if there weren’t enough options for extending the DS (homebrew, NES emulation), one man has taken it upon himself to write a DOS emulator for the DS. It will run most games that run on a 286/386, with some caveats. Not all the opcodes have been written in yet, and sound blaster support requires a little bit of finesse. But it’s under active development, which is exciting.

You load a game the same way you did back in the day… from the command line. Since the DS doesn’t have a keyboard, DSx86 includes one for you on the touch screen. It’s hilariously adorable.

Once the game is loaded you can either continue to use the “keyboard” or swap screens so that your game is shown in the touchscreen and you can use the stylus as a mouse. Holding down left/right on the d-pad to click took a bit of getting used to. There’s also a tap-to-click mode, but I found it difficult to use for gaming. It was a good illustration of how programs not designed for a touchscreen can be infuriating to use on one. Because most DOS games run at a slightly larger resolution than the DS, you have the option of either panning or resizing the screen. I found panning to be the most useful, and all it really cut off was the title/menu bar at the top.

Seeing the old Sierra logo along with the MIDI-tastic intro music on the DS was ridiculous and awesome. I’m just about finished my 20th or so lifetime play through of The Island of Dr. Brain. If you’re dying to take some of your old DOS games with you (you did save them all, right?) , check the compatibility list and give DSx86 a try.

Hacking

Numb3rs: "I Speak Leet"

Now I know how all my doctor friends feel watching medical dramas. I don’t know which is better, the completely incomprehensible analogy used for  IRC channels, or the notion that anyone over the age of 12 uses leetspeak. Either way, I can’t wait to get back to decoding backdoors. Like you do.

I had to double check to make sure it wasn’t Sandra Bullock.

Business

Coworking at Home

Earlier this month I found myself going stir-crazy being at home by myself all the time. Anyone who works in an office might thing I’m crazy – a space all to yourself away from your irritating coworker sounds amazing! But freelancers and other solo business owners know what I’m talking about.

I looked into the various coworking spaces in the area, and found them to all be a bit more than I was willing to spend or a bit farther than I was willing to travel. Instead, I reorganized my office out of the living room and into the spare bedroom. Now in order to work, I have to leave my toys, and when I’m downstairs relaxing I can’t be trying to sneak work in.

But it’s still a bit depressing to go sit in the spare bedroom by myself all day every day. So today a friend of mine who is a fellow freelancer came by for some home-based coworking. And it was all in all a success. There are a couple things that I think helped contribute to the usefulness, and some things we probably should have done:

Get off the couch

Being able to work from the couch, or bed, or hammock, is one of the perks of being self-employed. And while it’s great for a change of scenery, it’s not the most productive setting for most people. You probably already have a desk, but official canadian pharmacy make sure your guest coworker has a chair and a table on which to work.

Your coworker should not have to fight for space.

Clear a workspace for your friend

No one wants to work on the corner of your dining room table, sandwiched between your to-be-filed bills and that box of Christmas ornaments you keep forgetting to put away. Find a space you can clear off, where your friend can work comfortably without feeling cluttered. They should have enough room for their laptop and a mouse, and maybe even a real monitor if they so desire.

Have some snacks handy

Keeping some snacks and drinks on hand will reduce the temptation to go out for food, something companies like Google figured out long ago. Carrots, grapes, rice cakes, yogurt, and trail mix are all good to have around. Messy snacks like cheetos, oranges, and other things likely to get on your hands are less ideal. If you do decide to stock the fridge with snacks to share, let your friend know where they are, along with cups/plates, so they don’t have to bug you every time they want a glass of water.

Shut up

If you’re working with a good friend, it’s tempting to socialize instead of work. A few quick conversations is fine, but you really should let each other get things done. If the temptation to gossip is too strong, consider setting up your work stations so you don’t face each other.

Set a quitting time

Don’t let your friend be an enabler to bad work habits. And yes, working all night long is a bad habit. Your life needs some balance. Pick a time for your work day to end, at which point both of you should leave your office (or convert it back to the living room it was before). If you want to go out later for drinks or whatnot, letting your guest go home to have dinner, do a load of laundry, etc will keep their day from feeling super long.

Wedding

Reflections on the Whole Wedding Thing

First off, this post isn’t about LEGOs or code, it’s about my personal life, so if you’re just here for the bits and bytes you can skip it.

Folks may or may not know that at the end of April I became engaged to my wonderful boyfriend Chris aka RevolvingDork.

I used to ask my mom what her dream house would be like, and she’d reply “I don’t dream about houses.” I thought this was a weird response until I started looking at wedding stuff. And realized… I don’t dream about weddings. And at first, navigating the behemoth that is the wedding industry seemed very daunting and off-putting. I positioned myself squarely as the anti-bride, determined to have the smallest wedding possible with the least amount of drama.

When it turned out Chris wanted what I kept referring to as “a big stupid wedding,” well, it became clear I was going to need a bit of an attitude adjustment. What’s happened since then, in regard to the wedding and all that it encompasses, has been really interesting and not at all what I expected (in a good way!).

Continue reading “Reflections on the Whole Wedding Thing”

Crafting, lased, LEGO

Meta Lego Storage

In need of a way to organize and store my Lego obsession, I made a bunch of acrylic boxes which not only hold Legos, but also stack and interlock similarly:

Each brick box holds 64+ of the same-shape piece. So the 1×1 box will hold 64 1×1 bricks, and the 2×2 holds 64 2×2 bricks. The larger ones hold a few more due to how the sizing works out. The 1×1 box is 40mm per side (external dimensions).

I posted the patterns on Thingiverse should anyone wish to make their own. No,  I’m not going to make and sell them. They’re time consuming to make, and plus I’m pretty sure Lego would sue me. If you don’t have access to a laser cutter, I’d suggest using a service like Ponoko.

The patterns were generated in OpenSCAD using the following code. Change “rows” and “cols” to get the lego size you desire. By the way, I’m teaching a class on OpenSCAD in Brooklyn next weekend!

fundamental_unit = 0.8;
thickness =3;
h_pitch = 10;
v_pitch = 12;
tform = 5;
knob = fundamental_unit*h_pitch*tform;
module side(rows){
	lwidth = rows*fundamental_unit*h_pitch*tform;
	lheight = v_pitch*fundamental_unit*tform;
	difference() {

		square(size=[lwidth, lheight]);
		translate(v=[10,0,0]) square(size=[lwidth-20,thickness]);
		translate(v=[10,lheight-thickness,0]) square(size=[lwidth-20,thickness]);
		square(size=[thickness, 10]);
		translate(v=[0,lheight-10]) square(size=[thickness, 10]);
	translate(v=[lwidth-thickness,10]) square(size=[thickness, lheight-20]);
	}
}
module top(rows,cols,holes){
	lwidth = rows*fundamental_unit*h_pitch*tform;
	llength = cols*fundamental_unit*h_pitch*tform;
	difference(){
		square(size=[lwidth,llength]);
		square(size=[thickness,10]);
		square(size=[10,thickness]);
		translate(v=[lwidth,0,0]) square(size=[-thickness,10]);
		translate(v=[lwidth,0,0]) square(size=[-10,thickness]);
		translate(v=[lwidth,llength]) square(size=[-10,-thickness]);
		translate(v=[lwidth,llength]) square(size=[-thickness,-10]);
		translate(v=[0,llength]) square(size=[10,-thickness]);
		translate(v=[0,llength]) square(size=[thickness,-10]);
		if(holes==true){
			for (i = [1:cols]){
				for (j=[1:rows]){
				translate(v=[j*knob-knob/2,i*knob-(fundamental_unit*h_pitch*tform)/2,0]) circle(r=fundamental_unit*6*tform/2);
				}
			}
		}
	}
}

rows = 2;
cols = 4;

h_spacing =  rows*fundamental_unit*h_pitch*tform+10;
l_spacing =  cols*fundamental_unit*h_pitch*tform+10;
v_spacing = fundamental_unit*v_pitch*tform+10;

side(rows);
translate(v=[ rows*fundamental_unit*h_pitch*tform+10,0,0]) side(rows);
translate(v=[0,v_spacing]) side(cols);
translate(v=[ cols*fundamental_unit*h_pitch*tform+10,v_spacing]) side(cols);
translate(v=[0,2*v_spacing]) top(rows,cols,true);
translate(v=[ rows*fundamental_unit*h_pitch*tform+10,2*v_spacing]) top(rows,cols,false);

In the next batch I’m going to make the nubs a little smaller than the holes. They work now, but it’s a bit fiddly getting everything to line up just so. A little more forgiveness would be nice. Also, OpenSCAD does strange things with circles. Rather than simply write a circle in the DXF, it represents it as a bunch of line segments. I’m not sure if there’s a way around this, but it’s marginally irritating.

You can download a .dxf for a few different box sizes on Thingiverse.
I’ve also created a Flickr Collection for my various Lego stuff.

Meta Lego

Software

3D Modeling by Numbers: Learn to use OpenSCAD

Want to learn to create 3D models, but find the user interface for most 3D modeling programs too infuriating? OpenSCAD may be for you! And we’re  teaching a class on how to use it on Sunday, June 27!

OpenSCAD is “The Programmers Solid 3D CAD Modeler.” Rather than learn tricky user interfaces and navigate seemingly endless obscure menus, OpenSCAD uses a simple scripting language to generate 3D models from either existing or new 2D drawings. We’ll start in 2D (great for creating designs for the laser cutter) and move into 3D modeling (perfect for MakerBot!).

A basic understanding of computer programming is helpful but not required. Sign up at EventBrite today!

Personal

I’m Sorry Nintendo, What?

This morning Nintendo had their keynote at E3, unveiling the new 3DS. As part of the event, they had an army of models bring 3DS units into the audience, to let people get up close with the hot new hardware.

Look carefully at the image. All the models are women. All of them. I looked through as much footage of the keynote as I could find, and I can’t find a single dude in that group.

I’m generally the last person to get up in arms about stuff like this. But really, what the fuck Nintendo. Wake up. Women play games. Women design games. Women produce games. Women write games. And while the audience at E3 undoubtedly skews male, is that really an excuse to use women exclusively as furniture at your press events? It says a lot to me that the only women on that stage are there as set dressing. Specifically, it tells me I don’t want to buy your products. It upsets me on  a deep level to see this sort of BS from a company I like and have spent thousands of dollars with over the years.

Look, I’m not trying to funnel all of feminism into this one photo, or say that it’s not OK to have hot women hawking your stuff. I’ve got no problem with hiring attractive people to show off your products. It’s marketing and it works. But the number of women interested in gaming has exploded lately. And I’ll let you in on a secret: you don’t have to paint everything pink and brand it with Lady Gaga to market to us. You just need to stop acting like we don’t exist.

Update: A few folks have asked, why get upset about just this. Why not booth babes (a staple of industry events for god knows how long) as well? After talking it out with my fiancee, who doesn’t quite get what I’m so up in arms about, he summed it up pretty well:

so the scale of the model force needed highlights the fact that it could not possibly have been an oversight to include men … [making it] worse than the average smaller scale promotion where the gender preference is merely implied.

Yeah, that’s about right. After all, I find it hard to believe that LA has a shortage of male and female models looking for work.

LEGO

More Legos From 3D Meshes

Mushroom Thingy

I’ve been doing more Lego building from models. This time I made sort of an abstract mushroom tree forest thing. More photos are available on Flickr.

Here’s the original model (left) and the resulting cubeified model after running it through AddCells (right):

I realized of course that with everything grey, it was very difficult to determine which bricks of which color were needed where. So I un-joined the primitives in the original model and ran AddCells on each one individually. I used different colored “cell” blocks for each one, and the resulting models kept the color:

Each peice needed to be moved a little bit so that all the blocks lined up, but other than that it worked pretty well.

Because each piece is separate, I couldn’t use the hide tool to “slice” each layer. But I did find out something interesting: each “cube” in the new models is actually a vertex. I honestly don’t understand a ton about how that’s pulled off, but basically instead of being a point on a line, each vertex represents another object, the source cube.

In order to slice up the model, I wrote a script to delete all but a given layer, with layer 1 being the bottom layer, up to however many layers of cubes are in the model.

 

import Blender, BPyMessages, BPyMesh
from Blender import Scene, Mesh, NMesh, Window, sys, Group, Object, Draw
from Blender.Mathutils import \
	Matrix, Vector, ProjectVecs, AngleBetweenVecs, TranslationMatrix

def trimToLayer(selected,layerNumber, blockHeight,offset):
        toDelete= []

        mesh = selected.getData(mesh=1)
        tmesh = NMesh.GetRawFromObject(selected.name)
        tmesh.transform(selected.matrix)
        #Delete verticies above the current layer
        for v in tmesh.verts:
            if v.co[2] > blockHeight*layer:
                toDelete.append(v.index)
        if layerNumber > 1:
                #Delete verticies below the current layer
                for v in tmesh.verts:
                    if v.co[2] < blockHeight*layer-1:
                        toDelete.append(v.index)        
        toDelete = list(set(toDelete))

        mesh.verts.delete(toDelete)
        Window.Redraw()

##################3
if __name__ == "__main__":
    selection = Object.GetSelected();

    layer = Draw.PupIntInput("Layer",1,0,100)
    Blender.SaveUndoState('Kill Everything')  
    print "\nTrimming First Layer"
    for s in selection:
	bbox = s.getBoundBox(1)
	print bbox[0][2]
	trimToLayer(s,layer,1.2,bbox[0][2])

 

There are a couple problems with the script: primarily, I couldn’t find a way to get the software to save a screenshot (ctrl+F3 normally). Because of this, I couldn’t loop through the whole thing at once, I had to go through one layer at a time, running the script, hitting ctrl+f3, saving the image, lather rinse repeat. It was tedious, though not as tedious as manually cutting up each layer. But almost.

The resulting MRI-like were used to build the model. The exact placement of which bricks and where is left as an excercise to the reader. A few layers (from the bottom, middle, and towards the top) are shown below.

This is my first attempt at a Blender script, and admittedly one of my first times using blender, so any feedback on how to streamline this process would be appreciated.