A brand is a pointer

Media_httpfarm5static_ccrhb

Unevolved Brands by Graham Smith via flickr.com

As someone with an engineering background, I was always far more concerned with the features of the product I was building, rather than the hype and bullshit that gets built up by marketing. But eventually, I changed my mind about marketing. The practice of something and its intent are two separate things. 

The core intent of marketing is actually about clear communication and teaching others so they can understand your product, use your product, and stay with it. Given you actually have something of value for others to make their lives better, they will need help understanding how and why you’re able to do that. [1] 

Part of being able to clearly communicate your product is having a brand or a positioning. So what is a brand? Is it a great looking logo? Or great looking packaging? I’d argue that those are just manifestations of its core purpose:

A brand is essentially a pointer.

Just as in you have memory addresses pointing to other sections of memory, a brand is a pointer that uniquely refers to a product, whether it’s a 5 word description, a logo, commercial, or nowadays, an internet meme. Every time you think of solving a problem or doing an activity, chances are, you only think of one or two solutions. 

Where do you go if you want to play with toy bricks?
Where do you go if you want to see funny videos?
Where do you go if you want to review your personal finances?
Where do you go if you want to read rants about Apple?

When you’re describing your startup or your product to other people, it needs to be simple and succinct enough to write a pointer in their minds about a specific problem they need solved. So that the next time they want this problem solved, they think of your product. Or even better, the next time someone asks them how to solve a particular problem, they’ll be reminded of your product.

That’s why you so often hear the phrase, “It’s X for Y” when someone’s describing their startup. As clichéd as the phrase is, it’s effective in giving the listener a mental hook to hang their understanding on. 

But, “my product does more than that!” you might retort. Don’t fall into this trap of feeling sheepish that your product only solves one problem. Many startups fail because they don’t even manage to do that. Clearly, in the four examples I gave above, you can do far more with their products than what I described, but the four short problem descriptions above is what reminds you of those products. It gets your product’s foot in the door of someone’s mind so they can start exploring what else your product does. The enemy of most beginning products is not a lack of features, but obscurity. 

In addition, smart people can usually think a step or two out, but they need some basis to work from. When you’ve established “It’s X for Y” for your product in someone’s mind, they’re free to let their imagination fly. They’ll probably come up with more ideas and perspectives than you would have thought of. But if you never get them there, you won’t be able to reap the benefits of people’s enthusiasm and imagination. 

Lastly, having a pointer to your product helps with narrowing down your minimum viable product if you can describe it succinctly. Many times, when you’re in the early stages of product development, you’re not actually quite sure what you’re building as of yet. Having a short description goes a long way in focusing your efforts and help determine what your MVP should be. The less you can describe what the core functionality should be, the longer it will take for you to launch, and the longer it’ll take for you to get feedback on whether you’re even on track or not.

So think long and hard about how to whittle down what your product is suppose to do, if it can only do one thing. If you get stuck, If your product is useless if it doesn’t do X, then keep X. If your product is still useful without X, then cut X.

If you get stuck, think about control tower software. Despite it being very complicated and having lots of features, it’s only suppose to do one thing its core: land planes. Your product should just land planes too, by analogy. And the next time someone needs to land their plane, they’ll think of you.

[1] Marketing gets a bad rap because, often times people do marketing even when they have shitty products or products that are inherently harmful.

Advertisements

How to write modules with fallback default arguments in OpenSCAD

While refactoring King’s Gambit in OpenSCAD, I wanted to make a rounded-corner cylinder module that also behaved like the regular cylinder module. In the regular cylinder module, you can write arguments in a variety of ways.

cylinder(10, 10, 20);
cylinder(h = 10, r1 = 10, r2 = 20);
cylinder(h = 10, r=20);

As you see above, you can either pass in arguments by order (like most programming languages), or by name (like in Objective-C and passing hashes in Ruby). And if the argument “r” exists, it override the values for “r1” and “r2”.

I wanted to be able to write this kind of module as well. Of note, there is no pattern matching in OpenSCAD, there are no variables and only constants in OpenSCAD, and there is no nil or null in OpenSCAD. There is an undefined state that constants can be in, but no test for their undef state, since it’s unspecified. Thus, we’re left with using default arguments as a work around. This close as I have figured it out:

module rounded_cylinder(h, r1, r2, r = "undefined") {
  module helper(h, r1, r2) {
    // I'm just going to render a regular cylinder here for simplicity. 
    // Pretend this section has multiple lines of code.
    cylinder(h, r1, r2);
  }

  if (r == "undefined") {
    helper(h, r1, r2);
  } else {
    helper(h, r, r);
  }
}

rounded_cylinder(4, 4, 2);
translate([10, 0, 0]) rounded_cylinder(4, r = 4);
translate([20, 0, 0]) rounded_cylinder(4, r1 = 4, r2 = 2);
translate([30, 0, 0]) rounded_cylinder(4, r1 = 4);
translate([40, 0, 0]) rounded_cylinder(4, r2 = 2);
translate([50, 0, 0]) rounded_cylinder(4);

Default_args

As you can see, I set the default value of “r” to “undefined”, and then tested for whether it’s undefined or not, and rendered the correct helper accordingly, since there’s no actual test for whether a variable is undefined or not.

Note that because there are no variables in OpenSCAD, all constants need to be defined in the beginning of a module. Thus, you can’t redefine constants inside the two branches of the if statement.

Also note that you can either repeat the same code twice in each branch of the if statement, or you can define a helper module inside rounded_cylinder and make a call to it in each branch, as shown above. The helper module only exists within the scope of rounded_cylinder and won’t pollute the global namespace.

Introducing King’s Gambit a parametric open source chess set

King’s Gambit [1] is a little project I’ve been working for the better part of a week and a half. It’s a parametric 3D model chess set in OpenSCAD that’s printable on a 3D printer

Kings_gambit

A Programmer’s Modeling Tool

OpenSCAD is described as a programmer’s solid 3D modeling tool. You can write scripts using constructive model geometry (CSG) to construct 3D models. CSG is simply where you take primitive shapes like spheres, cubes, and cylinders and perform operations with them like union, intersection, and difference to produce objects of appreciable complexity.

To get started in OpenSCAD is pretty simple, as it’s not a hard language to learn. Just a cursory reading through the user manual and googling for some tutorials will make it easy to get started. However, there are some little gotchas. [2][3]

The biggest advantage OpenSCAD for me is that it makes 3D modeling accessible to programmers. It lets me leverage the existing programming tools that I know, such as vim and git to be productive. Instead of being faced with a dizzying array of buttons in an interface like most CAD software, OpenSCAD uses 3 simple primitive shapes, and 3 major CSG operations for me to build upon. In addition, OpenSCAD makes it easy to make parametric models, where the dimensions of the model aren’t hard coded and can be adjusted according to a user’s needs. 

However, there are ways in which it can improve. There are certain operations that can be used to produce rounded corners, such as the Minkowski sum, but it’s too slow to be useful for that. [4] 

As for the language itself, there are some common language features that are missing, such as blocks as first class objects, object properties, pattern matching, etc. Therefore, I found it difficult to create abstractions that I’d like, or to encapsulate variables cleanly for parametric modeling. I’ll write more about this in detail in a later post, as I gain more experience. Perhaps there are other ways to do things that I’m not yet aware of.

Inspired by the Staunton Design

King’s Gambit is inspired by the original Staunton chess set, the most recognizable chess pieces in the world. However, it is a little different, as I designed all the pieces myself from scratch. Given that this is the first time I’ve designed any 3D solid model, I’d say that it turned out pretty well. 

Most of the pieces were pretty easy to design, and I spent most of my time refactoring and doing geometric math, rather than scratching my head about why it’s not rendering correctly. It’s said that any programming language worth learning will make you think a little differently. I found it to be a little bit of an adjustment to picture in my mind how to combine different primitives in order to get the desired shape.

The bishop’s mitre is a sphere unioned with a cone with a rectangular volume subtracted from it to create the slot. You simply union another sphere for the dollop on top.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module bishop_head(head_ratio, neck_radius) {
  translate([0, 0, neck_radius])
    difference() {
      // the bishop head with a dollop on top
      union() {
        teardrop(head_ratio, neck_radius)
          translate([0, 0, -neck_radius / 3]) sphere(neck_radius / 3);
      }

      // the bishop slot
      rotate(a = -45, v=[0, 1, 0])
        translate([neck_radius / 4, -neck_radius, 0])
          cube([neck_radius * 2, neck_radius * 2, neck_radius / 4]);
    }
}

The rook’s turret is a cylinder with a bullet (which itself is a cylinder unioned with a sphere) subtracted out of the top to get the valley. Then using a for loop, we can subtract out rectangular volumes at every 60 degrees to get the recognizable ramparts.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
module rook_battlement(height, radius) {
  neck_radius = radius;
  battlement_radius = 1.4 * radius;
  inner_battlement_radius = 0.6 * battlement_radius;

  cylinder(0.2 * height, neck_radius, battlement_radius);
  translate([0, 0, 0.2 * height]) {
    difference() {
      // the battlement
      cylinder(0.8 * height, battlement_radius, battlement_radius);

      // cut out the loopholes
      for (i = [0:5]) {
        rotate(a = [0, 0, i * 360 / 6])
          translate([-1.5, 0, 0.5 * height])
            cube([3, 10, 4]);
      }

      // cut out circular space at top
      translate([0, 0, 0.5 * height]) {
        cylinder(height, inner_battlement_radius, inner_battlement_radius);
        sphere(inner_battlement_radius);
      }
    }
  }
}

I found the knight to be the hardest to design, as it had the most organic shape out of all the pieces, so it’s not easily constructed from primitives. I ended up making two profiles in Inkscape and exported them as DXF files to be imported into OpenSCAD. I then extruded the 2D profiles and intersected them. at an angle. They didn’t quite have the desired effect, but it’s serviceable for the time being. 

One thing I had to watch out for were overhangs. 3D printers have a tougher time with models with overhangs without support material, so instead of sharp grooves, I tended to have sloping saucers, and torus rings for decor.

I have a library of parts that I refactored out of the chess pieces to make them more reusable, if people wanted to make different versions or variations of the pieces. I will spend more time to pull them out into a library if necessary, but for the time being, they’re going to be part of King’s Gambit.

Fork it!

Though there’s a 1849 British design patent on the Staunton design, it looks like it has long expired. With a quick search on the internets, it seems like it’s generally accepted amongst chess set makers to not copyright derivatives of the Staunton design. I intend to release King’s Gambit under some sort of copyleft license, but as of this moment, I’m not sure whether it should be under creative commons or LGPL, since creative commons is not well-applied to software. Being in OpenSCAD, it’s definitely software, and yet, it describes an object.

I encourage you to fork it and make improvements upon it. I’ve printed some of the pieces out, but not all of them yet, so there may be some bugs that need fixing. In addition, though I tried to make all the pieces as parametric as I can, I know I might have hard coded some of the pieces along the way. So if you find that you can’t print out a 100mm tall pawn by adjusting the parameter, fix it and send a pull request!

Hopefully, this will encourage you to check out OpenSCAD and try designing a couple things yourself, seeing how it’s within reach of most programmers.

With 3D printing starting to be more accessible, I think it’s important to have the equivalent of open source projects for fundamental libraries that produce gears, pulleys, and other machines. When something fundamental becomes digitized, we will want to share it, and have the freedoms to adjust it as we see fit for our own use without restricting the use for other people. I’m pretty excited to see where this will all lead.

[1] King’s Gambit is an old chess opening that’s not used much anymore at the master level. The idea of a sacrific that puts the king at risk for a calculated advantage is amusing, so I named it after that.

[2] For Mac users, you need to use the (currently) development version 2012.01.25+. Then under Preferences -> Advanced, check the box for “Goldfeather”. This is a workaround for the current bug with the underlying OpenGL drivers with Intel GPUs. 

[3] You need to first compile and render your model using CGAL (F6, not just F5), before you’re able to export to STL files (common exchange format). Otherwise, you won’t be prompted to do so.

[4] For those of you that are Electrical Engineers, the Minkowski is kinda like convolution of polygons.

Addendum tips to the Inkscape to OpenSCAD dxf tutorial

Media_http4bpblogspot_qdhun

OpenSCAD is a programmer’s solid geometric modeler. You can make complex objects from a combination of spheres, cylinders, and rectangular volumes. However, sometimes, you have more organic shapes that you need to model, like the knight in a chess set. That’s where an interactive modeler comes in handy. You can use Inkscape to draw a 2D shape, and extrude it in 3D in OpenSCAD. 

I’ve found the tutorial I’ve linked above works, but you have to make sure that you make the paths segments, or else OpenSCAD won’t display it. Also, note the dimensions that you’re drawing in, since you’re drawing on A4 paper by default in Inkscape, the extruded model in OpenSCAD viewer might just be off screen, so make sure you zoom out.

Also, every time you change the DXF file, you need to flush the cache in the OpenSCAD viewer in order to get the DXF file to reload. It’s under “Design -> Flush Caches”. And then you can reload and compile (F4).

In addition, in your .scad file, loading the file with linear_extrude is deprecated. Use this instead:

linear_extrude(height=50) import("star.dxf");

where import() is the child of linear_extrude. Hopefully, this will help you avoid some pitfalls of modeling with DXF files. Happy modeling!

King’s Gambit in progress

Lately, I’ve been working in OpenSCAD to try my hand at designing things to print out. I figured an easy way to get started was to design a standard chess set. This is my progress so far.

Doing OpenSCAD changes your thinking a little bit, where you have to picture and rotate things in your head, and actually not worry about where the seams are, because it’ll be taken care of for you, without you having to waste time doing geometric math.

There are things that I’d add to OpenSCAD, however, like higher level operations like stacking pieces (or beveling edges and rounding corners), adding labels to measurements, and ruby-like blocks, querying measurements of objects, and encapsulation of variables in modules.

Update: It’s now done!

 

What it’s like to do estimation for software.

– You are an inventor. You’ve invented a solar-powered microwave oven, an engine that runs on dead bugs, and a laser-powered weapon to kill mosquitoes. Someone comes to you and says:

“Hey inventor, I need a drone that will pick up mice (but not other animals), locate my ex-girlfriend and drop them on her head. Give me a budget and a time estimate.”

That pretty much sums it up for me

Often times in software engineering, you’re doing something slightly new, so you don’t know exactly how long these things will take. Add up a lot of little tasks, and the margin for error in estimate is going to be bigger the further out you try to plan.

Missing bodies when doing constructive solid geometry in OpenSCAD for Macs

For those of you using Macs with an Intel GPU and Lion OS, there’s a bug in the current releases of OpenSCAD that makes polygons and objects disappear when you try to intersect or difference them. The only one that works is union, which isn’t very helpful by itself.

The maintainer of OpenSCAD has released a workaround for the problem. Download the development version 2012.01.14, and install that. Then go into preferences -> advanced, and check the box that says “Force Goldfeather”

This selects the Goldfeather algorithm from the underlying OpenCSG library, and though it has some visual artifacts, it should be enough to keep you going on your projects on the Mac.

Movie and music companies need learn how to innovate

This year the movie industry made $30 billion (1/3 in the U.S.) from box-office revenue. But the total movie industry revenue was $87 billion. Where did the other $57 billion come from? From sources that the studios at one time claimed would put them out of business: Pay-per view TV, cable and satellite channels, video rentals, DVD sales, online subscriptions and digital downloads.

The music and movie business has been consistently wrong in its claims that new platforms and channels would be the end of its businesses. In each case, the new technology produced a new market far larger than the impact it had on the existing market.

  • 1920’s – the record business complained about radio. The argument was because radio is free, you can’t compete with free. No one was ever going to buy music again.
  • 1940’s – movie studios had to divest their distribution channel – they owned over 50% of the movie theaters in the U.S. “It’s all over,” complained the studios. In fact, the number of screens went from 17,000 in 1948 to 38,000 today.
  • 1950’s – broadcast television was free; the threat was cable television. Studios argued that their free TV content couldn’t compete with paid.
  • 1970’s – Video Cassette Recorders (VCR’s) were going to be the end of the movie business. The movie businesses and its lobbying arm MPAA fought it with “end of the world” hyperbole. The reality? After the VCR was introduced, studio revenues took off like a rocket.  With a new channel of distribution, home movie rentals surpassed movie theater tickets.
  • 1998 – the MPAA got congress to pass the Digital Millennium Copyright Act (DMCA), making it illegal for you to make a digital copy of a DVD that you actually purchased.
  • 2000 – Digital Video Recorders (DVR) like TiVo allowing consumer to skip commercials was going to be the end of the TV business. DVR’s reignite interest in TV.
  • 2006 – broadcasters sued Cablevision (and lost) to prevent the launch of a cloud-based DVR to its customers.
  • Today it’s the Internet that’s going to put the studios out of business. Sound familiar?
Why was the movie industry consistently wrong? And why do they continue to fight new technology?

I think being in technology, we take innovation-as-a-good-thing for granted. Everyone else in other slower moving industries probably see their business models as granting privilege and right established so long ago, that no one really cares where they come from or how they came to be–and especially whether the world, economy, and landscape is as it was back then.

Or maybe they do, and the MPAA and RIAA willfully ignore how new technologies have helped them make money in the past. You’d think that with the pace of new platforms to be able to make them money on, they’re remember that and find ways to capitalize on it.

But I remember Dalton Calwell puts it: “I don’t envy being [in their position because] they’re dealing with economic realities, and there aren’t a lot of options.”

I suspect this is partially because they don’t innovate on their own, and are usually blindsided by what comes out of Silicon Valley. Movie and Music industries really need to learn how to innovate on their own so they don’t get blindsided so often, time after time. And it may be that they need to become technology companies, according to the Marc Andressen’s insight that Software is Eating the World.

Ironically, the six major movie studios have a great technology lab in Silicon Valley with projects in streaming rights, Video On Demand, Ultraviolet, etc. But lacking the support from the studio CEOs or boards, the lab languishes in the backwaters of the studios’ strategy.

That’s really a pity. 

Browsing Foreign Websites a Misdemeanor in Belarus

The Law requires that all companies and individuals who are registered as entrepreneurs in Belarus use only domestic Internet domains for providing online services, conducting sales, or exchanging email messages. It appears that business requests from Belarus cannot be served over the Internet if the service provider is using online services located outside of the country. The tax authorities, together with the police and secret police, are authorized to initiate, investigate, and prosecute such violations. (Id.)

Additionally, the Law states that the owners and administrators of Internet cafés or other places that offer access to the Internet might be found guilty of violating this Law and fined and their businesses might be closed if users of Internet services provided by these places are found visiting websites located outside of Belarus and if such behavior of the clients was not properly identified, recorded, and reported to the authorities. The Law states that this provision may apply to private individuals if they allow other persons to use their home computers for browsing the Internet. (Id.)

When I read this at first, I thought it was a democratic nation that was restricting internet access of its citizens. I had no idea Belarus is one of the last authoritative regimes. That explains a bit more, as anything that can be used to challenge your power will be tried to shut down. However, even democratic societies are restricting internet access for its citizens, like Australia most notably.

Algorithm Measures Human Pecking Order

Media_httpwwwtechnolo_tedzh

By looking at the changes in linguistic style that occur when people make the transition from non-admin to admin roles, Kleinberg and co cleverly show that the pattern of linguistic co-ordination changes too. Admins become less likely to co-ordinate with others. At the same time, lower ranking individuals become more likely to co-ordinate with admins.

A similar effect also occurs in the Supreme Court (where power differences are more obvious in any case).

Curiously, people seem entirely unware that they are doing this. “If you are communicating with someone who uses a lot of articles — or prepositions, orpersonal pronouns — then you will tend to increase your usage of these types of words as well, even if you don’t consciously realize it,” say Kleinberg and co.

If you can measure actual influence, there will be an entire industry and market that grows up around trying to hack it and influence it. It’ll amplify the positive feedback loop, where the influential will become even more influential, since we’ll look to the ranking to help us decide who to listen to.

This would also affect social networks, especially those like Linkedin, where ladder climbers and recruiters try to find influential people. I can imagine it would help Facebook do rankings on its news feed.

However, those are just retroactively applying a new technique to existing products. The question we should be asking is, what other types of things does this technology allow?

Off the top of my head, you can provide real-time feedback during a conversation or chat of how you’re being perceived. Advertising would find it interesting on the assumption that more influential people can get others to buy. The other thing you can do is see if the measure of power correlates with virality.