[{"content":"","date":"21 September 2020","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"After Gamcheon, we stopped by the hotel to pick up our luggage and headed to the Busan international airport. We arrived in Osaka close to 10. Most restaurants are closed, so we asked folks at the front-desk about where to get food at that hour, and they recommended the restaurant right in front of the hotel. It looked good, but I couldn\u0026rsquo;t really place an order because no one at the restaurant spoke English. So\u0026hellip;., it came down to the most basic form of communications - pointing at pictures. We got Okonomiyaki, Takoyaki, and some dish I don\u0026rsquo;t know what\u0026rsquo;s called. They were yummy!\nThe next day, we headed to Kyoto via bullet train to visit Arashiyama.\nArashiyama Bamboo Grove # I wanted the kids to have a chance to take a bullet train from Osaka, so I picked Kyoto, which is about 12 minutes via a bullet train. And when in Kyoto, you have to go to Arashiyama Bamboo Grove, which is probably the most iconic place in Kyoto. I\u0026rsquo;ve looked at photos online, and it looked serene with bamboos all around like below.\nHowever, when I got there, there was nothing serene about the place. There were just way too many people. We moved along with tons of people. Later I found out that you have to go really early in the morning to have the place all to yourself.\nTenryu-ji Temple # After a short stay, we went to Tenryu-ji Temple, which was right next to Arashiyama. It was a nice temple, and just like Arashiyama, it was crowded too.\nSubway # When we first arrived, we really had hard time figuring things out. Japanese subway systems are huge and complex, and Osaka stations (there are two because of two different lines, but their respective stations are close but not the same building.) are HUGE. But once we figured out, buying tickets was a breeze.\nOther photos of Japan # ","date":"21 September 2020","externalUrl":null,"permalink":"/2020/09/21/day-four-to-six-osaka-kyoto-arashiyama-tenryu-ji-temple-dotonbori/","section":"Posts","summary":"","title":"Day Four to Six: Osaka/Kyoto (Arashiyama, Tenryu-ji Temple, Dōtonbori)","type":"posts"},{"content":"","date":"21 September 2020","externalUrl":null,"permalink":"/tags/japan/","section":"Tags","summary":"","title":"Japan","type":"tags"},{"content":"","date":"21 September 2020","externalUrl":null,"permalink":"/tags/kyoto/","section":"Tags","summary":"","title":"Kyoto","type":"tags"},{"content":"","date":"21 September 2020","externalUrl":null,"permalink":"/tags/osaka/","section":"Tags","summary":"","title":"Osaka","type":"tags"},{"content":"","date":"21 September 2020","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"21 September 2020","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"21 September 2020","externalUrl":null,"permalink":"/categories/travel/","section":"Categories","summary":"","title":"Travel","type":"categories"},{"content":"","date":"21 September 2020","externalUrl":null,"permalink":"/tags/travel/","section":"Tags","summary":"","title":"Travel","type":"tags"},{"content":"","date":"21 September 2020","externalUrl":null,"permalink":"/","section":"Yang's Blog","summary":"","title":"Yang's Blog","type":"page"},{"content":"","date":"21 September 2020","externalUrl":null,"permalink":"/tags/busan/","section":"Tags","summary":"","title":"Busan","type":"tags"},{"content":"When we were done with dinner in Gyeongju, we took a train back to Busan and to our hotel. We were beat, so I think all of us had a good night.\nI woke up early on this day and took a walk outside to go to McDonald to get some breakfast. There were A LOT of bars and restaurants along the way to the McDonalds. It looked the area surrounding the hotel is pretty happening place.\nAfter breakfast, we packed out stuff, checked out, and left our bags at the front desk so that we can go to the Gamcheon Culture Village before heading over to Osaka, Japan.\nGamcheon Culture Village is known for narrow streets and steps, and public arts. It\u0026rsquo;s built on a hill, so it\u0026rsquo;s better to go to the top and walk down. There are helpful signs throughout, so it\u0026rsquo;s easy to find your way around. Here are some photos, but for all, you can visit my album.\n!\n\\[Creepy birds\\]\\[8\\] ","date":"21 September 2020","externalUrl":null,"permalink":"/2020/09/21/day-three-busan-gamcheon-culture-village/","section":"Posts","summary":"","title":"Day Three: Busan (Gamcheon Culture Village)","type":"posts"},{"content":"","date":"21 September 2020","externalUrl":null,"permalink":"/tags/gamcheon/","section":"Tags","summary":"","title":"Gamcheon","type":"tags"},{"content":"","date":"21 September 2020","externalUrl":null,"permalink":"/tags/korea/","section":"Tags","summary":"","title":"Korea","type":"tags"},{"content":"I recently took a trip to Korea and Japan with my two teenage kids. It had been 14 years since I left Korea after leaving Samsung, and at the time my oldest was three-years-old.\nI had basic itinerary for each day, and it turned out to be quite ambitious. We ended up doing one or at most two things on the itinerary, and it was good.\nOne thing kids complained the most was the amount of walking. Even when you take taxis everywhere, you will end up walking a lot, so you should make sure to wear comfortable walking shoes.\nThe followings are itineraries. Click on a link below to see specific post.\nDay One: Seoul (Gyeongbokgung, Insa-dong, Bukchon Hanok Village) Day Two: Gyeongju (Bulguksa) Day Three: Busan (Gamcheon Culture Village) Day Four: Osaka/Kyoto (Arashiyama, Tenryu-ji Temple, Dōtonbori) Pre-paid SIM card # One thing that I regret not getting in Korea was pre-paid SIM card. I have T-Mobile in the US, and my plan allowed unlimited data and text in both Korea and Japan, but only at 2G speed. It was SOOOOOOOO slow. Don\u0026rsquo;t make the same mistake.\nWhere do you get a pre-paid SIM card? # The easiest place to get it is at the airport.\nIf you didn\u0026rsquo;t get one at the airport, you can also get one at a convenience store (like GS25, 7-11, or CU). However, not all of them will carry one. And the clerks there didn\u0026rsquo;t understand pre-paid SIM card. Ask for \u0026ldquo;USIM\u0026rdquo; (Universal SIM) card. The only place I was able to find was in Gangnam area.\nAnother place to get one is at a carrier store (like KT). However, you can only buy it at a carrier store, not at an authorized reseller. There are a lot more resellers than carrier stores, and it was very confusing to me which was which.\nBest bet is at the airport. Just get one at the airport.\n","date":"21 September 2020","externalUrl":null,"permalink":"/2020/09/21/trip-to-korea-and-japan/","section":"Posts","summary":"","title":"Trip to Korea and Japan","type":"posts"},{"content":"On the day two, I planned to take a bullet train down to Busan, check into our hotel, and travel to Gyeongju (old capital city of Korea and about 30 minutes trip from Busan). However, when we arrived at Busan, I decided to store our luggage in a locker in Busan station and go straight to Gyeongju, instead of checking into the hotel first to save time.\nKTX # KTX operates the bullet train in Korea. It takes around three hours (as opposed to 5+ hours) to go from Seoul to Busan on one of the bullet trains. And it\u0026rsquo;s comfortable, quiet and some window seats do come with USB ports and power outlet. It cost around $50 per person for one way ticket, so it wasn\u0026rsquo;t the cheapest. But it\u0026rsquo;s an experience, so I was willing to pay.\nHowever, their English site SUCKS. OMG. It sucks big time.\nAs you can see, there is quite a bit of information missing from English page (like being able to select your seats and showing extra stations it will be stopping at). It is a bit cheaper and takes a bit longer if they stop at additional cities (stations).\nGyeongju # A KTX bullet train to Gyeongju from Busan takes only 30 minutes, but the major downside is that its station in Gyeongju is different from old station, and it\u0026rsquo;s quite far from the city and the major attractions. You can take a bus to the city from the station, but it departs every hour and takes too long. We are on a vacation, so I was willing to spend money on taxi ride. It\u0026rsquo;s even further to the Bulguksa temple we were trying to go.\nSeokguram # After we arrived at the station, I went over to the taxi stand and got in the first taxi there. An old man was driving, and when he heard that we were going to Bulguksa, he suggested that we go to Seokguram first since it\u0026rsquo;s close to Bulguksa and it\u0026rsquo;s up high in the mountain, it\u0026rsquo;s easy to see it and walk down the mountain to go to Bulguksa. I\u0026rsquo;ve been to Seokguram before, but that was more than 15 years ago, so I obviously couldn\u0026rsquo;t remember what it was exactly. He told me that going there will only 10+ minutes, but it didn\u0026rsquo;t hit me that it would also increase the taxi fare. I honestly couldn\u0026rsquo;t tell whether the taxi driver was trying to scam us for more taxi fare or genuinely trying to help us get the most of the trip. And since it was around 3-ish and Bulguksa closes at 6, he drove like a maniac.\nAfter entering a small structure where Seokguram is, I realized what it was. It\u0026rsquo;s a stone Buddha statue what was carved inside a rock, and it\u0026rsquo;s inside the the small structure in the photo above. Taking a photo inside was prohibited, so I couldn\u0026rsquo;t take a photo. There was also a small desk inside where a person was collecting dontation. You write your wish on a what looked like a guestbook, pay like $50, and they place it inside the cave next to the Buddha statue. I was like, how does that make wish come true? Another over-commercialization. Boo.\nIn the entrance of path way to Seokguram, there was a huge bell they let you ring for $1 donation, so of course, I went and rang it. You can see the video here.\nBulguksa # At the bottom of Seokguram is one of the most popular buddhist temples in Korea and has many National Treasures in display. Because it was close to Buddha\u0026rsquo;s birthday, they had colorful lanterns hung in the sky. Most of them had a piece of paper with names attached to them. I thought it would be cool to also put our names on there. But, when I approached a booth to ask how I could do it, they gave a few options and told me that more expensive ones were supposed to bring better/more luck. Sure, I suppose they have to make somehow and it probably costs money to hang all those lanterns, but I was appalled at selling \u0026ldquo;luck\u0026rdquo;. It just gave me bad taste in my mouth, so we decided not to do it.\nThere was a brass pig, and rubbing it is supposed to bring good luck, so we rubbed the hell of it. Look how shiny it is!\nBut the place was beautiful and luckily there weren\u0026rsquo;t many people in the temple.\nTraditional Korean dinner # After Bulguksa, we took a cab to a dinner place. In places Gyeongju, they have many restaurants that serve you traditional dinner - on a gigantic table.\n","date":"21 September 2020","externalUrl":null,"permalink":"/2020/09/21/day-two-gyeongju-bulguksa/","section":"Posts","summary":"","title":"Day Two: Gyeongju (Bulguksa)","type":"posts"},{"content":"","date":"21 September 2020","externalUrl":null,"permalink":"/tags/gyeongju/","section":"Tags","summary":"","title":"Gyeongju","type":"tags"},{"content":"","date":"24 July 2020","externalUrl":null,"permalink":"/categories/entrepreneurship/","section":"Categories","summary":"","title":"Entrepreneurship","type":"categories"},{"content":"It truly has been a while since I posted anything. Last post was in 2018!\nToday, I would like to introduce a new project I created, Listorio\nVariation of this project has been in my head probably since early 2000\u0026rsquo;s, when Internet popularity exploded (and businesses imploded). I\u0026rsquo;ve always wanted to create my list of anything, and put it out there in the internet to be found and shared.\nI just had this rush of wanting to create something, and this idea came back to me, so I spent about two weeks after working hours to create it. It does everything I want, so the next is to create a lot of my own lists and share them. I will try to market it different ways here and there, so I could test whether it\u0026rsquo;s something people want (like Y Combinator\u0026rsquo;s motto - Make something people want). I am a person, so it should count! :D\nHere are some lists that I had created.\nMy Favorite Videos online My Favorite Music Videos My wife\u0026rsquo;s home-cooked meals ","date":"24 July 2020","externalUrl":null,"permalink":"/2020/07/23/introducing-listorio/","section":"Posts","summary":"","title":"Introducing LISTORIO!","type":"posts"},{"content":"","date":"24 July 2020","externalUrl":null,"permalink":"/tags/list/","section":"Tags","summary":"","title":"List","type":"tags"},{"content":"","date":"24 July 2020","externalUrl":null,"permalink":"/categories/personal/","section":"Categories","summary":"","title":"Personal","type":"categories"},{"content":"","date":"24 July 2020","externalUrl":null,"permalink":"/tags/project/","section":"Tags","summary":"","title":"Project","type":"tags"},{"content":"","date":"24 July 2020","externalUrl":null,"permalink":"/tags/share/","section":"Tags","summary":"","title":"Share","type":"tags"},{"content":"","date":"24 July 2020","externalUrl":null,"permalink":"/categories/startup/","section":"Categories","summary":"","title":"Startup","type":"categories"},{"content":"","date":"24 July 2020","externalUrl":null,"permalink":"/tags/startup/","section":"Tags","summary":"","title":"Startup","type":"tags"},{"content":"","date":"24 July 2020","externalUrl":null,"permalink":"/categories/technology/","section":"Categories","summary":"","title":"Technology","type":"categories"},{"content":"First few days after arriving in Korea were spent meeting different relatives. After the obligatory meet and greets with relatives, we were able to go off on our own and explore.\nGyeongbokgung, Insa-dong, Bukchon Hanok Village are all located closed to each other (inside the red square), so it can easily be done in a day. It\u0026rsquo;s on the north side of Seoul (north of Han River). You can see Gangnam at the lower right side of the map.\nMakers Hotel # I booked this hotel because it looked really cute, had three beds (one twin and one bunk bed with two twins), close to places we wanted to visit. I booked all hotels with Chase Sapphire Reserve points on their points award site, which lacked good user experience. I had to go between the site and TripAdvisor site to make sure I wasn\u0026rsquo;t booking a roach motel. Nevertheless, it was a good choice. While the room was super tiny, we were only there to mostly sleep, it didn\u0026rsquo;t matter much. Location was perfect. Kids liked it too.\nFourB Roastery (Bagel place) # The hotel had breakfast buffet for about $10 per person, but it really didn\u0026rsquo;t look that good. So, I used MangoPlate app to find bakeries/cafes around my location (the app didn\u0026rsquo;t have breakfast category) and looked for ones that are open early in the morning. Interestingly most bakeries/cafes do not open until lunch time. :( FourB had good rating and it was on our way to Gyeongbokgung, so we stopped by here for breakfast.\nOMG. The bagels were phenomenal. As you can see in the photo, they bake their own bagels on the site. And those bagel makers (I don\u0026rsquo;t know what to call them really) wear chef hat and shirt!!!! Koreans always tend to take things to the extreme. Anyhow, it was very good and it was a good way to start the day. :)\nGyeongbokgung # We totally lucked out when we got there. It was around 11AM, and we were just in time to catch the change of the guard. You can actually see the whole video here. Even though it was Monday, it was packed.\nYou can see in the photo above that there are many people wearing traditional Korean dresses (한복, hanbok). You can rent them near the palace, and admission to the palace is free if you wear a traditional dress. Admission fee is around $6, so it\u0026rsquo;s not too bad if you have to pay the fee. We of course didn\u0026rsquo;t rent the traditional dress.\nThe palace covers a lot of ground, so I would recommend you wear a comfortable walking shoes.\nInsa-dong # This is a cool place to visit as a visitor to Korea because it\u0026rsquo;s filled with stores that sell souvenirs. I didn\u0026rsquo;t take any pictures, but I have a short video of our walk through the area here. We walked through here to get to Bukchon Hanok Village.\nBukchon Hanok Village # This is the first place I felt disappointed. It was supposed to be a small village of old style houses, but there weren\u0026rsquo;t whole lot of houses and it was full of tourists. The number of tourists shouldn\u0026rsquo;t have surprised me, but still, it totally ruined the whole experience. Not only that, because kids were really tired of walking and they were complaining a lot, we stopped by a nice looking tea cafe and ordered their desserts, but the owner told me that I also had to order a tea. I would have said that\u0026rsquo;s a bullshit and left, but since kids were complaining too much about walking too much, I said whatever and paid for a cup of tea. I guess it shows the over-commercialization of the area. Oh, well.\nWhile kids stayed at the cafe, I took a walk through the village, which I wasn\u0026rsquo;t too impressed with. We ended the day soon after. I planned to visit more places, but I had to end the day earlier because of kids\u0026rsquo; complaints. Oh, well. The life of a parent. :D\n","date":"25 May 2018","externalUrl":null,"permalink":"/2018/05/25/day-one-seoul-gyeongbokgung-insa-dong-bukchon-hanok-village/","section":"Posts","summary":"","title":"Day One: Seoul (Gyeongbokgung, Insa-dong, Bukchon Hanok Village)","type":"posts"},{"content":"","date":"8 July 2015","externalUrl":null,"permalink":"/tags/ascii/","section":"Tags","summary":"","title":"Ascii","type":"tags"},{"content":"","date":"8 July 2015","externalUrl":null,"permalink":"/tags/encoding/","section":"Tags","summary":"","title":"Encoding","type":"tags"},{"content":"","date":"8 July 2015","externalUrl":null,"permalink":"/categories/high-tech/","section":"Categories","summary":"","title":"High-Tech","type":"categories"},{"content":"","date":"8 July 2015","externalUrl":null,"permalink":"/tags/iso-8859-1/","section":"Tags","summary":"","title":"Iso-8859-1","type":"tags"},{"content":"","date":"8 July 2015","externalUrl":null,"permalink":"/tags/json/","section":"Tags","summary":"","title":"Json","type":"tags"},{"content":"","date":"8 July 2015","externalUrl":null,"permalink":"/categories/ruby-on-rails/","section":"Categories","summary":"","title":"Ruby-on-Rails","type":"categories"},{"content":"","date":"8 July 2015","externalUrl":null,"permalink":"/tags/utf-8/","section":"Tags","summary":"","title":"Utf-8","type":"tags"},{"content":"There comes a time for a developer to face a bug so weird that it leaves him/her speechless and scramble to find an answer wherever possible.\nAfter seemingly innocent deployment to production, I noticed huge spike in errors like the following:\nActionView::Template::Error: \u0026#34;\\xEB\u0026#34; from ASCII-8BIT to UTF-8 Offending line was JSON encoding of geo location information provided in request header by our cache provider. \\xEB happens to be ß character in ASCII, so it was probably some German city name.\nOur site\u0026rsquo;s character type is UTF-8, and Ruby 2.0\u0026rsquo;s default encoding is UTF-8. I also verified that Encoding.default_internal and Encoding.default_external are both UTF-8. It was our cache provider inserting non-UTF-8 character in request header.\nNo problem. I will just force UTF-8 encoding on the string.\nThen, I was faced with another kind of problems.\nActionView::Template::Error: partial character in source, but hit end Something is off.\nOff to the best debugging method in Ruby - print the string encoding. And it\u0026rsquo;s ISO-8859-1 (or Latin-1).\nSo, the final solution was to force ISO-8859-1 encoding and encode it again in UTF-8.\nstring.to_s.force_encoding(\u0026#34;ISO-8859-1\u0026#34;).encode(\u0026#34;UTF-8\u0026#34;) However, I am not 100% happy with the solution. It just smells. It works for now, but I need to look for better solution when I get a chance.\nFor bonus, check this out - \\[The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)\\]\\[1\\]","date":"8 July 2015","externalUrl":null,"permalink":"/2015/07/08/json_character_encoding/","section":"Posts","summary":"","title":"When JSON encoding does not play well with character encoding","type":"posts"},{"content":"","date":"3 April 2015","externalUrl":null,"permalink":"/tags/mongodb/","section":"Tags","summary":"","title":"Mongodb","type":"tags"},{"content":"At my current job, we use mongodb as our main database and as you can imagine we query our database a lot. The followings are what I found while investigating some slow performance. Hopefully it will prevent you from making the same mistake or pinpoint the source of problem quickly. We are using Rails 4 with Mongoid.\n1. Don\u0026rsquo;t use regular expression with /i in queries. # One of the offending query looked pretty innocent. Customer is embedded document with email attribute and email field is indexed.\ndef self.with_email(email) self.where(\u0026#34;customer.email\u0026#34; =\u0026gt; /\\Aemail\\z/i).count end When I ran Benchmark.bmbm where the method was repeated 100 times, it returned the following result.\nuser system total real 0.090000 0.010000 0.100000 ( 27.656723) Compare that with when you call the same without regexp.\ndef self.with_email(email) self.where(\u0026#34;customer.email\u0026#34; =\u0026gt; email).count end Performance result is day and night.\nuser system total real 0.080000 0.000000 0.080000 ( 0.122888) So, why the difference? I couldn\u0026rsquo;t quite figure it out myself. I knew that Mongodb uses B-Tree for index and index for email was already created. What about the regular expression was making it slow? I thought perhaps the anchor tags ( \\A and \\z) were causing it, but that wasn\u0026rsquo;t it. I tried using substring of email and anchoring the beginning of email string (using ^), but that didn\u0026rsquo;t yield difference either.\nI finally turned to Stack Overflow for assistance, and within a few minutes, someone provided exact answer I was looking for. They key to the answer was in output of explain method.\nLook at the nscanned and indexBounds in the output of explain method for the first method. It scanned all index because the upper and lower bounds are not defined ( \u0026quot;\u0026quot; and {}).\n{ \u0026#34;cursor\u0026#34; =\u0026gt; \u0026#34;BtreeCursor customer.email_1\u0026#34;, \u0026#34;isMultiKey\u0026#34; =\u0026gt; false, \u0026#34;n\u0026#34; =\u0026gt; 781, \u0026#34;nscannedObjects\u0026#34; =\u0026gt; 781, \u0026#34;nscanned\u0026#34; =\u0026gt; 500000, \u0026#34;nscannedObjectsAllPlans\u0026#34; =\u0026gt; 781, \u0026#34;nscannedAllPlans\u0026#34; =\u0026gt; 500000, \u0026#34;scanAndOrder\u0026#34; =\u0026gt; false, \u0026#34;indexOnly\u0026#34; =\u0026gt; false, \u0026#34;nYields\u0026#34; =\u0026gt; 1397, \u0026#34;nChunkSkips\u0026#34; =\u0026gt; 0, \u0026#34;millis\u0026#34; =\u0026gt; 406, \u0026#34;indexBounds\u0026#34; =\u0026gt; { \u0026#34;customer.email\u0026#34; =\u0026gt; [ [0] [ [0] \u0026#34;\u0026#34;, [1] {} ], [1] [ [0] /test/i, [1] /test/i ] ] } } Compare that to the output of explain method for the second method. Exactly the same upper and lower bounds, and it only scanned extremely small number of objects. This explains the big performance difference between the two methods.\n{ \u0026#34;cursor\u0026#34; =\u0026gt; \u0026#34;BtreeCursor customer.email_1\u0026#34;, \u0026#34;isMultiKey\u0026#34; =\u0026gt; false, \u0026#34;n\u0026#34; =\u0026gt; 230, \u0026#34;nscannedObjects\u0026#34; =\u0026gt; 230, \u0026#34;nscanned\u0026#34; =\u0026gt; 230, \u0026#34;nscannedObjectsAllPlans\u0026#34; =\u0026gt; 230, \u0026#34;nscannedAllPlans\u0026#34; =\u0026gt; 230, \u0026#34;scanAndOrder\u0026#34; =\u0026gt; false, \u0026#34;indexOnly\u0026#34; =\u0026gt; false, \u0026#34;nYields\u0026#34; =\u0026gt; 1, \u0026#34;nChunkSkips\u0026#34; =\u0026gt; 0, \u0026#34;millis\u0026#34; =\u0026gt; 0, \u0026#34;indexBounds\u0026#34; =\u0026gt; { \u0026#34;customer.email\u0026#34; =\u0026gt; [ [0] [ [0] \u0026#34;test@email.com\u0026#34;, [1] \u0026#34;test@email.com\u0026#34; ] ] } } 2. Don\u0026rsquo;t convert collection to array # Another slow performance was due to the following line of code. ProductA collection had about 20 documents and ProductB collection had about 2 documents. Another seemingly innocent code, but why?\nproducts = ProductA.all + ProductB.all Back to measuring performance with Benchmark (this time I just did it with Benchmark.bm).\nBenchmark.bm do |x| x.report {n.times {|n| products = ProductA.all + ProductB.all}} end user system total real 99.810000 2.630000 102.440000 (114.282440) Let\u0026rsquo;s confirm the performance of retrieval.\nBenchmark.bm do |x| x.report {n.times {|n| ProductA.all.count}} end user system total real 0.430000 0.000000 0.430000 ( 0.437339) Benchmark.bm do |x| x.report {n.times {|n| ProductB.all.count}} end user system total real 0.440000 0.000000 0.440000 ( 0.456449) That\u0026rsquo;s pretty reasonable performance. So, it must be something in the addition of two collections. When you add two collections using Mongoid, it returns an array, so it might be something related to converting to an array. Let\u0026rsquo;s check the performance on that.\nBenchmark.bm do |x| x.report {n.times {|n| ProductA.all.to_a}} end user system total real 110.070000 1.640000 111.710000 (117.081572) Ah-ha! Looks like we found the problem. Converting to an array is quite slow. In order to use single collection, without converting to an array, I created a parent class - ProductParent, and ProductA and ProductB would inherit from that class. In such way, one collection is used and subclasses are distinguished by just type field. Actually, it should have been parent/subclass structure since ProductA and ProductB are kinds of a Product, and both share many of the same attributes.\nAfter the re-arrangement, the following is the performance.\nBenchmark.bm do |x| x.report {n.times {|n| ProductParent.all.count}} end user system total real 0.480000 0.010000 0.490000 ( 0.490489) What a difference it made!\nFinding these two performance gotchas have been a fun journey, and I hope they are useful to you. Do you have any gotchas you have found? Let me know, and I will post a link here!\n","date":"3 April 2015","externalUrl":null,"permalink":"/2015/04/03/mongodb-query-performance-gotchas/","section":"Posts","summary":"","title":"MongoDB Query Performance Gotchas","type":"posts"},{"content":"","date":"3 April 2015","externalUrl":null,"permalink":"/tags/performance/","section":"Tags","summary":"","title":"Performance","type":"tags"},{"content":"","date":"3 April 2015","externalUrl":null,"permalink":"/tags/ruby-on-rails/","section":"Tags","summary":"","title":"Ruby-on-Rails","type":"tags"},{"content":"I have been taking a zen meditation class, which consists of one hour of meditation and one hour of buddhist teaching. I haven\u0026rsquo;t felt all the physiological benefits of meditation yet - I struggle to stay awake during meditation, but the buddhist teaching has been pretty interesting.\nIn one class, he used a quote from Enter the dragon to explain how you should not take the buddhist teachings literally.\nDon’t think. FEEL. It’s like a finger pointing at the moon. Do not concentrate on the finger, or you will miss all of the heavenly glory.\nIt made me think of my journey to reach 2nd-degree black belt in TaeKwonDo. It took me about three years in Korea, and as opposed to many TaeKownDo schools in the US, it was pretty intensive. Everyday, we start with practicing the same kicks and punches - white belts to black belts. You can tell the difference between kicks from white belts and black belts, but where the difference is starkly obvious is during sparring. So, how are they different? Higher black belts can do without thinking. It\u0026rsquo;s almost their 2nd nature or sixth sense. Their response or counter attack is very quick that sometimes their counter kick/punch lands before the opponent. Even as a 2nd-degree black belt, I still had to think about what opponent does and how I would react. I believe it comes from constant practicing.\nWhen I think about good developers I have witnessed/interacted with, they seem to see beyond surface of problems and are capable of coming up with adequate and correct solutions quickly. As I write more and more codes to solve more requirements and bugs, I began to recognize the pattern and past mistakes I have made which in turn has been enabling me to write better codes with less mistakes more quickly. I have been told that the best way to good at coding is by coding a lot and reading good codes. It\u0026rsquo;s probably not the case for all developers, but I believe the practice indeed make many developers better.\nI\u0026rsquo;ve practiced a lot of coding at Hacker Dojo (Dojo means a training place) and Ruby Koans (paradoxical questions to reach sudden intuitive enlightenment) helped me a lot in learning Ruby. Their similarities with martial art practices are quite keen.\nI will leave another quote of Bruce Lee, that\u0026rsquo;s also very relevant to coding.\n","date":"23 March 2015","externalUrl":null,"permalink":"/2015/03/23/practice-programming-like-you-practice-martial-arts/","section":"Posts","summary":"","title":"Practice programming like you practice martial arts","type":"posts"},{"content":"","date":"23 March 2015","externalUrl":null,"permalink":"/tags/reflection/","section":"Tags","summary":"","title":"Reflection","type":"tags"},{"content":"","date":"23 March 2015","externalUrl":null,"permalink":"/tags/software/","section":"Tags","summary":"","title":"Software","type":"tags"},{"content":"","date":"22 October 2014","externalUrl":null,"permalink":"/tags/cross-the-chasm/","section":"Tags","summary":"","title":"Cross-the-Chasm","type":"tags"},{"content":"","date":"22 October 2014","externalUrl":null,"permalink":"/tags/cs183b/","section":"Tags","summary":"","title":"Cs183b","type":"tags"},{"content":"I am having a great time listening to lectures for Stanford CS183B - How to start a startup online. All lectures have been extremely good, and it allowed me to get a sense of how Y Combinator accepted companies into its batches and what made them successful. I am learning so many things, and I see some common underlying themes I want to write about, but two lectures really struck a chord with me.\nBefore the Startup by Paul Graham and Business Strategy and Monopoly Theory by Peter Thiel, in my opinion, were dead on. Many startups were able to thrive on because many of their ideas seemed bad at the time. If you have an obviously good idea, then many people will go for the same idea. That leads to competitions. For consumers, competition is good, but for business not so. And in a sense, overarching goal of a business is to become a monopoly in its market.\nI find Peter and Paul\u0026rsquo;s main points similar to those of Crossing the Chasm and Innovator\u0026rsquo;s Dilemma.\nIn Crossing the Chasm, the author, Geoffrey Moore, argues that in order for disruptive technology company to survive, it needs to reach beyond technology pioneers and early adapters and move to early majority market. The gap between them is so great that many technology companies fail, and he named it \u0026ldquo;chasm\u0026rdquo;. What\u0026rsquo;s the strategy for crossing the chasm successfully? He coined the first market segment in early majority \u0026ldquo;beach-head market\u0026rdquo;. This is where company has to put all its resources and try to conquer. Company can get it wrong, of course, and it\u0026rsquo;s imperative that company finds this sooner than later so that it can correct its course, and hopefully new one is the right one.\nOne thing he emphasizes in conquering the beach-head market is to be the market leader. Who is market leader? I believe it\u0026rsquo;s synonymous to monopoly. You need to have at least 60% of the market share in the segment. Market leader has several advantages over #2 and #3 in the market. Because of its reach in the market, there will be auxiliary companies supporting the market leader, thus creating the whole eco-system. Often times, cost of changing product from leader to another is so great that it gives the leader leeway with its customers. After taking the leadership, it can expand to adjacent markets with money and time it earned being the market leader of beach-head market (he compared to going to adjacent markets as using the top pin in bowling to knock down other pins). If I remember correctly, Geoffrey Moore suggested the beach-head market be adequate enough for a startup to tackle.\nSimilarly, in Innovator\u0026rsquo;s Dilemma, the author, Clayton Christensen provides examples after examples, time and time again, a startup seems to come out of nowhere and take over the 900-lbs. gorilla of the market. What\u0026rsquo;s interesting is that companies in Clayton\u0026rsquo;s examples represent diverse markets - consumer, enterprise, and even to steel mills. They all had a few things in common.\nThey all started by attacking the market segment with much lower margin so market leader is happy to let them take it. Market leader is usually larger in size, and thus require much higher margin to operate and make profits. While market leader grows nominally by producing products for handful of larger customers, startup becomes leader in its segment and advances its products at faster rate. When the market leader notices startups\u0026rsquo; progress, it\u0026rsquo;s often too late and even its larger customers are ready to become startup\u0026rsquo;s customers.\nThose two books definitely shaped my views of startups, and Paul and Peter\u0026rsquo;s lectures seem to validate the books\u0026rsquo; main points. There are, of course, many other things that contribute to a startup\u0026rsquo;s success or failure - co-founder dynamics, team, culture, executions, and any external events. However, I believe, one thing is sure to attribute to startup\u0026rsquo;s success.\nIt could be that it\u0026rsquo;s a market segment on one cares or that the idea you are working on seems to be bad to everyone else. Whatever it is, startup needs to become a leader in market segment to survive and succeed.\nBecome a leader or monopoly in a market segment # ","date":"22 October 2014","externalUrl":null,"permalink":"/2014/10/22/importance-of-owning-a-market-segment-monopoly-market-leader-and-innovators-dilemma/","section":"Posts","summary":"","title":"Importance of owning a market segment - Monopoly, market leader, and innovator's dilemma ","type":"posts"},{"content":"","date":"22 October 2014","externalUrl":null,"permalink":"/tags/innovators-dilemma/","section":"Tags","summary":"","title":"Innovator's-Dilemma","type":"tags"},{"content":"","date":"22 October 2014","externalUrl":null,"permalink":"/tags/market-leader/","section":"Tags","summary":"","title":"Market-Leader","type":"tags"},{"content":"","date":"22 October 2014","externalUrl":null,"permalink":"/tags/paul-graham/","section":"Tags","summary":"","title":"Paul-Graham","type":"tags"},{"content":"","date":"22 October 2014","externalUrl":null,"permalink":"/tags/peter-thiel/","section":"Tags","summary":"","title":"Peter-Thiel","type":"tags"},{"content":"","date":"22 October 2014","externalUrl":null,"permalink":"/categories/strategy/","section":"Categories","summary":"","title":"Strategy","type":"categories"},{"content":"It\u0026rsquo;s been a couple of months since I joined Pebble as a full-stack web developer. Most of people know Pebble by its phenomenal success in its Kickstarter campaign - raising more than $10M. Pebble is also known as the company that started the smartwatch/wearable market.\nEver since I started, I have come to like a few watch apps and faces, and I\u0026rsquo;ve always wanted to create something on my own (since I like to build things). Even though we have a hack day every other week, I wasn\u0026rsquo;t able to participate because of things that needed to get done. But today was a special one. It was hack night, instead of hack day, and I was able to participate.\nIn today\u0026rsquo;s hackathon, I built a simple app that displays a short quote like Unix fortune using Pebble\u0026rsquo;s pebblejs and CloudPebble. It was super easy. Almost too easy. I don\u0026rsquo;t interact with our dev evangelist team much, I have new respect for those guys. They worked hard to make it easy for developers to develop apps on Pebble.\nI have shared my code on my github account. You should check it out, and it should be self-explanatory. Use pebblejs as reference to look up functions.\nhttps://github.com/yangtheman/fortunes_pebble_app\nHere we go.\n1. Enable Developer Mode on your mobile phone. On iPhone: Settings \u0026gt; Pebble \u0026gt; Developer Mode \u0026gt; On 2. Enable Developer Mode on Pebble mobile app. On iPhone: Pebble App \u0026gt; Settings (where you see My Pebble) \u0026gt; Developer \u0026gt; Enabled 3. Log in to CloudPebble using the same username and password as one you created when you first set up Pebble.\n4. Create a new project and select Pebble.js as Project Type.\n5. Click on app.js on the left column.\n6. If you want, you can leave the default code as it is. Or you can copy and paste my code in pebble-js-app.js. Don\u0026rsquo;t publish your app using my code as it is, but you are certainly welcome to try it out and tweak it!\n7. When you want to see the app run on the watch, click on the white Play button with green background on the right side of the screen. This should automatically compile and install the app on your watch. Make sure you have an empty slot in the locker on Pebble mobile app. If compile/install fails, toggle developer mode on Pebble mobile app as in step 2 above and try again. If you have any debug statements using console.log, you will see the log messages in \u0026lsquo;View Logs\u0026rsquo; as you interact with the app. 8. You can change your code and compile/run until you are satisfied. Next steps are for publishing the app on Pebble App Store.\n9. Get some screenshots from your watch app. From CloudPebble, click on COMPILATION link. Then click on SCREENSHOT button. It will take screenshot of what\u0026rsquo;s on the watch. Take a couple of different screenshots.\n10. Get the PBW file. In COMPILATION view, you will see a list of builds. You probably want to grab the latest one (assuming the last build is the one you want to publish).\n11. Log in to Pebble Dev Portal using the same username and password as one you created when you first set up Pebble, and click on Publish a Pebble App button.\n10. In our case, we are adding a watch app, so click on Add a Watchapp link on the left.\n12. Filling out the form should be pretty straight forward.\n12.1. For icons, make sure they are Black with White background. Do not use transparent background.\n12.2. Use the screenshots you downloaded earlier for screenshots.\n12.3. You can be as creative as your want for the header image.\n13. Once you are done, hit CREATE button at the bottom of the page.\n14. You are not quite done yet. Lastly, go down to Releases section and publish your first version. 15. After that you can make your app public by clicking on the Make Public button on the top right corner of the page.\n16. Ta-Da! Your app is ready on Android platform first. It will take a day or two to appear on iOS platform. There you go. You now successfully created and published the first app!\n","date":"18 July 2014","externalUrl":null,"permalink":"/2014/07/17/how-to-create-a-simple-watch-app-on-pebble/","section":"Posts","summary":"","title":"How to create a (simple) watch app on Pebble","type":"posts"},{"content":"","date":"18 July 2014","externalUrl":null,"permalink":"/tags/pebble/","section":"Tags","summary":"","title":"Pebble","type":"tags"},{"content":"","date":"18 July 2014","externalUrl":null,"permalink":"/tags/pebble-app/","section":"Tags","summary":"","title":"Pebble-App","type":"tags"},{"content":"","date":"18 July 2014","externalUrl":null,"permalink":"/tags/tutorial/","section":"Tags","summary":"","title":"Tutorial","type":"tags"},{"content":"","date":"12 October 2012","externalUrl":null,"permalink":"/tags/404/","section":"Tags","summary":"","title":"404","type":"tags"},{"content":"","date":"12 October 2012","externalUrl":null,"permalink":"/tags/500/","section":"Tags","summary":"","title":"500","type":"tags"},{"content":"","date":"12 October 2012","externalUrl":null,"permalink":"/tags/error-handling/","section":"Tags","summary":"","title":"Error-Handling","type":"tags"},{"content":"This came in handy for me, so I wanted to share this particular way of handling 404 and 500 errors.\nFirst, rescue errors and tell what to do in application_controller.rb.\nif Rails.env.production? unless Rails.application.config.consider_all_requests_local rescue_from Exception, with: :render_500 rescue_from ActionController::RoutingError, with: :render_404 rescue_from ActionController::UnknownController, with: :render_404 rescue_from ActionController::UnknownAction, with: :render_404 rescue_from ActiveRecord::RecordNotFound, with: :render_404 end end In the same application_controller.rb, then you create the methods specified above.\ndef render_404(exception) @not_found_path = exception.message respond_to do |format| format.html { render template: \u0026#39;errors/not_found\u0026#39;, layout: \u0026#39;layouts/application\u0026#39;, status: 404 } format.all { render nothing: true, status: 404 } end end def render_500(exception) logger.info exception.backtrace.join(\u0026#34;\\n\u0026#34;) respond_to do |format| format.html { render template: \u0026#39;errors/internal_server_error\u0026#39;, layout: \u0026#39;layouts/application\u0026#39;, status: 500 } format.all { render nothing: true, status: 500} end end Since it\u0026rsquo;s using the application layout, you will see the error message you specify in the layout. The following is my 500 error page, /views/errors/internal_server_error.html.haml. For 404 page, you can also use @not_found_path instance variable in the view as well.\n#errors-page .thumbnail.errors .errors-500 .caption %h5 Sorry %h1 500 Internal Server Error - # Do not remove this line. It is used for development - # purposes. When an error is found. In development, it - # shows the logs, in production it is nil. .error-msg = @log Cheers,\n","date":"12 October 2012","externalUrl":null,"permalink":"/2012/10/11/user-friendly-500-and-404-pages-on-rails-3/","section":"Posts","summary":"","title":"User-friendly 500 and 404 pages on Rails 3","type":"posts"},{"content":"Recently there were interesting articles beng circulated and discussed in the valley. One is Black Swan Farming by Paul Graham and the other one is Screw the Black Swans by Dave McClure. Interestingly enough, the fireside chat with Vinod Khosla at the TechCrunch Disrupt SF 2012 was a timely interview and speaks to the different viewpoints.\nI suspected, but was surprised to learn that out of all YC companies, Airbnb and Dropbox account for three quarters (3/4) in terms of about $10 Billion valuation. Paul was saying how difficult it is to pick a game changer winner. What makes it more difficult is how great ideas seem like bad ideas in the beginning. If an idea looks good, then everyone including large companies will work on it, and startups will have even less chance of succeeding. It\u0026rsquo;s when an idea seems bad and thus hard time getting funded, but at the end succeeds, it\u0026rsquo;s a game changer (homerun).\nVinod Khosla said pretty much the same. His fund looks for companies that will make tremendous impact when successful. It doesn\u0026rsquo;t matter when they fail. Founders will move on to a new project. But they don\u0026rsquo;t want to invest in companies that will make a little to no impact when successful. Again, Vinod is looking for a game changer (homerun) company.\nDave on the other hand is saying that 500 startups focus on Ichiro\u0026rsquo;s of the world (consistent hitting) rather than Barry Bond\u0026rsquo;s of the world (homerun king). He goes further into discussing the differences between YC and 500 startups (like hackers vs. hustlers), but my main takeaway was what kind of companies they were looking to fund.\nThese discussions made me think about how startups in emerging markets (including Korea) could do better. When babies are born, they learn mostly by imitating people around them. There is also an old saying, \u0026ldquo;Imitation is the best form of flattery\u0026rdquo;. Many amateur athletes also learn by imitating professional players (watching and learning). Korea is the only country I know best outside the US, and I always noticed the lack of virtuous seed funding cycle in Korea - successful founders seed investing in other startups. Once startup is up and running, and shows notable tractions, they can raise money from VCs and the process and valuation will be much better. However, startups often fail even before they could show traction because either they make multiple mistakes or run out of money before they can pivot. Without proper seed funding (and mentoring), they will have really hard time reaching the traction point.\nAt any rate, I think the best way for startups in Korea (or in emerging markets) to produce good enough winners to start the virtuous cycle is to imitate successful US startups in Korea (or in emerging markets), and after having a few successful exits, the founders can help other founders by investing and mentoring them. Furthermore, after successful exits, those founders would be in much better position to take bigger risk and attempt to make big impacts. In baseball analogy, it would be something along the line of having a few good seasons of hitting consistently, then you can swing for homeruns. No doubt those good seasons would be a confidence builder as well.\nI keep hearing how there are many incubators and accelerators popping up in Korea. Someone recently expressed a concern that it\u0026rsquo;s like a startup bubble and a few failures will have devastating effect on the whole startup movements. I think this type of imitation strategy will be good at least in the beginning. After there are good number of successful and experienced founders, they would be better equipped to make sounding decisions and also to help other up-and-coming founders. It would truly strengthen startup community in Korea (or in emerging markets).\n","date":"15 September 2012","externalUrl":null,"permalink":"/2012/09/15/best-way-to-learn-is-to-imitate-and-how-it-should-apply-to-startups-in-emerging-market/","section":"Posts","summary":"","title":"Best way to learn is to imitate (and how it should apply to startups in emerging markets)","type":"posts"},{"content":"","date":"18 July 2012","externalUrl":null,"permalink":"/tags/imagemagick/","section":"Tags","summary":"","title":"Imagemagick","type":"tags"},{"content":"I\u0026rsquo;ve had a lot of problems trying to install ImageMagick using brew. Use the following series of commands to install from source. Got this from Stackoverflow answer.\ncd /tmp curl -OL ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz tar -xzf ImageMagick.tar.gz cd ImageMagick-[VERSION]/ ./configure --prefix=/usr/local --disable-static --with-modules --without-perl --without-magick-plus-plus --with-quantum-depth=8 --disable-openmp --with-gs-font-dir=/usr/local/share/ghostscript/fonts make sudo make install ","date":"18 July 2012","externalUrl":null,"permalink":"/2012/07/18/install-imagemagick-on-lion-from-source/","section":"Posts","summary":"","title":"Install ImageMagick on Lion from source","type":"posts"},{"content":"","date":"18 July 2012","externalUrl":null,"permalink":"/tags/lion/","section":"Tags","summary":"","title":"Lion","type":"tags"},{"content":"","date":"18 July 2012","externalUrl":null,"permalink":"/tags/os-x/","section":"Tags","summary":"","title":"Os-X","type":"tags"},{"content":"Recently I watched Moneyball - a non-fiction movie about how Billy Beane at Oakland A\u0026rsquo;s used statistics to get most under-valued players and create the most valued (least amount spent per game) team in MLB. If you haven\u0026rsquo;t watched it, I strongly recommend it. I don\u0026rsquo;t usually shed tears watching a movie, but I did watching Moneyball. Moneyball! It wasn\u0026rsquo;t a Oscar-worth drama. Nor was it gut-wrenching tear jerker. But why did I cry watching the movie?\n*SPOILER ALERT!*\nBecause it was about one man\u0026rsquo;s lonely, uncertain fight against status quo under heavy pressure and criticism. Once a promising baseball player, Billy turned down a full scholarship to Stanford to join New York Mets as first-round draft for $125K. But he never became a top baseball player his scouts had predicted. He went through a number of minor leagues and other major league teams with not much to show for. He ended up at Oakland A\u0026rsquo;s, and he asked to become a scout. Later he became an assistant GM and a GM.\nHis push to use statistical analysis to pick players was controversial to say the least. He picked players against professional scouts\u0026rsquo; advice. The scene where he and another coach visiting Scott Hatteberg was touching, since you could tell from his house and his reaction afterwards, he probably thought he could never play baseball again, but he was so grateful for having been given another chance. First 40 or so games, Oakland A was dead last in its division. Pressure and criticism were directed to him from all directions. It looked like he was divorced and had a daughter who was staying with his ex-wife. He tried to hide the pain he was going through, but the daughter could still see everything was not quite alright.\nThen, the team started winning and became the first in its division. It had 19-game winning streak. On the game where they could have 20-game winning streak, they blew 11-0 lead at 11-11 tie. Then, Scott Hatteberg, the guy all baseball teams had written off as too injured to play, stepped up and hit a walk-off home run. They achieved 20-game winning streak.\nWhat\u0026rsquo;s more touching is when Billy turned down Red Sox\u0026rsquo;s $12.5M offer to stay with Oakland A\u0026rsquo;s because his decision to go with New York Mets was his last decision made based on money.\nAlso, another notable thing he said is \u0026ldquo;How can you not get romantic about baseball?\u0026rdquo; after some dramatic finish.\nIt may have to do with my personality - always rooting for underdogs, preferring hole-in-the-wall or local places to established places, etc., but the whole movie was touching to me because of its resemblance to startups. Not all startups are made up of under-valued coders/marketers, but I believe some are. Somewhere in a corporate world, there would be some who think their skills and opinions aren\u0026rsquo;t properly appreciated (not financially). I wouldn\u0026rsquo;t call entrepreneurs misfits, but they are definitely different. They know the odds of success is low (1 out of 10 or less), but they keep going against all odds, criticism, roller coaster emotions, and tremendous pressure. Most of them are in it to challenge status-quo and traditional way of doing things, and to disrupt the market. Often times, they are going against huge corporations with lots of cash. When one makes it, it\u0026rsquo;s a home run (but not always). Sometimes they will turn down a big offer to keep moving ahead because they believe in the products, company and the team. Many startups, whether they make it or not, have dramatic stories behind them.\nSeriously, How can you not get romantic about startups?\n","date":"24 April 2012","externalUrl":null,"permalink":"/2012/04/24/how-can-you-not-get-romantic-about-startups/","section":"Posts","summary":"","title":"How can you not get romantic about startups?","type":"posts"},{"content":"","date":"11 April 2012","externalUrl":null,"permalink":"/tags/bootstrap/","section":"Tags","summary":"","title":"Bootstrap","type":"tags"},{"content":"Twilio created cloud telephony services made mainly for developers. I\u0026rsquo;ve been meaning to figure out how to use their service, and I had a chance to develop a Ruby on Rails app using Twilio app called Phonein. You can check out the source code here. It\u0026rsquo;s nothing fancy, and totally not optimized. I also used Twitter\u0026rsquo;s Bootstrap CSS/JS package.\nWhile Twilio had a few samples for Ruby on Rails, it was kind of outdated and a few things were incorrect. I wanted to share what I did to use Twilio API to help you come up to speed quickly.\nBasically my app is for home-care professionals, and it allows them to check in and out using client\u0026rsquo;s phone. For Twilio, the followings are its requirements.\nIdentify client by phone number Identify home-care professional by 6-digit identification code Check in the home-care professional at the client\u0026rsquo;s location Read out tasks for the home-care professional Check out the home-care professional from the client\u0026rsquo;s location Twilio has its own markup language called TwiML, and in Twilio controller I created, TwiML is used to create views (or voices). I also created certain POST actions under Twilio controller that will receive input from phone (digits punched in by a person) and use it to look up information.\n1. Answer incoming call # When you sign up with Twilio, you can configure destination URL Twilio will invoke when it receives an incoming call. For mine, it would be \u0026ldquo;http://phonein.herokuapp.com/twilios/incoming\". So, I have \u0026ldquo;incoming\u0026rdquo; action defined in \u0026ldquo;Twilios\u0026rdquo; controller.\nController in app/controller/twilios_controller.rb\nJust like a regular Ruby on Rails app, controller gets objects ready for the view. It looks up client using the incoming phone number. If client is not found, it says (instead of displaying) an error message and hangs up. If client is found, it asks user to enter a 6-digit code. @post_to object contains URL that will be invoked after user interacts with Twilio. In our case, it\u0026rsquo;s after user enters code.\nclass TwiliosController \u0026lt; ApplicationController BASE_URL = \u0026#34;http://phonein.herokuapp.com/twilios\u0026#34; def incoming # Get client by phone number client_phone = params[\u0026#39;From\u0026#39;][2..params[\u0026#39;From\u0026#39;].size] @client = Client.find_by_phone(client_phone) if @client.nil? render :action =\u0026gt; \u0026#34;no_client.xml.builder\u0026#34; else @post_to = BASE_URL + \u0026#34;/verify?client_id=#{@client.id}\u0026#34; render :action =\u0026gt; \u0026#34;incoming.xml.builder\u0026#34;, :layout =\u0026gt; false end end end View in app/views/twilios/incoming.xml.builder\nxml.instruct! xml.Response do xml.Gather(:action =\u0026gt; @post_to, :numDigits =\u0026gt; 6) do xml.Say \u0026#34;Welcome to #{@client.name}\u0026#39;s residence. Please enter your 6 digit code.\u0026#34; end end View in app/views/twilios/no_client.xml.builder\nxml.instruct! xml.Response do xml.Say \u0026#34;Client could not be found.\u0026#34; xml.Hangup end 2. Verifies home-care professional, checks in, and reads tasks. # Next, look up the home-care professional by the 6-digit code. The numbers user punched will be in \u0026lsquo;Digits\u0026rsquo; parameter. If user is found but has not checked in before, it checks in the user and gives some options. If user has already checked in before, user is presented with a few options including an option to check out.\nController in app/controller/twilios_controller.rb In addition to incoming action.\nclass TwiliosController \u0026lt; ApplicationController def verify @client = Client.find(params[:client_id]) @agent = Agent.find_by_code(params[\u0026#39;Digits\u0026#39;]) if @agent.nil? # If no agent is found, say \u0026#34;no agent found\u0026#34; error message and hang up. @post_to = BASE_URL + \u0026#34;/verify?client_id=#{@client.id}\u0026#34; render :action =\u0026gt; \u0026#34;no_agent.xml.builder\u0026#34; return else if @agent.checked_in?(@client.id) @message = \u0026#34;You have already checked in.\u0026#34; else @agent.check_in(@client.id) @message = \u0026#34;Now you are checked in.\u0026#34; end end # Default action is direction @post_to = BASE_URL + \u0026#34;/direction?agent_id=#{@agent.id}\u0026amp;client_id=#{@client.id}\u0026#34; render :action =\u0026gt; \u0026#34;direction.xml.builder\u0026#34;, :layout =\u0026gt; false end end View in app/views/twilios/direction.xml.builder\nxml.instruct! xml.Response do xml.Gather(:action =\u0026gt; @post_to, :numDigits =\u0026gt; 1) do xml.Say \u0026#34;Welcome #{@agent.name}.\u0026#34; xml.Say \u0026#34;#{@message}\u0026#34; xml.Say \u0026#34;Please press 1 to read the task. Press 2 to check out. Press 3 to hear about Yang. Or Press 4 to hang up.\u0026#34; end end View in app/views/twilios/no_agent.xml.builder\nxml.instruct! xml.Response do xml.Gather(:action =\u0026gt; @post_to, :numDigits =\u0026gt; 6) do xml.Say \u0026#34;Agent could not be found. Please enter your 6 digit code.\u0026#34; end end 3. Read tasks, check out or hear about Yang # In addition to incoming and verify actions.\nThis is where main messages are configured and played. Depending on the option user chooses, it will either 1) say the tasks again, 2) check the user out, 3) say a few things about Yang, or 4) just hang up.\nclass TwiliosController \u0026lt; ApplicationController def direction @client = Client.find(params[:client_id]) @agent = Agent.find(params[:agent_id]) @message = @client.task_list @post_to = BASE_URL + \u0026#34;/direction?agent_id=#{@agent.id}\u0026amp;client_id=#{@client.id}\u0026#34; # 1 to hear the tasks again, 2 to check out, 3 to hang up. if params[\u0026#39;Digits\u0026#39;] == \u0026#39;1\u0026#39; render :action =\u0026gt; \u0026#34;direction.xml.builder\u0026#34;, :layout =\u0026gt; false elsif params[\u0026#39;Digits\u0026#39;] == \u0026#39;2\u0026#39; @agent.check_out(@client.id) @goodbye_message = \u0026#34;Thank you for your service today.\u0026#34; render :action =\u0026gt; \u0026#39;goodbye.xml.builder\u0026#39;, :layout =\u0026gt; false elsif params[\u0026#39;Digits\u0026#39;] == \u0026#39;3\u0026#39; @message = \u0026#34;Yang is the most awesome guy ever - both personally and professionally. He is pretty sexy, too.\u0026#34; render :action =\u0026gt; \u0026#39;direction.xml.builder\u0026#39;, :layout =\u0026gt; false elsif params[\u0026#39;Digits\u0026#39;] == \u0026#39;4\u0026#39; @goodbye_message = \u0026#34;Have a great day.\u0026#34; render :action =\u0026gt; \u0026#39;goodbye.xml.builder\u0026#39;, :layout =\u0026gt; false end end end View in app/views/twilios/goodbye.xml.builder\nxml.instruct! xml.Response do xml.Say \u0026#34;#{@goodbye_message}\u0026#34; xml.Say \u0026#34;Good-bye.\u0026#34; xml.Hangup end Have fun! # That\u0026rsquo;s it! My codes are so not refactored and optimized. I did it to see what I can do with Twilio app. I hope this gives you a tip of what you can do with Twilio API. Go bananas!\n","date":"11 April 2012","externalUrl":null,"permalink":"/2012/04/10/simple-ruby-on-rails-app-using-twilio-api/","section":"Posts","summary":"","title":"Simple Ruby on Rails app using Twilio API","type":"posts"},{"content":"","date":"11 April 2012","externalUrl":null,"permalink":"/tags/twilio/","section":"Tags","summary":"","title":"Twilio","type":"tags"},{"content":"","date":"11 April 2012","externalUrl":null,"permalink":"/tags/twitter/","section":"Tags","summary":"","title":"Twitter","type":"tags"},{"content":"","date":"11 April 2012","externalUrl":null,"permalink":"/categories/uncategorized/","section":"Categories","summary":"","title":"Uncategorized","type":"categories"},{"content":"","date":"9 February 2012","externalUrl":null,"permalink":"/tags/devise/","section":"Tags","summary":"","title":"Devise","type":"tags"},{"content":"","date":"9 February 2012","externalUrl":null,"permalink":"/tags/facebook/","section":"Tags","summary":"","title":"Facebook","type":"tags"},{"content":"This is an update to my last post about Facebook Connect with a Rails app. At the time I was using facebooker plugin (yeah, a plugin, not a gem), which has been discontinued for the longest time, and thus wouldn\u0026rsquo;t work with current Facebook connect.\nSince then, I\u0026rsquo;ve used omniauth, omniauth-facebook, and devise gems to implement Facebook connect with a few Rails app I have been toying with. So, this is kind of an update to my last post about integrating Facebook Connect with a Rails app.\n1. First, you need the following gems in your Gemfile. # gem \u0026#39;devise\u0026#39; gem \u0026#39;omniauth\u0026#39; gem \u0026#39;omniauth-facebook\u0026#39; gem \u0026#39;oauth2\u0026#39; Make sure you install them by running \u0026quot; bundle install\u0026quot; command.\n2. Next configure devise gem. # rails generate devise:install 3. Apply devise to a model. 99.9% of time, this would be the User model. # rails generate devise User 4. Next, generate authentication model with the following columns. Token column is extra, if you want to save an access token. # rails g model Authentication user_id:integer provider:string uid:string token:string 5. Configure omniauth by modifying config/initializers/omniauth.rb # Rails.application.config.middleware.use OmniAuth::Builder do # The following is for facebook provider :facebook, [APP ID], [SECRET KEY], {:scope =\u0026gt; \u0026#39;email, read_stream, read_friendlists, friends_likes, friends_status, offline_access\u0026#39;} # If you want to also configure for additional login services, they would be configured here. end 6. After user authenticates with whatever provider you specify, user needs to be redirected to omniauth call, so add the following line in your routes.rb. # match \u0026#39;/auth/:provider/callback\u0026#39; =\u0026gt; \u0026#39;authentications#create\u0026#39; 7. Then in Authentications controller, you figure out whether to create a new user or log the user in, if the user is an existing user. For complete hash, take a look at omniauth-facebook github page. # def create auth = request.env[\u0026#34;omniauth.auth\u0026#34;] # Try to find authentication first authentication = Authentication.find_by_provider_and_uid(auth[\u0026#39;provider\u0026#39;], auth[\u0026#39;uid\u0026#39;]) if authentication # Authentication found, sign the user in. flash[:notice] = \u0026#34;Signed in successfully.\u0026#34; sign_in_and_redirect(:user, authentication.user) else # Authentication not found, thus a new user. user = User.new user.apply_omniauth(auth) if user.save(:validate =\u0026gt; false) flash[:notice] = \u0026#34;Account created and signed in successfully.\u0026#34; sign_in_and_redirect(:user, user) else flash[:error] = \u0026#34;Error while creating a user account. Please try again.\u0026#34; redirect_to root_url end end end 8. In User model, store essential information with apply_omniauth method. # has_many :authentications, :dependent =\u0026gt; :delete_all def apply_omniauth(auth) # In previous omniauth, \u0026#39;user_info\u0026#39; was used in place of \u0026#39;raw_info\u0026#39; self.email = auth[\u0026#39;extra\u0026#39;][\u0026#39;raw_info\u0026#39;][\u0026#39;email\u0026#39;] # Again, saving token is optional. If you haven\u0026#39;t created the column in authentications table, this will fail authentications.build(:provider =\u0026gt; auth[\u0026#39;provider\u0026#39;], :uid =\u0026gt; auth[\u0026#39;uid\u0026#39;], :token =\u0026gt; auth[\u0026#39;credentials\u0026#39;][\u0026#39;token\u0026#39;]) end 9. In Authenication model, # belongs_to :user 10. In your view, user clicking on /auth/facebook/ link will be redirected to Facebook to log in. # \u0026lt;%= link_to \u0026#39;Login with Facebook\u0026#39;, \u0026#39;/auth/facebook/\u0026#39; %\u0026gt; 11. This method doesn\u0026rsquo;t do FB login in a popup. For that, you have to use FB Javascript SDK, and you can use the example here. # ","date":"9 February 2012","externalUrl":null,"permalink":"/2012/02/09/facebook-connect-with-rails-omniauth-devise/","section":"Posts","summary":"","title":"Facebook Connect with Rails (using Omniauth and Devise) [Update]","type":"posts"},{"content":"","date":"9 February 2012","externalUrl":null,"permalink":"/tags/oauth2/","section":"Tags","summary":"","title":"Oauth2","type":"tags"},{"content":"","date":"9 February 2012","externalUrl":null,"permalink":"/tags/omniauth/","section":"Tags","summary":"","title":"Omniauth","type":"tags"},{"content":"","date":"17 January 2012","externalUrl":null,"permalink":"/tags/chromebook/","section":"Tags","summary":"","title":"Chromebook","type":"tags"},{"content":"","date":"17 January 2012","externalUrl":null,"permalink":"/tags/cr-48/","section":"Tags","summary":"","title":"Cr-48","type":"tags"},{"content":"I have had a couple of first-generation Chromebook (CR-48) for a while. I thought these would be pretty good portable computing devices to give to my kids. However, I wasn\u0026rsquo;t ready to do so unless there was some sort of parental control. As someone who spends a lot of time online, it\u0026rsquo;s too rough place for kids to roam around. I have known about their support for dev mode, and I decided to figure out which linux flavor would support CR-48.\nFirst search attempt turned out Ubuntu, and since Ubuntu is known for better UI, I decided to give it a try. I also found out there is an excellent parental control guide on Ubuntu as well.\nInstall Ubuntu on Chromebook (CR-48) # There is no need to re-invent the wheel. Follow instruction here to put Ubuntu 11.04 on Chromebook (CR-48). It worked out like a charm.\nParental Control on Ubuntu # There is a great guide here, and I couldn\u0026rsquo;t get the Web Content Control to work. However, timekpr is pretty good. You should at least install that.\nFor filtering content, ProCon Latte Content Filter Firefox Add-on has been working pretty well.\nSo far, I have been happy with Ubuntu on CR-48. It\u0026rsquo;s slow and keypad doesn\u0026rsquo;t work too well, but I think kids are just happy to have their own laptops. :)\n","date":"17 January 2012","externalUrl":null,"permalink":"/2012/01/17/how-to-install-ubuntu-on-chomebook-cr-48-and-put-parental-control/","section":"Posts","summary":"","title":"How to install Ubuntu on Chomebook (CR-48) and put parental control","type":"posts"},{"content":"","date":"17 January 2012","externalUrl":null,"permalink":"/tags/parental-control/","section":"Tags","summary":"","title":"Parental-Control","type":"tags"},{"content":"","date":"17 January 2012","externalUrl":null,"permalink":"/tags/ubuntu/","section":"Tags","summary":"","title":"Ubuntu","type":"tags"},{"content":"I have two kids, and I have been wanting to find ways to introduce my kids to programming. Especially for my son, who has asperger syndrome. I thought programming would be a good way to use his interests in logic and mathematics to good use.\nI was so much in joy when I found KidsRuby. It\u0026rsquo;s an awesome project. I think Ruby is a great first language because of its elegance and object-oriented nature to the core.\nPreviously I had a hard time installing KidsRuby my Mac OS X, due to qt installation error. I was able to at least get it going by cloning their git repository. I had filed a bug for the qt installation error, and the author responded some time ago, but I hadn\u0026rsquo;t had time to verify it.\nI finally had time to verify it, and it worked like a charm.\nI also had converted two first-generation Google Chromebooks to use Ubuntu to give to my kids. And while I was familiar with Fedora, this was my first time using Ubuntu, and as new user, I had to search around the net to install Ruby and to install KidsRuby. I am close to finishing it, and I will describe it here.\nMac OS X # This one is pretty easy. Just download the installer dmg file from here, and follow the instruction. It will take a while, but it would be well worth it. You can find the KidsRuby folder in Application folder.\nUbuntu # Now, this one took a while. If you have Ruby installed already, you are good to go. If not, follow the direction below.\nIf Ruby isn\u0026rsquo;t installed # You can simply follow the direction from Ryan Bigg to install Ruby 1.9.3.\nIf Ruby is already installed # I am not sure which version of Ruby is supported, but this applies to Ruby 1.9.3.\nThe biggest problem I faced was the problem with ffi gem. I kept getting the following error.\nInstalling ffi (1.0.10) with native extensions Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension. /usr/bin/ruby1.9.1 extconf.rb :29:in `require\u0026#39;: no such file to load -- mkmf (LoadError) from :29:in `require\u0026#39; from extconf.rb:4:in `\u0026#39; Gem files will remain installed in /usr/share/kidsruby/ffi/ruby/1.9.1/gems/ffi-1.0.10 for inspection. Results logged to /usr/share/kidsruby/ffi/ruby/1.9.1/gems/ffi-1.0.10/ext/ffi_c/gem_make.out An error occured while installing ffi (1.0.10), and Bundler cannot continue. Make sure that `gem install ffi -v \u0026#39;1.0.10\u0026#39;` succeeds before bundling. After searching the net for a while, I realized that I needed to install \u0026ldquo;-dev\u0026rdquo; package as well. Since I am using 1.9.3, I had to install ruby1.9.1-dev.\nsudo apt-get install ruby1.9.1-dev After that you can clone the git repository and install necessary packages.\ngit clone https://github.com/hybridgroup/kidsruby.git cd kidsruby sudo apt-get install libqt4-dev sudo apt-get install cmake gem install qtbindings bundle install The bundle install part will take a while.\nFor the lesson part, I had a surprising result - my son totally lost interest very quickly, but my daughter was more into it. :)\n","date":"17 January 2012","externalUrl":null,"permalink":"/2012/01/17/how-to-install-kids-ruby-on-mac-os-x-and-ubuntu/","section":"Posts","summary":"","title":"How to install KidsRuby on Mac OS X and Ubuntu","type":"posts"},{"content":"","date":"17 January 2012","externalUrl":null,"permalink":"/tags/ruby/","section":"Tags","summary":"","title":"Ruby","type":"tags"},{"content":"When I first read TechCrunch\u0026rsquo;s article on Diaspora co-founder Ilya Zhitomirskiy\u0026rsquo;s death, I didn\u0026rsquo;t think much of it except that it didn\u0026rsquo;t mention anything about the cause of the death. It usually means only thing, and my suspicion was confirmed by hacker news thread.\nhttp://news.ycombinator.com/item?id=3231531\nWhat I particularly noticed about the thread was discussion of failure and stress of founding a startup and other suicides by very smart folks. It also reminded me of earlier tragic passing of a co-founder of a Y-Combinator-funded company and the article I read on WIRED magazine about two AI scientists committing suicides almost in identical ways.\nChris McKinstry and Pushpinder Singh\nhttp://www.wired.com/techbiz/people/magazine/16-02/ff_aimystery?currentPage=all\nDan Haubert\nhttp://news.ycombinator.com/item?id=859117\nGene Kan\nhttp://en.wikipedia.org/wiki/Gene_Kan\nThis one also struck me pretty hard, who updated his resume before he took his life. It said, \u0026ldquo;Summary: Sad example of a human being. Specializing in failure.\u0026rdquo; If an accomplished person thinks his/her life was sad example of a human being, how should the rest of us feel?\nI would never know why these guys did what they did. But for me, I have one thing that would prevent me from thinking about it. It\u0026rsquo;s my kids and my family to an extent. It\u0026rsquo;s a double-edged sword. On one side, it\u0026rsquo;s the reason for not being able to take huge risk, but on the other side, it\u0026rsquo;s the reason for my sanity no matter how shitty my life is at any given moment (and my life right now isn\u0026rsquo;t all that spectacular).\nAlso, we should also keep things in perspective. In grand scheme of this universe, we are just small part of green/blue spec called Earth. You shouldn\u0026rsquo;t care about and be afraid of failures/rejections. Who cares? People will forget and move on. I think it\u0026rsquo;s courageous and commendable to just try. Regardless of outcome, having tried something sets you ahead of many others.\nJust remember the following quotes.\n\u0026ldquo;Regret for the things we did can be tempered by time; it is regret for the things we did not do that is inconsolable.\u0026rdquo;\nAlso, especially this one.\n\u0026ldquo;It is not the critic who counts; not the man who points out how the strong man stumbles, or where the doer of deeds could have done them better. The credit belongs to the man who is actually in the arena, whose face is marred by dust and sweat and blood; who strives valiantly; who errs, who comes short again and again, because there is no effort without error and shortcoming; but who does actually strive to do the deeds; who knows great enthusiasms, the great devotions; who spends himself in a worthy cause; who at the best knows in the end the triumph of high achievement, and who at the worst, if he fails, at least fails while daring greatly, so that his place shall never be with those cold and timid souls who neither know victory nor defeat.\u0026rdquo;\n","date":"18 November 2011","externalUrl":null,"permalink":"/2011/11/18/never-never-give-up-on-your-life/","section":"Posts","summary":"","title":"Never never give up on your life","type":"posts"},{"content":"Most people need to do this only when they get a new system. I had to go through this to help out a potential brogrammer, and it would have been much easier if I pointed him to one place where he could just following direction. Instruction here applies to Mac OS X 10.6.x.\nFor Windows users, use the convenient installer done by guys at EngineYard from here (http://railsinstaller.org/) to install Ruby, Rails, etc., and installer from Postgres from here (http://www.postgresql.org/download/windows/) to install Postgresql.\n1. Install Xcode # Xcode is included in the Mac OS X install disc. You can install from the DVD or you can down load it from here, http://developer.apple.com/xcode/. If you already have xcode installed, you are good to go.\n2. Install Git # Download and install git if you don\u0026rsquo;t have one already. Do the following and see if returns a version.\ngit --version Best place is to go here (http://git-scm.com/), and download and install the latest stable release.\n3. Install RVM and Ruby # RVM lets you manage set of gems for Ruby/Rails version combination. This is the best way to install Ruby and Rails. Follow the link below and install RVM and Ruby version 1.9.2 (which is latest, stable version as of this time).\ncurl -L get.rvm.io | bash -s stable --ruby 3.1. Then, update the .bash_profile (or whatever shell profile or rc file you need) # echo \u0026#39;[[ -s \u0026#34;$HOME/.rvm/scripts/rvm\u0026#34; ]] \u0026amp;\u0026amp; . \u0026#34;$HOME/.rvm/scripts/rvm\u0026#34; # Load RVM function\u0026#39; \u0026gt;\u0026gt; ~/.bash_profile 3.2. Reload the shell. # source ~/.bash_profile 3.3. Test to see if installation was successful. # rvm list known 3.4. Install Ruby 1.9.2 (or 1.9.3) # rvm install 1.9.2 3.5. It\u0026rsquo;s probably a good to set 1.9.2 as default as well. # rvm use 1.9.2 --default 4. Install RubyGems if not already installed # Doing the following command in terminal and see if it returns version number.\ngem -v If it doesn\u0026rsquo;t return a version number, follow the steps below to install RubyGems.\n4.1 Download the latest stable version from here (http://rubygems.org/pages/download) # 4.2 Unzip and Install # tar xzvf rubygems-1.X.Y.tgz cd rubygems-1.X.Y sudo ruby setup.rb 5. Configure RVM gemset # Now, you have to actually make a choice whether you want to install the latest version 3.1 or the one before 3.0.x. If you just do gem install rails, it will install 3.1. I am sticking with 3.0.10 for a little longer, since that\u0026rsquo;s what I am used to. But, if you are starting new, you should just install 3.1. When you search for code examples online, make sure it\u0026rsquo;s for 3.1, since 3.1 is quite different from 3.0.x.\nrvm gemset create rails31 Also set default gemset.\nrvm use 1.9.2@rails31 --default 6. Install Rails # Depending on what you decided above,\ngem install rails -v 3.1.0 7. Install Postgresql 8.x # I\u0026rsquo;ve used MySQL mostly before, but after Oracle\u0026rsquo;s purchase of MySQL and since I deploy most of my apps on Heroku, which only supports Postgresql, I have been using Postgresql for quite sometime. For typical Rails app, it shouldn\u0026rsquo;t matter whether you use MySQL or Postgresql. You need to be careful when you need to write raw SQL statement. Postgresql is known to be more strict with the syntax.\nLatest Postgresql is 9.x, but I believe pg gem only supports up to 8.x. Better stick with safe version. Follow the link below to download and install Postgresql 8.x. Remember the admin username and password. http://www.enterprisedb.com/products-services-training/pgdownload\npg gem will be installed when you create a Rails app with\nrails new [APP NAME] -d postgresql and install gems with\nbundle install 8. Configure Postgresql for Rails # The most you have to configure is to create a user and password for each app.\n8.1 Login as admin (whatever admin username you picked when you installed the Postgresql) # psql -U admin 8.2 Create a username and password for your app. # create role [USERNAME] with createdb login password \u0026#39;[PASSWORD]\u0026#39;; You would use the username and password you just created in /config/database.yml file in your Rails app.\n","date":"18 November 2011","externalUrl":null,"permalink":"/2011/11/18/resources-for-fresh-installation-of-git-rubygems-postgresql-8-x-and-ruby-on-rails/","section":"Posts","summary":"","title":"Fresh installation of Ruby, Rails, Git, RubyGems, and Postgresql 8.x","type":"posts"},{"content":"","date":"18 November 2011","externalUrl":null,"permalink":"/tags/git/","section":"Tags","summary":"","title":"Git","type":"tags"},{"content":"","date":"18 November 2011","externalUrl":null,"permalink":"/tags/postgresql/","section":"Tags","summary":"","title":"Postgresql","type":"tags"},{"content":"","date":"18 November 2011","externalUrl":null,"permalink":"/tags/rubygems/","section":"Tags","summary":"","title":"Rubygems","type":"tags"},{"content":"For some reason, I couldn\u0026rsquo;t run mongo shell and the console was overrun by the same error message like the following.\n8/1/11 6:49:15 PMcom.apple.launchd\n\\[1\\](org.mongodb.mongod) Throttling respawn: Will start in 10 seconds\n8/1/11 6:49:25 PMcom.apple.launchd\n\\[1\\](org.mongodb.mongod\n\\[394\\]) Exited with exit code: 100\n8/1/11 6:49:15 PM com.apple.launchd[1] (org.mongodb.mongod) Throttling respawn: Will start in 10 seconds 8/1/11 6:49:25 PM com.apple.launchd[1] (org.mongodb.mongod[394]) Exited with exit code: 100 And searching on Google didn\u0026rsquo;t turn up any interesting results.\nIT PAYS TO LOOK AT YOUR LOG FILE! Well, this shouldn\u0026rsquo;t be new, but it somehow skipped my mind until I saw the config file.\nIn the log file was the following helpful error message.\n************** old lock file: /usr/local/mongodb_data/mongod.lock. probably means unclean shutdown recommend removing file and running --repair see: http://dochub.mongodb.org/core/repair for more information ************* Mon Aug 1 18:49:35 [initandlisten] exception in initAndListen std::exception: old lock file, terminatingMon Aug 1 18:49:35 dbexit: Mon Aug 1 18:49:35 [initandlisten] shutdown: going to close listening sockets... Mon Aug 1 18:49:35 [initandlisten] shutdown: going to flush diaglog... Mon Aug 1 18:49:35 [initandlisten] shutdown: going to close sockets... Mon Aug 1 18:49:35 [initandlisten] shutdown: waiting for fs preallocator... Mon Aug 1 18:49:35 [initandlisten] shutdown: closing all files... Mon Aug 1 18:49:35 closeAllFiles() finished Mon Aug 1 18:49:35 dbexit: really exiting now Well, after deleting the lock file, everything was back to normal.\nWhen in doubt, always look in your log file! # ","date":"2 August 2011","externalUrl":null,"permalink":"/2011/08/01/org-mongodb-mogod-exited-with-exit-code-100/","section":"Posts","summary":"","title":"(org.mongodb.mogod) Exited with exit code: 100","type":"posts"},{"content":"I just finished reading TechCrunch article, How Facebook Can Put Google Out of Business. This also reminded me of Paul Adam\u0026rsquo;s articles, The Real Life Social Network and How Your Customers\u0026rsquo; Social Circles Influence What They Buy, What They Do and Where They Go. And also this good analogy of Facebook, Google and other hot startups.\nI was also asked a lot of questions about problem of current social media and how I could make it better as part of interview questions. One common answer I provide is the relevance. How important are these news, status updates, tweets, etc. to me? I agree that the biggest difference between Facebook and Google is the core of each company - people (social) or links (web pages).\nMany companies are trying to figure out who you are as a person. For example, another favorite startup of mine, Hunch, is trying to figure out who you are and what you would like based on what you already like. Netflix tries to figure out what movies you might like based on your ratings of movies. Amazon has been doing it for a while with features like \u0026ldquo;you might also like\u0026hellip;\u0026rdquo; Facebook is obviously in good position because of the social interaction data they have - what you shared, who you have interacted with, what you liked, etc. in addition to social graph. Twitter can also certainly figure out by analyzing followers, tweets and especially retweets, but right now I feel that noise-to-signal ratio on Twitter is too high. You control tweet relevance by carefully choosing who you follow.\nWe are bound to create more data. The amount of data we generate will never decrease. In the sea of data, it would be harder and harder to find information that is relevant to you, but to others. In this sense, Facebook is definitely sitting on a gold mine. It\u0026rsquo;s kind of creepy, but the more interactions you have on Facebook, the more Facebook knows you, and it provides good targeting data to advertisers. Can Google build significant social product? Nothing is impossible, but I think it would be very hard. Facebook is just too big, and I just don\u0026rsquo;t see why I would use similar feature on another platform. Once you have your social network established on one platform, it is extremely hard to create the similar network on a different platform. In social network, the winner takes all, unless the winner screws up big time. It could happen (as has happened a couple of times already with Friendster and MySpace).\nWe are living in an interesting time, indeed.\n","date":"5 June 2011","externalUrl":null,"permalink":"/2011/06/05/relevance-in-current-internet/","section":"Posts","summary":"","title":"Relevance in current Internet","type":"posts"},{"content":"Today I have had the most productive conversation with my wife (which is shame because I think she has a lot of good insights and look at things from different view points). It was inside the car, while we were driving to Lawrence Hall of Science, which is an awesome place all around.\nI had to leave my most current job abruptly, and knowing the reasons behind it, she asked me what\u0026rsquo;s the most important element angel investors look before making an investment. It was an easy question to answer - the team, of course. And she wholeheartedly agreed. She said she experienced exactly the same at her Korean school, where she teaches grade school kids, and at Korean American Community Center, where she worked before working at the Korean school.\nThe Korean school she teaches at is part of a church (I am an atheist, but I welcome all religions), and thus their curriculum is not directed or regulated by school district. She said she and a few other teachers like to try new ways of teaching kids. Their attitudes were just like those of tech startup founders. Failure is okay, since you will learn more from failures and apply it to the next new idea. However, she said there were other teachers who are very resistant to trying new things even if they are not the ones implementing or preparing the experiment. Not only do they waste time, they also put out the passion brought on my good teachers. So, she understood how important the team is. Not everyone in the team needs to be super smart, but it\u0026rsquo;s important for the team to be open to experiments, not be afraid of failures and support each other.\nShe said she saw the same thing at the Korean American Community Service. She worked there as an office manager until our first child was born. The community center reached the peak while she was there, because she said everyone was open to trying new things - services or classes or whatever - to serve the community better. And most of all, they had the full support from the head of the community center. She also said amazing thing about leadership. Good leadership is not about leading, but creating an environment for team members to innovate. You shouldn\u0026rsquo;t try to make everyone follow your views, thoughts or directions, but instead give team members freedom to experiment, learn from successes/failures and move forward. I was like DANG! That\u0026rsquo;s the most insightful thing I heard from my wife (again, I should have more conversations with her) . :)\nI told her that\u0026rsquo;s the exact operating principal for tech startups these days. I couldn\u0026rsquo;t believe we were in such unison! And it got me thinking about our education system. Many people are concerned about our failing education system, and WE HAD THE ANSWER ALL ALONG! Apply \u0026ldquo;Lean Startup\u0026rdquo; principal to our education. Encourage teachers to take 20% of their time to innovate. It\u0026rsquo;s not possible without school district\u0026rsquo;s support, but if there is, it\u0026rsquo;s totally doable. And have Lighting Talk or Lesson Learned sessions with other teachers so that they could learn from others\u0026rsquo; successes or failures. And pivot if an idea didn\u0026rsquo;t work out. Or perhaps we need an national website for teachers to share their experiments and lessons learned from them. I truly believe this HACKING FOR EDUCATION will save us, and put our great nation again in leading position.\n","date":"16 May 2011","externalUrl":null,"permalink":"/2011/05/16/lean-startup-in-education-hacking-for-education/","section":"Posts","summary":"","title":"Lean Startup in Education (Hacking for Education)","type":"posts"},{"content":"I went back home to the East Coast, Washington DC suburb, this past holiday season. I also went up to see my friends and cousins in NJ and NY. Having the first meaningful conversation with my friends and relatives in about two years made me realize one thing about Silicon Valley.\nWe (those of us living in the SF Bay Area) are living in a bubble. I am not talking about startup/options/hype kind of bubble, but a tech bubble. I was the one most knowledgeable about up-to-date information of facebook and its eco-system with apps and social games, twitter, google, etc. None of my friends and relatives seem to know nor even care about such information.\nIt\u0026rsquo;s just amazing and unbelievable when you think about such high concentration of technical knowledge, talent and money in one geographical area.\n","date":"23 January 2011","externalUrl":null,"permalink":"/2011/01/22/silicon-valley-bubble/","section":"Posts","summary":"","title":"Silicon Valley Bubble","type":"posts"},{"content":"Hot dang it\u0026rsquo;s so easy! I am using Rails 3, and it\u0026rsquo;s as easy as adding .parameterize to an attribute.\nFor example, if you want something like\nhttp://mywebsite/posts/123-it-is-so-easy\nYou do\nclass Post def to_param \u0026#34;#{id}-#{title.parameterize}\u0026#34; end end That\u0026rsquo;s it!\n","date":"10 December 2010","externalUrl":null,"permalink":"/2010/12/09/pretty-permalinks-on-rails/","section":"Posts","summary":"","title":"Pretty Permalinks on Rails ","type":"posts"},{"content":"Make sure you run it twice - once with sudo and once without - for it to work properly.\n$sudo gem install heroku $gem install heroku ","date":"10 December 2010","externalUrl":null,"permalink":"/2010/12/09/rvm-and-heroku/","section":"Posts","summary":"","title":"RVM and Heroku","type":"posts"},{"content":"","date":"1 March 2010","externalUrl":null,"permalink":"/tags/entrepreneurship/","section":"Tags","summary":"","title":"Entrepreneurship","type":"tags"},{"content":"","date":"1 March 2010","externalUrl":null,"permalink":"/tags/gordon-ramsay/","section":"Tags","summary":"","title":"Gordon-Ramsay","type":"tags"},{"content":"I am a big fan of Hulu. Ever since I found Hulu, I don\u0026rsquo;t watch much of TV. This is clearly new way of watching TV shows.It\u0026rsquo;s very convenient, and I get to watch whatever I want (as long as episodes are available) and whenever I want. Since I don\u0026rsquo;t have much time to watch during the weekday nights, I tend to \u0026ldquo;binge\u0026rdquo; watch on weekend nights.\nI have recently discovered a very interesting show called \u0026ldquo;Kitchen Nightmares\u0026rdquo;, and while it\u0026rsquo;s entertaining and a little formulaic, I drew a lot of parallels with entrepreneurship.\nPassion # It was amazing to see how many co-owners didn\u0026rsquo;t have passion for their restaurants! It was very clear some owners were using it for their ego trip, even though it was failing. You need that fire in the belly, which enables you to take charge of chaotic situation and plow through.\nPassion was something a lot of investors and entrepreneurs talk about (also in the book called \u0026ldquo;Monk and the Riddle\u0026rdquo;). An entrepreneur without passion is an oxymoron. If investors see the lack of passion, it\u0026rsquo;s the fastest way to getting turned down.\nLeadership # Oh, man, did it matter! I have never seen inside of a kitchen during dinner rush, but it was definitely chaotic. If there is no clear leadership, everything falls apart. Bad restaurants were plagued with inconsistent food, confusion in the kitchen and among wait staff, and angry customers who had to wait for a long time for their food to arrive or whose food wasn\u0026rsquo;t exactly top quality. It also turned out that whoever took charge happened to be one with hottest passion, most fire in the belly. And it shows.\nAlso in entrepreneurship, especially in hard times, leadership matters the most. Someone with hottest passion may not be the best leader, but that person will at least carry the company through especially in hard times.\nCommunications # In chaotic kitchen, communications was the key to get food prepared and delivered to customers. Without clear communications, there were confusions, people yelling at each other, wrong foods delivered to customers, and extra long wait time. From the front to the kitchen, everyone needed to clearly communicate what\u0026rsquo;s required, what\u0026rsquo;s going on, otherwise everything went down south really fast.\nThere is no excuse in startups for not communicating clearly with everyone involved, especially because its size tends to be small and working together is critical when stake is high.\nFind your niche # Another thing Gordon does before the re-launch is positioning (my favorite thing in marketing strategy). When competition is fierce, the only way any restaurant can survive is by finding its niche, positioning itself correctly, and creating menu items that support the niche/positioning.\nIt\u0026rsquo;s so true with any startups.\nSimplfication # In most cases, when the chef Gordon Ramsay did the re-launch of these failing restaurants, he decreased the number of items on the menu to streamline operations.\nThe same couldn\u0026rsquo;t be any more true in startups. Simplify, simplify, and simplify. Release early and reiterate. Always adhere to KISS principle.\nInterior Design # Bad restaurants have many reasons why they fail, but one of most clear one is its interior design or atmosphere. Redesign of interior was always done before re-launches, and it clearly showed the differences.\nI might be stretching it a little bit, but I think it is synonymous to UI/UX of many web/mobile applications. If it\u0026rsquo;s not intuitive or too ugly for customers to use, it would be hard to get meaningful traction.\n","date":"1 March 2010","externalUrl":null,"permalink":"/2010/02/28/kitchen-nightmares-and-entrepreneurship/","section":"Posts","summary":"I am a big fan of Hulu. Ever since I found Hulu, I don’t watch much of TV. This is clearly new way of watching TV shows.It’s very convenient, and I get to watch whatever I want (as long as episodes are available) and whenever I want. Since I don’t have much time to watch during the weekday nights, I tend to “binge” watch on weekend nights.\nI have recently discovered a very interesting show called \" Kitchen Nightmares\", and while it’s entertaining and a little formulaic, I drew a lot of parallels with entrepreneurship.\nPassion # It was amazing to see how many co-owners didn’t have passion for their restaurants! It was very clear some owners were using it for their ego trip, even though it was failing. You need that fire in the belly, which enables you to take charge of chaotic situation and plow through.\nPassion was something a lot of investors and entrepreneurs talk about (also in the book called \" Monk and the Riddle\"). An entrepreneur without passion is an oxymoron. If investors see the lack of passion, it’s the fastest way to getting turned down.\nLeadership # Oh, man, did it matter! I have never seen inside of a kitchen during dinner rush, but it was definitely chaotic. If there is no clear leadership, everything falls apart. Bad restaurants were plagued with inconsistent food, confusion in the kitchen and among wait staff, and angry customers who had to wait for a long time for their food to arrive or whose food wasn’t exactly top quality. It also turned out that whoever took charge happened to be one with hottest passion, most fire in the belly. And it shows.\nAlso in entrepreneurship, especially in hard times, leadership matters the most. Someone with hottest passion may not be the best leader, but that person will at least carry the company through especially in hard times.\n","title":"Kitchen Nightmares and Entrepreneurship","type":"posts"},{"content":"","date":"1 March 2010","externalUrl":null,"permalink":"/tags/kitchen-nightmares/","section":"Tags","summary":"","title":"Kitchen-Nightmares","type":"tags"},{"content":"","date":"1 March 2010","externalUrl":null,"permalink":"/tags/acts_as_tsearch/","section":"Tags","summary":"","title":"Acts_as_tsearch","type":"tags"},{"content":"If you want to have full text search capability on Heroku, you should definitely use texticle or acts_as_tsearch. It is possible to use acts_as_farret on Heroku, but since you can only write to /tmp directory and your index file will be deleted sooner or later, you should not use it.\nI first used texticle, and later switched over to acts_as_tsearch because I wasn\u0026rsquo;t happy with performance. Acts_as_tsearch is working really fine for me, and since your database on Heroku is already Postgres, there should be minimal configuration required. I even switched my local database from MySQL to Postgres to make both development and production environments consistent.\n","date":"1 March 2010","externalUrl":null,"permalink":"/2010/02/28/full-text-search-on-heroku/","section":"Posts","summary":"","title":"Full text search on Heroku","type":"posts"},{"content":"","date":"1 March 2010","externalUrl":null,"permalink":"/tags/heroku/","section":"Tags","summary":"","title":"Heroku","type":"tags"},{"content":"For all those who are learning Ruby, please do yourself a favor and follow the path described below.\nhttp://github.com/edgecase/ruby_koans\n","date":"23 February 2010","externalUrl":null,"permalink":"/2010/02/22/path-of-enlightenment-to-ruby/","section":"Posts","summary":"","title":"Path of enlightenment to Ruby","type":"posts"},{"content":"","date":"23 February 2010","externalUrl":null,"permalink":"/tags/markov-chain/","section":"Tags","summary":"","title":"Markov-Chain","type":"tags"},{"content":"As an exercise to practice Ruby, you can try to compete a random text generator using an underlying Markov chain model. The codes in the following github account are incomplete. You are supposed to fill in or create methods that will create randomly generated texts given seed texts.\nhttp://github.com/eandrejko/text-dynamo\nMarkov chain is like a state machine, but the key is the what causes state transition only depends on the current state. In this case, how do you determine probability of selecting which word next? It\u0026rsquo;s quite simple. You go through the seed text and count frequency of next words, and that determines the frequency. For example, \u0026ldquo;am\u0026rdquo; is likely to folllow \u0026ldquo;I\u0026rdquo; most frequently. Next might be \u0026ldquo;do\u0026rdquo; or other verbs.\nThere are multiple ways to do it, and I think more elegant way is to use two or more classes - one class for nodes and one class for edges. Each word is a node, and each node is connected via an edge. Weight is given to an edge, which represents probability. Weight could be just incremented by one, thus larger the weight is more likely that word (node) could be chosen. The edge is also directional.\nI did much more simpler way, by creating hashes using a pair of keys. First key is each word, and next key is what the next word would be. The value is the weight. Thus, node\n\\[\"I\"\\]\\[\"am\"\\] will probably have the biggest value, largest weight, and highest probability.\ntext_generator.rb\nrequire File.dirname(__FILE__) + \u0026#39;/markov_chain\u0026#39; class TextGenerator attr_reader :markov_chain def initialize @markov_chain = MarkovChain.new end def seed(text) sentences(text).each do |sentence| words = sentence.split words.each_with_index do |word, index| if words[index+1] @markov_chain.increment_probability(word, words[index+1]) end end end end def sentences(text) return text.split(/(?=)\\s+(?=[A-Z])/) end def generate(start) @markov_chain.random_walk(start).join(\u0026#34; \u0026#34;) end end markov_chain.rb\nrequire File.dirname(__FILE__) + \u0026#39;/weighted_directed_graph\u0026#39; class MarkovChain attr_accessor :graph def initialize @graph = WeightedDirectedGraph.new end def increment_probability(a,b) @graph.add_node(a) @graph.connect(a,b) end def next_node(node) total = @graph.node(node).values.inject(0) {|sum, v| sum + v} n = rand*total @graph.node(node).each do |key, weight| return key if n \u0026lt; weight n -= weight end end def random_walk(start) sentence = [] node = start while @graph.out_degree_of(node) \u0026gt; 0 sentence \u0026lt;\u0026lt; node node = next_node(node) end sentence \u0026lt;\u0026lt; node end end weighted_directed_graph.rb\nclass WeightedDirectedGraph attr_accessor :nodes def initialize @nodes = Hash.new end def add_node(name) @nodes[name] ||= Hash.new end def connect(a,b,weight=1) @nodes[a][b] = (@nodes[a][b] ||= 0) + weight end def edge_weight(a,b) @nodes[a][b] end def contains?(name) @nodes[name] end def out_degree_of(name) @nodes[name].size rescue 0 end def node(name) @nodes[name] end end When you run the above code, you get some interesting random texts.\nNearly all that science of the least permits me to hate long time that he took refuge was rekindled within me. \u0026lsquo;By your departure of several nights.\u0026quot; \u0026ldquo;You have it.\u0026rdquo; \u0026ldquo;I do upon me. \u0026ldquo;I have come so strange sight of the judges from behind us along the gentle manners and be the south.\nNearly all associated with the old man, but you will necessarily keep her head to my door, and at no one request, of obtaining the date of madness by quitting his speech, interchanging each of genius and he, \u0026ldquo;I intended services towards him. \u0026ldquo;Autumn passed three weeks before every sight was useful to this deposition did hope that countenance.\nNearly all possible consequences of the very remembrance of medicine, and abhorred!) that of the town, when he said she. \u0026ldquo;How can that morning, before us, indicating that day more ominous and take place since found that he was obliged to intercept him of spring; all their gay apparel she might obtain absolution; but of the world and their cottage. \u0026ldquo;I have no one request, of this?\n","date":"23 February 2010","externalUrl":null,"permalink":"/2010/02/22/my-naswer-to/","section":"Posts","summary":"As an exercise to practice Ruby, you can try to compete a random text generator using an underlying Markov chain model. The codes in the following github account are incomplete. You are supposed to fill in or create methods that will create randomly generated texts given seed texts.\nhttp://github.com/eandrejko/text-dynamo\nMarkov chain is like a state machine, but the key is the what causes state transition only depends on the current state. In this case, how do you determine probability of selecting which word next? It’s quite simple. You go through the seed text and count frequency of next words, and that determines the frequency. For example, “am” is likely to folllow “I” most frequently. Next might be “do” or other verbs.\n","title":"My answer to text-dynamo","type":"posts"},{"content":"","date":"23 February 2010","externalUrl":null,"permalink":"/tags/probability/","section":"Tags","summary":"","title":"Probability","type":"tags"},{"content":"","date":"23 February 2010","externalUrl":null,"permalink":"/tags/randomness/","section":"Tags","summary":"","title":"Randomness","type":"tags"},{"content":"It\u0026rsquo;s okay to be patriotic. You should love your country, but it should not keep you from being objective.\nIn one way, Koreans are kind of Xenophobic. It\u0026rsquo;s not exactly it because they don\u0026rsquo;t hate foreigners, but because they think they are better than others. It was very clear when I lived in Korea for two years. It\u0026rsquo;s media\u0026rsquo;s fault, which is pretty much propaganda machine for everything to do with Korea. Come to think of it, this kind of blind loyalty is rampant in Korea.\nWhen you are in the middle of it, it\u0026rsquo;s really hard to tell others about different things. But it becomes crystal clear when you are outside Korea. Whatever Koreans think they are best at, people in other parts of world simply don\u0026rsquo;t care.\nNow, you may ask, \u0026ldquo;why do you care?\u0026rdquo; I shouldn\u0026rsquo;t. What Korea does or doesn\u0026rsquo;t do doesn\u0026rsquo;t affect me. So, why? I used to ask that myself, and I found an answer. Because I am a Korean, too (well, 1/2 of me is. Not that I am mixed, but I just happened to live 1/2 of my life in the US). I didn\u0026rsquo;t want to care, but I can\u0026rsquo;t help it.\nAnyhow, I think Korea is in big trouble. They will be completely left behind in 10 years or so. Because they don\u0026rsquo;t invest in important technologies. But, you might say, \u0026ldquo;C\u0026rsquo;mon. Korea has the highest rate of Broadband penetration! Their mobile technology is way ahead of the West.\u0026rdquo; Then, I would say, \u0026ldquo;so what?\u0026rdquo; Who cares? How did they benefit Korea now or even future of Korea? The broadband only brought a bunch of gamers. Big deal. Where are the innovators and creators? What significant contribution Korea has made to the good of all, worldwide Internet community? The best, highest network connection, and they couldn\u0026rsquo;t even come up with or capitalize on cloud computing. Amazon did, and look at them. Their idea spawned multiple cloud computing / hosting companies. Where are all SaaS companies? Who is creating computing language used by many web professionals? Ruby, Python, etc. Who\u0026rsquo;s leading the effort? How about mobile area? Who\u0026rsquo;s the power house now? It\u0026rsquo;s not Samsung or LG. It\u0026rsquo;s Apple and Google. Apple makes HW, too, but the real value is in their OS. It\u0026rsquo;s Apple iPhone OS and Android OS. Furthermore it\u0026rsquo;s also dedicated developer communities for both companies. You may say \u0026ldquo;Yeah, but Samsung is still #2 mobile phone company in the world!\u0026rdquo; Big deal. Who cares? Samsung, LG and even Nokia are becoming \u0026ldquo;irrelevant\u0026rdquo; companies. They can cater to low-end market, but Apple and Google will keep attacking high-end market with smatphones\u0026hellip;. Actually, I think I even read that low-income folks are also buying up iPhones. The power will shift soon. In addition, none of cool products are being manufactured or designed in Korea anymore. Apple\u0026rsquo;s products are mostly made by Foxconn. HTC is coming up really fast as a mobile phone power house.\nThere are just so many other companies outside Korea doing very interesting things that Korea won\u0026rsquo;t be able to keep up. All high-speed broadband and advanced phones created are consumers who are good at adopting new technologies. But it didn\u0026rsquo;t help people create or innovate. Even now, Korea is becoming more of a irrelevant country. World is changing amazingly fast, innovating, creating new ways of doing things. But Korea will be remained as fast adopters, not much more.\n","date":"12 February 2010","externalUrl":null,"permalink":"/2010/02/12/korea-will-be-left-behind/","section":"Posts","summary":"It’s okay to be patriotic. You should love your country, but it should not keep you from being objective.\nIn one way, Koreans are kind of Xenophobic. It’s not exactly it because they don’t hate foreigners, but because they think they are better than others. It was very clear when I lived in Korea for two years. It’s media’s fault, which is pretty much propaganda machine for everything to do with Korea. Come to think of it, this kind of blind loyalty is rampant in Korea.\nWhen you are in the middle of it, it’s really hard to tell others about different things. But it becomes crystal clear when you are outside Korea. Whatever Koreans think they are best at, people in other parts of world simply don’t care.\nNow, you may ask, “why do you care?” I shouldn’t. What Korea does or doesn’t do doesn’t affect me. So, why? I used to ask that myself, and I found an answer. Because I am a Korean, too (well, 1/2 of me is. Not that I am mixed, but I just happened to live 1/2 of my life in the US). I didn’t want to care, but I can’t help it.\nAnyhow, I think Korea is in big trouble. They will be completely left behind in 10 years or so. Because they don’t invest in important technologies. But, you might say, “C’mon. Korea has the highest rate of Broadband penetration! Their mobile technology is way ahead of the\n","title":"Korea will be left behind","type":"posts"},{"content":"","date":"12 February 2010","externalUrl":null,"permalink":"/tags/technology/","section":"Tags","summary":"","title":"Technology","type":"tags"},{"content":"","date":"30 January 2010","externalUrl":null,"permalink":"/tags/database/","section":"Tags","summary":"","title":"Database","type":"tags"},{"content":"","date":"30 January 2010","externalUrl":null,"permalink":"/tags/fedora/","section":"Tags","summary":"","title":"Fedora","type":"tags"},{"content":"I have been using MySQL for probably as long as I could remember. For Bloglation, search capability is an important feature since it\u0026rsquo;s hard to browse each post one by one. I will probably implement tagging functionality, but even so, it\u0026rsquo;s important to be able to search the contents with a keyword(s). While Ultrasphinx works well, Heroku only supports WebSolr\u0026hellip; I was using acts_as_ferret using /tmp for index files, but the problem using the /tmp directory is that ferret index files most likely to disappear at some point.\nThen, I found out that Postgres supports full-text search and since Heroku uses Postgres, I could use other plug-ins like acts_as_tsearch or texticle for free. Free is important to me, since it\u0026rsquo;s not making any money.\nSearching online, there are various ways to do it like Pivotal Labs\u0026rsquo; script or Heroku\u0026rsquo;s Taps gem, but I wanted to do it in an old way like AEdifice to check everything is going alright at each step. 1. First thing to do is to backup MySQL\nFor me, it was important to backup preserving encoding, since it had many different languages. First I pulled db from Heroku thinking that I needed to convert the db at Heroku to Postgres since my local db was MySQL. However, it wasn\u0026rsquo;t necessary at all, since db at Heroku is already Postgres even though my local db is MySQL.\nmysql -u root -p --no-create-info --compatible=postgresql --complete-insert --default-character-set=utf8 [db_name] \u0026gt; [whatever].sql \u0026quot;--default-character-set=utf8\u0026quot; option is necessary to preserve unicode encoding, but it didn\u0026rsquo;t work for me. It didn\u0026rsquo;t matter since I don\u0026rsquo;t need to touch the db at Heroku, but I probably need to revisit it since I will have to move db at some point. This exercise is really for development and testing.\n2. Prepare the SQL dump file for Postgres\nYou can follow AEdifice\u0026rsquo;s blog post to prepare for Postgres until importing dump part.\n3. Install and configure Postgres\nSince I use Fedora, I followed the instruction described here, and it was just a breeze. Make sure you create a user, assign password and grant correct rights. It\u0026rsquo;s probably easy to create the same root user as MySQL.\n4. Change database.yml file\ndevelopment: adapter: postgresql encoding: utf8 database: openT_development username: [username] password: [password] template: template0 # Required for UTF8 encoding test: adapter: postgresql encoding: utf8 database: openT_test username: [username] password: [password] template: template0 # Required for UTF8 encoding production: adapter: postgresql encoding: utf8 database: openT_production username: [username] password: [password] template: template0 # Required for UTF8 encoding 5. Run rake db:create:all to create db\u0026rsquo;s in Postgres\nOne caveat here is that Postgres does not allow option for \u0026ldquo;text\u0026rdquo; data type. In my schema.rb, sessions table\u0026rsquo;s data field had an option, so I had to delete the option for the tables to be created correctly.\n6. Then you can continue AEdifice\u0026rsquo;s blog post from importing the dump file\nAfter importing is done, you should connect to your database and check to see if everything had been imported correctly.\n7. Then you can follow Aaron\u0026rsquo;s blog post to install texticle gem or acts_as_tsearch to have full-text search in your rails app using Postgres db.\n","date":"30 January 2010","externalUrl":null,"permalink":"/2010/01/30/how-to-convert-from-mysql-to-postgres/","section":"Posts","summary":"I have been using MySQL for probably as long as I could remember. For Bloglation, search capability is an important feature since it’s hard to browse each post one by one. I will probably implement tagging functionality, but even so, it’s important to be able to search the contents with a keyword(s). While Ultrasphinx works well, Heroku only supports WebSolr… I was using acts_as_ferret using /tmp for index files, but the problem using the /tmp directory is that ferret index files most likely to disappear at some point.\nThen, I found out that Postgres supports full-text search and since Heroku uses Postgres, I could use other plug-ins like acts_as_tsearch or texticle for free. Free is important to me, since it’s not making any money.\nSearching online, there are various ways to do it like Pivotal Labs’ script or Heroku’s Taps gem, but I wanted to do it in an old way like AEdifice to check everything is going alright at each step. 1. First thing to do is to backup MySQL\nFor me, it was important to backup preserving encoding, since it had many different languages. First I pulled db from Heroku thinking that I\n","title":"How to convert from MySQL to Postgres","type":"posts"},{"content":"","date":"30 January 2010","externalUrl":null,"permalink":"/tags/mysql/","section":"Tags","summary":"","title":"Mysql","type":"tags"},{"content":"But, why wouldn\u0026rsquo;t you have an Amazon S3 account? It\u0026rsquo;s so cheap and reliable (as far as I can tell). If you don\u0026rsquo;t have one, you should get one. Also, if you care about preserving your content when disaster strikes, get this WP S3 Backups plugin.\n","date":"16 December 2009","externalUrl":null,"permalink":"/2009/12/16/best-wordpress-backup-plugin-if-you-have-amazon-s3-account/","section":"Posts","summary":"","title":"Best Wordpress Backup plugin (if you have Amazon S3 account)","type":"posts"},{"content":"","date":"16 December 2009","externalUrl":null,"permalink":"/tags/wordpress/","section":"Tags","summary":"","title":"Wordpress","type":"tags"},{"content":"Don\u0026rsquo;t fool with Kernel call. Just use OpenURI.open_uri.\nOpenURI.expects(:open_uri).returns(\u0026#34;some content\u0026#34;) ","date":"16 December 2009","externalUrl":null,"permalink":"/2009/12/16/to-mock-or-stub-open-method/","section":"Posts","summary":"","title":"To mock or stub 'open' method","type":"posts"},{"content":"Last Thursday, I released private alpha version of Bloglation, which lets a user translate any web page, save and share. It\u0026rsquo;s supposed to be private, but I need to get some good feedback from real users. If you are bi-lingual (or not) and interested in translating cool ideas, concepts and/or knowledge, please go ahead. And don\u0026rsquo;t forget to send me any comments/feedback you have.\nI also wanted to maintain a separate blog just for bloglation. You can find it here.\n","date":"24 November 2009","externalUrl":null,"permalink":"/2009/11/24/bloglation-translate-save-and-share/","section":"Posts","summary":"","title":"Bloglation - Translate, Save, and Share!","type":"posts"},{"content":"","date":"24 November 2009","externalUrl":null,"permalink":"/tags/new/","section":"Tags","summary":"","title":"New","type":"tags"},{"content":"","date":"10 November 2009","externalUrl":null,"permalink":"/tags/stratup/","section":"Tags","summary":"","title":"Stratup","type":"tags"},{"content":"Michael Arrington at TechCrunch had a new posting about Don Dodge\u0026rsquo;s forced departure from Microsoft, and in that post, he had a great quote.\nWhat a great quote it is! In the same post, he had a link to his previous blog post about Yossi Vardi and another quote from Theodore Roosevelt. What a great quote! This is a kind of thing that drives entrepreneurs.\nIt is not the critic who counts; not the man who points out how the strong man stumbles, or where the doer of deeds could have done them better. The credit belongs to the man who is actually in the arena, whose face is marred by dust and sweat and blood; who strives valiantly; who errs, who comes short again and again, because there is no effort without error and shortcoming; but who does actually strive to do the deeds; who knows great enthusiasms, the great devotions; who spends himself in a worthy cause; who at the best knows in the end the triumph of high achievement, and who at the worst, if he fails, at least fails while daring greatly, so that his place shall never be with those cold and timid souls who neither know victory nor defeat.\n","date":"10 November 2009","externalUrl":null,"permalink":"/2009/11/10/those-who-say-it-cannot-be-done-shouldn%E2%80%99t-interrupt-the-people-doing-it/","section":"Posts","summary":"","title":"Those who say it cannot be done shouldn’t interrupt the people doing it","type":"posts"},{"content":"","date":"5 November 2009","externalUrl":null,"permalink":"/tags/acts_as_ferret/","section":"Tags","summary":"","title":"Acts_as_ferret","type":"tags"},{"content":"","date":"5 November 2009","externalUrl":null,"permalink":"/tags/ferret/","section":"Tags","summary":"","title":"Ferret","type":"tags"},{"content":"OMG!\nThis shouldn\u0026rsquo;t have been this difficult, but it has because while there are many cool tutorials are out there, they are mostly outdated, and for some reason, the instruction on Heroku was not accessible.\nWhile I picked acts_as_ferret because Heroku supports it, many seemed to prefer Thinking Sphinx. So, if you are not constrained (like me with Heroku), you should try that out too.\n1. Install acts_as_ferret\nFull instruction is outlined on github, so you should check it out. You can also find the installation instruction and complete list of methods here, too.\nWhile the instruction asks you to put version name, since Heroku only has version 0.4.3 installed, specifying a version will break it.\nSo, I put the following line in the config/environment.rb.\nconfig.gem ‘acts_as_ferret’ and did\nrake gems:install. 2. Install will_paginate\nFollow the instruction here to install will_paginate.\n3. Modify config/environment.rb\nInside\nRails::Initializer.run do |config| loop, add the following lines.\nconfig.gem \u0026#39;will_paginate\u0026#39;, :version =\u0026gt; \u0026#39;~\u0026gt; 2.3.11\u0026#39;, :source =\u0026gt; \u0026#39;http://gemcutter.org\u0026#39; config.gem \u0026#39;acts_as_ferret\u0026#39; And after the loop, add the following two lines. ActsAsFerret.index_dir is very important, since Heroku doesn\u0026rsquo;t allow write anywhere except tmp directory.\nrequire \u0026#39;acts_as_ferret\u0026#39; ActsAsFerret.index_dir = \u0026#34;#{RAILS_ROOT}/tmp/index\u0026#34; require \u0026#39;will_paginate\u0026#39; 4. Modify production.rb\nThis is one change that wasn\u0026rsquo;t specified anywhere, and took me a while to figure out. I only found it some obscure forum page. Not too obvious. Assuming your Heroku environment is production, put the following lines in the config/environments/production.rb as well.\nrequire \u0026#39;acts_as_ferret\u0026#39; ActsAsFerret.index_dir = \u0026#34;#{RAILS_ROOT}/tmp/index\u0026#34; 5. Modify your model\nSpecify which fields should be searchable in a model. There are ways to search multiple models, and there are many examples you can find online.\nI have the following lines in my Post model to search in :title, :content, and :url fields.\nacts_as_ferret :fields =\u0026gt; [:title, :content, :url] 6. Search action\nIt\u0026rsquo;s up to you where you put your search action. I put it in my Post controller, since that\u0026rsquo;s all I care about. You could possibly have Search controller and search action. You can change per_page parameter to specify how many results are shown per page.\ndef search @query=params[:query] @total_hits = Post.total_hits(@query) @posts = Post.paginate_with_ferret(@query, :page =\u0026gt; params[:page], :per_page =\u0026gt; 5) end 7. In my layouts/application view, I have the following simple form to pass query parameter.\n\u0026lt;% form_tag(\u0026#39;/posts/search\u0026#39;) do %\u0026gt; \u0026lt;%= text_field_tag \u0026#39;query\u0026#39; %\u0026gt; \u0026lt;%= submit_tag \u0026#39;Search for articles\u0026#39; %\u0026gt; \u0026lt;% end %\u0026gt; 8. In search view, I use partial and paginate links to show the results.\nSearch result for term \u0026lt;%= @query %\u0026gt; resulted in \u0026lt;%= @total_hits %\u0026gt; hits \u0026lt;%= render :partial =\u0026gt; \u0026#39;post\u0026#39;, :collection =\u0026gt; @posts %\u0026gt; \u0026lt;%= will_paginate @posts, :params =\u0026gt; {:query =\u0026gt; @query} %\u0026gt; That\u0026rsquo;s it! Once I did it, it was really easy, but I felt very overwhelmed in the beginning.\nI hope this saves someone a lot of time. :)\n","date":"5 November 2009","externalUrl":null,"permalink":"/2009/11/05/installing-acts_as_ferret-with-pagination-and-deploying-on-heroku/","section":"Posts","summary":"OMG!\nThis shouldn’t have been this difficult, but it has because while there are many cool tutorials are out there, they are mostly outdated, and for some reason, the instruction on Heroku was not accessible.\nWhile I picked acts_as_ferret because Heroku supports it, many seemed to prefer Thinking Sphinx. So, if you are not constrained (like me with Heroku), you should try that out too.\n1. Install acts_as_ferret\nFull instruction is outlined on github, so you should check it out. You can also find the installation instruction and complete list of methods here, too.\nWhile the instruction asks you to put version name, since Heroku only has version 0.4.3 installed, specifying a version will break it.\n","title":"Installing acts_as_ferret with pagination and deploying on Heroku","type":"posts"},{"content":"","date":"5 November 2009","externalUrl":null,"permalink":"/tags/paginate/","section":"Tags","summary":"","title":"Paginate","type":"tags"},{"content":"","date":"5 November 2009","externalUrl":null,"permalink":"/tags/search/","section":"Tags","summary":"","title":"Search","type":"tags"},{"content":"","date":"5 November 2009","externalUrl":null,"permalink":"/tags/will_paginate/","section":"Tags","summary":"","title":"Will_paginate","type":"tags"},{"content":"","date":"22 October 2009","externalUrl":null,"permalink":"/tags/code/","section":"Tags","summary":"","title":"Code","type":"tags"},{"content":"I was just using blockquote, code and pre HTML tags for indicating codes in my blogs, but they just looked horrible!\nBut I just installed WP-Syntax, and it\u0026rsquo;s fantastic. Now, all the codes in my blogs should read much easier.\nIf you use Wordpress and have lots of codes, you probably use some sort of markup tool already. If you don\u0026rsquo;t, get WP-Syntax.\n","date":"22 October 2009","externalUrl":null,"permalink":"/2009/10/22/get-wp-syntax/","section":"Posts","summary":"","title":"Get WP-Syntax","type":"posts"},{"content":"","date":"22 October 2009","externalUrl":null,"permalink":"/tags/markup/","section":"Tags","summary":"","title":"Markup","type":"tags"},{"content":"","date":"22 October 2009","externalUrl":null,"permalink":"/tags/tag/","section":"Tags","summary":"","title":"Tag","type":"tags"},{"content":"Now I am moving on to Open Translation Project. I\u0026rsquo;ve done some translation work before, including one of Paul Graham\u0026rsquo;s essay - Why to not not start a startup. BTW, he finally made a link from the essay to my translation. I used Google Translate as base, but I couldn\u0026rsquo;t believe how bad the translation was. Yahoo\u0026rsquo;s Babel Fish was a little better, but not as much. That\u0026rsquo;s where I got the idea of creating this possibly massive project.\nAnyhow, I wanted to find a way of selecting an article or blog that was translated the most. I had one model that stored basic information of original article/blog. Then its children are translations. So, I need to count rows of children with the same parent. In MySQL, I had the following statement in Rails.\n@top_origs = OrigPost.find(:all, :select =\u0026gt; \u0026#39;orig_posts.*, count(posts.id) as post_count\u0026#39;, :joins =\u0026gt; \u0026#39;left outer join posts on posts.orig_post_id = orig_posts.id\u0026#39;, :group =\u0026gt; \u0026#39;orig_posts.id\u0026#39;, :order =\u0026gt; \u0026#39;post_count DESC\u0026#39;, :limit =\u0026gt; 5) The problem is when I uploaded the changes to Heroku. Since Heroku uses Postgres, and it\u0026rsquo;s stricter than MySQL, it barfed.\nActiveRecord::StatementInvalid (PGError: ERROR: column \u0026#34;orig_posts.url\u0026#34; must appear in the GROUP BY clause or be used in an aggregate function : SELECT orig_posts.*, count(posts.id) as post_count FROM \u0026#34;orig_posts\u0026#34; left outer join posts on posts.orig_post_id = orig_posts.id GROUP BY orig_posts.id ORDER BY post_count DESC LIMIT 5): So, obviously I need to list ALL columns in GROUP BY clause. Yuk.\nThis is what I did, and it worked.\norig_cols = OrigPost.column_names.collect {|c| \u0026#34;orig_posts.#{c}\u0026#34;}.join(\u0026#34;,\u0026#34;) @top_origs = OrigPost.find_by_sql(\u0026#34;SELECT #{orig_cols}, count(posts.id) AS post_count FROM orig_posts LEFT OUTER JOIN posts ON posts.orig_post_id = orig_posts.id GROUP BY orig_posts.id, #{orig_cols} ORDER BY post_count DESC LIMIT 5\u0026#34;) Hopefully, this will help others who may have a similar problem.\n","date":"22 October 2009","externalUrl":null,"permalink":"/2009/10/22/counting-rows-and-modifying-mysql-to-work-with-postgres-or-heroku/","section":"Posts","summary":"Now I am moving on to Open Translation Project. I’ve done some translation work before, including one of Paul Graham’s essay - Why to not not start a startup. BTW, he finally made a link from the essay to my translation. I used Google Translate as base, but I couldn’t believe how bad the translation was. Yahoo’s Babel Fish was a little better, but not as much. That’s where I got the idea of creating this possibly massive project.\nAnyhow, I wanted to find a way of selecting an article or blog that was translated the most. I had one model that stored basic information of original article/blog. Then its children are translations. So, I need to count rows of children with the same parent. In MySQL, I had the following statement in Rails.\n@top_origs = OrigPost.find(:all, :select =\u003e 'orig_posts.*, count(posts.id) as post_count', :joins =\u003e 'left outer join posts on posts.orig_post_id = orig_posts.id', :group =\u003e 'orig_posts.id', :order =\u003e 'post_count DESC', :limit =\u003e 5) ","title":"Counting rows and modifying MySQL to work with Postgres or Heroku","type":"posts"},{"content":"","date":"22 October 2009","externalUrl":null,"permalink":"/tags/postgres/","section":"Tags","summary":"","title":"Postgres","type":"tags"},{"content":"I found the best open source wireframing tool. It\u0026rsquo;s called Pencil Project, and you can get it from here.\nGo get it now!\n","date":"3 October 2009","externalUrl":null,"permalink":"/2009/10/03/best-open-source-wireframing-tool/","section":"Posts","summary":"","title":"Best Open Source Wireframing Tool","type":"posts"},{"content":"","date":"3 October 2009","externalUrl":null,"permalink":"/tags/wireframe/","section":"Tags","summary":"","title":"Wireframe","type":"tags"},{"content":"","date":"3 October 2009","externalUrl":null,"permalink":"/tags/wireframing/","section":"Tags","summary":"","title":"Wireframing","type":"tags"},{"content":"I\u0026rsquo;ve first read Jamie\u0026rsquo;s response to Joel\u0026rsquo;s writing on him on Coders at Work. I didn\u0026rsquo;t think much of it, and then I had a chance to read Joel\u0026rsquo;s actual writing. It sort of coincided with another discussion I had with an aspiring entrepreneur I met yesterday. And I decided I like the term, duck tape programmer.\nThe aspiring entrepreneur I met had his opinion about certain Rails programmers, and that\u0026rsquo;s exactly who Joel described as \u0026ldquo;someone with a coffee mug\u0026rdquo;. I don\u0026rsquo;t think it\u0026rsquo;s a matter of right or wrong, but about the whole approach towards programming. The entrepreneur said that he has met many smart programmers who can talk up the latest movement and fads in programming world, but when it\u0026rsquo;s time to deliver, they are stuck in their world, trying to come up with best looking code using the latest techniques. However, the kind of programmers most value to startups are those who just get things done.\nSome of the cool things he said were,\nPeter asked Zawinski, “Overengineering seems to be a pet peeve of yours.”\n“Yeah,” he says, “At the end of the day, ship the fucking thing! It’s great to rewrite your code and make it cleaner and by the third time it’ll actually be pretty. But that’s not the point—you’re not here to write code; you’re here to ship products.”\nMy hero.\nDuct tape programmers are pragmatic. Zawinski popularized Richard Gabriel’s precept of Worse is Better. A 50%-good solution that people actually have solves more problems and survives longer than a 99% solution that nobody has because it’s in your lab where you’re endlessly polishing the damn thing. Shipping is a feature. A really important feature. Your product must have it.\nI think what Joel referred as duct tape programmers are hackers in Paul Graham\u0026rsquo;s definition. Just as I concur with Paul, I do with Joel on this. Hacker or duct tape programmer, I aspire to be the one who just gets things done.\nI am going to buy that book, which has very similar cover as Founders at Work.\nSweet!\n","date":"1 October 2009","externalUrl":null,"permalink":"/2009/10/01/duck-tape-programmer/","section":"Posts","summary":"","title":"Duck Tape Programmer","type":"posts"},{"content":"","date":"1 October 2009","externalUrl":null,"permalink":"/tags/duck-tape-programmer/","section":"Tags","summary":"","title":"Duck-Tape-Programmer","type":"tags"},{"content":"","date":"1 October 2009","externalUrl":null,"permalink":"/tags/hacker/","section":"Tags","summary":"","title":"Hacker","type":"tags"},{"content":"","date":"29 September 2009","externalUrl":null,"permalink":"/tags/clickpass/","section":"Tags","summary":"","title":"Clickpass","type":"tags"},{"content":"Alright!\nMy tutorial blog about integrating Clickpass with a rails app was featured on Clickpass\u0026rsquo; official blog. :)\nhttp://blog.clickpass.com/2009/09/22/new-rails-tutorial-on-installing-clickpass/\n","date":"29 September 2009","externalUrl":null,"permalink":"/2009/09/28/featured-on-clickpass-blog/","section":"Posts","summary":"","title":"Featured on Clickpass blog","type":"posts"},{"content":"The following is a Craigslist Wanted ad I placed when I was doing the social networking website for new parents. I don\u0026rsquo;t know why, but I wanted to see if I still had it, and I did.\nYou take the blue pill and the story ends. You wake in your bed and believe whatever you want to believe. You take the red pill and you stay in Wonderland and I show you how deep the rabbit-hole goes.\nI am not offering truth, but I am offering you a chance to change status quo and be a founding member of a start-up company.\nI am looking for a co-founder in DC metro area with web development experiences in LAMP (Linux, Apache, MySQL and PHP) environment. Prior social networking or web 2.0 development or startup experience would be a plus, not necessary. The right candidate(s) will be entrepreneurial, passionate about starting up your own company, and ready to commit time and/or money.\nSocial networking has so many potential niche markets, e.g. facebook for college students, linkedin for business users, and dogster for dog owners. It\u0026rsquo;s true that this space is getting crowded, but with right niche market and understanding of it, one can be very well successful. The key is to target passion centric segment. Only after becoming a leader in a niche market with laser-like focus, you can expand and grow much bigger. Our target customers are definitely very passionate about what they do and they can benefit most from features in the plan.\nIf you are interested in learning more, please send me an email with your resume and a brief description of why you think you are a good fit. We will take it from there.\nI look forward to hearing from a fellow entrepreneur.\n","date":"29 September 2009","externalUrl":null,"permalink":"/2009/09/28/ready-to-take-a-red-pill/","section":"Posts","summary":"","title":"Ready to take a red pill?","type":"posts"},{"content":"My ingenious friend who has been building his own version of Segway finally got his own 3D printer working (based on open source project).\nBest part? He is selling a complete printer (Not a kit!) for less than $2,000. If you want to build it yourself, you can always follow the open source project. But for rest of us who do not have enough spare time, this is the most cost effective way to getting hands on a 3D printer.\n$1799 to be exact. Shipping is extra.\nIf you would like to order one, please send me an email at 3dprinter \\[at\\] yangtheman.com\n","date":"22 September 2009","externalUrl":null,"permalink":"/2009/09/22/3d-printer-for-less-than-2000/","section":"Posts","summary":"","title":"3D Printer for less than $2,000","type":"posts"},{"content":"","date":"22 September 2009","externalUrl":null,"permalink":"/tags/3d-printer/","section":"Tags","summary":"","title":"3d-Printer","type":"tags"},{"content":"","date":"22 September 2009","externalUrl":null,"permalink":"/tags/cool/","section":"Tags","summary":"","title":"Cool","type":"tags"},{"content":"Over the weekend, while nursing a sick kid, I read this guest blog post on TechCrunch by Meebo CEO, Seth Sternberg, called From Nothing to Something. How to Get There. It was so good that I immediately re-tweeted the story and asked my followers to read it right then. You should read it, if you haven\u0026rsquo;t done so.\nI share the same exact sentiment as the following quotes,\nSecond, like I said, forget everything else and just get your product out the door. No office. No phone system. No hiring. No press. No legal muck. No raising money. No looking for partnerships (who’s going to partner with you anyway?). The success or failure of the adoption of your product is what will create 99% of the initial value of your company. If no one ever uses your product, you have no value. Oh, and for the record, raising VC does not help get traction – in another blog post, I’ll argue that if anything, it hurts.\nI am so glad that a successful entrepreneur who went through multiple failures are giving the same advice I feel as my mantra for a startup. How awesome is that.\nForget Everything. Just Build First.\n","date":"21 September 2009","externalUrl":null,"permalink":"/2009/09/21/forget-everything-just-build-first/","section":"Posts","summary":"","title":"Forget Everything, Just Build First","type":"posts"},{"content":"I saw Clickpass in action at the Hacker News, and I thought it was another great way to reduce another login account. I wanted to implement it for my Open Translation project.\nHowever, when I tried to find tutorials for using Clickpass with a Rails app, I couldn\u0026rsquo;t find any! How could it be! The pesudo code example Clickpass provided was for Java, I think, and thus it wasn\u0026rsquo;t any help to me. I was completely lost.\nThen I realized that in the core underlying architecture of Clickpass is OpenID. Then it all made sense to me. I found a great tutorial on OpenID and Authlogic on a Railscasts episode (I am not using Authlogic for my site, though, but for the Open Translation project, I probably will.). So the following is a mixture of the Railscasts episode, ruby-openid gem, open_id_authentication plugin and Clickpass setup.\n1. Install the gem and the plugin.\nsudo gem install ruby-openid Add the following line to config/environment.rb\nconfig.gem \u0026#34;ruby-openid\u0026#34;, :lib =\u0026gt; \u0026#34;openid\u0026#34; Install the plugin.\nruby script/plugin install git://github.com/rails/open_id_authentication.git Run the migration file for open_id_authentication to create an authentication table. You can use file method, but I found this to be easier.\nrake open_id_authentication:db:create 2. At this point, it\u0026rsquo;s good to create a column for storing openid URL in users table.\nruby script/generate migrate AddOpenIDURLtoUser Modify the migration file to look like the following.\nclass AddOpenIdurLtoUser \u0026lt; ActiveRecord::Migration def self.up add_column :users, :openid_url, :string end def self.down remove_column :users, :openid_url end end Run\nrake db:migrate 3. Now you are ready to get down to writing actions. There is Clickpass operation flow chart. You should definitely check it out. You should also read through their documentation, but don\u0026rsquo;t worry about actual codes.\n3.5. Since I am going to have three actions in session controllers that does those three actions required by Clickpass, I need to add them in the config/routes.rb.\nLog users in == begin_openid_login and complete_openid_login in Clickpass == begin_openid_login action my session controller Merge accounts == add_openid_to_user in Clickpass == add_openid action in my session controller Register new sign-up == process_openid_registration in Clickpass == openid_reg action in my session controller Thus, in config/routes.rb,\nmap.resource :session, :member =\u0026gt; {:destroy =\u0026gt; :get, :begin_openid_login =\u0026gt; :get, :add_openid =\u0026gt; :post, :openid_reg =\u0026gt; :get} 3.75. Also don\u0026rsquo;t forget to take these actions off of forgery protection list.\nclass SessionsController \u0026lt; ApplicationController protect_from_forgery :except =\u0026gt; [:begin_openid_login, :add_openid] 4. Clickpass provides a chunk of Javascript code for login button. When a user clicks on it, it will try to authenticate the user with either OpenID or other credentials. The first you have to do is what to do with the return value, which is OpenID URL. That\u0026rsquo;s how an OpenID user is recognized, by OpenID URL.\n5. At this point, go to Clickpass\u0026rsquo;developer page, and create a new site ==\u0026gt; Click on the \u0026ldquo;Create a new site\u0026rdquo; button. Pick a name for your site. Don\u0026rsquo;t worry about other fields. And click on \u0026ldquo;Save Changes\u0026rdquo; button and then \u0026ldquo;Next: Log users in\u0026rdquo; button.\n6. Now it gets interesting. There is the bunch of Javascript code I mentioned earlier. You can copy and paste it in the view where you want user to login. For me, I put it in app/views/layouts/application.html.erb right below Facebook Connect button. Why am I keeping the Facebook Connect button when Clickpass also works with FB credentials? I will explain that later.\nHere begin_openid_login is important, since this parameter tells Clickpass where to send the openid_url. I have session controller that takes care of session creation and deletion, it was a natural place. So, for my production site, I have the following.\nbegin_openid_login = http://www.playgroundrus.com/session/begin_openid_login In development environment, just use localhost as your host name.\nOpenID parameter label is another important parameter. This defines how OpenID URL is referred in your app. For me, I have\nOpenID parameter label = openid_url Set the submission method to GET and save changes.\n7. Now fun begins. Most of the following is modification of sample code in open_id_authentication. In my session controller, I have the following actions configured.\nThe following takes OpenID URL in openid_url variable and send it to open_id_authentication function.\n#Begin OpenID authentication def begin_openid_login openid_url = params[:openid_url] open_id_authentication end Here, open_id_authentication uses openid_url to authenticate a user and if it\u0026rsquo;s successful, I try to find the user in my users table (remember the openid_url column I created earlier?). If it\u0026rsquo;s not found, I redirect the user back to Clickpass, where Clickpass will ask user two things. If user already has an account in my site, s/he can decide to merge two accounts. If user is completely new, Clickpass will call another action in session controller to create a user in my users table. I will get to it later.\nprotected def open_id_authentication authenticate_with_open_id do |result, openid_url| if result.successful? if @current_user = User.find_by_openid_url(openid_url) successful_login else #If users is not found based on OpenID, Clickpass will ask your if new account should be opened or merged redirect_to \u0026#34;http://www.clickpass.com/process_new_openid?site_key=aBIC63MAFp\u0026amp;process_openid_registration_url=http%3A%2F%2Fplaygroundrus.com%2Fsession%2Fopenid_reg\u0026amp;requested_fields=nickname%2Cemail\u0026amp;required_fields=nickname%2Cemail\u0026amp;nickname_label=Nickname\u0026amp;email_label=Email\u0026#34; end else failed_login result.message end end end private def successful_login session[:user_id] = @current_user.id redirect_to(root_url) end def failed_login(message) flash[:error] = message redirect_to(new_session_url) end You can create a fake user with \u0026quot; http://clickpass.com/public/always_authenticate\u0026quot; in the openid_url column. And if you click on \u0026ldquo;submit authenticated OpenID\u0026rdquo; in step 2 of the page, user should be logged in successfully. If it happens, congrats! Take a breather. That was easy, wasn\u0026rsquo;t it?\n8. Next is merging accounts. If an existing user signs up with Clickpass or signs in through Clickpass, because this user\u0026rsquo;s OpenID URL is not in the table, I won\u0026rsquo;t be able to find the user. When the user is sent back to Clickpass, s/he can choose to merge existing account with Clickpass account. So, for me,\nbegin_add_openid_to_user URL = http://playgroundrus.com/session/add_openid user_id label = username (I think there is a bug. Even with this, Clickpass uses user_id as hash key) In my session controller, I first find a user using username and password, and just add the openid_url.\n#MERGE: Add openid_url to exisitng user def add_openid if @current_user = User.find_by_username_and_hashed_password(params[:user_id], encrypt(params[:password])) @current_user.openid_url = params[:openid_url] @current_user.save successful_login else redirect_to \u0026#34;#{params[:clickpass_merge_callback_url]}?userid_authenticated=false\u0026#34; end end You should be able to delete openid_url from the fake user account, and test the merging in the step 2 of the page. It should work.\n9. Next is, what to do if the user is really new. Then we create an account.\nprocess_openid_registration_url = http://playgroundrus.com/session/openid_reg I only care about username and email address, so I only had nickname and email fields checked.\nThe long URL you see in the top gray box is the one you use to redirect a user when no current user is found. It\u0026rsquo;s the same code earlier in step 7.\nIn my session controller, I create a new user with the nickname and email.\n#NEW def openid_reg @current_user = User.new if user=User.find_by_username(params[:nickname]) || user=User.find_by_email(params[:email]) failed_login(\u0026#34;Userrname or email is already taken!\u0026#34;) end @current_user.username = params[:nickname] @current_user.email = params[:email] @current_user.openid_url = params[:clickpass_openid] #Force save @current_user.save(false) successful_login end 11. That should have you pretty much covered for working with Clickpass. One major drawback of Clickpass is that I won\u0026rsquo;t know if a Clickpass user is also a Facebook user. I have Facebook Feed publishing configured so that any new addition or edition of a playground will trigger Facebook Feed if logged in user is a Facebook user. With \u0026gt;300M users and strong social network, Facebook Feed is very valuable for spreading words\u0026hellip;. That\u0026rsquo;s why I still have Facebook Connect button along with Clickpass login button. I REALLY hope Clickpass can change add that feature soon. Other than that, it\u0026rsquo;s pretty cool stuff.\n","date":"17 September 2009","externalUrl":null,"permalink":"/2009/09/17/how-to-integrate-clickpass-or-openid-with-a-rails-app/","section":"Posts","summary":"I saw Clickpass in action at the Hacker News, and I thought it was another great way to reduce another login account. I wanted to implement it for my Open Translation project.\nHowever, when I tried to find tutorials for using Clickpass with a Rails app, I couldn’t find any! How could it be! The pesudo code example Clickpass provided was for Java, I think, and thus it wasn’t any help to me. I was completely lost.\nThen I realized that in the core underlying architecture of Clickpass is OpenID. Then it all made sense to me. I found a great tutorial on OpenID and Authlogic on a Railscasts episode (I am not using Authlogic for my site, though, but for the Open Translation project, I probably will.). So the following is a mixture of the Railscasts episode, ruby-openid gem, open_id_authentication plugin and Clickpass setup.\n1. Install the gem and the plugin.\nsudo gem install ruby-openid ","title":"How to integrate Clickpass (and OpenID) with a Rails app","type":"posts"},{"content":"","date":"17 September 2009","externalUrl":null,"permalink":"/tags/openid/","section":"Tags","summary":"","title":"Openid","type":"tags"},{"content":"","date":"9 September 2009","externalUrl":null,"permalink":"/tags/feed/","section":"Tags","summary":"","title":"Feed","type":"tags"},{"content":"On Monday, I\u0026rsquo;ve gotten Facebook Feed publishing to work with my site, and it took about two hours including TV watching time. I could\u0026rsquo;ve done it faster if I actually paid a full attention. It was all possible, thanks to Chris Schmitt, who has an excellent tutorial on his site.\n1. Simply you first need to create a sub-class inherited from Facebooker::Rails::Publisher inside a controller. In my case, I wanted to publish a feed when a new playground is added and an existing playground is edited, so it made a sense to put it in playgrounds controller. publish_pg takes objects and sets parameters, and publish_pg_template creates a feed message based on those parameters.\nclass PlaygroundsController \u0026lt; ApplicationController [SNIP - other actions] class FacebookPublisher \u0026lt; Facebooker::Rails::Publisher def publish_pg_template one_line_story_template \u0026#34;{*actor*} created/updated: {*pg_name*}\u0026#34; short_story_template \u0026#34;{*actor*} created/updated: {*pg_name*} in {*pg_city*}, {*pg_state*}\u0026#34;, \u0026#34;Check out what {*actor*} said, and rate or add comments to help other parents!\u0026#34; end def publish_pg(pg, facebook_session) send_as :user_action from facebook_session.user data :actor =\u0026gt; facebook_session.user.first_name, :pg_name =\u0026gt; pg.name, :pg_city =\u0026gt; pg.city, :pg_state =\u0026gt; pg.state, :pg_id =\u0026gt; pg.id end end end 2. Then you need to create database to store templates. You can follow Chris\u0026rsquo; example exactly.\nclass CreateFacebookTemplates \u0026lt; ActiveRecord::Migration def self.up create_table :facebook_templates, :force =\u0026gt; true do |t| t.string :template_name, :null =\u0026gt; false t.string :content_hash, :null =\u0026gt; false t.string :bundle_id, :null =\u0026gt; true end add_index :facebook_templates, :template_name, :unique =\u0026gt; true end def self.down remove_index :facebook_templates, :template_name drop_table :facebook_templates end end 3. Finally you need to call the method, and you can do so by putting create in front, as Chris explains. In create action, I first check if logged-in user is a FB user, since if it\u0026rsquo;s called without existing facebook_session, it will barf. I have the similar check and call in update action for when a playground is edited.\ndef create [SNIP] if @playground.save if @current_user.facebook_user? flash[:user_action_to_publish] = FacebookPublisher.create_publish_pg(@playground, session[:facebook_session]) end redirect_to playground_path(@playground) else render :action =\u0026gt; \u0026#34;new\u0026#34; end end Oh, and also, don\u0026rsquo;t forget to add the following between tags in app/views/layouts/application.html.erb so that FB Feed window pops up after create or update action.\n\u0026lt;%= fb_connect_javascript_tag %\u0026gt; \u0026lt;% init_fb_connect \u0026#34;XFBML\u0026#34;,\u0026#34;Api\u0026#34; do %\u0026gt; \u0026lt;%= fb_user_action(flash[:user_action_to_publish]) if flash[:user_action_to_publish] %\u0026gt; \u0026lt;% end %\u0026gt; Happy integration!\n","date":"9 September 2009","externalUrl":null,"permalink":"/2009/09/09/integrating-facebook-feed-with-a-rails-app/","section":"Posts","summary":"On Monday, I’ve gotten Facebook Feed publishing to work with my site, and it took about two hours including TV watching time. I could’ve done it faster if I actually paid a full attention. It was all possible, thanks to Chris Schmitt, who has an excellent tutorial on his site.\n1. Simply you first need to create a sub-class inherited from Facebooker::Rails::Publisher inside a controller. In my case, I wanted to publish a feed when a new playground is added and an existing playground is edited, so it made a sense to put it in playgrounds controller. publish_pg takes objects and sets parameters, and publish_pg_template creates a feed message based on those parameters.\nclass PlaygroundsController \u003c ApplicationController [SNIP - other actions] class FacebookPublisher \u003c Facebooker::Rails::Publisher def publish_pg_template one_line_story_template \"{*actor*} created/updated: {*pg_name*}\" short_story_template \"{*actor*} created/updated: {*pg_name*} in {*pg_city*}, {*pg_state*}\", \"Check out what {*actor*} said, and rate or add comments to help other parents!\" end def publish_pg(pg, facebook_session) send_as :user_action from facebook_session.user data :actor =\u003e facebook_session.user.first_name, :pg_name =\u003e pg.name, :pg_city =\u003e pg.city, :pg_state =\u003e pg.state, :pg_id =\u003e pg.id end end end **\n","title":"How to integrate Facebook Feed with a Rails app","type":"posts"},{"content":"","date":"5 September 2009","externalUrl":null,"permalink":"/tags/aws/","section":"Tags","summary":"","title":"Aws","type":"tags"},{"content":"I just moved my PlaygroundsRUs site from AWS to Heroku, and I couldn\u0026rsquo;t be happier. My first full month bill from Amazon was about $75, and $74 of that (99% of the total cost) was for running an instance. Harlan told me about Heroku after he deployed his ForkThis demo on there.\nMost of the transition was smooth, but there were a few hiccups on the way. One of them still hasn\u0026rsquo;t been resolved (one of the plugins is having conflict with PostgresSQL, which is used by Heroku). I will enumerate what I had to go through so that it might be easier for you.\n1. Secret YAML files\nI have a public GitHub account for deploying on AWS using ec2onrails. Since it\u0026rsquo;s public and anyone can see it, I had to omit sensitive .yml files in config directory that contained passwords and keys. It\u0026rsquo;s easily done by specifying those files in .gitignore and listing them in :nonvc_configs in config/deploy.rb used by ec2onrails.\nI found out that for Heroku, the same can be achieved by creating another branch, including those files, merging with master, and pushing it to Heroku. So, the following lines should do the trick.\ngit checkout production [remove those yml files from .gitignore] git merge master git push heroku production:master 2. gems\nIt pays to read through documentations. I thought it might be easier to install/unpack gems in vendor directory, since I wasn\u0026rsquo;t sure how gems would be installed for my app on Heroku. But, they made it very easy. Just follow direction here and list those gems required by your app in .gems file. Can\u0026rsquo;t get any easier than that.\n3. paperclip\nLast is paperclip. I use it to upload pictures for each playground object. Since you can\u0026rsquo;t write direct on Heroku\u0026rsquo;s file system, it makes sense to use Amazon\u0026rsquo;s s3. Heroku document actually says that Heroku runs on the Amazon platform and thus s3 transfer is free.\nJust like ec2onrails, you can use s3.yml to specify access_key and access_secret. You could also follow direction on Heroku here, but I found out that Heroku\u0026rsquo;s example is missing one critical parameter, :path. Without :path parameter, you will get an error. There is an excellent example of using paperclip on Heroku by Pedro. It\u0026rsquo;s definitely worth checking out.\nSo, my model that accepts attachments have the following lines.\nhas_attached_file :data, :styles =\u0026gt; { :thumb =\u0026gt; \u0026#34;50x50#\u0026#34;, :large =\u0026gt; \u0026#34;600x400#\u0026#34; }, :storage =\u0026gt; :s3, :s3_credentials =\u0026gt; \u0026#34;#{RAILS_ROOT}/config/s3.yml\u0026#34;, :path =\u0026gt; \u0026#34;:attachment/:id/:style.:extension\u0026#34; While my s3.yml looks like the following.\nstaging: access_key_id: [Your Key] secret_access_key: [Your Secret] bucket: [Your bucket name] production: access_key_id: [Your Key] secret_access_key: [Your Secret] bucket: [Your bucket name] Oh, and there is Firefox plugin - S3Fox - for managing Amazon s3. It\u0026rsquo;s SO good. You gotta check out. I love the whole rails community and Firefox. They rock!\n","date":"5 September 2009","externalUrl":null,"permalink":"/2009/09/05/deploying-a-rails-app-on-heroku-paperclip-gems-yml/","section":"Posts","summary":"I just moved my PlaygroundsRUs site from AWS to Heroku, and I couldn’t be happier. My first full month bill from Amazon was about $75, and $74 of that (99% of the total cost) was for running an instance. Harlan told me about Heroku after he deployed his ForkThis demo on there.\nMost of the transition was smooth, but there were a few hiccups on the way. One of them still hasn’t been resolved (one of the plugins is having conflict with PostgresSQL, which is used by Heroku). I will enumerate what I had to go through so that it might be easier for you.\n1. Secret YAML files\nI have a public GitHub account for deploying on AWS using ec2onrails. Since it’s public and anyone can see it, I had to omit sensitive .yml files in config directory that contained passwords and keys. It’s easily done by specifying those files in .gitignore and listing them in :nonvc_configs in config/deploy.rb used by ec2onrails.\nI found out that for Heroku, the same can be achieved by creating another branch, including those files, merging with master, and pushing it to Heroku. So, the following lines should do the trick.\ngit checkout production [remove those yml files from .gitignore] git merge master git push heroku production:master **\n","title":"Deploying a Rails app on Heroku (paperclip, gems, yml)","type":"posts"},{"content":"","date":"5 September 2009","externalUrl":null,"permalink":"/tags/ec2onrails/","section":"Tags","summary":"","title":"Ec2onrails","type":"tags"},{"content":"","date":"5 September 2009","externalUrl":null,"permalink":"/tags/playgroundrus/","section":"Tags","summary":"","title":"Playgroundrus","type":"tags"},{"content":"Last weekend, I attended SF Women 2.0 Startup Weekend. At first, I didn\u0026rsquo;t know what to expect, but I ended up having a blast. I wasn\u0026rsquo;t sure if I wanted to pitch my idea, but I decided to do it while taking a shower in the morning. No one ended up joining my team, and I think it was just wrong crowd to pitch an idea around solar industry. I ended up joining an eccentric geek, H@rlan Knighwood, and worked on his project, ForkThis. He coined it \u0026ldquo;Massively Parallel Creative Collaboration Engine\u0026rdquo;, which sounded like a title of a Ph.D. thesis. We had four core members and two floaters, and one of the member and I came up with gentler, funnier explanation, F riendly O nline R apid K ollaboration. What he has is a really cool idea. Anyone can start an idea, and anyone else can take the idea and \u0026ldquo;fork\u0026rdquo; it. After many forks, original forker can see what the differences are (similar to diff in unix-like OS) and accept/reject them and update the original idea. The team talked about different business models, but my personal opinion was that first focus should be to make it free and get as many as users possible. A few obvious options would be charging for private collaboration (Github) or charge for packaged solution (Zimbra). Anyhow, over the weekend, I added external forking - scraping external site\u0026rsquo;s page and creating a new fork - and twitter integration - option to tweet a new fork. Harlan worked on creating javascript snippet for website owners to copy and paste to their sites and massaging format after scraping.\nOverall, it was a really cool experience. About 170 people showed up and 38 people pitched their ideas. 100\u0026rsquo;s of people getting together in one place, some pitching ideas, forming instant teams, and creating product/service and basically starting a company in 54 hours! It just can\u0026rsquo;t get any cooler than this. Startup Weekend takes a place in many other cities (not all of them simultaneously), but the turn-out in SF should top the list. There are just so many interested in starting a company.\nThe pitches were also quite interesting, too. Some outrageous, some out of this world, and some really useful. Those with familiar concept (web 2.0, social networking, and twitter) were able to form a team easily. On the last day was presentation and demo, and the one that looked coolest was Foodspotting. They came with something that was already in progress, and thus didn\u0026rsquo;t start from the scratch at the event. To be fair, Harlan already had working demo he came in, too. However, Foodspotting was probably the most stunning visually. All their graphics were all slick and looked very polished. Whoever there designer was, s/he was awesome. One of the judge panelists pledged $5,000 to Foodspotting in funding before he left.\nMy philosophy around web sites was functionality/simplicity first and looks second. Perhaps I should think differently about that? Users are humans, and I think it\u0026rsquo;s something you can\u0026rsquo;t get away with. Humans are naturally drawn to beautiful things from building to opposite sex. Having an awesome designer is definitely an asset.\nAnyhow, the whole 54-hours took me back to college years. Teams of people working on interesting stuff, friendly people willing to answer and help others - not just team members, and overall just aurora of creativity, drive and affinity. Again, I had a blast and I wish I can help host one in Korea as well.\nThe following is a slide of pictures I took at the Startup Weekend.\nTeam Members: Harlan Knight Wood, Yang Chung, Tee Chapple, Toya Thomas-Cruz, Olivier Minkowski, John Weiss\nJohny and I are interviewed at 8:18 mark\n","date":"1 September 2009","externalUrl":null,"permalink":"/2009/09/01/sf-women-2-0-startup-weekend-wrap-up/","section":"Posts","summary":"","title":"SF Women 2.0 Startup Weekend Wrap-up","type":"posts"},{"content":"","date":"1 September 2009","externalUrl":null,"permalink":"/tags/startup-weekend/","section":"Tags","summary":"","title":"Startup-Weekend","type":"tags"},{"content":"","date":"1 September 2009","externalUrl":null,"permalink":"/tags/women-2.0/","section":"Tags","summary":"","title":"Women-2.0","type":"tags"},{"content":"When I set out to translate Paul Graham\u0026rsquo;s Why to Not Not Start a Startup to Korean, my former colleague who is much better in written Korean helped me. I read the article before, but re-reading it and discussing it with the former colleague made me realize that there are two very fundamental cultural differences that prevent many people, especially the young, from starting a company.\nThe first is very bad stigma against failure. In Korean society, they have deep seeded notion that success is measured by the path you take in life - where you went to school, where you work, what title you have, where you live, who you marry, etc. Any deviation from that is frowned upon. It doesn\u0026rsquo;t mean there isn\u0026rsquo;t anyone like that, but it\u0026rsquo;s very rare. Those who don\u0026rsquo;t follow the \u0026ldquo;right\u0026rdquo; path is considered failure and treated as such. And they wouldn\u0026rsquo;t be able to get a good job or will not be promoted high enough even if s/he has a job, because they don\u0026rsquo;t have the right credentials. Considering that, failure from a startup company is even worse. When you do, getting a job becomes extremely hard. There is an additional element of lack of venture funding. That means most startups are infused with founders\u0026rsquo; money or loan, and if they fail, they lose literally everything.\nThe second is age hierarchy. Because in Confucius society (which Korea society is based on), you have to respect the elders, it\u0026rsquo;s very hard to challenge any notion from the elders. It had also seeped into corporate culture, where people are promoted mostly based on ages. Thus, people with higher titles tend to be older. And thus, it\u0026rsquo;s hard to challenge them, culturally. That totally kills or severely limits innovations.\nThose two reasons alone would be enough to inhibit anyone from attempting to start a company.\nA stereotype say Asians generally study harder and score higher in test exams. That in no way means higher intelligence or smartness. What matters in a startup is not book smart, but almost start smart and being resourceful. That\u0026rsquo;s why hackers are better fit for founders of startups.\n","date":"1 September 2009","externalUrl":null,"permalink":"/2009/08/31/why-there-are-not-many-startups-in-korea/","section":"Posts","summary":"","title":"Why there are not many startups in Korea","type":"posts"},{"content":"내 가 Silicon Valley에 온 이유는 high-tech회사를 창업을 하고 싶어한 이유였다. 거의 nothing에서 something을 만들어내고 부를 만들수 있다는 것이 참 묘한 매력이 있었다. 하지만 창업에는 marketing이나 영업에 경험이 필요하다 생각하여, 그쪽으로 career를 바꾸었으나, Paul Graham의 essay를 읽고, 그가 하는 Y-combinator라 하는 incubator의 한 leader이자 Paul의 아내인 Jessica Livingston이 지은 Founders at Work 라 는 책을 읽고는 이제서야 다시 software developer로 다시 career를 바꾸려 한다. 거의 모든 성공적인 high-tech회사들은 engineer가 시작했다. 하지만 벌써 가족이 있는 난 너무 늦은것 같다. 하지만 다른 젊은 사람하나라도 이 글들을 읽고 성공할 수 있으면 하는 것이 나의 바람이다. 번역을 하면서 다시 essay를 읽었는데, 한국과 미국의 문화적 차이를 확실히 느끼게 하며, 왜 한국에 startup회사들이 많이 없는지 알수 있을것 같다. 참 안타까운 일이다. 하지만 이 essay를 쓰는 이유는 독자 중 1%만 창업을 하고 성공해서 한국의 startup 문화를 바꿀수 있으면 하는 바램이다.\n이번 essay를 시작으로 Paul Graham의 많은 essay를 한글로 번역할 예정이다. 이미 Paul Graham에게는 허락을 받은 상태이다. Paul Graham은 Viaweb이라는 최초의 application service provider software을 lisp언어로 써 고객이 자신의 e-commerce site을 짓고 운영할 수 있게 했다. 나중에 Yahoo에 팔아 나중에 Yahoo! Store이 되었다. 그후 Y-Combinator라는 incubator회사를 만들어 많은 web 2.0회사를 투자헀고, 조언을 해 주었다. 내 개인적으로도 최고로 존경하는 사람이다.\n왜 창업을 해야 하나?\n2007년 3월\n(이 에세이는 2007 년 Startup School 과 버클리 CSUA에서 발표를 바탕으로 기고했습니다.)\n지금은 Y-Comibator의 성공율을 측정 할 만큼 운영해 왔다고 생각한다. 2005 년 여름에는 8개의 회사가 있었다. 그 중 최소 4개는 성공적이었다. Reddit과 Infogami는 합병했고, 또다른 회사가 합병이 되었으나, 말 할수는 없다. 또 다른 회사는 너무나 잘 돼서 원하면 10분안에 인수될수 있는 Loopt이다.\n그래서, 처음 여름에 시작했던 창업자들 중에 반정도가 그들의 기준으로 봐서는 부자가 되었다. (한가지 배운점은 부자의 종류가 여러가지 있다는 것이다).\n그러나, 우리의 성공율이 항상 50%일 것이라고는 장담을 할 수 없다. 처음은 예외일 수가 있다. 하지만 우리는 항상 이야기하는 10%의 성공율 보다는 잘 할수 있을것이다. 한 25%정도는 안전한 숫자로 생각된다.\n실패한 창업자들도 그렇게 나쁜 시간을 가졌다는 생각을 하지 않는 듯 한다. 8개 회사 중 3개는 죽었을 것이다. 그 중 두 개는 여름 끝에 다른 일을 찾았다. 그들이 큰 상처를 입었다고 생각하지는 않는다. 가장 상처를 많이 받았을 회사는 일년 동안 열심히 일했지만 Google Calendar에 밀린 Kiko이였다. 하지만 끝은 행복하게 되었다. eBay에 100만 달러에 팔았기 때문이다. Angel 투자자들에게 돈을 돌려준 이후 그들은 한 1년 동안의 연봉 만큼을 건졌다.\n\\[1\\] 그 이후 그들은 바로 새롭고 더 재미있는, Justin.TV라는 회사를 창업했다.\n그래서 여기에 더욱 놀라운 통계가 있다: 처음 창업자들은 아무도 고통적인 경험을 하지 않았는 것이다. 여느 startup처럼 좋은 일과 나쁜 일이 있었지만, 아무도 직장에 다니는 일과 바꾸지는 않을 것이라고 생각한다. 이 통계는 예외가 아닐 것이다. 장기적인 성공율이 무엇이든지, 일반적인 직업을 갖고싶어하는 창업자는 아무도 없을 것이다.\n그럼 나에게 가장 큰 미스테리는, 왜 더 많은 사람들이 창업을 않하는 것일까? 거의 모든 창업자들이 일반 직장을 싫어하고 높은 비율이 부자가 되는데, 왜 모든 사람이 창업을 하지 않을까? 많은 사람들이 자금신청을 수천개를 받을 것으로 생각하나, 사실은 수백개에 그친다. 왜 더 많이 신청하지 않을까? 창업되는 회사가 꾀 많은 것 같지만 창업에 필요한 기술을 가지고 있는 사람들에 비해 작다. Programmer의 대부분이 대학 졸업 후 평범한 직장을 찾아, 그 곳에 머물고 만다.\n사람들은 자기 자신의 이익과 반대로 행동하는것 같다. 왜 그럴까? 답은 있는것 같다. Y-Combinator가 벤처 자금 지원 절차의 매우 시작에 있기 때문에, 창업에 대해 불확신이 있는 사람들의 심리에 대해서는 알수있는 이는, 우리만큼 좋은위치에 있는 회사는 없을 것이다.\n불확신이 항상 나쁜것은 아니다. 당신이 창업을 생각하고 있는 hacker (Paul Graham의 hacker는 보통 사람이 생각하는 hacker가 아님. 그의 hacker는 어떤 수로든, 어떻게든 많들어 내는 programmer임) 라면, 불확신은 지극히 당연한것이다. Larry와 Sergey도 Google시작전에, Jerry와 Filo도 Yahoo시작전에 똑같이 불확신을 가지고 있었다. 사실은 성공적인 startup들의 거의가 너무 확실한 사업자들 보다는 불확실한 hacker가 시작하였다.\n이것들을 증명하는 몇 가지 증거가있다. 우리가 투자하고 성공한 startup들 중에 많은 곳들이 거의 마지막순간에 자금신청을 하기로 결정했다고 했다. 일부는 마감일 몇 시간전에 결정 하기도했다.\n불 확실성을 다루는 방법을 구성 요소로 분석하는 것이다. 누가 뭔가를 꺼려 대부분의 사람들은, 약 8 여러 가지 이유가 함께 머리를 혼합되어서 어떤것이 가장 큰이유인지 모른다. 어떤 것은 정당하고, 어떤 것은 가짜이지만, 상대적인 비율을 모른다면 전반적인 불확성이 정당한지, 가짜인지 모를 것이다.\n그래서, 난 사람들의 창업을 꺼려하는 요소들을 나열하고 어떤 것들이 정당한 것인지 설명할 것이다. 그럼 창업을 생각하는 사람들이 자신의 감정을 점검할 수 있는 체크리스트로 쓸수 있을것이다.\n내 목표는 당신의 자신감을 높이는 것이다. 하지만 이것은 보통 자신감을 높이는 것과는 두 가지 점이 다르다. 첫째, 나의 동기는 솔직함이다. 자신감을 높이는 사업을 하는 사람들은 사람들이 그들의 책을 사거나 당신이 얼마나 위대한가를 말해주는 세미나에 참석하면 벌써 목표를 달성한 것이다. 창업을 해야 되지 않은 사람을 장려하면, 내 인생은 더 피곤해진다. 너무 많은 사람들을 Y-Combinator에 신청하도록 권장 하면, 내 일은 더 많아지게 된다.\n둘째는 나의 방법이다. 난 긍정적인 대신, 부정적일 것이다. 할수 있다고 말하는 대시, 난 당신이 창업을 하지 않고있는 이유를 보여주고, 왜 거의 모두가 무시되어야 하는지 말해주겠다.\n그럼, 우리모두가 가지고 태어난 것부터 시작하겠다.\n1. 너무 어린나이\n많은 사람들이 자신은 너무 어리다고 생각한다. 그렇다. 전세계의 평균연령은 27세 임으로, 전체 인구의 1/3정도는 너무 어린것은 사실이다.\n하지만 뭐가 너무 어린것일까? Y-Combinator의 목표중의 하나는 창업자의 하안값 나이를 알아 내는 것이었다. 우리가 보기에는 투자자들이 너무 보수적인것 같았다. 그들은 학사나 석사학생들에게 투자해야 할때, 대학 교수에게 투자하고 싶어 했다.\n우리가 창업자의 나이를 계속 내리는 중 발견한 중요한 결론은 얼마나 내려갈수 있는가 보다는 나이가 중요하지가 않다는 것이다. 18세 미만은 합법적으로 계약을 할 수 없어서 그 아래는 보지 않아서 그런지, 16세가 한도인것 같다. 하지만 가장 성공적인 창업자는 투자당시 19세 였던 Sam Altman이었다.\n하지만 Sam Altman은 외곽의 데이터 포인트이다. 그는 애어른 이었다. 19세일때, 마치 안에는 40세가 들어 있는듯 했다. 많은 19세들은 마치 안에 12세가 있느둣 하는데도.\n성인이라는 단어를 특정 연령이상의 사람들에게 쓰는 이유가 있다. 어는 정도에는 선을 넘는다. 이것이 통상 21이지만, 사람들은 다양한 나이에 그 선을 넘는다. 당신이 그 선을 넘었다면, 창업하기에는 충분하다.\n그것을 어떻게 알까? 몇가지 테스트가 있다. 사실은 Sam Altman을 만난 이후에 알게 되었다. 그와 이야기를 하면, 훨씬 나이가 많은 사람과 이야기 하는것 처럼 느껴졌다. 그 후, 난 도대체 무었을 측정 하는 거지 하고 느꼈다. 무엇이 나이가 많은것 처럼 느껴지게 많들었을까?\n하나의 테스트는 아이같은 찌질 반사성이 있냐는 것이다. 어린 아이에게 힘든것을 시켰을때, 그 아이가 울면서 못한다고 하면, 어른은 그냥 괜찮다고 할 것이다. 어린 아이들은 어려운 상황에서 빠져 나올수 있는“나는 어린 아이”라는 마법의 버튼이 있다. 하지만, 성인은 그 것이 허용되지 않는다. 그럴수도 있지만, 그럼 무 자비하게 정리가 된다 (미국에서는).\n다른 테스트는 도전에 어떻게 반응 하느냐이다. 성인이 아직 않이라면, 성인의 지배력을 인정하는 방법으로 도전에 반응한다. 성인이 “그것은 아주 바보같은 생각이야”하면 바로 꼬리를 다리 사이에 숨기면서 기어들어가지 않으면 반항을 한다. 반항은 순종과 같은 열등감을 추정한다. 성인의 “그것은 아주 바보같은 생각이야”에 대해 맞는 반응은 그의 눈을 똑바로 보며, “그래요? 왜 그렇게 생각하죠?” 라고 물어 보는 것이다.\n그렇다고 성인이 도전에 대해 어린애 같이 않대하는 것은 아니다. 하지만, 어린 아이가 어른처럼 도전에 반응하는 것은 드물다. 그렇게 되면, 당신은 나이와 관계없이 성인이다.\n2. 충분하지 않은 경험\n전에 창업을 하려면 최소한 23세가 되어야 하고 직장생활을 2년 정도 했어야 한다고 쓴적이 있다. 더이상 그렇게 믿지 않는데, 그 이유는 우리가 투자한 회사들 때문이다.\n아직도 23세살이 21살보다 낫다고 생각하지만, 21세때 경험을 싸을수 있는 좋은 방법은 창업을 하는 것이다. 역설적으로 너무 경험이 없으면, 창업을 해야 한다. 그것이 직장생활보다 춸씬 효율적인 치료법이다. 사실은 직장을 잡는 것이 오히려 오피스가 있어야지 일을하고 product manager가 어떤 program을 만들어야 하는지 말을 해야 줘야 하도록 생각하는 길들어진 동물이 되어, 더 창업하기 어렵게 된다.\n이것을 확신하게 만든것은 Kikos였다. 그들은 바로 대학졸업후 시작했다. 그들의 미숙함이 실수를 많이하게 발생했지만, 1년후에 그들의 두번째 회사를 투자했을떼는, 그들은 매우 강했다. 그들은 확실히 길들여진 동물들이 아니었다. 만약 그들이 Microsoft나 Google에 1년 있었으면, 그렇게 빠르고 크게 성장할수 없었다. 그들은 아직되 자신없는 어린 프로그래머로남아 있었을것이다.\n그래서, 난 사람들에게 대학졸업 후 바로 창업을 하라고 권장한다. 젊을 때 만큼 위험을 감수하기 좋을 때가 없다. 물론 실패를 할 것이다. 하지만 실패가 직장을 잡는 것 보다 인새의 궁극적인 목표를 빨리 얻을 것이다.\n우리의 돈으로 실패를 통해 배우라고 권장해 좀 걱정이 되지만, 이것은 사실이다.\n3. 충분하지 않은 의지\n창업자로 성공하려면 강한 의지가 필요하다. 아마 성공 여부의 최고의 예측기일 것이다. 어떤 사람들은 성공하기에 충분하게 강한 의지가 없을수 도 있다. 나의 의지가 강하기 때문에 그렇지 않은 사람들의 머리 속에 어떤지는 말하기가 어렵다. 하지만 그들이 존재하는것은 확실하다.\n대부분의 hacker들은 자신의 의지를 과소평가한다. 난 그들의 의지가 창업사를 운영하면서 점점 강해지는것을 많이 보았다. 많은 창업주들이 처음 투자를 했을 때는 2백만 달러에 인수만 되도 기뻐했을 텐데, 지금은 세계를 점령하고 싶어한다.\nLarry와 Sergey 자신들도 창업을 할까 불확실했으때, 당신은 어떻게 알수 있을까? 나의 예측이지만, 내 생각에는 당신이 자기 자신만의 일을 만들어서 할 만큼의 의지가 있는지가 좋은 테스트라고 생각한다. Larry와 Sergey가 창업을 할지 확신이 없얼지라도, 유순하게 조언자의 말만 듣는 연구 조교만은 아니였던것이 확실하다. 그들은 자기 자신들만의 프로젝트를 시작했었다.\n4. 충분하지 않은 영리함\n창업자로 성공하려면 어느 정도 똑똑해야 하나, 이것에 대해 걱정한다면 잘못 생각하고 있는 것이다. 자기 자신이 창업할만큼 충분히 똑똑하지 못할것이라고 걱정할만큼 똑똑함으로도 충분하다.\n많은 경우에, 창업을 하는데는 많은 영리함이 필요없다. 일부는 필요하다. Mathematica(수학 program)을 만들려면 수학에 능통해야 한다. 하 지만, 많은 회사들의 중요한 것들은 결정적인 요인이지 두뇌가 아니다. 똑똑함을 중요시하는 cult때문에, Silicon Valley의 관점은 다를수도 있다. 하지만, 높은 영리함이 부자가 되는데 중요하다고 생각한다면, New York이나 LA의 비싼곳에 가보면 알수 있을 것이다. (영리하지않는 부자가 많다는 말).\n만약 당신이 기술적으로 힘든 회사를 창업을 할만큼 똑똑하지 않다고 생각하면, 그냥 기업형 소프트웨어를 만들어라. 기업형 소프트웨어회사들은 기술회사가 아니고 영업노력에 달려있는 영업회사이다.\n5. 비즈니스에 대해 잘 모름\n이것 또한 변수가 0야 되는 계수이다. 사업에 아무것도 모른 채 창업을 할수 있다. 최초의 초점은 제품이 되어야 한다. 이 단계에서 제일 중요한것은 사람들이 원하는 제품을 만드것이 모두다. 성공하면, 돈을 벌수있는 방법에 대한 생각을해야한다. 하지만 너무 쉬어서 금방 배울수 있다.\n뭔가 대단한 것을 만들고 돈버는 것에 신경쓰지 말라는 것에 대해 비평이 많지만, 모든 경험적 증거는 인기있는 것을 만드는 회사의 모두가 돈은 버는 방법을 찾은 것으로 말해주고 있다. 그리고, 인수자들도 회사인수의 목적이 돈이 아닌 전략적 가치로 따로 말해 주었다. 그 말은, 창업자들이 사람들이 원하는 것을 만들었다는 것이다. 인수자들은 이것 들이 사실이라는 것을 알고 있다. 사용자가 당신의 제품을 사랑한다면, 언제나 그들을 통해 돈을 벌수 있다. 그렇지 않다면, 이 세상에서 가장 뛰어난 business model도 돈을 벌수 없다.\n그런데, 왜 많은 사람들이 나와 논쟁을 할까? 난 그 이유중 하나가 20세들이 돈을 못벌지만 멋진 것으로 부자될수 있다는 아이디어가 싫은 것 같다. 그들은 그런 가능성이 싫은 것이다. 하지만 얼마나 가능한지는 그들의 원하는데 의존하지 않는다.\n한동안 나에 대해서 감수성이 예민한 젊은 해커들을 파멸로 의도하는 나쁜사람으로 말하는 것이 성가셨다. 하지만 지금은 이러한 논쟁이 좋은 아이디어의 신호라고 믿는다.\n가장 가치있는 진리는 대부분의 사람들이 믿지 않는 것들이다. 마치 undervalue된 주식 같이. 그런 것들로 시작하면, 아주 좋은 시작이다. 그래서 당신의 좋은 생각을 많은 사람들이 반대한다면, 그런 반대를 무시하다 밀어 붙여하한다. 이경우에서는 돈을 쉽게 벌수 없을 듯한 멋있는 아이디어를 추구하는셈이다.\n당신이 인기있는 것을 못 만들면, 우리는 그것으로 돈을 벌수 없다는 것에 1차 투자를 베팅하는 것이다.\n6. 동업자\n동업자가 없다는 것은 정말 문제이다. 창업은 혼자하기에 너무 힘들다. 다른 투자자들과 많은 의견이 틀려도, 이것만은 동의한다. 모든 투자자들이 예외없이 동업자가 있는 회사에 투자할 가능성이 훨씬 높다.\n혼자서 시작하는 회사를 2개 투자한적이 있는데, 그들의 첫 번째 우선순위가 동업자를 빨리 찾는 것이었고, 둘 다 찾았다. 하지만 그들이 동업자와 같이 투자신청하기를 원했었다. 투자를 받은후 동업자를 찾는것은 어렵지 않기 때문에 그전에 어려운 일을 같이 하기로 한 동업자가 있는 회사를 더 선호한다.\n만약 당신이 동업자가 없으면 어떻게 하나? 무조건 하나 잡아야 한다. 무엇보다도 중요하다. 만약 주위에 같이 할 사람이 없으면, 찾을수 있는 곳으로 이사를 가야한다. 당신의 현재 아이디어로 같이 할 동업자가 없으면, 아이디어를 바꿔라.\n대학교에는 잠재적인 동업자가 깔려있다. 졸업하고 나면, 한참 힘들어 진다. 그 수가 줄어들 뿐만 아니라, 벌써 직장이 있거나 가족을 지원해야 할수도 있다. 만약 창업에 관해 많이 이야기 했던 학교친구가 있으면, 계속 연락을 하고 지내라. 그럼 꿈을 계속 보존할 수 있을 것이다.\n사용자의 그룹이나 컨퍼런스에서도 동업자를 만날수 있다. 하지만 나 같은면 너무 낙관적이지는 않을 것이다. 누구와 같이 일을 해봐야 동업하고 싶은지 알수있다. \\[2\\]정말 배워야 할것은 어떻게 동업자를 찾는 것이 아니라 창업은 동업자가 많은 어렸을때 해야 한다는 것이다.\n7. 아이디어가 없음\n거의 모는 회사가 그들의 아이디어를 바꾸기 때문에, 좋은 아이디어가 없어도 괜찮다. Y-Combinator의 투자 회사의 아이디어 중 한 70%는 처음 3개월후에는 전혀 새것으로 변한다. 때로는 100%가 바뀐다.\n사실은, 창업자가 아이디어보다 훨씬 더 중요하다고 생각하기 때문에, 이번 투자시기에는 새로운 것을 시도하기로 했다. 사람들에게 아이디어 없이도 신청하도록 할 것이다. 원하면 신청서에서 아이디어를 물어 보는 질문에 그냥 모른다고 적어도 된다. 만야 당신이 뛰어나면, 그냥 받아주겠다. 같이 뭔가 끝내주는 것을 만들어 낼것으로 자신한다.\n이것은 정말로 우리의 운영방식을 그대로 보여주는 것이다. 아이디어에는 별로 중요하지않다. 그냥 예의 상 물어 보는 것이다. 진짜로 중요한 질문은 전에 어떤 멋있고 끝내주는것을 만들어 보았는지이다. 당신이 만들었던것이 유망 회사의 버전 1이면, 더욱더 좋지만, 당신이 무엇을 만드는 것을 잘하는지가 제일 중요하다. 인기있는 오픈 소스 프로젝트의 수석 개발인것도 높이 쳐준다.\n바로 위에 것들은 Y-Combinator에서 투자를 받은 다음의 문제를 해결한다. 일반적인경우는? 아이디어가 없으면 문제가 되지 않는가? 아이디어 없이 창업하면 그 다음엔 뭐하지?\n창업 아이디어를 찾는 쉬은 방법은 이것이다. 당신의 인생에서 없는 것을 찾아서, 아무리 특별해도, 그것을 공급해라. Steve Wozniak은 자기 자신을 위해 컴퓨터를 만들었지만, 그 많은 사랍들도 컴퓨터를 원하는지 아무도 몰랐다. 제한되었지만 순종의 아이디어가 크고 광범위한 아이디어 보다 훨씬 나은 출발점이다. 그럼으로, 문제가 간단하게 토요일인데도 테이트가 없는데, 다른 많은 사람들이 같은 문제가 있기 때문에, 그것을 software로 해결하려 하면, 아주 좋은 생각일수 있다.\n8. 너무 많은 신생 기업들\n많은 사람들이 계속 늘어나는 신생기업들을 보고, 이건 더이상 계속 될수 없다고들 하기도 한다. 그속에 들어 있는 함축적인 것은 그릇된 생각이다 – 신생기업의 수에는 한계가 있다. 하지만 이것은 잘못된 것이다. 아무도 1000명의 회사들에 연봉을 받으며 일할수 있는 사람들의 수에 한계가 있다고 하지 않는다. 왜 5명의 회사에서 주식을 받으며 일하는 사람들의 수에 한계가 있어야 하나? \\[3\\]거의 모든 일을 하는 사람들은 어떤 필요성을 만족시키고 있다. 회사들은 작은 단위로 나눈다 해도, 그 필요성이 없어지지는 않는다. 현재의 필요성은 신생기업의 네트워크로, 몇 거대한, 계층적 조직 보다 더 효율적으로 만족시킬 수가 있지만, 그 만족이 더 많은 필요성으로 이어지기 때문에, 그렇다고 해서 기회가 더 적은것은 아니다. 물론 이것이 개인의 경우일 경향이있다. 그렇다고, 잘못된것은 아무것도 없다. 우리는 중세의 왕이 엄청나게 사치로나 생각할수 있는 항상 봄날씨같은 온도를 유지 할수있느 AC/Heater 시스템을 당연한 것으로 생각한다. 나쁜일이 일어 나지 않으면, 우리의 자손들은 우리가 지금 엄청나게 사치로 생각하는 것들을 당연한 것이라고 생각할것이다. 부의 절대적 표준은 없다. 건강이 한 요소이고, 그것만 하면 끝이 업다. 예측 가능한 미래까지는, 사람들은 계속 부를 축척하려 할 것임으로, 회사의 일의 양에는 끝이 없을 것이다, 특히 신생기업들은.\n보통 제한된 오류는 직접적으로 표현되지 않는다. 보통 Google이나 Microsoft, Yahoo가 살수 있는 신생업체에는 한계가 있다는 식으로. 하지만 인수할 수 있는 회사의 수는 아마도 꽤 더 많을 것이다. 다른 인수자를 생각한다면, Google은 바보가 아니다. 큰 회사들이 신생업체들을 사는 이유는 그들이 가치를 만들었기 때문이다. 개인이 원하는 부의 한계가 없듯이, 왜 큰 회사가 살 수 있는 가치 있는 신생업체에 한계가 있을수 있나? 한 회사가 동화할수 있는 신생업체의 수에는 실질적인 한계가 있을수는 있으나, 가치를 가질수만 있으면, 창업자가 미래의 큰 보답 대신 즉시 지불형태를 받는 식으로 할만큼, 인수자는 진화할 것이다. 시장은 그런 식으로 똑똑하다.\n9. 가족 지원\n이건 진짜다. 나는 가족이 있는 사람에게는 창업하라고 조언을 할 수 없다. 창업이 나쁜것 은 아니나, 그런 조언의 책임을 지고 싶지 않다. 22살 사람에게 창업하라고 하는 조언에는 책임을 지을 수 있다. 실패하면 어떤가? 그들은 많이 배울것이고, Microsoft에 충분히 갈수 있다. 하지만 부모들을 화나게 할수는 없다.\n가족이 있으면서 창업을 하려면, 컨설팅 사업을 시작해 천천히 제품의 비즈니스로 키울수도 있다. 경험으로는 그런식으로 성공할 가능성은 아주 작다. 이렇게 Google을 만들 수는 없다. 하지만 적어도 소득은 있다.\n위험을 감소 할수 있는 다른 방법은 창업을 하지 말고 신생업체에서 일하는 것이다. 처음 몇 사원의 한명이면 좋은점과 나쁜점보두 창업자나 거의 다를것이 없다. 당신의 위치는 창업자의 1/n^2, n = 직원수, 가 된다.\n동업자의 문제와 마찬가지로, 실제 배울점은 어려서 창업을 해야 한다는 것이다.\n10. 독립적으로 부유함\n이것은 나의 변병이다. 신생 스트레스가 많다. 돈이 필요 없으면 할 이유가 없다. 한 serial 창업자마다 한 20명의 정신이 제대로 된 사람들이, 또해? 미쳣니? 라고 한다.\n난 2번 거의 다시 창업을 하려했으나 4년동안 힌머리가 생기는 것이 싫어서 않했다. 창업에 대해 너무 잘 알아서 대충은 않된다는 것을 잘 안다. 뛰어난 창업자들이 위험한 이유는 그들이 무한하게 흰머리가 생기는 걸 견딜수 있는 의지이다.\n하지만 은퇴에도 문제가 있다. 많은 사람들과 같이, 난 일하는 것을 좋아한다. 부자가 되면 알게되는 것중에 하나는, 주변에 같이 일하고 싶은 흥미로운 많은 사람들이 부유하지 않다는 것이다. 그들은 살아갈 만큼 돈을 벌수 있도록 일을 해야 한다. 그들이 동료라면, 당신도 같이 살아갈 만큼 돈을 벌수 있도록 일을 해야한다. 난 이것이 바로 serial 창업자를 다시 창업하게 만든다고 생각한다.\n난 그래서 Y-Combinator에서 일하는 것을 너무 좋아 한다. 내가 좋아하는 흥미로운 사람들과 일할 수 있기 때문이다.\n11. 헌신의 준비가 않됨\n이것은 내가 20대때 창업을 하지 않은 이유이다. 다른 20대 처럼 난 자유가 너무 좋았다. 2~3개월 이상 해야 하는 일들은 꺼렸다. 또, 창업처럼 내 인생을 완전히 점령하는 것도 싫었다. 이 이유들은 괞찬은 것 들이다. 당신이 여행을 가고 싶던, 음악을 하고 싶건, 모두가 창업을 않하는 좋은 이유들이다.\n성공적인 신생업체를 하려면, 적어도 3~4년이 필요하다. 실패하면 더 빨리 끝날수 있다. 그렇기 때문에, 완전히 그만큼의 헌신의 준비가 않되있으면 시작도 하면 않된다. 하지만 잘 생각하라. 만약 보통 직장을 잡으면, 창업하는 만큼 많은 시간을 보내면서 뜻밖에도 여가시간도 적을 것이다. ID badge를 받고 orientation에 갈것이면, 당신은 창업의 준비가 된것이다.\n12. 구조가 필요함\n어떤 사람들은 인생에 구조(structure)가 필요하다고 들었다. 이것은 명령을 받아야 한다는 것을 좋게 말하는 것 같다. 그런 사람들이 존재 한다고 믿는다. 경험적인 증거는 많다: 군대, 종교 이단, 등등. 이들이 아마 다수일수도 있다.\n당신의 그들중에 하나면, 당영히 창업을 하면 않된다. 신생업체에 가서 일도 하면 않된다. 신생업체에서는 시키는 사람이 없다. CEO라는 사람 하나가 있을 수 있으나, 회사에 한 12명이 있을때 까지는 아무도 누구에게 일을 시키면 않된다. 그럼 너무 비효율적이 된다. 서로 각자 지시없이 뭘 해야 하는지 알고 있어야 한다.\n이것이 혼란할것 같으면 축구팀을 생각해 봐라. 가끔 코치가 소리 지르는 것을 빼고, 11명이 복잡하지만 서로 함께 호흡이 잘 맞는다. 한 기사가 David Beckham에게 Real Madrid에서 선수들이 8개 국가에서 왔으니 언어 문제가 없냐고 물었다. 그는 선수들이 말이 필요없어 아무 문제가 없다고 했다. 그들은 각자 자기가 해야 할일을 할 뿐이다.\n당신이 창업을 할만큼 독림적인 사람인지 어떻게 알수 있을까? 당신이 독립적이 아니라고 하는 제안에 신경이 곤두세워지면, 아마 독립적일 것이다.\n13. 불확실성의 공포\n어떤 사람들은 불확실성을 좋아하지 않아 창업을 꺼려할수 있다. Microsoft에 가면, 다음 2~3년이 어떨지 예측이 가능하다. 아니, 너무 확실하게. 창업을 하면, 어떤 일이든 일어날 수있다.\n불확실성에 대해 근심이면, 나에게 해결책이 있다 – 창업하면 실패할것이다. 하지만, 그것이 창업 경험에 대해 나쁘게 생각할 것도 아니다. 최고의 결과를 희망하지만, 최악을 기대하라. 최악의 경우, 흥미로운 경험을 하게 될 것이다. 최고의 결과는 엄청난 부자가 될것이다.\n진지한 노력을 했으면, 신생회사가 실패를 해도 아무도 당신을 비난 하지 않을 것이다. 전에는 고용주가 창업 실패를 않좋게 보았을 지라도 지금은 않그렀다. 내가 큰 회사의 manager들에게 물었을때, 그 들은 창업했다가 실패했던 사람을 같은 시간에 큰회사에 일했던 사람보다 선호 한다고 했다.\n그리고 게으름이나 불치의 어리석음에서 실패하지 않았다면, 투자자들도 미워하지 않는다. 유럽같은 곳에서는 실패가 큰 오명이라고 들었다. 미국에서는 다른 모든것처럼 어느 것이든지 처분이 가능하다.\n14. 무엇을 피하는 지 모른다.\n대학 졸업생보다, 1~2년 정도 일했던 사람들이 더 나은 창업자인 이유는 그들은 자신들이 무엇을 피하는지 알기 때문이다. 창업이 실패하면, 직장을 잡겠지만 그 직장생활이 얼마나 피곤한지 잘 안다.\n대학 여름때 인턴을 했으면, 그게 직장생활이라고 생각할수 있으나, 그렇지 않다. High-tech회사의 인턴은 일이 아니다. 웨이터로 일을 했으면, 그것은 진짜 일이다. 자신의 무게를 수행한것이다. Software회사는 나중에 고용할 목적으로 인턴을 채용한다. 생산적인 일을 하면 좋아할지라도, 기대는 하지 않는다.\n그것은 졸업후 진짜 직장을 잡으면 바로 바뀐다. 돈받는 만큼 일을 해야 한다. 큰회사에서 하는 일들이 지루하니 지루한 일을 해야 한다. 대학에 비하면 쉬우나 지루하다. 처음에는 쉬운일을 하며 일을 하는 것이 괞찬을지 몰라도 2~3개월 후면 없어진다. 결국에는, 쉽고 돈을 괞찬게 받아도, 멍청한 일을 하다보면 사기가 떨어 지고 만다.\n그렇지만, 그게 최악 아니다. 일반적인 직장이 진짜로 피곤한 것은 직 장에 항상 아침부터 저녁까지 있어야 한다는 것이다. Google도 이것에 영향을 받는다. 이말은 아무리 일을 하고 싶지 않아도 직장에 가야 하고, 컴퓨터앞앉아서 일을 하는척을 해야 한다는 것이다. 일을 좋아 하는 hacker들에게는 이것은 고문이다.\n신생업체에서는, 이런것이 모두 필요없다. 근무시간이라는 개념이 없다. 일과 인생이 서로 섞인다. 좋은 점은 아무도 직장에서 살아도 아무도 뭐라고 하는 사람이 없다. 신생업체에서는 거의 모든 시간에 마음대로 할수 있다. 창업자라면, 모든 시간에 하는 것이 일이다. 하진만, 절대로 하는 척을 않해도 된다.\n큰회사에서 낮잠을 자면 큰일 나지만, 신생업체에서 그러면, 동업자들은 그냥 피곤하다고 생각한다.\n15. 부모님이 의사가되라고 한다.\n아마 많은 잠재창업자들이 부모들때문에 단념했을것이다. 부모님 말씀을 듣지 말라고 하지는 않겠다. 가족들은 그들 만의 전통이 있으므로, 내가 논쟁을 할수 없다. 하지만 왜 부모들이 안전한 직장생활을 원치 않을 것인지를 말하고 싶다.\n첫째는, 부모님들은 자식들에게는 자신들 보다 보수적이다. 이것은 합리적이다. 부모님들은 자식의 좋은 복보다 불행을 더 많이 공유한다. 거의 모든 부모님들이 걱정하지 않지만, 이것이 그들을 보수적으로 만든다. 하지만, 보수적인 측면으로 잘못된것이라도, 잘못된것은 잘못된것이다. 모든것이 그렇듯이, 보상을 위험에 비례하다. 자식들을 위험에서 보호하면서, 알게 모르게, 큰보상으로 부터 보호하는 것이다. 그것을 알면, 더 많은 위험을 감수하라고 할 것이다.\n다른 이유는, 부모들은 장군들 처럼 항상 마지막 전쟁중이다. 그 들이 당신이 의사가되고 싶었으면 하는 이유는 병자에게 도움을 주는 것 이외에 권위와 수익성 경력이다. \\[4\\] 하지만, 그들이 결정을 내렸던 그때 만큼 이제는 권위와 수익성인 높은것은 아니다. 70년때, 내가 어렸을땐 의사가 짱이었다. 의사와 메르세데스 450SLs, 테니스는 골든 삼각형을 이루었었지만, 지금으로는 오래전 일이다.\n당신이 의사가 되었으면 하는 부모들은 얼마나 많이 바뀌었는지 모르는 것이다. 당신이 Steve Jobs였으면 덜 행복했을까? 부모님들의 의견을 대하는 방법은 그것들은 추가 기능 요청처럼 대하는 것이다. 당신의 목적이 부모님들을 기쁘게 하는 것일 지라도, 요구하는것을 다 들어주는것은 아니다. 그들의 요구보다는, 어떻게 그들이 필요하는 것들을 더 나은 방법으로 줄수 있는지를 생각해야 할 것이다.\n16. 직장은 기본 설정이다.\n마지막으로 사람들이 보통 직장을 잡는 가장 강력한 이유는 – 기본 설정이기 때문. 기본값은 엄청나게 강력한데, 그것은 바로 의식 없는 선택으로 자동으로 작동하기 때문이다.\n범죄자들을 빼고는, 돈이 필요하면 직장을 잡는것이 공리다. 이 전통은 100년전과 다를 것이 없다. 그전에는 농사로 돈을 벌어야 했다. 겨우 100년된것을 공리로 취급하는것은 잘못된것 같다. 역사적 기준으로는 그것은 아주 빠르게 변화하고 있는 것이다.\n현재에 우리는 또다른 빠른 변화를 볼수 있다. 경제역사에 대해 많이 읽고 창업에 대해 많이 아는 나에게, 농사에서 생산으로의 변화와 같은 변화의 초기를 보는듯 하다.\n만약 당신이 생산으로의 변화시기때 (1000년에 유럽) 있었으면, 도시로 이동하는 사람들을 미쳤다고 했었을것이다. 하인들이 주인을 떠나는 것이 불법이었으나, 도시로 도망가는것이 힘들지는 않았을 것이다. 그들이\n도시로 가지 않았던 이유는 굉장히 위험했기 때문인것 같다. 내 고향을 떠난 다고? 지금까지 인생을 같이 했던 사람들을 떠나, 큰 도시에서 낯선 사람 3~4명과 살라고? 어떻게 살지? 기르지 않은면, 식량을 어떻게 구하지?\n그들에게는 두려웠지만, 지금은 우리의 생각대로 사는것은 기본이다. 창업이 위험해 보이면 우리의 조상들에게는 우리사 지금처럼 사는것이 얼마나 위협이었을까 생각해봐라. 이상하게도, 이것을 제일 잘 아는 사람들이 오히려 더 전처럼 살려고 한다. Larry와 Sergey 자신들이 일반 직장을 안 잡았으면서, 어떻게 자기 직장에 와서 일하라고 말할수 있을까?\n중세기의 하인들을 한번 상상해 보아라. 전인생에 아무 희망 없이, 영주와 성직자밑에게 모든 흑자를 받지고, 주인으로 인정하며, 같은 밭을 갈아야 하는것이 얼마나 어두었을지를. 미래의 언젠가는 지금 우리의 보통 직장을 보고 똑같이 생각할 수 있을 것이다. 매일 영혼이 없는 사무실에 출근해 책상에 앉아서 이리와바하면 가봐야하는 보스라는 사람을 인정하고 시키는 데로 해야 하는 그런 어두운 인생을. 허락을 받아야 고객에게 소프트웨어를 출시해야 하는 것을. 일요일 오후가 되면 내일이면 일어나서 출근해야하기 때문에 슬퍼지는 것을 상상해 봐라. 어떻게 견디 겠나?\n우리가 농업에서 생산으로의 변화만큼의 엄청난 또 다른 변화중에 있다는 것은 끝내주는 것이다. 그래서 창업에 대해 마음을 많이 쓴다. 돈을 버는 수단이라서가 아니다. 증권 투기같이 다른 돈 버는 수단은 관심이 없다. 기껏해야 퍼즐만큼 흥미롭다. 신생기업에는 뭔가가 더 많이 있다. 신생기업들은 역사적으로 드문 부가 창출되는 것이 바뀌는 것을 대표하는 것 같다.\n이 것이 궁극적으로 우리가 Y-Combinator에서 일하는 이유이다. 이 일을 중단하지 않을 만큼 돈을 벌고 싶지만, 그것이 전부가 아니다. 인류역사에 이러한 경제의 엄청남 변화는 얼마 되지가 않는다. 이것을 빨리 일어나게 하는것은 놀라운 해킹일 것이다.\nNotes\n\\[ 1 \\] 우리만 유일하게 돈을 읽었다. Angel 투자자들이 컨버터블 채무가 있어서 그들은 경매의 수익금에서 우선권이 있었다. Y-Combinator는 1달러투자중 38 센트만 건졌다.\n\\[ 2 \\] 그것의 가장 맞는 조직은 open source project이지만, 사람들과 미팅이 없다. 아마 그런 project을 시작하는 것도 좋은 아이디어 같다.\n\\[ 3 \\] 신생업체를 사는 큰회사가 필요하기 때문에, 큰회사의 수가 0일수는 없다.\n\\[ 4 \\] 생각 실험 : 만약 의사가 가난한 직업이면, 부모들이 자식들이 의사가 되기를 원할까?\nThanks to Trevor Blackwell, Jessica Livingston, and Robert Morris for reading drafts of this, to the founders of Zenter for letting me use their web-based PowerPoint killer even though it isn\u0026rsquo;t launched yet, and to Ming-Hay Luk of the Berkeley CSUA for inviting me to speak.\n","date":"28 August 2009","externalUrl":null,"permalink":"/2009/08/28/%EC%99%9C-%EC%B0%BD%EC%97%85%EC%9D%84-%ED%95%98%EB%A9%B4-%EC%95%8A%EB%90%98%EB%82%98-why-to-not-not-start-a-startup/","section":"Posts","summary":"내 가 Silicon Valley에 온 이유는 high-tech회사를 창업을 하고 싶어한 이유였다. 거의 nothing에서 something을 만들어내고 부를 만들수 있다는 것이 참 묘한 매력이 있었다. 하지만 창업에는 marketing이나 영업에 경험이 필요하다 생각하여, 그쪽으로 career를 바꾸었으나, Paul Graham의 essay를 읽고, 그가 하는 Y-combinator라 하는 incubator의 한 leader이자 Paul의 아내인 Jessica Livingston이 지은 Founders at Work 라 는 책을 읽고는 이제서야 다시 software developer로 다시 career를 바꾸려 한다. 거의 모든 성공적인 high-tech회사들은 engineer가 시작했다. 하지만 벌써 가족이 있는 난 너무 늦은것 같다. 하지만 다른 젊은 사람하나라도 이 글들을 읽고 성공할 수 있으면 하는 것이 나의 바람이다. 번역을 하면서 다시 essay를 읽었는데, 한국과 미국의 문화적 차이를 확실히 느끼게 하며, 왜 한국에 startup회사들이 많이 없는지 알수 있을것 같다. 참 안타까운 일이다. 하지만 이 essay를 쓰는 이유는 독자 중 1%만 창업을 하고 성공해서 한국의 startup 문화를 바꿀수 있으면 하는 바램이다.\n이번 essay를 시작으로 Paul Graham의 많은 essay를 한글로 번역할 예정이다. 이미 Paul Graham에게는 허락을 받은 상태이다. Paul Graham은 Viaweb이라는 최초의 application service provider software을 lisp언어로 써 고객이 자신의 e-commerce site을 짓고 운영할 수 있게 했다. 나중에 Yahoo에 팔아 나중에 Yahoo! Store이 되었다. 그후 Y-Combinator라는 incubator회사를 만들어 많은 web 2.0회사를 투자헀고, 조언을 해 주었다. 내 개인적으로도 최고로 존경하는 사람이다.\n왜 창업을 해야 하나?\n2007년 3월\n(이 에세이는 2007 년 Startup School 과 버클리 CSUA에서 발표를 바탕으로 기고했습니다.)\n지금은 Y-Comibator의 성공율을 측정 할 만큼 운영해 왔다고 생각한다. 2005 년 여름에는 8개의 회사가 있었다. 그 중 최소 4개는 성공적이었다. Reddit과 Infogami는 합병했고, 또다른 회사가 합병이 되었으나, 말 할수는 없다. 또 다른 회사는 너무나 잘 돼서 원하면 10분안에 인수될수 있는 Loopt이다.\n그래서, 처음 여름에 시작했던 창업자들 중에 반정도가 그들의 기준으로 봐서는 부자가 되었다. (한가지 배운점은 부자의 종류가 여러가지 있다는 것이다).\n그러나, 우리의 성공율이 항상 50%일 것이라고는 장담을 할 수 없다. 처음은 예외일 수가 있다. 하지만 우리는 항상 이야기하는 10%의 성공율 보다는 잘 할수 있을것이다. 한 25%정도는 안전한 숫자로 생각된다.\n실패한 창업자들도 그렇게 나쁜 시간을 가졌다는 생각을 하지 않는 듯 한다. 8개 회사 중 3개는 죽었을 것이다. 그 중 두 개는 여름 끝에 다른 일을 찾았다. 그들이 큰 상처를 입었다고 생각하지는 않는다. 가장 상처를 많이 받았을 회사는 일년 동안 열심히 일했지만 Google Calendar에 밀린 Kiko이였다. 하지만 끝은 행복하게 되었다. eBay에 100만 달러에 팔았기 때문이다. Angel 투자자들에게 돈을 돌려준 이후 그들은 한 1년 동안의 연봉 만큼을 건졌다.\n\\[1\\] 그 이후 그들은 바로 새롭고 더 재미있는, Justin.TV라는 회사를 창업했다.\n그래서 여기에 더욱 놀라운 통계가 있다: 처음 창업자들은 아무도 고통적인 경험을 하지 않았는 것이다. 여느 startup처럼 좋은 일과 나쁜 일이 있었지만, 아무도 직장에 다니는 일과 바꾸지는 않을 것이라고 생각한다. 이 통계는 예외가 아닐 것이다. 장기적인 성공율이 무엇이든지, 일반적인 직업을 갖고싶어하는 창업자는 아무도 없을 것이다.\n그럼 나에게 가장 큰 미스테리는, 왜 더 많은 사람들이 창업을 않하는 것일까? 거의 모든 창업자들이 일반 직장을 싫어하고 높은 비율이 부자가 되는데, 왜 모든 사람이 창업을 하지 않을까? 많은 사람들이 자금신청을 수천개를 받을 것으로 생각하나, 사실은 수백개에 그친다. 왜 더 많이 신청하지 않을까? 창업되는 회사가 꾀 많은 것 같지만 창업에 필요한 기술을 가지고 있는 사람들에 비해 작다. Programmer의 대부분이 대학 졸업 후 평범한 직장을 찾아, 그 곳에 머물고 만다.\n사람들은 자기 자신의 이익과 반대로 행동하는것 같다. 왜 그럴까? 답은 있는것 같다. Y-Combinator가 벤처 자금 지원 절차의 매우 시작에 있기 때문에, 창업에 대해 불확신이 있는 사람들의 심리에 대해서는 알수있는 이는, 우리만큼 좋은위치에 있는 회사는 없을 것이다.\n불확신이 항상 나쁜것은 아니다. 당신이 창업을 생각하고 있는 hacker (Paul Graham의 hacker는 보통 사람이 생각하는 hacker가 아님. 그의 hacker는 어떤 수로든, 어떻게든 많들어 내는 programmer임) 라면, 불확신은 지극히 당연한것이다. Larry와 Sergey도 Google시작전에, Jerry와 Filo도 Yahoo시작전에 똑같이 불확신을 가지고 있었다. 사실은 성공적인 startup들의 거의가 너무 확실한 사업자들 보다는 불확실한 hacker가 시작하였다.\n이것들을 증명하는 몇 가지 증거가있다. 우리가 투자하고 성공한 startup들 중에 많은 곳들이 거의 마지막순간에 자금신청을 하기로 결정했다고 했다. 일부는 마감일 몇 시간전에 결정 하기도했다.\n불 확실성을 다루는 방법을 구성 요소로 분석하는 것이다. 누가 뭔가를 꺼려 대부분의 사람들은, 약 8 여러 가지 이유가 함께 머리를 혼합되어서 어떤것이 가장 큰이유인지 모른다. 어떤 것은 정당하고, 어떤 것은 가짜이지만, 상대적인 비율을 모른다면 전반적인 불확성이 정당한지, 가짜인지 모를 것이다.\n그래서, 난 사람들의 창업을 꺼려하는 요소들을 나열하고 어떤 것들이 정당한 것인지 설명할 것이다. 그럼 창업을 생각하는 사람들이 자신의 감정을 점검할 수 있는 체크리스트로 쓸수 있을것이다.\n내 목표는 당신의 자신감을 높이는 것이다. 하지만 이것은 보통 자신감을 높이는 것과는 두 가지 점이 다르다. 첫째, 나의 동기는 솔직함이다. 자신감을 높이는 사업을 하는 사람들은 사람들이 그들의 책을 사거나 당신이 얼마나 위대한가를 말해주는 세미나에 참석하면 벌써 목표를 달성한 것이다. 창업을 해야 되지 않은 사람을 장려하면, 내 인생은 더 피곤해진다. 너무 많은 사람들을 Y-Combinator에 신청하도록 권장 하면, 내 일은 더 많아지게 된다.\n둘째는 나의 방법이다. 난 긍정적인 대신, 부정적일 것이다. 할수 있다고 말하는 대시, 난 당신이 창업을 하지 않고있는 이유를 보여주고, 왜 거의 모두가 무시되어야 하는지 말해주겠다.\n그럼, 우리모두가 가지고 태어난 것부터 시작하겠다.\n","title":"왜 창업을 해야 하나? (Why to Not Not Start a Startup)","type":"posts"},{"content":"","date":"27 August 2009","externalUrl":null,"permalink":"/tags/google-maps/","section":"Tags","summary":"","title":"Google-Maps","type":"tags"},{"content":"The major part of my experiment was going to be the integration with Google Maps. At first, I was a bit apprehensive about it, but Ruby on Rails being a community oriented language, I found a couple of quite useful plug-ins. With them, finding a location based on address or geocode or finding nearby places based on certain radius of a location were not too hard.\nThere is actually an excellent book also, called Beginning Google maps applications with Rails and Ajax. But the problem with the book is that it was geared towards more for java developers using rails. Thus, its major functions were javascripts and it showed how to talk to rails app. In my case, since I wanted simple features and I didn\u0026rsquo;t want to take time to learn javascript, I decided to find a simpler way.\nAnd I found that for things I wanted to do, I could do with YM4R/GM and Geokit. There are other excellent tutorials out there like the one by Jason Gilmore on Developer.com.\nLet\u0026rsquo;s begin.\n1. Sign-up for Google Maps API by going to here. For development environment, you can use either http://localhost:3000 or http://127.0.0.1:300 as the website URL. Copy the API key.\nWhen you move to production environment, make sure you come back here to get another key for production URL.\n2. Install YM4R/GM. From your rails app root directory,\nruby script/plugin install svn://rubyforge.org/var/svn/ym4r/Plugins/GM/trunk/ym4r_gm 2.1. Edit the config/gmap_api_key.yml and put your API key in the development section.\ndevelopment: [Your development API KEY] test: [Your development API KEY] production: [Your production API KEY] 3. Install Geokit for Rails. From your rails app root directory,\nscript/plugin install git://github.com/andre/geokit-rails.git Also add the following line inside Rails::Initializer.run do |config| in config/environment.rb.\nRails::Initializer.run do |config| [OTHER CODES] config.gem \u0026#34;geokit\u0026#34; end Last, install the gem.\nrake gems:install 3.1. Add lat and lng fields to your database using migration. I am using my controller as an example, so substitute it with your controller.\nruby script/generate migration AddGeoToPlaygrounds Then edit the migration file.\nclass AddGeoToPlaygrounds \u0026lt; ActiveRecord::Migration def self.up add_column :playgrounds, :lat, :float add_column :playgrounds, :lng, :float end def self.down remove_column :playgrounds, :lat remove_column :playgrounds, :lng end end 3.2. Do rake db:migrate, and now you are ready to put Google Maps in your rails app.\n4. Find a location\n4.1. If you want to place a marker for a place, you have to pass longitude and latitude, not the full address. Then, how do you find the geocodes from an address? That\u0026rsquo;s where Geokit comes in handy.\nFirst put the following line early on in a controller where you will use the geocode.\ninclude Geokit::Geocoders Also add acts_as_mappable to the model where you want to use the geocode caluculation. In my case, it would be playground model.\nclass Playground \u0026lt; ActiveRecord::Base acts_as_mappable end There are many neat things you can do as you see in the example here.\nIn my case, the first is to find a location by user\u0026rsquo;s IP address. You can use IpGeocoder method, but I found that it\u0026rsquo;s not all that accurate.\n@user_location = IpGeocoder.geocode(request.remote_ip) if @user_location.success lat = @user_location.lat lng = @user_location.lng end If you have an address and want to find a geocode, then you can use MultiGeocoder.geocode. You can use any form of address: full address, city/state, or just zip. If you want to get a geocode for zip code 94085,\nloc = MultiGeocoder.geocode(\u0026#39;94085\u0026#39;) The geocode can be accessed by looking at loc.lat and loc.lng. The response to 94085 zip code looks like this.\nGoogle geocoding. Address: 94085. Result: 94085 200 geocode Sunnyvale, CA 94085, USA USUSACASanta ClaraSunnyvale 94085 -122.0127067,37.3864411,0 If you have a geocode, you can also get an address by using GoogleGeocoder.reverse_geocode. When do the following,\naddr = GoogleGeocoder.reverse_geocode [lat, lng] you can access the address by looking at addr.street_address, addr.city, addr.state and addr.zip.\n4.2. Once you have lat and lng, you can create a map. In a controller, initiate a map variable. Available options are explained in the rubyforge page. The following lines create a map, loads controls (like zoom level on the left side of a map), and centers the map at the lat, lng coordinate with a zoom level 13.\n@map = GMap.new(\u0026#34;map_div\u0026#34;) @map.control_init(:large_map =\u0026gt; true, :map_type =\u0026gt; true) @map.center_zoom_init([lat,lng], 13) 4.3. After that, I find nearby playgrounds at the lat, lng coordinate in the same controller. This is a function of Geokit. It is finding all the playgrounds within 5 miles radius from lat, lng coordinate, ordered by average rating. Rating is function of acts_as_rated. Paginate will display only certain number of records per page specified by params\n\\[:page\\].\n@playgrounds = Playground.find(:all, :origin =\u0026gt; [lat, lng], :within =\u0026gt; 5, :order =\u0026gt; \u0026#34;rating_avg DESC\u0026#34;).paginate :page =\u0026gt; params[:page] 4.4. Once that\u0026rsquo;s done, you have create markers and pass them to the @map variable. I didn\u0026rsquo;t want put html codes in the controller (MVC violation!), but I couldn\u0026rsquo;t really find a better way to do it. The content of infotxt will appear in the bubble when a user click on the marker.\n@playgrounds.each do |p| infotxt = \u0026#34;#{p.name} #{p.address} #{p.city}, #{p.state} #{p.zip.to_s}\u0026#34; marker = GMarker.new([p.lat, p.lng], :title =\u0026gt; p.name, :info_window =\u0026gt; infotxt) @map.overlay_init(marker) end 4.5. Now, the map is finally ready to be displayed. First load GMap header information by adding the following line in the header field in app/views/layouts/application.html.erb.\n\u0026lt;%= GMap.header %\u0026gt; 4.6. Then in a view where you want to place a map,\n\u0026lt;%= @map.to_html %\u0026gt; \u0026lt;%= @map.div(:width =\u0026gt; 600, :height =\u0026gt; 400) %\u0026gt; Then viola! You should see the map in your view.\nMine has all the logic in the rails. However, if you put your logic in the javascript, then you should be able to do many cool things you see on Google Maps like showing driving direction, finding things nearby, etc. from the bubble window.\nSome day I will move them to javascript side, but so far this way serves my purpose.\nIn the next post, I will talk about how to get new location from user and center the map to a new location using ruby javascript, rjs.\n","date":"27 August 2009","externalUrl":null,"permalink":"/2009/08/27/how-to-integrate-google-maps-in-a-rails-app/","section":"Posts","summary":"The major part of my experiment was going to be the integration with Google Maps. At first, I was a bit apprehensive about it, but Ruby on Rails being a community oriented language, I found a couple of quite useful plug-ins. With them, finding a location based on address or geocode or finding nearby places based on certain radius of a location were not too hard.\nThere is actually an excellent book also, called Beginning Google maps applications with Rails and Ajax. But the problem with the book is that it was geared towards more for java developers using rails. Thus, its major functions were javascripts and it showed how to talk to rails app. In my case, since I wanted simple features and I didn’t want to take time to learn javascript, I decided to find a simpler way.\nAnd I found that for things I wanted to do, I could do with YM4R/GM and Geokit. There are other excellent tutorials out there like the one by Jason Gilmore on Developer.com.\nLet’s begin.\n1. Sign-up for Google Maps API by going to here. For development environment, you can use either http://localhost:3000 or http://127.0.0.1:300 as the website URL. Copy the API key.\nWhen you move to production environment, make sure you come back here to get another key for production URL.\n","title":"How to integrate Google Maps in a Rails app","type":"posts"},{"content":"","date":"27 August 2009","externalUrl":null,"permalink":"/categories/playground/","section":"Categories","summary":"","title":"Playground","type":"categories"},{"content":"Today, I went to San Jose Ruby Hackfest meetup, and met a bunch of cool guys. One of them was Noah Gibbs, who helped me tremendously with one of the most pesky problems I had.\nBefore you go on, you might want to read up on really good tutorials on Singleton Class and Self variable.\nAt any rate, I use both acts_as_rated for rating playgrounds and twitterify for automatically generating a tweet when a new playground is added. They both are for my playground model, and I found out that they conflicts with each other. Ordinarily they both would be \u0026ldquo;declared\u0026rdquo; in the model like the following.\nclass Playground \u0026lt; ActiveRecord::Base acts_as_rated twitterify :name, :url, :if =\u0026gt; Proc.new { |record| record.new_record? } end However, for some reason, when rate method from acts_as_rated is called, it would give me wrong number of argument error. Since it worked well before I installed twitterify, it was clear that there must have been conflict of methods, where two plug-ins may have been creating a method(s) with the same name. The simplest solution would be to put twitterify in a function and call it after a new record is created.\nclass Playground \u0026lt; ActiveRecord::Base after_create :tweet acts_as_rated def tweet twitterify :name, :url, :if =\u0026gt; Proc.new { |record| record.new_record? } end end However, this generated \u0026ldquo;missing method\u0026rdquo; error.\nundefined method `twitterify\u0026#39; for #\u0026lt;Playground:0xb73a7930\u0026gt; Twitterify is a method that should be called on an object. When it was on the class level, it would have been called on Playground object indirectly because self here would be Playground object. However, when it was pushed down to another method called tweet, the search for the twitterify returned nothing, and thus the error.\nBy specifying a Class, everything is dandy.\nclass Playground \u0026lt; ActiveRecord::Base after_create :tweet acts_as_rated def tweet Playground.twitterify :name, :url, :if =\u0026gt; Proc.new { |record| record.new_record? } end end However, I am still a bit fuzzy about Singleton Class and self variables. If you have a better explanation, please be my guest and do leave a comment.\n","date":"27 August 2009","externalUrl":null,"permalink":"/2009/08/27/singleton-class-acts_as_rated-and-twitterify-in-rails/","section":"Posts","summary":"Today, I went to San Jose Ruby Hackfest meetup, and met a bunch of cool guys. One of them was Noah Gibbs, who helped me tremendously with one of the most pesky problems I had.\nBefore you go on, you might want to read up on really good tutorials on Singleton Class and Self variable.\n","title":"Singleton Class, acts_as_rated and twitterify in Rails","type":"posts"},{"content":"","date":"24 August 2009","externalUrl":null,"permalink":"/tags/connect/","section":"Tags","summary":"","title":"Connect","type":"tags"},{"content":"Update: I have written up another post for using Devise and Omniauth, and you can find it here. Facebooker is no longer maintained.\nTop of my to-do list was to integrate Facebook Connect with my Rails app, since 1) there are A LOT of people using Facebook and 2) having to register to post or edit could be an obstacle in getting more users to use my site.\nI looked on the web for a while, and found a great example by Stuart Eccles at Made by Many. It\u0026rsquo;s an awesome tutorial, but it\u0026rsquo;s for restful_authentication. I don\u0026rsquo;t use it, so I had to modify it a little bit. Also, I added a step to ask a user to pick a username. So the following instruction is basically modification of Stuart\u0026rsquo;s.\nWithout further ado, let\u0026rsquo;s begin.\n1. Setup Facebook Application page\n1.1. Go to this page, and enter a name for your application. I named mine \u0026ldquo;Playgrounds_R_Us\u0026rdquo;.\n1.2. Make a note of Application ID, API Key, and Secret. You need it for facebooker.yml later.\n1.3. Next is Authentication section. Here what\u0026rsquo;s important is Post-Authroize and Post-Remove Callback URL. They refer to a web page a user will be taken to after logging into and logging out of Facebook account. While testing, I left it at \u0026ldquo;http://127.0.0.1:3000\u0026rdquo;.\n1.4. I also used the same URL (http://127.0.0.1:3000) for Canvas Callback URL in Canvas section and Connect URL in Connect section.\n1.5. Then you are pretty much set with configuration on Facebook side.\n2. Get facebooker plugin and install it. From your rails app root directory,\nruby script/plugin install git://github.com/mmangino/facebooker.git 2.1 Configure facebooker.yml. You only need to care about those above \u0026ldquo;tunnel\u0026rdquo;. Canvas_page_name could be left blank. Use the keys you noted when you created your Facebook application.\ndevelopment: api_key: [Your KEY] secret_key: [Your KEY] canvas_page_name: playgroundrus callback_url: http://127.0.0.1:3000/ pretty_errors: true set_asset_host_to_callback_url: false tunnel: public_host_username: public_host: public_port: 4007 local_port: 3000 server_alive_interval: 0 production: api_key: [Your KEY] secret_key: [Your KEY] canvas_page_name: playgroundrus callback_url: http://www.playgroundrus.com set_asset_host_to_callback_url: false tunnel: public_host_username: public_host: public_port: 4007 local_port: 3000 server_alive_interval: 0 2.2 Make sure you generate \u0026ldquo;xd_receiver\u0026rdquo; files. Without, it won\u0026rsquo;t work correctly. Also from your rails app root directory,\nscript/generate xd_receiver 2.3. After that you are all set with facebooker configuration.\n3. Prep the database. Add two fields to store facebook id and hashed email so that later we can find a user by either one of the two fields.\n3.1. Generate a migration file\nruby script/generate migration AddFbsToUser 3.2. Add fields\ndef self.up add_column :users, :fb_id, :integer add_column :users, :email_hash, :string end def self.down remove_column :users, :fb_id remove_column :users, :email_hash end 3.3. Add those fields with rake call.\nrake db:migrate 4. Add Rails functions\n4.1. Add the following two lines right after tag in app/views/layouts/application.html.erb.\n\u0026lt;%= fb_connect_javascript_tag %\u0026gt; \u0026lt;%= init_fb_connect \u0026#34;XFBML\u0026#34;%\u0026gt; 4.2. Make sure you have the following line between header tags in app/views/layouts/application.html.erb.\n\u0026lt;%= javascript_include_tag :defaults%\u0026gt; 4.3. Also add the followings in the ApplicationController in app/controller/application_controller.rb. When user logs into Facebook account, :facebook_session will have all the information about the user. :facebook_session is utilized a lot.\nbefore_filter :set_facebook_session helper_method :facebook_session 4.3. Also in ApplicationController, where I see if a user is logged in or not, I had to put additional code to see if it\u0026rsquo;s a facebook user. It\u0026rsquo;s a facebook user, if facebook_session is successfully created.\ndef fetch_logged_in_user if facebook_session @current_user = User.find_by_fb_user(facebook_session.user) else return unless session[:user_id] @current_user = User.find_by_id(session[:user_id]) end end 4.4. Now you can put the following line anywhere in a view, and you will get \u0026ldquo;Facebook Connect button\u0026rdquo;.\n\u0026lt;%= fb_login_button(\u0026#39;window.location = \u0026#34;/users/link_user_accounts\u0026#34;;\u0026#39;)%\u0026gt; This will put a nice Facebook Connect button like this, It could have normal facebook login button options like :size and :background. Check here for the options.\nWhen a user clicks on the button, it will bring up a popup window where user can log in. After the user is logged in, link_user_accounts action in user controller will either create a new user with Facebook credentials or recognize a user as existing user by either email hash code or facebook user id. It will be covered later.\nAnd also make sure the following line is added to the routes in config/routes.rb.\nmap.resources :users, :collection =\u0026gt; {:link_user_accounts =\u0026gt; :get} 4.5. In User model in app/models/user.rb, you can just use the same code as Stuart\u0026rsquo;s.\nafter_create :register_user_to_fb #find the user in the database, first by the facebook user id and if that fails through the email hash def self.find_by_fb_user(fb_user) User.find_by_fb_id(fb_user.uid) || User.find_by_email_hash(fb_user.email_hashes) end #Take the data returned from facebook and create a new user from it. #We don\u0026#39;t get the email from Facebook and because a facebooker can only login through Connect we just generate a unique login name for them. #If you were using username to display to people you might want to get them to select one after registering through Facebook Connect def self.create_from_fb_connect(fb_user) new_facebooker = User.new(:username =\u0026gt; \u0026#34;fb_#{fb_user.uid}\u0026#34;, :password =\u0026gt; \u0026#34;\u0026#34;, :email =\u0026gt; \u0026#34;\u0026#34;) new_facebooker.fb_id = fb_user.uid.to_i #We need to save without validations new_facebooker.save(false) new_facebooker.register_user_to_fb end #We are going to connect this user object with a facebook id. But only ever one account. def link_fb_connect(fb_id) unless fb_id.nil? #check for existing account existing_fb_user = User.find_by_fb_id(fb_id) #unlink the existing account unless existing_fb_user.nil? existing_fb_user.fb_id = nil existing_fb_user.save(false) end #link the new one self.fb_id = fb_id save(false) end end #The Facebook registers user method is going to send the users email hash and our account id to Facebook #We need this so Facebook can find friends on our local application even if they have not connect through connect #We hen use the email hash in the database to later identify a user from Facebook with a local user def register_user_to_fb users = {:email =\u0026gt; email, :account_id =\u0026gt; id} Facebooker::User.register([users]) self.email_hash = Facebooker::User.hash_email(email) save(false) end def facebook_user? return !fb_id.nil? \u0026amp;\u0026amp; fb_id \u0026gt; 0 end But, mine had one difference. Since I didn\u0026rsquo;t use restful_authentication, my user model was different - no :name and :login fields. So, I changed mine to reflect my model.\nnew_facebooker = User.new(:username =\u0026gt; \u0026#34;fb_#{fb_user.uid}\u0026#34;, :password =\u0026gt; \u0026#34;\u0026#34;, :email =\u0026gt; \u0026#34;\u0026#34;) Instead of\nnew_facebooker = User.new(:name =\u0026gt; fb_user.name, :login =\u0026gt; \u0026#34;facebooker_#{fb_user.uid}\u0026#34;, :password =\u0026gt; \u0026#34;\u0026#34;, :email =\u0026gt; \u0026#34;\u0026#34;) 4.6. Add the followings in the User controller in app/controller/users_controller.rb.\ndef link_user_accounts if @current_user.nil? #register with fb User.create_from_fb_connect(facebook_session.user) user = User.find_by_fb_user(facebook_session.user) redirect_to edit_user_path(user) else #connect accounts @current_user.link_fb_connect(facebook_session.user.id) unless @current_user.fb_id == facebook_session.user.id redirect_to playgrounds_path end end Here, again mine is a little different, because I wanted to ask user to pick a username instead of temporary \u0026ldquo;fb_\n\\[numbers\\]\u0026rdquo; type of username. So, after a local user account is created, I direct the user to edit_user_path.\n4.7. In Edit view of User controller, I see if it has a temporary username or not. If it does, I only ask user to pick a pretty username and perhaps location, which is required when registering in an old way.\n\u0026lt;% if @user.facebook_user? \u0026amp;\u0026amp; (@user.username.nil? || @user.username =~ /fb_\\d/) %\u0026gt; \u0026lt;% form_for @user do |f| %\u0026gt; Please pick a pretty name for PlaygroundRUs: \u0026lt;%= f.text_field :username %\u0026gt; Where do you live? (Full address, city and state, or just zip): \u0026lt;%= f.text_field :location %\u0026gt; \u0026lt;%= submit_tag \u0026#39;Update\u0026#39; %\u0026gt; \u0026lt;% end %\u0026gt; \u0026lt;% else %\u0026gt; \u0026lt;%= @user.username %\u0026gt; \u0026lt;% form_for @user do |f| %\u0026gt; Email: \u0026lt;%= f.text_field :email, :value =\u0026gt; @user.email %\u0026gt; \u0026lt;% if !@user.facebook_user? %\u0026gt; Password: \u0026lt;%= f.password_field :password %\u0026gt; Password Confirmation: \u0026lt;%= f.password_field :password_confirmation %\u0026gt; \u0026lt;% end %\u0026gt; Location: \u0026lt;%= f.text_field :location, :value =\u0026gt; @user.location %\u0026gt; \u0026lt;%= submit_tag \u0026#39;Update\u0026#39;%\u0026gt; \u0026lt;% end %\u0026gt; \u0026lt;% end %\u0026gt; 4.8. And in Update action of User controller, I make sure the user didn\u0026rsquo;t pick a duplicate username or email address.\ndef update @user = User.find(params[:id]) if @user.facebook_user? if User.find_by_username(params[:user][:username]) || User.find_by_email(params[:user][:email]) flash[:error] = \u0026#34;Username or email already exists!\u0026#34; redirect_to(edit_user_path) and return else @user.update_attribute(:username, params[:user][:username]) if params[:user][:username] @user.update_attribute(:location, params[:user][:location]) if params[:user][:location] @user.update_attribute(:email, params[:user][:email]) if params[:user][:email] end else @user.update_attributes(params[:user]) end redirect_to user_path end 4.9. For logging out, you can put this anywhere you like. Usually, I put it next to or below facebook icon. The following is in my application view in app/views/layouts/application.html.erb\n\u0026lt;% if @current_user.facebook_user? %\u0026gt; \u0026lt;%= link_to \u0026#39;Edit\u0026#39;, user_path(@current_user) %\u0026gt; | Logout \u0026lt;% end %\u0026gt; 4.10. Last, but not the least, I found that even if a user is logged out from facebook, its cookie causes the site to think the user is still logged in, and refresh will bring the user back in (from the dead). To kill the ghost, make sure you have the following lines in the Destroy action in Session controller in app/controller/sessions_controller.rb.\ndef destroy if @current_user.facebook_user? clear_fb_cookies! clear_facebook_session_information end session[:user_id] = nil @current_user = false redirect_to playgrounds_path end 5. When it\u0026rsquo;s time to deploy, make sure you change the test Callback URL (in my case, http://127.0.0.1:3000) to your production URL (in my case, http://www.playgroundrus.com).\n","date":"24 August 2009","externalUrl":null,"permalink":"/2009/08/23/how-to-integrate-facebook-connect-with-a-rails-app/","section":"Posts","summary":"Update: I have written up another post for using Devise and Omniauth, and you can find it here. Facebooker is no longer maintained.\nTop of my to-do list was to integrate Facebook Connect with my Rails app, since 1) there are A LOT of people using Facebook and 2) having to register to post or edit could be an obstacle in getting more users to use my site.\nI looked on the web for a while, and found a great example by Stuart Eccles at Made by Many. It’s an awesome tutorial, but it’s for restful_authentication. I don’t use it, so I had to modify it a little bit. Also, I added a step to ask a user to pick a username. So the following instruction is basically modification of Stuart’s.\nWithout further ado, let’s begin.\n1. Setup Facebook Application page\n1.1. Go to this page, and enter a name for your application. I named mine “Playgrounds_R_Us”.\n1.2. Make a note of Application ID, API Key, and Secret. You need it for facebooker.yml later.\n1.3. Next is Authentication section. Here what’s important is Post-Authroize and Post-Remove Callback URL. They refer to a web page a user will be taken to after logging into and logging out of Facebook account. While testing, I left it at “http://127.0.0.1:3000”.\n1.4. I also used the same URL (http://127.0.0.1:3000) for Canvas Callback URL in Canvas section and Connect URL in Connect section.\n1.5. Then you are pretty much set with configuration on Facebook side.\n2. Get facebooker plugin and install it. From your rails app root directory,\nruby script/plugin install git://github.com/mmangino/facebooker.git ","title":"How to integrate Facebook Connect with a Rails app","type":"posts"},{"content":"","date":"11 August 2009","externalUrl":null,"permalink":"/tags/hackers/","section":"Tags","summary":"","title":"Hackers","type":"tags"},{"content":"People often ask me, \u0026ldquo;what\u0026rsquo;s up with your tagline, life hacker?\u0026rdquo;\nIt has to do somewhat with my personal philosophy as well as Paul Graham\u0026rsquo;s (my idol) definition.\nPaul Graham said in his essay about Hackers and Painters,\nWhat hackers and painters have in common is that they\u0026rsquo;re both makers. Along with composers, architects, and writers, what hackers and painters are trying to do is make good things. They\u0026rsquo;re not doing research per se, though if in the course of trying to make good things they discover some new technique, so much the better.\nOver the course of my career, I have realized that I really enjoy building and tinkering with things. I should have realized this much earlier, but my desire to go back to programming and actually enjoying building web applications made me realize it. Ever since I was young, I really enjoyed building different things like AM/FM radio from a kit, model airplane, propeller-rubber airplane, etc. I think that\u0026rsquo;s why I also enjoyed being a product manager, building a product someone actually finds useful. I think one of the highlights of my career was when we delivered a product as promised and more on time, the customer was actually surprised. It\u0026rsquo;s so prevalent in high tech industry for a product to be shipped late, being on time is a surprise.\nI also have a sort of utilitarian approach to life, where I hate extra things that just get in the way of achieving a goal such as stupid, bureaucratic processes big companies put in place. This is why I love open source. If I need to get something done, the chances are I can find a tool to do it in open source. Like at my previous company, which was quite small, when we wanted a way to communicate with everyone and also have repository of information such as customer requirements and feedback, I just installed Drupal CMS on a unused PC and configured in a day or two. It actually came about because I wanted a simpler way of sharing training video with everyone. I certainly didn\u0026rsquo;t want to put it on share drive and have people download the huge file so that they could watch it. The best way was streaming, even internally, and converting to and uploading a flash version of the file on to Drupal seemed to be a good answer at the time. And we just started using it for internal communications portal. It is unthinkable at a company like Samsung or AT\u0026amp;T (I used to work at both companies).\nMy definition of hacking is not hacking in Hollywood\u0026rsquo;s or security term, but just making things work and getting things done. I tell people I hack codes. I look at examples, see how they work, and make my own changes to fit my own needs. This is again why open source is so beautiful. I am not at the point of being able to contribute to open source world, but I hope I can some day. Internet is a wonderful place for hackers (this time it means for both my kind of hackers and also Hollywood\u0026rsquo;s hackers). My definition of hacking also aligns with utilitarian approach. Taken to extreme, it could mean that you can whatever you can, ethical or unethical, to reach a goal. But, I think majority of people including me have good sense of morals that prevent them from hurting or stealing from others. I think and I hope.\nAt any rate, I feel like I am going back to my root by hacking and building web applications that I think would be useful, not just to me but hopefully to many others, too.\n","date":"11 August 2009","externalUrl":null,"permalink":"/2009/08/11/why-the-tagline-life-hacker/","section":"Posts","summary":"","title":"Why the tagline, Life hacker?","type":"posts"},{"content":"","date":"11 August 2009","externalUrl":null,"permalink":"/tags/api/","section":"Tags","summary":"","title":"Api","type":"tags"},{"content":"I just updated the PlaygroundRUs site with driving direction option in info text bubble of a marker. Two buttons, \u0026ldquo;To Here\u0026rdquo; and \u0026ldquo;From Here\u0026rdquo;, are available. For now, they just open a new tab or window to Google Maps page with destination or source address of the playground.\nThere is a way to make it more dynamic - clicking \u0026ldquo;To Here\u0026rdquo; or \u0026ldquo;From Here\u0026rdquo; brings up a text field, where it asks where from/to address. However, this requires the logic to be placed in the javascript world. In my code, all the markers and info text bubble information are prepared in Ruby. To make it more dynamic, I need to put the logic in javascript, and it will take a while to do it.\nBy the way, there is an excellent set of tutorials that show how to work with Google Maps API here, all in javascript.\nI also moved \u0026ldquo;Edit Playground Info\u0026rdquo; link to next to the Playground name to make it more obvious.\nNext Up: Integrating with Facebook Connect.\n","date":"11 August 2009","externalUrl":null,"permalink":"/2009/08/11/driving-direction-and-edit-playground-link/","section":"Posts","summary":"","title":"Driving direction and link to edit playground information","type":"posts"},{"content":"","date":"11 August 2009","externalUrl":null,"permalink":"/tags/driving-direction/","section":"Tags","summary":"","title":"Driving-Direction","type":"tags"},{"content":"","date":"7 August 2009","externalUrl":null,"permalink":"/tags/display/","section":"Tags","summary":"","title":"Display","type":"tags"},{"content":"","date":"7 August 2009","externalUrl":null,"permalink":"/tags/fedora-11/","section":"Tags","summary":"","title":"Fedora-11","type":"tags"},{"content":"I have an old laptop, Dell Inspiron 4100, and while its battery is busted, it still works with AC power plugged in. It\u0026rsquo;s not fast with Pentium Mobile processor with 384MB RAM.\nAnyhow, I wanted to install the Fedora 11 as a toy box at work. I used Live CD i686 to install it, but for some reason, the display was really messed up. There were black vertical lines, and modifying xorg.conf and display settings wouldn\u0026rsquo;t do anything. At some times, the display was totally off the screen, and sometimes there were four screens in the monitor.\nAfter searching for a while, I saw a posting that recommended disabling Kernel Most Setting (KMS) by adding \u0026quot; nomodeset\u0026quot; in /boot/grub/grub.conf. I tried it and it worked perfectly\u0026hellip; You can read more about KMS here.\n","date":"7 August 2009","externalUrl":null,"permalink":"/2009/08/07/fix-display-problem-with-fedroa-11/","section":"Posts","summary":"","title":"Fix display problem with Fedora 11","type":"posts"},{"content":"","date":"7 August 2009","externalUrl":null,"permalink":"/tags/kernel-mode-setting/","section":"Tags","summary":"","title":"Kernel-Mode-Setting","type":"tags"},{"content":"","date":"7 August 2009","externalUrl":null,"permalink":"/tags/linux/","section":"Tags","summary":"","title":"Linux","type":"tags"},{"content":"","date":"4 August 2009","externalUrl":null,"permalink":"/tags/1and1/","section":"Tags","summary":"","title":"1and1","type":"tags"},{"content":"On WordPress\u0026rsquo; page about using permalinks, it gives steps to enable \u0026ldquo;pretty\u0026rdquo; permalinks. I have non-shell hosting account at 1and1.com, and I had use only .htacceess to make it work. Even though the WordPress\u0026rsquo; instruction says you have to set FileInfo directives allowed, but I found that it actually causes Internal Server 500 error.\nI had the following piece of code in .htaccess, and now it\u0026rsquo;s working fine.\n# BEGIN WordPress Options FollowSymLinks RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # END WordPress ","date":"4 August 2009","externalUrl":null,"permalink":"/2009/08/04/how-to-enable-wordpress-permalinks-work-on-1and1-com/","section":"Posts","summary":"","title":"How to enable WordPress permalinks on 1and1.com","type":"posts"},{"content":"","date":"4 August 2009","externalUrl":null,"permalink":"/tags/permalinks/","section":"Tags","summary":"","title":"Permalinks","type":"tags"},{"content":"","date":"4 August 2009","externalUrl":null,"permalink":"/tags/web/","section":"Tags","summary":"","title":"Web","type":"tags"},{"content":"I\u0026rsquo;ve been working on it for three months or so, and it\u0026rsquo;s gotten to a point where it\u0026rsquo;s usable. It\u0026rsquo;s my first Ruby on Rails application, and this was a lot better and easier than when I tried to learn it a few years ago. That\u0026rsquo;s not to say it was that easy. I certainly have stumbled a lot, but web has been good to me. Any road blocks, I can always search for a solution online. Also many plugins have made my life very easy. I\u0026rsquo;ve resolved many issues, and I wish I could have made a record of how I resolved them. In fact, I will try to do that in my next several postings. I have found those instructional blog posts very helpful, and hopefully I will contribute some back to the community.\nWebsite: Playgrounds R Us\nPlugins used:\nacts_as_rated geokit-rails paperclip twitterify vote_fu wee_lightbox will_paginate ym4r_gm Gems used:\naws-s3 capistrano ec2onrails geokit google-geocode ym4r ","date":"4 August 2009","externalUrl":null,"permalink":"/2009/08/04/alpha-version-of-playgrounds-r-us-is-launched/","section":"Posts","summary":"","title":"Alpha version of Playgrounds R Us is launched","type":"posts"},{"content":"","date":"4 August 2009","externalUrl":null,"permalink":"/tags/launch/","section":"Tags","summary":"","title":"Launch","type":"tags"},{"content":"Marc Andreessen is the second most admired person on my list after Paul Graham, and what was able to do in this tough economy and what he said about startups and the Web are the perfect examples of why.\nAnd in addition, that\u0026rsquo;s why I hate my job. I can\u0026rsquo;t believe how backward a lot of these Korean companies can be. No, I should take it back. They are not backwards, but they are just so predictable and so ordinary that not much innovations come from there. I have no others to blame but myself for current situation. I should have known it and seen it coming even under the sweet talks by my old boss. Their way of management is through micro-management and hierarchical structure. Ewwwww. What was I thinking?\nBut, at the same time, it gives me more and more motivation to pursue my own interest. I see it as my only way to do what I enjoy since my resume is not good fit for one of those hot startups. I will channel my frustration into something good. I am actually having fun with what I am building. I have even registered domain name for it. I have no idea whether it will become of something. But, all that matters is that I am enjoying it.\n","date":"6 July 2009","externalUrl":null,"permalink":"/2009/07/06/its-here-to-stay-and-disrupt-for-a-long-time/","section":"Posts","summary":"","title":"It's here to stay and disrupt for a long time","type":"posts"},{"content":"Paul Graham, a successful serial entrepreneur and my biggest idol, just published another thought-provoking essay - After Credentials.\nInterestingly, he was referring to a New York Times article on Korean education system. Having grown up in Korea till 16, I had experienced it myself and am in complete agreement with him. I was an odd kid in Korea. I didn\u0026rsquo;t like following those customary rules just because they had been practiced for many hundreds of years. I hated cramming and being judged by test scores. And it\u0026rsquo;s so true that a college degree plays a large role in one\u0026rsquo;s career and life in Korea. Since graduating from college is pretty much guaranteed, once you get in, you are set. Therefore, there is a lot of emphasis in GETTING in to a college, no matter what you major in. So, it\u0026rsquo;s safe to say that most kids do not major in what they wanted.\nKorea is a country RULED by large companies: Samsung, Hyundai, etc. They employ 100\u0026rsquo;s of thousands of people and venture into all kinds of business, from cars to hospital, theme park, and consumer electronics. Working there means job security, so many college graduates want to work there. Thus, just like what Paul said, credential and pedigree matter A LOT. Also personal connections. It\u0026rsquo;s sickening.\nIt\u0026rsquo;s one of the reasons why I like the US and the Silicon Valley. Like I mentioned about Obama, it\u0026rsquo;s the land of infinite possibilities. I\u0026rsquo;ve worked at many start-ups, and I know that all of them were filled with people from all different backgrounds, and that included educational background. Once you leave your first job, you are judged on your skills, not where you went to school. It\u0026rsquo;s so true for engineers and also sales folks. Even in the Silicon Valley, the larger a company is - like Intel and Cisco - the more your credential and pedigree matter.\nRaising two kids, I think about what values I bestow upon them. As an Asian, and perhaps the way I was raised, I highly value education and have been sending them to a private school. But as I also grow older, I wonder if it\u0026rsquo;s so necessary. Of course education is important, but I am not sure if sending them to a private school is necessary. Because, there is so much more important than just learning - creativity, positive attitude, ingenuity, etc. I really want my kids to understand that there are a lot more things valuable than good grades. I want to encourage my kids to be entrepreneurial, try new things, and not be afraid of failures. Do your best and don\u0026rsquo;t worry. I hope my parents could have taught me something different. I don\u0026rsquo;t blame my parents at all, but I can\u0026rsquo;t help but to imagine how things would have been different if I were taught different values.\n","date":"3 February 2009","externalUrl":null,"permalink":"/2009/02/02/infinite-possibilities-and-power-of-parents/","section":"Posts","summary":"","title":"Infinite possibilities and power of parents","type":"posts"},{"content":"Today is the inaguration of the 44th president, Barack Hussein Obama.\nI left home a little after 9AM, and the Vice President, Joe Biden were just taking an oath. A few minutes later, Barack did and started his speech. He was still making a speech when I arrived at work, and I stayed in the car listening to the speech until the end.\nOn the way to work, I was thinking to myself that how extraordinary today was. I used to say that while both Coasts are quite progressive and tolerant, because of more conservative center, I would never see either a woman or non-white president in my lifetime. But, I was proven wrong, and I am very glad I was. Though, I am sure dismal failure of Bush\u0026rsquo;s presidency helped a lot. He has a lot of work ahead, and I feel sorry for him since he is taking office in the worst possible time.\nAlso, it made me glad to live in America. This would have been only possible in America. Barack is half black, and his middle name is Hussein for Pete\u0026rsquo;s sake. We are sometimes critical of America, but despite of all the negative things we see and say about America, there is no better country thatn America.\nOnly in America, we have people from everywhere, every possible country, and live together with relatively small number of problems. Only in America, a minority with Muslim middle name could be elected to be the president. When other countries wrote us off, we showed them we still have what it takes and what makes America great. Only in America, truly anything is possible. America is the land of risk takers and pioneers. It makes sense that the center of creative and innovation is in Silicon Valley, in America. Current economic downturn shall pass, and when it does, America will come out stronger than before.\n","date":"21 January 2009","externalUrl":null,"permalink":"/2009/01/20/historical-moment-and-only-in-america/","section":"Posts","summary":"","title":"Historical moment, and only in America","type":"posts"},{"content":" I need to read through my emails better. Especially when it\u0026rsquo;s written in Korean, I tend to just glaze over and that gets me into trouble. Anyhow, there was an email from Bayarea K Group about some economic forum being held in SF, sponsored by a so-called \u0026ldquo;Wall Street Journal of Korea.\u0026rdquo; I didn\u0026rsquo;t realize what it was about, but I later found out that it was a part of annual meeting by KAEA (Korean American Economic Associations).\nThe forum was a panel discussion and there were three panelists, one Korean British and two Americans (one of them Berkeley professor). They all talked about what went wrong and what \u0026ldquo;definitely\u0026rdquo; caused today\u0026rsquo;s economic downturn. Though, it was quite educational, none of the three could predict when and how the economy would get better. They couldn\u0026rsquo;t even agree on what monetary or federal policies should be implemented to jump start the economy. When economists do not know, then you know we are in deep sh*t. There were a few things they agreed such as stimulus plan, what kind and how. But, I wanted to ask about rising national debt and falling value of dollars in the Q\u0026amp;A time. When it was over, though, I became completely disinterested in what they had to say. Because it doesn\u0026rsquo;t matter how intelligent they sound if none of their suggestions didn\u0026rsquo;t get executed and most likely they weren\u0026rsquo;t.\nFunny thing was a survey questions by KAEA (or could be that newspaper). It was asking very specific questions about exchange rate, gas price, when the economy would turn around, etc. Geez. When even economists do not know, how can we? But, I also found out that that only applied to us.\nThe rest and majority of participants were all \u0026ldquo;distinguished\u0026rdquo; economists from Korea. I didn\u0026rsquo;t know that, and I certainly wouldn\u0026rsquo;t have guessed it from their conversations. They all just talked about each other\u0026rsquo;s hair style, alma mater, etc. Really? Is that why you flew all the way from Korea? I did ask a few folks what they thought about the whole economy, but they had the typical \u0026ldquo;you are not worthy of my conversation\u0026rdquo; attitude. Wow. Most of these guys were from higher education institutions and public research groups, and none came with their own personal money. At the end, they all talked about where to go and drink. No wonder Korea\u0026rsquo;s economy is so f-ed up (well, besides the whole global recession thing).\n","date":"6 January 2009","externalUrl":null,"permalink":"/2009/01/06/how-do-you-know-when-you-are-in-deep-sht/","section":"Posts","summary":"","title":"How do you know when you are in deep sh*t","type":"posts"},{"content":"That phrase, Never Give Up, is so simple and commonly used that it is beginning to lose its meaning after several times hearing it. A few weeks ago, I saw a glimpse of Randy Pausch’s last lecture on PBS. The title of slide was “Never Give Up”. I have heard about his last lecture at CMU before, but never actually watched it. For strange reason, it piqued my interest this time and I decided to search it on YouTube and watch it fully. It was a bit long, but didn\u0026rsquo;t feel like it. I strongly recommend it.\nWhat a great speech! On the face of death, he stared at it squarely and decided not to let it control his life. He was making the best out of the hand he was dealt with, and having fun at the same time. He actually lived longer than doctors predicted. I think it was because of his positive attitude even in the face of death. There are many memorable moments in the lecture, but I just wanted to mention a few things.\nBrick Wall\nHe said he’d faced many brick walls in his life. Interestingly he said that a brick wall is not there to stop us, but to test us how badly we want it. It’s a natural elimination process. Those who don’t want it badly will give up easily and go away. Those who want it badly will find a way to get over the obstacle. That is so true. It goes with what he said about never giving up. He mentioned a few times when he faced a brick wall, but did not give up. Eventually things worked out, and it taught him tremendous lessons.\nLuck\nHe also said that luck is where preparation meets opportunity. An opportunity can come from anywhere at any time, and those who prepared will reap the benefits. He attributed a lot of his success to luck, but he also worked very hard, often till wee hours of the day. It is the very same thing many founders of successful startups mentioned in Founders at Work. They all worked hard, but there were many external forces they couldn’t control and thus things could have gone any direction. The reason why they were successful and many others who were equally smart and worked hard didn’t was because of some lucky chances and opportunities.\nMy personal story\nI definitely feel lucky to have found a job in this economy. I thought I was one of a few unlucky ones to be unemployed at the worst possible time, but it looks like there are many that have been affected. While I did my best everyday searching for a job, my new employment definitely has a lot to do with luck, having a good friend and being at the right place at the right time. However, until I signed an employment agreement, it was complete emotional roller coaster ride.\nThe previous company I was working for closed its doors in August 2008. I took a few weeks off, playing with kids and decompressing from the hectic start-up life, and started to look again since early September. Things went down south really fast in October when stock market started to tank in the wake of bank failures. Recruiting activities suddenly came to a halt, and response rate dropped significantly. All existing conversations stopped because many companies froze hiring. I had a director position I was interviewing for, and while the VP of marketing at the company kept dragging me along and telling me I was the “leading” candidate, they finally dropped the position in November. The first interview was in early September, and quickly I went through the second and third round of interviews successfully. In the beginning, the VP promised he’d make a decision by the end of September. When September passed, he said he had a problem scheduling interviews for a few folks. Mid-October, we even negotiated salary level, and he said he should have been able to make an offer soon. Then he wanted to check with the board of directors since economic condition had deteriorated. He came back saying the board was negative about hiring more, but when I asked about possibility of contractor position instead, the VP said it would be possible since he had marketing budgets to use. Then finally, VP never got back to me, and that was the end of it. Throughout the whole process, I was quite anxious to land something and I tried really hard to control my urgency to call or email every five minutes. It was tough, and when it didn’t finally come through after all that time, it was quite devastating. While I was going back and forth with this company, I had gone through final interviews at a couple of different places, but they didn’t work out either. I also had a few opportunities to lead very early stage start-up companies (a few people, in need of funding) where I’d have to work without salary for sometime while raising funds in this tough time. But, just as in my last start-up I founded, supporting family took precedence, and I had to turn them down. After watching Randy\u0026rsquo;s video though, I wonder if I had given up on the first start-up too early. I hit a brick wall (actually several of them), but I gave up at the end.\nAnyhow, everyday was quite hard. Whenever a recruiter called, a bit of hope sprung up, but it quickly died away when I didn’t hear back from them further. I sometimes got several calls from different recruiters for the same job. Since companies stopped hiring or slowed down dramatically, recruiters were hurting, too. I frequented local libraries, looking at different job boards and applying to various positions. I tried to utilize this time to get back to programming, but I couldn\u0026rsquo;t focus with this dark cloud hanging over me. I reached out to everyone I could think of. Many tried to encourage me by saying kind words such as: “Hang in there, it will work out”, “You will find something soon”, “Unemployment does not represent who I am”, “It’s good time to spend time with family and kids”, etc. But, deep down, it still hurt and I could not help but feel I was losing my mojo. It was just bad timing, but blaming everything on external force would only make me complacent. I couldn\u0026rsquo;t allow that. I had to be on my feet, always proactive.\nHowever, more than anything, it was a learning opportunity. It was an opportunity to appreciate many things I took for granted, learn how to live frugally, and be thankful everyday. You realize how many things you don\u0026rsquo;t really need. We had to cut down our expenses drastically and live in a very lean way, but it was definitely manageable. I also found out who my real friend was and who was not.\nI can’t sugar coat current condition and say things will get better soon. I don’t believe, as many experts agree, things will get better soon. Definitely not for a while. I can’t offer advice on what would work and what would not, since I was a complete nerve wreck myself and couldn\u0026rsquo;t keep positive attitude during the whole time. But, if I could offer a bit of advice to those in the job market, it would be the followings.\nNever Give Up, because things will always work out at the end if you keep trying.\nKeep positive attitude, which goes a long way when talking to a recruiter or during interviews. If Randy Pausch was able to keep positive attitude and had fun in the face of death, I think we all can.\nLook in not so well-known job boards in addition to Dice, Monster or LinkedIn: Craigslist, KITList, KITList-Tech, and Jim\u0026rsquo;s Jobs.\nCut down all unnecessary expenses\nUtilize local library, where you can get free Wi-Fi, free electricity, free DVD rental, and quiet environment\nFind bargains at Garage Sales\nFind free or low-cost entertainment: Free museum admissions sponsored by Bank of America or Target\nNever Give Up! I can’t say it enough. ","date":"15 December 2008","externalUrl":null,"permalink":"/2008/12/15/never-give-up/","section":"Posts","summary":"","title":"Never Give Up","type":"posts"},{"content":"From business to everyday users\nIn US, BlackBerry is often referred as CrackBerry, because of its addictive nature. The best way to gauge its popularity is by witnessing most business users checking their emails or sending messages on BlackBerry phones in airports or even in business meetings. Smartphone has been the weapon of choice for business users, who use it everyday including weekends to find contact information, check schedule, and read and send emails. Those functions were essential to conduct business on-the-go and enough to pay premium for the phone and the service. In addition, since most businesses use Microsoft Exchange for contact management, calendar and email, most smartphone vendors support integration with Microsoft Exchange. While Nokia has the highest market share (~39%) in worldwide smartphone market, US market is dominated by RIM (Research-In-Motion, manufacturer of BlackBerry phones) with about 40% market share followed by not so surprisingly Apple with about 30% market share. Market shares of Microsoft and Palm smartphones have been falling since early 2006, and the same trend continues.\nThanks to Apple’s iPhone, now the flood gate has opened. Prior to iPhone, a slick, trendy version of BlackBerry called Pearl and low-price PDA-type phones called Palm Centro had gained some popularity among non-business users. Introduction of slew of Google mobile applications – Gmail, Google Maps, Calendar, Google Search, and YouTube to name a few – also helped more and more everyday users to appreciate smartphones. Another catalyst was carrier’s introduction of unlimited data plan. But the real tsunami began with Apple iPhone. According to comScore’s report in October 2008, adoption of iPhone by low-income demographics increased 48% from June to August 2008. Interestingly enough, iPhone was a smartphone targeted for consumers, but with Microsoft Exchange integration support, more and more business users are adopting iPhone as welll. The following numbers regarding iPhone are quite staggering, considering that iPhone was introduced to the market only about one year ago.\nBest selling phone (6.89 million phones) in the US during Q3 2008 - not just in smartphone category. (Source: The NPD Group) Ranked number two in worldwide smartphone market with 17.3% market share and 523% Year-over-Year growth according to a report by Canalys. 300 million apps downloaded through App Store. (Source: Apple) Average of 2.2 million apps downloaded per day. (Source: Apple) More than 10,000 apps have been uploaded to App Store. (Source: Apple) Table 1 - Worldwide smartphone market share\nAnother new entrant to the smartphone market with much anticipation was Google’s Android-based G1 smartphone. These two phones, iPhones and Android-based phones will be the center of smartphone revolution now and in the near future.\nOpenness wins, again\nThe major reason for explosive growth of iPhone could be attributed to the App Store. Yes, it looks good and multi-touch screen is revolutionizing the whole intuitive user interface movement, but the real drive is its openness. Before iPhone, most phones manufacturers guarded their phones like a walled garden. It has happened over and over before, where too many restrictions hindered true innovations. Users received whatever phone manufacturers or carriers decided to allow. But, iPhone provided a platform for developers to offer their software - for a profit if they wish - and more importantly gave users choices. Users decide what they want to download and/or buy. Developers have motivation to write good programs, better than other developer, so that their software could be purchased more and thus make more money. It’s truly a beautiful system and ingenious business model. The numbers I described above are clear evidence. If the rumor that Apple may introduce $99 version of iPhones before Christmas is true, it would be truly game-changing plan.\nThe whole premise behind Google’s Android-base G1 phone was also the openness. It’s even more open than iPhone since its operating system (Android) is open source and it does not have as stringent software review process as Apple. Starting December 5, Google is offering a development version of the G1 phone that is both SIM and hardware unlocked. It only costs $25 registration fee to register as a developer on Android Market, and pay $399 for the hardware. Google also plans to expand the territories that it’s available in, but initially it can be purchased in the US, UK, Germany, Japan, India, Canada, France, Taiwan, Spain, Australia, Singapore, Switzerland, Netherlands, Austria, Sweden, Finland, Poland, and Hungary. It’s a shame that most mobile-phone advanced country like Korea is not on the list. Korean mobile phone manufacturer had better wake up to the new mobile world, otherwise they may end up losing a lot of their market shares.\nThese two phones are shifting entire paradigm in not just smartphone market, but overall mobile phone market. As “Internet” generation grows up and adopt mobile behavior similar to that of desktop and Internet, demand for “open” mobile phones will grow stronger and stronger. It would not be too surprising that most of mobile phones in the future will follow Apple and Google’s model.\nOpen with care\nToday’s smartphones do not deserve to be called phones. They are small computers and mobile phone capability. iPhone’s specification is better than even Playstation Portable (PSP).\nTable 2 - Specifications of iPhone and PSP\nAnd this is only the beginning. Be it mobile WiMAX or LTE, carriers will keep upgrading their networks to meet the demand and support faster bandwidth. Apple, other manufacturers of Android-based phone and incumbents will continue to push the envelope, developing better, faster, lighter and more powerful mobile devices. Does this sound familiar? Continuous improvement is no stranger to high tech world, but specifically it parallels laptops. When laptops first came out, they were much inferior to the desktops, as desktop PCs were to mini-computers much earlier. Nowadays, most laptops have become as powerful as desktops. And the day smartphones will be as powerful as laptops is just around the corner. They are not going to replace them, as we still have mainframes, mini-computers, desktops and laptops. They will all co-exist and serve specific roles.\nThe Internet opened the door to the world, where one can reach anywhere for instant access to any information he or she desires. Also, we have seen some who try to take advantage of the openness. In the dawn of desktops, malware then was limited to virus, and it had very limited way to distribute itself. With open network, where you can reach anyone, anyone can reach back to you. It doesn’t help to have vulnerable operating system and communication tools in the most desktops. Also, as opposed to hobby-like nature of virus writing in the beginning, financial gain is the main purpose of today’s perpetrators, and motivation to write good (?) and tenacious malware is much higher. Open network/system and free market are encouraging creative innovations not only in productivity but also in cybercrimes.\nMobile world is the next frontier (for cybercriminals)\nThere is a new report just published by Information Security Center of Georgia Tech, which predicts that mobile phones will be next target for botnets. It’s inevitable, as mobile phones are getting more powerful, faster Internet connection is possible and thus user behavior on mobile phone is shifting from voice communications to online communications. Previously, carriers charged users by number of SMS messages or amount of data used, but nowadays most carriers offer unlimited SMS and data plan at very attractive pricing points. The new rate plan in addition to the fact that mobile phones tend to be always on and often security is poor will make them even more attractive target for cybercriminals. The shifting user behavior makes similar “drive-by download” in mobile phones as in desktop possible. Also, another large difference between desktops and mobile phones is the sheer volume. There are estimated to be around three (3) billion mobile phones used worldwide, as opposed to about 800 million desktops. Apple and Google review the uploaded applications before publishing them to the public, but there is no guarantee that they will catch all of the malware.\nWith relatively low bandwidth, it’s hard to imagine mobile botnets launching massive DDoS (distributed denial of service) attacks. At least not the bandwidth flooding attacks, but logical and protocol attacks are certainly possible since there are so many more mobile phones available than desktops. For example, SYN flooding is quite possible with mobile phones, since it works by sending many requests to a sever and depleting its “half-open” session table, which is able to handle only about 1024 entries. More than DDoS attacks, there is more possibility of fraud and privacy invasion. Malware on the mobile phone can access paid contents and charge to user’s mobile phone account. Since mobile phone stores phone numbers of owner’s contacts, SMS spamming or even personal data leaking is possible. In places like US and others where there is tighter integration between mobile phones and company’s internal resources, the possible damage of data leak is even greater. Also, since user’s location can be pin-pointed using GPS data, a cybercriminal can track certain users for stalking or other criminal purpose. I know certain some companies in Korea already do this, so it shouldn’t be completely inconceivable. There is already an application like FlexiSPY that is used to spy on user activity. After FlexiSPY is installed on a smartphone, it allows you to use the phone to read SMS, e-mail, and call logs from the smart phone from anywhere in the world. The Windows Mobile and Symbian versions even allow you to listen to actual phone calls being made with the smartphone and use the phone as a secret GPS tracker.\nThere is also no doubt that some cybercriminals will use these powerful smartphones as a tool to a cybercrime.\nSeize the opportunity\nSo far, any serious, widespread malware has been unheard of. It’s because until just about a year ago before iPhone and Google’s Android phones, most phones operated in closed, walled-garden environment. But, as amazing success of iPhone shows, there is huge paradigm shift happening in the mobile phone market right now. I have mentioned several ways cybercriminals can benefit from compromised mobile phones, but if I can think of them, cybercriminals may already have thought of many more creative ways. It’s only a matter of time. There is a great opportunity for a security company to dominate mobile security market. There are already many anti-virus and SMS anti-spam programs are available for all popular mobile operating systems from companies like AirScanner, F-Secure Corp., McAfee Inc., Symantec Corp., SMobile Systems, Trend Micro Inc., and Sophos plc., but none of them is a clear leader yet. Many IT departments in US already have or are in the process of creating mobile security policy. Just as in desktops, they will require installation of security software (anti-virus, firewall, and/or encryption) on smartphnes and can restrict which software can be installed. So far, no major mobile security threats have been widely reported, so they are not on consumers’ radar yet. But, it will just take one outbreak for them to come to the realization. In addition to security software on smartphones, carriers or other 3rd-party vendor could also provide network-based, cloud security services by scanning all mobile data on network level.\nFor consumers and non-business users, they need to employ the same cautious behavior as in desktop environment. They should always be careful when downloading an application or clicking on a link. Just as in desktop, even with whatever mobile security software they have on the phone, they will not be able to catch everything. They should also create password to access the phones so that their information is relatively safe when stolen. But as in desktop, most users may choose convenience over security, which would be a great tragedy since they may become the source of a large outbreak.\nIn conclusion, it should come as no surprise that technology advance always comes with double-edged blade. While open smartphones promise another whole new level of productivity gain (or loss to some), they come with a quite strong warning label. But those who seize opportunity will reap great benefits.\n","date":"11 December 2008","externalUrl":null,"permalink":"/2008/12/11/mobile-security/","section":"Posts","summary":"","title":"Mobile Security","type":"posts"},{"content":"It may sound strange, but many people have expressed the same opinion.\nNOW is the best time to start a company.\nI was reading an article from the latest Wired magazine, \u0026ldquo;Back to the Garage: How Economic Turmoil Breeds Innovation\u0026rdquo; which gives an example of Tom Siebel who started Siebel Systems in 1993 when economy was faltering then. He was able to hire good software engineers relatively easily and cheaply. He also got an office space quite cheaply as well. It also reminded me of a conversation I had with my friend who is a VC partner (I consider him a friend, but I am not sure if he does). He said this is best time for VC to invest in a company as well. VCs do have money from funds they had raised before the meltdown. Because of downturn, valuation of a company would be lower.\nI had the same opinion during the first Internet bubble burst. Historically those companies that survive the economic downturn usually come out as the winner. During the bubble, it was very difficult to find good engineers and sometime companies hired people who could barely type. But when the bubble bursted and companies either closed or laid off many people, the pool of available engineers grew. VCs certainly still had money then. I was quite certain even then that economic downturn would be the best time to start a company.\nDue to my unemployment, I frequently visit FuckedStartups.com a lot. There are certainly many layoffs going on. This was all prompted by Sequia Capital\u0026rsquo;s warning to their portfolio companies a few months ago. Where would all the laid off engineers go? I\u0026rsquo;ve been searching for a while, but no one is really hiring. Even those who are hiring are taking their sweet time interviewing many folks. However, Americans are quite ingenious. In these tough times, someone with a good idea will hook up with others in similar situation and start a company together.\nIt also reminds me of the notion of \u0026ldquo;Creative Destruction\u0026rdquo;. History of Silicon Valley is filled with successful companies born during the bust time following boom time.\nMe? I have more pressing need to support my family, so I am going for a full-time employment. I can\u0026rsquo;t start a company when my family relies on me for financial needs. But, when my wife starts working, that would be a different story. Look out, world!\n","date":"25 November 2008","externalUrl":null,"permalink":"/2008/11/25/now-is-the-best-time-to-start-a-company/","section":"Posts","summary":"","title":"Now is the best time to start a company","type":"posts"},{"content":"Ample amount of free time gives me an ideal opportunity to read up on books (when I am not slacking off watching TV or browsing the web). However, I find myself always gravitated towards business and entrepreneurship books the most.\nI am involved with a professional organization called \u0026ldquo;Bay Area K Group\u0026rdquo;, and while it mostly consists of 1st generation Koreans, there are few 1.5 generations. Most members speak Korean exclusively, so if you don\u0026rsquo;t you don\u0026rsquo;t feel fitting in. I actually had an interesting discussion with another 1.5-gen Korean American, and he said broad Korean community (including 1st gen and beyond) has been having problem uniting, because of sutble (or quite large) cultural and language differences. Language makes up huge proportion of a culture, so it is probably safe to say language-induced cultural difference.\nAnyhow, one of 1.5 gen guy I met there was in exactly the same situation as I was two years ago, operating a startup by himself. He talked about his concerns, and I could totally understand because I had gone through the same before. It\u0026rsquo;s just too hard for one person to continue. That\u0026rsquo;s one of many things I had learned when I did my own stuff. He\u0026rsquo;s been doing it for two years, and I really command him for such effort. While talking, he suggested a book called \u0026ldquo;The Monk and the Riddle\u0026rdquo;. I just finished reading it - it was an easy read since it was short, and it\u0026rsquo;s another kind of book altogether (different from Founders at Work).\nIt gives a good overview of what VCs are typically looking for. There is no shortage of information about that, but this one stuck because it was told in a story. I could also relate to the main character - there are two main characters, a Virtual CEO and an entrepreneur, and I am talking about the entrepreneur, not the Virtual CEO. In the book, what struck me the most was about doing what you want to do instead of doing what you must do first and doing what you want to do later. The latter is how 99% of people operate. They feel that they must work, hold a steady job and support the family. After they retire, they feel like they could pursue what they want to do (Book continues on the subject and talks about how a company must have a mission other than making big bucks since the mission keeps the company going when things get tough). Another book called \u0026ldquo;4-hour Workweek\u0026rdquo; also talks about \u0026ldquo;Deferred Life Plan\u0026rdquo; where you do what you must to do so that you can pursue what you want to do later. The problem is, by the time you retire, you are either too old or too sick to enjoy what you want to do later. It\u0026rsquo;s not necessarily money, either, while there is nothing wrong with it. But, everyone says that more money brings in more worries. Make enough money to live nicely (how nicely would depend on your lifestyle), and do what you want to do.\nIt struck such a cord with me because another successful entrepreneur told me the same. I wrote about him before. He had founded and run successful start-ups in the past and he now lives in a property with more than one-acre land in a super-rich town called Atherton, CA. After the shutdown of previous company I was working for, he and I had a chance to talk privately before presenting our success with Korea market to a company that bought the assets and intellectual property. I was seeking some concrete idea or wisdom from him, but I didn\u0026rsquo;t get satisfactorial answer from him. Rather, he asked me why I want to start a company. I told him it was for wealth (money) and accomplishment (fame). He told me starting a company is a lousy way to make money (9 out of 10 fail) and there are different ways to seek fame (Hollywood for example). Then, he asked me what I would want to do if I had enough money. I told him I would like to make a difference in the world by setting a self-sustaining charitable organization. He said I should pursue that idea. However, I didn\u0026rsquo;t get it at the time. I think I get it now, but it still feels unreachable and undoable. Always in the back of my mind is how I could support my family. How can I support the family running a non-profit, charitable organization? Isn\u0026rsquo;t it something that social study graduates or millionaires or politician\u0026rsquo;s wives do? I still think it\u0026rsquo;s a very noble idea and I would definitely do it when I had \u0026ldquo;enough\u0026rdquo; money, but I am not sure if that\u0026rsquo;s something I would do while having to support my family. It\u0026rsquo;s just feels impossible\u0026hellip;.\nBut, there is also another thing I enjoy, and that is being a leader or being under the limelight. I\u0026rsquo;ve certainly enjoyed it in Korea, being a class president for three years in junior high school. I\u0026rsquo;ve also founded and ran a Anime (Japanase Animation) club at PENN. In my first job out of college, I assembled an Ultimate Frisbee team, which won the first place in recreation league in Washington D.C.\nAt any rate, I am about to start a job at a mobile application company, and I am quite excited about it. As I have mentioned before, I have been following mobile market and I am quite gung-ho about it. Even in downturn, I believe mobile market (in addition to gaming) will be way better than rest of the economy. I have been wanting to go into mobile market, and I am taking an opportunity to dive in head-first, as I do in many situations. I feel that this might be the place where I can get the best of \u0026ldquo;want\u0026rdquo; and \u0026ldquo;must\u0026rdquo;.\n","date":"17 November 2008","externalUrl":null,"permalink":"/2008/11/17/want-and-must/","section":"Posts","summary":"","title":"Want and Must","type":"posts"},{"content":"I have finished the book. I skipped some chapters that I didn\u0026rsquo;t find interesting.\nI had this belief before, but it was confirmed in the book. Most of successful startups are childrent of acccidental success. Most founders didn\u0026rsquo;t set out to build these big empires. Most of them were quite surprised at their own success. How amazing.\nThere is also something that I can\u0026rsquo;t let go. It\u0026rsquo;s the role of chances and luck. In any given circumstances, we can make any number of decisions. I remember Sliding Doors, less well known movie with Gwyneth Paltrow. It was a sappy movie about fate of love. The movie diverges when Gwyneth misses a train and when she catches the same train. It comes together in a hospital, where two parallel universes converge.\nAnyhow, right now where I am is the result of sequence of decisions I had made. Some major, some very minor. We make decision all the time. I am writing this essay instead of getting ready for bed. There are external factors that affect me, and I may or may not have caused it\u0026hellip;. Also a decision I make would affect others. I wonder what may have happened if admission committee of University of Pennsylvania rejected and I had gone to Virginia Tech instead. Or if I decided to stick around at Topspin instead of going to Korea and working for Samsung. Or more recently I put off looking for a job to help the bank sell assets and IP of the last company - GigaFin Networks - so that the business would continue. And now I find myself in worst time to be without a job. I made the decision not knowing what would lay ahead. Is it just bad luck? What about writing this essay at this moment? Would someone read it just by chance that may cause whole different chain of actions tomorrow and in the future?\nBottom line is that you don\u0026rsquo;t know. Just like many of the founders said that the reason why they were successful was because they didn\u0026rsquo;t know any better. They were too naive to know how hard running a startup would be. And they didn\u0026rsquo;t give up when perhaps they should have. Sometimes is ignorance is indeed bliss. You can\u0026rsquo;t be paralyzed by past and what-ifs. Make whatever best decision you can make at the moment, and go for it!\n\u0026ldquo;A good plan, violently executed now, is better than a perfect plan next week.\u0026rdquo;\n","date":"24 October 2008","externalUrl":null,"permalink":"/2008/10/23/founders-at-work-part-2/","section":"Posts","summary":"","title":"Founders at Work - Part 2","type":"posts"},{"content":"I was watching \u0026ldquo;CSI\u0026rdquo; and \u0026ldquo;Eleventh Hour\u0026rdquo; today, and I was amazed at product placement of iPhone. It also reminded me of the first season of \u0026ldquo;24\u0026rdquo; where I saw clear product placement of Cisco and Dell.\nToday was rare. I don\u0026rsquo;t watch much TV. I spend a lot of time online to watch TV shows (and video clips) on Hulu, Veoh, and YouTube. Why? It\u0026rsquo;s purely convenience. I can watch it anytime at anywhere whenever I want. I guess I could have TiVO, but I am cheap.\nA few weeks ago, I attended Bay Area K group\u0026rsquo;s technical seminar on IPTV, and I am not quite convinced whether IPTV will be the future. Unless there are programs that clearly take advantage of two-way communications, I don\u0026rsquo;t see the need for IPTV.\nI don\u0026rsquo;t know if video websites will ever take over cable or over-the-air market, but it\u0026rsquo;s getting clear that new business model for TV advertisement will be required. One of them is obviously product placement, and I can\u0026rsquo;t believe so many actors you see on TV are using iPhone! That\u0026rsquo;s one great strategy.\n","date":"24 October 2008","externalUrl":null,"permalink":"/2008/10/23/future-of-advertisement/","section":"Posts","summary":"","title":"Future of advertisement","type":"posts"},{"content":"I\u0026rsquo;ve recently picked up a book called Founders at Work. I thought I\u0026rsquo;ve heard about it when I was trying out my start-up in 2006, but it has copyright date of 2007. It is a collection of interviews of founders at various (successful) start-ups.\nThere are definite similarities between all these successful founders.\nMost of them were singles when they started companies.\nThey all started early, mostly around college period and sometimes in high school.\nBecause they started early, they were all inexperienced and naive. Yet, most of them got funding from VCs. That seems to contradict conventional belief that VCs bet on a jockey, not on a horse. Big difference? Working prototype. They all had products and prototype already working.\nMost of them had gone through some tough times during the life of the start-up.\nTheir first idea rarely worked. Many have gone through multiple iteration of ideas to get it right.\nMost had good partners and co-founders that supported each other in tough times. They all persevered, and made it at the end.\nThey all attributed a lot of their successes to luck. It\u0026rsquo;s not that they didn\u0026rsquo;t work hard and only waited for Lady Luck to smile at them. They worked really hard, and while things could have gone many different ways, some things just fell into place\u0026hellip;.by chance.\nI haven\u0026rsquo;t finished the book, but I have to wonder if I had given up my company way too early. There were many additional obstacles; like having to support the family and having no committed co-founder (my partner left in less than six months). Though, I don\u0026rsquo;t regret having started a company. It was once-in-a-lifetime experience. Another thing the book said was that start-ups tend to require more than professional commitment from employees. People say you don\u0026rsquo;t get in to business with friends, but start-ups do need friends because of its high emotional requirements.\nNevertheless, it\u0026rsquo;s very interesting book. I wish I had read this book before I started my company.\n","date":"10 October 2008","externalUrl":null,"permalink":"/2008/10/09/founders-at-work-part-1/","section":"Posts","summary":"","title":"Founders at Work - Part 1","type":"posts"},{"content":"In previous entries, I have covered the rate of change in technology advances, peril of attempting to predict the future, and current trend in developments of cloud computing, data centers, and smart phones. A report by NPD says that iPhone 3G is now the best-selling smart phone (past BlackBerry’s and Palm Treo’s) and 2nd-best selling phone after Motorola Razr in US. The proliferation of new smart phones and the birth of whole new eco-system of applications developed by any programmers and available to all users present interesting security problems.\nMobile phones in general are now considered an essential item in one’s life. It’s hard to imagine what the world was like without them, not being able to connect to anyone at anytime from anywhere (even interrupting us at anytime). Most people nowadays cannot imagine what it was like before the Internet and mobile phones. Because of its portability and must-have status, the number of mobile phones vastly outnumbers any devices that connect to the Internet.\nI can’t say for any other countries, but in US, smart phones are absolutely necessary in business because of its ability to access corporate emails and calendar. In fact, they are two major functions why millions of business users buy smart phones, which have become mandatory communications device for business users.\nIn addition to the vast volume of general mobile phones, smart phones are becoming more and more like small computers. With wide variety of applications available to download and install, new smart phone users enjoy the same freedom of choosing whichever application they’d like to use as those desktop users. As a rule of thumb, the technology advancement will continue and they may become as powerful as some laptops, as today’s laptops are as fast and powerful as desktop. It’s inevitable and just matter of time.\nSo, if you think about billions of laptop-like mobile devices with wide variety of Internet applications, any security professional will cringe. Infecting mobile devices with malicious code could result in devastating results. All the personal information stored on the laptop including address book and emails could be leaked. Someone could also tap into user’s location information through GPS and keep tracking the user for criminal purpose. Since they will become as powerful as some laptops, it’s entirely conceivable that some sort of P2P applications (good or bad) might be developed for mobile phones. As more advanced botnet uses encrypted P2P network rather than traditional IRC channels, the mobile botnet can be certainly created with P2P network as well.\nApple keeps tight control over applications developed for iPhone, but when the number of applications is increasing faster and faster, they won’t be able to keep the full control. However, restriction and control are not the answer. They will only limit innovations and may even kill the very technology and/or product it is trying to protect. Internet was able to flourish because it was open. While there are some parasites, the benefits of openness vastly outweigh negatives. There are numerous cases when open system/architecture triumphed over closed counterpart. Open system encourages competition, which in turn fosters innovations in the market. Then, how does one make money in such environment? It may not be easy, but it’s possible. Good example is Cisco. Most Cisco products are based on open standards, yet they command highest market share in most markets. Worse yet, they do not build the best or the fastest products in the industry. Slightly different, but similarly, Apple was able to come in to crowded MP3 player market and dominate in short period of time. There is no secret to make a MP3 player, as you can see in high number of MP3 manufacturers. How did Apple do it? Is it because it looks beautiful? Americans are quite practical folks. Knowledge of America might be limited to what they see on TV or movies for some, but most Americans are definitely not frivolous. It wasn’t because of its looks. Then, how did Apple succeed?\nIn marketing there is a concept of “Whole Product.” It’s not enough to win in the market with just main product. In order to complete user’s experience, you have to consider what user would go through from before the purchase to what afterwards. Apple iPod was successful because of iTune software and iTune store. In order to complete MP3 experience, a user would have to find a way to manage his music collection and a way to add more songs (either by ripping a CD or buying online). iTune software and store completed that, and they worked flawlessly with iPod. How about Cisco? Cisco’s “Whole Product” is Cisco product plus millions of professional service and technical support professionals either from Cisco or 3rd-party vendors. Cisco made it legitimate with its certification program so that their customers, if chose to seek outside help, can find quality professionals by checking their certificates. It’s this auxiliary knowledge base that is keeping Cisco in the top place. Because they are market leaders and have most customers, their position is reinforced by many other companies that build and offer additional auxiliary items/accessories and service for them such as cases, boom boxes, adapters for iPod or training centers, system/network integrators for Cisco.\nSo which way is right for mobile security? It’s a million dollar question, and also where incredibly attractive opportunity could be.\n","date":"9 October 2008","externalUrl":null,"permalink":"/2008/10/08/open-closed-and-whole-product/","section":"Posts","summary":"","title":"Open, Closed and Whole Product","type":"posts"},{"content":"The release of Chrome solidifies the importance of web browser and decline of desktop in the future of computing. There is a new wave of computing revolution going on, and I am afraid Korea is being left behind in spite of its blindingly fast technology adoption. I believe here is where the difference lies: adoption vs. innovation.\nSince the birth of the Internet, Software-as-a-service (SaaS) model has been attempted (remember those Application Service Providers in the early 2000’s?), but it truly gained momentum with rush of web 2.0 sites and also wild success of mega Internet companies like Google, Amazon, eBay, and etc. Since these companies needed to have massive processing power and deal with tremendous amount of data, they were early (commercial) adopters of high-performance computing. They wanted to monetize their expertise in running scalable data centers, and that’s how (commercial) cloud computing was born. Both Google and Amazon let a company or individual to run their web applications in their data centers and they charge only for resources used. This is especially good for web 2.0 start-up companies who cannot afford to run their own scalable data centers. Current cloud computing service isn’t perfect as demonstrated by outages from both companies. But, you can bet this is where the future of computing is headed. In turn this is also pushing development of products specifically targeting high-performance data centers, and both larger companies such as Cisco and Juniper and many start-up companies are jumping in the bandwagon.\nThis is also exactly why desktop and subsequently operating system is losing its significance. In other words, they both are going back to their basics, as they were meant to be. There is no reason for bloated OS. Actually some will even argue that OS is really just the kernel and anything else is application. It’s a religious war that I don’t want to get into. Nevertheless, it’s clear that as desktop applications move to the Internet (or cloud or somewhere remote accessible by URL or IP address), web browser becomes the window to all the applications. It doesn’t matter whether you use Windows OS, MAC OS, or Linux OS, all you need is a web browser. There will be some specific desktop markets that always need more processing power such as gaming and intensive computer graphics, and they will become only small fraction of entire desktop market.\nThis whole trend got me thinking about how come Korea wasn’t able to cash in on its technology achievements. Anyway you look, numbers are amazing: highest broadband penetration, highly advanced mobile phones, highest mobile Internet speed, and etc. But why doesn’t Korea lead rest of the world in Internet or mobile innovations? Why isn’t there a Korean company or innovation that everyone talks about as setting the trend for the future, changing status quo, and making significant differences in high-tech world? Why isn’t there a Korean people talk in the same breath as Steve Jobs, Bill Gates, Jeff Bezos, Elon Musk, Bill Joy, Andy Bechtolsheim, Will Wright, etc.? Then I realized that it was because what we see on the surface is the result of fast adoption, not innovation. In addition, Korea is too isolated in terms of its technology reach. Concepts like Software-as-a-Service or cloud computing should have been initiated in Korea. Online gaming craze in Korea is well published even in US, but it’s a result of people spending tons of time playing games programmed and published elsewhere. Should fraction of these gamers have studied programming instead, we may have a different story. The social networking website was also pioneered in Korea. Cyworld was hugely popular and successful in Korea, but they failed to capitalize outside Korea. They tried much later, but it was too little, too late. A recent report shows that Facebook, a hugely popular social networking website in US, is growing the fastest outside US. I saw some report in Korea that complained Mozilla’s Firefox and Google’s Chrome do not display most of Korean websites correctly. It’s because most Korean websites were developed for Microsoft’s ASP.Net. This is certainly not Mozilla’s or Google’s faults, and they certainly should not change its code to support non-W3C standard web pages. Korean mobile manufacturers have been in mobile phone industry for a while, but they never have generated hype and loyal following like Apple had with iPhone (to be fair, it applies to all other mobile phone makers). Also, by opening of API and free SDK, and allowing users to buy and install any applications they wish, Apple is pushing mobile application development to whole another level. In addition, Google’s open-source based Android phone is sure to bring additional push for mobile application innovation. What’s interesting is while Apple has full control over its hardware, Google doesn’t. Google relies on others for hardware, and this is quite similar to Microsoft and cheap PC hardware alternatives to IBM PC and its OS. Mobile phone’s hardware is getting commoditized, as all electronic hardware goes through, and tremendous value is placed in OS and other software running on top. That’s why Kleiner Perkins Caufield \u0026amp; Byers, the most well-known VC in the Silicon Valley, has created $100 million iFund to invest in iPhone and iPod Touch applications. In addition, Research In Motion, the RBC and Thomson Reuters have invested in an $150 million venture investment fund, called the BlackBerry Partners Fund, to support developers of applications running primarily on the Blackberry.\nIn essence, I think Korea’s high-tech industry is not taking full advantage of its potential. One major part of the problem is the whole start-up environment, from investment community to engineers and marketing folks who are too isolated. When a start-up is started, it should look to US and Europe (and perhaps China) as its main markets, not Korea. Products should be architected and designed for more than just Korean market. The key to successful business outside Korea is to understand local business and consumer cultures, so Korean companies should not be shy of hiring someone outside Korea, and also tolerate other cultures or different way of thinking. Also, you need more personal investors willing to take very high risks and provide seed money. Successful entrepreneurs should be available to offer advice to those in need. Koreans are no doubt very smart on paper. What separates them and successful entrepreneurs in the Silicon Valley are basically thought processes: creative problem solving, seeing beyond what’s obvious, thinking outside the box, etc. There is a reason why most innovations and value/wealth creation is still happening in the Silicon Valley. One of the reasons is general acceptance of immigrants and differences in cultures and thinking. Silicon Valley’s position may certainly change in the future, but so far I believe it is still here. I sincerely hope that Korea can take full advantage of its highly-educated, smart population and its technology achievements to start creating values outside Korea (but NOT with Government initiatives). She has the potential and just needs to spread her wings.\n","date":"8 October 2008","externalUrl":null,"permalink":"/2008/10/08/danger-of-isolation/","section":"Posts","summary":"","title":"Danger of isolation","type":"posts"},{"content":"The concept of \u0026ldquo;Whole Product\u0026rdquo; has been well known. In order to complete user experience, you need additional products, features or services in addition to the main product. For Apple iPod, it was the iTune that managed music collection as well as vehicle to buy a song at $0.99 (as opposed to buying an entire album). Apple perfected the art with iPhone and its App Store.\nThinking back, Samsung made critical mistake when trying to enter enterprise networking market. Most companies buy Cisco products not only for their technology, but also support and professional services, which make up the whole product. Even though networking products are based on open standards (IETF), because enterprise network is complicated and mission critical, it\u0026rsquo;s important to design it correctly and to receive immediate support when something goes wrong. Samsung wasn\u0026rsquo;t willing to invest money in the support and services structure.\nAlong with iPhone, Google\u0026rsquo;s Android phones will also have Application Marketplace, so it would be very interesting if the success can be replicated. I say it would, but we shall see. There is clear business model for Apple iPhone application developers (by charging for apps), but I don\u0026rsquo;t see it for Android. I suppose they would have to give developers freedom to charge for an application. So far I think they are supposed to be free, but money could be very strong motivator, so Google should strongly consider it.\n","date":"2 October 2008","externalUrl":null,"permalink":"/2008/10/02/whole-product/","section":"Posts","summary":"","title":"Whole Product","type":"posts"},{"content":"If mobile phones (more like smart phones) are becoming mini-computers, it is very conceivable that many things you run on desktop could be run on smart phones.\nThe major differences between the two are mobility, contraints and the volume. I was thinking about the last part. There are supposed to be around 3 billion mobile phones in the world, as opposed to some several hundred million PCs. Also most phones are on all the time, albeit in standby mode. If some applications are running all the time, battery wouldn\u0026rsquo;t last long. If you consider all the phones worldwide, there will be millions phones on at one time.\nIf there is a way to tap on to each of those phones, combined productivity would be great. There is one sort of application that utilizes a great number of folks downloading at the same time, and it is BitTorrent. Can you imagine BitTorrent running on most smart phones\u0026hellip;\u0026hellip;either streaming or downloading? You can easily max out network capacity\u0026hellip;., and your other mobile applications would suffer. The idea of creating mesh network using mobile phones in proximity has been aroudn for a while. It could be doable, but what would be the purpose? Mobile P2P would be cool, but what useful thing can you do with it?\nIt brings me memory of using the first VoIP app. I was in college, and I remember using it in a dorm room\u0026hellip;, and I can\u0026rsquo;t remember the name of the app, but all I remember is that it really sucked and I was really disappointed. Like any new technology, I think the first batch would be more of \u0026ldquo;proof-of-concept\u0026rdquo;. But, it\u0026rsquo;s almost like evolution - that technology will improve, and at some point, environment will be ripe for the app(s).\nI truly believe it\u0026rsquo;s only matter of time that some sort of P2P or mesh networking. You know, that\u0026rsquo;s why I think iPhone will lose to hundreds of gPhones. iPhone will kill those applications, but gPhone is for freedom. You can hack it. You can install any applications. You can probably even install modified OS. gPhone will spur much more innovations than iPhone. It\u0026rsquo;s substance vs. style, and I\u0026rsquo;d go for substance (with style). :)\n","date":"30 September 2008","externalUrl":null,"permalink":"/2008/09/29/mobile-app-p2p-or-mesh/","section":"Posts","summary":"","title":"Mobile app - P2P or mesh","type":"posts"},{"content":"My current mobile contract is over in October. I set my mind to buy an iPhone next, but then T-Mobile\u0026rsquo;s Android phone, G1 will be also available in October. That complicates things a little bit.\nBut one thing is for sure. I don\u0026rsquo;t like G1. HTC and T-Mobile should\u0026rsquo;ve done better job at designing an aesthetic phone. It\u0026rsquo;s fugly. I see it as a beta phone, and I hope Samsung or LG make much better Android phones. Then shall I wait till those phones are available? Next Android phone is most likely from Sprint, and I wouldn\u0026rsquo;t buy it even if it\u0026rsquo;s free (unless I can unlock it and use it in AT\u0026amp;T network!) because Sprint network sucks and the company will be extinct in a few (or several) years.\nIt also dawned to me that there are some similarities between different routes PC/Mac took and how Apple and Google are approaching mobile market. Apple iPhone is definitely vertically integrated. Apple controls the hardware, but lets 3rd-party software developers to publish their applications as long as Apple approves them (thus the similar to Mac). On the other hand, Google\u0026rsquo;s Android is open-source and it relies on others to make platforms and anyone can develop software (thus similar to Microsoft and PC). Even in Google\u0026rsquo;s case, I think they would need to screen some applications that might be borderline immoral - offensive, racist, unethical, or just plain wrong (wrong on whose standard? That could be a source for a debate). So, with such parallism, I have to wonder whether iPhone will suffer the same fate as old Mac did. While many phone manufacturers are coming up with different phones with different tastes (thus much broader appealing than iPhone), iPhone will be limited to designs that Apple can release.\nIn addition, as recent smart phones have demonstrated, future mobile phones will be just like mini computers. There will some mini computers for average folks, some for advanced, and some for ultra geeks who may even buy off-the-shelf-components and build their own. The key is to let hardware vendors package them differently and target different market segments. Google just provides OS and default search, many many 3rd-party developers offer their applications. This is what Microsoft wanted with its Windows Mobile OS, but Google is definitely crashing Microsoft\u0026rsquo;s party. Who would win? I don\u0026rsquo;t know about you, but I am going to bet on Google. Google (Android) will dominate smart phone OS in 3-5 years. Because it is open source, someone can easily build an affortable smart phone based on Android and create mini smart phone reveolution in developing nations, where cheap phones are dominant, but people will naturally want to move up to better, sophisticated phones. In other words, even in smart phone market, there will be different segments; more basic, cheaper to advanced, more expensive phones. Someone might even sell mobile phone kit(s) with different components.\nOne hurdle I could see is carriers. In many places, you are locked in to a carrier. This must change. It is hurting mobile innovations. Those fat cats must go. FCC must allow open competition. Google\u0026rsquo;s bid for spectrum was more self-served, but open airwave would have spawned amazing innovations in mobile industry. In the end, perhaps, all telecom service providers (either wired or wireless) might become just pipe provider. They want to avoid that, thus make you lock-in or monopolize the market.\nAgain and again, the higher you go up on the value chain, more important it is. Content/software is the king - applications on PCs, OS in routers/switches, programming on cable network, etc.\nComing back to the original point, Apple had better be prepared to not repeat the history.\n","date":"25 September 2008","externalUrl":null,"permalink":"/2008/09/25/history-repeats-itself-iphone-and-apple-macs/","section":"Posts","summary":"","title":"History repeats itself? iPhone and Apple Mac's","type":"posts"},{"content":"T-Mobile\u0026rsquo;s G1, much anticipated Google Android phone, was unveiled today. However, looking at the pictures, I can\u0026rsquo;t believe how ugly it looks! I glimpsed a bit of screen shots, but I am not entirely convinced this would be a iPhone killer\u0026hellip;. In addition, I am not hearing about customers dying to get their hands on it. Google/T-Mobile could have done better job marketing the phone\u0026hellip; :(\n","date":"23 September 2008","externalUrl":null,"permalink":"/2008/09/23/t-mobile-g1-dream/","section":"Posts","summary":"","title":"T-Mobile G1 (Dream)","type":"posts"},{"content":"Here is another idea for a mobile app: translator.\nIn my last job, I had to travel abroad a lot for business. Luckily I was able to speak the local language, so it wasn\u0026rsquo;t a big deal to me, but some sort of translator would be cool. It doesn\u0026rsquo;t necessarily need Internet connection to work. Basic phrases could be downloaded with the app initially or downloaded before a trip. Since Wi-Fi (either open or paid) hotspots are available in many international cities, additional translation could be done easily. Ordering food or telling a cabbie where to go or asking for direction could be done so easily\u0026hellip;.. Perhaps, even local map, public transit map, points of interest with recommendations could be downloaded before so that the stay could be enjoyed better. Actually better yet, you use crowd wisdom to have other ex-pats recommend places to go, foods to eat, etc. Now it\u0026rsquo;s becoming more like a travel app with translator feature. And maybe work with local or international ad network to place small local-specific ads\u0026hellip;..as revenue source.\n","date":"23 September 2008","externalUrl":null,"permalink":"/2008/09/23/mobile-app-translator/","section":"Posts","summary":"","title":"Mobile app - translator","type":"posts"},{"content":"Should you?\nI had a conversation with someone who has been quite successful as a serial entrepreneur. Since I have a lot of spare time, I wanted to pick his brain and get some pointers what I could follow his footsteps. His brief answer was that he just had been lucky, right place at the right time. He also said there are some people who are cut out to be a leader, founder, and entrepreneur. And, most people are not. He said God (whichever god depends on your religion) has set out a path for everyone. People have different strengths, and he doesn\u0026rsquo;t believe in working on improving weaknesses, but reinforcing strengths.\nOne of the books I like is Sun Tzu\u0026rsquo;s The Art of War. One principle in the book says that the state head must know how to utilize his generals\u0026rsquo; strengths best. If a general is good at offense, he should be deployed in offensive position. And if a general is good at defense, then in defensive position. You can\u0026rsquo;t blame a general for not doing his job if he was assigned with a job he cannot possibly do well. It makes total sense\u0026hellip;\u0026hellip;\nSo, what if your dream is not in line with your strengths? Or what if your strengths are not enough to reach your dream? Books and TVs are full of stories about people following their dreams, persevere, and actually achieving them. How about others who have followed them but never made them? There are many athletes, both professional and Olympic, who in spite of their best effort do not make it at the top. What about those countless artists and musicians? When do you realize that perhaps your strengths are not in line with your dream or just not enough? What do you do? Then, is it about different levels or definitions of success? Should an athlete be satisfied with making it to the Olympic teams?\nIt\u0026rsquo;s especially meaningful to me since I have two kids of my own. As a parent, I would tell them that they could be anything they want to be. Would I be setting them up for big disappointments? Shall I just tell them that there are different levels of successes, and they should set low goals? Jack Welch is famous for setting \u0026ldquo;stretch goals\u0026rdquo;, which may not be applicable for kids, but I really ponder over the whole thing.\n","date":"23 September 2008","externalUrl":null,"permalink":"/2008/09/22/follow-your-dream/","section":"Posts","summary":"","title":"Follow your dream?","type":"posts"},{"content":"Since the shutdown of the company I was working at previously, I have had some time to think about what I want to do. I still have the desire to start my own company, but it’s indeed getting harder and harder as I have certain family obligations. Next best thing is to join a startup, but there aren’t too many left standing in networking industry. As I have mentioned before, best case scenario would be to join a startup in web application space, but because I don’t have relevant prior experiences, it is tough. That leaves joining a well-established company in networking industry. While that’s good for supporting the family, it is bruising to my ambition and dream of starting a company of my own. However, life would not be worth living without a dream. We live one life, and I just refuse to accept that I will live the rest of my life as nobody in the sea of big corporations. Well, not exactly. My personality wouldn’t let me be nobody. I am too ambitious to be nobody in any company. Either I make a difference and become somebody or get the hell out. I think I\u0026rsquo;ve always enjoyed limelight - there is something about being a center of attention.\nAt any rate, I decided to examine history of technology innovations (as far back as I could remember), and see where the future innovations would happen. As people grow older, they tend to have “locked-in” view. I can feel that I already do that sometimes. But, it’s important to have open mind and views. I will let my imaginations go wild, and see where things might be headed in the future. This would be a good exercise.\nI would divide Internet into two large areas: physical and logical (or Layer 1 to 4 and Layer 5 to 7 of OSI model). In physical side, you have telecommunications and data communications equipment that is responsible for delivering bits (zeroes and ones) from point A to point B. In Layer 1, most long hauls, WANs and LANs are either fiber or moving to fiber. To desktop is most likely to remain copper, and to laptop is most likely wireless (Wi-Fi variation). Long hauls use mostly SONET, the good-old, reliable SOB. DWDM stuffs much more information into single strand of fiber using different wavelengths. So, as long as you have fiber in the ground, DWDM or any other future boxes will be interested in stuffing more and more bits into the single strand of fiber. Similarly, Ethernet evolution map is pretty much intuitive, too: faster and faster. Also interesting thing is moving everything over IP. Storage used to be exclusively on fibre channel network, but with NAS and iSCSI, everything is accessible over IP without specialized network. There is even talk about implementing fibre channel over Ethernet. Actually, much more interesting things in physical side are happening in and around data centers. The need to have scalable data center is pushing for HPC environment where resources from multiple servers are pooled together. What’s happening now is like creating a humongous server with hundreds of CPUs and obscene amount of storage. With pre-partitioned storage, any number of CPUs can be instantly grouped together to perform certain jobs. For example, if there is sudden surge of demand for database processing, addition CPUs can be assigned to already existing database CPUs. It is like dynamic server virtualization. You can also imagine, with fast enough connection and fast enough storage like maybe Solid State Drives, that there could be separate “memory area network” in addition to “storage area network”. Thus you have three physically separate areas – CPU, memory and storage - being grouped dynamically on the fly and providing services to clients as needed. What provides physical connections for those three areas become quite interesting too…. Memory typically requires 50ns or less access speed, so I am not sure if current Ethernet switch can work. But, you could imagine some sort of box providing network connection to/from clients as well as between the three areas. That would be really neat… But the box needs to be as scalable as the computing resources. Also management would not be easy. There may be additional challenges I am not seeing right now, but I would believe that’s where most network, server, and storage vendors are heading.\nIn terms of physical side of mobile industry, it’s also pretty much predictable. Apple iPhone and Google Android are paving a new era of mobile networks. Service providers need to upgrade their equipment to deal with more and more data. Thanks to the two pioneers, mobile phones will be considered as mini-computers where consumers are free (as much as phone manufacturer lets them) to download and install applications.\nLogical side is even more interesting than the physical side in both wired and wireless networks. Whether you use desktop or mobile phone, what you do with bits delivered via the network is where the true value resides. However, I must say that I am much more excited about mobile apps than desktop apps. The evolution of desktop apps seems quite predictable. For example, social networking websites could be considered as enhanced BBS. I remember when I first got my computer in high school, it came with 2400 baud modem and the only “online” activity would be through BBS. I exchanged games with others physically…using 5.25” floppy disks. You could choose which BBS to go and hang out. When I went to college, I used newsgroups and IRC as BBS. Then to Yahoo Groups, and now it’s Facebook. Truly remarkable development has been around software-as-a-service model. In most cases, big software vendors tended to target customers who leave most margins, i.e. Fortune 1000 companies. Small-to-Medium businesses usually get crippled version at discounted price, but in terms of productivity, it could be considered a lot more expensive. When you move apps to web, now you have different economies of scale, and distribution and pricing model. Just as the Internet made “Long Tail” possible, SaaS changes the whole software landscape and makes it attractive to SMBs (not that it wouldn’t be also attractive to larger companies, but they may not have compelling reason to jump).\nAlso, when you add mobility, you get a whole different set of software. Mobility means your location may change at any time. The obvious apps are the ones that tell you about things around you, whether you are looking for a restaurant, a friend, etc. There is also notion of instant social gaming, where you hook up with whoever is available and play a game together. Another one is instant access to information wherever you are. One app I saw lets user scan a barcode of a product and find review/rating information about it. Pretty clever. So what makes apps on mobile phone with high-speed internet connection a lot more interesting is location + instant access to information.\nWhat could be possible? Where could things go from here? SaaS means both desktop and mobile phone could access the same application. So the SaaS should be able to accommodate information from/to both desktop and mobile phone. Will desktops become just another (immobile) terminal to apps? How about SaaS of SaaS? If apps are moving to web, and there might be a need for information exchange between two or more SaaS apps. Mashup for mobile apps. There is an idea! Another characteristic of mobile phone is it’s most likely to be with owner all the time. So, it could be use as tracking device…..could be as physical as distance travelled or expenses……or some sort of analysis based on accumulated data…..like when s/he is most likely to spend money, etc. I actually have envisioned a society without cash, since a lot of financial transactions already happen without me actually touching the money. Money gets deposited using direct deposit. I always use credit cards for purchases. I then pay for credit charges using online banking. I don’t need to touch the money, period. So, what if you add charging capability to the mobile phone? It’s already done in Asia and Europe, where you can pay for goods using your mobile phone. It’s just that mobile carriers are not credit card companies, but it should be possible perhaps through partnership. Then SaaS could keep track of most of expenses through the mobile phones and provide you with financial analysis. That could be possible.\nActually, it would be impossible to think of all the possible mobile SaaS right now….., but it gives good topic ideas. From today on, I am going to write about at least one mobile SaaS a day.\n","date":"22 September 2008","externalUrl":null,"permalink":"/2008/09/21/dare-to-predict-the-future/","section":"Posts","summary":"","title":"Dare to predict the future","type":"posts"},{"content":"There are a few people at work I enjoy having conversation with, and one of them is a software engineer with a lot of interest in marketing and starting a company.\nOne day he and I had a discussion about high-tech marketing strategies. I gave examples and principles from books I have read like Crossing the Chasm, Inside the Tornado, and Innovator\u0026rsquo;s Dilemma. But, he basically discarded them as garbage and they are all just after-the-facts, trying to explain what made companies successful. Hindsight is always 20-20, and it is easy to justify actions after success. I try very hard to make counter his points, but it didn\u0026rsquo;t fly.\nThe truth is that he was right. None of the authors - neither Geoffrey Moore and Clayton Christensen - has ever run a successful company. Also, so many successful companies in the valley have been accidental success. Look no further than Google. Larry Page and SergeyBrin never wanted to start a company. After successful prototype, they just wanted to sell the technology. Nobody including Yahoo wanted to buy the technology. Everyone thought search market was mature enough with no room for new player. They sat on a $100,000 check made out to \u0026ldquo;Google, Inc.\u0026rdquo; from Andy Bechtolsheim, mulling over whether to start a company or not. The same with Craig Newman from Craigslist.org, which is arguably one of the most visited websites in the world. He started out by managing a bunch of mailing lists, which was a pain and took a lot of his time. He wanted a better way to manage the mailing lists, and that\u0026rsquo;s how Craigslist.org was born. Mark Zuckerberg from Facebook never intended to create a company of current Facebook. He just wanted to find a way to see who\u0026rsquo;s who in his freshman class, and that\u0026rsquo;s how Facebook started. Similar stories exist for other companies like eBay and Paypal. Have they all followed the strategies and tactics laid out in marketing books? I am not sure. But, it is surely easy to tell the world - after such huge success - why certain actions taken at the time were so brilliant. But, who knows at the time it was motivated entirely differently?\nIn addition, most successful start-ups happened to be started by engineers, not marketing-types. From HP to Cisco, Sun Microsystems, Yahoo, and Google, all of them were founded by engineers.\nGuy Kawasaki from Garage Technology Ventures said that one common mistake an entrepreneur makes is writing a business plan first. Instead, he or she should start building service or product and starting selling them first. It\u0026rsquo;s utmost important to get customer feedback as soon as possible. By incorporating customer feedback and improving service or product, the entrepreneur could build his/her business. If more capital is required for further growth, it\u0026rsquo;s much easier to raise funding with proven business model.\nSo, to my fellow entrepreneurs, JUST DO IT!\n","date":"22 February 2008","externalUrl":null,"permalink":"/2008/02/22/just-do-it/","section":"Posts","summary":"","title":"Just do it!","type":"posts"},{"content":"InfoWorld recently ran a story about high-tech\u0026rsquo;s all-time top 25 flops, and security took the honor of being the first place. The list included pretty familiar flops like IBM\u0026rsquo;s OS/2, Apple\u0026rsquo;s Newton, and IPv6. As someone who works in the security industry, the finding isn\u0026rsquo;t all that surprising. It was actually pretty amusing, because my colleagues and I all knew security would in in that top 25. As in my previous blog entry, the number of malware is reaching an epidemic level and there are many variations of past and current malware including virus, worm and spyware.\nIt looks like the security industry has reached its limitation with current techniques.\n","date":"3 February 2008","externalUrl":null,"permalink":"/2008/02/03/security-techs-all-time-top-flop/","section":"Posts","summary":"","title":"Security: Tech's all-time top flop","type":"posts"},{"content":"Bad for Microsoft shareholders and probably good for Yahoo shareholders. 62% premium above Thursday\u0026rsquo;s closing price is a good offer, and board of directors at Yahoo must consider it very seriously.\nWhy is it bad and why it wouldn\u0026rsquo;t work? Let me count the ways\u0026hellip;\n1. Two mediocre companies - mediocre in terms of Internet world - will not create one better Internet company. Windows Live sucks. Yahoo has been losing its market share in search market and its new ad marketing system, Panama, hasn\u0026rsquo;t made difference to Yahoo. I really can\u0026rsquo;t see how the combined company will compete with companies like Google better\u0026hellip;..\n2. Mega merger rarely works. The reason why Cisco has been successful in M\u0026amp;A is because Cisco targets mostly small companies. There are a few exceptions, but it takes enormous amount of work to integrate large companies. It will take long time for Microsoft and Yahoo to work through integration, and competition will be far ahead of Micrsoft+Yahoo by then.\n3. Microsoft has bullied its way into browser world by including internet explorer with its operating system, but these days, especially to web 2.0 companies and their web applications, browsers do not matter. Their applications are browser-agnostic in most part. Google returns the same result whether you have IE or Firefox or any other browser. Other Google services (or applications to an extent) will run the same whether on IE or Firefox or any other browser (if there is difference, it would be minimal). Furthermore, they are also OS-agnostic. Whether you run Linux, Solaris, or Windows, these web applications and web sites are made to run\nthe same no matter what OS and what browser you use. This is precisely why Microsoft should and is worried about Google and the whole slew of web 2.0 companies (look at Facebook and its huge list of applications - Facebook is already its own platform).\nHowever, motivation is clear, and the proposed deal looks enticing to both Yahoo (for capital, financial and resource reasons) and Microsoft (for technology and market share gain reasons)\u0026hellip;. But I can\u0026rsquo;t help but feeling that this will mark the time Microsoft finally jumps the shark\u0026hellip;\u0026hellip;\n","date":"3 February 2008","externalUrl":null,"permalink":"/2008/02/03/microsoft-yahoo-is-a-bad-bad-move/","section":"Posts","summary":"","title":"Microsoft + Yahoo is a bad, bad move","type":"posts"},{"content":"Dark Reading - sister site of Light Reading which had been source of much rumor and information when I was in networking market - has recently reported that malware is reaching epidemic level. It sites reports from two security firms, PandaLabs(research arm of anti-virus company, Panda Security) and AV-Test (an independent anti-virus software testing organization). Key statistics are the followings.\nNumber of malware has increased 5 to 10 times in 2007\nAverage of 3000 new variation of malware each day in 2007\nApproximately 72% of networks with more than 100 workstations and 23% of home users are currently infected with malware even with operative antivirus or other signature-based tools in place\nApproximately 5.5 million different malware files identified in 2007 - 5 times as greater than 2006\n118,000 different malware files in 2 weeks of January in 2008\nAll these numbers indicate that signature-based approach to computer and network security is no longer effective and cannot scale. While signature-based solutions have worked fairly well so far, they have one fatal weakness; no known signature, no detection and thus no defense. And as the numbers show, the rate at which malware is created is clearly overwhelming signature-based security companies.\n","date":"27 January 2008","externalUrl":null,"permalink":"/2008/01/26/signature-based-security-is-no-longer-effective/","section":"Posts","summary":"","title":"Signature-based security is no longer effective","type":"posts"},{"content":"So, I am winding down on my pursuit of the startup. I had to. My saving level is dangerously low, and I have a family to support.\nAnd, this outsourcing to an Indian software company was a BIG mistake, too. What it came down to is the heart and soul put into the work. They will do a job to meet the spec, but as any software engineer knows, there are million ways to write a code, and these guys will write the minimum or take the shortest path to meet the spec. That doesn\u0026rsquo;t mean they will think about efficiency or quality of the code. So, quality of the code is always questionable. But, again the biggest problem is that these guys will not go above and beyond. Just do the minimum to meet the spec and that\u0026rsquo;s it.\nWhen I told many people that I was going to outsource the coding, they thought I was crazy. It\u0026rsquo;s core of my business, and you should never outsource something that\u0026rsquo;s core to one\u0026rsquo;s business. That\u0026rsquo;s so true, because I just learned it hard way and also it is clearly said in the book I am currently reading, Living on the fault line by Geoffrey Moore. Well, actually at first, I didn\u0026rsquo;t think the website was the core, but marketing strategy was, because writing a website is so trivial and anyone could do it. I wanted to do it cheaper and faster, and concentrate on good marketing so that I can attract critical mass of users. But, it was the core. In consumer website space, user experience is everything and the website that was built by this Indian outsourcing company - which by the way had developed other social networking sites before - had the worst user interface. So, I basically told them to stop the development since I want to cancel the project. Of course, they weren\u0026rsquo;t happy about it, but there was really no point in going on. The website developed by them was so inferior to current competitors.\nRecently I had to research open-source social networking platforms, and I was surprised to find so many. And, they all looked really good. I remember distinctly that I searched for such platform in October of 2006, and there really weren\u0026rsquo;t much. I found a few that I\u0026rsquo;d have to buy, but no social networking\u0026hellip;. Though, I am not sure if I would have time to develop the site myself even if I found a suitable open-source social networking platform. The learning curve would have been too steep. That was actually another reason I decided to use an outsourcing company\u0026hellip;.., but it turned out to be probably worse.\nAh, well\u0026hellip;. You live and learn and move on.\nAlso, another thing that I learned was that most of the successful startups were founded by engineers and geeks, not by business or marketing people. I\u0026rsquo;d better go and hit programming books!\n","date":"25 August 2007","externalUrl":null,"permalink":"/2007/08/24/pros-and-cons-of-outsourcing-software-development-to-india/","section":"Posts","summary":"","title":"Pros and cons of outsourcing software development to India","type":"posts"},{"content":"I am in mid-30\u0026rsquo;s and along the way I\u0026rsquo;ve made my own share of mistakes. Of course, in retrospect if I knew differently or better, I wouldn\u0026rsquo;t have made those mistakes. A wise man once told me that a smart person would learn from others\u0026rsquo; mistakes, and it is so right. Come to think of it, I used to discount most proverbs and old sayings as whatever, but now I think they are true in general cases (perhaps more than 70% of time). They had become what they are from hundreds of years of observation, and I think that\u0026rsquo;s pretty powerful.\nSo, I just wanted to warn people, especially those who may want to work for a local company in mother land (non-American descendants and/or 1.5 to 2nd, 3rd generations), about possible consequence of their action. If you plan to move there permanently, none of it would matter.\nFirst and foremost, don\u0026rsquo;t do it unless there is a good reason for it. Chances are you will be faced with vast corporate/local culture shock. Unless their culture could be considered positive or you are sure that you can spin it positively or you can be completely submerged in the culture and later plan to work for a company that targets the market, don\u0026rsquo;t do it. In addition, if you want to come back and get another job, it would be hard to conduct phone and/or face-to-face interview from overseas.\nSecond, make sure it is a world-renown company where you are absolutely sure that skill sets and experiences can be viewed positively when moving back to US. Remember, how the company is perceived can be very different from views/experiences inside. It is crucial,\nThird, if you really want an international exposure, go to an American company who is looking to send someone there so that you would at least be guaranteed a job in US. Like I said, it would be though to arrange and do phone and/or face-to-face interview from overseas, and you are likely to have to come back and start looking. It wouldn\u0026rsquo;t apply if you have rich parents or uncle from whom you can live off for a while.\nRemember. Always learn from others\u0026rsquo; mistakes.\n","date":"11 July 2007","externalUrl":null,"permalink":"/2007/07/10/learn-from-others-mistakes/","section":"Posts","summary":"","title":"Learn from others' mistakes","type":"posts"},{"content":"It was my junior year in college that I picked up this free issue of BusinessWeek. It had a special section about Silicon Valley, and reading it was like an epiphany. It was amazing to read about unconventional folks, mavericks, and renegades were truly shaping our world. They were because after the industrial age, we live in formation age and these companies were creating innovative software and hardware that were fueling and driving information age. I wanted to be one of them, creating a company that would change the world and perhaps make a lot of money on the side. But, I wasn\u0026rsquo;t sure how I would go about doing it. I was naive and still trying to figure out my place in this relatively new world, having immigrated to US just about seven years ago.\nWell, I had an opportunity to work for startups in the Silicon Valley, and it was during this time that I became fascinated with high-tech marketing, thanks to VP of Engineering at Caspian Networks who recommended Geoffrey Moore\u0026rsquo;s Crossing the Chasm. He is now founder and CEO of Ethernet fabric company. Since then, I wanted to move onto product marketing area, but the opportunity didn\u0026rsquo;t arise until 2004.\nI had a chance to work for Samsung Electronics in Korea. It wasn\u0026rsquo;t an easy decision. It took me three months to decide. I\u0026rsquo;ve heard some horror stories about harsh treatment from jealous colleagues and cultural shock experienced by Korean Americans who went to work for a company in their mother land. Also, they were going into a very tough market, router market where Cisco owns 70% market share in all segments and 95% in mid-range segment. Other big telecommunications companies like Nortel, Alcatel and Lucent tried to challenge Cisco, but all failed. What I liked about Samsung was that it had huge amount of cash. If Samsung were in the game to win, it was going to be a long battle that would require lots of cash.\nBut, what I faced was quite dismal. Samsung, a large company in all aspects with 200K+ employees worldwide, truly exhibited everything you could expect from a large company. Working there was living the words of Clayton Christensen\u0026rsquo;s Innovator\u0026rsquo;s Dilemma. And we are not even talking about a disruptive innovation. Actually, most of the leading Samsung products happen to be with sustaining technologies instead, like more dense memories or phones packed with more and more advanced features. Clayton Christensen\u0026rsquo;s definition of disruptive technology is not radically different technology, but entirely different application of current or new technology targeting entirely different market.\nI am a Korean American, and I am somewhat passionate about Korean companies. In the back of my mind, I thought my high-tech marketing knowledge with heavy experiences in data networking and in startups, I could make a real impact and be the real change agent at Samsung. It didn\u0026rsquo;t happen, and I could spend another full post on why. At any rate, in the light of iPhone\u0026rsquo;s huge initial success, selling out 500K units last week, I wondered how come no Korean company, with heavy chips on their shoulder and arrogance could not create such \u0026ldquo;iconic\u0026rdquo; product that people could get really passionate about. Other foreign companies have done it. Sony certainly has done it\u0026hellip;., many times with Walkman, Playstation, etc. According to Tony Seba and in his book, Winners Take All, success of Apple\u0026rsquo;s iPod could be attributed to creation of \u0026ldquo;whole product\u0026rdquo;. iPod was only successful with iTune application and iTune store by providing users a complete digital music experience. iPhone might actually fail because of poor experience with AT\u0026amp;T. Wireless carrier matters a lot to create \u0026ldquo;whole product\u0026rdquo; of a cellular phone since poor cellular quality will hinder users from positive experience.\nI think it\u0026rsquo;s useless to exclaim R\u0026amp;D or technical strength if you cannot exploit it and lose in the market. To win in the market, you have to know the market. Peter Drucker once said that \u0026ldquo;The aim of marketing is to know and understand the customer so well the product or service fits him and sells itself.\u0026rdquo; Perhaps the problem with these Korean companies and why they have not been able to create an iconic product is that they do not know the market.\n","date":"6 July 2007","externalUrl":null,"permalink":"/2007/07/05/what-makes-a-company-great/","section":"Posts","summary":"","title":"What makes a company great?","type":"posts"},{"content":"\u0026ldquo;I think there is a world market for maybe five computers.\u0026rdquo;\nThomas Watson, Chairman of IBM, 1943\n\u0026ldquo;There is no reason anyone would want a computer in their home.\u0026rdquo;\nKen Olson, President, Chairman, and Founder of Digital Equipment Corporation, 1977\n\u0026quot;640k ought to be enough for anyone.\u0026quot;\nBill Gates, 1981\n\u0026quot;What the hell is \\[a microprocessor\\] good for?\u0026quot;\nRobert Lloyd of IBM\u0026rsquo;s Advanced Computing Systems Division, 1968\n\u0026quot;I see little commercial potential for the Internet for at least ten years.\u0026quot;\nBill Gates, 1994\n","date":"5 July 2007","externalUrl":null,"permalink":"/2007/07/04/do-you-dare-to-predict-the-future/","section":"Posts","summary":"","title":"Do you dare to predict the future?","type":"posts"},{"content":"I wish someone had told me about it early, perhaps before going to college. I have been working for about 10 years now with most of experiences in data communications, and it\u0026rsquo;s been pretty obvious to me that real value of a system resides in software, not in hardware. In the communication systems, what determines reliability is usually their OS and software in general. Hardware matter, too, but only up to certain point. And, it\u0026rsquo;s relatively easy to reach a reasonably robust hardware product. The real art of creating value is really in software. I wish I have known this before. While I started my freshman year as a CS major, but later I changed to EE because I didn\u0026rsquo;t like to spend too much time in front of a computer.\nAnyhow, the two pillars of data communications industry is Cisco and Juniper. When Juniper first came out, its software took much different path from Cisco. Cisco\u0026rsquo;s IOS used to be this humongous, non-modular piece of code and changes in the one part of IOS may easily break different part of IOS. It was somewhat synonymous to MS Windows OS, where the backward compatibility requirement has hindered it from introducing much better OS for a while. Also, their approach was similar where Cisco IOS would support any network protocols under the sun like DECnet and Appletalk, while Juniper only supported newer protocols. When a process within IOS fails or goes nuts, it would bring down the whole system, but not Juniper\u0026rsquo;s OS - JunOS. It was definitely smaller, faster, more reliable and more resilient. But now Cisco\u0026rsquo;s new OS called IOS XR is also modular SW, I think the playing field has leveled. Cisco is a big power house in networking which commands more than 60% market share in most of industries it has penetrated, and Juniper might forever remain as the number 2, niche player in the market (Crossing the Chasm).\nAnyhow, when I look at new innovation or innovative companies popping up, it\u0026rsquo;s not in L1 to L4 of OSI layer. It\u0026rsquo;s usually in higher level. Look at all web 2.0, social networking and SaaS (software as a service) companies taking the market by storm. Some say it\u0026rsquo;s bubble 2.0, but this time I think everyone including investors is careful about business models and revenue history/projection. Also, anything related with proprietary hardware like building ASICs takes too long and too much capital. Building software takes much less time and capital, and there are literally thousands ways to implement a feature, so it\u0026rsquo;s really up to how well the software is structured for performance as well as scalability that would make a huge difference.\nIt also brings an interesting point, too. If you look at technology advancements in the last 100 years and last 20 years, the rate of advancement in last 20 years is very high. If this rate would continue, it\u0026rsquo;s mind boggling to imagine what the next 10, 20 years will bring. That\u0026rsquo;s also why benefits of proprietary and custom hardware such as ASIC or company like SUN might be in the big trouble. The system built with off-shelf components may run as fast and reliably as custom hardware. Again, the value will be on software. How well it is designed and written will make all the difference.\nI have two kids of my own, and I don\u0026rsquo;t know if I would want them to become engineers like me\u0026hellip;, but if they want to, I would definitely ask them to go into software industry, not hardware. I suppose hindsight is always 20/20. Life\u0026rsquo;s most valuable experiences are learned from mistakes.\n","date":"5 July 2007","externalUrl":null,"permalink":"/2007/07/04/software-is-the-king/","section":"Posts","summary":"","title":"Software is the king","type":"posts"},{"content":"So, I have been interviewing at a bunch of places so far, but no offer yet. As I am faced with a rejection after rejection, it\u0026rsquo;s hard to not to be discouraged. So far in my career, I\u0026rsquo;ve never had this much problem finding a job, and it\u0026rsquo;s both shocking and depressing.\nI can attribute this situation to one thing: Stuck in the middle. I am still in the career transition from engineering field to product marketing, and companies assess that two-years of experience in marketing is TOO LITTLE and two-years away from hands-on technical work is TOO LONG. Those companies I have applied for product marketing position selected a candidate with a lot more marketing experiences. Those companies I have applied for technical positions thought I wasn\u0026rsquo;t technical enough. It would seem difficult to find a marketing position unless I have someone who can sponsor/champion me in a company.\nObviously, this is the lowest point of my life. And in times like this, you come to know who is really your friend and who is not. Well, mostly. I think some actually pretend or give you a lip service, but don\u0026rsquo;t really care. I\u0026rsquo;ve spent two years in Korea to transition my career, and if I don\u0026rsquo;t continue down this marketing path, those two years would seem like a total waste. I have been given a lot of advice from good people. They tell me I will definitely find something I want soon and something good is waiting for me just around the corner. I should stay positive and confident. It\u0026rsquo;s just matter of timing. All those interviews that didn\u0026rsquo;t work weren\u0026rsquo;t meant for me. They are all good and I am grateful for them, but\u0026hellip;.\nBut, I can\u0026rsquo;t help but feeling that walls are closing in. I see kids grow up and they need certain things like new clothes, camps, school, etc. Savings depleting too quickly\u0026hellip;. Also, I hate being not settled down. Without a job, it feels like everything is up in the air. Tension is there, and so are silent worries. Everyone is on the edge, and it doesn\u0026rsquo;t help current situation much.\nI don\u0026rsquo;t really want to stay in the East Coast, but I may need to stay here. But, if I didn\u0026rsquo;t want to stay in the East Coast but get an offer here, it can\u0026rsquo;t be why all other interviews didn\u0026rsquo;t work out\u0026hellip;. I used to believe that I am in control of my own destiny and I didn\u0026rsquo;t believe in fate\u0026hellip;., but I don\u0026rsquo;t know. I am so sure now. Maybe I have a little control over my destiny, and for some reason it\u0026rsquo;s been all mapped out for me\u0026hellip;..\n","date":"30 June 2007","externalUrl":null,"permalink":"/2007/06/29/in-transition-stuck-in-the-middle/","section":"Posts","summary":"","title":"In transition, stuck in the middle","type":"posts"},{"content":"I hear that Virginia Tech gunman Cho Seung-Hui was picked on at middle and high school\u0026hellip;.for his shyness and perhaps accent. While high school is probably most miserable time for everyone\u0026hellip;well for most except jocks and popular kids, it was probably his mental state that made everything worse. Watching his video tapes and pictures, I couldn\u0026rsquo;t help get feeling that he was really disturbed, troubled and just mentally ill.\nI came to US when I was 16, starting high school as a sophomore. I tend to place high expectation on myself, and it was another case of it. I should have started as a freshman, but with enough credits brought from Korea, I wanted to graduate in three years. Geez, what a mistake. I mean I knew how to read and write English, but not as close to speaking or understanding spoken English. Not only that I had to adjust to new culture and new ways of life. I ended up staying extra year as senior to ready myself for college, and it was a good thing since I went to an Ivy League school. It is actually interesting that my first choice was Virginia Tech and visited the school in cold, cold winter of 1992. Anyhow, high school was pretty tough for me, too\u0026hellip;. A few kids picked on me, but I didn\u0026rsquo;t think much of it, really. Come to think of it, I don\u0026rsquo;t remember most of my high school life\u0026hellip;.\nCollege was much better, in terms of student\u0026rsquo;s tolerance. Most kids were acceptive of others and different things or culture. I\u0026rsquo;ve hung out mostly with Asian Americans, most of them 1.5, 2nd or higher generation kids\u0026hellip;. Most of them were going through identity crisis. They were immersed in US culture and everything about them except looks says they are Americans (mostly Caucasians). I identified with them. My parents are very Korean, and I sometimes feel invisible wall between them and me. I love them, but since they moved to America in their 40\u0026rsquo;s, they cannot change their way of lives. Funny thing is that even though I thought they were really Korean, when they visited Korea, they found themselves counting days to come back to US\u0026hellip;. They themselves had become 1.5 generation without knowing!\nWhen someone asks me, I always answer Korean American or Korean descendant. I have characteristics of both culture, and that\u0026rsquo;s who I am. I cannot be completely Korean nor completely American. Unknowingly, my parents also had become Korean American, too.\n","date":"20 April 2007","externalUrl":null,"permalink":"/2007/04/19/identity-crisis/","section":"Posts","summary":"","title":"Identity Crisis","type":"posts"},{"content":"There are two books that had great impact on my professional life. One is Geoffrey Moore\u0026rsquo;s Crossing the Chasm and the other is Clayton Christensen\u0026rsquo;s Innovator\u0026rsquo;s Dilemma. The latter book had higher effect because of its radical theory that most companies fail because it does what it is supposed to do\u0026hellip;and do well. Most people who are in high-tech marketing know these books and all the marketing principles and rules.\nIt\u0026rsquo;s interesting, though, that none of these authors are successful entrepreneurs. It shows that it\u0026rsquo;s one thing to know and another thing to do it (and do it well).\n","date":"20 April 2007","externalUrl":null,"permalink":"/2007/04/19/scholar-and-entreprenuer/","section":"Posts","summary":"","title":"Scholar and Entreprenuer","type":"posts"},{"content":"For a little while I was trying to raise fund for my company, which turned out to be fruitless. While I did that, I found out some interesting articles and online resources, and I wanted to share them with you. I do have my own del.cio.us bookmarks, but I figured it\u0026rsquo;s better to place them all here with some explanation\u0026hellip;.\nWhen It Comes to Innovation, Geography Is Destiny\nWhy location is everything when it comes to innovation\u0026hellip;\u0026hellip;Pssst\u0026hellip;\u0026hellip;the place is in the West Coast and where Fairchild Semiconductor seeded everything\u0026hellip;.\nThe 18 Mistakes that Kill Startups\nI didn\u0026rsquo;t know who Paul Graham was until I found this essay by him\u0026hellip;. My company had #1 and #2 mistakes he listed. Not that his list is like a golden rule, but his reasoning made sense.\nHow to be Silicon Valley\nThis was a very interesting read. I liked Silicon Valley for other reasons like being close to ocean, mountains, Lake Tahoe, Santa Cruz, Monterey Bay, Half Moon Bay, San Francisco, Napa/Sonama Valley, etc\u0026hellip; I wondered the same about that\u0026hellip;. Like NY Times article mentioned, there were many domestic and international cities that tried to be the next Silicon Valley, but look where most high-tech innovations happen! There is no doubt there is something different about Silicon Valley, and I didn\u0026rsquo;t see better reasons why than Paul Graham\u0026rsquo;s\u0026hellip;\nPaul Graham\u0026rsquo;s website and his essays\nActually, you should go ahead and check out his website\u0026hellip;..as well as his essays.\nBuildv1 - Connecting entrepreneurs\nThis is a really cool, under-utilized site for all aspiring entrepreneurs. It\u0026rsquo;s like a classifieds for entrepreneurs. You can post your latest project and ask for help, or you have certain skills for startups, you can post them to hook up with an entrepreneur. I\u0026rsquo;ve used it and received many interests\u0026hellip;\u0026hellip; Whether you can find someone you can trust and work well together is whole another thing.\nArt of the Start by Guy Kawasaki\nI really enjoyed this book. While Guy Kawasaki looks like a sell-out and doesn\u0026rsquo;t have mega successful company under his belt, this book is a must for all high-tech entrepreneurs. It\u0026rsquo;s no-non-sense guide to entrepreneurs about how to build a team, raise a fund, etc. I really liked the book, because he said an entrepreneur should start building a product/service and delivering it instead of writing a business plan or pitching to investors. And that product or service had better bring in revenue as quickly as possible. Totally right. For startups, cash is king, and without cash, it will die. Faster revenue, the better. And unless you are Steve Jobs, still live in late 1990\u0026rsquo;s or have a rich, generous uncle, no VC will fund your company based on just a business plan, however spectacular it is. VCs bet on jockeys, not on horse. And, good idea will fail if not executed correctly while bad idea can survive with excellent execution and probably some modification on the way.\nAsk the VC\nThis blog is founded by two venture capitalists, Brad Feld and Jason Mendelson at Mobius Venture Capital. What\u0026rsquo;s cool about the blog site is that they actually do answer your emails!\nVentureBeat\nThis is an excellent site if you want to be plugged into news about (mostly) Silicon Valley startup. It most deals with who\u0026rsquo;s gotten funded and how much\u0026hellip;, but sometimes it has juicy stories about startups in general.\nRent-A-Coder and eLance\nIf you are looking to outsource, rent-a-coder and elance are probably two major \u0026ldquo;brokering\u0026rdquo; sites. It\u0026rsquo;s free for a user to post his/her project, and outsource companies (mostly offshore, but some domestic) bid for the project. I\u0026rsquo;ve used the rent-a-coder but didn\u0026rsquo;t use a company through there because I\u0026rsquo;ve had a company that was personally referred to me.\nFundingUniverse, Go Big Network, The Angel Journal\nI can\u0026rsquo;t personally vouch for these websites, since I wasn\u0026rsquo;t successful in securing funds using them. But, who knows? Some entrepreneur may have better luck with them.\n","date":"28 March 2007","externalUrl":null,"permalink":"/2007/03/27/online-resources-for-high-tech-entrepreneurs/","section":"Posts","summary":"","title":"Online resources for high-tech entrepreneurs","type":"posts"},{"content":"In my quest for a full-time job, I submitted numerous resumes to Google. I also had a friend of mine working at Google to forward my resume for me. Since Google is in completely different industry than my background/experience, it was a long shot. I did web search on Google interview, and most were for technical questions. I didn\u0026rsquo;t find any for non-technical interview.\nWhy Google? Not only it is the hottest company, but Google is in best position to challenge many old business models. Is Google an ad company? Perhaps\u0026hellip; 99% of its revenue is from ads placed in Google sites. Google is also trying to expand ad channels into radio, TV and games. However, I think its technology can be used to really revolutionize computing. I am not a big fan of Microsoft or its monstrous operating system or its bully tactics on competitors. Linux and general Unix flavors are all stable because their kernels are small, efficient and do whatever they are supposed to do well. Microsoft\u0026rsquo;s operating systems are kernel plus too much junk. Anyhow, it won\u0026rsquo;t be long until we have pervasive connection to the network and an efficient computing device with solid-state storage, small OS and a web browser. Most applications would be available online, as many so-called \u0026ldquo;software-as-a-service\u0026rdquo; promises. Key is to have applications available offline as well, and it would be just a matter of time until it is possible.\nAnyhow, back to my story\u0026hellip; I did get a phone interview scheduled. It was supposed to be about 45-minutes long. Since it was for a product marketing position, I did a lot of research behind Google products and their business model. But, the interviewer completely threw me off with unexpected questions such as how Internet would change in five years or how search would change in five years. I never recovered from them and I totally bombed the interview. As expected, I got a \u0026ldquo;Thank you, but no thank you\u0026rdquo; letter soon.\nI was disappointed, but not so terribly, since I was rejected in the first interview. Then strangely enough, I\u0026rsquo;ve received another \u0026ldquo;first phone interview\u0026rdquo; email from the same Google recruiter who had sent me the very first phone interview request. I was pretty sure it was a mistake and sooner or later they will find out. I pretended as if I never had a Google phone interview and replied the email. Surprisingly, I had another \u0026ldquo;first\u0026rdquo; phone interview scheduled. This time, it was with different interviewer and I did alright\u0026hellip;.perhaps because this interviewer asked different and perhaps more relevant questions.\nSince I would be in the SF bay area for a personal reason the following week, I asked whether they could arrange an on-site interview. From what I have heard, Google interview takes long and I honestly didn\u0026rsquo;t expect them to arrange it so quickly. They did, and I came in for an interview. Interview schedule was long, from 11 AM to 4:30 PM, talking to 6 or 8 different folks. I saw on the schedule that one of the interviewers was going to be the person who interviewed in the very first phone interview\u0026hellip;\u0026hellip;.and gave a thumbs down. Most of interviewers asked a little about my experience and a lot of hypothetical questions\u0026hellip;.like if I were a product marketing manager of this product, what your marketing plan would look like, how would you make it better, etc. They also dig deeper based on your response\u0026hellip;.like computerized GMAT questions. I don\u0026rsquo;t know if you could really prepare for such interviews\u0026hellip;. You have to think so quickly on the feet. It could come from mostly your relevant experiences\u0026hellip;..and background\u0026hellip;..and knowing what works and what doesn\u0026rsquo;t, etc\u0026hellip; Of course, the first phone interviewer\u0026hellip;.who I wasn\u0026rsquo;t sure would recognize me or not. But s/he asked the same questions\u0026hellip;. It could be that s/he didn\u0026rsquo;t recognize me or that s/he wanted to see if I prepared for him/her. I don\u0026rsquo;t know if it was the pressure to win this person over, I did the worst with this interviewer.\nOverall, I enjoyed the challenging conversations\u0026hellip; They were fair and seemed like questions they all have to answer day in and day out. It would have been fun and rewarding to work for Google. In retrospect, though, I think I should have been more forthcoming with what I have been doing since my last job. I just told them I enjoyed spending time with my family. I didn\u0026rsquo;t mention anything about my own business venture\u0026hellip;\u0026hellip;, but I was afraid that I could be seen as a quitter, a failure, or someone who would quit anytime to pursue other ventures\u0026hellip;. Oh, well\u0026hellip;. Hindsight is always 20/20\u0026hellip;.., but who knows what really caused the rejection? Perhaps it was to do with all my answers.\nThe next week, I got a form \u0026ldquo;Thank you, but no thank you\u0026rdquo; email\u0026hellip;..once again. This 2nd chance came out of nowhere and I was so lucky to get an on-site interview scheduled so quickly, but I couldn\u0026rsquo;t capitalize it. I am so depressed about it. But, no time to waste. I need to find a job quickly.\nOff I go!\n","date":"24 March 2007","externalUrl":null,"permalink":"/2007/03/23/google-interview/","section":"Posts","summary":"","title":"Google Interview","type":"posts"},{"content":"I worked in overseas last couple of years. The experience was strange. I worked in my mother country, but it made it worse for me. If I have an advice for any Asian American thinking about going back to his/her mother country and working there, I would strongly discourage it\u0026hellip;. Reason? That\u0026rsquo;s for another post.\nWhile I was preparing to come back, I had an idea for a social networking company and decided to go for it. Social networking market has so many possibilities for niche markets, and combined with my recent experience, I would have a shot at it. With some but not a lot of money saved, I wanted to release a beta version if two months. That was about six months ago. Now, I have given up on the quest. Why? There are several reasons.\n1. No co-founder\nIn the beginning, there was sort of a co-founder. I established good relationship with this guy who worked at the largest software company and had entrepreneurial mind. When I pitched my idea, he liked it and wanted to be in the game. Plan was that he would take care of all the technical stuff, while I do non-technical stuff. Working at a software company and being a software engineer before, I though he would be perfect for the job. Only problem was that he had his family and couldn\u0026rsquo;t leave his full-time job until something solid (early funding) happens. As time went on, it was obvious that he could not put as much as time he had hoped into the new venture. He had a full-time job and family. I had a family, too, but I was committed 100% to the venture. So, about a couple of months into it, he pulled out.\nI don\u0026rsquo;t blame him, though. As a father and a husband, I know it\u0026rsquo;s tough thing not to be able to support the family. I could have stopped then, but I wanted to keep going. I didn\u0026rsquo;t want to give up too easily. So, I decided to use an offshore company and contract the website development out. I found a company, actually, through ex-co-founder. While I was discussing terms with them and looking for a lawyer, I also looked for another co-founder. But it proved to be much difficult.\nNot only that I had to sell my idea (but I was pretty used to it by then), I had to make sure there was compatibility. When running a start-up, things would get tough at times, and I needed to make sure that things would work out. Also, I didn\u0026rsquo;t have any money to pay\u0026hellip;.except equity of the company. How do I determine what percentage is appropriate to a total stranger with no prior working relationship? Indeed, when I looked at many companies, they were all started by ex-colleagues or school friends. With no proven chemistry, it would have been tough to trust any stranger. Another thing I found out was that many entrepreneurs or to-be-entrepreneurs had their own ideas to pursue. Instead of pitching my idea, I found myself being pitched to several times.\n2. No relevant experience/No track record/No stellar management team\nThis is pretty obvious, but when I approached investors with my idea, they all gave me the same answer. This also proves that they never say no! They told me that they liked the idea and target market, but with no relevant experience (my background is in data networking, not consumer website), track record nor A-team management team, they could invest in me and my idea. Since a good idea will fail in the market with poor execution, they were absolutely right. However, with all their contacts, if they really thought it was a good idea, they probably found a way to invest\u0026hellip;. They also told me that if I could build the website and show early success, they could talk about funding seriously. It led me to use my funds to build a beta website.\n3. Inadequate funding\nWithout cash, a startup will die. I had only small bit of savings, and I had to use it to run the company, pay for website development and support family at the same time. My financial resources were depleting fast. So, I picked pitching to investor route first. When it didn\u0026rsquo;t go anywhere and with no co-founder, I picked offshore development route. But, it was too late. I needed to bring in income soon. If I had won the lottery or had inherited large sum or had ultra rich and generous uncle, it would have been a different story.\n4. Family\nFamily also put a lot of pressure on me. Kids are too young to understand and my wife supported me 100%, but it was always me. I felt like an inadequate father and husband. Things we had to cut back and things we had to forgo\u0026hellip;. While I was pursuing my dream full-time, that constant stream of income called \u0026ldquo;paycheck\u0026rdquo; was really tempting at many occasions\u0026hellip;.\n5. Keeping energy and optimistic level high\nThere are so many obstacles one faces when starting a company that I almost think it\u0026rsquo;s a race of who can last longest, and to last longest you have to keep energy and optimistic level high all the time. A little bit of doubt will slowly eat you away. I guess that\u0026rsquo;s why it\u0026rsquo;s important to have mentors and perhaps multiple co-founders, who can give you a pep-talk whenever you are down\u0026hellip;.\nSo, I\u0026rsquo;ve started looking for a full-time job this month and have had several phone interviews and a few on-site interviews. My next post would be about one of those on-site interviews.\n","date":"23 March 2007","externalUrl":null,"permalink":"/2007/03/22/starting-a-company-is-hard/","section":"Posts","summary":"","title":"Starting a company is hard....","type":"posts"},{"content":"Hi!\nI don\u0026rsquo;t know why you want to read my story, but I felt a need to chronicle my journey somewhere\u0026hellip;albeit anonymously, and this day and age Internet would be a good place.\nWho am I? Let\u0026rsquo;s see what words can describe me\u0026hellip;.\nMan, in the 30\u0026rsquo;s, married, tall, two kids, wife, Asian American, 1.5 generation, aspiring entrepreneur, used to be an engineer, now trying to be product marketing professional, wears glasses (which asian americans don\u0026rsquo;t?), wants/likes something different, independent/foreign films, athletic (or I think I am), etc.\nThat should basically describe me\u0026hellip;\n","date":"23 March 2007","externalUrl":null,"permalink":"/2007/03/22/who-am-i/","section":"Posts","summary":"","title":"Who am I?","type":"posts"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}]