<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>John Wang online</title>
	<atom:link href="http://johnwang.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://johnwang.com</link>
	<description></description>
	<lastBuildDate>Tue, 21 Feb 2012 02:29:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Base58: Fast Hashing with GMP</title>
		<link>http://johnwang.com/base58-fast-hashing-with-gmp/</link>
		<comments>http://johnwang.com/base58-fast-hashing-with-gmp/#comments</comments>
		<pubDate>Fri, 17 Feb 2012 19:37:42 +0000</pubDate>
		<dc:creator>John Wang</dc:creator>
				<category><![CDATA[Grokbase]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://johnwang.com/?p=1215</guid>
		<description><![CDATA[Base58 is an alternative to Base64 that is growing in popularity for case-sensitive encodings due to several characteristics including multi-protocol-safety and human-readability. It is used by Flickr, Bitcoin, and now Grokbase. The general characteristics of Base58 are that it uses &#8230; <a href="http://johnwang.com/base58-fast-hashing-with-gmp/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Base58 is an alternative to Base64 that is growing in popularity for case-sensitive encodings due to several characteristics including multi-protocol-safety and human-readability. It is used by <a href="http://www.flickr.com/groups/api/discuss/72157616713786392">Flickr</a>, <a href="https://en.bitcoin.it/wiki/Base58Check_encoding">Bitcoin</a>, and now <a href="http://grokbase.com">Grokbase</a>. The general characteristics of Base58 are that it uses the protocol-safe alpha-numeric alphabet (Base62) and excludes easy to confuse digits. Both Flickr and Grokbase use [0-9a-zA-Z] excluding [0O1l] while Bitcoin uses [0-9A-Za-z] excluding [0O1l].</p>
<p>Grokbase uses MD5 hashes of email addresses for UIDs and when I did the update, there were over 500,000 user profiles in the system so I wanted a fast encoder. I ended using GMP with tr and released the code as <a href="https://metacpan.org/module/Encode::Base58::GMP">Encode::Base58::GMP</a> for <a href="http://perl.org">Perl</a> and <a href="http://rubygems.org/gems/base58_gmp">base58gmp</a> for <a href="http://ruby-lang.org">Ruby</a>.</p>
<p>As for how much faster, I ran a few benchmarks comparing Encode::Base58::GMP to the pure Perl <a href="https://metacpan.org/module/Encode::Base58">Encode::Base58</a> implementation by <a href="http://bulknews.typepad.com/">Miyagawa</a> and found that the GMP version was about 700x (70,000%) faster encoding MD5 hex values using the Ubuntu 11.10 system Perl. However, for 32-bit integers, the pure Perl version was faster by about 50%.</p>
<p>Two notes about these numbers:</p>
<ol>
<li>Ubuntu 11.10 x86_64 system Perl isn&#8217;t compiled with 64-bit integer support and Encode::Base58 needs integers so I used <a href="https://metacpan.org/module/bignum">bignum</a> to enable hex() support. One possibilty is to compile a Perl with 64-bit int support; however, Ubuntu system Perl is part of my stack and many others also rely on system Perl so I left it as that.</li>
<li><a href="https://metacpan.org/module/Math::GMPz">Math::GMPz</a> can accept hex values natively and since the goal was to generate MD5 values, I bypassed the integer conversion used with Encode::Base58. When adding integer conversion, GMP based encoding is still faster but drops by an order of magnitude.</li>
</ol>
<p><strong>70,000% Faster for MD5 (BigInts)</strong></p>
<pre>use strict;
use warnings;

use Benchmark qw/cmpthese/;
use bignum qw/hex/;
use Encode::Base58;
use Encode::Base58::GMP;
use Digest::MD5 qw/md5_hex/;

cmpthese(-5, {
  pp  => sub {
    Encode::Base58::encode_base58(hex(md5_hex(rand())))
  },
  gmp => sub {
    Encode::Base58::GMP::encode_base58('0x'.md5_hex(rand()))
  }
} );</pre>
<p>Here is a sample result:</p>
<pre>       Rate     pp    gmp
pp    111/s     --  -100%
gmp 79644/s 71484%     --</pre>
<p><span style="display:none"><br />
        Rate     pp    gmp<br />
pp     209/s     &#8212;  -100%<br />
gmp 168636/s 80644%     &#8211;</span></p>
<p><strong>33% Slower on 32-bit Ints</strong></p>
<p>Here are some results using 32-bit integers.</p>
<pre>cmpthese(-5, {
  pp  => sub {
    Encode::Base58::encode_base58(int(rand 2**32))
  },
  gmp => sub {
    Encode::Base58::GMP::encode_base58(int(rand 2**32))
  }
} );</pre>
<pre>       Rate  gmp   pp
gmp 66733/s   -- -32%
pp  98803/s  48%   --</pre>
<p><span style="display:none"><br />
        Rate  gmp   pp<br />
gmp 161754/s   &#8212; -33%<br />
pp  243206/s  50%   &#8211;</span></p>
<p><strong>Conclusion</strong></p>
<p>While GMP-based encoding is about 33% slower for 32-bit ints, it is significantly faster for 64-bit ints on Ubuntu 11.10 system Perl and very desirable for creating hashes. Numbers will vary with a Perl compiled with 64-bit int support.</p>
<p><strong>Note: Grokbase User URLs</strong></p>
<p>Currently, the Grokbase profile URLs use unsalted MD5 Base58 hashes of email addresses so you can find anyone&#8217;s profile page using the following:</p>
<pre>use Encode::Base58::GMP qw/md5_base58/;

my $url = 'http://grokbase.com/user/-/'
        . md5_base58( 'test@example.com' );</pre>
<p>The &#8216;-&#8217; after &#8216;/user&#8217; will get redirected to the user&#8217;s display name as shown in their emails.</p>
<p>Using an unsalted MD5 hash is similar to how <a href="http://en.gravatar.com/">Gravatar</a> works and has the added benefit of simply requiring a hex to Base58 conversion to convert a Gravatar UID to a Grokbase UID.</p>
<p><strong>Credits:</strong></p>
<ul>
<li><a href="http://marcus.bointon.com/archives/92-PHP-Base-62-encoding.html">Marcus Bointon</a>&#8216;s article on Base62 encoding using GMP provided the initial idea of using GMP for arbitrary-base transcoding.</li>
<li><a href="http://fwiw.heroku.com/">Sam Rawlins</a> provided an update for <a href="http://rubygems.org/gems/gmp">Ruby&#8217;s gmp</a> to handle arbitrary-base decoding.</li>
<li>Case Van Horsen provided an update for <a href="http://pypi.python.org/pypi/gmpy/1.02">Python&#8217;s gmpy</a> to support Base37-62.</li>
<ul>
]]></content:encoded>
			<wfw:commentRss>http://johnwang.com/base58-fast-hashing-with-gmp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Confident Code Using Systematic, Automated Input Validation</title>
		<link>http://johnwang.com/confident-code-using-systematic-automated-input-validation/</link>
		<comments>http://johnwang.com/confident-code-using-systematic-automated-input-validation/#comments</comments>
		<pubDate>Fri, 11 Nov 2011 16:50:16 +0000</pubDate>
		<dc:creator>John Wang</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[Hacker News]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://johnwang.com/?p=879</guid>
		<description><![CDATA[The other day on Hacker News, there was a good discussion of Avdi Grimm&#8216;s talk on how to write Confident Code given at this year&#8217;s Ruby Midwest. He covers four areas: gather input, perform work, deliver results and handle failure. &#8230; <a href="http://johnwang.com/confident-code-using-systematic-automated-input-validation/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The other day on <a href="http://news.ycombinator.com/item?id=3218882">Hacker News</a>, there was a good discussion of <a href="http://about.avdi.org/">Avdi Grimm</a>&#8216;s talk on how to write <a href="http://avdi.org/talks/confident-code-rubymidwest-2011/">Confident Code</a> given at this year&#8217;s <a href="http://www.rubymidwest.com/">Ruby Midwest</a>. He covers four areas: gather input, perform work, deliver results and handle failure. Here are links to the code example showing the <a href="http://avdi.org/talks/confident-code-rubymidwest-2011/timid-code-plain.png">initial, timid</a> and <a href="http://avdi.org/talks/confident-code-railsconf-2011/confident-code-annotated.png">final, confident</a> code. I&#8217;ll just cover the input gathering step because I think systematic, automated, input validation it is vital for improving coding efficiency and minimizing boilerplate.</p>
<p>Most of this can actually be done using something like Ruby&#8217;s <a href="http://doodle.rubyforge.org/">Doodle</a>. It does not appear that Doodle is very popular yet (21 all time messages in the mailing list) though I think it would be good if it were more so.</p>
<p>More popular is <a href="http://stevan-little.blogspot.com/">Stevan Little</a>&#8216;s <a href="http://moose.iinteractive.com/">Moose</a> for Perl which has <a href="https://metacpan.org/module/Moose#CONTRIBUTORS">28 named contributors</a>. While I like to read about many technologies I generally like to use more mature and popular technologies than less so I&#8217;ve been using Perl&#8217;s Moose and haven&#8217;t coded with Doodle yet.</p>
<p>To show how Moose is powerful, let&#8217;s write the Confident Code example in Perl</p>
<p><strong>Confident Code in Moose</strong></p>
<p>I whipped this up for discussion so it can definitely be refined, however, it should get the ideas across. Here are some things that are covered:</p>
<ol>
<li>Input Validation: Inputs are typed and given default values in both attributes (e.g. width as an Integer with default 40) and methods (e.g. messages as an ArrayRef of Strings &#8211; ArrayRef[Str])</li>
<li>Separation of Concerns: attributes and methods are conveniently separated for easier maintenance and testing</li>
<li>Output: IO::All is used for output, defaulting to STDOUT (i.e. &#8216;-&#8217;)</li>
</ol>
<pre style="background: black;"><span style="background: black; color: white; font-size: 90%;">use MooseX::Declare;

class CowsayTheMooseway {
  use Capture::Tiny qw(capture_merged);
  use IO::All;
  use Log::Log4perl qw(:easy);
  Log::Log4perl->easy_init($INFO);

  has width       => ( isa => 'Int', is => 'rw', default => 40      );
  has eyes        => ( isa => 'Str', is => 'rw', default => ''      );
  has cowfile     => ( isa => 'Str', is => 'rw', default => 'moose' );
  has destination => ( isa => 'Str', is => 'rw', default => '-'     );

  method command {
    my $command = 'cowsay -W ' . $self->width;
    $command .= ' -e '.$self->eyes    if $self->eyes;
    $command .= ' -f '.$self->cowfile if $self->cowfile;
  }

  method say (ArrayRef[Str] $messages) {
    my $command = $self->command;
    my $output = capture_merged {
      system "$command $_" for @$messages;
    };
    $output > io $self->destination;
    INFO "wrote to ".$self->destination;
  }
}</span></pre>
<p>Note how the input attributes and methods are all separated cleanly with their own input types.</p>
<p>Here&#8217;s how to run the class:</p>
<pre style="background: black;"><span style="background: black; color: white; font-size: 90%;">use CowsayTheMooseway;

CowsayTheMooseway->new(
  destination => 'moo.txt'
)->say([
  'Psst...Want More Confidence?',
  'Here is How',
  'Moose This Way'
]);</span></pre>
<p>And the results:</p>
<pre style="background: black;"><span style="background: black; color: white; font-size: 90%;"> ______________________________
< Psst...Want More Confidence? >
 ------------------------------
  \
   \   \_\_    _/_/
    \      \__/
           (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||
 _____________
< Here is How >
 -------------
  \
   \   \_\_    _/_/
    \      \__/
           (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||
 ________________
< Moose This Way >
 ----------------
  \
   \   \_\_    _/_/
    \      \__/
           (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||</span></pre>
<p>Let me know what you think. Should this type of coding be done in Ruby? Is Doodle the way to go or is there something else? Can the Perl code be improved?</p>
]]></content:encoded>
			<wfw:commentRss>http://johnwang.com/confident-code-using-systematic-automated-input-validation/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Explaining Why Moose is Awesome &#8211; The Direct Way</title>
		<link>http://johnwang.com/explaining-why-moose-is-awesome-the-direct-way/</link>
		<comments>http://johnwang.com/explaining-why-moose-is-awesome-the-direct-way/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 16:43:11 +0000</pubDate>
		<dc:creator>John Wang</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://johnwang.com/?p=537</guid>
		<description><![CDATA[The Perl community knows that Moose is awesome as evidenced by the amount of talks at YAPC and the number of times it is mentioned on blog articles and discussion boards. However, to me, what often seems to get lost &#8230; <a href="http://johnwang.com/explaining-why-moose-is-awesome-the-direct-way/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The Perl community knows that <a href="http://www.iinteractive.com/moose">Moose</a> is awesome as evidenced by the amount of talks at <a href="http://www.yapc.org/">YAPC</a> and the number of times it is mentioned on blog articles and discussion boards. However, to me, what often seems to get lost is why Moose is awesome and why it is relevant, especially to those outside the Perl community. At the same time, I think it is vitally important to simply and directly convey why Moose is awesome to both increase Perl awareness and encourage other languages to adopt similar techniques.</p>
<p>This article covers how I explain Moose and why I think it not only addresses the key concerns with Perl but makes it more attractive when compared to some other languages as they are today.</p>
<p>The ideas here started when I was recently showing off a project of mine to a YC-funded Xoogler that asked me what it was written in. When I told him it was mostly Perl, he said, &#8220;<strong>Oh Perl, you&#8217;re old school!</strong>&#8221; I could have left it at that if it were true, but it wasn&#8217;t and I wanted to explain why it wasn&#8217;t. I had specifically chosen Perl for this project in 2011 over Python because it provided things that were not yet in (or popular in) other languages. This is how I presented it.</p>
<p><strong>Why: Moose makes Perl more Maintainable than Other Languages</strong></p>
<p>Nothing is more attention grabbing than saying something opposite to what people expect so this is exactly what I said. Of course, the gauntlet was already thrown so I wanted to respond in kind. I was able to say this honestly because I backed it up using my recent experiences using Perl and JavaScript with some Ruby, Python and C#. At the same time, it is important to tell it as it is and not sugar coat things. I&#8217;ve had my share of head scratching when looking at my own 6-month old pre-Moose Perl code so I&#8217;m painfully aware of Perl&#8217;s write once reputation.</p>
<p>The way I explain it is that while it can be argued that some languages may be cleaner than Perl on a line-by-line basis, my view is that Moose makes Perl cleaner and more maintainable on a class and method basis. By providing an expressive attribute getter/setter system, Moose helps you freeze APIs and limit the scope for maintainability to the attribute / method level. It does this by adding one key feature&#8230;</p>
<p><strong>How: Moose adds Static Typing to Getters and Setters</strong></p>
<p>What Moose really does is add type checking to getters and setters. While it supports some built-in types (integers, numbers, strings, arrayrefs, hashrefs, etc.), the real power is in composite types like an arrayref of objects e.g. &#8216;ArrayRef[Email::Simple]&#8216;. By freezing the API, Moose improves coding speed and reduces errors, enabling me to write 1000s of lines of code and having it all run with minimal typo correction. The great thing about this explanation is that static typing is something that people are generally looking at and interested in for many dynamic languages so once you get this point across, the benefits are easily understood and don&#8217;t have to be explained further.</p>
<p><strong>Bonus: Moose Eliminates Write Once Code</strong></p>
<p>Generally, I don&#8217;t have to go further than explaining static typing with Moose; however, it can be useful to note that Moose also eliminates write-once Perl code by providing a &#8220;template&#8221; for getter/setter creation. Creating classes this way ensures that your classes will follow well-ordered, well-understood convention. After having to maintain several old pre-Moose Perl apps, I was pleasantly surprised when I opened a 6 month old Moose class and had to double-check to see if it was written months ago or just the other day.</p>
<p><strong>Summary</strong></p>
<p>So there you have it. In one fell swoop, the key benefits of Moose are explained in a way that addresses long-running, key concerns with Perl with key features not yet readily available, but often desired, in other languages.</p>
<p>By succinctly explaining why Moose is awesome, hopefully we can raise more awareness for the great work being done by the Moose team and the Perl ecosystem.</p>
<p><strong>What You Can Do</strong></p>
<p>If you like this approach, one thing that can be done to more quickly explain the effectiveness of Moose programming is to create side-by-side code examples of code with Moose and without Moose, in other languages. This is often done to compare and contrast languages and I think it would be useful to more succinctly explain the benefits here. Expressive modern Perl code can impress those outside the community, there just needs to be more of it.</p>
]]></content:encoded>
			<wfw:commentRss>http://johnwang.com/explaining-why-moose-is-awesome-the-direct-way/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Perl and Python &#8211; Two Nights in Silicon Valley</title>
		<link>http://johnwang.com/perl-and-python-two-nights-in-silicon-valley/</link>
		<comments>http://johnwang.com/perl-and-python-two-nights-in-silicon-valley/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 07:22:34 +0000</pubDate>
		<dc:creator>John Wang</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Silicon Valley]]></category>

		<guid isPermaLink="false">http://johnwang.com/?p=452</guid>
		<description><![CDATA[One of the well-touted advantages of living in Silicon Valley is that it is a crucible of talent. Along with colleagues, conferences and unconferences, there are many regular user groups in the valley, of which I&#8217;ve attended several. This past &#8230; <a href="http://johnwang.com/perl-and-python-two-nights-in-silicon-valley/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>One of the well-touted advantages of living in Silicon Valley is that it is a crucible of talent. Along with colleagues, conferences and unconferences, there are many regular user groups in the valley, of which I&#8217;ve attended several. This past week, I decided to check out the local <a href="http://sf.pm.org/">SF Perl Mongers</a> and <a href="http://www.baypiggies.net/">BayPIGgies</a> (Python) which both had meetings.</p>
<p><strong>Night One &#8211; SF Perl Mongers</strong></p>
<p>I&#8217;ve been to two YAPCs but this was my first SF Mongers meeting and I was pleasantly surprised. As it happens, the talk was being given by <a href="http://ingy.net">Ingy döt Net</a>, the creator of <a href="http://www.yaml.org/">YAML</a>, who I met briefly several years ago. I also got to meet up with <a href="http://www.wall.org/~larry/">Larry Wall</a> and <a href="http://bulknews.typepad.com/blog/">Miyagawa</a>, both of whom I last spoke with at YAPC::NA, as well as new acquaintances including Catalyst core team members Tom Doran (who I recognized from his Gravatar) and <a href="http://perldition.org/">Florian Ragwitz (rafl)</a>. Tom and Florian were here from Europe courtesy of <a href="http://google.com">Google</a> for their participation in the <a href="http://code.google.com/soc/">Google Summer of Code</a>.</p>
<p>Ingy&#8217;s talk was on <a href="http://www.acmeism.org/">Acmeism</a>, his movement to simultanenously write code in multiple object-oriented languages including JavaScript, Perl, PHP, Python and Ruby among many others. The genesis of this project seemed to be from his experience with YAML where each language would have it&#8217;s own, often slightly different, implementation. With Acemeism, changes could be pushed out to multiple languages with one code update. I can see the advantage of Acmeism for a cross-language library that requires interoperability. For example, it would be great if there was only one interoperable version of <a href="http://oldhome.schmorp.de/marc/liblzf.html">LZF compression</a>; however, it seems that not only does each language have a non-interoperable implementation, there may be multiple non-interoperable implementations per language. More generally, I&#8217;ve been interested in the compilation of interpreted code to C/C++ for the performance boost, a la <a href="https://github.com/facebook/hiphop-php/wiki/">Facebook&#8217;s Hip Hop</a>, and did mentioned this to Larry in the context of <a href="http://www.iinteractive.com/moose/">Moose</a> and <a href="http://perl6.org">Perl 6</a>.</p>
<p>Afterwards, we went over to <a href="http://21st-amendment.com/">21st Amendment Brewery</a> for some drinks and dinner.</p>
<p><strong>Night Two &#8211; Python BayPIGgies</strong></p>
<p>This meeting was run by a few folks from Google, including <a href="http://jjinux.blogspot.com">JJ Behrens</a>, from the YouTube API team, and <a href="http://cyberwebconsulting.com">Wesley Chun</a>, a developer advocate based in SF. Both JJ and Wesley were held up so we were treated to a talk by <a href="https://plus.google.com/106273672060692715136/posts">Alex Martelli</a> the #2 ranked &#8220;Famous Python Programmer at Google&#8221; according to Wesley&#8217;s slides he was giving. Alex, JJ and Wesley all provided great talks and insights.</p>
<p>Some good takeaways from the night included:</p>
<ol>
<li>The original spidering code for the crawler was done in Python by a part-timer who received a 5% equity stake.</li>
<li>Back when Google Video and YouTube were competitors, the YouTube team was out-innovating the Google team because they were using Python while the Google team was using C++.</li>
<li>While Python is one of the approved deployment languages, it is used mostly in the back-end sysadmin, deployment and QA code. The user apps are either in C++ or are moving that way which can provide up to a 20% speed up.</li>
<li><a href="http://pypy.org/">PyPy</a> was recommended by Wesley as a faster version of Python that is also faster than CPython on many tests. Digging into PyPy a bit afterwards, I was pleasantly surprised to learn it&#8217;s written in RPython, a statically-typed restricted version.</li>
</ol>
<p>From Google&#8217;s perspective, it seems like Python is great for rapid prototyping and competitive feature deployment as well as back-end work; however, once the feature set is relatively stable, there are performance gains to be had from porting the user-facing applications. While perhaps not the approach, everyone would take, it&#8217;s interesting to hear their perspective.</p>
<p>Afterwards we broke up and went our own ways. There did not seem to be the same desire to hang out afterwards as in SF.</p>
<p>Both presentations were posted online:</p>
<ol>
<li><a href="https://docs.google.com/viewer?a=v&#038;pid=explorer&#038;chrome=true&#038;srcid=0B_Z56A18VRlxNTlmOWVlY2ItNTZmZS00NGVlLWE2MzktMmVlNTI2M2RkNTcy&#038;hl=en_US">Wesley&#8217;s Python @ Google (IO 2011) presentation</li>
<li><a href="https://docs.google.com/viewer?a=v&#038;pid=explorer&#038;chrome=true&#038;srcid=0B_Z56A18VRlxMGQyYzNiZTQtMWM5Ny00Zjc0LTk5ZmYtNTU5MGQ0YmRmZGU3&#038;hl=en_US">JJ&#8217;s YouTube for Business presentation</a></li>
</ol>
<p><strong>Summary</strong></p>
<p>I was impressed by the people and knowledge gained at both meetings. They were intimate in size so it was easy to get to know people and engage in conversation. I&#8217;m looking forward to more meetings in the future.</p>
]]></content:encoded>
			<wfw:commentRss>http://johnwang.com/perl-and-python-two-nights-in-silicon-valley/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Filtering Popular Mailing List Discussions with DateTime</title>
		<link>http://johnwang.com/filtering-popular-mailing-list-discussions-with-datetime/</link>
		<comments>http://johnwang.com/filtering-popular-mailing-list-discussions-with-datetime/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 14:56:38 +0000</pubDate>
		<dc:creator>John Wang</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[Grokbase]]></category>

		<guid isPermaLink="false">http://johnwang.com/c/?p=295</guid>
		<description><![CDATA[Discovering Information via Better Browsing A great way to get into the thick of a new software project you want to learn or need to use is to check out popular mailing list discussions. Typically these will have detailed answers &#8230; <a href="http://johnwang.com/filtering-popular-mailing-list-discussions-with-datetime/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em style="font-size: 110%;">Discovering Information via Better Browsing</em></p>
<p>A great way to get into the thick of a new software project you want to learn or need to use is to check out popular mailing list discussions. Typically these will have detailed answers and multiple points of view. Recognizing this, <a href="http://grokbase.com">Grokbase</a> was designed to sort many things by popularity, or activity volume, such as <a href="http://grokbase.com/g/perl.org/win32-vanilla/popular">discussions</a>, <a href="http://grokbase.com/g/perl.org">groups</a>, <a href="http://grokbase.com/users">users</a>, etc. I found it useful enough that I made it the default monthly view and especially like getting a quick overview of a group by browsing these pages on my iPad using the monthly prev and next links.</p>
<p>I was recently chatting with <a href="http://blog.urth.org/">Dave Rolsky</a>, creator of the stalwart <a href="https://metacpan.org/module/DateTime">DateTime</a> and newer <a href="https://metacpan.org/module/Courriel">Courriel</a> email distributions, who mentioned it would be great if you could select popular discussions based on time periods longer than a month, such as 6 months or a year. It was easy to see where he was going with this. While sorting across all time is useful for curiosity once in a while, more recent popular discussions are what&#8217;s needed to keep up to date,</p>
<p>Needing a break from a larger project, I decided to see how quickly I could implement this. In the end, it took just a few hours from start to deployment, mostly helped by the fact that DateTime performs excellent date gymnastics. Finding the correct date to use was the easiest part using <a href="http://search.cpan.org/~drolsky/DateTime-0.70/lib/DateTime.pm#Datetime_Subtraction">DateTime&#8217;s subtraction feature</a>. DateTime&#8217;s functionality and excellent documentation made adding this feature a snap. In fact, the only thing it cost me was a little sleep <img src='http://johnwang.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>You can see the results on any of the more popular mailing lists such as <a href="http://grokbase.com/g/perl.org/perl5-porters/popular">Perl5 Porters (P5P)</a> as shown here. Under the popular tab, there are now filters for time periods from 3 months to 5 years and for all time. I have to say I find it fun to dig into mailing lists this way. More than blogs or articles, diving into P5P really makes you feel like you&#8217;re at a YAPC.</p>
<p><img style="border: 1px #aaa solid;" src="/cc/img/misc/ss_grokbase_date_filter_650x200.png" alt="" /></p>
<p>For more on DateTime, checkout the <a href="https://metacpan.org/module/DateTime">MetaCPAN page</a> and the <a href="http://grokbase.com/g/perl.org/datetime/popular/5-year">Grokbase list archive</a>.</p>
<p>Right now, this only accessible on the top popular tab. It is also enabled only for more popular groups where this is more likely to be useful. Try it out and let me know what you think.</p>
]]></content:encoded>
			<wfw:commentRss>http://johnwang.com/filtering-popular-mailing-list-discussions-with-datetime/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Tribute to Steve Jobs (1955-2011)</title>
		<link>http://johnwang.com/a-tribute-to-steve-jobs-1955-2011/</link>
		<comments>http://johnwang.com/a-tribute-to-steve-jobs-1955-2011/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 14:58:06 +0000</pubDate>
		<dc:creator>John Wang</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[marketing]]></category>

		<guid isPermaLink="false">http://johnwang.com/c/?p=250</guid>
		<description><![CDATA[Thinking Differently Steve Jobs has passed away and the world has lost someone that showed what could be accomplished with a singular and distinctive vision. His was an approach that fused usability, appearance and functionality into a cohesive whole. I&#8217;ve &#8230; <a href="http://johnwang.com/a-tribute-to-steve-jobs-1955-2011/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em style="font-size:110%">Thinking Differently</em></p>
<p>Steve Jobs has passed away and the world has lost someone that showed what could be accomplished with a singular and distinctive vision. His was an approach that fused usability, appearance and functionality into a cohesive whole. I&#8217;ve read many of the tributes and articles and two of which that stood out from me were ons that showed him on a more personal level as told by <a href="http://blog.stephenwolfram.com/2011/10/steve-jobs-a-few-memories/">Stephen Wolfram</a> and <a href="http://gamasutra.com/view/news/37762/Steve_Jobs_Atari_Employee_Number_40.php">Al Alcorn</a>.</p>
<p>My condolences to his family, friends, and colleagues during this difficult time.</p>
<p>For my tribute, I&#8217;ll simply list a few of his quotations that helped focus his efforts on his and his team&#8217;s achievements.</p>
<ol>
<li><a href="#steve_inspiration">Inspiration</a></li>
<li><a href="#steve_design">Design</a></li>
<li><a href="#steve_marketing">Marketing</a></li>
<li><a href="#steve_recruiting">Recruiting</a></li>
<li><a href="#steve_managing">Managing</a></li>
<li><a href="#steve_revenues">Revenues</a></li>
<li><a href="#steve_discipline">Discipline</a></li>
<li><a href="#steve_followyourheart">Follow Your Heart</a></li>
</ol>
<p><a name="steve_inspiration"></a><br />
<strong>1. Inspiration</strong></p>
<ul>
<li style="padding-bottom:1em"><em>We think the Mac will sell zillions, but we didn’t build the Mac for anybody else. <strong>We built it for ourselves</strong>. We were the group of people who were going to judge whether it was great or not. We weren’t going to go out and do market research. <strong>We just wanted to build the best thing we could build.</strong></em></li>
<li><em>Innovation has nothing to do with how many R&#038;D dollars you have. When Apple came up with the Mac, IBM was spending at least 100 times more on R&#038;D. <strong>It’s not about money. It’s about the people you have, how you’re led, and how much you get it.</strong></em></li>
</ul>
<p><a name="steve_design"></a><br />
<strong>2. Design</strong></p>
<ul>
<li style="padding-bottom:1em"><em>Unfortunately, that’s too rare a commodity. A lot of people in our industry haven’t had very diverse experiences. So they don’t have enough dots to connect, and they end up with very linear solutions without a broad perspective on the problem. <strong>The broader one’s understanding of the human experience, the better design we will have.</strong></em></li>
<li style="padding-bottom:1em"><em>That’s been one of my mantras — focus and simplicity. <strong>Simple can be harder than complex</strong>: You have to work hard to get your thinking clean to make it simple. But it’s worth it in the end because <strong>once you get there, you can move mountains</strong>.</em></li>
<li style="padding-bottom:1em"><em>Design is a funny word. Some people think design means how it looks. But of course, if you dig deeper, it’s really how it works. The design of the Mac wasn’t what it looked like, although that was part of it. Primarily, it was how it worked. <strong>To design something really well, you have to get it. You have to really grok what it’s all about. It takes a passionate commitment to really thoroughly understand something</strong>, chew it up, not just quickly swallow it. Most people don’t take the time to do that.</em></li>
</ul>
<p><a name="steve_marketing"></a><br />
<strong>3. Marketing</strong></p>
<ul>
<li style="padding-bottom:1em"><em>We&#8217;ve never worried about numbers. In the market place, Apple is trying to focus the spotlight on products, because products really make a difference. [...] Ad campaigns are necessary for competition; IBM&#8217;s ads are everywhere. But <strong>good PR educates people; that&#8217;s all it is. You can&#8217;t con people in this business. The products speak for themselves</strong>.</em></li>
<li style="padding-bottom:1em"><em><strong>It’s not about pop culture, and it’s not about fooling people, and it’s not about convincing people that they want something they don’t. We figure out what we want.</strong> And I think we’re pretty good at having the right discipline to think through whether a lot of other people are going to want it, too. That’s what we get paid to do. We just want to make great products.</em></li>
<li style="padding-bottom:1em"><em>Our DNA is as a consumer company – <strong>for that individual customer who’s voting thumbs up or thumbs down. That’s who we think about. And we think that our job is to take responsibility for the complete user experience</strong>. And if it’s not up to par, it’s our fault, plain and simply.</em></li>
</ul>
<p><a name="steve_recruiting"></a><br />
<strong>4. Recruiting</strong></p>
<ul>
<li style="padding-bottom:1em"><em>Recruiting is hard. It’s just finding the needles in the haystack. You can’t know enough in a one-hour interview. So, in the end, it’s ultimately based on your gut. How do I feel about this person? What are they like when they’re challenged? <strong>I ask everybody that: ‘Why are you here?’</strong> The answers themselves are not what you’re looking for. It’s the meta-data</em></li>
<li style="padding-bottom:1em"><em>When I hire somebody really senior, competence is the ante. They have to be really smart. But the real issue for me is, Are they going to fall in love with Apple? Because <strong>if they fall in love with Apple, everything else will take care of itself</strong>. They’ll want to do what’s best for Apple, not what’s best for them, what’s best for Steve, or anybody else.</em></li>
<li style="padding-bottom:1em"><em>We’ve had one of these before, when the dot-com bubble burst. What I told our company was that we were just going to invest our way through the downturn, that we weren’t going to lay off people, that <strong>we’d taken a tremendous amount of effort to get them into Apple in the first place – the last thing we were going to do is lay them off</strong>.</em></li>
</ul>
<p><a name="steve_managing"></a><br />
<strong>5. Managing</strong></p>
<ul>
<li style="padding-bottom:1em"><em>So <strong>when a good idea comes, you know, part of my job is to move it around, just see what different people think</strong>, get people talking about it, argue with people about it, get ideas moving among that group of 100 people, get different people together to explore different aspects of it quietly, and, you know – just explore things.</em></li>
<li style="padding-bottom:1em"><em><strong>My job is to not be easy on people. My job is to make them better</strong>.</em></li>
</ul>
<p><a name="steve_revenues"></a><br />
<strong>6. Revenues</strong></p>
<ul>
<li style="padding-bottom:1em"><em>A lot of companies have chosen to downsize, and maybe that was the right thing for them. We chose a different path. <strong>Our belief was that if we kept putting great products in front of customers, they would continue to open their wallets.</strong></em></li>
</ul>
<p><a name="steve_discipline"></a><br />
<strong>7. Discipline</strong></p>
<ul>
<li style="padding-bottom:1em"><em><strong>People think focus means saying yes</strong> to the thing you’ve got to focus on. But that’s not what it means at all. <strong>It means saying no to the hundred other good ideas that there are</strong>. You have to pick carefully.</em></li>
</ul>
<p><a name="steve_followyourheart"></a><br />
<strong>8. Follow Your Heart</strong></p>
<ul>
<li style="padding-bottom:1em"><em>Almost everything &#8211; all external expectations, all pride, all fear of embarrassment or failure &#8211; these things just fall away in the face of death, leaving only what is truly important.</li>
<li style="padding-bottom:1em">Remembering that you are going to die is the best way I know to avoid the trap of thinking you have something to lose.</li>
<li style="padding-bottom:1em">You are already naked. <strong>There is no reason not to follow your heart</strong>.</em></li>
</ul>
<p><strong>Summary</strong></p>
<p>Thank you Steve.</p>
<p>May you rest in peace.</p>
]]></content:encoded>
			<wfw:commentRss>http://johnwang.com/a-tribute-to-steve-jobs-1955-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why We Say &#8220;Performance Is A Feature&#8221;</title>
		<link>http://johnwang.com/why-we-say-performance-is-a-feature/</link>
		<comments>http://johnwang.com/why-we-say-performance-is-a-feature/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 02:26:27 +0000</pubDate>
		<dc:creator>John Wang</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://johnwang.com/c/?p=187</guid>
		<description><![CDATA[Singing the Praises of the Unsung Hero The phrase &#8220;Performance is a Feature&#8221; has been growing in popularity. Lately, it&#8217;s importance for me is underlined by the fact the most common response I get from showing off my early-stage mailing &#8230; <a href="http://johnwang.com/why-we-say-performance-is-a-feature/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em style="font-size: 110%;">Singing the Praises of the Unsung Hero</em></p>
<p>The phrase &#8220;Performance is a Feature&#8221; has been growing in popularity. Lately, it&#8217;s importance for me is underlined by the fact the most common response I get from showing off my early-stage mailing list archive, <a href="http://grokbase.com">Grokbase</a>, is that &#8220;it&#8217;s fast.&#8221; I first heard this idea similarly phrased in <a href="http://mashable.com/2011/03/24/think-quarterly/">Google&#8217;s Think Quartlerly</a> and then in <a href="http://www.codinghorror.com/blog/2011/06/performance-is-a-feature.html">Jeff Atwood&#8217;s Coding Horror</a> which was <a href="http://news.ycombinator.com/item?id=2676673">covered on Hacker News</a>. <a href="https://plus.google.com/111345372994173159594">Matt Brittin</a>, managing director of Google for UK and IE ops said it like this:</p>
<blockquote><p>At Google, we often think that speed is the forgotten ‘killer application’ – the ingredient that can differentiate winners from the rest. We know that the faster we deliver results, the more useful people find our service.</p></blockquote>
<p>I&#8217;ve worked in some high-performance environments (enterprise search for billion+ document archives) and written benchmark reports so I know performance is important; however, this got me thinking, sure &#8220;we&#8221; (those in the know) know that performance is important, but what about the meta-question, why is it important to say it is important?</p>
<p><strong>Motivation</strong></p>
<p>For me, the strongest reason for talking about Performance as a Feature is that it can help motivate and focus development. This is important because performance can be vitally important and yet be difficult to achieve and result in little to show using metrics such as lines of code and visible features. Indeed, a product screen shot can look exactly the same after a 100x speed up.</p>
<p>The reason performance can be hard to achieve is three fold.</p>
<ol>
<li><strong>Performance is (often) Mentally Challenging</strong><br />Often times, performance is an architectural problem-solving exercise and not the mere act of taking a requirement and executing on it. Additionally, often times you need to taken into account many domain-specific properties in order to fully optimize the system. So you may need to understand the problem space in detail, come up with a solution, and then communicate / convince others that the design should be accepted even before you get started coding.</li>
<li><strong>Performance is (often) not Greenfield</strong><br />Once you come up with a good solution, often times you cannot just implement it as you are improving an existing process. The new solution needs to integrate into the existing solution and either be a drop-in replacement or change the code around it. Like repainting a car after it gets dinged, the affected code can be much larger than the immediate problem. Further, if data conversion is needed, once the new code has been implemented, the conversion process may take longer than development or deployment.</li>
<li><strong>Performance is (often) Hard to See</strong><br/>Finally, it can be hard to tell your peers what you accomplished if what you accomplished was a performance improvement since there is nothing to see. To complicate matters, you are not necessarily working on a new product or even a new feature. Indeed, you may be <em>just</em> speeding up someone else&#8217;s creative work. That the speed-up itself is what makes the work useful at all may be hard to convey. Here, metrics tell the best story to other developers but to people using the app, it may be simply <em>fast</em>.</li>
</ol>
<p><strong>Summary</strong></p>
<p>As developers, we like to see the fruits of our labor and this often means working on new features that are visible and we can talk about. However, when talking to users, often times the first thing they notice and talk about may be your app&#8217;s performance. So when developing an app, it is important to remember, that:</p>
<blockquote><p>Performance is not just any feature, it may be a killer feature.</p></blockquote>
<p>Have you had to implement performance features? What were the challenges you faced?</p>
]]></content:encoded>
			<wfw:commentRss>http://johnwang.com/why-we-say-performance-is-a-feature/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>So You Want To Be A Coder</title>
		<link>http://johnwang.com/so-you-want-to-be-a-coder/</link>
		<comments>http://johnwang.com/so-you-want-to-be-a-coder/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 05:24:14 +0000</pubDate>
		<dc:creator>John Wang</dc:creator>
				<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://johnwang.com/blog/?p=42</guid>
		<description><![CDATA[Self-Directed Job Enlargement This article is dedicated to my friends and colleagues working in non-coding technical roles that wish to make a transition or at least increase the amount of coding in their work. The Dilemma In software development teams &#8230; <a href="http://johnwang.com/so-you-want-to-be-a-coder/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em style="font-size:110%">Self-Directed Job Enlargement</em></p>
<p>This article is dedicated to my friends and colleagues working in non-coding technical roles that wish to make a transition or at least increase the amount of coding in their work.</p>
<p><strong>The Dilemma</strong></p>
<p>In software development teams above a certain size, there are often software engineers and systems engineers (including testing, support, sales, and technical marketing engineers). On some of the teams I have been a part of, a number of systems engineers have wanted to become software engineers / coders but face a dilemma. The issue is that if they have not been hired on as a developer, are valued in their current systems role and have not proven themselves able coders, how can they start coding? The situation is often something like this:</p>
<ol>
<li>A systems engineer wants programming assignments but is not getting any</li>
<li>The development manager realizes the engineer wants to move into coding but does not see enough ability or demonstrable interest to assign coding tasks in lieu of tasks that need to be performed from a business perspective</li>
<li>Without coding tasks, the systems engineer feels he cannot demonstrate ability and thus become a coder</li>
</ol>
<p>So it seems we have a catch-22 where the systems engineer wants, but cannot find a way, to become a software developer which can lead to decreased job satisfaction.</p>
<p>So what can a systems engineer do? Beyond coding on the side and taking classes which may not impact work at the company, how can one get recognized for coding by your coding peers at the company?</p>
<p><strong>The Do It Yourself (DIY) Approach</strong></p>
<p>While I have never desired to become a full-time coder when I wasn&#8217;t hired on as one, I have had my code recognized at some companies and the ways I&#8217;ve done it may give you a leg up.</p>
<p>First of all, I don&#8217;t view coding as special discipline that only people specifically assigned to code do the coding, after all, most technology companies are not unionized. My view is that code is a tool, much like a spreadsheet is a tool. When you have a task that can use a spreadsheet, use a spreadsheet and when you have a task that can use some code, write some code.</p>
<p>One of the best ways to get started is to write some code to make your work more efficient. This way the code can be easily justified as one way to implement a work task and you&#8217;ll get used to coding as a natural part of how you work. If you are in an &#8220;Ops&#8221; role, you can also view this as a natural extension to &#8220;<a href="http://en.wikipedia.org/wiki/DevOps">DevOps</a>&#8220;. Once you can help yourself, you can move on to helping others and even entire teams. As people see your tools become useful, you will get more recognition as a coder and may formally move into a coding role once you are recognized as such.</p>
<p>As a firm believer in the <em>Do As I Do and Not As I Say</em> approach, here are some situations where I have written programs on the job where it wasn&#8217;t my formal responsibility and received recognition:</p>
<ol>
<li><strong>Be Pro-active</strong>
<p>The first part of coding for yourself is to take initiative and not wait until someone gives you a coding task, since you may be waiting a very long time. If you see something that might be interesting, roll up your sleeves and see what happens.</p>
<p>A while back, I would work with our customers on acceptance testing of our product. In this situation, our expertise and value was primarily in the C++ back-end; however our front-end code was available for inspection as it was coded a in dynamic, interpreted language. I thought the code could be a bit tighter here and since I was the one representing my firm on the front line, on my own time, I refactored our front end code. When I showed it to our development manager, it was recognized as good work, and I had a software developer assigned to integrate my code.</li>
<li><strong>Help yourself</strong>
<p>The great thing about coding is it can automate and improve consistency for repetitive tasks, making time-consuming tasks manageable and otherwise impossible tasks time-consuming. If you are faced with a task like this, write a program to help yourself out. Creating tools for yourself can have positive spill-over effects as well.</p>
<p>In one situation, we had not yet build an automated installer and I needed to run multiple installations / upgrades of our software on 6 servers. To streamline the then-manual process, I wrote an automated, &#8220;one click,&#8221; installation / configuration / upgrade script. Not only did others notice I had a one click installation for an otherwise-lengthy task via my installs and upgrades, it gave me some insight that I was able to contribute to our dev team when we did create a formal installer.</li>
<li><strong>Help a Colleague</strong>
<p>Once you can help yourself, you can move on to helping others. This requires additional skills as you&#8217;ll need to do requirements gathering and push multiple releases if your tool / program is successful. However, the rewards are much greater because now your skills are making an impact on the people around you.</p>
<p>While acting as a product manager ahead of a release, we had to update the localization of our product for a double-byte language where we had significant customers. We were facing significant schedule risk with our process so I worked with our translation and build engineers to create a tool to speed up the translation. We finished on time and the tool was useful enough that I updated it for several releases. Additionally, the colored, graphical status pages made the tool more usable by the translator and more noticeable by others from afar.</li>
<li><strong>Help an entire team and get the buzz out</strong>
<p>Finally, when you are ready, you can build an app that is used by many people internally. If successful, your app will go viral inside your organization and people will start creating a buzz about your code for you. The additional challenge from working closely with a few colleagues is that people you don&#8217;t normally work with will suddenly start asking you for your app and even have new product requirements you will need to manage.</p>
<p>In this case, the app I built is most likely still in use to derive competitive advantage so I&#8217;ll leave out the details. Our team was was working with a Fortune-50 account and I ended up building an app that was used by our team and presented to the client. We successfully closed the account due to many factors; however, it was recognized that this was a significant contribution. Eventually the app became important enough that it was actively requested by our staff (and escalated to higher management when I was otherwise too busy), mentioned by the CEO in all-hands staff meetings and attracted the attention of the CTO who took a personal interest in the app.</li>
</ol>
<p>In all of these situations, coding was not my responsibility but I took it upon myself to make my life and that of my colleages easier by coding. In the process, my code was recognized by peers including software engineers, systems engineers, salesmen and my CTO. It was also easy to justify spending my time on these coding projects because they improved the work we already needed to do.</p>
<p>While it was not my desire to become a coder in any of these situations, my projects received enough recognition that I believe it would be much easier for a development manager to justify a formal switch or assignments for someone if desired.</p>
<p><strong>Summary</strong></p>
<p>If you are in a situation where you want to code and need to get some recognition for coding before getting a formal role or task, find a project to make your life easier and more effective. If these projects impact the bottom line and if you can get your colleagues using and creating buzz about your apps, you&#8217;ll have gone a long way to showing your coding chops.</p>
<p>Have you made the transition from a non-coding role to a coding one? If so, how did you do it? What worked and what didn&#8217;t work?</p>
]]></content:encoded>
			<wfw:commentRss>http://johnwang.com/so-you-want-to-be-a-coder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Your Hands Around Email &#8211; Introduction</title>
		<link>http://johnwang.com/getting-your-hands-around-email-introduction/</link>
		<comments>http://johnwang.com/getting-your-hands-around-email-introduction/#comments</comments>
		<pubDate>Sat, 11 Dec 2010 09:39:53 +0000</pubDate>
		<dc:creator>John Wang</dc:creator>
				<category><![CDATA[eDiscovery]]></category>
		<category><![CDATA[EDRM]]></category>
		<category><![CDATA[EDRM Data Set]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[tech primer]]></category>

		<guid isPermaLink="false">http://grokify.com/?p=949</guid>
		<description><![CDATA[A little while back, Craig Ball wrote an article, &#8220;E-Mail Isn&#8217;t as Ethereal as You Might Think&#8221; for Law Technology News which described some high level basics of the MIME Internet mail format standard. Much more technical than the typical &#8230; <a href="http://johnwang.com/getting-your-hands-around-email-introduction/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="/getting-your-hands-around-email-introduction/"><img src="/cc/img/articles/icon_email_man_150x150.png" style="float:left;margin:4px;border:0"></a> A little while back, <a href="http://www.craigball.com/">Craig Ball</a> wrote an article, &#8220;<a href="http://www.law.com/jsp/lawtechnologynews/PubArticleLTN.jsp?id=1202471400254">E-Mail Isn&#8217;t as Ethereal as You Might Think</a>&#8221; for <a href="http://www.law.com/jsp/lawtechnologynews/index.jsp">Law Technology News</a> which described some high level basics of the <a href="http://en.wikipedia.org/wiki/MIME">MIME Internet mail format standard</a>. Much more technical than the typical LTN article, it highlighted the need for more articles and discussion on the ESI itself. In that vein, here is the first of several articles discussing and examining different email formats. Keep in mind that processing email for E-Discovery may be best performed by <a href="http://www.zlti.com">legally sound, email management products</a> that have been verified by leading major, independent, third-party litigation consultants.</p>
<blockquote><p>This isn&#8217;t just geek stuff. It&#8217;s lawyer stuff, too.<br />- Craig Ball</p></blockquote>
<h3 style="padding-bottom:1em">Major Email Types Encountered in E-Discovery</h3>
<p>Here is a short introduction to the major types of email encountered in E-Discovery.</p>
<ul>
<li><strong>Internet (MIME/mbox):</strong> Virtually all, if not all, mail servers today can handle MIME format email. Open source mail servers often use MIME as their default email format for sending email within the environment and out to users of other mail servers while servers like Exchange and Domino send / receive MIME when communicating outside their deployment. MIME is an open standard defined by the <a href="http://www.ietf.org">Internet Engineering Task Force (IETF)</a> in several Request for Comments (RFCs). The email format itself is described in <a href="http://tools.ietf.org/html/rfc5322">RFC-5322</a>. <a href="http://en.wikipedia.org/wiki/Mbox">Mbox</a> files are container files for MIME format messages. The basic format is a text file comprising a concatenated list of MIME messages with a special &#8220;From line&#8221; to delineate the start of each message.</li>
<li><strong>Microsoft (MSG/PST,MIME/EML):</strong> Microsoft Outlook&#8217;s native email format is MSG, a file format described in <a href="http://msdn.microsoft.com/en-us/library/cc463912%28EXCHG.80%29.aspx">MS-OXMSG</a>. End-users often deal with Personal Storage Table (PST) files more often than MSG files; however, many E-Discovery practitioners are familiar with MSG files which often get included with native productions. End-users can generate MSG files by dragging email from Outlook and dropping it on to Desktop or other file system area. PST files are container files for MSG format files. While Microsoft Outlook does not support MIME email, you can read it using <a href="http://en.wikipedia.org/wiki/Windows_Live_Mail">Microsoft Windows Live Mail (WLM)</a> or Outlook Express. Simply ensure the MIME mail has the .EML file extension and open it in WLM or Outlook Express.</li>
<li><strong>Lotus (Notes CD/NSF,DXL):</strong> Before MIME was established, Lotus created their own proprietary rich data format, called Notes Compound Document (aka Notes CD, Notes Rich Text). NSF files are container files for Notes CD format messages. In Lotus 6 and later, Lotus mail can also be exported as <a href="http://www.ibm.com/developerworks/lotus/library/domino-dxl/">DXL</a> objects.</li>
</ul>
<h3 style="padding-bottom:1em">Email Types in the EDRM Enron Email Data Set 2.0</h3>
<p>To get a full appreciation for the different email formats, it&#8217;s useful to take a look at some email in the different formats. The <a href="http://edrm.net/resources/data-sets/edrm-enron-email-data-set-v2">EDRM Enron Email Data Set 2.0</a> supports multiple formats which can be explored. The email was produced by <a href="http://www.zlti.com">ZL Unified Archive&reg;</a> which can archive / collect / manage email in the various native formats and convert between the various formats as well.</p>
<ul>
<li><strong>EDRM XML:</strong> This is the open standard E-Discovery load file standard as defined by the EDRM XML working group. The EDRM XML files in this data set include ESI metadata along with native email in MIME format (with attachments) and extracted native attachments as well as text extracts.</li>
<li><strong>MIME:</strong> While the MIME files are included in the EDRM XML distribution, it is possible to access the MIME without reading the EDRM XML. This has been useful for some research organizations.</li>
<li><strong>PST:</strong> All of the email is also produced as PST files for the custodians. These files can be read directly in Microsoft Outlook or processed by virtually all archives and E-Discovery tools.</li>
</ul>
<h3 style="padding-bottom:1em">Email Types in the EDRM Internationalization Data Set</h3>
<p>The <a href="http://edrm.net/resources/data-sets/edrm-internationalization-data-set">EDRM Internationalization Data Set</a> provides email in an additional format:</p>
<ul>
<li><strong>mbox:</strong> Mbox files are available in the following languages: Email in the following languages is included: Arabic, Catalan, Chinese, Danish, Dutch, English, Finnish, French, German, Greek, Hebrew, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Romanian, Russian, Spanish, Swedish, Tamil, Turkish.</li>
</ul>
<h3 style="padding-bottom:1em">Closing</h3>
<p>I anticipate writing a few more articles on this topic exploring each of the different types of email. It is my hope that layers and other E-Discovery specialists will be able to &#8220;grok&#8221; email a bit more through these posts.</p>
<p>If you are interested in learning more about these email formats, how to manage them in your enterprise, and how to migrate between them, consider contacting <a href="http://www.zlti.com">ZL Technologies</a>. ZL <a href="http://www.zlti.com">Unified Archive&reg;</a> can not only manage email on Exchange, Domino, and Internet mail servers, but it can also migrate email between the different formats.</p>
<p>Image courtesy of: <a href="http://ukpaydayloans.org.uk"><em>UK Pay Day Loans</em></a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://johnwang.com/getting-your-hands-around-email-introduction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bill Clinton and Stevie Wonder on Keeping the Passion to Innovate Alive</title>
		<link>http://johnwang.com/bill-clinton-and-stevie-wonder-on-keeping-the-passion-to-innovate-alive/</link>
		<comments>http://johnwang.com/bill-clinton-and-stevie-wonder-on-keeping-the-passion-to-innovate-alive/#comments</comments>
		<pubDate>Wed, 08 Dec 2010 16:54:52 +0000</pubDate>
		<dc:creator>John Wang</dc:creator>
				<category><![CDATA[conference]]></category>
		<category><![CDATA[innovation]]></category>

		<guid isPermaLink="false">http://grokify.com/?p=882</guid>
		<description><![CDATA[One of the treats of attending large technology conferences is the opportunity to hear inspirational speakers. At last year&#8217;s Oracle OpenWorld, I was fortunate to hear James Carville and Mary Matalin so I was excited to learn that Bill Clinton &#8230; <a href="http://johnwang.com/bill-clinton-and-stevie-wonder-on-keeping-the-passion-to-innovate-alive/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="/bill-clinton-and-stevie-wonder-on-keeping-the-passion-to-innovate-alive/"><img src="/cc/img/articles/photo_clinton_speaking-california_20091005_200x150.jpg" style="float:left;margin:4px;border:0"></a> One of the treats of attending large technology conferences is the opportunity to hear inspirational speakers. At last year&#8217;s <a href="/2009/10/15/extreme-performance-archiving-presentation-at-oracle-openworld-oow/">Oracle OpenWorld</a>, I was fortunate to hear <a href="http://www.carville.info/">James Carville</a> and <a href="http://en.wikipedia.org/wiki/Mary_Matalin">Mary Matalin</a> so I was excited to learn that <a href="http://www.clintonfoundation.org/">Bill Clinton</a> and <a herf="http://www.steviewonder.net/">Stevie Wonder</a> were to speak at this year&#8217;s DreamForce conference. As excited as I was, their messages exceeded my expectations and did not disappoint. Being in the 3rd row did not hurt either. While there will be many reporting on their talks, I will report on their messages looking through the lens of business, technology, and innovation, an approach I picked up from <a href="http://www.linkedin.com/in/rileytech">Chris Riley</a> at the <a href="http://www.aiim.org/chapters/goldengate/">AIIM Golden Gate Chapter</a>&#8216;s award-winning <a href="http://www.tenutawinery.com/">Tenuta Vineyards</a> wine blending event where we discussed blending ECM technologies the way we blended wines earlier in the day.</p>
<h2>Keeping the Passion Alive</h2>
<p>A question posed to both speakers was that given their long, illustrious careers, how do they keep the passion alive to drive innovation year after year, decade after decade. This is an important topic for technology firms that try to keep the passion of a start-up in their firms as they grow into larger enterprises. Stevie answered, tongue-in-cheek, &#8220;You have to pay the bills.&#8221; to some amount of laughter. More seriously, both speakers said it was important to live with passion and be true to who you are. Stevie said, regarding his work, &#8220;Music is like life, You have to live with passion for live&#8221; and closed with &#8220;just be you &#8230; you are meant to be you.&#8221; Bill remarked on several things that has kept his passion alive:</p>
<ul>
<li>working on a large idea or concept,</li>
<li>doing something that you both like and are good at, and</li>
<li>having fun at what you are doing (variation of above).</li>
</ul>
<p>It is no small accident that the most successful people are driven by passion for their work and not simply achieving a certain result. They just love what they are doing. Of course, in today&#8217;s global economy and the current recession, it is becoming more important than ever to find that kernel of who you are to differentiate yourself and possibly just pay the bills given the increased competition for jobs. Perhaps Stevie&#8217;s first answer is not so far off the mark.</p>
<h2>Doing Great Work</h2>
<p>The second big takeaway, was the importance of doing a great job no matter what you are doing. Bill mentioned that his foundation is working to help developing countries grow sustainably and to help build systems where people can get good results from good effort and you should strive for good work, no matter your economic condition. He said that &#8220;Being poor is not the same as being sloppy,&#8221; and also remarked that,</p>
<blockquote><p>When you build things that work, good things happen.<br />- Bill Clinton</p></blockquote>
<p>For start-ups, it means that even when you may have few resources, you still need to put out a top notch product. Sometimes, you may need to cut back on features to ensure all the features you ship are top notch.</p>
<h2>Great Work is Not Enough, You Have to Advertise!</h2>
<p>Bill also lamented his party&#8217;s performance in this past mid-term elections. Specifically he mentioned that although his party had raised substantial funds, they did not use those funds to tell the story of their successes resulting in losing many more seats than were forecast and losing control of Congress. He did not blame their adversaries but looked within said that it was his party&#8217;s fault that the electorate simply were not informed of the great work that had been accomplished.</p>
<p>From a technology company perspective, this highlights the need for and importance of marketing to communicate the great product being built by the development teams. From a product management perspective, these are linked to drive a company and product&#8217;s success. The <a herf="http://www.pragmaticmarketing.com/">Pragmatic Marketing</a> educational organization lists both <a href="http://www.pragmaticmarketing.com/services/product-management">product management</a> and <a href="http://www.pragmaticmarketing.com/services/marketing">product marketing</a> as product management disciplines. Reflecting on the importance of product management, they now list <a href="http://www.pragmaticmarketing.com/seminars/executive-briefing">executive leadership</a> as a product management discipline, a topic for another post.</p>
<h2>Being Forever Young and The Business of Tomorrow</h2>
<p>Looking at the US and its chances for remaining a dominant country with the rapid rise of countries such as China and India, Clinton mentioned that he liked America&#8217;s odds but that to be successful, the country needed to be forever young, that &#8220;we have to be a tomorrow country&#8221; and that the US needs to become a &#8220;Laboratory of Democracy&#8221; as a country, something once said of state governments.</p>
<blockquote><p>We have to get back into the tomorrow business<br />- Bill Clinton</p></blockquote>
<p>Along with moving back into the tomorrow business, he said that &#8220;everyone&#8217;s job is to work themselves out of a job,&#8221; a key message that tomorrow&#8217;s jobs will be vastly different than today&#8217;s jobs. He highlighted in the move to IT jobs over the course of his Presidency when such jobs comprised just 8% of all jobs but 30% of job growth and 35% of income growth.</p>
<p>One way to apply this to the technology field is to look at the rate of relentless innovation at <a href="http://www.mercurynews.com/breaking-news/ci_16703362?nclick_check=1">34 year old Apple Computer</a> which, according to the article, is driven by three key factors:</p>
<ol>
<li>It invests heavily in R&#038;D</li>
<li>is unafraid to cannibalize or kill its own products and</li>
<li>is able to extend its core technology across a host of different products to create a dominant ecosystem of consumer gadgets</li>
</ol>
<p>These are similar to Bill&#8217;s approach on working one out of a job and being in the business of tomorrow.</p>
<h2>Recap</h2>
<p>The speakers were thought provoking and inspirational and I am glad to have been there. My article is certainly a selective approach to discussing these talks, however, I think this format presents some key messages from business, technology, and innovation perspectives. My thanks to the folks at SalesForce.com for bringing us such great speakers.</p>
<p>Image courtesy of: <a href="http://www.life.com/image/91471343"><em>LIFE</em></a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://johnwang.com/bill-clinton-and-stevie-wonder-on-keeping-the-passion-to-innovate-alive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

