<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Entrepreneur. Inventor. Dreamer. Coder.aka: Bootstrap Harry</description><title>Harry's Log</title><generator>Tumblr (3.0; @harrywye)</generator><link>http://blog.harrywye.com/</link><item><title>Running Java Jersey with JDO 3.0 on Google App Engine</title><description>&lt;p&gt;Why such a horrendous title?&lt;/p&gt;
&lt;p&gt;Ha! The title I was gonna use originally was sort of a &amp;#8220;spoiler&amp;#8221; that gave away &lt;em&gt;endings&lt;/em&gt;. :) So, there you go.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been struggling with JDO 3.0 upgrade for some time. I use Google App Engine as a main platform for most of my (Web application) development. It is PaaS, and it provides lots of benefits in terms of significant reduction in the overall development and operations cost. (Just to be clear, the &amp;#8220;hardware&amp;#8221; cost of PaaS is generally comparable to that of IaaS such as Amazon Web Services or RackSpace, etc. The real cost saving comes from the &amp;#8220;ops&amp;#8221;, pat in my view.) This cost reduction comes at a price, however. Google App Engine (GAE) is a platform currently being developed (with new features being added constantly), and on the flipside, there are currently a lot of limitations. If GAE does not provide certain functionality (which you could have relatively easily accomplished if you had a full control over the platform), then in many cases, you have to live with it. There may be a workaround. Then again, there may not be. For example, you cannot create a thread on GAE, and if you are a Java programmer, you&amp;#8217;ll realize that this is really a fundamental limitation. You cannot access file system, which will be another big surprise if you are using GAE for the first time.&lt;/p&gt;
&lt;p&gt;Google App Engine now supports SQL-based database. But, when I started using GAE a couple of years ago, the only choice I had was Google&amp;#8217;s proprietary data storage called, aptly, Data Store (or, Big Table, which is the underlying technology of Data Store). Google Data Store is a No-SQL database. There is some learning curve. I use JDO interface on top of Data Store, which provides at least two benefits for me. The first is portability. If we have to move/migrate the data into SQL based database in the future, using an abstraction layer such as JDO API instead of using the low level Data Store API directly has a big benefit. The second reason is JDO nicely maps to the object layer (whereas JPA, for instance, is closer to SQL-based RDBM), which is a big plus for me. Google Data Store is an object-oriented database (unlike table-based RDBM). In theory, at least conceptually, you can map a Java object to the database entity very easily. There is no need for ORM, etc. (BTW, in case you are not familiar with Google Data Store, it does not allow joins. What?, you might ask. Yes. No joins! This, which some might consider a deal breaker, is more than compensated by this object-orientedness, at least for me.)&lt;/p&gt;
&lt;p&gt;In any case, I had been using JDO API for some time, whose version was 2.0, on Google App Engine. As I mentioned, these are all &amp;#8220;under-construction&amp;#8221; type of technologies. GAE supports certain features of JDO, and it does not, and cannot, support certain other features. Some are due to the limitations of the underlying technology (e.g., no joins!). The newest version of JDO is 3.0. One feature I was looking forward to in JDO 3.0 was &lt;a href="https://developers.google.com/appengine/docs/java/datastore/jdo/relationships"&gt;&amp;#8220;unowned one-to-many relationship&amp;#8221;&lt;/a&gt;. Although I said GAE Data Store was OO-based, due to so many limitations, the benefit was very limited. This &amp;#8220;unowned one-to-many relationship&amp;#8221; could potentially open up so many possibilities for me.&lt;/p&gt;
&lt;p&gt;The GAE DataNucleus enhancer/plugin for JDO 3.0 has been around for a few months as &amp;#8220;beta&amp;#8221;. I tried it a few times, and I just couldn&amp;#8217;t make it work on my development environment. I thought, maybe because it was beta? I was getting so many different kinds of errors, which I wasn&amp;#8217;t willing to spend time debugging.&lt;/p&gt;
&lt;p&gt;A few days ago, the new version of GAE SDK, version 1.7.1, was released, which included JDO 3.0 support, among other things. The first thing I did when I installed the new SDK was trying out the JDO 3.0 features. Here&amp;#8217;s the doc: &lt;a href="https://developers.google.com/appengine/docs/java/datastore/jdo/overview-dn2"&gt;&lt;a href="https://developers.google.com/appengine/docs/java/datastore/jdo/overview-dn2"&gt;https://developers.google.com/appengine/docs/java/datastore/jdo/overview-dn2&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The doc is somewhat outdated (as of this writing). I spent much time trying to debug &lt;a href="https://developers.google.com/appengine/docs/java/tools/ant#Enhancing_JDO_Classes"&gt;the ant task&lt;/a&gt; and &lt;a href="http://www.datanucleus.org/products/accessplatform/enhancer.html"&gt;Datanucleus enhancer tools&lt;/a&gt; using various docs, but I just couldn&amp;#8217;t make it work. As it turned out, the GAE Eclipse plugin already had JDO3 support (as of today, at least). So, this was cool. After resolving some issues, I was finally getting ready to try out JDO 3.0, only to get stuck with one last problem. This one appeared to be &amp;#8220;un-solvable&amp;#8221;.&lt;/p&gt;
&lt;p&gt;The DataNucleus library (which implements JDO, etc.) uses an external library called ASM. In case you are not familiar with this, it is a Java bytecode manipulation tool. It is often used, among other things, to support &amp;#8220;annotations&amp;#8221; in Java code to do post-compilation tasks. The new DataNucleus plugin relies on asm version 4.0. The problem was, I was using Java Jersey library for JAX-RS, and the current version of Jersey relies on asm version 3.1. ASM does not provide backward compatibility. These two versions of asm were in conflict, and there appeared to be no way to resolve this. Note that asm is a very &amp;#8220;low level&amp;#8221; library, which is needed both at compile time and run time. I cannot deploy only one because neither JDO3.0 nor Jersey can be used with a different version of asm which it was originally compiled against. Clearly, building these libraries from source (with a lot of dependencies on their own) was out of the question, even utilizing Maven, etc. Deploying both versions of asm at the same time would not work either unless you could implement some custom class loader which intelligently picks the &amp;#8220;proper&amp;#8221; version of asm depending on context. Again, I couldn&amp;#8217;t come up with a solution that can solve this jar version conflict problem.&lt;/p&gt;
&lt;p&gt;I was totally stuck!&lt;/p&gt;
&lt;p&gt;I spent many hours googling. Often it is hard to figure out what you are looking for, until you know what you are looking for. It seemed hopeless. But, I inched ahead, and finally found a solution! (Well, you call it a workaround. I call it a solution. :)) BTW, version conflict is a fact of life in software development (until we have a &amp;#8220;real&amp;#8221; solution). There was an expression like &amp;#8220;DLL Hell&amp;#8221; in old times. Android now insists that we cannot use shared libraries at all (which I think is like throwing a baby with the bathwater, however), as a &amp;#8220;solution&amp;#8221; to this problem. Unfortunately, this is the way it is (at least, for now). In many cases, (good) developers tend to be conscious of backward compatibility (and, even &amp;#8220;forward compatibility&amp;#8221;, if you know what I mean), and minor version differences do not cause major problems in general. The problem with ASM is that its incompatibility appears to be intentional, for whatever reason. Java bycode format changes from time to time (every so slightly). A particular version of ASM works with a particular format and no others. That is it. The libraries complied against a particular version of asm are not compatible with the libraries built with a different version of asm, due to this artificial dichotomy, although in practice the bytecode format difference is so minor that the chances of ending up with different bytecodes for any particular class or library are very small. (BTW, all newer versions of &amp;#8220;java&amp;#8221; can read and run all Java bytecodes in any then-current or older formats. That&amp;#8217;s how we are &lt;em&gt;supposed&lt;/em&gt; to write software. BACKWARD-COMPATIBLE! Or, you are supposed to use some internal versioning scheme, etc. Merely using different file names, such as asm-3.1 vs asm-4.0, without real versioning/compatibility considerations is really an anti-pattern.)&lt;/p&gt;
&lt;p&gt;Anyways, did I say I found a solution?&lt;/p&gt;
&lt;p&gt;Yes!&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s called &amp;#8220;JarJar&amp;#8221;. You can rebuild an existing jar file with different source package or class names. &lt;a href="http://code.google.com/p/jarjar/"&gt;This is an amazing tool&lt;/a&gt;, which I wasn&amp;#8217;t aware of until today. (Search for &amp;#8220;Java repackaging&amp;#8221;, etc.) So, here&amp;#8217;s the solution. Rename the asm package name in one library (with one asm version) so that they are no longer in conflict with another library with a different version of asm. I chose to repackage Jersey. As it turns out, only one jar file in the Jersey distribution has a dependency on asm.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;java -jar jarjar-1.3.jar find class jersey-server-1.12.jar asm-3.1.jar&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;.../AnnotationScannerListener$AnnotatedClassVisitor -&amp;gt; org/objectweb/asm/ClassVisitor
.../AnnotationScannerListener$AnnotatedClassVisitor -&amp;gt; org/objectweb/asm/AnnotationVisitor
.../AnnotationScannerListener$AnnotatedClassVisitor -&amp;gt; org/objectweb/asm/FieldVisitor
.../AnnotationScannerListener$AnnotatedClassVisitor -&amp;gt; org/objectweb/asm/Attribute
.../AnnotationScannerListener$AnnotatedClassVisitor -&amp;gt; org/objectweb/asm/MethodVisitor
&lt;/pre&gt;
&lt;pre&gt;.&lt;/pre&gt;
&lt;p&gt;So, here&amp;#8217;s what I did:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;java -jar jarjar-1.3.jar process testrules.txt asm-3.1.jar asm-3.1r.jar&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;java -jar jarjar-1.3.jar process testrules.txt jersey-server-1.12.jar jersey-server-1.12r.jar&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;where the testrules file include this one line:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;rule org.objectweb.asm.**  org.objectweb.asm3.@1&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s it.&lt;/p&gt;
&lt;p&gt;I deployed the repacked Jersey jar files including the modified asm-3.1 along with asm-4.0 and JDO DataNucleus library to Google App Engine, and Voila! Now I have an app that can support &amp;#8220;unowned one-to-many relationships&amp;#8221;! Tested and verified!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Y-E-S!!!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So, the original title I was thinking of using for this post was&lt;/p&gt;
&lt;p&gt;&amp;#8220;Jar Jar (Binks) to the Rescue!&amp;#8221;&lt;/p&gt;
&lt;p&gt;(Corny? Yes. :) BTW, JarJar uses/depends on ASM, Ironic? Yes. :))&lt;/p&gt;</description><link>http://blog.harrywye.com/post/30160964741</link><guid>http://blog.harrywye.com/post/30160964741</guid><pubDate>Sat, 25 Aug 2012 01:16:00 -0700</pubDate></item><item><title>Answer: When Will My Cron Job Run Next?</title><description>&lt;p&gt;This is a solution to the problem I posted yesterday: &lt;a href="http://blog.harrywye.com/post/29852410082/question-when-will-my-cron-job-run-next"&gt;Question: When Will My Cron Job Run Next?&lt;/a&gt; As a quick reminder, the question was:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Given a cron expression and a point in time (e.g., &amp;#8220;now&amp;#8221;), how to calculate the earliest time when the job is scheduled to run after the given time?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So, here&amp;#8217;s MY solution:&lt;/p&gt;
&lt;p&gt;First, parse the cron expression and generate a series of scheduled times. (Note that due to the periodic nature of time, e.g., hours run from 0 to 23 and back to 0, etc., all these values are &amp;#8220;bounded&amp;#8221;. The only exception is years, but you can either use an arbitrary maximum value, or the value specified by cron spec, which is 2099.) I won&amp;#8217;t go into details as to what kind of data structures are preferred, etc. In my program, I use essentially an array of arrays/lists, the first array being indexed by each of the components, minutes, hours, days, months, and years (we will ignore the days of week, for now, and come back to this issue later), and the child arrays/lists including ALL valid values for the given time components. These values need to be &amp;#8220;chronologically sorted&amp;#8221;. (In my implementation, I use Java NavigableSet for the child/element collections instead of an array or a list.) &lt;/p&gt;
&lt;p&gt;Now, finding the &amp;#8220;next&amp;#8221; scheduled time after a given reference time is an iterative process, top down, and bottom up. From the top-most layer (that is, &amp;#8220;years&amp;#8221;) we will go through all years which are the same as or bigger than the year of the reference time. Note that this is the only assumption we can make by only looking at the year field. The year of the &amp;#8220;next scheduled time&amp;#8221; will be the same as, or bigger than, the year of the reference time. We will have to iterate over all these possible years to find the correct &amp;#8220;next time&amp;#8221;. So, it defines the outer most loop.&lt;/p&gt;
&lt;p&gt;Then, for the given year (the loop variable), go through all months. If the loop var year is the same as the year of the reference time, then the month starts from the month of the reference time. If the year is bigger than the reference year, then the month runs through all possible values defined by the cron expression. This defines the next level loop.&lt;/p&gt;
&lt;p&gt;As you can see, you can go down all the way to minutes this way (again, excluding the days of week), creating an additional inner loop at each level.&lt;/p&gt;
&lt;p&gt;Once you reach the lower-most minutes level, then find the minute, from the set of valid minute values as parsed from the cron expression, which is bigger than the minute of the reference time. (If the second of the reference time is 0, you may want to include the equality sign as well.) If one is found, then you can &amp;#8220;read&amp;#8221; the next scheduled time by collecting all loop variables (minutes, hours, days, months, and years) and creating a time. If none is found, go one level up (e.g., hours) and increment the hour, and repeat the lower level loop (e.g., minutes). As you can imagine, in theory, you may have to traverse the loops in multiple levels. In practice, the iteration shouldn&amp;#8217;t be too long (except for pathological cases).&lt;/p&gt;
&lt;p&gt;As for the days of weeks (for this, the data structure Set rather than List is more convenient), I use it as a filter. Instead of creating another layer, I use this as a filter at the &amp;#8220;day&amp;#8221; level. If the day loop var (and, based on the upper layer, month and year vars) is an invalid days of week, then I just skip that day. (You will also have to make sure the three number combination, year, month, and day is a valid date. If not, just skip it.)&lt;/p&gt;
&lt;p&gt;OK. This was hard. :) Explaining an algorithm in English (without using a flowchart, or code) is a hard task. Hope you got the gist of the algorithm I came up with (which I hope is not too different from the &amp;#8220;standard&amp;#8221; algorithm, if such a thing exists). Please let me know if you know of a better/more efficient algorithm, or even a &amp;#8220;closed form&amp;#8221; solution.&lt;/p&gt;
&lt;p&gt;PS: Here&amp;#8217;s an exemplary implementation: CronExpressionParser.java (Not fully tested as of this writing. Use it at your own risk! :)) &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.scribblememo.com/2012/08/21/1813/cronexpressionparser-java-259"&gt;&lt;a href="http://www.scribblememo.com/2012/08/21/1813/cronexpressionparser-java-259"&gt;http://www.scribblememo.com/2012/08/21/1813/cronexpressionparser-java-259&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Happy coding!&lt;/p&gt;</description><link>http://blog.harrywye.com/post/29890981307</link><guid>http://blog.harrywye.com/post/29890981307</guid><pubDate>Tue, 21 Aug 2012 03:26:00 -0700</pubDate></item><item><title>Question: When Will My Cron Job Run Next?</title><description>&lt;p&gt;Cron is a generic term for a task scheduler. It was originated from Unix, and more often than not the term cron specifically refers to a process running on Unix-like systems that triggers execution of jobs at specified times. The interesting thing about cron is that it allows specification of run times through a well-defined syntax (in crontab). For example, see &lt;a href="http://en.wikipedia.org/wiki/Cron"&gt;&lt;a href="http://en.wikipedia.org/wiki/Cron"&gt;http://en.wikipedia.org/wiki/Cron&lt;/a&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A cron expression (e.g., a line in a crontab) comprises 5 or 6 components separated by spaces. Each component has to do with specifying run times at a different &amp;#8220;time resolution&amp;#8221; or &amp;#8220;time scale&amp;#8221;. That is, the sequence of numbers/symbols specifies minutes, hours, days of month, months, days of week, and optionally years. Either you can specify a particular set of numbers (comma-separated, or using the &amp;#8220;range&amp;#8221; notation, etc.) for each component, or you can just use a wildcard symbol (&amp;#8220;*&amp;#8221;) to indicate all allowed values for a particular component. For example, * in the minutes field specifies the range from 0 to 59-th minute (of the hour). It is very flexible (to a certain degree) although it has somewhat limited expressive power. For example, due to the &amp;#8220;multiplicative&amp;#8221; nature of the syntax, you cannot specify job schedules like &amp;#8220;at 3 and 5PM on Weekdays and at 2PM on Saturdays and Sundays&amp;#8221;, etc. (But, you can use multiple expressions/lines to specify such schedules in a crontab.)&lt;/p&gt;
&lt;p&gt;Anyways, I was building a web service, and it required some form of job scheduler. More specifically, I needed some kind of language/format that could be used to specify scheduling (e.g, as an input to a system). So, I thought, Why reinvent the wheel. Let&amp;#8217;s just use the cron syntax.&lt;/p&gt;
&lt;p&gt;It turns out it was a non-trivial task. Although cron has been around for decades (from the very early days of Unix), and I&amp;#8217;ve been using cron for different tasks over the years, I&amp;#8217;ve never given much thought on how to implement this.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a simple question:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8220;Given a cron expression and a point in time (e.g., &amp;#8220;now&amp;#8221;), how to calculate the earliest time when the job is scheduled to run after the given time?&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It took me a day to &amp;#8220;understand&amp;#8221; the problem (cron syntax and what not), and it took me another full day to implement a solution to this problem, in Java.&lt;/p&gt;
&lt;p&gt;OK, if you are interested in puzzles like this, give it a try. Your answer/algorithm to this question will depend on how you &amp;#8220;parse&amp;#8221; the cron expression. I couldn&amp;#8217;t come up with a closed form solution, but only an iterative algorithm. (No cheating! :) There might be an open-source solution on the Net (and, I&amp;#8217;m sure there are many considering that cron has been around for so many years and cron is used in so many places (like Linux)). I haven&amp;#8217;t really searched for it, though.)&lt;/p&gt;
&lt;p&gt;Good luck! ;)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS: I just posted a solution: &lt;a href="http://blog.harrywye.com/post/29890981307/answer-when-will-my-cron-job-run-next"&gt;&lt;a href="http://blog.harrywye.com/post/29890981307/answer-when-will-my-cron-job-run-next"&gt;http://blog.harrywye.com/post/29890981307/answer-when-will-my-cron-job-run-next&lt;/a&gt;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</description><link>http://blog.harrywye.com/post/29852410082</link><guid>http://blog.harrywye.com/post/29852410082</guid><pubDate>Mon, 20 Aug 2012 15:01:00 -0700</pubDate></item><item><title>Something Ventured - Story of Venture Capital and Silicon Valley</title><description>&lt;p&gt;I stumbled upon this documentary &amp;#8220;Something Ventured&amp;#8221; on Netflix last night. I am often disappointed by this type of documentaries. Many documentary directors/writers tend to emphasize and push their personal views, often at the expense of objectiveness. Not so much with this one though. In fact, I was pleasantly surprised by how well this documentary was done. Something Ventured is about the history of venture capital and hence about the history of Silicon Valley. (Venture capitalism started in Silicon Valley, and Silicon Valley was started by venture capitalists (as well as entrepreneurs). They are so intertwined that you cannot talk about one without the other.) The story follows a few notable figures, especially venture capitalists, from the late 1950s until 2000s, many of whom are still alive. The movie covers a lot of territories in a short amount of time. But, here&amp;#8217;s what I personally thought most interesting.&lt;/p&gt;
&lt;p&gt;(1) I don&amp;#8217;t know how many people even in Silicon Valley know how &amp;#8220;the Silicon Valley&amp;#8221; started. I knew about Fairchild Semiconductor (which predated Intel). But, I learned for the first time about &lt;a href="http://en.wikipedia.org/wiki/The_Traitorous_Eight"&gt;&amp;#8220;The Traitorous Eight&amp;#8221;&lt;/a&gt;, who started Fairchild Semiconductor, and how it all started at the Schckley&amp;#8217;s Lab. (&lt;a href="http://en.wikipedia.org/wiki/William_Shockley"&gt;Schockley&lt;/a&gt;, along with others, &amp;#8220;invented&amp;#8221; silicon-based electronics.) Many of The Traitorous Eight (e.g., Eugene Kleiner of KP and Gordon Moore of Intel, etc.) went on to play important roles in Silicon Valley and/or in the venture capital industry.&lt;/p&gt;
&lt;p&gt;(2) Apple&amp;#8217;s success in the early days may owe not only to the brilliance of the founders, Steve Jobs and Stephen Woziack, but also to the foresights of the venture capitalists such as Don Valentine and Arthur Rock. &lt;/p&gt;
&lt;p&gt;(3) Genentech was literally started by venture capitalists, which created the whole new industry of genetic engineering. Without the venture capital (Sequoia), it could have taken much longer to have reached where we are now.&lt;/p&gt;
&lt;p&gt;(4) I learned for the first time about the &amp;#8220;sad story&amp;#8221; behind the departure of Cisco founders. They were effectively pushed out by the venture capitalists and &amp;#8220;professional managers&amp;#8221; brought in by the VCs. It&amp;#8217;s very sad to see that the founder, Sandy Lerner, gets emotional (or, so I thought), decades later, remembering that time.&lt;/p&gt;
&lt;p&gt;I highly recommend this movie to anyone who&amp;#8217;s interested in learning the history of Silicon Valley. (BTW, the movie title doesn&amp;#8217;t seem most effective although it is clearly a pun on the common expression, &amp;#8220;nothing ventured nothing gained&amp;#8221;.) &lt;/p&gt;</description><link>http://blog.harrywye.com/post/28464778562</link><guid>http://blog.harrywye.com/post/28464778562</guid><pubDate>Tue, 31 Jul 2012 21:46:00 -0700</pubDate></item><item><title>"It has always seemed strange to me… the things we admire in men, kindness and generosity,..."</title><description>“It has always seemed strange to me… the things we admire in men, kindness and generosity, openness, honesty, understanding and feeling, are the concomitants of failure in our system. And those traits we detest, sharpness, greed, acquisitiveness, meanness, egotism and self-interest, are the traits of success. And while men admire the quality of the first they love the produce of the second.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;John Steinbeck&lt;/em&gt;</description><link>http://blog.harrywye.com/post/27544681701</link><guid>http://blog.harrywye.com/post/27544681701</guid><pubDate>Thu, 19 Jul 2012 01:19:07 -0700</pubDate></item><item><title>Is Google Drive Safe? Is Cloud Safe?</title><description>&lt;p&gt;I just had this weird experience.&lt;/p&gt;
&lt;p&gt;I was just browsing the web, and suddenly I saw this message on one of the Chrmoe tabs, &amp;#8220;hxxxxx has opened the document&amp;#8221; where &amp;#8220;hxxxxx&amp;#8221; is my gmail account username.&lt;/p&gt;
&lt;p&gt;What?&lt;/p&gt;
&lt;p&gt;How can this be?&lt;/p&gt;
&lt;p&gt;I immediately tried to talk to the other &amp;#8220;person&amp;#8221; who opened the doc with my account. But, when I sent him a message, he did not respond, and (at least in appearance) he just fled. &amp;#8221;&lt;em&gt;hxxxxx has opened the document.&lt;/em&gt; me: Hi. Who are you? &lt;em&gt;hxxxxx has left.&lt;/em&gt;&amp;#8221; This whole thing took about 20~30 seconds.&lt;/p&gt;
&lt;p&gt;I have multiple laptops and probably a dozen devices from which I could have logged on. But, I cannot imagine any of those devices automatically opening this particular google docs document at this moment.&lt;/p&gt;
&lt;p&gt;I tried to think of a plausible explanation, any explanation. Maybe, somebody in my office was trying to use my computer? Maybe, one of my other computers accidentally &amp;#8220;woken up&amp;#8221; and my chrome browser happened to be on front? Maybe, my local google-drive was going through some scheduled maintenance? Myabe, google docs has a bug? Etc. etc&amp;#8230;. But, none seemed to make sense.&lt;/p&gt;
&lt;p&gt;I trust the cloud. Well, I trusted the cloud. I put a lot of information on the cloud, especially on google docs (or, google drive, or whatever it is called these days). I even put some passwords (for non-critical services) on google docs. I have a lot of confidential and/or private information on the cloud. (And, I&amp;#8217;m not just talking about family photos, and what not.)&lt;/p&gt;
&lt;p&gt;While I was writing this blog, the same thing just happened again with the same document (simply because this doc was currently open and visible). Somebody (with my account) opened the doc again.&lt;/p&gt;
&lt;p&gt;This is really disturbing.&lt;/p&gt;
&lt;p&gt;Is my gmail password compromised?&lt;/p&gt;
&lt;p&gt;I cannot even begin to think what I would have to do if somebody accessed my account and all my private information. It would be virtually impossible for me to go through all compromised services and change passwords, etc. Even figuring out what exactly has been compromised (e.g., by going through all emails, etc.) would be impossible. I have grown to be complacent. I&amp;#8217;ve trusted the cloud too much.&lt;/p&gt;
&lt;p&gt;Your system is only as secure as the weakest link. The recent move by Google in moving my docs to the &amp;#8220;drive&amp;#8221; makes me really quizzy. It simply introduces one more point of failure. It simply makes the system more complicated with more and more moving parts. If I lose my laptops or my other devices such as Android phones/tablets (which essentially force you to log on), then what happens? It used to be, if you lost your phone the biggest risk was losing your contact information. (Ironically, address book service was one of the first most successful cloud-based services.) Now, if you lose your phone, you are risking a lot more, and the really disturbing part is, you don&amp;#8217;t even know what exactly is the risk. (I just remembered, some of my online payment information was also tied to this email account, such as Google Wallet and Amazon, etc. What happens to these payment accounts?)&lt;/p&gt;
&lt;p&gt;Simple is better.&lt;/p&gt;
&lt;p&gt;Often, the weakest part of the whole system is the users, or the people. That is, &amp;#8220;me&amp;#8221;.&lt;/p&gt;
&lt;p&gt;I can no longer trust the cloud since they are making it messier and messier, since they are making it more and more complicated, and since I cannot understand what the heck is going on.&lt;/p&gt;
&lt;p&gt;I can no longer trust myself.&lt;/p&gt;</description><link>http://blog.harrywye.com/post/26502677055</link><guid>http://blog.harrywye.com/post/26502677055</guid><pubDate>Wed, 04 Jul 2012 11:02:00 -0700</pubDate></item><item><title>DNS Hijacking</title><description>&lt;p&gt;DNS is a system built on trust.&lt;/p&gt;
&lt;p&gt;When the initial version of SOPA came out later last year, I was extremely frustrated, as with many other people, by the sheer stupidity of the idea (and, by the stupidity of the &amp;#8220;selfish&amp;#8221; people driven by their short term interests).&lt;/p&gt;
&lt;p&gt;DNS is a very fragile system.&lt;/p&gt;
&lt;p&gt;This is partly because it is based on the trust among the &amp;#8220;players&amp;#8221; in the network. If any player in the network does not abide by the rule, or simply makes mistakes, then it can potentially cause a confusion or even wreak a havoc. It doesn&amp;#8217;t have to be malicious.&lt;/p&gt;
&lt;p&gt;For the last few days, I had this weird problem. I was working on a website with a new domain name I registered a couple of weeks ago. It was working fine for about ten days, and it suddenly started showing a strange Spanish language website instead of mine. It sometimes alternated between my site and that strange site (which turned out to be a &amp;#8220;parked domain&amp;#8221; page by a certain domain registrar). It also affected other CNAME subdomains, not just &amp;#8220;www&amp;#8221;, again intermittently. The &amp;#8220;A&amp;#8221; records were also incorrectly resolved.&lt;/p&gt;
&lt;p&gt;I spent two days trying to resolve this issue with my registrar, and I never got a single helpful response, or a straight answer, from them. (I thought, Why did they not understand the importance of Customer Service, a la Tony Hsieh?) I was so frustrated. Anyways, after some detective work, I figured out that the two domain registrars were related (owned by the same company headquartered in Europe). This frustrated me even more. These people were possibly hiding information that could have saved me a lot of time (although I didn&amp;#8217;t have proof). It wasn&amp;#8217;t really about the customer service. It was more about the integrity of their business.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m told that the &amp;#8220;DNS hijacking&amp;#8221; by domain registrars is rather common practice (often to display ad pages, etc.). I don&amp;#8217;t think this particular problem was caused by malice, or that it was even intentional. There might have been some config errors in their DNS servers, etc. I don&amp;#8217;t know. This, however, reminded me how fragile our DNS system was. (And, it made me realize that I might have to switch my domain registrar.)&lt;/p&gt;</description><link>http://blog.harrywye.com/post/25831341803</link><guid>http://blog.harrywye.com/post/25831341803</guid><pubDate>Sun, 24 Jun 2012 21:03:00 -0700</pubDate></item><item><title>You look different today.</title><description>&lt;p&gt;This is a true story. :)&lt;/p&gt;
&lt;p&gt;I knew this coworker some years ago. I didn’t even know where (in which department) she worked, but she was always friendly. We talked whenever we ran into each other in the hallway. One day, I saw her near the elevator, and she looked somewhat different. I told her she looked different today. She asked me, “how do I look different today?” I thought about it. Same blond hair, same smile, … and more or less same style of clothes, etc. &amp;#8230;. She had a bit of strange “blank look” on her face, but otherwise it was very hard for me to pinpoint what exactly it was that made her look different today. I answered “you look just different. Must be your hair” :) and I hurried on. Later that day, I ran into her again, and I &lt;em&gt;then&lt;/em&gt; realized that the person I was talking to earlier was actually &lt;em&gt;a different person.&lt;/em&gt; That explained her “blank look”. She simply didn’t recognize me. :)&lt;/p&gt;</description><link>http://blog.harrywye.com/post/25829111487</link><guid>http://blog.harrywye.com/post/25829111487</guid><pubDate>Sun, 24 Jun 2012 20:28:34 -0700</pubDate></item><item><title>Why Do I Go to Google IO?</title><description>&lt;p&gt;I went to one of those &amp;#8220;startup conferences&amp;#8221; last Wednesday. It was the third such event I attended this year. I somehow feel like I should go to more of those events, but then again I&amp;#8217;m not sure why I feel that way. The &amp;#8220;presentations&amp;#8221; are generally good. But, that cannot be your sole reason. There are a lot of good information on the Net these days, for people like me who are planning to build, or currently buildling, &amp;#8220;high tech&amp;#8221; startups. People tell me you should &amp;#8220;network, network, and network&amp;#8221;. But, I&amp;#8217;m not sure how effective these venues are for networking, at least for me. (I &amp;#8220;met&amp;#8221; less than ten people during the whole one day conference.) Especially when you are sleep-deprived (because you are spending 18 hours of your day coding), investing one day (or, even a few hours) on &amp;#8220;networking&amp;#8221; doesn&amp;#8217;t seem like a good use of your time. For me, it&amp;#8217;s not very clear. (Well, in general, it&amp;#8217;s not always very clear to me why I do what I do. :) I think I&amp;#8217;m like The Machinist, if you are into that kind of movies.) If I have to, I&amp;#8217;d say I&amp;#8217;m anticipating/hoping for some kind of serendipity.&lt;/p&gt;
&lt;p&gt;Anyways, in the conference, I ran into a person from Google (let&amp;#8217;s call her &amp;#8220;M&amp;#8221;). She said she was in charge of organizing Google I/O 2012. Funny thing is, I managed to buy a ticket to I/O this year, through some luck and through &amp;#8220;determination&amp;#8221; (see below). This year&amp;#8217;s tickets were apparently all sold out in 20 minutes. The tickets were supposed to go on sale at 7AM, US Pacific time, on a particular day, and I had to stay up all night in order not to risk getting up too late. A lot of people could not buy tickets. So, how did I manage to buy a ticket? It clearly had a lot to do with luck (it was like lottery, in fact). But, I can tell you a few secrets. :) First of all, I was very prepared. I had two separate gmail accounts linked to two separate Google Wallets. I opened two Chrome browsers for these two accounts, and I alternatively used them, and kept retrying. (Most of the registration attempts just timed out, and often the error messages stated that the tickets were sold out, even from 7AM.) Finally, one of my requests got through, after probably a dozen retires from two different browsers, and it was 7:19AM, a minute(s) before the supposedly sold-out time. (I hope readers don&amp;#8217;t think I was cheating by using two gmail accounts. :)) Even after that, Google Wallet kept failing to process my purchase request. When I successfully bought the ticket, it was 7:21AM. Note that I was really &amp;#8220;persistent&amp;#8221; even when I got the false errors (false, in hindsight) saying that there were no tickets left.&lt;/p&gt;
&lt;p&gt;So, why was I so &amp;#8220;determined&amp;#8221; to buy a ticket to Google I/O?&lt;/p&gt;
&lt;p&gt;Last Wednesday, this person from Google, M, asked me why I would go, or want to go, to I/O? This is my fourth year. Why I would want to go to I/O? Why I went through so much &amp;#8220;trouble&amp;#8221; to buy this year&amp;#8217;s ticket? I couldn&amp;#8217;t really answer her question, because I wasn&amp;#8217;t really sure myself.&lt;/p&gt;
&lt;p&gt;The first year when I went to I/O was 2009, and it was mostly out of curiosity. I started going to these large conferences, Web 2.0 and Google I/O, etc. around that time (Last time I had been to &amp;#8220;conferences&amp;#8221; was more than 10 years before, and it was &amp;#8220;academic conferences&amp;#8221;. I never went to Apple events, or Comdex, or even CES.)&lt;/p&gt;
&lt;p&gt;In any case, a lot of exciting things were happening at Google at the time, ca 2009. Android was a very ambitious project and Chrome/Chromium was another. Java version of Google App Engine was starting to gain traction as well. The following year, 2010, this trend continued. I was learning Android development, and I was starting to use GAE more and more (as a platform for launching my future startup). In general, I was very interested in what was happening at Google. If I would go to one conference per year, it seemed to me that it should be this I/O event.&lt;/p&gt;
&lt;p&gt;Last year, 2011, however, was a bit of disappointment to me. It wasn&amp;#8217;t that the quality of I/O changed or anything like that. For me, essentially, the &amp;#8220;novelty&amp;#8221; wore off. At my third year, the events and presentations seemed more or less the same, to me. What was really new? There were a lot of &amp;#8220;incremental&amp;#8221; changes to Android platform and GAE (which were the areas of my primary interest), but nothing revolutionary. Opening the App Market to Google TV apps was one of the biggest news. I was fortunate enough to be invited to their pilot program, and it happened because I went to I/O. There was another exciting demo of using Android for home automation. This can be a really promising direction for Android, but that is discussion for another time. &lt;/p&gt;
&lt;p&gt;Anyways, it appears that a lot of interesting things are still happening at Google. Google+ and the integration of &amp;#8220;social&amp;#8221; into search is probably big innovation which Google has recently introduced. But, does it affect my decision to go to I/O? Does it make me more excited about Google&amp;#8217;s technologies? Not sure.&lt;/p&gt;
&lt;p&gt;So, why would I want to go to I/O this year? Or, more precisely, will I go to I/O this year? Or, would I continue going to I/O year after year? (Note that there is another question, Why Google does Google I/O, which may be somewhat related to the question I&amp;#8217;m addressing here.) To be honest, my answer is really, &amp;#8220;Not sure&amp;#8221;. It&amp;#8217;s more like a habit to me at this point. Since I went there last year, maybe, I should go again this year. But, then again, maybe, I&amp;#8217;m expecting something really new, something really exciting this year (like the anticipation before opening the proverbial Box of Chocolate). Not sure.&lt;/p&gt;
&lt;p&gt;So, here&amp;#8217;s an alternate question I&amp;#8217;ll try to answer instead: Why would a developer want to go to the Google&amp;#8217;s annual developer event, Google I/O? Clearly, I cannot speak for other developers, but this is my best guess answers (from my own perspective).&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;First, what is I/O? In my view, it&amp;#8217;s a combination of Google PR event and developer relations event. If you are into Google technologies, it can be a very exciting atmosphere to be in. Especially, the daily keynotes can be fun and exciting like watching a good show.&lt;/li&gt;
&lt;li&gt;What I like about I/O is that they always announce something new at the event. You can always learn about them on the news, but it&amp;#8217;s not the same. If you are entrepreneurial like me, these new announcements can affect your future project selections/directions, and you can have the &amp;#8220;head start&amp;#8221;.&lt;/li&gt;
&lt;li&gt;All developers at the event are, to a certain degree, advocates of Google technologies. If nothing else, they use some of the Google technologies on a daily basis, e.g., for building their products. You can feel comaraderie with other developers at the event, who are from all around the world. &lt;/li&gt;
&lt;li&gt;I haven&amp;#8217;t been to other developer events, but Google I/O is like a weekend school. There are a lot of &amp;#8220;lectures&amp;#8221; for developers with different skill levels. You can learn a new thing or two by attending these classes. They are all recorded and you can watch them later on YouTube, but again the experience is not the same. I feel like I&amp;#8217;m learning more by being there rather than watching videos. Your mileage may vary.&lt;/li&gt;
&lt;li&gt;If nothing else, you get various gifts, or &amp;#8220;high tech toys&amp;#8221;, merely by attending the event. Some are just nice gifts. Some are, however, &amp;#8220;pre-release&amp;#8221; products which are only available to the I/O attendees. Depending on your interests, that few day or few week &amp;#8220;head start&amp;#8221; can make a big difference if you are developing related products in a competitive market.&lt;/li&gt;
&lt;li&gt;I ran into a few old friends/acquaintances, and made a few new ones, in the past events. While this cannot be your primary reason to attend the event, this can be still a good reason to force yourself to get up early in the morning, in case you feel lazy, on the days of I/O.&lt;/li&gt;
&lt;li&gt;Etc. (Add more reasons of your own here.)&lt;/li&gt;
&lt;/ol&gt;</description><link>http://blog.harrywye.com/post/22569814667</link><guid>http://blog.harrywye.com/post/22569814667</guid><pubDate>Sun, 06 May 2012 21:00:00 -0700</pubDate></item><item><title>Unlikely Events</title><description>&lt;p&gt;I couldn&amp;#8217;t come up with a better title. It&amp;#8217;s not Serendipity. It&amp;#8217;s not Coincidence. &amp;#8230;&lt;/p&gt;
&lt;p&gt;This story is about sort of a life lesson that an unlikely event can happen, and that it sometimes just happens. There is no need for explanation or there is no need to search for the reason behind this &amp;#8220;unlikely&amp;#8221; event. There might have been something that caused or triggered this event. Then again, this might have been just pure coincidence, a random event.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not a morning person. I get up pretty late in most people&amp;#8217;s standards. I usually check my email in the morning, and sometimes read my Twitter stream for a few minutes, before I get my breakfast+lunch. BTW, Twitter has been getting a bit boring for me recently. Anyways, One random tweet caught my attention this morning from some sort of a &amp;#8220;professional blogging site&amp;#8221;. I didn&amp;#8217;t even know I was following this service. The post had a link to this article: &lt;a href="http://nibletz.com/2012/04/victoria-police-endorsing-australian-startup-mybikerego-to-help-reunite-bikes-and-owners/"&gt;Victoria Police Endorsing Australian Startup MyBikeRego To Help Reunite Bikes And Owners&lt;/a&gt;. The original tweet message had the word &amp;#8220;QR Code&amp;#8221; in it, and that was what caught my eyes in the first place (power of good &amp;#8220;copy&amp;#8221;). While I was reading the article, about this startup, I remembered one interesting event that happened to me many years ago when I was in school.&lt;/p&gt;
&lt;p&gt;I went to this school (many years ago) which had a huge campus on a side of a mountain. It was very convenient to ride a bicycle across the campus (even though the terrain was very hilly). I had this blue mountain bike. It was a Specialized and since it was mass produced there should have been a lot of same bikes. But, I rarely, if ever, saw the same ones as mine (e.g., same model and same color). It was just an ugly bright blue color, which can be noticed from miles away. (If you are a cyclist, you know what I&amp;#8217;m talking about. Being noticeable is a very important prerequisite for your safety when you are on a saddle.)&lt;/p&gt;
&lt;p&gt;There was this bike stand (?) where you can lock up your bike just outside the building I worked in. Every morning, I locked my bike there with one of those &amp;#8220;Kryptonite&amp;#8221; U locks and left it there until the end of the day, when I retrieved my bike and headed home.&lt;/p&gt;
&lt;p&gt;One day, I came out of my office and tried to unlock my bike. For some reason, my key did not work. Funny, I thought. How could this be? I was incredulous. I spent a few minutes there trying to solve this &amp;#8220;mystery&amp;#8221;. The lock (a U lock, in case you don&amp;#8217;t know, is very hard to cut) was intact. No sign of tampering. Hmm&amp;#8230;Then, all of a sudden, somebody approached me in a hurry and looked at me funny. He then unlocked the bike and rode away. What? Hey, hey. That is my bike!!!&lt;/p&gt;
&lt;p&gt;As it turned out, I parked my bike somewhere else that morning for some reason, and I couldn&amp;#8217;t even remember it. When I came out of the office at the end of the day, I naturally headed to the usual spot. Because that&amp;#8217;s what we do: Forces of habit. By happenstance, that day, this guy who had a same kind of bike as me (same model, same size, same color, and even same lock) locked his bike at the same spot. What is the likelihood of that happening? What are the chances? (BTW, can you imagine this poor guy probably thinking that his bike was being stolen by some idiot in a broad daylight? :))&lt;/p&gt;
&lt;p&gt;We see these things happen all the time. For example, the police always has this theory that since a certain thing is unlikely to happen, if that happens then that cannot be just a random event. We see these things all the time throughout our lives although we do not really realize it. &lt;/p&gt;
&lt;p&gt;Time for breakfast slash lunch for me!&lt;/p&gt;</description><link>http://blog.harrywye.com/post/21219976584</link><guid>http://blog.harrywye.com/post/21219976584</guid><pubDate>Mon, 16 Apr 2012 11:49:00 -0700</pubDate></item><item><title>My first week of outsourcing</title><description>&lt;p&gt;I&amp;#8217;ve been hoping to &amp;#8220;offload&amp;#8221; some of my daily work for some time. I know (I may appear) that I&amp;#8217;m doing 180 from what I was so strongly advocating only a few days ago :) &lt;a href="http://blog.harrywye.com/post/20639399062/do-it-yourself-startup"&gt;&lt;a href="http://blog.harrywye.com/post/20639399062/do-it-yourself-startup"&gt;http://blog.harrywye.com/post/20639399062/do-it-yourself-startup&lt;/a&gt;&lt;/a&gt;, but this is not really an about face. I like to do &amp;#8220;everything&amp;#8221; myself. But the truth is you cannot do &amp;#8220;everything&amp;#8221; yourself.&lt;/p&gt;
&lt;p&gt;There can be many reasons. For some tasks, other people can do better job than you can, in terms of quality and/or efficiency, etc. In some cases, you just don&amp;#8217;t have time to do certain tasks yourself. In some other cases, just don&amp;#8217;t want to do the tasks (which still need to be done) because they are too boring or they are just hard or you are sick and tired of them because you have done similar tasks too many times, etc.&lt;/p&gt;
&lt;p&gt;Outsourcing is difficult. And, it requires your upfront investment. &lt;/p&gt;
&lt;p&gt;Earlier this year, I wanted to find frontend engineers and/or UI designers. (BTW, I&amp;#8217;m a &amp;#8220;backend engineer&amp;#8221;.) It was not exactly &amp;#8220;outsourcing&amp;#8221; that I was trying to do. I was rather looking for &amp;#8220;partners&amp;#8221;, who could take the ownership of certain parts of my projects. There were a few reasons. First of all, &amp;#8220;outsourcing&amp;#8221; seemed difficult for me for these types of tasks that needed to be delegated. I could have spent some time to &amp;#8220;package&amp;#8221; certain tasks from my projects so that I could easily outsource them. (And, I might try that at some point in the future.) But, in general, the development does not work that way. It&amp;#8217;s typically an iterative process requiring constant collaboration among the developers. This is especially so in the early development phase. There is no &amp;#8220;DONE&amp;#8221;, and you cannot outsource a task that is constantly changing/evolving or that has no end goal. Second, and more importantly, I thought this was a good opportunity to recruit a &amp;#8220;co-founder&amp;#8221;. I&amp;#8217;ve been meaning to (and, I will some day) find cofounders. If I had a choice, and certain I do, my first choice for my cofounders would be a frontend engineer or a UI/UX designer. So, why outsource something that can be done in house? Finding cofounders first I can do away with outsourcing UI or frontend work.&lt;/p&gt;
&lt;p&gt;Anyways, whether you call it a cofounder or a partner, I was looking for a person who would &amp;#8220;care&amp;#8221; about the tasks. Many contractors would probably do what they were asked to do and they would probably do a good job for that. But, I needed somebody who would care and who could go extra miles just like the task was their own. I know. I have very high expectations. :)&lt;/p&gt;
&lt;p&gt;In any case, it&amp;#8217;s not an easy thing to do. After only a couple of weeks&amp;#8217; efforts, I &amp;#8220;gave up&amp;#8221;, or more like, I &amp;#8220;suspended&amp;#8221; the search for partner(s) for now. Being a solo entrepreneur, every time you are away from your main development work, your company suffers. No product, no company.&lt;/p&gt;
&lt;p&gt;The next attempt for outsourcing for me was to find a &amp;#8220;personal assistant&amp;#8221;. Initially, I thought about posting an ad on Craigslist. But, I wasn&amp;#8217;t really sure. I didn&amp;#8217;t have enough work to delegate, at least initially. Then I heard about &amp;#8220;virtual assistants&amp;#8221;. This being a low priority task for me, I&amp;#8217;d been again procrastinating this for a few months. But, a couple of weeks ago, I finally decided that I should do this. I knew it was going to be a &amp;#8220;hard&amp;#8221; work, and it was gonna be a time consuming task for me. But, I knew this had to be done. I decided that this should be worth more than my initial time investment in the long run. &lt;/p&gt;
&lt;p&gt;I researched a little bit on the Web. There were many online VA services. Some were more specialized, that is, only in VA types of work. Some were more general freelancer services with &amp;#8220;admin support&amp;#8221; or &amp;#8220;virtual assistant&amp;#8221; categories. Most well known freelancer sites are &lt;a href="https://www.elance.com/"&gt;&lt;a href="https://www.elance.com/"&gt;https://www.elance.com/&lt;/a&gt;&lt;/a&gt;, &lt;a&gt;&lt;a href="https://www.odesk.com/"&gt;https://www.odesk.com/&lt;/a&gt;&lt;/a&gt;, and &lt;a href="http://www.vworker.com/"&gt;&lt;a href="http://www.vworker.com/"&gt;http://www.vworker.com/&lt;/a&gt;&lt;/a&gt;, etc. (One thing to note is that there are many (US-based) contractors on these sites who do not appear entirely happy with this type of services. They think they have to work there because that is, sometimes, the only source of income for them but they are not very happy for many reasons, often, primarily due to the low wages, etc. See below) &lt;/p&gt;
&lt;p&gt;I started outsourcing some &amp;#8220;trial tasks&amp;#8221;. The goal was not to have the &amp;#8220;real work&amp;#8221; done, but rather finding one or two assistants that I could trust. (Trust, in terms of their integrity and in terms of their ability to carry out the tasks.)&lt;/p&gt;
&lt;p&gt;Being a boostrapper with no revenue at this point, keeping the cost down in the long run is very important for me. And, that is why I have chosen to use these online services in the first place. But, the quality is also very important. Otherwise, I would not do this. So, I decided to &amp;#8220;invest&amp;#8221;, in terms of time and money, at least initially. My goal was to find the &amp;#8220;diamond in the rough&amp;#8221;. I knew this was gonna be tough, but it was very important for me. I believed it was gonna be a worthwhile investment.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll end up delegating a lot of what I do, and I cannot just delegate my work to anyone. I do care about my work and I like to do them myself (Cf. &lt;a href="http://blog.harrywye.com/post/20639399062/do-it-yourself-startup"&gt;Do it yourself startup&lt;/a&gt;.) Delegating for me is like sharing. You share good things with your friends. You share fun things with your family. I know it may sound a bit childish, but even for small tasks, I cannot share them with anyone. People say you have to learn to &amp;#8220;let go&amp;#8221;. Maybe, some day. But, not now.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been on these services &amp;#8220;interviewing&amp;#8221; various candidates for the last week or so. It has been, and is continually, a big investment for me. None of my &amp;#8220;real work&amp;#8221; has been done (that is, by me) for this period. It has been really a full time job for me. My impression so far has been a bit mixed. Many people, or contractors, seem very professional, and the contractors I hired have done excellent job. Some contractors, however, do not seem very enthusiastic. For a lot of contractors, it appears, landing a job is just a numbers game with very low probability of winning. For one job post, if there are 20 applicants, what is your chance of getting that task? I can see why their morale seems a bit low. But, unfortunately, that is the way it is. Even in the &amp;#8220;real world&amp;#8221;, you are always just one of dozens and dozens of job applicants for any single position (that is, for any position which is worth applying for). Also, many contractors do not seem to know how to &amp;#8220;close&amp;#8221;. Getting a job (whether full time or part time) is a sales process. The sale is not final until it is closed. If you cannot close, then you have a problem as a freelancer. (BTW, I&amp;#8217;ve never done contracting, and I think I&amp;#8217;ll probably suck. This is just my opinion as a client/employer.) Even when I expressed an interest, some contractors responded very slowly. With the time zone difference and everything, I did not expect immediate responses, but in many cases, the delay seemed a bit longer than I reasonably expected. If a contractor is not very enthusiastic (saying that you are enthusiastic is one thing, but showing that is another, which is not that difficult), then why would the client hire him/her? How would the client know that you will do a good job?&lt;/p&gt;
&lt;p&gt;Being new at this, I made a BIG mistake of posting the first job as &amp;#8220;long term&amp;#8221;. I actually made the same mistakes twice. I was just a bit too ambitious. Unfortunately, it was very clear to me that, at some point, I could not select one or two contractors for &amp;#8220;long term&amp;#8221; even after small trial projects. It was not how it was supposed to work. Especially for a person like me who would have trouble letting it go, there was no way I could find someone I could trust in a matter of days or even weeks and then delegate my &amp;#8220;dear tasks&amp;#8221; to them. (BTW, I&amp;#8217;m saying this from my own perspective, and other people may think many of my tasks, what I currently do, may be just plain or not so exciting. ;)) BTW, it&amp;#8217;s not that they are not doing a good job. All of the &amp;#8220;candidates&amp;#8221; have been, and are, doing superb job. But, the first task I chose for them was somewhat tedious/mundane job. It was intentional, because I thought being able to do repetitive tasks effectively and efficiently was a very important skill. I&amp;#8217;m now having trouble selecting the next task for them. I&amp;#8217;m even having some doubts as to whether I am really ready to do this, and as to whether I would feel really comfortable delegating my work to the contractors. It&amp;#8217;s the classic moment of &amp;#8220;it&amp;#8217;s not you. It&amp;#8217;s me&amp;#8221; :). Then again, it&amp;#8217;s maybe because I haven&amp;#8217;t found the &amp;#8220;right person&amp;#8221; yet&amp;#8230;.&lt;/p&gt;
&lt;p&gt;(Note: One thing I hate is &amp;#8220;talking behind one&amp;#8217;s back&amp;#8221;. Many people do it even without realizing it. But, I believe that only dishonest people or cowards do that.)&lt;/p&gt;
&lt;p&gt;Now, at this point, I cannot get into too much details. Although this is my &amp;#8220;diary&amp;#8221; (I don&amp;#8217;t consider this really a blog, as you can see from the way I select topics), it is still public. I don&amp;#8217;t want to include specifics that might be construed as talking behind their backs even though that is not my intention. Many of the contracts are currently ongoing, and I will likely have ongoing &amp;#8220;relationships&amp;#8221; with many of my contractors.&lt;/p&gt;
&lt;p&gt;OK, having said that, I don&amp;#8217;t have much else to say then. :)&lt;/p&gt;</description><link>http://blog.harrywye.com/post/21104591046</link><guid>http://blog.harrywye.com/post/21104591046</guid><pubDate>Sat, 14 Apr 2012 14:13:00 -0700</pubDate></item><item><title>Why Do I Need So Many Google Apps?</title><description>&lt;p&gt;I own many domain names (with &amp;#8220;many&amp;#8221; being clearly a subjective term).&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s not that unusual for &amp;#8220;entrepreneurs&amp;#8221; to have many domains. Entrepreneurs, or maybe more precisely, some entrepreneurs, tend to have many ideas, and many of them think/hope that they might need certain domains in the future. It&amp;#8217;s not that they will start 100 different businesses. The problem is that they don&amp;#8217;t really know which one (or, two or a few) of those 100 business ideas they will end up pursuing (now or in the future).&lt;/p&gt;
&lt;p&gt;Owning domains like this is not cybersquatting. Virtually every domain I own has no real value (to other people). It&amp;#8217;s highly unlikely that I can sell any of the domains for more than I already paid/currently pay to the domain registrars. These domains are just for me.  &lt;/p&gt;
&lt;p&gt;So, you might ask: If your domains are not that valuable then why buy them now rather than just wait until you really need them. I can give you many different answers, but you may or may not see the way I see (or, the way some entrepreneurs see). The first and probably most practical answer is to protect yourself from cybersquatters. When it comes to dot com domains, virtually all conceivable English word combinations are already taken. It&amp;#8217;s practically impossible to register two word domain names. It&amp;#8217;s not easy these days to register even three word domain names. Millions and millions of domain names have been registered by cybersquatters whose main objectives are to resell those domains to the people who might really need them some day. It&amp;#8217;s a very low probability game like gambling. But, if you buy enough number of domains (I mean, a large number of domains), then your chance of hitting one &amp;#8220;big one&amp;#8221; goes up, and it can presumably become a lucrative business. I hear that there are businesses which buy a large number of lottery tickets from all around the world (because the odds constantly vary and, at some point, the expectation value can be actually positive). This is a similar idea. There are probably numerous small cybersquatters as well, but I don&amp;#8217;t know what percentage of domains are owned by professional cybersquatters and what percentage are owned by &amp;#8220;hobby&amp;#8221; cyersquatters.&lt;/p&gt;
&lt;p&gt;The second answer to the earlier question is, (some) people buy domain names in order to use them as &amp;#8220;reminders&amp;#8221; to themselves. It may sound strange, but I know I&amp;#8217;m not the only one. You think of a business idea, and come up with a domain name. (Again, finding an available domain name which reflects your business idea and which you like is an extremely difficult task since all good names (e.g., short and memorable names) are already taken.) You may not pursue the business idea right away (which is highly probable since this is only one of many of your ideas), but owning a domain is a constant reminder of that idea. Whenever you see that domain name you own, you think about that business idea. I know, as I said, this seems kind of weird, but all I can say is, you should give it a try. :) There are many other answers to this question (which may or may not apply to me directly), but we are way off topic here.&lt;/p&gt;
&lt;p&gt;When you buy a domain only (e.g., without web hosting), the domain registrars typically put up their own ad pages as place holders (because the domain owners have not set up their own web sites and hence the domains are not being &amp;#8220;used&amp;#8221;), which are essentially spam pages. Since the domain registrars serve a large (I mean, large) number of domains, and many of them are not being used, I presume this becomes a numbers game, and even spam pages like these can generate a certain level of ad/affiliate revenue for them. I&amp;#8217;m just guessing. But, I know this is a very important part of their revenue streams for some (small) registrars.&lt;/p&gt;
&lt;p&gt;Recently, I&amp;#8217;ve decided to set up Google Apps for some of the domains I own. There are many reasons why I want to, or need to, do this, but I&amp;#8217;ll include two in this post. &lt;/p&gt;
&lt;p&gt;First, I want to put up my own place holder pages (in some way, similar to &amp;#8220;coming soon&amp;#8230;&amp;#8221; pages) rather than the ad pages. I don&amp;#8217;t want to go into details, but there are many reasons why this is (or, can be potentially) important, for example, for SEO reasons, etc. The value (e.g., the &amp;#8220;ROI&amp;#8221;) of this task is very small, tiny indeed, compared to the cost of creating your own Web pages, etc. It&amp;#8217;s not generally worth the trouble, especially when you don&amp;#8217;t have the plan to &amp;#8220;use&amp;#8221; that domain in the immediate future. I wouldn&amp;#8217;t probably do this but for the second reason stated below. But, anyways, Google Apps gives you this FREE and easy to set up Web site. It is UGLY. It is very hard to create professional-looking Web sites on Google Apps. It is also very limited in many ways (e.g., you cannot use your own HTML or javascript, etc.). But, for me, that&amp;#8217;s good enough. I can always set up a better Web site later if I really want to (and, if I have time and/or if I have a need, etc.). I think Google Apps Site is a good free hosting service when ALL you need is free hosting. (Besides, GApps includes other services, which you might find useful.)&lt;/p&gt;
&lt;p&gt;Second, and probably more importantly, I need to use Google Apps for setting up custom domains for my Web applications. I develop my applications on Google App Engine (GAE, not to be confused with Google Apps). In case you are not familiar, it is a cloud-based app hosting service. It is often categorized as PaaS (Platform as a Service) as opposed to IaaS (Infrastructure as a Service). There are many IaaS providers including Amazon Web Service, Microsoft Azure, Rackspace, etc. PaaS is not as commonplace. GAE used to be the only one, AFAIK. Now, there are many other PaaS providers (even IaaS providers support some kind of &amp;#8220;platforms&amp;#8221; these days), but still GAE is the best one available, in my view.&lt;/p&gt;
&lt;p&gt;PaaS services are generally very convenient (compared to using IaaS or managing your own servers). The problem with PaaS including GAE is, however, that you are limited by the services they support. If they do not support certain services or functionalities, then in many cases you are out of luck. Even when they provide certain functionalites, you can only do certain things in certain ways, etc.&lt;/p&gt;
&lt;p&gt;GAE does not support DNS. This is an extra layer to them. Guido, the creator of the programming language Python, explicitly stated on a public forum that they had no intention of supporting DNS. I don&amp;#8217;t think that&amp;#8217;s GAE team&amp;#8217;s official view, but considering the seniority of Guido in the GAE team, we can still assume that this &amp;#8220;policy&amp;#8221; will not change any time soon.&lt;/p&gt;
&lt;p&gt;Currently, if you want to use a custom domain on Google App Engine, then you HAVE TO set up Google Apps and use their DNS service. This is very inconvenient, to say the least. Setting up a Google Apps is rather time consuming. In many cases, I don&amp;#8217;t really need Google Apps. I just need to use custom domain for my web application, which has nothing to do with Google Apps. Unfortunately, Google (I say, Google, not GAE team) appears to have no plan to support DNS for GAE outside Google Apps, and this is the only &amp;#8220;official&amp;#8221; way of setting up custom domains for your apps running on Google App Engine. (BTW, it should be noted that there are no maximum number of Google Apps a user/company can have, as far as I know. Considering that this is the only way in which we can use custom domains for GAE apps, I highly doubt that there is such a fixed/hard limit.)&lt;/p&gt;
&lt;p&gt;I develop many different apps. For now, these are all &amp;#8220;test&amp;#8221; apps (until I find the ONE, which I can focus my energy on). I do a lot of &amp;#8220;experimentation&amp;#8221; and just &amp;#8220;release&amp;#8221; them (although nobody, I mean NOBODY, else uses them but me). These apps require (or, I prefer to have) custom domains, just in case, that is, just in case somebody finds them on the net and start using them.&lt;/p&gt;
&lt;p&gt;Due to the inconvenience of setting up custom domains through Google Apps, I sometimes spend a bit of time, once in a while, just to set up Google Apps for certain domains which I may or may not need in the near future. (It&amp;#8217;s like a &amp;#8220;game&amp;#8221; for me :), and I can do it under 12 mins these days including all &amp;#8220;preliminary&amp;#8221; work. See below.) As I stated, it serves dual purposes (among other things). I can place my own place-holder page for that domain, if nothing else, and I don&amp;#8217;t have to waste my time when I really, or urgently, need to have custom domain set up for my Web applications.&lt;/p&gt;
&lt;p&gt;I recently started thinking of delegating some of my day-to-day work to &amp;#8220;virtual workers&amp;#8221;, as you can see from my previous posts (and, I&amp;#8217;m writing more regarding my first experience with these freelancer services). I started interviewing some &amp;#8220;contractors&amp;#8221;, and for me this task of setting up Google Apps seemed like an excellent trial task for the candidates.&lt;/p&gt;
&lt;p&gt;There was this person I liked. She had, at least on paper and according to her claims, the best qualifications for the job I was hiring for (at the time). I offered a trial task with 10 repetitions of setting up Google Apps. I got positive response. Initially, I thought she accepted the offer (being new to that freelancer site), but after I sent her email regarding the task of setting up Goolge Apps for 10 domains, she stopped responding to my messages and email. It was very puzzling to me. The funny thing was, the way the service was set up, I could not even cancel or withdraw the offer because she somehow &amp;#8220;semi accepted&amp;#8221; it. Apparently, we were in some kind of a limbo state where we&amp;#8217;re still &amp;#8220;negotiating&amp;#8221; the terms. The only way I could cancel the offer at that point seemed like to open a ticket (how inconvenient).&lt;/p&gt;
&lt;p&gt;(BTW, the real irony is that, in my original job posting, I emphasized the importance of good communications. Not to be too cynical, but there are good people and there are bad people, in my world. Good people are generally &amp;#8220;good communicators&amp;#8221;. Please read my previous post.)&lt;/p&gt;
&lt;p&gt;After two days, and after I let her know that I would withdraw the offer for the trial task, I finally got a short response. Her response was that she would not feel comfortable dong the task of creating spam accounts, or &amp;#8220;mak[ing] up accounts to spam traffic&amp;#8221; in her own words. (Just to be fair, I clearly implied that there might be more than 10 domains, with each task including creating a separate email/blog accounts tailored to the specific domain, etc.) Regardless of whether it was a valid concern for her, I am not sure why she could not raise her concerns to me earlier. At first, I was kind of upset, because I thought, Who are you to &amp;#8220;judge&amp;#8221; me? I am not a &amp;#8220;spammer&amp;#8221; and I have no intention of becoming one. Neither do I have a plan to build a Demand Media. But, even if I did, why is that her business? It&amp;#8217;s not like I was asking her to do anything illegal or even remotely questionable, except for her pre-judgement regarding creating multiple Web accounts. If every worker was as &amp;#8220;righteous&amp;#8221; as her, then we would not have big corporations. No Enron, No AT&amp;amp;T. No Comcast. Not even Apple. You name it. (BTW, it was just a &amp;#8220;trial&amp;#8221; to find out more about each other&amp;#8230;) Anyways, she does not know me, and I don&amp;#8217;t expect her to. The most disappointing part is that she decided not to communicate for two days (less than 48 hours, but nonetheless 2 calendar days). At least, I appreciate her last minute honesty, at this point.&lt;/p&gt;
&lt;p&gt;So, to answer the question, &amp;#8220;Why do I need so many Google Apps?&amp;#8221;&amp;#8230;&lt;/p&gt;
&lt;p&gt;The answer is, BECAUSE I DO.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Postscript: I forwarded a link to this blog post to her. I thought the &amp;#8220;tone&amp;#8221; of this post was a bit harsh (so, I was a bit hesitant), but nevertheless I thought it reflected my honest sentiment. She was gracious, and we agreed that it was a bit of misunderstanding. I was clearly a bit too quick to judge her as well. Mea culpa.&lt;/em&gt;&lt;/p&gt;</description><link>http://blog.harrywye.com/post/21032000136</link><guid>http://blog.harrywye.com/post/21032000136</guid><pubDate>Fri, 13 Apr 2012 10:52:00 -0700</pubDate></item><item><title>Good Communication Skill</title><description>&lt;p&gt;People talk about &amp;#8220;good communication skills&amp;#8221; all the time.&lt;/p&gt;
&lt;p&gt;They say good communication skill is so important. They say it is so important, for just about everything. When you are hiring a new employee, one of the most important qualifications for candidates is excellent communication skills. When you are talking about relationships, again it is often the most important thing. Etc. Etc. Etc.&lt;/p&gt;
&lt;p&gt;And, a lot of people say that they are good communicators. At least, that&amp;#8217;s what they usually say in their resumes or during job interviews. When the personal relationship does not work out, they usually blame the other side for not having effectively communicated. When the project fails, they often say it is due to the lack of communications among the project participants. It&amp;#8217;s often a human nature to try to find faults first from others. If we are not communicating well, it must be your fault since I&amp;#8217;m a good communicator. (BTW, have you watched the move, Cool Hand Luke? &amp;#8220;What we&amp;#8217;ve got here is a failure to communicate&amp;#8230;&amp;#8221; says the Warden.)&lt;/p&gt;
&lt;p&gt;So, what exactly is &amp;#8220;good communication&amp;#8221;? Or, more fundamentally, what does &amp;#8220;communication&amp;#8221; mean to us, I mean to &amp;#8220;us people&amp;#8221;?&lt;/p&gt;
&lt;p&gt;It can mean many different things. A baby crying to get his Mom&amp;#8217;s attention is communication. A CEO of a company explaining her vision to the employees is a communication. Even mundane things like ordering takeout food are all communications. Home Sapience is really &amp;#8220;Homo Communicatos&amp;#8221;, so to speak. So, what is good communication and what is bad communication? I suppose, being eloquent is important for anyone to be able to effectively communicate. People presume, probably correctly, that being able to express oneself is one of the most essential &amp;#8220;prerequisites&amp;#8221; for good communication. In some cases, if you are in sales or broadcasting, for instance, or if you are a politician, etc., certain special skills may be needed to be considered a good communicator. &lt;/p&gt;
&lt;p&gt;But, for me, good communication is much more than that. For me, good communication skill does not merely mean one&amp;#8217;s ability to speak English well (or, whatever language he/she is speaking) or being good at reading and writing, etc.&lt;/p&gt;
&lt;p&gt;For me, good communication skill is more about honesty and integrity.&lt;/p&gt;
&lt;p&gt;Good communication skill means respecting other people.&lt;/p&gt;
&lt;p&gt;Good communication skill further requires knowing what to communicate and how, etc., but, in my view, that is really secondary. Being eloquent and having good command of English, etc., are all secondary, in my view.&lt;/p&gt;
&lt;p&gt;A dishonest person masterfully explaining his scheme is not a good communication, as far as I&amp;#8217;m concerned. Why do we have an Enron? Why do we have a Bernard Madoff? And, in general, why do people lie? &lt;/p&gt;
&lt;p&gt;For me, if you are not honest and if you do not have respect for other people, you will never be a good communicator. I see this time and again. Things as simple as responding to an email in a timely manner requires respect for other people. If you don&amp;#8217;t care, you don&amp;#8217;t care. A CEO tells the company about their bright future ahead with such eloquence, and then the next day he sells the company to the highest bidder leaving all the employees high and dry. Is that a good communication? &lt;/p&gt;
&lt;p&gt;Yesterday, I went to one of those &amp;#8220;freelancer&amp;#8221; Web sites and posted an ad for a &amp;#8220;long term&amp;#8221; position, which included my personal definition of &amp;#8220;good communication&amp;#8221;, essentially a condensed version of what I wrote above. Being new to that site, I &amp;#8220;invited&amp;#8221; many contractors, and I got &amp;#8220;proposals&amp;#8221; from equally many contractors. I had go through a few dozen contractors, and I personally responded to many proposals (even though I didn&amp;#8217;t have to) when I was not gonna interview them. All proposals stated they could do the work. But, how would I know? I selected a few of them, and invited them to &amp;#8220;trial&amp;#8221; projects (1~2 week paid positions). Then, funny thing happened. Only very few actually responded, and the rest just went silent. No responses to my email or to any of my messages. These are the people who claimed to be good communicators.&lt;/p&gt;
&lt;p&gt;It was extremely disappointing to me&amp;#8230;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Note: My blog post date generally has a &amp;#8220;lag&amp;#8221;. I often write something in a draft mode, and post it later. Often, days later.)&lt;/em&gt;&lt;/p&gt;</description><link>http://blog.harrywye.com/post/21031685528</link><guid>http://blog.harrywye.com/post/21031685528</guid><pubDate>Fri, 13 Apr 2012 10:44:00 -0700</pubDate></item><item><title>Do It Yourself Startup</title><description>&lt;p&gt;I&amp;#8217;m a DIY guy.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m a hard-core DIY guy.&lt;/p&gt;
&lt;p&gt;I like doing things myself because, well, I like doing things myself. People say, you have to delegate, you have to delegate, and you have to delegate as much as you can&amp;#8230; But, what for? I don&amp;#8217;t delegate my eating. I don&amp;#8217;t delegate my sleeping. And, I don&amp;#8217;t delegate my running or biking, or snowboarding, or just about anything. In fact, I don&amp;#8217;t delegate my living. I do a lot of things because I like doing those things. I sometimes do things I don&amp;#8217;t like to do but that&amp;#8217;s because I need to get paid or I&amp;#8217;m otherwise forced to do them in some way. Those things, I cannot usually delegate.&lt;/p&gt;
&lt;p&gt;I am starting a software startup because I like writing software. I like building things. If I delegate or outsource the most fun part of all, that is, creating software, why do I want to do this anyway? Just to make money? &lt;/p&gt;
&lt;p&gt;Clearly, this is just my personal view. A lot of &amp;#8220;tech entrepreneurs&amp;#8221;, who are not themselves hard core hackers, seem to &amp;#8220;successfully&amp;#8221; start and grow &amp;#8220;tech startups&amp;#8221; by outsourcing their product development. I have no problem with that. It&amp;#8217;s just not my cup of tea. If (that is, IF) I want to start a company by just hiring other people, I wouldn&amp;#8217;t necessarily do a software startup. I don&amp;#8217;t know. But, why would I limit myself? There are (or, should be) so many different fun things to do out there.&lt;/p&gt;
&lt;p&gt;Having said that, I&amp;#8217;ve been overwhelmed for the last few months. There are so many things to do, and even when you think/believe you can do this at your own pace because you do it for fun, you do have certain time limit. Eventually, you&amp;#8217;ll run out of money, and you&amp;#8217;ll become homeless, and you&amp;#8217;ll die of starvation or sickness. :) I didn&amp;#8217;t mean to be overly dramatic, but even a &amp;#8220;bootstrapper&amp;#8221; like myself has a finite &amp;#8220;runway&amp;#8221;. If nothing else, everyone has a finite number of years to live.&lt;/p&gt;
&lt;p&gt;So, does do-it-yourself really make sense?&lt;/p&gt;
&lt;p&gt;So, does starting a software startup in a DIY way really make sense?&lt;/p&gt;</description><link>http://blog.harrywye.com/post/20639399062</link><guid>http://blog.harrywye.com/post/20639399062</guid><pubDate>Fri, 06 Apr 2012 23:28:37 -0700</pubDate></item><item><title>Udacity</title><description>&lt;p&gt;Online education is a final frontier of the Internet, in my opinion. This is one area which has so much potential and which can affect so many people&amp;#8217;s lives all around the world, and yet this has been a relatively &amp;#8220;unsuccessful&amp;#8221; field. Khan Academy was a pioneer, which showed us &amp;#8220;the way&amp;#8221;, and there are now many startups these days tackling this difficult but potentially very rewarding problem. But, considering the enormous potential, I dare say that we haven&amp;#8217;t even started.&lt;/p&gt;
&lt;p&gt;Now there is one more online education startup, Udacity, as has been reported for the last few months. A well known computer scientist Sebastian Thrun &amp;#8220;expeirmented&amp;#8221; with an online artificial intelligence class last year, which was wildly &amp;#8220;successful&amp;#8221;. It was reported a few weeks ago that he would quit his tenure position at Stanford and that he was planning to start a new venture, an online university.&lt;/p&gt;
&lt;p&gt;I got this email last night (as a registrant of the last year&amp;#8217;s artificial intelligence class), which is reproduced here (presuming this is a public letter -&amp;gt; see below, &amp;#8220;help spread the word&amp;#8221;).&lt;/p&gt;
&lt;p&gt;This is an extremely ambitious idea, in my view, and yet think of the future where &amp;#8220;education is free&amp;#8221;. This is truly &lt;strong&gt;One Small Step for a Man, One Giant Leap for Mankind&amp;#8230;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hi Harry, &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thank you for your interest in AI Class and congratulations to those who successfully graduated. We were totally amazed that over 23,000 students made it all the way to the end in a Stanford graduate-level class.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Due to popular demand, we are teaching a follow-up class: AI for Robotics at &lt;a&gt;&lt;a href="http://www.udacity.com"&gt;www.udacity.com&lt;/a&gt;&lt;/a&gt;. Also due to popular demand, we now have a programming environment, so you can develop and test software. Our goal is to teach you to program a self-driving car in 7 weeks. This is a topic very close to my heart, and I am eager to share it with you. (This class builds on the concepts in ai-class, but ai-class is NOT required).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;We are also launching an introduction to programming class, where students will learn to program a search engine, without any prior knowledge of programming. This will be great for students new to computer science.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;We are doing this with a new university: Udacity. In the next months, we will offer an entire computer science curriculum through Udacity, and offer certification services so that an entire degree can be obtained online.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I would love to see you in class again! I would also love if you could help us spread the word and recruit students. Udacity is an experiment in democratizing education, in making free education available for everyone in the world. It can only succeed if you join us and help spread the word.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Sebastian&lt;/em&gt;&lt;/p&gt;</description><link>http://blog.harrywye.com/post/17043452214</link><guid>http://blog.harrywye.com/post/17043452214</guid><pubDate>Sat, 04 Feb 2012 11:13:00 -0800</pubDate></item><item><title>Are You Strongly Opinionated?</title><description>&lt;p&gt;There is one truth:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;People don&amp;#8217;t know what they don&amp;#8217;t know.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is generally true for everybody, at least everybody I know, including myself, at least to a certain degree. (If you think about it, this statement appears a bit of an oxymoron, ironically. It means that the above &amp;#8220;truth&amp;#8221; may not necessarily be true, because maybe I believe that statement is true only because I don&amp;#8217;t know what I don&amp;#8217;t know. :))&lt;/p&gt;
&lt;p&gt;This statement applies in many situations, although not necessarily in literal sense. You can come up with many counter-examples as to why this statement is not true. But, paraphrased, people don&amp;#8217;t know that they don&amp;#8217;t even know about what they don&amp;#8217;t know. That is generally true.&lt;/p&gt;
&lt;p&gt;I see a lot of such examples. Often, people have strong opinions on certain things based on what they know, not knowing &amp;#8220;what they don&amp;#8217;t know&amp;#8221;. They might, just might, have different opinions if they knew what they didn&amp;#8217;t know. But, of course, they don&amp;#8217;t know what they don&amp;#8217;t know. And, they believe that what they believe is right is right. In all likelihood, they could be wrong, but they don&amp;#8217;t know that because they don&amp;#8217;t know what they don&amp;#8217;t know. And, often people tend to have very strong beliefs and/or opinions on certain things without knowing that there might be more that need to be considered because what they don&amp;#8217;t know does not exist to people who do not know what they don&amp;#8217;t know.&lt;/p&gt;
&lt;p&gt;I sometimes run into people who are strongly opinionated on many things. Often, it&amp;#8217;s rather hard to tell what they don&amp;#8217;t know although we know that they don&amp;#8217;t know what they don&amp;#8217;t know. During conversations, or discussions or arguments, with them, these people tend to want to shift, to us, the burden of proving that they are wrong. They are always right until they are proven wrong. But, they don&amp;#8217;t know what they don&amp;#8217;t know, and further it&amp;#8217;s even harder for us to figure out what they don&amp;#8217;t know. It is generally rather difficult to convince them that there is even a possibility that they might be wrong, because they know everything except what they don&amp;#8217;t know (which they don&amp;#8217;t know that they don&amp;#8217;t know). &lt;/p&gt;
&lt;p&gt;(BTW, English is not my first language, and I&amp;#8217;m not sure if these convoluted sentences will make sense to anyone. :))&lt;/p&gt;
&lt;p&gt;Strongly opinionated people are generally not open for discussion (although they say they are open for discussion). More strongly opinionated people tend to be less open-minded, in general. How can they be wrong when they are so right? They seem to think, things are so simple and easy and they have this clear answer which they believe everybody should agree&amp;#8230; How can they be wrong? I see this type of examples time and again. People don&amp;#8217;t know what they don&amp;#8217;t know. The world is full of people who think they are so right, often, just about everything. But, think about this: The less you know, the more likely you will think you are absolutely right (because you think you have all the information there is).&lt;/p&gt;
&lt;p&gt;The world is full of things you don&amp;#8217;t know. Next time when you feel strongly about something, ask yourself, do I have all the information? How will my opinion change if I know what I don&amp;#8217;t know (which I don&amp;#8217;t know that I don&amp;#8217;t know)? How will I think differently if I just realize at this moment that I don&amp;#8217;t know what I don&amp;#8217;t know?&lt;/p&gt;
&lt;p&gt;Another random thought of the night. :) &lt;/p&gt;</description><link>http://blog.harrywye.com/post/17021541402</link><guid>http://blog.harrywye.com/post/17021541402</guid><pubDate>Fri, 03 Feb 2012 23:56:13 -0800</pubDate></item><item><title>Co-Founder Pitches</title><description>&lt;p&gt;I went to one of those &amp;#8220;cofounder recruiting events&amp;#8221; last night. It was my first time, and I thought it was very interesting. Finding the right person(s) for your founding team can be a challenging task, and events like this seem to provide some channels for connecting co-founders.&lt;/p&gt;
&lt;p&gt;There were about ten teams who pitched at last night&amp;#8217;s event, &lt;a href="http://www.meetup.com/Cofounder-Club/events/47365512/"&gt;An Evening of Entrepreneurial Spotlights&lt;/a&gt;. They were all superb, I thought. (The only &amp;#8220;criticism&amp;#8221; I can think of regarding some of them is that some teams didn&amp;#8217;t seem to know, or didn&amp;#8217;t clearly articulate, what they were looking for in new co-founders. Some teams, on the other hand, seemed to have too narrow and too specific criteria for their selection, which would make it probably much harder to find quality people meeting those criteria.)&lt;/p&gt;
&lt;p&gt;If you are thinking about joining a startup team (or, a startup person) as a co-founder, I think there are a few things you need to consider:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Idea&lt;/strong&gt;: Do you like the idea? Do you think it&amp;#8217;s feasible? Do you think it&amp;#8217;s a viable business idea? Do the current founders know what they are talking about?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vision&lt;/strong&gt;: Product ideas can change over time (aka, &amp;#8220;pivots&amp;#8221;), but the vision should remain constant. Do you like the company&amp;#8217;s vision? Do they have a vision?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team&lt;/strong&gt;: Do you think the existing team has the credential to make this happen? Will you be able to get along with the current founders? Do, or will, the team have proper &amp;#8220;composition&amp;#8221; of different skill sets?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fit&lt;/strong&gt;: Will you be a good addition to the team? Your skill set should be complementary to those of the current co-founders&amp;#8217;, and yet you should be able to see eye to eye with them (on many things).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pitch&lt;/strong&gt;: Pitch itself, in events like this, is not that important. But, if the current co-founders are &amp;#8220;biz people&amp;#8221;, then the pitch should be held at a much higher standard. If the CEO or CMO cannot pitch, then the company&amp;#8217;s chance of success will be significantly lower. &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Anyways, just random thoughts of the night&amp;#8230;. :)&lt;/p&gt;</description><link>http://blog.harrywye.com/post/16913224332</link><guid>http://blog.harrywye.com/post/16913224332</guid><pubDate>Thu, 02 Feb 2012 00:10:00 -0800</pubDate></item><item><title>My first node.js program</title><description>&lt;p&gt;We often use the term &amp;#8220;server side javascript&amp;#8221; (as opposed to what?). This is an expression rather unique to the JavaScript language. No other (major) programming language (that I know of) has this distinction. Sometimes we use phrases like server side Java vs. client side Java, etc., but their meanings are slightly different.&lt;/p&gt;
&lt;p&gt;In the case of JavaScript, its main runtime environment has been Web browser. People rarely use (or, rarely used) JavaScript as a &amp;#8220;real programming language&amp;#8221;. The term &amp;#8220;server side javascript&amp;#8221; really means using JavaScript as a real programming language. (I hope other JavaScript programmers do not find this statement too offensive. :)) Although due to common use of the language in the Web environment we are mostly stuck with this terminology of the client (e.g., Web browser) vs. the server (e.g., Web server), the &amp;#8220;server side javascript&amp;#8221; is not limited to writing any particular server programs, etc.&lt;/p&gt;
&lt;p&gt;People may or may not remember this, but the &amp;#8220;server side javascript&amp;#8221; has been around as long as the JavaScript language itself. Netscape, who invented JavaScript, had this server side version, which never really took off. Microsoft tried jscript (and, vbscript) as a &amp;#8220;shell language&amp;#8221; for Windows for some time, which didn&amp;#8217;t gain much traction. And so forth&amp;#8230; (This is a good example of &amp;#8220;server side javascript&amp;#8221; which may not have anything to do with &amp;#8220;servers&amp;#8221;.) BTW, one of the weakest points of Windows as an operating system compared to Unix/Linux, etc., has been lack of powerful scripting environments. If you are a Unix/Linux user, then you know how important Shell scripting is. I remember Microsoft recently came out with &amp;#8220;Power Shell&amp;#8221;, but I&amp;#8217;m not sure what happened to it.  &lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been using JavaScript (on and off) for over a decade, probably over 15 years now, but I never get used to this language. My programming languages of choice have always been so-called &amp;#8220;C style languages&amp;#8221; such as C++ or Java, etc., and JavaScript has very subtle and yet significant differences in terms of the grammar (e.g., scoping, in particular &amp;#8220;this&amp;#8221; variable, and inheritance vs prototype, etc.), and I&amp;#8217;ve never felt comfortable with programming in JavaScript.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been hearing about this &amp;#8220;node.js&amp;#8221; for some time. This is a new kind of &amp;#8220;server side javascript&amp;#8221;. (Just to be clear, we sometimes refer to a programming language + runtime environment/core libraries, etc. as a programming language. Node.js is not a new language in a literal sense.) This is a brilliant idea. Node.js includes support for &amp;#8220;asynchronous programming&amp;#8221;, among other things. Asynchronous, or event driven, programming is very natural in UI (e.g., Web browser), but it has been relatively difficult to do on the server side, or, in general. All general-purpose programming languages have such support (e.g., &amp;#8220;callbacks&amp;#8221; through function pointers, delegates, interfaces, etc.), but it is not generally easy to do full-blown asynchronous/event-driven programming. (And, in many cases, asynch is not desired or needed.) If you look at a typical call stack (e.g., in a debugger), it generally includes dozens of method calls, and they are all synchronous calls. Think of the potential complexity of the system if each of these method or function calls is an async call, and every call requires a callback, etc. I was thinking about creating some kind of asynchronous &amp;#8220;middleware&amp;#8221; layer on top of Java, but that appeared to be a huge undertaking, especially, for one programmer. &lt;/p&gt;
&lt;p&gt;This morning, for no reason at all, I went to the node.js Web site: &lt;a href="http://nodejs.org/"&gt;&lt;a href="http://nodejs.org/"&gt;http://nodejs.org/&lt;/a&gt;&lt;/a&gt;. I just wanted to play around with node.js.&lt;/p&gt;
&lt;p&gt;As in any other programming language, the first thing you do is set up a &amp;#8220;development environment&amp;#8221; (which generally includes installing a compiler, debugger, etc.), and write a &amp;#8220;Hello World&amp;#8221; program. I did. I actually did a little bit more than that. I wanted to create an index.html file for all HTML files in a given directory. (Note that, in &amp;#8220;client side&amp;#8221; javascript, there is no concept of file system, because its runtime environment is inside a Web browser.) After a few trials and errors, and with the help of the online API doc, I managed to accomplish what I wanted. This is probably not the best program (as I learn more about node.js, I&amp;#8217;ll probably learn a better way to do this), but it&amp;#8217;s my first node.js program, and it works! (Sort of).&lt;/p&gt;
&lt;p&gt;Just for the record, I&amp;#8217;m including my sample code here. It took me a couple of hours from installing node.js on my machine to making this code work. Learning a new language is always fun. :)&lt;/p&gt;
&lt;p&gt;(Unfortunately, my code within the &amp;lt;pre&amp;gt; tag breaks the HTML in Tumblr for some reason. Well, I&amp;#8217;ll figure it out how to do this later. Anyways, if you are reading this, and you are a programmer, then give node.js a try. It looks very promising to me.)&lt;/p&gt;
&lt;p&gt;PS: Ok, Tumblr officially sucks. ;) I had to use Scribble Memo (a pastebin app): &lt;a&gt;&lt;a href="http://k.fm.gs/Xwiv"&gt;http://k.fm.gs/Xwiv&lt;/a&gt;&lt;/a&gt;.&lt;/p&gt;</description><link>http://blog.harrywye.com/post/16788108504</link><guid>http://blog.harrywye.com/post/16788108504</guid><pubDate>Mon, 30 Jan 2012 16:19:00 -0800</pubDate></item><item><title>Nine bulding blocks of a business model</title><description>&lt;p&gt;From &amp;#8220;Creating Startup Success 101&amp;#8221; by Steve Blank:&lt;/p&gt;
&lt;p&gt;&lt;a&gt;&lt;a href="http://www.slideshare.net/sblank/successful-entrepreneurship-1"&gt;http://www.slideshare.net/sblank/successful-entrepreneurship-1&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Nine bulding blocks of a business model&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Customer segments:&lt;/strong&gt; Which customers and users are you serving? Which jobs do they really want to get done?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Value propositions: &lt;/strong&gt;What are you offering them? What is that getting done for them? Do they care?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Channels:&lt;/strong&gt; How does each customer segment want to be reached? Through which interaction points?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customer relationships:&lt;/strong&gt; What relationships are you establishing with each segment? Personal? automated? acquisitive? retentive?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Revenue streams:&lt;/strong&gt; What are customers really willing to pay for? How? Are you generating transactional or recurring revenues?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key resources:&lt;/strong&gt; Which resources underpin your business model? Which assets are essential?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key activities: &lt;/strong&gt; Which activities do you need to perform well in your business model? What is crucial?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key partners:&lt;/strong&gt; Which partners and suppliers leverage your model? Who do you need to rely on?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost structure:&lt;/strong&gt; What is the resulting cost structure? Which key elements drive your costs?&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;(Note: A business model diagram is shown on Slide 46. Also, a PDF version of Business Model Canvas is available &lt;a href="http://www.businessmodelgeneration.com/downloads/business_model_canvas_poster.pdf"&gt;here&lt;/a&gt; on the businessmodelgeneration.com Web site.) &lt;/p&gt;</description><link>http://blog.harrywye.com/post/16754014081</link><guid>http://blog.harrywye.com/post/16754014081</guid><pubDate>Mon, 30 Jan 2012 01:11:00 -0800</pubDate></item><item><title>“The Customer Development Model, Past, Present,...</title><description>&lt;iframe src="http://www.slideshare.net/slideshow/embed_code/2542752" width="400" height="334" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;“The Customer Development Model, Past, Present, Future” by Steve Blank&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Men wanted for hazardous journey&lt;/strong&gt; - London Times, Sunday, August 30, 1912&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Men wanted for hazardous journey. Small wages, bitter cold, long months of complete darkness, constant danger, safe return doubtful. Honour and recognition in case of success.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Also good slide by Steve Blank: &lt;a href="http://www.slideshare.net/venturehacks/customer-development-methodology-presentation"&gt;&lt;a href="http://www.slideshare.net/venturehacks/customer-development-methodology-presentation"&gt;http://www.slideshare.net/venturehacks/customer-development-methodology-presentation&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4 Steps of Customer Development&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Customer Discovery - Achieve problem/solution fit&lt;/li&gt;
&lt;li&gt;Customer Validation - Achieve product/market fit&lt;/li&gt;
&lt;li&gt;Customer Creation - Drive demand&lt;/li&gt;
&lt;li&gt;Company Building - Scale the company&lt;/li&gt;
&lt;/ol&gt;</description><link>http://blog.harrywye.com/post/16753803513</link><guid>http://blog.harrywye.com/post/16753803513</guid><pubDate>Mon, 30 Jan 2012 00:58:00 -0800</pubDate></item></channel></rss>
