Wednesday, August 18, 2010

BSON Codec for Objective-C

Coded this up yesternight and tested/debugged it this afternoon. It passes my test cases so far but may still be hilariously wrong at the same time.

BSON, is "Binary JSON" - but it has almost nothing to do with JSON except in name and in its function. It encodes loosely structured data just like JSON, but the encoding output is not human readable. The advantages it has over JSON are two:
  1. JSON does not support binary data directly - you either have to send it via another channel or encode it to printable characters (e.g. via base64). BSON... supports binary data directly.
  2. BSON is less flexible in terms of data types. An independent BSON document must be a dictionary.
  3. Because each BSON document starts with its length, you can use it to pass loosely structured data over network sockets very easily.

The third point means you can have a client and a server passing messages to each other over a streaming socket (e.g. a TCP connection) with nothing more than just BSON documents. No extra layers of protocols or abstractions, no headers, no delimiters, no weird encodings, no extra handshakes, nothing.

Ok, if you need to authenticate your clients or encrypt the data, you still need to add something. But otherwise it's really simple and fast. Encoding a 1MB file to base64 on an iPhone isn't fast. Dumping the raw binary from memory to a TCP socket is fast.

So, here it goes...

//
// BSONCodec.h
//
// Created by Martin Kou on 8/17/10.
// Copyright 2010 Think Bulbs Ltd. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <stdint.h>

@protocol BSONCoding
- (uint8_t) BSONTypeID;
- (NSData *) BSONEncode;
+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID;
@end

@interface NSDictionary (BSON) <BSONCoding>
@end

@interface NSData (BSON) <BSONCoding>
- (NSDictionary *) BSONValue;
@end

@interface NSNumber (BSON) <BSONCoding>
@end

@interface NSString (BSON) <BSONCoding>
@end

@interface NSArray (BSON) <BSONCoding>
@end

@interface NSNull (BSON) <BSONCoding>
@end

//
// BSONCodec.m
//
// Created by Martin Kou on 8/17/10.
// Copyright 2010 Think Bulbs Ltd. All rights reserved.
//

#import "BSONCodec.h"
#import <ctype.h>

#define BSONTYPE(tag,className) [className class], [NSNumber numberWithChar: (tag)]

static NSDictionary *BSONTypes()
{
static NSDictionary *retval = nil;

if (retval == nil)
{
retval = [[NSDictionary dictionaryWithObjectsAndKeys:
BSONTYPE(0x01, NSNumber),
BSONTYPE(0x02, NSString),
BSONTYPE(0x03, NSDictionary),
BSONTYPE(0x04, NSArray),
BSONTYPE(0x05, NSData),
BSONTYPE(0x08, NSNumber),
BSONTYPE(0x0A, NSNull),
BSONTYPE(0x10, NSNumber),
BSONTYPE(0x12, NSNumber),
nil] retain];
}

return retval;
}

#define SWAP16(x) \
((__uint16_t)((((__uint16_t)(x) & 0xff00) >> 8) | \
(((__uint16_t)(x) & 0x00ff) << 8)))

#define SWAP32(x) \
((__uint32_t)((((__uint32_t)(x) & 0xff000000) >> 24) | \
(((__uint32_t)(x) & 0x00ff0000) >> 8) | \
(((__uint32_t)(x) & 0x0000ff00) << 8) | \
(((__uint32_t)(x) & 0x000000ff) << 24)))

#define SWAP64(x) \
((__uint64_t)((((__uint64_t)(x) & 0xff00000000000000ULL) >> 56) | \
(((__uint64_t)(x) & 0x00ff000000000000ULL) >> 40) | \
(((__uint64_t)(x) & 0x0000ff0000000000ULL) >> 24) | \
(((__uint64_t)(x) & 0x000000ff00000000ULL) >> 8) | \
(((__uint64_t)(x) & 0x00000000ff000000ULL) << 8) | \
(((__uint64_t)(x) & 0x0000000000ff0000ULL) << 24) | \
(((__uint64_t)(x) & 0x000000000000ff00ULL) << 40) | \
(((__uint64_t)(x) & 0x00000000000000ffULL) << 56)))


#if BYTE_ORDER == LITTLE_ENDIAN
#define BSONTOHOST16(x) (x)
#define BSONTOHOST32(x) (x)
#define BSONTOHOST64(x) (x)
#define HOSTTOBSON16(x) (x)
#define HOSTTOBSON32(x) (x)
#define HOSTTOBSON64(x) (x)

#elif BYTE_ORDER == BIG_ENDIAN
#define BSONTOHOST16(x) SWAP16(x)
#define BSONTOHOST32(x) SWAP32(x)
#define BSONTOHOST64(x) SWAP64(x)
#define HOSTTOBSON16(x) SWAP16(x)
#define HOSTTOBSON32(x) SWAP16(x)
#define HOSTTOBSON64(x) SWAP16(x)

#endif

@implementation NSDictionary (BSON)

- (uint8_t) BSONTypeID
{
return 0x03;
}

- (NSData *) BSONEncode
{
// Initialize the components structure.
NSMutableArray *components = [[NSMutableArray alloc] init];

NSMutableData *lengthData = [[NSMutableData alloc] initWithLength: 4];
[components addObject: lengthData];
[lengthData release];

NSMutableData *contentsData = [[NSMutableData alloc] init];
[components addObject: contentsData];
[contentsData release];

[components addObject: [NSData dataWithBytes: "\x00" length: 1]];

// Encode data.
uint8_t elementType = 0;
for (NSString *key in self)
{
id <BSONCoding> value = (id <BSONCoding>) [self objectForKey: key];
elementType = [value BSONTypeID];
[contentsData appendBytes: &elementType length: 1];
[contentsData appendData: [key dataUsingEncoding: NSUTF8StringEncoding]];
[contentsData appendBytes: "\x00" length: 1];
[contentsData appendData: [value BSONEncode]];
}

// Write length.
uint32_t *length = (uint32_t *)[lengthData mutableBytes];
*length = HOSTTOBSON32([contentsData length]) + 4 + 1;

// Assemble the output data.
NSMutableData *retval = [NSMutableData data];
for (NSData *data in components)
[retval appendData: data];
[components release];

return retval;
}

+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) t
{
const void *current = [data bytes];
if (base != nil)
current = *base;
else
base = ¤t;

uint32_t length = BSONTOHOST32(*((uint32_t *)current));
const void *endPoint = current + length;
current += 4;

NSMutableDictionary *retval = [NSMutableDictionary dictionary];
while (current < endPoint - 1)
{
uint8_t typeID = *((uint8_t *)current);
current++;

char *utf8Key = (char *) current;
while (*((char *)current) != 0 && current < endPoint - 1)
current++;
current++;
NSString *key = [NSString stringWithUTF8String: utf8Key];

*base = current;
Class typeClass = [BSONTypes() objectForKey: [NSNumber numberWithChar: typeID]];
id value = objc_msgSend(typeClass, @selector(BSONFragment:at:ofType:), data, base, typeID);
current = *base;

[retval setObject: value forKey: key];
}

*base = current + 1;
return retval;
}
@end

@implementation NSData (BSON)
- (uint8_t) BSONTypeID
{
return 0x05;
}

- (NSData *) BSONEncode
{
uint32_t length = HOSTTOBSON32([self length]);
NSMutableData *retval = [NSMutableData data];
[retval appendBytes: &length length: 4];
[retval appendBytes: "\x00" length: 1];
[retval appendData: self];

return retval;
}

+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) t
{
const void *current = [data bytes];
if (base != nil)
current = *base;
else
base = ¤t;

uint32_t length = BSONTOHOST32(*((uint32_t *)current));
current += 4 + 1;

NSData *retval = [NSData dataWithBytes: current length: length];
current += length;
*base = current;
return retval;
}

- (NSDictionary *) BSONValue
{
return [NSDictionary BSONFragment: self at: nil ofType: 0x03];
}
@end

@implementation NSNumber (BSON)
- (uint8_t) BSONTypeID
{
const char encoding = tolower(*([self objCType]));

if (encoding == 'f' || encoding == 'd')
return 0x01;
if (encoding == 'b')
return 0x08;
if (encoding == 'i')
{
// Ok, if you're running Objective-C on 16-bit platforms...
// Then YOU have issues.
// So, yeah, we won't handle that case.

if (sizeof(int) == 4)
return 0x10;
else if (sizeof(int) == 8)
return 0x12;
}
if (encoding == 'l')
{
if (sizeof(long) == 4)
return 0x10;
else if (sizeof(long) == 8)
return 0x12;
}
if (encoding == 'q')
return 0x12;

[NSException raise: NSInvalidArgumentException format: @"%@::%s - invalid encoding type '%c'", [self class], _cmd, encoding];
return 0;
}

- (NSData *) BSONEncode
{
const char encoding = tolower(*([self objCType]));

if (encoding == 'd')
{
double value = [self doubleValue];
return [NSData dataWithBytes: &value length: 8];
}

if (encoding == 'f')
{
double value = [self floatValue];
return [NSData dataWithBytes: &value length: 8];
}

if (encoding == 'b')
{
char value = [self boolValue];
return [NSData dataWithBytes: &value length: 1];
}

if (encoding == 'i')
{
int value = [self intValue];
if (sizeof(int) == 4)
value = HOSTTOBSON32(value);
else if (sizeof(int) == 8)
value = HOSTTOBSON64(value);
return [NSData dataWithBytes: &value length: sizeof(int)];
}

if (encoding == 'l')
{
long value = [self longValue];
if (sizeof(long) == 4)
value = HOSTTOBSON32(value);
else if (sizeof(long) == 8)
value = HOSTTOBSON64(value);

return [NSData dataWithBytes: &value length: sizeof(long)];
}

if (encoding == 'q')
{
long long value = HOSTTOBSON64([self longLongValue]);
return [NSData dataWithBytes: &value length: 8];
}

[NSException raise: NSInvalidArgumentException format: @"%@::%s - invalid encoding type '%c'", [self class], _cmd, encoding];
return nil;
}

+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) t
{
if (t == 0x01)
{
double value = ((double *) *base)[0];
*base += 8;
return [NSNumber numberWithDouble: value];
}

if (t == 0x08)
{
char value = ((char *) *base)[0];
*base += 1;
return [NSNumber numberWithBool: value];
}

if (t == 0x10)
{
int32_t value = BSONTOHOST32(((int32_t *) *base)[0]);
*base += 4;

if (sizeof(int) == 4)
return [NSNumber numberWithInt: value];

return [NSNumber numberWithLong: value];
}

if (t == 0x12)
{
int64_t value = BSONTOHOST64(((int64_t *) *base)[0]);
*base += 8;

return [NSNumber numberWithLongLong: value];
}

return nil;
}
@end

@implementation NSString (BSON)
- (uint8_t) BSONTypeID
{
return 0x02;
}

- (NSData *) BSONEncode
{
NSData *utf8Data = [self dataUsingEncoding: NSUTF8StringEncoding];
uint32_t length = HOSTTOBSON32([utf8Data length] + 1);

NSMutableData *retval = [NSMutableData data];
[retval appendBytes: &length length: 4];
[retval appendData: utf8Data];
[retval appendBytes: "\x00" length: 1];
return retval;
}

+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID
{
uint32_t length = BSONTOHOST32(((const uint32_t *) *base)[0]);
*base += 4;

const char *utf8Str = (const char *) *base;
*base += length;

return [NSString stringWithUTF8String: utf8Str];
}
@end

@implementation NSArray (BSON)
- (uint8_t) BSONTypeID
{
return 0x04;
}

- (NSData *) BSONEncode
{
NSMutableDictionary *tmp = [NSMutableDictionary dictionaryWithCapacity: [self count]];
for (int i = 0; i < [self count]; i++)
[tmp setObject: [self objectAtIndex: i] forKey: [NSString stringWithFormat: @"%d", i]];

return [tmp BSONEncode];
}

+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID
{
NSDictionary *tmp = [NSDictionary BSONFragment: data at: base ofType: 0x03];
NSMutableArray *retval = [NSMutableArray arrayWithCapacity: [tmp count]];
for (int i = 0; i < [tmp count]; i++)
[retval addObject: [tmp objectForKey: [NSString stringWithFormat: @"%d", i]]];

return retval;
}
@end

@implementation NSNull (BSON)
- (uint8_t) BSONTypeID
{
return 0x0a;
}

- (NSData *) BSONEncode
{
return [NSData dataWithBytes: "" length: 0];
}

+ (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID
{
return [NSNull null];
}
@end

I'll submit the code to Github, and add an open source license to it a bit later.

Update: I've posted the source code to GitHub, you can find it at http://github.com/martinkou/bson-objc

Monday, August 16, 2010

The Birth of Saycheeze

Think Bulbs haven't been blogging for a while now but we're excited to tell you that our 2nd iPhone product, Saycheeze, is live on the appstore and is doing quite well.

A year ago, our team really wanted to bring the idea of Purikura to the iPhone platform and we delivered. Thanks to all of you who supported, PURI became no.1 of free photography apps and stayed there for 2 months, garnering over 800,000 downloads.

We then thought could we possibly build a camera app that people will want to use everyday? When we looked around the appstore, many camera apps tell customers they have plenty of features. However, packing too many complicated features into one single app has compromised the usability and user experience.

We know user experience is key to any success of consumer products and simplicity and ease of use are often ingredients of great user experience. Therefore, we decided we would strip away all unnecessary features and provide only a few that would be core to users' usages and create a smooth and intuitive flow for the application.

Noticing that it's quite difficult to upload photos from iPhone to Facebook, we decided that it would be awesome if we could help users simplify and quicken the process of doing that. And the result of all these thought experiments is Saycheeze.

Thanks to Apple, we got featured fairly quickly in the New and Noteworthy category and subsequently in the What's Hot category. And day by day we climbed up the ranks of the photography category.

Despite the success, we know we're still far from being the only camera app that people need everyday. There are still features that we could and should build but sometimes we just couldn't do them due to the API's restriction.

It feels great building products that delight many users and we could only hope that users will continue loving them and tell us how they could be improved.

Wednesday, January 20, 2010

Engineering Virality Bootcamp

My notes for attending a bootcamp hosted at Stanford GSB on virality.

Julio from Experience Project
Virality: Degree to which something is propagated throughout a population.
Viral: Every affected person leads to at least one other being affected.
Buzz: Conversation generated among people from an event or action.

Left Brain (Quantitative) and Right Brain (Creative, Holistic) approach

The Hotmail example, Facebook platform (driven by invitations)

Andy Smith- Dragonfly model
Ripple effect- Small actions, big change, overtime
Emotional Contagion- Tendency to catch and share emotions
Dragonfly has four wings: Focus, Grab attention, Engage, Take Action
Focus- small, singular; action plan; concrete and specific; true to self; milestones; metrics
Grab attention- (missed this part)
Engage- Understand, tell a story, make it personal, mix media
Take action- Make it easy, fun, promote idiosyncratic, provide feedback, create independent action

Definition of virality: Think Spread, each outbreak begins with an individual, propagation is endogenous (self-sustaining), new infections grow with each generation
Conventional Marketing: Conversions= Prob of conversion x people exposed
Viral Marketing: Reproduction Rate= Transmission Rate x People told, must be >1 to be sustained
Viral leverage comes from increasing the transmission rate
Transmission Rate= Grab attention rate x Engagement Rate x Fit, Ease and Fun taking action

Fireside Chat- Matt, Dave, Ed
Dave- AARRR!: 5- step startup Metrics Model
Acquisition --> Activation--> Retention--> Referral--> Revenue
1 Page Business Model= Users + Conversions+ Priorities

Ed- Conversion Rate-> Engagement Rate--> Invitation Rate
Viral Factor= X*Y*Z
Conversion Rate: Percentage of invited users who install the app
Engagement Rate: Percentage of users who invite at least one friend
Invitation Rate: Average Number of invites sent per engaged user

Concept of A/B testing
Images are really important, using 99designs to see which images are clicked on the most
Tactical vs Long term goal; be cautious of initial messaging

For consumer web, scalable distribution, addictive user experience, design are key

Game mechanics, paid acquisition, social distribution- Zynga
Platform- think more in terms of distribution and monetization rather than features
Iphone apps will go viral first on facebook before on itunes store

Fireside chat- Jeff, Mark, Ben
Jeff invested in Tapulous and they discovered no virality at all on the platform; about 20 million installs
Bootstrapped marketing is all about personally touching people
Ben Katz- Rolodex: Smile, dial and rile; you are Billy Mays, Celebrities: they're just like you, Look big: sleep with Bill Gates, Leland and Yoko, Harness the groundswell: Press, video, social media, email
Getting on techcrunch is prime







Monday, January 4, 2010

Why Startup? (Part 2)


I've left part 1 of my passage on the blog without a continuation for 3 months. I'm feeling a bit sick today so I'm not really "in the zone" for programming, so I figured I should continue this little passage.

Common Misconception

One common perception among common people is that startup founders would become overnight millionaires - that can hardly be further from the truth. The ideal scenario doesn't happen most of the time.

If one founds a startup based on the assumption that his product or his contract projects would make his and his team overnight millionaires, then the very founding philosophy of that startup, is wrong. The superficial reason is that it's a very poor bet - it doesn't happen very often.

The real reason is that it breaks the team.

Why?

The reason of existence of such a company is making short term profit, so people joined the company in expectation of short term profit. What really happens with startups is that, 99.99% of the time, you won't see that short term profit in the beginning. For the remaining 0.01%, the revenue may drop significantly after just a few months (e.g. your army of Facebook users, just happened to have found something new to play with).

What happens to the team, then? It breaks. Team members expecting to get short term profits would go to do other activities giving them short term money.

Never Lose the Team

The most valuable thing that anyone participating in a startup can gain, is the team - it is risk-free and does not come with an interest rate. It's ok to lose money, it's ok to lose customers, but never lose the team.

One may be born awesome - one may have played computer games all day yet he got straight A at school; he went to exam venues with an evil maniacal laughter; he's a 1-in-1000 genius and he knows it.

But, being a 1-in-1000 genius, also means there're something like 1.4 million people who're just as evil-maniacally-smart as him in China, alone. The chance at success of one person alone, is never too good. And then it's impossible for most people to be a 1-in-1000 evil maniacally laughing genius, by definition.

But if you've managed to find a team of 5, who're "only" 1-in-50 smart - not really hard to find in universities coz they did the pre-screening for you - then you've just probabilistically got yourself a massive advantage over that lone evil maniacally laughing genius. And, obviously, 5 people can do more than just one person, and 5 people can specialize their talents (e.g. engineering, project management, market research, sales, etc.) into different areas of business so each one of them is less distracted while running a company.

Why Startup?

As a young 20-something, which includes myself, it doesn't really matter that the first or second startup attempts fizzle out. We may be poor and lack the social power of our older friends who've got high ranking political or corporate seats. But we have time.

We can do experiments, fail, think, try again; systematically eliminate things and ideas that do not work; build relationships and knowledge; build an awesome team that trust each other; look out for opportunities. Try, until succeed, the details don't matter. You can work without an office, you can work a part time job in McDonald's, you can even have another job at Google or IBM - it doesn't matter. Just stay in the game and snowball your advantage. You don't even have to be technically owning a company - e.g. you can be doing an open project in your free time and build a profit making service around it later - as long as you're making progress with your team, it's good. There's always a way, no matter how devious.

The biggest advantage of a 20-something is time. We are the ones who have the luxury to think and act long term, and reap the results. Have the cake and eat it. Just like we have the exponent advantage in the compound interest game, we also have the advantage in snowballing the talent and the experience. As anybody who has played any multiplayer game that involves two brain cells would know, the winners in the end are always those who took all possible advantages that the game can offer them. And that is the real meaning behind founding a startup for a 20-something - snowball advantages not available to our less aggressive friends - the team, the knowledge, the experience. When we win, it won't be because of fairness.

Saturday, October 24, 2009

Startup School 2009

I'm down at Berkeley for most of the day to attend Startup School, a very popular one day conference hosted by Y Combinator. The line up could be found on their homepage and I typed up notes for most speakers except two (too sleepy for that presentation and the other one wasn't that interesting...). There are about 700-800 technologists attending today.

Paul Graham

Paul asked founders who he funded about what have surprised them the most:

Emotional roller-coasters are much more extreme

Persistence is key

Think Long term

Lots of little things

Start with something minimal: over-engineering is poison

Engage users

Determination with flexibility: Fast iteration is key

Don’t worry about competitors

Expect the worst with deals

Investors are clueless

You may have to play games

Luck is a big factor

The Value of community

You get no respect

Things change as you grow: Roles of founders

Don’t expect startup is like a job

Summary: Overall, pretty good advice about what to expect when doing startups. The lines and quotes will be posted online soon. Many theories echo with the lean startup movement, which is all about iterating and launching fast and early.


Greg Mcadoo (Sequoia partner)

Economy doesn’t really affect the determination of entrepreneurs

Horrible economy headlines instead create innovation

- willing to try new things

- Often without choice

- especially trying to save money

- competition is less irrational

- landlords are ready to deal

- Everything is at fair price

- Recession rewards much more discipline

- Cash register Ringers: earn revenue early

- Committed Crew


Jason Fried (Founder of 37signals)

Bootstrapping- Day 1 bootstrapped company looks to make money, funded company looks to spend money

Practice making money, learn the art early

Funding is crap and an addiction

You can be as successful as you want to be on your own, don’t need others to anoint you

Best way to get feedback is to price it

Planning is Guessing

Useful > Innovative

Software has no edges

You can’t make just one thing

Apologize the right way: say sorry

Failure is not a rite of passage

Summary: Like last year, 37signals tries to debunk many glorious myths of being an entrepreneur. They are also big proponents of selling products for a price.


Chris Anderson (Chief Editor of Wired Magazine)

Freemium:

- Minority subsidize the majority

- Freeloaders cost little

- Free samples are the best marketing

- Multiple tiers of products

- Market segmentation

- Conversion = loyalty

Games: people will pay to save time, lower risk, things they love, status, if you make them

Feature Limited, Capacity Limited, Seat limited, Customer class limited

Summary: Talked about his freemium theory which is essentially different pricing structure with a free version for people to experiment. Quite applicable to the iphone platform and is what we're practicing with our PURI!


Paul Buchheit (founder of Friendfeed and gmail)

Limited life experience + Overgeneralization = Advice

Shared delusions in organizations if one works too long in it

Don’t be too comfortable

Way of internalizing knowledge is by trying and doing

Summary: Paul is obviously a brilliant entrepreneur. He had all the characteristics since he was young and his advice is to just do it and try things out because there isn't a formula to success and everyone has different background and circumstances.


Twitter (Evan Williams and Biz Stone)

So what if it’s just fun and not useful (think ice cream)?

The team likes the product and engages with it.

Engineering: Don’t go overly-clever

Make real effort of communication. Don’t assume you know what others are working on.

Advice they took is gut-checking

API is huge

Summary: Nothing too interesting here. They are probably hiding a lot of things that they couldn't share.


Mark Zuckerberg

Build an incentive structure to share information

Learnt from watching how people use the site

Went after the least receptive audience

A lot of mistakes could be overcome if you’re building something valuable

Management team has steadily evolved and improved

Focusing on technology culture

Google has a more academic culture

Facebook prides on building things fast, keeping a good engineer-user ratio etc.

Biggest risk you can take is to take no risk.

Be measured about doing things that are bold

He’s big on trends on openness and transparency

What tradeoffs are you willing to have to set the direction and values of the company?

Summary: First time listening to Mark speaking and I was impressed by his responses to most questions. He focused a lot on talking about Facebook culture and how it's different from that of Google. He's also big fan of iterating on both products and the management team.


Tony Hsieh (founder and CEO of Zappos)

Two books he recommended: Good to great, Tribal Leadership

Most parts of the talk are similar to the pitch that he gave at Stanford which I blogged some months ago.

What’s the larger vision and greater purpose in their work beyond money or profits?

Difference between Inspiration and Motivation

Don’t keep making compromises regarding hiring

Alignment: It doesn’t matter what your core values are…as long as you commit to them.

Vision and culture can inspire passion and purpose

Happiness: Perceived Control, Perceived Progress, Connectedness, Vision/Meaning

Types of Happiness: Pleasure/Rock Star (Chasing the next high), Passion/flow (Engagement- time flies), Higher purpose/Meaning (Being part of something bigger than yourself)

Summary: As usual, Tony loves talking about culture, vision and how Zappos could deliver Happiness to customers. This time, he has a little more analysis on Happiness and how we could break it down and analyze them.


Mark Pincus

- Control your destiny

- Aspire to be a great CEO


Tuesday, October 20, 2009

Treb Ryan, CEO of OpSource

Notes for Today's class featuring Treb Ryan (CEO of opsource.net):

- Cloud generation expectations: Immediate availability, sharing and collaboration, Ubiquitous Access
- Enterprise Storm Coming- Security and Compliance, Standards, Support, Management and Control, Performance
- Next CIO will demand the cloud
- Immediate availability = Complete Flexibility; No commits (can turn it off as fast as turn it on)
- Ubiquitous Access= Web+ Programability ; application can call infrastructure to work with increasing user or more need for CPU power etc; calling resources as you need it
- Sharing and Collaboration= Community Resources; users creating images
- Private Cloud not equals Enterprise Cloud
- Private Clouds are Virtual Environments Built on in-house infrastructure
- Security and Performance= Compliance and SLA's
- Standards= software and hardware
- Single User Systems= No Enterprise Control
-Multi User Systems= Management and Control; Private communities, Projects, Departments-->Centralized Control and Billing
- Sell additional support and services once customers use regular service (Good SaaS companies do this like Amazon)

Tuesday, October 13, 2009

Reid Hoffman

It's raining really hard today so I came in late to Hoffman's talk but here are some notes

Notes:

- He was mentioning the book Regional advantage
- Vision of modern career- individuals become a brand, small business, need network and manage their opportunity flows; what's my competitive edge?
- Theory of Internet: everyone is a publisher
- Linkedin on how work will happen globally across professional circles: Innovation happens when combining pieces and refining them. Trading work practices
- Most startup strategy is island hopping (finance, operations, finance...)
- Startup lesson: Trying to see something that others don't see (right now they think you're crazy but 2 years later everyone will be like duh...)
- Take competitive issues seriously
- Be willing to take a risk and be wrong
- Internet: Distribution, Distribution, Distribution
- Sites that get large can be thought of as platform for all kinds of things
- Part of entrepreneurship is just GO
- Philosophy applying to business is to think crisply but also think about possibilities
- Spent only 2000 on Adwords at the very beginning of company
- Virality: Create incentives to make it easy for others to share the site
- Zynga: how much fun social things are instead of Halo and other deep games. Chips as incentives.
- Very good to be focused, simple and clear to punch through the noise
- Don't do something that you think is just money

Archive