<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-4837083515732949131</atom:id><lastBuildDate>Mon, 17 Sep 2018 03:47:23 +0000</lastBuildDate><category>IDE Rails RoR Linux</category><category>blogging ideas</category><category>delicious tag roll</category><category>investing china india stocks</category><category>marketing open source positioning collateral</category><category>open source pricing</category><category>positioning</category><category>product management marketing startup venture</category><category>rails facebook virality scaling</category><category>rss reader ranking</category><category>ruby rails facebook application resources</category><category>signup forms ruby rails lazy registration gradual engagement</category><category>simplicity UI social</category><category>tokyo cabinet ruby</category><title>Beta Blog</title><description>product design,  software, and investing.</description><link>http://blog.henriquez.net/</link><managingEditor>noreply@blogger.com (Logan Henriquez)</managingEditor><generator>Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-7541337220143369559</guid><pubDate>Wed, 20 Jun 2012 05:53:00 +0000</pubDate><atom:updated>2012-06-19T22:56:31.295-07:00</atom:updated><title>CoffeeScript, Uglifier, and constructor.name</title><description>The past six month&#39;s I&#39;ve become a CoffeeScript convert. &amp;nbsp;For the most part adopting CoffeeScript has been an easier one than I anticipated. &amp;nbsp;Pushing my first app to production today, I found an interesting bug that I thought I&#39;d document here in case others are searching for a solution.&lt;br /&gt;&lt;br /&gt;If you&#39;re using uglifier in addition to CoffeeScript, be careful about also using constructor.name. &amp;nbsp;Constructor.name is a useful way to determine the name of the class that called a function in the case where you are using inheritance. &amp;nbsp;However constructor.name&#39;s response will change if you&#39;re using uglifier and it goes and shortens the name of the calling class/function. &amp;nbsp;The solution - don&#39;t use uglifier or use the --no-mangle option.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Keywords: coffeescript, rails, uglifier, this.constructor.name, heroku</description><link>http://blog.henriquez.net/2012/06/coffeescript-uglifier-and.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-6597050304814540699</guid><pubDate>Wed, 04 Nov 2009 06:22:00 +0000</pubDate><atom:updated>2009-11-03T23:34:37.945-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">simplicity UI social</category><title>Simple is a Feature Too</title><description>Last week we ran a round of usability tests on &lt;a href=&quot;http://newsforwhatyoudo.com/groups/246b84ca419611de8c1e001aa018681c/news&quot;&gt;Newsforwhatyoudo.com&lt;/a&gt;.  Random folks in a coffee shop were invited to try out the app for the first time in exchange for a $10 coffee gift card.  They were given a few common tasks to complete, but no other direction.  We sat next to them watching what they did.  When you see normal humans (i.e. people who don&#39;t live and breath social media and web development) use your app its like opening a door into another universe.  A universe where all those bells, whistles, and knobs you wanted for your own usage becomes a source of confusion.  Steve Krug, author of Don&#39;t Make Me Think! describes a typical user viewing a web page as &quot;driving by a billboard at 60 mph&quot;.  Its an apt description of how users used our application.&lt;br /&gt;&lt;br /&gt;The impact on our roadmap was interesting.  Some features are just going away.  Others are being combined, automated, or put under an &quot;advanced&quot; tab to reduce visual distraction.  The two most important things people wanted were simplicity and social features.  Simple doesn&#39;t imply an absence of function - in many cases it will require more functionality to make the complex simple.  When reading the news, users don&#39;t want to use an application, they want to read the news and interact with their colleagues and friends.  A successful application is one that is nearly invisible, while bringing content and social interaction to the fore.&lt;br /&gt;&lt;br /&gt;The experience reinforced the need to regularly look at the UI and say &quot;What can we remove, combine, or automate or hide?&quot;  Maybe once every 4 sprints, plan a &quot;simplicity&quot; sprint where the only objective is simplifying the user experience.  Testing regularly with users helps, but ultimately the drive towards ease of use must come from the developers themselves.  Facebook provides a good example for this process.  On one hand Facebook and its thousands of third party developers have added mountains of new functionality.   At the same time they&#39;re constantly simplifying the experience to make sure that the site doesn&#39;t become the next MySpace.  Considering the UI experience, there&#39;s no better model than Google, which reduces the infinite complexity of the Internet down to one list of links given a few keywords.&lt;br /&gt;&lt;br /&gt;On the social front we&#39;re planning Facebook integration and a new take on the collaborative reading experience.  I think the best feature idea in our brainstorming exercise came from pushing hard on simplicity and social interaction as goals.  What if we really examined every assumption about what a feed reader is and assumed the user only cared about content and social interaction?  Could we design an highly relevant news experience if the user did nothing but read content and interact with their friends?  &lt;br /&gt;&lt;br /&gt;Yes we can.</description><link>http://blog.henriquez.net/2009/11/simple-is-feature-too.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-6802765851634403134</guid><pubDate>Fri, 28 Aug 2009 18:50:00 +0000</pubDate><atom:updated>2009-10-19T10:34:57.750-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">signup forms ruby rails lazy registration gradual engagement</category><title>Kill Your Signup Form with Rails</title><description>&lt;div style=&quot;font-family: arial; font-size: 105%;&quot;&gt;&lt;br /&gt;&lt;h3&gt;Nobody likes Signup Forms&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Even though the &lt;a href=&quot;http://www.alistapart.com/articles/signupforms&quot;&gt;gradual engagement meme&lt;/a&gt; has been around for a while, and everyone just hates signup forms, they just seem to keep popping up like a bad habit.  My site, &lt;a href=&quot;http://newsforwhatyoudo.com/groups/643ddee01cd911deaef1001aa018681c/news&quot;&gt;Newsforwhatyoudo.com&lt;/a&gt; was one of the guilty parties.  We saw users coming back to the site repeatedly, but not signing up.  The percentage that looked at the signup form and then bolted was uncomfortably high.  It was time to kill the signup form.  This blog post documents how we implemented gradual engagement using Ruby on Rails and restful authentication. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Gradual Engagement Principles&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Here are some principles I&#39;ve gleaned from learning about gradual engagement.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Make sure the user sees a direct benefit to every sign up step&lt;/span&gt;. When you do ask for information, do so only after 1) the site has demonstrated user value, 2) the user has a vested interest in the site, demonstrated by having customized some aspect of its behavior, and 3) you provide a carrot that justifies providing signup information.  &lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Set reasonable defaults&lt;/span&gt; automatically and let the user customize them later.  For example, in our original join workflow, Newsforwhatyoudo asked users to add subscriptions and topics as part of the process of joining a group.  Instead we now automatically give users the most popular subscriptions and let them change these later.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Security only when its needed&lt;/span&gt;.  Forcing a user to establish a username and password up front may be necessary if you&#39;re developing a banking site where all the information being displayed to a user is confidential, or the user&#39;s actions have financial impact.  Most web sites don&#39;t have this issue.  Even E-commerce sites can let users browse, search, compare and price without any security - its not until the credit card information is required to make a purchase that formal signup is required. For most sites anti-spam is a bigger issue, and there too, anti-spam measures like captchas and email confirmations should be used only &lt;i&gt;after&lt;/i&gt; the user does something that requires their use.  I emphasize the word &quot;after&quot;, because if you wait until after a user has filled out a comment form, then present the confirmation, you&#39;re more likely to have the user perform the confirmation because they&#39;ve committed energy to filling out the comment.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Keeping out the spammers&lt;br /&gt;&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;The most time consuming part of implementing gradual engagement was figuring out how to keep the spam bots out.  At newsforwhatyoudo.com our strategy is two tiered.  Actions that change state - particularly those that submit forms - require the client to run javascript.  This eliminates most spam bots.  If we detect a client that&#39;s not running javascript, we throw up a captcha.  Most users never see the captcha and can just submit the form.  The captcha eliminates bots that can run javascript.  None of this helps if someone designs a bot specifically to attack our site, but then again neither did our old process of asking for user credentials and showing a captcha, so we&#39;ve gained usability without losing anything.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Here&#39;s an example with a &quot;email support&quot; form.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre class=&quot;ruby&quot;&gt;   &lt;span class=&quot;punct&quot;&gt;&amp;lt;%&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;form_for&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;:ask_support&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;:url&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:controller&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;home&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;,&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;:action&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;email_support&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;}&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;-%&amp;gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&lt;br /&gt;   &lt;br /&gt;   &amp;lt;p&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&amp;lt;%=&lt;/span&gt;&lt;span class=&quot;string&quot;&gt; label_tag &#39;Your Email *&#39; %&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;   &amp;lt;%&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;text_field&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;:email&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;lt;/p&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&amp;lt;%=&lt;/span&gt;&lt;span class=&quot;string&quot;&gt; label_tag &quot;Email message *&quot; %&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;   &amp;lt;%&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;text_area&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;:message&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;lt;/p&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;punct&quot;&gt;&amp;lt;%=&lt;/span&gt;&lt;span class=&quot;string&quot;&gt; render :partial &lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;shared/check_for_bots&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;p&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;=&quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&quot;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;button&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class=&quot;punct&quot;&gt;&amp;lt;%&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;-%&amp;gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;The &lt;span style=&quot;font-weight:bold;&quot;&gt;check_for_bots&lt;/span&gt; partial is added to any form, link, or button that changes state.   This partial looks like this:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;ruby&quot;&gt;   &lt;span class=&quot;punct&quot;&gt;&amp;lt;%&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;attribute&quot;&gt;@show_captcha&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;[&#39;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;RAILS_ENV&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;]&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&lt;br /&gt;     &amp;lt;p style=&quot;padding-top:10px&quot;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;punct&quot;&gt;&amp;lt;%=&lt;/span&gt;&lt;span class=&quot;string&quot;&gt; label_tag &quot;Help us reduce spam by filling in the below&quot; -%&amp;gt;&lt;br /&gt;       &amp;lt;%&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;recaptcha_tags&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;lt;br /&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&amp;lt;!--&lt;/span&gt; &lt;span class=&quot;attribute&quot;&gt;@human&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;by&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;were showing captcha --&amp;gt;&lt;br /&gt;    &amp;lt;/p&amp;gt; &lt;br /&gt;   &amp;lt;% elsif ENV[&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;RAILS_ENV&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;] != &lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt; %&amp;gt;&lt;br /&gt;     &amp;lt;input type=&quot;hidden&quot; name=&quot;turing_a&quot; id=&quot;turing_a&quot; value=&quot;Please do not alter&quot; /&amp;gt;&lt;br /&gt;    &amp;lt;%= javascript_include_tag &lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;turing_a&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt; %&amp;gt;&lt;br /&gt;  &amp;lt;% end %&amp;gt; &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;check_for_bots adds a hidden input field to post and put requests.  The &quot;turing_a&quot; javascript file runs when the form loads and returns a value in the hidden input field based on how long the user viewed the form before hitting submit.  If the length of time is below a threshold or incorrect, we reject the input and instead show a captcha.  After that the standard captcha acceptance routine applies.  The javascript we use is adapted from &lt;a href=&quot;http://gatekiller.co.uk/Post/JavaScript_Captcha&quot;&gt;Stephen Hill&#39;s Javascript Captcha&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;ruby&quot;&gt;&lt;span class=&quot;string&quot;&gt;// stop bots that cant run js or are too quick to submit the form&lt;br /&gt;// check hidden value for a reasonable interval: interval in seconds&lt;/span&gt;&lt;br /&gt;var turingA = function() {&lt;br /&gt;      if (document.getElementById(&quot;turing_a&quot;)) {&lt;br /&gt;              a = document.getElementById(&quot;turing_a&quot;);&lt;br /&gt;              if (isNaN(a.value) == true) {&lt;br /&gt;                      a.value = 0;&lt;br /&gt;              } else {&lt;br /&gt;                      a.value = parseInt(a.value) + 1;&lt;br /&gt;              }&lt;br /&gt;      }&lt;br /&gt;      setTimeout(&quot;turingA()&quot;, 1000);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;turingA();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Back on the server side we need to validate the hidden input field.  If validation fails, we render a captcha.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;ruby&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;def &lt;/span&gt;&lt;span class=&quot;method&quot;&gt;email_support&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;ident&quot;&gt;check_for_bots&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;attribute&quot;&gt;@popular_groups&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;Group&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;most_popular&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;keyword&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;MissingFields&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;unless&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:ask_support&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;]&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;attribute&quot;&gt;@ask_support&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;AskSupport&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:ask_support&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:email&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:ask_support&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:message&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;]&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;keyword&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;MightBeBot&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;@human&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;keyword&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;MissingFields&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;attribute&quot;&gt;@ask_support&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;blank?&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;attribute&quot;&gt;@ask_support&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;blank?&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;constant&quot;&gt;Mailer&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;deliver_email_support&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:ask_support&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:email&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;],&lt;/span&gt;&lt;br /&gt;                               &lt;span class=&quot;punct&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;about page&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&quot;,&lt;/span&gt;&lt;br /&gt;                               &lt;span class=&quot;ident&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:ask_support&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:message&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;)&lt;/span&gt;                              &lt;br /&gt;  &lt;span class=&quot;ident&quot;&gt;flash&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:success&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;Got your request, we&#39;ll be in touch&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&quot;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;ident&quot;&gt;redirect_back_or_default&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;groups_path&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;rescue&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;MissingFields&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;ident&quot;&gt;flash&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:error&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;Couldn&#39;t process your request, make sure both fields are filled in.&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&quot;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;ident&quot;&gt;render&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;:action&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;about&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;rescue&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;MightBeBot&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;attribute&quot;&gt;@show_captcha&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;true&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;ident&quot;&gt;flash&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:error&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;Your browser must be running javascript, and/or you must enter the correct words below&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&quot;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;ident&quot;&gt;render&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;:action&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;about&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt; &lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;The check_for_bots method is added to any method we need to protect.  It sets @human which the caller can check as part of its input validation.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;ruby&quot;&gt;  &lt;span class=&quot;comment&quot;&gt;# Used as before filter on POST and PUT actions to determine&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;comment&quot;&gt;# whether the requestor is likely to be human.  Requestor needs to be able to execute .js&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;comment&quot;&gt;# and wait at least 4 seconds before submitting the form, or this fails and returns false.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;comment&quot;&gt;# This method doesn&#39;t require the user to do anything, other than have a js capable browser&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;comment&quot;&gt;# Note when testing in rails this method will (and should) always fail.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;def &lt;/span&gt;&lt;span class=&quot;method&quot;&gt;check_for_bots&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;current_user&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;current_user&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;verified&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;# already showed captcha and user passed&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;attribute&quot;&gt;@human&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;true&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;comment&quot;&gt;# verify_recaptcha is true if in test mode or success, false if fails.&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;comment&quot;&gt;# verify_recaptcha may only be called once per action and get a valid result!&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:recaptcha_challenge_field&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;]&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;attribute&quot;&gt;@human&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;verify_recaptcha&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;current_user&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;constant&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;current_user&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;verified&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;# for other actions set it here.&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;attribute&quot;&gt;@verified&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;true&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;# for NewsC#more there is no current user yet, so tell auto_create_user&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;comment&quot;&gt;# to set status&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;keyword&quot;&gt;elsif&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;:turing_a&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;to_i&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;3&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;# 3 second delay&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;attribute&quot;&gt;@human&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;true&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;attribute&quot;&gt;@human&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;false&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Auto creating users&lt;/h3&gt;&lt;p&gt;&lt;br /&gt;The next part of getting rid of the signup form is to automatically create user objects, sessions, and remember-me cookies.  This is what our old signup process did.  We encapsulate this process into a method and have it run whenever an un-authenticated user tries to perform an action that requires a user object/session.   We are using restful-authentication, and pulling out the relevant lines of code from there and from sessions controller yields this handy method:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre class=&quot;ruby&quot;&gt;  &lt;span class=&quot;comment&quot;&gt;# Create user object if doesn&#39;t already exist.  Set cookie.   &lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;def &lt;/span&gt;&lt;span class=&quot;method&quot;&gt;auto_create_user!&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;ident&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;auto_create_user_object&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;# doesn&#39;t save to db as handle remember cookie does.&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;ident&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;verified&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;attribute&quot;&gt;@verified&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;# user passed captcha, prevents showing captcha again&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;constant&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;current_user&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;current_user&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;# !! now logged in (sets session)&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;ident&quot;&gt;handle_remember_cookie!&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;# sets cookie and saves user so they can get back after session is over&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;comment&quot;&gt;# cookie set to 5 years.., the above uses @current_user set in previous line.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Note that since the user doesn&#39;t have the ability to &quot;log in&quot;, you&#39;ll want to set your remember-me cookie time span to an appropriately long time.  This can be changed in vendor/plugins/restful-authentication/lib/authentication/by_cookie_token.rb     Once the user object is auto-created, the user can return to their accounts page and add a login and password if they want to use their account on another computer.  We auto-generate a random username for display purposes, letting the user customize that later if they want to.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;That&#39;s it!  The old signup form still works, but is no longer necessary to use all the site&#39;s functionality.   We&#39;ve been in production for about two weeks now with zero spam infiltration, but time will tell.   If anyone has better ways to do any of this stuff, give some comment love below.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Resources:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://gatekiller.co.uk/Post/JavaScript_Captcha&quot;&gt;JavaScript_Captcha&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://stackoverflow.com/questions/8472/practical-non-image-based-captcha-approaches&quot;&gt; practical-non-image-based-captcha-approaches &lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://stackoverflow.com/questions/918003/how-would-one-implement-this-sort-of-gradual-engagement-lazy-registration-in-rail&quot;&gt;http://stackoverflow.com/questions/918003/how-would-one-implement-this-sort-of-gradual-engagement-lazy-registration-in-rail&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.90percentofeverything.com/2009/03/16/signup-forms-must-die-heres-how-we-killed-ours/&quot;&gt;http://www.90percentofeverything.com/2009/03/16/signup-forms-must-die-heres-how-we-killed-ours/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.alistapart.com/articles/signupforms/&quot;&gt;http://www.alistapart.com/articles/signupforms/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://ajaxpatterns.org/Lazy_Registration&quot;&gt;http://ajaxpatterns.org/Lazy_Registration&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://docs.jquery.com/Tutorials:Safer_Contact_Forms_Without_CAPTCHAs&quot;&gt;Tutorials:Safer_Contact_Forms_Without_CAPTCHAs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://blog.henriquez.net/2009/08/kill-your-signup-form-with-rails.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>7</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-378291958180258145</guid><pubDate>Mon, 17 Aug 2009 17:59:00 +0000</pubDate><atom:updated>2009-08-17T13:10:26.119-07:00</atom:updated><title>China &amp; Brazil Stock Markets - Fading Fad or Growing Opportunity?</title><description>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_z1stogGfysI/SomxVH37acI/AAAAAAAAAGg/SwqT-bD1rik/s1600-h/Picture+2.png&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 279px;&quot; src=&quot;http://3.bp.blogspot.com/_z1stogGfysI/SomxVH37acI/AAAAAAAAAGg/SwqT-bD1rik/s400/Picture+2.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5371019007065024962&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-family: arial; font-size: 110%;&quot;&gt;This morning I took a look at the relative market performance of the Chinese, Brazilian, and US stock markets over the last 5 years. &lt;a href=&quot;http://www.google.com/finance?chdnp=1&amp;amp;chdd=1&amp;amp;chds=1&amp;amp;chdv=1&amp;amp;chvs=maximized&amp;amp;chdeh=0&amp;amp;chdet=1250539200000&amp;amp;chddm=493442&amp;amp;chls=IntervalBasedLine&amp;amp;cmpto=NYSE:SPY;NYSE:FXI&amp;amp;cmptzos=-18000;-18000&amp;amp;q=NYSE:EWZ&amp;amp;ntsp=0&quot;&gt;(link to dynamic chart)&lt;/a&gt;.  Looking at their return over both boom and bust periods and correlating it to fundamentals was instructive.&lt;br /&gt;&lt;br /&gt;In the 2001/2 recession these markets were either small or non-existent from an international investment perspective. This last year was the first recessionary period that these markets have weathered as &quot;major&quot; markets.  If you invested in China or Brazil in 2008 or 2007 your investment is lying bleeding and tattered on the ground, with 60-80% declines.  On the other hand, if you invested early in the cycle - say in early 2005, you&#39;re up around 150%.&lt;br /&gt;&lt;br /&gt;Looking at fundamentals, the Chinese economy (GDP) grew at &lt;a href=&quot;http://blogs.wsj.com/chinajournal/2009/06/23/chinese-stats-official-says-economic-growth-was-slower-than-many-thought-last-year/&quot;&gt;6% Y/Y over the last 1 year recessionary period&lt;/a&gt; and closer to 9% Y/Y over the last 5 years.  US GDP in contrast grew at around 2.4% annually over the last decade.  So its no surprise that the Chinese stock market has dramatically outperformed the US market over the last 5 years.  The Brazilian economy grew &lt;a href=&quot;http://www.tradingeconomics.com/Economics/GDP-Growth.aspx?Symbol=BRL&quot;&gt;at around 4.7% over the last 5 years&lt;/a&gt; and its stock market similarly out performs the US market over that period.&lt;br /&gt;&lt;br /&gt;The data supports the idea that these growth economies are better long-term investment opportunities than the US market.  If your investment horizon is say 10 years and you don&#39;t like playing momentum, this might be a good time to invest since both China and Brazil are down dramatically from their highs.  On the other hand, these markets have not decoupled from the US market - if the US market moves down 10%, these markets will probably move down 30 or 40%.  If you believe the US market will take a second dip in the near term, the best time to invest may be 6-12 months in the future.&lt;br /&gt;&lt;/div&gt;</description><link>http://blog.henriquez.net/2009/08/this-morning-i-took-look-at-relative.html</link><author>noreply@blogger.com (Logan Henriquez)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_z1stogGfysI/SomxVH37acI/AAAAAAAAAGg/SwqT-bD1rik/s72-c/Picture+2.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-4440863509356234918</guid><pubDate>Wed, 29 Jul 2009 06:34:00 +0000</pubDate><atom:updated>2009-08-28T12:36:54.771-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tokyo cabinet ruby</category><title>Tokyo Cabinet and Me</title><description>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_z1stogGfysI/SnAG58O-ohI/AAAAAAAAAGY/Y2zh6isUlho/s1600-h/Picture+4.png&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 100px;&quot; src=&quot;http://4.bp.blogspot.com/_z1stogGfysI/SnAG58O-ohI/AAAAAAAAAGY/Y2zh6isUlho/s320/Picture+4.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5363794748689523218&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There&#39;s been &lt;a href=&quot;http://jmettraux.wordpress.com/2009/07/28/edo-cabinet-rubykaigi2009/&quot;&gt;lots of talk&lt;/a&gt; about Tokyo Cabinet (TC) lately so I had to get my hands on this shiny new toy.  The appeal is that key value stores like TC offer better performance than traditional RDBMs, and are also dramatically easier to setup.  They&#39;re not right for every project, but I had a project come up that seemed like a good fit.  The project was a background task that interacted with the Twitter API and had to keep track of a large (millions) number of key-value combinations.  Fast existence tests for keys and basic get/set/iterate methods was all that was needed. Essentially what I wanted was a persistent Ruby Hash.&lt;br /&gt;&lt;br /&gt;I looked at &lt;a href=&quot;http://rufus.rubyforge.org/rufus-tokyo/&quot;&gt;Rufus Tokyo&lt;/a&gt; and the &lt;a href=&quot;http://tokyocabinet.sourceforge.net/rubydoc/&quot;&gt;Ruby bindings written by Mikio Hirabayashi.&lt;/a&gt;  I ended up using Hirabayashi&#39;s Ruby bindings, because they were a little closer to the metal, and the less code that can break the better.  While there is no gem, &lt;a href=&quot;http://tokyocabinet.sourceforge.net/rubypkg/&quot;&gt;installing from source&lt;/a&gt; was easy, both on Centos and Leopard. If you&#39;re on Leopard, don&#39;t use the macports versions -  they&#39;re broken.  I&#39;m not using Tokyo Tyrant, as only one process needs to access this data I&#39;m using Tokyo Cabinet directly.&lt;br /&gt;&lt;br /&gt;The only things the Ruby bindings didn&#39;t give me were a simple open method and a way to serialize values so I could put any Ruby data structure into the cabinet.&lt;br /&gt;&lt;br /&gt;Hirabayashi&#39;s Ruby bindings already provide Ruby Hash like access, including hsh[&#39;foo&#39;] = &quot;bar&quot;, and hsh.each.  Nor did it make sense to create my own interface class when really all I needed was to extend a tiny subset of TokyoCabinet::HDB&#39;s existing methods.  What I came up with is this:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;ruby&quot;&gt;&lt;span class=&quot;ident&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;tokyocabinet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&#39;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;ident&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;TokyoCabinet&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;comment&quot;&gt;# Duck Punch of TokyoCabinet Hash database that uses YAML to serialize Ruby objects. Serialization&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;comment&quot;&gt;# necessary since TC expects values as strings or integers so won&#39;t handle other data types. Also provides &lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;comment&quot;&gt;# a consistent, simpler open method.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;class &lt;/span&gt;&lt;span class=&quot;class&quot;&gt;TokyoCabinet::HDB&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;comment&quot;&gt;  # initialize db and return handle to db.  There is one db file per data structure, e.g.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;comment&quot;&gt;  # new hash means new database and database file so call init again. Creates db file&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;&lt;br /&gt;# if it doesn&#39;t already exist. &lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;  alias&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;original_open&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;open&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;  def &lt;/span&gt;&lt;span class=&quot;method&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;path_to_db&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;comment&quot;&gt;    # open the database&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;    if&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;original_open&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;path_to_db&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;HDB&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;OWRITER&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;HDB&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;OCREAT&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;ident&quot;&gt;    ecode&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;ecode&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;constant&quot;&gt;      STDERR&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;open error: %s&lt;span class=&quot;escape&quot;&gt;\n&lt;/span&gt;try to open file &lt;span class=&quot;expr&quot;&gt;#{path_to_db}&lt;/span&gt; - &lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&quot;,&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;errmsg&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;ecode&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;))&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;    end&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;  end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;  alias&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;original_get_brackets&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;[]&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;  def &lt;/span&gt;&lt;span class=&quot;method&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;ident&quot;&gt;    result&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;original_get_brackets&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;ident&quot;&gt;    result&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;YAML&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;nil&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;  end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;  alias&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;original_set_brackets&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;[]=&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;  def &lt;/span&gt;&lt;span class=&quot;method&quot;&gt;[]=&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;constant&quot;&gt;    self&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;original_set_brackets&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;YAML&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dump&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;punct&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;  end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;  alias&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;original_each&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;each&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;  def &lt;/span&gt;&lt;span class=&quot;method&quot;&gt;each&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;constant&quot;&gt;    self&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;original_each&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;yield&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;YAML&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;  end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Dear MySQL, I think we should see other people.</description><link>http://blog.henriquez.net/2009/07/tokyo-cabinet-and-me.html</link><author>noreply@blogger.com (Logan Henriquez)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_z1stogGfysI/SnAG58O-ohI/AAAAAAAAAGY/Y2zh6isUlho/s72-c/Picture+4.png" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-8883625734871991690</guid><pubDate>Sat, 16 May 2009 19:10:00 +0000</pubDate><atom:updated>2009-05-16T12:40:55.272-07:00</atom:updated><title>If you&#39;re doing a startup, don&#39;t miss this</title><description>If you&#39;re in or thinking of starting a new company, or even a new product category in a large company, these are essential to maximizing the chances of success.  I&#39;ve been in many companies big and small and the correlation between success and following the principles discussed in these classes has been 100%.  Steve Blank is an experienced entrepreneur that teaches at Berkeley.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://venturehacks.com/articles/customer-development-3-and-4&quot;&gt;http://venturehacks.com/articles/customer-development-3-and-4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://venturehacks.com/articles/customer-development-class-5&quot;&gt;http://venturehacks.com/articles/customer-development-class-5&lt;/a&gt;</description><link>http://blog.henriquez.net/2009/05/new-product-introduction-classes-steve.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-2377190992561728198</guid><pubDate>Fri, 15 May 2009 05:15:00 +0000</pubDate><atom:updated>2009-05-14T22:21:23.690-07:00</atom:updated><title>Tagging the real world</title><description>Maybe I just missed it, but &lt;a href=&quot;http://www.techcrunch50.com/2008/conference/presenter.php?presenter=71&quot;&gt;this&lt;/a&gt; seems to have gotten much less coverage than it deserves. The demo opens up a huge set of possibilities around making the physical world searchable and interactive, just like the web.  I know little about what technologies tochidot is using, but I&#39;ve been exposed to several companies, two of which I worked for, that have developed components of making such a system possible.&lt;br /&gt;&lt;br /&gt;Basically you need&lt;br /&gt;&lt;ul&gt;&lt;li&gt;text recognition on low-rez camerphones: &lt;a href=&quot;http://snaptell.com/&quot;&gt;snaptell.com&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;image recognition and comparison to like images: &lt;a href=&quot;http://searchartgalleries.com/&quot;&gt;searchartgalleries.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;geolocation data&lt;/li&gt;&lt;li&gt;a smart phone with a big screen (Apple, Google Phone, ..)&lt;/li&gt;&lt;li&gt;a backend that matches incoming images and geolocation data to historical data such as tags, reviews, user comments, etc.&lt;/li&gt;&lt;/ul&gt;My head is swimming with the possibilities.</description><link>http://blog.henriquez.net/2009/05/maybe-i-just-missed-it-but-this-seems.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-835125569391118423</guid><pubDate>Thu, 07 May 2009 01:15:00 +0000</pubDate><atom:updated>2009-05-06T18:18:19.089-07:00</atom:updated><title>Announcing use_uuid and acts_as_distributed</title><description>&lt;span style=&quot;font-family:arial;&quot;&gt;I&#39;ve open sourced two Rails plugins that facilitate building distributed Rails applications.  &lt;a href=&quot;http://github.com/henriquez/use_uuid&quot;&gt;Use_uuid&lt;/a&gt; integrates UUIDs and schema less attributes into rails models.  &lt;a href=&quot;http://github.com/henriquez/acts_as_distributed&quot;&gt;Acts_as_distributed&lt;/a&gt; replicates state changes to model objects to a queue so they can be distributed to other databases and applications.  Both of these plugins are currently in production in &lt;a href=&quot;http://newsforwhatyoudo.com&quot;&gt;newsforwhatyoudo&lt;/a&gt;, and are tested with Rails 2.2.2&lt;br /&gt;&lt;br /&gt;Rails is a great framework, but its not simple building a distributed application.  These are two small steps towards making it easier.  I&#39;ll be talking at the SF Ruby Meetup about how we use these plugins on May 13 - see the &lt;a href=&quot;http://www.meetup.com/sfruby/calendar/10191515/?a=ce1p_grp&quot;&gt;meetup link here&lt;/a&gt;.  It would be great to collaborate with other developers on building out a collection of plugins that enabled all the key portions of distributing applications in an integrated way.&lt;br /&gt;&lt;/span&gt;</description><link>http://blog.henriquez.net/2009/05/announcing-useuuid-and.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-7888415982818631351</guid><pubDate>Wed, 29 Apr 2009 06:09:00 +0000</pubDate><atom:updated>2009-04-28T23:19:51.074-07:00</atom:updated><title>Residential Real Estate Investor Group on newsforwhatyoudo</title><description>&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;a href=&quot;http://newsforwhatyoudo.com/&quot;&gt;Newsforwhatyoudo.com&lt;/a&gt; has launched a social news / feed reader site for professional news.  One of the professional groups is focused on residential real estate investors, particularly distressed real estate.  Its much more automated and collaborative than the news groups on linked in.&lt;br /&gt;&lt;br /&gt;Give it &lt;a href=&quot;http://newsforwhatyoudo.com/groups/cbf0113a2b7411de829f001aa018681c/news&quot;&gt;a try here&lt;/a&gt;.  Its in private beta, so you&#39;ll need to use this ticket when you sign up:&lt;br /&gt;&lt;br /&gt;a9bd5d5a37501107cd02d7a46a0ef084&lt;br /&gt;&lt;br /&gt;This is good for the first 50 users.&lt;br /&gt;&lt;/span&gt;</description><link>http://blog.henriquez.net/2009/04/newsforwhatyoudo.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-1002891672290355546</guid><pubDate>Sat, 24 Jan 2009 04:45:00 +0000</pubDate><atom:updated>2009-01-23T20:47:49.674-08:00</atom:updated><title>Wingsuit basediving</title><description>Ah, to be young and careless again.  If I ever get diagnosed with a terminal disease, this is what I&#39;m going to do.&lt;br /&gt;&lt;br /&gt;&lt;object width=&quot;400&quot; height=&quot;219&quot;&gt;&lt;param name=&quot;allowfullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://vimeo.com/moogaloop.swf?clip_id=1778399&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot; /&gt;&lt;embed src=&quot;http://vimeo.com/moogaloop.swf?clip_id=1778399&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; width=&quot;400&quot; height=&quot;219&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href=&quot;http://vimeo.com/&quot;&gt;wingsuit base jumping&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/thedoctor&quot;&gt;Ali&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com&quot;&gt;Vimeo&lt;/a&gt;.</description><link>http://blog.henriquez.net/2009/01/wingsuit-basediving.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-2871244100708508885</guid><pubDate>Fri, 18 Apr 2008 22:50:00 +0000</pubDate><atom:updated>2008-04-22T23:00:41.016-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blogging ideas</category><title>My Link Blog needs some love</title><description>Link &lt;a href=&quot;http://friendfeed.com/&quot;&gt;blogging&lt;/a&gt; is &lt;a href=&quot;http://tomayko.com/&quot;&gt;all the rage&lt;/a&gt;.  Or at least that&#39;s what I tell myself because I&#39;m working on a link blog aggregator idea.  If you&#39;re not familiar with what a link blog is, its basically a collection of articles or article headlines from many sources.  A link blog may be a manually selection of interesting articles or be automatically aggregated out of a collection of sources.    Google Reader shares are a popular way of creating manually collated collections, and Google Reader public tags will create automatic feeds of all the blogs under a particular tag/topic.&lt;br /&gt;&lt;br /&gt;So of course I have a few link blogs of my own.  If you&#39;re subscribed to this blog in a reader you&#39;re missing these link blogs, which I have to admit are usually more interesting than what I write here.  These link blogs cover various topics - I have link blogs on investing, software development, interesting articles by other bloggers, web infrastructure and so on.  These are visible in the sidebar of this blog, or you can try them out by clicking on the links below and importing the feeds into your reader.   You can also create your own if you use Google Reader.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;My &lt;a href=&quot;http://feeds.feedburner.com/logans_linkings&quot;&gt;&quot;interesting reads&quot; link blog&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.google.com/reader/shared/user/11126931119298697837/label/coding&quot;&gt;Software Development&lt;/a&gt; - mainly Rails/Ruby related&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.google.com/reader/shared/user/11126931119298697837/label/finance&quot;&gt;Investing&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.google.com/reader/shared/user/11126931119298697837/label/storage&quot;&gt;Web infrastructure&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.google.com/reader/shared/user/11126931119298697837/label/fun&quot;&gt;Laughs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happy Reading!</description><link>http://blog.henriquez.net/2008/04/my-link-blog-needs-some-love.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-8451162969618931187</guid><pubDate>Tue, 08 Apr 2008 20:08:00 +0000</pubDate><atom:updated>2008-05-02T11:35:05.343-07:00</atom:updated><title>Losses this Recession</title><description>&lt;a href=&quot;http://www.rgemonitor.com/blog/roubini&quot;&gt;Roubini,&lt;/a&gt; the IMF,&lt;a href=&quot;http://www.rgemonitor.com/blog/roubini&quot;&gt; &lt;/a&gt;&lt;a href=&quot;http://news.yahoo.com/s/nm/20080325/bs_nm/usa_credit_goldman_dc&quot;&gt;Goldman Sachs&lt;/a&gt;, and a &lt;a href=&quot;http://seekingalpha.com/article/71609-distressing-table-of-the-day-945b-in-financial-sector-losses?source=feed&quot;&gt;number of others&lt;/a&gt; are coming up with total credit losses due to the housing crisis similar my estimate in a &lt;a href=&quot;http://www.henriquez.net/2008/03/will-home-ownership-rates-return-to.html&quot;&gt;previous post.&lt;/a&gt;  Some of these estimates are rolling up losses on credit cards, auto loans, and commercial real estate along with residential housing losses.  Others like Roubini are estimating a $1T loss just due to residential housing.  Either way this level of losses will wipe out a good portion of Wall Street financial firm&#39;s market cap not to mention pension funds and insurance organizations.&lt;br /&gt;&lt;br /&gt;A massive government bailout seems inevitable, probably at even larger scale than occurred with the RTC during the early 90&#39;s S&amp;amp;L crisis.  This bailout is &lt;a href=&quot;http://vixandmore.blogspot.com/2008/04/m3-expanding-at-almost-20.html&quot;&gt;already under way&lt;/a&gt;, particularly in terms of inflating our way out of the problem.  I do not anticipate a 15 year depression/recession such as occured in the US during the 1930&#39;s or Japan over the last 15 years, primarily because the Fed in the US has shown a strong bias towards an activist, inflationary strategy.&lt;br /&gt;&lt;br /&gt;I do anticipate sharply higher commodity prices, a 20-40% decline in the dollar, multiple financial firm bankrupcies/rescues and house prices bottoming only after 25-50% declines.&lt;br /&gt;&lt;br /&gt;With every decline comes a great shorting opportunity followed by a great buying opportunity.  I just picked up &quot;Anatomy of the Bear&quot; a study of the last 4 bear market bottoms.   This book looks at the actual historical record to refute popular mythologies on what characterizes bear market bottoms.  Apparently both &quot;buy and hold is your best strategy&quot; and &quot;Bottoms only occur when everyone thinks things will only get worse&quot; are both false.&lt;br /&gt;&lt;br /&gt;I&#39;ll post the Cliff Notes soon as I&#39;m done.&lt;br /&gt;&lt;div style=&quot;display: none;&quot;&gt;88326773&lt;/div&gt;</description><link>http://blog.henriquez.net/2008/04/losses-this-recession.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-5035822993038460343</guid><pubDate>Fri, 04 Apr 2008 18:12:00 +0000</pubDate><atom:updated>2008-04-04T11:27:47.279-07:00</atom:updated><title>Ingredients of Startup Success</title><description>Paul Buchheit of Gmail and FriendFeed fame recently posted the best &lt;a href=&quot;http://paulbuchheit.blogspot.com/2008/03/ideas-vs-judgment-and-execution_9197.html&quot;&gt;synopsis of the ingredients of startup success&lt;/a&gt; I&#39;ve seen. &lt;br /&gt;&lt;br /&gt;There&#39;s one thing I&#39;d add, using the same mountain climbing analogy.   Often you put a team together, and it climbs partway up a mountain expecting gold at the top.  About halfway up a number of things can go wrong. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;The route may be impassable given the climbing techniques the team is capable of (the technology doesn&#39;t give the hoped-for benefit)&lt;/li&gt;&lt;li&gt;You may get a good view of the top and see that there is no gold, just a bunch of shrubs. (the market dynamics make it hard to make a profit)&lt;/li&gt;&lt;li&gt;The view halfway up the mountain lets you see the top of an adjacent mountain that does have gold at the top (Focusing on a different segment of the market is more profitable)&lt;/li&gt;&lt;li&gt;There&#39;s a weak link in the team that makes climbing slow and difficult (missing skill sets)&lt;/li&gt;&lt;/ul&gt;In my experience these types of problems are not exceptions, rather the norm.  Successful teams recognize the issues quickly and make the changes necessary, whether that be changing market focus, hiring different skillsets, or changing the product to better meet the market&#39;s needs.</description><link>http://blog.henriquez.net/2008/04/ingredients-of-startup-success.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-1189942501129379768</guid><pubDate>Sat, 29 Mar 2008 15:23:00 +0000</pubDate><atom:updated>2008-03-29T08:51:26.026-07:00</atom:updated><title></title><description>I&#39;ve officially moved &lt;a href=&quot;http://blog.pmarca.com/&quot;&gt;Mark Andreesen&#39;s blog&lt;/a&gt; to the &quot;humor&quot; section of Google Reader.&lt;br /&gt;&lt;br /&gt;Here&#39;s Comedy Central&#39;s wrap up of Cramer and Bush&#39;s comments on the recent troubles on Wall Street.  At the end Bush pronounces &quot;The economy is fine...&quot;   The economy must be totally fucked.&lt;br /&gt;&lt;br /&gt;&lt;embed FlashVars=&quot;videoId=164178&quot; src=&#39;http://www.thedailyshow.com/sitewide/video_player/view/default/swf.jhtml&#39; quality=&#39;high&#39; bgcolor=&#39;#cccccc&#39; width=&#39;332&#39; height=&#39;316&#39; name=&#39;comedy_central_player&#39; align=&#39;middle&#39; allowScriptAccess=&#39;always&#39; allownetworking=&#39;external&#39; type=&#39;application/x-shockwave-flash&#39; pluginspage=&#39;http://www.macromedia.com/go/getflashplayer&#39;&gt;&lt;/embed&gt;</description><link>http://blog.henriquez.net/2008/03/ive-officially-moved-mark-andreesens.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-1807300359586514488</guid><pubDate>Fri, 21 Mar 2008 18:11:00 +0000</pubDate><atom:updated>2008-03-21T11:22:21.595-07:00</atom:updated><title>The sources of human misjudgement</title><description>Here&#39;s a &lt;a href=&quot;http://vinvesting.com/docs/munger/human_misjudgement.html&quot;&gt;transcript of a talk&lt;/a&gt; Charlie Munger gave a while back on the sources of human misjudgement.  Munger is Warren Buffet&#39;s partner in Berkshire Hathaway.  This is a good synopsis of a bunch of sources of material from Darwin to Skinner to Cialdini.  Interesting for investing, marketing, and everyday life. &lt;br /&gt;&lt;br /&gt;In the talk he refers to a set of mental tricks used by Darwin to reduce confirmation bias  - I&#39;m going to see if I can find the biography he refers to.  I&#39;ve been collating my own list of checkpoints before making investing decisions.  The list constantly gets longer - so many errors to make, so little time.</description><link>http://blog.henriquez.net/2008/03/sources-of-human-misjudgement.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-6027001852487487710</guid><pubDate>Sun, 16 Mar 2008 05:11:00 +0000</pubDate><atom:updated>2008-03-18T23:51:09.024-07:00</atom:updated><title>Bank mortgage losses - just beginning or almost over?</title><description>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_z1stogGfysI/R9yxKxl9sTI/AAAAAAAAABE/xofqWVl_6Bw/s1600-h/Homeowshiprateq42007.jpgner.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;&quot; src=&quot;http://3.bp.blogspot.com/_z1stogGfysI/R9yxKxl9sTI/AAAAAAAAABE/xofqWVl_6Bw/s200/Homeowshiprateq42007.jpgner.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5178208470238605618&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Interesting data in this link on recent trends in home ownership from the Census Bureau:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://calculatedrisk.blogspot.com/2008/01/homeownership-rate-cliff-diving.html&quot;&gt;http://calculatedrisk.blogspot.com/2008/01/homeownership-rate-cliff-diving.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Back in 2006 I found it interesting that the US home ownership rate had risen to about 5% over the 100 year average (69% vs 64%).   Knowing that after bubbles burst, things tend to revert to the mean, I thought I might be able to estimate what the banks will lose post-bubble.  A back of the envelope calculation yields about $1.5 Trillion in lender losses if the ownership rate returns to the 64% historical average.  This is based on 20% loss on foreclosure assumption and the median home price of $235K - see the Census Bureau report in the above link for the number of housing units involved.  The loss rate could be pretty optimistic - most banks are assuming their subprime CDO losses are between 50-100%, but this is due to trying to mark them to market in an illiquid market, not any real assessment of what home prices will do.  The contrary opinion is here:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://seekingalpha.com/article/68550-subprime-write-downs-more-than-50-done-write-ups-coming-next?source=feed&quot;&gt; http://seekingalpha.com/article/68550-subprime-write-downs-more-than-50-done-write-ups-coming-next?source=feed&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Given how wrong S&amp;amp;P has been about just about everything, I&#39;m taking their opinion as evidence that someone paid them to paper over a really big hole.   If the  $1.5T is correct, it means only about 20% of the $1.5T has been written down so far, which means the failure of Bear Sterns is just one of many to come.&lt;br /&gt;&lt;br /&gt;There is &lt;a href=&quot;http://www.census.gov/population/socdemo/hh-fam/tabMS-2.pdf&quot;&gt;evidence&lt;/a&gt; that one cause of the higher home ownership rates is a permanent demographic shift towards people marrying later in life and thus there being a higher number of single-occupant homes.  This would increase demand for housing absent that trend.    However we also know that there were several other now reversed causes such as low interest rates, a blind rush to profit on rising home prices, and loose lending standards.  In previous bubbles,  ownership rates and prices of the asset in question reset to historical averages only after undershooting their historical averages, which could mean the 1.5T is too low.&lt;br /&gt;&lt;br /&gt;Once the &lt;a href=&quot;http://calculatedrisk.blogspot.com/2008/02/economycoms-zandi-on-homeowners-with.html&quot;&gt;10% of  US homeowners that have zero or negative equity&lt;/a&gt; believe that the price of their largest asset is headed south for the long haul many will just bail.  No lowering of interest rates will matter because they just won&#39;t want the albatross.  The only thing that might have an impact is if lenders forgive the principle amount impacted by the &lt;a href=&quot;http://www.msnbc.msn.com/id/23350937/&quot;&gt;price decline&lt;/a&gt;.  Which puts us back into at least a trillion in losses for the banks.  A loss like that would wipe out the market cap of a good fraction of Wall Street.  Think tech stocks 2001-2003. Or &lt;a href=&quot;http://bigpicture.typepad.com/comments/2008/03/housing-us-vs-j.html&quot;&gt;Japan over the last 15 years.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Fed&#39;s recent actions suggest that they will do just about anything to try to prevent it.  We&#39;ll have to leave the efficacy and side effects of a mass bailout to another post.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://bigpicture.typepad.com/comments/2008/03/housing-us-vs-j.html&quot;&gt;&lt;/a&gt;What do you think?  What do you trade?&lt;br /&gt;&lt;br /&gt;[disclaimer: I am wicked short C, FNM, NTAP, QQQQ, DSL, BSCI but have bailed out of my builder shorts as of three months ago.  ]</description><link>http://blog.henriquez.net/2008/03/will-home-ownership-rates-return-to.html</link><author>noreply@blogger.com (Logan Henriquez)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_z1stogGfysI/R9yxKxl9sTI/AAAAAAAAABE/xofqWVl_6Bw/s72-c/Homeowshiprateq42007.jpgner.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-700754843752465475</guid><pubDate>Fri, 14 Mar 2008 02:53:00 +0000</pubDate><atom:updated>2008-03-13T22:07:31.220-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">positioning</category><title>Positioning your product</title><description>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://1.bp.blogspot.com/_z1stogGfysI/R9nq1Bl9sSI/AAAAAAAAAA8/CLnlvTCmzsU/s1600-h/sweet_amys.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;&quot; src=&quot;http://1.bp.blogspot.com/_z1stogGfysI/R9nq1Bl9sSI/AAAAAAAAAA8/CLnlvTCmzsU/s320/sweet_amys.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5177427443320729890&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;This sign cracks me up every time I pass it on the way home.  Reminds me of a few startups.   First they try breakfast.  But the cook&#39;s not that good.   Few customers come back a second time.   So they add expresso.  But the expresso isn&#39;t that good either.....by the time they&#39;re trying to add balloons to the list the investors bail.&lt;br /&gt;&lt;br /&gt;Do one thing.  Do it well.&lt;br /&gt;&lt;br /&gt;&quot;One thing&quot; usually means providing one solution to a problem for a group of people.  Doing it well may mean having a critical mass of features.  This is often a challenge in a first rev product.  I try to find new product ideas and market segments where the team can solve one problem and do it well enough to make a real difference without taking on an un-doable number of features.  The trick is finding a group of users or an application where we can make a difference (= beat the competition) with a subset of the ideal feature list.&lt;br /&gt;&lt;br /&gt;In mature markets this is difficult.  New markets that have shorter requirement lists are ideal.  Sometimes old markets where a new &quot;disruptive&quot; technology can be applied will work too.&lt;br /&gt;&lt;br /&gt;Someday I hope to meet Sweet Amy and ask her how it all went down.</description><link>http://blog.henriquez.net/2008/03/positioning-your-product.html</link><author>noreply@blogger.com (Logan Henriquez)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_z1stogGfysI/R9nq1Bl9sSI/AAAAAAAAAA8/CLnlvTCmzsU/s72-c/sweet_amys.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-9123839477551812641</guid><pubDate>Wed, 12 Mar 2008 07:20:00 +0000</pubDate><atom:updated>2008-03-12T12:36:58.076-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rss reader ranking</category><title>A ranked feed for the Rails community</title><description>I&#39;ve been working on a solution for two problems in my daily feed reading.  First, there are just too many quality things to read.  I need them organized by topic and ranked inside each topic .  Second, Google Reader doesn&#39;t give me visibility to the comments in each blog without clicking through to the posting.   What I want is one place where all my feeds, say on RubyonRails, are ranked, visible, and include all the comments.   Ideally I can comment on the postings without exiting the feed reader interface.  I&#39;ve hacked together a partial solution you can try out at&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://friendfeed.com/rails&quot;&gt;http://friendfeed.com/rails&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a few dozen Ruby on Rails related feeds from my Google Reader collection fed into &lt;a href=&quot;http://www.aiderss.com/&quot;&gt;aideRSS&lt;/a&gt;.  AideRSS ranks based on the number of delicious saves, Google Reader Shares, diggs, and comments for each post.  Next that AideRSS output is piped into Friendfeed which provides one place where people can comment in a way that all comments are visible in one spot.  The friendfeed feed can then be pulled into G.R., or just used as -is.&lt;br /&gt;&lt;br /&gt;There are a number of problems with this hack.  You&#39;ll still want to use your favorite feed reader.   In the feed reader you&#39;re not able to contribute to the comments without exiting the reader, nor can you actually read the posting without clicking through to it.   However if commenters use Friendfeed, Google Reader will embed comments in the feed.  Today of course most of the comments will still be on each blog rather than centralized on this feed.  I&#39;ve seen some feed readers that pull in comments, and then there&#39;s &lt;a href=&quot;http://www.cocomment.com/&quot;&gt;Cocomment&lt;/a&gt;, but these various pieces need to work together.&lt;br /&gt;&lt;br /&gt;If only Blogger/Wordpress/Typepad,  Google Reader, AideRSS and Friendfeed would get busy and have a bastard child I&#39;d have a solution.&lt;br /&gt;&lt;br /&gt;I&#39;m interested in feedback on this - does anyone else have this problem?  What would be your ideal solution?</description><link>http://blog.henriquez.net/2008/03/ranked-feed-for-rails-community.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-1422039523055655493</guid><pubDate>Fri, 22 Feb 2008 06:03:00 +0000</pubDate><atom:updated>2008-02-21T22:51:00.189-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rails facebook virality scaling</category><title>Scaling a Facebook application - users and infrastructure</title><description>Here are some links and notes from recent presentations on how to scale a facebook application, both in terms of the technical infrastructure and the design of the application.&lt;br /&gt;&lt;br /&gt;For the application design see this link to the great &lt;a href=&quot;http://highscalability.com/docs/EmergingTechSIGPresentation.pdf&quot;&gt;highscalability blog&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;In addition to the above, here are some notes I took from a talk Blake Commagere (developer of the popular Vampires Facebook application) gave two weeks ago at the Facebook developer meetup.&lt;br /&gt;&lt;br /&gt;- Jealousy, Courtship, Selfishness, Sexuality motivate everything&lt;br /&gt;- Help users meet someone they have chemistry with.&lt;br /&gt;- Virality kicks in when you play to the users&#39;s selfishness. Tell the user what&#39;s in it for them&lt;br /&gt;- Conversion of the invited is more important than the number of invitations. Try to convert the invited at the first invite, diminishing returns after that. So have to give the invited an appeal to selfishness as well.&lt;br /&gt;- News feed is the most important viral mechanism - much more important than invites, as its viral beyond the invite list.&lt;br /&gt;&lt;br /&gt;For the infrastructure discussion see &lt;a href=&quot;http://highscalability.com/friends-sale-architecture-300-million-page-view-month-facebook-ror-app&quot;&gt;this &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href=&quot;http://nginx.net/&quot;&gt;nginx&lt;/a&gt; + &lt;a href=&quot;http://mongrel.rubyforge.org/&quot;&gt;mongrel&lt;/a&gt; + memcached + &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;rails&lt;/a&gt; stack seems to be the emerging best practice for rapid application deployment in the web community.  I use almost the exact same stack for &lt;a href=&quot;http://www.searchartgalleries.com/&quot;&gt;www.searchartgalleries.com&lt;/a&gt;, except my whole configuration is on one Xen slice at &lt;a href=&quot;http://www.slicehost.com/&quot;&gt;Slicehost&lt;/a&gt; since I have less traffic.  I&#39;ve been pleasantly surprised at how well my 1GB Xen slice performs - its faster than the 2 core, 2GB dedicated machines I use in my test and dev environment.  I&#39;m assuming this is because the slice is on a 4 core machine with a larger RAID configuration behind it, and I&#39;m grabbing more cores and spindles when heavy requests come in.  Slicehost has been a great VPS provider, although I have only 4 months of history so far the price performance has been excellent.    SearchArtGalleries is mostly disk bound when pulling complex searches out of Mysql.  The nice thing about this stack is that each layer scales out easily, nginx being a good load balancer and static file server all in one.  The exception is the database - wouldn&#39;t it be nice if scaling Mysql was as easy as adding mongrels?&lt;br /&gt;&lt;br /&gt;Now back to trying to figure out how to get my app to 4 million users by the end of next week :-)</description><link>http://blog.henriquez.net/2008/02/scaling-facebook-application-users-and.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-3517504418656376310</guid><pubDate>Thu, 21 Feb 2008 03:55:00 +0000</pubDate><atom:updated>2008-02-20T19:56:32.425-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">delicious tag roll</category><title>My Tag Roll</title><description>&lt;script type=&quot;text/javascript&quot; src=&quot;http://del.icio.us/feeds/js/tags/lhenriquez?icon;count=149;size=12-35;color=87ceeb-0000ff;title=my%20del.icio.us%20tags;showadd&quot;&gt;&lt;/script&gt;</description><link>http://blog.henriquez.net/2008/02/my-tag-roll.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-1578419473375515</guid><pubDate>Thu, 31 Jan 2008 23:38:00 +0000</pubDate><atom:updated>2008-01-31T15:41:00.216-08:00</atom:updated><title>Twitter Blocks on Amazon Web Services</title><description>This is really cool.  I’m not sure why its cool, but it’s cool.  Twitter is using Amazon’s web services to take a snapshot (I presume) of the twitter social graph and make it navigatable in 3D.  &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://explore.twitter.com/blocks/&quot;&gt;http://explore.twitter.com/blocks/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;</description><link>http://blog.henriquez.net/2008/01/twitter-blocks-on-amazon-web-services.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-2107037544015411306</guid><pubDate>Mon, 21 Jan 2008 07:30:00 +0000</pubDate><atom:updated>2008-01-21T01:46:35.406-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">marketing open source positioning collateral</category><title>Open source understands marketing</title><description>Maybe its just me, but lately I&#39;ve noticed that many open source projects are out-marketing closed source companies.  This is interesting because open source projects typically have no marketing teams, just a few engineers.  Last week I was looking for a collaboration package to run on my startup&#39;s intranet.  We want to share documents like PRDs and specifications, allow comments, and host blogs.  I compared two options - microsoft sharepoint server and wordpress.  Sharepoint server was attractive because we are running microsoft active directory so the authentiation would be integrated.  Wordpress is well, free.  There are lots of other alternatives, but these two illustrate the point.  I wanted to get a quick feature comparison - typical thing you&#39;d expect most potential customers might want to do.  Like everyone else I start with Google and type in two queries - &quot;wordpress features&quot; and &quot;sharepoint server features&quot;.   I click on the first links that seem relevant on the first page &lt;a href=&quot;http://technet2.microsoft.com/windowsserver/WSS/en/library/0127769d-11aa-469d-80d7-fbd0b20e421c1033.mspx?mfr=true&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;http://wordpress.org/about/features/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The wordpress page gives me one page of HTML that&#39;s easy to read in about two minutes and addresses the actual features of the product.  The Microsoft link forces me to navigate a maze through several links before I&#39;m presented with a link to a word document, which I then need to download and launch word.  Then I need to weed through a 69 page long document to find the 1 page of features I want.  The first 13 pages of the document try to convince me that I need to &quot;Get started quickly&quot; and &quot;Collaborate Easily&quot; - basically to convince me that I need a collaboration platform.  As if I happen to be browsing the sharepoint server site for fun or something.  And the requirement to have Word installed is a nice touch that says &quot;We want to ensure anyone that is not already a customer never becomes one&quot;.  In contrast the open source sites I read tend to provide fast and easy access to the information I want and broad platform support.  When I&#39;m evaluating a new piece of software or hardware I want to know four things:&lt;br /&gt;&lt;br /&gt;  1. What features does it have?&lt;br /&gt;  2. What&#39;s it going to take to get it running?&lt;br /&gt;  3. How much does it cost?&lt;br /&gt;  4. Who else is using it and what do they think of it?&lt;br /&gt;&lt;br /&gt;I don&#39;t think IT departments evaluating products are much different.  What proprietary hardware and software companies are getting wrong is they have forgotten who their customer is, they are not valuing the customer&#39;s time, and they don&#39;t understand where in the decision process the customer is when they arrive at the product website.  Instead of giving me answers to the above questions, product literature tries to sell me the benefits of the general category of products.    That&#39;s silly - especially for a product category like blogging software that everyone that hasn&#39;t been living under a rock already knows about.  &lt;br /&gt;&lt;br /&gt;What open source teams understand that many big proprietary software and hardware companies don&#39;t  is the following:&lt;br /&gt;&lt;br /&gt;  1. &lt;span style=&quot;font-weight:bold;&quot;&gt;Sell features, not benefits&lt;/span&gt;.  Yes, this is the reverse of what you may have learned in business school, which probably explains why open source marketing is better - its written by engineers!  Selling benefits is fine if you&#39;re selling a product or feature the buyer is unfamiliar with, or one they haven&#39;t decided they want.  For most tech products the buyer is a technical person who is already convinced they want the category of product.  They wouldn&#39;t be at your site if they didn&#39;t already want the type of product you&#39;re selling.  Second, you&#39;re talking to another engineer, not a clueless consumer, so you don&#39;t need to explain the benefit of every feature - they already know.  The only times to talk about benefits is when discussing the unique features of your product, which are going to be a very short list.  Occasionally you may be selling a completely new category of products that no one is familiar with, and you have to explain why someone would want that category of products. Again, this is very very rare. One of the reasons why open source companies get this right is the engineer that wrote the software also writes the collateral.  The moral is - the writer must be technical and understand what the buyer is interested in.&lt;br /&gt;&lt;br /&gt;2.  &lt;span style=&quot;font-weight:bold;&quot;&gt;Keep it short&lt;/span&gt;.  Each of the questions above should be addressed in 1 page of html, no more than two 15&quot; screen lengths long.  Expecting anyone to read a 69 page document to get a feature overview is just plain stupid.  To keep things simple and short, ditch the document-by-committee method of creating documents that enterprises use - this leads to long meandering drivel.  A document should have exactly one author.  Editing is fine, but editors shouldn&#39;t try to word-smith the document.&lt;br /&gt;&lt;br /&gt;3.  &lt;span style=&quot;font-weight:bold;&quot;&gt;Make trying out your product easy.&lt;/span&gt;  People like to test things before they buy them.  Most open source packages I&#39;ve used from Linux to RubyonRails are dead simple to install, run on everything, and they&#39;re free to test out.  Contrast that to most proprietary software which runs on 1 platform and is crazy hard to install due to lame downloader tools, poor compatibility, and broken DRM.  The culprits are too numerous to name, but the guilty include Java and everything Microsoft.&lt;br /&gt;&lt;br /&gt;4. &lt;span style=&quot;font-weight:bold;&quot;&gt;Position yourself against other products.&lt;/span&gt;  Potential buyers are interested in comparisons.  Your literature must answer the question &quot;how is this better than the competition?&quot;.  This is also known as a positioning statement. There&#39;s no need to name the competition, but your feature list should highlight why your product is better.  One of the best examples of this I&#39;ve seen is the &lt;a href=&quot;http://rubyonrails.org/&quot;&gt;RubyonRails.org&lt;/a&gt;.  Right up front in bold letters it explains why a prospective user should try Rails.  Lets compare that to Sun&#39;s &lt;a href=&quot;http://developers.sun.com/&quot;&gt;java developer site&lt;/a&gt;.  Lots of words, but no reason why I should use Java.  So, I don&#39;t.&lt;br /&gt;&lt;br /&gt;5. &lt;span style=&quot;font-weight:bold;&quot;&gt;Integrate testimonials and community into everything&lt;/span&gt;.  Prospective users should be able to quickly get to a list of other users, see real testimonials and see what users are saying on other sites.</description><link>http://blog.henriquez.net/2008/01/open-source-understands-marketing.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-7847586572912470212</guid><pubDate>Tue, 25 Dec 2007 18:14:00 +0000</pubDate><atom:updated>2008-01-09T22:51:28.058-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">investing china india stocks</category><title>Year End Investment Roundup</title><description>&lt;div style=&quot;font-family:arial;&quot;&gt;&lt;br /&gt;At the end of each year I take some time out to assess how my investments are performing and make some changes based on the latest outlook.  Writing this down helps me understand what I did right and wrong and see if the arguments for new investment positions ring true.   In the past I&#39;ve exchanged these opinion pieces via email with friends who also invest, but this year I thought I&#39;ll blog it so everyone can see each other&#39;s comments.  Most of the ideas below are derived from friends and well known investors such as Jim Rogers, &lt;a href=&quot;http://bigpicture.typepad.com/comments/&quot;&gt;Barry Rithotz&lt;/a&gt;, and others.  Check out Barry&#39;s blog for a great source of data.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Past&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This year has been full of some well anticipated drama in the financial and housing sectors. I began shorting builder stocks in late 2005, building supply in 2006, and financials in early 2007.  I was too early on the builder stocks and experienced a good deal of pain initially - most of these positions hit the stop losses I put in place on all shorts and the positions were undone.  In 2006 I put in place a new set of builder shorts, this time concentrating on the weaker builders - those with poor momentum, profitability and high debt such as SPF.  This worked out well because the weaker builders didn&#39;t rise with the pack and started their decline early.  The two main building related shorts I put in place declined 80% and 50% respectively.  Unfortunately I didn&#39;t replicate the size of the initial position.    The lesson is that I need to increase the size of my positions generally, particularly when the outcome is so certain.  I&#39;ve found that I&#39;m usually right about the long term direction of macroeconomic outcomes but usually early on the timing.  To actually make substantive money shorting, this means I need to wait until both the sector and the stocks themselves are in decline before shorting.  Since its hard to spot a trend in the first few weeks, I have to expect to place the bet several times after being undone by a stop loss without losing confidence and decreasing the size of the position.  In fact I need to do the opposite - increase the size of the position with time as with time I know I&#39;m closer to the expected outcome.  Nothing new here - this short technique is well covered in the 1923 classic &lt;span style=&quot;font-style:italic;&quot;&gt;Reminiscences of a Stock Operator&lt;/span&gt; by Edwin Lefevre.   &lt;br /&gt;&lt;br /&gt;My long positions have done somewhat better.  The energy and emerging market positions I took in the last few years did really well.  Some of the best were Eastern Europe fund EUROX, Indian banks IBN and HDB (thanks to Gary Bhatia for those picks), Indian fund IIF, and in energy XOM and KMP.  I was underexposed to China - my one China related fund WBIGX returned 23% annually over the last 5 years but underperformed the Chinese indexes substantially.  Given how predictably &lt;a href=&quot;http://bigpicture.typepad.com/comments/2007/09/us-vs-global-se.html&quot;&gt;poor the performance&lt;/a&gt; of US stock markets has been over the last years relative to most international markets, I should have taken larger international positions and reduced the size of my US long positions.&lt;br /&gt;&lt;br /&gt;In late 2004 I put a good deal of money into the Yen and the Japanese Nikkie Index on the theory that the fundamentals in Japan were turning around after a 20 year slump.  This investment did well for about a year and then flatlined.  Some of the fundamentals still look good - the financial sector is deregulating, Toyota, Honda, and others are doing well, and the saving rate is so high that a slight shift in domestic sentiment in favor of stocks could easily double the market there.  Most Japanese savings are in cash and government bonds earning very low yields.  On the negative side, the population is much older than emerging markets and continues to get older, which can preclude aggressive investment. What&#39;s lacking is the &quot;animal spirits&quot; to revive domestic interest in the market - it may take another 5-10 years before a new generation that doesn&#39;t remember the debacle of 1992-2000 takes over.  I&#39;m interested in what you guys think on this one - I may be early, or just wrong.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Long Term Outlook (10 years)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Viewed both from a fundamental and a technical standpoint, I believe the outlook for most US based asset classes (stock, bond, residential real estate) is bleak and rapidly worsening.  The dollar is dramatically overvalued given our gigantic current account deficits.  Foreign governments control the US exchange rate, and they are slowly but surely diversifying away from the dollar.  The dollar is in the middle of a multi year decline against virtually all other currencies, so this is merely an observation of well established trend.  In a recent &lt;a href=&quot;http://www.youtube.com/watch?v=umeXaGb6Xco&quot;&gt;Bloomberg interview&lt;/a&gt;, Jim Rogers who made a bundle predicting earlier currency and commodity trends, said he is moving all his assets out of the US dollar into yen, renminbi and swiss francs.  To quote &quot;The US dollar is and has been the world&#39;s reserve currency.  That&#39;s in the process of changing.  The pound sterling, which used to be the world&#39;s reserve currency, lost 80% of its value as it went through the process of losing its status as the world&#39;s reserve currency.&quot;  Rogers expects the renminbi to triple or quadruple over the next decade.  &lt;br /&gt;&lt;br /&gt;The historical engine of US growth - government investment in academia and places like Bell Labs, has &lt;a href=&quot;http://www.whitehouse.gov/omb/budget/fy2008/sheets/hist09z7.xls&quot;&gt;lagged&lt;/a&gt; GDP growth and real inflation over the last 15 years.  Note that in the link, official BLS inflation figures are used to compute constant dollar outlay.  As discussed elsewhere in this post, these numbers significantly understate real inflation.  Many people assume this slack will be taken up by private investors like VCs, but if you&#39;ve ever raised money for a startup you know that VCs don&#39;t knowingly invest in anything that has a payout of longer than 5 years.  Most technologies have payouts in the 10-20 year range.  If you took a look at where the innovation is happening in key fields like software, biotech, and energy most of it was US based 10 years ago, now I&#39;d say more than half is outside the US.  Silicon Valley remains the best place in the world for productizing technology but its only a matter of time before other parts of the world build the investment infrastructure to replicate it. &lt;br /&gt;&lt;br /&gt;US based assets like residential real estate and stocks are overvalued when compared to fundamentals and international comparables.  In hot markets, the full cost buying a house is almost double the cost of renting one, and home ownership rates are well above historical averages.  We now know why this occurred - lose lending standards and investment driven buying.  Both these underlying causes have reversed themselves.  &lt;br /&gt;&lt;br /&gt;Looking at stocks, P/Es for US stocks may seem low compared to Chinese or Indian stocks.  China and India together have population about 6x that of the US.  Yes they&#39;re mostly poor, but that&#39;s changing fast - if only 30% of their population moves into the middle class they will each equal the whole population of the US.  In the next 10-20 years we should expect that each of these economies by themselves will be bigger in &lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_countries_by_GDP_(nominal)&quot;&gt;GDP terms&lt;/a&gt; than the US.  This may seem like a shocking prediction, but if we compare China to say Taiwan, Korea, or Japan of 1946 there are many similarities - an educated and motivated population, a government committed to building economic advantage, and lots of cheap labor.  Those economies grew several thousand percent in GDP and stock index terms in 20 years.  The difference is that China has 10x the population of the current #2 GDP country - Japan.  So most Chinese and Indian stocks should be viewed as growth stocks, with 1000%+ growth likely over the next decades.  Taking up the issue of comparative P/E again, when evaluating a growth stock, P/E is largely irrelevant.  PEG, Sales growth, competitive advantage, and size of market are better indicators.  Throw in the likelyhood of a 20% or more dollar decline over the next few years and there&#39;s no likely scenario where US stock indices outperform China or Indian stock indices over the next 20 years. All the verbiage above is just reason to expect the trend over the last 5 years to continue - see &lt;a href=&quot;http://www.usfunds.com/docs/press/viewpress.asp?recordid=106&quot;&gt;this chart&lt;/a&gt; at the bottom of the page to compare what various international sectors have done.&lt;br /&gt;&lt;br /&gt;Looking at US bonds, the decision is even easier - who wants to get a 5-10% return in a currency that is declining and an inflation rate that is well above the yield?  For those of you that believe that inflation is low, read &lt;a href=&quot;http://bigpicture.typepad.com/comments/2007/05/inflation_confi.html&quot;&gt;this&lt;/a&gt; - the CPI numbers you hear about in the news are just plain wrong.  Its tough to get an accurate number since the government misreports it, but just think about how much the major components of what you buy - housing, gas, food have gone up and its easy to see that holding a bond at 6% is losing money, even before you factor in the likelyhood of higher future inflation and thus a decline in the price of the bond.&lt;br /&gt;&lt;br /&gt;Based on the above, I&#39;ve sold most of my US based stock and all my bond investments in favor of investing primarily in stocks and currencies in China, India, Brazil, and Eastern Europe.  I&#39;m holding the stocks and funds listed earlier and waiting for a dip before loading up on more Chinese and Indian investments.  When the dip occurs, I&#39;m considering financial sector investments in these countries that benefit from protectionism and gain from overall GDP growth.   China Life (LFC), a major insurer is one idea, I&#39;m looking for more.  The recent concentration of miners in the commodities markets also make for monopoly profit potential - BHP and Rio Tinto.  I&#39;d also like to find some good agricultural commodity plays, but haven&#39;t found any yet - let me know if you have any ideas.  There&#39;s RJA but its not very liquid.  I will also buy into the major indexes of each country when the dip occurs using ETFs.    &lt;br /&gt;&lt;br /&gt;In addition to the now well known Chinese and Indian growth stories, there are other smaller and riskier countries whose indexes have gotten hot recently - Vietnam, Turkey, Saudi Arabia, etc.  Several of these smaller markets have experience big run ups in the last year.  I&#39;m less optimistic about the long term prospects for these markets because they lack the vast supply of cheap labor and economies of scale that can accrue to large economies.  However since some of them are rising from tiny bases, there may be some good short term opportunities among them.  Frankly I just don&#39;t know enough to warrant placing any bets.  Any ideas readers?&lt;br /&gt;&lt;br /&gt;The few US based long positions I hold are stocks that do well in high inflation environments, have big technology advantages, have substantial foreign revenue, and/or gain with commodity prices.  XOM, GOOG, Apple, and KMP fit the bill.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Near Term Outlook (1 year)&lt;/span&gt;&lt;br /&gt;Volatility can be your friend or your enemy.  Many US based investment pundits still position emerging market stocks as risky investments.  From the above you can probably see that in the long term, I think US based stocks are much more risky.  The volatility of Chinese and Indian stocks is what you want to get big gains.  However in the short term, 10% daily swings in price can be unnerving.  For money you want to use for other purposes inside of 7-10 years, the hot markets of India and China are risky.  I have a bucket of money, about half my portfolio in various tax exempt and foreign accounts that I have no plans to use before retirement, at least 20 years away.  100% of that is going into long positions in foreign markets and currencies.   However the other half of my portfolio which I plan to use to buy a house in the next year is mostly in cash and US based short positions.  Why?  Because there&#39;s  high likelyhood of a significant decline in global markets in the next year.  The US is at the end of the typical 4 year investment cycle, and foreign markets have seen huge gains in the last few years - the probability of a pullback is increasing.  If the US goes into recession there will be a mild global short term pullback, probably a good buying opportunity internationally. &lt;br /&gt;&lt;br /&gt;So what about those shorts?  The banks, the builders, the building suppliers, the mortgage bankers have all seen dramatic declines already.  I&#39;ve closed out shorts on SPF, RSTO, and CFC after 50-80% declines.  I&#39;m considering shorting Citi and maybe some of the mortgage insurers, even though they are all well down already.  The bet is that the housing market will continue to decline (likely) and there are some real bankruptcy potentials for the financials that have big exposure (less likely but possible).  A better bet might be to identify areas that are lagging correlates to housing, like consumer retail spending, but I haven&#39;t had a chance to determine what the best areas are.  Any ideas would be appreciated.&lt;br /&gt;&lt;br /&gt;An area I&#39;m currently shorting is the NASDAQ.  In past US downturns we&#39;ve seen the NASDAQ take a big hit, because corporate technology purchases are partially discretionary spending, and partly due to P/E compression on the many high tech story stocks.  This time the NASDAQ is less overheated than last time, however the contraction in spending will still occur.  There&#39;s also another force at work that may damage the major tech companies like Oracle, Microsoft, NTAP, EMC, IBM and others.  That force is open source software and a new architecture for web based software.  A survey I recently completed of 30 top Web companies like Google and Facebook shows that web companies have largely abandoned the hardware and software sold by the US tech majors in favor of internally built software based on open source software and commodity hardware.  In addition, I&#39;m seeing the leading edge of small business - startups - begin to adopt web based software instead of Microsoft&#39;s desktop and server software - think Google (and Yahoo) apps for small business.  For the last few months I&#39;ve been using Google Apps for small biz side by side with Microsoft&#39;s latest desktop apps and OS and find that the Google stuff is dramatically superior in most respects.  Eventually this new architecture will spill over the early adopter parts in the enterprise, cutting off the major&#39;s primary source of profits.  A recession just might be the trigger to force a architecture reevaluation, particularly in the hard hit banking/investment sector that have been tech early adopters. &lt;br /&gt;&lt;br /&gt;I&#39;m looking forward to hearing what you think.&lt;br /&gt;&lt;/div&gt;</description><link>http://blog.henriquez.net/2007/12/year-end-investment-roundup.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-7181902371850759074</guid><pubDate>Tue, 27 Nov 2007 19:17:00 +0000</pubDate><atom:updated>2008-01-09T22:51:04.816-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">IDE Rails RoR Linux</category><title>Best IDE for Rails on Linux</title><description>&lt;div style=&quot;font-family:arial;&quot;&gt;&lt;br /&gt;Recently I went shopping for a new IDE.  I was developing on a 1GB Linux machine using the Aptana packaging of RadRails on top of Eclipse.  A new Aptana release came out that pushed the RAM usage past 1GB.  I was also getting increasingly annoyed at RadRails - autocompletion was more of a hindrance than a help, search was poorly designed, and weird behavior resulted on long lines.  Nevertheless the level of Rails and Ruby integration was nice - there was no going back to VIM.&lt;br /&gt;&lt;br /&gt;My trip to the Google open source shopping mall yielded a few positive reviews of the Netbeans IDE Beta 2.  I installed it and there&#39;s no going back.  After about a week of usage I&#39;m still exploring NetBeans functionality so there may be some things I&#39;m missing, but here&#39;s what I like about Netbeans so far:&lt;br /&gt;&lt;br /&gt;1. Autocompletion works.  For rhtml, for ruby, for css.  It helps rather than gets in the way.&lt;br /&gt;2. Long lines, no problem&lt;br /&gt;3. Still a memory hog, but uses less RAM than Eclipse.&lt;br /&gt;4. Easier to install than Aptana/Eclipse/Radrails&lt;br /&gt;5. Support for in-IDE Mongrel execution, log display and debugging.&lt;br /&gt;6. Most of the stuff you want in an IDE, if somewhat less than Eclipse.  Most of the Rails specific functionality is presented when you right click the name of a project in the left hand navigation bar.  Plugin installation, subversion integration, etc. lives here.  I haven&#39;t tested any of this yet because I usually use the command line, but its there if you need it.&lt;br /&gt;&lt;br /&gt;There was only one gotcha so far.  The 1GB Linux machine was running Redhat ES 4, a two year old version.  For some reason the fonts in Netbeans were screwed up on that machine, but not on my other Fedora 7 machine.  So I switched machines and coded happily ever after.&lt;br /&gt;&lt;br /&gt;You can download the ruby version of netbeans &lt;a href=&quot;http://download.netbeans.org/netbeans/6.0/rc2/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;</description><link>http://blog.henriquez.net/2007/11/best-ide-for-rails-on-linux.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4837083515732949131.post-2935855990387479165</guid><pubDate>Thu, 27 Sep 2007 21:55:00 +0000</pubDate><atom:updated>2007-09-28T22:15:00.295-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">open source pricing</category><title>Compare yourself to open source, not proprietary offerings</title><description>&lt;div style=&quot;font-family:arial;&quot;&gt;&lt;br /&gt;I often hear from enterprise IT focused startups that one of the reasons they are going to be successful is that they will have a lower price than [name of top vendor in their product class].  This is very tempting today because its easy to use commodity hardware, put some software on top, and sell it with healthy margins way below what the larger enterprise server/software/networking/storage vendors do.  &lt;br /&gt;&lt;br /&gt;Unfortunately these types of product plans usually fail for two reasons.  First, using commodity hardware isn&#39;t a cost advantage, since its available to anyone. You&#39;ll have competition at that lower price point, lots of it.  &lt;br /&gt;&lt;br /&gt;The second reason is open source and advertising supported online services.  Its increasingly hard to find product categories that are not addressed by one or both.  To beat free you need to have functionality that people prefer.  If you&#39;re free too, well you still need to have functionality that people prefer.  &lt;br /&gt;&lt;br /&gt;If you&#39;re reading this and you&#39;re from a web company or have experience with open source, all this will seem obvious to you, but judging from the list of recently funded startups, there are many entrepreneurs and VCs that haven&#39;t grokked it yet.  If you come from the enterprise IT world, either as a vendor or a customer, you might look around at the enterprise&#39;s Microsoft .NET web infrastructure, their Oracle database, their EMC storage, and think that open source is just a cute toy used only by the long hairs.  The problem is that today the enterprise is a late adopter - not a good indicator of where opportunity lies for startups.  The late adopters aren&#39;t going to buy your widget because you don&#39;t have 50 site references, integration with their legacy stuff, or a sales force that can take them on boondoggles to Pebble Beach.  So you have to be able to beat the open source or free online competitor used by the early adopters.  The early adopters are other startups, government research labs, academia, and web companies.  And the software stack for early adopters is rapidly converging on 100% open source, with whatever they&#39;ve developed in-house layered on top.  On the hardware side, its getting harder and harder to find proprietary stuff beyond Intel servers, SATA disk, and a few routers and load balancers.   &lt;br /&gt;&lt;br /&gt;So if the product segment you&#39;re targeting has open source (or free online) competitors, compare yourself in terms of price performance to the open source solutions, not to the proprietary stuff that the late adopters are buying.    Does this mean you have to be open source as well?  Maybe.  Open source conveys so many benefits beyond price that early adopters now prefer it because of superior (and free) support from the community of users, ease of customization, performance, and quality.  If your widget is an order of magnitude better on a dimension critical to users, you might overcome these advantages despite being proprietary, but you better be really sure users value your product.  &lt;br /&gt;&lt;/div&gt;</description><link>http://blog.henriquez.net/2007/09/lower-pricing-shouldnt-be-cornerstone.html</link><author>noreply@blogger.com (Logan Henriquez)</author><thr:total>0</thr:total></item></channel></rss>