<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>whateverblog.</title>
	<atom:link href="http://jcheng.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://jcheng.wordpress.com</link>
	<description>Hello, I&#039;m Joe Cheng, a software developer on RStudio.</description>
	<lastBuildDate>Sat, 31 Dec 2011 20:15:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='jcheng.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>whateverblog.</title>
		<link>http://jcheng.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://jcheng.wordpress.com/osd.xml" title="whateverblog." />
	<atom:link rel='hub' href='http://jcheng.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Using Panic Prompt with EC2</title>
		<link>http://jcheng.wordpress.com/2011/04/15/using-panic-prompt-with-ec2/</link>
		<comments>http://jcheng.wordpress.com/2011/04/15/using-panic-prompt-with-ec2/#comments</comments>
		<pubDate>Fri, 15 Apr 2011 16:21:07 +0000</pubDate>
		<dc:creator>Joe Cheng</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://jcheng.wordpress.com/?p=429</guid>
		<description><![CDATA[Yesterday, Panic introduced Prompt, an SSH client for iOS. It took a little trial and error to get it working with EC2 .pem files, but I eventually succeeded. Since a lot of the blog comments show other users struggling with the same thing, here&#8217;s what worked for me. Your .pem file is an RSA private [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=429&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Yesterday, Panic introduced <a href="http://www.panic.com/blog/2011/04/introducing-prompt-ssh-for-ios/">Prompt</a>, an SSH client for iOS. It took a little trial and error to get it working with EC2 .pem files, but I eventually succeeded. Since a lot of the blog comments show other users struggling with the same thing, here&#8217;s what worked for me.</p>
<ol>
<li>Your .pem file is an RSA private key. You need to generate an RSA public key from it. On Mac OS X, I did this by typing &#8220;ssh-keygen -y &gt; foo.pub&#8221; and entering foo.pem when prompted for the key file.</li>
<li>Make a copy of your foo.pem file to get rid of the extension. Now you have &#8220;foo&#8221; as the private key and &#8220;foo.pub&#8221; as the public key.</li>
<li>If Prompt is running on your iPhone, do a hard exit (show the iPhone app switcher UI, long-press the Prompt icon to show the delete adornment).</li>
<li>Connect the iPhone to your computer</li>
<li>In iTunes, use File Sharing to transfer first foo.pub, then foo.</li>
</ol>
<div>Hopefully you should see the key showing up in Prompt now.</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jcheng.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jcheng.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jcheng.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jcheng.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jcheng.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jcheng.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jcheng.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jcheng.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jcheng.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jcheng.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jcheng.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jcheng.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jcheng.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jcheng.wordpress.com/429/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=429&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jcheng.wordpress.com/2011/04/15/using-panic-prompt-with-ec2/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/af5bbbe065ded3a0661ca3d78b495c33?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jcheng</media:title>
		</media:content>
	</item>
		<item>
		<title>Introducing RStudio</title>
		<link>http://jcheng.wordpress.com/2011/03/03/introducing-rstudio/</link>
		<comments>http://jcheng.wordpress.com/2011/03/03/introducing-rstudio/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 08:10:17 +0000</pubDate>
		<dc:creator>Joe Cheng</dc:creator>
				<category><![CDATA[Career]]></category>
		<category><![CDATA[RStudio]]></category>

		<guid isPermaLink="false">https://jcheng.wordpress.com/?p=414</guid>
		<description><![CDATA[It’s been an exciting week for me! On Monday, we finally took the wraps off the product that I’ve been working on since leaving Microsoft 18 months ago. First, a little background: There’s a programming language called R that is taking the world of statistical computing and data analysis by storm. If you’ve never heard [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=414&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>It’s been an exciting week for me! On Monday, we finally took the wraps off the product that I’ve been working on since leaving Microsoft 18 months ago.</p>
<p>First, a little background: There’s a programming language called <a href="http://en.wikipedia.org/wiki/R_(programming_language)">R</a> that is taking the world of statistical computing and data analysis by storm. If you’ve never heard of R, you can read more about it in this <a href="http://www.nytimes.com/2009/01/07/technology/business-computing/07program.html">New York Times article</a>. But the gist of it is:</p>
<blockquote><p>“R is really important to the point that it’s hard to overvalue it,” said Daryl Pregibon, a research scientist at Google, which uses the software widely. “It allows statisticians to do very intricate and complicated analyses without knowing the blood and guts of computing systems.”</p></blockquote>
<p>We’re trying to make R a better language by giving it a better IDE. It&#8217;s called <a href="http://www.rstudio.org/">RStudio</a>. It’s free as in beer, and free as in speech. You can <a href="http://www.rstudio.org/download/">download</a> it today, or even peruse the <a href="http://github.com/rstudio/rstudio">source</a>.</p>
<p>We designed RStudio from the ground up to make working with R easier and more productive. It brings your R console, source code, plots, help, history, and workspace browser into one cohesive package. We’ve added some neat productivity features like a searchable endless command history, function/symbol completion, data import dialog with preview, one-click Sweave compile, and more. Many experienced R users have told us that even at this early stage, RStudio is the R IDE that works best for them.</p>
<p>What’s really unique about RStudio, though, is that it can run equally well as a desktop program or as a web application.</p>
<p>What does it mean to run an IDE as a web application? Take a look: Here’s a screenshot of RStudio running in Google Chrome on Windows 7. As you can see, it’s a full IDE—it just happens to be in a browser.</p>
<p><a href="http://jcheng.files.wordpress.com/2011/02/rstudio-web.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;margin:0 0 0 5px;" title="rstudio-web" src="http://jcheng.files.wordpress.com/2011/02/rstudio-web_thumb.png?w=483&#038;h=436" border="0" alt="rstudio-web" width="483" height="436" /></a></p>
<p>The server I’m using is an 8-proc Ubuntu server with 68.4GB of RAM (it happens to be on EC2). When you run RStudio this way, it’s always the server’s computing resources—CPU, RAM, hard drive—that are being used by R.</p>
<p>Why is this interesting? It turns out that a lot of serious R users share a big, powerful Linux box or cluster with their colleagues. They write their R code on their own desktop or laptop, and execute it on the big server. There’s definitely a lot of friction in this workflow. With RStudio, a lot of the friction goes away because you can do your exploring and iterating directly on the big iron.</p>
<p>If you&#8217;re an R user, try it out and <a href="http://support.rstudio.org">let us know</a> what you think!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jcheng.wordpress.com/414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jcheng.wordpress.com/414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jcheng.wordpress.com/414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jcheng.wordpress.com/414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jcheng.wordpress.com/414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jcheng.wordpress.com/414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jcheng.wordpress.com/414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jcheng.wordpress.com/414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jcheng.wordpress.com/414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jcheng.wordpress.com/414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jcheng.wordpress.com/414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jcheng.wordpress.com/414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jcheng.wordpress.com/414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jcheng.wordpress.com/414/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=414&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jcheng.wordpress.com/2011/03/03/introducing-rstudio/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/af5bbbe065ded3a0661ca3d78b495c33?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jcheng</media:title>
		</media:content>

		<media:content url="http://jcheng.files.wordpress.com/2011/02/rstudio-web_thumb.png" medium="image">
			<media:title type="html">rstudio-web</media:title>
		</media:content>
	</item>
		<item>
		<title>Elegant code splitting with GWT</title>
		<link>http://jcheng.wordpress.com/2010/02/16/elegant-code-splitting-with-gwt/</link>
		<comments>http://jcheng.wordpress.com/2010/02/16/elegant-code-splitting-with-gwt/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 06:38:14 +0000</pubDate>
		<dc:creator>Joe Cheng</dc:creator>
				<category><![CDATA[GWT]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[AsyncShim]]></category>

		<guid isPermaLink="false">http://jcheng.wordpress.com/?p=403</guid>
		<description><![CDATA[Update February 17, 2010: I forgot to mention that if you need FIFO guarantees today and don’t mind losing some of the conciseness, Jarrod Carlson has a nice solution posted here. I plan on stealing his way of doing FIFO. Since leaving Microsoft in September, I’ve been working almost exclusively with Google Web Toolkit (GWT). [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=403&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><em><strong>Update February 17, 2010:</strong> I forgot to mention that if you need FIFO guarantees today and don’t mind losing some of the conciseness, Jarrod Carlson has a nice solution posted </em><a href="http://groups.google.com/group/google-web-toolkit/browse_thread/thread/6ec343860253c621/20ab002804a6ee6e"><em>here</em></a><em>. I plan on stealing his way of doing FIFO.</em></p>
<hr />
<p>Since leaving Microsoft in September, I’ve been working almost exclusively with <a href="http://code.google.com/webtoolkit/">Google Web Toolkit</a> (GWT). Now that I have spent some time with it, I think it’s one of the most exciting advances in web development in years.</p>
<p>I came up with a (possibly) novel way to abstract the code splitting facilities in GWT 2.0 and will try to share it as best I can in this post. (Thanks to my boss, JJ Allaire, for letting me share this code!)</p>
<p>Warning: This post assumes the reader is very familiar with GWT and code splitting, and the ideal reader will have already tried and failed to find a nice way to reuse code split logic. Seriously though, you’ve been warned!</p>
<h4>The Problem: Reusing Code Splitting Logic</h4>
<p>GWT 2.0 provides a mechanism for <a href="http://code.google.com/p/google-web-toolkit/wiki/CodeSplitting">splitting your codebase</a> so that some of your code and resources can be loaded on-demand rather than at page load.</p>
<p>The official GWT site recommends the <a href="http://code.google.com/webtoolkit/doc/latest/DevGuideCodeSplitting.html#patterns">Async Provider pattern</a> as a way to split up your codebase. This is a great start, but you need an excessive amount of boilerplate for each module. Plus, callers now have to use a pretty tortured anonymous class based syntax to get at the API.</p>
<p>Because GWT effectively introduces one split point for each time GWT.runAsync appears in the program source, it’s not obvious how to get around cutting-and-pasting all of this boilerplate.</p>
<h4>The Solution: Deferred Binding</h4>
<p>Fortunately, GWT gives us the tools we need to get out of this mess. We’ll build on top of the same pattern, but use deferred binding (via my library) to generate the boilerplate at build time.</p>
<p> <span id="more-403"></span><br />
<h5>Terms of Use</h5>
<p>I wrote this on company time but thanks to my benevolent employer, the source code and binaries in the library asyncshim.jar are public domain. But use at your own risk.</p>
<h5>Prequisites</h5>
<p>This library depends on <a href="http://code.google.com/p/google-gin/">Google Gin</a>. You don’t <em>have</em> to actually use Gin within your project for it to work, but it won’t compile unless gin.jar is in the classpath. Really, though, if your GWT project is big enough to need code splitting, it is big enough to need Gin.</p>
<h5>Installing the Library</h5>
<p>Download <a href="http://www.joecheng.com/code/asyncshim.jar">asyncshim.jar</a> and add it to your project’s classpath. Then add the following line to your project’s .gwt.xml file:</p>
<p>&lt;inherits name=&quot;com.joecheng.asyncshim.AsyncShim&quot; /&gt;</p>
<h5>Getting Started</h5>
<p>Now that you’ve got the library loaded and inherited, it’s time to remove some boilerplate. Here’s the example module from the Async Provider documentation:</p>
<pre>public class Module {
  // public APIs
  public void doSomething() { /* ... */ }
  public void somethingElse() { /*  ... */ }

  // the module instance; instantiate it behind a runAsync
  private static Module instance = null;

  // A callback for using the module instance once it's loaded
  public interface ModuleClient {
    void onSuccess(Module instance);
    vaid onUnavailable();
  }

  /**
   *  Access the module's instance.  The callback
   *  runs asynchronously, once the necessary
   *  code has downloaded.
   */
  public static void createAsync(final ModuleClient client) {
    GWT.runAsync(new RunAsyncCallback() {
      public void onFailure(Throwable err) {
        client.onUnavailable();
      }

      public void onSuccess() {
        if (instance == null) {
          instance = new Module();
        }
        client.onSuccess(instance);
      }
    });
  }
}</pre>
<p>We’ll start by deleting all the boilerplate, leaving behind only the public APIs:</p>
<pre>public class Module {
  // public APIs
  public void doSomething() { /* ... */ }
  public void somethingElse() { /*  ... */ }
}</pre>
<p>It’s worth nothing that “Module” can be almost any kind of class—it doesn’t need to extend or implement anything in particular. It can be a widget, a class from the JRE or GWT framework, etc. It can have lots of methods (even public ones) that you <em>don’t</em> want to be part of the public API. And in case it wasn’t obvious, it definitely doesn’t need to be called “Module”. All this is to say, if you haven’t been following the Async Provider pattern, hopefully there is still a class that’s already in your codebase that you can point to and say, “Yes, this is the perfect module thing for split point A”.</p>
<p>Next, introduce a new abstract class (it can be inner static if you want) that subclasses AsyncShim and specializes it to Module. Add abstract versions of the public API methods. And finally, create a singleton instance of it, using GWT.create.</p>
<pre>public abstract class ModuleShim extends AsyncShim&lt;Module&gt; {
  public abstract void doSomething();
  public abstract void somethingElse();
}</pre>
<p>Pretty simple. Now all your callers just need to get their hands on ModuleShim instead, and once they do, they can simply call the public API methods on it instead of directly on a Module instance. The first time a public API method is called, it will cause the split point code to load (if it’s not loaded already), an instance of Module to be instantiated, and the corresponding method on the new Module instance will be called. (On subsequent API method calls, the existing instance of Module will be reused.)</p>
<p>To create/initialize instances of ModuleShim, you have two options.</p>
<p><strong>If the Module is Gin-injectable</strong> then just use Gin to inject ModuleShim. Done.</p>
<p><strong>Otherwise,</strong> use GWT.create(ModuleShim.class) to get an instance of ModuleShim, then call the ModuleShim.initialize(Provider&lt;Module&gt;) method. The Provider&lt;Module&gt; can be as simple as an anonymous class that does “new Module()” (although if that’s all you were going to do, you could’ve just used Gin). You <em>must</em> ensure that initialize is called before ModuleShim is first used—otherwise the public API will fail, as no instance of Module will be available.</p>
<h5>Slightly More Realistic Example</h5>
<p>Here’s the Module-like class, the one we want to use as the locus of our split point. It’s a dialog box. There’s lots of code, but we’re not introducing any new methods that are going to go into the public API (though we could if we wanted to, mind).</p>
<pre>public class ComposeMessageDialog extends DialogBox {

  @Inject
  public ComposeMessageDialog(Server server) {
    // whatever...
  }

  // lots and lots of code...
}</pre>
<p>Here’s the shim we’re wrapping around it. Any code that could load before the split point should go through this shim and its public API. (Notice how one of the methods we’ve chosen to put in the public API takes a PositionCallback?)</p>
<pre>public class ComposeMessageDialogShim
    extends AsyncShim {

  // Public APIs. These are from DialogBox, actually.
  public abstract void show();
  public abstract void setPopupPositionAndShow(
                         PopupPanel.PositionCallback callback);
  public abstract void hide();
  public abstract void hide(boolean autoClosed);

  // See below to learn about onDelayLoadFailure  @Override
  protected void onDelayLoadFailure(Throwable reason) {
    Window.alert(&quot;Error: &quot; + reason.getMessage());
  }
}</pre>
<p>And finally, here’s the constructor for a ButtonPanel class—it’s part of the main UI of our app (i.e. will load before the split point) and goes through the shim.</p>
<pre>@Inject
public ButtonPanel(ComposeMessageDialogShim shim) {
  Button compose = new Button(&quot;Compose&quot;, new ClickHandler() {
    public void onClick(ClickEvent event) {
      shim.show();
    }
  });
  Button cancel = new Button(&quot;Cancel Compose&quot;, new ClickHandler() {
    public void onClick(ClickEvent event) {
      shim.hide();
    }
  });
  // ...
}</pre>
<p>That’s all there is to it.</p>
<h4>Going (Slightly) Deeper</h4>
<p>Well, maybe not <em>all</em>. Your AsyncShim subclasses, e.g. ModuleShim, have some additional features besides loading Module and delegating calls to it.</p>
<h5>Success/Failure Callbacks</h5>
<p>You can override AsyncShim.onDelayLoadSuccess(T) and onDelayLoadFailure(Throwable).</p>
<p>onDelayLoadFailure will be called if GWT fails to download the code for this split point.</p>
<p>onDelayLoadSuccess is called after the shimmed type (e.g. Module) is successfully instantiated, with the new instance passed as a parameter. This is a handy place to finish whatever initialization needs to be finished before any of the public API methods actually fire. For example, if your Module is actually a Widget then you can have this method add the newly created Widget to the Panel where it should appear.</p>
<h5>Prefetching</h5>
<p>Prefetching is easy: just call forceLoad(true, null) on your shim. (See the <a href="http://gist.github.com/306366">source comments</a> for an explanation of the arguments.)</p>
<h5>Inheritance</h5>
<p>If you have a bunch of code that you want to reuse between your different Shim subclasses (different split points), for example to have common error handling code, you can create a common Shim base class with common logic for onDelayLoadSuccess and/or onDelayLoadFailure. Inheritance should work as it normally does. Any public abstract void methods that appear in the inheritance hierarchy will become part of the public API (and you’ll get a compile error if the compiler doesn’t like the results).</p>
<h4>Limitations</h4>
<p>The shim causes public API methods to be executed <em>asynchronously</em>. As a result, <em>all public API methods must return void</em>. If callers need access to the result of a computation, then design your public API method to take a callback as a parameter (which is perfectly cromulent—public API methods absolutely can have parameters!).</p>
<p>Also, multiple calls to the public API methods are not guaranteed to be executed in the order they were called (i.e. no FIFO guarantee). This wouldn’t be hard to add, I just haven’t gotten around to it yet.</p>
<h4>Hope That Helps…?</h4>
<p>To be honest, it’s been harder to try to explain this library than to actually implement it in the first place. If you’re just not getting it from my explanation but like the idea of clean, reusable GWT.runAsync, drop me a comment below or on Twitter (I’m <a href="http://twitter.com/jcheng">@jcheng</a>).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jcheng.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jcheng.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jcheng.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jcheng.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jcheng.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jcheng.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jcheng.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jcheng.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jcheng.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jcheng.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jcheng.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jcheng.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jcheng.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jcheng.wordpress.com/403/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=403&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jcheng.wordpress.com/2010/02/16/elegant-code-splitting-with-gwt/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/af5bbbe065ded3a0661ca3d78b495c33?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jcheng</media:title>
		</media:content>
	</item>
		<item>
		<title>Moving On</title>
		<link>http://jcheng.wordpress.com/2009/09/08/moving-on/</link>
		<comments>http://jcheng.wordpress.com/2009/09/08/moving-on/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 18:00:18 +0000</pubDate>
		<dc:creator>Joe Cheng</dc:creator>
				<category><![CDATA[Career]]></category>

		<guid isPermaLink="false">http://jcheng.wordpress.com/?p=390</guid>
		<description><![CDATA[For the last three and a half years, it’s been my distinct pleasure to be part of the Windows Live Writer team. It’s been deeply satisfying to help ship this simple yet sophisticated program that has put a smile on so many bloggers’ faces. From our first public beta, we’ve had nothing but love from [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=390&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img title="Audi 5000" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="256" alt="Audi 5000" src="http://jcheng.files.wordpress.com/2009/09/image.png?w=334&#038;h=256" width="334" border="0" /></p>
<p>For the last three and a half years, it’s been my distinct pleasure to be part of the Windows Live Writer team. It’s been deeply satisfying to help ship this simple yet sophisticated program that has put a smile on so many bloggers’ faces. From our first public beta, we’ve had nothing but love from the blogging community, and I can’t tell you how awesome that feels.</p>
<p>So it’s with decidedly mixed emotions that I’m moving on from Microsoft and Windows Live Writer. My last day is this Friday, 9/11/2009.</p>
<p>Thank you to all the colleagues, partners, and especially users who have made the last few years so exciting and rewarding. It’s been an amazing experience for me, and I’ll always be proud of what we accomplished.</p>
<p>Next for me will be another stint working for JJ Allaire. I’ll be working from home, which will be something new for me. No details to share about the project for a while, except to say that it will be something totally different (nothing to do with blogging, sorry).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jcheng.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jcheng.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jcheng.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jcheng.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jcheng.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jcheng.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jcheng.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jcheng.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jcheng.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jcheng.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jcheng.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jcheng.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jcheng.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jcheng.wordpress.com/390/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=390&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jcheng.wordpress.com/2009/09/08/moving-on/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/af5bbbe065ded3a0661ca3d78b495c33?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jcheng</media:title>
		</media:content>

		<media:content url="http://jcheng.files.wordpress.com/2009/09/image.png" medium="image">
			<media:title type="html">Audi 5000</media:title>
		</media:content>
	</item>
		<item>
		<title>Life as a Lead at Microsoft</title>
		<link>http://jcheng.wordpress.com/2009/03/07/life-as-a-lead-at-microsoft/</link>
		<comments>http://jcheng.wordpress.com/2009/03/07/life-as-a-lead-at-microsoft/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 19:00:29 +0000</pubDate>
		<dc:creator>Joe Cheng</dc:creator>
				<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://jcheng.wordpress.com/2009/03/07/life-as-a-lead-at-microsoft/</guid>
		<description><![CDATA[Last September, our Development Lead and all-around great guy Charles left the Windows Live Writer team for the greener pastures of venture capitalism. (In Microsoft parlance, Development Leads manage developers, while Development Managers manage development leads.) With mixed feelings, I stepped into his role—my first time being a manager, not counting a few ill-fated months [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=378&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Last September, our Development Lead and all-around great guy Charles <a href="http://blog.charlesteague.com/links/2008/09/transition-part.html">left</a> the <a href="http://writer.live.com/">Windows Live Writer</a> team for the greener pastures of venture capitalism. (In Microsoft parlance, Development Leads manage developers, while Development Managers manage development leads.) With mixed feelings, I stepped into his role—my first time being a manager, not counting a few ill-fated months in 2001 that I’d rather forget.</p>
<p>I couldn’t have been happier as a developer on Writer. There’s something simple and pure about creating features, fixing bugs, and solving customer problems. A good day meant that when I went home, Writer did something cool that it didn’t do when I had arrived in the morning.</p>
<p>Being a lead, so far, has been anything but simple, even though I’m only managing two developers. I’m finding it much harder to measure my contribution or to even know what’s the most important thing to work on at any given moment. “Time management” for me used to mean making sure I don’t spend too much time on <a href="http://www.youtube.com">YouTube</a> or <a href="http://www.techmeme.com">TechMeme</a>. Now it means having 12 hours a day worth of work each day I <em>could</em> be doing, and deciding what subset of it I’m <em>actually</em> going to spend time on. It means deciding which of the three meetings I have scheduled for 1PM I will actually go to. All the while knowing that things I’m leaving undone, and the meetings that I’m deciding are not as important, all have the potential to bite me in the back down the road.</p>
<p>And that work, and those meetings, are not always clear and simple like building a feature or fixing a bug. I spend a lot of time these days just “getting on the same page” as people. Having arguments without reaching clear resolution. Planning to plan. How do you measure whether you’ve been successful at these kind of things? How do you determine the impact on the product, on your users?</p>
<p>Messy.</p>
<p>That all being said, I’m glad to have this opportunity. Going up the steep part of any learning curve is by definition both challenging and rewarding. To be honest, it’s been a while since I’ve hit any really steep learning curves as a developer. And even after this short time, I’m starting to get comfortable in the role and learn how to find real satisfaction in what I’m doing.</p>
<p>Over the past few months I’ve gotten some great management advice from some great managers. I’ve also had some thoughts percolating for some time, that being a lead has helped crystallize. I hope to blog as I learn, partly to give some food for thought for other new managers out there, but mostly as a journal I can look back on after a few years, and wonder at how naïve I was.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jcheng.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jcheng.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jcheng.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jcheng.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jcheng.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jcheng.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jcheng.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jcheng.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jcheng.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jcheng.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jcheng.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jcheng.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jcheng.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jcheng.wordpress.com/378/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=378&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jcheng.wordpress.com/2009/03/07/life-as-a-lead-at-microsoft/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/af5bbbe065ded3a0661ca3d78b495c33?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jcheng</media:title>
		</media:content>
	</item>
		<item>
		<title>Windows Live Writer 2009 won&#8217;t start?</title>
		<link>http://jcheng.wordpress.com/2009/02/08/windows-live-writer-2009-wont-start/</link>
		<comments>http://jcheng.wordpress.com/2009/02/08/windows-live-writer-2009-wont-start/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 00:46:44 +0000</pubDate>
		<dc:creator>Joe Cheng</dc:creator>
				<category><![CDATA[Windows Live Writer]]></category>

		<guid isPermaLink="false">http://jcheng.wordpress.com/2009/02/08/windows-live-writer-2009-wont-start/</guid>
		<description><![CDATA[Update Feb 13 2009: The updated version of Writer that fixes this problem is now available. You can upgrade to version 14.0.8064.206 from our usual download page. Ack. We’ve had a few users report that they’re getting into a state where Windows Live Writer 2009 can no longer start. They see the splash screen, then [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=373&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="background-color:#FFC;border:1px solid #666;padding:.5em;"><strong>Update Feb 13 2009:</strong> The updated version of Writer that fixes this problem is now available. You can upgrade to version 14.0.8064.206 from <a href="http://download.live.com/writer">our usual download page</a>.</font></p>
<p>Ack. We’ve had a few users report that they’re getting into a state where Windows Live Writer 2009 can no longer start. They see the splash screen, then an error, then nothing.</p>
<p>We’re getting ready to ship an update that fixes the problem, but in the meantime, there is a straightforward workaround to get Writer running again:</p>
<ol>
<li>Start | Run </li>
<li>On Vista, enter this command:      <br />%AppData%\Windows Live Writer\Keywords       <br />On XP, enter this command:       <br />%UserProfile%\Application Data\Windows Live Writer\Keywords </li>
<li>You should see a bunch of files whose names begin with “keyword” and end with lots of letters and numbers. Delete all of these files. </li>
</ol>
<p>That should fix it.</p>
</p>
<div id='extendedEntryBreak'></div>
</p>
<p>The problem, as you may have guessed, is that one of these files is getting corrupted. This is due to a <a href="http://en.wikipedia.org/wiki/Race_condition" target="_blank">race condition</a> in our code where the settings file can be closed while it’s still in the middle of being written. Our update will both fix the race condition, and also deal more gracefully with corrupted settings files (by ignoring them).</p>
<p>Fortunately, these files merely contain a copy of tags that are also stored on your server. After you delete these files, you may find that our server-side tagging feature no longer suggests tags to you. You can get your tags back by hitting the little refresh button (two arrows chasing each other) right inside the “Set tags” textbox.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jcheng.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jcheng.wordpress.com/373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jcheng.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jcheng.wordpress.com/373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jcheng.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jcheng.wordpress.com/373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jcheng.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jcheng.wordpress.com/373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jcheng.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jcheng.wordpress.com/373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jcheng.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jcheng.wordpress.com/373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jcheng.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jcheng.wordpress.com/373/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=373&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jcheng.wordpress.com/2009/02/08/windows-live-writer-2009-wont-start/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/af5bbbe065ded3a0661ca3d78b495c33?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jcheng</media:title>
		</media:content>
	</item>
		<item>
		<title>Using alternative URL shorteners with Twitter Notify plugin</title>
		<link>http://jcheng.wordpress.com/2009/01/14/using-alternative-url-shorteners-with-twitter-notify-plugin/</link>
		<comments>http://jcheng.wordpress.com/2009/01/14/using-alternative-url-shorteners-with-twitter-notify-plugin/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 23:24:56 +0000</pubDate>
		<dc:creator>Joe Cheng</dc:creator>
				<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Windows Live Writer]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Twitter Notify]]></category>

		<guid isPermaLink="false">http://jcheng.wordpress.com/?p=364</guid>
		<description><![CDATA[Hopefully, folks who use both Windows Live Writer and Twitter know about the Twitter Notify plugin we released in December. Out of the box, it uses the venerable (but still awesome) TinyURL service to shorten the URL to your blog post. However, if you prefer a different URL shortening service, like is.gd or snipr, you [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=364&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img style="display:inline;margin:0 0 0 15px;" src="http://jcheng.files.wordpress.com/2008/06/image-thumb1.png?w=240&amp;h=161" alt="" align="right" /> Hopefully, folks who use both Windows Live Writer and Twitter know about the <a href="http://gallery.live.com/liveItemDetail.aspx?li=6b2b5ffe-936a-4cb3-869c-c01de29de176&amp;pl=8&amp;bt=9">Twitter Notify</a> plugin we <a href="http://windowslivewriter.spaces.live.com/blog/cns!D85741BB5E0BE8AA!1581.entry">released</a> in December. Out of the box, it uses the venerable (but still awesome) <a href="http://tinyurl.com">TinyURL</a> service to shorten the URL to your blog post.</p>
<p>However, if you prefer a different URL shortening service, like <a href="http://is.gd">is.gd</a> or <a href="http://snipr.com">snipr</a>, you might be able to get the plugin to use that instead, with a simple registry tweak.</p>
<p><span id="more-364"></span>Under the following key:</p>
<p><code>HKEY_CURRENT_USER\Software\Microsoft<br />
\Windows Live\Writer\Preferences\PostEditor\ContentSources<br />
\CECF2903-51B3-4173-A932-76E4EE4C01CF</code></p>
<p>Add a String Value called <code>UrlShortener</code>. Here are some examples of known good values:</p>
<p><code>http://tinyurl.com/api-create.php?url={0}</p>
<p>http://is.gd/api.php?longurl={0}</p>
<p>http://snipr.com/site/snip?r=simple&#038;link={1}</p>
<p>http://snurl.com/site/snip?r=simple&#038;link={1}</p>
<p>http://cli.gs/api/v1/cligs/create?url={1}</code></p>
<p>The plugin will replace {0} or {1} with the URL of your post. ({0} will just drop the URL in, while {1} will URL-encode the URL first. The latter seems more correct, but TinyURL and is.gd both expect the former.) Then it will make a web request to the resulting URL, and assume that the entire response is the shortened URL.</p>
<p>Not all URL shortening services will work. For example, bit.ly has an API but it returns JSON or XML, not just the bare URL, so at best you’ll get a bunch of garbage in the post. <strong><em>Update April 1, 2010:</em></strong><em> See comment below by Max for bit.ly instructions.</em></p>
<p>You can also choose to skip the shortening step and just put the whole URL in there; just create the <code>UrlShortener</code> string value but leave it empty.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jcheng.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jcheng.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jcheng.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jcheng.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jcheng.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jcheng.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jcheng.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jcheng.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jcheng.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jcheng.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jcheng.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jcheng.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jcheng.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jcheng.wordpress.com/364/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=364&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jcheng.wordpress.com/2009/01/14/using-alternative-url-shorteners-with-twitter-notify-plugin/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/af5bbbe065ded3a0661ca3d78b495c33?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jcheng</media:title>
		</media:content>

		<media:content url="http://jcheng.files.wordpress.com/2008/06/image-thumb1.png?w=240&#38;h=161" medium="image" />
	</item>
		<item>
		<title>Windows Live Writer 2009, officially official</title>
		<link>http://jcheng.wordpress.com/2009/01/12/windows-live-writer-2009-officially-official/</link>
		<comments>http://jcheng.wordpress.com/2009/01/12/windows-live-writer-2009-officially-official/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 09:46:08 +0000</pubDate>
		<dc:creator>Joe Cheng</dc:creator>
				<category><![CDATA[Windows Live Writer]]></category>

		<guid isPermaLink="false">http://jcheng.wordpress.com/2009/01/12/windows-live-writer-2009-officially-official/</guid>
		<description><![CDATA[Windows Live Writer 2009 went final last week during CES. (It’s actually the same bits as the RC [14.0.8050.1202] since no show stopping bugs were found since then.) If you’re still on an older build of Writer, go download it now!<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=363&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://windowslivewriter.spaces.live.com/blog/cns!D85741BB5E0BE8AA!1650.entry?sa=355888471">Windows Live Writer 2009 went final</a> last week during CES. (It’s actually the same bits as the RC [14.0.8050.1202] since no show stopping bugs were found since then.)</p>
<p>If you’re still on an older build of Writer, <a href="http://writer.live.com">go download it now!</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jcheng.wordpress.com/363/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jcheng.wordpress.com/363/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jcheng.wordpress.com/363/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jcheng.wordpress.com/363/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jcheng.wordpress.com/363/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jcheng.wordpress.com/363/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jcheng.wordpress.com/363/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jcheng.wordpress.com/363/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jcheng.wordpress.com/363/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jcheng.wordpress.com/363/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jcheng.wordpress.com/363/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jcheng.wordpress.com/363/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jcheng.wordpress.com/363/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jcheng.wordpress.com/363/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=363&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jcheng.wordpress.com/2009/01/12/windows-live-writer-2009-officially-official/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/af5bbbe065ded3a0661ca3d78b495c33?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jcheng</media:title>
		</media:content>
	</item>
		<item>
		<title>Tags, Writer, and WordPress</title>
		<link>http://jcheng.wordpress.com/2008/12/29/tags-writer-and-wordpress/</link>
		<comments>http://jcheng.wordpress.com/2008/12/29/tags-writer-and-wordpress/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 09:07:00 +0000</pubDate>
		<dc:creator>Joe Cheng</dc:creator>
				<category><![CDATA[Windows Live Writer]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://jcheng.wordpress.com/?p=351</guid>
		<description><![CDATA[Ever since WordPress 2.3 hit the scene, adding native tagging support, there’s been some (understandable) confusion as to whether Windows Live Writer supports tags, and how it relates to WP native tags. Hopefully this post will clear things up. If you’re using WordPress 2.3.1 or later, look for either Keywords or Tags near the bottom [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=351&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ever since <a href="http://wordpress.org">WordPress</a> 2.3 hit the scene, adding native tagging support, there’s been some (understandable) confusion as to whether Windows Live Writer supports tags, and how it relates to WP native tags. Hopefully this post will clear things up.</p>
<p>If you’re using WordPress 2.3.1 or later, look for either Keywords or Tags near the bottom of the screen. You may first have to press F2 (or click the little up-arrow) to expand the property panel.</p>
<p><a href="http://jcheng.files.wordpress.com/2008/12/image2.png"><img title="image" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="133" alt="image" src="http://jcheng.files.wordpress.com/2008/12/image-thumb1.png?w=288&#038;h=133" width="288" border="0" /></a> </p>
<p>Better yet, if you’re using WordPress 2.7 (or WordPress.com) and <a href="http://download.live.com/writer">Windows Live Writer 2009 RC or later</a>, you’ll get tag autocompletion! The tags field also moves upwards, adjacent to the categories field.</p>
<p><a href="http://jcheng.files.wordpress.com/2008/12/image1.png"><img title="image" style="display:inline;border-width:0;" height="102" alt="image" src="http://jcheng.files.wordpress.com/2008/12/image-thumb.png?w=336&#038;h=102" width="336" border="0" /></a></p>
<p>The same instructions apply for BlogEngine.NET, though I don’t think a build has been formally released yet that supports tag autocompletion.</p>
<p> <span id="more-351"></span>The confusion stems from the fact that there is also an older, non-native style of tagging that was in common use in 2006 when we launched Writer. At the time, none of the popular blog platforms had any built-in tagging features, per se—it was all about categories. Tagging usually meant manually inserting HTML links into the actual body of each post, with rel=&quot;tag&quot; attributes on each link. <a href="http://technorati.com">Technorati</a> and other search engines could detect these tags, but because it was all commingled within the post body, the actual blogging platforms could not.
</p>
<p>The <a href="http://windowslivewriter.spaces.live.com/blog/cns!D85741BB5E0BE8AA!702.entry">second public beta of Writer</a> added support for this primitive form of tagging, and it remains in the product to this day. If you do “Insert Tags” from the main menu, edit toolbar, or sidebar, you’ll get this kind of tagging. And if your blog software supports native tags, as WordPress does, this is almost certainly <em>not </em>what you want.</p>
<p>It’s definitely bogus that we have two related-but-different tagging features, without making it easy for the user to know which to use. We didn’t have time to solve this problem for WLW 2009, but it’s quite possible we will do something about it in a future release.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jcheng.wordpress.com/351/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jcheng.wordpress.com/351/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jcheng.wordpress.com/351/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jcheng.wordpress.com/351/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jcheng.wordpress.com/351/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jcheng.wordpress.com/351/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jcheng.wordpress.com/351/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jcheng.wordpress.com/351/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jcheng.wordpress.com/351/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jcheng.wordpress.com/351/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jcheng.wordpress.com/351/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jcheng.wordpress.com/351/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jcheng.wordpress.com/351/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jcheng.wordpress.com/351/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=351&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jcheng.wordpress.com/2008/12/29/tags-writer-and-wordpress/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/af5bbbe065ded3a0661ca3d78b495c33?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jcheng</media:title>
		</media:content>

		<media:content url="http://jcheng.files.wordpress.com/2008/12/image-thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://jcheng.files.wordpress.com/2008/12/image-thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>&#8220;Instant photo&#8221; border treatment</title>
		<link>http://jcheng.wordpress.com/2008/12/17/instant-photo-border-treatment/</link>
		<comments>http://jcheng.wordpress.com/2008/12/17/instant-photo-border-treatment/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 08:37:09 +0000</pubDate>
		<dc:creator>Joe Cheng</dc:creator>
				<category><![CDATA[Windows Live Writer]]></category>

		<guid isPermaLink="false">http://jcheng.wordpress.com/2008/12/17/instant-photo-border-treatment/</guid>
		<description><![CDATA[In case you’re wondering what the “instant photo” border treatment feature is, here’s an example. &#160; It plays nice with the Crop and Tilt features. No, you cannot currently provide a caption to be written on the border. If that’s important to you, you might consider the “Polaroid Picture” plug-in.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=350&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In case you’re wondering what the <a href="http://windowslivewriter.spaces.live.com/blog/cns!D85741BB5E0BE8AA!1581.entry" target="_blank">“instant photo” border treatment</a> feature is, here’s an example.</p>
<p>&#160;<a href="http://jcheng.files.wordpress.com/2008/12/dsc5458.jpg"><img title="Instant Photo example" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="372" alt="Instant Photo example" src="http://jcheng.files.wordpress.com/2008/12/dsc5458-thumb.jpg?w=326&#038;h=372" width="326" border="0" /></a> </p>
<p>It plays nice with the Crop and Tilt features.</p>
<p>No, you cannot currently provide a caption to be written on the border. If that’s important to you, you might consider the <a href="http://gallery.live.com/liveItemDetail.aspx?li=6a125986-6550-4ce9-9c71-9a0fbbc3443f&amp;bt=9&amp;pl=8" target="_blank">“Polaroid Picture” plug-in</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jcheng.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jcheng.wordpress.com/350/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jcheng.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jcheng.wordpress.com/350/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jcheng.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jcheng.wordpress.com/350/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jcheng.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jcheng.wordpress.com/350/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jcheng.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jcheng.wordpress.com/350/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jcheng.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jcheng.wordpress.com/350/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jcheng.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jcheng.wordpress.com/350/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jcheng.wordpress.com&amp;blog=147650&amp;post=350&amp;subd=jcheng&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jcheng.wordpress.com/2008/12/17/instant-photo-border-treatment/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/af5bbbe065ded3a0661ca3d78b495c33?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jcheng</media:title>
		</media:content>

		<media:content url="http://jcheng.files.wordpress.com/2008/12/dsc5458-thumb.jpg" medium="image">
			<media:title type="html">Instant Photo example</media:title>
		</media:content>
	</item>
	</channel>
</rss>
