Puerto Vallarta
The London Bridge, long exposure.
Another shot from La Dôle, Switzerland.
Paris skyline from the Basilique du Sacré-Cœur.
Happy Valentine’s day everybody!
View of Mont Blanc, from La Dôle ski resort, Switzerland.

The Moiry Glacier, Grimentz, Switzerland.
Over the past couple years, I’ve traveled to some amazing places, and taken pretty neat photos. So far, they’ve been sitting on my computer, serving only my occasional enjoyment—hardly an appropriate fate.
Instead, I’ve decided to start slowing sharing these on here. Over the next few months, I’ll try to post the brief backlog of good photos taken in and around 2013.
This particular photo was taken in the summer of 2012, on a trip to Switzerland. It’s the Lac de Moiry, a glacier-fueled lake behind a dam.
From the “this guy is a genius” department: Bret Victor (of Inventing on Principle fame) presents his latest project. The prototype is at the intersection of data visualization and drawing, and introduces an entirely new approach to the topic. Well worth a watch.
Fibonacci & the Y-Combinator in C
Be warned, this post describes something you should never actually use in production code. However, we will get to play with some very cool concepts and techniques: functional programming in C, closures, implementing autorelease pools from scratch, data structures (linked lists and b-trees), bitwise operations, recursivity, memoization, and the Y-Combinator. If this sounds crazy, don’t be scared. It’s all fairly simple when broken down.
Let’s back up for a second, however. What we’re going to create here is a program that returns a number in the Fibonacci sequence. The Fibonacci sequence is a sequence of numbers in which each integer is equal to the previous two integers added: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, etc.
There are many ways of calculating Fibonacci numbers, but the naïve implementation which follows the mathematical definition is this:
unsigned long long fib(int n) {
if (n < 3) return 1;
return fib(n-1) + fib(n-2);
}
So let’s make a program out of this:
// fib.c
#import <stdlib.h>
#import <stdio.h>
// let's make life easier for ourselves:
typedef unsigned long long ull;
ull fib(int n) {
if (n < 3) return 1;
return fib(n-1) + fib(n-2);
}
int main(int argc, char **argv) {
int upto = 20; // which number to compute
if (argc >= 2) upto = strtol(argv[1], NULL, 10);
printf("Calculating fib(%d)...\n", upto);
ull solution = fib(upto);
printf("fib(%d) == %llu\n", upto, solution);
}
We’re going to be using clang as our compiler. Let’s compile and run our program:
$ clang -o fib -O3 fib.c
$ ./fib 17
Calculating fib(17)...
fib(17) == 1597
However, as you’ll see if you try to compute fib(200)
, this will not scale. In computer science terms, fib is a function which requires exponential time as n
increases. O(2^n)
. For example:
fib(5) [A] calls fib(4) [B] and fib(3) [C]
fib(4) [B] calls fib(3) [D] and fib(2) [E]
fib(3) [C] calls fib(2) [F] and fib(1) [G]
fib(3) [D] calls fib(2) [H] and fib(1) [I]
fib(2) [E] returns 1
fib(2) [F] returns 1
fib(1) [G] returns 1
fib(2) [H] returns 1
fib(1) [I] returns 1
As you can see, the function is called multiple times with the same argument, and for every time n
is decremented (until you reach 1 or 2), the number of function calls increases by a power of two. Imagine how much worse it would be for fib(200)
. The number is so great that even given unlimited memory and energy, your computer would require billions of years to finish the computation.
Closures
A closure is an anonymous function which may use and capture variables from its parent scope. Imagine this code, in JavaScript:
function print_element_plus(x) {
return function(e) {
console.log("-> " + (x + e));
}
}
[1, 2, 3].forEach(print_element_plus(2));
// -> 3
// -> 4
// -> 5
print_element_plus
returns an anonymous function (aka. a closure) which takes one argument and adds it to x
. The variable x
is captured by the closure, and even though it goes out of scope when print_element_plus
returns, it is still retained by the closure until the closure itself goes out of scope and is freed.
C does not natively support closures. Although similar functionality can be implemented in pure C fairly easily using a struct containing the environment and a function pointer, we’re going to instead take advantage of clang’s built-in support for the blocks extension to the language:
$ clang -fblocks -o fib -O3 fib.c -lBlocksRuntime
In C, a block is simply another name for a closure, and its syntax is very similar to defining a function pointer. So with that in mind, let’s rewrite our fib
function as a block.
__block ull(^fib)(int) = ^ull(int n) {
if (n < 3) return 1;
return fib(n-1) + fib(n-2);
};
Note: this should go in main()
and the __block
is necessary to enable explicit recursion, so that the block may reference itself.
The Y-Combinator
Recursion implies that a function has a name by which to refer to itself, so it may call itself. While the example above works, it relies on the block capturing the variable to which it is assigned from the parent scope. This is not super clean, and relies on a implementation detail of the C programming language. Identical code would not work in, for example, lisp.
Since we are giving ourself the restriction of not explicitly using the fib
variable in order to recur, we will wrap the function in a function whose first and only argument is a function with which to recur. We’ll call this function the generator, because when called with fib
as its argument, it will return the correct fib
function.
typedef ull(^fib_f)(int);
fib_f(^fib_generator)(fib_f) = ^fib_f(fib_f recur) {
return ^ull(int n) {
if (n < 3) return 1;
return recur(n-1) + recur(n-2);
};
};
This is where the Y-Combinator comes in handy. The Y-Combinator is a function which enables recursion, using only anonymous functions, and without using recursion in its implementation. It looks somewhat like this (in Scheme):
(define Y
(lambda (f)
((lambda (x) (x x))
(lambda (x) (f (lambda (y) ((x x) y)))))))
This article by Mike Vanier does a far better job of explaining the Y-Combinator than I ever could. Suffice to say that when called with a generator function, as defined above, the Y-Combinator will return the recursive fib
function. With the Y-Combinator, we could say:
fib_f fib = Y(fib_generator);
Due to C’s explicit typing, declaring higher-order functions can quickly become cumbersome, even with typedef
s. So in order to get around that, we’re going to declare a single type to hold every function in our program. We’re going to call it _l
, short for lambda.
typedef union _l_t *_l;
typedef union _l_t {
ull(^function_f)(int);
_l(^generator_f)(_l);
} _l_t;
Wrapping the type in an union allows it to refer to itself. We’ll be adding a couple more block types to this union shortly, but for now our only two options are: the signature of the fib function, and the generator which both takes and returns a lambda (containing a fib function, though that is unspecified).
Since this type is declared as a pointer, it should live on the heap, and therefore we should write initializer functions for it:
_l function(ull(^f)(int)) {
_l data = malloc(sizeof(_l_t));
data->function_f = Block_copy(f);
return data;
}
_l generator(_l(^f)(_l)) { /* ... same thing ... */ }
Let’s ignore the fact that we’re leaking tons of memory for a moment (we’ll come back to that), and instead refactor our fib generator to use this new type:
_l fib_generator = generator(^_l(_l recur) {
return function(^ull(int n) {
if (n <= 2) return 1;
return recur->function_f(n-1) + recur->function_f(n-2);
});
});
In C, the basic Y-combinator above looks somewhat like this:
_l y_combine(_l fn) {
_l x = combiner(^_l(_l recur) {
return function(^ull(int n) {
_l resp = recur->combiner_f(recur);
return fn->generator_f(resp)->function_f(n);
});
});
return x->combiner_f(x);
}
You will also need to add the combiner function type to your union, and create a constructor for it:
_l(^combiner_f)(_l);
_l combiner(_l(^f)(_l)) { /* ... same as above ... */ }
We now have all the pieces in place to use the Y-combinator to replace our natively recursive implementation of fib
:
_l fibonacci = y_combine(fib_generator);
int upto = 20;
if (argc >= 2) upto = strtol(argv[1], NULL, 10);
ull fib = fibonacci->function_f(upto);
printf("Fibonacci number %d is %llu.\n", upto, fib);
Auto-release pools
As you have probably noticed, the code above is unfortunately leaking tons of memory. Many of the functions we’ve written allocate _l
unions, and these are never released. While we could attempt to always correctly release these as soon as they are no longer needed, a more interesting solution is to use an auto-release pool.
Auto-release pools are a concept familiar to Objective-C programmers, since they are used extensively in all of Apple’s APIs. They work like this: You can create and flush pools, which nest like a stack. You can auto-release a pointer, which means that it is added to the topmost pool, and is freed when the pool is flushed.
The simplest way of implementing auto-release pools is with two linked lists: the first to contain the objects that have been auto-released (this is the pool itself), and the second to contain the stack of pools. Lastly we’re going to need a static variable to refer to the top of the pool stack.
typedef struct autorelease_pool_t *autorelease_pool;
typedef struct autorelease_pool_t {
void *p;
void(*fn)(void*);
autorelease_pool next;
} autorelease_pool_t;
typedef struct autorelease_pool_stack_t *autorelease_pool_stack;
typedef struct autorelease_pool_stack_t {
autorelease_pool head;
autorelease_pool_stack parent;
} autorelease_pool_stack_t;
static autorelease_pool_stack current_pool = NULL;
Creating a pool is easy, we just allocate a reference and push it to the top of the stack:
void push_autorelease_pool() {
autorelease_pool_stack new_pool = malloc(sizeof(autorelease_pool_stack_t));
new_pool->parent = current_pool;
new_pool->head = NULL;
current_pool = new_pool;
}
Then we can write a function to add pointers to the pool. Since different types may have different free functions, we will also take a reference to the free function to use on the pointer as the second argument to the autorelease function:
void autorelease(void *p, void(*fn)(void*)) {
// If there is no current pool, we leak memory.
if (current_pool == NULL) return;
autorelease_pool head = malloc(sizeof(autorelease_pool_t));
head->p = p;
head->fn = fn;
head->next = current_pool->head;
current_pool->head = head;
}
And finally, the magic happens when we flush the pool. We’ll simply loop through the current pool, call each element’s free function, and free the reference, and finally pop the pool off the stack:
void flush_autorelease_pool() {
while (current_pool->head != NULL) {
(*current_pool->head->fn)(current_pool->head->p);
autorelease_pool next = current_pool->head->next;
free(current_pool->head);
current_pool->head = next;
}
autorelease_pool_stack parent = current_pool->parent;
free(current_pool);
current_pool = parent;
}
Now, in order to solve our memory leak issues in the code we wrote earlier, we must add code to auto-release the _l
unions we allocate, and wrap main
with an auto-release pool:
_l function(ull(^f)(int)) {
_l data = malloc(sizeof(_l_t));
data->function_f = Block_copy(f);
// these two lines have been added:
autorelease(data->function_f, (void(*)(void*))&_Block_release);
autorelease(data, &free);
return data;
}
Since both y-combination and final execution allocate lambdas, we’ll want to wrap both main, and then the final execution itself in an auto-release pool:
int main(int argc, char **argv) {
// wrap in pool
push_autorelease_pool();
// ...
_l fibonacci = y_combine(fib_generator);
// ...
push_autorelease_pool();
ull fib = fibonacci->function_f(upto);
flush_autorelease_pool();
printf("Fibonacci number %d is %llu.\n", upto, fib);
flush_autorelease_pool();
return 0;
}
Memoization: Wrapping
While our code is now fully functional (ha, ha, coder pun…), it still is horribly inefficient. That’s because we still have not solved the inherent problem of the function having a time complexity of O(2^n)
. This can be solved using memoization.
Memoization is an optimization technique which consists of storing computations in memory when completed, so that they can be retrieved later on, instead of having to be re-computed. For fib
, using memoization reduces the time complexity down to O(n)
.
In order to use memoization, we need a way to inject a function that will be executed before executing the fib
function. We’ll call this wrapping, and as a first example, let’s just use wrapping to demonstrate how bad O(2^n)
really is.
_l wrap(_l fn, _l wrap_with) {
return generator(^_l(_l recur) {
return function(^ull(int n) {
_l fn_ = function(^ull(int n) {
return fn->generator_f(recur)->function_f(n);
});
_l wrapped = function(^ull(int n) {
return wrap_with->wrapper_f(fn_, n);
});
return wrapped->function_f(n);
});
});
}
Understanding this wrapping function still makes my brain hurt, but suffice to say that it takes a generator and a wrapper as arguments, and returns a generator. The resulting generator can be used in the Y-combinator, and every recursion of the original function will be replaced with a recursion of the wrapper function, which itself calls the original function.
A simple wrapper function that will log every iteration looks like this:
_l log_wrapper = wrapper(^ull(_l f, int n) {
printf("About to generate # %d\n", n);
return f->function_f(n);
});
And the final code that uses this looks like this:
_l wrapped_fibonacci = y_combine(wrap(fib_generator, log_wrapper));
ull fib = wrapped_fibonacci->function_f(upto);
printf("Fibonacci number %d is %llu.\n", upto, fib);
Your output should look somewhat like this. As you can see, calling fib(20)
evaluates the function 13,529 times.
Memoization: Implementation
In order to write a memoization wrapper function, we need a data structure in which to store the results. Most examples of memoization use a hash table, but since the key in our case is an integer, I decided to go for something a little more exotic: a binary tree, based on the bits of the integer key.
typedef struct cache_node_t *cache_node;
typedef struct cache_node_t {
bool is_leaf;
union {
struct {
cache_node one;
cache_node zero;
} node;
ull leaf;
} self;
} cache_node_t;
We’ll also create some simple methods to create and destroy trees:
cache_node cache_tree_new() {
return calloc(1, sizeof(cache_node_t));
}
void cache_tree_free(cache_node node) {
if (!node->is_leaf) {
if (node->self.node.one != NULL) cache_tree_free(node->self.node.one);
if (node->self.node.zero != NULL) cache_tree_free(node->self.node.zero);
}
free(node);
}
In order to store a value in the tree, we iterate through every bit in the int, traversing either through the one
or zero
node of the tree, and finally setting the leaf
to the value we’re trying to cache:
void cache_tree_store(cache_node root, int key, ull value) {
cache_node node = root;
for (size_t i = 0; i < sizeof(int) * 8; i++) {
bool direction = (bool)((key >> i) & (unsigned int)1);
if (direction == 1) {
if (node->self.node.one == NULL) {
node->self.node.one = calloc(1, sizeof(cache_node_t));
}
node = node->self.node.one;
} else {
if (node->self.node.zero == NULL) {
node->self.node.zero = calloc(1, sizeof(cache_node_t));
}
node = node->self.node.zero;
}
}
// the last node should already be a leaf, if it isn't, we just created it
if (!node->is_leaf) {
node->is_leaf = true;
}
node->self.leaf = value;
}
Looking up a value is essentially the same thing, with some additional code to report failures:
ull cache_tree_lookup(cache_node root, int key, bool *found) {
cache_node node = root;
for (size_t i = 0; i < sizeof(int) * 8; i++) {
if (node == NULL || node->is_leaf) {
if (found) *found = false;
return 0;
}
bool direction = (bool)((key >> i) & (unsigned int)1);
if (direction == 1) {
node = node->self.node.one;
} else {
node = node->self.node.zero;
}
}
if (node == NULL || !node->is_leaf) {
if (found) *found = false;
return 0;
}
if (found) *found = true;
return node->self.leaf;
}
And finally, now that we have a tree in which to store cached results, we can write our memoization function. Here, we’re actually adding creating a function called new_memoizer
which returns a new instance of the wrapper function with its own (auto-released) cache.
_l(^new_memoizer)() = ^_l {
cache_node root = cache_tree_new();
autorelease(root, (void(*)(void*))&cache_tree_free);
return wrapper(^ull(_l f, int n) {
bool found;
ull cached = cache_tree_lookup(root, n, &found);
if (found == true) {
return cached;
} else {
ull value = f->function_f(n);
cache_tree_store(root, n, value);
return value;
}
});
};
So, with that, let’s try our program again, but with memoization:
_l fibonacci = y_combine(wrap(wrap(fib_generator, log_wrapper), new_memoizer()));
push_autorelease_pool();
ull fib = fibonacci->function_f(upto);
flush_autorelease_pool();
printf("Fibonacci number %d is %llu.\n", upto, fib);
As you can see in the output, this runs significantly faster:
Generate up to fib # 20...
About to generate # 20
About to generate # 19
About to generate # 18
About to generate # 17
About to generate # 16
About to generate # 15
About to generate # 14
About to generate # 13
About to generate # 12
About to generate # 11
About to generate # 10
About to generate # 9
About to generate # 8
About to generate # 7
About to generate # 6
About to generate # 5
About to generate # 4
About to generate # 3
About to generate # 2
About to generate # 1
Fibonacci number 20 is 6765.
Conclusion
You can peruse the final code used in this article in this gist.
Now, that being said, if you ever have a need to implement a function to return a number in the Fibonacci sequence, it would be wise to forget everything I’ve said above, and just use the following:
ull fib(int n) {
if (n <= 2) return 1;
ull first = 1, second = 1, tmp;
while (--n>1) {
tmp = first + second;
first = second;
second = tmp;
}
return second;
}
Liza Long writes about her mentally ill child:
I am sharing this story because I am Adam Lanza’s mother. I am Dylan Klebold’s and Eric Harris’s mother. I am Jason Holmes’s mother. I am Jared Loughner’s mother. I am Seung-Hui Cho’s mother. And these boys—and their mothers—need help. In the wake of another horrific national tragedy, it’s easy to talk about guns. But it’s time to talk about mental illness.
Web 3.0 at Chartboost
This is an article I originally wrote for the Chartboost blog.
For the sake of brevity, we’re going to dub the next generation of web app development “Web 3.0.” This entails a collection of new technologies and new ideas, which have become possible only recently with the large advances made by modern browsers.
What does this mean? This means creating web applications, not sites. We believe the server side is a web service, while the client side is the application. The server provides an API, and the client is a self-contained app which uses this API. A mobile app would be an equal citizen and use the exact same API.
We think these ideas are the future, and as we grow our team and our capabilities, we are diving into them head first. The first of these projects—and somewhat of a testbed for what our dashboard is going to become—is none other than the new Chartboost Help site.
The help site.
So without further ado, these are some of the cool new things we’re trying with the new help site:
Push State
Perhaps the first thing you will notice is that navigating the site does not involve any page refreshes. Rather, this is done through a new technology called “Push State.” It lets a web app manipulate the browser history, essentially faking navigation and inserting its own JavaScript callbacks instead of reloads.
When moving between pages, the HTML is never replaced, which means that elements of the app can stay on screen, and even be animated, while the new content is being loaded. On the help site, a great example of this is the animation in the title part of the content, as well as the bouncing icons on the left.
This also makes the entire site feel more responsive and faster, since the user can be kept busy with animations, while a request to the server is happening in the background. That, and the requests are much smaller, since all that’s needed is the article content, and none of the layout or supporting files. Routing is done purely in JavaScript, and loading any URL natively from the server simply returns the same HTML file and routing code, which knows how to directly load the requested article.
JSON-API driven
This goes hand in hand with the above: now that we don’t require fully rendered HTML pages to be returned from the server, the server can now simply provide an elegant REST API. This API uses the full power of HTTP: versioning and authentication is done through headers, input is sent as JSON in the request body, and HTTP verbs are used.
Responsive
In an ever-connected world, and with the proliferation of mobile devices from smartphones to tablets, we think it’s becoming ever more important for the web to look its best on every device out there. Mobile-optimized sites just don’t cut it; a smartphone deserves to have the same full experience as a widescreen desktop computer.
The help site, on an iPhone.
The help site, as well as this very blog, are responsive designs. They adjust and are fully functional on all devices from iPhone to Cinema Displays. To achieve that, we make use of CSS @media
queries as well as rem
and percent-based sizing. We used the Foundation framework for its built-in responsive grid.
Vector (Icon Fonts & CSS)
Another big recent change is the proliferation of “retina” (high-resolution) screens. They’ve been around for a while on iPhones, and are now expanding to Android devices, tablets, and computers. This is most commonly done by doubling the pixel-to-point ratio, and on iOS it is common to include double resolution assets by suffixing @2x
to the image name.
We think, however, that for UI work, native rendering and vector are much better options than images. So for the help site, we use a combination of icon fonts and CSS3 properties to build up the entirety of the UI. There are practically no images in the help site’s UI!
SCSS
Another new technology we’ve made use of is CSS-preprocessing, through SCSS. This helps make our CSS code a lot cleaner and re-usable: using mixins (which are kind of like functions) for common prefixed properties, and variable dependencies on colors:
$button-green-one-textcolor : #FFFFFF;
$button-green-one-border : saturate(darken($primary- color,11%), 1%);
$button-green-one-light-inset : #FFFFFF; /* Will be used inside an RGBA with opacity */
$button-green-bg-gradient-start : darken($primary-color, 1%);
$button-green-bg-gradient-end : saturate(lighten($primary-color, 7%), 7.5%);
You might have noticed that this blog and the new help site look similar. They actually share the same SCSS source, with only few differences, like the primary color being changes from blue to green. That, along with some other neat SCSS features like nesting allow for much cleaner and much more reusable CSS code.
Markdown
We believe the entire team should be able to write and edit help articles. Markdown is a fantastically simple markup language designed around the idea that it should look like plain text. A Markdown source file should be as readable as the output it produces; and indeed, it is far more natural to write in Markdown than HTML. Thus, our help articles are written in GitHub-flavored Markdown.
Since our documentation contains a fair amount of code samples, it was important for us to support GitHub-style code blocks, as well as native syntax highlighting. As a simple example, here is our iOS Integration article, and its source code.
GitHub
Help content, much like source code, is something that multiple people collaborate on, and which can benefit from versioning and branching. Instead of re-inventing the wheel ourselves, we decided to pick a tool we already use every day as a team: git and GitHub. The source code for all of our help articles (and its messy history) is all hosted publicly on our GitHub. Check it out! And who knows, maybe somebody will even send us a Pull Request at some point.
Design
Original paper sketches
Going into it, we knew design was going to be a crucial part of this. What we had before really sucked, and was not up to our standard.
Alternate directions
We went through several iterations over a week, before settling on the current design.
We believe that the web is finally reaching a tipping point. The culmination of a decade of incremental improvements to web technologies is upon us, and lets us do things in a way that is radically new and better. If this is as exciting to you as it is to us, why don’t you throw us a line? We’re hiring!
(Source: chartboost)
I went crabbing for the first time today. Caught, cooked, and ate this crab, along with eight others. I highly recommend it, it’s a very rewarding experience, and tons of fun!
Richard Muller for the Wall Street Journal on the Fukushima incident:
But over the following weeks and months, the fear grew that the ultimate victims of this damaged nuke would number in the thousands or tens of thousands. The “hot spots” in Japan that frightened many people showed radiation at the level of .1 rem, a number quite small compared with the average excess dose that people happily live with in Denver.
What explains the disparity? Why this enormous difference in what is considered an acceptable level of exposure to radiation?
In hindsight, it is hard to resist the conclusion that the policies enacted in the wake of the disaster in Japan—particularly the long-term evacuation of large areas and the virtual termination of the Japanese nuclear power industry—were expressions of panic. I would go further and suggest that these well-intended measures did far more harm than good, not least in limiting the prospects of a source of energy that is safe, abundant and (as compared with its rivals) relatively benign for the environmental health of our planet.
The reactor at Fukushima wasn’t designed to withstand a 9.0 earthquake or a 50-foot tsunami. Surrounding land was contaminated, and it will take years to recover. But it is remarkable how small the nuclear damage is compared with that of the earthquake and tsunami. The backup systems of the nuclear reactors in Japan (and in the U.S.) should be bolstered to make sure this never happens again. We should always learn from tragedy. But should the Fukushima accident be used as a reason for putting an end to nuclear power?
I think it’s clear at this point that the answer is a resounding “No!” It’s a real shame that our world’s populace is so misinformed and afraid that we are essentially putting an end to nuclear power. Nuclear energy as a large-scale clean power source has no practical alternative; so shutting it down essentially means reverting to burning coal, which is quickly destroying our planet.
If anything, Fukushima should have shown us that it’s time to double down on nuclear, and use it to replace our planet-burning coal and gas plants.
A critique of the Apple indie developer community
The Apple developer community has bred some of the most skilled engineers I know. Specifically, I’m talking about those who, like me, were writing Objective-C code before the iPhone and before there was any money in it.
Objective-C is a hard language to learn. It’s unsafe, manually memory managed, and full of easy mistakes. But once learnt, it’s one of the most rewarding programming languages to know. It will teach you about fundamental concepts like memory, pointers, and object-orientation. Indie developers also have Apple’s mostly exemplary lead when it comes to crafting easy to use software. It’s no wonder, then, that skilled independent Mac and iPhone developers make some of the best software I’ve had the pleasure of using.
And yet, for all of their application-crafting prowesses, they fail to understand the internet. They look at every problem as a nail for their Cocoa hammer. We’ve moved beyond the point where software is downloaded and installed, and simply runs on the host computer. Today, software is social, cloud-hosted, and continuously updated. When’s the last time you updated Chrome? Right… Never, because it updates itself transparently. Even apps that would traditionally have been perfect candidates for a desktop application, such as a todo manager, are moving onto the cloud.
We have many computing devices; Macs, iPhones, and iPads, and we want to be able to pick up any of them and have access to our data. They need to sync instantly and effortlessly. This means that they require a backend web software component. This means running and maintaining servers. Writing code in a foreign programming language and dealing with a wholly new class of problems. (How do you scale your backend software? Which language / platform / framework do you use? At which point do you re-architect for a distributed system? Wait, this shit runs on Linux?)
Your average indie Mac developer is wholly unprepared for this. He’s been living in a perfect and comfortable little bubble, shielded from the ugliness of web programming, and the cloud just popped it.
Take Panic’s Coda, for example. I really hate to criticize Panic, because they’re probably one of the best development shop out there. But Coda is an example of this mentality; it’s built for a world where web development meant throwing a website together with Apache, PHP, and MySQL. And when it came to interacting with software, the backend for Mac software would simply be a .php
file that generated a property list. But that world died back in the mid-’00s. Today, web development involves MVC, newer NoSQL data stores, caching layers, load balancing, message queues, background job processing, service-oriented architectures, version control (git), code deployment systems, and so on. These make the Coda approach of editing PHP files on a live server and checking the output in a preview tab completely obsolete.1
Independent developers wanting to get in on the cloud action have been avoiding the problem, by taking the approach of building third-party clients for first-party providers. Witness the inundation of the app stores with client apps for Twitter, Instagram, or Google Reader. There’s even a series of app that use a Dropbox folder as an alternative to a web backend. That’s all well and good, and the community makes some fantastic client software that I use daily, but that approach can backfire when the first-party provider changes its mind. When Twitter decides to kill access to its API, or when Apple decides to throw you off their store for a bullshit reason.
I grew up writing Mac applications, and I used to be very involved in the Apple developer community. To this day, Objective-C remains my favorite programming language for its speed, power, and elegance. And yet, I’ve lost touch with the community as I moved beyond just Cocoa software. I realized that there’s more to be done. I didn’t want to spend the rest of my life writing client software, I wanted to write the next world-changing service that spawns countless clients. And that was never going to happen writing just Cocoa software.
There’s a ton of smart people doing great things in the wider software development community that Apple developers could learn from. And inversely, the rest of the software development community could greatly benefit from an influx of smart and quality-driven Cocoa developers. My hope is that Cocoa developers will come to embrace polyglotism and web software and make software that truly makes a difference.
-
It could be said that Coda is just not meant for web developers, it’s meant for making restaurant websites… ↩
I have the best job in the world.
Every day, I show up to work and create something awesome. It’s like being a kid again except this time, instead of Lego bricks, the building blocks are Objective-C blocks, WebSockets and ØMQ. Clojure, Ruby, and Assembly. I make things that I want to use. I solve problems for the sake of curiosity. I’m like a child in Disneyland, having the time of my life, and I’m being paid to do it.
I’m not doing it because it will make me a bajillionaire. It will, eventually, but that’s besides the point. I do it because I absolutely love being a programmer. I’d spend my time hacking even if it wasn’t my day job. Until recently, actually, it wasn’t. I was three years into a degree in graphic design when I decided that I really wanted to spend my days working on making cool stuff and solving hard problems.
Sure, it’s stressful sometimes. Meetings can eat into your productivity and Mongo can wake you up at two in the morning when an onslaught of asian traffic brings it to its knees. But at the end of the day, these are good problems to have.
If you don’t love your job; if you don’t think it’s the most interesting thing you could be doing right now; if you don’t feel immensely grateful at the universe for having such an awesome gig… quit! Right fucking now. Money, mortgages, degrees, social expectations and obligations are just distractions. A waste of time. Humans are incredibly resilient creatures; we can figure pretty much anything out on the fly. The world is a fantastic place to be, and right now is probably the best time yet to be in it, so why waste your time selling sugared water?
As final project for my Advanced Motion Graphics class, I produced the above set of 3 personal idents.
Stones
This was an exercise in synchronizing motion to audio. As a school project this past semester, we were all assignments parts of Anon Day’s song Stones to produce a piece of video for. This was the intro.
Scylla Absinthe
This was a project for my packaging design class, this past semester. Starting from scratch, I designed the entire story and identity. Illustration was done by the incredibly talented Brian Mutschler.
Scylla is said to once have been a nymph so beautiful that Poseidon, the great god of the seas, fell madly in love with her. Scylla, not reciprocating the feeling, fled to the dry land, where he could not follow. Angry at her betrayal, Poseidon cursed her and transformed her into a monster, to forever haunt the sea. Eons later, a mercenary of the crusades from Couvet, Switzerland got caught at sea in a terrible storm and wrecked onto Scylla’s reef. Scylla rescued and nurtured him and they fell in love. When another ship finally came to the rescue, Scylla gave him the recipe to an elixir which, when ingested, would instantly bring her image to life in his mind. To this day, his great great grand children distill this very same elixir.
WWDC
This story will sound familiar to a lot of people this morning, I fear: I woke up to a handful of text messages, emails and IM messages saying Apple had opened sales for WWDC tickets at 5:30 am. I frantically jumped out of bed and to my computer, to try and buy one immediately. Of course, as it were, all tickets were sold out.
The rules this year around state that a personal Apple developer account can only get one ticket, and a company account can get five. Tickets are non-transferable to and non-refundable prevent scalping.
I appreciate the fact that Apple is trying to prevent scalping, and tickets going on sale for double the price on Ebay and Craigslist, but I think they’ve only exacerbated the problem. Now, legitimate developers such as myself do not even have a third-party recourse to buy a ticket at a premium.
Here are some things Apple could have done instead:
If first-come first-served is really the approach they wanted, a better way would have been to announce when the tickets go on sale in advance, and let everybody set their alarm and fairly race for the ticket.
They could have staggered the ticket sales over the course of the day; making 500 new tickets available every hour.
They could have used a criteria other than luck to decide who gets a ticket. Perhaps limit it to developers that have apps in the store, developers who can solve a programming puzzle. Even an application where developers have to state what they hope to get out of the conference.
They could have solved the supply / demand problem by making the price proportional to the amount of tickets left. Every ticket sold augments the value of the remaining tickets. The 1000th ticket could have been worth $2250, the 2000th $3000, and so on, going up in price as the supply dwindles.
I don’t think any of these solutions are perfect. But I think any of them would have been better than the way Apple chose to go, screwing legitimate west-coast developers out of the most important conference and learning experience of the year.
Human stupidity in all of its beautiful glory.
(Source: youtube.com, via 9-bits)
Sexism
It’s often claimed that we are creating a negative environment for women in tech, through the way we like to have fun and blow off steam. A startup is an intensely stressful environment, and staying sane is crucial. In-jokes, brogramming, and good-natured debauchery is a way to do that. If somebody cannot handle some crudeness, I’d postulate that he or she does not belong at a startup, regardless of gender. Because, when shit hits the fan, as it invariably does, we need people who can take it.
Recently, a developer was forced to rename his open source project, because “testosterone” wasn’t politically correct enough. I’ve talked before about the hypocrisy of our constant striving for political correctness—but that’s an entirely different argument altogether. My goal in life is not to please everybody. Sometimes I’m vulgar. If I call something “retarded” or “idiotic,” it should be obvious that it has nothing to do with people afflicted with Down’s syndrome. In my opinion, when people call it out, the correct response really should be lighten up.
We cannot beat sexism until gender is no longer an issue. Keeping up the current level of discourse is making things worse. Subsidizing women in tech with money, like Etsy is doing, is widening the gap between men and women. By doing this, you’re not only admitting that women cannot make it in tech without some extra help, you’re also effectively creating inequality, affirmative-action style.
Equality, by the way, does not mean gender balance. It means equal opportunity. It means that a woman will not be passed over for a job because of her gender. It means that she has as much of a shot at becoming the next Zuckerberg as I do. It does not mean her company will never produce sexy ads, or use booth babes, or have a tightly knit group of programmers who like to drink beer and jokingly call themselves “brogrammers.”
I’m tired of being told, over and over again, that I’m a sexist pig because I’m not in favor of achieving an artificial gender balance. I’m tired of being called a homophobe, or a racist, sexist, or even a nazi because I said something that’s technically not politically correct—even though my statement had absolutely nothing to do with any of the groups offended.
Again, these are my own controversial opinions, and in no way reflect my employer’s.
A fractal of bad design
Alex Munroe:
I can’t even say what’s wrong with PHP, because— okay. Imagine you have uh, a toolbox. A set of tools. Looks okay, standard stuff in there.
You pull out a screwdriver, and you see it’s one of those weird tri-headed things. Okay, well, that’s not very useful to you, but you guess it comes in handy sometimes.
You pull out the hammer, but to your dismay, it has the claw part on both sides. Still serviceable though, I mean, you can hit nails with the middle of the head holding it sideways.
You pull out the pliers, but they don’t have those serrated surfaces; it’s flat and smooth. That’s less useful, but it still turns bolts well enough, so whatever.
And on you go. Everything in the box is kind of weird and quirky, but maybe not enough to make it completely worthless. And there’s no clear problem with the set as a whole; it still has all the tools.
Now imagine you meet millions of carpenters using this toolbox who tell you “well hey what’s the problem with these tools? They’re all I’ve ever used and they work fine!” And the carpenters show you the houses they’ve built, where every room is a pentagon and the roof is upside-down. And you knock on the front door and it just collapses inwards and they all yell at you for breaking their door.
That’s what’s wrong with PHP.
PHP can be used to build some awesome stuff (Facebook is living proof!), but it’s important to realize that it’s also a fundamentally awful language. It’s like crack. It’s useful enough that it keeps us using it over and over again, while systematically destroying our productivity with its quirks.
When I complain about PHP at work, some like to remind me that I’m a hypocrite, since I wrote a blog post praising PHP. Or, rather, claiming that it’s possible to code PHP smartly and avoid its pitfalls. I’m not sure if I still agree with it today, but I sure do feel my brain turning to Jell-O whenever PHP fucks me over with one of its silly, silly idiosyncrasies.
Over the past week, I’ve quietly redesigned this blog to be somewhat up to my current standards. Before, I was using a customized version of Jake Paul’s theme, Solstice, which while attractive, was not my own work.
There were quite a few things I wanted to achieve with this redesign:
Most importantly, I wanted to have clear and easily legible typography on articles. This is, after all, a blog, and must serve its primary function above all. I also wanted to give myself a unique and somewhat more consistent personal brand, which I think this succeeds in doing.
I wanted the header to be a window into a photographic snapshot. It will be either selected randomly from a selection of my best shots, or updated on a semi-regular schedule. The end goal being: to push myself to take more and better photos, more often.
Lastly, I wanted to try to use some cool modern technologies and ideas. The header uses subtle parallax scrolling, which I think looks gorgeous. The styles is done in a LESS stylesheet, which makes coding CSS a breeze. I’m using semantic HTML 5 tags, like
header
andarticle
, and using a few CSS3 animations. All in all, this was a fun and light coding exercise.
For a fun easter egg, click the little expand icon at the very top-left of any page.
Overall, I’m very satisfied with the result, but will no doubt keep tweaking it over time.
Credit where credit is due: I’ve drawn inspiration from many places, including: Sebastiaan de With, Dustin Curtis, and Hero's parallax header. I also used Andy Davies' pattern, light wool.
App Store Retrospective
Three years ago, I wrote a summary of the major problems with Apple’s App Store as an email on the iphonesb mailing list. Three years later, I think it’s a good time to look back and see how Apple has handled the situation, and assess whether we’re better off.
App Store:
Junk Apps: The App Store is filled with junk apps made in, at most, ten minutes. The proliferation of iPhone success stories has given rise to an epidemic of hopeful developers taking shortcuts hoping to make a quick buck. These apps make up 98% of the App Store’s 50k apps. This creates needless clutter that makes it hard for the real apps that real developer spent real time and real money on to get noticed.
App Store Reviews: There are plenty of problems with the reviews on the store: they’re nearly always of terrible quality. There’s no way to contest or respond to an erroneous review. There’s not even a way to respond to a review saying there’s a problem with the app with a solution, or a “that’s coming in the next update—hang tight.”
Rate On Delete: Apple is artificially creating needless bad ratings by asking users to rate an app when they delete it, which quite obviously only creates 1-star ratings. For example: iLaugh Lite 1.0 had over a third of a million users, and many of them were happy and kept coming back to the application, I could see from the analytics. Yet, my rating was 2 stars, because a couple thousands (out of a quarter of a million) users didn’t like the app and deleted it and rated it 1 star. The hundreds of thousands of happy users, though, didn’t delete the app and therefore were not asked to rate the app. This creates artificially low ratings.
Search is broken. Either you’ve got to put a whole lot of keywords in your application name, which sucks for plenty of reasons, or you’ll fall behind the ones who do. Often, you just won’t show up in search that should totally return you first. Advanced search is useless and impractical.
Top Apps Charts: These charts have so much effect on whether an application gets noticed and downloaded that whether you show up on these charts can decide the fate of your application. Which also causes the next point.
Ringtone ($0.99) Apps: As has been very well discussed by Craig Hockenberry on his furbo.org blog, app prices have become a race to $0.99. Since the charts are counted by downloads, no matter the price of the app, it means that a lower price which causes more downloads will make your app more likely to succeed.
Upgrades, Promotions, Variable Pricing: No way to offer paid upgrades, which is a HUGE problem. There’s still no way to give out copies of your app over the 50 promo codes limit, which only work in the US. You can’t do bundle promotions, discounts or anything of the sort either.
Customer Data: Your customer data is hidden. There’s no way you can promote another app by you or a paid 2.0 upgrade (since you’ll have to create a new app for that). There’s no way you can switch an app to another iTunes Connect account if it gets acquired, without losing all customers and not giving them any further updates. (Check out futuretap.com’s blog post.)
App Review:
Lack of Transparency: There is no communication between us and Apple. Apple doesn’t want communication. They specifically block communications. Emails to their support never get answered, and phone calls just tell us to email. Often, they reject apps on no grounds, or simply obscurely and vaguely referring to some TOS article that only partly applies to the situation, leaving you no way to communicate back and contest the decision.
Updates: Updates take ages to get approved. They sometimes get rejected while being only a bug-fix update to an app that got approved. (This has happened to me.) And even when they get approved, it takes forever, possibly leaving some critical bug or crash in your application and costing you tons of negative reviews and ratings. (Has also happened to me.) Garrett Murray posted a couple interesting articles on the topic.
Review Time: Apple often takes many weeks to review anything posted to them. Some of my reviews took up to three months. (No kidding!) This is just not viable. Period.
Arbitrary Rejections: There have been countless examples of arbitrary and unwarranted rejection. I have my very own. There have been countless more examples reported.
iTunes Connect: It is a piece of garbage. There is simply no other polite way to put it. It is painfully slow. It is awfully designed. For example, not too long ago I was editing the description for my application, iLaugh. I had opened iTunes Connect’s page for my application in one tab and in another tab I opened another of my application’s info for reference. When I was done, I submitted the changes and, to my horror, instead of updating the description as it should have it overwrote the info of the other application I had open in the other tab with what I had submitted in the first tab. This is just an example, but there are plenty more ways in which iTunes Connect constantly screws up. There’s no way to delete an application, or change an update’s version number. It also gave me erroneous sales reports a few days back. Overall, it easily wins as the worst web app I have ever used. Period.
If this list of complaints sounds oddly familiar, it should, because it’s surprisingly still relevant today. While Apple has made a few steps forward—for example, by getting rid of rate-on-delete—it has made an equal number of steps back. An example is the recent UDID fiasco.
But what’s even more scary, to me, than a mistake Apple might have made recently (such as its deprecation of UDIDs) is how relevant this old list of complaints remains. Remember, when I wrote this, the App Store was just one year old. I figured, they might just not have had time to get to these items, and that they’d improve as time went by. But, since then, they’ve had time to replay the entire life of the App Store thrice more, and for the most part, nothing has changed.
This indicates apathy. Apple just doesn’t care about its third-party developers. Their business, at the end of the day, is in selling hardware. They have no motivation to make it easy for developers to build a business on top of their platform. They don’t even care, it seems, about fostering innovation.
The App Store’s biggest flaw, at the end of the day, is that it is not a free market. It is not a meritocracy, and app success is slave to the whim of a corporate overlord that changes it mind without explanation more often than a 5 year old.
Disclaimer: this is my own opinion and in no way reflects my employer’s.
Rolling Stone’s Matt Taibbi:
At least Bank of America got its name right. The ultimate Too Big to Fail bank really is America, a hypergluttonous ward of the state whose limitless fraud and criminal conspiracies we’ll all be paying for until the end of time. Did you hear about the plot to rig global interest rates? The $137 million fine for bilking needy schools and cities? The ingenious plan to suck multiple fees out of the unemployment checks of jobless workers? Take your eyes off them for 10 seconds and guaranteed, they’ll be into some shit again: This bank is like the world’s worst-behaved teenager, taking your car and running over kittens and fire hydrants on the way to Vegas for the weekend, maxing out your credit cards in the three days you spend at your aunt’s funeral. They’re out of control, yet they’ll never do time or go out of business, because the government remains creepily committed to their survival, like overindulgent parents who refuse to believe their 40-year-old live-at-home son could possibly be responsible for those dead hookers in the backyard.
This is the one article that explains the motivation behind the Occupy Wall Street “movement” rationally and sensibly enough to not be an immediate turn off. On the contrary, this fantastic piece of journalism made me realize just how massive of a mess we have gotten ourselves into.
America is one of the most hospitable countries. The American people are genuinely nice: they give a lot to charity, they like to have fun, they smile. It’s hard to realize how much of a difference this makes until you spend some time living somewhere else. In Russia, for example, people seem sad and distant, while in South Africa the pleasantries feel much forced and status-driven, as if you were talking to a butler or a panhandler.
Only in America do tellers ask you if you’ve had a good experience finding what you needed, say “please” and “thank you,” and strike up conversations while scanning in your purchases. Only in America is it not inconceivable to share a cab or an umbrella with a perfect stranger—in fact, I did both of those things just yesterday.
What surprises me, then, is the disparity between that and the experience of actually getting here. The United States is notorious for its extremely paranoid and unfriendly security practices when it comes to travel and immigration control. Of all the countries I have travelled to or lived in (the list is quite large), the process for the United States has been and continues to be hands down the most painful I have experienced.
This realization came to me when reading Mark Vanhoenacker’s New York Times op-ed, in which he writes:
No country’s border staff is perfect, as every traveler knows. But America — a land where strangers greet one another in elevators, waiters act as if they like you, stores deploy professional greeters and government serves the people — should aim to be the best. That means a smile or “hello” as we approach every agent, a “please” and “thank you” to bookend every official request and an occasional “welcome” as we cross a secure border.
In Advanced Motion Graphics, we were assigned the science fiction parable Scales, and instructed to design a title sequence for a hypothetical film based on the short story. The video is my interpretation, designed over three weeks in Cinema 4D and After Effects.
I came to this solution pretty late in the process. I spent most of my time working on this concept, before ultimately abandoning it:
A short one week assignment for my motion graphics class: a title graphic for a fictional indie band.
This is by far the most bad-ass video of an insect you will ever see.
(Source: vimeo.com)
I’m also taking a Packaging Design class, in which my first project was to redesign a Soy Sauce bottle. This is my design—I’m going for a very clean and authentic style, featuring the Safeway house brand.
This semester at CCA, I’m taking an Advanced Motion Graphics class. This is my first project: a short video which visually illustrates the feeling one gets when going clubbing and drinking, and the night gets crazier and crazier, until it morphs into something that isn’t so fun anymore.
Partying is fun, but it’s important to know one’s limits. I’ve made that mistake many times, and have had many a regretful mornings.
Lament of the Delicious Librarian
Jessie Char:
I did some thinking and came up with a concept to pitch: a booth modeled like a cozy library with bookshelves that look just like the ones in Delicious Library. We could dress as “Delicious Librarians” (don’t tell me that wasn’t clever!) complete with nerd glasses and name tags. My coworkers and I stayed up late one night planning everything out so we could present the idea to Wil. He loved it, and gave us the go-ahead to do the booth as long as he didn’t have to do any work on it; he was busy trying to ship an app, after all.
In 2009, I attended my very first Macworld. In the Mac development industry, Wil Shipley (founder of Delicious Monster) is somewhat of a legend. Having had a few online conversations with Wil, I went looking for the booth to introduce myself and say hello. The booth was fantastic, and I met and chatted with Jessie and Maja. I’m ashamed to say, though, that until today I thought that they were booth babes.
In this industry, where white, asian and indian males are the de facto standard, it’s sometimes surprising to see anything else—and that’s kind of fucked up. Mea culpa.
(Source: jessiechar)
Working on a totally unrelated project, I made this image which ended up not being used, but turned out to be a great desktop background. Full-res download of Space Rainbow.
At the end of Level 3 at the California College of the Arts, it’s not uncommon for graphic design students to spend twenty hours a day on campus, fueled by gallons of Red Bull and dreadful coffee (and for many, handfuls of Adderall).
Why, you ask? Because we to finish our projects for the semester, polish off all the work we’ve done over the past two years, and present it to an intimidating panel of faculty and design professionals. After presenting and talking about our work for 45 minutes, the panel goes away to deliberate and writes up a grade and a feedback sheet which sets the tone for the rest of our path through design school, and our design careers thereafter.
The day after the presentation, after the celebratory hangover has passed, we are assigned a 6’ by 6’ exhibition space, in which we curate and present our strongest work done at CCA. My exhibition is pictured above.
Enter the Dragon
Mike Lee:
With what we now know about extremophiles, meteors, and the tenacity of life in general, it seems clear that life or its precursors are scattered around the galaxy like the seeds of a great tree. Every time the seed of life lands in a habitable zone, it sets off a timer as evolution races to reach a stable state before exhausting the available resources. Those that do get to move to the next level. Those that don’t….
There is a threshold and we are very close to not making it. There’s a non-zero chance the carbon dioxide we pumped into the air has set off a methane cycle that accelerates global warming, that we’re already too late, and that we might not have 100 years. We need to starting thinking on a global scale about our place in the galaxy. Who cares what kind of sneakers you’re wearing? Why are we still killing each other?
Path's "+" Button
Rick Fillion:
Details take time. Details are exhausting, and require a ton of trial and error. I spent at least 5 minutes last night just tapping Path’s button again and again looking at the animation to try to figure it out exactly, to figure out why it felt so right. Recreating it would take me much longer than those 5 minutes. This exhausting trial and error is how you can manage to create things that not only look good, but feel fantastic.
So I’ve been crazy busy with finals here at CCA, putting up pretty much everything else so I could get these done in time. But now that’s over, I’ll finally be able to show off my hard work. This is my final project for my Type 3 class, a class on information graphics.
Dangerous binge drinking in America’s youth is the result of a prohibitionist culture and excessively restrictive drinking age laws. This video is part of a fictional campaign aimed at parents to promote the idea of lowering the legal drinking age, while culturally fostering a more liberal attitude towards alcohol.
A Conspiracy of Hogs
Willy Staley on how McDonald’s essentially transformed being in the restaurant market into being in the commodities’ futures trading market:
At this volume, and with the impermanence of the sandwich, it only makes sense for McDonald’s to treat the sandwich as a sort of arbitrage strategy: at both ends of the product pipeline, you have a good being traded at such large volume that we might as well forget that one end of the pipeline is hogs and corn and the other end is a sandwich. McDonald’s likely doesn’t think in these terms, and neither should you.
[…]
And unlike a Low Country barbecue shack, McDonalds has the means to circumvent—or disregard—supply and demand problems. Indeed, they behave much more like a risk-averse day trader, waiting to see a spread between an Exchange Traded Fund and its underlying assets—waiting for the ticker to offer up a quick risk-free dollar.
The view from the 19th floor of my new apartment building.
For a short 1-week diagram exploration project, I made an iPad app. The app is essentially a cocktail recipe book, and this is a quick screen capture showing its interface.
A minimix I made yesterday, in an attempt to renew my rusty mixing skills.
Tracklist:
Otherside (Tim Mason Remix) — Red Hot Chili Peppers
California Dreamin’ (Savoy Remix) — The Mams & The Papas
One More Time (Mike Candys & Jack Holiday Remix) — Daft Punk
The Nth º — OVERWERK
Jack Daniel’s limited edition birthday bottle. Not only is it a gorgeous design, but as a Jack Daniel’s fanatic, I’ll be sure to get myself one of those.
Last weekend, I did the TechCrunch Disrupt Hackathon. Pretty crazy night, but got a very cool game built in under 24h with cool folks from Miso Media.
TechCrunch chose us as Staff Favorite and wrote this:
Music Combat: A real-time, player-vs-player music battle. Each player site reads music, playing the notes on the nearest instrument. Their mobile device detects which notes they’re playing. The better you do, the more damage you do to your opponent.
(Source: shawnblanc.net)
How to fix the US economy in a week*
* if the president had dictator-like powers and could bypass congress.
Monday: Morning coffee. Get ready for a crazy week. Declare economic state of emergency, or whatever other excuse will let a president do whatever he deems necessary for a week.
Start with taxes. Abolish progressive taxes. Set fixed-rate income tax at 35% on any income above $30,000. (10% goes to states.)
Tuesday: Declare immediate retreat from all wars and “police actions” in the Middle East. Cut defense spending by 80%.
Reinstate NASA space program, and reallocate ample funding. Pledge $500B to the construction of a high-speed rail network to cover the entire continental US. Work to be completed over 5 years by the private sector, with no union labor.
Wednesday: Abolish Social Security, Medicare and Medicaid—to be phased out by the end of the year. Announce new legislation to 1) force private insurers to offer a basic health plan with minimum benefits at a fixed rate, and 2) make health insurance mandatory.
Announce immigration reform. Lower requirements and processing times of work visas, and instate new entrepreneurship visa program. Announce a one-time amnesty on illegal immigration, and announce legislation with severe consequences for future infractions.
Thursday: Abolish oil subsidies, let oil spike to $8/gallon. Order cities over 100,000 inhabitants to develop high-quality public transportation networks. Slash all street parking, and impose a parking tax to discourage car commute.
Pledge $500B in state-owned nuclear and alternative energy developments.
Friday: Announce plan to subsidize employment in creative industries. Subsidize people working as artisans, journalists, artists in order to put to good use people who have been rendered obsolete by advances in technology.
Drastically cut corporate income tax to 13%, in order incentivize corporations to remain headquartered in the US and keep employing US citizens.
Sigh. Enjoy the cool breeze on the White House balcony, sip on a glass of single malt scotch, and get ready to take a much-deserved weekend rest.
There are two ways to strike out: looking and swinging. Striking out looking is the absolute worst feeling. It means you just watched a perfectly good ball fly by and did nothing about it. Striking out swinging is a little better because at least you made an effort to swing the bat, but you just didn’t make contact.
Fouling out is still hard to swallow, but it means something different. It means you stood up to the plate, swung the bat as hard as you could, and made contact with the ball. But, in the end, you’re still out.
This startup was my first at-bat in the major leagues. I stood up to the plate, tried as hard as I could, made contact a few times, but was never able to put the ball in play. Now my at-bat is over. The good thing is, there is more than one at-bat per game, but it might just be a while before I step up to the plate again.
Jobs are obsolete
Douglas Rushkoff:
We’re living in an economy where productivity is no longer the goal, employment is. That’s because, on a very fundamental level, we have pretty much everything we need. America is productive enough that it could probably shelter, feed, educate, and even provide health care for its entire population with just a fraction of us actually working.
[…]
What we lack is not employment, but a way of fairly distributing the bounty we have generated through our technologies, and a way of creating meaning in a world that has already produced far too much stuff.
(Source: CNN)
One of the really amazing things about New York City is the extent to which the city anticipated its own growth. It built elevated rail systems to neighborhoods that didn’t exist. A grid that went into the Bronx when the city barely made it to 14th St. A huge city park in the middle of nowhere. Tech guys have to think like that. So few do. Seriously.
People who do this think this way should win awards. It goes beyond design. It isn’t a matter of how rich you are. It’s how boldly you think, and then execute to that vision. And also how flexible you are, when you learn things about your framework that you didn’t envision (so it goes beyond vision as well). And you not only let other people play, but build that in from the start.
This is the fantastic suit I stayed in on my first trip to Las Vegas.
What Happened to Obama?
Drew Westen for the New York Times:
Those were the shoes — that was the historic role — that Americans elected Barack Obama to fill. The president is fond of referring to “the arc of history,” paraphrasing the Rev. Dr. Martin Luther King Jr.’s famous statement that “the arc of the moral universe is long, but it bends toward justice.” But with his deep-seated aversion to conflict and his profound failure to understand bully dynamics — in which conciliation is always the wrong course of action, because bullies perceive it as weakness and just punch harder the next time — he has broken that arc and has likely bent it backward for at least a generation.
Drew’s opinion piece is fantastic, and does a perfect job at describing my feeling about Obama’s presidency—only much more eloquently.
Patrick Rhone reviews Macchiato:
Recently, Ive been taking a tour of various text editors and writing environments in an effort to, well, give them all a fair chance. I’m ashamed to admit that I’m so tied to TextEdit that I far too often give most everything else only a drive-by chance before running back to the comfort and security of what I already know. That said, while I love TextEdit, it does have some areas where it falls short. One of those is syntax highlighting. I love and have long used Markdown syntax for markup and wished TextEdit did a better job of helping me with that.
Macchiato
This past June, I attended my very first WWDC. The conference, the people and the parties were all amazing, and it was definitely a highlight. Inspired by the spirit of the conference, and all the new technologies presented, I set out to conquer my laziness and build and ship a new app.
I’m a huge fan of Markdown. So much so that I write nearly everything in it. From emails and notes, to documentation and blog posts. Unfortunately, writing Markdown meant one of two things for me: either launching TextEdit and switching it to plain text mode, or launching TextMate and writing in a code editor. Neither were really suited to the task.
To remedy this, I built Macchiato. I made full use of Lion’s new technologies. In fact, Macchiato only works on Lion. You’ve got full-screen mode, auto-save and versioning. The internals of the app uses NSRegularExpression
, sandboxing, Automatic Reference Counting, and several other Lion-only APIs.
Macchiato is about being the very best at doing one thing: writing in Markdown. I’ve tried to keep an emphasis on usability, design and typography. I wanted to make it a joy to use, and for me it did the trick. I use it every day.
I don’t think the results of the 2012 election will significantly affect the next term: the modern Republican party controls the country’s policy and all mainstream political discourse extremely effectively, even when they don’t hold the presidency or a congressional majority.
I have no idea what the Democrats are trying to do, generally. The only coherent message they’ve put forth in the last decade is “We’re not the Republicans.” Not only is the accuracy of that sentiment questionable, but it’s not working.
So much for hope.
To make money — real money — at this game you have to attract millions, or tens of millions, of users. And when you’re dealing with those kinds of numbers, it’s literally impossible not to treat your users as pieces of data. It’s ironic, but depressingly unsurprising, that web 2.0 is using faux socialization and democratization to create a world where everyone is reduced to a number on a spreadsheet.
I’m having a hard time keeping the quoting-paul-carr to actual content ratio reasonable, but as with so much of his writing, this is spot on.
(tip of the hat to Nik Fletcher for reblogging this first)
The Incredible Hypocrisy of Modern Citizens
One thing I’ve noticed about American culture from living in the USA for over two years now is that there’s a deep kind of hypocrisy running through our morals. We condemn many things for being indecent, while we allow much worse things to go under the guise of free speech. Meanwhile, individuals feel an incredible sense of entitlement when it comes to their perceived rights.
One recent example was when my social network feeds were inundated with calls to sign a petition for Facebook to add transexual options to the gender option. Now, I don’t want to get into gay-rights politics, but I am fervently against the idea that Facebook has any kind of obligation to include a feature because not doing so would offend a minority of its users.
I take issue with the idea that some people think they are entitled to the feature—that it is their fundamental right. They are not, and it is not. Should we start adding “Flying Spaghetti Monster” to the religion drop downs too, because some people want to identify with it? Point is, with any popular product, people will find something to rebel against. If not this, it would be something else. People need to realize that Facebook has a vision for their product, and that they need to be able to follow it unimpeded.
One fundamental aspect of good design is that it has been curated by somebody who knows what they’re doing, and has intimate knowledge of what they’re designing. This is why when users tell you that you should implement a feature, and that it will make your product better (and make you money), they’re most often full of crap. This is why anything on 99designs.com is crap. This is why Apple products are so great, and why Facebook beat MySpace.
Remember Henry Ford? “If I had asked people what they wanted, they would have said faster horses.”
My goal as a developer and designer is to make a product that people will love, and will make the world better. However, the way I’m going to do that is by thinking about what’s best for the majority of my users. The truth is 99.9% of users don’t care for outlying setting such as transgender identity. Transgender identity is much trickier than just adding an “Other” drop down item. If you allow it, how do you then genderize all the pronouns? Do you default to “he,” “she,” or use the combination “he/she?” Or worse, do you turn the user into an object and go with “it?” Bottom line is, it’s just not worth doing for the 0.1% of user’s feelings. They’re convinced with all their might that, surly, they deserve special treatment. But really, they don’t.
Secondly, I’m growing extremely tired of America’s prude culture. People are constantly getting offended at really silly things. Just look at video games, for example. You can’t sell a video game with “sexually suggestive” language to teenagers under 18, if you can put it on the market at all. Yet, there’s no problem with selling games to 10 year olds that vividly depicts ripping people in half.
Meanwhile, in real life, some words are prohibited and frowned upon for the sake of political correctness, while much worse sentiments are perfectly acceptable. It’s perfectly fine to go on Fox News and say “Mexican Immigrants are mostly criminals and should be deported,” or even openly be a member of the Ku Klux Klan, because it’s free speech. On the other hand, though, exclaiming “Holy Shit!” on broadcast television when the Giants score a home run will get you a class action lawsuit.
Personally, I think people should be able to say whatever they want—except for maybe hate speech. As for products, their owner have the right to design them however they want and let the general population vote with their actions. Isn’t that the founding principle of capitalism and the American Dream? Lastly, people really need to get off their high horse, when it comes to accusing everybody of discrimination.
Santiago Lema on the business of selling iPhone apps:
The average iOS user has a very short attention span and there are 200 apps that do exactly the same stuff yours does. You have to win at each step, and the decision will be made in less than 60 seconds. Whether you manage to get your app in the Top 50 rankings or your app shows up through search, the same steps apply. Bringing the user to a download amounts to convincing him to go through a series of gates, always choosing yours.
I’ve watched Santiago grow from toying with iPhone apps to making it his living over the past few years. He’s really going for the mainstream user, and has some great tips in order to reach him and secure the download.
On Battleships
Scott Locklin:
Guns that squirted out bullets as heavy as a Volkswagon; 14″, 16″, 18.1″ in diameter! Armor a foot and a half thick! Giant coal and oil burning steam engines creating 150,000 horsepower and belching out enormous clouds of smoke! 60,000 ton craft at 30 knot speeds! Sweet baby Jesus, that’s damn cool. However, it was never real practical, except for the occasional shore bombardment, and for comparing proverbial dong size with the navies of other nations
Unknown Author on what you choose to drink:
I like to order Martinis. Sometimes I stick with whiskey on ice. My friend likes white wine.
Apparently these drinks say things about us. They say more than “he likes gin.” They’re easy targets. “That’s an alcoholic’s drink,” I’ve heard. “That’s a girl drink.”
I reject that.
[…]
A drink isn’t a girl drink or a tough guy drink. It’s your drink. There’s no point in consuming some shitty-tasting rotgut because you want to keep up appearances. Drink what you want.
I wholeheartedly agree. You have no idea how much shit I get for occasionally liking and drinking Apple Martinis.
So I got a lava lamp. Using the following image as a wallpaper right now:
Great student packaging design work by Spencer Bigum. A solid concept, masterfully executed, if a little nerdy.
Level 2 Finals
I just finished my second year of Graphic Design at the California College of the Arts. What a relief it is to be done with finals… I really enjoyed this semester—and created some work I’m very proud of—but after 8 months of intensive design school, I’m ready for a summer where I can focus on personal projects and the cool stuff we’re building at Chartboost.
A small selection of shots from finals: (view the entire set on flickr)
My Type 2 final: a book on High Speed Rail, how it took over Europe and Asia, and why it didn’t happen in America.
Fellow student Christine Rode presenting her very cool GD2 final.
Kalee practically cut her finger off finishing up her awesome GD2 final book.
Building a house of cards with Man-Ee’s project.
This is yours truly’s version of the GD2 project: recontextualizing a poorly written set text into something completely new.
Fellow student Ben Du presenting his GD2 final.
Anna Chou modeling my new motorcycle helmet. I guess girls like bikes… :).
And last but not least, my very very awesome professor, Christopher Simmons, taking some shots of student work. Christopher is a awesome designer, (he even has his own wikipedia page!) and you should check his work out!
Armin Vit on Khoi Vinh’s argument that sending well-crafted print promo is worthless and wasteful, because they inevitably end up tossed out:
Designers send out printed promos to get your attention OUTSIDE of the internet. They want you to look at the piece of work as an actual physical specimen that demands a different kind of interaction than a webby thing. Whether you toss it or not is not the point, just as it’s not the point whether you ignore an e-mail or Tweet or not. It’s about saying “Stop, look at this. Got it? Okay, carry on.” There is nothing wrong with throwing things away (or recycling them).
[…]
I bet you have dozens of design books on your bookshelf that you haven’t seen in years. I know I do. I have them because they give me a weird sense of joy in knowing that I have them in my collection and accessible at any moment. Which is the same reason I, personally, hoard designers’ promotions and things. I have a bookcase filled with them and there is stuff I haven’t looked at in more than ten years. But every now and then I want to remember what a piece looked like either for reference or just for pleasure and I know that it’s there, not in some landfill.
To conclude: Designers, please don’t stop making things or refrain from sending them out. Those things play an important role in the way we consume design material. If everything becomes JPGs, GIFs, and PNGs served on a browser then we are screwed—anyone can create things that look good on the screen, it takes real mettle, vision, and investment to produce something that has physicality and presence. Even if it’s fleeting. For that one moment you have the ability to evoke a response from someone, and that’s not worth tossing out.
I couldn’t agree more. Khoi’s post is interesting and raises some valid concern—but I fully disagree with him. There’s something wonderful about a well-crafted print piece that digital media can never achieve. A pop-up will will never obscure a print poster to notify you of an incoming tweet or email. For the seconds (or perhaps even minutes) that you’re looking at the work, you’re fully engaged and responding to the designer’s intended experience. That’s worth much more than an email can ever get you.
I do not pride myself in my skills as a programmer. Complex algorithms scare me, and I stay away from them as much as I can. Rather, what I am good at is creating elegant solutions to problems. I’m good at imagining how things could work together, how something could be improved through programming. I’m good at building real-life products and streamlining processes. Breadth, rather than depth.
I also do not pride myself in knowing a language fully. I am good at understanding concepts, code and documentation, and when asked a specific question in a job interview I am not afraid to say that I don’t know, but could easily figure it out with 5min and access to the internet.
What I’m getting at is that I value resourcefulness, scrappiness and creativity more than knowledge and intelligence. This is why I’m not taking a computer science course, but rather am instead studying alternate approaches to problem-solving in the world of design. I think it will be a lot more valuable in my life in building an intellectually well-rounded personality, and an ability to pick up new skills quickly and bend them to suit my purposes. In the end, what truly matters is what I’m able to create, not how intelligent I may be.
New Apartment
I’ve just moved into a new apartment, and took the opportunity to act upon my love for minimalism in furnishing and designing it.
Running a Modern Startup on PHP
I originally wrote this for the ChartBoost Blog.
In the modern world of agile startups and silicon valley, the buzz is all about Ruby, Python, and whatever the latest cool programming language or framework to come out is. Older technologies don’t get much love, and PHP especially has a bad reputation. In this post, I’m gonna go over why and how we use PHP as a modern technology, and the various other tools, techniques and development methodologies we employ to run as agilely and elegantly.
PHP
PHP is regarded as a clumsy and amateurish technology, best left to development newbies and $5-an-hour consultants. It’s almost bad enough to make me feel shame when I tell people we run on PHP. However, I don’t think this reputation is entirely deserved.
The language itself is, after Perl, the oldest language to be adopted en-mass as a web technology. Its roots are as a text pre-processor, and over the past 16 years it has evolved from that into something much broader. Many of its fault stems from the way it has evolved, rather than being designed the way it is today from the ground up.
I’m not going to argue PHP is the best language—it clearly isn’t. Frankly, it’s a mess. There’s no consistency in function and class names, even within the core library itself. The Object-Oriented features were tacked on at a later point and, while they’re getting better, are somewhat fragile. Here at ChartBoost, the core requirement is that we run on at least PHP 5.3, which introduced Late Static Bindings. Before that, building serious object-oriented code in PHP was impossible.
Even for all its faults, PHP remains a major player online, and some of the most impressive technology companies (like Facebook) are using it. PHP remains one of the fastest language to code with, deploy and execute. Lastly, while this is mostly due to personal preference, I find its C-inspired syntax to be one of the best in the web development world. Braces, parenthesis and semicolons make it extremely clear what the code is doing, as opposed to Ruby’s mess of symbols, implied parenthesis and lack of statement endings.
MVC
It’s paramount for a modern web app to run on an MVC (Model-View-Controller) architecture. Unfortunately, PHP offers very little in terms of modern and agile MVC frameworks. The big ones (CodeIgniter, Symphony, etc.) are extremely bloated and actually tend to get in your way more than help. Also, most impose their vision of what the model & database layers should look like.
Paraglide
Fortunately, one framework stands out from the pack. Paraglide is a minimalist framework that takes care of routing requests to controllers, rendering views, and little else. It offers the basics in terms of setting up the environment, providing basic helpers and organizing your code. It also works on the command line and from a shell (more on this later.)
Believe me when I say this, but Paraglide in mind-blowingly cool. It makes coding in PHP as elegant, and in some ways even more elegant, than the equivalent in Rails. It’s faster and lighter weight than Rails, but is easily extensible and works with pretty much any other code or package you throw its way.
MongoDB
Another decision core to our design ideals was the choice of MongoDB as our main model layer. Mongo is an incredibly powerful and scalable database system. It’s fundamentally different from MySQL in that it is at its core a key-value store. Mongo is so incredibly efficient that we have in fact completely skipped the usually required step of using Memcached. Mongo also offers greater reliablility and safety than MySQL with features such as failure-proof replica sets, and a querying interface that’s invulnerable to injection attacks. Avoiding SQL altogether has also been extremely pleasant. One of Mongo’s biggest advantages is easy and powerful scaling through replica sets. When a node goes down, or is added, Mongo will automatically recognize it and rebalance itself, without causing any downtime. There is no single-point-of-failure.
MongoModel
A pet project of mine has been MongoModel, and it is what we use as the third leg of our architecutre. MongoModel is an ORM which uses Mongo as its datastore, and adds features vital to a full-featured web application. It provides object-mapping, relationships, validations and is extremely elegant to use. Much like with Rails’ ActiveRecord, sensible defaults are deduced, and it’s schema-agnostic. You do not need to setup or even define what your database looks like. Rather, you just use the objects and MongoModel takes care of everything else.
Unit Testing
While we don’t practice Test-Driven-Development, we do have unit tests in place. PHP does not provide an elegant test library, so we built our own (soon-to-be open-sourced.)
Shell Development & Scripting
Paraglide is, to my knowledge, the only PHP framework that works in command-line scripts and from an interactive shell. Script functionality is extremely important in order to run cron scripts and various other maintenance and administration tasks. Interactive shell access is a boon for quick development and debugging. We use PHP-Shell to interact with our code directly from the command line. This is quite similar to Rails’ script/console
.
Git
Everything we do is stored in Git. Git’s virtues are well-known within the community, so I will only say that git has been incredibly useful in keeping track of our code, the history, and for collaboration. We even use git as a wiki, to keep track of our documentation and various other internal documents.
GitHub
All our git repositories are hosted on GitHub. The main value of this, besides the hosting and gorgeous user interface, has been to use the social features to keep track of who’s been doing what. GitHub makes it really easy to have an overview of what’s happening. It also manages user accounts and rights beautifully.
Capistrano
Our main server-side code lives in a Git repository. We have dedicated branches for production code. We use Capistrano for deployments. The git repository has a dedicated branch for production code, which we merge to as we deploy stuff. A script will automatically run unit tests on anything that is pushed to production.
Amazon Web Services
ChartBoost relies on Amazon Web Services’ many products, including EC2 for cloud servers, S3 for data storage, SES for emailing and various other smaller services. This lets us pay for how much we use only, and allows for simple and fast scaling. We have an image ready to be deployed to new nodes, so we can handle any traffic thrown at our app.
Communications & Internal Tools
Last but not least, there’s the tools we use internally to keep in sync. Lighthouse takes care of our bug-tracking needs, while its companion, Tender handles support. We use Campfire for group chats, and AIM for one-on-ones. Google Apps & Gmail take care of our emails. Also check out companion Mac apps Lighthouse Keeper for Lighthouse, and Propane for Campfire.
If you read this far, you now have a good overview of the various tools and techniques we use to code agilely at ChartBoost. Even though we chose an unpopular language to base our technology on, I think it has helped us tremendously. With this post, I hope to spread the love again for PHP and these various ways of using it in a modern environment.
Stop Panhandling your Ideas
When most people see panhandlers on the side of the road, we condescendingly think “Why don’t they get a job? You’re not going to get anywhere begging for money. Get to work!” Yet, this is what so many people do with their ideas - they put their fate in the hands of passerby’s hoping someone cares enough to give them a chance. It’s the equivalent of standing on an off-ramp holding a cardboard sign that reads “I have good ideas. Please pay me for them.”
We hesitate to do the actual task of shipping work out the door because it’s scary. The last question we want to ask ourselves is “Now what do I do?” It’s more comfortable to always be on the journey instead of arriving at the destination. If you’re always “working” on something you never risk failure or embarrassment. Save Draft will always get more clicks than Publish.
(Source: bennesvig)
The Cosmonaut: A Minimal, Wide-Grip Stylus
A few months ago, right after the Glif Kickstarter campaign ended, I wrote a blog post about how most iPad styluses on the market today follow an incorrect cognitive mapping, in that they try to resemble a pen. The right shape to mimic — to match the low fidelity nature of capacitive touch screens — is a dry erase marker. I of course didn’t know it at the time, but this was the beginning of Studio Neat’s second product.
Tom and I have been researching, prototyping, and designing for the past few months (in synchrony with Glif work) and have come up with a solution that we think is pretty great. And now, once again, we are calling on Kickstarter to help make this idea a reality.
Pledge while you still can, they’re almost sold out.
MongoModel
MongoModel is a simple and lightweight ORM for MongoDB and PHP. I finally got around to posting it on GitHub. It’s a simple piece of code, but it’s the backbone for many of my recent projects, including ChartBoost's entire backend.
The Azure License: Meaningful Attribution
I’m updating and re-releasing this from my old blog. Feel free to use the license in any project. No need to attribute me, the license itself is released into the public domain.
Open-source licensing can be a real pain. Some licenses are nearly impossible to decipher, while some (namely—the GNU GPL) are just pure evil.
I have been trying to find a software license which, like the Creative Commons Attribution license, would let the licensee do pretty much anything with the software, except it would require attribution in a meaningful way. That is to say, a non-intrusive mention in the documentation or about box.
The MIT license came closest to this, and it is the base on which the Azure License was written.
A good way to give attribution, as required by the license, would be a friendly “Contains code by Copyright Holder [linked]” or “Special thanks to Copyright Holder [linked]” in the about box.
The Azure License
Copyright (c) {Year} {Copyright Holder}
Attribute to {Copyright Holder} - {url}
You (the licensee) are hereby granted permission, free of charge,
to deal in this software or source code (this "Software") without
restriction, including without limitation the rights to use, copy,
modify, merge, publish, distribute, and/or sublicense this
Software, subject to the following conditions:
You must give attribution to the party mentioned above, by name and
by hyperlink, in the about box, credits document and/or
documentation of any derivative work using a substantial portion of
this Software.
You may not use the name of the copyright holder(s) to endorse or
promote products derived from this Software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THIS SOFTWARE OR THE USE OR OTHER DEALINGS IN THIS
SOFTWARE.
http://license.azuretalon.com/
Meet ChartBoost
We’re a small team of Tapulous alumni who banded together to package up everything we learnt about marketing iPhone apps and turn it into an awesome product. We’ve worked on building, running and marketing hit apps and, through trial and error, figured out what worked and what didn’t. Now, we’re building a service that brings together the best cross-promotion and marketing techniques.
I haven’t had a chance to mention this yet, but I’ve left Tapulous to join two good friends of mine, Sean and Maria, at an exciting new startup in San Francisco city. I’m very excited to see what we can build here, and look forward to sharing some of what I learn on this blog in the future.
(Source: chartboost)
Replaced the optical drive in my new MacBook Pro with a 500GB hard drive. Main drive’s a 120GB solid state drive. That thing’s a beast with its core i7 quad core at 2.2GHz, and 1GB VRAM.
Working on Graphic Design homework again. This time, we’re supposed to take an object (I was assigned a belt) and a word (I got “social”), and modify the belt to become social. I’m making a belt that has a QR code to the wearer’s Facebook, its URL, and an RFID chip for quick automatic friending.
Another long exposure from last night. The Bay Bridge in all its golden glory.
Went out to shoot some pictures of San Francisco last night. Had lots of fun, froze my fingers, and took some pretty nice shots.
Caffeinated Nomad
For Graphic Design 2, we created a stationary system for a fictional company. All companies were a combination of two somewhat random adjectives, and mine were Caffeinated Nomad. This is my solution.
Aviv Aronov, in a online comment:
There has never been and never will be a democracy in the Middle East. And those are stupid who think the democracy is what these people are fighting for. No! No! No! These people fight for the piece of bread, for $10 a night… They are just a huge and ugly crowd with stones. What democracy you guys are talking about? Name it! Iran, Iraq, Algeria, Tunisia, Somalia, Saudi Arabia or the most democratically elected Turkish government!? Most of those ‘brave’ commentators of the Egyptian revolution prefer to stay online neither to go in the street. No one really would trade his bottom for a stone flying straight in to your head. Your courage ends up with your facebook and twitter comments. That’s all you can do. But you don’t believe or you simply don’t care what happens next, when Muslim Brothers come to power? What happens next, when those who treat the US and the entire West as an enemy of islam, will control the second largest army in the Middle East? More than 1000 Abrams tanks, F-16 jets… What happens next when these guys to control the Suez? Will they give up their power as you expect them to? Do they continue to reform the democratic institutions? In a certain sense, yes, they will… into the Rule of Shariah with all the out coming consequences. What price you are ready to pay for your gas tomorrow? I’ll tell you what… It’s not the success of the democracy, but the ugliest face of it. And shame on all of you, who think that what has been happening in Egypt is right. It’s not right, it’s not fair, it’s damn dangerous and what is even more terrifying - there is no way back.
Note: Not that I agree with the entirety of Aviv’s comment, but I’m reposting it in its entirety because I think it raises an important issue that people are not thinking about.
I don’t know what’s going to happen next in Egypt. What I do know, however, is that we all like the warm and fuzzies we get from hearing the romantic story of people fighting for their freedom, and for democracy. Unfortunately, the truth is that the repercussions, both for the Egyptian people and for the entire world, will be mostly negative. Egypt turned from a stable country and a US ally in the region into a ungovernable anti-American wildcard. Tourism, crucial to Egypt’s economy, has crumbled, and the country’s image is forever tarnished.
Marco Arment on how to get started programming
This is a great piece of advice. This is not only how I learnt to program, many years ago, but also how I learn new languages. Having a project is the most effective and motivating way to get started in almost anything.
Information design mini-project for Type 2. We were provided with a dump of raw data, and were briefed to design a booklet for the data. This is the inside spread of my solution.
Van de Graaf Generator
If you’re a graphic designer, you’re probably familiar with canons of page construction. In book design, canons of page construction help you use aesthetically pleasing and balanced text block and margins. It has been used by many typographers throughout the ages, starting with the Gutenberg bible.
Constructing them, though, is somewhat of a pain. You have to go through a long series of steps, either in illustrator or by hand, constructing the text block geometrically. So I decided to write a small web app to do it automatically. Check it out online! Currently, only the most common canon is supported, but in the future I will add any canon I find the need to construct to the project.
If you’re more of a developer, I’ve open sourced the project on github under the Azure License.
Working on some Graphic Design homework…
This is simply amazing. It will change your life.
(Source: reddit.com, via cocoageek)
On Saturday, I attended the Compostmodern conference on sustainable design. Sustainability is a fancy buzzword used by big corporations so that they can feel socially responsible. File it away with previous contenders such as Synergy and Trickle-down, and don’t ever use it. But beyond the ill-advised terminology lies an really important concept; which is that as we design, we have responsibilities that go beyond the client’s brief and balance sheet. Sure, those should always be the primary considerations—but we also have a responsibility to our environment and society. Sustainability is at the intersection of consideration for the environment, society and economy.
In order to get the most out of the concepts from the conference, though, design must be defined as more than any or all of the professions suffixed with the word design. (Industrial, Graphic, Web, Interior, Interaction… you name it!) Design is—or should be—everything a company does. Every interaction anyone ever has with a company, good or bad, becomes part of its brand. One of the first concepts introduced by several of the speakers was that of 360° Design. With 360° Design, the challenge is to design a product or brand across all aspects of its presence, whether web, print, physical, or even the experience of using it. The concepts of sustainable design, though, apply to more than design. You can draw from it in entrepreneurship, leadership, or even as a way of life.
For me, two nuggets of wisdom stood out from the various talks. The first one pertains to getting a message effectively across through what speaker Jonah Sachs calls the Myth Gap. A successful myth is the combination of explanation, meaning and story. Explanation serves the rational mind, while meaning serves the emotional. The last element, the story, is what engages the consumer. A successful story can be further divided up in three basic elements: freaks, cheats and familiars. Freaks are human characters that are extraordinary in some way. Cheats are those don’t follow the status quo. This includes both criminals (whom the viewer is against), or rebels (whom the viewer roots for). The last element is familiars: things which viewers can relate to. It is by combining all of these elements that most of the successful stories caught traction.
Secondly, Lisa Gansky introduced attendees to the concept of the mesh. The mesh is about the sharing of experiences and physical things among people. The new wave of popular services provide access to experiences, rather than ownership of things. Netflix, for example, lets people experience movies without having to buy and own them. Zipcar, similarly, allows for on-demand access to a car without having to own a car. Airbnb provides peer-to-peer access to other members’ proprieties without having to rent a hotel room.
The overarching theme of the conference, though, was sustainability. The common perception of sustainability is that of radical green-activism such as Greenpeace. Many, including myself, find this kind of activism off-putting. Not only does it alienate me with its holier-than-thou attitude, but it often does much less good than what can be achieved through friendlier means. The key to getting people involved in a project that benefits the greater good is to incentivize the better option. Give them an alternative that does not compromise their experience of the product.
Green is not absolute. The goal should not be to have a green product, but rather a greener version of what people currently have and want. Sure, the warm feeling one gets when doing something good can be an incentive; but don’t kid yourself, people will always put their quality of lift first, and rightly so. After all, that is the whole basis of the american dream and the founding of this very nation—the pursuit of happiness. As Benjamin Franklin once said, “those who sacrifice liberty for security deserve neither.” Rephrasing his quote, I will boldly claim that those who sacrifice the pursuit of happiness for the hope of a better future deserve neither.
Playing with my brand-new Canon EOS 550D. Post-processed in Lightroom 3.
I Can Crack Your App With Just A Shell (And How To Stop Me)
Well, not you specifically, but by you I mean the average Mac developer. It’s too easy to crack Mac apps. Way too easy. By walking through how I can hack your app with only one Terminal shell, I hope to shed some light on how this is most commonly done, and hopefully convince you to protect yourself against me. I’ll be ending this article with some tips to prevent this kind of hack.
Disclaimer: I am fervently against software piracy, and I do not participate in piracy. Some will view this article as an endorsement of piracy, but rest assured that it is not. However, I do not believe that obscurity and ignoring the problem is an acceptable solution.
In order to follow along you’re going to need a few command line utilities. You’re going to need the Xcode tools installed. And lastly, you’re going to need an app to operate on. I chose Exces, a shareware App I wrote a long time ago.
Let’s start by making sure we have the two utilities we need: otx
and class-dump
. I like to use Homebrew as my package manager of choice. Note that I will use command line utilities only, including vim
. If you prefer GUIs, feel free to use your code editor of choice, HexFiend and otx
's GUI app.
$ sudo brew install otx
$ sudo brew install class-dump
The first step is to poke into the target app’s headers, gentlemanly left intact by the unwitting developer.
$ cd Exces.app/Contents/MacOS
$ class-dump Exces | vim
Browse around, and find the following gem:
@interface SSExcesAppController : NSObject
{
[...]
BOOL registred;
[...]
- (void)verifyLicenseFile:(id)arg1;
- (id)verifyPath:(id)arg1;
- (BOOL)registred;
What do we have here?! A (badly spelt) variable and what looks like three methods related to registration. We can now focus our efforts around these symbols. Let’s continue poking by disassembling the source code for these methods.
$ otx Exces -arch i386
Note that Exces is a universal binary, and that we need to ensure we only deal with the active architecture. In this case, Intel’s i386
. Let us find out what verifyLicenseFile:
does.
-(void)[SSExcesAppController verifyLicenseFile:]
[...]
+34 0000521e e8c21e0100 calll 0x000170e5 -[(%esp,1) verifyPath:]
+39 00005223 85c0 testl %eax,%eax
+41 00005225 0f84e2000000 je 0x0000530d
[...]
+226 000052de c6472c01 movb $0x01,0x2c(%edi) (BOOL)registred
[...]
This is not straight Objective-C code, but rather assembly—what C compiles into. The first part of each line, the offset, +34
, shows how many bytes into the method the instruction is. 0000521e
is the address of the instruction within the program. e8c21e0100
is the instruction in byte code. calll 0x000170e5
is the instruction in assembly language. -[(%esp,1) verifyPath:]
is what otx
could gather the instruction to represent in Obj-C from the symbols left within the binary.
With this in mind, we can realize that verifyLicenseFile:
calls the method verifyPath:
and later sets the boolean instance variable registred
. We can guess that verifyPath:
is probably the method that checks the validity of a license file. We can see from the header that verifyPath:
returns an object and thus would be way too complex to patch. We need something that deals in booleans.
Let’s launch Exces in the gdb
debugger and check when verifyLicenseFile:
is called.
$ gdb Exces
(gdb) break [SSExcesAppController verifyLicenseFile:]
Breakpoint 1 at 0x5205
(gdb) run
No bite. The breakpoint is not hit on startup. We can assume that there’s a good reason why verifyLicenseFile:
and verifyPath:
are two separate methods. While we could patch verifyLicenseFile:
to always set registred
to true, verifyLicenseFile:
is probably called only to check license files entered by the user. Quit gdb
and let’s instead search for another piece of code that calls verifyPath:
. In the otx
dump, find the following in awakeFromNib
:
-(void)[SSExcesAppController awakeFromNib]
[...]
+885 00004c8c a1a0410100 movl 0x000141a0,%eax verifyPath:
+890 00004c91 89442404 movl %eax,0x04(%esp)
+894 00004c95 e84b240100 calll 0x000170e5 -[(%esp,1) verifyPath:]
+899 00004c9a 85c0 testl %eax,%eax
+901 00004c9c 7409 je 0x00004ca7
+903 00004c9e 8b4508 movl 0x08(%ebp),%eax
+906 00004ca1 c6402c01 movb $0x01,0x2c(%eax) (BOOL)registred
+910 00004ca5 eb7d jmp 0x00004d24 return;
[...]
The code is almost identical to verifyLicenseFile:
. Here’s what happens:
-
verifyPath:
is called. (+894 calll
) - A test happens based on the result of the call. (
+899 testl
) - Based on the result of the text, jump if equal. (
+901 je
) Atest
followed by aje
orjne
(jump if not equal) is assembly-speak for an if statement. - The
registred
ivar is set, if we have not jumped away.
Since awakeFromNib
is executed at launch, we can safely assume that if we override this check, we can fool the app into thinking it’s registered. The easiest way to do that is to change the je
into a jne
, essentially reversing its meaning.
Search the dump for any jne
statement, and compare it to the je
:
+901 00004c9c 7409 je 0x00004ca7
+14 00004d9f 7534 jne 0x00004dd5 return;
7409
is the binary code for je 0x00004ca7
. 7534
is a similar binary code. If we simply switch the binary code for the je
to 7534
, at address 00004c9c
, we should have our crack. Let’s test it out in gdb
.
$ gdb Exces
(gdb) break [SSExcesAppController awakeFromNib]
Breakpoint 1 at 0x4920
(gdb) r
(gdb) x/x 0x00004c9c
0x4c9c <-[SSExcesAppController awakeFromNib]+901>: 0x458b0974
We break on awakeFromNib
so we’re able to fiddle around while the app is frozen. x/x
reads the code in memory at the given address.Now here’s the confusing thing to be aware of: endianness. While on disk, the binary code is normal, intel is a little-endian system which puts the most significant byte last, and thus reverses every four-byte block in memory. so while the code at address 0x4c9c
is printed as 0x458b0974
, it’s actually 0x74098b45
. We recognize the first two bytes 7409
from earlier.
We need to switch the first two bytes to 7534
. Let’s start by disassembling the method so we can better see our way around. Find the relevant statement:
0x00004c9c <-[SSExcesAppController awakeFromNib]+901>: je 0x4ca7 <-[SSExcesAppController awakeFromNib]+912>
Now let’s edit code in memory.
(gdb) set {char}0x00004c9c=0x75
(gdb) x/x 0x00004c9c
0x4c9c <-[SSExcesAppController awakeFromNib]+901>: 0x458b0975
(gdb) set {char}0x00004c9d=0x34
(gdb) x/x 0x00004c9c
0x4c9c <-[SSExcesAppController awakeFromNib]+901>: 0x458b3475
Here we set the first byte at 0x00004c9c
. By simply counting in hexadecimal, we know that the next byte goes at address 0x00004c9d
, and set it as such. Let’s disassemble again to check if the change was done right.
(gdb) disas
0x00004c9c <-[SSExcesAppController awakeFromNib]+901>: jne 0x4cd2 <-[SSExcesAppController awakeFromNib]+955>
Whoops, we made a mistake and changed the destination of the jump from +912
to +955
. We realize that the first byte (74
) of the byte code stands for the je
/jne
and the second byte is the offset, or how many bytes to jump by. We should only have changed 74
to 75
, and not 09
to 34
. Let’s fix our mistake.
(gdb) set {char}0x00004c9c=0x75
(gdb) set {char}0x00004c9d=0x09
And check again…
0x00004c9c <-[SSExcesAppController awakeFromNib]+901>: jne 0x4ca7 <-[SSExcesAppController awakeFromNib]+912>
Hooray! This looks good! Let’s execute the app to admire our crack.
(gdb) continue
Woot! Victory! We’re in, and the app thinks we’re a legitimate customer. Time to get wasted and party! (I recommend Vessel nightclub in downtown San Francisco.) Well, not quite. We still need to make our change permanent. As it currently stands, everything will be erased as soon as we quit gdb
. We need to edit the code on disk, in the actual binary file. Let’s find a chunk of our edited binary big enough that it likely won’t be repeated in the whole binary.
(gdb) x/8x 0x00004c9c
0x4c9c <-[SSExcesAppController awakeFromNib]+901>: 0x458b0975 0x2c40c608 0x8b7deb01 0xa4a10855
0x4cac <-[SSExcesAppController awakeFromNib]+917>: 0x89000141 0x89082454 0x89042444 0x26e82414
That’s the memory representation of the code, a whole 8 blocks of four bytes starting at 0x00004c9c
. Taking endianness into account, we must reverse them and we get the following:
0x75098b45 0x08c6402c 0x01eb7d8b 0x5508a1a4
0x41010089 0x54240889 0x44240489 0x1424e826
The very first byte of the series is the 74
that we switched into 75
. By changing it back, we can deduce the original binary code to be:
0x74098b45 0x08c6402c 0x01eb7d8b 0x5508a1a4
0x41010089 0x54240889 0x44240489 0x1424e826
Let’s open the binary in a hex editor. I used vim
, but feel free to use any hex editor at this point. HexFiend has a great GUI.
(gdb) quit
$ vim Exces
This loads up the binary as ascii text, which is of little help. Convert it to hex thusly:
:%!xxd
vim
formats hex like this:
0000000: cafe babe 0000 0002 0000 0012 0000 0000 ................
The first part, before the colon, is the address of block. Following it are 16 bytes, broken off in two-byte segments. Incidentally, every Mach-O binary starts with the hex bytes cafebabe
. Drunk Kernel programmers probably thought it’d be funny. Now that we have our beautiful hex code loaded up, let’s search for the first two bytes of our code to replace:
/7409
Shit. Too many results to make sense of. Let’s add another two bytes. Search for “7409 8b45
" instead and boom, only one result:
001fc90: 0089 4424 04e8 4b24 0100 85c0 7409 8b45 ..D$..K$....t..E
Edit it to the following:
001fc90: 0089 4424 04e8 4b24 0100 85c0 7509 8b45 ..D$..K$....t..E
Convert it back to binary form, then save and quit:
:%!xxd -r
:wq
And… We’re done! To check our work, launch the app in gdb
, break to [SSExcesAppController awakeFromNib]
and disassemble.
$ gdb Exces
(gdb) break [SSExcesAppController awakeFromNib]
Breakpoint 1 at 0x4c90
(gdb) r
(gdb) disas
Admire our work:
0x00004c9c <-[SSExcesAppController awakeFromNib]+901>: jne 0x4ca7 <-[SSExcesAppController awakeFromNib]+912>
Quit gdb
and relaunch the app from the Finder, and bask in your leet glory.
How you can stop me
Objective-C makes it really easy to mess with an app’s internals. Try to program the licensing mechanism for your app in pure C, that will already make it harder for me to find my way around your binary. Also read this older article of mine on three easy tips—stripping debug symbols, using PT_DENY_ATTACH, and doing a checksum of your binary—you can implement to make it a whole lot harder for your app to be cracked.
A truly skilled hacker will always find his way around your protection, but implementing a bare minimum of security will weed out 99% of amateurs. I am not a skilled hacker—yet with some very basic knowledge I tore this apart in no time. Implementing the various easy tips above takes very little time, yet would have made it enough of a pain for me that I would have given up.
The Ultimate Solution For Xcode Auto-Versioning With Git
After struggling with several suboptimal solutions for years, I have finally come to find the best Xcode versioning solution for git users. First off, tip of the hat to Marcus Zarra and Johannes Gilger for posting their solutions, which inspired me in my search for the ultimate solution.
A couple advantages that make this solution better than those I’ve used in the past:
- It’s completely filesystem independent. Save for the git binary location requirement, this would work across any Mac with no additional setup. (It should also be quite easy to edit the script to detect git using
which
.) - It works across clones and systems.
- Because the version is the current git SHA1 hash, it always refer to a specific commit you can get back to when debugging later.
- It processes the version number at every build immediately. Some of the solutions I’ve used in the past required a double-build, because of Xcode’s tendency to run scripts after the preprocessor. Not so here.
- No duplication of code in projects with multiple targets.
- Works for iPhone, Mac App Store and Mac apps.
So without further ado, my solution: I rely on an external target of type Shell Script which I call Versioning. Every other target sets Versioning as a Direct Dependency, ensuring its script is run before the preprocessor. Versioning contains the following Run Script:
cd "$PROJECT_DIR"
VERSION=`/usr/local/bin/git rev-parse --short HEAD`
cd "$PROJECT_TEMP_DIR"
echo "#define GIT_VERSION $VERSION" > revision.prefix
cd "$PROJECT_DIR"
touch Info.plist
In Info.plist, the CFBundleShortVersionString is set to GIT_VERSION
. In the project’s main build settings, Preprocess Info.plist is turned on and Info.plist Preprocessor Prefix File is set to $PROJECT_TEMP_DIR/revision.prefix
.
My Mac App Store Plans
The recently unveiled Mac App Store is, unfortunately, an affront to Mac developers. Importing the iOS’ closed model and applying it to the Mac, the new store carries with it all of the major disadvantages of its smartphone equivalent. I can’t stand the thought of losing thirty percent of my revenue, in return for which I get harsh restrictions on what I may do, week-long approval queues (even for critical updates,) a public expecting a ridiculously low price, months of revenue held off by Apple, and the risk of being cut out from said revenue at any time.
I’m not even going to get into how I will lose control over my own customers because Apple won’t let me send them promotional emails or sign up for an account. It won’t let me give away my software either, or have flexible pricing structure, educational discounts, volume discounts, promotions or giveaways.
Most excruciatingly, though, the App Store itself rocks. It’s beautifully designed and as a user, it is pure joy to use. Unfortunately, I am not willing to sign my soul to the devil to be a part of it. I was willing to deal with the limitations on the iOS platform, because it was presented as a new option, an is still somewhat reasonable on a smartphone. However, on the Mac, where we’ve been restriction-free for decades, this is most unwelcome. So here are my plans regarding the App Store:
My apps will always be available from my own store. This will function the same way it always has: Sparkle updates and email-based licenses and trial versions.
My apps will also be available on the Mac App Store (provided they get approved), crippled however Apple may wish. They will have a 30% price premium over the standard price, to make up for Apple’s cut. I will make sure that the standalone version is never inferior to the App Store version and I will advertise the cheaper, standalone version heavily.
How do you want to change the world?
This essay is part two of my application to the Thiel Fellowship. It’s rare for an application essay to spark genuine reflection, but I think this helped me formulate and articulate what my beliefs and ambitions are.
Problem-solving ability is the key to making the world a better place. People need to be presented with more—and better—solutions to the challenges they encounter in daily life. Technology needs to be made easy to use and understand, and must help make people’s lives better without involving a compromise. I intend to make the world a better place by creating software that is well designed and that will have a positive effect on as many people as possible.
British philosopher and ethical theorist John Stuart Mill presented us with an interesting theory in the form of his Greatest Happiness Principle. The Principle is a doctrine by which to judge the ethicality of actions, and it states that the ethical course of action is that which will generate the most happiness for the greatest amount of people. I find that it is relevant when applied to the field of software. In that context, it states that what one should strive for is to build something which will generate great happiness for a great many people. Happiness is a loose term, in that it could refer to a game which will keep users happily entertained while waiting in line at the bank, or it could be an app or a service that can save lives, generating happiness on a much more profound level. The form does not matter, only that it has a net positive gain.
Some examples come to mind. A product that I use and respect a great deal is Mint.com. Its founders saw a deficiency in the way people dealt with their financial lives (mostly ignoring it because of extreme complexity,) and decided to harness the power of technology to come up with a radical new solution. Mint has been of tremendous help to me personally, and to millions of others. Another product I look up to is Tumblr. Taking a simple idea that already existed, Tumblr re-imagined what blogging could be, and presented their carefully redesigned solution to the world. Even though it does nothing to solve a fundamental life problem, it generates happiness and thus is a success in my books. Lastly, Instapaper is a highly underrated product from Tumblr’s ex-Lead Developer, Marco Arment. It was a side-product that Arment built to scratch his own itch, and that after polishing, he released for the public to enjoy. It has deservingly been enjoying growing success, and is a product that I use daily.
My software projects have kept this in mind. My first foray into the world of development, Exces, was an app that sought to make encryption easy to use and understand for anybody. Geared towards the novice user, the application simplified and abstracted the complexities of secure encryption by using a metaphor that people are already familiar with: bank vaults. My next big project, iLaugh, was a lighthearted iPhone app which entertained users with jokes and funnies, while being a joy to use and keeping users engaged through carefully considered design decisions. My next big project is a cloud-based notes-to-self app which lets people quickly jot down thoughts from anywhere, and deal with them later.
The feedback I have received from users show that I am already succeeding at making people’s lives slightly better. There is no better feeling than receiving an email from a happy user thanking me for my work. Though this is nowhere near the scale I envision eventually affecting people’s lives at, I see this as a step in the right direction. I moved from Switzerland to San Francisco in order surround myself with people who will make me better able to achieve that goal. I believe in taking every opportunity I get to learn something new and enrich my knowledge and world view. Because of this, I have gained various interest and hobbies, from graphic design, to languages, to software and business.
What I hope to gain from the fellowship is a network of people who share my way of thinking, and who will be able to mentor me and eventually make me better able to change the world. I’m looking for a way to kickstart my journey in the world of the startup.
Tell us one thing about the world that you strongly believe is true, but that most people think is not true.
This essay was written for my application to the Thiel Fellowship. It’s rare for an application essay to spark genuine reflection, but I think this helped me formulate and articulate what my beliefs and ambitions are.
I believe that with enough willpower and effort, anybody can change the world for the better.
While this statement may sound naive and cliché—it rings fundamentally true to me. It is the basis upon which the American Dream is built, and which has driven the United States through the past century. Unfortunately, the dream has been bastardized to the point that it is now more evocative of a fantasy than a dream.
The american political landscape—in its constant bickering and back-and-forth—tries to capture the public’s goodwill by using and glamorizing ideas that appeal to their humanity. Things like religion, freedom, and the American Dream are prime topics to drive agreement and enthusiasm. This, unfortunately, has made the few who diverge from the status quo, and who think for themselves, wary of beliefs like that.
Fundamentally, though, there is some truth to the idea that the world is a place where anybody has an opportunity to make a difference. It is not an easy thing to go against to the common wisdom, to persevere when everybody thinks you are crazy. It takes courage, self-confidence and determination. But time and time again, we have seen people do it and achieve inconceivable results—from Ghandi and Thomas Edison, to modern luminaries like Steve Jobs and Elon Musk.
Achievements do not necessarily have to be of that magnitude either. Some of the people I respect most are neither famous nor widely known. But they are people who take their craft to heart and are determined to make a difference however they can. They strive to be the best at what they do, and in so doing make a positive difference in the world. A small difference, sure, but if the majority of people thought and acted that way, it would go a long way towards alleviating the world’s problems and making it a more pleasant place to live in.
One of the qualities I respect most in people is their ability and willingness to think for themselves, and take action to back up their ideals. Think there’s a problem with an aspect of your life? Quit bitching and do something about it! (Within reason, of course.) Creativity and entrepreneurship are the basis for innovation, but they are fragile things. In today’s remix culture, it is far too easy to spend hours watching videos on YouTube, or shows on TV, or doing entertaining yet inconsequential things instead of actually creating something.
Ambition is another important factor in making a difference. When you hear Musk or Jobs talk, they will tell you about having an insane utopian vision for the world. Jobs sees a world of interconnected and designed technology, that just works and is accessible for all to use and enjoy. Musk sees a world where every car is electric, where our energy is clean and solar, and where we have expanded into space. They see their current achievements as the first step towards their lofty goals. They probably won’t achieve those goals in their lifetimes. But, in trying to get there, they have already changed the world in a major way. If you set your goal far enough, even if you only get ten percent of the way there, you’ve already accomplished something amazing.
These are all principles that I take to heart and try to apply to my life. My skills lie in software and design, and thus when I encounter a challenge in my life I try to design a better solution through software. If it is a challenge that other people may also encounter, I will polish my solution and turn it into an actual product. If, as a result, I have made a million people or just one person’s life more pleasant—I will have made a positive difference in the world. Originally from Switzerland, I moved to San Francisco by myself in order to be closer to a community of people who strive for the same thing I do. People who can enrich my knowledge and view of the world and will ultimately enable me to make an even bigger difference in the world.
One project that caught my attention this summer is Diaspora. While TechCrunch and everybody on the internet were busy complaining about their disagreement with Facebook’s privacy policy change, a group of students from NYU decided to actually do something about it. I was compelled to donate to the project, because even if the project goes nowhere, their willingness to act is something to be encouraged. My belief is that with enough willpower and effort, I will be able to make a notable difference in the world. And my hope is that many other people will too.
Beer Wars — Alex Varanese for Playboy’s January 2011 issue.
The more I think about it, the more I am opposed to the way in which Wikileaks and Julian Assange operate. While investigative journalism and the questioning of government are vital to a free society, I find myself increasingly convinced that Wikileaks does not constitute investigative journalism, but rather a random and harmful dump of classified information for the sake of making a political statement.
There are valid reasons for secrets and “white lies.” Without them, civilization would collapse and social interaction would become pointless. In a well-reasoned and quite convincing article, Jaron Lanier writes:
What if we come to be able to read each other’s thoughts? Then there would be no thoughts. Your head has to be different from mine if you are to be a person with something to say to me. You need an interior space that is different from mine in order to have a different, exotic model of the world, so that our two models can meet, and have a conversation.
[…]
Asking whether secrets in the abstract are good or bad is ridiculous. A huge flow of data that one doesn’t know how to interpret in context is either useless or worse than useless, if you let it impress you too much. A contextualized flow of data that answers a question you know how to ask can be invaluable.
On the argument for Wikileaks as investigative journalism:
If we want to understand all the sides of an argument, we have to do more than copy files. It’s not as though we are supporting reporters out there on the ground to do independent investigative journalism. Random leaking is no substitute for focused digging. The “everything must be free and open” ideal has nearly bankrupted the overseas news bureaus.
I don’t mean to make this a pro-government rant. Don’t get me wrong, I think there’s plenty of things that are wrong with the US government and political landscape as it is. I just think Wikileaks’ approach to the problem is neither helpful nor ethical.
Really neat packaging design from student Mika Kañive. If I had one reproach, I would suggest removing the ampersand from the logo and calling the product frts|ygrt.
A short list of currently ultra-popular songs vs. the originals they’re stealing an integral part of the song from.
- Eminem—No Love
— Haddaway—What Is Love - Jason Derulo—Whatcha Say
— Imogen Heap—Hide and Seek - Kanye West—Stronger
— Daft Punk—Harder, Better, Faster, Stronger - Pitbull—Hotel Room Service
— Nightcrawlers—Push The Feeling On - Pitbull—Krazy
— Federico Franchi—Cream - Far East Movement—Like a G6
— DEV—Booty Bounce - Black Eyed Peas—The Time (Dirty Bit)
— Bill Medley & Jennifer Warnes—(I’ve Had) the Time of My Life
Some spreads from my Graphic Design Tools project. We made a small-format magazine on a subculture of our choosing. My topic was Gyaru girls.
Download the a pdf of the whole magazine here!
Second assignment for Graphic Design 1 class. The brief was to make an agitprop poster, and I chose to promote Prop 19 (marijuana legalization) from an angle that would appeal to voters who dislike marijuana. I want to show the social and economical benefits of Prop 19, because I am personally not inclined to promote drug use.
Third and last personal logo for GD1.
The last logo had to show the meaning of my name. I went with my middle name, Olivier, which is the original french version of Oliver. Originally from the nordic name, Áleifr, meaning “elf-host” or “elf-army,” the spelling was later changed to associate it with the latin word oliva, meaning “olive tree.”
Second out of three personal logos for a GD1 project.
For this one, we had to create a monogram using our initials. I went with a bitmap-y lowercase “kb.”
First out of three personal logos for a GD1 project.
The assignment for this one was to create an “idiosyncratic” logo. In other words, something that reflects an aspect of my personality. Those of you who know me know that I like to drink and go out a lot. I’m particularly fond of cocktails—represented here by the martini glass—and of electronic music—the sound waves.
A whole typeface designed on a minimalistic 3x5 grid for my Type 1 class. Some of the letters were quite hard to resolve, but I think I managed to come up with a pretty good solution considering the constraints imposed.
Categorical Imperative
In response to an annoying philosophy assignment, I go all meta on them and write about whether to write the essay…
At this very moment, I am faced with the dilemma of whether to write this paper. The brief clearly states to use a personal dilemma and relate it to Immanuel Kant’s Categorical Imperative, walking through one’s reasoning and eventual solution. However, a college student’s life does not make a good resource for interesting dilemmas.
More importantly, though, I am morally opposed to assignments that require an essay based on personal experience for several reasons. A personal dilemma is by definition personal, ie. something that one might not necessarily want to share with one’s instructors and peers. If the aim of this paper is to demonstrate one’s understanding of Kant’s Categorical Imperative, why force students to use a personal but dubiously related dilemma, instead of using a hypothetical example that would better illustrate the concepts taught? Lastly, it puts students who have had different life experiences and have been faced with various kinds of dilemmas on unequal ground. Thus a student with a better understanding of the concept at hand but a less interesting personal history is at a disadvantage.
Kant’s Imperative states that “I should never act except in such a way that I can also will that my maxim should become a universal law.” This means that one ought to act in a way one would find reasonable, were it applied as a rule to anybody else in the same situation. Kant has a concept of goodwill, which he explains as meaning that goodness comes from the intention. Acting to fulfills one’s duty is to do good, and one’s duty is to act in act in such a manner that one would want anybody else to act, in the same circumstances. Kant emphasizes reason over emotion, when faced with an ethically difficult situation.
Faced with the dilemma which puts my will to complete the assignment as best I can against my moral objection with the form of the assignment, I need to reason objectively about which is the morally optimal solution. According to Kant, I need to act in the same way I would want any fellow student to act. Considering how I would feel if one of my fellow student were to get off easily without doing the assignment (that he is lazy, and deserving when he fails the assignment), that option is out of the question. On the other hand, I would not look up to a student who gives in and either makes up a fake dilemma, thus not following the assignment’s requirements, or uses a uncreative and boring situation from his past.
What I need is a creative solution. One that will still follow the requirements and show that I understand the concepts taught, while minimizing my moral objections. In terms of absolutes, I chose to side with the assignment against my emotional distaste for essays based on personal experience. Hopefully, though, this is a creative and witty solution to a petty dilemma.
Design is a Drug
Kyle Meyer:
You’re riding a high, you just put together a design that you couldn’t be more proud of. […] You’re on top of the world and no one can stop you. At least in your head—and that’s all that matters.
Flash forward a month later. You’re struggling to come up with new ideas, fresh thinking, sound logic. […] You wonder if it is all pointless. Your parents wanted you to be an engineer and you let them down for that fancy-pants art school. You envy the mundane: the mindlessness of it all. Screw it—you’ll be happier flipping burgers. Maybe you’ll come up with a fancy way to swirl the ketchup and mustard into the restaurant’s logo.
Repeat.
Brilliant. Also, very true. I’ve only pasted snippets. Read the whole thing.
One of my favorite features in Google Chrome, and something that I discovered by accident one day, is how the address bar lets you search any site in which it detects a search field.
If, for example, you type “wiki” and press tab, based on your browsing history, it will determine that you most likely meant to search en.wikipedia.org. It will show a blue “Search Wikipedia (en):” element, and you can type in your search term and press enter. You’ll be taken right to the article on Wikipedia.
This works with most popular sites out there. I’ve used it with Netflix, Google Image Search, Wikipedia, Facebook, Stack Overflow, php.net, and of course, YouTube.
I recently went on a small trip to San Diego. After completing my summer internship with Tapulous, I decided to take some vacation and go explore some of the other great American cities. So I flew down to the port city for a long weekend.
I visited the USS Midway, an impressive retired aircraft carrier turned museum. San Diego being one of America’s greatest Navy ports, it was host to three massive aircraft carrier when I visited, which you could see from across the bay.
Like any self-respecting tourist in San Diego, I made it to Seaworld.
Seaworld had some great shows. I especially enjoyed the funny sea lion show. They’ve got to be my favorite marine creatures, and they were very impressively trained.
They couldn’t quote Bart without quoting Andrew. It wouldn’t be fair.
Steve Jobs Is No Longer An Asset
Daniel Jalkut, on Steve Jobs, is spot on:
I believe Jobs is an idealist product visionary who wants the best for Apple and for its customers. But he’s lost his ability to manage his own image, and thus the image of the company. Apple’s PR department is in charge of manipulating how the company is perceived, but their efforts are being drowned out by the live-wire personality at the helm of the ship. Jobs needs to quiet down now and let cooler heads speak. No more arrogant, terse email replies. No more defensive press conferences. No more snarky interview quips. Just chill out and try to get your groove back.
At his best, Steve Jobs is a brilliant, inspirational spokesman for the company. At his worst, he is the pompous winner who begs to be taken down a notch. Jobs is the kid who, having been celebrated for the A+ exam grade, reacts by chiding his classmates: “You all are a bunch of idiots.” Fans lose their faith, detractors gain momentum. This guy’s in for a rough victory.
Jobs and his culture and mentality is increasingly becoming a burden on the company and its customers. While I still use and love Apple products, I no longer love the company. I think of Jobs as a “douchebag” and of Apple as a misguided company that cares more about its ideals than its customers. I can no longer call myself an Apple fan, and that saddens me.
Great quote. And I’m not just saying that because Bart’s my boss!
Japan… how I love thee. I’d love to go back to japan soon. The three months I spent there last year were not enough!
Report on iAd
I’ve been running iAd on relatively high traffic since day one. Here’s how – for me – it’s been performing, and how it breaks down against competing ad networks.
First, the good. The eCPM is amazing. Some dude reports getting $150 eCPM on his first day on iAd. While this is mind-blowingly high and in no way representative of the average on the network, eCPMs can be expected to be quite high. My eCPM averages $10-$15, which is quite good.
Of course, we have to put these numbers in perspective. We cannot do a 1-to-1 comparaison with competing networks. Another important factor to consider: Most competing ad networks refresh their ads every 30s. iAd does it every 3min. Thus, for the time it takes iAd to display one ad, another network gets to show 6.
For a fair comparaison, we need to adjust the eCPM. Taking the above into account, let’s divide the number by 6 to get something we can compare to networks that refresh every 30s. The resulting figure isn’t really an “effective cost per thousand impressions,” but rather something more like an “effective cost per 500min of ads being displayed.”
Compared thusly, the eCPM on iAd is only worth about $1.60-$2.50. While still quite high, this is nowhere near the mind-blowing figures that have been thrown around.
Last thing to consider: fill rates. They’re are appallingly low. Though this seems to be slowly improving, they remain below 10%. Compare this with most other non-premium networks which often get you 100% fill rate. A solution would be to run iAd as a first option, and fall back to another network for failed requests. Also, I would suggest keeping the ADBannerView around even when not displayed, leaving it to refresh in the background and once it does return an ad, displaying it.
I’m sure the fill rates will improve over time, and that iAd wil become a worthy competitor over time. Right now though, the reality is iAd generates less revenue than my previous first option, Google AdSense for mobile.
Update: Greg Yardley rightly calls me out on mistakenly stating Apple’s figures included their 40% cut. Article updated accordingly.
President Obama on Immigration Reform:
So this steady stream of hardworking and talented people has made America the engine of the global economy and a beacon of hope around the world. And it’s allowed us to adapt and thrive in the face of technological and societal change. To this day, America reaps incredible economic rewards because we remain a magnet for the best and brightest from across the globe. Folks travel here in the hopes of being a part of a culture of entrepreneurship and ingenuity, and by doing so they strengthen and enrich that culture. Immigration also means we have a younger workforce -– and a faster-growing economy — than many of our competitors. And in an increasingly interconnected world, the diversity of our country is a powerful advantage in global competition.
[…]
And while we provide students from around the world visas to get engineering and computer science degrees at our top universities, our laws discourage them from using those skills to start a business or power a new industry right here in the United States. Instead of training entrepreneurs to create jobs on our shores, we train our competition.
This is an issue that important to me. As a Swiss citizen, trying to integrate myself into the Silicon Valley culture, I am acutely aware of the deep problems in US immigration law. I am here under an F-1 student visa, which will eject me from the country once my studies are over.
This summer, I landed an internship at Tapulous (now Disney). I had to go to great lengths just to get approved by the government’s bureaucracy. For argument’s sake, imagine after the internship is complete they’d like to keep me. Because my visa does not allow for permanent employment, I wouldn’t be able to accept. I would have to apply for an H-1 visa, which would require me to leave the country while waiting for months (or maybe even years) for the process to be complete. All of this setting aside the fact that H-1 requires a completed bachelors degree, which – were I to drop out of school to take the opportunity – I would not have.
If, hypothetically, I were eligible for the visa; its fine print puts a great burden on the employer, making me an unattractive prospective employee. The employer would have to sponsor me, spending a great deal of money on application and lawyer fees, all on the uncertain hopes that my visa gets approved. Additionally, they have to prove that they could not find a suitable employee who is a US citizen, with documentation showing that they interviewed other candidates and that none were fit for the position.
All of this makes it very hard, or even impossible for me to start a career in Silicon Valley. I believe – if I may say so – that I would be an asset to the US economy, rather than a burden. Preventing me from being a part of this great country – which, even with all its faults, I love – makes no logical sense.
When you measure an activity, you can improve it. Computers make it easy to optimize just about every portion of your life.
And then, at some point, you realize you’re spending your best energy on optimization, not on creation.
iLaugh 2.9 is out!
iLaugh 2.9, in its Lite edition, is now out in the App Store, bringing to you a number of new features, fixes and enhancements.
Here’s what’s new:
- iOS 4.0 compatibility
- Multitasking and fast app switching support: When you come back to iLaugh, you’ll be taken right back to the joke you were reading before you left
- Now loads a lot faster due to additional caching
- Less promotional messages
- Better ads, leveraging Apple’s iAd network (to be launched July 1st)
- Various UI improvements
- Important bug fixes
Check for updates in iTunes – or if you haven’t yet, check out iLaugh!
Defriending Facebook
Cristina Cordova, who, for two days, was a coworker of mine at Tapulous:
Those concerned about privacy are not whining about change or ads or the fact that we can’t figure out those messy privacy settings. It’s not about some ‘right to privacy’ or reckless college photos that some are praying will just go away. It’s about the relationship we all hold with Facebook. It’s no longer a trusting one.
What makes me uneasy about Facebook’s recent privacy fiascos isn’t what they’ve done with my personal data. I don’t feel like they’ve done anything wrong with it, so far. It’s that I cannot trust them not to in the future. If Facebook decides to screw me over, there is nothing I can do about it, and I don’t trust them to have the moral decency to care.
Designisnowhere
Rob Morris on “underdesigning:”
Interfaces and experiences I encounter everyday from my coffee cup to my computer, the desk it sits on, to the chair I sit on are all underdesigned. I know this because I rarely pay them any mind at all — except, of course, on the rare occasions when they don’t work how I’d like.
It’s unfortunate that failures in a design tend to be more noticed consciously than successes. That’s because when something’s succeeding, good designers don’t want you to notice the thought that’s gone into making it. Like Michael Caine’s performance, you should be immersed in the experience, not its delivery. Whether it’s to communicate a message or facilitate an action, design should never get in the way of itself.
At its core, design is about helping you achieve your goal, and making the process as pleasant and easy as possible. Decoration and eye candy should never get in the way of that.
The quest for frisson
Roger Ebert on our constant quest for stimulation:
There’s such a skitterish impatience in our society right now. The national debate is all over the place. Talking points take the place of arguments. Think up a snarky name for someone, and you don’t have to explain any further. The oil spill is in Day 40 and enough, already. We’ve been there, done that. In some circles it has become Obama’s fault, not for any good reason but perhaps because that breaks the monotony.
Something has happened. Do we even know it has happened? We look out from inside our brains. We notice differences in things. But how can we notice a difference in the brains that are noticing them? One reason meaningless celebrities dominate all of our national media is that they are meaningless. They require no study, no reading, no thought. OMG! Heidi is leaving Spencer! OMG! Russell Brand is a sex addict! OMG! Matt Lauer never dated or slept with Alexis Houston, and all that time he didn’t know Alexis was a man! OMG! Top Kill has failed! WTF. ROFL.
Astute essay. Ebert is a very intelligent man.
These are hard core. And for real.
Bad-ass. I want some of these!
Named after the night Andy Moor was dj-ing at Ruby Skye which inspired me to mix some trance again. One notable aspect of that night was the very attractive and unfortunately nameless asian girl I was fortunate enough to dance intimately with. Hence the name.
Tracklist:
See the Difference Inside (Summer Mix) - Moonbeam
Never Again (Original Mix) - Robert Nickson feat Elsa Hill
Once - Ferry Corsten Pres. Pulse
Hartseer - Bart Claessen
London To Bangkok (Haris C Remix) - Rozza
Exposure - Gareth Emery
1998 (2010 Mix) - Binary Finary
Donate to Save The Gulf
Tumblr Staff:
Thank you to everyone who donated to Save Our Gulf this week! I’m afraid we can’t match any more contributions, but if you’d still like to donate and unlock the Limited Edition Black Dashboard preference, we’re leaving a donation page up through the weekend.
Thank you!
I just donated. If you can spare $5, I hope you do, too.
The Power of the Cloud
a.k.a. What It Feels Like Having Two Months Of Your Digital Life Wiped, And Then Subsequently Restored Thanks To Cloud Computing
I’m usually pretty diligent about backing up regularly. I’ve even got a terabyte drive and a Time Capsule both setup to backup automatically. But these last few months have been quite eventful. I’ve finished up my first year of college at the California College of the Arts, moved into a new apartment, and took up a job at Tapulous. With all this commotion, I never managed to take the time to setup my Time Capsule.
As luck would have it, my hard drive dies on me last Friday, literally the same day I get the Time Capsule out of its box and end up putting off setting it up to the weekend. At the moment, I paniced a little, thinking of how catastrophic a two-month data loss would be. All my photos, my music, my work, my whole digital life… gone!
So, though a little depressed, I decided to take the opportunity to perform a much-needed clean install. As I was setting up my most frequently used software, and putting back in all my accounts, I realized that I had not lost as much as I feared. The first sign was in re-installing 1Password, the app which contained all my password and important banking credentials. Luckily, I had set its database to be stored in my free Dropbox* folder, which syncs automatically to the cloud. Getting that restored was as easy as typing my Dropbox credentials in.
Through MobileMe, all my emails, calendars, address book, keychain and settings were preserved. I managed to recover my lost photos and music from my iPhone using Ecamm’s great PhoneView app. My work was under source control, and was regularly pushed back onto my servers (git is amazing, really!). My Things library synced back from my iPhone onto my Mac. Various other services (including Google’s) kept track of other aspects of my digital life. It’s amazing how much data was able to survive this otherwise catastrophic crash. What couldn’t be recovered was restored to its month-ago state. This include most of my schoolwork, and business data. Thankfully, I hand’t done any schoolwork in the last month, and the data loss on that front was pretty minor overall.
In order to make sure this never happens again, though, I have committed to keeping all of my data in the cloud. I signed up for a Dropbox Pro account, to which I moved my iPhoto Library, Things Library and any folder where I store documents. As a bonus, I get all that data now synced up between any Mac I own, and my iPhone and iPad.
I am now fully convinced that Cloud Computing is the biggest step technology has taken since the invention of the computer.
* Full Disclosure: referral link, gets me an extra 500MB of storage, and gives you an extra 250MB if you sign up using that link.
iPad TV
Adam Lisagor on the iPad taking the TV’s role in our lives:
Apple has done a tremendous amount of work putting [the iPad] in our hands (and on our knees, chests and laps), and showing us how it fits in our lives, in all the right places. As I said before, all the right places, all those places between on-the-go and at-your-desk, they turn out to be a lot of places. We spend a great deal of time in places other than our offices and in transit. So I think of all those places Apple has, with its advertising, shown us comfortably using the iPad, and I can’t help but note that they’re pretty consistently places where I’d want to mellow out and turn on some TV.
Notepod: The sketchbook for your app ideas
This seems like the perfect sketchpad for iPhone app designers and developers. They also have an iPad version.
I totally want one of those!
While they’re talking to you they’re also, in their heads, optimizing the queueing algorithm at the bar, writing their first quantum computing application, and stepping through the code they wrote just an hour ago.
The second type is tech-inflected liberal arts types. Journalists and bloggers are often of this type — but a perhaps-surprising number of developers are too. They’d rather discuss Gogol and Gaga, Kafka and Kubrick, Borges and Black Eyed Peas.
Brent Simmons on the two types of geeks
This quote really resonated with me. I think his description of the second type of geek describes me very well.
A Verizon reality check
Marco Arment:
It’s easy to glorify Verizon as an iPhone owner, because AT&T is so awful. But Verizon sucks, too — just in different ways, for the most part.
I’ve been saying all along that as much as AT&T’s coverage sucks, I’ve generally been happy with their service. The lack of tethering sucks, but I get around it. Customer representatives I’ve encountered are usually helpful and pleasant to converse with while things get taken care of. They acknowledge jailbreakers with amusement and complicity. Things take forever to get fixed, but the same can be said of any other large company. Even Apple, in my experience, does a much poorer job of helping me out beyond the very basic stuff they’re trained to deal with every day.
This isn’t meant to be a glowing review of AT&T. There are still plenty of major problems, not least of which is the ridiculously poor coverage. I get dropped calls all the time. The network’s inability to deal with density makes it impossible to use my phone at any crowded event. (Attending a conference, concert, festival, expo? Forget about using your iPhone.) But I don’t expect any of that to change should I switch to Verizon. In fact, I expect the few improvements in coverage to be offset by major worsening of the situation in other areas. Ethics, customer relations, and technological innovations are all areas in which AT&T has the upper hand.
That's a problem.
Astute observation by Marco Arment. So much for the benefits of a closed App Store. It’s a known fact that the vast majority of the App Store’s 200,000 apps are junk. I just wish Apple would make up its mind and either curate the App Store to make it a premium quality store, or make it completely open and let the consumers vote with their credit card.
The first two pages of search results for “angry birds”: The first two are real. Rocket Bird 3D and MY BEST FRIEND are other things (although probably keyword spammers). The other six of the top ten results for this game’s name are pure spam. Judging from the number of customer ratings, a lot of people are downloading them — and, reading the reviews, it looks like they’re mostly scams and ripoffs
A logo I was asked to design by my Illustration teacher. For an alphabet book.
After the volcano: Earthly powers
The Economist on our relationship to our planet:
There is no technology to plug volcanoes which pierce the earth’s crust, or to bind the faults which cause earthquakes. There is not yet even a science for predicting when faults and volcanoes will let loose. To that extent, mankind is still vulnerable to the vagaries of the planet. But the story of human development is one of becoming better at coping with them.
Death by disaster is in many ways a symptom of economic underdevelopment: witness the very different consequences of the earthquakes in Haiti and Chile. In general, richer places and richer people are better able to survive and rebound. More interconnections provide more ways to mobilise resources and explore alternatives when things go wrong. If the Eyjafjallajokull plume had been as risky as it first appeared and long-lived to boot, such interconnectedness would undoubtedly have provided ways to keep Europe supplied, though probably at substantial cost and with a fair bit of lasting disruption. The apparently sublime power of the volcano was largely the result of an initially supine reaction.
Another tasty bit:
This is worth applying to climate change. Many of Burke’s descendants find it difficult to believe that something as big as the earth’s climate could really be at risk from human activity, and even harder to think you could do something about it. But the risk, if not full certainty about its consequences, is there. Moreover, the idea of a counterbalancing, “geoengineered” cooling to counteract some aspects of climate change is worthy of study and discussion. Large volcanic eruptions spread cooling palls through the stratosphere. Techniques for doing something similar in a less dramatic way are plausible.
Originally, I had a 500-word response to this article, and while trying to safe as draft, chrome crashed. Suffice to say, it’s a very insightful article on our relationship to our home planet.
The USA has long had one of the strictest alcohol policy of the world. While countries like China or Italy have no age limit on alcohol, and most of the rest of the world sets the limit at 16 to 18 years of age, the US maintains a 21 year old drinking age.
Some people argue that all alcohol is inherently bad. This sentiment is what brought about prohibition in the 20’s, and as history has taught us, it was an utter and total disaster. Alcohol consumption actually increased, a majority of American citizens were turned into criminals (spreading the notion that crime is okay) and organized crime rose up to fill the demand.
Alcohol diminishes your social inhibitions, and some people grow into a pattern of chronic drinking and become aggressive and unpleasant to be around. We have to realize that this is only a small subset of the much larger drinking population. Should everybody be punished, prohibition-style, for the few people who abuse alcohol? I don’t see the governments banning knives because some use them to stab people…
So then, what makes 21 a fair age to let people consume alcohol? The most common response is “Kids shouldn’t be drinking… under 21s aren’t mature enough to drink responsibly.” Yet, they consider us mature enough to get a job, live by ourselves, go to jail, pay taxes, or even enroll in the army to fight and die for our country.
The most sensible argument for the 21 age limit states that the law saves lives, citing statistics from the brief time in the 70’s when some states lowered the drinking age as a response to the Vietnam War, and alcohol-related fatalities went up. However, it’s a biased interpretation. The vast majority of deaths were because of drunk driving, and the solution to the problem is not to prohibit drinking (which, by the way, most people are going to do regardless of the law), but rather to educate people that they should never drive under the influence.
This brings up the parallel of sex and condoms. The argument used to be that one should not have sex before marriage, period. Of course, people would still engage in premarital sex, and with the growing spread of HIV and teen pregnancy, it became an issue much like drunk driving still is today. However, we moved past our moral block, and told people “If you’re gonna have sex, use a condom!” Through education, most people today now use condoms when they have sex outside of a serious relationship.
When we look at European countries where alcohol is much more accepted (I would drink wine with my family during meals, for example), we don’t see the delinquent apocalypse that nay-sayers predict for America, should we ever lower the restrictions. In fact, the alcohol-abuse situation is much worse in the USA, with the law, than in restriction-less Italy, or the rest of Europe. Prohibiting alcohol just adds extra incentive for youngsters wanting to rebel.
On the other hand, there are many disadvantages to the strict American laws, first of which is that it turns a great many teens into criminals, and prevents us from enjoying a drink or a party legally. Not only that, but it also makes it extra difficult for us to enjoy nightlife in great urban areas, to go out and enjoy our favorite bands or djs. Even for adults, other annoying laws force all alcohol sales to stop at a certain time, meaning that most venues will close at that time, cutting our night short at 2am, or whatever the time restriction I’d in your particular county / state.
I really think the US would do well to lower its drinking age to 18 and start to educate people on alcohol, rather than blindly prohibit its consumption.
Section 3.3.9 of Apple’s iPhone Dev Agreement
This worries me greatly.
iLaugh Premium is now available for the iPad.
When running on an iPad, it features a new interface thought out specifically for the iPad.
This version also fixes Facebook Share, for both iPhone and iPad.
Only the Premium edition has iPad support. There currently are no plans to bring the Lite edition to the iPad. So if you’ve been holding out for some great new features to buy the Premium edition, now is the time.
Check your updates, or if you don’t have iLaugh Premium yet, download it now!
Apple rejects iPad app for pinch-to-expand
An iPad app called Web Albums HD has reportedly been rejected from the App Store for including a pinch-to-expand feature in its Picasa albums viewing functionality. The developers allegedly hand-coded a pinch-to-expand feature for their galleries to match Apple’s official photo app, but were told by App Store editors that the feature was “associated solely with Apple applications.”
This is what scares me about developing for Apple’s closed App Store. I’ve experienced some nasty rejections, and there’s definitely no worse feeling than having to throw away your hard work because of Apple’s whim.
(via TUAW)
Relax, We'll Be Fine
David Brooks:
In sum, the U.S. is on the verge of a demographic, economic and social revival, built on its historic strengths. The U.S. has always been good at disruptive change. It’s always excelled at decentralized community-building. It’s always had that moral materialism that creates meaning-rich products. Surely a country with this much going for it is not going to wait around passively and let a rotten political culture drag it down.
Some optimism, at last!
The whole column is worth a read, and does a great job of illustrating what made me decide to move to the United States. This culture of entrepreneurship, innovation and community is what makes America the most successful country on earth. Of course, many will disagree, and I don’t deny that the US has many issues and drawbacks, but it also has a great foundation and spirit giving it immense potential.
Tethering your iPad to your iPhone
So you bought a WiFi iPad, and you already have an iPhone. You don’t want to pay extra for yet another monthly 3G subscription, and/or you don’t want to wait for the 3G iPad to come out later this month. Thankfully, you can use your iPhone’s 3G connection on your iPad using the following magic recipe.
You will need:
- A jailbroken iPhone. (Google for “blackra1n” if you need help with this)
- $9.99
- Optional ingredient: an extra battery pack for your iPhone, because this is pretty draining on the iPhone.
- A pinch of fairy dust to make things go extra smooth. (Just kidding about that one)
Search for the app MyWi on Cydia and install it. That’ll also install another package manager called Rock. You will have to create a Rock ID. This will allow you to have a free 10-day trial of MyWi, and then to purchase it using your credit card or PayPal account.
Using MyWi, create a WiFi network from your iPhone. You may want to give it a password, to prevent strangers from leeching off your connection. Connect from your iPad, and watch the magic happen. Don’t forget to turn MyWi off on your phone when you aren’t using it, or it’ll drain your its battery dry in no time.
Here’s what iLaugh for iPad looks like. Currently in review.
Andrew Kim’s square Coke bottle design - Core77:
Andrew Kim’s Coke bottle redesign is an ambitious take on the iconic bottle, going square in the name of eco-friendliness. The new bottle shape would take up far less space in shipping pallets per bottle, and a push-up in the bottom large enough to accommodate the cap of the bottle beneath it would enable stacking.
Great industrial design right there. I totally want to switch to these bottles.
iLaugh - Joke #18951
You see a gorgeous girl at a party. You go up to her and say, “I am very rich. Marry me!”
That’s Direct Marketing.You’re at a party with a bunch of friends and see a gorgeous girl. One of your friends goes up to her and pointing at you says, “He’s very rich. Marry him.”
That’s Advertising.You see a gorgeous girl at a party. You go up to her and get her telephone number. The next day you call and say, “Hi, I’m very rich. Marry me.”
That’s Telemarketing.You’re at a party and see a gorgeous girl. You get up and straighten your tie; you walk up to her and compliment her hair. You open the door for her, pick up her bag after she drops it, offer her a ride, and then say, “By the way, I’m very rich. Will you marry me?”
That’s Public Relations.You’re at a party and see a gorgeous girl. She walks up to you and says, “You are very rich…”
That’s Brand Recognition.You see a gorgeous girl at a party. You go up to her and say, “I’m rich. Marry me.” She gives you a nice hard slap on your face.
That’s Customer Feedback.
Working on iLaugh for the iPad. Sometimes I come across a gem I hadn’t read yet.
The birthing experience
Jean-Louis Villecroze:
I guess I should consider myself lucky to be able to said that the birth of our son was the most traumatic experience I have EVER lived. Clearly, I’m still shaken by it … Will I do it all over again? F*ck NO!
Often, I’ll hear people talk about how magical and/or miraculous the birth of a baby is and I roll my eyes. There’s nothing miraculous about it, People! It’s a gory painful mess!
The Neutrality Of This Article Is Disputed
Paul Carr:
This symbiosis – columnistists clamouring to write for newspapers, and newspapers needing great columnists to define their voice – is where the real key to the survival of newspapers lies. Rival papers, and bloggers and Twitterers may summarise and rewrite your news scoops, depriving you of readers, but they can’t do the same with your columnists. Personality is simply not reproducible – there’s only one Maureen Dowd and there will only ever be one Glenn Beck (inshallah) so if readers want to hear what they have to say, they have to go to the source. Moreover, while news ages rapidly, opinion doesn’t. A story published online by the New York Times is dated the moment it appears and people begin tweeting out the key facts, but a well-crafted opinion column has an infinite shelf life.
For all of these reasons, only the most imbecilicly terrified newspaper editor would heed Jimmy Wales’ advice and fire their most valuable assets. For all the others, there’s actually a compelling argument to do precisely the opposite. It’s comment and opinion, not news, that really adds value to newspapers in the Internet age – and as such the really smart editors will get rid of all their costly reporters and use the money instead to fill their pages with nothing but highly paid opinion columnists. Only then can newspapers be assured of their survival.
Paul’s brilliant weekly column is the only reason I’m still subscribed to TechCrunch.
Rad Omen - Rad Anthem (Official Music Video) 2010
Great song, awesome decadent video!
An Open Letter to James Cameron From Papyrus
Imagine my delight so many months ago at seeing the trailers and posters for this, your much anticipated return to science fiction movie making. To see the title AVATAR (all caps!) typeset in yours truly. Well, I practically wept. And to be rendered in such an artificial luminescent way… finally, in the hands of a true visionary such as yourself, my potential to look totally badass had been realized.
I almost puked when I saw yellow Papyrus being used for the subtitles in Avatar.
Mixed on Pi Day, hence the 3.14 title.
Tracklist:
Come Fly Away - Benny Benassi
Peferct (Vocal Mix) - Rob Lemon
Penthouse Bitch (12” 80s Dancefloor Mix) - Kid Dub & Dextress
Work Your Body - Original Mix - Hatiras, Bass Kleph
Europa (Original Mix) - Pryda
Drug Music (Toolroom) - Will Bailey’s Dirty Carnival Mix - Mark Knight
Justin Williams On PRMac's Ray Barber
Justin Williams:
I think my biggest pet-peeve by far is how PRMac handles itself in public. Anytime there is a question on the MacSB mailing list about advertising, press releases or anything remotely related, the site’s proprietor chimes in to plug his service. Just because you wrap your self promotion with :) doesn’t make it right.
As the creator of iPhoneSB, I’ve experienced the same thing. I’ve had to privately ask PRMac’s owner to tone down the self-promotion multiple times.
Gorillaz - Plastic Beach (Deluxe Version)
Just pre-ordered it on iTunes. So excited.
I get at least one email like this every day. I just ignore them.
My Proposed Solution to the App Review Situation
What if any app could be posted to the App Store instantaneously, without having to go through a review. Apple would still review each app, to even higher quality standards than currently. If an app is approved, it would receive some kind of “Apple-approved” badge. If denied, the app would live on, but without the badge. Apple would kindly provide the developer with a reason for why it was rejected, worded in english (as opposed to the legalese they use now).
Only approved apps would show up when one browses the App Store and in the rankings. Rejected apps could still be accessed through search (though approved apps would get priority in search results), and by knowing the iTunes store URL. Important updates (such as critical bug-fixes) would be instantaneous.
Users can opt to only allow verified apps on their phones, if safety is a concern to them. Developers have the security of knowing Apple won’t kill their business on a whim.
I had a great time at Temple Nightclub last Saturday night. Saw DJ Klaas, got to shake his hand while he closed his set with one of my favorite tracks ever, Infinity 2008 (Klaas Remix), by the Guru Josh Project.
Illustration: Digital Media, 1st part of the 2nd project.
This is the first part of the project. We chose a work from before the year 1800, and had to re-create it in vector using Illustrator. I chose this piece of ancient Japanese art.
16” * 28” full-color print.
Resist the urge to punish everyone for one person's mistake
Derek Sivers:
Nine years ago, one guy tried to light his shoes on fire on a plane. Now for all future time, millions of people a day have to queue up to take our shoes off at the airport, because of that one dumb moment.
[…]
It’s important to resist that simplistic, angry, reactionary urge to punish everyone, and step back to look at the big picture.
Flash Isn’t The Problem, Flash Design Is The Problem
Louie Mantia:
I’m sure a lot of people (in the United States) would love to watch [Hulu] on their iPad. Putting Apple’s iTunes business aside, I see the same interaction problem here. When watching a video on Hulu, after a few seconds, the playback controls fade away to give you the best experience of watching. How do you get the controls back? Simple! Move your cursor back over the video, and they appear. Not so easy on a tablet without a cursor. Sure, you say that you could just tap the video, right? Wrong. On Hulu, tapping on the video itself pauses the video. If on iPad, to bring up the controls to scrub or view in HD, you’d have to pause the video first. That sounds like a broken interface right there.
Even if we had flash for the iPad, we wouldn’t be able to use it comfortably.
A Short Case for Don’t Ask Don’t Tell
I think we’re missing the point. The Don’t Ask Don’t Tell policy doesn’t withhold any rights from gay men and women serving in the military. Serving in the army is a very tough job, and the soldiers need to focus on the job to be done rather than on their differences.
The policy is not asking gay men and women to lie, or renounce their sexual orientation. Rather, it’s about asking all soldiers to distance themselves from their personal feelings in order to give their full attention on the job to be done.
Ideally, this would not be an issue and the military would be able to function just as well with openly gay members, but the reality is that that would make other members uncomfortable, cause a division within the force and damage the social dynamic of the military.
Part of a project for 3D class. Abstract ink drawing on trace paper.
A quick drawing exercise for my Illustration 1 class.
Illustration: Digital Media project 1.
The brief was to digitally create a recognizable portrait of someone famous composed of other images stitched and manipulated together. (Kind of like a collage.)
18.5” * 24.5” full-color print.
A somewhat creepy sculpture on campus at the California College of the Arts.
Imagine a site or service that would analyze your whole Twitter stream and analyze each tweet to figure out your mood at the time. Imagine that it could aggregate that data, figure out patterns and report it in a meaningful way. Think of it as a Mint for your happiness rather than for your financials.
It could also help you correlate this data with other data, such as global / average happiness, Facebook data such as the friends you currently communicate most with or your relationship status, political and economical factors, your personal financials (by integrating with Mint), your eating habits, or anything else that could affect your happiness.
Many of us record our thoughts and feelings online through Twitter. When we’re happy, maybe because we just saw the greatest movie ever (Avatar), or because we had a great date with our significant other, we tweet about it. When we’re drunk, angry, frustrated, tired, relaxed and so on, we’ll tweet about it. That’s one huge pile of seemingly useless and insignificant thoughts – we’ve all heard the stereotype of the Twitter-addict who tweets about what he had for breakfast – but used and compounded as statistical data, it could be very powerful.
What Derek Powazek Hopes Apple Unleashes Tomorrow
Tomorrow, if the stars align, Apple could unleash a device that’s sexier than reading a magazine. A glossy screen like the iPhone, quality content in the iTunes store for a (hopefully) reasonable price, major publishes on board and independent publishers like me able to join in.
Here’s what I’m hoping for too, for tomorrow.
Sunset over a cemetery in Berkeley, CA.
Pretty good for an iPhone pic, wouldn’t you say?
What happens when you multiply beer advertisements with health care reform? You get awesomeness!
Apple’s iTunes Cloud Strategy
The Lala upload technology will be bundled into a future iTunes upgrade which will automatically be installed for the 100+ million itunes users with a simple “An upgrade is available…” notification dialog box. After installation iTunes will push in the background their entire media library to their personal mobile iTunes area. Once loaded, users will be able to navigate and play their music, videos and playlists from their personal URL using a browser based iTunes experience.
Apple will link the tens of millions of previously sold iPods, Touches, AppleTV and iTablets to mobile iTunes giving users seamless playback of their media from a wide range of Apple branded devices. Since media will be supplied from the user’s personal collection, Apple is freed from the hassles of device and region limitations. iTunes shoppers will be able to continue to buy music and movies as they can now with purchases still being downloaded, but once downloaded they will be automatically loaded to their mobile iTunes area for anywhere access.
I believe that’s a good analysis of what’s to come from iTunes and Lala.
Dear Mr BALLENEGGER,
I write to you further to the delay to your flight on the January 8, 2010. Please accept my sincere apologies on behalf of Air France for any inconvenience this delay may have caused. Let me assure you that the delay you experienced on this occasion was not in line with the high levels of service we aim to provide.
As gesture of genuine regret for the inconvenience suffered on this occasion, I am pleased to inform you that 2000 Miles will be credited to your Flying Blue account within the next few days.
I very much hope you will give us another opportunity to welcome you on our services and that your future flights with Air France will be to your entire satisfaction.
Yours sincerely,
AIR FRANCE
Customer Relations Department
This is the kind of customer service that makes me chose Air France.
Pop Software
Guy English:
The thing is these people don’t buy Applications, they download Apps. “Software” is dead, don’t bother putting that word on a sell sheet. Have you written “a program” recently? That’s nice, find a place in line behind all the other nerds but try not to step on the Coke-bottle glasses they tend to drop. “Oh … you’ve developed an application … is it something my doctor would know about”? People, lots and lots of people, people who have no idea what software even is, will download Apps like they’re snacking on potatoe chips. What’s my proof? Well, two million downloads of an App in a week supports that and I’d argue that a total of three billion Apps downloaded backs up my argument too. Also, I spell potatoe with an ‘e’, as God intended, so you know I’m right about this.
“Apps” is fun. It’s fun to say, it sounds unthreatening, it’s a word sufficiently abbreviated that it takes on a life of its own without dragging to the forefront of peoples minds the more sterile and technical sounding “application”. Apps are not Applications – they are their own things. They are smaller. They are more fun. Apps are treats atop your technological sundae. They are not potential time sinks. They are neither burden nor investment. They each represent a nugget of fun, of fleeting amusement. Apps are gobbled up in the millions by people who would never rush so willy nilly to buy desktop software. Apps are Pop Software writ large in blinking neon lights.
Dear Air France,
On my Jan 8th ‘10 flight from GVA to SFO with layover at CDG, I was scheduled to take off at 7:30 on the GVA-CDG segments. That 50min flight was late / delayed by almost an hour.
Once arrived at CDG, my connecting flight segment CDG-SFO was further delayed by several hours. It was scheduled to take off at 10:40, but only actually left at 14:00, over 3 hours late. I had to spend over two hours sitting in a minuscule seat while the plane remained by the gate.
While boarding, my initial boarding pass (REQ107) for the CDG-SFO segment, which had been printed at check-in in GVA airport, would not let me through the gate. Air France personnel had to print me another boarding pass (REQ283), after having me wait by the gate for over 10min.
With the new pass, my seat was changed from seat 45F, an aisle seat by the back of the plane which I had selected for its ease of access and movement, to seat 30A, an uncomfortable window seat above the wing. Even though I asked your staff if they could help me with my situation, they were unable to do so.
Additionally, during much of the flight, the entertainment system was not operational.
I consider myself a loyal Air France customer, having chosen you (or your SkyTeam partners) for over 10 long-range international flights spanning Europe, the United States, Japan and South Africa over the past two years.
You usually come across as a company that cares about its customers, and in previous occasions you were always willing to help when my travels did not go as smoothly as they should have.
In light of these events, and in the hopes that you have not lost your great corporate ethos, I would very much appreciate either a refund for my flight, or alternatively a miles credit to make up for this experience. Should you be so kind as to indulge me with the second option, might I suggest a credit of the remainder miles necessary for me to achieve Flying Blue Silver status, a goal I have been working towards since I signed up to the program last July.
Best regards,
Kenneth Ballenegger
A beautiful snowy sunrise at home in Switzerland.
Minim 2.0
Minim 1.0 was released over 3 years ago in November 2006. Since then it received just 2 updates, version 1.1 and 1.2. It suffered right from the start from my inexperience, not only at coding, but at creating a product that can sell. Since then I’ve released 2 successful products and become a much better developer.
So when it came to working on Minim 2.0, it made sense to treat it as an entirely new product. I used the experienced I’d gained over the past 3 years and re-designed and re-coded it from the ground up. I added some new features that weren’t in 1.x and took several features out that weren’t particularly useful. I made sure to justify everything that went into the app, rather than just saying “Well that would be cool” as I did with 1.x.
When it’ll ship, I could say pretty much the exact same thing about Exces 2.0.
Martin, congratulations on shipping! Minim 2.0 looks neat.
This is a house mix I made a while back. I’m kinda happy with how this one came out.
Tracklist:
Pornorama (Leggz & Femi B Club Mix) - The Mousseketeers
Slip And Slide (Original Mix) - Micha Moor
Fire Burning (Dave Aude Club Dub Mix) - Sean Kingston
Freaky Girl (Jay Style & Jeremy Hills Remix) - David Vendetta ft. David Goncalves
Don’t Call me Baby (Bootleg Mix) - Clint And Swood
Drawing 1 final project. 20” * 30”
(Sorry about the terrible picture. iPhone camera sucks.)
Intro to Graphic Design final project.
The brief was to design a poster for an design exhibition. We were each assigned a well-known designer or artist and had to create a poster that would display his or her style, without using any photography or direct reference to his or her work.
Intro to Graphic Design project 4.
The brief was to design a book cover for a book which had been assigned to us. I personally am not too happy with the result of this project either.
Intro to Graphic Design project 3.
The brief was to design a CD cover for a single. I personally don’t like the outcome of this project very much, and neither did my instructor: she only gave me C+ for this.
Intro to Graphic Design project 2. The brief was to make a word design that would convey the meaning of the word, using only letters from one of six typefaces. The letters could not be stretched or edited in any way. They could only be cut into, overlapped and used multiple times. I was assigned the word transient.
transient |ˈtran sh ənt; - zh ənt; -zēənt|
adjective
lasting only for a short time; impermanent : a transient cold spell.
Intro to Graphic Design project.
Brief was to design a logo / monogram based on my initials, using one of six typefaces as a starting point. We had to represent a personality trait within the design. I chose to represent being bold & modern.
Third dead body I’ve found today.
Funny thing is, I made this… Crazy weird art projects.
This year, I decided to forget about the typical “exercise more” resolutions which are almost always abandoned after a few weeks.
Instead, I’m going for a simple achievable and measurable goal: make one (20min minimum) dj mix per week. To that end, I ordered a Vestax VCI-100. Hopefully, putting down $400 on this new gear will motivate me to actually use it.
I’m moving to tumblr.
On my old “traditional” blog, there have been no posts in almost three months. A sad situation indeed. I keep telling myself I will try to blog more, and for a while, I keep it up. Yet, eventually, post frequency always dies.
My Twitter, on the other hand, is not abandoned. This leads me to believe that Wordpress, as a medium, might not be the best option to regularly post blog-like content.
Hopefully, the move to tumblr will prompt me to post more thoughts & articles, links with commentary and images from my college design work.
I’ve transferred the blog feed over to this new tumblr feed.
I’m not yet sure if I’m going to keep the old blog for article and releases like Warmonger. I’m inclined not to, but then I’d have to deal with transferring content over, and dealing with a bunch of broken links.
Comments are bad, and this new blog does not allow for comments. If you’d like to comment, tweet me or email me.