Arthur Chang

Too young and too busy with bettering your life?

You're young, maybe a kid with no responsibilities, or you're a young professional trying to pay back school loans or making a name for yourself.  Being young means you can take risks and take on huge challenges that your health, lack of responsibilities, and general recklessness allows.  Serious young professionals are those who won't accept general half-assery, and surround themselves in nothing but bettering their lives at 100%.

I think we all agree, that a studious student is better than one that gets kicked out of school because of grades, or a young professional landing huge deals and starting big companies is better than one who lives at home and watches TV all day.  But can we all just step back for one second and look at what's more than the "fastlane" you're trying to merge into?

I'm not going to suggest to look at the world in a third person view, say with the voice over of James Earl Jones, nor am I suggesting to take part in any notable issue that has some faint connection to you where it may "one day affect you negatively."  But there is a very big possibility that your ability to perceive the world as anyone other than you, is hindered by the fact that you only talk to senior partners at firms, CEO's with more connections than galaxies in this existence, or read super important news backed by media giants.

I once was told in a photography forum, by a "professional" photographer, that by volunteering my photography was complete insanity, and him probably feeling insulted that I volunteered and got gigs, told me that "I bet, no, I am absolutely certain, that whatever you do programming can be outsourced to someone who could do a better job for cheap."  OK, given that statement is probably the most ignorant and immature thing you could ever say, it shows a lot.  He has completely persuaed himself that what he heard once on the news about outsourcing programmers to China or India was becoming popular and and effective, is a blanket for all tech industries and programmers in the world.  He immediately knows exactly how the tech industry works and tells it as so.  But because he has never really met or talked to anyone other than "professional" photographers on a forum, he has no idea what I do.  And I think we can all agree that this may be his own fault.  He only cares about photography, that's all he reads, hears, and learns about.  And of course, I'm not saying he needs to know all about code and entrepreneurs in the tech world, but he should know better than to stay in his little cave, seeing little shadows on the wall and thinking that's exactly what life is like on the outside.  He has no idea!

Be careful to not be caught up bettering your own life, thinking you're young and this is your chance to become the next best thing, and missing out on everything going on around you.  Opportunities arise sometimes in not just bettering your life, but making part of your life understanding and bettering the lives of others.

Talk to people and understand industries you are not familiar with, maybe stuff you have never thought of being interested in could turn out to be an amazing untapped opportunity.  What if there's a way to make chopsticks even cheaper than they are now, with higher quality?  Sell to every single restaurant and you'll make way more than a Facebook app.  The simplest things in life can make the most out of your own.

*cue james earl jones voiceover machine* There are also noble causes that are very rewarding, and especially at a young age.  Saving the environment, or beginning to better your own life, by helping someone else with theirs.  I'm not saying donate money, but use that boyish or girlish energy to it's extent to help others with things they cannot on their own.  I have been to many Relay for Life events, which are annual fundraisers for the non-profit American Cancer Society, and I am sad to say I rarely ever see young professionals volunteering and helping out.

Why are the majority of the people kids, and older seniors?  Kids are forced to do community service, otherwise they'd be flirting with girls, playing on the jungle gym, or on their computers playing World of Warcraft.  Older seniors are way closer and more involved because cancer is more commonly found in older people.  Either because at a young age it wasn't treated, or just old age.  They've lived long enough to meet people who have been affected by cancer one way or another, and are there because they've been taken out of their cave in a very tragic manner.  Again, generalizing here a bit, there are exceptions... can you as a young professional be one?

Why wait to be dragged out of the world you've put yourself into?  There is absolutely no excuse for being too young and too busy to step out of your world to see opportunities to be rewarded outside of self achievement.

Stop narrowing your entire world to chasing your ideas and monetization plans, and observe the world outside of your own, learn about the way some things are, help other people in even the smallest of ways be able to live in the first place, and you will quite possibly find the reward you've always wanted, maybe in a different form or context, but equally fulfilling.

Being a customer, user, client of your own product is the best situation ever.  And being that person is not just a simple 10 minute talk or a single volunteering event, it's much more than that.  Really understanding what you're building something for has to be achieved by really being that kind of person.  And for the heck of your health and sanity, get out there and do something else once in awhile.

 

Tagged  //   startups  

Ideas are cheap, development easy, so why aren't we rich?

This isn't an article about my experience, it's not an article to promote anything I have, and by no means is this meant to tell you what you should think.  In fact, this has nothing to do with me, and I have nothing to gain by it.  Does that make you feel better about reading this?

There's this nervous community out on the internet right now, a niche of entrepreneurs who are also developers.  In a nutshell, people have coined this group of nerds and geeks, "hackers".  The work that these people do cannot be replicated, outsourced, or specced out.  These are the kind of weirdos who think of good, fun, and promising ideas, then execute with their own engineering abilities.

Coming up with a good idea is easy.  It's not as easy as sitting in your chair right now, taking a break from reading this article, and thinking for maybe 10 minutes to come up with something amazing.  Easy as in, anyone could do it.  Anybody can sit and read about the world's problems, and think of solutions for them, then researching or already knowing (look at you) technology that can actually provide real means to the solution.  It takes some time, and it takes a lot of brain juice, but other than some dedicated time, ideas cost nothing.  They're cheap.  You can trade them, give them out for free.

Development is pretty easy as well.  Again, not as easy as programming off a specification that has all the right decisions and business goals supporting it all, but any competent developer out there can make basically anything.  What are the limits here?  Hardware and other technological barriers?  Mostly.  Otherwise it all works.

So when you have a great idea, and you have a great developer, you can make something amazing.  Who cares?  That's the hard part.  The people who listen and like what you've made are those who already like you.  People who already know who you are, and you are an actual person to them.  Otherwise, if you have no crazy educational background, awards, job positions at big companies, nobody takes you seriously.  The benefit of the doubt is not given.  Every slight controversial or weak point in your product is seen as a direct reflection of the blemishes of your very existence.  Worst of all, if the idea is sound, and the development if more solid, people doubt you.  Reasons?  Competition sure, or is it the denial that another person could possibly make something cool other than you?  A person who has no name behind them?  No funding?  Can't be, the model must be flawed.

Sure I might be generalizing, or missing all the other great people who definitely don't think this way, but there's no doubt these kinds of feelings are present in a lot of communities of hackers out there.

So how do no names really get out there?  Well whatever the answer to that is, there are a few things you should not do.  Never, under any circumstance, try to promote your own product for yourself.  People hate you immediately.  If you're trying to sell something to somebody that makes you look good, makes you money, and might be useful to people, you will fail.  If it's useful, people will find a way where it's not useful.  If it's an amazing product, they will find the bugs and early issues and dismiss this as a newbie project that will get no recognition.  If that's the reaction of the masses, no PR like techcrunch would ever fathom writing something good about your product.

That's not to say you shouldn't build something useful, it's the approach of telling the world about it that's different.  Either you build something people think is fun, and they don't rely on, or you build something that will help others build their own projects better (stay away from Weddings, if you screw up the wedding, you've just messed up someone's entire life, hah).  If you help people become successful so they can make a stronger pitch, they love you.  Of course, if you make something ridiculously dumb, brainless, and worthless, they have no problem trying to prove their status over you with great suggestions of their own.  But if you have something great, make it sound like it's for the masses.

So what was just said?

 

  • Don't promote yourself thinking others will love it on their own
  • Approach promotion by twisting your product into a tool to help others build cool stuff and turn it around as their own
  • Build something fun, not serious at all, that has no tool or function that people can use.
  • Be humble, and kiss ass
That all sounds kind of shallow, but there is some dignified and honorable stuff you can do aside from all that.  Meet people, make friends, help create a community that supports one another, and really become a real person to as many people as you can.  It's the usual social skills you learn in any peer group.  Don't make enemies, make friends.  Help one another out.  Not every single move you make has to make you money.  Learn from others, and lend a helping hand when you can.  This is a slow process, meeting and making connections happens once every week maybe.  But it all adds up.

At Browseology, we built a few things, that once twisted as a tool for other hackers to use, got much better recognition, such as the collaboration shopping tool http://browseology.com or the ability to add prestitial messages to your own websites with http://kiw.is/

The hacker community needs to stay a community.  Support and community, really understanding one another is key.  We aren't rich because we have cheap ideas, or can develop easily, we are rich because we have friends and support.  We will never succeed with selfless promotion, so don't do it!  Don't go out to places like Hackernews, TechCrunch, Mashable, etc hoping to pitch your idea.  Instead go out there and see how your ideas will help others, to meet and integrate, connect, and provide something fun and interesting for everyone to be part of.

And always start everything out with a clear message: "This isn't for me, it's for you"

 

Under the Waterfall

Found a video on my harddrive taken by my girlfriend Issa while I was taking a picture of the underside of the Staubbach waterfall in Lauterbrunnen, Switzerland.  It's pretty wet, can't believe the flip mino didn't give way.  My camera did fine, it was actually getting hit by a constant stream of water, but the lovely weather sealing of the nikon didn't even flinch.  Below you'll see the photo I took and then a video of us up there.  I'll probably be posting a few of these videos along with the corresponding pictures as well in the next few days.  I'm editing these videos slightly with iMovie '09.  It's pretty neat so far.

 

Nikon D700 | Nikon 20mm F/2.8 | HiTech GND 1.2 | Hoya Circular Polarizer PRO1-D | Feisol CF Tripod | Manfrotto Ballhead | Northface ski jacket

Staubbach

 

Flip Mino HD | Girlfriend | Water everywhere | Church bells in the distance

The best weekends are those spent helping others

I had a great weekend helping out at the Los Gatos, CA Relay for Life event.  I'm happy my friend Win (Rearden Commerce) and Sonny (Apple) came to help out and volunteer with me.  Between helping out, I was able to take some pictures!  Today, the tear down and cleanup was the hardest.  Going to sleep last night at 4am after getting home shortly before from the event, and then waking up at 7am today to go back out there for the closing ceremony and cleanup, that was tough!  Now everything's cleaned up and stowed away, so I'm going to spend some time looking up some more Natural Language Processing stuff, as well as posting some pictures for you guys to see =)  I must be in a little kid shooting mode, because that's mostly what I took pictures of! You should view all my pictures from the event on Flickr here.

 

 

Survive

 

 

 

Thank goodness little babies can't stand by themselves for long, otherwise these expressions would not exist!

 

 

 

hope in the most sincere innocence

 

 

 

run

 

 

girl

 

 

 

Support

 

 

sweet

 

 

fight back

Tagged  //   photography   relay for life  

Using GTalk and XMPP to get online friends

Inviting a friend to join you in some real time application is an easy concept, but hard to do from the perspective of that real time app.  You need near instant response from a friend, and what better way than to find a friend who's online and available through protocols used by chat applications?

For a web application that only requires one request to find all online users, and then another request to send an invitation, a full fledged chat client is overkill.  Why build out a fully working client that scales with millions of connections, just to get a buddy list of all your online contacts?  Unless you're building Meebo you really don't need this.

I was trying to solve that very problem, invite online friends!  Google Contacts Data API did give me all the people in a Google contact list, but provided me nothing other than a last update sort.  Last updated contacts wasn't going to cut it.  So I turned to writing a XMPP type request.

Since I'm using the Ruby on Rails framework for this application, I decided to use the XMPP4R gem.  It's probably the most currently developed and up to date gem out there for XMPP and Ruby.

The Roster Helper that is bundled with XMPP4R has a handy way to get your initial buddy list, online and offline users alike.  The problem is, the XML response will not include presence updates.  The roster helper does do some kind of presence updates of it's own, but it was too inconsistent to use.  The correct way to deal with presence as an XMPP client would be to wait on a callback for presence updates.  The initial update would send you all of your online buddy's statuses.

First set up the Jabber client in order to connect to the GTalk XMPP server:

 

        cl = Jabber::Client.new(Jabber::JID::new(email))

        cl.connect('talk.google.com', 5222)

        cl.auth(password)

 

This above creates a new client connection with Google Talk.  The connect command accepts a server, which for GTalk is 'talk.google.com', and the port 5222.  5222 is the standard for most XMPP servers.  Next is the tricky part where you want to write a callback for presence updates:

 

# get the roster

        roster     = Jabber::Roster::Helper.new(cl)

        mainthread = Thread.current

        roster.add_presence_callback { |item,oldpres,pres|

  # code I left out in here populates the name, jid, and presence stuff

  # see the xmpp protocol response docs for specifics on how to get the info

          @list  << {:name => name, :jid => jid, :presence => pres.show.to_s}

        }

 

The roster is first initialized, and we set up a presence callback.  In this callback, we just populate a list of buddies represented as a hash.  Name is their nickname you've given your buddy, the jid is the jabber id.  In GTalk, the jid is actually just their email address.  Presence hash that I put together is actually their availability status, which can be one of the following: away, do not disturb, extended away, nil.  Nil is just available and online.  

Notice that we also save the current thread as our main thread, this is important because we're going to block this thread until we get a few seconds worth of initial presence updates:

        # send initial presence

        cl.send(Jabber::Presence.new.set_show(:dnd))

 

        # continue thread after timeout

        t = Thread.new { sleep XMPP_REQUEST_TIMEOUT; mainthread.wakeup;}

 

        # block thread

        Thread.stop

To get GTalk to start calling the callback function, send an initial presence of the current user.  In this case I'm sending do not disturb using the :dnd symbol.  The next section is where I create a new Thread, that sleeps for a specified number of seconds, then wakes the main thread up.  What does this all mean?  Well keep looking, right after I have that new thread created, I block the current one.  The current thread is the main thread, the one that's doing the fetching of online buddies.  The client's browser is still waiting until the mainthread starts up again.  Notice that we just wait for some amount of seconds before continuing, with NO indication of how many or if we have gotten all of our online buddies.  That is the shaky part.  I noticed that waiting 2 - 3 seconds gets all of my online friends, and using some "loading" graphic on the browser page keeps people from bailing out.  Each callback has it's own thread, so to keep them from spawning over and over again, we need to kill the client connection.

So the main thread blocks right where we say Thread.stop, and continues on to render the page after we wake the main thread up.  After we wakeup the thread, we immediately close the client connection, and go on to rendering the page with your populated list of online friends:

        # kill client connection

        cl.close

 

In the view code, we simply run through the array of friends and display their statuses.  We then allow people to click and invite their friends to the site immediately.

A lot of the code has been stripped out or simplified from what we've actually used, but you'll get the point.  If anyone has feedback, suggestions, or comments, please post them!  I'd love to see how to better solve this problem.

Tagged  //   code   xmpp   xmpp4r  

More from Lake Como, Italy

Went through a few more pictures from Lake Como.  Nothing that amazing.  I'm getting bored of my old photos, I need to get my camera fixed so I can go shooting again.  Below you'll see a Villa where they filmed parts of Star Wars Episode II, where Queen Amidala is hiding with that whiny Anakin Skywalker.  Also seen in the last scene of James Bond Casino Royale, where Bond shoots Mr. White in the leg.  Cool huh?

 

Villa on the Lake

 

 

_DSC0758

 

 

_DSC0855

Los Altos - Relay for Life 2009

Somehow I never uploaded these pictures I took at the Los Altos Relay for Life event!  I arrived early to help volunteer with some logistics.  They had everything so well organized that I barely had anything to do.  Then I just went around and took some pictures.  It was a hot morning, even at 9am, but there was a nice breeze coming through.  If you guys have never been to a Relay, I'd highly recommend dropping by a relay near you to help support the American Cancer Society and the cancer survivors and their loved ones.  It gives you a whole new perspective on life, and helps you and hopefully others become more aware of cancer.

 

Here are some photos I took: http://flickr.com/gp/kinetic/q11uF6

Teasers:

American Cancer Society, Relay for Life, Los Altos 2009

 

 

This is family support

 

 

Relay baby

 

 

"dude, check it, that dude's photographing us" "this may be a problem"

 

See all the photos here: http://flickr.com/gp/kinetic/q11uF6

Tagged  //   photography   relayforlife  

iPhone Photos

After Melissa forwarded me to Greg Schmigel's photography, I wanted a try at it too.  I truly believe that photography isn't about equipment, it's about composition and the process of getting the picture.  You can't make a good picture out of nothing.  There's a difference between a photographer, and someone who wants to be a photographer: The photographer goes and gets the picture, while the other does nothing.  Anyway, I went to SF MOMA and I got a pretty good picture of Melissa looking at a cool painting with real butterflies:

 

sfmoma

 

The big problem I was seeing was editing jpg's, I'm just not good at it.  All my processing experience has been with RAW files, so I'm finding it very difficult to get the same results.  The details are also hard to get out of a JPG.  This one was fun because she's moving while the rest is in pretty stable focus.  Fun shot in black and white.  I love it.

Tagged  //   photography  

Quick trip through Lake Como and Milan, Italy

After visiting Switzerland, Melissa and I headed over to Milan Italy, and Lake Como for a few days.  Have to go back, but here are a few of the pictures:

 

del porto

 

 

_DSC0427

 

 

_DSC0412

 

 

_DSC0341

Javascript Closures

I had a good conversation today that brought up Javascript Closures, which was me mostly having no idea what closures were, and the concept just being pretty hard to explain right off the bat.  Anyway, that all lead me to go checkout what closures are.

In a nutshell, Javascript Closures are most likely used in everyone's code already, and the actual technical aspect is not new, it just has a name.  But knowing about closures can be a powerful tool to avoid using gnarly global variables and needing to keep track of variables, parameters, and such that aren't necessarily needed all the time, globally.

A closure can be seen as an inner function within an outer function, where the inner retains the local variables, parameters, and what not of the outer function, even after the outer function has returned.

Some other ways to see it is that the closure can be a stack-frame that's not deallocated when when the outer function returns.

Again, that might be totally confusing, but take a common occurance as an example (example is using JQuery helpers, got the example from here):

function SetClassOnHover(className){
  $
("td").hover(
   
function () {
      $
(this).addClass(className);
   
},
   
function () {
      $
(this).removeClass(className);
   
}
 
);
}

What happens is, when the td gets a hover state, you add and remove the class names that were parameteres initially set in the SetClassOnHover function.  SetClassOnHover has already returned, yet when the hover observer is fired off, you still know the className.  That's how closures work!  Hope that makes sense, leave any comments feedback that you have to help clarify or correct.

Tagged  //   code   javascript